From 77b2d21e68300a1501935dce090e14980b843d23 Mon Sep 17 00:00:00 2001 From: ahmedsophyudden Date: Sun, 2 Jan 2022 15:01:52 +0800 Subject: [PATCH 01/30] add calculation service charge for transaction bill --- .../CreateSupplierTransactionLogic.php | 49 +++++++++++-------- .../CalculatesTransactionServiceCharge.php | 19 +++++++ .../pdfs/currency_vendor_order.blade.php | 22 ++++++++- 3 files changed, 68 insertions(+), 22 deletions(-) create mode 100644 app/Classes/Modules/Transactions/Services/CalculatesTransactionServiceCharge.php diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php index f496ab4f..20dfa9da 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php @@ -3,31 +3,32 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; +use Carbon\Carbon; +use App\Models\Document; +use Barryvdh\DomPDF\PDF; +use App\Models\Transaction; +use Illuminate\Support\Str; +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\Modules\Documents\Services\CreatesFiles; +use App\Classes\ValueObjects\Constants\PaymentMethodType; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Companies\Services\FetchesCompany; -use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; -use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; +use Meneses\LaravelLaravelMpdf\Facades\LaravelLaravelMpdf; +use App\Classes\Modules\Documents\Services\CreatesDocument; use App\Classes\Modules\Transactions\Services\CreatesTransaction; use App\Classes\Modules\Transactions\Services\FetchesTransaction; -use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; +use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; 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\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 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 App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; +use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; +use App\Classes\Modules\Transactions\Services\CalculatesTransactionServiceCharge; class CreateSupplierTransactionLogic extends AbstractControllerLogic { @@ -64,6 +65,9 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic /** @var GeneratesTransactionBillNumber */ private $generatesTransactionBillNumber; + /** @var CalculatesTransactionServiceCharge */ + private $calculatesTransactionServiceCharge; + /** @var PDF */ private $pdf; @@ -74,9 +78,10 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic * @param UpdatesTransactionStatus $updatesTransactionStatus * @param CreatesTransaction $createsTransaction * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber + * @param CalculatesTransactionServiceCharge $calculatesTransactionServiceCharge * @param PDF $pdf */ - public function __construct(FetchesCompany $fetchesCompany, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber, PDF $pdf) + public function __construct(FetchesCompany $fetchesCompany, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CalculatesTransactionServiceCharge $calculatesTransactionServiceCharge, PDF $pdf) { $this->fetchesCompany = $fetchesCompany; @@ -86,6 +91,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $this->createsDocument = $createsDocument; $this->createsFile = $createsFile; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; + $this->calculatesTransactionServiceCharge = $calculatesTransactionServiceCharge; $this->pdf = $pdf; } @@ -106,10 +112,11 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $this->updatesTransactionStatus->execute($payment, ApprovalStatus::COMPLETED); $billNumber = $this->generatesTransactionBillNumber->execute('SPLR-'); + $serviceCharge = $this->calculatesTransactionServiceCharge->execute($payment->original_amount, $rate); $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::PENDING_VERIFICATION); + $rate, 0, $supplier->id == 2 ? 0 : $serviceCharge, null, ApprovalStatus::PENDING_VERIFICATION); $transactions[] = $this->createsTransaction->execute($payment->booking, $object); } diff --git a/app/Classes/Modules/Transactions/Services/CalculatesTransactionServiceCharge.php b/app/Classes/Modules/Transactions/Services/CalculatesTransactionServiceCharge.php new file mode 100644 index 00000000..3dbabc30 --- /dev/null +++ b/app/Classes/Modules/Transactions/Services/CalculatesTransactionServiceCharge.php @@ -0,0 +1,19 @@ + - Total amount: + Sub total booking amount: + RMB {{number_format((float)$transactions->sum('original_amount'), 2, '.', '')}} + + + Transfer fee (0.002%): + RMB {{number_format((float)$transactions->sum('original_amount') * 0.002 / 100, 2, '.', '')}} + + + Total booking amount: + RMB {{number_format((float) ($transactions->sum('original_amount') +($transactions->sum('original_amount') * 0.002 / 100)), 2, '.', '')}} + + + Sub total amount: MYR {{number_format((float)$transactions->sum('amount'), 2, '.', '')}} + + Service charge ({{ $supplier->id == 2 ? 0 : '0.75%' }}): + MYR {{number_format((float)$transactions->sum('service_charge'), 2, '.', '')}} + + + Total amount: + MYR {{number_format((float) ($transactions->sum('amount') + $transactions->sum('service_charge')), 2, '.', '')}} + From d2d92f668e7d56d462c9dc2e3d6a681274c6def9 Mon Sep 17 00:00:00 2001 From: ahmedsophyudden Date: Sat, 8 Jan 2022 03:28:18 +0800 Subject: [PATCH 02/30] add transfer fee transaction and fixed currency_vendor_order pdf calculation --- .../CreateSupplierTransactionLogic.php | 20 ++- .../CalculatesTransactionServiceCharge.php | 6 +- .../CalculatesTransactionTransferFee.php | 17 +++ .../Constants/TransactionType.php | 2 + .../pdfs/currency_vendor_order.blade.php | 115 +++++++++++------- 5 files changed, 109 insertions(+), 51 deletions(-) create mode 100644 app/Classes/Modules/Transactions/Services/CalculatesTransactionTransferFee.php diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php index 20dfa9da..6b5110ec 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php @@ -28,6 +28,7 @@ use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; +use App\Classes\Modules\Transactions\Services\CalculatesTransactionTransferFee; use App\Classes\Modules\Transactions\Services\CalculatesTransactionServiceCharge; class CreateSupplierTransactionLogic extends AbstractControllerLogic @@ -68,6 +69,9 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic /** @var CalculatesTransactionServiceCharge */ private $calculatesTransactionServiceCharge; + /** @var CalculatesTransactionTransferFee */ + private $calculatesTransactionTransferFee; + /** @var PDF */ private $pdf; @@ -79,9 +83,10 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic * @param CreatesTransaction $createsTransaction * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber * @param CalculatesTransactionServiceCharge $calculatesTransactionServiceCharge + * @param CalculatesTransactionTransferFee $calculatesTransactionTransferFee * @param PDF $pdf */ - public function __construct(FetchesCompany $fetchesCompany, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CalculatesTransactionServiceCharge $calculatesTransactionServiceCharge, PDF $pdf) + public function __construct(FetchesCompany $fetchesCompany, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CalculatesTransactionServiceCharge $calculatesTransactionServiceCharge, CalculatesTransactionTransferFee $calculatesTransactionTransferFee, PDF $pdf) { $this->fetchesCompany = $fetchesCompany; @@ -92,6 +97,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $this->createsFile = $createsFile; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->calculatesTransactionServiceCharge = $calculatesTransactionServiceCharge; + $this->calculatesTransactionTransferFee = $calculatesTransactionTransferFee; $this->pdf = $pdf; } @@ -102,6 +108,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $rate = $request->input('rate'); $transactions = collect(); + $transferFeeTransactions = collect(); foreach($request->input('payments') as $payment){ @@ -119,11 +126,20 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $rate, 0, $supplier->id == 2 ? 0 : $serviceCharge, null, ApprovalStatus::PENDING_VERIFICATION); $transactions[] = $this->createsTransaction->execute($payment->booking, $object); + + $transferFeeNumber = $this->generatesTransactionBillNumber->execute('TRFR-'); + $trasferFee = $this->calculatesTransactionTransferFee->execute($payment->original_amount); + $object = new TransactionObject($transferFeeNumber, TransactionType::TRANSFER_FEE, 1, $supplier->id, + $supplier->banks()->where('default', true)->first()->id, PaymentMethodType::CASH, + $payment->original_amount, $payment->original_amount, $payment->original_currency_id, $payment->original_currency_id, + 1, 0, $trasferFee, null, ApprovalStatus::PENDING_VERIFICATION); + + $transferFeeTransactions[] = $this->createsTransaction->execute($payment->booking, $object); } if(!count($transactions)) return $this->response([]); - $pdf = LaravelMpdf::loadView('pages.pdfs.currency_vendor_order', ['transactions' => $transactions, 'supplier' => $supplier]); + $pdf = LaravelMpdf::loadView('pages.pdfs.currency_vendor_order', ['transactions' => $transactions, 'transferFeeTransactions' => $transferFeeTransactions, 'supplier' => $supplier]); $path = Str::studly($supplier->name).'_'.Carbon::now()->format('Y_m_d_h_s_i').'.pdf'; diff --git a/app/Classes/Modules/Transactions/Services/CalculatesTransactionServiceCharge.php b/app/Classes/Modules/Transactions/Services/CalculatesTransactionServiceCharge.php index 3dbabc30..641e3903 100644 --- a/app/Classes/Modules/Transactions/Services/CalculatesTransactionServiceCharge.php +++ b/app/Classes/Modules/Transactions/Services/CalculatesTransactionServiceCharge.php @@ -8,12 +8,12 @@ class CalculatesTransactionServiceCharge /** * @param float $amount * @param float $rate - * @param float $transfer_fee * @param float $service_charge + * @param float $transfer_fee * @return float */ - public function execute(float $amount, float $rate, ?float $transfer_fee = 0.002, ?float $service_charge = 0.75) { - return (($amount + ($amount * $transfer_fee/100)) * (1/$rate)) * $service_charge / 100; + public function execute(float $amount, float $rate, ?float $service_charge = 0.75, ?float $transfer_fee = 0.00) { + return (($amount + $transfer_fee) * (1/$rate)) * $service_charge / 100; } } \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/Services/CalculatesTransactionTransferFee.php b/app/Classes/Modules/Transactions/Services/CalculatesTransactionTransferFee.php new file mode 100644 index 00000000..14f77b84 --- /dev/null +++ b/app/Classes/Modules/Transactions/Services/CalculatesTransactionTransferFee.php @@ -0,0 +1,17 @@ + - table, th, td { - border: 1px solid black; - border-collapse: collapse; - } - th, td { - padding: 15px; - } - + +
+
- -
- - +
+ - -
{{$supplier->name}} {{\Carbon\Carbon::now('Asia/Singapore')->format('d-m-Y h:s')}}
-
-
- - + +
+
+
+ + @@ -32,50 +36,69 @@ @foreach($transactions as $transaction) - - - - - - - + + + + + + + @endforeach - -
Reference MarkingBank in Details
{{$transaction->booking->marking}}{{$transaction->booking->company->reference}}{{$transaction->currency_rate}}{{$transaction->currency->short_code}} {{number_format((float)$transaction->amount, 2, '.', '')}}Account Holder Name: {{$transaction->booking->bank->holder_name}}
{{$transaction->booking->bank->bank_name}}: {{$transaction->booking->bank->account_no}} -
Branch: {{$transaction->booking->bank->bank_branch}}
Bank in Amount: {{$transaction->original_currency->short_code}} {{$transaction->original_amount}}
{{$transaction->booking->marking}}{{$transaction->booking->company->reference}}{{$transaction->currency_rate}}{{$transaction->currency->short_code}} {{number_format((float)$transaction->amount, 2, '.', '')}}Account Holder Name: {{$transaction->booking->bank->holder_name}}
{{$transaction->booking->bank->bank_name}}: {{$transaction->booking->bank->account_no}} +
Branch: {{$transaction->booking->bank->bank_branch}}
Bank in Amount: {{$transaction->original_currency->short_code}} {{$transaction->original_amount}} +
- - + +
+ + - + @php + $sub_total_booking_amount = number_format((float)$transactions->sum('original_amount'), 2, '.', ''); + @endphp + - + @php + $transfer_fee = number_format((float)$transferFeeTransactions->sum('service_charge'), 2, '.', ''); + @endphp + - + @php + $total_booking_amount = number_format((float) ($transactions->sum('original_amount') + $transfer_fee), 2, '.', ''); + @endphp + - + @php + $sub_total_amount = number_format((float)$transactions->sum('amount') + ($transfer_fee * 1/$transactions[0]->currency_rate), 2, '.', ''); + @endphp + - - + + @php + $service_charge = number_format((float)$sub_total_amount * 0.75 / 100, 2, '.', ''); + @endphp + - + @php + $total_amount = number_format((float)$sub_total_amount + $service_charge, 2, '.', ''); + @endphp + + + +
Sub total booking amount: RMB {{number_format((float)$transactions->sum('original_amount'), 2, '.', '')}}RMB {{$sub_total_booking_amount}}
Transfer fee (0.002%): RMB {{number_format((float)$transactions->sum('original_amount') * 0.002 / 100, 2, '.', '')}}RMB {{$transfer_fee}}
Total booking amount: RMB {{number_format((float) ($transactions->sum('original_amount') +($transactions->sum('original_amount') * 0.002 / 100)), 2, '.', '')}}RMB {{$total_booking_amount}}
Sub total amount: MYR {{number_format((float)$transactions->sum('amount'), 2, '.', '')}}MYR {{$sub_total_amount}}
Service charge ({{ $supplier->id == 2 ? 0 : '0.75%' }}): MYR {{number_format((float)$transactions->sum('service_charge'), 2, '.', '')}}Service charge ({{ $supplier->id == 2 ? '0.00' : '0.75%' }}): MYR {{$service_charge}}
Total amount: MYR {{number_format((float) ($transactions->sum('amount') + $transactions->sum('service_charge')), 2, '.', '')}}MYR {{$total_amount}}
+ + + + -
Page {PAGENO} of {nbpg}
- - - - - -
Page {PAGENO} of {nbpg}
-
+
@endsection \ No newline at end of file From 36c659c84e58cc8982e68d8ffe169e4460ca0c3f Mon Sep 17 00:00:00 2001 From: ahmedsophyudden Date: Tue, 11 Jan 2022 23:07:49 +0800 Subject: [PATCH 03/30] Transfer Fee Transaction - Company Balance Account API --- .../CreateSupplierTransactionLogic.php | 4 +- .../FetchCompanyAccountBalanceLogic.php | 46 +++++++++++++++++++ .../GeneratesCompanyBalanceAccount.php | 41 +++++++++++++++++ .../FetchCompanyAccountBalanceController.php | 21 +++++++++ app/Models/Company.php | 7 +++ app/Models/Transaction.php | 11 ++++- routes/transaction.php | 1 + 7 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 app/Classes/Modules/Transactions/ControllersLogic/FetchCompanyAccountBalanceLogic.php create mode 100644 app/Classes/Modules/Transactions/Services/GeneratesCompanyBalanceAccount.php create mode 100644 app/Http/Controllers/Transactions/FetchCompanyAccountBalanceController.php diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php index 6b5110ec..b524b3e9 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php @@ -125,7 +125,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $payment->original_amount * (1 / $rate), $payment->original_amount, 1, $payment->original_currency_id, $rate, 0, $supplier->id == 2 ? 0 : $serviceCharge, null, ApprovalStatus::PENDING_VERIFICATION); - $transactions[] = $this->createsTransaction->execute($payment->booking, $object); + $transactions[] = $billTransaction = $this->createsTransaction->execute($payment->booking, $object); $transferFeeNumber = $this->generatesTransactionBillNumber->execute('TRFR-'); $trasferFee = $this->calculatesTransactionTransferFee->execute($payment->original_amount); @@ -134,7 +134,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $payment->original_amount, $payment->original_amount, $payment->original_currency_id, $payment->original_currency_id, 1, 0, $trasferFee, null, ApprovalStatus::PENDING_VERIFICATION); - $transferFeeTransactions[] = $this->createsTransaction->execute($payment->booking, $object); + $transferFeeTransactions[] = $this->createsTransaction->execute($billTransaction, $object); } if(!count($transactions)) return $this->response([]); diff --git a/app/Classes/Modules/Transactions/ControllersLogic/FetchCompanyAccountBalanceLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/FetchCompanyAccountBalanceLogic.php new file mode 100644 index 00000000..b73f5ca3 --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/FetchCompanyAccountBalanceLogic.php @@ -0,0 +1,46 @@ + 'Retrieved Company Balance Account', + 'message' => 'You have successfully retrieved company balance account' + ]; + } + + /** @var GeneratesCompanyBalanceAccount */ + private $generatesCompanyBalanceAccount; + + /** + * FetchCompanyAccountBalanceLogic constructor. + * @param GeneratesCompanyBalanceAccount $generatesCompanyBalanceAccount + */ + public function __construct(GeneratesCompanyBalanceAccount $generatesCompanyBalanceAccount) + { + $this->generatesCompanyBalanceAccount = $generatesCompanyBalanceAccount; + } + + public function logic(Request $request) : JsonResponse + { + $company = Company::find($request->route('id')); + + return $this->response(['data' => $this->generatesCompanyBalanceAccount->execute($company)]); + + } + + + +} diff --git a/app/Classes/Modules/Transactions/Services/GeneratesCompanyBalanceAccount.php b/app/Classes/Modules/Transactions/Services/GeneratesCompanyBalanceAccount.php new file mode 100644 index 00000000..51c71cb1 --- /dev/null +++ b/app/Classes/Modules/Transactions/Services/GeneratesCompanyBalanceAccount.php @@ -0,0 +1,41 @@ +checksIfTransactionBillNumberExists = $checksIfTransactionBillNumberExists; + } + + + /** + * @param Company $company + */ + public function execute(Company $company) { + $transferFeeTransactions = $company->issuerTransactions()->where('transactions.type', TransactionType::TRANSFER_FEE)->whereIn('transactions.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->orderBy('id', 'DESC')->get(); + return [ + 'company' => new CompanyResource($company), + 'transferFeeTransactions' => $transferFeeTransactions, + 'account_balance' => $transferFeeTransactions->sum('amount'), + ]; + + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Transactions/FetchCompanyAccountBalanceController.php b/app/Http/Controllers/Transactions/FetchCompanyAccountBalanceController.php new file mode 100644 index 00000000..d36b0605 --- /dev/null +++ b/app/Http/Controllers/Transactions/FetchCompanyAccountBalanceController.php @@ -0,0 +1,21 @@ +execute($request); + } +} diff --git a/app/Models/Company.php b/app/Models/Company.php index 7b8e4387..e18bbf85 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -101,6 +101,13 @@ class Company extends AbstractModel implements Documentable { return $this->hasManyDeep(Transaction::class, [Booking::class], ['company_id', 'owner_id'], ['id', 'id']); } + /** + * @return HasMany + */ + public function issuerTransactions(): HasMany + { + return $this->HasMany(Transaction::class, 'issuer'); + } /** * @return MorphMany diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index a3e16c79..450d9545 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Classes\General\Interfaces\Documentable; +use App\Classes\General\Interfaces\Transactionable; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\TransactionType; use Carbon\Carbon; @@ -16,7 +17,7 @@ use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\Relations\MorphTo; -class Transaction extends AbstractModel implements Documentable +class Transaction extends AbstractModel implements Documentable, Transactionable { use SoftDeletes; @@ -27,6 +28,14 @@ class Transaction extends AbstractModel implements Documentable return $this->morphTo(); } + /** + * @return MorphMany + */ + public function transactions(): MorphMany + { + return $this->MorphMany(Transaction::class, 'owner'); + } + /** * @return MorphMany */ diff --git a/routes/transaction.php b/routes/transaction.php index 578b02c2..d3ce05b2 100644 --- a/routes/transaction.php +++ b/routes/transaction.php @@ -16,4 +16,5 @@ Route::group(['prefix' => 'transactions', 'namespace' => 'Transactions', 'as' => Route::post('booking/{id}/details/update', 'CreatePurchaseOrderTransactionController@create')->name('po.create'); + Route::get('/company/{id}/account/balance', 'FetchCompanyAccountBalanceController@fetch')->name('company.account.balance'); }); \ No newline at end of file From 6a2d0dc2a42c5a614404c0d4af27f5390bf840c0 Mon Sep 17 00:00:00 2001 From: ahmedsophyudden Date: Thu, 27 Jan 2022 22:46:36 +0800 Subject: [PATCH 04/30] Fixed transfer fee count (status == approve only and deduct credit note) --- .../Services/GeneratesCompanyBalanceAccount.php | 13 +++++++++++-- app/Models/Transaction.php | 8 ++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/Classes/Modules/Transactions/Services/GeneratesCompanyBalanceAccount.php b/app/Classes/Modules/Transactions/Services/GeneratesCompanyBalanceAccount.php index 51c71cb1..cfbe8ee2 100644 --- a/app/Classes/Modules/Transactions/Services/GeneratesCompanyBalanceAccount.php +++ b/app/Classes/Modules/Transactions/Services/GeneratesCompanyBalanceAccount.php @@ -8,6 +8,7 @@ use App\Http\Resources\CompanyResource; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\TransactionType; use App\Classes\Modules\Transactions\Services\ChecksIfTransactionBillNumberExists; +use Illuminate\Database\Eloquent\Collection; class GeneratesCompanyBalanceAccount { @@ -29,11 +30,19 @@ class GeneratesCompanyBalanceAccount * @param Company $company */ public function execute(Company $company) { - $transferFeeTransactions = $company->issuerTransactions()->where('transactions.type', TransactionType::TRANSFER_FEE)->whereIn('transactions.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->orderBy('id', 'DESC')->get(); + $transferFeeTransactions = $company->issuerTransactions()->where('transactions.type', TransactionType::TRANSFER_FEE)->whereIn('transactions.status', [ApprovalStatus::APPROVED])->orderBy('id', 'DESC')->get(); + + $creditNoteTransactions = []; + foreach($transferFeeTransactions as $transferFeeTransaction){ + $creditNoteTransactions[] = $transferFeeTransaction->creditNoteTransaction; + } + $creditNoteTransactions = new Collection($creditNoteTransactions); + return [ 'company' => new CompanyResource($company), 'transferFeeTransactions' => $transferFeeTransactions, - 'account_balance' => $transferFeeTransactions->sum('amount'), + 'creditNoteTransactions' => $creditNoteTransactions, + 'account_balance' => $transferFeeTransactions->sum('amount') - $creditNoteTransactions->sum('amount'), ]; } diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 450d9545..730da377 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -36,6 +36,14 @@ class Transaction extends AbstractModel implements Documentable, Transactionable return $this->MorphMany(Transaction::class, 'owner'); } + /** + * @return MorphOne + */ + public function creditNoteTransaction() + { + return $this->MorphOne(Transaction::class, 'owner')->where('type', TransactionType::CREDIT_NOTE); + } + /** * @return MorphMany */ From ae392dd052be11d94c2ac7f8d3ca9364fca09ade Mon Sep 17 00:00:00 2001 From: glovetleong Date: Mon, 21 Feb 2022 08:57:39 +0800 Subject: [PATCH 05/30] debtor --- .../UpdateCompanyDebtorLogic.php | 66 +++++++++++++++++++ .../Services/UpdatesCompanyDebtor.php | 23 +++++++ .../UpdateCompanyDebtorController.php | 20 ++++++ ...0_203803_add_debtor_to_companies_table.php | 32 +++++++++ routes/company.php | 2 + 5 files changed, 143 insertions(+) create mode 100644 app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyDebtorLogic.php create mode 100644 app/Classes/Modules/Companies/Services/UpdatesCompanyDebtor.php create mode 100644 app/Http/Controllers/Companies/UpdateCompanyDebtorController.php create mode 100644 database/migrations/2022_02_20_203803_add_debtor_to_companies_table.php diff --git a/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyDebtorLogic.php b/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyDebtorLogic.php new file mode 100644 index 00000000..49938efd --- /dev/null +++ b/app/Classes/Modules/Companies/ControllersLogic/UpdateCompanyDebtorLogic.php @@ -0,0 +1,66 @@ + 'Updated Company', + 'message' => 'You have successfully updated the Company' + ]; + } + + /** @var CanUpdateCompany */ + private $canUpdateCompany; + + /** @var UpdatesCompanyDebtor */ + private $updatesCompanyDebtor; + + /** @var FetchesCompany */ + private $fetchesCompany; + + /** + * UpdateCompanyControllersLogic constructor. + * @param CanUpdateCompany $canUpdateCompany + * @param UpdatesCompanyDebtor $updatesCompanyDebtor + * @param FetchesCompany $fetchesCompany + */ + public function __construct(CanUpdateCompany $canUpdateCompany, UpdatesCompanyDebtor $updatesCompanyDebtor, FetchesCompany $fetchesCompany) + { + $this->canUpdateCompany = $canUpdateCompany; + $this->updatesCompanyDebtor = $updatesCompanyDebtor; + $this->fetchesCompany = $fetchesCompany; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $debtor = $request->input('debtor'); + + $query = $this->fetchesCompany->execute(['id' => $request->route('id')]); + + $query = $this->updatesCompanyDebtor->execute($query, $debtor); + + return $this->resourceResponse(new CompanyResource($query)); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Companies/Services/UpdatesCompanyDebtor.php b/app/Classes/Modules/Companies/Services/UpdatesCompanyDebtor.php new file mode 100644 index 00000000..4cb43a9f --- /dev/null +++ b/app/Classes/Modules/Companies/Services/UpdatesCompanyDebtor.php @@ -0,0 +1,23 @@ +debtor = $debtor; + return $this->handler($model); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Companies/UpdateCompanyDebtorController.php b/app/Http/Controllers/Companies/UpdateCompanyDebtorController.php new file mode 100644 index 00000000..af62c4f9 --- /dev/null +++ b/app/Http/Controllers/Companies/UpdateCompanyDebtorController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/database/migrations/2022_02_20_203803_add_debtor_to_companies_table.php b/database/migrations/2022_02_20_203803_add_debtor_to_companies_table.php new file mode 100644 index 00000000..2798b9e7 --- /dev/null +++ b/database/migrations/2022_02_20_203803_add_debtor_to_companies_table.php @@ -0,0 +1,32 @@ +string('debtor')->nullable()->after('reference'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('companies', function (Blueprint $table) { + + }); + } +} diff --git a/routes/company.php b/routes/company.php index f5c4dfbc..a0ca19a5 100644 --- a/routes/company.php +++ b/routes/company.php @@ -9,6 +9,8 @@ Route::group(['prefix' => 'company', 'as' => 'company.', 'namespace' => 'Compani Route::put('/update/{id}', 'UpdateCompanyController@update')->name('update'); Route::delete('/delete/{id}', 'DeleteCompanyController@destroy')->name('delete'); + Route::put('/update/debtor/{id}', 'UpdateCompanyDebtorController@update')->name('delete'); + Route::post('/team/create', 'AddNewMemberController@create')->name('team.create'); Route::group(['prefix' => '{id}/segment', 'as' => 'segment.'], function () { From 592024d4622b09dd6c5b71ab670ee8a123db81c6 Mon Sep 17 00:00:00 2001 From: ahmedsophyudden Date: Tue, 22 Feb 2022 11:35:12 +0800 Subject: [PATCH 06/30] Create api to get bank account balance by bank id --- .../FetchBankAccountBalanceLogic.php | 46 ++++++++++++++++ .../Services/GeneratesBankBalanceAccount.php | 52 +++++++++++++++++++ .../FetchBankAccountBalanceController.php | 21 ++++++++ app/Models/Bank.php | 13 ++++- app/Models/Company.php | 1 + routes/transaction.php | 2 + 6 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 app/Classes/Modules/Transactions/ControllersLogic/FetchBankAccountBalanceLogic.php create mode 100644 app/Classes/Modules/Transactions/Services/GeneratesBankBalanceAccount.php create mode 100644 app/Http/Controllers/Transactions/FetchBankAccountBalanceController.php diff --git a/app/Classes/Modules/Transactions/ControllersLogic/FetchBankAccountBalanceLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/FetchBankAccountBalanceLogic.php new file mode 100644 index 00000000..5ffa11bf --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/FetchBankAccountBalanceLogic.php @@ -0,0 +1,46 @@ + 'Retrieved Bank Balance Account', + 'message' => 'You have successfully retrieved bank balance account' + ]; + } + + /** @var GeneratesBankBalanceAccount */ + private $generatesBankBalanceAccount; + + /** + * FetchCompanyAccountBalanceLogic constructor. + * @param GeneratesBankBalanceAccount $generatesBankBalanceAccount + */ + public function __construct(GeneratesBankBalanceAccount $generatesBankBalanceAccount) + { + $this->generatesBankBalanceAccount = $generatesBankBalanceAccount; + } + + public function logic(Request $request) : JsonResponse + { + $bank = Bank::find($request->route('id')); + + return $this->response(['data' => $this->generatesBankBalanceAccount->execute($bank)]); + + } + + + +} diff --git a/app/Classes/Modules/Transactions/Services/GeneratesBankBalanceAccount.php b/app/Classes/Modules/Transactions/Services/GeneratesBankBalanceAccount.php new file mode 100644 index 00000000..39b49276 --- /dev/null +++ b/app/Classes/Modules/Transactions/Services/GeneratesBankBalanceAccount.php @@ -0,0 +1,52 @@ +checksIfTransactionBillNumberExists = $checksIfTransactionBillNumberExists; + } + + + /** + * @param Bank $bank + */ + public function execute(Bank $bank) { + $floatTransactions = $bank->recipientTransactions()->where('transactions.type', TransactionType::BILL)->whereIn('transactions.status', [ApprovalStatus::APPROVED])->orderBy('id', 'DESC')->get(); + $transferFeeTransactions = $bank->recipientTransactions()->where('transactions.type', TransactionType::TRANSFER_FEE)->whereIn('transactions.status', [ApprovalStatus::APPROVED])->orderBy('id', 'DESC')->get(); + + $creditNoteTransactions = []; + foreach($transferFeeTransactions as $transferFeeTransaction){ + $creditNoteTransactions[] = $transferFeeTransaction->creditNoteTransaction; + } + $creditNoteTransactions = new Collection($creditNoteTransactions); + + return [ + 'bank' => new BankResource($bank), + 'floatTransactions' => $floatTransactions, + 'transferFeeTransactions' => $transferFeeTransactions, + 'creditNoteTransactions' => $creditNoteTransactions, + 'account_balance' => $floatTransactions->sum('amount') + $transferFeeTransactions->sum('amount') - $creditNoteTransactions->sum('amount'), + ]; + + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Transactions/FetchBankAccountBalanceController.php b/app/Http/Controllers/Transactions/FetchBankAccountBalanceController.php new file mode 100644 index 00000000..0d8c89b4 --- /dev/null +++ b/app/Http/Controllers/Transactions/FetchBankAccountBalanceController.php @@ -0,0 +1,21 @@ +execute($request); + } +} diff --git a/app/Models/Bank.php b/app/Models/Bank.php index 9381b94a..3b0bb915 100644 --- a/app/Models/Bank.php +++ b/app/Models/Bank.php @@ -2,11 +2,12 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; - use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\BelongsTo; + /** * Class Bank * @package App\Models @@ -41,4 +42,12 @@ class Bank extends AbstractModel { return $this->BelongsTo(Company::class, 'company_id', 'id'); } + + /** + * @return HasMany + */ + public function recipientTransactions(): HasMany + { + return $this->HasMany(Transaction::class, 'recipient_bank_account_id'); + } } diff --git a/app/Models/Company.php b/app/Models/Company.php index e18bbf85..def72720 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -101,6 +101,7 @@ class Company extends AbstractModel implements Documentable { return $this->hasManyDeep(Transaction::class, [Booking::class], ['company_id', 'owner_id'], ['id', 'id']); } + /** * @return HasMany */ diff --git a/routes/transaction.php b/routes/transaction.php index d3ce05b2..83392e4e 100644 --- a/routes/transaction.php +++ b/routes/transaction.php @@ -17,4 +17,6 @@ Route::group(['prefix' => 'transactions', 'namespace' => 'Transactions', 'as' => Route::post('booking/{id}/details/update', 'CreatePurchaseOrderTransactionController@create')->name('po.create'); Route::get('/company/{id}/account/balance', 'FetchCompanyAccountBalanceController@fetch')->name('company.account.balance'); + + Route::get('/bank/{id}/account/balance', 'FetchBankAccountBalanceController@fetch')->name('bank.account.balance'); }); \ No newline at end of file From dd0b1422383890a56e99fe6332f50e8a82915bee Mon Sep 17 00:00:00 2001 From: ahmedsophyudden Date: Sun, 27 Feb 2022 12:51:21 +0800 Subject: [PATCH 07/30] Create api to create and update service change setting --- app/Classes/ValueObjects/Constants/BusinessType.php | 2 ++ app/Classes/ValueObjects/Constants/SegmentConstants.php | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/app/Classes/ValueObjects/Constants/BusinessType.php b/app/Classes/ValueObjects/Constants/BusinessType.php index d24b975d..831568e9 100644 --- a/app/Classes/ValueObjects/Constants/BusinessType.php +++ b/app/Classes/ValueObjects/Constants/BusinessType.php @@ -10,4 +10,6 @@ final class BusinessType { public const CURRENCY_VENDOR = 3; + public const TRANSFER_AGENT = 4; + } diff --git a/app/Classes/ValueObjects/Constants/SegmentConstants.php b/app/Classes/ValueObjects/Constants/SegmentConstants.php index 80e9cb71..dd6b093a 100644 --- a/app/Classes/ValueObjects/Constants/SegmentConstants.php +++ b/app/Classes/ValueObjects/Constants/SegmentConstants.php @@ -20,4 +20,8 @@ class SegmentConstants public const CUSTOM_SERVICE_TYPE = 'CUSTOM_SERVICE_TYPE'; + public const SERVICE_CHARGE = 'SERVICE_CHARGE'; + + public const TRANSFER_FEE = 'TRANSFER_FEE'; + } \ No newline at end of file From af3ff46a20b5eb693bd933b2e2b4e0c4f13f0d08 Mon Sep 17 00:00:00 2001 From: ahmedsophyudden Date: Mon, 28 Feb 2022 22:40:16 +0800 Subject: [PATCH 08/30] Grab service charge from setting for calculate supplier transaction --- .../Eloquent/Filters/ServiceCharge.php | 21 +++++ .../CreateSegmentConstantLogic.php | 70 +++++++++++++++ .../FetchSegmentConstantLogic.php | 51 +++++++++++ .../UpdateSegmentConstantLogic.php | 88 +++++++++++++++++++ .../CreateSupplierTransactionLogic.php | 15 +++- .../CreateSegmentConstantController.php | 19 ++++ .../FetchSegmentConstantController.php | 20 +++++ .../UpdateSegmentConstantController.php | 20 +++++ app/Http/Resources/CompanyResource.php | 1 + app/Models/SegmentConstant.php | 4 + routes/api.php | 2 + routes/segment_constant.php | 17 ++-- 12 files changed, 317 insertions(+), 11 deletions(-) create mode 100644 app/Classes/General/Eloquent/Filters/ServiceCharge.php create mode 100644 app/Classes/Modules/SegmentConstants/ControllersLogic/CreateSegmentConstantLogic.php create mode 100644 app/Classes/Modules/SegmentConstants/ControllersLogic/FetchSegmentConstantLogic.php create mode 100644 app/Classes/Modules/SegmentConstants/ControllersLogic/UpdateSegmentConstantLogic.php create mode 100644 app/Http/Controllers/SegmentConstants/CreateSegmentConstantController.php create mode 100644 app/Http/Controllers/SegmentConstants/FetchSegmentConstantController.php create mode 100644 app/Http/Controllers/SegmentConstants/UpdateSegmentConstantController.php diff --git a/app/Classes/General/Eloquent/Filters/ServiceCharge.php b/app/Classes/General/Eloquent/Filters/ServiceCharge.php new file mode 100644 index 00000000..de8cdded --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/ServiceCharge.php @@ -0,0 +1,21 @@ +where('reference', SegmentConstants::SERVICE_CHARGE)->where('detail->id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/SegmentConstants/ControllersLogic/CreateSegmentConstantLogic.php b/app/Classes/Modules/SegmentConstants/ControllersLogic/CreateSegmentConstantLogic.php new file mode 100644 index 00000000..12b26ad6 --- /dev/null +++ b/app/Classes/Modules/SegmentConstants/ControllersLogic/CreateSegmentConstantLogic.php @@ -0,0 +1,70 @@ + 'Created Segment Constant', + 'message' => 'You have successfully created a new Segment Constant' + ]; + } + + /** @var CanCreateConstant */ + private $canCreateConstant; + + /** @var CreatesConstant */ + private $createsConstant; + + /** @var FetchesSegment */ + private $fetchesSegment; + + + /** + * CreateSegmentLogic constructor. + * @param CanCreateConstant $canCreateConstant + * @param CreatesConstant $createsConstant + */ + public function __construct(CanCreateConstant $canCreateConstant, CreatesConstant $createsConstant, FetchesSegment $fetchesSegment) + { + $this->canCreateConstant = $canCreateConstant; + $this->createsConstant = $createsConstant; + $this->fetchesSegment = $fetchesSegment; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request) : JsonResponse + { + $constant_object = new ConstantObject($request->input('name'), $request->input('reference'), $request->input('detail')); + + $segment = $this->fetchesSegment->execute(['id' => $request->input('segment_id')]); + + $this->canCreateConstant->passes($constant_object); + $constant = $this->createsConstant->execute($segment, $constant_object); + + return $this->resourceResponse(new ConstantResource($constant)); + + } +} \ No newline at end of file diff --git a/app/Classes/Modules/SegmentConstants/ControllersLogic/FetchSegmentConstantLogic.php b/app/Classes/Modules/SegmentConstants/ControllersLogic/FetchSegmentConstantLogic.php new file mode 100644 index 00000000..43c10039 --- /dev/null +++ b/app/Classes/Modules/SegmentConstants/ControllersLogic/FetchSegmentConstantLogic.php @@ -0,0 +1,51 @@ + 'Retrieved Segment Constant', + 'message' => 'You have successfully retrieved a segment constant' + ]; + } + + /** @var FetchesConstant */ + private $fetchesConstant; + + /** + * FetchSegmentLogic constructor. + * @param FetchesConstant $fetchesConstant + */ + public function __construct(FetchesConstant $fetchesConstant) + { + $this->fetchesConstant = $fetchesConstant; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request) : JsonResponse + { + $query = $this->fetchesConstant->execute(['id' => $request->route('id')]); + + return $this->resourceResponse(new ConstantResource($query)); + + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/SegmentConstants/ControllersLogic/UpdateSegmentConstantLogic.php b/app/Classes/Modules/SegmentConstants/ControllersLogic/UpdateSegmentConstantLogic.php new file mode 100644 index 00000000..49897e95 --- /dev/null +++ b/app/Classes/Modules/SegmentConstants/ControllersLogic/UpdateSegmentConstantLogic.php @@ -0,0 +1,88 @@ + 'Updated Segment Constant', + 'message' => 'You have successfully updated the Segment Constant' + ]; + } + + /** @var CanUpdateConstant */ + private $canUpdateConstant; + + /** @var UpdatesConstant */ + private $updatesConstant; + + /** @var FetchesConstant */ + private $fetchesConstant; + + + /** + * UpdateSegmentLogic constructor. + * @param CanUpdateConstant $canUpdateConstant + * @param UpdatesConstant $updatesConstant + * @param FetchesConstant $fetchesConstant + */ + public function __construct( + CanUpdateConstant $canUpdateConstant, + UpdatesConstant $updatesConstant, + FetchesConstant $fetchesConstant + ) + { + $this->canUpdateConstant = $canUpdateConstant; + $this->updatesConstant = $updatesConstant; + $this->fetchesConstant = $fetchesConstant; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + try { + DB::beginTransaction(); + + $constant_query = $this->fetchesConstant->execute(['id' => $request->route('id')]); + + $constant_object = new ConstantObject( + $request->input('name', $constant_query->name), + $request->input('reference', $constant_query->reference), + $request->input('detail', (array) $constant_query->detail)); + $this->canUpdateConstant->passes($constant_object); + $constant_query = $this->updatesConstant->execute($constant_query, $constant_object); + + DB::commit(); + + return $this->resourceResponse(new ConstantResource($constant_query)); + + } catch (\Exception $exception){ + throw new ErrorException($exception->getMessage(), $exception->getCode()); + } + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php index b524b3e9..9cb671a8 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php @@ -3,12 +3,14 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; +use DB; use Carbon\Carbon; use App\Models\Document; use Barryvdh\DomPDF\PDF; use App\Models\Transaction; use Illuminate\Support\Str; use Illuminate\Http\Request; +use App\Models\SegmentConstant; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Storage; use Meneses\LaravelMpdf\Facades\LaravelMpdf; @@ -16,16 +18,18 @@ use App\Classes\ValueObjects\Constants\DocumentType; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\TransactionType; use App\Classes\Modules\Documents\Services\CreatesFiles; +use App\Classes\ValueObjects\Constants\SegmentConstants; use App\Classes\ValueObjects\Constants\PaymentMethodType; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Companies\Services\FetchesCompany; +use App\Classes\Modules\Segments\Services\FetchesConstant; use Meneses\LaravelLaravelMpdf\Facades\LaravelLaravelMpdf; use App\Classes\Modules\Documents\Services\CreatesDocument; use App\Classes\Modules\Transactions\Services\CreatesTransaction; + use App\Classes\Modules\Transactions\Services\FetchesTransaction; use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; - use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; use App\Classes\Modules\Transactions\Services\CalculatesTransactionTransferFee; @@ -79,6 +83,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic * CreateSupplierTransactionLogic constructor. * @param FetchesCompany $fetchesCompany * @param FetchesTransaction $fetchesTransaction + * @param FetchesConstant $fetchesConstant * @param UpdatesTransactionStatus $updatesTransactionStatus * @param CreatesTransaction $createsTransaction * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber @@ -86,11 +91,12 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic * @param CalculatesTransactionTransferFee $calculatesTransactionTransferFee * @param PDF $pdf */ - public function __construct(FetchesCompany $fetchesCompany, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CalculatesTransactionServiceCharge $calculatesTransactionServiceCharge, CalculatesTransactionTransferFee $calculatesTransactionTransferFee, PDF $pdf) + public function __construct(FetchesCompany $fetchesCompany, FetchesTransaction $fetchesTransaction, FetchesConstant $fetchesConstant, UpdatesTransactionStatus $updatesTransactionStatus, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CalculatesTransactionServiceCharge $calculatesTransactionServiceCharge, CalculatesTransactionTransferFee $calculatesTransactionTransferFee, PDF $pdf) { $this->fetchesCompany = $fetchesCompany; $this->fetchesTransaction = $fetchesTransaction; + $this->fetchesConstant = $fetchesConstant; $this->updatesTransactionStatus = $updatesTransactionStatus; $this->createsTransaction = $createsTransaction; $this->createsDocument = $createsDocument; @@ -119,7 +125,10 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $this->updatesTransactionStatus->execute($payment, ApprovalStatus::COMPLETED); $billNumber = $this->generatesTransactionBillNumber->execute('SPLR-'); - $serviceCharge = $this->calculatesTransactionServiceCharge->execute($payment->original_amount, $rate); + // $constant = $this->fetchesConstant->execute(['service_charge' => $supplier->id]); + $constant = SegmentConstant::where('reference', SegmentConstants::SERVICE_CHARGE)->where('detail->id', $supplier->id)->first(); + $serviceCharge = $this->calculatesTransactionServiceCharge->execute($payment->original_amount, $rate, $constant ? $constant->detail->service_charge->amount : 0.75); + $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, diff --git a/app/Http/Controllers/SegmentConstants/CreateSegmentConstantController.php b/app/Http/Controllers/SegmentConstants/CreateSegmentConstantController.php new file mode 100644 index 00000000..7520e1d1 --- /dev/null +++ b/app/Http/Controllers/SegmentConstants/CreateSegmentConstantController.php @@ -0,0 +1,19 @@ +execute($request); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/SegmentConstants/FetchSegmentConstantController.php b/app/Http/Controllers/SegmentConstants/FetchSegmentConstantController.php new file mode 100644 index 00000000..67532d3f --- /dev/null +++ b/app/Http/Controllers/SegmentConstants/FetchSegmentConstantController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/SegmentConstants/UpdateSegmentConstantController.php b/app/Http/Controllers/SegmentConstants/UpdateSegmentConstantController.php new file mode 100644 index 00000000..c34914dc --- /dev/null +++ b/app/Http/Controllers/SegmentConstants/UpdateSegmentConstantController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Http/Resources/CompanyResource.php b/app/Http/Resources/CompanyResource.php index 54ab047d..50a2da9c 100644 --- a/app/Http/Resources/CompanyResource.php +++ b/app/Http/Resources/CompanyResource.php @@ -55,6 +55,7 @@ class CompanyResource extends JsonResource 'default' => new BankResource($this->banks->where('type', BankAccountType::EXTERNAL)->where('default', true)->first()) ], 'segments' => SegmentResource::collection($this->segments), + 'service_charges' => SegmentConstant::where('reference', SegmentConstants::SERVICE_CHARGE)->where('detail->id', $this->id)->first(), 'services' => (new FetchesCompanyServices())->getServices($this->servicesConfigurations()), 'currencies' => $this->when($this->business_type === BusinessType::CURRENCY_VENDOR, function(){ $segment = SegmentConstant::where('reference', SegmentConstants::SUPPLIER_CURRENCIES)->where('detail->id', $this->id)->first(); diff --git a/app/Models/SegmentConstant.php b/app/Models/SegmentConstant.php index 08c8b2af..b7fda276 100644 --- a/app/Models/SegmentConstant.php +++ b/app/Models/SegmentConstant.php @@ -20,6 +20,10 @@ class SegmentConstant extends AbstractModel protected $table = 'segment_constants'; protected $dates = ['deleted_at']; + + // protected $casts = [ + // 'detail' => 'array', + // ]; public function getDetailAttribute($value) { diff --git a/routes/api.php b/routes/api.php index cf5838f3..10c0fb80 100644 --- a/routes/api.php +++ b/routes/api.php @@ -35,6 +35,8 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function require __DIR__ . '/segment.php'; + require __DIR__ . '/segment_constant.php'; + require __DIR__ . '/currency.php'; require __DIR__ . '/bank.php'; diff --git a/routes/segment_constant.php b/routes/segment_constant.php index e49e9e97..e393e3f3 100644 --- a/routes/segment_constant.php +++ b/routes/segment_constant.php @@ -2,19 +2,20 @@ use Illuminate\Support\Facades\Route; -Route::group(['namespace' => 'StandardSegmentConstants'], function () { - Route::group(['middleware' => 'valid.token'], function () { - Route::group(['prefix' => 'standard-segment-constant'], function () { - Route::get('/list', 'ListStandardSegmentConstantsController@list')->name('standard_segment.update'); - Route::put('/update/{id}', 'UpdateStandardSegmentConstantController@update')->name('standard_segment_constant.update'); - }); - }); -}); +// Route::group(['namespace' => 'StandardSegmentConstants'], function () { +// Route::group(['middleware' => 'valid.token'], function () { +// Route::group(['prefix' => 'standard-segment-constant'], function () { +// Route::get('/list', 'ListStandardSegmentConstantsController@list')->name('standard_segment.update'); +// Route::put('/update/{id}', 'UpdateStandardSegmentConstantController@update')->name('standard_segment_constant.update'); +// }); +// }); +// }); Route::group(['namespace' => 'SegmentConstants'], function () { Route::group(['middleware' => 'valid.token'], function () { Route::group(['prefix' => 'segment-constant'], function () { + Route::get('/{id}/show', 'FetchSegmentConstantController@fetch')->name('segment_constant.show'); Route::post('/create', 'CreateSegmentConstantController@create')->name('segment_constant.create'); Route::put('/update/{id}', 'UpdateSegmentConstantController@update')->name('segment_constant.update'); }); From da7271dddfc1893eebea4d464f081e9f9b618008 Mon Sep 17 00:00:00 2001 From: omair saleh Date: Tue, 1 Mar 2022 09:36:36 +0800 Subject: [PATCH 09/30] fix transaction model duplicated methods --- app/Models/Transaction.php | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index f89ae6ef..429449a6 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -39,7 +39,7 @@ class Transaction extends AbstractModel implements Documentable, Transactionable } /** - * @return MorphOne + * @return \Illuminate\Database\Eloquent\Relations\MorphOne */ public function creditNoteTransaction() { @@ -47,21 +47,13 @@ class Transaction extends AbstractModel implements Documentable, Transactionable } /** - * @return MorphMany + * @return BelongsTo */ public function booking(): BelongsTo { return $this->BelongsTo(Booking::class, 'owner_id', 'id'); } - /** - * @return MorphMany - */ - public function transactions(): MorphMany - { - return $this->MorphMany(Transaction::class, 'owner'); - } - /** * @return BelongsTo */ From 016de0cd473d6081db10327ac29721106b8ab4f2 Mon Sep 17 00:00:00 2001 From: ahmedsophyudden Date: Tue, 1 Mar 2022 16:04:38 +0800 Subject: [PATCH 10/30] Create update refund status api and credit wallet processor --- .../CreateSupplierTransactionLogic.php | 2 +- .../UpdateRefundTransactionStatusLogic.php | 85 ++++++++++++++++++ .../ControllersLogic/CreditWalletLogic.php | 59 ++++++------ .../Processors/CreditWalletProcessor.php | 89 +++++++++++++++++++ ...pdateRefundTransactionStatusController.php | 14 +++ app/Models/Transaction.php | 8 -- routes/transaction.php | 1 + 7 files changed, 215 insertions(+), 43 deletions(-) create mode 100644 app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php create mode 100644 app/Classes/Modules/Wallets/Processors/CreditWalletProcessor.php create mode 100644 app/Http/Controllers/Transactions/UpdateRefundTransactionStatusController.php diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php index 5a7e76b4..93caf8d1 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php @@ -128,7 +128,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $billNumber = $this->generatesTransactionBillNumber->execute('SPLR-'); // $constant = $this->fetchesConstant->execute(['service_charge' => $supplier->id]); $constant = SegmentConstant::where('reference', SegmentConstants::SERVICE_CHARGE)->where('detail->id', $supplier->id)->first(); - $serviceCharge = $this->calculatesTransactionServiceCharge->execute($payment->original_amount, $rate, $constant ? $constant->detail->service_charge->amount : 0.75); + $serviceCharge = $this->calculatesTransactionServiceCharge->execute($payment->original_amount, $rate, $constant ? $constant->detail->service_charge->amount : 0); $object = new TransactionObject($billNumber, TransactionType::BILL, $supplier->id, 1, $supplier->banks()->where('default', true)->first()->id, PaymentMethodType::CASH, diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php new file mode 100644 index 00000000..d760b05d --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php @@ -0,0 +1,85 @@ + 'Updated Transaction', + 'message' => 'You have successfully updated a transaction' + ]; + } + + /** @var FetchesCompany */ + private $fetchesCompany; + + /** @var FetchesTransaction */ + private $fetchesTransaction; + + /** @var UpdatesTransactionStatus */ + private $updatesTransactionStatus; + + /** @var DeletesDocument */ + private $deletesDocument; + + /** @var CreditWalletProcessor */ + private $creditWalletProcessor; + + /** + * CreatePaymentVerificationDocumentLogic constructor. + * @param FetchesCompany $fetchesCompany + * @param FetchesTransaction $fetchesTransaction + * @param UpdatesTransactionStatus $updatesTransactionStatus + * @param DeletesDocument $deletesDocument + * @param CreditWalletProcessor $creditWalletProcessor + */ + public function __construct(FetchesCompany $fetchesCompany, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, DeletesDocument $deletesDocument, CreditWalletProcessor $creditWalletProcessor) + { + $this->fetchesCompany = $fetchesCompany; + $this->fetchesTransaction = $fetchesTransaction; + $this->updatesTransactionStatus = $updatesTransactionStatus; + $this->deletesDocument = $deletesDocument; + $this->creditWalletProcessor = $creditWalletProcessor; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + $transaction = $this->fetchesTransaction->execute(['id' => $request->route('id')]); + + $transaction = $this->updatesTransactionStatus->execute($transaction, $request->input('status')); + + $company = $this->fetchesCompany->execute(['id' => $transaction->booking->company_id]); + + $reference = 'Refund for booking reference '.$transaction->booking->marking; + + if ($transaction->status == ApprovalStatus::APPROVED) { + // add to credit wallet + $this->creditWalletProcessor->execute($company, $transaction->type, $transaction->amount, $reference); + } + + return $this->response([]); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Wallets/ControllersLogic/CreditWalletLogic.php b/app/Classes/Modules/Wallets/ControllersLogic/CreditWalletLogic.php index 1e7b3ceb..3bd908d0 100644 --- a/app/Classes/Modules/Wallets/ControllersLogic/CreditWalletLogic.php +++ b/app/Classes/Modules/Wallets/ControllersLogic/CreditWalletLogic.php @@ -2,25 +2,26 @@ namespace App\Classes\Modules\Wallets\ControllersLogic; -use App\Classes\General\Abstracts\AbstractControllerLogic; -use App\Classes\Modules\Wallets\DataTransferObjects\WalletObject; -use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; -use App\Classes\Modules\Companies\Services\FetchesCompany; -use App\Classes\Modules\Wallets\Services\CreatesWallet; -use App\Classes\Modules\Wallets\Services\GeneratesWalletCode; -use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; -use App\Classes\Modules\Transactions\Services\CreatesTransaction; -use App\Classes\Modules\Wallets\Services\UpdatesWallet; - -use App\Classes\ValueObjects\Constants\TransactionType; -use App\Classes\ValueObjects\Constants\PaymentMethodType; -use App\Classes\ValueObjects\Constants\ApprovalStatus; -use App\Http\Resources\WalletResource; - use ErrorException; -use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\DB; +use App\Http\Resources\WalletResource; +use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\Modules\Wallets\Services\CreatesWallet; +use App\Classes\Modules\Wallets\Services\UpdatesWallet; +use App\Classes\ValueObjects\Constants\TransactionType; + +use App\Classes\ValueObjects\Constants\PaymentMethodType; +use App\Classes\General\Abstracts\AbstractControllerLogic; +use App\Classes\Modules\Companies\Services\FetchesCompany; +use App\Classes\Modules\Wallets\Services\GeneratesWalletCode; + +use App\Classes\Modules\Transactions\Services\CreatesTransaction; +use App\Classes\Modules\Wallets\DataTransferObjects\WalletObject; +use App\Classes\Modules\Wallets\Processors\CreditWalletProcessor; +use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; +use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; class CreditWalletLogic extends AbstractControllerLogic { @@ -53,6 +54,9 @@ class CreditWalletLogic extends AbstractControllerLogic /** @var UpdatesWallet */ private $updatesWallet; + /** @var CreditWalletProcessor */ + private $creditWalletProcessor; + /** * CreateWalletLogic constructor. * @param FetchesCompany $fetchesCompany @@ -61,6 +65,7 @@ class CreditWalletLogic extends AbstractControllerLogic * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber * @param CreatesTransaction $createsTransaction * @param UpdatesWallet $updatesWallet + * @param CreditWalletProcessor $creditWalletProcessor */ public function __construct( FetchesCompany $fetchesCompany, @@ -68,7 +73,8 @@ class CreditWalletLogic extends AbstractControllerLogic CreatesWallet $createsWallet, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatesTransaction $createsTransaction, - UpdatesWallet $updatesWallet + UpdatesWallet $updatesWallet, + CreditWalletProcessor $creditWalletProcessor ) { $this->fetchesCompany = $fetchesCompany; @@ -77,6 +83,7 @@ class CreditWalletLogic extends AbstractControllerLogic $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->createsTransaction = $createsTransaction; $this->updatesWallet = $updatesWallet; + $this->creditWalletProcessor = $creditWalletProcessor; } /** @@ -94,23 +101,7 @@ class CreditWalletLogic extends AbstractControllerLogic $type = $request->input('transaction_type'); - if (!$company->wallets()->first()) { - $object = new WalletObject($company->id, 1, $this->generatesWalletCode->execute()); - $this->createsWallet->execute($object, $company); - } - - $wallet = $company->wallets()->first(); - - $billNumber = $this->generatesTransactionBillNumber->execute($type === 2 ? 'DEBIT-NOTE-' : 'CREDIT-NOTE-'); - - $transaction_object = new TransactionObject($billNumber, $type === 2 ? TransactionType::DEBIT_NOTE : TransactionType::CREDIT_NOTE, 1, $wallet->company->id, 1, PaymentMethodType::CASH, $amount, $amount, 1, 1, 1, 0, 0, null, ApprovalStatus::APPROVED, [], $reference); - $transaction = $this->createsTransaction->execute($wallet, $transaction_object); - - $updateWalletAmount = $type === 2 ? ($wallet->amount - $transaction->amount) : ($wallet->amount + $transaction->amount); - - $walletObject = new WalletObject($wallet->company->id, $wallet->currency_id, $wallet->code, $updateWalletAmount); - - $wallet = $this->updatesWallet->execute($wallet, $walletObject); + $wallet = $this->creditWalletProcessor->execute($company, $type, $amount, $reference); return $this->resourceResponse(new WalletResource($wallet)); } diff --git a/app/Classes/Modules/Wallets/Processors/CreditWalletProcessor.php b/app/Classes/Modules/Wallets/Processors/CreditWalletProcessor.php new file mode 100644 index 00000000..2b303938 --- /dev/null +++ b/app/Classes/Modules/Wallets/Processors/CreditWalletProcessor.php @@ -0,0 +1,89 @@ +generatesWalletCode = $generatesWalletCode; + $this->createsWallet = $createsWallet; + $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; + $this->createsTransaction = $createsTransaction; + $this->updatesWallet = $updatesWallet; + } + + + /** + * @param Company $company + * @param int $transactionType + * @param float $amount + * @param string $reference + * @return \Illuminate\Database\Eloquent\Model + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute(Company $company, int $transactionType, float $amount, string $reference) + { + if (!$company->wallets()->first()) { + $object = new WalletObject($company->id, 1, $this->generatesWalletCode->execute()); + $wallet = $this->createsWallet->execute($object, $company); + } + + $wallet = $company->wallets()->first(); + + $billNumber = $this->generatesTransactionBillNumber->execute($transactionType === 2 ? 'DEBIT-NOTE-' : 'CREDIT-NOTE-'); + + $transaction_object = new TransactionObject($billNumber, $transactionType === 2 ? TransactionType::DEBIT_NOTE : TransactionType::CREDIT_NOTE, 1, $wallet->owner->id, 1, PaymentMethodType::CASH, $amount, $amount, 1, 1, 1, 0, 0, null, ApprovalStatus::APPROVED, [], $reference); + $transaction = $this->createsTransaction->execute($wallet, $transaction_object); + + $updateWalletAmount = $transactionType === 2 ? ($wallet->amount - $transaction->amount) : ($wallet->amount + $transaction->amount); + + $walletObject = new WalletObject($wallet->owner->id, $wallet->currency_id, $wallet->code, $updateWalletAmount); + + $wallet = $this->updatesWallet->execute($wallet, $walletObject); + + return $wallet; + } +} diff --git a/app/Http/Controllers/Transactions/UpdateRefundTransactionStatusController.php b/app/Http/Controllers/Transactions/UpdateRefundTransactionStatusController.php new file mode 100644 index 00000000..919fadd1 --- /dev/null +++ b/app/Http/Controllers/Transactions/UpdateRefundTransactionStatusController.php @@ -0,0 +1,14 @@ +execute($request); + } +} \ No newline at end of file diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index f89ae6ef..2806d782 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -54,14 +54,6 @@ class Transaction extends AbstractModel implements Documentable, Transactionable return $this->BelongsTo(Booking::class, 'owner_id', 'id'); } - /** - * @return MorphMany - */ - public function transactions(): MorphMany - { - return $this->MorphMany(Transaction::class, 'owner'); - } - /** * @return BelongsTo */ diff --git a/routes/transaction.php b/routes/transaction.php index 2012a045..c3402b47 100644 --- a/routes/transaction.php +++ b/routes/transaction.php @@ -11,6 +11,7 @@ Route::group(['prefix' => 'transactions', 'namespace' => 'Transactions', 'as' => route::post('{id}/bill/verification', 'CreatePaymentProofDocumentController@verify')->name('bill.verification'); route::post('{id}/bill/pay', 'CreatePaymentProofDocumentController@pay')->name('bill.pay'); Route::put('/{id}/bill/{status}', 'UpdatePaymentTransactionStatusController@update')->where('status', 'pending|complete')->name('bill.status'); + Route::put('/{id}/refund/status/update', 'UpdateRefundTransactionStatusController@update')->name('refund.status.update'); route::delete('{id}/bill/delete', 'DeletePaymentProofDocumentController@delete')->name('bill.delete'); From 6d624d3196a29ea3e9963b8151e7fc9ebf85be81 Mon Sep 17 00:00:00 2001 From: glovetleong Date: Wed, 2 Mar 2022 09:54:12 +0800 Subject: [PATCH 11/30] export and import --- .gitignore | 5 +- app/Classes/General/ExcelHandel.php | 87 +++++++++++++++ .../Exports/Services/ExportsNullDebtors.php | 100 ++++++++++++++++++ .../Imports/Services/ImportsDebtor.php | 44 ++++++++ .../ExportCustomersToExcelController.php | 7 ++ .../Imports/ImportUpdateDebtorController.php | 25 +++++ routes/web.php | 3 + storage/app/public/.gitignore | 2 - 8 files changed, 270 insertions(+), 3 deletions(-) create mode 100644 app/Classes/General/ExcelHandel.php create mode 100644 app/Classes/Modules/Exports/Services/ExportsNullDebtors.php create mode 100644 app/Classes/Modules/Imports/Services/ImportsDebtor.php create mode 100644 app/Http/Controllers/Imports/ImportUpdateDebtorController.php delete mode 100644 storage/app/public/.gitignore diff --git a/.gitignore b/.gitignore index 95d268cf..476bf6a0 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,7 @@ db/* docker-compose.yml package-lock.json public/* -/public/* \ No newline at end of file +/public/* +/storage/app/public +public +/storage/framework/laravel-excel diff --git a/app/Classes/General/ExcelHandel.php b/app/Classes/General/ExcelHandel.php new file mode 100644 index 00000000..3060ed8b --- /dev/null +++ b/app/Classes/General/ExcelHandel.php @@ -0,0 +1,87 @@ +makeDirectory($path); + return $folder; + } + + public static function insertExcel($path = '', $base64Set = []) + { + $file_info = []; + $folder_path = ExcelHandel::generateFolder('excels/' . $path); + + foreach ($base64Set as $key => $row) { + + $exceldata = $row; + $filename = (string) Str::uuid(); + + $f = finfo_open(); + $mime_type = finfo_file($f, $exceldata, FILEINFO_MIME_TYPE); + + $extension = 'xls'; + + switch ($mime_type) { + case 'application/vnd.ms-excel': + $extension = 'xls'; + break; + case 'application/zip': + $extension = 'xlsx'; + break; + } + + if (empty($extension)) { + return false; + } + + $exceldata = explode('base64,', $exceldata); + $exceldata = base64_decode($exceldata[1]); + + $filename_with_ext = $filename . '.' . $extension; + + $file = ExcelHandel::generateExcel($path, $exceldata, $filename, $extension); + + $file_info[] = [ + 'path' => $path, + 'filename' => $filename_with_ext, + 'mime_type' => $mime_type, + 'extension' => $extension, + 'file_info' => empty($file) ? [] : $file, + ]; + } + + return $file_info; + } + + public static function generateExcel($path = '', $exceldata = '', $filename = '', $extension = '') + { + $file_info = []; + $file = \Storage::disk('public')->put('excels/' . $path . '/' . $filename . '.' . $extension, $exceldata); + $file_info['original']['file'] = storage_path('app/public/excels/' . $path . '/' . $filename . '.' . $extension); + + return $file_info; + } + + public static function removeExcel($excel_info = []) + { + $excel_info = json_decode(json_encode($excel_info), true); + foreach ($excel_info as $key => $row) { + if (!empty($row['path'])) { + \File::delete([$row['file_info']['original']['file']]); + } + } + return true; + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Exports/Services/ExportsNullDebtors.php b/app/Classes/Modules/Exports/Services/ExportsNullDebtors.php new file mode 100644 index 00000000..e585275c --- /dev/null +++ b/app/Classes/Modules/Exports/Services/ExportsNullDebtors.php @@ -0,0 +1,100 @@ +reference, //Code + $company->name, //CompanyName + '', //Desc2 + '', //AreaCode + '', //SalesAgent + '', //DebtorType + '', //DisplayTerm + '', //AgingOn + '', //StatementType + 'MYR', //CurrencyCode + $company->reference, //RegisterNo + '', //Address1 + '', //Address2 + '', //Address3 + '', //Address4 + '', //PostCode + '', //DeliverAddr1 + '', //DeliverAddr2 + '', //DeliverAddr3 + '', //DeliverAddr4 + '', //DeliverPostCode + '', //Attention + '', //Phone1 + '', //Phone2 + '', //Fax1 + '', //Fax2 + '', //ExemptNo + '', //ExpiryDate + '', //PriceCategory + ]; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Imports/Services/ImportsDebtor.php b/app/Classes/Modules/Imports/Services/ImportsDebtor.php new file mode 100644 index 00000000..7a44dbb6 --- /dev/null +++ b/app/Classes/Modules/Imports/Services/ImportsDebtor.php @@ -0,0 +1,44 @@ +first(); + + if ($company) { + $company->debtor = $debtor; + $company->update(); + } + + return []; + } + + public function batchSize(): int + { + return 100; + } + + public function rules(): array + { + return [ + + ]; + } +} diff --git a/app/Http/Controllers/Exports/ExportCustomersToExcelController.php b/app/Http/Controllers/Exports/ExportCustomersToExcelController.php index cdd1c49a..366bf0c7 100644 --- a/app/Http/Controllers/Exports/ExportCustomersToExcelController.php +++ b/app/Http/Controllers/Exports/ExportCustomersToExcelController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Exports; use App\Classes\Modules\Exports\Services\ExportsCustomers; use App\Classes\Modules\Exports\Services\ExportsTransactions; +use App\Classes\Modules\Exports\Services\ExportsNullDebtors; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -24,4 +25,10 @@ class ExportCustomersToExcelController $request->headers->set('Authorization', 'Bearer '.$token); return $exportsTransactions->download('transactions.csv', Excel::CSV, ['Content-Type' => 'text/csv']); } + + public function nullDebtor(ExportsNullDebtors $exportsNullDebtors, Request $request){ + $token = Auth::fromUser(User::find(1)); + $request->headers->set('Authorization', 'Bearer '.$token); + return $exportsNullDebtors->download('nullDebtor.csv', Excel::CSV, ['Content-Type' => 'text/csv']); + } } \ No newline at end of file diff --git a/app/Http/Controllers/Imports/ImportUpdateDebtorController.php b/app/Http/Controllers/Imports/ImportUpdateDebtorController.php new file mode 100644 index 00000000..83d1effd --- /dev/null +++ b/app/Http/Controllers/Imports/ImportUpdateDebtorController.php @@ -0,0 +1,25 @@ +headers->set('Authorization', 'Bearer '.$token); + + $excel_file = $request->input('excel_file'); + + $excel_file = ExcelHandel::insertExcel('debtor', $excel_file); + + return $import = Excel::import(new ImportsDebtor(), $excel_file[0]['file_info']['original']['file']); + } +} \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index e26ef4d8..eda5a7c8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -168,6 +168,9 @@ Route::get('billplz/bills/{bill_no}', function($bill_no){ Route::get('/export/customers/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@export'); Route::get('/export/transactions/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@transactions'); +Route::get('/export/null-debtor/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@nullDebtor'); + +Route::get('/import/update-debtor/f614e339d7058904a831aad742e24d55', 'Imports\ImportUpdateDebtorController@import'); Route::get('/products', function (\App\Classes\Modules\Exports\Services\ExportsProducts $exportsProducts) { return $exportsProducts->download('products.csv', Excel::CSV, ['Content-Type' => 'text/csv']); diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore deleted file mode 100644 index d6b7ef32..00000000 --- a/storage/app/public/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore From ba542c17608334b575a67ced314e2f9399b5282d Mon Sep 17 00:00:00 2001 From: glovetleong Date: Wed, 2 Mar 2022 14:18:52 +0800 Subject: [PATCH 12/30] reference --- app/Classes/Modules/Imports/Services/ImportsDebtor.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Classes/Modules/Imports/Services/ImportsDebtor.php b/app/Classes/Modules/Imports/Services/ImportsDebtor.php index 7a44dbb6..ad91a689 100644 --- a/app/Classes/Modules/Imports/Services/ImportsDebtor.php +++ b/app/Classes/Modules/Imports/Services/ImportsDebtor.php @@ -17,8 +17,8 @@ class ImportsDebtor implements ToModel, WithHeadingRow, WithBatchInserts, WithVa public function model($row = []) { - $reference = str_replace('/CIEF', '', $row['2nd_description']); - + $reference = preg_split('(-|\(|\)|\/)', $row['2nd_description']); + $reference = $reference[array_key_last($reference)]; $debtor = $row['code']; $company = Company::where('reference', $reference)->first(); From f9a3bdcd677f49aa74deb47418f2fdd04df1351c Mon Sep 17 00:00:00 2001 From: omair saleh Date: Wed, 2 Mar 2022 21:01:42 +0800 Subject: [PATCH 13/30] merge master into development --- .../Modules/Wallets/ControllersLogic/CreditWalletLogic.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/Classes/Modules/Wallets/ControllersLogic/CreditWalletLogic.php b/app/Classes/Modules/Wallets/ControllersLogic/CreditWalletLogic.php index 3bd908d0..8ed8aa08 100644 --- a/app/Classes/Modules/Wallets/ControllersLogic/CreditWalletLogic.php +++ b/app/Classes/Modules/Wallets/ControllersLogic/CreditWalletLogic.php @@ -2,25 +2,18 @@ namespace App\Classes\Modules\Wallets\ControllersLogic; -use ErrorException; use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; -use Illuminate\Support\Facades\DB; use App\Http\Resources\WalletResource; -use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\Modules\Wallets\Services\CreatesWallet; use App\Classes\Modules\Wallets\Services\UpdatesWallet; -use App\Classes\ValueObjects\Constants\TransactionType; -use App\Classes\ValueObjects\Constants\PaymentMethodType; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Companies\Services\FetchesCompany; use App\Classes\Modules\Wallets\Services\GeneratesWalletCode; use App\Classes\Modules\Transactions\Services\CreatesTransaction; -use App\Classes\Modules\Wallets\DataTransferObjects\WalletObject; use App\Classes\Modules\Wallets\Processors\CreditWalletProcessor; -use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; class CreditWalletLogic extends AbstractControllerLogic From 79b4431ef7594c077c2edf62741af454f0ba4105 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Wed, 2 Mar 2022 21:32:58 +0800 Subject: [PATCH 14/30] update billings design --- .../bookings/elements/BillingComponent.vue | 6 +++--- .../bookings/elements/BillingDocumentComponent.vue | 14 +++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/resources/assets/vue/components/bookings/elements/BillingComponent.vue b/resources/assets/vue/components/bookings/elements/BillingComponent.vue index bfa8b2d9..6e03c040 100644 --- a/resources/assets/vue/components/bookings/elements/BillingComponent.vue +++ b/resources/assets/vue/components/bookings/elements/BillingComponent.vue @@ -11,7 +11,7 @@
- {{parameters.type}} + {{parameters.type.replaceAll('_', ' ')}}
@@ -27,10 +27,10 @@
-
+
-
{{document}}
+
{{document.replaceAll('_', ' ')}}
diff --git a/resources/assets/vue/components/bookings/elements/BillingDocumentComponent.vue b/resources/assets/vue/components/bookings/elements/BillingDocumentComponent.vue index 64f96d0e..095f574f 100644 --- a/resources/assets/vue/components/bookings/elements/BillingDocumentComponent.vue +++ b/resources/assets/vue/components/bookings/elements/BillingDocumentComponent.vue @@ -40,11 +40,15 @@
{{item.owner.amount}} {{item.owner.fixed_currency.short_code}}
- - - +
+
+ + + +
+
From 62e2e3be2dcc7b26bbe04b87bbdf42bcf227334b Mon Sep 17 00:00:00 2001 From: glovetleong Date: Wed, 2 Mar 2022 23:27:46 +0800 Subject: [PATCH 15/30] transaction invoice export --- .../Services/ExportsInvoiceTransactions.php | 115 ++++++++++++++++++ .../ExportCustomersToExcelController.php | 10 +- routes/web.php | 1 + 3 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 app/Classes/Modules/Exports/Services/ExportsInvoiceTransactions.php diff --git a/app/Classes/Modules/Exports/Services/ExportsInvoiceTransactions.php b/app/Classes/Modules/Exports/Services/ExportsInvoiceTransactions.php new file mode 100644 index 00000000..7f02135f --- /dev/null +++ b/app/Classes/Modules/Exports/Services/ExportsInvoiceTransactions.php @@ -0,0 +1,115 @@ +request = $request; + } + + public function headings(): array + { + return [ + 'DocNo', + 'DocDate', + 'DebtorCode', + 'Ref', + 'Note', + 'ShipInfo', + 'Numbering', + 'AccNo', + 'DetailDescription', + 'FutherDEscription', + 'YourPONo', + 'YourPODate', + 'ProjNo', + 'UOM', + 'Qty', + 'UnitPrice', + 'SubTotal' + ]; + } + + /** + * @return \Illuminate\Support\Collection|mixed + */ + public function query() + { + $start_date = $this->request->input('start_date', null); + if ($start_date) { + $start_date = Carbon::parse($this->request->input('start_date'))->format('Y-m-d'); + } + + $end_date = $this->request->input('end_date', null); + if ($end_date) { + $end_date = Carbon::parse($this->request->input('end_date'))->format('Y-m-d'); + } + + $query = Transaction::query(); + + $query->where('type', TransactionType::INVOICE); + $query->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); + + if($start_date && $end_date) { + $query->whereBetween('created_at', [ + Carbon::parse($start_date)->format('Y-m-d 0:00:00'), + Carbon::parse($end_date)->format('Y-m-d 23:59:59') + ]); + } + elseif($start_date && !$end_date) { + $query->where('created_at', '>=', Carbon::parse($start_date)->format('Y-m-d 0:00:00')); + } + elseif(!$start_date && $end_date) { + $query->where('created_at', '<=', Carbon::parse($end_date)->format('Y-m-d 23:59:59')); + } + + return $query; + } + + /** + * @param Company $transaction + * + * @return array + */ + public function map($transaction): array + { + $booking = $transaction->owner()->first(); + $company = $booking->company()->first(); + + return [ + '<>', + $transaction->updated_at, + $company->debtor, + '', + '', + $booking->marking, + '', + '500-0000', + 'PLEASE REFER TO THE ATTACHED APPENDIX REF ' . $booking->marking, + '', + '', + '', + '', + '', + 1, + $transaction->amount, + $transaction->amount, + ]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Exports/ExportCustomersToExcelController.php b/app/Http/Controllers/Exports/ExportCustomersToExcelController.php index 366bf0c7..3ae0a9bd 100644 --- a/app/Http/Controllers/Exports/ExportCustomersToExcelController.php +++ b/app/Http/Controllers/Exports/ExportCustomersToExcelController.php @@ -6,6 +6,8 @@ namespace App\Http\Controllers\Exports; use App\Classes\Modules\Exports\Services\ExportsCustomers; use App\Classes\Modules\Exports\Services\ExportsTransactions; use App\Classes\Modules\Exports\Services\ExportsNullDebtors; +use App\Classes\Modules\Exports\Services\ExportsInvoiceTransactions; + use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -13,7 +15,6 @@ use Maatwebsite\Excel\Excel; class ExportCustomersToExcelController { - public function export(ExportsCustomers $exportsCustomers, Request $request){ $token = Auth::fromUser(User::find(1)); $request->headers->set('Authorization', 'Bearer '.$token); @@ -31,4 +32,11 @@ class ExportCustomersToExcelController $request->headers->set('Authorization', 'Bearer '.$token); return $exportsNullDebtors->download('nullDebtor.csv', Excel::CSV, ['Content-Type' => 'text/csv']); } + + public function invoicetransactions(Request $request){ + $token = Auth::fromUser(User::find(1)); + $request->headers->set('Authorization', 'Bearer '.$token); + $exportsTransactions = new ExportsInvoiceTransactions($request); + return $exportsTransactions->download('invoice-transactions.csv', Excel::CSV, ['Content-Type' => 'text/csv']); + } } \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 42babb4f..0a3b012f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -143,6 +143,7 @@ Route::get('billplz/bills/{bill_no}', function($bill_no){ Route::get('/export/customers/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@export'); Route::get('/export/transactions/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@transactions'); Route::get('/export/null-debtor/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@nullDebtor'); +Route::get('/export/invoice-transactions/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@invoicetransactions'); Route::get('/import/update-debtor/f614e339d7058904a831aad742e24d55', 'Imports\ImportUpdateDebtorController@import'); From a4f442d681b4e3e3a5c130dc04fedc7b68ce0fef Mon Sep 17 00:00:00 2001 From: glovetleong Date: Thu, 3 Mar 2022 10:05:37 +0800 Subject: [PATCH 16/30] payment name --- ...iceTransactions.php => ExportsPaymentTransactions.php} | 4 ++-- .../Exports/ExportCustomersToExcelController.php | 8 ++++---- routes/web.php | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) rename app/Classes/Modules/Exports/Services/{ExportsInvoiceTransactions.php => ExportsPaymentTransactions.php} (96%) diff --git a/app/Classes/Modules/Exports/Services/ExportsInvoiceTransactions.php b/app/Classes/Modules/Exports/Services/ExportsPaymentTransactions.php similarity index 96% rename from app/Classes/Modules/Exports/Services/ExportsInvoiceTransactions.php rename to app/Classes/Modules/Exports/Services/ExportsPaymentTransactions.php index 7f02135f..606d3a76 100644 --- a/app/Classes/Modules/Exports/Services/ExportsInvoiceTransactions.php +++ b/app/Classes/Modules/Exports/Services/ExportsPaymentTransactions.php @@ -12,7 +12,7 @@ use Maatwebsite\Excel\Concerns\WithMapping; use Illuminate\Http\Request; use Carbon\Carbon; -class ExportsInvoiceTransactions implements FromQuery, WithHeadingRow, WithMapping +class ExportsPaymentTransactions implements FromQuery, WithHeadingRow, WithMapping { use Exportable; @@ -63,7 +63,7 @@ class ExportsInvoiceTransactions implements FromQuery, WithHeadingRow, WithMappi $query = Transaction::query(); - $query->where('type', TransactionType::INVOICE); + $query->where('type', TransactionType::PAYMENT); $query->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); if($start_date && $end_date) { diff --git a/app/Http/Controllers/Exports/ExportCustomersToExcelController.php b/app/Http/Controllers/Exports/ExportCustomersToExcelController.php index 3ae0a9bd..3df1e004 100644 --- a/app/Http/Controllers/Exports/ExportCustomersToExcelController.php +++ b/app/Http/Controllers/Exports/ExportCustomersToExcelController.php @@ -6,7 +6,7 @@ namespace App\Http\Controllers\Exports; use App\Classes\Modules\Exports\Services\ExportsCustomers; use App\Classes\Modules\Exports\Services\ExportsTransactions; use App\Classes\Modules\Exports\Services\ExportsNullDebtors; -use App\Classes\Modules\Exports\Services\ExportsInvoiceTransactions; +use App\Classes\Modules\Exports\Services\ExportsPaymentTransactions; use App\Models\User; use Illuminate\Http\Request; @@ -33,10 +33,10 @@ class ExportCustomersToExcelController return $exportsNullDebtors->download('nullDebtor.csv', Excel::CSV, ['Content-Type' => 'text/csv']); } - public function invoicetransactions(Request $request){ + public function paymentTransactions(Request $request){ $token = Auth::fromUser(User::find(1)); $request->headers->set('Authorization', 'Bearer '.$token); - $exportsTransactions = new ExportsInvoiceTransactions($request); - return $exportsTransactions->download('invoice-transactions.csv', Excel::CSV, ['Content-Type' => 'text/csv']); + $exportsTransactions = new ExportsPaymentTransactions($request); + return $exportsTransactions->download('payment-transactions.csv', Excel::CSV, ['Content-Type' => 'text/csv']); } } \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 0a3b012f..03435aee 100644 --- a/routes/web.php +++ b/routes/web.php @@ -143,7 +143,7 @@ Route::get('billplz/bills/{bill_no}', function($bill_no){ Route::get('/export/customers/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@export'); Route::get('/export/transactions/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@transactions'); Route::get('/export/null-debtor/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@nullDebtor'); -Route::get('/export/invoice-transactions/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@invoicetransactions'); +Route::get('/export/payment-transactions/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@paymentTransactions'); Route::get('/import/update-debtor/f614e339d7058904a831aad742e24d55', 'Imports\ImportUpdateDebtorController@import'); From 833476776672d72cb28804bdac6ddc86a601530f Mon Sep 17 00:00:00 2001 From: omair saleh Date: Fri, 4 Mar 2022 11:58:48 +0800 Subject: [PATCH 17/30] fix timer for transaction --- .../Modules/Wallets/ControllersLogic/TopUpWalletLogic.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php b/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php index 9bbe6073..2129d6dd 100644 --- a/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php +++ b/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php @@ -103,7 +103,7 @@ class TopUpWalletLogic extends AbstractControllerLogic } $billPlzBill = $this->createsBillplzBill->execute($user->name, $user->email, 'This payment is credit topup for company ref. ' . $company->reference, $amount, $billNumber, $request->input('bank_code'), true); - +dd($billPlzBill); $transaction_object = new TransactionObject($billNumber, TransactionType::TOP_UP, 1, $company->id, 1, PaymentMethodType::PAYMENT_GATEWAY, $amount, $amount, 1, 1, 1, 0, 0, null, ApprovalStatus::PENDING_SUBMISSION, [], $billPlzBill->id); $transaction = $this->createsTransaction->execute($wallet, $transaction_object); From 3666b27b76ed356514f2db5fd91e817a53150ef0 Mon Sep 17 00:00:00 2001 From: omair saleh Date: Fri, 4 Mar 2022 12:01:27 +0800 Subject: [PATCH 18/30] fix timer for transaction --- app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php | 2 +- .../Modules/Wallets/ControllersLogic/TopUpWalletLogic.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php b/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php index 5b331fca..69255ed9 100644 --- a/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php +++ b/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php @@ -35,7 +35,7 @@ class CreatesBillplzBill 'reference_2_label' => 'Bill Number', 'reference_2' => $billNumber ]); - +dd($response); if($response->successful()){ $data = $response->json(); diff --git a/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php b/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php index 2129d6dd..9bbe6073 100644 --- a/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php +++ b/app/Classes/Modules/Wallets/ControllersLogic/TopUpWalletLogic.php @@ -103,7 +103,7 @@ class TopUpWalletLogic extends AbstractControllerLogic } $billPlzBill = $this->createsBillplzBill->execute($user->name, $user->email, 'This payment is credit topup for company ref. ' . $company->reference, $amount, $billNumber, $request->input('bank_code'), true); -dd($billPlzBill); + $transaction_object = new TransactionObject($billNumber, TransactionType::TOP_UP, 1, $company->id, 1, PaymentMethodType::PAYMENT_GATEWAY, $amount, $amount, 1, 1, 1, 0, 0, null, ApprovalStatus::PENDING_SUBMISSION, [], $billPlzBill->id); $transaction = $this->createsTransaction->execute($wallet, $transaction_object); From 840110e489f0202930985d1b0644cb3ac7991b35 Mon Sep 17 00:00:00 2001 From: omair saleh Date: Fri, 4 Mar 2022 12:14:57 +0800 Subject: [PATCH 19/30] fix timer for transaction --- app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php b/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php index 69255ed9..0d07aeee 100644 --- a/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php +++ b/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php @@ -22,6 +22,7 @@ class CreatesBillplzBill public function execute(string $name, string $email, string $description, float $amount, string $billNumber, ?string $bankCode = null, ?bool $wallet = null) { try{ // config('billplz.maybank') + dd(config('billplz.api_key')); $response = Http::withBasicAuth(config('billplz.api_key').':', '')->post(config('billplz.base_url').'/api/v3/bills', [ 'collection_id' => $wallet ? config('billplz.wallet_collection_id') : config('billplz.collection_id'), 'name' => $name, @@ -35,7 +36,7 @@ class CreatesBillplzBill 'reference_2_label' => 'Bill Number', 'reference_2' => $billNumber ]); -dd($response); + if($response->successful()){ $data = $response->json(); From 8cd019b64b89c44eb8d4cf2201f965388d90d8f9 Mon Sep 17 00:00:00 2001 From: omair saleh Date: Fri, 4 Mar 2022 12:18:28 +0800 Subject: [PATCH 20/30] fix timer for transaction --- .env.example | 8 ++++---- .../Modules/Billplzs/Services/CreatesBillplzBill.php | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index 78c079f5..b1273290 100644 --- a/.env.example +++ b/.env.example @@ -53,7 +53,7 @@ JWT_TTL=1440 IS_PRODUCTION=false BILLPLZ_BASE_URL="https://www.billplz-sandbox.com" -BILLPLZ_API_KEY="0fa4c710-761b-4a7a-a501-c2c2d02643d5" -BILLPLZ_X_SIGNATURE_KEY="S-pbNVthVRsvnPfZlgLwqqOg" -BILLPLZ_COLLECTION_ID="hev2wdjy" -BILLPLZ_WALLET_COLLECTION_ID="hev2wdjy" +BILLPLZ_API_KEY="c8a55af1-08ee-4ed6-bb18-6e5078300d9e" +BILLPLZ_X_SIGNATURE_KEY="S-hcT93TLVGAv9TYWfpTCcWQ" +BILLPLZ_COLLECTION_ID="t0cggbdd" +BILLPLZ_WALLET_COLLECTION_ID="t0cggbdd" diff --git a/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php b/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php index 0d07aeee..08c41668 100644 --- a/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php +++ b/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php @@ -22,7 +22,7 @@ class CreatesBillplzBill public function execute(string $name, string $email, string $description, float $amount, string $billNumber, ?string $bankCode = null, ?bool $wallet = null) { try{ // config('billplz.maybank') - dd(config('billplz.api_key')); + dd(config('billplz.api_key'), config('billplz.base_url').'/api/v3/bills'); $response = Http::withBasicAuth(config('billplz.api_key').':', '')->post(config('billplz.base_url').'/api/v3/bills', [ 'collection_id' => $wallet ? config('billplz.wallet_collection_id') : config('billplz.collection_id'), 'name' => $name, From 5e9d852a84b6b791201944c8aaa12ca703b14bb6 Mon Sep 17 00:00:00 2001 From: omair saleh Date: Fri, 4 Mar 2022 12:20:28 +0800 Subject: [PATCH 21/30] fix wallet insufficient credit --- app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php b/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php index 08c41668..5b331fca 100644 --- a/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php +++ b/app/Classes/Modules/Billplzs/Services/CreatesBillplzBill.php @@ -22,7 +22,6 @@ class CreatesBillplzBill public function execute(string $name, string $email, string $description, float $amount, string $billNumber, ?string $bankCode = null, ?bool $wallet = null) { try{ // config('billplz.maybank') - dd(config('billplz.api_key'), config('billplz.base_url').'/api/v3/bills'); $response = Http::withBasicAuth(config('billplz.api_key').':', '')->post(config('billplz.base_url').'/api/v3/bills', [ 'collection_id' => $wallet ? config('billplz.wallet_collection_id') : config('billplz.collection_id'), 'name' => $name, From 90f2bb178d796a029137129fe76bb11b48d12175 Mon Sep 17 00:00:00 2001 From: omair saleh Date: Fri, 4 Mar 2022 12:25:22 +0800 Subject: [PATCH 22/30] fix wallet insufficient credit --- .../bookings/forms/BookingPaymentQuotationComponent.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/assets/vue/components/bookings/forms/BookingPaymentQuotationComponent.vue b/resources/assets/vue/components/bookings/forms/BookingPaymentQuotationComponent.vue index d43eb47b..ca515606 100644 --- a/resources/assets/vue/components/bookings/forms/BookingPaymentQuotationComponent.vue +++ b/resources/assets/vue/components/bookings/forms/BookingPaymentQuotationComponent.vue @@ -529,7 +529,7 @@ computed: { walletOutstanding(){ let walletBalance = this.data.company.wallet ? this.data.company.wallet.amount : 0; - return walletBalance - this.calculation.total; + return (walletBalance - this.calculation.total).toFixed(2); } }, methods: { From a6326b11efa8a2bb2b61345d357c66c0a688a645 Mon Sep 17 00:00:00 2001 From: omair saleh Date: Fri, 4 Mar 2022 12:32:16 +0800 Subject: [PATCH 23/30] fix wallet insufficient credit --- .../Bookings/ControllersLogic/CreateBookingPaymentLogic.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php index 38080fff..87e6866f 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingPaymentLogic.php @@ -121,7 +121,7 @@ class CreateBookingPaymentLogic extends AbstractControllerLogic /** @var Wallet $wallet */ $wallet = $booking->company->wallets()->first(); - if($wallet->amount < $amount){ + if($wallet->amount < round($amount, 2)){ throw new MalformedRequestException('Insufficient wallet balance. Please Top up your wallet.'); } From 4e3365ba977f0fd45ced9f57e6851ab69098d7e8 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Sat, 5 Mar 2022 17:01:57 +0800 Subject: [PATCH 24/30] Update copyright year using php to get current year --- resources/views/partials/footer.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/partials/footer.blade.php b/resources/views/partials/footer.blade.php index 8d4fbcb3..89caae21 100644 --- a/resources/views/partials/footer.blade.php +++ b/resources/views/partials/footer.blade.php @@ -3,7 +3,7 @@
- Copyright © 2021 CIEF Exchange. All rights reserved. + Copyright © {{ date('Y') }} CIEF Exchange. All rights reserved.
From ee85127c96dad89e1ddae9c454b3ce57868f8a6f Mon Sep 17 00:00:00 2001 From: edmondlang Date: Sun, 6 Mar 2022 00:17:16 +0800 Subject: [PATCH 25/30] implemtn api on segment_constants service chrages --- .../companies/elements/SupplierComponent.vue | 18 ++++ .../SupplierServiceChargeFormComponent.vue | 88 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 resources/assets/vue/components/companies/forms/SupplierServiceChargeFormComponent.vue diff --git a/resources/assets/vue/components/companies/elements/SupplierComponent.vue b/resources/assets/vue/components/companies/elements/SupplierComponent.vue index 6b2961c2..8f0090fd 100644 --- a/resources/assets/vue/components/companies/elements/SupplierComponent.vue +++ b/resources/assets/vue/components/companies/elements/SupplierComponent.vue @@ -34,15 +34,33 @@
+
+
+
+
Service Charge
+
+
+
+
+
0.00
+
+
+
+ + + + diff --git a/resources/assets/vue/components/companies/forms/SupplierServiceChargeFormComponent.vue b/resources/assets/vue/components/companies/forms/SupplierServiceChargeFormComponent.vue new file mode 100644 index 00000000..74c02a91 --- /dev/null +++ b/resources/assets/vue/components/companies/forms/SupplierServiceChargeFormComponent.vue @@ -0,0 +1,88 @@ + + \ No newline at end of file From 29e926867e9c25dc188021fc611b070b8c5e0235 Mon Sep 17 00:00:00 2001 From: azumiru Date: Sun, 6 Mar 2022 13:54:35 +0800 Subject: [PATCH 26/30] refund-ui-payment - update validations --- .../elements/PaymentHistoryComponent.vue | 6 ++-- .../elements/RefundConfirmationComponent.vue | 34 +++++++++++-------- .../forms/ValidationErrorComponent.vue | 12 ++++--- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue index af7eab83..ab0bb5c4 100644 --- a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue @@ -176,9 +176,9 @@
-
+
- + @@ -294,7 +294,7 @@ expandPaymentDetails: false, expandRefund: false, refundMethod: { - name: 'Fully Refund', + name: 'Partially Refund', status: false }, amount: (Math.round(1000 * 100) / 100).toFixed(2), diff --git a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue index 9a810def..215c626f 100644 --- a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue +++ b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue @@ -10,7 +10,7 @@
-
+
@@ -64,12 +64,12 @@
-->
-
- Fully Refund -
-
+
Partially Refund
+
+ Fully Refund +
@@ -92,14 +92,14 @@
-
+
@@ -253,7 +253,7 @@ import FormHandler from '../../../general/mixins/formHandler'; // import ConfirmBookingComponent from "../forms/confirmBookingComponent"; import ModalFormHandler from '../../../general/mixins/modalFormHandler'; - import { required } from "vuelidate/lib/validators"; + import { required, maxValue } from "vuelidate/lib/validators"; export default { // components: {ConfirmBookingComponent}, data(){ @@ -264,20 +264,26 @@ account_no: '', parameters: { bankAccount: '', - refundAmount: this.data.booking.amount, + refundAmount: this.data.booking.refundAmount, bank_id: '', }, expandRefund: false, refundMethod: { - name: 'Fully Refund', + name: 'Partially Refund', status: false }, + refundMaxValue: this.data.booking.amount } }, - validations: { - parameters: { - bankAccount: { required }, - refundAmount: { required }, + validations() { + return { + parameters: { + bankAccount: { required }, + refundAmount: { + required, + maxValue: maxValue(this.refundMaxValue) + }, + } } }, computed: { diff --git a/resources/assets/vue/components/general/forms/ValidationErrorComponent.vue b/resources/assets/vue/components/general/forms/ValidationErrorComponent.vue index 3c5f6bb0..d85e38a4 100644 --- a/resources/assets/vue/components/general/forms/ValidationErrorComponent.vue +++ b/resources/assets/vue/components/general/forms/ValidationErrorComponent.vue @@ -1,9 +1,10 @@ @@ -21,7 +22,8 @@ required: 'this field is required', email: 'enter a valid email address', minLength: 'this field must have at least', - sameAs: 'this field must match the' + sameAs: 'this field must match the', + maxValue: 'this value must not exceeds' }, } }, From 8b9c6d55c656e5884f02916aea2256d821f6705f Mon Sep 17 00:00:00 2001 From: edmondlang Date: Sun, 6 Mar 2022 16:03:25 +0800 Subject: [PATCH 27/30] update booking refund design and remove dd --- .../CreateBookingRefundLogic.php | 2 +- .../elements/RefundConfirmationComponent.vue | 256 ++---------------- 2 files changed, 17 insertions(+), 241 deletions(-) diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php index 411b9163..7f0d7e7d 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php @@ -89,7 +89,7 @@ class CreateBookingRefundLogic extends AbstractControllerLogic } $refund = $this->calculatesBookingRefundAmount->execute($booking, $booking->fix_currency_id, $transaction->bill_no); - dd($refund); + // dd($refund); if($refund + $request->input('amount') > $transaction->original_amount) throw new MalformedRequestException('Your refund must not be greater than '. $transaction->original_amount .'.'); diff --git a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue index 215c626f..34d97d3b 100644 --- a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue +++ b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue @@ -10,7 +10,7 @@
-
+
@@ -23,61 +23,22 @@
Refund Type:
- - -
-
+
+
Partially Refund
-
+
Fully Refund
-
+ +
- +
@@ -90,61 +51,6 @@
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
{{bank.reference ? bank.reference + ' - ':''}}{{bank.holder_name}}
-
-
-
-
-
{{bank.account_no}} {{bank.bank_name}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- - -
-
@@ -153,95 +59,11 @@
-
-
-
-
-
-
-
Amount you are Transferring
-
-
- -
short_code
-
-
- -
amount
-
-
-
-
-
Exchange Rate
-
-
-
-
-
- -
rate
-
-
-
-
-
Money Transfer Fee
-
-
-
MYR
-
-
- -
amount
-
-
-
-
-
Sub-Total
-
-
-
MYR
-
-
- -
Sub-Total
-
-
-
-
-
Tax
-
-
- -
some%
-
-
- -
some tax
-
-
-
-
-
Amount you are Paying
-
-
-
MYR
-
-
- -
payming amount
-
-
-
-
-
-
-
-
@@ -251,23 +73,15 @@