From cf8f456fb4180e716439691cd0e94dbfbe87d205 Mon Sep 17 00:00:00 2001 From: timotiabbauftech Date: Tue, 9 Sep 2025 17:27:29 +0700 Subject: [PATCH] [update] TransaksiController, Transaksi.php, Item.php --- app/Http/Controllers/TransaksiController.php | 2 +- app/Models/Item.php | 30 ++++++++++++- app/Models/Transaksi.php | 20 +++++++++ database/factories/TransaksiFactory.php | 43 +++++++++++-------- ...42_create_personal_access_tokens_table.php | 33 -------------- ...09_145624_add_kode_item_to_items_table.php | 25 +++++++++++ ...add_kode_transaksi_to_transaksis_table.php | 27 ++++++++++++ database/seeders/DatabaseSeeder.php | 2 +- 8 files changed, 128 insertions(+), 54 deletions(-) delete mode 100644 database/migrations/2025_09_03_140242_create_personal_access_tokens_table.php create mode 100644 database/migrations/2025_09_09_145624_add_kode_item_to_items_table.php create mode 100644 database/migrations/2025_09_09_155436_add_kode_transaksi_to_transaksis_table.php diff --git a/app/Http/Controllers/TransaksiController.php b/app/Http/Controllers/TransaksiController.php index 274f123..f79d172 100644 --- a/app/Http/Controllers/TransaksiController.php +++ b/app/Http/Controllers/TransaksiController.php @@ -14,7 +14,7 @@ class TransaksiController extends Controller public function index() { $limit = request()->query('limit', null); - $query = Transaksi::with(['kasir', 'sales', 'items.item.produk'])->latest(); + $query = Transaksi::with(['kasir', 'sales', 'itemTransaksi.item.produk'])->latest(); if ($limit) { $query->limit((int)$limit); } diff --git a/app/Models/Item.php b/app/Models/Item.php index e17e9b6..fb02e07 100644 --- a/app/Models/Item.php +++ b/app/Models/Item.php @@ -1,9 +1,8 @@ format('Ymd'); + + // Cari item terakhir yg dibuat hari ini + $lastItem = self::whereDate('created_at', now()->toDateString()) + ->orderBy('id', 'desc') + ->first(); + + $number = 1; + if ($lastItem && $lastItem->kode_item) { + // Ambil 4 digit terakhir dari kode_item + $lastNumber = intval(substr($lastItem->kode_item, -4)); + $number = $lastNumber + 1; + } + + // Format: ITM202509090001 + $item->kode_item = $prefix . $date . str_pad($number, 4, '0', STR_PAD_LEFT); + }); + } + public function produk() { return $this->belongsTo(Produk::class, 'id_produk'); diff --git a/app/Models/Transaksi.php b/app/Models/Transaksi.php index 3c49d24..ec1c6bf 100644 --- a/app/Models/Transaksi.php +++ b/app/Models/Transaksi.php @@ -9,7 +9,9 @@ class Transaksi extends Model { /** @use HasFactory<\Database\Factories\TransaksiFactory> */ use HasFactory; + protected $fillable = [ + 'kode_transaksi', // ✅ Tambahin kolom kode transaksi 'id_kasir', 'id_sales', 'nama_sales', @@ -23,6 +25,24 @@ class Transaksi extends Model protected $hidden = ['updated_at', 'deleted_at']; + // ✅ Auto-generate kode_transaksi saat create + protected static function boot() +{ + parent::boot(); + + // Setelah transaksi berhasil dibuat (sudah punya ID) + static::created(function ($transaksi) { + if (!$transaksi->kode_transaksi) { + $prefix = "TRS"; + $date = $transaksi->created_at->format('Ymd'); + $number = str_pad($transaksi->id, 4, '0', STR_PAD_LEFT); + + $transaksi->kode_transaksi = $prefix . $date . $number; + $transaksi->save(); + } + }); +} + public function kasir() { return $this->belongsTo(User::class, 'id_kasir'); diff --git a/database/factories/TransaksiFactory.php b/database/factories/TransaksiFactory.php index fee977d..f88b1ba 100644 --- a/database/factories/TransaksiFactory.php +++ b/database/factories/TransaksiFactory.php @@ -4,37 +4,46 @@ namespace Database\Factories; use App\Models\Sales; use App\Models\User; +use App\Models\Transaksi; use Illuminate\Database\Eloquent\Factories\Factory; -/** - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Transaksi> - */ class TransaksiFactory extends Factory { - /** - * Define the model's default state. - * - * @return array - */ + protected $model = Transaksi::class; + public function definition(): array { - $sales = Sales::inRandomOrder()->first(); $kasir = User::inRandomOrder()->first(); $date = $this->faker->dateTimeBetween('-3 months'); $ongkos_bikin = $this->faker->numberBetween(8, 12) * 10000; + return [ - 'id_kasir' => $kasir?->id, - 'id_sales' => $sales?->id, - 'nama_sales' => $sales?->nama, + 'id_kasir' => $kasir?->id, + 'id_sales' => $sales?->id, + 'nama_sales' => $sales?->nama, + 'kode_transaksi' => 'bwabwa' . $this->faker->unique()->numberBetween(1, 9999), // temporary, will be updated in configure() 'nama_pembeli' => $this->faker->name(), - 'no_hp' => $this->faker->phoneNumber(), - 'alamat' => $this->faker->address(), + 'no_hp' => $this->faker->phoneNumber(), + 'alamat' => $this->faker->address(), 'ongkos_bikin' => $ongkos_bikin, - 'total_harga' => $ongkos_bikin, - 'created_at' => $date, - 'updated_at' => $date, + 'total_harga' => $ongkos_bikin, + 'created_at' => $date, + 'updated_at' => $date, ]; } + + public function configure() + { + return $this->afterCreating(function (Transaksi $transaksi) { + // generate kode transaksi TRS202509090001 + $prefix = "TRS"; + $date = $transaksi->created_at->format('Ymd'); + $number = str_pad($transaksi->id, 4, '0', STR_PAD_LEFT); + + $transaksi->kode_transaksi = $prefix . $date . $number; + $transaksi->save(); + }); + } } diff --git a/database/migrations/2025_09_03_140242_create_personal_access_tokens_table.php b/database/migrations/2025_09_03_140242_create_personal_access_tokens_table.php deleted file mode 100644 index 40ff706..0000000 --- a/database/migrations/2025_09_03_140242_create_personal_access_tokens_table.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->morphs('tokenable'); - $table->text('name'); - $table->string('token', 64)->unique(); - $table->text('abilities')->nullable(); - $table->timestamp('last_used_at')->nullable(); - $table->timestamp('expires_at')->nullable()->index(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('personal_access_tokens'); - } -}; diff --git a/database/migrations/2025_09_09_145624_add_kode_item_to_items_table.php b/database/migrations/2025_09_09_145624_add_kode_item_to_items_table.php new file mode 100644 index 0000000..049b76b --- /dev/null +++ b/database/migrations/2025_09_09_145624_add_kode_item_to_items_table.php @@ -0,0 +1,25 @@ +string('kode_item')->unique()->after('id'); + }); + } + + public function down() + { + Schema::table('items', function (Blueprint $table) { + $table->dropColumn('kode_item'); + }); + } +}; diff --git a/database/migrations/2025_09_09_155436_add_kode_transaksi_to_transaksis_table.php b/database/migrations/2025_09_09_155436_add_kode_transaksi_to_transaksis_table.php new file mode 100644 index 0000000..202a31f --- /dev/null +++ b/database/migrations/2025_09_09_155436_add_kode_transaksi_to_transaksis_table.php @@ -0,0 +1,27 @@ +string('kode_transaksi')->unique()->after('id'); + }); +} + +public function down() +{ + Schema::table('transaksis', function (Blueprint $table) { + $table->dropColumn('kode_transaksi'); + }); +} + + +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index f33ba34..b61ac74 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -20,7 +20,7 @@ class DatabaseSeeder extends Seeder public function run(): void { User::factory()->create([ - 'nama' => 'iwan', + 'nama' => 'andre', 'role' => 'owner', 'password' => bcrypt('123123'), ]);