Files
nomina_ventas/app/Http/Controllers/ExpenseController.php

152 lines
4.2 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers;
use App\Models\Expense;
use App\Models\Month;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class ExpenseController extends Controller
{
/**
* Listar todos los gastos
*/
public function index(Request $request)
{
$user = Auth::user();
$monthId = $request->get('month_id');
if ($monthId) {
$month = $user->months()->findOrFail($monthId);
$expenses = $month->expenses()
->orderBy('date', 'desc')
->paginate(30);
} else {
$month = null;
$expenses = $user->expenses()
->orderBy('date', 'desc')
->paginate(30);
}
$months = $user->months()
->orderBy('year', 'desc')
->orderByRaw("FIELD(name, 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre') DESC")
->get();
return view('expenses.index', compact('expenses', 'month', 'months'));
}
/**
* Mostrar formulario para crear gasto
*/
public function create(Request $request)
{
$user = Auth::user();
$monthId = $request->get('month_id');
if ($monthId) {
$month = $user->months()->findOrFail($monthId);
} else {
$month = $user->getCurrentMonth();
if (!$month) {
$month = $user->months()->latest()->first();
}
}
if (!$month) {
return redirect()->route('months.index')->with('info', 'Necesitas un mes de trabajo primero.');
}
return view('expenses.create', compact('month'));
}
/**
* Guardar nuevo gasto
*/
public function store(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'month_id' => ['required', 'exists:months,id'],
'description' => ['required', 'string', 'max:255'],
'amount' => ['required', 'numeric', 'min:0.01'],
'date' => ['required', 'date'],
'expense_type' => ['required', 'in:q1,q2,mensual'],
]);
// Verificar que el mes pertenece al usuario
$month = $user->months()->findOrFail($validated['month_id']);
$month->expenses()->create([
'user_id' => $user->id,
'description' => $validated['description'],
'amount' => $validated['amount'],
'date' => $validated['date'],
'expense_type' => $validated['expense_type'],
]);
return redirect()->route('expenses.index', ['month_id' => $month->id])
->with('success', 'Gasto registrado correctamente.');
}
/**
* Mostrar formulario de edición
*/
public function edit(Expense $expense)
{
$user = Auth::user();
if ($expense->user_id !== $user->id) {
abort(403);
}
return view('expenses.edit', compact('expense'));
}
/**
* Actualizar gasto
*/
public function update(Request $request, Expense $expense)
{
$user = Auth::user();
if ($expense->user_id !== $user->id) {
abort(403);
}
$validated = $request->validate([
'description' => ['required', 'string', 'max:255'],
'amount' => ['required', 'numeric', 'min:0.01'],
'date' => ['required', 'date'],
'expense_type' => ['required', 'in:q1,q2,mensual'],
]);
$expense->update($validated);
return redirect()->route('expenses.index', ['month_id' => $expense->month_id])
->with('success', 'Gasto actualizado correctamente.');
}
/**
* Eliminar gasto
*/
public function destroy(Expense $expense)
{
$user = Auth::user();
if ($expense->user_id !== $user->id) {
abort(403);
}
$monthId = $expense->month_id;
$expense->delete();
return redirect()->route('expenses.index', ['month_id' => $monthId])
->with('success', 'Gasto eliminado correctamente.');
}
}