From 72b81b26b8f1814860fb71153095d18b494d7a5a Mon Sep 17 00:00:00 2001 From: Shiro-Nek0 Date: Sat, 21 Mar 2026 21:20:49 -0300 Subject: [PATCH] =?UTF-8?q?ermover=20turno,=20a=C3=B1adir=20horas,=20mover?= =?UTF-8?q?=20gastos=20y=20hacer=20q=20no=20afecten=20total?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 + app.py | 65 +++++++++++++------- templates/admin_rendiciones.html | 13 ++-- templates/macros/modals.html | 55 +++++++---------- templates/worker_dashboard.html | 100 +++++++++++++++++++++---------- 5 files changed, 143 insertions(+), 93 deletions(-) diff --git a/README.md b/README.md index aace005..4df2a04 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,11 @@ services: ``` # TODO preguntas: - ver si gastos debe o no restar del total +- ver si tienen como turnos fijos para setear un horario +- ver si trabajan mas de 2 personas maximo al dia # TODO general: +- añadir si es part time o full time en la tabla de trabajadores para ver si necesitan comisiones - separar productos para tiendas - limpiar requirements.txt - hacer placeholders funcionales (si dice 0 que el sistema lea 0 no null) diff --git a/app.py b/app.py index 80c43f3..c435645 100644 --- a/app.py +++ b/app.py @@ -80,7 +80,28 @@ def populateDefaults(): for name, price, commission in productos_data: c.execute("INSERT INTO productos (zona_id, name, price, commission) VALUES (?, ?, ?, ?)", (zona_id, name, price, commission)) - conn.commit() + + c.execute("SELECT COUNT(*) FROM workers WHERE is_admin = 0") + if c.fetchone()[0] == 0: + c.execute("SELECT id FROM modulos LIMIT 2") + modulos_ids = c.fetchall() + + if len(modulos_ids) >= 2: + mod_1 = modulos_ids[0][0] + mod_2 = modulos_ids[1][0] + + default_pass = generate_password_hash("123456") + + workers_data = [ + ("11.111.111-1", "Juan Perez", "+56 9 1111 1111", default_pass, 0, mod_1), + ("22.222.222-2", "Maria Gonzalez", "+56 9 2222 2222", default_pass, 0, mod_1), + ("33.333.333-3", "Pedro Soto", "+56 9 3333 3333", default_pass, 0, mod_2), + ("44.444.444-4", "Ana Silva", "+56 9 4444 4444", default_pass, 0, mod_2) + ] + + for w in workers_data: + c.execute("INSERT OR IGNORE INTO workers (rut, name, phone, password_hash, is_admin, modulo_id) VALUES (?, ?, ?, ?, ?, ?)", w) + conn.commit() conn.close() def init_db(): @@ -127,7 +148,10 @@ def init_db(): companion_id INTEGER, modulo_id INTEGER NOT NULL, fecha DATE NOT NULL, - turno TEXT NOT NULL, + hora_entrada TEXT NOT NULL, + hora_salida TEXT NOT NULL, + companion_hora_entrada TEXT, + companion_hora_salida TEXT, venta_debito INTEGER DEFAULT 0, venta_credito INTEGER DEFAULT 0, venta_mp INTEGER DEFAULT 0, @@ -285,18 +309,19 @@ def worker_dashboard(): # 2. Manejo del envío del formulario if request.method == 'POST': fecha = request.form.get('fecha') - turno = request.form.get('turno') + hora_entrada = request.form.get('hora_entrada') + hora_salida = request.form.get('hora_salida') + companion_hora_entrada = request.form.get('companion_hora_entrada') + companion_hora_salida = request.form.get('companion_hora_salida') - # Función para limpiar puntos y validar presencia de datos def clean_and_validate(val): if val is None or val.strip() == "": - return 0 # <--- Cambiado de None a 0 + return 0 try: return int(val.replace('.', '')) except ValueError: - return 0 # <--- Cambiado de None a 0 + return 0 - # Captura y validación de campos obligatorios debito = clean_and_validate(request.form.get('venta_debito')) credito = clean_and_validate(request.form.get('venta_credito')) mp = clean_and_validate(request.form.get('venta_mp')) @@ -304,24 +329,24 @@ def worker_dashboard(): gastos = clean_and_validate(request.form.get('gastos')) or 0 obs = request.form.get('observaciones', '').strip() companion_id = request.form.get('companion_id') + if companion_id == "": companion_id = None + companion_hora_entrada = None + companion_hora_salida = None - # VERIFICACIÓN: Todos los campos de venta deben estar rellenos - if debito is None or credito is None or mp is None or efectivo is None or not fecha or not turno: - flash("Error: Todos los campos (Fecha, Turno, Tarjeta, MP y Efectivo) son obligatorios. Use 0 si no hubo ventas.", "danger") + if debito is None or credito is None or mp is None or efectivo is None or not fecha or not hora_entrada or not hora_salida: + flash("Error: Todos los campos obligatorios deben estar rellenos.", "danger") return redirect(url_for('worker_dashboard')) - # CÁLCULOS ADICIONALES (Para lógica de negocio o auditoría futura) total_digital = debito + credito + mp total_ventas_general = total_digital + efectivo - # Insertar Cabecera de Rendición c.execute('''INSERT INTO rendiciones - (worker_id, companion_id, modulo_id, fecha, turno, + (worker_id, companion_id, modulo_id, fecha, hora_entrada, hora_salida, companion_hora_entrada, companion_hora_salida, venta_debito, venta_credito, venta_mp, venta_efectivo, gastos, observaciones) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', - (session['user_id'], companion_id, modulo_id, fecha, turno, + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', + (session['user_id'], companion_id, modulo_id, fecha, hora_entrada, hora_salida, companion_hora_entrada, companion_hora_salida, debito, credito, mp, efectivo, gastos, obs)) rendicion_id = c.lastrowid @@ -672,7 +697,7 @@ def admin_rendiciones(): # Añadimos worker_id (11), companion_id (12) y modulo_id (13) a la consulta c.execute(''' - SELECT r.id, r.fecha, w.name, m.name, r.turno, + SELECT r.id, r.fecha, w.name, m.name, r.venta_debito, r.venta_credito, r.venta_mp, r.venta_efectivo, r.gastos, r.observaciones, c_w.name, r.worker_id, r.companion_id, r.modulo_id FROM rendiciones r @@ -736,9 +761,7 @@ def delete_rendicion(id): @app.route('/admin/rendiciones/edit/', methods=['POST']) @admin_required def edit_rendicion(id): - # Campos de cabecera fecha = request.form.get('fecha') - turno = request.form.get('turno') worker_id = request.form.get('worker_id') modulo_id = request.form.get('modulo_id') companion_id = request.form.get('companion_id') @@ -746,7 +769,6 @@ def edit_rendicion(id): if companion_id == "": companion_id = None - # ¡ADIÓS venta_tarjeta! Capturamos débito y crédito separados debito = request.form.get('venta_debito', '0').replace('.', '') credito = request.form.get('venta_credito', '0').replace('.', '') mp = request.form.get('venta_mp', '0').replace('.', '') @@ -767,13 +789,12 @@ def edit_rendicion(id): conn = sqlite3.connect(DB_NAME) c = conn.cursor() - # Actualizamos los nombres de las columnas en el UPDATE c.execute(''' UPDATE rendiciones - SET fecha=?, turno=?, worker_id=?, modulo_id=?, companion_id=?, + SET fecha=?, worker_id=?, modulo_id=?, companion_id=?, venta_debito=?, venta_credito=?, venta_mp=?, venta_efectivo=?, gastos=?, observaciones=? WHERE id=? - ''', (fecha, turno, worker_id, modulo_id, companion_id, debito, credito, mp, efectivo, gastos, observaciones, id)) + ''', (fecha, worker_id, modulo_id, companion_id, debito, credito, mp, efectivo, gastos, observaciones, id)) conn.commit() conn.close() diff --git a/templates/admin_rendiciones.html b/templates/admin_rendiciones.html index ecf3f4c..949bd7e 100644 --- a/templates/admin_rendiciones.html +++ b/templates/admin_rendiciones.html @@ -25,23 +25,22 @@ Fecha Trabajador Módulo - Turno Total Declarado Gastos Acciones - + {% for r in rendiciones %} {{ r[1] }} {{ r[2] }} {{ r[3] }} - {{ r[4] }} + - ${{ "{:,.0f}".format((r[5] or 0) + (r[6] or 0) + (r[7] or 0) + (r[8] or 0)).replace(',', '.') }} + ${{ "{:,.0f}".format((r[4] or 0) + (r[5] or 0) + (r[6] or 0) + (r[7] or 0)).replace(',', '.') }} - ${{ "{:,.0f}".format(r[9] or 0).replace(',', '.') }} + ${{ "{:,.0f}".format(r[8] or 0).replace(',', '.') }}
@@ -49,7 +48,7 @@
- {{ rendicion_detail_modal(r, r[15], r[16], r[17]) }} + {{ rendicion_detail_modal(r, r[14], r[15], r[16]) }} {{ edit_rendicion_modal(r, workers, modulos) }} {{ confirm_modal( @@ -64,7 +63,7 @@ {% else %} - Aún no hay rendiciones enviadas. + Aún no hay rendiciones enviadas. {% endfor %} diff --git a/templates/macros/modals.html b/templates/macros/modals.html index 5bbae75..1ee547c 100644 --- a/templates/macros/modals.html +++ b/templates/macros/modals.html @@ -121,7 +121,7 @@ Generará una nueva clave aleatoria. @@ -201,8 +201,8 @@
Acompañante
- {% if rendicion[11] %} - {{ rendicion[11] }} + {% if rendicion[10] %} + {{ rendicion[10] }} {% else %} Sin acompañante {% endif %} @@ -210,29 +210,26 @@
Módulo
{{ rendicion[3] }}
- -
Turno
-
{{ rendicion[4] }}

Débito: - ${{ "{:,.0f}".format(rendicion[5] or 0).replace(',', '.') }} + ${{ "{:,.0f}".format(rendicion[4] or 0).replace(',', '.') }}
Crédito: - ${{ "{:,.0f}".format(rendicion[6] or 0).replace(',', '.') }} + ${{ "{:,.0f}".format(rendicion[5] or 0).replace(',', '.') }}
Mercado Pago: - ${{ "{:,.0f}".format(rendicion[7] or 0).replace(',', '.') }} + ${{ "{:,.0f}".format(rendicion[6] or 0).replace(',', '.') }}
Efectivo: - ${{ "{:,.0f}".format(rendicion[8] or 0).replace(',', '.') }} + ${{ "{:,.0f}".format(rendicion[7] or 0).replace(',', '.') }}
- {% set total_declarado = (rendicion[5] or 0) + (rendicion[6] or 0) + (rendicion[7] or 0) + (rendicion[8] or 0) %} + {% set total_declarado = (rendicion[4] or 0) + (rendicion[5] or 0) + (rendicion[6] or 0) + (rendicion[7] or 0) %}
Total Declarado: ${{ "{:,.0f}".format(total_declarado).replace(',', '.') }} @@ -251,12 +248,12 @@
Monto Gastos: - -${{ "{:,.0f}".format(rendicion[9] or 0).replace(',', '.') }} + -${{ "{:,.0f}".format(rendicion[8] or 0).replace(',', '.') }}
Observaciones:

- {{ rendicion[10] if rendicion[10] else "Sin observaciones." }} + {{ rendicion[9] if rendicion[9] else "Sin observaciones." }}

@@ -284,23 +281,15 @@ diff --git a/templates/worker_dashboard.html b/templates/worker_dashboard.html index d3b7e97..b829337 100644 --- a/templates/worker_dashboard.html +++ b/templates/worker_dashboard.html @@ -30,28 +30,39 @@
Datos del Turno
-
+
-
- - +
+ +
-
+
+ + +
+
- {% for worker in otros_trabajadores %} {% endfor %}
+
@@ -110,7 +121,7 @@
-
+
Resumen Financiero
@@ -143,32 +154,41 @@
-
-
- + +
+
+
$
-
- -
- -$ - -
-
-
- +
+
$
-
- - +
+
+ +
+
Gastos y Observaciones
+
+
+
+ +
+ $ + +
+
+
+ + +
@@ -196,6 +216,25 @@ {% endblock %} {% block scripts %} + +