vernova/app/Http/Controllers/ReportController.php
2026-07-26 19:58:27 +03:30

202 lines
5.8 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Expense;
use App\Models\Employee;
use App\Models\EmployeeFinancial;
use App\Models\Project;
use App\Models\Item;
use App\Models\InventoryTransaction;
use App\Models\WorkLog;
use Illuminate\Http\Request;
class ReportController extends Controller
{
/**
* Display reports index.
*/
public function index()
{
return view('reports.index');
}
/**
* Display financial report.
*/
public function financial(Request $request)
{
$query = Expense::with(['project', 'currency']);
if ($request->filled('project_id')) {
$query->where('project_id', $request->project_id);
}
if ($request->filled('from_date')) {
$query->where('expense_date', '>=', $request->from_date);
}
if ($request->filled('to_date')) {
$query->where('expense_date', '<=', $request->to_date);
}
$expenses = $query->orderBy('expense_date', 'desc')->get();
$totalAmount = $expenses->sum('amount');
$approvedAmount = $expenses->where('status', 'approved')->sum('amount');
$pendingAmount = $expenses->where('status', 'pending')->sum('amount');
$byProject = $expenses->groupBy('project_id')->map(function ($group) {
return [
'project' => $group->first()?->project?->name ?? '-',
'total' => $group->sum('amount'),
'count' => $group->count(),
];
});
$byCategory = $expenses->groupBy('category')->map(function ($group) {
return [
'category' => $group->first()->category ?? '-',
'total' => $group->sum('amount'),
'count' => $group->count(),
];
});
$projects = Project::all();
return view('reports.financial', compact('expenses', 'totalAmount', 'approvedAmount', 'pendingAmount', 'byProject', 'byCategory', 'projects'));
}
/**
* Export financial report to Excel.
*/
public function financialExportExcel(Request $request)
{
// Stub - will implement with Excel export library
return back()->with('info', __('reports.export_coming_soon'));
}
/**
* Export financial report to PDF.
*/
public function financialExportPdf(Request $request)
{
// Stub - will implement with PDF library
return back()->with('info', __('reports.export_coming_soon'));
}
/**
* Display employee work-log report.
*/
public function employeeWorklog(Request $request)
{
$query = WorkLog::with(['employee', 'project', 'task']);
if ($request->filled('employee_id')) {
$query->where('employee_id', $request->employee_id);
}
if ($request->filled('project_id')) {
$query->where('project_id', $request->project_id);
}
if ($request->filled('from_date')) {
$query->where('date', '>=', $request->from_date);
}
if ($request->filled('to_date')) {
$query->where('date', '<=', $request->to_date);
}
$workLogs = $query->orderBy('date', 'desc')->paginate(30)->appends($request->query());
$employees = Employee::where('status', 'active')->get();
$projects = Project::all();
return view('reports.employee-worklog', compact('workLogs', 'employees', 'projects'));
}
/**
* Export employee work-log report to Excel.
*/
public function employeeWorklogExportExcel(Request $request)
{
return back()->with('info', __('reports.export_coming_soon'));
}
/**
* Display inventory report.
*/
public function inventory(Request $request)
{
$query = InventoryTransaction::with(['item', 'warehouse', 'project']);
if ($request->filled('warehouse_id')) {
$query->where('warehouse_id', $request->warehouse_id);
}
if ($request->filled('type')) {
$query->where('type', $request->type);
}
if ($request->filled('from_date')) {
$query->where('created_at', '>=', $request->from_date);
}
if ($request->filled('to_date')) {
$query->where('created_at', '<=', $request->to_date);
}
$transactions = $query->orderBy('created_at', 'desc')->paginate(30)->appends($request->query());
$items = Item::orderBy('name')->get();
$warehouses = \App\Models\Warehouse::orderBy('name')->get();
return view('reports.inventory', compact('transactions', 'items', 'warehouses'));
}
/**
* Export inventory report to Excel.
*/
public function inventoryExportExcel(Request $request)
{
return back()->with('info', __('reports.export_coming_soon'));
}
/**
* Display payroll report.
*/
public function payroll(Request $request)
{
$query = EmployeeFinancial::with(['employee', 'currency']);
if ($request->filled('month')) {
$query->where('month', $request->month);
}
if ($request->filled('year')) {
$query->where('year', $request->year);
}
if ($request->filled('type')) {
$query->byType($request->type);
}
$financials = $query->orderBy('effective_date', 'desc')->paginate(30)->appends($request->query());
$employees = Employee::where('status', 'active')->get();
$months = range(1, 12);
$currentYear = now()->year;
$years = range($currentYear - 2, $currentYear + 1);
return view('reports.payroll', compact('financials', 'employees', 'months', 'years'));
}
/**
* Export payroll report to Excel.
*/
public function payrollExportExcel(Request $request)
{
return back()->with('info', __('reports.export_coming_soon'));
}
}