feat(memo): tambah field memo penyelesaian ke tabel NOC dan update generatePdf

Menambahkan penyimpanan data memo penyelesaian ke tabel NOC dan memperbarui fungsi generatePdf di MemoController agar lebih terintegrasi.

Perubahan yang dilakukan:
- Menambahkan migrasi untuk field baru di tabel NOC:
  - memo_penyelesaian_number: nomor memo penyelesaian
  - memo_penyelesaian_date: tanggal memo
  - memo_penyelesaian_payment_date: tanggal pembayaran
  - memo_penyelesaian_pdf_path: path file PDF memo
  - memo_penyelesaian_created_at: timestamp pembuatan memo

- Update model NOC:
  - Menambahkan field baru ke $fillable array untuk mass assignment
  - Menambahkan casting untuk field date dan datetime agar otomatis diconvert oleh Eloquent
  - Mempertahankan struktur model dan relasi yang sudah ada

- Update MemoController:
  - Mengubah proses penyimpanan memo dari tabel permohonan ke tabel NOC
  - Menambahkan pencarian NOC berdasarkan permohonan_id
  - Menyimpan semua informasi memo penyelesaian langsung ke NOC
  - Tetap memperbarui status permohonan agar proses bisnis tetap berjalan
  - Menambahkan logging untuk mempermudah monitoring dan debugging
  - Menggunakan DB transaction untuk menjaga konsistensi data

Struktur data memo penyelesaian:
- Disimpan secara terpusat di tabel NOC sebagai source of truth
- Memiliki relasi langsung dengan tabel permohonan untuk referensi data
- Menyimpan path PDF memo untuk akses file yang lebih mudah
- Menyediakan timestamp lengkap untuk kebutuhan audit trail

Tujuan perubahan:
- Memusatkan data memo penyelesaian di tabel NOC untuk kemudahan query dan reporting
- Menjamin konsistensi data dengan mekanisme transaction
- Memperjelas struktur relasi antara memo penyelesaian dan permohonan
- Memudahkan proses tracking, pelaporan, dan audit memo penyelesaian
This commit is contained in:
Daeng Deni Mardaeni
2025-07-17 13:03:32 +07:00
parent cbdd4bd99e
commit 5e7368ebcf
3 changed files with 72 additions and 16 deletions

View File

@@ -452,34 +452,48 @@ class MemoController extends Controller
Storage::disk('public')->put($filePath, $pdf->output()); Storage::disk('public')->put($filePath, $pdf->output());
// Update status permohonan yang dipilih // Update status permohonan yang dipilih
// Update data di tabel NOC untuk setiap permohonan
foreach ($permohonanIds as $permohonanId) { foreach ($permohonanIds as $permohonanId) {
$permohonan = Permohonan::find($permohonanId); // Cari NOC berdasarkan permohonan_id
if ($permohonan) { $noc = Noc::where('permohonan_id', $permohonanId)->first();
$permohonan->status = 'memo-penyelesaian';
$permohonan->memo_penyelesaian_number = $memoNumber;
$permohonan->memo_penyelesaian_date = $memoDate;
$permohonan->memo_penyelesaian_payment_date = $paymentDate;
$permohonan->memo_penyelesaian_created_at = now();
$permohonan->memo_penyelesaian_pdf_path = $filePath;
//$permohonan->save();
Log::info('MemoController: Berhasil update permohonan ID: ' . $permohonanId); if ($noc) {
} // Update field memo penyelesaian di tabel NOC
$noc->memo_penyelesaian = $filePath;
$noc->memo_penyelesaian_number = $memoNumber;
$noc->memo_penyelesaian_date = $memoDate;
$noc->memo_penyelesaian_payment_date = $paymentDate;
$noc->memo_penyelesaian_created_at = now();
$noc->save();
Log::info('MemoController: Berhasil update NOC untuk permohonan ID: ' . $permohonanId);
} else {
Log::warning('MemoController: NOC tidak ditemukan untuk permohonan ID: ' . $permohonanId);
}
// Update status permohonan
$permohonan = Permohonan::find($permohonanId);
if ($permohonan) {
$permohonan->status = 'memo-penyelesaian';
$permohonan->save();
Log::info('MemoController: Berhasil update status permohonan ID: ' . $permohonanId);
}
} }
DB::commit(); DB::commit();
Log::info('MemoController: Berhasil generate PDF dan menyimpan memo penyelesaian untuk ' . count($permohonanIds) . ' permohonan'); Log::info('MemoController: Berhasil generate PDF dan menyimpan memo penyelesaian untuk ' . count($permohonanIds) . ' permohonan');
// Return PDF untuk download // Return PDF untuk download
return $pdf->download($fileName); return $pdf->download('memo-penyelesaian-' . $memoNumber . '.pdf');
} catch (Exception $e) { } catch (Exception $e) {
DB::rollback(); DB::rollback();
Log::error('MemoController: Error saat generate PDF memo penyelesaian - ' . $e->getMessage()); Log::error('MemoController: Error saat generate PDF memo penyelesaian - ' . $e->getMessage());
return redirect()->back() return redirect()->back()
->withInput() ->with('error', 'Terjadi kesalahan saat generate PDF memo penyelesaian: ' . $e->getMessage())
->with('error', 'Terjadi kesalahan saat generate PDF memo penyelesaian: ' . $e->getMessage()); ->withInput();
} }
} }

View File

@@ -2,8 +2,7 @@
namespace Modules\Lpj\Models; namespace Modules\Lpj\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Auth\User;
use Illuminate\Database\Eloquent\Factories\HasFactory;
// use Modules\Lpj\Database\Factories\NocFactory; // use Modules\Lpj\Database\Factories\NocFactory;
class Noc extends Base class Noc extends Base
@@ -23,6 +22,10 @@ class Noc extends Base
'bukti_penyelesaian', 'bukti_penyelesaian',
'bukti_ksl', 'bukti_ksl',
'memo_penyelesaian', 'memo_penyelesaian',
'memo_penyelesaian_number',
'memo_penyelesaian_date',
'memo_penyelesaian_payment_date',
'memo_penyelesaian_created_at',
'catatan_noc', 'catatan_noc',
'status', 'status',
'authorized_status', 'authorized_status',
@@ -37,6 +40,9 @@ class Noc extends Base
'nominal_penyelesaian' => 'decimal:2', 'nominal_penyelesaian' => 'decimal:2',
'status_penyelesaiaan' => 'boolean', 'status_penyelesaiaan' => 'boolean',
'tanggal_penyelesaian' => 'date', 'tanggal_penyelesaian' => 'date',
'memo_penyelesaian_date' => 'date',
'memo_penyelesaian_payment_date' => 'date',
'memo_penyelesaian_created_at' => 'datetime',
'status' => 'boolean', 'status' => 'boolean',
'authorized_status' => 'boolean', 'authorized_status' => 'boolean',
'authorized_at' => 'datetime', 'authorized_at' => 'datetime',

View File

@@ -0,0 +1,36 @@
<?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('noc', function (Blueprint $table) {
// Field untuk informasi memo penyelesaian
$table->string('memo_penyelesaian_number')->nullable()->after('memo_penyelesaian');
$table->date('memo_penyelesaian_date')->nullable()->after('memo_penyelesaian_number');
$table->date('memo_penyelesaian_payment_date')->nullable()->after('memo_penyelesaian_date');
$table->timestamp('memo_penyelesaian_created_at')->nullable()->after('memo_penyelesaian_date');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('noc', function (Blueprint $table) {
$table->dropColumn([
'memo_penyelesaian_number',
'memo_penyelesaian_date',
'memo_penyelesaian_payment_date',
'memo_penyelesaian_created_at'
]);
});
}
};