Menambahkan log ketika di kirim surat tender dari setiap kjpp

This commit is contained in:
2024-11-20 17:35:06 +07:00
committed by putrakuningan
parent 7482ed67c6
commit 264642795d
7 changed files with 152 additions and 69 deletions

View File

@@ -23,6 +23,7 @@ use Modules\Lpj\Exports\PenawaranTenderExport;
use Modules\Lpj\Http\Requests\TenderPenawaranRequest; use Modules\Lpj\Http\Requests\TenderPenawaranRequest;
use Modules\Lpj\Jobs\SendPenawaranKJPPTenderJob; use Modules\Lpj\Jobs\SendPenawaranKJPPTenderJob;
use Modules\Lpj\Jobs\SendPenawaranTenderJob; use Modules\Lpj\Jobs\SendPenawaranTenderJob;
use Modules\Lpj\Models\PenawaranEmailTenderLog;
class TenderController extends Controller class TenderController extends Controller
{ {
@@ -618,7 +619,9 @@ class TenderController extends Controller
$penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first(); $penawaran = PenawaranTender::where('nomor_registrasi', '=', $noreg)->first();
// Retrieve data from the database // 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 // Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { 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 // Get the data for the current page
$data = $query->with(['kjpp', 'penawaran', 'emailTenderLog'])->get(); $data = $query->get();
// add column "No" // add column "No"
$i = 0; $i = 0;
@@ -670,20 +658,9 @@ class TenderController extends Controller
$j++; $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 the response data as a JSON object
return response()->json([ return response()->json([
'draw' => $request->get('draw'), 'draw' => $request->get('draw'),
'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords,
'pageCount' => $pageCount,
'page' => $currentPage,
'totalCount' => $totalRecords,
'data' => $data, 'data' => $data,
]); ]);
} }
@@ -800,8 +777,6 @@ class TenderController extends Controller
$dp1 = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $id)->first(); $dp1 = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $id)->first();
// dd($dp1->kjpp);
foreach ($permohonan->debiture->documents as $document) { foreach ($permohonan->debiture->documents as $document) {
$village_permohonan = $document->village_code; $village_permohonan = $document->village_code;
$district_permohonan = $document->district_code; $district_permohonan = $document->district_code;
@@ -814,21 +789,89 @@ 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();
try { $subject = 'Send Penawaran K J P P Email';
$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!'); $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!');
}
} }
} }

View File

@@ -27,9 +27,4 @@ class PenawaranDetailTender extends Model
{ {
return $this->belongsTo(KJPP::class, 'kjpp_rekanan_id', 'id'); return $this->belongsTo(KJPP::class, 'kjpp_rekanan_id', 'id');
} }
public function emailTenderLog(): BelongsTo
{
return $this->belongsTo(PenawaranEmailTenderLog::class, 'penawaran_id', 'id', PenawaranTender::class);
}
} }

View File

@@ -15,4 +15,9 @@ class PenawaranEmailTenderLog extends Model
* The attributes that are mass assignable. * The attributes that are mass assignable.
*/ */
protected $guarded = ['id']; protected $guarded = ['id'];
public function penawaran()
{
return $this->belongsTo(PenawaranTender::class, 'penawaran_id', 'id');
}
} }

View File

@@ -26,6 +26,11 @@ class PenawaranTender extends Model
} }
// andy add // andy add
public function emailTenderLog(): HasMany
{
return $this->hasMany(PenawaranEmailTenderLog::class, 'penawaran_id', 'id');
}
public function penawaranKjpp() public function penawaranKjpp()
{ {
return $this->hasMany(PenawaranDetailTender::class, 'penawaran_id'); return $this->hasMany(PenawaranDetailTender::class, 'penawaran_id');

View File

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('penawaran_email_tender_log', function (Blueprint $table) {
$table->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();
});
}
};

View File

@@ -24,7 +24,6 @@
const apiUrl = element.getAttribute('data-api-url'); const apiUrl = element.getAttribute('data-api-url');
const dataTableOptions = { const dataTableOptions = {
apiEndpoint: apiUrl, apiEndpoint: apiUrl,
pageSize: 5,
columns: { columns: {
no: { no: {
title: 'No', title: 'No',
@@ -92,7 +91,31 @@
status: { status: {
title: 'Status', title: 'Status',
render: (item, data) => { 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 `<span class="badge ${color} mb-1">${log.status}</span>`;
}
}
// Jika tidak ada log, tampilkan strip
return '<span class="badge">-</span>';
} }
}, },
actions: { actions: {

View File

@@ -34,8 +34,7 @@
</div> </div>
<div class="card-body grid gap-5"> <div class="card-body grid gap-5">
<div class="grid"> <div class="grid">
<div class="card card-grid min-w-full" data-datatable="false" data-datatable-page-size="5" <div class="card card-grid min-w-full" data-datatable="false" id="kjpp-table"
id="kjpp-table"
data-api-url="{{ route('tender.penawaran.showKirimSurat.datatables', $noreg) }}"> data-api-url="{{ route('tender.penawaran.showKirimSurat.datatables', $noreg) }}">
<div class="card-header py-5 flex-wrap"> <div class="card-header py-5 flex-wrap">
<div class="card-title"> <div class="card-title">
@@ -89,21 +88,6 @@
</table> </table>
</div> </div>
<div
class="card-footer justify-center md:justify-between flex-col md:flex-row gap-3 text-gray-600 text-2sm font-medium">
<div class="flex items-center gap-2">
Show
<select class="select select-sm w-16" data-datatable-size="true" name="perpage">
</select>
per page
</div>
<div class="flex items-center gap-4">
<span data-datatable-info="true"> </span>
<div class="pagination" data-datatable-pagination="true">
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>