[Update] relasi item

This commit is contained in:
Baghaztra 2025-09-12 16:32:10 +07:00
parent b78a396a51
commit 29a1ebf713
10 changed files with 20 additions and 38 deletions

View File

@ -44,7 +44,7 @@ class ItemController extends Controller
*/ */
public function show(int $id) public function show(int $id)
{ {
$item = Item::with('produk.foto','nampan','itemTransaksi.transaksi')->findOrFail($id); $item = Item::with('produk.foto','nampan')->findOrFail($id);
return response()->json($item); return response()->json($item);
} }
@ -83,7 +83,7 @@ class ItemController extends Controller
// custom methods // custom methods
public function brankasItem(){ public function brankasItem(){
$items = Item::with('produk.foto','nampan')->whereNull('id_nampan')->belumTerjual()->get(); $items = Item::with('produk.foto','nampan')->whereNull('id_nampan')->get();
return response()->json($items); return response()->json($items);
} }

View File

@ -80,19 +80,16 @@ class TransaksiController extends Controller
// if (!$item) { // if (!$item) {
// throw new \Exception("Item dengan kode_item {$it['kode_item']} tidak ditemukan."); // throw new \Exception("Item dengan kode_item {$it['kode_item']} tidak ditemukan.");
// } // }
$item = Item::find($it['kode_item']); $item = Item::find($it['kode_item'])->with('produk')->first();
ItemTransaksi::create([ ItemTransaksi::create([
'id_transaksi' => $transaksi->id, 'id_transaksi' => $transaksi->id,
'id_item' => $item->id, 'id_produk' => $item->produk->id,
'harga_deal' => $it['harga_deal'], 'harga_deal' => $it['harga_deal'],
'posisi_asal' => $item->nampan ? 'Nampan ' . $item->nampan->nama : 'Brankas', 'posisi_asal' => $item->nampan ? 'Nampan ' . $item->nampan->nama : 'Brankas',
]); ]);
$item->update([ $item->delete();
'is_sold' => true,
'id_nampan' => null,
]);
} }
DB::commit(); DB::commit();

View File

@ -13,8 +13,7 @@ class Item extends Model
protected $fillable = [ protected $fillable = [
'id_produk', 'id_produk',
'id_nampan', 'id_nampan',
'is_sold', 'kode_item',
'kode_item', // ✅ ditambahkan agar bisa diisi otomatis
]; ];
protected $hidden = ['created_at', 'updated_at', 'deleted_at']; protected $hidden = ['created_at', 'updated_at', 'deleted_at'];
@ -50,18 +49,8 @@ class Item extends Model
return $this->belongsTo(Produk::class, 'id_produk'); return $this->belongsTo(Produk::class, 'id_produk');
} }
public function scopeBelumTerjual($query)
{
return $query->where('is_sold', false);
}
public function nampan() public function nampan()
{ {
return $this->belongsTo(Nampan::class, 'id_nampan'); return $this->belongsTo(Nampan::class, 'id_nampan');
} }
public function itemTransaksi()
{
return $this->hasOne(ItemTransaksi::class, 'id_item');
}
} }

View File

@ -12,7 +12,7 @@ class ItemTransaksi extends Model
protected $fillable = [ protected $fillable = [
'id_transaksi', 'id_transaksi',
'id_item', 'id_produk',
'harga_deal', 'harga_deal',
'posisi_asal' 'posisi_asal'
]; ];
@ -24,8 +24,8 @@ class ItemTransaksi extends Model
return $this->belongsTo(Transaksi::class, 'id_transaksi'); return $this->belongsTo(Transaksi::class, 'id_transaksi');
} }
public function item() public function produk()
{ {
return $this->belongsTo(Item::class, 'id_item'); return $this->belongsTo(Produk::class, 'id_produk');
} }
} }

View File

@ -19,7 +19,6 @@ class ItemFactory extends Factory
return [ return [
'id_produk' => \App\Models\Produk::factory(), 'id_produk' => \App\Models\Produk::factory(),
'id_nampan' => null, 'id_nampan' => null,
'is_sold' => false,
]; ];
} }
} }

View File

@ -3,6 +3,7 @@
namespace Database\Factories; namespace Database\Factories;
use App\Models\Item; use App\Models\Item;
use App\Models\Produk;
use App\Models\Transaksi; use App\Models\Transaksi;
use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Factories\Factory;
@ -20,7 +21,7 @@ class ItemTransaksiFactory extends Factory
{ {
return [ return [
'id_transaksi' => Transaksi::factory(), 'id_transaksi' => Transaksi::factory(),
'id_item' => Item::factory(), 'id_produk' => Produk::factory(),
'harga_deal' => $this->faker->randomFloat(2, 100000, 5000000), 'harga_deal' => $this->faker->randomFloat(2, 100000, 5000000),
'created_at' => now(), 'created_at' => now(),
]; ];

View File

@ -15,7 +15,6 @@ return new class extends Migration
$table->id(); $table->id();
$table->foreignId('id_produk')->constrained('produks')->cascadeOnDelete(); $table->foreignId('id_produk')->constrained('produks')->cascadeOnDelete();
$table->foreignId('id_nampan')->nullable()->constrained('nampans'); $table->foreignId('id_nampan')->nullable()->constrained('nampans');
$table->boolean('is_sold')->default(false);
$table->timestamps(); $table->timestamps();
}); });
} }

View File

@ -14,7 +14,7 @@ return new class extends Migration
Schema::create('item_transaksis', function (Blueprint $table) { Schema::create('item_transaksis', function (Blueprint $table) {
$table->id(); $table->id();
$table->foreignId('id_transaksi')->constrained('transaksis')->onDelete('cascade'); $table->foreignId('id_transaksi')->constrained('transaksis')->onDelete('cascade');
$table->foreignId('id_item')->constrained('items'); $table->foreignId('id_produk')->constrained('produks');
$table->double('harga_deal'); $table->double('harga_deal');
$table->string('posisi_asal', 100); $table->string('posisi_asal', 100);
$table->timestamps(); $table->timestamps();

View File

@ -64,7 +64,6 @@ class DatabaseSeeder extends Seeder
$jumlah_item = rand(1, 20); $jumlah_item = rand(1, 20);
Item::factory($jumlah_item)->create([ Item::factory($jumlah_item)->create([
'id_produk' => $produk->id, 'id_produk' => $produk->id,
'is_sold' => false,
]); ]);
}); });
@ -84,19 +83,16 @@ class DatabaseSeeder extends Seeder
Transaksi::factory(40)->create()->each(function ($transaksi) { Transaksi::factory(40)->create()->each(function ($transaksi) {
$jumlah_item = rand(1, 2); $jumlah_item = rand(1, 2);
$items = Item::where('is_sold', false)->inRandomOrder()->limit($jumlah_item)->get(); $items = Item::with('produk')->inRandomOrder()->limit($jumlah_item)->get();
if ($items->isEmpty()) return; if ($items->isEmpty()) return;
$total_harga = $transaksi->total_harga; $total_harga = $transaksi->total_harga;
foreach ($items as $item) { foreach ($items as $item) {
$transaksi->itemTransaksi()->create([ $transaksi->itemTransaksi()->create([
'id_item' => $item->id, 'id_produk' => $item->produk->id,
'harga_deal' => $item->produk->harga_jual, 'harga_deal' => $item->produk->harga_jual,
'posisi_asal' => $item->id_nampan ? 'Nampan ' . $item->nampan->nama : 'Brankas', 'posisi_asal' => $item->id_nampan ? 'Nampan ' . $item->nampan->nama : 'Brankas',
]); ]);
$item->update([ $item->delete();
'id_nampan' => null,
'is_sold' => true,
]);
$total_harga += $item->produk->harga_jual; $total_harga += $item->produk->harga_jual;
} }
$transaksi->update(['total_harga' => $total_harga]); $transaksi->update(['total_harga' => $total_harga]);

View File

@ -90,7 +90,7 @@
{{ item.produk.nama }} {{ item.produk.nama }}
</td> </td>
<td class="border border-B p-2 truncate max-w-[80px]"> <td class="border border-B p-2 truncate max-w-[80px]">
{{ item.posisi ? item.posisi : "Brankas" }} {{ item.nampan ? item.nampan.nama : "Brankas" }}
</td> </td>
<td class="border border-B p-2 whitespace-nowrap"> <td class="border border-B p-2 whitespace-nowrap">
Rp{{ item.harga_deal.toLocaleString() }} Rp{{ item.harga_deal.toLocaleString() }}
@ -150,14 +150,15 @@ const inputItem = async () => {
item.value = response.data; item.value = response.data;
hargaJual.value = item.value.produk.harga_jual; hargaJual.value = item.value.produk.harga_jual;
console.log(item.value);
if (item.value.is_sold) { if (item.value.is_sold) {
throw new Error("Item sudah terjual"); throw new Error("Item sudah terjual");
} }
if (pesanan.value.some((p) => p.id === item.value.id)) { if (pesanan.value.some((p) => p.id === item.value.id)) {
throw new Error("Item sedang dipesan"); throw new Error("Item sedang dipesan");
} }
info.value = `Item dipilih: ${item.value.produk.nama} dari ${item.value.posisi ? item.value.posisi : "Brankas" info.value = `Item dipilih: ${item.value.produk.nama} dari ${item.value.nampan ? 'Nampan ' + item.value.nampan.nama : "Brankas"}`;
}`;
infoTimeout = setTimeout(() => { infoTimeout = setTimeout(() => {
info.value = ""; info.value = "";