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 @@
Approved Expenses