diff --git a/app/Emails/SendPenawaranKJPPEmail.php b/app/Emails/SendPenawaranKJPPEmail.php new file mode 100644 index 0000000..c779b90 --- /dev/null +++ b/app/Emails/SendPenawaranKJPPEmail.php @@ -0,0 +1,55 @@ +dp1 = $dp1; + $this->penawaran = $penawaran; + $this->permohonan = $permohonan; + $this->villages = $villages; + $this->districts = $districts; + $this->cities = $cities; + $this->provinces = $provinces; + } + + /** + * Build the message. + */ + public function build(): self + { + // Kirim data ke view + return $this->view('lpj::penawaran.kirimEmailKJPP') + ->with([ + 'dp1' => $this->dp1, + 'penawaran' => $this->penawaran, + 'permohonan' => $this->permohonan, + 'villages' => $this->villages, + 'districts' => $this->districts, + 'cities' => $this->cities, + 'provinces' => $this->provinces, + ]); + } +} diff --git a/app/Emails/SendPenawaranTenderEmail.php b/app/Emails/SendPenawaranTenderEmail.php new file mode 100644 index 0000000..95930a4 --- /dev/null +++ b/app/Emails/SendPenawaranTenderEmail.php @@ -0,0 +1,29 @@ +view('lpj::penawaran.kirimEmail'); + } +} diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php index 044c3f6..970fcc7 100644 --- a/app/Helpers/Lpj.php +++ b/app/Helpers/Lpj.php @@ -1,36 +1,18 @@ month - 1]; - return $carbonDate->format('d') . ' ' . $month . ' ' . $carbonDate->format('Y'); - } - - function formatTanggalIndonesia2($date) + function formatTanggalIndonesia($date,$time=false) { Carbon::setLocale('id'); $waktu = Carbon::parse($date); + if(!$time){ + return $waktu->translatedFormat('d F Y'); + } return $waktu->translatedFormat('d F Y') . ' pukul ' . $waktu->format('H.i') . ' WIB'; } @@ -120,6 +102,28 @@ return implode(' ', $words); } + // generate last penawaran.code + function onLastnumberCodePenawaran(): string + { + // chek data penawaran terakhir --> mengurutkan data berdasarkan kolom `created_at` secara DESC + $maxCode = PenawaranTender::max('code'); + // $penawaran = PenawaranTender::latest()->first(); + $penawaran = PenawaranTender::where('code','=',$maxCode)->first(); + $code_penawaran_last=''; + $noUrutAkhirString = sprintf("%04s", 1); + if($penawaran) + { + $code_penawaran_last = substr ($maxCode, -4); + $year_penawaran_last = Carbon::parse($penawaran->created_at)->year; + $year_now = Carbon::now()->year; + if($year_now == $year_penawaran_last) + { + $noUrutAkhirString = sprintf("%04s", abs($code_penawaran_last + 1)); + } + } + + return 'NP'.Carbon::now()->format('y').$noUrutAkhirString; + } // andy add diff --git a/app/Http/Controllers/OtorisasiPenawaranController.php b/app/Http/Controllers/OtorisasiPenawaranController.php index 66180ed..82f6fff 100644 --- a/app/Http/Controllers/OtorisasiPenawaranController.php +++ b/app/Http/Controllers/OtorisasiPenawaranController.php @@ -5,6 +5,7 @@ namespace Modules\Lpj\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Http\Controllers\Controller; +use Carbon\Carbon; use Exception; use Maatwebsite\Excel\Facades\Excel; use Illuminate\Http\JsonResponse; @@ -40,7 +41,18 @@ class OtorisasiPenawaranController extends Controller // Retrieve data from the database $query =PenawaranTender::query() - ->select('penawaran.*',DB::raw("CONCAT(DATE_FORMAT(penawaran.start_date, '%d %M %Y'), ' - ', DATE_FORMAT(penawaran.end_date, '%d %M %Y')) AS date_range"), 'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name') + ->select('penawaran.*', + 'debitures.name as debitures_name', + 'permohonan.tanggal_permohonan', + 'users.name as user_pemohon', + 'branches.name as branches_name', + 'tujuan_penilaian.name as tujuan_penilaian_name', + 'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name') + ->leftJoin('permohonan', 'permohonan.nomor_registrasi', '=', 'penawaran.nomor_registrasi') + ->leftJoin('debitures', 'debitures.id', '=', 'permohonan.debiture_id') + ->leftJoin('users', 'users.id', '=', 'permohonan.user_id') + ->leftJoin('branches', 'branches.id', '=', 'permohonan.branch_id') + ->leftJoin('tujuan_penilaian', 'tujuan_penilaian.id','=','permohonan.tujuan_penilaian_id') ->leftJoin('tujuan_penilaian_kjpp', 'tujuan_penilaian_kjpp.id','=','penawaran.tujuan_penilaian_kjpp_id') ->where('penawaran.status','=','proposal-tender') ->withCount('penawarandetails'); @@ -82,6 +94,27 @@ class OtorisasiPenawaranController extends Controller //$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get(); $data = $query->get(); + // format date + $i = 0; + foreach ($data as $obj) { + + // tanggal_permohonan + if ($obj->tanggal_permohonan) { + $data[$i]->tanggal_permohonan = Carbon::parse($obj->tanggal_permohonan)->format('d M Y'); + } + + // date_range + $data[$i]->date_range = "-"; + if ($obj->start_date && $obj->end_date) + { + $data[$i]->date_range = Carbon::parse($obj->start_date)->format('d M Y') . ' - ' . + Carbon::parse($obj->end_date)->format('d M Y'); + } + + $i++; + } + // format date + // Calculate the page count $pageCount = ceil($totalRecords / $request->get('size')); diff --git a/app/Http/Controllers/PermohonanController.php b/app/Http/Controllers/PermohonanController.php index 3a0956d..20a379b 100644 --- a/app/Http/Controllers/PermohonanController.php +++ b/app/Http/Controllers/PermohonanController.php @@ -147,30 +147,8 @@ if ($permohonan->status == 'revisi') { $validate['status'] = 'order'; } - $permohonan->update($validate); - $afterRequest = $permohonan->fresh()->toArray(); - // Process file upload - $file = null; - if ($request->hasFile('attachment')) { - $file = $request->file('attachment'); - } - - // Get keterangan if provided - $keterangan = $request->input('keterangan') ?? null; - - $status =$validate['status'] ?? $permohonan->status; - - $this->historyService->createHistory( - $permohonan, - $status, - $keterangan, - $beforeRequest, - $afterRequest, - $file - ); - return redirect() ->route('permohonan.index')->with('success', 'Permohonan updated successfully'); } catch (Exception $e) { diff --git a/app/Http/Controllers/ProsesPenawaranController.php b/app/Http/Controllers/ProsesPenawaranController.php index 05b199c..f457660 100644 --- a/app/Http/Controllers/ProsesPenawaranController.php +++ b/app/Http/Controllers/ProsesPenawaranController.php @@ -13,12 +13,16 @@ use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\DB; +use Modules\Lpj\Http\Requests\ProsesPenawaranRequest; +use Modules\Lpj\Models\JenisLaporan; use Modules\Lpj\Models\KJPP; use Modules\Lpj\Models\PenawaranDetailTender; use Modules\Lpj\Models\PenawaranDetailTenderLog; use Modules\Lpj\Models\PenawaranTender; use Modules\Lpj\Models\Permohonan; +use Modules\Lpj\Models\StatusPermohonan; +use Modules\Lpj\Models\TujuanPenilaianKJPP; class ProsesPenawaranController extends Controller { @@ -40,7 +44,51 @@ class ProsesPenawaranController extends Controller } // Retrieve data from the database - $query = PenawaranTender::query()->whereIn('status', ['tender', 'proposal-tender'])->withCount('penawarandetails'); + // $query = PenawaranTender::query()->whereIn('status', ['tender', 'proposal-tender'])->withCount('penawarandetails'); + + // penawaran need union with permohonan + $query = PenawaranTender::query()->whereIn('penawaran.status', ['tender', 'proposal-tender']) + ->select('penawaran.id', + 'penawaran.nomor_registrasi', + 'penawaran.code as penawaran_code', + 'penawaran.start_date', + 'penawaran.end_date', + 'penawaran.status as statusnya', + 'debitures.name as debitures_name', + 'permohonan.tanggal_permohonan', + 'users.name as user_pemohon', + 'branches.name as branches_name', + 'tujuan_penilaian.name as tujuan_penilaian_name', + 'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name' + ) + ->withCount('penawarandetails') + ->leftJoin('permohonan', 'permohonan.nomor_registrasi', '=', 'penawaran.nomor_registrasi') + ->leftJoin('users', 'users.id', '=', 'permohonan.user_id') + ->leftJoin('branches', 'branches.id', '=', 'permohonan.branch_id') + ->leftJoin('tujuan_penilaian', 'tujuan_penilaian.id','=','permohonan.tujuan_penilaian_id') + ->leftJoin('debitures', 'debitures.id', '=', 'permohonan.debiture_id') + ->leftJoin('tujuan_penilaian_kjpp', 'tujuan_penilaian_kjpp.id', '=', 'penawaran.tujuan_penilaian_kjpp_id'); + + $permohonanQuery = Permohonan::whereIn('permohonan.status', ['registered'])->where('permohonan.jenis_penilaian_id', '=', 2) + ->select('permohonan.id', + 'permohonan.nomor_registrasi', + DB::raw('"" as penawaran_code'), + DB::raw('"" as start_date'), + DB::raw('"" as end_date'), + 'permohonan.status as statusnya', + 'debitures.name as debitures_name', + 'permohonan.tanggal_permohonan', + 'users.name as user_pemohon', + 'branches.name as branches_name', + 'tujuan_penilaian.name as tujuan_penilaian_name', + DB::raw('"" as tujuan_penilaian_kjpp_name'), + DB::raw('"-" as penawarandetails_count')) + ->leftJoin('users', 'users.id', '=', 'permohonan.user_id') + ->leftJoin('branches', 'branches.id', '=', 'permohonan.branch_id') + ->leftJoin('debitures', 'debitures.id', '=', 'permohonan.debiture_id') + ->leftJoin('tujuan_penilaian', 'tujuan_penilaian.id','=','permohonan.tujuan_penilaian_id'); + $query->union($permohonanQuery); + // penawaran need union with permohonan // Apply search filter if provided if ($request->has('search') && !empty($request->get('search'))) { @@ -76,8 +124,29 @@ class ProsesPenawaranController extends Controller $filteredRecords = $query->count(); // Get the data for the current page - //$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get(); - $data = $query->with(['tujuanPenilaianKjpp','permohonan','permohonan.debiture'])->get(); + // $data = $query->with(['tujuanPenilaianKjpp','permohonan','permohonan.debiture'])->get(); + $data = $query->get(); + + // format date + $i = 0; + foreach ($data as $obj) { + + // tanggal_permohonan + if ($obj->tanggal_permohonan) { + $data[$i]->tanggal_permohonan = Carbon::parse($obj->tanggal_permohonan)->format('d M Y'); + } + + // date_range + $data[$i]->date_range = "-"; + if ($obj->start_date && $obj->end_date) + { + $data[$i]->date_range = Carbon::parse($obj->start_date)->format('d M Y') . ' - ' . + Carbon::parse($obj->end_date)->format('d M Y'); + } + + $i++; + } + // format date // Calculate the page count $pageCount = ceil($totalRecords / $request->get('size')); @@ -826,4 +895,77 @@ class ProsesPenawaranController extends Controller return response()->json($data); } + + // merger permohonan + /** + * Show the form for creating a new resource. + */ + public function createPenawaran($id) + { + // id ==> permohonan.id + $permohonan = Permohonan::find($id); + // dd($permohonan); + $status = StatusPermohonan::all(); + $tujuan_penilaian_kjpp = TujuanPenilaianKJPP::all(); + $jenis_laporan = JenisLaporan::all(); + $kjpp = KJPP::all(); + + return view('lpj::prosespenawaran.createPenawaran', compact('id', 'status', 'tujuan_penilaian_kjpp', 'jenis_laporan', 'kjpp', 'permohonan')); + } + + public function storePenawaran(ProsesPenawaranRequest $request, $id) + { + $validated = $request->validated(); + + DB::beginTransaction(); + + try { + + $permohonan = Permohonan::find($id); + + $userId = Auth::user()->id; + $validated['nomor_registrasi'] = $permohonan->nomor_registrasi; + $validated['status'] = 'tender'; + $validated['updated_by'] = $userId; // Updating the record + $validated['end_date'] = $request->input('end_date') . ' 23:59:59'; + + $permohonan->update($validated); + + // Adding created_by for the new penawaran record + $validated['created_by'] = $userId; + $validated['code'] = onLastnumberCodePenawaran(); + $penawaran = PenawaranTender::create($validated); + + $kjpps = $request->input('kjpp', []); + + foreach ($kjpps as $kjpp) { + PenawaranDetailTender::create([ + 'penawaran_id' => $penawaran->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.prosespenawaran.index') + ->with('success', 'Data Penawaran created successfully'); + } catch (Exception $e) { + DB::rollBack(); + + return redirect() + ->route('tender.prosespenawaran.createPenawaran', $id) + ->with('error', 'Validation failed: ' . $e); + } + } + + public function showPermohonan($id) + { + $permohonan = Permohonan::find($id); + return view('lpj::prosespenawaran.showPermohonan', compact('id', 'permohonan')); + } + // merger permohonan } diff --git a/app/Http/Controllers/TenderController.php b/app/Http/Controllers/TenderController.php index 8f2c7d2..f4edb45 100644 --- a/app/Http/Controllers/TenderController.php +++ b/app/Http/Controllers/TenderController.php @@ -3,7 +3,6 @@ namespace Modules\Lpj\Http\Controllers; use Exception; -use Barryvdh\DomPDF\PDF; use Illuminate\Http\Request; use Modules\Lpj\Models\KJPP; use Modules\Location\Models\City; @@ -16,13 +15,14 @@ use Modules\Location\Models\Village; use Modules\Lpj\Models\JenisLaporan; use Modules\Location\Models\District; use Modules\Location\Models\Province; -use Illuminate\Support\Facades\Storage; use Modules\Lpj\Models\PenawaranTender; use Modules\Lpj\Models\StatusPermohonan; use Modules\Lpj\Models\TujuanPenilaianKJPP; use Modules\Lpj\Models\PenawaranDetailTender; use Modules\Lpj\Exports\PenawaranTenderExport; use Modules\Lpj\Http\Requests\TenderPenawaranRequest; +use Modules\Lpj\Jobs\SendPenawaranKJPPTenderJob; +use Modules\Lpj\Jobs\SendPenawaranTenderJob; class TenderController extends Controller { @@ -321,6 +321,57 @@ class TenderController extends Controller 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')) { @@ -500,4 +551,284 @@ class TenderController extends Controller 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', 'emailTenderLog']); + + // 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 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(['kjpp', 'penawaran', 'emailTenderLog'])->get(); + + // add column "No" + $i = 0; + $j = 1; + foreach ($data as $obj) { + + // tanggal_permohonan + $data[$i]->numbernya = $j; + $i++; + $j++; + } + + // 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 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(); + + // dd($dp1->kjpp); + + 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(); + + try { + $balikan = SendPenawaranKJPPTenderJob::dispatch( + $kjpps, + $dp1, + $penawaran, + $permohonan, + $villages, + $districts, + $cities, + $provinces + ); + } catch (\Exception $e) { + return redirect()->route('tender.penawaran.ulang.index')->with('error', 'Email Penawaran Gagal Terkirim!'); + } + + return redirect()->route('tender.penawaran.ulang.index')->with('success', 'Email Penawaran Berhasil Terkirim!'); + } } diff --git a/app/Http/Requests/ProsesPenawaranRequest.php b/app/Http/Requests/ProsesPenawaranRequest.php new file mode 100644 index 0000000..9b31000 --- /dev/null +++ b/app/Http/Requests/ProsesPenawaranRequest.php @@ -0,0 +1,85 @@ + 'exists:kjpp,id', + 'tujuan_penilaian_kjpp_id' => 'required', + 'jenis_laporan_id' => 'required', + 'start_date' => 'required', + 'end_date' => 'required', + 'catatan' => 'nullable' + ]; + + // if ($this->method() == 'PUT') { + // $rules['code'] = 'required|max:50'; + // } else { + // $rules['code'] = 'required|max:50|unique:penawaran,code'; + // } + + return $rules; + } + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } + + public function messages(): array + { + return [ + 'code.required' => 'Kode Penawaran Wajib diisi!', + 'code.max' => 'Kode Penawaran maksimal 255 huruf!', + 'code.unique' => 'Kode Penawaran tidak boleh sama!', + 'tujuan_penilaian_kjpp_id.required' => 'Tujuan Penilaian KJPP Wajib diisi!', + 'jenis_laporan_id.required' => 'Jenis Laporan Wajib diisi!', + 'start_date.required' => 'Tanggal Awal Wajib diisi!', + 'end_date.required' => 'Tanggal Akhir Wajib diisi!', + ]; + } + + public function withValidator($validator) + { + $validator->after(function ($validator) { + $startDate = strtotime($this->input('start_date')); + $endDate = strtotime($this->input('end_date')); + $today = strtotime(date('Y-m-d')); + + // Jika dalam keadaan tambah penawaran maka munculkan pesan ini + // if ($this->method() !== 'PUT') { + // if ($startDate < $today) { + // $validator->errors()->add('start_date', 'Tanggal Awal tidak boleh sebelum hari ini.'); + // } + // } + + if ($endDate < $startDate) { + $validator->errors()->add('end_date', 'Tanggal Akhir tidak boleh lebih awal dari Tanggal Awal.'); + } + + + // Validasi minimal 3 pilihan pada nama_kjpp + $namaKjpp = $this->input('kjpp', []); + + // jika nama KJPP itu kosong + if (empty($namaKjpp)) { + $validator->errors()->add('kjpp', 'Nama KJPP wajib diisi.'); + } + // jika terisi kurang dari 3 item + elseif (is_array($namaKjpp) && count($namaKjpp) < 3) { + $validator->errors()->add('kjpp', 'Nama KJPP minimal 3 pilihan.'); + } + }); + } +} diff --git a/app/Jobs/SendPenawaranKJPPTenderJob.php b/app/Jobs/SendPenawaranKJPPTenderJob.php new file mode 100644 index 0000000..52045a2 --- /dev/null +++ b/app/Jobs/SendPenawaranKJPPTenderJob.php @@ -0,0 +1,68 @@ +kjpps = $kjpps; + $this->dp1 = $dp1; // Simpan keseluruhan array dp1, bukan dp1[0] + $this->penawaran = $penawaran; + $this->permohonan = $permohonan; + $this->villages = $villages; + $this->districts = $districts; + $this->cities = $cities; + $this->provinces = $provinces; + } + + /** + * Execute the job. + */ + public function handle(): void + { + $email = new SendPenawaranKJPPEmail( + $this->dp1, + $this->penawaran, + $this->permohonan, + $this->villages, + $this->districts, + $this->cities, + $this->provinces + ); + + $email->with([ + 'dp1' => $this->dp1, // Kirim seluruh array dp1 ke email + 'penawaran' => $this->penawaran, + 'permohonan' => $this->permohonan, + 'villages' => $this->villages, + 'districts' => $this->districts, + 'cities' => $this->cities, + 'provinces' => $this->provinces, + ]); + + $send = Mail::to($this->kjpps)->send($email); + } +} diff --git a/app/Jobs/SendPenawaranTenderJob.php b/app/Jobs/SendPenawaranTenderJob.php new file mode 100644 index 0000000..6a37f6c --- /dev/null +++ b/app/Jobs/SendPenawaranTenderJob.php @@ -0,0 +1,56 @@ +kjpps = $kjpps; + $this->penawaran = $penawaran; + $this->permohonan = $permohonan; + $this->villages = $villages; + $this->districts = $districts; + $this->cities = $cities; + $this->provinces = $provinces; + } + + /** + * Execute the job. + */ + public function handle(): void + { + $email = new SendPenawaranTenderEmail(); + $email->with([ + 'penawaran' => $this->penawaran, + 'permohonan' => $this->permohonan, + 'villages' => $this->villages, + 'districts' => $this->districts, + 'cities' => $this->cities, + 'provinces' => $this->provinces, + ]); + + Mail::to($this->kjpps)->send($email); + } +} diff --git a/app/Models/KJPP.php b/app/Models/KJPP.php index b9f2e34..a558797 100644 --- a/app/Models/KJPP.php +++ b/app/Models/KJPP.php @@ -2,9 +2,10 @@ namespace Modules\Lpj\Models; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\Location\Models\Province; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Factories\HasFactory; // use Modules\Lpj\Database\Factories\KJPPFactory; @@ -19,4 +20,9 @@ class KJPP extends Model * The attributes that are mass assignable. */ protected $guarded = ['id']; + + public function PenawaranDetailTender(): HasMany + { + return $this->hasMany(PenawaranDetailTender::class, 'kjpp_rekanan_id', 'id'); + } } diff --git a/app/Models/PenawaranDetailTender.php b/app/Models/PenawaranDetailTender.php index 619f9e2..cbe3286 100644 --- a/app/Models/PenawaranDetailTender.php +++ b/app/Models/PenawaranDetailTender.php @@ -27,4 +27,9 @@ class PenawaranDetailTender extends Model { return $this->belongsTo(KJPP::class, 'kjpp_rekanan_id', 'id'); } + + public function emailTenderLog(): BelongsTo + { + return $this->belongsTo(PenawaranEmailTenderLog::class, 'penawaran_id', 'id', PenawaranTender::class); + } } diff --git a/app/Models/PenawaranEmailTenderLog.php b/app/Models/PenawaranEmailTenderLog.php new file mode 100644 index 0000000..9048405 --- /dev/null +++ b/app/Models/PenawaranEmailTenderLog.php @@ -0,0 +1,18 @@ +hasFile('attachment')) { - $file = request()->file('attachment'); - $fileName = time() . '_' . $file->getClientOriginalName(); - $filePath = $file->storeAs('permohonan_attachments', $fileName, 'public'); + static::updated(function ($permohonan) { + static::createHistory($permohonan, 'updated'); + }); + } - $permohonan->dokumen = $filePath; + protected static function handleFileUpload($permohonan) + { + if (request()->hasFile('attachment')) { + $file = request()->file('attachment'); + $fileName = time() . '_' . $file->getClientOriginalName(); + $filePath = $file->storeAs('permohonan_attachments', $fileName, 'public'); + + $permohonan->dokumen = $filePath; + } + } + + protected static function createHistory($permohonan, $action) + { + $historyService = app(PermohonanHistoryService::class); + + $status = $permohonan->status; + $keterangan = request()->input('keterangan'); // Get keterangan from request + $beforeRequest = $action === 'updated' ? $permohonan->getOriginal() : []; + $afterRequest = $permohonan->toArray(); + $file = $permohonan->dokumen ?? null; + + $historyService->createHistory( + $permohonan, + $status, + $keterangan, + $beforeRequest, + $afterRequest, + $file, + ); + } + + public function user() + { + return $this->belongsTo(User::class); + } + + public function branch() + { + return $this->belongsTo(Branch::class); + } + + public function tujuanPenilaian() + { + return $this->belongsTo(TujuanPenilaian::class); + } + + public function debiture() + { + return $this->belongsTo(Debiture::class); + } + + public function documents() + { + return $this->hasMany(DokumenJaminan::class); + } + + public function nilaiPlafond() + { + return $this->belongsTo(NilaiPlafond::class); + } + + public function jenisFasilitasKredit() + { + return $this->belongsTo(JenisFasilitasKredit::class); + } + + public function penilaian() + { + return $this->belongsTo(Penilaian::class, 'nomor_registrasi', 'nomor_registrasi'); + } + + public function penawaranTender() + { + return $this->hasMany(PenawaranTender::class, 'nomor_registrasi'); + } + + public function region() + { + return $this->belongsTo(Regions::class, 'region_id'); + } + + public function penawaran() + { + return $this->belongsTo(PenawaranTender::class, 'nomor_registrasi', 'nomor_registrasi'); + } + + public function histories() + { + return $this->hasMany(PermohonanHistory::class, 'permohonan_id', 'id')->orderBy('created_at', 'desc'); } } - - protected static function createHistory($permohonan, $action) - { - $historyService = app(PermohonanHistoryService::class); - - $status = $permohonan->status; - $keterangan = request()->input('keterangan'); // Get keterangan from request - $beforeRequest = $action === 'updated' ? $permohonan->getOriginal() : []; - $afterRequest = $permohonan->toArray(); - $file = $permohonan->dokumen ? Storage::disk('public')->path($permohonan->dokumen) : null; - - $historyService->createHistory( - $permohonan, - $status, - $keterangan, - $beforeRequest, - $afterRequest, - $file - ); - } - - public function user() - { - return $this->belongsTo(User::class); - } - - public function branch() - { - return $this->belongsTo(Branch::class); - } - - public function tujuanPenilaian() - { - return $this->belongsTo(TujuanPenilaian::class); - } - - public function debiture() - { - return $this->belongsTo(Debiture::class); - } - - public function documents() - { - return $this->hasMany(DokumenJaminan::class); - } - - public function nilaiPlafond() - { - return $this->belongsTo(NilaiPlafond::class); - } - - public function jenisFasilitasKredit() - { - return $this->belongsTo(JenisFasilitasKredit::class); - } - - public function penilaian() - { - return $this->belongsTo(Penilaian::class, 'nomor_registrasi', 'nomor_registrasi'); - } - - public function penawaranTender() - { - return $this->hasMany(PenawaranTender::class, 'nomor_registrasi'); - } - - public function region() - { - return $this->belongsTo(Regions::class, 'region_id'); - } - - public function penawaran(){ - return $this->belongsTo(PenawaranTender::class, 'nomor_registrasi', 'nomor_registrasi'); - } -} diff --git a/app/Models/PermohonanHistory.php b/app/Models/PermohonanHistory.php index 2b58a8f..a0f7d34 100644 --- a/app/Models/PermohonanHistory.php +++ b/app/Models/PermohonanHistory.php @@ -4,6 +4,8 @@ namespace Modules\Lpj\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Modules\Usermanagement\Models\User; + // use Modules\Lpj\Database\Factories\PermohonanHistoryFactory; class PermohonanHistory extends Base diff --git a/database/migrations/2024_11_18_045428_create_penawaran_email_tender_log.php b/database/migrations/2024_11_18_045428_create_penawaran_email_tender_log.php new file mode 100644 index 0000000..7fa040a --- /dev/null +++ b/database/migrations/2024_11_18_045428_create_penawaran_email_tender_log.php @@ -0,0 +1,35 @@ +id(); + $table->unsignedBigInteger('penawaran_id'); + $table->foreign('penawaran_id')->references('id')->on('penawaran')->onDelete('cascade'); + $table->string('kjpp'); + $table->string('to_email'); + $table->string('subject'); + $table->text('body_pdf'); + $table->string('status'); + $table->text('error_message'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('penawaran_email_tender_log'); + } +}; diff --git a/module.json b/module.json index c4bd9c7..9e3a069 100644 --- a/module.json +++ b/module.json @@ -36,14 +36,6 @@ "permission": "", "roles": ["administrator", "admin"], "sub": [ - { - "title": "Data Penawaran", - "path": "tender.penawaran", - "classes": "", - "attributes": [], - "permission": "", - "roles": ["administrator", "admin"] - }, { "title": "Data Proses Penawaran", "path": "tender.prosespenawaran", diff --git a/resources/views/component/detail-jaminan.blade.php b/resources/views/component/detail-jaminan.blade.php index 63b2817..4d5266e 100644 --- a/resources/views/component/detail-jaminan.blade.php +++ b/resources/views/component/detail-jaminan.blade.php @@ -277,4 +277,5 @@ +@include('lpj::component.history-permohonan') @include('lpj::component.pdfviewer') diff --git a/resources/views/component/history-permohonan.blade.php b/resources/views/component/history-permohonan.blade.php new file mode 100644 index 0000000..85ed489 --- /dev/null +++ b/resources/views/component/history-permohonan.blade.php @@ -0,0 +1,78 @@ +
+
+

+ Activity +

+
+
+
+ @foreach($permohonan->histories as $activity) +
+ @if($loop->first) +
+
+ @endif + @if(!$loop->last && !$loop->first) +
+
+ @endif +
+ @switch(strtolower($activity->status)) + @case('preregister') + + @break + @case('order') + + @break + + @case('revisi') + + @break + + @case('register') + + @break + + @case('assign') + + @break + + @case('survey') + + @break + @case('proses laporan') + + @break + @case('approved') + + @break + @case('delivered') + + @break + @default + + @endswitch +
+
+ {{ $activity->status }} +

{{ $activity->keterangan }}

+
+ {{ $activity->created_by ? $activity->creator->name : 'System' }} + {{ $activity->created_at->format('d M Y H:i') }} +
+ @if($activity->file_path) + + Attachment + + @endif +
+
+ @endforeach +
+
+
diff --git a/resources/views/otorisasipenawaran/edit.blade.php b/resources/views/otorisasipenawaran/edit.blade.php index 2940e0c..e1de931 100644 --- a/resources/views/otorisasipenawaran/edit.blade.php +++ b/resources/views/otorisasipenawaran/edit.blade.php @@ -36,11 +36,11 @@

- Kode Penawaran: + Nomor Penawaran:

@@ -69,7 +69,9 @@ No - KJPP + KJPP + No Proposal + Tanggal Proposal Biaya Penawaran Dokumen Penawaran Action @@ -98,7 +100,9 @@ No - KJPP + KJPP + No Proposal + Tanggal Proposal Biaya Penawaran Dokumen Penawaran created_at diff --git a/resources/views/otorisasipenawaran/index.blade.php b/resources/views/otorisasipenawaran/index.blade.php index 5156678..41b1ccd 100644 --- a/resources/views/otorisasipenawaran/index.blade.php +++ b/resources/views/otorisasipenawaran/index.blade.php @@ -36,17 +36,37 @@ - Kode Penawaran + Nomor Penawaran - + + Tanggal Permohonan + + + + User Pemohon + + + + Cabang Pemohon + + + + Nama Debitur + + + Tanggal Penawaran - + Tujuan Penilaian + + Tujuan Penilaian KJPP + + Total KJPP @@ -107,13 +127,40 @@ title: 'Nomor Registrasi', }, code: { - title: 'Kode Penawaran', + title: 'Nomor Penawaran', + }, + tanggal_permohonan: { + title: 'Tanggal Permohonan', + }, + user_pemohon: { + title: 'User Pemohon', + }, + branches_name: { + title: 'Cabang Pemohon', + }, + debiture: { + title: 'Nama Debitur', + render: (item, data) => { + if(data.debitures_name) { + return `${data.debitures_name}`; + } + return "-"; + } }, date_range: { title: 'Tanggal Penawaran', }, - tujuan_penilaian_kjpp_name: { + tujuan_penilaian_name: { title: 'Tujuan Penilaian', + render: (item, data) => { + return data.tujuan_penilaian_name + } + }, + tujuan_penilaian_kjpp: { + title: 'Tujuan Penilaian KJPP', + render: (item, data) => { + return data.tujuan_penilaian_kjpp_name + } }, penawarandetails_count: { title: 'Total KJPP', @@ -122,7 +169,10 @@ }, }, status: { - title: 'Status' + title: 'Status', + render: (item, data) => { + return data.status.toUpperCase() + } }, actions: { title: 'Status', diff --git a/resources/views/otorisasipenawaran/js/editjs.blade.php b/resources/views/otorisasipenawaran/js/editjs.blade.php index cc67d20..409037d 100644 --- a/resources/views/otorisasipenawaran/js/editjs.blade.php +++ b/resources/views/otorisasipenawaran/js/editjs.blade.php @@ -63,6 +63,8 @@ $.each(datas, function(key, value){ var kjppName = value.kjpp_code+' - '+value.kjpp_name; + var no_proposal = (value.no_proposal)??'';// alert(no_proposal); + var tgl_proposal = (value.tgl_proposal)??'';// alert(tgl_proposal); var biaya_penawaran = value.biaya_penawaran;// alert(biaya_penawaran); var htmlDokumenPersetujuanDownload=''; var dokumenPersetujuanDownload = value.dokumen_persetujuan; @@ -79,6 +81,8 @@ var markup = ''; markup +=''+i+''; markup +=''; + markup +=''+no_proposal+''; + markup +=''+tgl_proposal+''; markup +='Rp.'+biaya_penawaran_format+''; markup +=''+htmlDokumenPersetujuanDownload+''; markup +='
'; @@ -113,6 +117,8 @@ $.each(datas, function(key, value){ var kjppName = value.kjpp_code+' - '+value.kjpp_name; + var no_proposal = (value.no_proposal)??'';// alert(no_proposal); + var tgl_proposal = (value.tgl_proposal)??'';// alert(tgl_proposal); var biaya_penawaran = value.biaya_penawaran;// alert(biaya_penawaran); var htmlDokumenPersetujuanDownload=''; var dokumenPersetujuanDownload = value.dokumen_persetujuan; @@ -129,6 +135,8 @@ var markup = ''; markup +=''+i+''; markup +=''; + markup +=''+no_proposal+''; + markup +=''+tgl_proposal+''; markup +='Rp.'+biaya_penawaran_format+''; markup +=''+htmlDokumenPersetujuanDownload+''; markup +=''; diff --git a/resources/views/otorisasipenawaran/show.blade.php b/resources/views/otorisasipenawaran/show.blade.php index 0e6d2e1..8a1f7e1 100644 --- a/resources/views/otorisasipenawaran/show.blade.php +++ b/resources/views/otorisasipenawaran/show.blade.php @@ -29,7 +29,7 @@

- Kode Penawaran: + Nomor Penawaran:

{{ $prosespenawaran->code }} diff --git a/resources/views/penawaran/kirimEmail.blade.php b/resources/views/penawaran/kirimEmail.blade.php new file mode 100644 index 0000000..3c6efac --- /dev/null +++ b/resources/views/penawaran/kirimEmail.blade.php @@ -0,0 +1,178 @@ + + + + + + + + Surat Tender | {{ formatTanggalIndonesia(now()) }} + + + + +
+ Dear + @php + $allPeople = []; + + foreach ($penawaran->penawaranKjpp as $kjpp) { + if ($kjpp->kjpp->nama_pic_admin) { + $allPeople[] = ucwords($kjpp->kjpp->nama_pic_admin); + } + + if ($kjpp->kjpp->detail_nama_pic_admin) { + try { + $decoded = json_decode($kjpp->kjpp->detail_nama_pic_admin); + if ($decoded) { + foreach ($decoded as $admin) { + if (isset($admin->nama_pic_admin)) { + $allPeople[] = ucwords($admin->nama_pic_admin); + } + } + } + } catch (\Exception $e) { + // Handle invalid JSON silently + } + } + } + + $allPeople = array_filter($allPeople); + $totalPeople = count($allPeople); + @endphp + @if ($totalPeople > 0) + @foreach ($allPeople as $index => $person) + {{ $person }}{{ $index === $totalPeople - 2 ? ' dan ' : ($index < $totalPeople - 2 ? ' , ' : '') }} + @endforeach + @else + Tidak Ada + @endif + + +
+ Mohon untuk dibuatkan proposal jasa appraisal atas nama {{ $permohonan->debiture->name }}, tujuan penilaian untuk {{ $penawaran->tujuanPenilaianKJPP->name }}, laporan dalam bentuk {{ $penawaran->jenisLaporan->name }}, dengan data-data sebagai berikut: +
+ +
+ Aset Jaminan: @foreach ($permohonan->debiture->documents as $document) + {{ $document->jenisJaminan->name }} + @endforeach + Lokasi Jaminan: @foreach ($permohonan->debiture->documents as $document) + {{ $document->address }}, Kel. @foreach ($villages as $village) + {{ $village->name }} + @endforeach, Kec. @foreach ($districts as $district) + {{ $district->name }} + @endforeach,@foreach ($cities as $city) + {{ ucwords(strtolower($city->name)) }} + @endforeach,@foreach ($provinces as $province) + {{ $province->name }} + @endforeach + @endforeach + + + Luas Tanah / Luas Bangunan: + @php + $luas_tanah = null; + $luas_bangunan = null; + @endphp + + @foreach ($permohonan->debiture->documents as $document) + @foreach ($document->detail as $detail) + @php + $details = json_decode($detail->details); + @endphp + + @if (is_object($details)) + @if (isset($details->luas_tanah) && is_numeric($details->luas_tanah)) + @php $luas_tanah = $details->luas_tanah; @endphp + @endif + + @if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan)) + @php $luas_bangunan = $details->luas_bangunan; @endphp + @endif + @endif + @endforeach + @endforeach + + @if ($luas_tanah !== null && $luas_bangunan !== null) + {{ $luas_tanah }} m2 / {{ $luas_bangunan }} m2 + @elseif ($luas_tanah !== null) + {{ $luas_tanah }} m2 + @elseif ($luas_bangunan !== null) + {{ $luas_bangunan }} m2 + @endif +
+ +
+ Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi.
+ Mohon proposal dapat saya terima segera, sebelum {{ formatTanggalIndonesia($penawaran->end_date, true) }} +
+ +
+ Best Regards,
+ {{ $permohonan->user->name }} +

+ {{ $permohonan->user->name }} +

+
+ + +
+ + + diff --git a/resources/views/penawaran/kirimEmailKJPP.blade.php b/resources/views/penawaran/kirimEmailKJPP.blade.php new file mode 100644 index 0000000..fd4745a --- /dev/null +++ b/resources/views/penawaran/kirimEmailKJPP.blade.php @@ -0,0 +1,180 @@ + + + + + + + + Surat Tender | {{ formatTanggalIndonesia(now()) }} + + + + +
+ Dear + @php + $allPeople = []; + + foreach ($dp1->kjpp as $dp) { + if ($dp1->kjpp->nama_pic_admin) { + $allPeople[] = ucwords($dp1->kjpp->nama_pic_admin); + } + + if ($dp1->kjpp->detail_nama_pic_admin) { + try { + $decoded = json_decode($dp1->kjpp->detail_nama_pic_admin); + if (is_array($decoded) && !empty($decoded)) { + foreach ($decoded as $value) { + // Check if the value has nama_pic_admin and it's not empty + if (isset($value->nama_pic_admin) && !empty($value->nama_pic_admin)) { + $allPeople[] = ucwords($value->nama_pic_admin); + } + } + } + } catch (\Exception $e) { + // Handle invalid JSON silently + } + } + } + + // Remove empty values and duplicates + $allPeople = array_filter(array_unique($allPeople)); + $totalPeople = count($allPeople); + @endphp + @if ($totalPeople > 0) + @foreach ($allPeople as $index => $person) + {{ $person }}{{ $index === $totalPeople - 2 ? ' dan ' : ($index < $totalPeople - 2 ? ' , ' : '') }} + @endforeach + @else + Tidak Ada + @endif + + +
+ Mohon untuk dibuatkan proposal jasa appraisal atas nama {{ $permohonan->debiture->name }}, tujuan penilaian untuk {{ $penawaran->tujuanPenilaianKJPP->name }}, laporan dalam bentuk {{ $penawaran->jenisLaporan->name }}, dengan data-data sebagai berikut: +
+ +
+ Aset Jaminan: @foreach ($permohonan->debiture->documents as $document) + {{ $document->jenisJaminan->name }} + @endforeach + Lokasi Jaminan: @foreach ($permohonan->debiture->documents as $document) + {{ $document->address }}, Kel. @foreach ($villages as $village) + {{ $village->name }} + @endforeach, Kec. @foreach ($districts as $district) + {{ $district->name }} + @endforeach,@foreach ($cities as $city) + {{ ucwords(strtolower($city->name)) }} + @endforeach,@foreach ($provinces as $province) + {{ $province->name }} + @endforeach + @endforeach + + + Luas Tanah / Luas Bangunan: + @php + $luas_tanah = null; + $luas_bangunan = null; + @endphp + + @foreach ($permohonan->debiture->documents as $document) + @foreach ($document->detail as $detail) + @php + $details = json_decode($detail->details); + @endphp + + @if (is_object($details)) + @if (isset($details->luas_tanah) && is_numeric($details->luas_tanah)) + @php $luas_tanah = $details->luas_tanah; @endphp + @endif + + @if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan)) + @php $luas_bangunan = $details->luas_bangunan; @endphp + @endif + @endif + @endforeach + @endforeach + + @if ($luas_tanah !== null && $luas_bangunan !== null) + {{ $luas_tanah }} m2 / {{ $luas_bangunan }} m2 + @elseif ($luas_tanah !== null) + {{ $luas_tanah }} m2 + @elseif ($luas_bangunan !== null) + {{ $luas_bangunan }} m2 + @endif +
+ +
+ Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi.
+ Mohon proposal dapat saya terima segera, sebelum {{ formatTanggalIndonesia($penawaran->end_date, true) }} +
+ +
+ Best Regards,
+ {{ $permohonan->user->name }} +

+ {{ $permohonan->user->name }} +

+
+ + +
+ + + diff --git a/resources/views/penawaran/layouts/scripts.blade.php b/resources/views/penawaran/layouts/scripts.blade.php new file mode 100644 index 0000000..9b70607 --- /dev/null +++ b/resources/views/penawaran/layouts/scripts.blade.php @@ -0,0 +1,111 @@ +@push('styles') + +@endpush + +@push('scripts') + +@endpush diff --git a/resources/views/penawaran/showKirimEmail.blade.php b/resources/views/penawaran/showKirimEmail.blade.php new file mode 100644 index 0000000..1bdf893 --- /dev/null +++ b/resources/views/penawaran/showKirimEmail.blade.php @@ -0,0 +1,122 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render(request()->route()->getName(), request()->route('noreg')) }} +@endsection + +@section('content') +
+ +
+
+

+ Show Kirim Email Penawaran +

+
+ Back +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+ Data KJPP +
+
+
+
+ + + + + + + + + + + +
+ No + + + + Nomor KJPP + + + + + + + Nama KJPP + + + + + + + Email Kantor + + + + + + Status Kirim + + + Action +
+
+ + + +
+
+
+
+ +
+ +
+
+@endsection + +@include('lpj::penawaran.layouts.scripts') diff --git a/resources/views/penawaran/surat_tender.blade.php b/resources/views/penawaran/surat_tender.blade.php index 7db7b5c..06996a2 100644 --- a/resources/views/penawaran/surat_tender.blade.php +++ b/resources/views/penawaran/surat_tender.blade.php @@ -139,7 +139,7 @@

Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi.

Mohon proposal dapat saya terima segera, sebelum - {{ formatTanggalIndonesia2($penawaran->end_date) }} + {{ formatTanggalIndonesia($penawaran->end_date,true) }}

Best Regards,

diff --git a/resources/views/penawaran/surat_tender_download.blade.php b/resources/views/penawaran/surat_tender_download.blade.php index 0f058bc..a5b269a 100644 --- a/resources/views/penawaran/surat_tender_download.blade.php +++ b/resources/views/penawaran/surat_tender_download.blade.php @@ -154,7 +154,7 @@
Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi.
Mohon proposal dapat saya terima segera, sebelum {{ formatTanggalIndonesia2($penawaran->end_date) }} + class="important">{{ formatTanggalIndonesia($penawaran->end_date,true) }}
diff --git a/resources/views/penawaran/surat_tender_kjpp.blade.php b/resources/views/penawaran/surat_tender_kjpp.blade.php new file mode 100644 index 0000000..1bdd19b --- /dev/null +++ b/resources/views/penawaran/surat_tender_kjpp.blade.php @@ -0,0 +1,159 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render(request()->route()->getName(), request()->route('noreg'), request()->route('id')) }} +@endsection + +@section('content') +
+
+
+

+ Surat Tender +

+ +
+
+

Dear + + @php + $allPeople = []; + + foreach ($detail_penawaran_1 as $dp1) { + if ($detail_penawaran_1->nama_pic_admin) { + $allPeople[] = ucwords($detail_penawaran_1->nama_pic_admin); + } + + if ($detail_penawaran_1->detail_nama_pic_admin) { + try { + $decoded = json_decode($detail_penawaran_1->detail_nama_pic_admin); + if (is_array($decoded) && !empty($decoded)) { + foreach ($decoded as $value) { + // Check if the value has nama_pic_admin and it's not empty + if (isset($value->nama_pic_admin) && !empty($value->nama_pic_admin)) { + $allPeople[] = ucwords($value->nama_pic_admin); + } + } + } + } catch (\Exception $e) { + // Handle invalid JSON silently + } + } + } + + // Remove empty values and duplicates + $allPeople = array_filter(array_unique($allPeople)); + $totalPeople = count($allPeople); + @endphp + @if ($totalPeople > 0) + @foreach ($allPeople as $index => $person) + {{ $person }}{{ $index === $totalPeople - 2 ? ' dan ' : ($index < $totalPeople - 2 ? ' , ' : '') }} + @endforeach + @else + Tidak Ada + @endif + +

+

Mohon untuk dibuatkan proposal jasa appraisal atas nama {{ ucwords($permohonan->debiture->name) }}, tujuan penilaian + untuk + {{ $penawaran->tujuanPenilaianKJPP->name }} + , laporan dalam bentuk {{ $penawaran->jenisLaporan->name }}, + dengan data-data sebagai berikut :

+
    +
  • Aset Jaminan: + + @foreach ($permohonan->debiture->documents as $document) + {{ $document->jenisJaminan->name }} + @endforeach + +
  • +
  • Lokasi Jaminan: + + @foreach ($permohonan->debiture->documents as $document) + {{ $document->address }} + @if (isset($document->jenisJaminan)) + , Kel. + @foreach ($villages as $village) + {{ $village->name }} + @endforeach + , Kec. + @foreach ($districts as $district) + {{ $district->name }} + @endforeach + , + @foreach ($cities as $city) + {{ ucwords(strtolower($city->name)) }} + @endforeach + , + @foreach ($provinces as $province) + {{ $province->name }} + @endforeach + @endif + @endforeach + +
  • +
  • Luas Tanah / Luas Bangunan: + + @php + $luas_tanah = null; + $luas_bangunan = null; + @endphp + + @foreach ($permohonan->debiture->documents as $document) + @foreach ($document->detail as $detail) + @php + $details = json_decode($detail->details); + @endphp + + @if (is_object($details)) + @if (isset($details->luas_tanah) && is_numeric($details->luas_tanah)) + @php $luas_tanah = $details->luas_tanah; @endphp + @endif + + @if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan)) + @php $luas_bangunan = $details->luas_bangunan; @endphp + @endif + @endif + @endforeach + @endforeach + + @if ($luas_tanah !== null && $luas_bangunan !== null) + {{ $luas_tanah }} m2 / {{ $luas_bangunan }} m2 + @elseif ($luas_tanah !== null) + {{ $luas_tanah }} m2 + @elseif ($luas_bangunan !== null) + {{ $luas_bangunan }} m2 + @endif + +
  • +
+

Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi.

+

Mohon proposal dapat saya terima segera, sebelum + {{ formatTanggalIndonesia($penawaran->end_date, true) }} +

+

Best Regards, +

+ {{ $permohonan->user->name }} +

+ {{ $permohonan->user->name }} +

+
+ Sub Direktorat Appraisal +

+

PT. Bank Artha Graha Internasional, Tbk.
+ Gedung Bank Artha Graha, Lantai 3
+ Jl. Kwitang Raya No 24-26, Jakarta Pusat - 10420.
+ Telp. 021 - 3903040 (H)

+
+
+
+@endsection diff --git a/resources/views/penawaran/surat_tender_kjpp_download.blade.php b/resources/views/penawaran/surat_tender_kjpp_download.blade.php new file mode 100644 index 0000000..183e4a6 --- /dev/null +++ b/resources/views/penawaran/surat_tender_kjpp_download.blade.php @@ -0,0 +1,180 @@ + + + + + + + + Surat Tender | {{ formatTanggalIndonesia(now()) }} + + + + +
+ Dear + @php + $allPeople = []; + + foreach ($detail_penawaran_1 as $dp1) { + if ($detail_penawaran_1->nama_pic_admin) { + $allPeople[] = ucwords($detail_penawaran_1->nama_pic_admin); + } + + if ($detail_penawaran_1->detail_nama_pic_admin) { + try { + $decoded = json_decode($detail_penawaran_1->detail_nama_pic_admin); + if (is_array($decoded) && !empty($decoded)) { + foreach ($decoded as $value) { + // Check if the value has nama_pic_admin and it's not empty + if (isset($value->nama_pic_admin) && !empty($value->nama_pic_admin)) { + $allPeople[] = ucwords($value->nama_pic_admin); + } + } + } + } catch (\Exception $e) { + // Handle invalid JSON silently + } + } + } + + // Remove empty values and duplicates + $allPeople = array_filter(array_unique($allPeople)); + $totalPeople = count($allPeople); + @endphp + @if ($totalPeople > 0) + @foreach ($allPeople as $index => $person) + {{ $person }}{{ $index === $totalPeople - 2 ? ' dan ' : ($index < $totalPeople - 2 ? ' , ' : '') }} + @endforeach + @else + Tidak Ada + @endif + + +
+ Mohon untuk dibuatkan proposal jasa appraisal atas nama {{ $permohonan->debiture->name }}, tujuan penilaian untuk {{ $penawaran->tujuanPenilaianKJPP->name }}, laporan dalam bentuk {{ $penawaran->jenisLaporan->name }}, dengan data-data sebagai berikut: +
+ +
+ Aset Jaminan: @foreach ($permohonan->debiture->documents as $document) + {{ $document->jenisJaminan->name }} + @endforeach + Lokasi Jaminan: @foreach ($permohonan->debiture->documents as $document) + {{ $document->address }}, Kel. @foreach ($villages as $village) + {{ $village->name }} + @endforeach, Kec. @foreach ($districts as $district) + {{ $district->name }} + @endforeach,@foreach ($cities as $city) + {{ ucwords(strtolower($city->name)) }} + @endforeach,@foreach ($provinces as $province) + {{ $province->name }} + @endforeach + @endforeach + + + Luas Tanah / Luas Bangunan: + @php + $luas_tanah = null; + $luas_bangunan = null; + @endphp + + @foreach ($permohonan->debiture->documents as $document) + @foreach ($document->detail as $detail) + @php + $details = json_decode($detail->details); + @endphp + + @if (is_object($details)) + @if (isset($details->luas_tanah) && is_numeric($details->luas_tanah)) + @php $luas_tanah = $details->luas_tanah; @endphp + @endif + + @if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan)) + @php $luas_bangunan = $details->luas_bangunan; @endphp + @endif + @endif + @endforeach + @endforeach + + @if ($luas_tanah !== null && $luas_bangunan !== null) + {{ $luas_tanah }} m2 / {{ $luas_bangunan }} m2 + @elseif ($luas_tanah !== null) + {{ $luas_tanah }} m2 + @elseif ($luas_bangunan !== null) + {{ $luas_bangunan }} m2 + @endif +
+ +
+ Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi.
+ Mohon proposal dapat saya terima segera, sebelum {{ formatTanggalIndonesia($penawaran->end_date, true) }} +
+ +
+ Best Regards,
+ {{ $permohonan->user->name }} +

+ {{ $permohonan->user->name }} +

+
+ + +
+ + + diff --git a/resources/views/penawaran_ulang/index.blade.php b/resources/views/penawaran_ulang/index.blade.php index d880650..988bf71 100644 --- a/resources/views/penawaran_ulang/index.blade.php +++ b/resources/views/penawaran_ulang/index.blade.php @@ -131,13 +131,13 @@ + + + `; } else { // Jika tidak ada, tampilkan tombol "Tambah Penawaran" actionDiv.innerHTML = ` - - - diff --git a/resources/views/prosespenawaran/createPenawaran.blade.php b/resources/views/prosespenawaran/createPenawaran.blade.php new file mode 100644 index 0000000..df7b497 --- /dev/null +++ b/resources/views/prosespenawaran/createPenawaran.blade.php @@ -0,0 +1,222 @@ +@extends('layouts.main') +@section('breadcrumbs') + {{ Breadcrumbs::render(request()->route()->getName()) }} +@endsection +@php + // $route = Route::currentRouteName(); + // dd($route); tender.prosespenawaran.create + $route = explode('.', Route::currentRouteName()); +@endphp + +@section('content') +
+ +
+
+

+ Tambah Data Penawaran +

+ +
+
+ @csrf +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+
+ +
+ - +
+
+
+ +
+ + @error('kjpp') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('tujuan_penilaian_kjpp_id') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('start_date') + {{ $message }} + @enderror +
+ - +
+ + @error('end_date') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('catatan') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('jenis_laporan_id') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('status') + {{ $message }} + @enderror +
+
+
+ @if (isset($penawaran->nomor_registrasi)) + + Surat Tender + + @endif + +
+
+
+
+
+@endsection +@push('styles') + +@endpush \ No newline at end of file diff --git a/resources/views/prosespenawaran/edit.blade.php b/resources/views/prosespenawaran/edit.blade.php index e757972..124e9aa 100644 --- a/resources/views/prosespenawaran/edit.blade.php +++ b/resources/views/prosespenawaran/edit.blade.php @@ -38,11 +38,11 @@
diff --git a/resources/views/prosespenawaran/editulang.blade.php b/resources/views/prosespenawaran/editulang.blade.php index 66f2125..e3b25b8 100644 --- a/resources/views/prosespenawaran/editulang.blade.php +++ b/resources/views/prosespenawaran/editulang.blade.php @@ -37,11 +37,11 @@

- Kode Penawaran: + Nomor Penawaran:

diff --git a/resources/views/prosespenawaran/index.blade.php b/resources/views/prosespenawaran/index.blade.php index ca0f017..8f353df 100644 --- a/resources/views/prosespenawaran/index.blade.php +++ b/resources/views/prosespenawaran/index.blade.php @@ -38,6 +38,23 @@ Nomor Registrasi + + Nomor Penawaran + + + + + Tanggal Permohonan + + + + User Pemohon + + + + Cabang Pemohon + + Nama Debitur @@ -46,6 +63,10 @@ Tanggal Penawaran + + Tujuan Penilaian + + Tujuan Penilaian KJPP @@ -82,29 +103,11 @@ @push('scripts')