Merge pull request 'Menambahkan fitur Kirim Surat Tender All dan ada yang saya sedikit perbaiki dari Kirim Surat Tender dari Setiap KJPP' (#47) from tender into staging

Reviewed-on: #47
This commit is contained in:
putrakuningan
2024-11-28 04:35:31 +00:00
9 changed files with 872 additions and 617 deletions

View File

@@ -684,7 +684,12 @@ class TenderController extends Controller
->with('error', 'Anda Belum Membuat Dokumen Jaminan. Silahkan isi terlebih dahulu!'); ->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(); $detail_penawaran = PenawaranDetailTender::where('penawaran_id', '=', $penawaran->id)
->where('status', '=', 1)
->pluck('kjpp_rekanan_id')
->toArray();
$kjpps = KJPP::whereIn('id', $detail_penawaran) $kjpps = KJPP::whereIn('id', $detail_penawaran)
->get() ->get()
->map(function ($item) { ->map(function ($item) {
@@ -702,10 +707,11 @@ class TenderController extends Controller
} }
} }
return array_filter($emails); return [
}) 'kjpp' => $item,
->flatten() 'emails' => array_filter($emails)
->toArray(); ];
});
foreach ($permohonan->debiture->documents as $document) { foreach ($permohonan->debiture->documents as $document) {
$village_permohonan = $document->village_code; $village_permohonan = $document->village_code;
@@ -719,9 +725,21 @@ class TenderController extends Controller
$cities = City::where('code', $city_permohonan)->get(); $cities = City::where('code', $city_permohonan)->get();
$provinces = Province::where('code', $province_permohonan)->get(); $provinces = Province::where('code', $province_permohonan)->get();
$subject = 'Send Penawaran Email';
$body_pdf = view('lpj::penawaran.kirimEmail', [
'penawaran' => $penawaran,
'permohonan' => $permohonan,
'kjpps' => $kjpps->pluck('emails')->flatten()->toArray(),
'villages' => $villages,
'districts' => $districts,
'cities' => $cities,
'provinces' => $provinces
])->render();
// Dispatch job untuk mengirim email
SendPenawaranTenderJob::dispatch( SendPenawaranTenderJob::dispatch(
$kjpps, $kjpps->pluck('emails')->flatten()->toArray(),
$penawaran, $penawaran,
$permohonan, $permohonan,
$villages, $villages,
@@ -730,7 +748,119 @@ class TenderController extends Controller
$provinces $provinces
); );
return redirect()->route('tender.penawaran.ulang.index')->with('success', 'Email Penawaran Berhasil Terkirim!'); try {
// Proses log email untuk setiap KJPP
foreach ($kjpps as $kjppData) {
foreach ($kjppData['emails'] as $email) {
// Cek log yang sudah ada
$log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
->where('to_email', $email)
->where('status', 'failed')
->first();
$log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
->where('to_email', $email)
->where('status', 'success')
->first();
if ($log) {
// Update log failed menjadi success
$log->update([
'penawaran_id' => $penawaran->id,
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
'to_email' => $email,
'subject' => $subject,
'body_pdf' => $body_pdf,
'status' => 'success',
'error_message' => null,
'updated_at' => now(),
]);
} else if ($log1) {
// Update timestamp jika sudah success
$log1->update([
'penawaran_id' => $penawaran->id,
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
'to_email' => $email,
'subject' => $subject,
'body_pdf' => $body_pdf,
'updated_at' => now(),
]);
} else {
// Buat log baru
PenawaranEmailTenderLog::create([
'penawaran_id' => $penawaran->id,
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
'to_email' => $email,
'subject' => $subject,
'body_pdf' => $body_pdf,
'status' => 'success',
'error_message' => null,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
return redirect()->route('tender.penawaran.ulang.index')
->with('success', 'Email Penawaran Berhasil Terkirim!');
} catch (\Exception $e) {
// Log email gagal untuk setiap KJPP
foreach ($kjpps as $kjppData) {
foreach ($kjppData['emails'] as $email) {
$log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
->where('to_email', $email)
->where('status', 'success')
->first();
$log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
->where('to_email', $email)
->where('status', 'failed')
->first();
if ($log) {
// Update log success menjadi failed
$log->update([
'penawaran_id' => $penawaran->id,
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
'to_email' => $email,
'subject' => $subject,
'body_pdf' => $body_pdf,
'status' => 'failed',
'error_message' => $e->getMessage(),
'updated_at' => now(),
]);
} else if ($log1) {
// Update error message jika sudah failed
$log1->update([
'penawaran_id' => $penawaran->id,
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
'to_email' => $email,
'subject' => $subject,
'body_pdf' => $body_pdf,
'error_message' => $e->getMessage(),
'updated_at' => now(),
]);
} else {
// Buat log baru dengan status failed
PenawaranEmailTenderLog::create([
'penawaran_id' => $penawaran->id,
'kjpp' => $kjppData['kjpp']->code . ' | ' . $kjppData['kjpp']->name,
'to_email' => $email,
'subject' => $subject,
'body_pdf' => $body_pdf,
'status' => 'failed',
'error_message' => $e->getMessage(),
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
return redirect()->route('tender.penawaran.showKirimEmail', ['noreg' => $noreg])
->with('error', 'Email Penawaran Gagal Terkirim!');
}
} }
public function kirimEmailKJPP($noreg, $id) public function kirimEmailKJPP($noreg, $id)
@@ -830,13 +960,23 @@ class TenderController extends Controller
if ($log) { if ($log) {
// Jika log ditemukan dan statusnya 'failed', update status menjadi 'success' // Jika log ditemukan dan statusnya 'failed', update status menjadi 'success'
$log->update([ $log->update([
'penawaran_id' => $penawaran->id,
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
'to_email' => $email,
'subject' => $subject,
'body_pdf' => $body_pdf,
'status' => 'success', 'status' => 'success',
'error_message' => null, // Reset error_message saat status diubah menjadi success 'error_message' => null, // Reset error_message saat status diubah menjadi success
'updated_at' => now(), 'updated_at' => now(),
]); ]);
} else if ($log1) { } else if ($log1) {
// Jika log ditemukan dan statusnya 'success' biarkan saja // Jika log ditemukan dan statusnya 'success' biarkan saja
$log1->update([ // Reset error_message saat status diubah menjadi success $log1->update([
'penawaran_id' => $penawaran->id,
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
'to_email' => $email,
'subject' => $subject,
'body_pdf' => $body_pdf,
'updated_at' => now(), 'updated_at' => now(),
]); ]);
} else { } else {
@@ -859,18 +999,54 @@ class TenderController extends Controller
} catch (\Exception $e) { } catch (\Exception $e) {
// Log email gagal // Log email gagal
foreach ($kjpps as $email) { foreach ($kjpps as $email) {
PenawaranEmailTenderLog::create([ $log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
'penawaran_id' => $penawaran->id, ->where('to_email', $email)
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name, ->where('status', 'success')
'to_email' => $email, ->first();
'subject' => $subject,
'body_pdf' => $body_pdf, $log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id)
'status' => 'failed', ->where('to_email', $email)
'error_message' => $e->getMessage(), ->where('status', 'failed')
'created_at' => now(), ->first();
'updated_at' => now(),
]); if ($log) {
// Jika log ditemukan dan statusnya 'success', update status menjadi 'failed'
$log->update([
'penawaran_id' => $penawaran->id,
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
'to_email' => $email,
'subject' => $subject,
'body_pdf' => $body_pdf,
'status' => 'failed',
'error_message' => $e->getMessage(),
'updated_at' => now(),
]);
} else if ($log1) {
// Jika log ditemukan dan statusnya 'failed' biarkan saja
$log1->update([
'penawaran_id' => $penawaran->id,
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
'to_email' => $email,
'subject' => $subject,
'body_pdf' => $body_pdf,
'error_message' => $e->getMessage(),
'updated_at' => now(),
]);
} else {
PenawaranEmailTenderLog::create([
'penawaran_id' => $penawaran->id,
'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name,
'to_email' => $email,
'subject' => $subject,
'body_pdf' => $body_pdf,
'status' => 'failed',
'error_message' => $e->getMessage(),
'created_at' => now(),
'updated_at' => now(),
]);
}
} }
return redirect()->route('tender.penawaran.showKirimEmail', ['noreg' => $noreg])->with('error', 'Email Penawaran Gagal Terkirim!'); return redirect()->route('tender.penawaran.showKirimEmail', ['noreg' => $noreg])->with('error', 'Email Penawaran Gagal Terkirim!');
} }
} }

View File

@@ -131,12 +131,22 @@
@endphp @endphp
@if (is_object($details)) @if (is_object($details))
@if (isset($details->luas_tanah) && is_numeric($details->luas_tanah)) @if (
@php $luas_tanah = $details->luas_tanah; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Tanah' &&
isset($details->{'Luas Tanah'}) &&
is_numeric($details->{'Luas Tanah'}))
@php
$luas_tanah = $details->{'Luas Tanah'};
@endphp
@endif @endif
@if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan)) @if (
@php $luas_bangunan = $details->luas_bangunan; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Bangunan' &&
isset($details->{'Luas Bangunan'}) &&
is_numeric($details->{'Luas Bangunan'}))
@php
$luas_bangunan = $details->{'Luas Bangunan'};
@endphp
@endif @endif
@endif @endif
@endforeach @endforeach

View File

@@ -133,12 +133,22 @@
@endphp @endphp
@if (is_object($details)) @if (is_object($details))
@if (isset($details->luas_tanah) && is_numeric($details->luas_tanah)) @if (
@php $luas_tanah = $details->luas_tanah; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Tanah' &&
isset($details->{'Luas Tanah'}) &&
is_numeric($details->{'Luas Tanah'}))
@php
$luas_tanah = $details->{'Luas Tanah'};
@endphp
@endif @endif
@if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan)) @if (
@php $luas_bangunan = $details->luas_bangunan; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Bangunan' &&
isset($details->{'Luas Bangunan'}) &&
is_numeric($details->{'Luas Bangunan'}))
@php
$luas_bangunan = $details->{'Luas Bangunan'};
@endphp
@endif @endif
@endif @endif
@endforeach @endforeach

View File

@@ -68,18 +68,10 @@
</span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="email_kantor"> <th class="min-w-[150px]" data-datatable-column="email_kantor">
<span class="sort"> Email Kantor
<span class="sort-label">
Email Kantor
</span>
</span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="status"> <th class="min-w-[150px]" data-datatable-column="status">
<span class="sort"> Status Kirim
<span class="sort-label">
Status Kirim
</span>
</span>
</th> </th>
<th class="min-w-[50px] text-center" data-datatable-column="actions">Action <th class="min-w-[50px] text-center" data-datatable-column="actions">Action
</th> </th>

View File

@@ -13,7 +13,7 @@
</h3> </h3>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<a href="{{ route('tender.penawaran.downloadSuratTender', $noreg) }}" class="btn btn-xs btn-light"> <a href="{{ route('tender.penawaran.downloadSuratTender', $noreg) }}" class="btn btn-xs btn-light">
<img src="{{ asset('img/pdf.png') }}" width="25" alt="pdf"></img>Download <img src="{{ asset('img/pdf.png') }}" width="25" alt="pdf" class="pdf"></img>Download
</span> </span>
@if (isset($penawaran->nomor_registrasi)) @if (isset($penawaran->nomor_registrasi))
<a href="{{ route('tender.penawaran.editPenawaran', $noreg) }}" class="btn btn-xs btn-info"><i <a href="{{ route('tender.penawaran.editPenawaran', $noreg) }}" class="btn btn-xs btn-info"><i
@@ -24,7 +24,7 @@
@endif @endif
</div> </div>
</div> </div>
<div class="card-body grid gap-5"> <div class="card-body grid gap-5 text-gray-900">
<p>Dear <p>Dear
<span class="font-bold"> <span class="font-bold">
@php @php
@@ -116,12 +116,22 @@
@endphp @endphp
@if (is_object($details)) @if (is_object($details))
@if (isset($details->luas_tanah) && is_numeric($details->luas_tanah)) @if (
@php $luas_tanah = $details->luas_tanah; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Tanah' &&
isset($details->{'Luas Tanah'}) &&
is_numeric($details->{'Luas Tanah'}))
@php
$luas_tanah = $details->{'Luas Tanah'};
@endphp
@endif @endif
@if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan)) @if (
@php $luas_bangunan = $details->luas_bangunan; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Bangunan' &&
isset($details->{'Luas Bangunan'}) &&
is_numeric($details->{'Luas Bangunan'}))
@php
$luas_bangunan = $details->{'Luas Bangunan'};
@endphp
@endif @endif
@endif @endif
@endforeach @endforeach
@@ -139,12 +149,12 @@
</ul> </ul>
<p>Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi.</p> <p>Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi.</p>
<p>Mohon proposal dapat saya terima segera, sebelum <p>Mohon proposal dapat saya terima segera, sebelum
<span class="font-bold">{{ formatTanggalIndonesia($penawaran->end_date,true) }}</span> <span class="font-bold">{{ formatTanggalIndonesia($penawaran->end_date, true) }}</span>
</p> </p>
<p>Best Regards, <p>Best Regards,
<div class="font-bold"> <div class="font-bold">
<img src="{{ asset('storage/signatures/' . $permohonan->user->id . '/' . $permohonan->user->sign) }}" <img src="{{ asset('storage/signatures/' . $permohonan->user->id . '/' . $permohonan->user->sign) }}"
alt="{{ $permohonan->user->name }}" width="200"> alt="{{ $permohonan->user->name }}" width="200" class="signature">
<p> <p>
{{ $permohonan->user->name }} {{ $permohonan->user->name }}
</p> </p>
@@ -159,3 +169,16 @@
</div> </div>
</div> </div>
@endsection @endsection
@push('styles')
<style>
.dark img.signature {
filter: invert(1) brightness(2);
}
.dark img.pdf {
filter: invert(1) brightness(1);
mix-blend-mode: screen;
}
</style>
@endpush

View File

@@ -131,12 +131,22 @@
@endphp @endphp
@if (is_object($details)) @if (is_object($details))
@if (isset($details->luas_tanah) && is_numeric($details->luas_tanah)) @if (
@php $luas_tanah = $details->luas_tanah; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Tanah' &&
isset($details->{'Luas Tanah'}) &&
is_numeric($details->{'Luas Tanah'}))
@php
$luas_tanah = $details->{'Luas Tanah'};
@endphp
@endif @endif
@if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan)) @if (
@php $luas_bangunan = $details->luas_bangunan; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Bangunan' &&
isset($details->{'Luas Bangunan'}) &&
is_numeric($details->{'Luas Bangunan'}))
@php
$luas_bangunan = $details->{'Luas Bangunan'};
@endphp
@endif @endif
@endif @endif
@endforeach @endforeach
@@ -154,7 +164,7 @@
<div class="content"> <div class="content">
Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi. <br /> Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi. <br />
Mohon proposal dapat saya terima segera, sebelum <span Mohon proposal dapat saya terima segera, sebelum <span
class="important">{{ formatTanggalIndonesia($penawaran->end_date,true) }}</span> class="important">{{ formatTanggalIndonesia($penawaran->end_date, true) }}</span>
</div> </div>
<div class="signature"> <div class="signature">

View File

@@ -14,13 +14,13 @@
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<a href="{{ route('tender.penawaran.downloadSuratTenderKJPP', ['noreg' => $noreg, 'id' => $id]) }}" <a href="{{ route('tender.penawaran.downloadSuratTenderKJPP', ['noreg' => $noreg, 'id' => $id]) }}"
class="btn btn-xs btn-light"> class="btn btn-xs btn-light">
<img src="{{ asset('img/pdf.png') }}" width="25" alt="pdf"></img>Download <img src="{{ asset('img/pdf.png') }}" width="25" alt="pdf" class="pdf"></img>Download
</a> </a>
<a href="{{ route('tender.penawaran.showKirimEmail', $noreg) }}" class="btn btn-xs btn-info"><i <a href="{{ route('tender.penawaran.showKirimEmail', $noreg) }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i> Back</a> class="ki-filled ki-exit-left"></i> Back</a>
</div> </div>
</div> </div>
<div class="card-body grid gap-5"> <div class="card-body grid gap-5 text-gray-900">
<p>Dear <p>Dear
<span class="font-bold"> <span class="font-bold">
@php @php
@@ -114,12 +114,22 @@
@endphp @endphp
@if (is_object($details)) @if (is_object($details))
@if (isset($details->luas_tanah) && is_numeric($details->luas_tanah)) @if (
@php $luas_tanah = $details->luas_tanah; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Tanah' &&
isset($details->{'Luas Tanah'}) &&
is_numeric($details->{'Luas Tanah'}))
@php
$luas_tanah = $details->{'Luas Tanah'};
@endphp
@endif @endif
@if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan)) @if (
@php $luas_bangunan = $details->luas_bangunan; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Bangunan' &&
isset($details->{'Luas Bangunan'}) &&
is_numeric($details->{'Luas Bangunan'}))
@php
$luas_bangunan = $details->{'Luas Bangunan'};
@endphp
@endif @endif
@endif @endif
@endforeach @endforeach
@@ -142,7 +152,7 @@
<p>Best Regards, <p>Best Regards,
<div class="font-bold"> <div class="font-bold">
<img src="{{ asset('storage/signatures/' . $permohonan->user->id . '/' . $permohonan->user->sign) }}" <img src="{{ asset('storage/signatures/' . $permohonan->user->id . '/' . $permohonan->user->sign) }}"
alt="{{ $permohonan->user->name }}" width="200"> alt="{{ $permohonan->user->name }}" width="200" class="signature">
<p> <p>
{{ $permohonan->user->name }} {{ $permohonan->user->name }}
</p> </p>
@@ -157,3 +167,16 @@
</div> </div>
</div> </div>
@endsection @endsection
@push('styles')
<style>
.dark img.signature {
filter: invert(1) brightness(2);
}
.dark img.pdf {
filter: invert(1) brightness(1);
mix-blend-mode: screen;
}
</style>
@endpush

View File

@@ -133,12 +133,22 @@
@endphp @endphp
@if (is_object($details)) @if (is_object($details))
@if (isset($details->luas_tanah) && is_numeric($details->luas_tanah)) @if (
@php $luas_tanah = $details->luas_tanah; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Tanah' &&
isset($details->{'Luas Tanah'}) &&
is_numeric($details->{'Luas Tanah'}))
@php
$luas_tanah = $details->{'Luas Tanah'};
@endphp
@endif @endif
@if (isset($details->luas_bangunan) && is_numeric($details->luas_bangunan)) @if (
@php $luas_bangunan = $details->luas_bangunan; @endphp $detail->jenisLegalitasJaminan->custom_field === 'Luas Bangunan' &&
isset($details->{'Luas Bangunan'}) &&
is_numeric($details->{'Luas Bangunan'}))
@php
$luas_bangunan = $details->{'Luas Bangunan'};
@endphp
@endif @endif
@endif @endif
@endforeach @endforeach

File diff suppressed because it is too large Load Diff