HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
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();
    }
}