diff --git a/app/Classes/Modules/Transactions/ControllersLogic/FetchCompanyTransactionStatementLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/FetchCompanyTransactionStatementLogic.php
index a078a01d..6b596477 100644
--- a/app/Classes/Modules/Transactions/ControllersLogic/FetchCompanyTransactionStatementLogic.php
+++ b/app/Classes/Modules/Transactions/ControllersLogic/FetchCompanyTransactionStatementLogic.php
@@ -13,6 +13,7 @@ use App\Models\Booking;
use App\Models\Company;
use App\Models\Transaction;
use App\Models\Wallet;
+use Illuminate\Support\Facades\DB;
class FetchCompanyTransactionStatementLogic extends AbstractControllerLogic
{
@@ -37,14 +38,15 @@ class FetchCompanyTransactionStatementLogic extends AbstractControllerLogic
public function logic(Request $request): JsonResponse
{
$companyId = $request->route('id');
+ $filterArray = json_decode($request->input('filters'));
$transactions = Transaction::where(function ($query) use ($companyId) {
$query
->where('type', TransactionType::PAYMENT)
->where('owner_type', Booking::class)
->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
- ->whereHas('booking', function ($query) use ($companyId) {
- $query->where('company_id', $companyId);
+ ->whereHas('booking', function ($q) use ($companyId) {
+ $q->where('company_id', $companyId);
});
})
->orWhere(function ($query) use ($companyId) {
@@ -66,7 +68,83 @@ class FetchCompanyTransactionStatementLogic extends AbstractControllerLogic
})
->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
->orderBy('created_at', 'desc')
- ->get();
+ ->paginate($filterArray->per_page);
+
+ $total_incoming = Transaction::where(function ($query) use ($companyId, $transactions) {
+ $query->whereHas('owner', function ($query) use ($companyId) {
+ $query->where('owner_id', $companyId);
+ $query->where('owner_type', Company::class);
+ })
+ ->where('owner_type', Wallet::class)
+ ->where('type', '!=', TransactionType::PAYMENT);
+ })
+ ->orWhere(function ($query) use ($companyId, $transactions) {
+ $query
+ ->where('type', TransactionType::INVOICE)
+ ->where('owner_type', Booking::class)
+ ->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
+ ->whereHas('booking', function ($query) use ($companyId) {
+ $query->where('company_id', $companyId);
+ });
+ })
+ ->sum(
+ DB::raw(
+ 'if (transactions.type = 2,(transactions.amount / transactions.currency_rate + transactions.service_charge),transactions.amount)'
+ )
+ );
+
+ $total_outgoing = Transaction::where(function ($query) use ($companyId, $transactions) {
+ $query
+ ->where('type', TransactionType::PAYMENT)
+ ->where('owner_type', Booking::class)
+ ->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
+ ->whereHas('booking', function ($query) use ($companyId) {
+ $query->where('company_id', $companyId);
+ });
+ })
+ ->sum('transactions.amount');
+
+ $currentBalance = $total_incoming - $total_outgoing;
+
+ $incoming = Transaction::where(function ($query) use ($companyId, $transactions) {
+ $query->whereHas('owner', function ($query) use ($companyId) {
+ $query->where('owner_id', $companyId);
+ $query->where('owner_type', Company::class);
+ })
+ ->where('owner_type', Wallet::class)
+ ->where('type', '!=', TransactionType::PAYMENT)
+ ->where('id', '>', $transactions->first()->id);
+ })
+ ->orWhere(function ($query) use ($companyId, $transactions) {
+ $query
+ ->where('type', TransactionType::INVOICE)
+ ->where('owner_type', Booking::class)
+ ->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
+ ->whereHas('booking', function ($query) use ($companyId) {
+ $query->where('company_id', $companyId);
+ })
+ ->where('id', '>', $transactions->first()->id);
+ })
+ ->sum(
+ DB::raw(
+ 'if (transactions.type = 2,(transactions.amount / transactions.currency_rate + transactions.service_charge),transactions.amount)'
+ )
+ );
+
+ $outgoing = Transaction::where(function ($query) use ($companyId, $transactions) {
+ $query
+ ->where('type', TransactionType::PAYMENT)
+ ->where('owner_type', Booking::class)
+ ->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
+ ->whereHas('booking', function ($query) use ($companyId) {
+ $query->where('company_id', $companyId);
+ })
+ ->where('id', '>', $transactions->first()->id);
+ })
+ ->sum('transactions.amount');
+
+ $runningBalanceInReverse = $currentBalance - $incoming + $outgoing;
+ $request['running_balance'] = $runningBalanceInReverse;
return $this->collectionResponse(PaymentTransactionResource::collection($transactions));
}
diff --git a/app/Http/Controllers/Exports/ExportCustomersAccountStatementTransactionToPDFController.php b/app/Http/Controllers/Exports/ExportCustomersAccountStatementTransactionToPDFController.php
new file mode 100644
index 00000000..2ab8f4a7
--- /dev/null
+++ b/app/Http/Controllers/Exports/ExportCustomersAccountStatementTransactionToPDFController.php
@@ -0,0 +1,110 @@
+headers->set('Authorization', 'Bearer ' . $token);
+ }
+
+ public function export(Request $request)
+ {
+ ini_set('max_execution_time', '1000000');
+ ini_set("pcre.backtrack_limit", "5000000");
+
+ $companyId = $request->route('id');
+ $company = Company::find($companyId);
+
+ $transactions = Transaction::where(function ($query) use ($companyId) {
+ $query
+ ->where('type', TransactionType::PAYMENT)
+ ->where('owner_type', Booking::class)
+ ->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
+ ->whereHas('booking', function ($q) use ($companyId) {
+ $q->where('company_id', $companyId);
+ });
+ })
+ ->orWhere(function ($query) use ($companyId) {
+ $query->whereHas('owner', function ($query) use ($companyId) {
+ $query->where('owner_id', $companyId);
+ $query->where('owner_type', Company::class);
+ })
+ ->where('owner_type', Wallet::class)
+ ->where('type', '!=', TransactionType::PAYMENT);
+ })
+ ->orWhere(function ($query) use ($companyId) {
+ $query
+ ->where('type', TransactionType::INVOICE)
+ ->where('owner_type', Booking::class)
+ ->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
+ ->whereHas('booking', function ($query) use ($companyId) {
+ $query->where('company_id', $companyId);
+ });
+ })
+ ->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
+ ->orderBy('created_at', 'desc')
+ ->get();
+
+ $total_incoming = Transaction::where(function ($query) use ($companyId, $transactions) {
+ $query->whereHas('owner', function ($query) use ($companyId) {
+ $query->where('owner_id', $companyId);
+ $query->where('owner_type', Company::class);
+ })
+ ->where('owner_type', Wallet::class)
+ ->where('type', '!=', TransactionType::PAYMENT);
+ })
+ ->orWhere(function ($query) use ($companyId, $transactions) {
+ $query
+ ->where('type', TransactionType::INVOICE)
+ ->where('owner_type', Booking::class)
+ ->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
+ ->whereHas('booking', function ($query) use ($companyId) {
+ $query->where('company_id', $companyId);
+ });
+ })
+ ->sum(
+ DB::raw(
+ 'if (transactions.type = 2,(transactions.amount / transactions.currency_rate + transactions.service_charge),transactions.amount)'
+ )
+ );
+
+ $total_outgoing = Transaction::where(function ($query) use ($companyId) {
+ $query
+ ->where('type', TransactionType::PAYMENT)
+ ->where('owner_type', Booking::class)
+ ->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
+ ->whereHas('booking', function ($query) use ($companyId) {
+ $query->where('company_id', $companyId);
+ });
+ })
+ ->sum('transactions.amount');
+
+ $currentBalance = $total_incoming - $total_outgoing;
+
+ $pdf = LaravelMpdf::loadView('pages.pdfs.company_account_statement_transaction', ['transactions' => $transactions, 'runningBalance' => $currentBalance, 'company' => $company, 'isPrecise' => $request->route('is_precise') == 'true']);
+
+ return $pdf->download("test.pdf");
+ }
+}
diff --git a/app/Http/Resources/PaymentTransactionResource.php b/app/Http/Resources/PaymentTransactionResource.php
index 456ece3d..76ec697d 100644
--- a/app/Http/Resources/PaymentTransactionResource.php
+++ b/app/Http/Resources/PaymentTransactionResource.php
@@ -20,6 +20,22 @@ class PaymentTransactionResource extends JsonResource
{
$booking = in_array((int)$this->type, [TransactionType::BILL, TransactionType::REFUND])? $this->owner->owner : $this->owner;
+ $current_running_balance = $request['running_balance'];
+
+ switch((int) $this->type){
+ case 1:
+ $request['running_balance'] = bcadd($request['running_balance'], $this->amount, 7);
+ break;
+ case 2:
+ $request['running_balance'] = bcsub($request['running_balance'], $this->amount / $this->currency_rate + $this->service_charge, 7);
+ break;
+ case 5:
+ $request['running_balance'] = bcsub($request['running_balance'], $this->amount, 7);
+ break;
+ case 9:
+ $request['running_balance'] = bcsub($request['running_balance'], $this->amount, 7);
+ break;
+ }
$booking_marking = '';
switch ($this->owner_type) {
@@ -43,6 +59,7 @@ class PaymentTransactionResource extends JsonResource
'issuer_id' => $this->issuerCompany->id,
'amount' => (double) $this->amount,
'original_amount' => (double) $this->original_amount,
+ 'running_balance' => (double) $current_running_balance,
'currency' => new CurrencyResource($this->currency),
'original_currency' => new CurrencyResource($this->original_currency),
'service_charge' => (double) $this->service_charge,
diff --git a/resources/assets/vue/components/bookings/elements/CustomerAccountStatementTransactionSectionComponent.vue b/resources/assets/vue/components/bookings/elements/CustomerAccountStatementTransactionSectionComponent.vue
new file mode 100644
index 00000000..8050bce2
--- /dev/null
+++ b/resources/assets/vue/components/bookings/elements/CustomerAccountStatementTransactionSectionComponent.vue
@@ -0,0 +1,64 @@
+
+
+
+ |
+
+ CIEF WORLDWIDE SDN BHD
+ (1134596-M) + No. 72-3, Jalan Jalil 1, + The Earth Bukit Jalil, + 57000 Kuala Lumpur + Tel: 03-8082 1252 + |
+
+ Account Statement Transactions
+ |
+
|
+ {{ $company->name }}
+ |
+ ||
| No | +Date | +Description | +Marking | +Incoming | +Outgoing | +Balance (RM) |
+
|---|---|---|---|---|---|---|
| {{ $key + 1 }} | +{{ $transaction->created_at }} | +{{ $description }} | +{{ $marking }} | ++ {{ $incoming }} + | ++ {{ $outgoing }} + | ++ {{ number_format($current_running_balance, $roundOff) }} + | +
| This is generated by computer. No signature required. | +Page {PAGENO} of {nbpg} | +