From 17ca3b2e50336144d18f3e84d1bb30dd281933ff Mon Sep 17 00:00:00 2001 From: rahmatrafli1 Date: Wed, 20 Nov 2024 08:24:59 +0700 Subject: [PATCH] Menambahkan fitur kirim email tender part 1 --- app/Emails/SendPenawaranKJPPEmail.php | 55 +++ app/Emails/SendPenawaranTenderEmail.php | 29 ++ app/Http/Controllers/TenderController.php | 327 +++++++++++++++++- app/Jobs/SendPenawaranKJPPTenderJob.php | 67 ++++ app/Jobs/SendPenawaranTenderJob.php | 56 +++ app/Models/KJPP.php | 10 +- app/Models/PenawaranDetailTender.php | 5 + app/Models/PenawaranEmailTenderLog.php | 18 + ...5428_create_penawaran_email_tender_log.php | 35 ++ .../views/penawaran/kirimEmail.blade.php | 178 ++++++++++ .../views/penawaran/kirimEmailKJPP.blade.php | 180 ++++++++++ .../views/penawaran/layouts/scripts.blade.php | 105 ++++++ .../views/penawaran/showKirimEmail.blade.php | 114 ++++++ .../penawaran/surat_tender_kjpp.blade.php | 159 +++++++++ .../surat_tender_kjpp_download.blade.php | 180 ++++++++++ .../views/penawaran_ulang/index.blade.php | 6 +- routes/breadcrumbs.php | 46 ++- routes/web.php | 9 + 18 files changed, 1554 insertions(+), 25 deletions(-) create mode 100644 app/Emails/SendPenawaranKJPPEmail.php create mode 100644 app/Emails/SendPenawaranTenderEmail.php create mode 100644 app/Jobs/SendPenawaranKJPPTenderJob.php create mode 100644 app/Jobs/SendPenawaranTenderJob.php create mode 100644 app/Models/PenawaranEmailTenderLog.php create mode 100644 database/migrations/2024_11_18_045428_create_penawaran_email_tender_log.php create mode 100644 resources/views/penawaran/kirimEmail.blade.php create mode 100644 resources/views/penawaran/kirimEmailKJPP.blade.php create mode 100644 resources/views/penawaran/layouts/scripts.blade.php create mode 100644 resources/views/penawaran/showKirimEmail.blade.php create mode 100644 resources/views/penawaran/surat_tender_kjpp.blade.php create mode 100644 resources/views/penawaran/surat_tender_kjpp_download.blade.php 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/Http/Controllers/TenderController.php b/app/Http/Controllers/TenderController.php index 8f2c7d2..5231544 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,276 @@ 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 { + // 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(); + + SendPenawaranKJPPTenderJob::dispatch( + $kjpps, + $dp1, + $penawaran, + $permohonan, + $villages, + $districts, + $cities, + $provinces + ); + + return redirect()->route('tender.penawaran.ulang.index')->with('success', 'Email Penawaran Berhasil Terkirim!'); + } } diff --git a/app/Jobs/SendPenawaranKJPPTenderJob.php b/app/Jobs/SendPenawaranKJPPTenderJob.php new file mode 100644 index 0000000..b85b8ce --- /dev/null +++ b/app/Jobs/SendPenawaranKJPPTenderJob.php @@ -0,0 +1,67 @@ +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, + ]); + + 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 @@ +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/resources/views/penawaran/kirimEmail.blade.php b/resources/views/penawaran/kirimEmail.blade.php new file mode 100644 index 0000000..9967b6b --- /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 {{ formatTanggalIndonesia2($penawaran->end_date) }} +
+ +
+ 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..e6e5f45 --- /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 {{ formatTanggalIndonesia2($penawaran->end_date) }} +
+ +
+ 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..dca85b3 --- /dev/null +++ b/resources/views/penawaran/layouts/scripts.blade.php @@ -0,0 +1,105 @@ +@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..a9b006f --- /dev/null +++ b/resources/views/penawaran/showKirimEmail.blade.php @@ -0,0 +1,114 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render(request()->route()->getName(), request()->route('noreg')) }} +@endsection + +@section('content') +
+ +
+
+

+ Show Kirim Email Penawaran +

+
+ Back +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+ Data KJPP +
+
+
+
+ + + + + + + + + + +
+ No + + + + Nama KJPP + + + + + + + Email Kantor + + + + + + Status Kirim + + + Action +
+
+ + + +
+
+
+
+ +
+ +
+
+@endsection + +@include('lpj::penawaran.layouts.scripts') 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..2ed30d5 --- /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 + {{ formatTanggalIndonesia2($penawaran->end_date) }} +

+

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..206c467 --- /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 {{ formatTanggalIndonesia2($penawaran->end_date) }} +
+ +
+ 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/routes/breadcrumbs.php b/routes/breadcrumbs.php index 370ecc3..ff7ab8a 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -399,6 +399,16 @@ Breadcrumbs::for('tender.penawaran.showSuratTender', function (BreadcrumbTrail $ $trail->push('Surat Tender', route('tender.penawaran.showSuratTender', $noreg)); }); +Breadcrumbs::for('tender.penawaran.suratTenderKJPP', function (BreadcrumbTrail $trail, $noreg, $id) { + $trail->parent('tender.penawaran'); + $trail->push('Surat Tender KJPP', route('tender.penawaran.suratTenderKJPP', ['noreg' => $noreg, 'id' => $id])); +}); + +Breadcrumbs::for('tender.penawaran.showKirimEmail', function (BreadcrumbTrail $trail, $noreg) { + $trail->parent('tender.penawaran'); + $trail->push('Show Kirim Email Penawaran', route('tender.penawaran.showKirimEmail', $noreg)); +}); + Breadcrumbs::for('tender.penawaran.ulang', function (BreadcrumbTrail $trail) { $trail->parent('tender'); @@ -442,24 +452,24 @@ Breadcrumbs::for('otorisator.pelaporan.index', function (BreadcrumbTrail $trail) // basic data surveyor $basicDataRoutes = [ - 'bentuk-tanah' => 'Bentuk Tanah', - 'kontur-tanah' => 'Kontur Tanah', - 'posisi-kavling' => 'Posisi Kavling', - 'ketinggian-tanah' => 'Ketinggian Tanah', - 'kondisi-fisik-tanah' => 'Kondisi Fisik Tanah', - 'jenis-bangunan' => 'Jenis Bangunan', - 'kondisi-bangunan' => 'Kondisi Bangunan', - 'sifat-bangunan' => 'Sifat Bangunan', - 'spek-bangunan' => 'Speksifikasi Bangunan', - 'spek-kategori-bangunan' => 'Speksifikasi Kategori Bangunan', - 'sarana-pelengkap' => 'Sarana Pelengkap', - 'lalu-lintas-lokasi' => 'Lalu Lintas', - 'tingkat-keramaian' => 'Tingkat Keramaian', - 'gol-mas-sekitar' => 'Golongan Masyarakat Sekitar', - 'lantai-unit' => 'Lantai Unit', - 'view-unit' => 'View Unit', - 'bentuk-unit' => 'Bentuk unit', - 'perkerasan-jalan' => 'Perkerasan jalan' + 'bentuk-tanah' => 'Bentuk Tanah', + 'kontur-tanah' => 'Kontur Tanah', + 'posisi-kavling' => 'Posisi Kavling', + 'ketinggian-tanah' => 'Ketinggian Tanah', + 'kondisi-fisik-tanah' => 'Kondisi Fisik Tanah', + 'jenis-bangunan' => 'Jenis Bangunan', + 'kondisi-bangunan' => 'Kondisi Bangunan', + 'sifat-bangunan' => 'Sifat Bangunan', + 'spek-bangunan' => 'Speksifikasi Bangunan', + 'spek-kategori-bangunan' => 'Speksifikasi Kategori Bangunan', + 'sarana-pelengkap' => 'Sarana Pelengkap', + 'lalu-lintas-lokasi' => 'Lalu Lintas', + 'tingkat-keramaian' => 'Tingkat Keramaian', + 'gol-mas-sekitar' => 'Golongan Masyarakat Sekitar', + 'lantai-unit' => 'Lantai Unit', + 'view-unit' => 'View Unit', + 'bentuk-unit' => 'Bentuk unit', + 'perkerasan-jalan' => 'Perkerasan jalan' ]; diff --git a/routes/web.php b/routes/web.php index 1ad699b..53eb02a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -394,6 +394,15 @@ Route::middleware(['auth'])->group(function () { 'penawaran.showSuratTender' ); Route::get('penawaran/{noreg}/suratTender/downloadpdf', [TenderController::class, 'downloadSuratTender'])->name('penawaran.downloadSuratTender'); + // Kirim Email Penawaran + Route::get('penawaran/{noreg}/showKirimEmail', [TenderController::class, 'showKirimEmail'])->name('penawaran.showKirimEmail'); + Route::get('penawaran/{noreg}/kirimEmailAll', [TenderController::class, 'kirimEmailAll'])->name('penawaran.kirimEmailAll'); + Route::get('penawaran/{noreg}/suratTenderKJPP/{id}', [TenderController::class, 'suratTenderKJPP'])->name('penawaran.suratTenderKJPP'); + Route::get('penawaran/{noreg}/suratTenderKJPP/{id}/kirimEmailKJPP', [TenderController::class, 'kirimEmailKJPP'])->name('penawaran.kirimEmailKJPP'); + Route::get('penawaran/suratTenderShow/{noreg}/datatables', [TenderController::class, 'dataTablesShowKirimSurat'])->name('penawaran.showKirimSurat.datatables'); + // Download Surat Tender KJPP + Route::get('penawaran/{noreg}/suratTenderKJPP/{id}/downloadSuratTenderKJPP', [TenderController::class, 'downloadSuratTenderKJPP']) + ->name('penawaran.downloadSuratTenderKJPP'); // Penawaran Ulang Route::get('penawaran/ulang', [TenderController::class, 'penawaran_ulang_index'])->name(