mirror of
https://github.com/adrigongv23/G26---Telemetry-Software.git
synced 2026-08-25 11:33:17 +02:00
Sección de contabilida añadida
This commit is contained in:
parent
408d4d006e
commit
a15f836e07
7 changed files with 430 additions and 9 deletions
24
Plataform_Web/gestion/forms.py
Normal file
24
Plataform_Web/gestion/forms.py
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
from django import forms
|
||||
from .models import Gasto, Ingreso
|
||||
|
||||
|
||||
class GastoForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Gasto
|
||||
fields = ['concepto', 'importe', 'categoria', 'observaciones']
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
for field in self.fields.values():
|
||||
field.widget.attrs['class'] = 'form-control'
|
||||
|
||||
|
||||
class IngresoForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Ingreso
|
||||
fields = ['concepto', 'importe', 'categoria', 'observaciones']
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
for field in self.fields.values():
|
||||
field.widget.attrs['class'] = 'form-control'
|
||||
|
|
@ -1,14 +1,134 @@
|
|||
from django.shortcuts import render
|
||||
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):
|
||||
# Buscamos la temporada que configuraste como actual
|
||||
temporada_activa = Temporada.objects.filter(actual=True).first()
|
||||
|
||||
context = {
|
||||
'temporada_actual': temporada_activa
|
||||
}
|
||||
# Renderiza index.html, el cual hereda automáticamente de base.html
|
||||
return render(request, 'index.html', context)
|
||||
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')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue