diff --git a/app/Http/Controllers/TenderController.php b/app/Http/Controllers/TenderController.php index f4edb45..9a2e05e 100644 --- a/app/Http/Controllers/TenderController.php +++ b/app/Http/Controllers/TenderController.php @@ -23,6 +23,7 @@ use Modules\Lpj\Exports\PenawaranTenderExport; use Modules\Lpj\Http\Requests\TenderPenawaranRequest; use Modules\Lpj\Jobs\SendPenawaranKJPPTenderJob; use Modules\Lpj\Jobs\SendPenawaranTenderJob; +use Modules\Lpj\Models\PenawaranEmailTenderLog; class TenderController extends Controller { @@ -618,7 +619,9 @@ class TenderController extends Controller $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); // Retrieve data from the database - $query = PenawaranDetailTender::query()->where('penawaran_id', '=', $penawaran->id)->with(['kjpp', 'penawaran', 'emailTenderLog']); + $query = PenawaranDetailTender::query()->where('penawaran_id', '=', $penawaran->id)->with(['kjpp', 'penawaran', 'penawaran.emailTenderLog']); + + // dd($query); // Apply sorting if provided if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { @@ -641,23 +644,8 @@ class TenderController extends Controller } } - // 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(); + $data = $query->get(); // add column "No" $i = 0; @@ -670,20 +658,9 @@ class TenderController extends Controller $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, ]); } @@ -800,8 +777,6 @@ class TenderController extends Controller $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; @@ -814,21 +789,89 @@ class TenderController extends Controller $cities = City::where('code', $city_permohonan)->get(); $provinces = Province::where('code', $province_permohonan)->get(); - try { - $balikan = SendPenawaranKJPPTenderJob::dispatch( - $kjpps, - $dp1, - $penawaran, - $permohonan, - $villages, - $districts, - $cities, - $provinces - ); - } catch (\Exception $e) { - return redirect()->route('tender.penawaran.ulang.index')->with('error', 'Email Penawaran Gagal Terkirim!'); - } + $subject = 'Send Penawaran K J P P Email'; - return redirect()->route('tender.penawaran.ulang.index')->with('success', 'Email Penawaran Berhasil Terkirim!'); + $body_pdf = view('lpj::penawaran.kirimEmailKJPP', [ + 'dp1' => $dp1, + 'penawaran' => $penawaran, + 'permohonan' => $permohonan, + 'kjpps' => $kjpps, + 'villages' => $villages, + 'districts' => $districts, + 'cities' => $cities, + 'provinces' => $provinces + ])->render(); + + SendPenawaranKJPPTenderJob::dispatch( + $kjpps, + $dp1, + $penawaran, + $permohonan, + $villages, + $districts, + $cities, + $provinces + ); + + try { + // Proses log email + foreach ($kjpps as $email) { + // Cek apakah sudah ada log dengan status 'failed' untuk email ini + $log = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) + ->where('to_email', $email) + ->where('status', 'failed') + ->first(); + + $log1 = PenawaranEmailTenderLog::where('penawaran_id', $penawaran->id) + ->where('to_email', $email) + ->where('status', 'success') + ->first(); + + if ($log) { + // Jika log ditemukan dan statusnya 'failed', update status menjadi 'success' + $log->update([ + 'status' => 'success', + 'error_message' => null, // Reset error_message saat status diubah menjadi success + 'updated_at' => now(), + ]); + } else if ($log1) { + // Jika log ditemukan dan statusnya 'success' biarkan saja + $log1->update([ // Reset error_message saat status diubah menjadi success + 'updated_at' => now(), + ]); + } else { + // Jika tidak ada log gagal, buat log baru dengan status 'success' + PenawaranEmailTenderLog::create([ + 'penawaran_id' => $penawaran->id, + 'kjpp' => $dp1->kjpp->code . ' | ' . $dp1->kjpp->name, + 'to_email' => $email, + 'subject' => $subject, + 'body_pdf' => $body_pdf, + 'status' => 'success', + 'error_message' => null, // Tidak ada error message + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + } + + return redirect()->route('tender.penawaran.ulang.index')->with('success', 'Email Penawaran Berhasil Terkirim!'); + } catch (\Exception $e) { + // Log email gagal + foreach ($kjpps as $email) { + 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!'); + } } } diff --git a/app/Models/PenawaranDetailTender.php b/app/Models/PenawaranDetailTender.php index cbe3286..619f9e2 100644 --- a/app/Models/PenawaranDetailTender.php +++ b/app/Models/PenawaranDetailTender.php @@ -27,9 +27,4 @@ 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 index 9048405..224c351 100644 --- a/app/Models/PenawaranEmailTenderLog.php +++ b/app/Models/PenawaranEmailTenderLog.php @@ -15,4 +15,9 @@ class PenawaranEmailTenderLog extends Model * The attributes that are mass assignable. */ protected $guarded = ['id']; + + public function penawaran() + { + return $this->belongsTo(PenawaranTender::class, 'penawaran_id', 'id'); + } } diff --git a/app/Models/PenawaranTender.php b/app/Models/PenawaranTender.php index f38d42e..b69c92c 100644 --- a/app/Models/PenawaranTender.php +++ b/app/Models/PenawaranTender.php @@ -26,6 +26,11 @@ class PenawaranTender extends Model } // andy add + public function emailTenderLog(): HasMany + { + return $this->hasMany(PenawaranEmailTenderLog::class, 'penawaran_id', 'id'); + } + public function penawaranKjpp() { return $this->hasMany(PenawaranDetailTender::class, 'penawaran_id'); diff --git a/database/migrations/2024_11_20_073420_update_penawaran_email_tender_log.php b/database/migrations/2024_11_20_073420_update_penawaran_email_tender_log.php new file mode 100644 index 0000000..3300063 --- /dev/null +++ b/database/migrations/2024_11_20_073420_update_penawaran_email_tender_log.php @@ -0,0 +1,28 @@ +text('error_message')->nullable()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('penawaran_email_tender_log', function (Blueprint $table) { + $table->text('error_message')->change(); + }); + } +}; diff --git a/resources/views/penawaran/layouts/scripts.blade.php b/resources/views/penawaran/layouts/scripts.blade.php index 9b70607..8c572a9 100644 --- a/resources/views/penawaran/layouts/scripts.blade.php +++ b/resources/views/penawaran/layouts/scripts.blade.php @@ -24,7 +24,6 @@ const apiUrl = element.getAttribute('data-api-url'); const dataTableOptions = { apiEndpoint: apiUrl, - pageSize: 5, columns: { no: { title: 'No', @@ -92,7 +91,31 @@ status: { title: 'Status', render: (item, data) => { - return `${data.emailTenderLog?.status ?? '-'}` + // Cek jika ada email log + if (data.penawaran.email_tender_log && data.penawaran.email_tender_log.length > 0) { + // Buat full string KJPP untuk matching + const kjppString = `${data.kjpp.code} | ${data.kjpp.name}`; + + // Filter log berdasarkan string KJPP yang sesuai + const log = data.penawaran.email_tender_log.find(log => + log.kjpp === kjppString + ); + + if (log) { + // Set warna badge berdasarkan status + const statusColors = { + 'success': 'badge-success', + 'failed': 'badge-danger' + }; + + const color = statusColors[log.status] || 'badge-secondary'; + + return `${log.status}`; + } + } + + // Jika tidak ada log, tampilkan strip + return '-'; } }, actions: { diff --git a/resources/views/penawaran/showKirimEmail.blade.php b/resources/views/penawaran/showKirimEmail.blade.php index 1bdf893..5063254 100644 --- a/resources/views/penawaran/showKirimEmail.blade.php +++ b/resources/views/penawaran/showKirimEmail.blade.php @@ -34,8 +34,7 @@
-
@@ -89,21 +88,6 @@
- -