From 642489142e3fea00595c3f4d4dc20a0c5600281e Mon Sep 17 00:00:00 2001 From: SekiDesu01 Date: Fri, 27 Mar 2026 17:01:05 -0300 Subject: [PATCH] Added new reports --- routes_admin.py | 159 +++++++++++++++++++++++++++++++- templates/admin_report_cc.html | 96 +++++++++++++++++++ templates/admin_report_iva.html | 96 +++++++++++++++++++ templates/macros/modals.html | 10 +- 4 files changed, 355 insertions(+), 6 deletions(-) create mode 100644 templates/admin_report_cc.html create mode 100644 templates/admin_report_iva.html diff --git a/routes_admin.py b/routes_admin.py index 563f47e..9678413 100644 --- a/routes_admin.py +++ b/routes_admin.py @@ -760,4 +760,161 @@ def register_admin_routes(app): modulo_name=modulo_name, mes_nombre=f'{mes_actual:02}/{anio_actual}', workers_data=workers_data, - dias_en_periodo=dias_en_periodo) \ No newline at end of file + dias_en_periodo=dias_en_periodo) + + + @app.route('/admin/reportes/modulo//centros_comerciales') + @admin_required + def report_modulo_centros_comerciales(modulo_id): + import calendar + from datetime import date + + mes_actual = date.today().month + anio_actual = date.today().year + + # Obtenemos la cantidad real de días del mes + _, num_dias = calendar.monthrange(anio_actual, mes_actual) + + dias_en_periodo = [] + for d in range(1, num_dias + 1): + dia_semana = date(anio_actual, mes_actual, d).weekday() + dias_en_periodo.append({ + 'num': f'{d:02}', + 'name': ['L', 'M', 'M', 'J', 'V', 'S', 'D'][dia_semana] + }) + + conn = get_db_connection() + c = conn.cursor() + + c.execute("SELECT name FROM modulos WHERE id = ?", (modulo_id,)) + modulo_info = c.fetchone() + if not modulo_info: + conn.close() + flash("Módulo no encontrado.", "danger") + return redirect(url_for('admin_reportes_index')) + modulo_name = modulo_info[0] + + c.execute(''' + SELECT strftime('%d', r.fecha) as dia, + SUM(r.boletas_debito + r.boletas_credito + r.boletas_mp) as trans_red_compra, + SUM(r.boletas_efectivo) as boletas_efectivo, + SUM(r.venta_debito + r.venta_credito + r.venta_mp + r.venta_efectivo) as venta_total + FROM rendiciones r + WHERE r.modulo_id = ? AND strftime('%m', r.fecha) = ? AND strftime('%Y', r.fecha) = ? + GROUP BY dia + ''', (modulo_id, f'{mes_actual:02}', str(anio_actual))) + + resultados = c.fetchall() + conn.close() + + data_por_dia = {f'{d:02}': {'red_compra': 0, 'efectivo': 0, 'total_trans': 0, 'venta_neta': 0} for d in range(1, num_dias + 1)} + totales = {'red_compra': 0, 'efectivo': 0, 'total_trans': 0, 'venta_neta': 0} + + for row in resultados: + dia, red_compra, efectivo, venta_total = row + if dia not in data_por_dia: + continue + + red_compra = red_compra or 0 + efectivo = efectivo or 0 + venta_total = venta_total or 0 + + total_trans = red_compra + efectivo + venta_neta = round(venta_total / 1.19) + + data_por_dia[dia] = { + 'red_compra': red_compra, + 'efectivo': efectivo, + 'total_trans': total_trans, + 'venta_neta': venta_neta + } + + totales['red_compra'] += red_compra + totales['efectivo'] += efectivo + totales['total_trans'] += total_trans + totales['venta_neta'] += venta_neta + + return render_template('admin_report_cc.html', + modulo_name=modulo_name, + mes_nombre=f'{mes_actual:02}/{anio_actual}', + dias_en_periodo=dias_en_periodo, + data_por_dia=data_por_dia, + totales=totales) + + @app.route('/admin/reportes/modulo//calculo_iva') + @admin_required + def report_modulo_calculo_iva(modulo_id): + import calendar + from datetime import date + + mes_actual = date.today().month + anio_actual = date.today().year + + _, num_dias = calendar.monthrange(anio_actual, mes_actual) + + dias_en_periodo = [] + for d in range(1, num_dias + 1): + dia_semana = date(anio_actual, mes_actual, d).weekday() + dias_en_periodo.append({ + 'num': f'{d:02}', + 'name': ['L', 'M', 'M', 'J', 'V', 'S', 'D'][dia_semana] + }) + + conn = get_db_connection() + c = conn.cursor() + + c.execute("SELECT name FROM modulos WHERE id = ?", (modulo_id,)) + modulo_info = c.fetchone() + if not modulo_info: + conn.close() + flash("Módulo no encontrado.", "danger") + return redirect(url_for('admin_reportes_index')) + modulo_name = modulo_info[0] + + c.execute(''' + SELECT strftime('%d', r.fecha) as dia, + SUM(r.venta_efectivo) as venta_efectivo, + SUM(r.venta_debito + r.venta_credito + r.venta_mp) as venta_tbk + FROM rendiciones r + WHERE r.modulo_id = ? AND strftime('%m', r.fecha) = ? AND strftime('%Y', r.fecha) = ? + GROUP BY dia + ''', (modulo_id, f'{mes_actual:02}', str(anio_actual))) + + resultados = c.fetchall() + conn.close() + + data_por_dia = {f'{d:02}': {'efectivo': 0, 'tbk': 0, 'total': 0, 'porcentaje': 0} for d in range(1, num_dias + 1)} + totales = {'efectivo': 0, 'tbk': 0, 'total': 0, 'porcentaje': 0} + + for row in resultados: + dia, efectivo, tbk = row + if dia not in data_por_dia: + continue + + efectivo = efectivo or 0 + tbk = tbk or 0 + total = efectivo + tbk + + # Evitar dividir por cero cuando no se vende nada en el día + porcentaje = round((efectivo / total) * 100) if total > 0 else 0 + + data_por_dia[dia] = { + 'efectivo': efectivo, + 'tbk': tbk, + 'total': total, + 'porcentaje': porcentaje + } + + totales['efectivo'] += efectivo + totales['tbk'] += tbk + totales['total'] += total + + if totales['total'] > 0: + totales['porcentaje'] = round((totales['efectivo'] / totales['total']) * 100) + + return render_template('admin_report_iva.html', + modulo_name=modulo_name, + mes_nombre=f'{mes_actual:02}/{anio_actual}', + dias_en_periodo=dias_en_periodo, + data_por_dia=data_por_dia, + totales=totales) \ No newline at end of file diff --git a/templates/admin_report_cc.html b/templates/admin_report_cc.html new file mode 100644 index 0000000..9647e31 --- /dev/null +++ b/templates/admin_report_cc.html @@ -0,0 +1,96 @@ +{% extends "macros/base.html" %} + +{% block title %}Reporte: Centros Comerciales - {{ modulo_name }}{% endblock %} + +{% block styles %} + +{% endblock %} + +{% block content %} +
+
+ + Volver al Menú + +

Registro Centros Comerciales

+
+
+
{{ modulo_name }}
+
Período: {{ mes_nombre }}
+
+
+ +
+
+
+ + + + + + + + + + + + {% for dia in dias_en_periodo %} + {% set d = data_por_dia[dia.num] %} + + + + + + + + {% endfor %} + + + + + + + + + + +
FECHANº TRANSACCION
RED COMPRA
Nº DE BOLETAS
EFECTIVO
TOTAL
TRANSACCIONES
VENTA NETA
+
+ {{ dia.name }} + {{ dia.num }} +
+
{{ d.red_compra }}{{ d.efectivo }}{{ d.total_trans }}${{ "{:,.0f}".format(d.venta_neta).replace(',', '.') }}
TOTALES{{ totales.red_compra }}{{ totales.efectivo }}{{ totales.total_trans }}${{ "{:,.0f}".format(totales.venta_neta).replace(',', '.') }}
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/templates/admin_report_iva.html b/templates/admin_report_iva.html new file mode 100644 index 0000000..29532ab --- /dev/null +++ b/templates/admin_report_iva.html @@ -0,0 +1,96 @@ +{% extends "macros/base.html" %} + +{% block title %}Reporte: Cálculo de IVA - {{ modulo_name }}{% endblock %} + +{% block styles %} + +{% endblock %} + +{% block content %} +
+
+ + Volver al Menú + +

Cálculo de IVA

+
+
+
{{ modulo_name }}
+
Período: {{ mes_nombre }}
+
+
+ +
+
+
+ + + + + + + + + + + + {% for dia in dias_en_periodo %} + {% set d = data_por_dia[dia.num] %} + + + + + + + + {% endfor %} + + + + + + + + + + +
FECHAVENTA EFECTIVOVENTA TBKVENTA TOTAL% PROMEDIO VTAS
EN EFECTIVO
+
+ {{ dia.name }} + {{ dia.num }} +
+
${{ "{:,.0f}".format(d.efectivo).replace(',', '.') }}${{ "{:,.0f}".format(d.tbk).replace(',', '.') }}${{ "{:,.0f}".format(d.total).replace(',', '.') }}{{ d.porcentaje }}%
TOTALES${{ "{:,.0f}".format(totales.efectivo).replace(',', '.') }}${{ "{:,.0f}".format(totales.tbk).replace(',', '.') }}${{ "{:,.0f}".format(totales.total).replace(',', '.') }}{{ totales.porcentaje }}%
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/templates/macros/modals.html b/templates/macros/modals.html index c65de4a..96c91c1 100644 --- a/templates/macros/modals.html +++ b/templates/macros/modals.html @@ -486,7 +486,7 @@
Detalle de Ventas

Análisis detallado de ventas diarias, productos vendidos y consolidado mensual.

- Generar Reporte + Generar Reporte @@ -501,7 +501,7 @@
Comisiones

Cálculo de comisiones generadas por los trabajadores en este módulo.

- Generar Reporte + Generar Reporte @@ -516,7 +516,7 @@
Control de Horarios

Registro de horas de entrada y salida de los trabajadores y acompañantes.

- Generar Reporte + Generar Reporte @@ -531,7 +531,7 @@
Centros Comerciales

Reporte de datos exigidos por la administración del centro comercial.

- + Generar Reporte @@ -546,7 +546,7 @@
Cálculo de IVA

Proyección de impuestos basados en las ventas declaradas.

- + Generar Reporte