Merged in izzati-feat-aging-penebusan (pull request #163)
tambah laporan aging penebusan
This commit is contained in:
@@ -0,0 +1,222 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Exports\LaporanKeseluruhan;
|
||||||
|
|
||||||
|
use Maatwebsite\Excel\Concerns\FromArray;
|
||||||
|
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithCustomValueBinder;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Cell\Cell;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Cell\DataType;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
|
||||||
|
use Maatwebsite\Excel\Events\AfterSheet;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithEvents;
|
||||||
|
|
||||||
|
class AgingTebusAllExportExcel extends DefaultValueBinder implements
|
||||||
|
FromArray,
|
||||||
|
WithStrictNullComparison,
|
||||||
|
WithHeadings,
|
||||||
|
ShouldAutoSize,
|
||||||
|
WithCustomValueBinder,
|
||||||
|
WithColumnFormatting,
|
||||||
|
WithEvents,
|
||||||
|
WithCustomStartCell
|
||||||
|
{
|
||||||
|
protected $aging;
|
||||||
|
protected $startDate;
|
||||||
|
protected $endDate;
|
||||||
|
|
||||||
|
|
||||||
|
public function __construct($aging,$startDate,$endDate)
|
||||||
|
{
|
||||||
|
$this->aging = $aging;
|
||||||
|
$this->startDate = $startDate;
|
||||||
|
$this->endDate = $endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function array(): array
|
||||||
|
{
|
||||||
|
$rows = [];
|
||||||
|
$totals = [];
|
||||||
|
|
||||||
|
foreach ($this->aging as $branch) {
|
||||||
|
$row = [$branch['cawangan']];
|
||||||
|
$i = 0;
|
||||||
|
|
||||||
|
foreach ($branch['summary_by_tempoh'] as $summary) {
|
||||||
|
$row[] = $summary['count'];
|
||||||
|
$row[] = $summary['sum_bayaran_keuntungan_rebet'];
|
||||||
|
|
||||||
|
// Totals per column
|
||||||
|
$totals[$i]['count'] = ($totals[$i]['count'] ?? 0) + $summary['count'];
|
||||||
|
$totals[$i]['sum_bayaran_keuntungan_rebet'] = ($totals[$i]['sum_bayaran_keuntungan_rebet'] ?? 0) + $summary['sum_bayaran_keuntungan_rebet'];
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Total per row (cawangan)
|
||||||
|
$jumlahBil = collect($branch['summary_by_tempoh'])->sum('count');
|
||||||
|
$jumlahRM = collect($branch['summary_by_tempoh'])->sum('sum_bayaran_keuntungan_rebet');
|
||||||
|
$row[] = $jumlahBil;
|
||||||
|
$row[] = $jumlahRM;
|
||||||
|
|
||||||
|
// Add to column totals
|
||||||
|
$totals['jumlah']['count'] = ($totals['jumlah']['count'] ?? 0) + $jumlahBil;
|
||||||
|
$totals['jumlah']['sum_bayaran_keuntungan_rebet'] = ($totals['jumlah']['sum_bayaran_keuntungan_rebet'] ?? 0) + $jumlahRM;
|
||||||
|
|
||||||
|
$rows[] = $row;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add final total row
|
||||||
|
$totalRow = ['Jumlah'];
|
||||||
|
foreach ($totals as $key => $val) {
|
||||||
|
$totalRow[] = $val['count'];
|
||||||
|
$totalRow[] = $val['sum_bayaran_keuntungan_rebet'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$rows[] = $totalRow;
|
||||||
|
|
||||||
|
return $rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Multi-row headings (2 rows)
|
||||||
|
*/
|
||||||
|
public function headings(): array
|
||||||
|
{
|
||||||
|
$row1 = ['Cawangan'];
|
||||||
|
$row2 = [''];
|
||||||
|
|
||||||
|
if (!empty($this->aging[0]['summary_by_tempoh'])) {
|
||||||
|
foreach ($this->aging[0]['summary_by_tempoh'] as $summary) {
|
||||||
|
$row1[] = $summary['label'];
|
||||||
|
$row1[] = ''; // empty to allow merged cell
|
||||||
|
$row2[] = 'Bil';
|
||||||
|
$row2[] = 'RM';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$row1[] = 'Jumlah';
|
||||||
|
$row1[] = ''; // for merged "Jumlah" cell
|
||||||
|
$row2[] = 'Bil';
|
||||||
|
$row2[] = 'RM';
|
||||||
|
|
||||||
|
return [$row1, $row2];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function columnFormats(): array
|
||||||
|
{
|
||||||
|
$formats = [];
|
||||||
|
$colIndex = 2; // Start at column B (Cawangan is A)
|
||||||
|
|
||||||
|
$tempohCount = count($this->aging[0]['summary_by_tempoh'] ?? []);
|
||||||
|
for ($i = 0; $i < $tempohCount; $i++) {
|
||||||
|
// Bil column
|
||||||
|
$bilCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex++);
|
||||||
|
$formats[$bilCol] = NumberFormat::FORMAT_NUMBER; // ✅ No decimal
|
||||||
|
|
||||||
|
// RM column
|
||||||
|
$rmCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex++);
|
||||||
|
$formats[$rmCol] = NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1; // RM with comma and decimals
|
||||||
|
}
|
||||||
|
|
||||||
|
// Jumlah Bil
|
||||||
|
$jumlahBilCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex++);
|
||||||
|
$formats[$jumlahBilCol] = NumberFormat::FORMAT_NUMBER; // ✅ No decimal
|
||||||
|
|
||||||
|
// Jumlah RM
|
||||||
|
$jumlahRMCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex++);
|
||||||
|
$formats[$jumlahRMCol] = NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1;
|
||||||
|
|
||||||
|
return $formats;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function bindValue(Cell $cell, $value)
|
||||||
|
{
|
||||||
|
if (is_numeric($value)) {
|
||||||
|
$cell->setValueExplicit($value, DataType::TYPE_NUMERIC);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::bindValue($cell, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge heading cells using AfterSheet event
|
||||||
|
*/
|
||||||
|
public function registerEvents(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
AfterSheet::class => function(AfterSheet $event) {
|
||||||
|
|
||||||
|
$sheet = $event->sheet->getDelegate();
|
||||||
|
|
||||||
|
// Tajuk laporan
|
||||||
|
$sheet->setCellValue('A1', 'LAPORAN AGING PENEBUSAN');
|
||||||
|
|
||||||
|
// Tarikh laporan
|
||||||
|
$sheet->setCellValue(
|
||||||
|
'A2',
|
||||||
|
'Tarikh : ' .
|
||||||
|
\Carbon\Carbon::parse($this->startDate)->format('d/m/Y') .
|
||||||
|
' hingga ' .
|
||||||
|
\Carbon\Carbon::parse($this->endDate)->format('d/m/Y')
|
||||||
|
);
|
||||||
|
|
||||||
|
// Merge tajuk
|
||||||
|
$lastColumn = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex(
|
||||||
|
(count($this->aging[0]['summary_by_tempoh'] ?? []) * 2) + 3
|
||||||
|
);
|
||||||
|
|
||||||
|
$sheet->mergeCells("A1:{$lastColumn}1");
|
||||||
|
|
||||||
|
// Style tajuk
|
||||||
|
$sheet->getStyle("A1:{$lastColumn}1")->applyFromArray([
|
||||||
|
'font' => [
|
||||||
|
'bold' => true,
|
||||||
|
'size' => 14,
|
||||||
|
],
|
||||||
|
'alignment' => [
|
||||||
|
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Merge header tempoh
|
||||||
|
$colIndex = 2; // Start from column B
|
||||||
|
$tempohCount = count($this->aging[0]['summary_by_tempoh'] ?? []);
|
||||||
|
|
||||||
|
$headingRow = 3;
|
||||||
|
|
||||||
|
for ($i = 0; $i < $tempohCount; $i++) {
|
||||||
|
|
||||||
|
$startCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex);
|
||||||
|
|
||||||
|
$endCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex + 1);
|
||||||
|
|
||||||
|
$sheet->mergeCells("{$startCol}{$headingRow}:{$endCol}{$headingRow}");
|
||||||
|
|
||||||
|
$colIndex += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Merge Jumlah
|
||||||
|
$startCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex);
|
||||||
|
|
||||||
|
$endCol = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($colIndex + 1);
|
||||||
|
|
||||||
|
$sheet->mergeCells("{$startCol}{$headingRow}:{$endCol}{$headingRow}");
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mulakan sel untuk data bermula dari A4 (Baris 3 adalah header)
|
||||||
|
public function startCell(): string
|
||||||
|
{
|
||||||
|
return 'A3'; // Data bermula dari baris 4
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@ use Illuminate\Support\Facades\App;
|
|||||||
use Illuminate\Support\Facades\Http;
|
use Illuminate\Support\Facades\Http;
|
||||||
use Maatwebsite\Excel\Facades\Excel;
|
use Maatwebsite\Excel\Facades\Excel;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
use App\Exports\LaporanKeseluruhan\AgingAllExportExcel;
|
use App\Exports\LaporanKeseluruhan\AgingTebusAllExportExcel;
|
||||||
|
|
||||||
class AgingController extends Controller
|
class AgingController extends Controller
|
||||||
{
|
{
|
||||||
@@ -81,4 +81,77 @@ class AgingController extends Controller
|
|||||||
}
|
}
|
||||||
return view('reports.aging.index', compact('aging', 'endDate'));
|
return view('reports.aging.index', compact('aging', 'endDate'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function agingtebus(Request $request)
|
||||||
|
{
|
||||||
|
$current = new Carbon();
|
||||||
|
$request->hostname = config('api.url');
|
||||||
|
// dd($request->hostname );
|
||||||
|
$kod_cawangan = $request->kod_cawangan;
|
||||||
|
$action = $request->input('action', 'search');
|
||||||
|
// dd($action);
|
||||||
|
|
||||||
|
$getReportDate = function ($date_string) use ($current) {
|
||||||
|
if ($date_string == null) {
|
||||||
|
return $current->toDateString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $date_string;
|
||||||
|
};
|
||||||
|
|
||||||
|
$request->hostname = config('api.url');
|
||||||
|
|
||||||
|
$startDate = $getReportDate($request->startDate);
|
||||||
|
|
||||||
|
$endDate = $getReportDate($request->endDate);
|
||||||
|
|
||||||
|
$aging = Http::get($request->hostname . '/api/reports/agingtebus', [
|
||||||
|
'startDate' => $startDate,
|
||||||
|
'endDate' => $endDate,
|
||||||
|
])->json();
|
||||||
|
|
||||||
|
$aging = $aging ?? [];
|
||||||
|
|
||||||
|
if ($action === 'excel') {
|
||||||
|
$file_title = sprintf("LaporanAging(%s).xlsx", $kod_cawangan, $startDate, $endDate);
|
||||||
|
return Excel::download(new AgingTebusAllExportExcel($aging,$startDate,$endDate), $file_title);
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('reports.agingtebus.index', compact('aging', 'startDate', 'endDate'));
|
||||||
|
}
|
||||||
|
public function showagingtebus(Request $request)
|
||||||
|
{
|
||||||
|
$current = Carbon::now();
|
||||||
|
$action = $request->input('action', 'search');
|
||||||
|
|
||||||
|
$getReportDate = function ($date_string) use ($current) {
|
||||||
|
return $date_string ? $date_string : $current->toDateString();
|
||||||
|
};
|
||||||
|
|
||||||
|
$hostname = config('api.url');
|
||||||
|
|
||||||
|
$startDate = $getReportDate($request->startDate);
|
||||||
|
$endDate = $getReportDate($request->endDate);
|
||||||
|
|
||||||
|
$response = Http::get("$hostname/api/reports/agingtebus", [
|
||||||
|
'startDate' => $startDate,
|
||||||
|
'endDate' => $endDate,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$aging = $response->json() ?? []; // Ensure it's an array
|
||||||
|
|
||||||
|
// Debugging: Check the response before using it
|
||||||
|
if (empty($aging)) {
|
||||||
|
return back()->with('error', 'Failed to fetch data from API.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($action === 'excel') {
|
||||||
|
// Ensure $kod_cawangan is defined (Modify as per your data structure)
|
||||||
|
$kod_cawangan = $request->input('kod_cawangan', 'DEFAULT');
|
||||||
|
|
||||||
|
$file_title = sprintf("LaporanAgingTebus(%s).xlsx", $kod_cawangan, $startDate, $endDate);
|
||||||
|
return Excel::download(new AgingTebusAllExportExcel($aging, $startDate, $endDate), $file_title);
|
||||||
|
}
|
||||||
|
return view('reports.agingtebus.index', compact('aging', 'startDate', 'endDate'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -128,6 +128,12 @@
|
|||||||
<h2 class="mx-auto text-center font-bold text-2xl uppercase">Data Pelanggan By Cawangan</h2>
|
<h2 class="mx-auto text-center font-bold text-2xl uppercase">Data Pelanggan By Cawangan</h2>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
class="px-6 py-4 mb-2 ml-2 bg-white border border-solid rounded-lg shadow cursor-pointer hover:bg-yellow-300 hover:transition-all">
|
||||||
|
<a href="{{ route('reports.agingtebus.index', ['startDate' => now()->toDateString(), 'endDate' => now()->toDateString()]) }}" class="">
|
||||||
|
<h2 class="mx-auto text-2xl font-bold text-center uppercase">Laporan Aging Penebusan</h2>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,276 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="bg-gray-900 opacity-50 hidden fixed inset-0 z-10" id="sidebarBackdrop"></div>
|
||||||
|
<div id="main-content" class="h-full w-full bg-gray-50 relative overflow-y-auto">
|
||||||
|
<main>
|
||||||
|
|
||||||
|
<div class="pt-6 px-4">
|
||||||
|
|
||||||
|
<breadcrumb
|
||||||
|
:items="[{ 'title': 'Laporan Keseluruhan', 'icon': 'fas fa-users', 'url': '{{ route('reports') }}' }, { 'title': 'Laporan Aging', 'icon': 'fas fa-users' }]">
|
||||||
|
</breadcrumb>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="flex w-full">
|
||||||
|
<div class="w-full xl:w-4/5 2xl:w-5/6 p-12 mx-auto">
|
||||||
|
<div class="bg-yellow-600 text-gray-200 text-lg px-6 py-4 rounded-t-lg">
|
||||||
|
<a href="/reports" class="router-link-active">
|
||||||
|
<i class="fas fa-backspace text-white"></i>
|
||||||
|
</a>
|
||||||
|
<span class="text-center mx-auto text-white font-bold">Laporan Aging Penebusan</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form id="formAging" method="GET" action="{{ route('reports.agingtebus.show') }}">
|
||||||
|
|
||||||
|
<div class="rounded bg-white shadow p-6">
|
||||||
|
<div class="pb-6">
|
||||||
|
|
||||||
|
<label class="font-semibold text-gray-700 block pb-3">
|
||||||
|
Pilih Tarikh
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap lg:flex-nowrap items-end gap-4">
|
||||||
|
|
||||||
|
{{-- Dari --}}
|
||||||
|
<div>
|
||||||
|
<label class="text-gray-600 block pb-1">
|
||||||
|
Dari
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<input
|
||||||
|
id="startDate"
|
||||||
|
name="startDate"
|
||||||
|
type="date"
|
||||||
|
value="{{ request()->startDate ?? $startDate ?? '' }}"
|
||||||
|
class="border border-yellow-600 rounded-lg px-4 py-3 bg-white text-gray-800 focus:ring-2 focus:ring-yellow-500 focus:outline-none transition-all duration-300 hover:border-yellow-500"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{-- Hingga --}}
|
||||||
|
<div>
|
||||||
|
<label class="text-gray-600 block pb-1">
|
||||||
|
Hingga
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<input
|
||||||
|
id="endDate"
|
||||||
|
name="endDate"
|
||||||
|
type="date"
|
||||||
|
value="{{ request()->endDate ?? $endDate ?? '' }}"
|
||||||
|
class="border border-yellow-600 rounded-lg px-4 py-3 bg-white text-gray-800 focus:ring-2 focus:ring-yellow-500 focus:outline-none transition-all duration-300 hover:border-yellow-500"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input type="hidden" name="action" id="formAction" value="search">
|
||||||
|
|
||||||
|
{{-- Button Group --}}
|
||||||
|
<div class="flex gap-3 w-full md:w-auto">
|
||||||
|
|
||||||
|
{{-- Button Group --}}
|
||||||
|
<div class="flex gap-3">
|
||||||
|
|
||||||
|
{{-- Search --}}
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
onclick="setAction('search')"
|
||||||
|
class="border border-yellow-600 text-yellow-600 font-montserrat py-3 px-8 font-medium rounded-xl hover:bg-yellow-600 hover:text-white transition-all duration-300 whitespace-nowrap">
|
||||||
|
|
||||||
|
<i class="fas fa-magnifying-glass mr-2"></i>
|
||||||
|
Search
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{{-- Excel --}}
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
onclick="setAction('excel')"
|
||||||
|
class="border border-yellow-600 text-yellow-600 py-3 px-8 font-medium rounded-xl hover:bg-yellow-600 hover:text-white transition-all duration-300 whitespace-nowrap">
|
||||||
|
|
||||||
|
<i class="fas fa-file-excel mr-2"></i>
|
||||||
|
Excel
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div kodcaw="operasi">
|
||||||
|
<div>
|
||||||
|
<!---->
|
||||||
|
<!---->
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<!---->
|
||||||
|
<!---->
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between mb-2">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if(empty($aging))
|
||||||
|
<div class="alert alert-warning">
|
||||||
|
Tiada data dijumpai untuk tarikh {{ $endDate }}.
|
||||||
|
</div>
|
||||||
|
@else
|
||||||
|
<!-- <h1>Summary Report</h1> -->
|
||||||
|
|
||||||
|
<div class="overflow-x-auto">
|
||||||
|
<!-- Create a table with horizontal headers -->
|
||||||
|
<table class="table-auto w-full border-collapse border border-gray-200">
|
||||||
|
<thead class="bg-yellow-500 text-white">
|
||||||
|
<tr>
|
||||||
|
<th class="px-4 py-2 border">Bil.</th> <!-- Add Bilangan here -->
|
||||||
|
<th class="px-4 py-2 border">Cawangan</th>
|
||||||
|
@foreach ($aging[0]['summary_by_tempoh'] as $summary)
|
||||||
|
<th class="px-4 py-2 border" colspan="2">{{ $summary['label'] }}</th> <!-- Merge Tempoh with Bilangan and Jumlah -->
|
||||||
|
@endforeach
|
||||||
|
<th class="px-4 py-2 border" colspan="2">Keseluruhan</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="px-4 py-2 border"> </th> <!-- Empty for Bilangan Row -->
|
||||||
|
<th class="px-4 py-2 border"> </th> <!-- Empty for Cawangan Row -->
|
||||||
|
@foreach ($aging[0]['summary_by_tempoh'] as $summary)
|
||||||
|
<th class="px-4 py-2 border">Bil</th> <!-- Bilangan Column Title -->
|
||||||
|
<th class="px-4 py-2 border">RM</th> <!-- Jumlah Column Title -->
|
||||||
|
@endforeach
|
||||||
|
<th class="px-4 py-2 border">Bil</th>
|
||||||
|
<th class="px-4 py-2 border">RM</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
@php
|
||||||
|
$counter = 1;
|
||||||
|
|
||||||
|
$totalGrandCountByTempoh = array_fill(
|
||||||
|
0,
|
||||||
|
count($aging[0]['summary_by_tempoh']),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
$totalGrandKeuntunganByTempoh = array_fill(
|
||||||
|
0,
|
||||||
|
count($aging[0]['summary_by_tempoh']),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
@foreach ($aging as $branch)
|
||||||
|
|
||||||
|
@php
|
||||||
|
$totalCount = 0;
|
||||||
|
$totalKeuntungan = 0;
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td class="px-4 py-2 border">
|
||||||
|
{{ $counter++ }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td class="px-4 py-2 border font-bold">
|
||||||
|
{{ $branch['cawangan'] }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
@foreach ($branch['summary_by_tempoh'] as $index => $summary)
|
||||||
|
|
||||||
|
{{-- Bil --}}
|
||||||
|
<td class="px-4 py-2 border">
|
||||||
|
{{ $summary['count'] }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
{{-- RM --}}
|
||||||
|
<td class="px-4 py-2 border">
|
||||||
|
{{ number_format($summary['sum_bayaran_keuntungan_rebet'], 2) }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
@php
|
||||||
|
// Total per cawangan
|
||||||
|
$totalCount += $summary['count'];
|
||||||
|
|
||||||
|
$totalKeuntungan +=
|
||||||
|
$summary['sum_bayaran_keuntungan_rebet'];
|
||||||
|
|
||||||
|
// Grand total
|
||||||
|
$totalGrandCountByTempoh[$index] +=
|
||||||
|
$summary['count'];
|
||||||
|
|
||||||
|
$totalGrandKeuntunganByTempoh[$index] +=
|
||||||
|
$summary['sum_bayaran_keuntungan_rebet'];
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
{{-- Keseluruhan --}}
|
||||||
|
<td class="px-4 py-2 border">
|
||||||
|
{{ $totalCount }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td class="px-4 py-2 border">
|
||||||
|
{{ number_format($totalKeuntungan, 2) }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
|
||||||
|
<tfoot>
|
||||||
|
<tr>
|
||||||
|
|
||||||
|
<td class="px-4 py-2 border font-bold" colspan="2">
|
||||||
|
Total
|
||||||
|
</td>
|
||||||
|
|
||||||
|
@foreach ($totalGrandCountByTempoh as $index => $grandCount)
|
||||||
|
|
||||||
|
{{-- Grand total bil --}}
|
||||||
|
<td class="px-4 py-2 border">
|
||||||
|
{{ $grandCount }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
{{-- Grand total RM --}}
|
||||||
|
<td class="px-4 py-2 border">
|
||||||
|
{{ number_format($totalGrandKeuntunganByTempoh[$index], 2) }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
{{-- Total keseluruhan --}}
|
||||||
|
<td class="px-4 py-2 border">
|
||||||
|
{{ array_sum($totalGrandCountByTempoh) }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td class="px-4 py-2 border">
|
||||||
|
{{ number_format(array_sum($totalGrandKeuntunganByTempoh), 2) }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
@include('layouts.footer')
|
||||||
|
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
<!-- JavaScript to Change Action -->
|
||||||
|
<script>
|
||||||
|
function setAction(action) {
|
||||||
|
document.getElementById('formAction').value = action;
|
||||||
|
document.getElementById('formAging').submit();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -60,4 +60,6 @@ Route::middleware(['roleChecker:admin,akaun,operasi,kpo,callcenter, null'])->gro
|
|||||||
Route::get('data-pelanggan-bycaw-index', [AnalisaController::class, 'dataPelangganBycaw'])->name('reports.dataPelangganBycaw.index');
|
Route::get('data-pelanggan-bycaw-index', [AnalisaController::class, 'dataPelangganBycaw'])->name('reports.dataPelangganBycaw.index');
|
||||||
Route::get('data-pelanggan-bycaw-show', [AnalisaController::class, 'dataPelangganBycawShow'])->name('reports.dataPelangganBycaw.show');
|
Route::get('data-pelanggan-bycaw-show', [AnalisaController::class, 'dataPelangganBycawShow'])->name('reports.dataPelangganBycaw.show');
|
||||||
|
|
||||||
|
Route::get('agingtebus/view', [AgingController::class, 'agingtebus'])->name('reports.agingtebus.index');
|
||||||
|
Route::get('laporan-agingtebus/view', [AgingController::class, 'showagingtebus'])->name('reports.agingtebus.show');
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user