152 lines
4.2 KiB
PHP
Executable File
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.');
|
|
}
|
|
} |