/home2/mshostin/farms.ms-hostingladz.com/app/Http/Controllers/ReportController.php
<?php
namespace App\Http\Controllers;
use App\Models\MilkProduction;
use App\Models\MilkSale;
use App\Models\Vendor;
use Carbon\Carbon;
use Illuminate\Http\Request;
class ReportController extends Controller
{
/**
* Milk Production Report
*/
/**
* Milk Production Report
*/
public function milkProduction(Request $request)
{
$user = auth()->user();
// Defaults
$startDate = $request->input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d'));
$endDate = $request->input('end_date', Carbon::now()->endOfMonth()->format('Y-m-d'));
// Farm Filter Logic
$farms = [];
$farmId = null;
if ($user->isSuperAdmin()) {
$farms = \App\Models\Farm::all();
$farmId = $request->input('farm_id'); // Optional filter for SuperAdmin
} elseif ($user->isFarmAdmin() && $user->farm) {
$farmId = $user->farm->id; // Forced filter for FarmAdmin
}
// Base Query
$query = MilkProduction::query();
if ($farmId) {
$query->where('farm_id', $farmId);
}
$query->whereBetween('recorded_at', [$startDate, $endDate]);
// Summary Stats (Direct DB Aggregation)
// Clone query for stats so we don't affect main pagination query
$statsQuery = clone $query;
$totalProduction = $statsQuery->sum('litres');
// Efficient way to count distinct days
$statsQueryForDays = clone $query;
$daysCount = $statsQueryForDays->selectRaw('count(distinct date(recorded_at)) as days_count')->value('days_count');
$avgDailyProduction = $daysCount > 0 ? $totalProduction / $daysCount : 0;
// Pagination Data
// Order by recorded_at DESC
$productionData = $query->with(['animal', 'animal.farm'])
->orderBy('recorded_at', 'desc')
->paginate(20); // 50 items per page
return view('reports.production', compact('productionData', 'totalProduction', 'avgDailyProduction', 'startDate', 'endDate', 'farms', 'farmId'));
}
/**
* Milk Sales & Finance Report
*/
public function milkSales(Request $request)
{
$user = auth()->user();
// Defaults
$startDate = $request->input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d'));
$endDate = $request->input('end_date', Carbon::now()->endOfMonth()->format('Y-m-d'));
$vendorId = $request->input('vendor_id');
// Farm Filter Logic
$farms = [];
$filterFarmId = null;
if ($user->isSuperAdmin()) {
$farms = \App\Models\Farm::all();
$filterFarmId = $request->input('farm_id');
} elseif ($user->isFarmAdmin() && $user->farm) {
$filterFarmId = $user->farm->id;
}
// Base Query
$query = MilkSale::query();
if ($filterFarmId) {
$query->where('farm_id', $filterFarmId);
}
$query->whereBetween('sold_at', [$startDate.' 00:00:00', $endDate.' 23:59:59']);
if ($vendorId) {
$query->where('vendor_id', $vendorId);
}
// Summary Stats (Direct DB Aggregation)
$statsQuery = clone $query;
$totalSold = $statsQuery->sum('quantity');
$totalRevenue = $statsQuery->sum('total_amount');
$avgPrice = $totalSold > 0 ? $totalRevenue / $totalSold : 0;
// Pagination Data
$salesData = $query->with(['vendor', 'farm'])
->orderBy('sold_at', 'desc')
->paginate(20);
// Unique Vendors for Filter
// If Farm Admin, only show their vendors. If Super Admin, show vendors relevant to selection or all.
// Simplified: if SuperAdmin and filtered by farm, show that farm's vendors. Else all.
if ($user->isFarmAdmin() && $user->farm) {
$vendors = $user->farm->vendors;
} elseif ($filterFarmId) {
// If super admin selected a farm, try to get vendors for that farm
$selectedFarm = \App\Models\Farm::find($filterFarmId);
$vendors = $selectedFarm ? $selectedFarm->vendors : Vendor::all();
} else {
$vendors = Vendor::all();
}
return view('reports.sales', compact('salesData', 'totalSold', 'totalRevenue', 'avgPrice', 'vendors', 'startDate', 'endDate', 'vendorId', 'farms', 'filterFarmId'));
}
}