@app.
post("/ventas/nueva")
def registrar_venta(venta: RegistroVenta, db: Session = Depends(get_db)):
prod = [Link](Producto).filter(Producto.codigo_barras == venta.producto_codigo).first()
stock = [Link](Inventario).filter(Inventario.producto_codigo == venta.producto_codigo, Inventario.almacen_id == venta.almacen_id,
[Link] >= [Link]).first()
if not stock: raise HTTPException(status_code=400, detail="Sin stock")
[Link] -= [Link]
total = [Link] * [Link]
[Link](Venta(vendedor_id=venta.vendedor_id, dueno_producto_id=stock.dueno_producto_id, producto_codigo=venta.producto_codigo,
cantidad=[Link], total_dinero=total))
if venta.vendedor_id != stock.dueno_producto_id:
vendedor = [Link](Usuario).filter([Link] == venta.vendedor_id).first()
[Link](Notificacion(usuario_destino_id=stock.dueno_producto_id, mensaje=f"¡Aviso! {[Link]} vendió {[Link]} de tus
{[Link]}."))
[Link]()
return {"mensaje": "Venta exitosa"}
@[Link]("/notificaciones/{uid}")
def leer_notis(uid: int, db: Session = Depends(get_db)):
return [Link](Notificacion).filter(Notificacion.usuario_destino_id == uid, [Link] == False).all()
# --- RUTAS ADMIN ---
@[Link]("/admin/reset-password", dependencies=[Depends(verificar_acceso_maestro)])
def cambiar_password(solicitud: CambioPasswordSimple, db: Session = Depends(get_db)):
u = [Link](Usuario).filter([Link] == solicitud.nombre_usuario_objetivo).first()
if not u: raise HTTPException(status_code=404, detail="Usuario no existe")
u.hashed_password = encriptar_password(solicitud.nueva_password)
[Link]()
return {"mensaje": "Contraseña actualizada"}
@[Link]("/admin/reporte-ventas", dependencies=[Depends(verificar_acceso_maestro)])
def reporte(filtro: FiltroReporte, db: Session = Depends(get_db)):
q = [Link](Venta).filter([Link] >= filtro.fecha_inicio, [Link] <= filtro.fecha_fin)
if filtro.usuario_id: q = [Link](Venta.dueno_producto_id == filtro.usuario_id)
ventas = [Link]()
return {"total_recaudado": sum(v.total_dinero for v in ventas), "detalle": [{"prod": [Link], "total": v.total_dinero} for v in ventas]}
# --- NUEVO: RUTA PARA FORZAR RESPALDO POR CORREO ---
@[Link]("/admin/forzar-respaldo", dependencies=[Depends(verificar_acceso_maestro)])
async def forzar_respaldo(background_tasks: BackgroundTasks):
# Esto ejecuta el envío en segundo plano para no trabar la app
background_tasks.add_task(enviar_correo_respaldo)
return {"mensaje": "El respaldo se está enviando a tu correo en segundo plano."}