diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php index 5c9351e..1f6a711 100644 --- a/app/Helpers/Lpj.php +++ b/app/Helpers/Lpj.php @@ -134,7 +134,7 @@ if ($penawaran) { $isNum = substr($maxCode, 2); // memastikan string ke 3 s/d 8 adalan numiric $isNP = substr($maxCode, 0, 2); - if ((8 == strlen($maxCode)) && ("NP" == $isNP) && (isNumeric($isNum))) { + if ((8 == strlen($maxCode)) && ("NP" == $isNP) && (ctype_digit($isNum))) { $code_penawaran_last = substr($maxCode, -4); $year_penawaran_last = Carbon::parse($penawaran->created_at)->year; $year_now = Carbon::now()->year; @@ -149,11 +149,6 @@ return 'NP' . Carbon::now()->format('y') . $noUrutAkhirString; } - function isNumeric($str) - { - return ctype_digit($str); - } - // generate last penawaran.no_spk function onLastnumberCodePenawaranSPK($jenis_laporan_code) : string @@ -188,46 +183,7 @@ function onRomawi(int $bln) : string { - switch ($bln) { - case 1: - return "I"; - break; - case 2: - return "II"; - break; - case 3: - return "III"; - break; - case 4: - return "IV"; - break; - case 5: - return "V"; - break; - case 6: - return "VI"; - break; - case 7: - return "VII"; - break; - case 8: - return "VIII"; - break; - case 9: - return "IX"; - break; - case 10: - return "X"; - break; - case 11: - return "XI"; - break; - case 12: - return "XII"; - break; - - } - + return convertToRoman($bln); } function penyebut($nilai) @@ -304,15 +260,6 @@ return $hariKerja; } - function holidays() - { - return HolidayCalendar::pluck('date')->map( - function ($item) { - return Carbon::parse($item)->format('Y-m-d'); - }, - )->toArray(); - } - function countPermohonanForUser($userId) { $validStatuses = [ diff --git a/app/Http/Controllers/NocController.php b/app/Http/Controllers/NocController.php index 87a50b8..d7fb9ce 100644 --- a/app/Http/Controllers/NocController.php +++ b/app/Http/Controllers/NocController.php @@ -6,6 +6,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Modules\Lpj\Http\Requests\NocRequest; + use Modules\Lpj\Models\Noc; use Modules\Lpj\Models\PenawaranTender; use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\PersetujuanPenawaran; @@ -43,26 +44,34 @@ $status = "persetujuan-penawaran"; } - $persetujuanPenawaran = PersetujuanPenawaran::updateOrCreate( - ['penawaran_id' => $validated['penawaran_id']], - $validated, + + $dataNoc = [ + 'nominal_bayar' => $validated['nominal_bayar'], + 'tanggal_pembayaran' => date('Y-m-d'), + 'status_bayar' => $validated['nominal_bayar'] < $validated['total_harus_bayar'] ? false : true, + 'catatan_noc' => $validated['catatan_noc'], + ]; + $noc = Noc::updateOrCreate( + [ + 'permohonan_id' => $validated['permohonan_id'], + 'persetujuan_penawaran_id' => $validated['persetujuan_penawaran_id'] + ],$dataNoc ); - $folderPath = 'noc/' . $validated['penawaran_id']; + $folderPath = 'noc/' . request()->get('penawaran_id'); if ($request->hasFile('bukti_ksl')) { - $persetujuanPenawaran->bukti_ksl = $request->file('bukti_ksl')->store( + $noc->bukti_ksl = $request->file('bukti_ksl')->store( $folderPath, 'public', ); } - - $persetujuanPenawaran->save(); + $noc->save(); // Update the status of the related permohonan to 'spk' $permohonan = Permohonan::find(request()->get('permohonan_id')); if ($permohonan) { - $permohonan->status_bayar = request()->get('status_bayar'); + $permohonan->status_bayar = request()->get('status_pembayar'); if ($permohonan->jenis_penilaian_id == 2) { $permohonan->status = $status; } @@ -109,16 +118,14 @@ /** * Display the specified resource. */ - public function show($id) { } + public function show($id) {} /** * Show the form for editing the specified resource. */ public function edit($id) { - $persetujuanPenawaran = PersetujuanPenawaran::where('id', $id)->with( - ['penawaran.detail', 'penawaran.permohonan.debiture', 'permohonan'], - )->first(); + $persetujuanPenawaran = PersetujuanPenawaran::where('id', $id)->first(); return view('lpj::noc.form', compact('persetujuanPenawaran')); } @@ -181,10 +188,23 @@ 'nomor_registrasi' => $persetujuanPenawaran->permohonan->nomor_registrasi ?? $persetujuanPenawaran->penawaran->nomor_registrasi, 'nama_debitur' => $persetujuanPenawaran->permohonan->debiture->name ?? $persetujuanPenawaran->penawaran->permohonan->debiture->name, 'cabang' => $persetujuanPenawaran->permohonan->branch->name ?? $persetujuanPenawaran->penawaran->permohonan->branch->name, - 'tanggal_setor' => formatTanggalIndonesia($persetujuanPenawaran->created_at, true), - 'nominal_bayar' => format_currency($persetujuanPenawaran->nominal_bayar ?? 0), - 'bukti_ksl' => $persetujuanPenawaran->bukti_ksl ?? null, - 'tanggal_penyelesaian' => formatTanggalIndonesia($persetujuanPenawaran->updated_at, true), + 'tanggal_setor' => dateFormat( + $persetujuanPenawaran->moc->created_at ?? $persetujuanPenawaran->created_at, + true, + ), + 'nominal_bayar' => currencyFormat( + $persetujuanPenawaran->noc->nominal_bayar ?? $persetujuanPenawaran->nominal_bayar ?? 0, + ), + 'bukti_ksl' => $persetujuanPenawaran->noc->bukti_ksl ?? $persetujuanPenawaran->bukti_ksl ?? null, + 'memo_penyelesaian' => $persetujuanPenawaran->noc->memo_penyelesaian ?? $persetujuanPenawaran->memo_penyelesaian ?? null, + 'nominal_penyelesaian' => currencyFormat( + $persetujuanPenawaran->noc->nominal_penyelesaian ?? $persetujuanPenawaran->nominal_penyelesaian ?? 0, + ), + 'bukti_penyelesaian' => $persetujuanPenawaran->noc->bukti_penyelesaian ?? $persetujuanPenawaran->bukti_penyelesaian ?? null, + 'tanggal_penyelesaian' => dateFormat( + $persetujuanPenawaran->noc->tanggal_penyelesaian ?? $persetujuanPenawaran->updated_at, + true, + ), ]; }); diff --git a/app/Http/Controllers/PenilaiController.php b/app/Http/Controllers/PenilaiController.php index fe20028..b3c498f 100644 --- a/app/Http/Controllers/PenilaiController.php +++ b/app/Http/Controllers/PenilaiController.php @@ -1056,14 +1056,14 @@ class PenilaiController extends Controller $data = []; - $kategoriUnik = ['tanah', 'bangunan', 'apartemen-kantor', 'alat-berat', 'mesin', 'kendaraan', 'pesawat', 'kapal', 'sarana_pelengkap_penilai']; + $kategoriUnik = ['tanah', 'bangunan', 'apartemen-kantor', 'alat-berat', 'mesin', 'kendaraan', 'pesawat', 'kapal', 'sarana_pelengkap_penilai']; foreach ($kategoriUnik as $kategori) { // Dynamically generate keys $luasKey = 'luas_' . $kategori; $nilaiKey1 = 'nilai_' . $kategori . '_1'; $nilaiKey2 = 'nilai_' . $kategori . '_2'; - + // Collect data if exists if ($request->has($luasKey)) { $data[$luasKey] = $request->input($luasKey); @@ -1075,7 +1075,7 @@ class PenilaiController extends Controller $data[$nilaiKey2] = $request->input($nilaiKey2); } } - + $data['total_nilai_pasar_wajar'] = $request->input('total_nilai_pasar_wajar'); $data['likuidasi'] = $request->input('likuidasi'); $data['likuidasi_nilai_1'] = $request->input('likuidasi_nilai_1'); diff --git a/app/Http/Controllers/PermohonanController.php b/app/Http/Controllers/PermohonanController.php index 0c5c05b..da92c4a 100644 --- a/app/Http/Controllers/PermohonanController.php +++ b/app/Http/Controllers/PermohonanController.php @@ -1,489 +1,518 @@ historyService = $historyService; - } + public $user; + protected $historyService; - public function index() - { - return view('lpj::permohonan.index'); - } - - public function store(PermohonanRequest $request) - { - $validate = $request->validated(); - if ($validate) { - try { - // Process file upload - $filePath = null; - if ($request->hasFile('attachment')) { - $file = $request->file('attachment'); - $fileName = time() . '_' . $file->getClientOriginalName(); - $filePath = $file->storeAs('permohonan_attachments', $fileName, 'public'); - } - - // Get keterangan if provided - $keterangan = $request->input('keterangan') ?? null; - - - // Save to database - $permohonan = Permohonan::create($validate); - - // Create history - $this->historyService->createHistory( - $permohonan, - $validate['status'], - $keterangan, - [], // beforeRequest is empty for new permohonan - $permohonan->toArray(), - $filePath, - ); - - $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get(); - if (count($documents) < 1) { - return redirect()->route('debitur.jaminan.create', array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]))->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu'); - } - return redirect() - ->route('permohonan.index')->with('success', 'Permohonan created successfully'); - } catch (Exception $e) { - return redirect() - ->route('permohonan.create')->with('error', 'Failed to create permohonan' . $e->getMessage()); - } - } else { - return redirect() - ->route('permohonan.create')->with('success', 'error naon iye')->withInput(); + public function __construct(PermohonanHistoryService $historyService) + { + $this->historyService = $historyService; } - } - public function create() - { - return view('lpj::permohonan.create'); - } + public function index() + { + return view('lpj::permohonan.index'); + } - public function createPermohonan($debitur) - { - $branches = Branch::all(); - $debitur = Debiture::find($debitur); - $tujuanPenilaian = TujuanPenilaian::all(); - $status = StatusPermohonan::all(); - $fasilitasKredit = JenisFasilitasKredit::all(); - $plafond = NilaiPlafond::all(); + public function store(PermohonanRequest $request) + { + $validate = $request->validated(); + if ($validate) { + try { + // Process file upload + $filePath = null; + if ($request->hasFile('attachment')) { + $file = $request->file('attachment'); + $fileName = time() . '_' . $file->getClientOriginalName(); + $filePath = $file->storeAs('permohonan_attachments', $fileName, 'public'); + } - return view( - 'lpj::permohonan.form', - compact('branches', 'debitur', 'tujuanPenilaian', 'status', 'fasilitasKredit', 'plafond'), - ); - } + // Get keterangan if provided + $keterangan = $request->input('keterangan') ?? null; - public function edit($id) - { - $permohonan = Permohonan::find($id); - $branches = Branch::all(); - $debitur = Debiture::find($permohonan->debiture_id); - $tujuanPenilaian = TujuanPenilaian::all(); - $status = StatusPermohonan::all(); - $provinces = Province::all(); - $cities = City::where('province_code', $debitur->province_code)->get(); - $districts = District::where('city_code', $debitur->city_code)->get(); - $villages = Village::where('district_code', $debitur->district_code)->get(); - $documents = DokumenJaminan::with('pemilik', 'detail')->where('debiture_id', $id)->get(); - $fasilitasKredit = JenisFasilitasKredit::all(); - $plafond = NilaiPlafond::all(); + // Save to database + $permohonan = Permohonan::create($validate); - return view( - 'lpj::permohonan.form', - compact( - 'permohonan', - 'branches', - 'debitur', - 'tujuanPenilaian', - 'status', - 'provinces', - 'cities', - 'districts', - 'villages', - 'documents', - 'fasilitasKredit', - 'plafond', - ), - ); - } + // Create history + $this->historyService->createHistory( + $permohonan, + $validate['status'], + $keterangan, + [], // beforeRequest is empty for new permohonan + $permohonan->toArray(), + $filePath, + ); - public function update(PermohonanRequest $request, $id) - { - $permohonan = Permohonan::findOrFail($id); - $beforeRequest = $permohonan->toArray(); - - $validate = $request->validated(); - if ($validate) { - try { - // Update in database - - if ($permohonan->status == 'revisi') { - $validate['status'] = 'order'; + $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get(); + if (count($documents) < 1) { + return redirect()->route( + 'debitur.jaminan.create', + array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]), + )->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu'); + } + return redirect() + ->route('permohonan.index')->with('success', 'Permohonan created successfully'); + } catch (Exception $e) { + return redirect() + ->route('permohonan.create')->with('error', 'Failed to create permohonan' . $e->getMessage()); } - $permohonan->update($validate); - - $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get(); - if (count($documents) < 1) { - return redirect()->route('debitur.jaminan.create', array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]))->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu'); - } - + } else { return redirect() - ->route('permohonan.index')->with('success', 'Permohonan updated successfully'); - } catch (Exception $e) { - return redirect() - ->route('permohonan.edit', $id)->with('error', 'Failed to update permohonan'); + ->route('permohonan.create')->with('success', 'error naon iye')->withInput(); } } - } - public function destroy($id) - { - try { - // Delete from database + public function create() + { + return view('lpj::permohonan.create'); + } + + public function createPermohonan($debitur) + { + $branches = Branch::all(); + $debitur = Debiture::find($debitur); + $tujuanPenilaian = TujuanPenilaian::all(); + $status = StatusPermohonan::all(); + $fasilitasKredit = JenisFasilitasKredit::all(); + $plafond = NilaiPlafond::all(); + + return view( + 'lpj::permohonan.form', + compact('branches', 'debitur', 'tujuanPenilaian', 'status', 'fasilitasKredit', 'plafond'), + ); + } + + public function edit($id) + { + $permohonan = Permohonan::find($id); + $branches = Branch::all(); + $debitur = Debiture::find($permohonan->debiture_id); + $tujuanPenilaian = TujuanPenilaian::all(); + $status = StatusPermohonan::all(); + $provinces = Province::all(); + $cities = City::where('province_code', $debitur->province_code)->get(); + $districts = District::where('city_code', $debitur->city_code)->get(); + $villages = Village::where('district_code', $debitur->district_code)->get(); + $documents = DokumenJaminan::with('pemilik', 'detail')->where('debiture_id', $id)->get(); + + $fasilitasKredit = JenisFasilitasKredit::all(); + $plafond = NilaiPlafond::all(); + + return view( + 'lpj::permohonan.form', + compact( + 'permohonan', + 'branches', + 'debitur', + 'tujuanPenilaian', + 'status', + 'provinces', + 'cities', + 'districts', + 'villages', + 'documents', + 'fasilitasKredit', + 'plafond', + ), + ); + } + + public function destroy($id) + { + try { + // Delete from database + $permohonan = Permohonan::find($id); + $permohonan->delete(); + + echo json_encode(['success' => true, 'message' => 'Permohonan deleted successfully']); + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Failed to delete permohonan']); + } + } + + public function dataForDatatables(Request $request) + { + if (is_null($this->user) || !$this->user->can('debitur.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query = Permohonan::query(); + + if (!Auth::user()->hasAnyRole(['administrator'])) { + $query = $query->where('branch_id', Auth::user()->branch_id); + } + + $query = $query->orderBy('nomor_registrasi', 'desc'); + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); + $q->orWhere('mig_mst_lpj_nomor_jaminan', 'LIKE', '%' . $search . '%'); + $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhere('status', 'LIKE', '%' . $search . '%'); + }); + } + + // Apply sorting if provided + if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { + $order = $request->get('sortOrder'); + $column = $request->get('sortField'); + $query->orderBy($column, $order); + } + + // Get the total count of records + $totalRecords = $query->count(); + $size = $request->get('size', 10); + if ($size == 0) { + $size = 10; + } + + // Apply pagination if provided + if ($request->has('page') && $request->has('size')) { + $page = $request->get('page'); + $size = $request->get('size'); + $offset = ($page - 1) * $size; // Calculate the offset + + $query->skip($offset)->take($size); + } + + // Get the filtered count of records + $filteredRecords = $query->count(); + + // Get the data for the current page + $data = $query->get(); + + $data = $data->map(function ($item) { + return [ + 'id' => $item->id, + 'nomor_registrasi' => $item->nomor_registrasi, + 'mig_mst_lpj_nomor_jaminan' => $item->mig_mst_lpj_nomor_jaminan, + 'tanggal_permohonan' => $item->tanggal_permohonan ? dateFormat( + $item->tanggal_permohonan, + ) : null, + 'pemohon' => $item->user->name ?? 'N/A', + 'branch' => $item->branch->name ?? 'N/A', + 'debiture' => [ + 'name' => $item->debiture->name, + ], + 'tujuan_penilaian' => [ + 'code' => $item->tujuanPenilaian->code ?? null, + 'name' => $item->tujuanPenilaian->name ?? null, + ], + 'status' => $item->status, + 'documents' => count($item->documents), + 'keterangan' => $item->keterangan, + 'penilaian' => [ + 'id' => $item->penilaian->id ?? null, + 'waktu_penilaian' => $item->penilaian->waktu_penilaian ?? null, + 'rejected_note' => $item->penilaian->rejected_note ?? null, + 'authorized_status' => $item->penilaian->authorized_status ?? null, + ], + 'registrasi_catatan' => $item->registrasi_catatan, + ]; + }); + + // Calculate the page count + $pageCount = ceil($totalRecords / $size); + + // Calculate the current page number + $currentPage = max(1, $request->get('page', 1)); + + // Return the response data as a JSON object + return response()->json([ + 'draw' => $request->get('draw'), + 'recordsTotal' => $totalRecords, + 'recordsFiltered' => $filteredRecords, + 'pageCount' => $pageCount, + 'page' => $currentPage, + 'totalCount' => $totalRecords, + 'data' => $data, + ]); + } + + public function export() + { + return Excel::download(new PermohonanExport(), 'permohonan.xlsx'); + } + + public function authorization() + { + return view('lpj::permohonan.authorization.index'); + } + + public function dataForAuthorization(Request $request) + { + if (is_null($this->user) || !$this->user->can('debitur.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query = Permohonan::query()->with('documents')->has('documents', '>', 0)->where('status', '=', 'order'); + + if (!Auth::user()->hasAnyRole(['administrator'])) { + $query = $query->where('branch_id', Auth::user()->branch_id); + } + + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); + $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhere('status', 'LIKE', '%' . $search . '%'); + }); + } + + // Apply sorting if provided + if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { + $order = $request->get('sortOrder'); + $column = $request->get('sortField'); + $query->orderBy($column, $order); + } + + // Get the total count of records + $totalRecords = $query->count(); + + // Apply pagination if provided + if ($request->has('page') && $request->has('size')) { + $page = $request->get('page'); + $size = $request->get('size'); + $offset = ($page - 1) * $size; // Calculate the offset + + $query->skip($offset)->take($size); + } + + // Get the filtered count of records + $filteredRecords = $query->count(); + + // Get the data for the current page + $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get(); + + // Calculate the page count + $pageCount = ceil($totalRecords / $request->get('size')); + + // Calculate the current page number + $currentPage = 0 + 1; + + // Return the response data as a JSON object + return response()->json([ + 'draw' => $request->get('draw'), + 'recordsTotal' => $totalRecords, + 'recordsFiltered' => $filteredRecords, + 'pageCount' => $pageCount, + 'page' => $currentPage, + 'totalCount' => $totalRecords, + 'data' => $data, + ]); + } + + public function showAuthorization($id) + { $permohonan = Permohonan::find($id); - $permohonan->delete(); - - echo json_encode(['success' => true, 'message' => 'Permohonan deleted successfully']); - } catch (Exception $e) { - echo json_encode(['success' => false, 'message' => 'Failed to delete permohonan']); - } - } - - public function dataForDatatables(Request $request) - { - if (is_null($this->user) || !$this->user->can('debitur.view')) { - //abort(403, 'Sorry! You are not allowed to view users.'); + return view('lpj::permohonan.authorization.show', compact('permohonan')); } - // Retrieve data from the database - $query = Permohonan::query(); - - if (!Auth::user()->hasAnyRole(['administrator'])) { - $query = $query->where('branch_id', Auth::user()->branch_id); - } - - $query = $query->orderBy('nomor_registrasi', 'desc'); - // Apply search filter if provided - if ($request->has('search') && !empty($request->get('search'))) { - $search = $request->get('search'); - $query->where(function ($q) use ($search) { - $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); - $q->orWhere('mig_mst_lpj_nomor_jaminan', 'LIKE', '%' . $search . '%'); - $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhere('status', 'LIKE', '%' . $search . '%'); - }); - } - - // Apply sorting if provided - if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { - $order = $request->get('sortOrder'); - $column = $request->get('sortField'); - $query->orderBy($column, $order); - } - - // Get the total count of records - $totalRecords = $query->count(); - $size = $request->get('size', 10); - if ($size == 0) { - $size = 10; - } - - // Apply pagination if provided - if ($request->has('page') && $request->has('size')) { - $page = $request->get('page'); - $size = $request->get('size'); - $offset = ($page - 1) * $size; // Calculate the offset - - $query->skip($offset)->take($size); - } - - // Get the filtered count of records - $filteredRecords = $query->count(); - - // Get the data for the current page - $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian','documents'])->get(); - - // Calculate the page count - $pageCount = ceil($totalRecords / $size); - - // Calculate the current page number - $currentPage = max(1, $request->get('page', 1)); - - // Return the response data as a JSON object - return response()->json([ - 'draw' => $request->get('draw'), - 'recordsTotal' => $totalRecords, - 'recordsFiltered' => $filteredRecords, - 'pageCount' => $pageCount, - 'page' => $currentPage, - 'totalCount' => $totalRecords, - 'data' => $data, - ]); - } - - public function export() - { - return Excel::download(new PermohonanExport(), 'permohonan.xlsx'); - } - - public function authorization() - { - return view('lpj::permohonan.authorization.index'); - } - - public function dataForAuthorization(Request $request) - { - if (is_null($this->user) || !$this->user->can('debitur.view')) { - //abort(403, 'Sorry! You are not allowed to view users.'); - } - - // Retrieve data from the database - $query = Permohonan::query()->with('documents')->has('documents', '>', 0)->where('status', '=', 'order'); - - if (!Auth::user()->hasAnyRole(['administrator'])) { - $query = $query->where('branch_id', Auth::user()->branch_id); - } - - // Apply search filter if provided - if ($request->has('search') && !empty($request->get('search'))) { - $search = $request->get('search'); - $query->where(function ($q) use ($search) { - $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); - $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhere('status', 'LIKE', '%' . $search . '%'); - }); - } - - // Apply sorting if provided - if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { - $order = $request->get('sortOrder'); - $column = $request->get('sortField'); - $query->orderBy($column, $order); - } - - // Get the total count of records - $totalRecords = $query->count(); - - // Apply pagination if provided - if ($request->has('page') && $request->has('size')) { - $page = $request->get('page'); - $size = $request->get('size'); - $offset = ($page - 1) * $size; // Calculate the offset - - $query->skip($offset)->take($size); - } - - // Get the filtered count of records - $filteredRecords = $query->count(); - - // Get the data for the current page - $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get( - ); - - // Calculate the page count - $pageCount = ceil($totalRecords / $request->get('size')); - - // Calculate the current page number - $currentPage = 0 + 1; - - // Return the response data as a JSON object - return response()->json([ - 'draw' => $request->get('draw'), - 'recordsTotal' => $totalRecords, - 'recordsFiltered' => $filteredRecords, - 'pageCount' => $pageCount, - 'page' => $currentPage, - 'totalCount' => $totalRecords, - 'data' => $data, - ]); - } - - public function showAuthorization($id) - { - $permohonan = Permohonan::find($id); - return view('lpj::permohonan.authorization.show', compact('permohonan')); - } - - public function updateAuthorization(Request $request, $id) - { - try { - $permohonan = Permohonan::find($id); - $permohonan->status = $request->status; - $permohonan->keterangan = $request->keterangan; - $permohonan->save(); - } catch (Exception $e) { - return redirect()->route('authorization.show', $id)->with('error', 'Failed to update permohonan'); - } - - return redirect()->route('authorization.index')->with('success', 'Permohonan updated successfully'); - } - - public function show($id) - { - $permohonan = Permohonan::find($id); - - return view('lpj::permohonan.show', compact('permohonan')); - } - - public function print($id) - { - $permohonan = Permohonan::find($id); - return view('lpj::permohonan.print', compact('permohonan')); - - // $pdf = Pdf::loadView('lpj::permohonan.print', compact('permohonan')); - // return $pdf->stream(); - } - - public function showPembatalan($id) - { - $permohonan = Permohonan::with(['pembatalan','debiture'])->findOrFail($id); - return view('lpj::permohonan.pembatalan-form', compact('permohonan')); - } - - - public function pembatalan(Request $request) - { - // Validate the request - $validatedData = $request->validate([ - 'permohonan_id' => 'required|exists:permohonan,id', - 'alasan_pembatalan' => 'required|string', - 'file_pembatalan' => 'required|file|mimes:pdf,doc,docx|max:2048', - ]); - - // Handle file upload - if ($request->hasFile('file_pembatalan')) { - $file = $request->file('file_pembatalan'); - $filename = time() . '_' . $file->getClientOriginalName(); - $filePath = $file->storeAs('pembatalan', $filename, 'public'); - $validatedData['file_pembatalan'] = $filePath; - } - - // Add created_by - $validatedData['created_by'] = auth()->id(); - - // Create new PermohonanPembatalan - $pembatalan = PermohonanPembatalan::create($validatedData); - - return redirect()->route('permohonan.index')->with('success', 'Pembatalan Permohonan Menunggu Approval'); - } - - public function storeAproved(Request $request, $id): JsonResponse - { - $data = []; - if (request()->ajax()) { + public function updateAuthorization(Request $request, $id) + { try { - $penilaian = Penilaian::findOrFail($id); - $penilaian->update([ - 'authorized_status' => 1, - ]); - - $permohonan = Permohonan::findOrFail($request->permohonan_id); - - $permohonan->update([ - 'status' => 'proses-survey' - ]); - - $data['status'] = 'success'; - $data['message'] = 'Jadwal '.$request->noReg.' berhasil di aprove'; - } catch (\Exception $e) { - $data['status'] = 'error'; - $data['message'] = 'Gagal membuat jadwal: ' . $e->getMessage(); + $permohonan = Permohonan::find($id); + $permohonan->status = $request->status; + $permohonan->keterangan = $request->keterangan; + $permohonan->save(); + } catch (Exception $e) { + return redirect()->route('authorization.show', $id)->with('error', 'Failed to update permohonan'); } - } else { - $data['status'] = 'error'; - $data['message'] = "no ajax request"; + return redirect()->route('authorization.index')->with('success', 'Permohonan updated successfully'); } - return response()->json($data); - } + public function show($id) + { + $permohonan = Permohonan::find($id); + return view('lpj::permohonan.show', compact('permohonan')); + } - public function storeRescheduleSurvey(Request $request, $id) - { - try { + public function print($id) + { + $permohonan = Permohonan::find($id); + return view('lpj::permohonan.print', compact('permohonan')); + + // $pdf = Pdf::loadView('lpj::permohonan.print', compact('permohonan')); + // return $pdf->stream(); + } + + public function showPembatalan($id) + { + $permohonan = Permohonan::with(['pembatalan', 'debiture'])->findOrFail($id); + return view('lpj::permohonan.pembatalan-form', compact('permohonan')); + } + + public function pembatalan(Request $request) + { + // Validate the request $validatedData = $request->validate([ 'permohonan_id' => 'required|exists:permohonan,id', - 'penilaian_id' => 'nullable', - 'nomor_registrasi' => 'required', - 'reschedule_note' => 'required', - 'reschedule_date' => 'required', - 'keterangan' => 'required' + 'alasan_pembatalan' => 'required|string', + 'file_pembatalan' => 'required|file|mimes:pdf,doc,docx|max:2048', ]); - DB::beginTransaction(); + // Handle file upload + if ($request->hasFile('file_pembatalan')) { + $file = $request->file('file_pembatalan'); + $filename = time() . '_' . $file->getClientOriginalName(); + $filePath = $file->storeAs('pembatalan', $filename, 'public'); + $validatedData['file_pembatalan'] = $filePath; + } - $permohonan = Permohonan::findOrFail($request->permohonan_id); - $permohonan->update([ - 'status' => 'request-reschedule' - ]); + // Add created_by + $validatedData['created_by'] = auth()->id(); - $penilaian = Penilaian::findOrFail($id); + // Create new PermohonanPembatalan + $pembatalan = PermohonanPembatalan::create($validatedData); - $penilaian->update([ - 'reschedule_date' => $request->reschedule_date, - 'reschedule_note' => $request->reschedule_note, - ]); - - DB::commit(); - return response()->json([ - 'status' => 'success', - 'message' => 'Proses request reschedule permohonan Nomor registrasi '.$request->nomor_registrasi.' berhasil', - ]); - } catch (\Exception $e) { - DB::rollBack(); - return response()->json([ - 'status' => 'error', - 'message' => 'Gagal membuat request reschedule: ' . $e->getMessage(), - ]); + return redirect()->route('permohonan.index')->with('success', 'Pembatalan Permohonan Menunggu Approval'); } - } -} + public function storeAproved(Request $request, $id) + : JsonResponse { + $data = []; + if (request()->ajax()) { + try { + $penilaian = Penilaian::findOrFail($id); + $penilaian->update([ + 'authorized_status' => 1, + ]); + + $permohonan = Permohonan::findOrFail($request->permohonan_id); + + $permohonan->update([ + 'status' => 'proses-survey', + ]); + + $data['status'] = 'success'; + $data['message'] = 'Jadwal ' . $request->noReg . ' berhasil di aprove'; + } catch (Exception $e) { + $data['status'] = 'error'; + $data['message'] = 'Gagal membuat jadwal: ' . $e->getMessage(); + } + } else { + $data['status'] = 'error'; + $data['message'] = "no ajax request"; + } + + return response()->json($data); + } + + public function update(PermohonanRequest $request, $id) + { + $permohonan = Permohonan::findOrFail($id); + $beforeRequest = $permohonan->toArray(); + + $validate = $request->validated(); + if ($validate) { + try { + // Update in database + + if ($permohonan->status == 'revisi') { + $validate['status'] = 'order'; + } + $permohonan->update($validate); + + $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get(); + if (count($documents) < 1) { + return redirect()->route( + 'debitur.jaminan.create', + array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]), + )->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu'); + } + + return redirect() + ->route('permohonan.index')->with('success', 'Permohonan updated successfully'); + } catch (Exception $e) { + return redirect() + ->route('permohonan.edit', $id)->with('error', 'Failed to update permohonan'); + } + } + } + + public function storeRescheduleSurvey(Request $request, $id) + { + try { + $validatedData = $request->validate([ + 'permohonan_id' => 'required|exists:permohonan,id', + 'penilaian_id' => 'nullable', + 'nomor_registrasi' => 'required', + 'reschedule_note' => 'required', + 'reschedule_date' => 'required', + 'keterangan' => 'required', + ]); + + DB::beginTransaction(); + + $permohonan = Permohonan::findOrFail($request->permohonan_id); + $permohonan->update([ + 'status' => 'request-reschedule', + ]); + + $penilaian = Penilaian::findOrFail($id); + + $penilaian->update([ + 'reschedule_date' => $request->reschedule_date, + 'reschedule_note' => $request->reschedule_note, + ]); + + DB::commit(); + return response()->json([ + 'status' => 'success', + 'message' => 'Proses request reschedule permohonan Nomor registrasi ' . $request->nomor_registrasi . ' berhasil', + ]); + } catch (Exception $e) { + DB::rollBack(); + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal membuat request reschedule: ' . $e->getMessage(), + ]); + } + } + + } diff --git a/app/Http/Controllers/PersetujuanPenawaranController.php b/app/Http/Controllers/PersetujuanPenawaranController.php index 1486fbe..3838167 100644 --- a/app/Http/Controllers/PersetujuanPenawaranController.php +++ b/app/Http/Controllers/PersetujuanPenawaranController.php @@ -6,6 +6,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Modules\Lpj\Http\Requests\PersetujuanPenawaranRequest; + use Modules\Lpj\Models\Noc; use Modules\Lpj\Models\PenawaranDetailTender; use Modules\Lpj\Models\PenawaranDetailTenderLog; use Modules\Lpj\Models\PenawaranTender; @@ -67,6 +68,22 @@ $persetujuanPenawaran->save(); + + // Save NOC + try { + $noc = Noc::updateOrCreate([ + 'permohonan_id' => $persetujuanPenawaran->permohonan_id, + 'persetujuan_penawaran_id' => $persetujuanPenawaran->id + ],[ + 'bukti_bayar' => $persetujuanPenawaran->bukti_bayar, + ]); + } catch (\Exception $e) { + \Log::error('Failed to create or update NOC: ' . $e->getMessage()); + return redirect() + ->route('persetujuan-penawaran.index') + ->with('error', 'Persetujuan Penawaran berhasil disimpan tetapi gagal membuat NOC: ' . $e->getMessage()); + } + return redirect() ->route('persetujuan-penawaran.index')->with('success', 'Persetujuan Penawaran berhasil disimpan.'); } diff --git a/app/Http/Requests/NocRequest.php b/app/Http/Requests/NocRequest.php index 0cb7e66..13b76af 100644 --- a/app/Http/Requests/NocRequest.php +++ b/app/Http/Requests/NocRequest.php @@ -4,20 +4,150 @@ use Illuminate\Foundation\Http\FormRequest; + /** + * Form Request untuk validasi data NOC (Notice of Completion) + */ class NocRequest extends FormRequest { + /** + * Konstanta untuk jenis file yang diizinkan + */ + private const ALLOWED_FILE_TYPES = 'pdf,jpg,jpeg,png'; + + /** + * Konstanta untuk ukuran file maksimum (dalam KB) + */ + private const MAX_FILE_SIZE = 10240; + + /** + * Menentukan apakah pengguna berwenang untuk melakukan request ini + * + * @return bool + */ public function authorize() { return true; } + /** + * Mengumpulkan semua aturan validasi + * + * @return array + */ public function rules() + { + return array_merge( + $this->getBasicInfoRules(), + $this->getPaymentRules(), + $this->getSettlementRules(), + $this->getAuthorizationRules(), + ); + } + + /** + * Aturan validasi untuk informasi dasar + * + * @return array + */ + private function getBasicInfoRules() { return [ - 'penawaran_id' => 'nullable|exists:penawaran,id', - 'nominal_bayar' => 'nullable|numeric|min:0', - 'bukti_ksl' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:10240', - 'status' => 'nullable|boolean', + 'permohonan_id' => 'required|exists:permohonan,id', + 'persetujuan_penawaran_id' => 'required|exists:persetujuan_penawaran,id', + 'status' => 'nullable|boolean', + 'created_by' => 'nullable|exists:users,id', + 'updated_by' => 'nullable|exists:users,id', + ]; + } + + /** + * Aturan validasi untuk data pembayaran + * + * @return array + */ + private function getPaymentRules() + { + $fileRule = 'nullable|file|mimes:' . self::ALLOWED_FILE_TYPES . '|max:' . self::MAX_FILE_SIZE; + + return [ + 'total_harus_bayar' => 'nullable|numeric|min:0', + 'nominal_bayar' => 'nullable|numeric|min:0', + 'bukti_ksl' => $fileRule, + 'bukti_bayar' => $fileRule, + 'status_bayar' => 'nullable|boolean', + 'tanggal_pembayaran' => 'nullable|date', + ]; + } + + /** + * Aturan validasi untuk data penyelesaian + * + * @return array + */ + private function getSettlementRules() + { + $fileRule = 'nullable|file|mimes:' . self::ALLOWED_FILE_TYPES . '|max:' . self::MAX_FILE_SIZE; + + return [ + 'nominal_penyelesaian' => 'nullable|numeric|min:0', + 'status_penyelesaian' => 'nullable|boolean', + 'tanggal_penyelesaian' => 'nullable|date', + 'bukti_penyelesaian' => $fileRule, + 'memo_penyelesaian' => $fileRule, + 'catatan_noc' => 'nullable|string', + ]; + } + + /** + * Aturan validasi untuk otorisasi + * + * @return array + */ + private function getAuthorizationRules() + { + return [ + 'authorized_status' => 'nullable|boolean', + 'authorized_at' => 'nullable|date', + 'authorized_by' => 'nullable|exists:users,id', + ]; + } + + /** + * Pesan khusus untuk validasi + * + * @return array + */ + public function messages() + { + return [ + 'permohonan_id.required' => 'ID Permohonan harus diisi', + 'permohonan_id.exists' => 'ID Permohonan tidak valid', + 'persetujuan_penawaran_id.required' => 'ID Persetujuan Penawaran harus diisi', + 'persetujuan_penawaran_id.exists' => 'ID Persetujuan Penawaran tidak valid', + 'nominal_bayar.numeric' => 'Nominal Bayar harus berupa angka', + 'nominal_bayar.min' => 'Nominal Bayar minimal 0', + 'bukti_ksl.file' => 'Bukti KSL harus berupa file', + 'bukti_ksl.mimes' => 'Bukti KSL harus berformat pdf, jpg, jpeg, atau png', + 'bukti_ksl.max' => 'Ukuran Bukti KSL maksimal 10MB', + 'bukti_bayar.file' => 'Bukti Bayar harus berupa file', + 'bukti_bayar.mimes' => 'Bukti Bayar harus berformat pdf, jpg, jpeg, atau png', + 'bukti_bayar.max' => 'Ukuran Bukti Bayar maksimal 10MB', + 'status.boolean' => 'Status harus berupa boolean', + 'status_bayar.boolean' => 'Status Bayar harus berupa boolean', + 'tanggal_pembayaran.date' => 'Format Tanggal Pembayaran tidak valid', + 'nominal_penyelesaian.numeric' => 'Nominal Penyelesaian harus berupa angka', + 'nominal_penyelesaian.min' => 'Nominal Penyelesaian minimal 0', + 'status_penyelesaian.boolean' => 'Status Penyelesaian harus berupa boolean', + 'tanggal_penyelesaian.date' => 'Format Tanggal Penyelesaian tidak valid', + 'bukti_penyelesaian.file' => 'Bukti Penyelesaian harus berupa file', + 'bukti_penyelesaian.mimes' => 'Bukti Penyelesaian harus berformat pdf, jpg, jpeg, atau png', + 'bukti_penyelesaian.max' => 'Ukuran Bukti Penyelesaian maksimal 10MB', + 'memo_penyelesaian.file' => 'Memo Penyelesaian harus berupa file', + 'memo_penyelesaian.mimes' => 'Memo Penyelesaian harus berformat pdf, jpg, jpeg, atau png', + 'memo_penyelesaian.max' => 'Ukuran Memo Penyelesaian maksimal 10MB', + 'authorized_status.boolean' => 'Status Otorisasi harus berupa boolean', + 'authorized_at.date' => 'Format Tanggal Otorisasi tidak valid', + 'authorized_by.exists' => 'User Otorisasi tidak valid', ]; } } diff --git a/app/Http/Requests/PersetujuanPenawaranRequest.php b/app/Http/Requests/PersetujuanPenawaranRequest.php index 8d04940..d1f87f8 100644 --- a/app/Http/Requests/PersetujuanPenawaranRequest.php +++ b/app/Http/Requests/PersetujuanPenawaranRequest.php @@ -23,8 +23,6 @@ 'sla_final' => 'nullable|numeric|min:0', 'file_persetujuan_penawaran' => 'nullable|file|mimes:pdf,doc,docx|max:10240', 'surat_representasi' => 'nullable|file|mimes:pdf,doc,docx|max:10240', - 'bukti_bayar' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:10240', - 'nominal_bayar' => 'nullable|numeric|min:0', 'status' => 'nullable|boolean', 'authorized_status' => 'boolean', 'authorized_at' => 'nullable|date', @@ -52,9 +50,6 @@ 'surat_representasi.file' => 'Surat Representasi harus berupa file.', 'surat_representasi.mimes' => 'Surat Representasi harus berupa file PDF, DOC, atau DOCX.', 'surat_representasi.max' => 'Ukuran Surat Representasi tidak boleh lebih dari 10MB.', - 'bukti_bayar.file' => 'Bukti Bayar harus berupa file.', - 'bukti_bayar.mimes' => 'Bukti Bayar harus berupa file PDF, JPG, JPEG, atau PNG.', - 'bukti_bayar.max' => 'Ukuran Bukti Bayar tidak boleh lebih dari 10MB.', 'region_id.required' => 'Region ID wajib diisi.', 'region_id.exists' => 'Region ID tidak valid.', 'status.required' => 'Status wajib diisi.', @@ -62,8 +57,6 @@ 'authorized_status.boolean' => 'Status otorisasi harus berupa nilai boolean.', 'authorized_at.date' => 'Tanggal otorisasi harus berupa tanggal yang valid.', 'authorized_by.exists' => 'ID pengguna yang mengotorisasi tidak valid.', - 'status_bayar.required' => 'Status bayar wajib diisi.', - 'status_bayar.in' => 'Status bayar harus berupa "sudah_bayar", "belum_bayar" atau "tidak bayar".', ]; } } diff --git a/app/Models/Noc.php b/app/Models/Noc.php new file mode 100644 index 0000000..16a0342 --- /dev/null +++ b/app/Models/Noc.php @@ -0,0 +1,62 @@ + 'decimal:2', + 'status_bayar' => 'boolean', + 'tanggal_pembayaran' => 'date', + 'nominal_penyelesaian' => 'decimal:2', + 'status_penyelesaiaan' => 'boolean', + 'tanggal_penyelesaian' => 'date', + 'status' => 'boolean', + 'authorized_status' => 'boolean', + 'authorized_at' => 'datetime', + ]; + + // Relationship with Permohonan + public function permohonan() + { + return $this->belongsTo(Permohonan::class, 'permohonan_id'); + } + + // Relationship with PersetujuanPenawaran + public function persetujuanPenawaran() + { + return $this->belongsTo(PersetujuanPenawaran::class, 'persetujuan_penawaran_id'); + } + + // Relationship with User (for authorized_by) + public function authorizedBy() + { + return $this->belongsTo(User::class, 'authorized_by'); + } +} diff --git a/app/Models/Permohonan.php b/app/Models/Permohonan.php index 5644430..4490721 100644 --- a/app/Models/Permohonan.php +++ b/app/Models/Permohonan.php @@ -259,4 +259,10 @@ return $this->belongsTo(Inspeksi::class, 'permohonan_id'); } + // Add this relationship + public function noc() + { + return $this->hasOne(Noc::class, 'permohonan_id'); + } + } diff --git a/app/Models/PersetujuanPenawaran.php b/app/Models/PersetujuanPenawaran.php index 014a5a3..0bb8158 100644 --- a/app/Models/PersetujuanPenawaran.php +++ b/app/Models/PersetujuanPenawaran.php @@ -25,7 +25,6 @@ 'authorized_status', 'authorized_at', 'authorized_by', - 'status', 'catatan', ]; @@ -58,4 +57,10 @@ { return $this->belongsTo(User::class, 'authorized_by'); } + + // Relationship with Noc + public function noc() + { + return $this->hasOne(Noc::class, 'persetujuan_penawaran_id'); + } } diff --git a/database/migrations/2025_05_04_124217_create_nocs_table.php b/database/migrations/2025_05_04_124217_create_nocs_table.php new file mode 100644 index 0000000..a91fc31 --- /dev/null +++ b/database/migrations/2025_05_04_124217_create_nocs_table.php @@ -0,0 +1,52 @@ +id(); + $table->unsignedBigInteger('permohonan_id'); + $table->unsignedBigInteger('persetujuan_penawaran_id'); + $table->string('bukti_bayar')->nullable(); + $table->decimal('nominal_bayar', 15, 2)->nullable(); + $table->boolean('status_bayar')->default(false); + $table->date('tanggal_pembayaran')->nullable(); + $table->decimal('nominal_penyelesaian', 15, 2)->nullable(); + $table->boolean('status_penyelesaiaan')->default(false); + $table->date('tanggal_penyelesaian')->nullable(); + $table->string('bukti_penyelesaian')->nullable(); + $table->string('bukti_ksl')->nullable(); + $table->text('memo_penyelesaian')->nullable(); + $table->boolean('status')->default(true); + $table->string('catatan_noc')->nullable(); + $table->char('authorized_status', 1)->nullable(); + $table->timestamp('authorized_at')->nullable(); + $table->unsignedBigInteger('authorized_by')->nullable(); + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->foreign('permohonan_id')->references('id')->on('permohonan'); + $table->foreign('persetujuan_penawaran_id')->references('id')->on('persetujuan_penawaran'); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + : void + { + Schema::dropIfExists('noc'); + } + }; diff --git a/resources/views/noc/form.blade.php b/resources/views/noc/form.blade.php index 9d0eb81..9721c50 100644 --- a/resources/views/noc/form.blade.php +++ b/resources/views/noc/form.blade.php @@ -19,6 +19,7 @@