mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/exchange-2.0.git
synced 2026-08-24 23:13:59 +00:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
+28
-13
@@ -3,12 +3,15 @@
|
||||
namespace App\Classes\Modules\Bookings\Processors;
|
||||
|
||||
|
||||
use App\Classes\Exceptions\MalformedRequestException;
|
||||
use App\Classes\Modules\Bookings\Services\Convert1688PurchaseOrderToProductList;
|
||||
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
|
||||
use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessor;
|
||||
use App\Classes\Modules\Transactions\Processors\CreatePurchaseOrderTransactionProcessor;
|
||||
use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber;
|
||||
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use App\Classes\ValueObjects\Constants\DocumentType;
|
||||
use App\Classes\ValueObjects\Constants\PaymentMethodType;
|
||||
use App\Classes\ValueObjects\Constants\TransactionType;
|
||||
use App\Models\Booking;
|
||||
@@ -21,6 +24,9 @@ class CreatePurchaseOrderFor1688OrderProcessor
|
||||
/** @var CreatePurchaseOrderTransactionProcessor */
|
||||
private $createPurchaseOrderTransactionProcessor;
|
||||
|
||||
/** @var Convert1688PurchaseOrderToProductList */
|
||||
private $convert1688PurchaseOrderToProductList;
|
||||
|
||||
/** @var UpdatesTransactionStatus */
|
||||
private $updatesTransactionStatus;
|
||||
|
||||
@@ -28,31 +34,38 @@ class CreatePurchaseOrderFor1688OrderProcessor
|
||||
private $createInvoiceTransactionProcessor;
|
||||
|
||||
/**
|
||||
* CreatePurchaseOrderFor1688OrderProcessor constructor.
|
||||
* @param GeneratesTransactionBillNumber $generatesTransactionBillNumber
|
||||
* @param CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor
|
||||
* @param Convert1688PurchaseOrderToProductList $convert1688PurchaseOrderToProductList
|
||||
* @param UpdatesTransactionStatus $updatesTransactionStatus
|
||||
* @param CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor
|
||||
*/
|
||||
public function __construct(GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor, UpdatesTransactionStatus $updatesTransactionStatus, CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor)
|
||||
public function __construct(GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor, Convert1688PurchaseOrderToProductList $convert1688PurchaseOrderToProductList, UpdatesTransactionStatus $updatesTransactionStatus, CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor)
|
||||
{
|
||||
$this->generatesTransactionBillNumber = $generatesTransactionBillNumber;
|
||||
$this->createPurchaseOrderTransactionProcessor = $createPurchaseOrderTransactionProcessor;
|
||||
$this->convert1688PurchaseOrderToProductList = $convert1688PurchaseOrderToProductList;
|
||||
$this->updatesTransactionStatus = $updatesTransactionStatus;
|
||||
$this->createInvoiceTransactionProcessor = $createInvoiceTransactionProcessor;
|
||||
}
|
||||
|
||||
|
||||
public function execute(Booking $booking){
|
||||
$billNumber = $this->generatesTransactionBillNumber->execute('PO-');
|
||||
|
||||
$products = [
|
||||
[
|
||||
'description' => 'please refer to the attachment below',
|
||||
'quantity' => 1,
|
||||
'stockCode' => '',
|
||||
'unit_price' => $booking->fix_amount
|
||||
]
|
||||
];
|
||||
$documents = $booking->documents()->where('document_type', DocumentType::ECOMMERCE_PURCHASE_ORDER)->get();
|
||||
$products = [];
|
||||
foreach($documents as $document) {
|
||||
foreach ($document->files as $file) {
|
||||
try {
|
||||
$products = $this->convert1688PurchaseOrderToProductList->execute($file);
|
||||
} catch (MalformedRequestException $exception) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(empty($products)) return false;
|
||||
|
||||
$total = collect($products)->sum(function($product){
|
||||
return $product['quantity'] * floatval(str_replace(',', '', $product['unit_price']));
|
||||
@@ -65,9 +78,11 @@ class CreatePurchaseOrderFor1688OrderProcessor
|
||||
|
||||
$purchaseOrder = $this->createPurchaseOrderTransactionProcessor->execute($booking, $object);
|
||||
|
||||
$this->updatesTransactionStatus->execute($purchaseOrder, ApprovalStatus::APPROVED);
|
||||
if($purchaseOrder->amount === $booking->fix_amount){
|
||||
$this->updatesTransactionStatus->execute($purchaseOrder, ApprovalStatus::APPROVED);
|
||||
$this->createInvoiceTransactionProcessor->execute($booking);
|
||||
}
|
||||
|
||||
$this->createInvoiceTransactionProcessor->execute($booking);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Bookings\Services;
|
||||
|
||||
use App\Classes\Exceptions\MalformedRequestException;
|
||||
use App\Models\File;
|
||||
use Exception;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class Convert1688PurchaseOrderToProductList
|
||||
{
|
||||
/**
|
||||
* @param File $file
|
||||
* @return array
|
||||
* @throws MalformedRequestException
|
||||
*/
|
||||
public function execute(File $file): array
|
||||
{
|
||||
$parser = new \Smalot\PdfParser\Parser();
|
||||
$productList = [];
|
||||
$shipping = 0;
|
||||
$discount = 0;
|
||||
|
||||
try {
|
||||
$pdf = $parser->parseFile(Storage::disk('documents')->path($file->file->file_info->original->file));
|
||||
} catch (Exception $exception) {
|
||||
throw new MalformedRequestException('Invalid file format.');
|
||||
}
|
||||
|
||||
$text = $pdf->getText();
|
||||
if(str_contains($text, '订单详情单')) throw new MalformedRequestException('Can\'t process non english documents');
|
||||
|
||||
$tables = explode('Amount (yuan)', $text);
|
||||
$footer = end($tables);
|
||||
$footer = preg_split('(Shipping|运费)', $footer);
|
||||
if(array_key_exists(1, $footer)){
|
||||
$footer = preg_split('/[\t\n]/', $footer[1]);
|
||||
$shipping = (float) filter_var( $footer[0], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
|
||||
$discount = array_filter($footer, function($var) { return preg_match("/(Discount|优惠)/", $var); });
|
||||
$discount = (float) filter_var(reset($discount), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
|
||||
}
|
||||
|
||||
|
||||
array_shift($tables);
|
||||
|
||||
foreach ($tables as $table){
|
||||
$products = preg_split('/(yuan\/|yuan \/|元\/|元 \/)/', str_replace("\r\n","",$table));
|
||||
|
||||
array_pop($products);
|
||||
foreach ($products as $product){
|
||||
$product = preg_split('/[\t]/',$product);
|
||||
|
||||
$adjuster = (count($product) - 7);
|
||||
$descriptionIndex = 3 + $adjuster;
|
||||
|
||||
$quantity = (int) str_replace("\n","",$product[$descriptionIndex + 2]);
|
||||
$unitPrice = (float) str_replace("\n","",$product[$descriptionIndex + 3]);
|
||||
|
||||
$productList[] = [
|
||||
'stockCode' => '',
|
||||
'description' => str_replace("\n","",$product[$descriptionIndex]),
|
||||
'quantity' => $quantity,
|
||||
'unit_price' => $unitPrice,
|
||||
'total' => (float) str_replace("\n","",$product[$descriptionIndex + 3])
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
if($shipping > 0) {
|
||||
$productList[] = [
|
||||
'stockCode' => '',
|
||||
'description' => 'Shipping Fee',
|
||||
'quantity' => 1,
|
||||
'unit_price' => $shipping,
|
||||
'total' => $shipping
|
||||
];
|
||||
}
|
||||
|
||||
if($discount > 0) {
|
||||
$productList[] = [
|
||||
'stockCode' => '',
|
||||
'description' => 'Discount',
|
||||
'quantity' => 1,
|
||||
'unit_price' => $discount * -1,
|
||||
'total' => $discount * -1
|
||||
];
|
||||
}
|
||||
|
||||
return $productList;
|
||||
}
|
||||
}
|
||||
@@ -52,10 +52,10 @@ class FetchCompanyLogic extends AbstractControllerLogic
|
||||
{
|
||||
$this->canFetchCompany->passes();
|
||||
|
||||
$query = $this->fetchesCompany->execute(['id' => $request->route('id'), 'with_bookings' => true]);
|
||||
$query = $this->fetchesCompany->execute(['id' => $request->route('id'), 'with_bookings' => true, 'with_wallets' => true]);
|
||||
|
||||
return $this->resourceResponse(new CompanyResource($query));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,9 +80,9 @@ class ExportsTransactions implements FromQuery, WithHeadingRow, WithMapping, Sho
|
||||
$transactionTypes[$transaction->type],
|
||||
$transaction->issuerCompany->name,
|
||||
$transaction->reciver,
|
||||
$transaction->currency_id === 1 ? 'MYR' : 'RMB',
|
||||
$transaction->currency->short_code,
|
||||
$transaction->amount,
|
||||
$transaction->original_currency_id === 1 ? 'MYR' : 'RMB',
|
||||
$transaction->original_currency->short_code,
|
||||
$transaction->original_amount,
|
||||
$transaction->currency_rate,
|
||||
$transaction->tax,
|
||||
@@ -90,7 +90,7 @@ class ExportsTransactions implements FromQuery, WithHeadingRow, WithMapping, Sho
|
||||
$transactionStatus[$transaction->status],
|
||||
\PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($transaction->created_at),
|
||||
\PhpOffice\PhpSpreadsheet\Shared\Date::dateTimeToExcel($transaction->updated_at),
|
||||
$marking
|
||||
// $marking
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+15
-3
@@ -100,7 +100,7 @@ class CreateProformaInvoiceTransactionProcessor
|
||||
* @return void
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function execute(Booking $booking)
|
||||
public function execute(Booking $booking)
|
||||
{
|
||||
|
||||
$po_order_transaction = $booking->transactions()
|
||||
@@ -129,14 +129,26 @@ class CreateProformaInvoiceTransactionProcessor
|
||||
|
||||
$billNumber = $this->generatesTransactionBillNumber->execute('PROFORMA-');
|
||||
|
||||
$payable_amount = $booking->transactions()->whereNotIn('status', [ApprovalStatus::REJECTED, ApprovalStatus::SUSPENDED])->payments()->sum('amount');
|
||||
$payable_amount = $booking->transactions()->payments()->where(function($query){
|
||||
return $query->where(function($query){
|
||||
return $query->where('status', ApprovalStatus::PENDING_SUBMISSION)->whereDate('expires_on', '>=', Carbon::now())->where('expires_on', '>', Carbon::now()->toTimeString());
|
||||
})->orWhere(function($query){
|
||||
return $query->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]);
|
||||
});
|
||||
})->sum('amount');
|
||||
$booking_amount = $booking->fix_amount;
|
||||
|
||||
$transaction = $booking->transactions()
|
||||
->where('type', TransactionType::PAYMENT)
|
||||
->first();
|
||||
|
||||
$booking_currency_average_rate = $booking_amount / $booking->transactions()->whereNotIn('status', [ApprovalStatus::REJECTED, ApprovalStatus::SUSPENDED])->payments()->selectRaw('sum(amount - service_charge - tax) as sub_total')->get()->sum('sub_total');
|
||||
$booking_currency_average_rate = $booking_amount / $booking->transactions()->payments()->where(function($query){
|
||||
return $query->where(function($query){
|
||||
return $query->where('status', ApprovalStatus::PENDING_SUBMISSION)->whereDate('expires_on', '>=', Carbon::now())->where('expires_on', '>', Carbon::now()->toTimeString());
|
||||
})->orWhere(function($query){
|
||||
return $query->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]);
|
||||
});
|
||||
})->selectRaw('sum(amount - service_charge - tax) as sub_total')->get()->sum('sub_total');
|
||||
|
||||
$total_service_charge = $booking->transactions()
|
||||
->where('type', TransactionType::PAYMENT)
|
||||
|
||||
+1
-1
@@ -86,4 +86,4 @@ class GeneratesGroupTransactionsPurchaseOrder
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user