From 866dda9d98af2f32f3cafcbcb74513ea54e75fb6 Mon Sep 17 00:00:00 2001 From: ahmedsophyudden Date: Fri, 17 Jun 2022 09:25:47 +0800 Subject: [PATCH] New endpoint to add/edit/delete item in shipping invoice --- .../UpdateShippingInvoiceTransactionLogic.php | 166 ++++++++++++++++++ .../Services/DeletesTransactionDetails.php | 8 +- .../Services/UpdatesTransactionDetail.php | 27 +++ .../Constants/TransactionDetailType.php | 2 + ...teShippingInvoiceTransactionController.php | 21 +++ routes/transaction.php | 2 + 6 files changed, 222 insertions(+), 4 deletions(-) create mode 100644 app/Classes/Modules/Transactions/ControllersLogic/UpdateShippingInvoiceTransactionLogic.php create mode 100644 app/Classes/Modules/Transactions/Services/UpdatesTransactionDetail.php create mode 100644 app/Http/Controllers/Transactions/UpdateShippingInvoiceTransactionController.php diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateShippingInvoiceTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateShippingInvoiceTransactionLogic.php new file mode 100644 index 00000000..0e35be60 --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateShippingInvoiceTransactionLogic.php @@ -0,0 +1,166 @@ + 'Update Shipping Invoice Transaction', + 'message' => 'You have successfully update shipping invoice transaction' + ]; + } + + /** @var FetchesPackingList */ + private $fetchesPackingList; + + /** @var FetchesTransaction */ + private $fetchesTransaction; + + /** @var UpdatesTransaction */ + private $updatesTransaction; + + /** @var FetchesTransactionDetail */ + private $fetchesTransactionDetail; + + /** @var CreatesTransactionDetail */ + private $createsTransactionDetail; + + /** @var UpdatesTransactionDetail */ + private $updatesTransactionDetail; + + /** @var DeletesTransactionDetails */ + private $deletesTransactionDetails; + + public function __construct( + FetchesPackingList $fetchesPackingList, + FetchesTransaction $fetchesTransaction, + UpdatesTransaction $updatesTransaction, + FetchesTransactionDetail $fetchesTransactionDetail, + CreatesTransactionDetail $createsTransactionDetail, + UpdatesTransactionDetail $updatesTransactionDetail, + DeletesTransactionDetails $deletesTransactionDetails + ) + { + + $this->fetchesPackingList = $fetchesPackingList; + $this->fetchesTransaction = $fetchesTransaction; + $this->updatesTransaction = $updatesTransaction; + $this->fetchesTransactionDetail = $fetchesTransactionDetail; + $this->createsTransactionDetail = $createsTransactionDetail; + $this->updatesTransactionDetail = $updatesTransactionDetail; + $this->deletesTransactionDetails = $deletesTransactionDetails; + } + + public function logic(Request $request) : JsonResponse + { + $packing_list = $this->fetchesPackingList->execute(['id' => $request->input('packing_list_id')]); + + $invoice_transaction = $packing_list->transactions->where('type', TransactionType::SHIPPING_INVOICE)->first(); + + $old_transaction_details = $invoice_transaction->transactionDetails->whereNotIn('reference', ['SHIPPING_FEE', 'OVER_WEIGHT_CHARGES'])->pluck('id')->toArray(); + + $new_transaction_details = collect($request->input('transaction_details')); + + $total_cbm = $invoice_transaction->amount; + + foreach($old_transaction_details as $old_transaction_detail_id){ + $old_transaction_detail = $this->fetchesTransactionDetail->execute(['id' => $old_transaction_detail_id]); + + $total_cbm -= $old_transaction_detail->price; + + if(!$new_transaction_details->contains('id', $old_transaction_detail_id)){ + $this->deletesTransactionDetails->execute($old_transaction_detail); + } + } + + foreach($new_transaction_details as $transaction_detail){ + $transaction_detail = (object) $transaction_detail; + $object_detail = new TransactionDetailObject( + 'CUSTOM_CHARGES', + TransactionDetailType::CUSTOM_CHARGES, + 1, + $transaction_detail->price + ); + + if($transaction_detail->id){ + $new_transaction_detail = $this->updatesTransactionDetail->execute($this->fetchesTransactionDetail->execute(['id' => $transaction_detail->id]), $object_detail); + }else{ + $new_transaction_detail = $this->createsTransactionDetail->execute($invoice_transaction, $object_detail); + } + + $total_cbm += $new_transaction_detail->price; + } + + $object = new TransactionObject( + $invoice_transaction->bill_no, + TransactionType::SHIPPING_INVOICE, + 1, + $invoice_transaction->issuer, + 1, + PaymentMethodType::CASH, + $total_cbm, + $total_cbm, + 1, + 1, + 0, + 0, + 0, + null, + ApprovalStatus::PENDING_SUBMISSION + ); + + /** @var Transaction $invoice_transaction */ + $invoice_transaction = $this->updatesTransaction->execute($invoice_transaction, $object); + + $document = $invoice_transaction->documents->where('document_type', DocumentType::SHIPPING_INVOICE)->first(); + + $files = $document->files; + + $invoice_transaction = $this->fetchesTransaction->execute(['id' => $invoice_transaction->id]); + + $transaction_invoice_pdf = LaravelMpdf::loadView('pages.pdfs.shipping_invoice', ['invoice_transaction' => $invoice_transaction]); + + $file_object = new FileObject(chunk_split('data:application/pdf;base64,'.base64_encode($transaction_invoice_pdf->output()))); + + $filePath = $files[0]->file->path.'/'.$files[0]->file->filename; + + if(Storage::disk('documents')->exists($filePath)){ + Storage::disk('documents')->delete($filePath); + } + + Storage::disk('documents')->put($filePath, $file_object->getDecodedData()); + + return $this->response([]); + } + +} diff --git a/app/Classes/Modules/Transactions/Services/DeletesTransactionDetails.php b/app/Classes/Modules/Transactions/Services/DeletesTransactionDetails.php index 42b16d77..72e92bf5 100644 --- a/app/Classes/Modules/Transactions/Services/DeletesTransactionDetails.php +++ b/app/Classes/Modules/Transactions/Services/DeletesTransactionDetails.php @@ -3,17 +3,17 @@ namespace App\Classes\Modules\Transactions\Services; use App\Classes\General\Eloquent\AbstractDeleteRecord; -use App\Models\Transaction; +use App\Models\TransactionDetail; class DeletesTransactionDetails extends AbstractDeleteRecord { /** - * @param Transaction $model + * @param TransactionDetail $model * @return mixed */ - public function execute(Transaction $model) { - return $model->transactionDetails()->delete(); + public function execute(TransactionDetail $model) { + return $model->delete(); } } \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/Services/UpdatesTransactionDetail.php b/app/Classes/Modules/Transactions/Services/UpdatesTransactionDetail.php new file mode 100644 index 00000000..128214d4 --- /dev/null +++ b/app/Classes/Modules/Transactions/Services/UpdatesTransactionDetail.php @@ -0,0 +1,27 @@ +reference = $object->getReference(); + $transactionDetail->name = $object->getName(); + $transactionDetail->quantity = $object->getQuantity(); + $transactionDetail->price = $object->getPrice(); + $transactionDetail->amount = $object->getAmount(); + + return $this->handler($transactionDetail); + + } +} \ No newline at end of file diff --git a/app/Classes/ValueObjects/Constants/TransactionDetailType.php b/app/Classes/ValueObjects/Constants/TransactionDetailType.php index 186f662c..b3e1541c 100644 --- a/app/Classes/ValueObjects/Constants/TransactionDetailType.php +++ b/app/Classes/ValueObjects/Constants/TransactionDetailType.php @@ -7,4 +7,6 @@ final class TransactionDetailType { public const SHIPPING_FEE = 'Shipping Fee'; public const OVER_WEIGHT_CHARGES = 'Over weight charges'; + + public const CUSTOM_CHARGES = 'Custom charges'; } diff --git a/app/Http/Controllers/Transactions/UpdateShippingInvoiceTransactionController.php b/app/Http/Controllers/Transactions/UpdateShippingInvoiceTransactionController.php new file mode 100644 index 00000000..a5d123a0 --- /dev/null +++ b/app/Http/Controllers/Transactions/UpdateShippingInvoiceTransactionController.php @@ -0,0 +1,21 @@ +execute($request); + } +} diff --git a/routes/transaction.php b/routes/transaction.php index e5a64bc2..802c6a8f 100644 --- a/routes/transaction.php +++ b/routes/transaction.php @@ -14,6 +14,8 @@ Route::group(['prefix' => 'transactions', 'namespace' => 'Transactions', 'as' => route::post('/shipping-invoice/create', 'CreateShippingInvoiceTransactionController@create')->name('supplier.create'); + route::put('/shipping-invoice/update', 'UpdateShippingInvoiceTransactionController@update')->name('supplier.update'); + route::post('/shipping-invoice/calculator', 'ShippingEstimationCalculatorController@calculate')->name('shipping.estimation.calculator'); // Route::group(['prefix' => '{id}/payment', 'as' => 'payment.'], function () {