mirror of
https://github.com/adrigongv23/G26---Telemetry-Software.git
synced 2026-08-25 11:33:17 +02:00
134 lines
4.6 KiB
Python
134 lines
4.6 KiB
Python
from django.shortcuts import render, redirect, get_object_or_404
|
|
from django.contrib import messages
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.views.decorators.http import require_POST
|
|
from django.db.models import Sum
|
|
from datetime import date
|
|
|
|
from temporadas.models import Temporada
|
|
from documentos.models import Factura
|
|
from users.decorators import require_rol
|
|
from .models import Gasto, Ingreso
|
|
from .forms import GastoForm, IngresoForm
|
|
|
|
# Categorías válidas en Gasto (Documento usa 'normativa' en su lugar de 'general')
|
|
_CATEGORIAS_GASTO_VALIDAS = {c[0] for c in Gasto.CATEGORIAS_GASTOS}
|
|
|
|
|
|
@login_required
|
|
def inicio(request):
|
|
temporada_activa = Temporada.objects.filter(actual=True).first()
|
|
return render(request, 'index.html', {'temporada_actual': temporada_activa})
|
|
|
|
|
|
@require_rol('directiva')
|
|
def contabilidad(request):
|
|
temporada_actual = Temporada.objects.filter(actual=True).first()
|
|
|
|
gastos = []
|
|
ingresos = []
|
|
facturas_pendientes = []
|
|
total_gastos = 0
|
|
total_ingresos = 0
|
|
presupuesto_inicial = 0
|
|
presupuesto_actual = 0
|
|
|
|
if temporada_actual:
|
|
gastos = Gasto.objects.filter(temporada=temporada_actual)
|
|
ingresos = Ingreso.objects.filter(temporada=temporada_actual)
|
|
facturas_pendientes = Factura.objects.filter(
|
|
temporada=temporada_actual, estado='pendiente'
|
|
)
|
|
|
|
total_gastos = gastos.aggregate(total=Sum('importe'))['total'] or 0
|
|
total_ingresos = ingresos.aggregate(total=Sum('importe'))['total'] or 0
|
|
presupuesto_inicial = temporada_actual.presupuesto
|
|
presupuesto_actual = presupuesto_inicial - total_gastos + total_ingresos
|
|
|
|
return render(request, 'contabilidad.html', {
|
|
'temporada_actual': temporada_actual,
|
|
'gastos': gastos,
|
|
'ingresos': ingresos,
|
|
'facturas_pendientes': facturas_pendientes,
|
|
'total_gastos': total_gastos,
|
|
'total_ingresos': total_ingresos,
|
|
'presupuesto_inicial': presupuesto_inicial,
|
|
'presupuesto_actual': presupuesto_actual,
|
|
'gasto_form': GastoForm(),
|
|
'ingreso_form': IngresoForm(),
|
|
})
|
|
|
|
|
|
@require_rol('directiva')
|
|
@require_POST
|
|
def anadir_gasto(request):
|
|
temporada_actual = Temporada.objects.filter(actual=True).first()
|
|
if not temporada_actual:
|
|
messages.error(request, 'No hay temporada activa.')
|
|
return redirect('contabilidad')
|
|
|
|
form = GastoForm(request.POST)
|
|
if form.is_valid():
|
|
gasto = form.save(commit=False)
|
|
gasto.fecha = date.today()
|
|
gasto.temporada = temporada_actual
|
|
gasto.save()
|
|
messages.success(request, 'Gasto añadido correctamente.')
|
|
else:
|
|
messages.error(request, 'Error al añadir el gasto. Revisa los datos.')
|
|
return redirect('contabilidad')
|
|
|
|
|
|
@require_rol('directiva')
|
|
@require_POST
|
|
def anadir_ingreso(request):
|
|
temporada_actual = Temporada.objects.filter(actual=True).first()
|
|
if not temporada_actual:
|
|
messages.error(request, 'No hay temporada activa.')
|
|
return redirect('contabilidad')
|
|
|
|
form = IngresoForm(request.POST)
|
|
if form.is_valid():
|
|
ingreso = form.save(commit=False)
|
|
ingreso.fecha = date.today()
|
|
ingreso.temporada = temporada_actual
|
|
ingreso.save()
|
|
messages.success(request, 'Ingreso añadido correctamente.')
|
|
else:
|
|
messages.error(request, 'Error al añadir el ingreso. Revisa los datos.')
|
|
return redirect('contabilidad')
|
|
|
|
|
|
@require_rol('directiva')
|
|
@require_POST
|
|
def aceptar_factura(request, pk):
|
|
factura = get_object_or_404(Factura, pk=pk)
|
|
temporada_actual = Temporada.objects.filter(actual=True).first()
|
|
if not temporada_actual:
|
|
messages.error(request, 'No hay temporada activa.')
|
|
return redirect('contabilidad')
|
|
|
|
categoria = factura.categoria if factura.categoria in _CATEGORIAS_GASTO_VALIDAS else 'general'
|
|
Gasto.objects.create(
|
|
concepto=factura.nombre,
|
|
importe=factura.importe,
|
|
fecha=date.today(),
|
|
categoria=categoria,
|
|
temporada=temporada_actual,
|
|
observaciones=f'Factura de {factura.empresa}',
|
|
doc_justificativo=factura.archivo,
|
|
)
|
|
factura.estado = 'aceptada'
|
|
factura.save()
|
|
messages.success(request, f'Factura de {factura.empresa} aceptada y registrada como gasto.')
|
|
return redirect('contabilidad')
|
|
|
|
|
|
@require_rol('directiva')
|
|
@require_POST
|
|
def rechazar_factura(request, pk):
|
|
factura = get_object_or_404(Factura, pk=pk)
|
|
factura.estado = 'rechazada'
|
|
factura.save()
|
|
messages.success(request, f'Factura de {factura.empresa} rechazada.')
|
|
return redirect('contabilidad')
|