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
|
public function definition(): array
|
||||||
{
|
{
|
||||||
$quantity = fake()->numberBetween(1, 100);
|
$unit = Unit::whereIn('alias', ['butir', 'kg'])->inRandomOrder()->first()
|
||||||
$unitPrice = fake()->numberBetween(5000, 20000);
|
?? 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;
|
$totalAmount = $quantity * $unitPrice;
|
||||||
$isPaid = fake()->boolean();
|
$isPaid = fake()->boolean();
|
||||||
$paidAmount = $isPaid ? $totalAmount : fake()->numberBetween(0, $totalAmount);
|
$paidAmount = $isPaid ? $totalAmount : fake()->numberBetween(0, $totalAmount);
|
||||||
$storedDate = fake()->dateTimeBetween('-1 month', 'now');
|
$storedDate = fake()->dateTimeBetween('-1 month', 'now');
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'customer_id' => Customer::factory(),
|
'customer_id' => Customer::inRandomOrder()->first()?->id ?? Customer::factory(),
|
||||||
'unit_id' => Unit::factory(),
|
'unit_id' => $unit->id,
|
||||||
'quantity' => $quantity,
|
'quantity' => $quantity,
|
||||||
'unit_price' => $unitPrice,
|
'unit_price' => $unitPrice,
|
||||||
'total_amount' => $totalAmount,
|
'total_amount' => $totalAmount,
|
||||||
|
|||||||
@ -18,8 +18,18 @@ public function definition(): array
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'expense_date' => fake()->dateTimeBetween('-1 month', 'now'),
|
'expense_date' => fake()->dateTimeBetween('-1 month', 'now'),
|
||||||
'amount' => fake()->numberBetween(10000, 5000000),
|
'amount' => fake()->numberBetween(50000, 2000000),
|
||||||
'notes' => fake()->sentence(),
|
'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\Feed;
|
||||||
use App\Models\FeedDelivery;
|
use App\Models\FeedDelivery;
|
||||||
use App\Models\FeedSchedule;
|
|
||||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
|
||||||
class FeedDeliveryFactory extends Factory
|
class FeedDeliveryFactory extends Factory
|
||||||
@ -14,8 +13,7 @@ class FeedDeliveryFactory extends Factory
|
|||||||
public function definition(): array
|
public function definition(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'feed_schedule_id' => FeedSchedule::factory(),
|
'feed_id' => Feed::inRandomOrder()->first()?->id ?? Feed::factory(),
|
||||||
'feed_id' => Feed::factory(),
|
|
||||||
'quantity' => $this->faker->numberBetween(1, 50),
|
'quantity' => $this->faker->numberBetween(1, 50),
|
||||||
'delivered_at' => $this->faker->dateTimeBetween('-1 week', 'now'),
|
'delivered_at' => $this->faker->dateTimeBetween('-1 week', 'now'),
|
||||||
];
|
];
|
||||||
|
|||||||
@ -17,11 +17,13 @@ public function definition(): array
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'name' => $this->faker->randomElement([
|
'name' => $this->faker->randomElement([
|
||||||
'Pakan Starter',
|
'Pelet',
|
||||||
'Pakan Grower',
|
|
||||||
'Pakan Layer',
|
|
||||||
'Konsentrat Ayam',
|
|
||||||
'Jagung Giling',
|
'Jagung Giling',
|
||||||
|
'Jagung Utuh',
|
||||||
|
'Konsentrat Layer',
|
||||||
|
'Bekatul/Dedak',
|
||||||
|
'Mineral Mix',
|
||||||
|
'Pakan Finisher',
|
||||||
]),
|
]),
|
||||||
'unit_id' => Unit::inRandomOrder()->value('id') ?? Unit::factory(),
|
'unit_id' => Unit::inRandomOrder()->value('id') ?? Unit::factory(),
|
||||||
'stock' => $this->faker->numberBetween(0, 500),
|
'stock' => $this->faker->numberBetween(0, 500),
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
namespace Database\Factories;
|
namespace Database\Factories;
|
||||||
|
|
||||||
use App\Models\Feed;
|
|
||||||
use App\Models\FeedSchedule;
|
use App\Models\FeedSchedule;
|
||||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
|
||||||
@ -13,10 +12,7 @@ class FeedScheduleFactory extends Factory
|
|||||||
public function definition(): array
|
public function definition(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'feed_id' => Feed::factory(),
|
'scheduled_at' => $this->faker->time('H:i'),
|
||||||
'quantity' => $this->faker->numberBetween(1, 50),
|
|
||||||
'scheduled_at' => $this->faker->dateTimeBetween('-1 week', '+1 week'),
|
|
||||||
'executed_at' => null,
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
use App\Models\Customer;
|
use App\Models\Customer;
|
||||||
use App\Models\Order;
|
use App\Models\Order;
|
||||||
use App\Models\Unit;
|
use App\Models\Unit;
|
||||||
|
use App\Models\Warehouse;
|
||||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -23,19 +24,28 @@ public function definition(): array
|
|||||||
{
|
{
|
||||||
$date = $this->faker->dateTimeBetween('-3 months', 'now');
|
$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();
|
$customer = Customer::inRandomOrder()->first() ?? Customer::factory()->create();
|
||||||
|
|
||||||
$eggQuantity = $this->faker->randomFloat(2, 10, 500);
|
if ($unit->alias === 'butir') {
|
||||||
$unitPrice = $eggPrice / 10;
|
$eggQuantity = $this->faker->numberBetween(30, 300);
|
||||||
$discount = $this->faker->optional(0.3)->numberBetween(5000, 50000) ?? 0;
|
$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;
|
$subtotal = $eggQuantity * $unitPrice;
|
||||||
$totalAmount = max(0, $subtotal - $discount);
|
$totalAmount = max(0, $subtotal - $discount);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'customer_id' => $customer->id,
|
'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,
|
'egg_quantity' => $eggQuantity,
|
||||||
'unit_price' => $unitPrice,
|
'unit_price' => $unitPrice,
|
||||||
'order_date' => $date,
|
'order_date' => $date,
|
||||||
|
|||||||
@ -21,6 +21,8 @@ public function run(): void
|
|||||||
UnitSeeder::class,
|
UnitSeeder::class,
|
||||||
WarehouseSeeder::class,
|
WarehouseSeeder::class,
|
||||||
FeedSeeder::class,
|
FeedSeeder::class,
|
||||||
|
FeedScheduleSeeder::class,
|
||||||
|
FeedDeliverySeeder::class,
|
||||||
FeedPurchaseSeeder::class,
|
FeedPurchaseSeeder::class,
|
||||||
EggCollectionSeeder::class,
|
EggCollectionSeeder::class,
|
||||||
CustomerSeeder::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;
|
namespace Database\Seeders;
|
||||||
|
|
||||||
use App\Models\Feed;
|
use App\Models\Feed;
|
||||||
|
use App\Models\Unit;
|
||||||
use Illuminate\Database\Seeder;
|
use Illuminate\Database\Seeder;
|
||||||
|
|
||||||
class FeedSeeder extends Seeder
|
class FeedSeeder extends Seeder
|
||||||
@ -12,6 +13,25 @@ class FeedSeeder extends Seeder
|
|||||||
*/
|
*/
|
||||||
public function run(): void
|
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