93 lines
3.5 KiB
Python
93 lines
3.5 KiB
Python
from datetime import date
|
|
from sqlalchemy import func
|
|
from sqlalchemy.orm import aliased
|
|
from models.models import db, Rendicion, RendicionItem, Worker, Modulo, Zona, Producto
|
|
|
|
|
|
def get_filter_catalogs():
|
|
workers = db.session.query(
|
|
Worker.id, Worker.name, Worker.tipo, Worker.modulo_id,
|
|
).filter(Worker.is_admin == False).order_by(Worker.name).all()
|
|
|
|
modulos = db.session.query(
|
|
Modulo.id, Modulo.name, Modulo.zona_id,
|
|
).order_by(Modulo.name).all()
|
|
|
|
zonas = db.session.query(Zona.id, Zona.name).order_by(Zona.name).all()
|
|
|
|
anios_rows = db.session.query(
|
|
func.strftime('%Y', Rendicion.fecha).label('anio'),
|
|
).distinct().order_by(func.strftime('%Y', Rendicion.fecha).desc()).all()
|
|
anios_disponibles = [row[0] for row in anios_rows] if anios_rows else [str(date.today().year)]
|
|
if str(date.today().year) not in anios_disponibles:
|
|
anios_disponibles.insert(0, str(date.today().year))
|
|
|
|
return workers, modulos, zonas, anios_disponibles
|
|
|
|
|
|
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 = [
|
|
Rendicion.fecha >= inicio,
|
|
Rendicion.fecha <= fin,
|
|
]
|
|
if zona_id:
|
|
filters.append(Modulo.zona_id == zona_id)
|
|
if modulo_id:
|
|
filters.append(Rendicion.modulo_id == modulo_id)
|
|
|
|
rendiciones = db.session.query(
|
|
Rendicion.id,
|
|
Rendicion.fecha,
|
|
Worker.name.label('worker_name'),
|
|
Modulo.name.label('modulo_name'),
|
|
Rendicion.venta_debito, Rendicion.venta_credito,
|
|
Rendicion.venta_mp, Rendicion.venta_efectivo,
|
|
Rendicion.gastos, Rendicion.observaciones,
|
|
Companion.name.label('companion_name'),
|
|
Rendicion.worker_id, Rendicion.companion_id, Rendicion.modulo_id,
|
|
Rendicion.worker_comision, Rendicion.companion_comision,
|
|
Rendicion.boletas_debito, Rendicion.boletas_credito,
|
|
Rendicion.boletas_mp, Rendicion.boletas_efectivo,
|
|
).join(Worker, Rendicion.worker_id == Worker.id
|
|
).join(Modulo, Rendicion.modulo_id == Modulo.id
|
|
).outerjoin(Companion, Rendicion.companion_id == Companion.id
|
|
).filter(*filters
|
|
).order_by(Rendicion.fecha.desc(), Rendicion.id.desc()).all()
|
|
|
|
if not rendiciones:
|
|
return []
|
|
|
|
rendicion_ids = [r.id for r in rendiciones]
|
|
items_rows = db.session.query(
|
|
Producto.name,
|
|
RendicionItem.cantidad,
|
|
RendicionItem.precio_historico,
|
|
RendicionItem.comision_historica,
|
|
(RendicionItem.cantidad * RendicionItem.precio_historico).label('total_linea'),
|
|
(RendicionItem.cantidad * RendicionItem.comision_historica).label('total_comision'),
|
|
RendicionItem.id,
|
|
RendicionItem.rendicion_id,
|
|
).join(Producto, RendicionItem.producto_id == Producto.id
|
|
).filter(RendicionItem.rendicion_id.in_(rendicion_ids)).all()
|
|
|
|
items_by_rendicion = {}
|
|
for it in items_rows:
|
|
items_by_rendicion.setdefault(it.rendicion_id, []).append(
|
|
(it[0], it[1], it[2], it[3], it.total_linea, it.total_comision, it.id),
|
|
)
|
|
|
|
rendiciones_completas = []
|
|
for r in rendiciones:
|
|
items = items_by_rendicion.get(r.id, [])
|
|
total_calculado = sum(item[4] for item in items)
|
|
comision_total = sum(item[5] for item in items)
|
|
rendiciones_completas.append(tuple(r) + (items, total_calculado, comision_total))
|
|
|
|
return rendiciones_completas
|