Menambahkan log ketika di kirim surat tender dari setiap kjpp
This commit is contained in:
@@ -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!');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
@@ -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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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: {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user