main
Ilham Wara Nugroho 2026-01-08 11:52:56 +07:00
parent ac8cea996b
commit 5aa9413e63
8 changed files with 133 additions and 235 deletions

View File

@ -139,7 +139,7 @@ class FormKehutananController implements HasMiddleware
// Retrieve data // Retrieve data
$data = $this->data($sector, $code, $inventoryYear, $instansi); $data = $this->data($sector, $code, $inventoryYear, $instansi);
return view('form.index-kehutanan', $data); return view('modules.form.index-kehutanan', $data);
} }
public function import(Request $request, $inventoryYear, $instansi = null) public function import(Request $request, $inventoryYear, $instansi = null)

View File

@ -13,6 +13,9 @@ use Illuminate\Routing\Controllers\Middleware;
class LivestockManureController implements HasMiddleware class LivestockManureController implements HasMiddleware
{ {
protected $title = 'Jenis Pengelolaan Kotoran Ternak';
protected $template = 'modules.form.livestock-manure';
protected $route = 'modules.pertanian.kotoran-ternak';
protected $service; protected $service;
public function __construct(LivestockManureService $service) public function __construct(LivestockManureService $service)
@ -26,69 +29,62 @@ class LivestockManureController implements HasMiddleware
//new Middleware('permission:/agriculture/kotoran_ternak'), //new Middleware('permission:/agriculture/kotoran_ternak'),
]; ];
} }
public function grid()
public function index(Request $request)
{ {
if ($request->ajax()) { $_data = [];
$data = $this->service->getAll(); $data = $this->service->getAll();
$result = datatables()::of($data) foreach ($data as $key => $row) {
->addColumn('no_baris', function ($lm) {
return $lm->row_num;
})
->addColumn('status', function ($lm) {
if ($lm->active_status == 1) {
return '<span class="badge badge-success">Aktif</span>';
} else {
return '<span class="badge badge-danger">Tidak Aktif</span>';
}
})
->editColumn('ef_direct_n2o_n', function ($lm) {
if ($lm->ef_direct_n2o_n === 0) {
return 0; // Show 0 as is
}
$output = getFormattedValue($lm->ef_direct_n2o_n, 2); $btn = '<a href="' . route($this->route.'.edit', $row->id) . '" class="btn btn-sm btn-primary mb-1 w-100">Edit</a>';
return $output; $btn .= ' <form action="' . route($this->route.'.destroy', $row->id) . '" method="POST" style="display: inline;" class="delete-form">';
}) $btn .= csrf_field();
->editColumn('ef_evaporation_n', function ($lm) { $btn .= method_field('DELETE');
if ($lm->ef_evaporation_n === 0) { $btn .= '<button type="button" class="btn btn-sm btn-danger mb-1 w-100 delete-button">Hapus</button>';
return 0; // Show 0 as is $btn .= '</form>';
}
$output = getFormattedValue($lm->ef_evaporation_n); if ($row->active_status == 0) {
return $output; $btn .= ' <form action="' . route($this->route.'.setAktif', $row->id) . '" method="POST" style="display: inline;" class="set-aktif-form">';
})
->addColumn('action', function ($lm) {
$btn = '<a href="' . route('livestockManure.edit', $lm->id) . '" class="btn btn-primary">Edit</a>';
$btn .= ' <form action="' . route('livestockManure.destroy', $lm->id) . '" method="POST" style="display: inline;" class="delete-form">';
$btn .= csrf_field(); $btn .= csrf_field();
$btn .= method_field('DELETE'); $btn .= method_field('PUT');
$btn .= '<button type="button" class="btn btn-danger delete-button">Hapus</button>'; $btn .= '<button type="button" class="btn btn-sm btn-info mb-1 w-100 text-white set-aktif-button">Aktifkan</button>';
$btn .= '</form>'; $btn .= '</form>';
}
if ($row->active_status == 1) {
$status = '<span class="badge bg-success">Aktif</span>';
} else {
$status = '<span class="badge bg-danger">Tidak Aktif</span>';
}
$_data[] = [
'no' => $key+1,
'no_baris' => @$row->row_num,
'ef_direct_n2o_n' => $row->ef_direct_n2o_n === 0 ? 0 : getFormattedValue($row->ef_direct_n2o_n, 2),
'ef_evaporation_n' => $row->ef_evaporation_n === 0 ? 0 : getFormattedValue($row->ef_evaporation_n),
'name' => $row->name,
'description' => $row->description,
'status' => $status,
'action' => @$btn,
];
if ($lm->active_status == 0) {
$btn .= ' <form action="' . route('livestockManure.setAktif', $lm->id) . '" method="POST" style="display: inline;" class="set-aktif-form">';
$btn .= csrf_field();
$btn .= method_field('PUT');
$btn .= '<button type="button" class="btn btn-info text-white set-aktif-button">Aktifkan</button>';
$btn .= '</form>';
}
return $btn;
})
->rawColumns(['no_baris', 'status', 'action'])
->make(true);
return $result;
} }
return view('form.livestock-manure.index'); return response()->json($_data);
}
public function index(Request $request)
{
$data['route'] = $this->route;
$data['title'] = $this->title;
return view($this->template.'.index',$data);
} }
public function create() public function create()
{ {
return view('form.livestock-manure.create'); $data['route'] = $this->route;
$data['title'] = $this->title;
return view($this->template.'.create',$data);
} }
public function store(Request $request) public function store(Request $request)
@ -111,7 +107,7 @@ class LivestockManureController implements HasMiddleware
]); ]);
$this->service->create($data); $this->service->create($data);
return redirect()->route('livestockManure.index')->with('success', 'Jenis Pengelolaan Kotoran Ternak berhasil ditambahkan.'); return redirect()->route($this->route.'.index')->with('success', 'Jenis Pengelolaan Kotoran Ternak berhasil ditambahkan.');
} catch (\Exception $e) { } catch (\Exception $e) {
return back()->withErrors(['error' => 'Jenis Pengelolaan Kotoran Ternak gagal disimpan. Silakan coba lagi. Error: ' . $e->getMessage()]); return back()->withErrors(['error' => 'Jenis Pengelolaan Kotoran Ternak gagal disimpan. Silakan coba lagi. Error: ' . $e->getMessage()]);
} }
@ -119,8 +115,10 @@ class LivestockManureController implements HasMiddleware
public function edit($id) public function edit($id)
{ {
$lm = $this->service->find($id); $data['lm'] = $this->service->find($id);
return view('form.livestock-manure.edit', compact('lm')); $data['route'] = $this->route;
$data['title'] = $this->title;
return view($this->template.'.edit', $data);
} }
public function update(Request $request, LivestockManure $kotoran_ternak) public function update(Request $request, LivestockManure $kotoran_ternak)
@ -130,7 +128,7 @@ class LivestockManureController implements HasMiddleware
// 'required', // 'required',
// 'string', // 'string',
// 'max:255', // 'max:255',
// new UniqueInSchema('activity', 'livestock_manure', 'code', $lm->id), // new UniqueInSchema('activity', 'livestock_manure', 'code', $row->id),
// ], // ],
'name' => 'required|string|max:255', 'name' => 'required|string|max:255',
'ef_direct_n2o_n' => 'nullable', 'ef_direct_n2o_n' => 'nullable',
@ -149,7 +147,7 @@ class LivestockManureController implements HasMiddleware
$this->service->update($kotoran_ternak, $data); $this->service->update($kotoran_ternak, $data);
return redirect()->route('livestockManure.index')->with('success', 'Jenis Pengelolaan Kotoran Ternak berhasil diperbarui.'); return redirect()->route($this->route.'.index')->with('success', 'Jenis Pengelolaan Kotoran Ternak berhasil diperbarui.');
} catch (\Exception $e) { } catch (\Exception $e) {
return back()->withErrors(['error' => 'Jenis Pengelolaan Kotoran Ternak gagal diperbarui. Silakan coba lagi. Error: ' . $e->getMessage()]); return back()->withErrors(['error' => 'Jenis Pengelolaan Kotoran Ternak gagal diperbarui. Silakan coba lagi. Error: ' . $e->getMessage()]);
} }
@ -166,7 +164,7 @@ class LivestockManureController implements HasMiddleware
$record->save(); $record->save();
} }
return redirect()->route('livestockManure.index')->with('success', 'Jenis Pengelolaan Kotoran Ternak berhasil dihapus.'); return redirect()->route($this->route.'.index')->with('success', 'Jenis Pengelolaan Kotoran Ternak berhasil dihapus.');
} catch (\Exception $e) { } catch (\Exception $e) {
return back()->withErrors(['error' => 'Jenis Pengelolaan Kotoran Ternak gagal dihapus. Silakan coba lagi. Error: ' . $e->getMessage()]); return back()->withErrors(['error' => 'Jenis Pengelolaan Kotoran Ternak gagal dihapus. Silakan coba lagi. Error: ' . $e->getMessage()]);
} }
@ -176,7 +174,7 @@ class LivestockManureController implements HasMiddleware
{ {
try { try {
$this->service->setAktif($id); $this->service->setAktif($id);
return redirect()->route('livestockManure.index')->with('success', 'Jenis Pengelolaan Kotoran Ternak berhasil diaktifkan.'); return redirect()->route($this->route.'.index')->with('success', 'Jenis Pengelolaan Kotoran Ternak berhasil diaktifkan.');
} catch (\Exception $e) { } catch (\Exception $e) {
return back()->withErrors(['error' => 'Gagal mengaktifkan Jenis Pengelolaan Kotoran Ternak. Silakan coba lagi. Error: ' . $e->getMessage()]); return back()->withErrors(['error' => 'Gagal mengaktifkan Jenis Pengelolaan Kotoran Ternak. Silakan coba lagi. Error: ' . $e->getMessage()]);
} }

View File

@ -19,10 +19,10 @@
'instansi' => $instansi, 'instansi' => $instansi,
]; ];
$routeImport = route('folu.import', $param); $routeImport = route('modules.folu.import', $param);
$routeExport = route('folu.export', $param); $routeExport = route('modules.folu.export', $param);
$routeExportTemplate = route('folu.export', array_merge($param, ['isTemplate' => true])); $routeExportTemplate = route('modules.folu.export', array_merge($param, ['isTemplate' => true]));
$routeApproval = route('folu.approval', $param); $routeApproval = route('modules.folu.approval', $param);
$internal = $internal ?? null; $internal = $internal ?? null;
$limitInternal = $internal !== null && !$agencies->isNotEmpty(); $limitInternal = $internal !== null && !$agencies->isNotEmpty();
@ -33,54 +33,19 @@
<h5 class="mb-0 font-weight-bold">{{ $form->name ?? '' }}</h5> <h5 class="mb-0 font-weight-bold">{{ $form->name ?? '' }}</h5>
</div> </div>
<div class="card-body"> <div class="card-body">
@if ($errors->has('error'))
<div class="alert alert-danger">
{{ $errors->first('error') }}
</div>
@endif
@if (session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
<div class="row"> <div class="row">
<div class="col-md-8 order-md-2 d-flex justify-content-end align-items-center flex-wrap">
<div class="form-group mb-0 mr-2"> <div class="col-md-12">
@include('form.approve') <form method="GET" action="{{ route('modules.folu.show') }}" id="filterForm">
</div>
<div class="form-group mb-0 mr-2">
<button type="button" class="btn btn-info mb-2 mb-md-0" onclick="showMetadataModal()"
{{ !$activityForm || $instansi === 'all' || $limitInternal ? 'disabled' : '' }}>
<i class="ti ti-menu-alt"></i>
{{-- Metadata --}}
</button>
</div>
<div class="form-group mb-0 mr-2">
<button type="button" class="btn btn-info mb-2 mb-md-0" onclick="showActivityUserModal()"
{{ !$activityForm || $instansi === 'all' || $limitInternal ? 'disabled' : '' }}>
Aktivitas User
</button>
</div>
<div class="form-group mb-0 mr-2">
<a href="{{ $routeExport }}" class="btn btn-info mb-2 mb-md-0">Ekspor Excel</a>
</div>
<div class="form-group mb-0">
<button type="button" class="btn btn-info mb-2 mb-md-0" data-toggle="modal"
data-target="#importModal">
Impor Data Aktivitas
</button>
</div>
</div>
<div class="col-md-4 order-md-1">
<form method="GET" action="{{ route('folu.show') }}" id="filterForm">
<div class="row"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">
<x-inventory-year-select :selected-year="$inventoryYear" /> <x-inventory-year-select :selected-year="$inventoryYear" />
</div> </div>
</div>
<div class="row">
{{-- @if ($agencies->isNotEmpty()) --}} {{-- @if ($agencies->isNotEmpty()) --}}
<div class="col-md-8"> <div class="col-md-4">
<div class="form-group"> <div class="form-group">
<label for="instansi">Instansi:</label> <label for="instansi">Instansi:</label>
<div class="input-group"> <div class="input-group">
@ -104,15 +69,44 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-8 order-md-2 d-flex gap-1 justify-content-end align-items-center flex-wrap">
<div class="form-group mb-0 mr-2">
@include('modules.form.approve')
</div>
<div class="form-group mb-0 mr-2">
<button type="button" class="btn btn-info mb-2 mb-md-0" onclick="showMetadataModal()"
{{ !$activityForm || $instansi === 'all' || $limitInternal ? 'disabled' : '' }}>
<i class="bx bx-menu"></i>
{{-- Metadata --}}
</button>
</div>
<div class="form-group mb-0 mr-2">
<button type="button" class="btn btn-info mb-2 mb-md-0" onclick="showActivityUserModal()"
{{ !$activityForm || $instansi === 'all' || $limitInternal ? 'disabled' : '' }}>
Aktivitas User
</button>
</div>
<div class="form-group mb-0 mr-2">
<a href="{{ $routeExport }}" class="btn btn-success mb-2 mb-md-0">Ekspor Excel</a>
</div>
<div class="form-group mb-0">
<button type="button" class="btn btn-warning mb-2 mb-md-0" data-toggle="modal"
data-target="#importModal">
Impor Data Aktivitas
</button>
</div>
</div>
{{-- @endif --}} {{-- @endif --}}
</div> </div>
</form> </form>
</div> </div>
</div> </div>
<div class="table-responsive" style="overflow-x: auto;"> <div class="table-responsive mt-2" style="overflow-x: auto;">
<table class="table table-bordered table-detail" style="min-width: 1095px;"> <table class="table table-bordered table-detail" style="min-width: 1095px;">
<thead class="bg-header text-white"> <thead class="table-info text-white">
<tr class="text-center"> <tr class="text-center">
<th colspan="{{ 1 + count($lands) }}"> <th colspan="{{ 1 + count($lands) }}">
{{ $inventoryYear - 1 }} {{ $inventoryYear - 1 }}
@ -162,10 +156,10 @@
</div> </div>
</div> </div>
</div> </div>
@include('form.import') @include('modules.form.import')
@if ($instansi !== 'all') @if ($instansi !== 'all')
@include('form.aktivitas-user') @include('modules.form.aktivitas-user')
@include('form.metadata.index') @include('modules.form.metadata.index')
@endif @endif
@endsection @endsection

View File

@ -1,7 +1,5 @@
@extends('layouts.master') @extends('layouts.master')
@section('title', 'Tambah Jenis Pengelolaan Kotoran Ternak')
@section('content') @section('content')
<div class="card shadow-sm"> <div class="card shadow-sm">
<div class="card-header d-flex justify-content-between align-items-center"> <div class="card-header d-flex justify-content-between align-items-center">
@ -9,26 +7,10 @@
</div> </div>
<div class="card-body"> <div class="card-body">
@if ($errors->has('error'))
<div class="alert alert-danger"> <form method="POST" action="{{ route($route.'.store') }}">
{{ $errors->first('error') }}
</div>
@endif
<form method="POST" action="{{ route('livestockManure.store') }}">
@csrf @csrf
{{-- <div class="form-group">
<label for="code">Kode <span class="text-danger">*</span></label>
<input type="text" class="form-control @error('code') is-invalid @enderror" id="code"
name="code" value="{{ old('code') }}">
@error('code')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div> --}}
<div class="form-group"> <div class="form-group">
<label for="name">Sistem Pengelolaan Kotoran Ternak <span class="text-danger">*</span></label> <label for="name">Sistem Pengelolaan Kotoran Ternak <span class="text-danger">*</span></label>
<input type="text" class="form-control @error('name') is-invalid @enderror" id="name" <input type="text" class="form-control @error('name') is-invalid @enderror" id="name"
@ -62,17 +44,6 @@
@enderror @enderror
</div> </div>
{{-- <div class="form-group">
<label for="row_num">Nomor Baris <span class="text-danger">*</span></label>
<input type="number" class="form-control @error('row_num') is-invalid @enderror" id="row_num"
name="row_num" value="{{ old('row_num') }}">
@error('row_num')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div> --}}
<button type="button" class="btn btn-secondary mt-3" onclick="history.back()">Kembali</button> <button type="button" class="btn btn-secondary mt-3" onclick="history.back()">Kembali</button>
<button type="submit" class="btn btn-primary mt-3">Simpan</button> <button type="submit" class="btn btn-primary mt-3">Simpan</button>
</form> </form>

View File

@ -1,7 +1,5 @@
@extends('layouts.master') @extends('layouts.master')
@section('title', 'Edit Jenis Pengelolaan Kotoran Ternak')
@section('content') @section('content')
<div class="card shadow-sm"> <div class="card shadow-sm">
<div class="card-header d-flex justify-content-between align-items-center"> <div class="card-header d-flex justify-content-between align-items-center">
@ -9,27 +7,11 @@
</div> </div>
<div class="card-body"> <div class="card-body">
@if ($errors->has('error'))
<div class="alert alert-danger">
{{ $errors->first('error') }}
</div>
@endif
<form method="POST" action="{{ route('livestockManure.update', $lm->id) }}"> <form method="POST" action="{{ route($route.'.update', $lm->id) }}">
@csrf @csrf
@method('PUT') @method('PUT')
{{-- <div class="form-group">
<label for="code">Kode <span class="text-danger">*</span></label>
<input type="text" class="form-control @error('code') is-invalid @enderror" id="code"
name="code" value="{{ old('code', $lm->code) }}">
@error('code')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div> --}}
<div class="form-group"> <div class="form-group">
<label for="name">Sistem Pengelolaan Kotoran Ternak <span class="text-danger">*</span></label> <label for="name">Sistem Pengelolaan Kotoran Ternak <span class="text-danger">*</span></label>
<input type="text" class="form-control @error('name') is-invalid @enderror" id="name" <input type="text" class="form-control @error('name') is-invalid @enderror" id="name"

View File

@ -1,37 +1,39 @@
@extends('layouts.master') @extends('layouts.master')
@section('title', 'Jenis Pengelolaan Kotoran Ternak')
@section('content') @section('content')
{{-- <div class="container"> --}} {{-- <div class="container"> --}}
<div class="card shadow-sm"> <div class="card shadow-sm">
<div class="card-header d-flex justify-content-between align-items-center"> <div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0 font-weight-bold">Jenis Pengelolaan Kotoran Ternak</h5> <h5 class="mb-0 font-weight-bold">{{ $title }}</h5>
<a href="{{ route('livestockManure.create') }}" class="btn btn-sm btn-primary float-right">Tambah Jenis Pengelolaan <a href="{{ route($route.'.create') }}" class="btn btn-sm btn-primary float-right">Tambah {{$title}}</a>
Kotoran Ternak</a>
</div> </div>
<div class="card-body"> <div class="card-body">
@if (session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
<div class="table-responsive"> <div class="table-responsive">
<table class="table align-items-center mb-0 display" id="data-table" style="width:100%"> <table class="table w-100"
<thead> data-search="true"
data-toggle="table"
data-pagination="true"
data-toolbar="#toolbar"
data-show-refresh="false"
data-url="{{route($route.'.grid')}}"
data-ajax-options='{"xhrFields": {"withCredentials": true}}'
data-sort-name="ids"
data-sort-order="desc"
data-page-size="10"
data-id-field="id"
id="grid-data">
<thead class="table-primary text-primary">
<tr> <tr>
{{-- <th scope="col">Kode</th> --}} <th data-field="action">#</th>
<th scope="col">Sistem Pengelolaan Kotoran Ternak</th> <th data-field="name">Sistem Pengelolaan Kotoran Ternak</th>
<th scope="col">Faktor Emisi untuk Emisi Langsung N2O-N</th> <th data-field="ef_direct_n2o_n">Faktor Emisi untuk Emisi Langsung N2O-N</th>
<th scope="col">Faktor Emisi untuk Emisi N2O dari Penguapan N</th> <th data-field="ef_evaporation_n">Faktor Emisi untuk Emisi N2O dari Penguapan N</th>
<th scope="col">Nomor Baris</th> <th data-field="no_baris">Nomor Baris</th>
<th scope="col">Status</th> <th data-field="status">Status</th>
<th scope="col" width="20%">Aksi</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody></tbody>
</tbody>
</table> </table>
</div> </div>
</div> </div>
@ -41,56 +43,6 @@
@section('js') @section('js')
<script> <script>
$(document).ready(function() {
$('#data-table').DataTable({
pageLength: 10,
responsive: true,
serverSide: true,
scrollX: true,
searchDelay: 1000,
ajax: {
url: '{{ route('livestockManure.index') }}',
type: 'GET',
dataSrc: 'data'
},
columns: [
// {
// data: 'code',
// name: 'code'
// },
{
data: 'name',
name: 'name'
},
{
data: 'ef_direct_n2o_n',
name: 'ef_direct_n2o_n'
},
{
data: 'ef_evaporation_n',
name: 'ef_evaporation_n'
},
{
data: 'no_baris',
name: 'no_baris'
},
{
data: 'status',
name: 'status'
},
{
data: 'action',
name: 'action',
orderable: false,
searchable: false
},
],
order: [
[3, 'asc']
]
});
});
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
// Delete confirmation // Delete confirmation
$(document).on('click', '.delete-button', function(e) { $(document).on('click', '.delete-button', function(e) {

View File

@ -4,7 +4,7 @@
<input type="hidden" name="instansi" value="{{ $instansi }}"> <input type="hidden" name="instansi" value="{{ $instansi }}">
<div class="table-responsive mt-3" style="overflow-x: auto;"> <div class="table-responsive mt-3" style="overflow-x: auto;">
<table class="table table-bordered table-detail"> <table class="table table-bordered table-detail">
<thead class="bg-header text-white"> <thead class="table-info text-white">
<tr> <tr>
<th style="width: 50px;">No.</th> <th style="width: 50px;">No.</th>
<th style="width: 100px;">Tahun</th> <th style="width: 100px;">Tahun</th>

View File

@ -259,9 +259,10 @@ Route::name('management.')->prefix('management')->group(function () {
Route::post('{inventoryYear}/{instansi?}', [FormKehutananController::class, 'approvalKonsolidasi'])->name('folu.approval'); Route::post('{inventoryYear}/{instansi?}', [FormKehutananController::class, 'approvalKonsolidasi'])->name('folu.approval');
}); });
Route::prefix('agriculture')->group(function () { Route::prefix('pertanian')->name('pertanian.')->group(function () {
Route::resource('kotoran_ternak', LivestockManureController::class)->names('livestockManure'); Route::get('kotoran-ternak/grid', [LivestockManureController::class, 'grid'])->name('kotoran-ternak.grid');
Route::put('kotoran_ternak/{id}/setAktif', [LivestockManureController::class, 'setAktif'])->name('livestockManure.setAktif'); Route::resource('kotoran-ternak', LivestockManureController::class)->names('kotoran-ternak');
Route::put('kotoran_ternak/{id}/setAktif', [LivestockManureController::class, 'setAktif'])->name('kotoran-ternak.setAktif');
}); });
Route::prefix('{sector}/{code}')->group(function () { Route::prefix('{sector}/{code}')->group(function () {