firstOrFail(); $pendingRental = RentalCompany::where('company_name', 'Nusantara Mobility')->firstOrFail(); $vehicles = Vehicle::query()->orderBy('id')->get()->keyBy('name'); $customers = User::query() ->where('role', 'customer') ->orderBy('email') ->get() ->keyBy('email'); $loyalPromo = Promo::where('promo_code', 'LOYAL10')->first(); $weekendPromo = Promo::where('promo_code', 'WEEKEND50')->first(); $bookings = [ $this->makeBooking( bookingCode: 'BK-20260423-0001', customer: $customers['customer1@example.com'], rentalCompanyId: $approvedRental->id, vehicle: $vehicles['Toyota Avanza 2023'], promoId: $loyalPromo?->id, pickupDate: now()->subDays(15), durationDays: 3, status: Booking::BOOKING_COMPLETED, paymentStatus: Booking::PAYMENT_VERIFIED, paymentMethod: 'transfer_bank', note: 'Loyal customer demo booking 1', ), $this->makeBooking( bookingCode: 'BK-20260423-0002', customer: $customers['customer1@example.com'], rentalCompanyId: $approvedRental->id, vehicle: $vehicles['Honda Brio 2024'], promoId: $loyalPromo?->id, pickupDate: now()->subDays(12), durationDays: 2, status: Booking::BOOKING_COMPLETED, paymentStatus: Booking::PAYMENT_VERIFIED, paymentMethod: 'qris', note: 'Loyal customer demo booking 2', ), $this->makeBooking( bookingCode: 'BK-20260423-0003', customer: $customers['customer1@example.com'], rentalCompanyId: $approvedRental->id, vehicle: $vehicles['Mitsubishi Pajero Sport 2022'], promoId: $weekendPromo?->id, pickupDate: now()->subDays(8), durationDays: 4, status: Booking::BOOKING_COMPLETED, paymentStatus: Booking::PAYMENT_VERIFIED, paymentMethod: 'transfer_bank', note: 'Loyal customer demo booking 3', ), $this->makeBooking( bookingCode: 'BK-20260423-0004', customer: $customers['customer2@example.com'], rentalCompanyId: $approvedRental->id, vehicle: $vehicles['Toyota Avanza 2023'], promoId: null, pickupDate: now()->addDays(2), durationDays: 2, status: Booking::BOOKING_CONFIRMED, paymentStatus: Booking::PAYMENT_VERIFIED, paymentMethod: 'transfer_bank', note: 'Confirmed booking demo', ), $this->makeBooking( bookingCode: 'BK-20260423-0005', customer: $customers['customer3@example.com'], rentalCompanyId: $approvedRental->id, vehicle: $vehicles['Honda Brio 2024'], promoId: null, pickupDate: now()->addDays(1), durationDays: 1, status: Booking::BOOKING_ONGOING, paymentStatus: Booking::PAYMENT_VERIFIED, paymentMethod: 'cash', note: 'Ongoing booking demo', ), $this->makeBooking( bookingCode: 'BK-20260423-0006', customer: $customers['customer4@example.com'], rentalCompanyId: $approvedRental->id, vehicle: $vehicles['Mitsubishi Pajero Sport 2022'], promoId: null, pickupDate: now()->addDays(5), durationDays: 3, status: Booking::BOOKING_WAITING_VERIFICATION, paymentStatus: Booking::PAYMENT_UPLOADED, paymentMethod: 'transfer_bank', note: 'Waiting verification demo', ), $this->makeBooking( bookingCode: 'BK-20260423-0007', customer: $customers['customer5@example.com'], rentalCompanyId: $approvedRental->id, vehicle: $vehicles['Toyota Avanza 2023'], promoId: null, pickupDate: now()->addDays(7), durationDays: 2, status: Booking::BOOKING_WAITING_PAYMENT, paymentStatus: Booking::PAYMENT_UNPAID, paymentMethod: null, note: 'Waiting payment demo', ), $this->makeBooking( bookingCode: 'BK-20260423-0008', customer: $customers['customer2@example.com'], rentalCompanyId: $approvedRental->id, vehicle: $vehicles['Honda Brio 2024'], promoId: null, pickupDate: now()->subDays(3), durationDays: 1, status: Booking::BOOKING_CANCELLED, paymentStatus: Booking::PAYMENT_REJECTED, paymentMethod: 'transfer_bank', note: 'Cancelled after rejection demo', ), $this->makeBooking( bookingCode: 'BK-20260423-0009', customer: $customers['customer3@example.com'], rentalCompanyId: $pendingRental->id, vehicle: $vehicles['Suzuki XL7 2023'], promoId: null, pickupDate: now()->addDays(10), durationDays: 2, status: Booking::BOOKING_CONFIRMED, paymentStatus: Booking::PAYMENT_VERIFIED, paymentMethod: 'transfer_bank', note: 'Pending rental demo booking', ), ]; foreach ($bookings as $bookingData) { Booking::updateOrCreate( ['booking_code' => $bookingData['booking_code']], $bookingData ); } } private function makeBooking( string $bookingCode, User $customer, int $rentalCompanyId, Vehicle $vehicle, ?int $promoId, Carbon $pickupDate, int $durationDays, string $status, string $paymentStatus, ?string $paymentMethod, string $note ): array { $subtotal = (float) $vehicle->price_per_day * $durationDays; $discountAmount = $promoId ? round($subtotal * 0.10, 2) : 0; $totalAmount = max($subtotal - $discountAmount, 0); return [ 'booking_code' => $bookingCode, 'customer_id' => $customer->id, 'rental_company_id' => $rentalCompanyId, 'vehicle_id' => $vehicle->id, 'promo_id' => $promoId, 'pickup_date' => $pickupDate->toDateString(), 'return_date' => $pickupDate->copy()->addDays($durationDays)->toDateString(), 'pickup_time' => '09:00:00', 'pickup_location' => 'Lokasi pickup demo', 'return_location' => 'Lokasi return demo', 'duration_days' => $durationDays, 'with_driver' => false, 'customer_name' => $customer->name, 'customer_email' => $customer->email, 'customer_phone' => $customer->phone, 'customer_address' => 'Alamat demo customer', 'identity_number' => 'ID-' . Str::upper(Str::random(8)), 'driver_license_number' => 'SIM-' . Str::upper(Str::random(8)), 'note' => $note, 'subtotal' => $subtotal, 'discount_amount' => $discountAmount, 'additional_cost' => 0, 'total_amount' => $totalAmount, 'booking_status' => $status, 'payment_status' => $paymentStatus, ]; } }