# Flujo de Procesamiento — Detalle de Lotes
## Arquitectura General
```mermaid
graph TB
subgraph "Frontend React (sap-frontend)"
RT[Router App.tsx]
VISTA[BatchNumberDetails.tsx]
FORM[BatchForm.tsx]
LIST[BatchNumberDetailsList.tsx]
LIST_TMPL[ListViewTemplate.tsx]
UI_FF[FormattedField.tsx]
UI_SEL[SelectField.tsx]
UI_TABLE[DenseTable.tsx]
API[api.ts]
ENUMS[enums.ts]
TYPES[types/sapBatch.ts]
end
subgraph "Backend FastAPI (mini-backend)"
ROUTER[routers/batch.py]
CORE[core/sap.py
forward_to_sapb1]
end
subgraph "SAP Business One"
SL[Service Layer
BatchNumberDetails]
end
RT --> VISTA
RT --> LIST
VISTA --> FORM
LIST --> LIST_TMPL
FORM --> UI_FF
FORM --> UI_SEL
FORM --> API
FORM --> ENUMS
FORM --> TYPES
LIST_TMPL --> UI_TABLE
LIST_TMPL --> API
API -->|GET/PATCH| ROUTER
ROUTER -->|proxy| CORE
CORE -->|B1SESSION| SL
```
## Flujo Vista de Lista → Editar Lote
```mermaid
sequenceDiagram
actor User as Usuario
participant Router as App.tsx
participant ListView as BatchNumberDetailsList
participant LVT as ListViewTemplate
participant DTable as DenseTable
participant DetailView as BatchNumberDetails
participant Form as BatchForm
participant API as api.ts
participant Backend as backend batch.py
participant SAP as SAP Service Layer
User->>Router: /inventario/lotes
Router->>ListView: render
ListView->>LVT:
LVT->>API: GET /api/BatchNumberDetails?skip=0&top=50&fields=...
API->>Backend: fetch con X-Session-Token
Backend->>SAP: GET BatchNumberDetails (con B1SESSION)
SAP-->>Backend: JSON con datos
Backend-->>API: JSON response
API-->>LVT: json.value[]
LVT->>DTable: render rows
DTable-->>User: tabla con lotes
User->>DTable: clic en editar (lote 2032586)
DTable->>Router: navigate("/inventario/lotes/mantenimiento?code=2032586")
Router->>DetailView: render con searchParams.code
DetailView->>Form:
Form->>API: GET /api/BatchNumberDetails/2032586
API->>Backend: fetch
Backend->>SAP: GET BatchNumberDetails(2032586)
SAP-->>Backend: {Batch, ItemCode, U_SIS_ESTLOT, U_SIS_ESTLIB, ...}
Backend-->>API: JSON raw SAP
API-->>Form: data
Form->>Form: mapSapToFriendly(data)
Note over Form: U_SIS_ESTLOT → EstadoAprobacion
U_SIS_ESTLIB → EstadoLiberacion
U_SIS_FECAPROB → FechaAprobacion
Form->>UI_SEL:
Form->>UI_FF:
Form-->>User: formulario con valores cargados
User->>Form: edita campos y clic "Actualizar Lote"
Form->>API: PATCH /api/BatchNumberDetails/2032586
Note over Form,API: body: {U_SIS_ESTLOT: "102", U_SIS_OBSER: "...", ...}
API->>Backend: fetch PATCH
Backend->>SAP: PATCH BatchNumberDetails(2032586)
SAP-->>Backend: 204 No Content
Backend-->>API: 204
API-->>Form: ok
Form-->>User: "Lote actualizado exitosamente"
```
## Árbol de Componentes
```
App.tsx (BrowserRouter)
├── /login
│ └── SapLogin.tsx
└── / (ProtectedRoute → MainLayout)
└── /inventario
├── /lotes
│ └── BatchNumberDetailsList.tsx
│ └── ListViewTemplate.tsx
│ ├── SearchInput.tsx
│ ├── PrimaryButton.tsx
│ ├── DenseTable.tsx
│ │ └── formatValue() [formatters.ts]
│ └── PaginationBar.tsx
└── /lotes/mantenimiento
└── BatchNumberDetails.tsx
└── BatchForm.tsx
├── FormattedField.tsx (x10)
└── SelectField.tsx (x2)
```
## Mapeo de Nombres SAP → Friendly
El label visible ya no concatena el nombre técnico (antes: "Estado de Aprobación (U_SIS_ESTLOT)", partiéndose en 2 líneas y deformando la grilla). Ahora el label muestra solo el nombre amigable y el campo SAP aparece en un tooltip (ícono ⓘ) vía el prop `dbField` de `FormattedField`/`SelectField` — ver `FieldTooltip.tsx`.
| Campo SAP | Nombre Amigable | Tipo | Componente |
|---|---|---|---|
| `Batch` | `Batch` | display | FormattedField |
| `ItemCode` | `ItemCode` | display | FormattedField |
| `ItemDescription` | `ItemDescription` | display | FormattedField |
| `DocEntry` | `DocEntry` | display | FormattedField |
| `BatchAttribute1` | `BatchAttribute1` | input text | FormattedField |
| `BatchAttribute2` | `BatchAttribute2` | input text | FormattedField |
| `AdmissionDate` | `AdmissionDate` | display date | FormattedField |
| `ManufacturingDate` | `ManufacturingDate` | display date | FormattedField |
| `ExpirationDate` | `ExpirationDate` | input date | FormattedField |
| `U_SIS_ESTLOT` | `EstadoAprobacion` | select | SelectField |
| `U_SIS_FECAPROB` | `FechaAprobacion` | input date | FormattedField |
| `U_SIS_RESPAPROB` | `ResponsableAprobacion` | input text | FormattedField |
| `U_SIS_OBSER` | `Observaciones` | input text | FormattedField |
| `U_SIS_ESTLIB` | `EstadoLiberacion` | select | SelectField |
| `U_SIS_FECLIB` | `FechaLiberacion` | input date | FormattedField |
| `U_SIS_HORAPROB` | `HoraAprobacion` | input text | FormattedField |
## Archivos Clave
| Archivo | Ruta | Propósito |
|---|---|---|
| `BatchNumberDetails.tsx` | `src/views/inventario/` | Vista detalle, extrae `code` de URL y renderiza `BatchForm` |
| `BatchForm.tsx` | `src/components/` | Formulario edición, fetch + mapeo SAP + PATCH |
| `SelectField.tsx` | `src/components/ui/` | Select reutilizable con `String(value)` para compatibilidad |
| `FormattedField.tsx` | `src/components/ui/` | Campo display/input con formato (fechas, moneda, etc.) |
| `BatchNumberDetailsList.tsx` | `src/views/inventario/` | Lista con columnas SAP directas |
| `ListViewTemplate.tsx` | `src/components/ui/` | Template genérico de listado con paginación/búsqueda |
| `api.ts` | `src/utils/` | Cliente HTTP con sesión, token, timeout |
| `enums.ts` | `src/utils/` | Mapeos enum SAP (BATCH_STATUS_APROB, etc.) |
| `sapBatch.ts` | `src/types/` | Interfaz TypeScript BatchNumberDetail |
| `batch.py` | `mini-backend/routers/` | Rutas FastAPI GET/PATCH BatchNumberDetails |
| `sap.py` | `mini-backend/core/` | Proxy universal a SAP Service Layer |