Files
app3/app/Http/Controllers/InvoiceController.php
2026-01-07 22:18:43 +00:00

81 lines
2.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Booking;
use App\Models\Invoice;
use App\Models\RoomAvailability;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class InvoiceController extends Controller
{
public function generate(Request $request, $bookingId)
{
$booking = Booking::findOrFail($bookingId);
if ($booking->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;
}
}