MIF_E31222882/app/Http/Controllers/admin/RevenueController.php

261 lines
10 KiB
PHP

<?php
namespace App\Http\Controllers\admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Booking;
use App\Models\Table;
use App\Models\Venue;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
class RevenueController extends Controller
{
public function index(Request $request)
{
// Default filter periode (bulan ini)
$startDate = $request->input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d'));
$endDate = $request->input('end_date', Carbon::now()->format('Y-m-d'));
// Get current admin's venue ID
$user = Auth::user();
$adminVenueId = $user->venue_id; // Asumsi: Admin memiliki venue_id yang menunjukkan venue yang mereka kelola
// Jika admin adalah super admin (bisa melihat semua venue)
$isSuperAdmin = $user->hasRole('superadmin') || $adminVenueId === null; // Asumsi: Super admin tidak memiliki venue_id spesifik atau memiliki role khusus
// Query untuk mengambil data venue untuk filter (hanya venue yang dikelola oleh admin atau semua venue untuk super admin)
if ($isSuperAdmin) {
$venues = Venue::all();
$venueId = $request->input('venue_id');
} else {
$venues = Venue::where('id', $adminVenueId)->get();
$venueId = $adminVenueId; // Force venue id ke venue yang dikelola admin
}
// Base query untuk pendapatan
$revenueQuery = Booking::with('table.venue')
->where('bookings.status', 'paid')
->whereBetween(DB::raw('DATE(bookings.start_time)'), [$startDate, $endDate]);
// Filter berdasarkan venue yang dikelola admin atau yang dipilih oleh super admin
if (!$isSuperAdmin) {
// Admin venue biasa hanya bisa melihat venuenya sendiri
$revenueQuery->whereHas('table', function($query) use ($adminVenueId) {
$query->where('venue_id', $adminVenueId);
});
} elseif ($venueId) {
// Super admin bisa memilih venue tertentu
$revenueQuery->whereHas('table', function($query) use ($venueId) {
$query->where('venue_id', $venueId);
});
}
// Get summary total pendapatan
$totalRevenue = $revenueQuery->sum('total_amount');
// Get total bookings
$totalBookings = $revenueQuery->count();
// Get revenue per venue - dengan filter sesuai akses admin
$revenuePerVenueQuery = Booking::with('table.venue')
->where('bookings.status', 'paid')
->whereBetween(DB::raw('DATE(bookings.start_time)'), [$startDate, $endDate]);
if (!$isSuperAdmin) {
$revenuePerVenueQuery->whereHas('table', function($query) use ($adminVenueId) {
$query->where('venue_id', $adminVenueId);
});
}
$revenuePerVenue = $revenuePerVenueQuery
->select(
'tables.venue_id',
DB::raw('venues.name as venue_name'),
DB::raw('COUNT(*) as total_bookings'),
DB::raw('SUM(bookings.total_amount) as total_revenue')
)
->join('tables', 'bookings.table_id', '=', 'tables.id')
->join('venues', 'tables.venue_id', '=', 'venues.id')
->groupBy('tables.venue_id', 'venues.name')
->get();
// Get revenue per table (Untuk admin biasa, selalu tampilkan detail meja venuenya)
// Untuk super admin, detail meja hanya muncul jika venue tertentu dipilih
$revenuePerTable = null;
if (!$isSuperAdmin || $venueId) {
$venueIdForTable = $isSuperAdmin ? $venueId : $adminVenueId;
$revenuePerTable = Booking::with('table')
->where('bookings.status', 'paid')
->whereBetween(DB::raw('DATE(bookings.start_time)'), [$startDate, $endDate])
->whereHas('table', function($query) use ($venueIdForTable) {
$query->where('venue_id', $venueIdForTable);
})
->select(
'table_id',
DB::raw('tables.name as table_name'),
DB::raw('COUNT(*) as booking_count'),
DB::raw('SUM(bookings.total_amount) as table_revenue')
)
->join('tables', 'bookings.table_id', '=', 'tables.id')
->groupBy('table_id', 'tables.name')
->get();
}
// Get data untuk chart pendapatan harian dalam periode
$dailyRevenueQuery = Booking::with('table.venue')
->where('bookings.status', 'paid')
->whereBetween(DB::raw('DATE(bookings.start_time)'), [$startDate, $endDate]);
if (!$isSuperAdmin) {
$dailyRevenueQuery->whereHas('table', function($query) use ($adminVenueId) {
$query->where('venue_id', $adminVenueId);
});
} elseif ($venueId) {
$dailyRevenueQuery->whereHas('table', function($query) use ($venueId) {
$query->where('venue_id', $venueId);
});
}
$dailyRevenue = $dailyRevenueQuery
->select(
DB::raw('DATE(bookings.start_time) as date'),
DB::raw('SUM(bookings.total_amount) as revenue')
)
->groupBy(DB::raw('DATE(bookings.start_time)'))
->orderBy('date', 'asc')
->get();
return view('admin.revenues.index', compact(
'venues',
'venueId',
'totalRevenue',
'totalBookings',
'revenuePerVenue',
'revenuePerTable',
'dailyRevenue',
'startDate',
'endDate',
'isSuperAdmin'
));
}
public function detail(Request $request, $tableId)
{
// Default filter periode (bulan ini)
$startDate = $request->input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d'));
$endDate = $request->input('end_date', Carbon::now()->format('Y-m-d'));
// Get table detail
$table = Table::with('venue')->findOrFail($tableId);
// Cek apakah admin memiliki akses ke meja ini
$user = Auth::user();
$adminVenueId = $user->venue_id;
$isSuperAdmin = $user->hasRole('superadmin') || $adminVenueId === null;
// Jika bukan super admin dan meja bukan dari venue yang dikelola, tolak akses
if (!$isSuperAdmin && $table->venue_id != $adminVenueId) {
abort(403, 'Tidak memiliki akses ke meja ini');
}
// Query untuk detail booking meja tersebut
$bookings = Booking::where('table_id', $tableId)
->where('bookings.status', 'paid')
->whereBetween(DB::raw('DATE(bookings.start_time)'), [$startDate, $endDate])
->with('user')
->orderBy('start_time', 'desc')
->get();
// Hitung total pendapatan untuk meja ini di periode
$totalRevenue = $bookings->sum('total_amount');
// Hitung total jam penggunaan
$totalHours = $bookings->sum(function($booking) {
$start = Carbon::parse($booking->start_time);
$end = Carbon::parse($booking->end_time);
return $end->diffInHours($start);
});
return view('admin.revenues.detail', compact(
'table',
'bookings',
'totalRevenue',
'totalHours',
'startDate',
'endDate'
));
}
public function export(Request $request)
{
// Get current admin's venue ID
$user = Auth::user();
$adminVenueId = $user->venue_id;
$isSuperAdmin = $user->hasRole('superadmin') || $adminVenueId === null;
$startDate = $request->input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d'));
$endDate = $request->input('end_date', Carbon::now()->format('Y-m-d'));
$venueId = $isSuperAdmin ? $request->input('venue_id') : $adminVenueId;
// Base query untuk pendapatan
$bookingsQuery = Booking::with(['table.venue', 'user'])
->where('bookings.status', 'paid')
->whereBetween(DB::raw('DATE(bookings.start_time)'), [$startDate, $endDate]);
// Filter berdasarkan venue sesuai hak akses admin
if (!$isSuperAdmin) {
$bookingsQuery->whereHas('table', function($query) use ($adminVenueId) {
$query->where('venue_id', $adminVenueId);
});
} elseif ($venueId) {
$bookingsQuery->whereHas('table', function($query) use ($venueId) {
$query->where('venue_id', $venueId);
});
}
$bookings = $bookingsQuery->get();
// Export logic using Laravel Excel or simple CSV download
// For now we'll return a simple array that could be converted to CSV/Excel
$exportData = [];
foreach ($bookings as $booking) {
$exportData[] = [
'id' => $booking->id,
'user' => $booking->user->name,
'venue' => $booking->table->venue->name,
'table' => $booking->table->name,
'start_time' => $booking->start_time->format('Y-m-d H:i'),
'end_time' => $booking->end_time->format('Y-m-d H:i'),
'duration_hours' => $booking->end_time->diffInHours($booking->start_time),
'payment_method' => $booking->payment_method,
'total_amount' => $booking->total_amount,
];
}
// Return CSV response (simplified example)
$headers = [
'Content-Type' => 'text/csv',
'Content-Disposition' => 'attachment; filename="venue-revenue-report.csv"',
];
// Convert array to CSV string
$callback = function() use ($exportData) {
$file = fopen('php://output', 'w');
// Header row
fputcsv($file, array_keys($exportData[0] ?? []));
// Data rows
foreach ($exportData as $row) {
fputcsv($file, $row);
}
fclose($file);
};
return response()->stream($callback, 200, $headers);
}
}