feat(customer): tambah field alamat lengkap & pemrosesan CSV dinamis

- Tambah 13 field alamat KTP & domisili di tabel customers (nullable, aman untuk rollback)
- Update model Customer: fillable & casting tanggal
- ProcessCustomerDataJob: header CSV dinamis, mapping otomatis, trim value
- Batch save pakai DB::transaction(), logging detail, error handling lengkap
- Fleksibel untuk CSV dengan header bervariasi & backward-compatible
This commit is contained in:
Daeng Deni Mardaeni
2025-08-07 08:45:50 +07:00
parent 8a6469ecc9
commit 7af5bf2fe5
3 changed files with 176 additions and 13 deletions

View File

@@ -0,0 +1,57 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
* Menambahkan field-field yang belum ada pada tabel customers
*/
public function up(): void
{
Schema::table('customers', function (Blueprint $table) {
// Field yang belum ada berdasarkan CSV header
$table->string('ktp_kelurahan')->nullable()->after('local_ref')->comment('Kelurahan sesuai KTP');
$table->string('ktp_kecamatan')->nullable()->after('ktp_kelurahan')->comment('Kecamatan sesuai KTP');
$table->string('town_country')->nullable()->after('ktp_kecamatan')->comment('Kota/Negara');
$table->string('ktp_provinsi')->nullable()->after('town_country')->comment('Provinsi sesuai KTP');
$table->string('post_code')->nullable()->after('ktp_provinsi')->comment('Kode pos alternatif');
$table->string('l_dom_street')->nullable()->after('post_code')->comment('Alamat domisili - jalan');
$table->string('l_dom_rt')->nullable()->after('l_dom_street')->comment('Alamat domisili - RT');
$table->string('l_dom_kelurahan')->nullable()->after('l_dom_rt')->comment('Alamat domisili - kelurahan');
$table->string('l_dom_rw')->nullable()->after('l_dom_kelurahan')->comment('Alamat domisili - RW');
$table->string('l_dom_kecamatan')->nullable()->after('l_dom_rw')->comment('Alamat domisili - kecamatan');
$table->string('l_dom_provinsi')->nullable()->after('l_dom_kecamatan')->comment('Alamat domisili - provinsi');
$table->string('l_dom_t_country')->nullable()->after('l_dom_provinsi')->comment('Alamat domisili - kota/negara');
$table->string('l_dom_post_code')->nullable()->after('l_dom_t_country')->comment('Alamat domisili - kode pos');
});
}
/**
* Reverse the migrations.
* Menghapus field-field yang ditambahkan
*/
public function down(): void
{
Schema::table('customers', function (Blueprint $table) {
$table->dropColumn([
'ktp_kelurahan',
'ktp_kecamatan',
'town_country',
'ktp_provinsi',
'post_code',
'l_dom_street',
'l_dom_rt',
'l_dom_kelurahan',
'l_dom_rw',
'l_dom_kecamatan',
'l_dom_provinsi',
'l_dom_t_country',
'l_dom_post_code'
]);
});
}
};