tambah menu pelanggan aktif keseluruhan
This commit is contained in:
@@ -0,0 +1,93 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Exports\LaporanKeseluruhan;
|
||||||
|
|
||||||
|
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithEvents;
|
||||||
|
use Maatwebsite\Excel\Events\AfterSheet;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
|
||||||
|
|
||||||
|
class PelangganaktifAllExportExcel implements FromCollection, WithHeadings, WithMapping, WithEvents, WithCustomStartCell
|
||||||
|
{
|
||||||
|
protected $pelangganaktifData;
|
||||||
|
protected $total = 0;
|
||||||
|
protected $counter = 1;
|
||||||
|
protected $startDate;
|
||||||
|
protected $endDate;
|
||||||
|
|
||||||
|
public function __construct($pelangganaktifData, $startDate = null, $endDate = null)
|
||||||
|
{
|
||||||
|
$this->pelangganaktifData = $pelangganaktifData;
|
||||||
|
$this->startDate = $startDate;
|
||||||
|
$this->endDate = $endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function collection()
|
||||||
|
{
|
||||||
|
return collect($this->pelangganaktifData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function headings(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'No.',
|
||||||
|
'Kod Caw',
|
||||||
|
'Nama Cawangan',
|
||||||
|
'Jumlah',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function map($row): array
|
||||||
|
{
|
||||||
|
$jumlah = is_numeric($row['total_pelanggan_aktif'] ?? null) ? (float) $row['total_pelanggan_aktif'] : 0;
|
||||||
|
$this->total += $jumlah;
|
||||||
|
|
||||||
|
return [
|
||||||
|
$this->counter++,
|
||||||
|
$row['kodcaw'] ?? '',
|
||||||
|
$row['details_caw'] ?? '',
|
||||||
|
number_format($jumlah, 2),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
public function startCell(): string
|
||||||
|
{
|
||||||
|
return 'A3'; // Mulakan heading di baris 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public function registerEvents(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
AfterSheet::class => function (AfterSheet $event) {
|
||||||
|
|
||||||
|
// Tajuk laporan di A1:D1
|
||||||
|
$event->sheet->mergeCells('A1:D1');
|
||||||
|
$event->sheet->setCellValue('A1', 'LAPORAN PELANGGAN AKTIF');
|
||||||
|
$event->sheet->getStyle('A1')->getFont()->setSize(14)->setBold(true);
|
||||||
|
$event->sheet->getStyle('A1')->getAlignment()->setHorizontal('center');
|
||||||
|
|
||||||
|
// Tarikh di A2:D2
|
||||||
|
$tarikhMula = $this->startDate ? date('d/m/Y', strtotime($this->startDate)) : '-';
|
||||||
|
$tarikhTamat = $this->endDate ? date('d/m/Y', strtotime($this->endDate)) : '-';
|
||||||
|
$event->sheet->mergeCells('A2:D2');
|
||||||
|
$event->sheet->setCellValue('A2', "Tempoh: {$tarikhMula} hingga {$tarikhTamat}");
|
||||||
|
$event->sheet->getStyle('A2')->getFont()->setItalic(true);
|
||||||
|
$event->sheet->getStyle('A2')->getAlignment()->setHorizontal('center');
|
||||||
|
|
||||||
|
// Kira baris terakhir untuk jumlah keseluruhan
|
||||||
|
$lastRow = count($this->pelangganaktifData) + 3 + 1; // +1 untuk heading
|
||||||
|
|
||||||
|
$event->sheet->mergeCells("A{$lastRow}:C{$lastRow}");
|
||||||
|
$event->sheet->setCellValue("A{$lastRow}", 'Jumlah Keseluruhan');
|
||||||
|
$event->sheet->setCellValue("D{$lastRow}", number_format($this->total, 2));
|
||||||
|
$event->sheet->getStyle("A{$lastRow}:D{$lastRow}")->getFont()->setBold(true);
|
||||||
|
$event->sheet->getStyle("A{$lastRow}:D{$lastRow}")->getAlignment()->setHorizontal('right');
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@ 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\PelangganbaruAllExportExcel;
|
use App\Exports\LaporanKeseluruhan\PelangganbaruAllExportExcel;
|
||||||
|
use App\Exports\LaporanKeseluruhan\PelangganaktifAllExportExcel;
|
||||||
|
|
||||||
class AnalisaController extends Controller
|
class AnalisaController extends Controller
|
||||||
{
|
{
|
||||||
@@ -51,5 +52,43 @@ class AnalisaController extends Controller
|
|||||||
return view('reports.pelangganbaru.index', compact('pelangganbaru', 'startDate', 'endDate'));
|
return view('reports.pelangganbaru.index', compact('pelangganbaru', 'startDate', 'endDate'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function pelangganaktif(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');
|
||||||
|
|
||||||
|
$pelangganaktif = Http::get($request->hostname . '/api/reports/pelangganaktif', [
|
||||||
|
'startDate' => $getReportDate($request->startDate),
|
||||||
|
'endDate' => $getReportDate($request->endDate),
|
||||||
|
])->json();
|
||||||
|
// dd($pelangganbaru);
|
||||||
|
|
||||||
|
$startDate = $getReportDate($request->startDate);
|
||||||
|
$endDate = $getReportDate($request->endDate);
|
||||||
|
|
||||||
|
if ($action === 'excel') {
|
||||||
|
$file_title = sprintf("LaporanPelangganAktif(%s).xlsx", $kod_cawangan, $request->startDate, $request->endDate);
|
||||||
|
return Excel::download(new PelangganaktifAllExportExcel($pelangganaktif,$startDate,$endDate), $file_title);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pelangganaktif = $pelangganaktif ?? [];
|
||||||
|
|
||||||
|
return view('reports.pelangganaktif.index', compact('pelangganaktif', 'startDate', 'endDate'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,6 +74,12 @@
|
|||||||
<h2 class="mx-auto text-center font-bold text-2xl uppercase">Pelanggan Baru</h2>
|
<h2 class="mx-auto text-center font-bold text-2xl uppercase">Pelanggan Baru</h2>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
class="bg-white ml-2 shadow border border-solid px-6 py-4 rounded-lg hover:bg-yellow-300 hover:transition-all mb-2 cursor-pointer">
|
||||||
|
<a href="{{ route('reports.pelangganaktif.index', ['startDate' => now()->toDateString(), 'endDate' => now()->toDateString()]) }}" class="">
|
||||||
|
<h2 class="mx-auto text-center font-bold text-2xl uppercase">Pelanggan Aktif</h2>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,177 @@
|
|||||||
|
@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': 'Pelanggan Aktif', 'icon': 'fas fa-users' }]">
|
||||||
|
</breadcrumb>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="flex w-full">
|
||||||
|
<div class="xl:w-3/5 2xl:w-2/3 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 Pelanggan Aktif</span></div>
|
||||||
|
<form method="get" id="formpelangganbaru" action="{{ route('reports.pelangganaktif.index') }}">
|
||||||
|
<input type="hidden" name="action" id="formAction" value="search">
|
||||||
|
<div class="rounded bg-white shadow p-6">
|
||||||
|
<div class="pb-6"><label for="username"
|
||||||
|
class="font-semibold text-gray-700 block pb-1">Tarikh</label>
|
||||||
|
<div class="flex justify-center">
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<span class="text-gray-600 border border-2 rounded-l px-4 py-2 bg-gray-100">Mula</span>
|
||||||
|
<input id="tarikhmula" name="startDate" type="date"
|
||||||
|
value="{{ request()->startDate ?? $startDate }}"
|
||||||
|
class="border border-2 border-l-0 rounded-r px-4 py-2">
|
||||||
|
|
||||||
|
<span class="text-gray-600 border border-2 rounded-l px-4 py-2 bg-gray-100">Hingga</span>
|
||||||
|
<input id="tarikhhingga" name="endDate" type="date"
|
||||||
|
value="{{ request()->endDate ?? $endDate }}"
|
||||||
|
class="border border-2 border-l-0 rounded-r px-4 py-2">
|
||||||
|
|
||||||
|
<button type="submit" onclick="setAction('search')"
|
||||||
|
class="border border-yellow-600 text-yellow-600 font-montserrat py-2 px-6 font-medium rounded-xl hover:bg-yellow-600 hover:text-white transition-all duration-300">
|
||||||
|
<i class="fas fa-magnifying-glass mr-2"></i> Search
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="submit" onclick="setAction('excel')"
|
||||||
|
class="border border-yellow-600 text-yellow-600 py-2 px-6 font-medium rounded-xl hover:bg-yellow-600 hover:text-white transition-all duration-300">
|
||||||
|
<i class="fas fa-file-excel mr-2"></i> Excel
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div kodcaw="operasi">
|
||||||
|
<div>
|
||||||
|
<!---->
|
||||||
|
<!---->
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<!---->
|
||||||
|
<!---->
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-between mb-2">
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<table class="min-w-full leading-normal">
|
||||||
|
<thead class="text-center">
|
||||||
|
<tr>
|
||||||
|
<th
|
||||||
|
class="px-5 py-3 border-b-2 border-gray-200 bg-gray-100 text-left text-xs font-semibold text-gray-600 uppercase tracking-wider">
|
||||||
|
No
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
class="px-5 py-3 border-b-2 border-gray-200 bg-gray-100 text-left text-xs font-semibold text-gray-600 uppercase tracking-wider">
|
||||||
|
Kod Cawangan
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
class="px-5 py-3 border-b-2 border-gray-200 bg-gray-100 text-left text-xs font-semibold text-gray-600 uppercase tracking-wider">
|
||||||
|
Cawangan
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
class="px-5 py-3 border-b-2 border-gray-200 bg-gray-100 text-left text-xs font-semibold text-gray-600 uppercase tracking-wider">
|
||||||
|
Jumlah Pelanggan
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
@php
|
||||||
|
$totalbilgadai = 0;
|
||||||
|
@endphp
|
||||||
|
<tbody>
|
||||||
|
@forelse ($pelangganaktif as $gadai)
|
||||||
|
@php
|
||||||
|
$totalbilgadai += $gadai['total_pelanggan_aktif'];
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td class="px-5 py-5 border-b border-gray-200 bg-white text-sm">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<div class="ml-3">
|
||||||
|
<p class="text-gray-900 whitespace-no-wrap">{{ $loop->iteration }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="px-5 py-5 border-b border-gray-200 bg-white text-sm">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<div class="ml-3">
|
||||||
|
<p class="text-gray-900 whitespace-no-wrap">{{ $gadai['kodcaw'] }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="px-5 py-5 border-b border-gray-200 bg-white text-sm">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<div class="ml-3">
|
||||||
|
<p class="text-gray-900 whitespace-no-wrap">{{ $gadai['details_caw'] }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="px-5 py-5 border-b border-gray-200 bg-white text-sm">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<div class="ml-3">
|
||||||
|
<p class="text-gray-900 whitespace-no-wrap">{{ $gadai['total_pelanggan_aktif'] }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@empty
|
||||||
|
<tr>
|
||||||
|
<td colspan="6" class="px-5 py-5 border-b border-gray-200 bg-white text-sm">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<div class="ml-3">
|
||||||
|
<p class="text-gray-900 whitespace-no-wrap">Data not available</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
|
<tr>
|
||||||
|
<td colspan="3" class="px-5 py-5 border-b border-gray-200 bg-white text-sm">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<div class="ml-3">
|
||||||
|
<p class="text-gray-900 whitespace-no-wrap">Jumlah Keseluruhan</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="px-5 py-5 border-b border-gray-200 bg-white text-sm">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<div class="ml-3">
|
||||||
|
<p class="text-gray-900 whitespace-no-wrap">{{ $totalbilgadai}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</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>
|
||||||
@@ -33,4 +33,5 @@ Route::middleware(['roleChecker:admin,akaun,operasi,kpo, null'])->group(function
|
|||||||
Route::get('outstanding/view', [OutstandingController::class, 'index'])->name('reports.outstanding.index');
|
Route::get('outstanding/view', [OutstandingController::class, 'index'])->name('reports.outstanding.index');
|
||||||
Route::get('petibesi/view', [PetibesiController::class, 'index'])->name('reports.petibesi.index');
|
Route::get('petibesi/view', [PetibesiController::class, 'index'])->name('reports.petibesi.index');
|
||||||
Route::get('pelangganbaru/view', [AnalisaController::class, 'index'])->name('reports.pelangganbaru.index');
|
Route::get('pelangganbaru/view', [AnalisaController::class, 'index'])->name('reports.pelangganbaru.index');
|
||||||
|
Route::get('pelangganaktif/view', [AnalisaController::class, 'pelangganaktif'])->name('reports.pelangganaktif.index');
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user