shipping invoice

This commit is contained in:
glovetleong
2022-02-12 11:35:12 +08:00
parent d97357f33a
commit 556c9352c8
9 changed files with 226 additions and 130 deletions
@@ -0,0 +1,13 @@
<?php
namespace App\Classes\General\Interfaces;
use Illuminate\Database\Eloquent\Relations\MorphMany;
interface Transactionable
{
public function transactions(): morphMany;
}
@@ -0,0 +1,34 @@
<?php
namespace App\Classes\Modules\SegmentConstants\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use Illuminate\Database\Eloquent\Builder;
use App\Models\SegmentConstant;
class FetchesSegmentConstant extends AbstractFetchRecord
{
/** @var SegmentConstant */
private $repository;
/**
* FetchesSegment constructor.
* @param SegmentConstant $repository
*/
public function __construct(SegmentConstant $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -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([]);
}
@@ -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;
@@ -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);
}
}
+11 -1
View File
@@ -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
*/
+4 -13
View File
@@ -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;
}
}
@@ -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();
}
}
+11 -9
View File
@@ -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',
],
]
);
}
}