221 lines
6.9 KiB
PHP
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'),
|
|
]);
|
|
}
|
|
}
|