2026-10-05 17:53:41 -05:00
|
|
|
# ITCA_API_SAP_WMS (.NET) — proyecto principal
|
|
|
|
|
|
|
|
|
|
API de integración WMS ↔ SAP Business One, **ASP.NET Core 3.1**. Para
|
|
|
|
|
build/publish/despliegue en IIS ver [`README.md`](./README.md).
|
|
|
|
|
|
|
|
|
|
Esta carpeta (`backend_octubre`) es **el proyecto vigente**. Antes existía
|
|
|
|
|
una copia paralela, `ITCA_API_SAP_WMS`, con la funcionalidad nueva portada
|
|
|
|
|
desde la reescritura Python; se portó aquí y esa copia quedó **archivada en un
|
|
|
|
|
comprimido (versión antigua)**. No hay `git` en esta carpeta.
|
|
|
|
|
|
|
|
|
|
## Qué se portó desde `ITCA_API_SAP_WMS` (2026-10-05)
|
|
|
|
|
|
|
|
|
|
Detalle técnico en `docs/PORTE_FUNCIONALIDAD_NUEVA.md`,
|
|
|
|
|
`docs/SOLICITUD_TRANSFERENCIA.md` y `docs/PICKING.md`.
|
|
|
|
|
|
|
|
|
|
1. **SolicitudTransferencia**: `PATCH /api/SolicitudTransferencia/{docEntry}` y
|
|
|
|
|
`POST /api/SolicitudTransferencia/{docEntry}/cerrar`.
|
|
|
|
|
2. **Picking diurno/nocturno**: campo `Notificacion` (early-return en
|
2026-10-14 08:47:44 -05:00
|
|
|
`PickingRepository.Create` tras `HelperProcesoPiciking.Set`, **solo para
|
|
|
|
|
`Proceso = "ULTIMA MILLA"`**; DESPACHO/PICKING generan NC sin depender de
|
|
|
|
|
él) y
|
2026-10-05 17:53:41 -05:00
|
|
|
`POST /api/Picking/HojaRuta/{docEntry}/Cerrar`.
|
|
|
|
|
3. **`ConnectionServiceLayer`**: `PatchNoContentAsync` y `PostActionAsync`
|
|
|
|
|
(métodos nuevos; los existentes no se tocaron).
|
|
|
|
|
|
2026-10-14 08:47:44 -05:00
|
|
|
## Regla Proceso + Notificacion (v2.1.2.0)
|
|
|
|
|
|
|
|
|
|
`Notificacion = "cierre"` se exige **solo si `Proceso = "ULTIMA MILLA"`**
|
|
|
|
|
(si no, solo actualiza estado en HANA). `DESPACHO` y `PICKING` generan NC y
|
|
|
|
|
transferencias siempre, sin depender de `Notificacion`. Detalle y tabla en
|
|
|
|
|
`docs/PICKING.md`.
|
|
|
|
|
|
2026-10-05 17:53:41 -05:00
|
|
|
## Cambios de configuración y correcciones hechas en esta carpeta
|
|
|
|
|
|
|
|
|
|
- **Credenciales y esquema HANA en `appsettings.json`**, sección `Hana`
|
|
|
|
|
(`server`, `user`, `password`, `schema` opcional), leída por
|
|
|
|
|
`LocalData.Configure` desde `Startup`. Antes estaban fijas en el código
|
|
|
|
|
(`LocalData.cs`, `Log/B_Log.cs`). El esquema sale de `Hana:schema` o, si no
|
|
|
|
|
está, de `SapServiceLayer:company`; **si falta la sección `Hana` o el
|
|
|
|
|
esquema, la app no arranca** (error claro). Ya no hay `DB_NAME` fijo.
|
|
|
|
|
- **Precio promedio solo en entradas** (`TipoMovimiento "01"`) en
|
|
|
|
|
`InventarioRepository.Create` (los dos chequeos: `SubAlmacen` y `Almacen`).
|
|
|
|
|
Si el artículo no tiene stock, se conserva el `PrecioPromedio` del request en
|
|
|
|
|
vez de abortar con *"No existe stock disponible para el articulo X"* (ese
|
|
|
|
|
error bloqueaba ingresos de artículos sin stock previo). En salidas ya no se
|
|
|
|
|
busca el promedio: `PriceAfterVAT` lleva el precio del request. El chequeo de
|
|
|
|
|
stock de la rama de **salida** de `PickingRepository` (~línea 363) no se tocó.
|
|
|
|
|
- **Lote de 100 líneas** (`InventarioRepository.Create`): `var Inventario =
|
|
|
|
|
entidad` reutilizaba el mismo objeto, y con más de 100 líneas se generaban N
|
|
|
|
|
documentos iguales con el último bloque. Ahora se crea una copia por bloque y
|
|
|
|
|
la rama de salida lee `entidad_inventario.Detalle`.
|
|
|
|
|
- **SQL injection**: parametrizadas las consultas de `HelperProcesoPiciking`,
|
|
|
|
|
`HelperStock`, `HelperInventario`, `HelperInvoice`, `HelperCorrelativo`,
|
|
|
|
|
`HelperHojaRuta` y `HelperProcesoPermitido` (`?` + `HanaParameter`).
|
|
|
|
|
El esquema sigue interpolado (viene de configuración, no del request).
|
|
|
|
|
- `ITCA_API_SAP_WMS.xml` ahora se genera también en Release (sin eso Swagger
|
|
|
|
|
revienta con `FileNotFoundException` en un `publish -c Release`).
|
|
|
|
|
|
|
|
|
|
## Funcionalidad propia de esta carpeta (no existe en la copia antigua)
|
|
|
|
|
|
|
|
|
|
Hoja de Ruta (`HojaRutaController`, `HRRepository`, `GlobalDataRepository`),
|
|
|
|
|
reapertura de facturas (`InvoiceRepository.ReOpen`, `PostReOpen`), notas de
|
|
|
|
|
crédito con documentos de referencia, cierre automático de la solicitud de
|
|
|
|
|
traslado en `Transferencia` (`PostClose`), `Latitud`/`Longitud` y reproceso en
|
|
|
|
|
Picking, columna `HORA` en `B_Log`. Lo que **no** se trajo: `Chatbots` y
|
|
|
|
|
`MessageController` (solo existen en la copia archivada).
|
|
|
|
|
|
|
|
|
|
## Sin verificar
|
|
|
|
|
|
|
|
|
|
- **Nada se probó contra SAP/HANA reales.** Solo se verificó que compila
|
|
|
|
|
(0 errores) y que el publish se genera.
|
|
|
|
|
- La sintaxis `CALL "esquema"."proc"(?, ?)` con parámetros no está probada con
|
|
|
|
|
el driver HANA 2.1; si falla con un error de parámetro, mirar primero ahí.
|
|
|
|
|
- Para probar el lote de 100: un inventario de >100 líneas (p. ej. 250) debe
|
|
|
|
|
generar 3 documentos (100/100/50) sin repetir ni perder líneas, tanto en
|
|
|
|
|
entradas como en salidas.
|
|
|
|
|
|
|
|
|
|
## Bugs conocidos, sin corregir
|
|
|
|
|
|
|
|
|
|
- `BE_ResultadoTransaccion<T>.NombreEstacion`: setter con recursión infinita
|
|
|
|
|
(bomba de tiempo; hoy nada lo asigna).
|
|
|
|
|
- `ConnectionServiceLayer.PatchAsyncSBA<T>`: con un `204` real devuelve `null`
|
|
|
|
|
sin marcar éxito. `Login()`/`LoginPost()` duplicados; `throw` inalcanzable
|
|
|
|
|
tras `return` en varios `catch`.
|
|
|
|
|
- `ValidarCertificado` acepta cualquier certificado TLS (siempre `true`).
|
|
|
|
|
- `HelperDB.SET(string query)` ejecuta SQL arbitrario; hoy sin llamadores
|
|
|
|
|
(candidato a borrar).
|
|
|
|
|
- `appsettings.json` versionado en texto plano con credenciales reales
|
|
|
|
|
(SAP Service Layer, **HANA `B1ADMIN`**, semilla JWT). Rotar la contraseña de
|
|
|
|
|
`B1ADMIN` (estuvo en el código fuente) y evaluar un usuario HANA de mínimos
|
|
|
|
|
permisos.
|
|
|
|
|
|
|
|
|
|
## Despliegue
|
|
|
|
|
|
|
|
|
|
Sitio IIS previsto: **`/integracion`** (antes `/integracion_wms`). Publicar con
|
|
|
|
|
el comando del README **sin pisar** el `appsettings.json` del servidor; agregar
|
|
|
|
|
a ese archivo la sección `Hana` y revisar `SapServiceLayer:company` (determina
|
|
|
|
|
contra qué base lee y escribe). El `web.config` generado por `dotnet publish`
|
|
|
|
|
usa `processPath=".\ITCA_API_SAP_WMS.exe"`; el del código fuente apunta a
|
|
|
|
|
`bin\Debug\...` (solo para sitios que corren desde el código compilado).
|
|
|
|
|
|
|
|
|
|
## Pendiente
|
|
|
|
|
|
|
|
|
|
- Probar en QA: endpoints nuevos (SolicitudTransferencia, `Notificacion`,
|
|
|
|
|
`HojaRuta/Cerrar`), un ingreso sin stock previo, el lote de 100 y las
|
|
|
|
|
consultas parametrizadas.
|
|
|
|
|
- Verificar que existan en el esquema del sitio los procedimientos `ITCA_*`
|
|
|
|
|
y las tablas `@ITCA_PROWMS`, `@SYP_MOTIVOS`, `@SYP_NUMDOC`.
|
|
|
|
|
- Decidir si se corrigen los bugs de la lista de arriba.
|