Merge branch 'add-transaction-service-charge' into development

This commit is contained in:
ahmedsophyudden
2022-02-28 22:50:13 +08:00
28 changed files with 755 additions and 68 deletions
@@ -0,0 +1,21 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use App\Classes\ValueObjects\Constants\SegmentConstants;
use Illuminate\Database\Eloquent\Builder;
class ServiceCharge implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('reference', SegmentConstants::SERVICE_CHARGE)->where('detail->id', $value);
}
}
@@ -0,0 +1,70 @@
<?php
namespace App\Classes\Modules\SegmentConstants\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Segments\Standards\Rules\CanCreateConstant;
use App\Classes\Modules\Segments\Services\CreatesConstant;
use App\Classes\Modules\Segments\DataTransferObjects\ConstantObject;
use App\Classes\Modules\Segments\Services\FetchesSegment;
use App\Http\Resources\ConstantResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateSegmentConstantLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => '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));
}
}
@@ -0,0 +1,51 @@
<?php
namespace App\Classes\Modules\SegmentConstants\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Segments\Services\FetchesConstant;
use App\Http\Resources\ConstantResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class FetchSegmentConstantLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => '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));
}
}
@@ -0,0 +1,88 @@
<?php
namespace App\Classes\Modules\SegmentConstants\ControllersLogic;
use App\Http\Resources\ConstantResource;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Segments\Services\FetchesConstant;
use App\Classes\Modules\Segments\Standards\Rules\CanUpdateConstant;
use App\Classes\Modules\Segments\Services\UpdatesConstant;
use App\Classes\Modules\Segments\DataTransferObjects\ConstantObject;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class UpdateSegmentConstantLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => '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());
}
}
}
@@ -3,31 +3,37 @@
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;
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\Transactions\DataTransferObjects\TransactionObject;
use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
use App\Classes\Modules\Transactions\Services\CreatesTransaction;
use App\Classes\Modules\Transactions\Services\FetchesTransaction;
use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber;
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
use App\Classes\Modules\Documents\Services\CreatesDocument;
use App\Classes\Modules\Documents\Services\CreatesFiles;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
use App\Classes\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 App\Classes\Modules\Segments\Services\FetchesConstant;
use Meneses\LaravelLaravelMpdf\Facades\LaravelLaravelMpdf;
use Meneses\LaravelMpdf\Facades\LaravelMpdf;
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;
use App\Classes\Modules\Transactions\Services\CalculatesTransactionServiceCharge;
class CreateSupplierTransactionLogic extends AbstractControllerLogic
{
@@ -64,6 +70,12 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic
/** @var GeneratesTransactionBillNumber */
private $generatesTransactionBillNumber;
/** @var CalculatesTransactionServiceCharge */
private $calculatesTransactionServiceCharge;
/** @var CalculatesTransactionTransferFee */
private $calculatesTransactionTransferFee;
/** @var PDF */
private $pdf;
@@ -71,21 +83,27 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic
* CreateSupplierTransactionLogic constructor.
* @param FetchesCompany $fetchesCompany
* @param FetchesTransaction $fetchesTransaction
* @param FetchesConstant $fetchesConstant
* @param UpdatesTransactionStatus $updatesTransactionStatus
* @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, 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;
$this->createsFile = $createsFile;
$this->generatesTransactionBillNumber = $generatesTransactionBillNumber;
$this->calculatesTransactionServiceCharge = $calculatesTransactionServiceCharge;
$this->calculatesTransactionTransferFee = $calculatesTransactionTransferFee;
$this->pdf = $pdf;
}
@@ -97,6 +115,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic
$rate = $request->input('rate');
$transactions = collect();
$transferFeeTransactions = collect();
foreach($request->input('payments') as $payment){
@@ -107,17 +126,30 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic
$this->updatesTransactionStatus->execute($payment, ApprovalStatus::COMPLETED);
$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);
$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, $object);
$transactions[] = $billTransaction = $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($billTransaction, $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';
@@ -0,0 +1,46 @@
<?php
namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Models\Bank;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Transactions\Services\GeneratesBankBalanceAccount;
class FetchBankAccountBalanceLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => '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)]);
}
}
@@ -0,0 +1,46 @@
<?php
namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Models\Company;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Transactions\Services\GeneratesCompanyBalanceAccount;
class FetchCompanyAccountBalanceLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => '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)]);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
class CalculatesTransactionServiceCharge
{
/**
* @param float $amount
* @param float $rate
* @param float $service_charge
* @param float $transfer_fee
* @return float
*/
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;
}
}
@@ -0,0 +1,17 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
class CalculatesTransactionTransferFee
{
/**
* @param float $amount
* @param float $transfer_fee
* @return float
*/
public function execute(float $amount, ?float $transfer_fee = 0.002) {
return $amount * $transfer_fee/100;
}
}
@@ -0,0 +1,52 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use Carbon\Carbon;
use App\Models\Bank;
use App\Http\Resources\BankResource;
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 GeneratesBankBalanceAccount
{
/** @var ChecksIfTransactionBillNumberExists */
private $checksIfTransactionBillNumberExists;
/**
* GeneratesTransactionBillNo constructor.
* @param ChecksIfTransactionBillNumberExists $checksIfTransactionBillNumberExists
*/
public function __construct(ChecksIfTransactionBillNumberExists $checksIfTransactionBillNumberExists)
{
$this->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'),
];
}
}
@@ -0,0 +1,50 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use Carbon\Carbon;
use App\Models\Company;
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
{
/** @var ChecksIfTransactionBillNumberExists */
private $checksIfTransactionBillNumberExists;
/**
* GeneratesTransactionBillNo constructor.
* @param ChecksIfTransactionBillNumberExists $checksIfTransactionBillNumberExists
*/
public function __construct(ChecksIfTransactionBillNumberExists $checksIfTransactionBillNumberExists)
{
$this->checksIfTransactionBillNumberExists = $checksIfTransactionBillNumberExists;
}
/**
* @param Company $company
*/
public function execute(Company $company) {
$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,
'creditNoteTransactions' => $creditNoteTransactions,
'account_balance' => $transferFeeTransactions->sum('amount') - $creditNoteTransactions->sum('amount'),
];
}
}
@@ -10,4 +10,6 @@ final class BusinessType {
public const CURRENCY_VENDOR = 3;
public const TRANSFER_AGENT = 4;
}
@@ -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';
}
@@ -27,4 +27,6 @@ final class TransactionType {
public const DEBIT_NOTE = 11;
public const WITHDRAW = 10;
public const TRANSFER_FEE = 11;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\SegmentConstants;
use App\Classes\Modules\SegmentConstants\ControllersLogic\CreateSegmentConstantLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateSegmentConstantController
{
/**
* @param Request $request
* @param CreateSegmentConstantLogic $logic
* @return JsonResponse
*/
public function create(Request $request, CreateSegmentConstantLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\SegmentConstants;
use App\Classes\Modules\SegmentConstants\ControllersLogic\FetchSegmentConstantLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class FetchSegmentConstantController
{
/**
* @param Request $request
* @param FetchSegmentConstantLogic $logic
* @return JsonResponse
*/
public function fetch(Request $request, FetchSegmentConstantLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\SegmentConstants;
use App\Classes\Modules\SegmentConstants\ControllersLogic\UpdateSegmentConstantLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdateSegmentConstantController
{
/**
* @param Request $request
* @param UpdateSegmentConstantLogic $logic
* @return JsonResponse
*/
public function update(Request $request, UpdateSegmentConstantLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Transactions;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Classes\Modules\Transactions\ControllersLogic\FetchBankAccountBalanceLogic;
class FetchBankAccountBalanceController
{
/**
* @param Request $request
* @param FetchBankAccountBalanceLogic $logic
* @return JsonResponse
*/
public function fetch(Request $request, FetchBankAccountBalanceLogic $logic) : JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Transactions;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Classes\Modules\Transactions\ControllersLogic\FetchCompanyAccountBalanceLogic;
class FetchCompanyAccountBalanceController
{
/**
* @param Request $request
* @param FetchCompanyAccountBalanceLogic $logic
* @return JsonResponse
*/
public function fetch(Request $request, FetchCompanyAccountBalanceLogic $logic) : JsonResponse {
return $logic->execute($request);
}
}
+1
View File
@@ -57,6 +57,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();
+11 -2
View File
@@ -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');
}
}
+8
View File
@@ -101,6 +101,14 @@ 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
+4
View File
@@ -20,6 +20,10 @@ class SegmentConstant extends AbstractModel
protected $table = 'segment_constants';
protected $dates = ['deleted_at'];
// protected $casts = [
// 'detail' => 'array',
// ];
public function getDetailAttribute($value)
{
+16
View File
@@ -30,6 +30,22 @@ class Transaction extends AbstractModel implements Documentable, Transactionable
return $this->morphTo();
}
/**
* @return MorphMany
*/
public function transactions(): MorphMany
{
return $this->MorphMany(Transaction::class, 'owner');
}
/**
* @return MorphOne
*/
public function creditNoteTransaction()
{
return $this->MorphOne(Transaction::class, 'owner')->where('type', TransactionType::CREDIT_NOTE);
}
/**
* @return MorphMany
*/
@@ -1,29 +1,33 @@
@extends('layouts.base_pdf')
@section('inner_content')
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 15px;
}
</style>
<style>
table,
th,
td {
border: 1px solid black;
border-collapse: collapse;
}
th,
td {
padding: 15px;
}
</style>
<br>
<htmlpageheader name="page-header">
<br>
<htmlpageheader name="page-header">
<br>
<table style="margin-bottom: 25px; border: none;">
<tbody>
<table style="margin-bottom: 25px; border: none;">
<tbody>
<tr>
<td>{{$supplier->name}}</td>
<td>{{\Carbon\Carbon::now('Asia/Singapore')->format('d-m-Y h:s')}}</td>
</tr>
</tbody>
</table>
</htmlpageheader>
<br>
<table style="width:100%">
<tbody>
</tbody>
</table>
</htmlpageheader>
<br>
<table style="width:100%">
<tbody>
<tr>
<td>Reference</td>
<td>Marking</td>
@@ -41,21 +45,59 @@
<br>Branch: {{$transaction->owner()->first()->booking->bank->bank_branch}}<br>Bank in Amount: {{$transaction->original_currency->short_code}} {{$transaction->original_amount}}</td>
</tr>
@endforeach
</tbody>
</table>
<table style="margin-bottom: 25px; border: none;">
<tbody>
</tbody>
</table>
<table style="margin-bottom: 25px; border: none;">
<tbody>
<tr>
<td width="70%" style="text-align: right;">Sub total booking amount: </td>
@php
$sub_total_booking_amount = number_format((float)$transactions->sum('original_amount'), 2, '.', '');
@endphp
<td>RMB {{$sub_total_booking_amount}}</td>
</tr>
<tr>
<td width="70%" style="text-align: right;">Transfer fee (0.002%): </td>
@php
$transfer_fee = number_format((float)$transferFeeTransactions->sum('service_charge'), 2, '.', '');
@endphp
<td>RMB {{$transfer_fee}}</td>
</tr>
<tr>
<td width="70%" style="text-align: right;">Total booking amount: </td>
@php
$total_booking_amount = number_format((float) ($transactions->sum('original_amount') + $transfer_fee), 2, '.', '');
@endphp
<td>RMB {{$total_booking_amount}}</td>
</tr>
<tr>
<td width="70%" style="text-align: right;">Sub total amount: </td>
@php
$sub_total_amount = number_format((float)$transactions->sum('amount') + ($transfer_fee * 1/$transactions[0]->currency_rate), 2, '.', '');
@endphp
<td>MYR {{$sub_total_amount}}</td>
</tr>
<tr>
<td width="70%" style="text-align: right;">Service charge ({{ $supplier->id == 2 ? '0.00' : '0.75%' }}): </td>
@php
$service_charge = number_format((float)$sub_total_amount * 0.75 / 100, 2, '.', '');
@endphp
<td>MYR {{$service_charge}}</td>
</tr>
<tr>
<td width="70%" style="text-align: right;">Total amount: </td>
<td>MYR {{number_format((float)$transactions->sum('amount'), 2, '.', '')}}</td>
@php
$total_amount = number_format((float)$sub_total_amount + $service_charge, 2, '.', '');
@endphp
<td>MYR {{$total_amount}}</td>
</tr>
</tbody>
</table>
<htmlpagefooter name="page-footer">
<table width="100%" style="border: none;">
<tr>
<td style="text-align: right; ">Page {PAGENO} of {nbpg}</td>
</tr>
</tbody>
</table>
<htmlpagefooter name="page-footer">
<table width="100%" style="border: none;">
<tr>
<td style="text-align: right; ">Page {PAGENO} of {nbpg}</td>
</tr>
</table>
</htmlpagefooter>
</htmlpagefooter>
@endsection
+2
View File
@@ -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';
+9 -8
View File
@@ -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');
});
+3
View File
@@ -18,4 +18,7 @@ Route::group(['prefix' => 'transactions', 'namespace' => 'Transactions', 'as' =>
Route::get('wallet/list', 'ListWalletTransactionsController@list')->name('wallet.list');
Route::get('/company/{id}/account/balance', 'FetchCompanyAccountBalanceController@fetch')->name('company.account.balance');
Route::get('/bank/{id}/account/balance', 'FetchBankAccountBalanceController@fetch')->name('bank.account.balance');
});