From dc9f09b18aa851258f46a4260d3cf607babd1635 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Sun, 21 May 2023 22:59:48 +0800 Subject: [PATCH] accounting bank mapping part - mapping unknown transactions --- .../UpdateBankStatementDetailLogic.php | 157 +++++++++++++++++- .../CreatesBankStatementTransactionOwner.php | 34 ++++ .../StatementTransactionOwnerType.php | 8 + .../ValueObjects/Constants/SystemType.php | 16 ++ .../EditSingleItemInListComponent.vue | 93 +++++++---- 5 files changed, 274 insertions(+), 34 deletions(-) create mode 100644 app/Classes/Modules/Accounting/Services/CreatesBankStatementTransactionOwner.php create mode 100644 app/Classes/ValueObjects/Constants/SystemType.php diff --git a/app/Classes/Modules/Accounting/ControllersLogic/UpdateBankStatementDetailLogic.php b/app/Classes/Modules/Accounting/ControllersLogic/UpdateBankStatementDetailLogic.php index f29bd627..73221f53 100644 --- a/app/Classes/Modules/Accounting/ControllersLogic/UpdateBankStatementDetailLogic.php +++ b/app/Classes/Modules/Accounting/ControllersLogic/UpdateBankStatementDetailLogic.php @@ -3,15 +3,23 @@ namespace App\Classes\Modules\Accounting\ControllersLogic; +use App\Classes\Exceptions\MalformedRequestException; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Accounting\Services\UpdatesBankStatementDetails; use App\Classes\Modules\Accounting\Services\FetchesBankStatementDetails; use App\Classes\Modules\Accounting\Standards\Rules\CanUpdateCompany; use App\Classes\Modules\Accounting\DataTransferObjects\BankStatementDetailObject; +use App\Classes\Modules\Accounting\DataTransferObjects\BankStatementTransactionObject; use App\Http\Resources\BankStatementDetailResource; +use App\Classes\Modules\Accounting\Services\CreatesBankStatementTransactionOwner; +use App\Classes\Modules\Accounting\Services\FetchesBankStatementTransaction; +use App\Classes\ValueObjects\Constants\StatementTransactionOwnerType; +use App\Classes\ValueObjects\Constants\SystemType; +use App\Models\Transaction; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use ErrorException; +use Illuminate\Support\Facades\Log; class UpdateBankStatementDetailLogic extends AbstractControllerLogic { @@ -35,15 +43,25 @@ class UpdateBankStatementDetailLogic extends AbstractControllerLogic /** @var FetchesBankStatementDetails */ private $fetchesBankStatementDetails; + /** @var FetchesBankStatementTransaction */ + private $fetchesBankStatementTransaction; + + /** @var CreatesBankStatementTransactionOwner */ + private $createsBankStatementTransactionOwner; + /** * UpdateBankStatementDetailLogic constructor. * @param UpdatesBankStatementDetails $updatesBankStatementDetails * @param FetchesBankStatementDetails $fetchesBankStatementDetails + * @param fetchesBankStatementTransaction $fetchesBankStatementTransaction + * @param CreatesBankStatementTransactionOwner $createsBankStatementTransactionOwner */ - public function __construct(UpdatesBankStatementDetails $updatesBankStatementDetails, FetchesBankStatementDetails $fetchesBankStatementDetails) + public function __construct(UpdatesBankStatementDetails $updatesBankStatementDetails, FetchesBankStatementDetails $fetchesBankStatementDetails, FetchesBankStatementTransaction $fetchesBankStatementTransaction, CreatesBankStatementTransactionOwner $createsBankStatementTransactionOwner) { $this->updatesBankStatementDetails = $updatesBankStatementDetails; $this->fetchesBankStatementDetails = $fetchesBankStatementDetails; + $this->fetchesBankStatementTransaction = $fetchesBankStatementTransaction; + $this->createsBankStatementTransactionOwner = $createsBankStatementTransactionOwner; } @@ -52,15 +70,142 @@ class UpdateBankStatementDetailLogic extends AbstractControllerLogic * @return JsonResponse * @throws ErrorException */ - public function logic(Request $request) : JsonResponse + public function logic(Request $request): JsonResponse { - $object = new BankStatementDetailObject($request->input('pay_for'), $request->input('system_references')); + $bankStatementTransaction = $this->fetchesBankStatementTransaction->execute(['id' => $request->route('id')]); - $query = $this->fetchesBankStatementDetails->execute(['id' => $request->route('id')]); + $owner_type = null; + $owner_id = null; + $statementTransactionOwnerType = null; + $system = null; + $owner_reference = null; - $query = $this->updatesBankStatementDetails->execute($query, $object); + switch ($request->input('pay_for')) { + case 'sales': + if (in_array($request->input('system_references'), ['exchange', 'izyim'])) { + $transaction = $this->verifyBillNumber($request->input('transaction_reference'), $request->input('system_references')); - return $this->resourceResponse(new BankStatementDetailResource($query)); + // todo-new: update / test on izyim system + + $owner_type = Transaction::class; + $owner_id = $transaction->id; + // todo-new: owner_reference + // booking number / order number + $owner_reference = null; + $statementTransactionOwnerType = StatementTransactionOwnerType::SALES; + $system = $request->input('system_references'); + } else { + + switch ($request->input('system_references')) { + case 'lite': + $statementTransactionOwnerType = StatementTransactionOwnerType::SALES_LITE; + break; + case 'cntr': + $statementTransactionOwnerType = StatementTransactionOwnerType::SALES_CNTR; + break; + case 'probashi': + $statementTransactionOwnerType = StatementTransactionOwnerType::SALES_PROBASHI; + break; + case 'pets': + $statementTransactionOwnerType = StatementTransactionOwnerType::SALES_PETS; + break; + default: + throw new MalformedRequestException('System Reference not allowed'); + } + } + break; + + case 'top_up': + + $transaction = $this->verifyBillNumber($request->input('transaction_reference'), $request->input('system_references')); + + $owner_type = Transaction::class; + $owner_id = $transaction->id; + // todo-new: owner_reference + // top_up - store customer marking + $owner_reference = null; + $statementTransactionOwnerType = StatementTransactionOwnerType::WALLET_TOP_UP; + $system = $request->input('system_references'); + break; + + case 'internal_bank_transfer': + $statementTransactionOwnerType = StatementTransactionOwnerType::INTERNAL_BANK_TRANSFER_IN; // if negative -> out, positive -> in + $system = $request->input('system_references'); + break; + + case 'others': + $owner_reference = $request->input('transaction_reference'); + $statementTransactionOwnerType = StatementTransactionOwnerType::NON_OPERATIONAL; + $system = $request->input('system_references'); + break; + + default: + throw new MalformedRequestException('Transaction Type Not Allowed'); + } + + $system == null ? '' : $system = SystemType::SYSTEM_NAMES[$system]; + + dd([ + 'type' => $statementTransactionOwnerType, + 'system' => $system, + // 'owner_type' => Transaction::class, + // todo-new: make sure owner_type is a class + 'owner_type' => $owner_type, + 'owner_id' => $owner_id, + 'owner_reference' => $owner_reference + ]); + + $bankStatementTransaction->owners()->firstOrCreate([ + 'type' => $statementTransactionOwnerType, + 'system' => $system, + // 'owner_type' => Transaction::class, + // todo-new: make sure owner_type is a class + 'owner_type' => $owner_type, + 'owner_id' => $owner_id, + 'owner_reference' => $owner_reference + ]); + + dd($bankStatementTransaction->owners()->first()); + + // $this->canCreateUser->passes($user_object); + + // $user = $this->createsBankStatementTransactionOwner->execute($bankStatementTransactionObject); + + // return $this->resourceResponse(new BankStatementDetailResource($query)); } + public function verifyBillNumber($bill_no, $system_reference) + { + if ($system_reference == 'izyim') { + try { + $url = 'https://izyim.cief-malaysia.com/public/api/v1/transactions/query'; + $client = new \GuzzleHttp\Client(['verify' => false]); + $response = $client->request('GET', $url . '?api-key=510acd13d8d24375cf038ad626c282565451461a9c2399357e0b65365300787e&filters={"bill_no":' . $bill_no . '}'); + $body = $response->getBody(); + $data = json_decode($body, true); + dd($data); + $payload = $data['payload']; + $transactions2 = $payload['data']; + dd($transactions2); + return $transactions2; + } catch (\Exception $exception) { + Log::error($exception); + dd($exception); + preg_match('/\{.*\}/s', $exception->getMessage(), $matches); + $jsonError = json_decode($matches[0]); + // Retrieved Transactions failed + throw new MalformedRequestException($jsonError->title); + } + } + + if ($system_reference == 'exchange') { + $transaction = Transaction::where('bill_no', $bill_no)->first(); + if ($transaction) { + return $transaction; + } + } + + // if not found + throw new MalformedRequestException('Bill Number Not Found.'); + } } diff --git a/app/Classes/Modules/Accounting/Services/CreatesBankStatementTransactionOwner.php b/app/Classes/Modules/Accounting/Services/CreatesBankStatementTransactionOwner.php new file mode 100644 index 00000000..92a3ea33 --- /dev/null +++ b/app/Classes/Modules/Accounting/Services/CreatesBankStatementTransactionOwner.php @@ -0,0 +1,34 @@ +statement_transaction_id = $object->getStatementTransactionId(); + $model->type = $object->getType(); + $model->system = $object->getSystem(); + $model->owner_type = $object->getOwnerType(); + $model->owner_id = $object->getOwnerId(); + $model->invoice_reference = $object->getInvoiceReference(); + $model->receipt_reference = $object->getReceipteReference(); + $model->is_auto_mapped = $object->getIsAutoMapped(); + $model->status = $object->getStatus(); + + return $this->handler($model); + } +} diff --git a/app/Classes/ValueObjects/Constants/StatementTransactionOwnerType.php b/app/Classes/ValueObjects/Constants/StatementTransactionOwnerType.php index 24d31516..58d89c78 100644 --- a/app/Classes/ValueObjects/Constants/StatementTransactionOwnerType.php +++ b/app/Classes/ValueObjects/Constants/StatementTransactionOwnerType.php @@ -34,4 +34,12 @@ final class StatementTransactionOwnerType { public const NON_OPERATIONAL = 14; + public const SALES_LITE = 15; + + public const SALES_CNTR = 16; + + public const SALES_PROBASHI = 17; + + public const SALES_PETS = 18; + } diff --git a/app/Classes/ValueObjects/Constants/SystemType.php b/app/Classes/ValueObjects/Constants/SystemType.php new file mode 100644 index 00000000..dd948f13 --- /dev/null +++ b/app/Classes/ValueObjects/Constants/SystemType.php @@ -0,0 +1,16 @@ + self::EXCHANGE, + 'shipping_portal' => self::SHIPPING_PORTAL, + 'izyim' => self::SHIPPING_PORTAL, + ]; +} diff --git a/resources/assets/vue/components/accounting/elements/EditSingleItemInListComponent.vue b/resources/assets/vue/components/accounting/elements/EditSingleItemInListComponent.vue index 3fe79f24..ed3f8388 100644 --- a/resources/assets/vue/components/accounting/elements/EditSingleItemInListComponent.vue +++ b/resources/assets/vue/components/accounting/elements/EditSingleItemInListComponent.vue @@ -1,26 +1,6 @@