carrentalservice/app/Http/Controllers/RentalController.php
2026-02-19 22:05:20 +00:00

122 lines
3.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Car;
use App\Models\Customer;
use App\Models\Rental;
use App\Models\Payment;
use Illuminate\Http\Request;
use Carbon\Carbon;
class RentalController extends Controller
{
public function index()
{
$rentals = Rental::with(['car', 'customer'])->get();
return view('rentals.index', compact('rentals'));
}
public function create()
{
$cars = Car::where('status', 'available')->get();
$customers = Customer::where('status', 'active')->get();
return view('rentals.create', compact('cars', 'customers'));
}
public function store(Request $request)
{
$request->validate([
'car_id' => 'required',
'customer_id' => 'required',
'rental_type' => 'required',
'start_date' => 'required|date',
'pickup_time' => 'nullable',
'end_date' => 'required|date|after:start_date',
'return_time' => 'nullable',
'total_amount' => 'required|numeric',
'advance_payment' => 'nullable|numeric'
]);
$rental = Rental::create($request->all());
// Update car status
Car::find($request->car_id)->update(['status' => 'rented']);
// Create payment if advance is paid
if ($request->advance_payment > 0) {
Payment::create([
'rental_id' => $rental->id,
'amount' => $request->advance_payment,
'method' => 'cash',
'status' => 'completed'
]);
}
return redirect()->route('rentals.index')->with('success', 'Rental created successfully!');
}
public function show(Rental $rental)
{
$rental->load(['car', 'customer', 'payments']);
return view('rentals.show', compact('rental'));
}
public function edit(Rental $rental)
{
$cars = Car::all();
$customers = Customer::all();
return view('rentals.edit', compact('rental', 'cars', 'customers'));
}
public function update(Request $request, Rental $rental)
{
$request->validate([
'car_id' => 'required',
'customer_id' => 'required',
'rental_type' => 'required',
'start_date' => 'required|date',
'end_date' => 'required|date|after:start_date',
'total_amount' => 'required|numeric'
]);
$rental->update($request->all());
return redirect()->route('rentals.index')->with('success', 'Rental updated successfully!');
}
public function destroy(Rental $rental)
{
// Reset car status
Car::find($rental->car_id)->update(['status' => 'available']);
$rental->delete();
return redirect()->route('rentals.index')->with('success', 'Rental deleted successfully!');
}
public function updateStatus(Request $request, Rental $rental, $status)
{
$rental->update(['status' => $status]);
if ($status == 'completed' || $status == 'cancelled') {
Car::find($rental->car_id)->update(['status' => 'available']);
} elseif ($status == 'active') {
Car::find($rental->car_id)->update(['status' => 'rented']);
}
return redirect()->back()->with('success', 'Status updated!');
}
public function contract(Rental $rental)
{
$rental->load(['car', 'customer']);
return view('contracts.rental', compact('rental'));
}
public function downloadContract(Rental $rental)
{
$rental->load(['car', 'customer']);
$pdf = \PDF::loadView('contracts.rental', compact('rental'));
return $pdf->download('contract-' . str_pad($rental->id, 6, '0', STR_PAD_LEFT) . '.pdf');
}
}