Files
shipping-portal/app/Classes/Modules/Transactions/Processors/ApproveShippingInvoiceTransactionProcessor.php
T
2025-09-02 05:09:39 +08:00

94 lines
4.4 KiB
PHP

<?php
namespace App\Classes\Modules\Transactions\Processors;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Notifications\InvoiceIssuedEmail;
use App\Models\Document;
use App\Models\PackingList;
use App\Models\Transaction;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
use App\Classes\Modules\Transactions\Processors\CheckStorageInvoiceTransactionProcessor;
use App\Classes\Modules\Transactions\Processors\CreateShippingInvoiceTransactionDocProcessor;
use App\Classes\Modules\Transactions\Processors\CreateShippingEInvoiceDocProcessor;
use App\Classes\Modules\Transactions\Processors\CreateSalesOrderDocProcessor;
use App\Models\Order;
use Illuminate\Support\Facades\Log;
class ApproveShippingInvoiceTransactionProcessor
{
/** @var UpdatesTransactionStatus */
private $updatesTransactionStatus;
/** @var CheckStorageInvoiceTransactionProcessor */
private $storageInvoiceTransactionProcessor;
/** @var CreateShippingInvoiceTransactionDocProcessor */
private $createShippingInvoiceTransactionDocProcessor;
/** @var CreateSalesOrderDocProcessor */
private $createSalesOrderDocProcessor;
/** @var CreateShippingEInvoiceDocProcessor */
private $createShippingEInvoiceDocProcessor;
/**
* @param UpdatesTransactionStatus $updatesTransactionStatus
* @param CheckStorageInvoiceTransactionProcessor $storageInvoiceTransactionProcessor
* @param CreateShippingInvoiceTransactionDocProcessor $createShippingInvoiceTransactionDocProcessor
* @param CreateSalesOrderDocProcessor $createSalesOrderDocProcessor
* @param CreateShippingEInvoiceDocProcessor $createShippingEInvoiceDocProcessor
*/
public function __construct(UpdatesTransactionStatus $updatesTransactionStatus, CheckStorageInvoiceTransactionProcessor $storageInvoiceTransactionProcessor, CreateShippingInvoiceTransactionDocProcessor $createShippingInvoiceTransactionDocProcessor, CreateSalesOrderDocProcessor $createSalesOrderDocProcessor, CreateShippingEInvoiceDocProcessor $createShippingEInvoiceDocProcessor)
{
$this->updatesTransactionStatus = $updatesTransactionStatus;
$this->storageInvoiceTransactionProcessor = $storageInvoiceTransactionProcessor;
$this->createShippingInvoiceTransactionDocProcessor = $createShippingInvoiceTransactionDocProcessor;
$this->createSalesOrderDocProcessor = $createSalesOrderDocProcessor;
$this->createShippingEInvoiceDocProcessor = $createShippingEInvoiceDocProcessor;
}
/**
* @param PackingList $packingList
* @throws MalformedRequestException
*/
public function execute(PackingList $packingList)
{
/** @var Transaction $invoice_transaction */
$invoice_transaction = $packingList->transactions()->where('transactions.type', TransactionType::SHIPPING_INVOICE)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::PENDING_SUBMISSION])->first();
$companyModule = $invoice_transaction->owner->owner->companyModule;
Log::info('company module einvoice: ' . json_encode($companyModule->company->e_invoice));
if($companyModule->company->e_invoice)
{
// $this->createShippingEInvoiceDocProcessor->execute($invoice_transaction);
}
else{
$this->createShippingInvoiceTransactionDocProcessor->execute($invoice_transaction);
}
$this->createSalesOrderDocProcessor->execute($invoice_transaction);
$this->updatesTransactionStatus->execute($invoice_transaction, ApprovalStatus::APPROVED);
if(app()->environment(['production']) && $companyModule->company->e_invoice === 0) { //invoice issued email is only send to customer who has not opted in E-Invoice
$companyModule = $packingList->owner->companyModule;
$user = $companyModule->employees()->first();
$user->notify(new InvoiceIssuedEmail($user, $packingList));
}
$order = $packingList->owner()->first();
if($order instanceof Order){
// $this->storageInvoiceTransactionProcessor->executeOrder($order);
$is_credit_term = $order->companyModule->inviters()->withPivot('is_credit_term')->first()->pivot->is_credit_term;
$this->storageInvoiceTransactionProcessor->processByPackingList($packingList, $order, $is_credit_term);
}
return;
}
}