vernova/PettyCashController.php
2026-07-26 19:58:27 +03:30

221 lines
6.9 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\PettyCash;
use App\Models\Project;
use App\Models\Currency;
use App\Helpers\CurrencyHelper;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class PettyCashController extends Controller
{
/**
* Display a listing of petty cash requests.
*/
public function index(Request $request)
{
$query = PettyCash::with(['project', 'currency', 'requestedBy', 'approvedBy']);
if ($request->filled('project_id')) {
$query->where('project_id', $request->project_id);
}
if ($request->filled('status')) {
$query->byStatus($request->status);
}
$query->orderBy('request_date', 'desc');
$pettyCashes = $query->paginate(20)->appends($request->query());
$projects = Project::whereIn('status', ['planning', 'active'])->get();
$statuses = ['pending', 'approved', 'rejected', 'settled'];
return view('petty-cashes.index', compact('pettyCashes', 'projects', 'statuses'));
}
/**
* Show the form for creating a new petty cash request.
*/
public function create()
{
$projects = Project::whereIn('status', ['planning', 'active'])->get();
$currencies = Currency::where('is_active', true)->get();
$baseCurrency = CurrencyHelper::getBaseCurrency();
return view('petty-cashes.form', compact('projects', 'currencies', 'baseCurrency'));
}
/**
* Store a newly created petty cash request.
*/
public function store(Request $request)
{
$validated = $request->validate([
'project_id' => 'required|exists:projects,id',
'title' => 'required|string|max:255',
'description' => 'nullable|string',
'amount' => 'required|numeric|min:0',
'currency_id' => 'required|exists:currencies,id',
'request_date' => 'required|date',
'receipt' => 'nullable|file|mimes:jpg,jpeg,png,pdf,doc,docx|max:10240',
]);
$validated['tenant_id'] = session('tenant_id');
$validated['requested_by'] = Auth::id();
$validated['status'] = 'pending';
// Handle currency conversion
$baseCurrency = CurrencyHelper::getBaseCurrency();
$selectedCurrency = Currency::find($validated['currency_id']);
if ($selectedCurrency && $baseCurrency && $selectedCurrency->id !== $baseCurrency->id) {
$validated['original_amount'] = $validated['amount'];
$validated['amount'] = CurrencyHelper::convert(
(float) $validated['amount'],
$selectedCurrency->code,
$baseCurrency->code
);
}
// Handle receipt upload
if ($request->hasFile('receipt')) {
$validated['receipt_path'] = $request->file('receipt')->store('receipts/petty-cash', 'public');
}
$pettyCash = PettyCash::create($validated);
return redirect()
->route('petty-cashes.show', $pettyCash)
->with('success', __('expense.created_successfully'));
}
/**
* Display the specified petty cash request.
*/
public function show(PettyCash $pettyCash)
{
$pettyCash->load(['project', 'currency', 'requestedBy', 'approvedBy', 'expenses']);
return view('petty-cashes.show', compact('pettyCash'));
}
/**
* Show the form for editing the specified petty cash request.
*/
public function edit(PettyCash $pettyCash)
{
$projects = Project::whereIn('status', ['planning', 'active'])->get();
$currencies = Currency::where('is_active', true)->get();
$baseCurrency = CurrencyHelper::getBaseCurrency();
return view('petty-cashes.form', compact('pettyCash', 'projects', 'currencies', 'baseCurrency'));
}
/**
* Update the specified petty cash request.
*/
public function update(Request $request, PettyCash $pettyCash)
{
$validated = $request->validate([
'project_id' => 'required|exists:projects,id',
'title' => 'required|string|max:255',
'description' => 'nullable|string',
'amount' => 'required|numeric|min:0',
'currency_id' => 'required|exists:currencies,id',
'request_date' => 'required|date',
'receipt' => 'nullable|file|mimes:jpg,jpeg,png,pdf,doc,docx|max:10240',
]);
// Handle currency conversion
$baseCurrency = CurrencyHelper::getBaseCurrency();
$selectedCurrency = Currency::find($validated['currency_id']);
if ($selectedCurrency && $baseCurrency && $selectedCurrency->id !== $baseCurrency->id) {
$validated['original_amount'] = $validated['amount'];
$validated['amount'] = CurrencyHelper::convert(
(float) $validated['amount'],
$selectedCurrency->code,
$baseCurrency->code
);
}
// Handle receipt upload
if ($request->hasFile('receipt')) {
// Delete old receipt if exists
if ($pettyCash->receipt_path) {
\Illuminate\Support\Facades\Storage::disk('public')->delete($pettyCash->receipt_path);
}
$validated['receipt_path'] = $request->file('receipt')->store('receipts/petty-cash', 'public');
}
$pettyCash->update($validated);
return redirect()
->route('petty-cashes.show', $pettyCash)
->with('success', __('expense.updated_successfully'));
}
/**
* Remove the specified petty cash request.
*/
public function destroy(PettyCash $pettyCash)
{
$pettyCash->delete();
return redirect()
->route('petty-cashes.index')
->with('success', __('expense.deleted_successfully'));
}
/**
* Approve a petty cash request.
*/
public function approve(PettyCash $pettyCash)
{
$pettyCash->update([
'status' => 'approved',
'approved_by' => Auth::id(),
'approval_date' => now(),
]);
return response()->json([
'success' => true,
'message' => __('expense.approved_successfully'),
]);
}
/**
* Reject a petty cash request.
*/
public function reject(PettyCash $pettyCash)
{
$pettyCash->update([
'status' => 'rejected',
'approved_by' => Auth::id(),
'approval_date' => now(),
]);
return response()->json([
'success' => true,
'message' => __('expense.rejected_successfully'),
]);
}
/**
* Settle a petty cash request (mark as settled after usage).
*/
public function settle(PettyCash $pettyCash)
{
$pettyCash->update([
'status' => 'settled',
]);
return response()->json([
'success' => true,
'message' => __('expense.settled_successfully'),
]);
}
}