status === 'cancelled') { return response()->json(['error' => 'Cannot generate invoice for cancelled booking'], 400); } $totalAmount = 0; $currentDate = new \DateTime($booking->check_in); $endDate = new \DateTime($booking->check_out); while ($currentDate < $endDate) { $date = $currentDate->format('Y-m-d'); $availability = RoomAvailability::where('room_type_id', $booking->room_type_id) ->where('date', $date) ->first(); $price = $availability && $availability->price_override !== null ? $availability->price_override : $booking->roomType->base_price; $totalAmount += $price; $currentDate->modify('+1 day'); } DB::beginTransaction(); try { $invoice = Invoice::create([ 'booking_id' => $booking->id, 'total_amount' => $totalAmount, 'status' => 'pending', ]); $pdfPath = $this->generatePdf($invoice); if ($pdfPath) { $invoice->update(['pdf_path' => $pdfPath]); } DB::commit(); return response()->json($invoice, 201); } catch (\Exception $e) { DB::rollback(); throw $e; } } private function generatePdf($invoice) { $pdf = \PDF::loadView('invoices.show', compact('invoice')); $fileName = "invoice_{$invoice->id}.pdf"; $path = "invoices/{$fileName}"; Storage::put($path, $pdf->output()); return $path; } }