diff --git a/app/Classes/General/Interfaces/Transactionable.php b/app/Classes/General/Interfaces/Transactionable.php new file mode 100644 index 00000000..174cb48d --- /dev/null +++ b/app/Classes/General/Interfaces/Transactionable.php @@ -0,0 +1,13 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateShippingInvoiceTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateShippingInvoiceTransactionLogic.php index e891fddd..b6edcc5f 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateShippingInvoiceTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateShippingInvoiceTransactionLogic.php @@ -5,33 +5,32 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\PackingLists\Services\FetchesPackingList; - - - - -use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; -use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; -use App\Classes\Modules\Transactions\Services\CreatesTransaction; -use App\Classes\Modules\Transactions\Services\FetchesTransaction; +use App\Classes\Modules\SegmentConstants\Services\FetchesSegmentConstant; use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; -use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; -use App\Classes\Modules\Documents\Services\CreatesDocument; -use App\Classes\Modules\Documents\Services\CreatesFiles; -use App\Classes\ValueObjects\Constants\ApprovalStatus; -use App\Classes\ValueObjects\Constants\PaymentMethodType; +use App\Classes\Modules\Transactions\Services\CreatesTransaction; +use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; +use App\Classes\ValueObjects\Constants\OrderRoleTypes; use App\Classes\ValueObjects\Constants\TransactionType; -use App\Classes\ValueObjects\Constants\DocumentType; -use App\Models\Document; -use App\Models\Transaction; -use Barryvdh\DomPDF\PDF; -use Carbon\Carbon; +use App\Classes\ValueObjects\Constants\PaymentMethodType; +use App\Classes\ValueObjects\Constants\ApprovalStatus; + +// use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; +// use App\Classes\Modules\Transactions\Services\FetchesTransaction; +// use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; +// use App\Classes\Modules\Documents\Services\CreatesDocument; +// use App\Classes\Modules\Documents\Services\CreatesFiles; +// use App\Classes\ValueObjects\Constants\DocumentType; +// use App\Models\Document; +// use App\Models\Transaction; +// use Barryvdh\DomPDF\PDF; +// use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; -use Meneses\LaravelLaravelMpdf\Facades\LaravelLaravelMpdf; -use Meneses\LaravelMpdf\Facades\LaravelMpdf; +// use Meneses\LaravelLaravelMpdf\Facades\LaravelLaravelMpdf; +// use Meneses\LaravelMpdf\Facades\LaravelMpdf; class CreateShippingInvoiceTransactionLogic extends AbstractControllerLogic { @@ -50,62 +49,57 @@ class CreateShippingInvoiceTransactionLogic extends AbstractControllerLogic /** @var FetchesPackingList */ private $fetchesPackingList; - /** @var FetchesTransaction */ - private $fetchesTransaction; - - /** @var UpdatesTransactionStatus */ - private $updatesTransactionStatus; - - /** @var CreatesTransaction */ - private $createsTransaction; - - /** @var CreatesDocument */ - private $createsDocument; - - /** @var CreatesFiles */ - private $createsFile; + /** @var FetchesSegmentConstant */ + private $fetchesSegmentConstant; /** @var GeneratesTransactionBillNumber */ private $generatesTransactionBillNumber; - /** @var PDF */ - private $pdf; + /** @var CreatesTransaction */ + private $createsTransaction; + + // /** @var FetchesTransaction */ + // private $fetchesTransaction; + // /** @var UpdatesTransactionStatus */ + // private $updatesTransactionStatus; + // /** @var CreatesDocument */ + // private $createsDocument; + // /** @var CreatesFiles */ + // private $createsFile; + // /** @var PDF */ + // private $pdf; /** * CreateSupplierTransactionLogic constructor. * @param FetchesPackingList $fetchesPackingList + * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber + * @param CreatesTransaction $createsTransaction * @param FetchesTransaction $fetchesTransaction * @param UpdatesTransactionStatus $updatesTransactionStatus - * @param CreatesTransaction $createsTransaction - * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber * @param PDF $pdf */ public function __construct( FetchesPackingList $fetchesPackingList, - - - - FetchesTransaction $fetchesTransaction, - UpdatesTransactionStatus $updatesTransactionStatus, - CreatesTransaction $createsTransaction, - CreatesDocument $createsDocument, - CreatesFiles $createsFile, + FetchesSegmentConstant $fetchesSegmentConstant, GeneratesTransactionBillNumber $generatesTransactionBillNumber, - PDF $pdf + CreatesTransaction $createsTransaction + + // UpdatesTransactionStatus $updatesTransactionStatus, + // CreatesDocument $createsDocument, + // CreatesFiles $createsFile, + // PDF $pdf ) { $this->fetchesPackingList = $fetchesPackingList; - - - - $this->fetchesTransaction = $fetchesTransaction; - $this->updatesTransactionStatus = $updatesTransactionStatus; - $this->createsTransaction = $createsTransaction; - $this->createsDocument = $createsDocument; - $this->createsFile = $createsFile; + $this->fetchesSegmentConstant = $fetchesSegmentConstant; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; - $this->pdf = $pdf; + $this->createsTransaction = $createsTransaction; + + // $this->updatesTransactionStatus = $updatesTransactionStatus; + // $this->createsDocument = $createsDocument; + // $this->createsFile = $createsFile; + // $this->pdf = $pdf; } public function logic(Request $request) : JsonResponse @@ -116,60 +110,82 @@ class CreateShippingInvoiceTransactionLogic extends AbstractControllerLogic return ($package->width / 100) * ($package->height / 100) *($package->length / 100) * ($package->quantity); }); - dd($packages); + $order = $packing_list->owner()->first(); + $address = $order->addresses()->first(); - Transaction::select(DB::raw('sum(jumlah * harga) as total'))->get(); + $base_price_constant = $this->fetchesSegmentConstant->execute(['id' => 1]); + $warehouse_rate_constant = $this->fetchesSegmentConstant->execute(['id' => 2]); + $state_rate_constant = $this->fetchesSegmentConstant->execute(['id' => 3]); + $center_postcode_constant = $this->fetchesSegmentConstant->execute(['id' => 4]); + $outstation_postcode_constant = $this->fetchesSegmentConstant->execute(['id' => 5]); + $base_price = 0; + $warehouse_rate = 0; + $state_rate = 0; + $state_select = []; + $with_out = false; - price_per_cbm = base_price + customer_rate + warehouse_rate + state_rate + outstation_rate + if ($base_price_constant) { + $base_price = $base_price_constant->value->price; + } -price_cbm = 570 myr + if ($warehouse_rate_constant) { + $package_warehouse = $order->OrderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_WAREHOUSE)->first()->appointee->reference; + foreach ($warehouse_rate_constant->value->config as $key_warehouse => $row_warehouse) { + if ($row_warehouse->warehouse_name == $package_warehouse) { + $warehouse_rate = $row_warehouse->rate; + } + } + } -total cbm * price_cbm = 896.61 + if ($state_rate_constant) { + foreach ($state_rate_constant->value->config as $key_state => $row_state) { + if ($row_state->status_id == $address->state_id) { + $state_select = $row_state; + } + } + } -price_cbm, invoice total + if ($outstation_postcode_constant) { + foreach ($outstation_postcode_constant->value as $key_out => $row_out) { -create transaction invoice -create transaction details + if($row_out == $address->postcode) { + $with_out = true; + } + } + } -shipping service (570 per cbm * 1.57 cbm) + if (!empty($state_select)) { + $state_rate = $state_select->rate; + if ($with_out) { + $state_rate = $state_select->rate + $state_select->outstation_rate; + } + } - // dd($packing_list); + $price_cbm = $base_price + $warehouse_rate + $state_rate; + $total_cbm = $price_cbm * $cbm; + $billNumber = $this->generatesTransactionBillNumber->execute('SHIP-'); - // $rate = $request->input('rate'); + $object = new TransactionObject( + $billNumber, + TransactionType::SHIPPING_INVOICE, + 1, + $order->company_module_id, + 1, + PaymentMethodType::CASH, + $total_cbm, + $total_cbm, + 1, + 1, + 0, + 0, + 0, + null, + ApprovalStatus::PENDING_SUBMISSION + ); - // $transactions = collect(); - - // foreach($request->input('payments') as $payment){ - - // /** @var Transaction $payment */ - // $payment = $this->fetchesTransaction->execute(['id' => $payment['id']]); - // $this->updatesTransactionStatus->execute($payment, ApprovalStatus::COMPLETED); - // $billNumber = $this->generatesTransactionBillNumber->execute('SPLR-'); - // $object = new TransactionObject($billNumber, TransactionType::BILL, $supplier->id, 1, - // $supplier->banks()->where('default', true)->first()->id, PaymentMethodType::CASH, - // $payment->original_amount * (1 / $rate), $payment->original_amount, 1, $payment->original_currency_id, - // $rate, 0, 0, null, ApprovalStatus::APPROVED); - - // $transactions[] = $this->createsTransaction->execute($payment->booking, $object); - // } - - // $pdf = LaravelMpdf::loadView('pages.pdfs.currency_vendor_order', ['transactions' => $transactions, 'supplier' => $supplier]); - - // $path = Str::studly($supplier->name).'_'.Carbon::now()->format('Y_m_d_h_s_i').'.pdf'; - - // $object = new DocumentObject( - // DocumentType::CURRENCY_VENDOR_ORDER, - // [chunk_split('data:application/pdf;base64,'.base64_encode($pdf->output()))], - // '', - // ApprovalStatus::COMPLETED, - // 'currency_vendor_order' - // ); - - // /** @var Document $document */ - // $document = $this->createsDocument->execute($supplier, $object); - // $this->createsFile->execute($document, $object); + $transactions = $this->createsTransaction->execute($packing_list, $object); return $this->response([]); } diff --git a/app/Classes/Modules/Transactions/DataTransferObjects/TransactionObject.php b/app/Classes/Modules/Transactions/DataTransferObjects/TransactionObject.php index 8fcf4ece..b4153751 100644 --- a/app/Classes/Modules/Transactions/DataTransferObjects/TransactionObject.php +++ b/app/Classes/Modules/Transactions/DataTransferObjects/TransactionObject.php @@ -76,7 +76,24 @@ class TransactionObject implements DataTransferObject * @param int|null $status * @param array|null $details */ - public function __construct(string $billNo, string $transactionType, int $issuer, int $receiver, int $recipientBankAccountId, int $paymentMethod, float $amount, float $originalAmount, int $currencyId, int $originalCurrencyId, float $currencyRate, float $tax, float $serviceCharge, ?Carbon $expiresOn, ?int $status = ApprovalStatus::PENDING_SUBMISSION, ?array $details = []) + public function __construct( + string $billNo, + string $transactionType, + int $issuer, + int $receiver, + int $recipientBankAccountId, + int $paymentMethod, + float $amount, + float $originalAmount, + int $currencyId, + int $originalCurrencyId, + float $currencyRate, + float $tax, + float $serviceCharge, + ?Carbon $expiresOn, + ?int $status = ApprovalStatus::PENDING_SUBMISSION, + ?array $details = [] + ) { $this->billNo = $billNo; $this->transactionType = $transactionType; diff --git a/app/Classes/Modules/Transactions/Services/CreatesTransaction.php b/app/Classes/Modules/Transactions/Services/CreatesTransaction.php index ddebf0d5..18d57727 100644 --- a/app/Classes/Modules/Transactions/Services/CreatesTransaction.php +++ b/app/Classes/Modules/Transactions/Services/CreatesTransaction.php @@ -5,7 +5,7 @@ namespace App\Classes\Modules\Transactions\Services; use App\Classes\General\Eloquent\AbstractUpdateRecord; use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord; use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; -use App\Models\Booking; +use App\Models\PackingList; use App\Models\Transaction; class CreatesTransaction extends AbstractUpdateRelationshipRecord @@ -15,7 +15,7 @@ class CreatesTransaction extends AbstractUpdateRelationshipRecord * @return \Illuminate\Database\Eloquent\Model * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute(Booking $booking, TransactionObject $object) { + public function execute(PackingList $packing_list, TransactionObject $object) { $model = new Transaction(); $model->bill_no = $object->getBillNo(); $model->type = $object->getTransactionType(); @@ -33,8 +33,6 @@ class CreatesTransaction extends AbstractUpdateRelationshipRecord $model->expires_on = $object->getExpiresOn(); $model->status = $object->getStatus(); - - return $this->handler($booking->transactions(), $model); - + return $this->handler($packing_list->transactions(), $model); } } \ No newline at end of file diff --git a/app/Models/PackingList.php b/app/Models/PackingList.php index 7ef5910a..a6fd95e5 100644 --- a/app/Models/PackingList.php +++ b/app/Models/PackingList.php @@ -5,6 +5,8 @@ namespace App\Models; use App\Classes\General\Interfaces\Steppable; use App\Classes\General\Interfaces\Transportable; use App\Classes\General\Interfaces\Packable; +use App\Classes\General\Interfaces\Transactionable; + use App\Classes\ValueObjects\Constants\ApprovalStatus; use Carbon\Carbon; use Illuminate\Database\Eloquent\Relations\BelongsToMany; @@ -16,7 +18,7 @@ use Staudenmeir\EloquentHasManyDeep\HasManyDeep; use Staudenmeir\EloquentHasManyDeep\HasRelationships; use Staudenmeir\EloquentHasManyDeep\HasTableAlias; -class PackingList extends AbstractModel implements Transportable, Steppable, Packable +class PackingList extends AbstractModel implements Transportable, Steppable, Packable, Transactionable { use HasTableAlias; use HasRelationships; @@ -55,6 +57,14 @@ class PackingList extends AbstractModel implements Transportable, Steppable, Pac return $this->hasMany(Package::class, 'packing_list_id'); } + /** + * @return MorphMany + */ + public function transactions(): MorphMany + { + return $this->MorphMany(Transaction::class, 'owner'); + } + /** * @return HasManyDeep */ diff --git a/app/Models/SegmentConstant.php b/app/Models/SegmentConstant.php index 08c8b2af..42cadb7d 100644 --- a/app/Models/SegmentConstant.php +++ b/app/Models/SegmentConstant.php @@ -15,12 +15,8 @@ use Illuminate\Database\Eloquent\SoftDeletes; */ class SegmentConstant extends AbstractModel { - use SoftDeletes; - protected $table = 'segment_constants'; - protected $dates = ['deleted_at']; - public function getDetailAttribute($value) { return $value ? json_decode($value) : []; @@ -34,14 +30,9 @@ class SegmentConstant extends AbstractModel return $this->BelongsTo(Segment::class, 'segment_id', 'id'); } - /** - * @return mixed - */ - public function service(){ - return $this->hasOne(ServiceType::class, 'id', 'detail->id') - ->whereIn('reference', [SegmentConstants::SERVICE_TYPE, SegmentConstants::CUSTOM_SERVICE_TYPE]); + public function getValueAttribute($value) + { + $value = $value ? json_decode($value) : []; + return $value; } - - - } diff --git a/database/seeders/SegmentConstantsTableSeeder.php b/database/seeders/SegmentConstantsTableSeeder.php index f69660cf..2fc68bf0 100644 --- a/database/seeders/SegmentConstantsTableSeeder.php +++ b/database/seeders/SegmentConstantsTableSeeder.php @@ -13,7 +13,7 @@ class SegmentConstantsTableSeeder extends Seeder { DB::beginTransaction(); - DB::table('segment_constants')->insert( + DB::table('segment_constants')->insert([ [ 'id' => 1, 'segment_id' => 1, @@ -43,7 +43,6 @@ class SegmentConstantsTableSeeder extends Seeder 'rate' => 10 ], ] - ]), ], [ @@ -56,66 +55,82 @@ class SegmentConstantsTableSeeder extends Seeder [ 'status_id' => 1, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 2, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 3, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 4, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 5, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 6, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 7, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 8, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 9, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 10, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 11, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 12, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 13, 'rate' => 20, + 'outstation_rate' => 2 ], [ 'status_id' => 14, 'rate' => 20, + 'outstation_rate' => 2 ], [ 'status_id' => 15, 'rate' => 10, + 'outstation_rate' => 2 ], [ 'status_id' => 16, 'rate' => 10, + 'outstation_rate' => 2 ] ] ]), @@ -141,7 +156,7 @@ class SegmentConstantsTableSeeder extends Seeder 'price' => 15, ]), ], - ); + ]); DB::commit(); } } diff --git a/database/seeders/SegmentsTableSeeder.php b/database/seeders/SegmentsTableSeeder.php index e6dd2be2..72545884 100644 --- a/database/seeders/SegmentsTableSeeder.php +++ b/database/seeders/SegmentsTableSeeder.php @@ -11,15 +11,17 @@ class SegmentsTableSeeder extends Seeder { DB::table('segments')->insert( [ - 'id' => 1, - 'company_module_id' => 1, - 'name' => 'Default Segment', - ], - [ - 'id' => 2, - 'company_module_id' => 2, - 'name' => 'Normal Member', - ], + [ + 'id' => 1, + 'company_module_id' => 1, + 'name' => 'Default Segment', + ], + [ + 'id' => 2, + 'company_module_id' => 2, + 'name' => 'Normal Member', + ], + ] ); } }