202 lines
5.8 KiB
PHP
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'));
|
|
}
|
|
}
|