156 lines
5.4 KiB
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);
|
|
}
|
|
},
|
|
];
|
|
}
|
|
}
|