56 lines
3.2 KiB
PHP
56 lines
3.2 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,
|
|
'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(),
|
|
]);
|
|
}
|
|
}
|