diff --git a/app/Http/Controllers/Backend/AuditTrailController.php b/app/Http/Controllers/Backend/AuditTrailController.php index 4510f2f..250ac5d 100644 --- a/app/Http/Controllers/Backend/AuditTrailController.php +++ b/app/Http/Controllers/Backend/AuditTrailController.php @@ -22,7 +22,8 @@ class AuditTrailController extends Controller return view( 'backend.pages.audit_trail.index', [ - 'data' => AuditTrail::orderBy('id', 'desc')->get(), + // sort by newest + 'data' => AuditTrail::orderBy('created_at', 'desc')->get(), 'pageInfo' => $pageInfo, ] ); diff --git a/app/Http/Controllers/Backend/DashboardController.php b/app/Http/Controllers/Backend/DashboardController.php index ac1b539..d04504e 100644 --- a/app/Http/Controllers/Backend/DashboardController.php +++ b/app/Http/Controllers/Backend/DashboardController.php @@ -63,7 +63,7 @@ class DashboardController extends Controller // Sum the filtered queries foreach ($forms as $key => $query) { - $forms[$key] = $query->sum('total'); + $forms[$key] = $query->sum('approved_total'); } return view( diff --git a/app/Http/Controllers/Forms/FormUpCountryController.php b/app/Http/Controllers/Forms/FormUpCountryController.php index 53e350b..e609c08 100644 --- a/app/Http/Controllers/Forms/FormUpCountryController.php +++ b/app/Http/Controllers/Forms/FormUpCountryController.php @@ -65,6 +65,17 @@ class FormUpCountryController extends Controller ]); } + public function detail($id) + { + $this->checkAuthorization(auth()->user(), ['forms.country.view']); + + $form = FormUpCountry::with(['rayon', 'user'])->findOrFail($id); + $form->bukti1 = NextCloudHelper::getFileUrl($form->bukti1); + $form->bukti2 = NextCloudHelper::getFileUrl($form->bukti2); + $form->bukti3 = NextCloudHelper::getFileUrl($form->bukti3); + return response()->json($form); + } + public function create() { $this->checkAuthorization(auth()->user(), ['forms.country.create']); @@ -273,15 +284,28 @@ class FormUpCountryController extends Controller return redirect()->back(); } - public function approve($id) + public function approve(Request $request, $id) { $this->checkAuthorization(auth()->user(), ['approval.approve']); $form = FormUpCountry::findOrfail($id); + $approved_data = [ + 'allowance' => $request->allowance ? $form->allowance : 0, + 'transport_dalkot' => $request->transport_dalkot ? $form->transport_dalkot : 0, + 'transport_ankot' => $request->transport_ankot ? $form->transport_ankot : 0, + 'hotel' => $request->hotel ? $form->hotel : 0, + ]; + $form->update([ 'approved_at' => now(), 'approved_by' => auth()->user()->id, - 'status' => 'Approved' + 'status' => 'Approved', + + 'approved_allowance' => $approved_data['allowance'], + 'approved_transport_dalkot' => $approved_data['transport_dalkot'], + 'approved_transport_ankot' => $approved_data['transport_ankot'], + 'approved_hotel' => $approved_data['hotel'], + 'approved_total' => array_sum($approved_data), ]); $heads = $form->user->getCabangAndRegionHead(); diff --git a/app/Models/FormEntertaimentPresentation.php b/app/Models/FormEntertaimentPresentation.php index d62e7d3..0bb0820 100644 --- a/app/Models/FormEntertaimentPresentation.php +++ b/app/Models/FormEntertaimentPresentation.php @@ -17,6 +17,7 @@ class FormEntertaimentPresentation extends Model 'jenis', 'keterangan', 'total', + 'approved_total', 'name', 'alamat', 'nik_or_npwp', diff --git a/app/Models/FormMeetingSeminar.php b/app/Models/FormMeetingSeminar.php index 36c7803..f0b8927 100644 --- a/app/Models/FormMeetingSeminar.php +++ b/app/Models/FormMeetingSeminar.php @@ -17,6 +17,10 @@ class FormMeetingSeminar extends Model 'transport_ankot', 'hotel', 'total', + 'approved_allowance', + 'approved_transport_ankot', + 'approved_hotel', + 'approved_total', 'bukti1', 'bukti2', 'bukti3', diff --git a/app/Models/FormOthers.php b/app/Models/FormOthers.php index 5cb8ec4..33e61d5 100644 --- a/app/Models/FormOthers.php +++ b/app/Models/FormOthers.php @@ -17,6 +17,7 @@ class FormOthers extends Model 'tanggal', 'keterangan', 'total', + 'approved_total', 'bukti1', 'bukti2', 'bukti3', diff --git a/app/Models/FormUpCountry.php b/app/Models/FormUpCountry.php index 425fb39..6fff4df 100644 --- a/app/Models/FormUpCountry.php +++ b/app/Models/FormUpCountry.php @@ -22,6 +22,11 @@ class FormUpCountry extends Model 'transport_ankot', 'hotel', 'total', + 'approved_allowance', + 'approved_transport_dalkot', + 'approved_transport_ankot', + 'approved_hotel', + 'approved_total', 'bukti1', 'bukti2', 'bukti3', diff --git a/app/Models/FormVehicleRunningCost.php b/app/Models/FormVehicleRunningCost.php index 620bc55..ca5cf1c 100644 --- a/app/Models/FormVehicleRunningCost.php +++ b/app/Models/FormVehicleRunningCost.php @@ -16,6 +16,7 @@ class FormVehicleRunningCost extends Model 'tanggal', 'liter', 'total', + 'approved_total', 'jarak', 'tipe_bensin', 'nopol', diff --git a/database/migrations/2025_01_02_082311_revised_form_up_country_table.php b/database/migrations/2025_01_02_082311_revised_form_up_country_table.php new file mode 100644 index 0000000..179e361 --- /dev/null +++ b/database/migrations/2025_01_02_082311_revised_form_up_country_table.php @@ -0,0 +1,36 @@ +integer('approved_allowance')->after('total')->nullable(); + $table->integer('approved_transport_dalkot')->after('approved_allowance')->nullable(); + $table->integer('approved_transport_ankot')->after('approved_transport_dalkot')->nullable(); + $table->integer('approved_hotel')->after('approved_transport_ankot')->nullable(); + $table->integer('approved_total')->after('approved_hotel')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_up_country', function (Blueprint $table) { + $table->dropColumn('approved_allowance'); + $table->dropColumn('approved_transport_dalkot'); + $table->dropColumn('approved_transport_ankot'); + $table->dropColumn('approved_hotel'); + $table->dropColumn('approved_total'); + }); + } +}; diff --git a/database/migrations/2025_01_02_082747_revised_form_vehicle_running_cost_table.php b/database/migrations/2025_01_02_082747_revised_form_vehicle_running_cost_table.php new file mode 100644 index 0000000..227cb5e --- /dev/null +++ b/database/migrations/2025_01_02_082747_revised_form_vehicle_running_cost_table.php @@ -0,0 +1,28 @@ +integer('approved_total')->after('total')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_vehicle_running_cost', function (Blueprint $table) { + $table->dropColumn('approved_total'); + }); + } +}; diff --git a/database/migrations/2025_01_02_082854_revised_form_entertainment_presentation_table.php b/database/migrations/2025_01_02_082854_revised_form_entertainment_presentation_table.php new file mode 100644 index 0000000..c92225c --- /dev/null +++ b/database/migrations/2025_01_02_082854_revised_form_entertainment_presentation_table.php @@ -0,0 +1,28 @@ +integer('approved_total')->after('total')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_entertainment_presentation', function (Blueprint $table) { + $table->dropColumn('approved_total'); + }); + } +}; diff --git a/database/migrations/2025_01_02_082944_revised_form_meeting_seminar_table.php b/database/migrations/2025_01_02_082944_revised_form_meeting_seminar_table.php new file mode 100644 index 0000000..a0ebb42 --- /dev/null +++ b/database/migrations/2025_01_02_082944_revised_form_meeting_seminar_table.php @@ -0,0 +1,34 @@ +integer('approved_allowance')->after('total')->nullable(); + $table->integer('approved_transport_ankot')->after('approved_allowance')->nullable(); + $table->integer('approved_hotel')->after('approved_transport_ankot')->nullable(); + $table->integer('approved_total')->after('approved_hotel')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_meeting_seminar', function (Blueprint $table) { + $table->dropColumn('approved_allowance'); + $table->dropColumn('approved_transport_ankot'); + $table->dropColumn('approved_hotel'); + $table->dropColumn('approved_total'); + }); + } +}; diff --git a/database/migrations/2025_01_02_083046_revised_form_others_table.php b/database/migrations/2025_01_02_083046_revised_form_others_table.php new file mode 100644 index 0000000..66ca6be --- /dev/null +++ b/database/migrations/2025_01_02_083046_revised_form_others_table.php @@ -0,0 +1,28 @@ +integer('approved_total')->after('total')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_others', function (Blueprint $table) { + $table->dropColumn('approved_total'); + }); + } +}; diff --git a/resources/views/backend/pages/audit_trail/index.blade.php b/resources/views/backend/pages/audit_trail/index.blade.php index d6d3410..6bf439c 100644 --- a/resources/views/backend/pages/audit_trail/index.blade.php +++ b/resources/views/backend/pages/audit_trail/index.blade.php @@ -42,7 +42,8 @@ {{ __('Activity') }} Browser User Agent - Time + Tanggal + Waktu @@ -70,6 +71,7 @@ {{ $item->activity }} {{ $item->browser }} {{ $item->user_agent }} + {{ $item->created_at }} {{ $item->created_at->diffForHumans() }} @endforeach @@ -93,7 +95,8 @@ dom: 'Bfrtip', buttons: [ 'excel', 'pdf', 'print' - ] + ], + order: [[6, 'desc']] }); } }); diff --git a/resources/views/backend/pages/forms/entertainment/index.blade.php b/resources/views/backend/pages/forms/entertainment/index.blade.php index 3382e67..f5fe56c 100644 --- a/resources/views/backend/pages/forms/entertainment/index.blade.php +++ b/resources/views/backend/pages/forms/entertainment/index.blade.php @@ -246,7 +246,7 @@ $(document).ready(function () { if ($('#dataTable').length) { $('#dataTable').DataTable({ - responsive: true, + responsive: false, dom: 'Bfrtip', buttons: [ 'excel', 'pdf', 'print' diff --git a/resources/views/backend/pages/forms/meeting/index.blade.php b/resources/views/backend/pages/forms/meeting/index.blade.php index 798045a..312bd01 100644 --- a/resources/views/backend/pages/forms/meeting/index.blade.php +++ b/resources/views/backend/pages/forms/meeting/index.blade.php @@ -246,7 +246,7 @@ $(document).ready(function () { if ($('#dataTable').length) { $('#dataTable').DataTable({ - responsive: true, + responsive: false, dom: 'Bfrtip', buttons: [ 'excel', 'pdf', 'print' diff --git a/resources/views/backend/pages/forms/other/index.blade.php b/resources/views/backend/pages/forms/other/index.blade.php index 759fe3e..a2f8599 100644 --- a/resources/views/backend/pages/forms/other/index.blade.php +++ b/resources/views/backend/pages/forms/other/index.blade.php @@ -244,7 +244,7 @@ $(document).ready(function () { if ($('#dataTable').length) { $('#dataTable').DataTable({ - responsive: true, + responsive: false, dom: 'Bfrtip', buttons: [ 'excel', 'pdf', 'print' diff --git a/resources/views/backend/pages/forms/upcountry/index.blade.php b/resources/views/backend/pages/forms/upcountry/index.blade.php index a080d90..e4b881a 100644 --- a/resources/views/backend/pages/forms/upcountry/index.blade.php +++ b/resources/views/backend/pages/forms/upcountry/index.blade.php @@ -39,7 +39,7 @@
-

Rp {{ number_format($forms->whereIn('status', ['Approved', 'Closed'])->sum('total'), 0, ',', '.') }}

+

Rp {{ number_format($forms->whereIn('status', ['Approved', 'Closed'])->sum('approved_total'), 0, ',', '.') }}

Approved Expenses

@@ -90,6 +90,7 @@ Tujuan Jarak Total + Total Approved Bukti 1 Bukti 2 Bukti 3 @@ -117,9 +118,16 @@ {{ $item->tujuan }} {{ $item->jarak }} km {{ number_format($item->total, 0, ',', '.') }} + + @if ($item->approved_total) + {{ number_format($item->approved_total, 0, ',', '.') }} + @else + - + @endif + @if ($item->bukti1) - + Download @else @@ -128,7 +136,7 @@ @if ($item->bukti2) - + Download @else @@ -137,7 +145,7 @@ @if ($item->bukti3) - + Download @else @@ -158,15 +166,15 @@ {{-- approve / reject button --}} @if ($item->status == 'On Progress') -
- @csrf - @method('PUT') -
-
+ @csrf @method('PUT')
+
+ +
@endsection @section('scripts') + $(document).ready(function () { + // Uncheck all checkboxes on page refresh + $('.custom-control-input').prop('checked', false); + + if ($('#dataTable').length) { + $('#dataTable').DataTable({ + responsive: false, + dom: 'Bfrtip', + buttons: ['excel', 'pdf', 'print'] + }); + } + + // Handle Approve Button Click + $('.open-approve-modal').on('click', function () { + const approveUrl = $(this).data('id'); + + // Show spinner and hide content initially + $('#loadingSpinner').show(); + $('#modalContent').addClass('d-none'); + + $('#approveForm').attr('action', approveUrl); // Set the form action + $('#approveModal').modal('show'); // Show the modal + + // Get detail from /forms/up-country/detail/{id} + $.get(approveUrl.replace('approve', 'detail'), function (data) { + const formatter = new Intl.NumberFormat('id-ID', { + style: 'currency', + currency: 'IDR', + minimumFractionDigits: 0 + }); + + $('#allowance_value').text(formatter.format(data.allowance)); + $('#transport_dalkot_value').text(formatter.format(data.transport_dalkot)); + $('#transport_ankot_value').text(formatter.format(data.transport_ankot)); + $('#hotel_value').text(formatter.format(data.hotel)); + + // Assign data values to checkboxes + $('#allowance').data('value', data.allowance); + $('#transport_dalkot').data('value', data.transport_dalkot); + $('#transport_ankot').data('value', data.transport_ankot); + $('#hotel').data('value', data.hotel); + + // Detail data + $('#user').text(data.user.name); + $('#rayon').text(data.rayon.code); + $('#tanggal').text(new Date(data.tanggal).toLocaleDateString('id-ID', { + year: 'numeric', + month: 'long', + day: 'numeric' + })); + $('#tujuan').text(data.tujuan); + $('#jarak').text(data.jarak + ' km'); + $('#bukti1').html(data.bukti1 ? 'Download' : '-'); + $('#bukti2').html(data.bukti2 ? 'Download' : '-'); + $('#bukti3').html(data.bukti3 ? 'Download' : '-'); + + // Hide spinner and show content + $('#loadingSpinner').hide(); + $('#loadingSpinner').removeClass('d-flex'); + $('#loadingSpinner').addClass('d-none'); + $('#modalContent').removeClass('d-none'); + + // Reset the total to zero + $('#total').val(0); + }); + }); + + // Update total dynamically + $('.custom-control-input').on('change', function () { + let total = 0; + + // Calculate the total based on checked checkboxes + $('.custom-control-input:checked').each(function () { + total += parseFloat($(this).data('value') || 0); + }); + + // Update the total field with formatted value + const formatter = new Intl.NumberFormat('id-ID', { + style: 'currency', + currency: 'IDR', + minimumFractionDigits: 0 + }); + + $('#total').val(formatter.format(total)); + }); + + // Uncheck all checkboxes when the modal is closed + $('#approveModal').on('hidden.bs.modal', function () { + $('.custom-control-input').prop('checked', false); // Uncheck all checkboxes + $('#total').val('0'); // Reset total to 0 + }); + }); + @endsection diff --git a/resources/views/backend/pages/forms/vehicle/index.blade.php b/resources/views/backend/pages/forms/vehicle/index.blade.php index 821065f..ba04e22 100644 --- a/resources/views/backend/pages/forms/vehicle/index.blade.php +++ b/resources/views/backend/pages/forms/vehicle/index.blade.php @@ -248,7 +248,7 @@ $(document).ready(function () { if ($('#dataTable').length) { $('#dataTable').DataTable({ - responsive: true, + responsive: false, dom: 'Bfrtip', buttons: [ 'excel', 'pdf', 'print' diff --git a/resources/views/layouts/partials/styles.blade.php b/resources/views/layouts/partials/styles.blade.php index 4493b0a..39eb2ba 100644 --- a/resources/views/layouts/partials/styles.blade.php +++ b/resources/views/layouts/partials/styles.blade.php @@ -25,6 +25,11 @@