New endpoint to add/edit/delete item in shipping invoice

This commit is contained in:
ahmedsophyudden
2022-06-17 09:25:47 +08:00
parent 822c9c467f
commit 866dda9d98
6 changed files with 222 additions and 4 deletions
@@ -0,0 +1,166 @@
<?php
namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Models\Transaction;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Storage;
use Meneses\LaravelMpdf\Facades\LaravelMpdf;
use App\Classes\ValueObjects\Constants\DocumentType;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\ValueObjects\Constants\TransactionDetailType;
use App\Classes\Modules\Documents\DataTransferObjects\FileObject;
use App\Classes\Modules\PackingLists\Services\FetchesPackingList;
use App\Classes\Modules\Transactions\Services\UpdatesTransaction;
use App\Classes\Modules\Transactions\Services\CreatesTransactionDetail;
use App\Classes\Modules\Transactions\Services\FetchesTransactionDetail;
use App\Classes\Modules\Transactions\Services\UpdatesTransactionDetail;
use App\Classes\Modules\Transactions\Services\DeletesTransactionDetails;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionDetailObject;
use App\Classes\Modules\Transactions\Services\FetchesTransaction;
class UpdateShippingInvoiceTransactionLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => '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([]);
}
}
@@ -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();
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionDetailObject;
use App\Models\TransactionDetail;
class UpdatesTransactionDetail extends AbstractUpdateRecord
{
/**
* @param TransactionDetail $transactionDetail
* @param TransactionDetailObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(TransactionDetail $transactionDetail, TransactionDetailObject $object) {
$transactionDetail->reference = $object->getReference();
$transactionDetail->name = $object->getName();
$transactionDetail->quantity = $object->getQuantity();
$transactionDetail->price = $object->getPrice();
$transactionDetail->amount = $object->getAmount();
return $this->handler($transactionDetail);
}
}
@@ -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';
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Transactions;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Classes\Modules\Transactions\ControllersLogic\UpdateShippingInvoiceTransactionLogic;
class UpdateShippingInvoiceTransactionController
{
/**
* @param Request $request
* @param UpdateShippingInvoiceTransactionLogic $logic
* @return JsonResponse
*/
public function update(Request $request, UpdateShippingInvoiceTransactionLogic $logic) : JsonResponse {
return $logic->execute($request);
}
}
+2
View File
@@ -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 () {