From 7f57155de71770a107cac7bb91c3e084b042574f Mon Sep 17 00:00:00 2001 From: rahmatrafli1 Date: Thu, 14 Nov 2024 15:46:32 +0700 Subject: [PATCH 01/16] Memperbaiki kontroller tender untuk memeriksa apakah nomor registrasi itu ada di tabel penawaran kalau tidak maka kembali ke halaman create --- app/Http/Controllers/TenderController.php | 8 +++++++- resources/views/penawaran/index.blade.php | 3 --- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/TenderController.php b/app/Http/Controllers/TenderController.php index f52ab80..8f2c7d2 100644 --- a/app/Http/Controllers/TenderController.php +++ b/app/Http/Controllers/TenderController.php @@ -127,6 +127,10 @@ class TenderController extends Controller $penawaran1 = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); + if (!$penawaran1) { + return redirect()->route('tender.penawaran.createPenawaran', ['noreg' => $noreg])->with('error', 'Penawaran dengan nomor registrasi ini belum dibuat. Silahkan isi terlebih dahulu!'); + } + if ($penawaran1->status != 'tender') { return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!'); } @@ -155,12 +159,14 @@ class TenderController extends Controller { // Find the specific penawaran by its 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', 'Penawaran dengan nomor registrasi ini belum dibuat. Silahkan isi terlebih dahulu!'); } + $permohonan = Permohonan::where('nomor_registrasi', '=', $noreg)->first(); + + if ($penawaran->status != 'tender') { return redirect()->route('spk.index')->with('error', 'Penawaran dengan nomor registrasi ini sudah masuk SPK tidak bisa masuk penawaran lagi!'); } diff --git a/resources/views/penawaran/index.blade.php b/resources/views/penawaran/index.blade.php index 405332a..a8f1d64 100644 --- a/resources/views/penawaran/index.blade.php +++ b/resources/views/penawaran/index.blade.php @@ -134,9 +134,6 @@ } else { // Jika tidak ada, tampilkan tombol "Tambah Penawaran" actionDiv.innerHTML = ` - - - From 2296fd0e19a5395a3c196ef8edfbc93945e658f6 Mon Sep 17 00:00:00 2001 From: rahmatrafli1 Date: Thu, 14 Nov 2024 15:49:07 +0700 Subject: [PATCH 02/16] menghapus tombol detail pada tambah penawaran tender --- resources/views/penawaran/create.blade.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/views/penawaran/create.blade.php b/resources/views/penawaran/create.blade.php index d8b2b5c..225c174 100644 --- a/resources/views/penawaran/create.blade.php +++ b/resources/views/penawaran/create.blade.php @@ -15,8 +15,6 @@ Tambah Data Penawaran
- Detail Back From 8a97d2d1094f81d7b089c2f0da853034675eb781 Mon Sep 17 00:00:00 2001 From: rahmatrafli1 Date: Thu, 14 Nov 2024 15:52:58 +0700 Subject: [PATCH 03/16] memperbaiki style pada download pdf surat tender --- resources/views/penawaran/surat_tender_download.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/penawaran/surat_tender_download.blade.php b/resources/views/penawaran/surat_tender_download.blade.php index ef6b219..0f058bc 100644 --- a/resources/views/penawaran/surat_tender_download.blade.php +++ b/resources/views/penawaran/surat_tender_download.blade.php @@ -152,8 +152,8 @@
- Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi. Mohon proposal - dapat saya terima segera, sebelum + Mohon proposal dapat saya terima segera, sebelum {{ formatTanggalIndonesia2($penawaran->end_date) }}
From 7db25c2226604b575859df18c6dd91f1ad3faaac Mon Sep 17 00:00:00 2001 From: rahmatrafli1 Date: Fri, 15 Nov 2024 15:16:59 +0700 Subject: [PATCH 04/16] memperbaiki show permohonan yang typo --- resources/views/permohonan/show.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/permohonan/show.blade.php b/resources/views/permohonan/show.blade.php index 3ccb967..69b2018 100644 --- a/resources/views/permohonan/show.blade.php +++ b/resources/views/permohonan/show.blade.php @@ -6,7 +6,7 @@ @section('content')
- @include('lpj::component.detail-jaminan',['backLink' => 'prmohonan.index']) + @include('lpj::component.detail-jaminan', ['backLink' => 'permohonan.index'])
From 631d5893868d65c14aab7923fdc4eeeb01641ea2 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 19 Nov 2024 15:10:48 +0700 Subject: [PATCH 05/16] Update PermohonanController: Hapus pengolahan file dan histori setelah update permohonan Telah dilakukan pembersihan pada kode dengan menghapus logika pengolahan file dan pembuatan histori setelah proses update permohonan. Perubahan ini diharapkan menyederhanakan fungsi update di dalam PermohonanController serta mengurangi beban pemrosesan yang tidak diperlukan. --- app/Http/Controllers/PermohonanController.php | 22 ------------------- 1 file changed, 22 deletions(-) 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) { From d48bef9e6744f4080c3485d3ccee12793bdfcdce Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 19 Nov 2024 15:11:00 +0700 Subject: [PATCH 06/16] Tambahkan use statement untuk User Menambahkan deklarasi `use` untuk model `User` di `PermohonanHistory.php`. Hal ini diperlukan untuk memastikan bahwa referensi terhadap model `User` dalam file ini dikenali oleh sistem. --- app/Models/PermohonanHistory.php | 2 ++ 1 file changed, 2 insertions(+) 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 From c49bc3ddb35296f2d509297d37eb45783ce6ab06 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 19 Nov 2024 15:11:12 +0700 Subject: [PATCH 07/16] Format kode dan tambahkan relasi histories Mengformat ulang kode model Permohonan untuk konsistensi indentasi dan keterbacaan. Menambahkan relasi `histories` untuk menghubungkan dengan model PermohonanHistory, berguna untuk melacak riwayat perubahan permohonan. --- app/Models/Permohonan.php | 280 +++++++++++++++++++------------------- 1 file changed, 143 insertions(+), 137 deletions(-) diff --git a/app/Models/Permohonan.php b/app/Models/Permohonan.php index a3b35c1..0255e63 100644 --- a/app/Models/Permohonan.php +++ b/app/Models/Permohonan.php @@ -1,150 +1,156 @@ 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'); - } -} From a999dfbdd616304d86690d73bc65f4f7166d1e1e Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 19 Nov 2024 15:11:32 +0700 Subject: [PATCH 08/16] Tambahkan fitur riwayat aktivitas pada halaman detail jaminan Menambahkan komponen tampilan untuk menampilkan riwayat aktivitas permohonan jaminan. Fitur ini termasuk tampilan ikon status, deskripsi, nama pembuat, tanggal, dan link unduhan lampiran jika tersedia. Penambahan ini akan memudahkan pengguna dalam melacak aktivitas yang terjadi pada setiap permohonan jaminan. --- .../views/component/detail-jaminan.blade.php | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/resources/views/component/detail-jaminan.blade.php b/resources/views/component/detail-jaminan.blade.php index 63b2817..2ffdae4 100644 --- a/resources/views/component/detail-jaminan.blade.php +++ b/resources/views/component/detail-jaminan.blade.php @@ -277,4 +277,83 @@
+
+
+

+ 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 +
+
+
+ @include('lpj::component.pdfviewer') From d66107ec1e20df312dea873fa42240bcaeb4f200 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 19 Nov 2024 15:14:00 +0700 Subject: [PATCH 09/16] Perbarui fungsi formatTanggalIndonesia dengan opsi waktu Fungsi `formatTanggalIndonesia` diperbarui untuk menerima parameter opsional `$time`. Jika `$time` bernilai `false`, fungsi akan mengembalikan format tanggal tanpa waktu. Namun, jika bernilai `true`, fungsi akan menyertakan waktu dalam format hasilnya. Fungsi `formatTanggalIndonesia2` dihapus untuk menyederhanakan dan mengurangi redundansi kode. --- app/Helpers/Lpj.php | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php index 044c3f6..e27ff54 100644 --- a/app/Helpers/Lpj.php +++ b/app/Helpers/Lpj.php @@ -5,32 +5,13 @@ use Modules\Lpj\Models\PenawaranDetailTender; use Modules\Lpj\Models\PenawaranTender; - - function formatTanggalIndonesia($date) - { - $carbonDate = Carbon::parse($date); - $indonesianMonths = [ - 'Januari', - 'Februari', - 'Maret', - 'April', - 'Mei', - 'Juni', - 'Juli', - 'Agustus', - 'September', - 'Oktober', - 'November', - 'Desember', - ]; - $month = $indonesianMonths[$carbonDate->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'; } From 085d3a876ed790f2154a8d5f27f530d56aea97ce Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 19 Nov 2024 15:14:17 +0700 Subject: [PATCH 10/16] Update formatTanggalIndonesia function calls Mengubah pemanggilan fungsi formatTanggalIndonesia dengan penambahan parameter kedua yang bernilai true pada dua file Blade, yaitu surat_tender_download.blade.php dan surat_tender.blade.php. Ini untuk memastikan format tanggal disesuaikan dengan kebutuhan aplikasi. --- resources/views/penawaran/surat_tender.blade.php | 2 +- resources/views/penawaran/surat_tender_download.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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) }}
From 973bfbbc751d89d73d035a31b45e359448a5bb8b Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 19 Nov 2024 15:21:21 +0700 Subject: [PATCH 11/16] Pisahkan tampilan history aktivitas menjadi komponen terpisah Memindahkan tampilan history aktivitas dari file detail-jaminan.blade.php ke file baru bernama history-permohonan.blade.php dan menghubungkannya menggunakan include. Pendekatan ini membuat kode lebih modular dan lebih mudah di-maintain. --- .../views/component/detail-jaminan.blade.php | 80 +------------------ .../component/history-permohonan.blade.php | 78 ++++++++++++++++++ 2 files changed, 79 insertions(+), 79 deletions(-) create mode 100644 resources/views/component/history-permohonan.blade.php diff --git a/resources/views/component/detail-jaminan.blade.php b/resources/views/component/detail-jaminan.blade.php index 2ffdae4..4d5266e 100644 --- a/resources/views/component/detail-jaminan.blade.php +++ b/resources/views/component/detail-jaminan.blade.php @@ -277,83 +277,5 @@
-
-
-

- 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 -
-
-
- +@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 +
+
+
From 17ca3b2e50336144d18f3e84d1bb30dd281933ff Mon Sep 17 00:00:00 2001 From: rahmatrafli1 Date: Wed, 20 Nov 2024 08:24:59 +0700 Subject: [PATCH 12/16] 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( From 91e921ca6de9547f3aa7b359407651cbd4d09ec8 Mon Sep 17 00:00:00 2001 From: rahmatrafli1 Date: Wed, 20 Nov 2024 08:53:49 +0700 Subject: [PATCH 13/16] Memperbaiki fungsi yang redudansi pada formatTanggalIndonesia --- resources/views/penawaran/surat_tender_kjpp.blade.php | 2 +- resources/views/penawaran/surat_tender_kjpp_download.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/penawaran/surat_tender_kjpp.blade.php b/resources/views/penawaran/surat_tender_kjpp.blade.php index 2ed30d5..1bdd19b 100644 --- a/resources/views/penawaran/surat_tender_kjpp.blade.php +++ b/resources/views/penawaran/surat_tender_kjpp.blade.php @@ -137,7 +137,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_kjpp_download.blade.php b/resources/views/penawaran/surat_tender_kjpp_download.blade.php index 206c467..183e4a6 100644 --- a/resources/views/penawaran/surat_tender_kjpp_download.blade.php +++ b/resources/views/penawaran/surat_tender_kjpp_download.blade.php @@ -156,7 +156,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) }}
From 6c7fe4669b7608a8342cd24ea4e271b5e66a90e8 Mon Sep 17 00:00:00 2001 From: rahmatrafli1 Date: Wed, 20 Nov 2024 09:01:19 +0700 Subject: [PATCH 14/16] Memperbaiki fungsi yang redudansi pada formatTanggalIndonesia ketika kirim email tender --- resources/views/penawaran/kirimEmail.blade.php | 2 +- resources/views/penawaran/kirimEmailKJPP.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/penawaran/kirimEmail.blade.php b/resources/views/penawaran/kirimEmail.blade.php index 9967b6b..3c6efac 100644 --- a/resources/views/penawaran/kirimEmail.blade.php +++ b/resources/views/penawaran/kirimEmail.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/kirimEmailKJPP.blade.php b/resources/views/penawaran/kirimEmailKJPP.blade.php index e6e5f45..fd4745a 100644 --- a/resources/views/penawaran/kirimEmailKJPP.blade.php +++ b/resources/views/penawaran/kirimEmailKJPP.blade.php @@ -156,7 +156,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) }}
From ec8ae3b960cf90af55a8a1c891f280d85e37e5ed Mon Sep 17 00:00:00 2001 From: rahmatrafli1 Date: Wed, 20 Nov 2024 10:56:00 +0700 Subject: [PATCH 15/16] Membuat kirim surat tender part 2 --- app/Http/Controllers/TenderController.php | 28 ++++++++++++------- app/Jobs/SendPenawaranKJPPTenderJob.php | 3 +- .../views/penawaran/layouts/scripts.blade.php | 6 ++++ .../views/penawaran/showKirimEmail.blade.php | 8 ++++++ 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/TenderController.php b/app/Http/Controllers/TenderController.php index 5231544..f4edb45 100644 --- a/app/Http/Controllers/TenderController.php +++ b/app/Http/Controllers/TenderController.php @@ -631,6 +631,10 @@ class TenderController extends Controller $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); @@ -810,16 +814,20 @@ class TenderController extends Controller $cities = City::where('code', $city_permohonan)->get(); $provinces = Province::where('code', $province_permohonan)->get(); - SendPenawaranKJPPTenderJob::dispatch( - $kjpps, - $dp1, - $penawaran, - $permohonan, - $villages, - $districts, - $cities, - $provinces - ); + 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/Jobs/SendPenawaranKJPPTenderJob.php b/app/Jobs/SendPenawaranKJPPTenderJob.php index b85b8ce..52045a2 100644 --- a/app/Jobs/SendPenawaranKJPPTenderJob.php +++ b/app/Jobs/SendPenawaranKJPPTenderJob.php @@ -52,6 +52,7 @@ class SendPenawaranKJPPTenderJob implements ShouldQueue $this->cities, $this->provinces ); + $email->with([ 'dp1' => $this->dp1, // Kirim seluruh array dp1 ke email 'penawaran' => $this->penawaran, @@ -62,6 +63,6 @@ class SendPenawaranKJPPTenderJob implements ShouldQueue 'provinces' => $this->provinces, ]); - Mail::to($this->kjpps)->send($email); + $send = Mail::to($this->kjpps)->send($email); } } diff --git a/resources/views/penawaran/layouts/scripts.blade.php b/resources/views/penawaran/layouts/scripts.blade.php index dca85b3..9b70607 100644 --- a/resources/views/penawaran/layouts/scripts.blade.php +++ b/resources/views/penawaran/layouts/scripts.blade.php @@ -32,6 +32,12 @@ return data.numbernya; } }, + nomor_kjpp: { + title: 'Nomor KJPP', + render: (item, data) => { + return `${data.kjpp.code}` + } + }, nama_kjpp: { title: 'Nama KJPP', render: (item, data) => { diff --git a/resources/views/penawaran/showKirimEmail.blade.php b/resources/views/penawaran/showKirimEmail.blade.php index a9b006f..1bdf893 100644 --- a/resources/views/penawaran/showKirimEmail.blade.php +++ b/resources/views/penawaran/showKirimEmail.blade.php @@ -52,6 +52,14 @@ No + + + + Nomor KJPP + + + + From 5aaecb5c4fc0e323686f80161d22ae2107d0abac Mon Sep 17 00:00:00 2001 From: Andy Chaerudin Date: Wed, 20 Nov 2024 14:49:48 +0700 Subject: [PATCH 16/16] penggabungan feature Data Penawaran ke dalam feature Proses Penawaran. Dan merapihkan tampilan index --- app/Helpers/Lpj.php | 25 +- .../OtorisasiPenawaranController.php | 35 ++- .../Controllers/ProsesPenawaranController.php | 148 +++++++++++- app/Http/Requests/ProsesPenawaranRequest.php | 85 +++++++ module.json | 8 - .../views/otorisasipenawaran/edit.blade.php | 12 +- .../views/otorisasipenawaran/index.blade.php | 62 ++++- .../otorisasipenawaran/js/editjs.blade.php | 8 + .../views/otorisasipenawaran/show.blade.php | 2 +- .../prosespenawaran/createPenawaran.blade.php | 222 ++++++++++++++++++ .../views/prosespenawaran/edit.blade.php | 4 +- .../views/prosespenawaran/editulang.blade.php | 4 +- .../views/prosespenawaran/index.blade.php | 103 +++++--- .../views/prosespenawaran/show.blade.php | 2 +- .../prosespenawaran/showPermohonan.blade.php | 50 ++++ routes/breadcrumbs_registrasi.php | 24 +- routes/registrasi.php | 6 + 17 files changed, 726 insertions(+), 74 deletions(-) create mode 100644 app/Http/Requests/ProsesPenawaranRequest.php create mode 100644 resources/views/prosespenawaran/createPenawaran.blade.php create mode 100644 resources/views/prosespenawaran/showPermohonan.blade.php diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php index 044c3f6..69bb2c2 100644 --- a/app/Helpers/Lpj.php +++ b/app/Helpers/Lpj.php @@ -1,7 +1,8 @@ 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/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/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/module.json b/module.json index 4f82cdf..126b921 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/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/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')