106 lines
2.5 KiB
PHP
106 lines
2.5 KiB
PHP
<?php
|
|
|
|
namespace App\Exports;
|
|
|
|
use App\Models\AuditTrail;
|
|
use Maatwebsite\Excel\Concerns\FromQuery;
|
|
use Maatwebsite\Excel\Concerns\WithMapping;
|
|
use Maatwebsite\Excel\Concerns\WithHeadings;
|
|
use Maatwebsite\Excel\Concerns\WithColumnWidths;
|
|
use Maatwebsite\Excel\Concerns\WithStyles;
|
|
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
|
|
|
class AuditTrailExport implements FromQuery, WithMapping, WithHeadings, WithColumnWidths, WithStyles
|
|
{
|
|
protected $filters;
|
|
|
|
public function __construct($filters)
|
|
{
|
|
$this->filters = $filters;
|
|
}
|
|
|
|
/**
|
|
* Menggunakan FromQuery untuk efisiensi memori pada data besar
|
|
*/
|
|
public function query()
|
|
{
|
|
$f = $this->filters;
|
|
$query = AuditTrail::with(['user.cabang.cabang.region']);
|
|
|
|
// Filter Region & Cabang
|
|
if (!empty($f['region']) || !empty($f['cabang'])) {
|
|
$query->whereHas('user.cabang.cabang', function($q) use ($f) {
|
|
if (!empty($f['cabang'])) {
|
|
$q->where('id', $f['cabang']);
|
|
}
|
|
if (!empty($f['region'])) {
|
|
$q->whereHas('region', function($rq) use ($f) {
|
|
// PERBAIKAN: Gunakan 'code' sesuai image_63aac6.png
|
|
$rq->where('code', $f['region']);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
// Filter User & Tanggal...
|
|
if (!empty($f['admin_id'])) {
|
|
$query->where('user_id', $f['admin_id']);
|
|
}
|
|
|
|
return $query->latest();
|
|
}
|
|
/**
|
|
* Header Tabel Excel
|
|
*/
|
|
public function headings(): array
|
|
{
|
|
return [
|
|
'Waktu',
|
|
'User',
|
|
'IP Address',
|
|
'Aksi',
|
|
'Aktivitas',
|
|
'Browser'
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Transformasi Data per baris
|
|
*/
|
|
public function map($audit): array
|
|
{
|
|
return [
|
|
$audit->created_at->format('d-m-Y H:i:s'),
|
|
$audit->user->name ?? 'System',
|
|
$audit->ip_address,
|
|
$audit->action,
|
|
$audit->activity,
|
|
$audit->browser,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Atur Lebar Kolom agar rapi secara otomatis
|
|
*/
|
|
public function columnWidths(): array
|
|
{
|
|
return [
|
|
'A' => 20,
|
|
'B' => 20,
|
|
'C' => 15,
|
|
'D' => 15,
|
|
'E' => 50,
|
|
'F' => 20,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Styling Header agar lebih profesional
|
|
*/
|
|
public function styles(Worksheet $sheet)
|
|
{
|
|
return [
|
|
1 => ['font' => ['bold' => true]],
|
|
];
|
|
}
|
|
} |