sigd/app/Http/Controllers/Activity/FormKehutananController.php

217 lines
6.8 KiB
PHP

<?php
namespace App\Http\Controllers\Activity;
use App\Enums\LingkupAksesData;
use App\Exports\FormKehutananExport;
use App\Http\Controllers\Controller;
use App\Imports\FormKehutananImport;
use App\Models\ActivityApprovalKonsolidasi;
use App\Models\ActivityForm;
use App\Models\ActivityLock;
use App\Models\Agency;
use App\Models\SettingForm;
use App\Services\Activity\FormKehutananService;
use Illuminate\Http\Request;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;
use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Facades\Excel;
class FormKehutananController implements HasMiddleware
{
protected $formService;
private $sector = 'folu';
private $code = 'lahan_mineral';
private $lands = array(
'HP',
'HS',
'HMP',
'HRP',
'HT',
'B',
'PK',
'PM',
'T',
'AW',
'S',
'A',
'HMS',
'HRS',
'BR',
'PT',
'PC',
'SW',
'TM',
'BDR',
'TR',
'TB',
'RW'
);
public function __construct(FormKehutananService $formService)
{
$this->formService = $formService;
}
public static function middleware(): array
{
$sector = 'folu';
$code = 'lahan_mineral';
return [
//new Middleware('permission:/' . $sector . '/' . $code),
];
}
public function data($sector, $code, $inventoryYear, $instansi = null)
{
// Fetch the form from the database based on sector and code
$form = SettingForm::rowActive()->where('sector', $sector)->where('code', $code)->first();
if (!$form) {
abort(404, 'Page not found');
}
// Fetch form details
$lands = $this->lands;
if ($instansi && $instansi != 'all' && $instansi != 'none') {
$agency = Agency::where('name', $instansi)->rowActive()->first();
$instansi = $agency ? $agency->id : null;
}
// get Agencies for produsen data mapping
$user = Auth::user();
$scope = $user->getScope();
if ($scope === LingkupAksesData::INTERNAL->value) {
$instansi = $user->agency_id;
}
$agencies = Agency::whereHas('agencyActivity', function ($query) use ($sector, $code, $scope, $user) {
$query->where('form_sector', $sector)
->where('form_code', $code);
if ($scope === LingkupAksesData::INTERNAL->value) {
$query->where('agency_id', $user->agency_id);
}
})->get();
// Fetch activity form and activity form details using service
$activityForm = $this->formService->getActivityForm($sector, $code, $inventoryYear, $instansi);
if ($instansi == 'all') {
$activityFormId = $activityForm->pluck('id')->toArray();
} else {
$activityFormId = $activityForm->id ?? null;
}
$activityFormDetails = $this->formService->getActivityFormDetails($activityFormId, $instansi);
$isLocked = ActivityLock::isLocked($inventoryYear);
$isApprove = false;
if ($instansi && $instansi != 'all' && $instansi != 'none') {
$isApprove = ActivityApprovalKonsolidasi::isApprove($activityFormId, $sector, $code, $inventoryYear, $instansi);
}
$internal = $instansi;
return compact(
'form',
'lands',
'activityForm',
'activityFormDetails',
'inventoryYear',
'isLocked',
'agencies',
'internal',
'isApprove'
);
}
public function show()
{
$sector = $this->sector;
$code = $this->code;
$inventoryYear = request('inventoryYear') ?? date('Y');
$instansi = request('instansi') ?? null;
// Retrieve data
$data = $this->data($sector, $code, $inventoryYear, $instansi);
return view('form.index-kehutanan', $data);
}
public function import(Request $request, $inventoryYear, $instansi = null)
{
$request->validate([
'import_file' => 'required|file|mimes:xlsx,xls|max:2048', // Adjust max file size as needed
]);
$sector = $this->sector;
$code = $this->code;
$importService = $this->formService;
try {
$lands = $this->lands;
if ($instansi && $instansi != 'all' && $instansi != 'none') {
$agency = Agency::where('name', $instansi)->rowActive()->first();
$instansi = $agency ? $agency->id : null;
} else {
$instansi = null;
}
Excel::import(new FormKehutananImport($importService, $sector, $code, $inventoryYear, $lands, $instansi), $request->file('import_file'));
return redirect()->back()->with('success', 'Data berhasil diimpor.');
} catch (\Exception $e) {
return redirect()->back()->withErrors(['error' => 'Data gagal diimpor. Mohon dicoba kembali.' . $e->getMessage()]);
}
}
public function export($inventoryYear, $instansi = null)
{
$sector = $this->sector;
$code = $this->code;
$data = $this->data($sector, $code, $inventoryYear, $instansi);
$data['inventoryYear'] = $inventoryYear;
$isTemplate = request('isTemplate') ?? false;
$data['isTemplate'] = $isTemplate;
$instansiTitle = ($instansi && $instansi != 'all' && $instansi != 'none') ? ' (' . $instansi . ')' : '';
$titleExcel = $data['form']->name . ' ' . $inventoryYear . $instansiTitle;
if ($isTemplate) {
$titleExcel = 'Template ' . $titleExcel;
} else {
$titleExcel = 'Data Aktivitas ' . $titleExcel;
}
$data['titleExcel'] = $titleExcel;
$fileName = $titleExcel . '.xlsx';
return Excel::download(new FormKehutananExport($data), $fileName);
}
public function approvalKonsolidasi($inventoryYear, $instansi = null)
{
$sector = $this->sector;
$code = $this->code;
try {
$data = $this->data($sector, $code, $inventoryYear, $instansi);
if ($instansi && $instansi != 'all' && $instansi != 'none') {
$agency = Agency::where('name', $instansi)->rowActive()->first();
$instansi = $agency ? $agency->id : null;
}
$form = $data['activityForm'];
$this->formService->approvalKonsolidasi($form, $sector, $code, $inventoryYear, $instansi);
return redirect()->back()->with('success', 'Persetujuan Data Produsen berhasil diproses.');
} catch (\Exception $e) {
return redirect()->back()->withErrors(['error' => 'Persetujuan Data Produsen gagal diproses. Mohon dicoba kembali.' . $e->getMessage()]);
}
}
}