From 81251fb86937e9c6a811a654cd980a8fddbecac5 Mon Sep 17 00:00:00 2001 From: Shiro-Nek0 Date: Mon, 22 Jun 2026 01:28:33 -0400 Subject: [PATCH] bank fields, date range filters, add worker modal, fix empty report crash --- database.py | 7 ++ generar_unificado.py | 51 ++++++--- models/models.py | 4 + routes/admin_bp.py | 106 +++++++++++-------- services/rendiciones_service.py | 12 ++- services/report_service.py | 70 +++++++------ static/js/admin_workers.js | 30 +++++- templates/admin_rendiciones.html | 38 +------ templates/admin_report_cc.html | 9 +- templates/admin_report_comisiones.html | 9 +- templates/admin_report_horarios.html | 9 +- templates/admin_report_iva.html | 9 +- templates/admin_report_modulo.html | 7 +- templates/admin_workers.html | 65 ++++-------- templates/macros/modals.html | 138 +++++++++++++++++++++---- utils.py | 7 +- 16 files changed, 346 insertions(+), 225 deletions(-) diff --git a/database.py b/database.py index a1a9397..2521ef4 100644 --- a/database.py +++ b/database.py @@ -276,6 +276,13 @@ def init_db(): FOREIGN KEY (rendicion_id) REFERENCES rendiciones(id), FOREIGN KEY (producto_id) REFERENCES productos(id))''') + # Migrate: add bank fields if missing + for col in ['nombre_banco', 'numero_cuenta', 'tipo_cuenta', 'rut_banco']: + try: + c.execute(f"ALTER TABLE workers ADD COLUMN {col} TEXT DEFAULT ''") + except sqlite3.OperationalError: + pass # column already exists + c.execute("SELECT id FROM workers WHERE is_admin = 1") if not c.fetchone(): admin_pass = generate_password_hash("admin123") diff --git a/generar_unificado.py b/generar_unificado.py index 3b95dcb..a3433e8 100644 --- a/generar_unificado.py +++ b/generar_unificado.py @@ -35,28 +35,38 @@ def generar_historico_definitivo(dias_atras=180): nombre_falso = f"Trabajador {i+1} ({mod_name})" phone_falso = f"+56 9 8888 {mod_id:02d}{i:02d}" + banco = random.choice(["Banco Estado", "Banco de Chile", "Banco Falabella", "Santander", "BCI", "Scotiabank"]) workers_data.append(( rut_falso, nombre_falso, phone_falso, - default_pass, 0, mod_id, tipos[i] + default_pass, 0, mod_id, tipos[i], + banco, f"{random.randint(10000000, 99999999)}", random.choice(["Cuenta Corriente", "Cuenta Vista", "Cuenta Rut"]), + f"{random.randint(10000000, 99999999)}-{random.choice('0123456789K')}", )) c.executemany('''INSERT OR IGNORE INTO workers - (rut, name, phone, password_hash, is_admin, modulo_id, tipo) - VALUES (?, ?, ?, ?, ?, ?, ?)''', workers_data) + (rut, name, phone, password_hash, is_admin, modulo_id, tipo, + nombre_banco, numero_cuenta, tipo_cuenta, rut_banco) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', workers_data) conn.commit() # 3. PREPARACIÓN DE DATOS - c.execute("SELECT id, modulo_id FROM workers WHERE is_admin = 0") + c.execute("SELECT id, modulo_id, tipo FROM workers WHERE is_admin = 0") all_workers_data = c.fetchall() todos_los_trabajadores = [w[0] for w in all_workers_data] - + workers_tipo = {w[0]: w[2] for w in all_workers_data} + trabajadores_por_modulo = {} - for w_id, m_id in all_workers_data: + for w_id, m_id, _ in all_workers_data: if m_id not in trabajadores_por_modulo: trabajadores_por_modulo[m_id] = [] trabajadores_por_modulo[m_id].append(w_id) - c.execute("SELECT id, price, commission FROM productos") + c.execute(""" + SELECT p.id, ph.price, ph.commission + FROM productos p + JOIN precios_historicos ph ON p.id = ph.producto_id + GROUP BY p.id + """) productos = c.fetchall() # 4. VIAJE EN EL TIEMPO @@ -104,15 +114,21 @@ def generar_historico_definitivo(dias_atras=180): else: hora_entrada = f"{random.randint(13, 15):02d}:{random.choice(['00', '30'])}" hora_salida = f"{random.randint(19, 21):02d}:{random.choice(['00', '30'])}" - + + worker_tipo = workers_tipo.get(worker_id, "Part Time") + worker_comision = 1 if worker_tipo == "Full Time" else random.choice([0, 1]) + # Acompañante (70%) companion_id = None comp_in, comp_out = None, None + companion_comision = 0 if random.random() < 0.70: posibles_comp = [w for w in todos_los_trabajadores if w != worker_id] if posibles_comp: companion_id = random.choice(posibles_comp) comp_in, comp_out = hora_entrada, hora_salida + comp_tipo = workers_tipo.get(companion_id, "Part Time") + companion_comision = 1 if comp_tipo == "Full Time" else random.choice([0, 1]) num_prods = random.randint(1, 5) prods_elegidos = random.sample(productos, min(num_prods, len(productos))) @@ -155,16 +171,19 @@ def generar_historico_definitivo(dias_atras=180): c.execute(''' INSERT INTO rendiciones - (worker_id, companion_id, modulo_id, fecha, hora_entrada, hora_salida, - companion_hora_entrada, companion_hora_salida, + (worker_id, worker_comision, companion_id, modulo_id, fecha, + hora_entrada, hora_salida, companion_hora_entrada, companion_hora_salida, + companion_comision, venta_debito, venta_credito, venta_mp, venta_efectivo, boletas_debito, boletas_credito, boletas_mp, boletas_efectivo, - gastos, observaciones, worker_comision, companion_comision) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?) - ''', (worker_id, companion_id, modulo_id, fecha_str, hora_entrada, hora_salida, - comp_in, comp_out, debito, credito, mp, efectivo, - b_debito, b_credito, b_mp, b_efectivo, - gastos, tipo_registro, 1 if companion_id else 0)) + gastos, observaciones) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ''', (worker_id, worker_comision, companion_id, modulo_id, fecha_str, + hora_entrada, hora_salida, comp_in, comp_out, + companion_comision, + debito, credito, mp, efectivo, + b_debito, b_credito, b_mp, b_efectivo, + gastos, tipo_registro)) r_id = c.lastrowid diff --git a/models/models.py b/models/models.py index 73f8d68..61eb5e7 100644 --- a/models/models.py +++ b/models/models.py @@ -55,6 +55,10 @@ class Worker(db.Model): is_admin = db.Column(db.Boolean, default=False) modulo_id = db.Column(db.Integer, db.ForeignKey('modulos.id')) tipo = db.Column(db.String, default='Full Time') + nombre_banco = db.Column(db.String, default='') + numero_cuenta = db.Column(db.String, default='') + tipo_cuenta = db.Column(db.String, default='') + rut_banco = db.Column(db.String, default='') class Rendicion(db.Model): diff --git a/routes/admin_bp.py b/routes/admin_bp.py index 61f1c07..4008611 100644 --- a/routes/admin_bp.py +++ b/routes/admin_bp.py @@ -17,6 +17,20 @@ from services import report_service, rendiciones_service admin_bp = Blueprint('admin', __name__, url_prefix='/admin') +BANCOS = [ + "Banco Estado", "Banco de Chile", "Banco Falabella", "BCI Nova", + "Banco Bice", "Banco Consorcio", "Banco Security", "Banefe", + "Coopeuch", "Corpbanca", "Multicaja", "Ahorrocoop", + "BBVA Chile", "Banco Condell", "Banco Do Brasil S.A.", + "Banco Edwards Citi", "Banco Internacional", "Banco Itaú Chile", + "Banco París", "Banco Penta", "Banco Ripley", + "Banco Santander Chile", "Banco de Crédito e Inversiones - BCI", + "Banco de la Nación Argentina", "Caputal", "Coocretal", + "Credichile Atlas", "DNB Bank ASA", "Detacoop", + "Oriencoop", "RABOBANK CHILE", "Scotiabank Chile", + "Servipag Express", "THE BANK OF TOKYO-MITSUBISHI UFJ, LTD.", +] + # ============================================================ # WORKERS @@ -47,9 +61,17 @@ def manage_workers(): password = generate_random_password() p_hash = generate_password_hash(password) + nombre_banco = request.form.get('nombre_banco', '') + if nombre_banco == '__otro__': + nombre_banco = request.form.get('nombre_banco_otro', '') + new_worker = Worker( rut=rut, name=name, phone=phone, password_hash=p_hash, is_admin=False, modulo_id=int(modulo_id), tipo=tipo, + nombre_banco=nombre_banco, + numero_cuenta=request.form.get('numero_cuenta', ''), + tipo_cuenta=request.form.get('tipo_cuenta', ''), + rut_banco=request.form.get('rut_banco', ''), ) try: db.session.add(new_worker) @@ -69,7 +91,8 @@ def manage_workers(): .all() ) workers = [ - (w.id, w.rut, w.name, w.phone, m.name if m else None, w.modulo_id, w.tipo) + (w.id, w.rut, w.name, w.phone, m.name if m else None, w.modulo_id, w.tipo, + w.nombre_banco or '', w.numero_cuenta or '', w.tipo_cuenta or '', w.rut_banco or '') for w, m in workers_rows ] @@ -81,7 +104,7 @@ def manage_workers(): ) modulos = [(m.id, m.name, z.name) for m, z in modulos_rows] - return render_template('admin_workers.html', workers=workers, form=form_data, modulos=modulos) + return render_template('admin_workers.html', workers=workers, form=form_data, modulos=modulos, bancos=BANCOS) @admin_bp.route('/workers/edit/', methods=['GET', 'POST']) @@ -108,6 +131,13 @@ def edit_worker(id): worker.phone = format_phone(raw_phone) worker.modulo_id = int(modulo_id) worker.tipo = tipo + nombre_banco = request.form.get('nombre_banco', '') + if nombre_banco == '__otro__': + nombre_banco = request.form.get('nombre_banco_otro', '') + worker.nombre_banco = nombre_banco + worker.numero_cuenta = request.form.get('numero_cuenta', '') + worker.tipo_cuenta = request.form.get('tipo_cuenta', '') + worker.rut_banco = request.form.get('rut_banco', '') db.session.commit() flash("Trabajador actualizado exitosamente.", "success") @@ -126,8 +156,10 @@ def edit_worker(id): if not worker: return redirect(url_for('admin.manage_workers')) - worker_tuple = (worker.id, worker.rut, worker.name, worker.phone, worker.modulo_id) - return render_template('edit_worker.html', worker=worker_tuple, modulos=modulos) + worker_tuple = (worker.id, worker.rut, worker.name, worker.phone, worker.modulo_id, + worker.nombre_banco or '', worker.numero_cuenta or '', worker.tipo_cuenta or '', + worker.rut_banco or '') + return render_template('edit_worker.html', worker=worker_tuple, modulos=modulos, bancos=BANCOS) @admin_bp.route('/workers/delete/', methods=['POST']) @@ -411,40 +443,28 @@ def api_product_history(id): @admin_bp.route('/rendiciones') @admin_required def admin_rendiciones(): - mes_seleccionado = request.args.get('mes') - anio_seleccionado = request.args.get('anio') - dia_seleccionado = request.args.get('dia') + hoy = date.today() + fecha_inicio = request.args.get('fecha_inicio', f"{hoy.year}-{hoy.month:02d}-01") + fecha_fin = request.args.get('fecha_fin', hoy.strftime('%Y-%m-%d')) zona_id_seleccionada = request.args.get('zona_id') modulo_id_seleccionado = request.args.get('modulo_id') - if request.args.get('mes') is None: - hoy = date.today() - mes_seleccionado = f"{hoy.month:02d}" - anio_seleccionado = str(hoy.year) - dia_seleccionado = f"{hoy.day:02d}" - - mes_seleccionado = mes_seleccionado.zfill(2) - rendiciones_completas = rendiciones_service.get_filtered_rendiciones( - mes_seleccionado, anio_seleccionado, dia_seleccionado, + fecha_inicio, fecha_fin, zona_id_seleccionada, modulo_id_seleccionado, ) workers, modulos, zonas, anios_disponibles = rendiciones_service.get_filter_catalogs() - dias_disponibles = [f"{d:02d}" for d in range(1, 32)] - return render_template('admin_rendiciones.html', rendiciones=rendiciones_completas, workers=workers, modulos=modulos, zonas=zonas, - mes_actual=mes_seleccionado, - anio_actual=anio_seleccionado, - dia_actual=dia_seleccionado, + fecha_inicio=fecha_inicio, + fecha_fin=fecha_fin, zona_actual=zona_id_seleccionada, modulo_actual=modulo_id_seleccionado, - anios_disponibles=anios_disponibles, - dias_disponibles=dias_disponibles) + anios_disponibles=anios_disponibles) @admin_bp.route('/rendiciones/delete/', methods=['POST']) @@ -549,87 +569,87 @@ def admin_reportes_index(): @admin_bp.route('/reportes/modulo/') @admin_required def report_modulo_periodo(modulo_id): - anio, mes, dia_f, worker_id = get_report_params() + fecha_inicio, fecha_fin, worker_id = get_report_params() mod_name, workers_list, anios_list = report_service.get_modulo_workers_and_anios(modulo_id) - data = report_service.get_modulo_periodo_data(modulo_id, anio, mes, dia_f, worker_id) + data = report_service.get_modulo_periodo_data(modulo_id, fecha_inicio, fecha_fin, worker_id) return render_template('admin_report_modulo.html', modulo_name=mod_name, modulo_id=modulo_id, - mes_nombre=f"{mes}/{anio}", + mes_nombre=f"{fecha_inicio} a {fecha_fin}", dias_en_periodo=data['dias_en_periodo'], data_por_dia=data['data_por_dia'], totales_mes=data['totales_mes'], dias_activos=data['dias_activos'], workers_list=workers_list, worker_actual=worker_id, - dia_actual=dia_f, mes_actual=mes, anio_actual=anio, + fecha_inicio=fecha_inicio, fecha_fin=fecha_fin, anios_disponibles=anios_list) @admin_bp.route('/reportes/modulo//comisiones') @admin_required def report_modulo_comisiones(modulo_id): - anio, mes, dia_f, worker_id = get_report_params() + fecha_inicio, fecha_fin, worker_id = get_report_params() mod_name, workers_list, anios_list = report_service.get_modulo_workers_and_anios(modulo_id) - data = report_service.get_comisiones_data(modulo_id, anio, mes, dia_f, worker_id) + data = report_service.get_comisiones_data(modulo_id, fecha_inicio, fecha_fin, worker_id) return render_template('admin_report_comisiones.html', modulo_name=mod_name, modulo_id=modulo_id, - mes_nombre=f"{mes}/{anio}", + mes_nombre=f"{fecha_inicio} a {fecha_fin}", workers_data=data['workers_data'], dias_en_periodo=data['dias_en_periodo'], workers_list=workers_list, worker_actual=worker_id, - dia_actual=dia_f, mes_actual=mes, anio_actual=anio, + fecha_inicio=fecha_inicio, fecha_fin=fecha_fin, anios_disponibles=anios_list) @admin_bp.route('/reportes/modulo//horarios') @admin_required def report_modulo_horarios(modulo_id): - anio, mes, dia_f, worker_id = get_report_params() + fecha_inicio, fecha_fin, worker_id = get_report_params() mod_name, workers_list, anios_list = report_service.get_modulo_workers_and_anios(modulo_id) - data = report_service.get_horarios_data(modulo_id, anio, mes, dia_f, worker_id) + data = report_service.get_horarios_data(modulo_id, fecha_inicio, fecha_fin, worker_id) return render_template('admin_report_horarios.html', modulo_name=mod_name, modulo_id=modulo_id, - mes_nombre=f"{mes}/{anio}", + mes_nombre=f"{fecha_inicio} a {fecha_fin}", workers_data=data['workers_data'], dias_en_periodo=data['dias_en_periodo'], workers_list=workers_list, worker_actual=worker_id, - dia_actual=dia_f, mes_actual=mes, anio_actual=anio, + fecha_inicio=fecha_inicio, fecha_fin=fecha_fin, anios_disponibles=anios_list) @admin_bp.route('/reportes/modulo//centros_comerciales') @admin_required def report_modulo_centros_comerciales(modulo_id): - anio, mes, dia_f, worker_id = get_report_params() + fecha_inicio, fecha_fin, worker_id = get_report_params() mod_name, workers_list, anios_list = report_service.get_modulo_workers_and_anios(modulo_id) - data = report_service.get_cc_data(modulo_id, anio, mes, dia_f, worker_id) + data = report_service.get_cc_data(modulo_id, fecha_inicio, fecha_fin, worker_id) return render_template('admin_report_cc.html', modulo_name=mod_name, modulo_id=modulo_id, - mes_nombre=f"{mes}/{anio}", + mes_nombre=f"{fecha_inicio} a {fecha_fin}", dias_en_periodo=data['dias_en_periodo'], data_por_dia=data['data_por_dia'], totales=data['totales'], workers_list=workers_list, worker_actual=worker_id, - dia_actual=dia_f, mes_actual=mes, anio_actual=anio, + fecha_inicio=fecha_inicio, fecha_fin=fecha_fin, anios_disponibles=anios_list) @admin_bp.route('/reportes/modulo//calculo_iva') @admin_required def report_modulo_calculo_iva(modulo_id): - anio, mes, dia_f, worker_id = get_report_params() + fecha_inicio, fecha_fin, worker_id = get_report_params() mod_name, workers_list, anios_list = report_service.get_modulo_workers_and_anios(modulo_id) - data = report_service.get_iva_data(modulo_id, anio, mes, dia_f, worker_id) + data = report_service.get_iva_data(modulo_id, fecha_inicio, fecha_fin, worker_id) return render_template('admin_report_iva.html', modulo_name=mod_name, modulo_id=modulo_id, - mes_nombre=f"{mes}/{anio}", + mes_nombre=f"{fecha_inicio} a {fecha_fin}", dias_en_periodo=data['dias_en_periodo'], data_por_dia=data['data_por_dia'], totales=data['totales'], workers_list=workers_list, worker_actual=worker_id, - dia_actual=dia_f, mes_actual=mes, anio_actual=anio, + fecha_inicio=fecha_inicio, fecha_fin=fecha_fin, anios_disponibles=anios_list) diff --git a/services/rendiciones_service.py b/services/rendiciones_service.py index 374b76f..52ac2af 100644 --- a/services/rendiciones_service.py +++ b/services/rendiciones_service.py @@ -25,15 +25,17 @@ def get_filter_catalogs(): return workers, modulos, zonas, anios_disponibles -def get_filtered_rendiciones(mes, anio, dia, zona_id, modulo_id): +def get_filtered_rendiciones(fecha_inicio, fecha_fin, zona_id, modulo_id): + from datetime import datetime + inicio = datetime.strptime(fecha_inicio, '%Y-%m-%d').date() + fin = datetime.strptime(fecha_fin, '%Y-%m-%d').date() + Companion = aliased(Worker) filters = [ - func.strftime('%m', Rendicion.fecha) == mes, - func.strftime('%Y', Rendicion.fecha) == anio, + Rendicion.fecha >= inicio, + Rendicion.fecha <= fin, ] - if dia: - filters.append(func.strftime('%d', Rendicion.fecha) == dia.zfill(2)) if zona_id: filters.append(Modulo.zona_id == zona_id) if modulo_id: diff --git a/services/report_service.py b/services/report_service.py index f02f640..74815ed 100644 --- a/services/report_service.py +++ b/services/report_service.py @@ -1,5 +1,4 @@ -import calendar -from datetime import date, datetime +from datetime import date, datetime, timedelta from sqlalchemy import func from sqlalchemy.orm import aliased from models.models import db, Modulo, Worker, Rendicion, RendicionItem @@ -9,26 +8,33 @@ Companion = aliased(Worker, name='companion') WEEKDAY_SHORT = ['L', 'M', 'M', 'J', 'V', 'S', 'D'] -def _fecha_filters(anio, mes, dia_f): +def _parse_date(date_str): + return datetime.strptime(date_str, '%Y-%m-%d').date() + + +def _fecha_filters(fecha_inicio, fecha_fin): filters = [ - func.strftime('%m', Rendicion.fecha) == mes, - func.strftime('%Y', Rendicion.fecha) == anio, + Rendicion.fecha >= _parse_date(fecha_inicio), + Rendicion.fecha <= _parse_date(fecha_fin), ] - if dia_f: - filters.append(func.strftime('%d', Rendicion.fecha) == dia_f.zfill(2)) return filters -def _dias_en_periodo(anio, mes): - _, num_dias = calendar.monthrange(int(anio), int(mes)) - return [f'{d:02d}' for d in range(1, num_dias + 1)] +def _dias_en_periodo(fecha_inicio, fecha_fin): + inicio = _parse_date(fecha_inicio) + fin = _parse_date(fecha_fin) + if inicio > fin: + inicio, fin = fin, inicio + return [f'{(inicio + timedelta(days=i)).strftime("%d")}' for i in range((fin - inicio).days + 1)] -def _dias_con_nombre(anio, mes): - _, num_dias = calendar.monthrange(int(anio), int(mes)) +def _dias_con_nombre(fecha_inicio, fecha_fin): + inicio = _parse_date(fecha_inicio) + fin = _parse_date(fecha_fin) return [ - {'num': f'{d:02d}', 'name': WEEKDAY_SHORT[date(int(anio), int(mes), d).weekday()]} - for d in range(1, num_dias + 1) + {'num': (inicio + timedelta(days=i)).strftime('%d'), + 'name': WEEKDAY_SHORT[(inicio + timedelta(days=i)).weekday()]} + for i in range((fin - inicio).days + 1) ] @@ -64,10 +70,10 @@ def _calcular_horas(hora_in, hora_out): return 0, "0:00" -def get_modulo_periodo_data(modulo_id, anio, mes, dia_f, worker_id): +def get_modulo_periodo_data(modulo_id, fecha_inicio, fecha_fin, worker_id): filters = [ Rendicion.modulo_id == modulo_id, - *_fecha_filters(anio, mes, dia_f), + *_fecha_filters(fecha_inicio, fecha_fin), ] if worker_id: filters.append(Rendicion.worker_id == worker_id) @@ -92,7 +98,7 @@ def get_modulo_periodo_data(modulo_id, anio, mes, dia_f, worker_id): ).group_by('dia').all() comisiones = {row[0]: row[1] for row in comisiones_rows} - dias_en_periodo = _dias_en_periodo(anio, mes) + dias_en_periodo = _dias_en_periodo(fecha_inicio, fecha_fin) data_por_dia = {d: { 'debito': 0, 'credito': 0, 'mp': 0, 'efectivo': 0, 'gastos': 0, 'comision': 0, 'venta_total': 0, @@ -109,7 +115,7 @@ def get_modulo_periodo_data(modulo_id, anio, mes, dia_f, worker_id): 'gastos': gastos, 'venta_total': vt, 'comision': comisiones.get(d, 0), } - totales_mes = {k: sum(d[k] for d in data_por_dia.values()) for k in data_por_dia['01']} + totales_mes = {k: sum(d[k] for d in data_por_dia.values()) for k in (next(iter(data_por_dia.values()), {})).keys()} dias_activos = sum(1 for d in data_por_dia.values() if d['venta_total'] > 0) return { @@ -120,10 +126,10 @@ def get_modulo_periodo_data(modulo_id, anio, mes, dia_f, worker_id): } -def get_comisiones_data(modulo_id, anio, mes, dia_f, worker_id): +def get_comisiones_data(modulo_id, fecha_inicio, fecha_fin, worker_id): filters = [ Rendicion.modulo_id == modulo_id, - *_fecha_filters(anio, mes, dia_f), + *_fecha_filters(fecha_inicio, fecha_fin), ] if worker_id: filters.append(db.or_(Rendicion.worker_id == worker_id, Rendicion.companion_id == worker_id)) @@ -166,14 +172,14 @@ def get_comisiones_data(modulo_id, anio, mes, dia_f, worker_id): return { 'workers_data': dict(sorted(workers_data.items(), key=lambda x: x[1]['name'])), - 'dias_en_periodo': _dias_en_periodo(anio, mes), + 'dias_en_periodo': _dias_en_periodo(fecha_inicio, fecha_fin), } -def get_horarios_data(modulo_id, anio, mes, dia_f, worker_id): +def get_horarios_data(modulo_id, fecha_inicio, fecha_fin, worker_id): filters = [ Rendicion.modulo_id == modulo_id, - *_fecha_filters(anio, mes, dia_f), + *_fecha_filters(fecha_inicio, fecha_fin), ] if worker_id: filters.append(db.or_(Rendicion.worker_id == worker_id, Rendicion.companion_id == worker_id)) @@ -212,14 +218,14 @@ def get_horarios_data(modulo_id, anio, mes, dia_f, worker_id): return { 'workers_data': workers_data, - 'dias_en_periodo': _dias_con_nombre(anio, mes), + 'dias_en_periodo': _dias_con_nombre(fecha_inicio, fecha_fin), } -def get_cc_data(modulo_id, anio, mes, dia_f, worker_id): +def get_cc_data(modulo_id, fecha_inicio, fecha_fin, worker_id): filters = [ Rendicion.modulo_id == modulo_id, - *_fecha_filters(anio, mes, dia_f), + *_fecha_filters(fecha_inicio, fecha_fin), ] if worker_id: filters.append(Rendicion.worker_id == worker_id) @@ -231,7 +237,7 @@ def get_cc_data(modulo_id, anio, mes, dia_f, worker_id): func.sum(Rendicion.venta_debito + Rendicion.venta_credito + Rendicion.venta_mp + Rendicion.venta_efectivo), ).filter(*filters).group_by('dia').all() - dias_en_periodo = _dias_en_periodo(anio, mes) + dias_en_periodo = _dias_en_periodo(fecha_inicio, fecha_fin) data_por_dia = {d: {'red_compra': 0, 'efectivo': 0, 'total_trans': 0, 'venta_neta': 0} for d in dias_en_periodo} totales = {'red_compra': 0, 'efectivo': 0, 'total_trans': 0, 'venta_neta': 0} @@ -246,16 +252,16 @@ def get_cc_data(modulo_id, anio, mes, dia_f, worker_id): totales[k] += data_por_dia[dia][k] return { - 'dias_en_periodo': _dias_con_nombre(anio, mes), + 'dias_en_periodo': _dias_con_nombre(fecha_inicio, fecha_fin), 'data_por_dia': data_por_dia, 'totales': totales, } -def get_iva_data(modulo_id, anio, mes, dia_f, worker_id): +def get_iva_data(modulo_id, fecha_inicio, fecha_fin, worker_id): filters = [ Rendicion.modulo_id == modulo_id, - *_fecha_filters(anio, mes, dia_f), + *_fecha_filters(fecha_inicio, fecha_fin), ] if worker_id: filters.append(Rendicion.worker_id == worker_id) @@ -266,7 +272,7 @@ def get_iva_data(modulo_id, anio, mes, dia_f, worker_id): func.sum(Rendicion.venta_debito + Rendicion.venta_credito + Rendicion.venta_mp), ).filter(*filters).group_by('dia').all() - dias_en_periodo = _dias_en_periodo(anio, mes) + dias_en_periodo = _dias_en_periodo(fecha_inicio, fecha_fin) data_por_dia = {d: {'efectivo': 0, 'tbk': 0, 'total': 0, 'porcentaje': 0} for d in dias_en_periodo} totales = {'efectivo': 0, 'tbk': 0, 'total': 0, 'porcentaje': 0} @@ -287,7 +293,7 @@ def get_iva_data(modulo_id, anio, mes, dia_f, worker_id): totales['porcentaje'] = round((totales['efectivo'] / totales['total']) * 100) return { - 'dias_en_periodo': _dias_con_nombre(anio, mes), + 'dias_en_periodo': _dias_con_nombre(fecha_inicio, fecha_fin), 'data_por_dia': data_por_dia, 'totales': totales, } diff --git a/static/js/admin_workers.js b/static/js/admin_workers.js index ad1408a..722602d 100644 --- a/static/js/admin_workers.js +++ b/static/js/admin_workers.js @@ -1,3 +1,9 @@ +function toggleOtroBanco(selectEl, wrapperId) { + const wrapper = document.getElementById(wrapperId); + if (!wrapper) return; + wrapper.style.display = selectEl.value === '__otro__' ? '' : 'none'; +} + document.addEventListener("DOMContentLoaded", function () { const editWorkerModal = document.getElementById('editWorkerModal'); const confirmResetModal = document.getElementById('confirmResetPass'); @@ -26,6 +32,24 @@ document.addEventListener("DOMContentLoaded", function () { editWorkerModal.querySelector('#edit_worker_phone').value = button.getAttribute('data-phone'); editWorkerModal.querySelector('#edit_worker_modulo').value = button.getAttribute('data-modulo'); editWorkerModal.querySelector('#edit_worker_tipo').value = button.getAttribute('data-tipo'); + const bancoVal = button.getAttribute('data-nombre-banco'); + const bancoSelect = editWorkerModal.querySelector('#edit_worker_nombre_banco'); + const otroWrapper = editWorkerModal.querySelector('#edit_otro_banco_wrapper'); + const otroInput = editWorkerModal.querySelector('#edit_worker_nombre_banco_otro'); + + const isCustom = bancoVal && !Array.from(bancoSelect.options).some(o => o.value === bancoVal); + if (isCustom) { + bancoSelect.value = '__otro__'; + otroWrapper.style.display = ''; + otroInput.value = bancoVal; + } else { + bancoSelect.value = bancoVal; + otroWrapper.style.display = 'none'; + otroInput.value = ''; + } + editWorkerModal.querySelector('#edit_worker_numero_cuenta').value = button.getAttribute('data-numero-cuenta'); + editWorkerModal.querySelector('#edit_worker_rut_banco').value = button.getAttribute('data-rut-banco'); + editWorkerModal.querySelector('#edit_worker_tipo_cuenta').value = button.getAttribute('data-tipo-cuenta'); }); } @@ -46,8 +70,12 @@ document.addEventListener("DOMContentLoaded", function () { if (rutInput) { window.formatHelpers.bindRutInput('#rutInput'); } + const addRutInput = document.getElementById('addRutInput'); + if (addRutInput) { + window.formatHelpers.bindRutInput('#addRutInput'); + } - window.formatHelpers.bindPhoneInput('.phone-input, #phoneInput'); + window.formatHelpers.bindPhoneInput('.phone-input, #phoneInput, #addPhoneInput'); const searchInputWorker = document.getElementById('searchWorker'); const moduleSelectFilter = document.getElementById('filterModule'); diff --git a/templates/admin_rendiciones.html b/templates/admin_rendiciones.html index e41e264..c0b3bbb 100644 --- a/templates/admin_rendiciones.html +++ b/templates/admin_rendiciones.html @@ -14,40 +14,13 @@
- - + +
- - + +
-
- - -
-
- -
+
diff --git a/templates/admin_report_cc.html b/templates/admin_report_cc.html index d584b92..32b0e27 100644 --- a/templates/admin_report_cc.html +++ b/templates/admin_report_cc.html @@ -16,14 +16,11 @@
{{ report_filters( - url_for('admin.report_modulo_periodo', modulo_id=modulo_id), + url_for('admin.report_modulo_centros_comerciales', modulo_id=modulo_id), workers_list, worker_actual, - dia_actual, - [('01','Ene'),('02','Feb'),('03','Mar'),('04','Abr'),('05','May'),('06','Jun'),('07','Jul'),('08','Ago'),('09','Sep'),('10','Oct'),('11','Nov'),('12','Dic')], - mes_actual, - anios_disponibles, - anio_actual + fecha_inicio, + fecha_fin ) }}
diff --git a/templates/admin_report_comisiones.html b/templates/admin_report_comisiones.html index 8b4cfea..30692ee 100644 --- a/templates/admin_report_comisiones.html +++ b/templates/admin_report_comisiones.html @@ -16,14 +16,11 @@
{{ report_filters( - url_for('admin.report_modulo_periodo', modulo_id=modulo_id), + url_for('admin.report_modulo_comisiones', modulo_id=modulo_id), workers_list, worker_actual, - dia_actual, - [('01','Ene'),('02','Feb'),('03','Mar'),('04','Abr'),('05','May'),('06','Jun'),('07','Jul'),('08','Ago'),('09','Sep'),('10','Oct'),('11','Nov'),('12','Dic')], - mes_actual, - anios_disponibles, - anio_actual + fecha_inicio, + fecha_fin ) }}
diff --git a/templates/admin_report_horarios.html b/templates/admin_report_horarios.html index 7e731ab..f676fb4 100644 --- a/templates/admin_report_horarios.html +++ b/templates/admin_report_horarios.html @@ -16,14 +16,11 @@
{{ report_filters( - url_for('admin.report_modulo_periodo', modulo_id=modulo_id), + url_for('admin.report_modulo_horarios', modulo_id=modulo_id), workers_list, worker_actual, - dia_actual, - [('01','Ene'),('02','Feb'),('03','Mar'),('04','Abr'),('05','May'),('06','Jun'),('07','Jul'),('08','Ago'),('09','Sep'),('10','Oct'),('11','Nov'),('12','Dic')], - mes_actual, - anios_disponibles, - anio_actual + fecha_inicio, + fecha_fin ) }} {% if workers_data %}
diff --git a/templates/admin_report_iva.html b/templates/admin_report_iva.html index 34bf7bd..359a0ce 100644 --- a/templates/admin_report_iva.html +++ b/templates/admin_report_iva.html @@ -16,14 +16,11 @@
{{ report_filters( - url_for('admin.report_modulo_periodo', modulo_id=modulo_id), + url_for('admin.report_modulo_calculo_iva', modulo_id=modulo_id), workers_list, worker_actual, - dia_actual, - [('01','Ene'),('02','Feb'),('03','Mar'),('04','Abr'),('05','May'),('06','Jun'),('07','Jul'),('08','Ago'),('09','Sep'),('10','Oct'),('11','Nov'),('12','Dic')], - mes_actual, - anios_disponibles, - anio_actual + fecha_inicio, + fecha_fin ) }}
diff --git a/templates/admin_report_modulo.html b/templates/admin_report_modulo.html index 14713c6..d07e920 100644 --- a/templates/admin_report_modulo.html +++ b/templates/admin_report_modulo.html @@ -55,11 +55,8 @@ url_for('admin.report_modulo_periodo', modulo_id=modulo_id), workers_list, worker_actual, - dia_actual, - [('01','Ene'),('02','Feb'),('03','Mar'),('04','Abr'),('05','May'),('06','Jun'),('07','Jul'),('08','Ago'),('09','Sep'),('10','Oct'),('11','Nov'),('12','Dic')], - mes_actual, - anios_disponibles, - anio_actual + fecha_inicio, + fecha_fin ) }}
diff --git a/templates/admin_workers.html b/templates/admin_workers.html index 15f0e23..7577494 100644 --- a/templates/admin_workers.html +++ b/templates/admin_workers.html @@ -1,53 +1,20 @@ {% extends "macros/base.html" %} -{% from 'macros/modals.html' import confirm_modal, edit_worker_modal %} +{% from 'macros/modals.html' import confirm_modal, edit_worker_modal, add_worker_modal %} {% from "macros/ui.html" import flashed_messages %} {% block title %}Gestión de Trabajadores{% endblock %} {% block content %} -

Gestión de Trabajadores

- {{ flashed_messages() }} -{{ edit_worker_modal(modulos) }} +{{ edit_worker_modal(modulos, bancos) }} +{{ add_worker_modal(modulos, bancos) }} -
-
Agregar Nuevo Trabajador
-
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
+
+

Gestión de Trabajadores

+
@@ -88,6 +55,10 @@ Teléfono Módulo Tipo + Banco + N° Cuenta + RUT Cuenta + Tipo Cuenta Acciones @@ -103,6 +74,10 @@ {{ worker[6] }} + {{ worker[7] or '-' }} + {{ worker[8] or '-' }} + {{ worker[10] or '-' }} + {{ worker[9] or '-' }} @@ -132,7 +111,7 @@ {% else %} - No hay trabajadores registrados. + No hay trabajadores registrados. {% endfor %} diff --git a/templates/macros/modals.html b/templates/macros/modals.html index 46fe42d..ca19025 100644 --- a/templates/macros/modals.html +++ b/templates/macros/modals.html @@ -82,7 +82,7 @@
{% endmacro %} -{% macro edit_worker_modal(modulos) %} +{% macro edit_worker_modal(modulos, bancos) %}