Files
mini-erp/mini-backend/routers/series.py
T
GeorgeandClaude Sonnet 5 fef21898f9 Backport de mejoras genéricas de backend (desde cliente/tagumedica) + limpieza de datos de cliente en main
Mejoras genéricas traídas:
- core/crud_router.py: el PATCH genérico reenvía cualquier header B1S-* recibido del caller en vez de decidirlo el backend.
- routers/catalogs.py: nuevo endpoint /api/Catalogs/UdfValidValues (valores válidos de cualquier UDF vía Service Layer).
- routers/batch.py: /api/batch/stock (stock de un lote por almacén) y /api/batch/lot-source-warehouse (resuelve contra HANA de qué almacén salió un lote, repartiendo por origen).
- routers/inventory_transfer_requests.py + core/inventory_transfer_requests.py: CRUD genérico de Solicitudes de Transferencia de Inventario.
- routers/series.py + core/series.py: series activas de un tipo de documento.
- routers/user_tables.py: catálogo Code/Name genérico de tablas de usuario (mapeo USER_TABLES vacío, cada cliente completa el suyo).
- routers/reports.py / templates/reports/stickers.html: fix de márgenes/alto de página del reporte de etiquetas.
- mini-backend/test/ -> mini-backend/tools/ (rename organizativo).

Limpieza de datos de Tagumedica que ya estaban en el commit base de main (anteriores a la branch cliente/tagumedica, no relacionados con el backport):
- tools/sap-tagumedica/sl.http: eliminado (tenía CompanyDB y password reales).
- tools/ApiGateway/Login.yml: CompanyDB/host/password reemplazados por placeholders.
- templates/reports/stickers.html: título hardcodeado "TAGUMEDICA" reemplazado por "EMPRESA".
- menu_permissions.json: reemplazado por un ejemplo demo (usuarios/módulos ficticios) en vez de emails reales.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-28 14:18:42 -05:00

35 lines
995 B
Python

from typing import List, Optional
from fastapi import APIRouter
from pydantic import BaseModel
from core.series import get_active_series, get_default_series
router = APIRouter(tags=["Series"])
class SeriesOption(BaseModel):
Series: int
Name: str
class SeriesListResponse(BaseModel):
Default: Optional[int] = None
Options: List[SeriesOption]
@router.get("/api/series", response_model=SeriesListResponse)
async def list_series(document: str):
"""
Series activas (no bloqueadas) y serie por defecto para un tipo de
documento de SAP B1. `document` es el código BoObjectTypes del
documento (ej. "1250000001" para Solicitud de Transferencia); lo define
cada módulo que lo consuma, no este router.
"""
active_series = get_active_series(document)
options = [
{"Series": s["Series"], "Name": s.get("Name") or str(s["Series"])}
for s in active_series
]
return {"Default": get_default_series(document), "Options": options}