diff --git a/app/Http/Controllers/TenderController.php b/app/Http/Controllers/TenderController.php index b621573..0da758c 100644 --- a/app/Http/Controllers/TenderController.php +++ b/app/Http/Controllers/TenderController.php @@ -1,1192 +1,903 @@ exists(); + + // Jika nomor_registrasi sudah ada, kembalikan respon 403 Forbidden + if ($penawaranExists) { + return redirect()->route('tender.penawaran.editPenawaran', ['noreg' => $noreg]) + ->with('error', 'Penawaran dengan nomor registrasi ini sudah ada, Anda akan diarahkan ke halaman edit.'); } - /** - * Show the form for creating a new resource. - */ - public function penawaran_create($noreg) - { - $penawaranExists = PenawaranTender::where('nomor_registrasi', '=', $noreg)->exists(); + $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - // Jika nomor_registrasi sudah ada, kembalikan respon 403 Forbidden - if ($penawaranExists) { - return redirect() - ->route('tender.penawaran.editPenawaran', ['noreg' => $noreg])->with( - 'error', - 'Penawaran dengan nomor registrasi ini sudah ada, Anda akan diarahkan ke halaman edit.', - ); - } + $status = StatusPermohonan::all(); + $tujuan_penilaian_kjpp = TujuanPenilaianKJPP::all(); + $jenis_laporan = JenisLaporan::all(); + $kjpp = KJPP::all(); + + return view('lpj::penawaran/create', compact('status', 'tujuan_penilaian_kjpp', 'jenis_laporan', 'kjpp', 'noreg', 'permohonan')); + } + + /** + * Store a newly created resource in storage. + */ + public function penawaran_store(TenderPenawaranRequest $request, $noreg) + { + $validated = $request->validated(); + + DB::beginTransaction(); + + try { $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - $status = StatusPermohonan::all(); - $tujuan_penilaian_kjpp = TujuanPenilaianKJPP::all(); - $jenis_laporan = JenisLaporan::all(); + // Add created_by/updated_by from the authenticated user + $userId = Auth::user()->id; - $kjpp = KJPP::all(); + $validated['nomor_registrasi'] = $permohonan->nomor_registrasi; - return view( - 'lpj::penawaran/create', - compact('status', 'tujuan_penilaian_kjpp', 'jenis_laporan', 'kjpp', 'noreg', 'permohonan'), - ); - } + $validated['status'] = $request->input('status') ?? 'tender'; + $validated['updated_by'] = $userId; // Updating the record + $validated['end_date'] = $request->input('end_date') . ' 17:00:00'; + // dd($validated['end_date']); + $permohonan->update($validated); - /** - * Store a newly created resource in storage. - */ - public function penawaran_store(TenderPenawaranRequest $request, $noreg) - { - $validated = $request->validated(); + // Adding created_by for the new PenawaranTender record + $validated['created_by'] = $userId; + $penawaranId = PenawaranTender::create($validated); - DB::beginTransaction(); + $kjpps = $request->input('kjpp', []); - try { - $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - - // Add created_by/updated_by from the authenticated user - $userId = Auth::user()->id; - - $validated['nomor_registrasi'] = $permohonan->nomor_registrasi; - - $validated['status'] = $request->input('status') ?? 'tender'; - $validated['updated_by'] = $userId; // Updating the record - $validated['end_date'] = $request->input('end_date') . ' 17:00:00'; - // dd($validated['end_date']); - $permohonan->update($validated); - - // Adding created_by for the new PenawaranTender record - $validated['created_by'] = $userId; - $penawaranId = PenawaranTender::create($validated); - - $kjpps = $request->input('kjpp', []); - - foreach ($kjpps as $kjpp) { - PenawaranDetailTender::create([ - 'penawaran_id' => $penawaranId->id, - 'kjpp_rekanan_id' => $kjpp, - 'created_by' => $userId, // Set created_by for details - 'updated_by' => $userId, - ]); - } - - // Commit the transaction - DB::commit(); - - return redirect() - ->route('tender.penawaran.index')->with('success', 'Data Penawaran created successfully'); - } catch (Exception $e) { - DB::rollBack(); - - return redirect() - ->route('tender.penawaran.createPenawaran', $noreg)->with('error', 'Validation failed: ' . $e); - } - } - - /** - * Show the specified resource. - */ - public function penawaran_show($noreg) - { - $penawaran = null; - $kjpps = null; - $tujuan_penilaian_kjpp = null; - $jenis_laporan = null; - - $penawaranExists = PenawaranTender::where('nomor_registrasi', $noreg)->exists(); - - $penawaran1 = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); - - if (!$penawaran1) { - return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with( - 'error', - 'Penawaran dengan nomor registrasi ini belum dibuat. Silahkan isi terlebih dahulu!', - ); + foreach ($kjpps as $kjpp) { + PenawaranDetailTender::create([ + 'penawaran_id' => $penawaranId->id, + 'kjpp_rekanan_id' => $kjpp, + 'created_by' => $userId, // Set created_by for details + 'updated_by' => $userId + ]); } - if ($penawaran1->status != 'tender') { - return redirect()->route('spk.index')->with( - 'error', - 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!', - ); - } - - // dd($penawaran1->id); - if ($penawaran1) { - $penawaran = $penawaran1; - $detail_penawaran = PenawaranDetailTender::where('penawaran_id', '=', $penawaran1->id)->where( - 'status', - '=', - 1, - )->pluck('kjpp_rekanan_id')->toArray(); - $kjpps = KJPP::whereIn('id', $detail_penawaran)->get(); - $tujuan_penilaian_kjpp = TujuanPenilaianKJPP::where('id', $penawaran->tujuan_penilaian_kjpp_id)->get(); - $jenis_laporan = JenisLaporan::where('id', $penawaran->jenis_laporan_id)->get(); - } else { - $penawaran2 = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - $penawaran = $penawaran2; - } - - // dd($kjpps); - - return view( - 'lpj::penawaran.show', - compact('noreg', 'penawaran', 'kjpps', 'tujuan_penilaian_kjpp', 'jenis_laporan', 'penawaranExists'), - ); - } - - /** - * Show the form for editing the specified resource. - */ - public function penawaran_edit($noreg) - { - // Find the specific penawaran by its ID - $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); - - if (!$penawaran) { - return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with( - 'error', - 'Penawaran dengan nomor registrasi ini belum dibuat. Silahkan isi terlebih dahulu!', - ); - } - - $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - - - if ($penawaran->status != 'tender') { - return redirect()->route('spk.index')->with( - 'error', - 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!', - ); - } - - $status = StatusPermohonan::all(); - $tujuan_penilaian_kjpp = TujuanPenilaianKJPP::all(); - $jenis_laporan = JenisLaporan::all(); - - $detail_penawaran = PenawaranDetailTender::where('penawaran_id', '=', $penawaran->id)->where( - 'status', - '=', - 1, - )->pluck('kjpp_rekanan_id')->toArray(); - $kjpps = KJPP::whereIn('id', $detail_penawaran)->pluck('id')->toArray(); - - $kjpp = KJPP::all(); - - // dd($penawaran); - - return view( - 'lpj::penawaran.edit', - compact( - 'status', - 'tujuan_penilaian_kjpp', - 'jenis_laporan', - 'kjpp', - 'penawaran', - 'noreg', - 'kjpps', - 'permohonan', - ), - ); - } - - - /** - * Update the specified resource in storage. - */ - public function penawaran_update(TenderPenawaranRequest $request, $noreg) - { - $validated = $request->validated(); - - DB::beginTransaction(); - - try { - // Ambil data penawaran berdasarkan nomor registrasi - $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); - $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - - // Ambil ID user yang sedang login - $userId = Auth::user()->id; - - // Jangan ubah created_by untuk data yang sudah ada - $validated['nomor_registrasi'] = $penawaran->nomor_registrasi; - $validated['status'] = $request->input('status') ?? 'tender'; - $validated['created_by'] = $userId; - $validated['updated_by'] = $userId; // Hanya update 'updated_by' - $validated['end_date'] = $request->input('end_date') . ' 17:00:00'; - // dd($validated['end_date']); - - // Update data penawaran dan permohonan - $penawaran->update($validated); - $permohonan->update($validated); - - $kjpps = $request->input('kjpp', []); - - // Ubah status KJPP lama menjadi 0 jika tidak ada dalam request - foreach ($penawaran->penawaranKjpp as $kjpp) { - if (!in_array($kjpp->kjpp_rekanan_id, $kjpps)) { - // Ubah status KJPP lama menjadi 0 - $kjpp->status = 0; - $kjpp->created_by = $userId; - $kjpp->updated_by = $userId; // Set updated_by - $kjpp->save(); - } - } - - // Tangani penambahan atau perubahan KJPP baru - foreach ($kjpps as $kjpp) { - $existingDetail = PenawaranDetailTender::where('penawaran_id', $penawaran->id)->where( - 'kjpp_rekanan_id', - $kjpp, - )->first(); - - // dd($existingDetail); - - if ($existingDetail) { - // Jika KJPP sudah ada, pastikan statusnya aktif (1) - if ($existingDetail->status == 0) { - $existingDetail->status = 1; - $existingDetail->created_by = $userId; - $existingDetail->updated_by = $userId; // Set updated_by - $existingDetail->save(); - } - } else { - // Buat data baru jika tidak ada dalam database - PenawaranDetailTender::create([ - 'penawaran_id' => $penawaran->id, - 'kjpp_rekanan_id' => $kjpp, - 'status' => 1, // Default status untuk KJPP baru adalah 1 - 'created_by' => $userId, // Set created_by untuk data baru - 'updated_by' => $userId, // Set updated_by juga - ]); - } - } - - // Commit transaksi - DB::commit(); - - return redirect() - ->route('tender.penawaran.ulang.index')->with('success', 'Data Penawaran updated successfully'); - } catch (Exception $e) { - // Rollback jika ada kesalahan - DB::rollBack(); - - return redirect() - ->route('tender.penawaran.createPenawaran', $noreg)->with( - 'error', - 'Validation failed: ' . $e->getMessage(), - ); - } - } - - - /** - * Tampilkan Surat Tender - */ - public function showSuratTender($noreg) - { - $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); - $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - - // Kalau tidak ketemu nomor registrasi dengan tabel penawaran - if (!$penawaran) { - return redirect() - ->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with( - 'error', - 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!', - ); - } - - if ($penawaran->status != 'tender') { - return redirect()->route('spk.index')->with( - 'error', - 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!', - ); - } - - // Kalau tidak ada dokumen jaminan maka di arahkan ke halaman dokumen jaminan - if ($permohonan->debiture->documents->isEmpty()) { - return redirect() - ->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id])->with( - 'error', - 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!', - ); - } - - foreach ($permohonan->debiture->documents as $document) { - $village_permohonan = $document->village_code; - $district_permohonan = $document->district_code; - $city_permohonan = $document->city_code; - $province_permohonan = $document->province_code; - } - - $villages = Village::where('code', $village_permohonan)->get(); - $districts = District::where('code', $district_permohonan)->get(); - $cities = City::where('code', $city_permohonan)->get(); - $provinces = Province::where('code', $province_permohonan)->get(); - - date_default_timezone_set('Asia/Jakarta'); - - $now = date('Y-m-d H:i:s'); - // Jika batas tanggal penawaran sudah lewat - if ($penawaran->end_date < $now) { - return redirect() - ->route('tender.penawaran.editPenawaran', ['noreg' => $noreg])->with( - 'error', - 'Sudah Kadaluarsa. Silahkan perpanjang tanggal penawaran terlebih dahulu!', - ); - } - - return view( - 'lpj::penawaran.surat_tender', - compact('penawaran', 'noreg', 'permohonan', 'villages', 'districts', 'cities', 'provinces'), - ); - } - - public function suratTenderKJPP($noreg, $id) - { - $kjpp = KJPP::find($id); - $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); - - if (!$penawaran) { - return redirect() - ->route('tender.penawaran.createPenawaran', ['noreg' => $penawaran->nomor_registrasi])->with( - 'error', - 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!', - ); - } - - if ($penawaran->status != 'tender') { - return redirect()->route('spk.index')->with( - 'error', - 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!', - ); - } - - // Kalau tidak ada dokumen jaminan maka di arahkan ke halaman dokumen jaminan - if ($permohonan->debiture->documents->isEmpty()) { - return redirect() - ->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id])->with( - 'error', - 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!', - ); - } - - foreach ($permohonan->debiture->documents as $document) { - $village_permohonan = $document->village_code; - $district_permohonan = $document->district_code; - $city_permohonan = $document->city_code; - $province_permohonan = $document->province_code; - } - - $villages = Village::where('code', $village_permohonan)->get(); - $districts = District::where('code', $district_permohonan)->get(); - $cities = City::where('code', $city_permohonan)->get(); - $provinces = Province::where('code', $province_permohonan)->get(); - - date_default_timezone_set('Asia/Jakarta'); - - $now = date('Y-m-d H:i:s'); - // Jika batas tanggal penawaran sudah lewat - if ($penawaran->end_date < $now) { - return redirect() - ->route('tender.penawaran.editPenawaran', ['noreg' => $noreg])->with( - 'error', - 'Sudah Kadaluarsa. Silahkan perpanjang tanggal penawaran terlebih dahulu!', - ); - } - - $detail_penawaran = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $kjpp->id)->get(); - - foreach ($detail_penawaran as $detail) { - $detail_penawaran_1 = $detail->kjpp; - } - - return view( - 'lpj::penawaran.surat_tender_kjpp', - compact( - 'penawaran', - 'noreg', - 'permohonan', - 'villages', - 'districts', - 'cities', - 'provinces', - 'detail_penawaran_1', - 'id', - ), - ); - } - - public function datatablesPenawaran(Request $request) - { - if (is_null($this->user) || !$this->user->can('penawaran.view')) { - //abort(403, 'Sorry! You are not allowed to view users.'); - } - - // Retrieve data from the database - $query = Permohonan::query()->where('status', '=', 'registered')->where('jenis_penilaian_id', '=', 2); - - // 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 exportPenawaran() - { - return Excel::download(new PenawaranTenderExport, 'penawarantender.xlsx'); - } - - // penawaran ulang - public function penawaran_ulang_index() - { - return view('lpj::penawaran_ulang/index'); - } - - public function datatablesPenawaranUlang(Request $request) - { - if (is_null($this->user) || !$this->user->can('penawaran_ulang.view')) { - //abort(403, 'Sorry! You are not allowed to view users.'); - } - - // Retrieve data from the database - $query = Permohonan::query()->where('status', '=', 'tender')->where('jenis_penilaian_id', '=', 2); - - // 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, - ]); - } - - // Tambahkan method untuk API di controller - public function checkPenawaranExistence($nomor_registrasi) - { - // Cek apakah nomor_registrasi ada dalam tabel penawaran - $exists = PenawaranTender::where('nomor_registrasi', $nomor_registrasi)->exists(); - - // Kembalikan hasil pengecekan sebagai JSON - return response()->json(['exists' => $exists]); - } - - public function downloadSuratTender($noreg) - { - $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); - $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - - if ($penawaran->status != 'tender') { - return redirect()->route('spk.index')->with( - 'error', - 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!', - ); - } - - foreach ($permohonan->debiture->documents as $document) { - $village_permohonan = $document->village_code; - $district_permohonan = $document->district_code; - $city_permohonan = $document->city_code; - $province_permohonan = $document->province_code; - } - - $villages = Village::where('code', $village_permohonan)->get(); - $districts = District::where('code', $district_permohonan)->get(); - $cities = City::where('code', $city_permohonan)->get(); - $provinces = Province::where('code', $province_permohonan)->get(); - - $pdf = app('dompdf.wrapper'); // create an instance of the PDF class - $pdf->loadView( - 'lpj::penawaran.surat_tender_download', - compact('penawaran', 'permohonan', 'villages', 'districts', 'cities', 'provinces'), - ); - - return $pdf->download('surat_tender' . time() . '.pdf'); - } - - public function downloadSuratTenderKJPP($noreg, $id) - { - $kjpp = KJPP::find($id); - $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); - $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - - if ($penawaran->status != 'tender') { - return redirect()->route('spk.index')->with( - 'error', - 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!', - ); - } - - foreach ($permohonan->debiture->documents as $document) { - $village_permohonan = $document->village_code; - $district_permohonan = $document->district_code; - $city_permohonan = $document->city_code; - $province_permohonan = $document->province_code; - } - - $villages = Village::where('code', $village_permohonan)->get(); - $districts = District::where('code', $district_permohonan)->get(); - $cities = City::where('code', $city_permohonan)->get(); - $provinces = Province::where('code', $province_permohonan)->get(); - - $detail_penawaran = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $kjpp->id)->get(); - - foreach ($detail_penawaran as $detail) { - $detail_penawaran_1 = $detail->kjpp; - } - - $pdf = app('dompdf.wrapper'); // create an instance of the PDF class - $pdf->loadView( - 'lpj::penawaran.surat_tender_kjpp_download', - compact('penawaran', 'permohonan', 'villages', 'districts', 'cities', 'provinces', 'detail_penawaran_1'), - ); - - return $pdf->download('surat_tender_kjpp' . time() . '.pdf'); - } - - // Kirim Email - public function showKirimEmail($noreg) - { - $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); - $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - - if (!$penawaran) { - return redirect() - ->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with( - 'error', - 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!', - ); - } - - if ($penawaran->status != 'tender') { - return redirect()->route('spk.index')->with( - 'error', - 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!', - ); - } - - if ($permohonan->debiture->documents->isEmpty()) { - return redirect() - ->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id])->with( - 'error', - 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!', - ); - } - - return view('lpj::penawaran.showKirimEmail', compact('penawaran', 'permohonan', 'noreg')); - } - - public function dataTablesShowKirimSurat(Request $request, $noreg) - { - if (is_null($this->user) || !$this->user->can('penawaran.view')) { - // abort(403, 'Sorry! You are not allowed to view users.'); - } - - $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); - - // Retrieve data from the database - $query = PenawaranDetailTender::query()->where('penawaran_id', '=', $penawaran->id)->with( - ['kjpp', 'penawaran', 'penawaran.emailTenderLog'], - ); - - // dd($query); - - // Apply sorting if provided - if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { - $order = $request->get('sortOrder'); - $column = $request->get('sortField'); - - // Handle sorting for related table columns - if ($column === 'nama_kjpp') { - // Join with the KJPP table and sort by the name column - $query - ->join('kjpp', 'detail_penawaran.kjpp_rekanan_id', '=', 'kjpp.id') - ->orderBy('kjpp.name', $order) - ->select('detail_penawaran.*'); // Select only the main table columns to avoid conflicts - } else { - if ($column === 'nomor_kjpp') { - $query - ->join('kjpp', 'detail_penawaran.kjpp_rekanan_id', '=', 'kjpp.id')->orderBy( - 'kjpp.code', - $order, - )->select('detail_penawaran.*'); - } else { - // Sort by columns in the main table - $query->orderBy($column, $order); - } - } - } - - // Get the data for the current page - $data = $query->get(); - - // add column "No" - $i = 0; - $j = 1; - foreach ($data as $obj) { - // tanggal_permohonan - $data[$i]->numbernya = $j; - $i++; - $j++; - } - - // Return the response data as a JSON object - return response()->json([ - 'draw' => $request->get('draw'), - 'data' => $data, - ]); - } - - public function kirimEmailAll($noreg) - { - $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); - $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - - if (!$penawaran) { - return redirect() - ->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with( - 'error', - 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!', - ); - } - - if ($penawaran->status != 'tender') { - return redirect()->route('spk.index')->with( - 'error', - 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!', - ); - } - - if ($permohonan->debiture->documents->isEmpty()) { - return redirect() - ->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id])->with( - 'error', - 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!', - ); - } - - $detail_penawaran = PenawaranDetailTender::where('penawaran_id', '=', $penawaran->id)->where( - 'status', - '=', - 1, - )->pluck('kjpp_rekanan_id')->toArray(); - - - $kjpps = KJPP::whereIn('id', $detail_penawaran)->get()->map(function ($item) { - $emails = [$item->email_kantor]; - - // Parse JSON string jika ada dan tidak kosong - if (!empty($item->detail_email_kantor) && $item->detail_email_kantor !== '[]') { - $detail_emails = json_decode($item->detail_email_kantor, true); - if (is_array($detail_emails)) { - foreach ($detail_emails as $detail) { - if (isset($detail['email_kantor'])) { - $emails[] = $detail['email_kantor']; - } - } - } - } - - return [ - 'kjpp' => $item, - 'emails' => array_filter($emails), - ]; - }); - - foreach ($permohonan->debiture->documents as $document) { - $village_permohonan = $document->village_code; - $district_permohonan = $document->district_code; - $city_permohonan = $document->city_code; - $province_permohonan = $document->province_code; - } - - $villages = Village::where('code', $village_permohonan)->get(); - $districts = District::where('code', $district_permohonan)->get(); - $cities = City::where('code', $city_permohonan)->get(); - $provinces = Province::where('code', $province_permohonan)->get(); - - $subject = 'Send Penawaran Email'; - - $body_pdf = view('lpj::penawaran.kirimEmail', [ - 'penawaran' => $penawaran, - 'permohonan' => $permohonan, - 'kjpps' => $kjpps->pluck('emails')->flatten()->toArray(), - 'villages' => $villages, - 'districts' => $districts, - 'cities' => $cities, - 'provinces' => $provinces, - ])->render(); - - // Dispatch job untuk mengirim email - SendPenawaranTenderJob::dispatch( - $kjpps->pluck('emails')->flatten()->toArray(), - $penawaran, - $permohonan, - $villages, - $districts, - $cities, - $provinces, - ); - - try { - // Proses log email untuk setiap KJPP - foreach ($kjpps as $kjppData) { - foreach ($kjppData['emails'] as $email) { - // Cek log yang sudah ada - $log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) - ->where('to_email', $email) - ->where('status', 'failed') - ->first(); - - $log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)->where( - 'to_email', - $email, - )->where('status', 'success')->first(); - - if ($log) { - // Update log failed menjadi success - $log->update([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'status' => 'success', - 'error_message' => null, - 'updated_at' => now(), - ]); - } else { - if ($log1) { - // Update timestamp jika sudah success - $log1->update([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'updated_at' => now(), - ]); - } else { - // Buat log baru - PenawaranEmailTenderLog::create([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'status' => 'success', - 'error_message' => null, - 'created_at' => now(), - 'updated_at' => now(), - ]); - } - } - } - } - - return redirect() - ->route('tender.penawaran.ulang.index')->with('success', 'Email Penawaran Berhasil Terkirim!'); - } catch (Exception $e) { - // Log email gagal untuk setiap KJPP - foreach ($kjpps as $kjppData) { - foreach ($kjppData['emails'] as $email) { - $log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) - ->where('to_email', $email) - ->where('status', 'success') - ->first(); - - $log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)->where( - 'to_email', - $email, - )->where('status', 'failed')->first(); - - if ($log) { - // Update log success menjadi failed - $log->update([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'status' => 'failed', - 'error_message' => $e->getMessage(), - 'updated_at' => now(), - ]); - } else { - if ($log1) { - // Update error message jika sudah failed - $log1->update([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'error_message' => $e->getMessage(), - 'updated_at' => now(), - ]); - } else { - // Buat log baru dengan status failed - PenawaranEmailTenderLog::create([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'status' => 'failed', - 'error_message' => $e->getMessage(), - 'created_at' => now(), - 'updated_at' => now(), - ]); - } - } - } - } - - return redirect() - ->route('tender.penawaran.showKirimEmail', ['noreg' => $noreg])->with( - 'error', - 'Email Penawaran Gagal Terkirim!', - ); - } - } - - public function kirimEmailKJPP($noreg, $id) - { - $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); - $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); - - if (!$penawaran) { - return redirect() - ->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with( - 'error', - 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!', - ); - } - - if ($penawaran->status != 'tender') { - return redirect()->route('spk.index')->with( - 'error', - 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!', - ); - } - - if ($permohonan->debiture->documents->isEmpty()) { - return redirect() - ->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id])->with( - 'error', - 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!', - ); - } - - $detail_penawaran = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $id)->pluck( - 'kjpp_rekanan_id', - )->toArray(); - $kjpps = KJPP::whereIn('id', $detail_penawaran)->get()->map(function ($item) { - $emails = [$item->email_kantor]; - - // Parse JSON string jika ada dan tidak kosong - if (!empty($item->detail_email_kantor) && $item->detail_email_kantor !== '[]') { - $detail_emails = json_decode($item->detail_email_kantor, true); - if (is_array($detail_emails)) { - foreach ($detail_emails as $detail) { - if (isset($detail['email_kantor'])) { - $emails[] = $detail['email_kantor']; - } - } - } - } - - return array_filter($emails); - })->flatten()->toArray(); - - $dp1 = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $id)->first(); - - foreach ($permohonan->debiture->documents as $document) { - $village_permohonan = $document->village_code; - $district_permohonan = $document->district_code; - $city_permohonan = $document->city_code; - $province_permohonan = $document->province_code; - } - - $villages = Village::where('code', $village_permohonan)->get(); - $districts = District::where('code', $district_permohonan)->get(); - $cities = City::where('code', $city_permohonan)->get(); - $provinces = Province::where('code', $province_permohonan)->get(); - - $subject = 'Send Penawaran K J P P Email'; - - $body_pdf = view('lpj::penawaran.kirimEmailKJPP', [ - 'dp1' => $dp1, - 'penawaran' => $penawaran, - 'permohonan' => $permohonan, - 'kjpps' => $kjpps, - 'villages' => $villages, - 'districts' => $districts, - 'cities' => $cities, - 'provinces' => $provinces, - ])->render(); - - SendPenawaranKJPPTenderJob::dispatch( - $kjpps, - $dp1, - $penawaran, - $permohonan, - $villages, - $districts, - $cities, - $provinces, - ); - - try { - // Proses log email - foreach ($kjpps as $email) { - // Cek apakah sudah ada log dengan status 'failed' untuk email ini - $log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) - ->where('to_email', $email) - ->where('status', 'failed') - ->first(); - - $log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) - ->where('to_email', $email) - ->where('status', 'success') - ->first(); - - if ($log) { - // Jika log ditemukan dan statusnya 'failed', update status menjadi 'success' - $log->update([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'status' => 'success', - 'error_message' => null, // Reset error_message saat status diubah menjadi success - 'updated_at' => now(), - ]); - } else { - if ($log1) { - // Jika log ditemukan dan statusnya 'success' biarkan saja - $log1->update([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'updated_at' => now(), - ]); - } else { - // Jika tidak ada log gagal, buat log baru dengan status 'success' - PenawaranEmailTenderLog::create([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'status' => 'success', - 'error_message' => null, // Tidak ada error message - 'created_at' => now(), - 'updated_at' => now(), - ]); - } - } - } - - return redirect()->route('tender.penawaran.ulang.index')->with( - 'success', - 'Email Penawaran Berhasil Terkirim!', - ); - } catch (Exception $e) { - // Log email gagal - foreach ($kjpps as $email) { - $log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) - ->where('to_email', $email) - ->where('status', 'success') - ->first(); - - $log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) - ->where('to_email', $email) - ->where('status', 'failed') - ->first(); - - if ($log) { - // Jika log ditemukan dan statusnya 'success', update status menjadi 'failed' - $log->update([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'status' => 'failed', - 'error_message' => $e->getMessage(), - 'updated_at' => now(), - ]); - } else { - if ($log1) { - // Jika log ditemukan dan statusnya 'failed' biarkan saja - $log1->update([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'error_message' => $e->getMessage(), - 'updated_at' => now(), - ]); - } else { - PenawaranEmailTenderLog::create([ - 'penawaran_id' => $penawaran->id, - 'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name, - 'to_email' => $email, - 'subject' => $subject, - 'body_pdf' => $body_pdf, - 'status' => 'failed', - 'error_message' => $e->getMessage(), - 'created_at' => now(), - 'updated_at' => now(), - ]); - } - } - } - return redirect()->route('tender.penawaran.showKirimEmail', ['noreg' => $noreg])->with( - 'error', - 'Email Penawaran Gagal Terkirim!', - ); - } + // Commit the transaction + DB::commit(); + + return redirect() + ->route('tender.penawaran.index') + ->with('success', 'Data Penawaran created successfully'); + } catch (Exception $e) { + DB::rollBack(); + + return redirect() + ->route('tender.penawaran.createPenawaran', $noreg) + ->with('error', 'Validation failed: ' . $e); } } + + /** + * Show the specified resource. + */ + public function penawaran_show($noreg) + { + $penawaran = null; + $kjpps = null; + $tujuan_penilaian_kjpp = null; + $jenis_laporan = null; + + $penawaranExists = PenawaranTender::where('nomor_registrasi', $noreg)->exists(); + + $penawaran1 = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + + if (!$penawaran1) { + return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with('error', 'Penawaran dengan nomor registrasi ini belum dibuat. Silahkan isi terlebih dahulu!'); + } + + if ($penawaran1->status != 'tender') { + return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!'); + } + + // dd($penawaran1->id); + if ($penawaran1) { + $penawaran = $penawaran1; + $detail_penawaran = PenawaranDetailTender::where('penawaran_id', '=', $penawaran1->id)->where('status', '=', 1)->pluck('kjpp_rekanan_id')->toArray(); + $kjpps = KJPP::whereIn('id', $detail_penawaran)->get(); + $tujuan_penilaian_kjpp = TujuanPenilaianKJPP::where('id', $penawaran->tujuan_penilaian_kjpp_id)->get(); + $jenis_laporan = JenisLaporan::where('id', $penawaran->jenis_laporan_id)->get(); + } else { + $penawaran2 = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); + $penawaran = $penawaran2; + } + + // dd($kjpps); + + return view('lpj::penawaran.show', compact('noreg', 'penawaran', 'kjpps', 'tujuan_penilaian_kjpp', 'jenis_laporan', 'penawaranExists')); + } + + /** + * Show the form for editing the specified resource. + */ + public function penawaran_edit($noreg) + { + // Find the specific penawaran by its ID + $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + + if (!$penawaran) { + return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with('error', 'Penawaran dengan nomor registrasi ini belum dibuat. Silahkan isi terlebih dahulu!'); + } + + $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); + + + if ($penawaran->status != 'tender') { + return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!'); + } + + $status = StatusPermohonan::all(); + $tujuan_penilaian_kjpp = TujuanPenilaianKJPP::all(); + $jenis_laporan = JenisLaporan::all(); + + $detail_penawaran = PenawaranDetailTender::where('penawaran_id', '=', $penawaran->id)->where('status', '=', 1)->pluck('kjpp_rekanan_id')->toArray(); + $kjpps = KJPP::whereIn('id', $detail_penawaran)->pluck('id')->toArray(); + + $kjpp = KJPP::all(); + + // dd($penawaran); + + return view('lpj::penawaran.edit', compact('status', 'tujuan_penilaian_kjpp', 'jenis_laporan', 'kjpp', 'penawaran', 'noreg', 'kjpps', 'permohonan')); + } + + + /** + * Update the specified resource in storage. + */ + public function penawaran_update(TenderPenawaranRequest $request, $noreg) + { + $validated = $request->validated(); + + DB::beginTransaction(); + + try { + // Ambil data penawaran berdasarkan nomor registrasi + $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); + + // Ambil ID user yang sedang login + $userId = Auth::user()->id; + + // Jangan ubah created_by untuk data yang sudah ada + $validated['nomor_registrasi'] = $penawaran->nomor_registrasi; + $validated['status'] = $request->input('status') ?? 'tender'; + $validated['created_by'] = $userId; + $validated['updated_by'] = $userId; // Hanya update 'updated_by' + $validated['end_date'] = $request->input('end_date') . ' 17:00:00'; + // dd($validated['end_date']); + + // Update data penawaran dan permohonan + $penawaran->update($validated); + $permohonan->update($validated); + + $kjpps = $request->input('kjpp', []); + + // Ubah status KJPP lama menjadi 0 jika tidak ada dalam request + foreach ($penawaran->penawaranKjpp as $kjpp) { + if (!in_array($kjpp->kjpp_rekanan_id, $kjpps)) { + // Ubah status KJPP lama menjadi 0 + $kjpp->status = 0; + $kjpp->created_by = $userId; + $kjpp->updated_by = $userId; // Set updated_by + $kjpp->save(); + } + } + + // Tangani penambahan atau perubahan KJPP baru + foreach ($kjpps as $kjpp) { + $existingDetail = PenawaranDetailTender::where('penawaran_id', $penawaran->id) + ->where('kjpp_rekanan_id', $kjpp) + ->first(); + + // dd($existingDetail); + + if ($existingDetail) { + // Jika KJPP sudah ada, pastikan statusnya aktif (1) + if ($existingDetail->status == 0) { + $existingDetail->status = 1; + $existingDetail->created_by = $userId; + $existingDetail->updated_by = $userId; // Set updated_by + $existingDetail->save(); + } + } else { + // Buat data baru jika tidak ada dalam database + PenawaranDetailTender::create([ + 'penawaran_id' => $penawaran->id, + 'kjpp_rekanan_id' => $kjpp, + 'status' => 1, // Default status untuk KJPP baru adalah 1 + 'created_by' => $userId, // Set created_by untuk data baru + 'updated_by' => $userId, // Set updated_by juga + ]); + } + } + + // Commit transaksi + DB::commit(); + + return redirect() + ->route('tender.penawaran.ulang.index') + ->with('success', 'Data Penawaran updated successfully'); + } catch (Exception $e) { + // Rollback jika ada kesalahan + DB::rollBack(); + + return redirect() + ->route('tender.penawaran.createPenawaran', $noreg) + ->with('error', 'Validation failed: ' . $e->getMessage()); + } + } + + + /** + * Tampilkan Surat Tender + */ + public function showSuratTender($noreg) + { + $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); + + // Kalau tidak ketemu nomor registrasi dengan tabel penawaran + if (!$penawaran) { + return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg]) + ->with('error', 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!'); + } + + if ($penawaran->status != 'tender') { + return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!'); + } + + // Kalau tidak ada dokumen jaminan maka di arahkan ke halaman dokumen jaminan + if ($permohonan->debiture->documents->isEmpty()) { + return redirect()->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id]) + ->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!'); + } + + foreach ($permohonan->debiture->documents as $document) { + $village_permohonan = $document->village_code; + $district_permohonan = $document->district_code; + $city_permohonan = $document->city_code; + $province_permohonan = $document->province_code; + } + + $villages = Village::where('code', $village_permohonan)->get(); + $districts = District::where('code', $district_permohonan)->get(); + $cities = City::where('code', $city_permohonan)->get(); + $provinces = Province::where('code', $province_permohonan)->get(); + + date_default_timezone_set('Asia/Jakarta'); + + $now = date('Y-m-d H:i:s'); + // Jika batas tanggal penawaran sudah lewat + if ($penawaran->end_date < $now) { + return redirect()->route('tender.penawaran.editPenawaran', ['noreg' => $noreg]) + ->with('error', 'Sudah Kadaluarsa. Silahkan perpanjang tanggal penawaran terlebih dahulu!'); + } + + return view('lpj::penawaran.surat_tender', compact('penawaran', 'noreg', 'permohonan', 'villages', 'districts', 'cities', 'provinces')); + } + + public function suratTenderKJPP($noreg, $id) + { + $kjpp = KJPP::find($id); + $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); + $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + + if (!$penawaran) { + return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $penawaran->nomor_registrasi]) + ->with('error', 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!'); + } + + if ($penawaran->status != 'tender') { + return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!'); + } + + // Kalau tidak ada dokumen jaminan maka di arahkan ke halaman dokumen jaminan + if ($permohonan->debiture->documents->isEmpty()) { + return redirect()->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id]) + ->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!'); + } + + foreach ($permohonan->debiture->documents as $document) { + $village_permohonan = $document->village_code; + $district_permohonan = $document->district_code; + $city_permohonan = $document->city_code; + $province_permohonan = $document->province_code; + } + + $villages = Village::where('code', $village_permohonan)->get(); + $districts = District::where('code', $district_permohonan)->get(); + $cities = City::where('code', $city_permohonan)->get(); + $provinces = Province::where('code', $province_permohonan)->get(); + + date_default_timezone_set('Asia/Jakarta'); + + $now = date('Y-m-d H:i:s'); + // Jika batas tanggal penawaran sudah lewat + if ($penawaran->end_date < $now) { + return redirect()->route('tender.penawaran.editPenawaran', ['noreg' => $noreg]) + ->with('error', 'Sudah Kadaluarsa. Silahkan perpanjang tanggal penawaran terlebih dahulu!'); + } + + $detail_penawaran = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $kjpp->id)->get(); + + foreach ($detail_penawaran as $detail) { + $detail_penawaran_1 = $detail->kjpp; + } + + return view('lpj::penawaran.surat_tender_kjpp', compact('penawaran', 'noreg', 'permohonan', 'villages', 'districts', 'cities', 'provinces', 'detail_penawaran_1', 'id')); + } + + public function datatablesPenawaran(Request $request) + { + if (is_null($this->user) || !$this->user->can('penawaran.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query = Permohonan::query()->where('status', '=', 'registered')->where('jenis_penilaian_id', '=', 2); + + // 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 exportPenawaran() + { + return Excel::download(new PenawaranTenderExport, 'penawarantender.xlsx'); + } + + // penawaran ulang + public function penawaran_ulang_index() + { + return view('lpj::penawaran_ulang/index'); + } + + public function datatablesPenawaranUlang(Request $request) + { + if (is_null($this->user) || !$this->user->can('penawaran_ulang.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query = Permohonan::query()->where('status', '=', 'tender')->where('jenis_penilaian_id', '=', 2); + + // 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, + ]); + } + + // Tambahkan method untuk API di controller + public function checkPenawaranExistence($nomor_registrasi) + { + // Cek apakah nomor_registrasi ada dalam tabel penawaran + $exists = PenawaranTender::where('nomor_registrasi', $nomor_registrasi)->exists(); + + // Kembalikan hasil pengecekan sebagai JSON + return response()->json(['exists' => $exists]); + } + + public function downloadSuratTender($noreg) + { + $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); + + if ($penawaran->status != 'tender') { + return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!'); + } + + foreach ($permohonan->debiture->documents as $document) { + $village_permohonan = $document->village_code; + $district_permohonan = $document->district_code; + $city_permohonan = $document->city_code; + $province_permohonan = $document->province_code; + } + + $villages = Village::where('code', $village_permohonan)->get(); + $districts = District::where('code', $district_permohonan)->get(); + $cities = City::where('code', $city_permohonan)->get(); + $provinces = Province::where('code', $province_permohonan)->get(); + + $pdf = app('dompdf.wrapper'); // create an instance of the PDF class + $pdf->loadView('lpj::penawaran.surat_tender_download', compact('penawaran', 'permohonan', 'villages', 'districts', 'cities', 'provinces')); + + return $pdf->download('surat_tender' . time() . '.pdf'); + } + + public function downloadSuratTenderKJPP($noreg, $id) + { + $kjpp = KJPP::find($id); + $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); + + if ($penawaran->status != 'tender') { + return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!'); + } + + foreach ($permohonan->debiture->documents as $document) { + $village_permohonan = $document->village_code; + $district_permohonan = $document->district_code; + $city_permohonan = $document->city_code; + $province_permohonan = $document->province_code; + } + + $villages = Village::where('code', $village_permohonan)->get(); + $districts = District::where('code', $district_permohonan)->get(); + $cities = City::where('code', $city_permohonan)->get(); + $provinces = Province::where('code', $province_permohonan)->get(); + + $detail_penawaran = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $kjpp->id)->get(); + + foreach ($detail_penawaran as $detail) { + $detail_penawaran_1 = $detail->kjpp; + } + + $pdf = app('dompdf.wrapper'); // create an instance of the PDF class + $pdf->loadView('lpj::penawaran.surat_tender_kjpp_download', compact('penawaran', 'permohonan', 'villages', 'districts', 'cities', 'provinces', 'detail_penawaran_1')); + + return $pdf->download('surat_tender_kjpp' . time() . '.pdf'); + } + + // Kirim Email + public function showKirimEmail($noreg) + { + $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); + + if (!$penawaran) { + return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg]) + ->with('error', 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!'); + } + + if ($penawaran->status != 'tender') { + return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!'); + } + + if ($permohonan->debiture->documents->isEmpty()) { + return redirect()->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id]) + ->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!'); + } + + return view('lpj::penawaran.showKirimEmail', compact('penawaran', 'permohonan', 'noreg')); + } + + public function dataTablesShowKirimSurat(Request $request, $noreg) + { + if (is_null($this->user) || !$this->user->can('penawaran.view')) { + // abort(403, 'Sorry! You are not allowed to view users.'); + } + + $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + + // Retrieve data from the database + $query = PenawaranDetailTender::query()->where('penawaran_id', '=', $penawaran->id)->with(['kjpp', 'penawaran', 'penawaran.emailTenderLog']); + + // dd($query); + + // Apply sorting if provided + if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { + $order = $request->get('sortOrder'); + $column = $request->get('sortField'); + + // Handle sorting for related table columns + if ($column === 'nama_kjpp') { + // Join with the KJPP table and sort by the name column + $query->join('kjpp', 'detail_penawaran.kjpp_rekanan_id', '=', 'kjpp.id') + ->orderBy('kjpp.name', $order) + ->select('detail_penawaran.*'); // Select only the main table columns to avoid conflicts + } else if ($column === 'nomor_kjpp') { + $query->join('kjpp', 'detail_penawaran.kjpp_rekanan_id', '=', 'kjpp.id') + ->orderBy('kjpp.code', $order) + ->select('detail_penawaran.*'); + } else { + // Sort by columns in the main table + $query->orderBy($column, $order); + } + } + + // Get the data for the current page + $data = $query->get(); + + // add column "No" + $i = 0; + $j = 1; + foreach ($data as $obj) { + + // tanggal_permohonan + $data[$i]->numbernya = $j; + $i++; + $j++; + } + + // Return the response data as a JSON object + return response()->json([ + 'draw' => $request->get('draw'), + 'data' => $data, + ]); + } + + public function kirimEmailAll($noreg) + { + $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); + + if (!$penawaran) { + return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg]) + ->with('error', 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!'); + } + + if ($penawaran->status != 'tender') { + return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!'); + } + + if ($permohonan->debiture->documents->isEmpty()) { + return redirect()->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id]) + ->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!'); + } + + $detail_penawaran = PenawaranDetailTender::where('penawaran_id', '=', $penawaran->id)->where('status', '=', 1)->pluck('kjpp_rekanan_id')->toArray(); + $kjpps = KJPP::whereIn('id', $detail_penawaran) + ->get() + ->map(function ($item) { + $emails = [$item->email_kantor]; + + // Parse JSON string jika ada dan tidak kosong + if (!empty($item->detail_email_kantor) && $item->detail_email_kantor !== '[]') { + $detail_emails = json_decode($item->detail_email_kantor, true); + if (is_array($detail_emails)) { + foreach ($detail_emails as $detail) { + if (isset($detail['email_kantor'])) { + $emails[] = $detail['email_kantor']; + } + } + } + } + + return array_filter($emails); + }) + ->flatten() + ->toArray(); + + foreach ($permohonan->debiture->documents as $document) { + $village_permohonan = $document->village_code; + $district_permohonan = $document->district_code; + $city_permohonan = $document->city_code; + $province_permohonan = $document->province_code; + } + + $villages = Village::where('code', $village_permohonan)->get(); + $districts = District::where('code', $district_permohonan)->get(); + $cities = City::where('code', $city_permohonan)->get(); + $provinces = Province::where('code', $province_permohonan)->get(); + + + SendPenawaranTenderJob::dispatch( + $kjpps, + $penawaran, + $permohonan, + $villages, + $districts, + $cities, + $provinces + ); + + return redirect()->route('tender.penawaran.ulang.index')->with('success', 'Email Penawaran Berhasil Terkirim!'); + } + + public function kirimEmailKJPP($noreg, $id) + { + $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); + + if (!$penawaran) { + return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg]) + ->with('error', 'Anda Belum Membuat Penawaran. Silahkan isi terlebih dahulu!'); + } + + if ($penawaran->status != 'tender') { + return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!'); + } + + if ($permohonan->debiture->documents->isEmpty()) { + return redirect()->route('debitur.jaminan.create', ['id' => $permohonan->debiture->id]) + ->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!'); + } + + $detail_penawaran = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $id)->pluck('kjpp_rekanan_id')->toArray(); + $kjpps = KJPP::whereIn('id', $detail_penawaran) + ->get() + ->map(function ($item) { + $emails = [$item->email_kantor]; + + // Parse JSON string jika ada dan tidak kosong + if (!empty($item->detail_email_kantor) && $item->detail_email_kantor !== '[]') { + $detail_emails = json_decode($item->detail_email_kantor, true); + if (is_array($detail_emails)) { + foreach ($detail_emails as $detail) { + if (isset($detail['email_kantor'])) { + $emails[] = $detail['email_kantor']; + } + } + } + } + + return array_filter($emails); + }) + ->flatten() + ->toArray(); + + $dp1 = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $id)->first(); + + foreach ($permohonan->debiture->documents as $document) { + $village_permohonan = $document->village_code; + $district_permohonan = $document->district_code; + $city_permohonan = $document->city_code; + $province_permohonan = $document->province_code; + } + + $villages = Village::where('code', $village_permohonan)->get(); + $districts = District::where('code', $district_permohonan)->get(); + $cities = City::where('code', $city_permohonan)->get(); + $provinces = Province::where('code', $province_permohonan)->get(); + + $subject = 'Send Penawaran K J P P Email'; + + $body_pdf = view('lpj::penawaran.kirimEmailKJPP', [ + 'dp1' => $dp1, + 'penawaran' => $penawaran, + 'permohonan' => $permohonan, + 'kjpps' => $kjpps, + 'villages' => $villages, + 'districts' => $districts, + 'cities' => $cities, + 'provinces' => $provinces + ])->render(); + + SendPenawaranKJPPTenderJob::dispatch( + $kjpps, + $dp1, + $penawaran, + $permohonan, + $villages, + $districts, + $cities, + $provinces + ); + + try { + // Proses log email + foreach ($kjpps as $email) { + // Cek apakah sudah ada log dengan status 'failed' untuk email ini + $log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) + ->where('to_email', $email) + ->where('status', 'failed') + ->first(); + + $log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) + ->where('to_email', $email) + ->where('status', 'success') + ->first(); + + if ($log) { + // Jika log ditemukan dan statusnya 'failed', update status menjadi 'success' + $log->update([ + 'status' => 'success', + 'error_message' => null, // Reset error_message saat status diubah menjadi success + 'updated_at' => now(), + ]); + } else if ($log1) { + // Jika log ditemukan dan statusnya 'success' biarkan saja + $log1->update([ + 'updated_at' => now(), + ]); + } else { + // Jika tidak ada log gagal, buat log baru dengan status 'success' + PenawaranEmailTenderLog::create([ + 'penawaran_id' => $penawaran->id, + 'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name, + 'to_email' => $email, + 'subject' => $subject, + 'body_pdf' => $body_pdf, + 'status' => 'success', + 'error_message' => null, // Tidak ada error message + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + } + + return redirect()->route('tender.penawaran.ulang.index')->with('success', 'Email Penawaran Berhasil Terkirim!'); + } catch (\Exception $e) { + // Log email gagal + foreach ($kjpps as $email) { + $log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) + ->where('to_email', $email) + ->where('status', 'success') + ->first(); + + $log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) + ->where('to_email', $email) + ->where('status', 'failed') + ->first(); + + if ($log) { + // Jika log ditemukan dan statusnya 'success', update status menjadi 'failed' + $log->update([ + 'status' => 'failed', + 'error_message' => $e->getMessage(), + 'updated_at' => now(), + ]); + } else if ($log1) { + // Jika log ditemukan dan statusnya 'failed' biarkan saja + $log1->update([ + 'error_message' => $e->getMessage(), + 'updated_at' => now(), + ]); + } else { + PenawaranEmailTenderLog::create([ + 'penawaran_id' => $penawaran->id, + 'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name, + 'to_email' => $email, + 'subject' => $subject, + 'body_pdf' => $body_pdf, + 'status' => 'failed', + 'error_message' => $e->getMessage(), + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + } + + return redirect()->route('tender.penawaran.showKirimEmail', ['noreg' => $noreg])->with('error', 'Email Penawaran Gagal Terkirim!'); + } + } +}