File: /home/xedaptot/rms.naniguide.com/app/Http/Controllers/BookingDataController.php
<?php
namespace App\Http\Controllers;
use App\Models\Hotel;
use App\Models\Reservation;
use App\Models\RoomType;
use Illuminate\Http\Request;
class BookingDataController extends Controller
{
public function index(Request $request)
{
$hotel = $this->hotel($request);
$roomTypes = RoomType::where('hotel_id', $hotel->id)->get();
$reservations = Reservation::with('roomType')->where('hotel_id', $hotel->id)->latest('stay_date')->paginate(15);
return view('rms.booking-data', compact('hotel', 'roomTypes', 'reservations'));
}
public function store(Request $request)
{
$hotel = $this->hotel($request);
$data = $request->validate([
'stay_date' => ['required', 'date'],
'room_type_id' => ['required', 'exists:room_types,id'],
'rooms_sold' => ['required', 'integer', 'min:0'],
'room_revenue' => ['required', 'numeric', 'min:0'],
'total_revenue' => ['nullable', 'numeric', 'min:0'],
'market_segment' => ['required'],
'booked_at' => ['nullable', 'date'],
]);
$data['hotel_id'] = $hotel->id;
$data['total_revenue'] = $data['total_revenue'] ?? $data['room_revenue'];
Reservation::create($data);
return back()->with('status', 'Đã nhập booking data.');
}
public function upload(Request $request)
{
$request->validate(['file' => ['required', 'file']]);
$hotel = $this->hotel($request);
$path = $request->file('file')->getRealPath();
$rows = array_map('str_getcsv', file($path));
$header = array_map(fn ($value) => strtolower(trim($value)), array_shift($rows));
$created = 0;
foreach ($rows as $row) {
$data = array_combine($header, array_pad($row, count($header), null));
$roomType = RoomType::where('hotel_id', $hotel->id)->where(function ($query) use ($data) {
$query->where('code', $data['room_type'] ?? '')->orWhere('name', $data['room_type'] ?? '');
})->first();
if (! $roomType || empty($data['date'])) {
continue;
}
Reservation::create([
'hotel_id' => $hotel->id,
'room_type_id' => $roomType->id,
'stay_date' => $data['date'],
'rooms_sold' => (int) ($data['rooms_sold'] ?? 0),
'room_revenue' => (float) ($data['revenue'] ?? 0),
'total_revenue' => (float) ($data['total_revenue'] ?? $data['revenue'] ?? 0),
'market_segment' => $data['market_segment'] ?? 'Transient',
'booked_at' => $data['booked_at'] ?? now()->toDateString(),
]);
$created++;
}
return back()->with('status', "Đã import {$created} dòng.");
}
private function hotel(Request $request): Hotel
{
return $request->user()->hotel_id ? Hotel::findOrFail($request->user()->hotel_id) : Hotel::firstOrFail();
}
}