From 23f1a3df44b3166c1e9e2442f117efbfb0944729 Mon Sep 17 00:00:00 2001 From: George Date: Wed, 14 Oct 2026 19:17:14 -0500 Subject: [PATCH] Actualizar CLAUDE.md y README.md: git y remoto, version 2.1.7.0, appsettings fuera de git, logs, pendientes Co-Authored-By: Claude Sonnet 5.5 --- CLAUDE.md | 48 +++++++++++++++++++++++++++++++++++++++++------- README.md | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 10 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 3cdeb88..a8a578a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,10 +3,24 @@ 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 +Esta carpeta (`ITCA_API_SAP_WMS`, antes `backend_octubre`) es **el proyecto +vigente**. Antes existía una copia paralela 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. +comprimido (versión antigua)**. + +## Versión y control de versiones + +- **Versión actual: 2.1.7.0** (`Net.Business.Services.csproj`: `Version`, + `AssemblyVersion`, `FileVersion`). Cada versión tiene su commit; al publicar + se sube la versión (ver `publicar.ps1`). +- **Git**: rama `main`, remoto `origin` = + `http://100.68.242.27:30000/george/itca_api_sap_wms.git` (HTTP sin cifrar, + red interna; confirmar que el repositorio sea **privado**). Etiqueta + `v2.1.7.0` = último estado antes de la limpieza de código. +- `appsettings.json` y `appsettings.*.json` están en `.gitignore` (solo se + versiona `appsettings.example.json`); las credenciales no están en el + historial (verificado con `git log -S`). +- Los publish (`dist/`, zip del escritorio) no se versionan. ## Qué se portó desde `ITCA_API_SAP_WMS` (2026-10-05) @@ -130,10 +144,21 @@ Picking, columna `HORA` en `B_Log`. Lo que **no** se trajo: `Chatbots` y - `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. +- `appsettings.json` (fuera de git, en `.gitignore`) contiene credenciales + reales en texto plano (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. +- Los logs (`B_Log` y `HelperLogServiceLayer`) escriben en el esquema fijo + `ITC_WMS_SAP` (`ITCA_LOG_INTEGRACION`), no en `LocalData.Schema`; si la tabla + está en otro esquema el `INSERT` falla. `B_Log.Add` no tiene `try/catch`, así + que un fallo del log puede devolver 500 tras haber creado el documento en SAP. +- Código sin uso (limpieza prevista en 2.1.8.0): `CancelAsyncSBA`, + `DeleteAsyncSBA`, `Logout`, `ValidarCertificado`, `HelperDB.SET`; 11 + propiedades de `RepositoryWrapper` que ningún controller usa + (`CreditNotes`, `InvoiceRepository`, `ReturnRequest`, `StockTransfer`, etc.); + `TotalDetalle_Parcial` y `var _Invoice` (bloque PICKING) en + `PickingRepository`; `SerieOrigen` en `ReciboRepository`; el `if` vacío tras + `StockTransfer` en Picking (un fallo de la transferencia se ignora). ## Despliegue @@ -152,3 +177,12 @@ usa `processPath=".\ITCA_API_SAP_WMS.exe"`; el del código fuente apunta a - 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. +- Validar con contabilidad la serie de NC de boletas (`BC10`) en Recibo y si ya + hay NC de boletas emitidas con `FC10` antes de la 2.1.7.0. +- Recibo (Devolución) no genera transferencias por almacén destino: nunca llena + `U_ITC_ALMDES` en las líneas de la NC. +- Confirmar en QA el log de errores del Service Layer (provocar un rechazo y + ver la fila con `PROCESO = 'ServiceLayer Error'`) y el esquema de la tabla de + log en cada servidor. +- Confirmar el repositorio remoto como privado; hacer la limpieza de código en + una rama aparte (2.1.8.0) partiendo de la etiqueta `v2.1.7.0`. diff --git a/README.md b/README.md index aafadd6..dda0b3d 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,10 @@ API de integración WMS ↔ SAP Business One (Service Layer + HANA directo), (ruta hardcodeada vía `HintPath` en los `.csproj` de `Net.Data` y `Net.Business.Services` — sin esto no compila ningún proyecto que dependa de HANA). -- **Compilar desde macOS/Linux**: el `HintPath` es relativo (6 niveles hacia +- **Compilar desde macOS/Linux** (forma simple): pasar la ruta de la DLL con + `-p:HanaDll=/Sap.Data.Hana.Core.v2.1.dll` a `dotnet build`/`publish` + (los `.csproj` usan esa propiedad si está definida). Forma alternativa: el + `HintPath` es relativo (6 niveles hacia arriba + `Program Files\sap\...`). Se puede compilar copiando el repo a `/a/b/c/d/repo/` y poniendo la DLL en `/Program Files/sap/hdbclient/dotnetcore/v2.1/` — así el `HintPath` @@ -70,6 +73,35 @@ dotnet publish Net.Business.Services/Net.Business.Services.csproj -c Release -r `web.config` del código fuente (ese apunta a `bin\Debug\...`, es el de desarrollo) a una carpeta de publish. +## Versión y script de publish + +- La versión sale de ``/``/`` en + `Net.Business.Services/Net.Business.Services.csproj` (actual: **2.1.7.0**); + súbela en cada publish. +- `publicar.ps1` (solo Windows) genera `dist\ITCA_API_SAP_WMS_v.zip` sin + `appsettings.json`. Desde macOS se hace el mismo `dotnet publish` a mano con + `-p:HanaDll=...`, se borran `appsettings.json`/`appsettings.Development.json` de + la salida y se comprime. +- Control de versiones: rama `main` y etiquetas `vX.Y.Z.W` por versión + publicada (ver `CLAUDE.md`). + +## Logs de integración + +- **`B_Log`** (controllers): en cada llamada guarda en + `ITC_WMS_SAP.ITCA_LOG_INTEGRACION` el request del WMS (`TRAMA_ORIGEN`) y la + respuesta de la API (`TRAMA_RESPUESTA`), con `PROCESO` (Picking, Recibo...), + `NRO_ORDEN`, `DOCENTRY`, `DOCNUMSAP` y `DOCENTRYSAP`. +- **Log de errores del Service Layer** (desde 2.1.5.0): cuando SAP rechaza un + envío con cuerpo JSON (`PostAsync`, `PatchAsyncSBA`, `PatchNoContentAsync`) + se guarda en esa misma tabla el JSON enviado y el mensaje de SAP, con + `PROCESO = 'ServiceLayer Error'`, `NRO_ORDEN` = ruta del recurso y `DOCENTRY` + = `BaseEntry` del documento base. Solo en error; no cambia la respuesta de la + API. +- Ambos usan el esquema fijo `ITC_WMS_SAP` (columnas `PROCESO`, `NRO_ORDEN` y + `DOCENTRY` son `VARCHAR(100)`). +- Consulta de ejemplo: + `SELECT * FROM "ITC_WMS_SAP"."ITCA_LOG_INTEGRACION" WHERE "PROCESO" = 'ServiceLayer Error' ORDER BY "FECHA" DESC, "HORA" DESC` + ## Desplegar/actualizar un sitio en IIS ### Si el sitio YA corre desde una carpeta de publish (actualización de versión) @@ -137,8 +169,8 @@ para armar el body del `Login` contra el Service Layer. ## Riesgos de seguridad heredados (documentados, no corregidos sin coordinar antes) - `appsettings.json` tiene credenciales reales en texto plano (SAP Service - Layer, **HANA `B1ADMIN`**, semilla JWT) — no hay `git` en esta carpeta; si alguna vez se versiona o se sube - a un remoto compartido, hay que decidir qué hacer con ese archivo primero. + Layer, **HANA `B1ADMIN`**, semilla JWT). Está en `.gitignore` y no se + versiona (solo `appsettings.example.json`); no subirlo a ningún repositorio. - `B1ADMIN` es un usuario administrador de SAP B1; la API solo necesita ejecutar los `ITCA_*` y leer algunas tablas. Conviene un usuario HANA de permisos mínimos y rotar la contraseña (estuvo en texto plano en el código