MIF_E31231754/app/exports/PenilaianWargaExport.php

156 lines
5.4 KiB
PHP

<?php
namespace App\Exports;
use App\Models\Kriteria;
use App\Models\PenilaianWarga;
use App\Models\Warga;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithCustomValueBinder;
use PhpOffice\PhpSpreadsheet\Cell\StringValueBinder;
use Maatwebsite\Excel\Events\AfterSheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use Illuminate\Support\Facades\DB;
class PenilaianWargaExport extends StringValueBinder implements FromCollection, WithHeadings, WithCustomStartCell, WithEvents, WithCustomValueBinder
{
protected $periode_id;
protected $kriteria;
public function __construct($periode_id)
{
$this->periode_id = $periode_id;
$this->kriteria = Kriteria::orderBy('kode')->get();
}
private function getKeteranganNilai($kode_kriteria, $nilai)
{
if (!$nilai) return 0;
$keterangan = [
'C1' => [
1 => '1 - Tidak bekerja / Buruh harian lepas',
2 => '2 - Petani kecil / Nelayan kecil',
3 => '3 - Pedagang kecil / Wiraswasta kecil',
4 => '4 - Karyawan swasta / PNS Golongan rendah',
5 => '5 - PNS / Profesional / Pengusaha',
],
'C2' => [
1 => '1 - 1 orang',
2 => '2 - 2 orang',
3 => '3 - 3 orang',
4 => '4 - 4 orang',
5 => '5 - > 4 orang',
],
'C3' => [
1 => '1 - Sehat, usia produktif',
2 => '2 - Sehat, lanjut usia',
3 => '3 - Sering sakit ringan / Lansia tunggal',
4 => '4 - Sakit menahun / Disabilitas ringan',
5 => '5 - Sakit kronis parah / Disabilitas berat',
],
'C4' => [
1 => '1 - 20 - 30 tahun',
2 => '2 - 31 - 40 tahun',
3 => '3 - 41 - 50 tahun',
4 => '4 - 51 - 60 tahun',
5 => '5 - > 60 tahun',
],
'C5' => [
1 => '1 - Belum pernah menerima bantuan',
2 => '2 - Pernah menerima (> 2 tahun lalu)',
3 => '3 - Pernah menerima (1 - 2 tahun lalu)',
4 => '4 - Aktif menerima 1 jenis bantuan',
5 => '5 - Aktif menerima banyak jenis bantuan',
]
];
$nilaiInt = (int) $nilai;
return isset($keterangan[$kode_kriteria][$nilaiInt]) ? $keterangan[$kode_kriteria][$nilaiInt] : $nilai;
}
public function collection()
{
$wargaDinilai = DB::table('penilaian_warga')
->where('periode_id', $this->periode_id)
->distinct()
->pluck('warga_id');
$penilaian = PenilaianWarga::where('periode_id', $this->periode_id)
->get()
->groupBy('warga_id');
$warga = Warga::whereIn('id', $wargaDinilai)->orderBy('nama')->get();
$data = new Collection();
foreach ($warga as $w) {
$row = [
'nik' => $w->nik,
'nama' => $w->nama,
];
$penilaianWarga = $penilaian->get($w->id)?->keyBy('kriteria_id') ?? collect();
foreach ($this->kriteria as $k) {
$nilaiAngka = isset($penilaianWarga[$k->id]) ? $penilaianWarga[$k->id]->nilai : 0;
$row[$k->kode] = $this->getKeteranganNilai($k->kode, $nilaiAngka);
}
$data->push($row);
}
return $data;
}
public function headings(): array
{
$headers = ['NIK', 'Nama Lengkap'];
foreach ($this->kriteria as $k) {
$headers[] = $k->kode;
}
return $headers;
}
public function startCell(): string
{
return 'A9';
}
public function registerEvents(): array
{
return [
AfterSheet::class => function(AfterSheet $event) {
$sheet = $event->sheet->getDelegate();
$sheet->setCellValue('A1', 'PEMERINTAH KABUPATEN MOJOKERTO');
$sheet->setCellValue('A2', 'KECAMATAN PUNGGING');
$sheet->setCellValue('A3', 'DESA PUNGGING');
$sheet->setCellValue('A4', 'Jalan Raya Pungging No. 27 Pungging, Mojokerto, Jawa Timur');
$sheet->setCellValue('A5', 'Kode Pos 61384 Telp. (0321) 532733');
$sheet->setCellValue('A7', 'DATA PENILAIAN WARGA BLT-DD');
$lastColumn = $sheet->getHighestColumn();
for ($i = 1; $i <= 7; $i++) {
$sheet->mergeCells("A{$i}:{$lastColumn}{$i}");
}
$sheet->getStyle("A1:A7")->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
$sheet->getStyle("A1:A3")->getFont()->setBold(true)->setSize(14);
$sheet->getStyle("A7")->getFont()->setBold(true)->setSize(12);
$sheet->getStyle("A9:{$lastColumn}9")->getFont()->setBold(true);
$sheet->getStyle("A9:{$lastColumn}9")->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
foreach (range('A', $lastColumn) as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
},
];
}
}