Anons79 Mini Shell

Directory : /home/aplikasiposinfo/www/warga-saya.aplikasipos.info/app/Exports/
Upload File :
Current File : /home/aplikasiposinfo/www/warga-saya.aplikasipos.info/app/Exports/LaporanKegiatanExport.php

<?php

namespace App\Exports;

use App\Models\Civilian;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithHeadings;

class LaporanKegiatanExport implements FromArray, WithHeadings
{
    protected $filters;

    public function __construct($filters)
    {
        $this->filters = $filters;
    }

    public function headings(): array
    {
        return ['No.', 'Nama Warga', 'Kategori Warga', 'Nama Kegiatan', 'Input Kegiatan', 'Target', 'Keterangan'];
    }

    public function array(): array
    {
        $query = Civilian::with(['categories.activities', 'activities']);

        if (!empty($this->filters['selectedCategory'])) {
            $query->whereHas('categories', fn($q) =>
                $q->where('categories.id', $this->filters['selectedCategory'])
            );
        }

        if (!empty($this->filters['searchName'])) {
            $query->where('full_name', 'like', '%' . $this->filters['searchName'] . '%');
        }

        $data = [];
        $no   = 1;

        foreach ($query->get() as $civ) {
            $wargaDisplayed = false;

            // FILTER kategori warga terlebih dahulu
            $categories = $civ->categories;

            if (!empty($this->filters['selectedCategory'])) {
                $categories = $categories->filter(function ($cat) {
                    return $cat->id == $this->filters['selectedCategory'];
                });
            }

            // Kalau kosong setelah filter, kita lewati warga ini
            if ($categories->isEmpty()) {
                continue;
            }

            foreach ($categories as $cat) {
                $kategoriDisplayed = false;

                $allActs = $cat->activities;
                $pivotMapping = $civ->activities->pluck('pivot.progress', 'id');

                $acts = $allActs->map(function($a) use ($pivotMapping) {
                    $prog = $pivotMapping->get($a->id, 0);
                    $keterangan = $this->getKeterangan($prog, $a->target);

                    return [
                        'name'       => $a->name,
                        'progress'   => $prog ?: '-',
                        'target'     => $a->target,
                        'keterangan' => $keterangan['label'],
                    ];
                });

                if ($acts->isEmpty()) {
                    $acts = collect([[ 
                        'name' => '-', 'progress' => '-', 'target' => '-', 'keterangan' => 'KB'
                    ]]);
                }

                foreach ($acts as $act) {
                    $data[] = [
                        $wargaDisplayed ? '' : $no++,
                        $wargaDisplayed ? '' : $civ->full_name,
                        $kategoriDisplayed ? '' : $cat->name,
                        $act['name'],
                        $act['progress'],
                        $act['target'],
                        $act['keterangan'],
                    ];

                    $wargaDisplayed = true;
                    $kategoriDisplayed = true;
                }
            }
        }

        return $data;
    }

    private function getKeterangan($progress, $target)
    {
        if ($target <= 0) {
            return ['label' => 'N/A'];
        }

        $percentage = ($progress / $target) * 100;

        return match (true) {
            $percentage >= 100 => ['label' => 'B'],
            default => ['label' => 'KB'],
        };
    }
}

Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]