Initial commit: Sistema de comisiones y gastos personales

This commit is contained in:
2026-04-19 09:59:57 -06:00
commit dc964d6bce
103 changed files with 15859 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
@extends('layouts.app')
@section('title', 'Nuevo Gasto')
@section('content')
<div class="row">
<div class="col-12">
<h2 class="mb-4">Nuevo Gasto</h2>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="card">
<div class="card-body">
<form method="POST" action="{{ route('expenses.store') }}">
@csrf
<input type="hidden" name="month_id" value="{{ $month->id }}">
<div class="mb-3">
<label for="description" class="form-label">Descripción</label>
<input type="text" class="form-control" id="description" name="description"
value="{{ old('description') }}" required>
</div>
<div class="mb-3">
<label for="amount" class="form-label">Monto</label>
<div class="input-group">
<span class="input-group-text">$</span>
<input type="number" class="form-control" id="amount" name="amount"
value="{{ old('amount') }}" step="0.01" min="0.01" required>
</div>
</div>
<div class="mb-3">
<label for="date" class="form-label">Fecha</label>
<input type="date" class="form-control" id="date" name="date"
value="{{ old('date', now()->format('Y-m-d')) }}" required>
</div>
<div class="mb-3">
<label for="expense_type" class="form-label">Quincena</label>
<select class="form-select" id="expense_type" name="expense_type" required>
<option value="q1">1ra Quincena (1-15)</option>
<option value="q2">2da Quincena (16-31)</option>
<option value="mensual">Gasto Mensual (se divide en 2)</option>
</select>
<small class="text-muted">
Selecciona a qué quincena se restará el gasto.
Los gastos mensuales se dividen entre 2.
</small>
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-warning">Guardar Gasto</button>
<a href="{{ route('expenses.index', ['month_id' => $month->id]) }}" class="btn btn-secondary">Cancelar</a>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,59 @@
@extends('layouts.app')
@section('title', 'Editar Gasto')
@section('content')
<div class="row">
<div class="col-12">
<h2 class="mb-4">Editar Gasto</h2>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="card">
<div class="card-body">
<form method="POST" action="{{ route('expenses.update', $expense->id) }}">
@csrf
@method('PUT')
<div class="mb-3">
<label for="description" class="form-label">Descripción</label>
<input type="text" class="form-control" id="description" name="description"
value="{{ old('description', $expense->description) }}" required>
</div>
<div class="mb-3">
<label for="amount" class="form-label">Monto</label>
<div class="input-group">
<span class="input-group-text">$</span>
<input type="number" class="form-control" id="amount" name="amount"
value="{{ old('amount', $expense->amount) }}" step="0.01" min="0.01" required>
</div>
</div>
<div class="mb-3">
<label for="date" class="form-label">Fecha</label>
<input type="date" class="form-control" id="date" name="date"
value="{{ old('date', $expense->date->format('Y-m-d')) }}" required>
</div>
<div class="mb-3">
<label for="expense_type" class="form-label">Quincena</label>
<select class="form-select" id="expense_type" name="expense_type" required>
<option value="q1" {{ $expense->expense_type == 'q1' ? 'selected' : '' }}>1ra Quincena (1-15)</option>
<option value="q2" {{ $expense->expense_type == 'q2' ? 'selected' : '' }}>2da Quincena (16-31)</option>
<option value="mensual" {{ $expense->expense_type == 'mensual' ? 'selected' : '' }}>Gasto Mensual (se divide en 2)</option>
</select>
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-primary">Actualizar</button>
<a href="{{ route('expenses.index', ['month_id' => $expense->month_id]) }}" class="btn btn-secondary">Cancelar</a>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,99 @@
@extends('layouts.app')
@section('title', 'Gastos')
@section('content')
<div class="row">
<div class="col-12">
<h2 class="mb-4">Gestión de Gastos</h2>
</div>
</div>
<!-- Selector de mes -->
<div class="row mb-4">
<div class="col-md-6">
<form method="GET" class="d-flex gap-2">
<select name="month_id" class="form-select" onchange="this.form.submit()">
<option value="">Todos los meses</option>
@foreach($months as $m)
<option value="{{ $m->id }}" {{ $month && $month->id == $m->id ? 'selected' : '' }}>
{{ $m->name }} {{ $m->year }}
</option>
@endforeach
</select>
<a href="{{ route('expenses.create', ['month_id' => $month?->id]) }}" class="btn btn-warning">
<i class="bi bi-plus-circle"></i> Nuevo Gasto
</a>
</form>
</div>
</div>
@if($month)
<!-- Resumen -->
<div class="row mb-4">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<h6 class="text-muted">Total Gastos del Mes</h6>
<h3>${{ number_format($month->expenses()->sum('amount'), 2) }}</h3>
</div>
</div>
</div>
</div>
@endif
<!-- Lista de gastos -->
<div class="card">
<div class="card-body">
<table class="table table-hover">
<thead>
<tr>
<th>Fecha</th>
<th>Descripción</th>
<th>Monto</th>
<th>Quincena</th>
<th>Mes</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
@forelse($expenses as $expense)
<tr>
<td>{{ $expense->date->format('d/m/Y') }}</td>
<td>{{ $expense->description }}</td>
<td class="text-danger">-${{ number_format($expense->amount, 2) }}</td>
<td>
@if($expense->expense_type == 'q1')
<span class="badge bg-primary">Q1</span>
@elseif($expense->expense_type == 'q2')
<span class="badge bg-warning">Q2</span>
@else
<span class="badge bg-info">Mensual</span>
@endif
</td>
<td>{{ $expense->month->name }} {{ $expense->month->year }}</td>
<td>
<a href="{{ route('expenses.edit', $expense->id) }}" class="btn btn-sm btn-outline-primary">
<i class="bi bi-pencil"></i>
</a>
<form method="POST" action="{{ route('expenses.destroy', $expense->id) }}" class="d-inline">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-sm btn-outline-danger" onclick="return confirm('¿Eliminar este gasto?')">
<i class="bi bi-trash"></i>
</button>
</form>
</td>
</tr>
@empty
<tr>
<td colspan="6" class="text-center text-muted">No hay gastos registrados.</td>
</tr>
@endforelse
</tbody>
</table>
{{ $expenses->links() }}
</div>
</div>
@endsection