feat: Implement detailed feed scheduling and delivery seeders, refine factory data generation for various entities, and update database seeder.

This commit is contained in:
Yoga Pangestu 2026-03-09 14:56:14 +07:00
parent 5c068017b2
commit 84909d9392
10 changed files with 131 additions and 24 deletions

View File

@ -18,16 +18,26 @@ class DelayedGoodFactory extends Factory
*/
public function definition(): array
{
$quantity = fake()->numberBetween(1, 100);
$unitPrice = fake()->numberBetween(5000, 20000);
$unit = Unit::whereIn('alias', ['butir', 'kg'])->inRandomOrder()->first()
?? Unit::where('alias', 'butir')->first()
?? Unit::factory()->create();
if ($unit->alias === 'butir') {
$quantity = fake()->numberBetween(10, 100);
$unitPrice = fake()->numberBetween(1500, 2500);
} else {
$quantity = fake()->randomFloat(2, 1, 15);
$unitPrice = fake()->numberBetween(25000, 32000);
}
$totalAmount = $quantity * $unitPrice;
$isPaid = fake()->boolean();
$paidAmount = $isPaid ? $totalAmount : fake()->numberBetween(0, $totalAmount);
$storedDate = fake()->dateTimeBetween('-1 month', 'now');
return [
'customer_id' => Customer::factory(),
'unit_id' => Unit::factory(),
'customer_id' => Customer::inRandomOrder()->first()?->id ?? Customer::factory(),
'unit_id' => $unit->id,
'quantity' => $quantity,
'unit_price' => $unitPrice,
'total_amount' => $totalAmount,

View File

@ -18,8 +18,18 @@ public function definition(): array
{
return [
'expense_date' => fake()->dateTimeBetween('-1 month', 'now'),
'amount' => fake()->numberBetween(10000, 5000000),
'notes' => fake()->sentence(),
'amount' => fake()->numberBetween(50000, 2000000),
'notes' => fake()->randomElement([
'Listrik Kandang',
'Gaji Pegawai',
'Beli Vaksin/Obat',
'Beli Vitamin',
'Perbaikan Kandang',
'Bahan Bakar Genset',
'Operasional Kantor',
'Sewa Kendaraan',
'Beli ATK',
]),
];
}
}

View File

@ -4,7 +4,6 @@
use App\Models\Feed;
use App\Models\FeedDelivery;
use App\Models\FeedSchedule;
use Illuminate\Database\Eloquent\Factories\Factory;
class FeedDeliveryFactory extends Factory
@ -14,8 +13,7 @@ class FeedDeliveryFactory extends Factory
public function definition(): array
{
return [
'feed_schedule_id' => FeedSchedule::factory(),
'feed_id' => Feed::factory(),
'feed_id' => Feed::inRandomOrder()->first()?->id ?? Feed::factory(),
'quantity' => $this->faker->numberBetween(1, 50),
'delivered_at' => $this->faker->dateTimeBetween('-1 week', 'now'),
];

View File

@ -17,11 +17,13 @@ public function definition(): array
{
return [
'name' => $this->faker->randomElement([
'Pakan Starter',
'Pakan Grower',
'Pakan Layer',
'Konsentrat Ayam',
'Pelet',
'Jagung Giling',
'Jagung Utuh',
'Konsentrat Layer',
'Bekatul/Dedak',
'Mineral Mix',
'Pakan Finisher',
]),
'unit_id' => Unit::inRandomOrder()->value('id') ?? Unit::factory(),
'stock' => $this->faker->numberBetween(0, 500),

View File

@ -2,7 +2,6 @@
namespace Database\Factories;
use App\Models\Feed;
use App\Models\FeedSchedule;
use Illuminate\Database\Eloquent\Factories\Factory;
@ -13,10 +12,7 @@ class FeedScheduleFactory extends Factory
public function definition(): array
{
return [
'feed_id' => Feed::factory(),
'quantity' => $this->faker->numberBetween(1, 50),
'scheduled_at' => $this->faker->dateTimeBetween('-1 week', '+1 week'),
'executed_at' => null,
'scheduled_at' => $this->faker->time('H:i'),
];
}
}

View File

@ -5,6 +5,7 @@
use App\Models\Customer;
use App\Models\Order;
use App\Models\Unit;
use App\Models\Warehouse;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
@ -23,19 +24,28 @@ public function definition(): array
{
$date = $this->faker->dateTimeBetween('-3 months', 'now');
$eggPrice = $this->faker->numberBetween(28000, 35000);
$unit = Unit::whereIn('alias', ['butir', 'kg'])->inRandomOrder()->first()
?? Unit::where('alias', 'butir')->first()
?? Unit::factory()->create();
$customer = Customer::inRandomOrder()->first() ?? Customer::factory()->create();
$eggQuantity = $this->faker->randomFloat(2, 10, 500);
$unitPrice = $eggPrice / 10;
$discount = $this->faker->optional(0.3)->numberBetween(5000, 50000) ?? 0;
if ($unit->alias === 'butir') {
$eggQuantity = $this->faker->numberBetween(30, 300);
$unitPrice = $this->faker->numberBetween(1500, 2500); // Price per egg
} else {
$eggQuantity = $this->faker->randomFloat(2, 5, 50);
$unitPrice = $this->faker->numberBetween(25000, 32000); // Price per kg
}
$discount = $this->faker->optional(0.3)->numberBetween(5000, 25000) ?? 0;
$subtotal = $eggQuantity * $unitPrice;
$totalAmount = max(0, $subtotal - $discount);
return [
'customer_id' => $customer->id,
'unit_id' => Unit::inRandomOrder()->first()->id ?? Unit::factory()->create()->id,
'unit_id' => $unit->id,
'warehouse_id' => Warehouse::inRandomOrder()->first()?->id ?? Warehouse::factory(),
'egg_quantity' => $eggQuantity,
'unit_price' => $unitPrice,
'order_date' => $date,

View File

@ -21,6 +21,8 @@ public function run(): void
UnitSeeder::class,
WarehouseSeeder::class,
FeedSeeder::class,
FeedScheduleSeeder::class,
FeedDeliverySeeder::class,
FeedPurchaseSeeder::class,
EggCollectionSeeder::class,
CustomerSeeder::class,

View File

@ -0,0 +1,17 @@
<?php
namespace Database\Seeders;
use App\Models\FeedDelivery;
use Illuminate\Database\Seeder;
class FeedDeliverySeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
FeedDelivery::factory()->count(30)->create();
}
}

View File

@ -0,0 +1,42 @@
<?php
namespace Database\Seeders;
use App\Models\Feed;
use App\Models\FeedSchedule;
use Illuminate\Database\Seeder;
class FeedScheduleSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$times = ['07:00', '12:00', '16:00'];
$feeds = Feed::all();
if ($feeds->isEmpty()) {
$this->call(FeedSeeder::class);
$feeds = Feed::all();
}
foreach ($times as $time) {
$schedule = FeedSchedule::firstOrCreate([
'scheduled_at' => $time,
]);
// Attach 1-2 random feeds to each schedule
$selectedFeeds = $feeds->random(rand(1, 2));
foreach ($selectedFeeds as $feed) {
// Check if already attached to avoid duplicates if re-run
if (! $schedule->feeds()->where('feed_id', $feed->id)->exists()) {
$schedule->feeds()->attach($feed->id, [
'quantity' => rand(10, 50),
]);
}
}
}
}
}

View File

@ -3,6 +3,7 @@
namespace Database\Seeders;
use App\Models\Feed;
use App\Models\Unit;
use Illuminate\Database\Seeder;
class FeedSeeder extends Seeder
@ -12,6 +13,25 @@ class FeedSeeder extends Seeder
*/
public function run(): void
{
Feed::factory()->count(20)->create();
$unitId = Unit::where('alias', 'kg')->first()?->id;
$feeds = [
['name' => 'Pelet', 'price' => 7500],
['name' => 'Jagung', 'price' => 6000],
['name' => 'Konsentrat', 'price' => 12000],
['name' => 'Bekatul', 'price' => 3500],
['name' => 'Mineral Mix', 'price' => 15000],
];
foreach ($feeds as $feed) {
Feed::firstOrCreate(
['name' => $feed['name']],
[
'unit_id' => $unitId,
'price' => $feed['price'],
'stock' => 0,
]
);
}
}
}