From 7d3566deb23c05df02b35ec3277189d184a24cf8 Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Fri, 3 Jan 2025 20:33:32 +0700 Subject: [PATCH 1/7] fix table role --- resources/views/backend/pages/roles/index.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/backend/pages/roles/index.blade.php b/resources/views/backend/pages/roles/index.blade.php index 7eb2a0c..d994317 100644 --- a/resources/views/backend/pages/roles/index.blade.php +++ b/resources/views/backend/pages/roles/index.blade.php @@ -38,7 +38,7 @@
@include('backend.layouts.partials.messages') -
+
@@ -105,7 +105,7 @@ $(document).ready(function () { if ($('#dataTable').length) { $('#dataTable').DataTable({ - responsive: false, + responsive: true, dom: 'Bfrtip', buttons: [ 'excel', 'pdf', 'print' From c584c04dcb72c0dbef39c39922dae069b5cbcbfc Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Fri, 3 Jan 2025 21:37:58 +0700 Subject: [PATCH 2/7] revised form up country (again) --- app/Helpers/NextCloudHelper.php | 1 - .../Forms/FormUpCountryController.php | 170 +++++++++++------- app/Models/FormUpCountry.php | 7 +- ...134057_add_nullable_to_form_up_country.php | 34 ++++ ...34342_changed_bukti_to_form_up_country.php | 44 +++++ .../backend/pages/dashboard/index.blade.php | 2 +- .../pages/forms/upcountry/create.blade.php | 42 +++-- .../pages/forms/upcountry/edit.blade.php | 42 +++-- .../pages/forms/upcountry/index.blade.php | 52 ++---- 9 files changed, 250 insertions(+), 144 deletions(-) create mode 100644 database/migrations/2025_01_03_134057_add_nullable_to_form_up_country.php create mode 100644 database/migrations/2025_01_03_134342_changed_bukti_to_form_up_country.php diff --git a/app/Helpers/NextCloudHelper.php b/app/Helpers/NextCloudHelper.php index 5e7f007..5c64be8 100644 --- a/app/Helpers/NextCloudHelper.php +++ b/app/Helpers/NextCloudHelper.php @@ -140,7 +140,6 @@ class NextCloudHelper return rtrim($baseUrl, '/') . '/' . $relativePath; } - public static function getNextcloudFile($filePath) { // Check if the file exists diff --git a/app/Http/Controllers/Forms/FormUpCountryController.php b/app/Http/Controllers/Forms/FormUpCountryController.php index f91c894..d0f9fb1 100644 --- a/app/Http/Controllers/Forms/FormUpCountryController.php +++ b/app/Http/Controllers/Forms/FormUpCountryController.php @@ -70,9 +70,11 @@ class FormUpCountryController extends Controller $this->checkAuthorization(auth()->user(), ['forms.country.view']); $form = FormUpCountry::with(['rayon', 'user'])->findOrFail($id); - $form->bukti1 = $form->bukti1 ? NextCloudHelper::getFileUrl($form->bukti1) : null; - $form->bukti2 = $form->bukti2 ? NextCloudHelper::getFileUrl($form->bukti2) : null; - $form->bukti3 = $form->bukti3 ? NextCloudHelper::getFileUrl($form->bukti3) : null; + $form->bukti_allowance = $form->bukti_allowance ? NextCloudHelper::getFileUrl($form->bukti_allowance) : null; + $form->bukti_transport_dalkot = $form->bukti_transport_dalkot ? NextCloudHelper::getFileUrl($form->bukti_transport_dalkot) : null; + $form->bukti_transport_ankot = $form->bukti_transport_ankot ? NextCloudHelper::getFileUrl($form->bukti_transport_ankot) : null; + $form->bukti_hotel = $form->bukti_hotel ? NextCloudHelper::getFileUrl($form->bukti_hotel) : null; + return response()->json($form); } @@ -94,12 +96,14 @@ class FormUpCountryController extends Controller 'tanggal' => 'required', 'tujuan' => 'required', 'jarak' => 'required', - 'allowance' => 'required', - 'transport_dalkot' => 'required', - 'transport_ankot' => 'required', - 'bukti1' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], - 'bukti2' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], - 'bukti3' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'allowance' => 'nullable|numeric', + 'transport_dalkot' => 'nullable|numeric', + 'transport_ankot' => 'nullable|numeric', + 'hotel' => 'nullable|numeric', + 'bukti_allowance' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'bukti_transport_dalkot' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'bukti_transport_ankot' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'bukti_hotel' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], ]); $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; @@ -109,40 +113,52 @@ class FormUpCountryController extends Controller $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry'; - if ($request->hasFile('bukti1')) { - $bukti1 = $request->file('bukti1'); - $filename = Str::uuid() . '.' . $bukti1->extension(); + if ($request->hasFile('bukti_allowance')) { + $bukti_allowance = $request->file('bukti_allowance'); + $filename = Str::uuid() . '.' . $bukti_allowance->extension(); - $filePaths['bukti1'] = $folderPath . '/' . $filename; + $filePaths['bukti_allowance'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti1->getContent(), + $bukti_allowance->getContent(), $filename ); } - if ($request->hasFile('bukti2')) { - $bukti2 = $request->file('bukti2'); - $filename = Str::uuid() . '.' . $bukti2->extension(); + if ($request->hasFile('bukti_transport_dalkot')) { + $bukti_transport_dalkot = $request->file('bukti_transport_dalkot'); + $filename = Str::uuid() . '.' . $bukti_transport_dalkot->extension(); - $filePaths['bukti2'] = $folderPath . '/' . $filename; + $filePaths['bukti_transport_dalkot'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti2->getContent(), + $bukti_transport_dalkot->getContent(), $filename ); } - if ($request->hasFile('bukti3')) { - $bukti3 = $request->file('bukti3'); - $filename = Str::uuid() . '.' . $bukti3->extension(); + if ($request->hasFile('bukti_transport_ankot')) { + $bukti_transport_ankot = $request->file('bukti_transport_ankot'); + $filename = Str::uuid() . '.' . $bukti_transport_ankot->extension(); - $filePaths['bukti3'] = $folderPath . '/' . $filename; + $filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti3->getContent(), + $bukti_transport_ankot->getContent(), + $filename + ); + } + if ($request->hasFile('bukti_hotel')) { + $bukti_hotel = $request->file('bukti_hotel'); + $filename = Str::uuid() . '.' . $bukti_hotel->extension(); + + $filePaths['bukti_hotel'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti_hotel->getContent(), $filename ); } @@ -152,6 +168,13 @@ class FormUpCountryController extends Controller $formatted_sequence_number = str_pad($sequence_number, 4, '0', STR_PAD_LEFT); $expense_number = $region->code . '-' . $cabang->code . '-UPC-' . date('ym') . $formatted_sequence_number; + $data_nominal = [ + 'allowance' => $request->allowance ?? 0, + 'transport_dalkot' => $request->transport_dalkot ?? 0, + 'transport_ankot' => $request->transport_ankot ?? 0, + 'hotel' => $request->hotel ?? 0, + ]; + // Save the form data FormUpCountry::create([ 'expense_number' => $expense_number, @@ -160,14 +183,15 @@ class FormUpCountryController extends Controller 'tanggal' => $request->tanggal, 'tujuan' => $request->tujuan, 'jarak' => $request->jarak, - 'allowance' => $request->allowance, - 'transport_dalkot' => $request->transport_dalkot, - 'transport_ankot' => $request->transport_ankot, - 'hotel' => $request->hotel, - 'total' => $request->allowance + $request->transport_dalkot + $request->transport_ankot + $request->hotel, - 'bukti1' => $filePaths['bukti1'] ?? null, - 'bukti2' => $filePaths['bukti2'] ?? null, - 'bukti3' => $filePaths['bukti3'] ?? null, + 'allowance' => $data_nominal['allowance'], + 'transport_dalkot' => $data_nominal['transport_dalkot'], + 'transport_ankot' => $data_nominal['transport_ankot'], + 'hotel' => $data_nominal['hotel'], + 'total' => array_sum($data_nominal), + 'bukti_allowance' => $filePaths['bukti_allowance'] ?? null, + 'bukti_transport_dalkot' => $filePaths['bukti_transport_dalkot'] ?? null, + 'bukti_transport_ankot' => $filePaths['bukti_transport_ankot'] ?? null, + 'bukti_hotel' => $filePaths['bukti_hotel'] ?? null, 'account_number' => $kategori->account_number, 'status' => 'On Progress', ]); @@ -202,13 +226,14 @@ class FormUpCountryController extends Controller 'tanggal' => 'required', 'tujuan' => 'required', 'jarak' => 'required', - 'allowance' => 'required', - 'transport_dalkot' => 'required', - 'transport_ankot' => 'required', - 'hotel' => 'required', - 'bukti1' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], - 'bukti2' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], - 'bukti3' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'allowance' => 'nullable|numeric', + 'transport_dalkot' => 'nullable|numeric', + 'transport_ankot' => 'nullable|numeric', + 'hotel' => 'nullable|numeric', + 'bukti_allowance' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'bukti_transport_dalkot' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'bukti_transport_ankot' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'bukti_hotel' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], ]); $form = FormUpCountry::findOrfail($id); @@ -224,43 +249,62 @@ class FormUpCountryController extends Controller $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry'; - if ($request->hasFile('bukti1')) { - $bukti1 = $request->file('bukti1'); - $filename = Str::uuid() . '.' . $bukti1->extension(); + if ($request->hasFile('bukti_allowance')) { + $bukti_allowance = $request->file('bukti_allowance'); + $filename = Str::uuid() . '.' . $bukti_allowance->extension(); - $filePaths['bukti1'] = $folderPath . '/' . $filename; + $filePaths['bukti_allowance'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti1->getContent(), + $bukti_allowance->getContent(), $filename ); } - if ($request->hasFile('bukti2')) { - $bukti2 = $request->file('bukti2'); - $filename = Str::uuid() . '.' . $bukti2->extension(); + if ($request->hasFile('bukti_transport_dalkot')) { + $bukti_transport_dalkot = $request->file('bukti_transport_dalkot'); + $filename = Str::uuid() . '.' . $bukti_transport_dalkot->extension(); - $filePaths['bukti2'] = $folderPath . '/' . $filename; + $filePaths['bukti_transport_dalkot'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti2->getContent(), + $bukti_transport_dalkot->getContent(), $filename ); } - if ($request->hasFile('bukti3')) { - $bukti3 = $request->file('bukti3'); - $filename = Str::uuid() . '.' . $bukti3->extension(); + if ($request->hasFile('bukti_transport_ankot')) { + $bukti_transport_ankot = $request->file('bukti_transport_ankot'); + $filename = Str::uuid() . '.' . $bukti_transport_ankot->extension(); - $filePaths['bukti3'] = $folderPath . '/' . $filename; + $filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti3->getContent(), + $bukti_transport_ankot->getContent(), $filename ); } + if ($request->hasFile('bukti_hotel')) { + $bukti_hotel = $request->file('bukti_hotel'); + $filename = Str::uuid() . '.' . $bukti_hotel->extension(); + + $filePaths['bukti_hotel'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti_hotel->getContent(), + $filename + ); + } + + $data_nominal = [ + 'allowance' => $request->allowance ?? 0, + 'transport_dalkot' => $request->transport_dalkot ?? 0, + 'transport_ankot' => $request->transport_ankot ?? 0, + 'hotel' => $request->hotel ?? 0, + ]; // Save the form data $form->update([ @@ -268,14 +312,15 @@ class FormUpCountryController extends Controller 'tanggal' => $request->tanggal, 'tujuan' => $request->tujuan, 'jarak' => $request->jarak, - 'allowance' => $request->allowance, - 'transport_dalkot' => $request->transport_dalkot, - 'transport_ankot' => $request->transport_ankot, - 'hotel' => $request->hotel, - 'total' => $request->allowance + $request->transport_dalkot + $request->transport_ankot + $request->hotel, - 'bukti1' => $filePaths['bukti1'] ?? $form->bukti1, - 'bukti2' => $filePaths['bukti2'] ?? $form->bukti2, - 'bukti3' => $filePaths['bukti3'] ?? $form->bukti3, + 'allowance' => $data_nominal['allowance'], + 'transport_dalkot' => $data_nominal['transport_dalkot'], + 'transport_ankot' => $data_nominal['transport_ankot'], + 'hotel' => $data_nominal['hotel'], + 'total' => array_sum($data_nominal), + 'bukti_allowance' => $filePaths['bukti_allowance'] ?? $form->bukti_allowance, + 'bukti_transport_dalkot' => $filePaths['bukti_transport_dalkot'] ?? $form->bukti_transport_dalkot, + 'bukti_transport_ankot' => $filePaths['bukti_transport_ankot'] ?? $form->bukti_transport_ankot, + 'bukti_hotel' => $filePaths['bukti_hotel'] ?? $form->bukti_hotel, 'account_number' => $kategori->account_number, ]); @@ -300,7 +345,6 @@ class FormUpCountryController extends Controller 'approved_at' => now(), 'approved_by' => auth()->user()->id, 'status' => 'Approved', - 'approved_allowance' => $approved_data['allowance'], 'approved_transport_dalkot' => $approved_data['transport_dalkot'], 'approved_transport_ankot' => $approved_data['transport_ankot'], diff --git a/app/Models/FormUpCountry.php b/app/Models/FormUpCountry.php index 6fff4df..2a024dc 100644 --- a/app/Models/FormUpCountry.php +++ b/app/Models/FormUpCountry.php @@ -27,9 +27,10 @@ class FormUpCountry extends Model 'approved_transport_ankot', 'approved_hotel', 'approved_total', - 'bukti1', - 'bukti2', - 'bukti3', + 'bukti_allowance', + 'bukti_transport_dalkot', + 'bukti_transport_ankot', + 'bukti_hotel', 'account_number', 'status', 'approved_at', diff --git a/database/migrations/2025_01_03_134057_add_nullable_to_form_up_country.php b/database/migrations/2025_01_03_134057_add_nullable_to_form_up_country.php new file mode 100644 index 0000000..5aaf26a --- /dev/null +++ b/database/migrations/2025_01_03_134057_add_nullable_to_form_up_country.php @@ -0,0 +1,34 @@ +integer('allowance')->nullable()->change(); + $table->integer('transport_dalkot')->nullable()->change(); + $table->integer('transport_ankot')->nullable()->change(); + $table->integer('hotel')->nullable()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_up_country', function (Blueprint $table) { + $table->integer('allowance')->nullable(false)->change(); + $table->integer('transport_dalkot')->nullable(false)->change(); + $table->integer('transport_ankot')->nullable(false)->change(); + $table->integer('hotel')->nullable(false)->change(); + }); + } +}; diff --git a/database/migrations/2025_01_03_134342_changed_bukti_to_form_up_country.php b/database/migrations/2025_01_03_134342_changed_bukti_to_form_up_country.php new file mode 100644 index 0000000..092eff6 --- /dev/null +++ b/database/migrations/2025_01_03_134342_changed_bukti_to_form_up_country.php @@ -0,0 +1,44 @@ +dropColumn('bukti1'); + $table->dropColumn('bukti2'); + $table->dropColumn('bukti3'); + + $table->string('bukti_allowance')->after('approved_total')->nullable(); + $table->string('bukti_transport_dalkot')->after('bukti_allowance')->nullable(); + $table->string('bukti_transport_ankot')->after('bukti_transport_dalkot')->nullable(); + $table->string('bukti_hotel')->after('bukti_transport_ankot')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_up_country', function (Blueprint $table) { + // drop new bukti columns + $table->dropColumn('bukti_allowance'); + $table->dropColumn('bukti_transport_dalkot'); + $table->dropColumn('bukti_transport_ankot'); + $table->dropColumn('bukti_hotel'); + + $table->string('bukti1')->after('approved_total')->nullable()->change(); + $table->string('bukti2')->after('bukti1')->nullable()->change(); + $table->string('bukti3')->after('bukti2')->nullable()->change(); + }); + } +}; diff --git a/resources/views/backend/pages/dashboard/index.blade.php b/resources/views/backend/pages/dashboard/index.blade.php index ec2298a..f193e0a 100644 --- a/resources/views/backend/pages/dashboard/index.blade.php +++ b/resources/views/backend/pages/dashboard/index.blade.php @@ -90,7 +90,7 @@

Approved Meeting Seminar Expenses

- +
More info diff --git a/resources/views/backend/pages/forms/upcountry/create.blade.php b/resources/views/backend/pages/forms/upcountry/create.blade.php index 172b62c..c60c63a 100644 --- a/resources/views/backend/pages/forms/upcountry/create.blade.php +++ b/resources/views/backend/pages/forms/upcountry/create.blade.php @@ -31,7 +31,7 @@
- +
- +
- +
- +
- - + +
-
- - +
+ +
- - + +
- - + +
- - + +
- - + +
- - + + +
+
+ +
diff --git a/resources/views/backend/pages/forms/upcountry/edit.blade.php b/resources/views/backend/pages/forms/upcountry/edit.blade.php index 16043ff..5386eca 100644 --- a/resources/views/backend/pages/forms/upcountry/edit.blade.php +++ b/resources/views/backend/pages/forms/upcountry/edit.blade.php @@ -32,7 +32,7 @@
- +
- +
- +
- +
- - + +
-
- - +
+ +
- - + +
- - + +
- - + +
- - + +
- - + + +
+
+ +
diff --git a/resources/views/backend/pages/forms/upcountry/index.blade.php b/resources/views/backend/pages/forms/upcountry/index.blade.php index 3cd7a10..d500fac 100644 --- a/resources/views/backend/pages/forms/upcountry/index.blade.php +++ b/resources/views/backend/pages/forms/upcountry/index.blade.php @@ -91,9 +91,6 @@
- - - @if (auth()->user()->can('approval.approve')) @@ -125,33 +122,6 @@ - @endif - - - + - - - + @if (auth()->user()->can('approval.approve')) @@ -111,39 +110,14 @@ @foreach ($forms as $item) + - - - + + @@ -109,6 +110,7 @@ @foreach ($forms as $item) + diff --git a/routes/web.php b/routes/web.php index 4a87dd2..2be8723 100644 --- a/routes/web.php +++ b/routes/web.php @@ -113,6 +113,7 @@ Route::middleware(['auth:admin', 'menu'])->group(function () { // Meeting & Seminar Route::get('/meeting-seminar', [FormMeetingSeminarController::class, 'index'])->name('forms.meeting'); + Route::get('/meeting-seminar/detail/{id}', [FormMeetingSeminarController::class, 'detail'])->name('forms.meeting.detail'); Route::get('/meeting-seminar/create', [FormMeetingSeminarController::class, 'create'])->name('forms.meeting.create'); Route::post('/meeting-seminar/store', [FormMeetingSeminarController::class, 'store'])->name('forms.meeting.store'); Route::get('/meeting-seminar/edit/{id}', [FormMeetingSeminarController::class, 'edit'])->name('forms.meeting.edit'); From 2cd0ed39f98b2f34130a75673b8378c8d8a1f9cd Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Sat, 4 Jan 2025 13:20:08 +0700 Subject: [PATCH 4/7] added optional on input label --- .../backend/pages/forms/meeting/create.blade.php | 12 ++++++------ .../views/backend/pages/forms/meeting/edit.blade.php | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/views/backend/pages/forms/meeting/create.blade.php b/resources/views/backend/pages/forms/meeting/create.blade.php index b201ddc..acc744e 100644 --- a/resources/views/backend/pages/forms/meeting/create.blade.php +++ b/resources/views/backend/pages/forms/meeting/create.blade.php @@ -32,30 +32,30 @@
- +
- +
- +
- +
- +
- +
diff --git a/resources/views/backend/pages/forms/meeting/edit.blade.php b/resources/views/backend/pages/forms/meeting/edit.blade.php index 0ae7487..ea1c684 100644 --- a/resources/views/backend/pages/forms/meeting/edit.blade.php +++ b/resources/views/backend/pages/forms/meeting/edit.blade.php @@ -33,30 +33,30 @@
- +
- +
- +
- +
- +
- +
From fbde09292d23ffbf991650fd9b6f9a6c9d1fb937 Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Sat, 4 Jan 2025 13:53:53 +0700 Subject: [PATCH 5/7] added view detail expense for up country & meeting seminar --- .../Forms/FormMeetingSeminarController.php | 14 ++ .../Forms/FormUpCountryController.php | 16 ++ .../pages/forms/meeting/index.blade.php | 6 + .../pages/forms/meeting/view.blade.php | 116 +++++++++++++ .../pages/forms/upcountry/index.blade.php | 6 + .../pages/forms/upcountry/view.blade.php | 152 ++++++++++++++++++ routes/web.php | 2 + 7 files changed, 312 insertions(+) create mode 100644 resources/views/backend/pages/forms/meeting/view.blade.php create mode 100644 resources/views/backend/pages/forms/upcountry/view.blade.php diff --git a/app/Http/Controllers/Forms/FormMeetingSeminarController.php b/app/Http/Controllers/Forms/FormMeetingSeminarController.php index c766b3a..42cd22b 100644 --- a/app/Http/Controllers/Forms/FormMeetingSeminarController.php +++ b/app/Http/Controllers/Forms/FormMeetingSeminarController.php @@ -77,6 +77,20 @@ class FormMeetingSeminarController extends Controller return response()->json($form); } + public function view($id) + { + $this->checkAuthorization(auth()->user(), ['forms.country.view']); + + $form = FormMeetingSeminar::with('user')->findOrFail($id); + $form->bukti_allowance = $form->bukti_allowance ? NextCloudHelper::getFileUrl($form->bukti_allowance) : null; + $form->bukti_transport_ankot = $form->bukti_transport_ankot ? NextCloudHelper::getFileUrl($form->bukti_transport_ankot) : null; + $form->bukti_hotel = $form->bukti_hotel ? NextCloudHelper::getFileUrl($form->bukti_hotel) : null; + + return view('backend.pages.forms.meeting.view', [ + 'form' => $form, + ]); + } + public function create() { $this->checkAuthorization(auth()->user(), ['forms.meeting.create']); diff --git a/app/Http/Controllers/Forms/FormUpCountryController.php b/app/Http/Controllers/Forms/FormUpCountryController.php index d0f9fb1..a8b07f3 100644 --- a/app/Http/Controllers/Forms/FormUpCountryController.php +++ b/app/Http/Controllers/Forms/FormUpCountryController.php @@ -78,6 +78,22 @@ class FormUpCountryController extends Controller return response()->json($form); } + public function view($id) + { + $this->checkAuthorization(auth()->user(), ['forms.country.view']); + + $form = FormUpCountry::with(['rayon', 'user'])->findOrFail($id); + $form->bukti_allowance = $form->bukti_allowance ? NextCloudHelper::getFileUrl($form->bukti_allowance) : null; + $form->bukti_transport_dalkot = $form->bukti_transport_dalkot ? NextCloudHelper::getFileUrl($form->bukti_transport_dalkot) : null; + $form->bukti_transport_ankot = $form->bukti_transport_ankot ? NextCloudHelper::getFileUrl($form->bukti_transport_ankot) : null; + $form->bukti_hotel = $form->bukti_hotel ? NextCloudHelper::getFileUrl($form->bukti_hotel) : null; + + return view('backend.pages.forms.upcountry.view', [ + 'form' => $form, + 'rayons' => Rayon::all() + ]); + } + public function create() { $this->checkAuthorization(auth()->user(), ['forms.country.create']); diff --git a/resources/views/backend/pages/forms/meeting/index.blade.php b/resources/views/backend/pages/forms/meeting/index.blade.php index 4c18483..7bc9aa3 100644 --- a/resources/views/backend/pages/forms/meeting/index.blade.php +++ b/resources/views/backend/pages/forms/meeting/index.blade.php @@ -187,6 +187,12 @@ @endif
@endif
Jarak Total Total ApprovedBukti 1Bukti 2Bukti 3 Account Number Status - @if ($item->bukti1) - - Download - - @else - - - @endif - - @if ($item->bukti2) - - Download - - @else - - - @endif - - @if ($item->bukti3) - - Download - - @else - - - @endif - {{ $item->account_number }} @if ($item->status == 'On Progress') @@ -168,8 +138,8 @@ @if ($item->status == 'On Progress')
@@ -294,13 +264,16 @@ Jarak:
  • - Bukti 1: + Bukti Allowance:
  • - Bukti 2: + Bukti Transport Dalam Kota:
  • - Bukti 3: + Bukti Transport Antar Kota: +
  • +
  • + Bukti Hotel:
  • Please select the items you want to approve:

    @@ -381,6 +354,7 @@ $('#modalContent').addClass('d-none'); $('#approveForm').attr('action', approveUrl); // Set the form action + $('#loadingSpinner').addClass('d-flex'); $('#approveModal').modal('show'); // Show the modal // Get detail from /forms/up-country/detail/{id} @@ -413,9 +387,11 @@ })); $('#tujuan').text(data.tujuan); $('#jarak').text(data.jarak + ' km'); - $('#bukti1').html(data.bukti1 ? 'Download' : '-'); - $('#bukti2').html(data.bukti2 ? 'Download' : '-'); - $('#bukti3').html(data.bukti3 ? 'Download' : '-'); + + $('#bukti_allowance').html(data.bukti_allowance ? 'Download' : '-'); + $('#bukti_transport_dalkot').html(data.bukti_transport_dalkot ? 'Download' : '-'); + $('#bukti_transport_ankot').html(data.bukti_transport_ankot ? 'Download' : '-'); + $('#bukti_hotel').html(data.bukti_hotel ? 'Download' : '-'); // Hide spinner and show content $('#loadingSpinner').hide(); From ec02c3f024065d57395d206fd5a9cbc245a14250 Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Sat, 4 Jan 2025 13:16:00 +0700 Subject: [PATCH 3/7] revised form meeting seminar --- .../Forms/FormMeetingSeminarController.php | 190 ++++++++------ app/Models/FormMeetingSeminar.php | 6 +- ...7_add_nullable_to_form_meeting_seminar.php | 32 +++ ..._changed_bukti_to_form_meeting_seminar.php | 40 +++ .../pages/forms/meeting/create.blade.php | 26 +- .../pages/forms/meeting/edit.blade.php | 26 +- .../pages/forms/meeting/index.blade.php | 239 ++++++++++++++---- .../pages/forms/upcountry/index.blade.php | 2 + routes/web.php | 1 + 9 files changed, 408 insertions(+), 154 deletions(-) create mode 100644 database/migrations/2025_01_04_050827_add_nullable_to_form_meeting_seminar.php create mode 100644 database/migrations/2025_01_04_051006_changed_bukti_to_form_meeting_seminar.php diff --git a/app/Http/Controllers/Forms/FormMeetingSeminarController.php b/app/Http/Controllers/Forms/FormMeetingSeminarController.php index d6cb39d..c766b3a 100644 --- a/app/Http/Controllers/Forms/FormMeetingSeminarController.php +++ b/app/Http/Controllers/Forms/FormMeetingSeminarController.php @@ -65,6 +65,18 @@ class FormMeetingSeminarController extends Controller ]); } + public function detail($id) + { + $this->checkAuthorization(auth()->user(), ['forms.country.view']); + + $form = FormMeetingSeminar::with('user')->findOrFail($id); + $form->bukti_allowance = $form->bukti_allowance ? NextCloudHelper::getFileUrl($form->bukti_allowance) : null; + $form->bukti_transport_ankot = $form->bukti_transport_ankot ? NextCloudHelper::getFileUrl($form->bukti_transport_ankot) : null; + $form->bukti_hotel = $form->bukti_hotel ? NextCloudHelper::getFileUrl($form->bukti_hotel) : null; + + return response()->json($form); + } + public function create() { $this->checkAuthorization(auth()->user(), ['forms.meeting.create']); @@ -77,12 +89,12 @@ class FormMeetingSeminarController extends Controller $this->checkAuthorization(auth()->user(), ['forms.meeting.create']); $request->validate([ - 'allowance' => 'required', - 'transport_ankot' => 'required', - 'hotel' => 'required', - 'bukti1' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], - 'bukti2' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], - 'bukti3' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'allowance' => 'nullable|numeric', + 'transport_ankot' => 'nullable|numeric', + 'hotel' => 'nullable|numeric', + 'bukti_allowance' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'bukti_transport_ankot' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'bukti_hotel' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], ]); $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; @@ -92,40 +104,40 @@ class FormMeetingSeminarController extends Controller $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/meeting'; - if ($request->hasFile('bukti1')) { - $bukti1 = $request->file('bukti1'); - $filename = Str::uuid() . '.' . $bukti1->extension(); + if ($request->hasFile('bukti_allowance')) { + $bukti_allowance = $request->file('bukti_allowance'); + $filename = Str::uuid() . '.' . $bukti_allowance->extension(); - $filePaths['bukti1'] = $folderPath . '/' . $filename; + $filePaths['bukti_allowance'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti1->getContent(), + $bukti_allowance->getContent(), $filename ); } - if ($request->hasFile('bukti2')) { - $bukti2 = $request->file('bukti2'); - $filename = Str::uuid() . '.' . $bukti2->extension(); + if ($request->hasFile('bukti_transport_ankot')) { + $bukti_transport_ankot = $request->file('bukti_transport_ankot'); + $filename = Str::uuid() . '.' . $bukti_transport_ankot->extension(); - $filePaths['bukti2'] = $folderPath . '/' . $filename; + $filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti2->getContent(), + $bukti_transport_ankot->getContent(), $filename ); } - if ($request->hasFile('bukti3')) { - $bukti3 = $request->file('bukti3'); - $filename = Str::uuid() . '.' . $bukti3->extension(); + if ($request->hasFile('bukti_hotel')) { + $bukti_hotel = $request->file('bukti_hotel'); + $filename = Str::uuid() . '.' . $bukti_hotel->extension(); - $filePaths['bukti3'] = $folderPath . '/' . $filename; + $filePaths['bukti_hotel'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti3->getContent(), + $bukti_hotel->getContent(), $filename ); } @@ -135,17 +147,23 @@ class FormMeetingSeminarController extends Controller $formatted_sequence_number = str_pad($sequence_number, 4, '0', STR_PAD_LEFT); $expense_number = $region->code . '-' . $cabang->code . '-MTG-' . date('ym') . $formatted_sequence_number; + $data_nominal = [ + 'allowance' => $request->allowance ?? 0, + 'transport_ankot' => $request->transport_ankot ?? 0, + 'hotel' => $request->hotel ?? 0, + ]; + // Save the form data FormMeetingSeminar::create([ 'expense_number' => $expense_number, 'user_id' => auth()->user()->id, - 'allowance' => $request->allowance, - 'transport_ankot' => $request->transport_ankot, - 'hotel' => $request->hotel, - 'total' => $request->allowance + $request->transport_ankot + $request->hotel, - 'bukti1' => $filePaths['bukti1'] ?? null, - 'bukti2' => $filePaths['bukti2'] ?? null, - 'bukti3' => $filePaths['bukti3'] ?? null, + 'allowance' => $data_nominal['allowance'], + 'transport_ankot' => $data_nominal['transport_ankot'], + 'hotel' => $data_nominal['hotel'], + 'total' => array_sum($data_nominal), + 'bukti_allowance' => $filePaths['bukti_allowance'] ?? null, + 'bukti_transport_ankot' => $filePaths['bukti_transport_ankot'] ?? null, + 'bukti_hotel' => $filePaths['bukti_hotel'] ?? null, 'account_number' => $kategori->account_number, 'status' => 'On Progress', ]); @@ -175,12 +193,12 @@ class FormMeetingSeminarController extends Controller $this->checkAuthorization(auth()->user(), ['forms.meeting.edit']); $request->validate([ - 'allowance' => 'required', - 'transport_ankot' => 'required', - 'hotel' => 'required', - 'bukti1' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], - 'bukti2' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], - 'bukti3' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'allowance' => 'nullable|numeric', + 'transport_ankot' => 'nullable|numeric', + 'hotel' => 'nullable|numeric', + 'bukti_allowance' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'bukti_transport_ankot' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], + 'bukti_hotel' => ['nullable', 'file', 'max:51200', new FileType(['php', 'exe', 'js', 'sh', 'bat', 'exe', 'sh', 'php', 'vbs'])], ]); $form = FormMeetingSeminar::findOrfail($id); @@ -196,53 +214,59 @@ class FormMeetingSeminarController extends Controller $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/meeting'; - if ($request->hasFile('bukti1')) { - $bukti1 = $request->file('bukti1'); - $filename = Str::uuid() . '.' . $bukti1->extension(); + if ($request->hasFile('bukti_allowance')) { + $bukti_allowance = $request->file('bukti_allowance'); + $filename = Str::uuid() . '.' . $bukti_allowance->extension(); - $filePaths['bukti1'] = $folderPath . '/' . $filename; + $filePaths['bukti_allowance'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti1->getContent(), + $bukti_allowance->getContent(), $filename ); } - if ($request->hasFile('bukti2')) { - $bukti2 = $request->file('bukti2'); - $filename = Str::uuid() . '.' . $bukti2->extension(); + if ($request->hasFile('bukti_transport_ankot')) { + $bukti_transport_ankot = $request->file('bukti_transport_ankot'); + $filename = Str::uuid() . '.' . $bukti_transport_ankot->extension(); - $filePaths['bukti2'] = $folderPath . '/' . $filename; + $filePaths['bukti_transport_ankot'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti2->getContent(), + $bukti_transport_ankot->getContent(), $filename ); } - if ($request->hasFile('bukti3')) { - $bukti3 = $request->file('bukti3'); - $filename = Str::uuid() . '.' . $bukti3->extension(); + if ($request->hasFile('bukti_hotel')) { + $bukti_hotel = $request->file('bukti_hotel'); + $filename = Str::uuid() . '.' . $bukti_hotel->extension(); - $filePaths['bukti3'] = $folderPath . '/' . $filename; + $filePaths['bukti_hotel'] = $folderPath . '/' . $filename; NextCloudHelper::uploadFile( $folderPath, - $bukti3->getContent(), + $bukti_hotel->getContent(), $filename ); } + $data_nominal = [ + 'allowance' => $request->allowance ?? 0, + 'transport_ankot' => $request->transport_ankot ?? 0, + 'hotel' => $request->hotel ?? 0, + ]; + // Save the form data $form->update([ - 'allowance' => $request->allowance, - 'transport_ankot' => $request->transport_ankot, - 'hotel' => $request->hotel, + 'allowance' => $data_nominal['allowance'], + 'transport_ankot' => $data_nominal['transport_ankot'], + 'hotel' => $data_nominal['hotel'], 'total' => $request->allowance + $request->transport_ankot + $request->hotel, - 'bukti1' => $filePaths['bukti1'] ?? $form->bukti1, - 'bukti2' => $filePaths['bukti2'] ?? $form->bukti2, - 'bukti3' => $filePaths['bukti3'] ?? $form->bukti3, + 'bukti_allowance' => $filePaths['bukti_allowance'] ?? $form->bukti_allowance, + 'bukti_transport_ankot' => $filePaths['bukti_transport_ankot'] ?? $form->bukti_transport_ankot, + 'bukti_hotel' => $filePaths['bukti_hotel'] ?? $form->bukti_hotel, 'account_number' => $kategori->account_number, ]); @@ -251,21 +275,31 @@ class FormMeetingSeminarController extends Controller return redirect()->back(); } - public function approve($id) + public function approve(Request $request, $id) { $this->checkAuthorization(auth()->user(), ['approval.approve']); $form = FormMeetingSeminar::findOrfail($id); + $approved_data = [ + 'allowance' => $request->allowance ? $form->allowance : 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_ankot' => $approved_data['transport_ankot'], + 'approved_hotel' => $approved_data['hotel'], + 'approved_total' => array_sum($approved_data), ]); $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; + $tanggal = $form->created_at; $total = $form->total; // Collect all recipients @@ -287,12 +321,12 @@ class FormMeetingSeminarController extends Controller $phoneNumbers = array_unique($phoneNumbers); // Send bulk email - Mail::to($recipients)->send(new ExpenseApproved( - $name, - $expense_number, - $tanggal, - $total - )); + // Mail::to($recipients)->send(new ExpenseApproved( + // $name, + // $expense_number, + // $tanggal, + // $total + // )); // Send bulk WhatsApp message WhatsappHelper::approveExpense($phoneNumbers, $expense_number); @@ -321,7 +355,7 @@ class FormMeetingSeminarController extends Controller $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; + $tanggal = $form->created_at; $total = $form->total; // Collect all recipients @@ -343,12 +377,12 @@ class FormMeetingSeminarController extends Controller $phoneNumbers = array_unique($phoneNumbers); // Send bulk email - Mail::to($recipients)->send(new FinalApprove( - $name, - $expense_number, - $tanggal, - $total - )); + // Mail::to($recipients)->send(new FinalApprove( + // $name, + // $expense_number, + // $tanggal, + // $total + // )); // send whatsapp message WhatsappHelper::finalApprove($phoneNumbers, $expense_number); @@ -386,7 +420,7 @@ class FormMeetingSeminarController extends Controller $heads = $form->user->getCabangAndRegionHead(); $name = $form->user->name; $expense_number = $form->expense_number; - $tanggal = $form->tanggal; + $tanggal = $form->created_at; $total = $form->total; // Collect all recipients @@ -408,12 +442,12 @@ class FormMeetingSeminarController extends Controller $phoneNumbers = array_unique($phoneNumbers); // Send bulk email - Mail::to($recipients)->send(new ExpenseRejected( - $name, - $expense_number, - $tanggal, - $total - )); + // Mail::to($recipients)->send(new ExpenseRejected( + // $name, + // $expense_number, + // $tanggal, + // $total + // )); // Send bulk WhatsApp message WhatsappHelper::rejectExpense($phoneNumbers, $expense_number); diff --git a/app/Models/FormMeetingSeminar.php b/app/Models/FormMeetingSeminar.php index f0b8927..8a77b73 100644 --- a/app/Models/FormMeetingSeminar.php +++ b/app/Models/FormMeetingSeminar.php @@ -21,9 +21,9 @@ class FormMeetingSeminar extends Model 'approved_transport_ankot', 'approved_hotel', 'approved_total', - 'bukti1', - 'bukti2', - 'bukti3', + 'bukti_allowance', + 'bukti_transport_ankot', + 'bukti_hotel', 'account_number', 'status', 'approved_at', diff --git a/database/migrations/2025_01_04_050827_add_nullable_to_form_meeting_seminar.php b/database/migrations/2025_01_04_050827_add_nullable_to_form_meeting_seminar.php new file mode 100644 index 0000000..448ade7 --- /dev/null +++ b/database/migrations/2025_01_04_050827_add_nullable_to_form_meeting_seminar.php @@ -0,0 +1,32 @@ +integer('allowance')->nullable()->change(); + $table->integer('transport_ankot')->nullable()->change(); + $table->integer('hotel')->nullable()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_meeting_seminar', function (Blueprint $table) { + $table->integer('allowance')->nullable(false)->change(); + $table->integer('transport_ankot')->nullable(false)->change(); + $table->integer('hotel')->nullable(false)->change(); + }); + } +}; diff --git a/database/migrations/2025_01_04_051006_changed_bukti_to_form_meeting_seminar.php b/database/migrations/2025_01_04_051006_changed_bukti_to_form_meeting_seminar.php new file mode 100644 index 0000000..2d6b6b5 --- /dev/null +++ b/database/migrations/2025_01_04_051006_changed_bukti_to_form_meeting_seminar.php @@ -0,0 +1,40 @@ +dropColumn('bukti1'); + $table->dropColumn('bukti2'); + $table->dropColumn('bukti3'); + + $table->string('bukti_allowance')->after('approved_total')->nullable(); + $table->string('bukti_transport_ankot')->after('bukti_allowance')->nullable(); + $table->string('bukti_hotel')->after('bukti_transport_ankot')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('form_meeting_seminar', function (Blueprint $table) { + $table->dropColumn('bukti_allowance'); + $table->dropColumn('bukti_transport_ankot'); + $table->dropColumn('bukti_hotel'); + + $table->string('bukti1')->after('approved_total')->nullable()->change(); + $table->string('bukti2')->after('bukti1')->nullable()->change(); + $table->string('bukti3')->after('bukti2')->nullable()->change(); + }); + } +}; diff --git a/resources/views/backend/pages/forms/meeting/create.blade.php b/resources/views/backend/pages/forms/meeting/create.blade.php index 91d5657..b201ddc 100644 --- a/resources/views/backend/pages/forms/meeting/create.blade.php +++ b/resources/views/backend/pages/forms/meeting/create.blade.php @@ -33,30 +33,30 @@
    - + +
    +
    + +
    - +
    - - + +
    -
    - - +
    + +
    - - -
    -
    - - + +
    diff --git a/resources/views/backend/pages/forms/meeting/edit.blade.php b/resources/views/backend/pages/forms/meeting/edit.blade.php index 129236d..0ae7487 100644 --- a/resources/views/backend/pages/forms/meeting/edit.blade.php +++ b/resources/views/backend/pages/forms/meeting/edit.blade.php @@ -34,34 +34,34 @@
    - + +
    +
    + +
    - +
    - - + +
    - - + +
    - - -
    -
    - - + +
    - +
    diff --git a/resources/views/backend/pages/forms/meeting/index.blade.php b/resources/views/backend/pages/forms/meeting/index.blade.php index 312bd01..4c18483 100644 --- a/resources/views/backend/pages/forms/meeting/index.blade.php +++ b/resources/views/backend/pages/forms/meeting/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

    @@ -84,15 +84,14 @@
    #No Expense Nama Tanggal Allowance Transport Ankot Hotel TotalBukti 1Bukti 2Bukti 3Total Approved Account Number Status
    {{ $loop->iteration }}{{ $item->expense_number }} {{ $item->user->name }} {{ \Carbon\Carbon::parse($item->created_at)->locale('id')->isoFormat('D MMMM Y') }} {{ number_format($item->allowance, 0, ',', '.') }} {{ number_format($item->transport_ankot, 0, ',', '.') }} {{ number_format($item->hotel, 0, ',', '.') }} {{ number_format($item->total, 0, ',', '.') }} - @if ($item->bukti1) - - Download - - @else - - - @endif - - @if ($item->bukti2) - - Download - - @else - - - @endif - - @if ($item->bukti3) - - Download - - @else - - - @endif - {{ number_format($item->approved_total, 0, ',', '.') }} {{ $item->account_number }} @if ($item->status == 'On Progress') @@ -158,10 +132,10 @@ {{-- approve / reject button --}} @if ($item->status == 'On Progress') -
    - @csrf - @method('PUT') -
    @@ -239,20 +213,191 @@ +
    + +
    @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 + $('#loadingSpinner').addClass('d-flex'); + $('#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_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_ankot').data('value', data.transport_ankot); + $('#hotel').data('value', data.hotel); + + // Detail data + $('#user').text(data.user.name); + $('#expense_number').text(data.expense_number); + $('#tanggal').text(new Date(data.created_at).toLocaleDateString('id-ID', { + year: 'numeric', + month: 'long', + day: 'numeric' + })); + + $('#bukti_allowance').html(data.bukti_allowance ? 'Download' : '-'); + $('#bukti_transport_ankot').html(data.bukti_transport_ankot ? 'Download' : '-'); + $('#bukti_hotel').html(data.bukti_hotel ? '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/upcountry/index.blade.php b/resources/views/backend/pages/forms/upcountry/index.blade.php index d500fac..4503d4d 100644 --- a/resources/views/backend/pages/forms/upcountry/index.blade.php +++ b/resources/views/backend/pages/forms/upcountry/index.blade.php @@ -84,6 +84,7 @@
    #No Expense Nama Rayon Tanggal
    {{ $loop->iteration }}{{ $item->expense_number }} {{ $item->user->name }} {{ $item->rayon->code }} {{ \Carbon\Carbon::parse($item->tanggal)->locale('id')->isoFormat('D MMMM Y') }} + @if (auth()->user()->can('forms.meeting.view')) + + + + @endif + @if (auth()->user()->can('forms.meeting.edit')) diff --git a/resources/views/backend/pages/forms/meeting/view.blade.php b/resources/views/backend/pages/forms/meeting/view.blade.php new file mode 100644 index 0000000..cb5910b --- /dev/null +++ b/resources/views/backend/pages/forms/meeting/view.blade.php @@ -0,0 +1,116 @@ +@extends('layouts.app') + +@section('title') + Dashboard +@endsection + +@section('admin-content') + + +
    + +
    +
    +
    +
    +
    +
    + @csrf + @method('PUT') + @include('backend.layouts.partials.messages') +
    +
    +
    + + +
    +
    + + +
    +
    +
    + Lihat Bukti +
    +
    + + +
    +
    +
    + Lihat Bukti +
    +
    + +
    +
    + + +
    +
    +
    + Lihat Bukti +
    +
    + + +
    +
    + + {{-- back button --}} +
    + Kembali +
    +
    +
    +
    +
    +
    +
    + + +@endsection diff --git a/resources/views/backend/pages/forms/upcountry/index.blade.php b/resources/views/backend/pages/forms/upcountry/index.blade.php index 4503d4d..3fcc34c 100644 --- a/resources/views/backend/pages/forms/upcountry/index.blade.php +++ b/resources/views/backend/pages/forms/upcountry/index.blade.php @@ -193,6 +193,12 @@
    + @if (auth()->user()->can('forms.country.view')) + + + + @endif + @if (auth()->user()->can('forms.country.edit')) diff --git a/resources/views/backend/pages/forms/upcountry/view.blade.php b/resources/views/backend/pages/forms/upcountry/view.blade.php new file mode 100644 index 0000000..e48d08f --- /dev/null +++ b/resources/views/backend/pages/forms/upcountry/view.blade.php @@ -0,0 +1,152 @@ +@extends('layouts.app') + +@section('title') + Dashboard +@endsection + +@section('admin-content') + +
    + +
    +
    +
    +
    +
    +
    + @csrf + @method('PUT') + @include('backend.layouts.partials.messages') +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + Lihat Bukti +
    +
    + +
    +
    + + +
    +
    +
    + Lihat Bukti +
    +
    + + +
    +
    +
    + Lihat Bukti +
    +
    + + +
    +
    +
    + Lihat Bukti +
    +
    + + +
    +
    + + {{-- back button --}} +
    + Kembali +
    +
    +
    +
    +
    +
    +
    + + +@endsection diff --git a/routes/web.php b/routes/web.php index 2be8723..0304edd 100644 --- a/routes/web.php +++ b/routes/web.php @@ -77,6 +77,7 @@ Route::middleware(['auth:admin', 'menu'])->group(function () { // Up Country Route::get('/up-country', [FormUpCountryController::class, 'index'])->name('forms.up-country'); Route::get('/up-country/detail/{id}', [FormUpCountryController::class, 'detail'])->name('forms.up-country.detail'); + Route::get('/up-country/view/{id}', [FormUpCountryController::class, 'view'])->name('forms.up-country.view'); Route::get('/up-country/create', [FormUpCountryController::class, 'create'])->name('forms.up-country.create'); Route::post('/up-country/store', [FormUpCountryController::class, 'store'])->name('forms.up-country.store'); Route::get('/up-country/edit/{id}', [FormUpCountryController::class, 'edit'])->name('forms.up-country.edit'); @@ -114,6 +115,7 @@ Route::middleware(['auth:admin', 'menu'])->group(function () { // Meeting & Seminar Route::get('/meeting-seminar', [FormMeetingSeminarController::class, 'index'])->name('forms.meeting'); Route::get('/meeting-seminar/detail/{id}', [FormMeetingSeminarController::class, 'detail'])->name('forms.meeting.detail'); + Route::get('/meeting-seminar/view/{id}', [FormMeetingSeminarController::class, 'view'])->name('forms.meeting.view'); Route::get('/meeting-seminar/create', [FormMeetingSeminarController::class, 'create'])->name('forms.meeting.create'); Route::post('/meeting-seminar/store', [FormMeetingSeminarController::class, 'store'])->name('forms.meeting.store'); Route::get('/meeting-seminar/edit/{id}', [FormMeetingSeminarController::class, 'edit'])->name('forms.meeting.edit'); From cb1d1bb1e3eb4b9bf25f70e37535a7c6368cb28d Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Sat, 4 Jan 2025 14:00:05 +0700 Subject: [PATCH 6/7] redirect to previous page on login --- .../Backend/Auth/LoginController.php | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/app/Http/Controllers/Backend/Auth/LoginController.php b/app/Http/Controllers/Backend/Auth/LoginController.php index 31a3fe8..c211348 100644 --- a/app/Http/Controllers/Backend/Auth/LoginController.php +++ b/app/Http/Controllers/Backend/Auth/LoginController.php @@ -46,21 +46,21 @@ class LoginController extends Controller protected function redirectTo() { + // Check the current guard and redirect accordingly if (Auth::guard('admin')->check()) { // Redirect admins to their dashboard - return RouteServiceProvider::ADMIN_DASHBOARD; + return route('admin.dashboard'); } if (Auth::guard('web')->check()) { - // Redirect users to the home page - return redirect()->route('trx_order_elevation.index'); + // Redirect regular users to their home or default page + return route('trx_order_elevation.index'); } - // Default redirection (optional) + // Default redirection if no condition matches return '/login'; } - /** * login admin * @@ -75,39 +75,40 @@ class LoginController extends Controller 'password' => 'required', ]); + // Determine the intended redirect URL + $redirectTo = session()->pull('url.intended', $this->redirectTo()); + // Attempt to login if (Auth::guard('admin')->attempt(['email' => $request->email, 'password' => $request->password], $request->remember)) { - session()->flash('success', 'Successully Logged in !'); + session()->flash('success', 'Successfully Logged in!'); Session::put('current_guard', 'admin'); AuditTrailHelper::AuthAttempt('Login', 'User (' . $request->email . ') Logged in to the System'); - return redirect()->route('admin.dashboard'); + return redirect($redirectTo); } else if (Auth::guard('admin')->attempt(['username' => $request->email, 'password' => $request->password], $request->remember)) { - session()->flash('success', 'Successully Logged in !'); + session()->flash('success', 'Successfully Logged in!'); Session::put('current_guard', 'admin'); AuditTrailHelper::AuthAttempt('Login', 'User (' . $request->email . ') Logged in to the System'); - return redirect()->route('admin.dashboard'); - + return redirect($redirectTo); } else if (Auth::guard('web')->attempt(['username' => $request->email, 'password' => $request->password], $request->remember)) { - session()->flash('success', 'Successully Logged in !'); + session()->flash('success', 'Successfully Logged in!'); Session::put('current_guard', 'web'); AuditTrailHelper::AuthAttempt('Login', 'User (' . $request->email . ') Logged in to the System'); - return redirect()->route('admin.dashboard'); + return redirect($redirectTo); } else if (Auth::guard('web')->attempt(['email' => $request->email, 'password' => $request->password], $request->remember)) { - session()->flash('success', 'Successully Logged in !'); + session()->flash('success', 'Successfully Logged in!'); Session::put('current_guard', 'web'); AuditTrailHelper::AuthAttempt('Login', 'User (' . $request->email . ') Logged in to the System'); - return redirect()->route('admin.dashboard'); + return redirect($redirectTo); } - // error - session()->flash('error', 'Invalid email and password..'); + // Login failed + session()->flash('error', 'Invalid email or password.'); return back(); - } - + } /** * logout admin guard From 4210ab538427dffe1d51f2b49295b673e302302b Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Sat, 4 Jan 2025 14:09:28 +0700 Subject: [PATCH 7/7] added url to whatsapp notif, email soon --- app/Helpers/WhatsappHelper.php | 141 ++++++++++-------- .../Forms/FormMeetingSeminarController.php | 9 +- .../Forms/FormUpCountryController.php | 9 +- 3 files changed, 89 insertions(+), 70 deletions(-) diff --git a/app/Helpers/WhatsappHelper.php b/app/Helpers/WhatsappHelper.php index ed06a60..0847f35 100644 --- a/app/Helpers/WhatsappHelper.php +++ b/app/Helpers/WhatsappHelper.php @@ -8,81 +8,94 @@ use Illuminate\Support\Str; class WhatsappHelper { - public static function approveExpense($phones, $expense_number) + public static function approveExpense($phones, $expense_number, $url = null) { - $client = new Client(); + $client = new Client(); - $data = []; - foreach ($phones as $phone) { - $data[] = [ - 'phone' => $phone, - 'message' => 'Pengajuan pengeluaran anda dengan nomor *' . $expense_number . '* telah disetujui. Silahkan buka website untuk melihat detailnya.', - 'source' => 'web' - ]; - } + // Ensure the URL is formatted correctly + if ($url && !preg_match('/^https?:\/\//', $url)) { + $url = 'https://' . $url; + } - $response = $client->post(env('WABLAS_HOST') . '/api/v2/send-message', [ - 'headers' => [ - 'Authorization' => env('WABLAS_TOKEN'), - 'Content-Type' => 'application/json' - ], - 'json' => [ - 'data' => $data - ] - ]); + $data = []; + foreach ($phones as $phone) { + $data[] = [ + 'phone' => $phone, + 'message' => 'Pengajuan pengeluaran anda dengan nomor *' . $expense_number . '* telah disetujui. Silahkan buka link berikut untuk melihat detailnya: ' . $url, + 'source' => 'web' + ]; + } - return $response->getBody()->getContents(); + $response = $client->post(env('WABLAS_HOST') . '/api/v2/send-message', [ + 'headers' => [ + 'Authorization' => env('WABLAS_TOKEN'), + 'Content-Type' => 'application/json' + ], + 'json' => [ + 'data' => $data + ] + ]); + + return $response->getBody()->getContents(); } - public static function rejectExpense($phones, $expense_number) - { - $client = new Client(); + public static function rejectExpense($phones, $expense_number, $url = null) + { + $client = new Client(); - $data = []; - foreach ($phones as $phone) { - $data[] = [ - 'phone' => $phone, - 'message' => 'Pengajuan pengeluaran anda dengan nomor *' . $expense_number . '* telah ditolak. Silahkan buka website untuk melihat detailnya.', - 'source' => 'web' - ]; - } + if ($url && !preg_match('/^https?:\/\//', $url)) { + $url = 'https://' . $url; + } - $response = $client->post(env('WABLAS_HOST') . '/api/v2/send-message', [ - 'headers' => [ - 'Authorization' => env('WABLAS_TOKEN'), - 'Content-Type' => 'application/json' - ], - 'json' => [ - 'data' => $data - ] - ]); + $data = []; + foreach ($phones as $phone) { + $data[] = [ + 'phone' => $phone, + 'message' => 'Pengajuan pengeluaran anda dengan nomor *' . $expense_number . '* telah ditolak. Silahkan buka link berikut untuk melihat detailnya: ' . $url, + 'source' => 'web' + ]; + } - return $response->getBody()->getContents(); - } + $response = $client->post(env('WABLAS_HOST') . '/api/v2/send-message', [ + 'headers' => [ + 'Authorization' => env('WABLAS_TOKEN'), + 'Content-Type' => 'application/json' + ], + 'json' => [ + 'data' => $data + ] + ]); - public static function finalApprove($phones, $expense_number) - { - $client = new Client(); + return $response->getBody()->getContents(); + } - $data = []; - foreach ($phones as $phone) { - $data[] = [ - 'phone' => $phone, - 'message' => 'Pengajuan pengeluaran anda dengan nomor *' . $expense_number . '* telah ditutup karena telah selesai diproses. Silahkan buka website untuk melihat detailnya.', - 'source' => 'web' - ]; - } + public static function finalApprove($phones, $expense_number, $url = null) + { + $client = new Client(); - $response = $client->post(env('WABLAS_HOST') . '/api/v2/send-message', [ - 'headers' => [ - 'Authorization' => env('WABLAS_TOKEN'), - 'Content-Type' => 'application/json' - ], - 'json' => [ - 'data' => $data - ] - ]); + if ($url && !preg_match('/^https?:\/\//', $url)) { + $url = 'https://' . $url; + } - return $response->getBody()->getContents(); - } + $data = []; + foreach ($phones as $phone) { + $data[] = [ + 'phone' => $phone, + 'message' => 'Pengajuan pengeluaran anda dengan nomor *' . $expense_number . '* telah ditutup karena telah selesai diproses. Silahkan buka link berikut untuk melihat detailnya: ' . $url, + 'source' => 'web' + ]; + } + + $response = $client->post(env('WABLAS_HOST') . '/api/v2/send-message', [ + 'headers' => [ + 'Authorization' => env('WABLAS_TOKEN'), + 'Content-Type' => 'application/json' + ], + 'json' => [ + 'data' => $data + ] + ]); + + return $response->getBody()->getContents(); + } } diff --git a/app/Http/Controllers/Forms/FormMeetingSeminarController.php b/app/Http/Controllers/Forms/FormMeetingSeminarController.php index 42cd22b..58be413 100644 --- a/app/Http/Controllers/Forms/FormMeetingSeminarController.php +++ b/app/Http/Controllers/Forms/FormMeetingSeminarController.php @@ -343,7 +343,8 @@ class FormMeetingSeminarController extends Controller // )); // Send bulk WhatsApp message - WhatsappHelper::approveExpense($phoneNumbers, $expense_number); + $url = route('forms.meeting.view', $form->id); + WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Meeting Seminar (' . $form->expense_number . ')'); session()->flash('success', 'Form has been approved.'); @@ -399,7 +400,8 @@ class FormMeetingSeminarController extends Controller // )); // send whatsapp message - WhatsappHelper::finalApprove($phoneNumbers, $expense_number); + $url = route('forms.meeting.view', $form->id); + WhatsappHelper::finalApprove($phoneNumbers, $expense_number, $url); AuditTrailHelper::AddAuditTrail('Final Approve', 'Final Approve Expense at Form Meeting Seminar (' . $form->expense_number . ')'); session()->flash('success', 'Form has been final approved.'); @@ -464,7 +466,8 @@ class FormMeetingSeminarController extends Controller // )); // Send bulk WhatsApp message - WhatsappHelper::rejectExpense($phoneNumbers, $expense_number); + $url = route('forms.meeting.view', $form->id); + WhatsappHelper::rejectExpense($phoneNumbers, $expense_number, $url); AuditTrailHelper::AddAuditTrail('Reject', 'Reject Expense at Form Meeting Seminar (' . $form->expense_number . ')'); session()->flash('success', 'Form has been rejected.'); diff --git a/app/Http/Controllers/Forms/FormUpCountryController.php b/app/Http/Controllers/Forms/FormUpCountryController.php index a8b07f3..404bb7a 100644 --- a/app/Http/Controllers/Forms/FormUpCountryController.php +++ b/app/Http/Controllers/Forms/FormUpCountryController.php @@ -401,7 +401,8 @@ class FormUpCountryController extends Controller // )); // send whatsapp message - WhatsappHelper::approveExpense($phoneNumbers, $expense_number); + $url = route('forms.up-country.view', $form->id); + WhatsappHelper::approveExpense($phoneNumbers, $expense_number, $url); AuditTrailHelper::AddAuditTrail('Approve', 'Approve Expense at Form Entertainment Presentation (' . $form->expense_number . ')'); session()->flash('success', 'Form has been approved.'); @@ -450,7 +451,8 @@ class FormUpCountryController extends Controller // )); // send whatsapp message - WhatsappHelper::rejectExpense($phoneNumbers, $expense_number); + $url = route('forms.up-country.view', $form->id); + WhatsappHelper::rejectExpense($phoneNumbers, $expense_number, $url); AuditTrailHelper::AddAuditTrail('Reject', 'Reject Expense at Form Entertainment Presentation (' . $form->expense_number . ')'); session()->flash('success', 'Form has been rejected.'); @@ -506,7 +508,8 @@ class FormUpCountryController extends Controller // )); // send whatsapp message - WhatsappHelper::finalApprove($phoneNumbers, $expense_number); + $url = route('forms.up-country.view', $form->id); + WhatsappHelper::finalApprove($phoneNumbers, $expense_number, $url); AuditTrailHelper::AddAuditTrail('Final Approve', 'Final Approve Expense at Form Entertainment Presentation (' . $form->expense_number . ')'); session()->flash('success', 'Form has been final approved.');