feat: Implement detailed feed scheduling and delivery seeders, refine factory data generation for various entities, and update database seeder.
This commit is contained in:
parent
5c068017b2
commit
84909d9392
@ -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,
|
||||
|
||||
@ -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',
|
||||
]),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@ -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'),
|
||||
];
|
||||
|
||||
@ -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),
|
||||
|
||||
@ -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'),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -21,6 +21,8 @@ public function run(): void
|
||||
UnitSeeder::class,
|
||||
WarehouseSeeder::class,
|
||||
FeedSeeder::class,
|
||||
FeedScheduleSeeder::class,
|
||||
FeedDeliverySeeder::class,
|
||||
FeedPurchaseSeeder::class,
|
||||
EggCollectionSeeder::class,
|
||||
CustomerSeeder::class,
|
||||
|
||||
17
database/seeders/FeedDeliverySeeder.php
Normal file
17
database/seeders/FeedDeliverySeeder.php
Normal 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();
|
||||
}
|
||||
}
|
||||
42
database/seeders/FeedScheduleSeeder.php
Normal file
42
database/seeders/FeedScheduleSeeder.php
Normal 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),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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,
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user