UniformFlow/app/Http/Controllers/DashboardController.php

60 lines
3.8 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Employee;
use App\Models\Handover;
use App\Models\HandoverItem;
use App\Models\StockMovement;
use App\Models\StockVariant;
use App\Models\UniformIssue;
use App\Models\UniformItem;
use Illuminate\Support\Facades\DB;
class DashboardController extends Controller
{
public function __invoke()
{
$monthStart = now()->startOfMonth()->toDateString();
$monthEnd = now()->endOfMonth()->toDateString();
$variants = StockVariant::count();
$healthyVariants = StockVariant::whereColumn('quantity', '>', 'reorder_level')->count();
return view('dashboard', [
'activeEmployees' => Employee::where('status', 'active')->count(),
'uniformTypes' => UniformItem::count(),
'unitsInStock' => StockVariant::sum('quantity'),
'unitsIssued' => UniformIssue::where('status', 'issued')->get()->sum(fn ($issue) => $issue->outstanding_quantity),
'issuedThisMonth' => UniformIssue::whereBetween('issued_at', [$monthStart, $monthEnd])->sum('quantity'),
'handoversThisMonth' => Handover::whereBetween('handover_date', [$monthStart, $monthEnd])->count(),
'employeesWithIssues' => UniformIssue::where('status', 'issued')->distinct()->count('employee_id'),
'stockHealth' => $variants ? (int) round(($healthyVariants / $variants) * 100) : 100,
'stockDistribution' => UniformItem::query()
->join('stock_variants', 'stock_variants.uniform_item_id', '=', 'uniform_items.id')
->select('uniform_items.name', DB::raw('SUM(stock_variants.quantity) as total'), DB::raw('SUM(stock_variants.new_quantity) as new_units'), DB::raw('SUM(stock_variants.returned_quantity) as returned_units'), DB::raw('SUM(stock_variants.quantity * stock_variants.unit_value) as stock_value'))
->groupBy('uniform_items.id', 'uniform_items.name')->orderByDesc('total')->get(),
'lowStock' => StockVariant::with('item')->whereColumn('quantity', '<=', 'reorder_level')->orderBy('quantity')->get(),
'outOfStock' => StockVariant::with('item')->where('quantity', 0)->orderBy('size')->get(),
'replacementDue' => UniformIssue::with(['employee', 'variant.item'])
->where('status', 'issued')
->whereDate('issued_at', '<=', now()->subYear()->toDateString())
->oldest('issued_at')->take(6)->get(),
'departmentAllocation' => UniformIssue::query()
->join('employees', 'employees.id', '=', 'uniform_issues.employee_id')
->where('uniform_issues.status', 'issued')
->select('employees.department', DB::raw('SUM(uniform_issues.quantity - uniform_issues.returned_quantity) as units'))
->groupBy('employees.department')->orderByDesc('units')->take(6)->get(),
'popularUniforms' => UniformIssue::query()
->join('stock_variants', 'stock_variants.id', '=', 'uniform_issues.stock_variant_id')
->join('uniform_items', 'uniform_items.id', '=', 'stock_variants.uniform_item_id')
->select('uniform_items.name', DB::raw('SUM(uniform_issues.quantity) as units'))
->groupBy('uniform_items.id', 'uniform_items.name')->orderByDesc('units')->take(5)->get(),
'handoverOutcomes' => HandoverItem::join('handovers', 'handovers.id', '=', 'handover_items.handover_id')
->whereBetween('handovers.handover_date', [$monthStart, $monthEnd])
->select('handover_items.condition', DB::raw('SUM(handover_items.quantity) as units'))
->groupBy('condition')->pluck('units', 'condition'),
'recentMovements' => StockMovement::with(['variant.item'])->latest()->take(8)->get(),
]);
}
}