From d7676dee41f3a34b7ffa259ff509946baf2f5a49 Mon Sep 17 00:00:00 2001 From: George Date: Mon, 19 Oct 2026 16:59:31 -0500 Subject: [PATCH] Version 2.1.15.0: avisar en el Message si falla la transferencia automatica de la NC Co-Authored-By: Claude Sonnet 5.5 --- CLAUDE.md | 11 ++++++++--- .../Net.Business.Services.csproj | 2 +- .../TransferenciaAutomaticaNC.cs | 19 +++++++++++++++++-- Net.Data/WMS/Picking/PickingRepository.cs | 8 ++++---- Net.Data/WMS/Recibo/ReciboRepository.cs | 4 ++-- 5 files changed, 32 insertions(+), 12 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 1eeba76..ea2c9ca 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -10,7 +10,7 @@ comprimido (versión antigua)**. ## Versión y control de versiones -- **Versión actual: 2.1.14.0** (rama `limpieza-2.1.8.0`; `main` = 2.1.7.0) (`Net.Business.Services.csproj`: `Version`, +- **Versión actual: 2.1.15.0** (rama `limpieza-2.1.8.0`; `main` = 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` = @@ -151,6 +151,13 @@ transferencias siempre, sin depender de `Notificacion`. Detalle y tabla en lo tomaba como fallo. Ahora el éxito es éxito y un rechazo de SAP lanza su mensaje (se captura y devuelve como error; `Crear` sigue ignorando el resultado). Sigue sin reintentar el 401 (hace login antes de cada llamada). Los docs de `docs/PORTE_FUNCIONALIDAD_NUEVA.md` y `docs/SOLICITUD_TRANSFERENCIA.md` mencionan `PatchAsyncSBA` como historia del porte. +- **v2.1.15.0 — se avisa al consumidor si falla la transferencia automática**: `TransferenciaAutomaticaNC.Crear` devuelve un + texto de advertencia (vacío si todo salió bien) cuando SAP rechaza una transferencia o no se puede agregar su referencia a + la NC. Los 3 llamadores (Picking DESPACHO y PICKING, Recibo Devolución) lo agregan al `Message` de la respuesta + (`"Se registro correctamente...!!! ADVERTENCIA: la nota de credito se creo, pero no se creo la transferencia A -> B: ."`). + La respuesta sigue siendo 200 con el DocEntry/DocNum de la NC (la NC existe en SAP; responder 500 haría que el WMS + reintente y duplique la NC). El consumidor debe leer el `Message`. El detalle del rechazo también queda en `ITCA_LOG_INTEGRACION` + (`ServiceLayer Error`). Sin probar contra SAP. - Sin probar contra SAP: confirmar con la factura 292410 que SAP devuelve `BaseType`/`BaseEntry` en las líneas y `BatchNumbers` en las de la Entrega. @@ -213,8 +220,6 @@ Picking, columna `HORA` en `B_Log`. Lo que **no** se trajo: `Chatbots` y `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. -- Si una transferencia automática de stock falla (`TransferenciaAutomaticaNC.Crear`), - el fallo se ignora (la NC ya está creada) y no se informa al consumidor. ## Despliegue diff --git a/Net.Business.Services/Net.Business.Services.csproj b/Net.Business.Services/Net.Business.Services.csproj index 87f106f..b483548 100644 --- a/Net.Business.Services/Net.Business.Services.csproj +++ b/Net.Business.Services/Net.Business.Services.csproj @@ -3,7 +3,7 @@ netcoreapp3.1 ITCA_API_SAP_WMS - 2.1.14.0 + 2.1.15.0 2.1.12.0 2.1.12.0 24763424-3300-4c85-87e3-503f8fdebd14 diff --git a/Net.Data/ServicesLayer/StockTransfer/TransferenciaAutomaticaNC.cs b/Net.Data/ServicesLayer/StockTransfer/TransferenciaAutomaticaNC.cs index becfe4b..5dfe800 100644 --- a/Net.Data/ServicesLayer/StockTransfer/TransferenciaAutomaticaNC.cs +++ b/Net.Data/ServicesLayer/StockTransfer/TransferenciaAutomaticaNC.cs @@ -16,11 +16,14 @@ namespace Net.Data.ServicesLayer.StockTransfer // Por cada almacen de origen (WarehouseCode) y almacen destino (U_ITC_ALMDES) distintos de las lineas de la NC // crea una transferencia de stock en SAP, con las cantidades y lotes de esas lineas y la NC como referencia. // Luego agrega a la NC una referencia por cada transferencia creada. - // OJO: si SAP rechaza una transferencia se ignora (la NC ya esta creada) y no se informa al consumidor. - public static void Crear(BE_CreditNotesNotes creditNotesNotes, int docEntryNC, IHttpClientFactory clientFactory, IConfiguration configuration, CreditNotesRepository creditNotesRepository) + // La NC ya esta creada, asi que un fallo aqui NO la deshace ni responde error (el consumidor reintentaria y + // duplicaria la NC). Devuelve el texto de advertencia para el mensaje de la respuesta ("" si todo salio bien): + // transferencias que SAP rechazo y/o la referencia que no se pudo agregar a la NC. + public static string Crear(BE_CreditNotesNotes creditNotesNotes, int docEntryNC, IHttpClientFactory clientFactory, IConfiguration configuration, CreditNotesRepository creditNotesRepository) { List ListaUnicaAlmacen = creditNotesNotes.DocumentLines.Select(x => x.WarehouseCode).Distinct().ToList(); List ListDocEntry = new List(); + List Advertencias = new List(); ListaUnicaAlmacen.ForEach(Almacen => { List ListaUnicaAlmDestino = creditNotesNotes.DocumentLines.Where(Linea => Linea.WarehouseCode == Almacen).ToList().Select(x => x.U_ITC_ALMDES).Distinct().ToList().Where(x => !string.IsNullOrEmpty(x)).ToList(); @@ -83,6 +86,10 @@ namespace Net.Data.ServicesLayer.StockTransfer { ListDocEntry.Add((int)ResultTransfer.Data.DocEntry); } + else + { + Advertencias.Add($"no se creo la transferencia {Almacen} -> {Destino}: {ResultTransfer.Message}"); + } } }); }); @@ -108,7 +115,15 @@ namespace Net.Data.ServicesLayer.StockTransfer }; var Actualizacion = creditNotesRepository.UpdateCreateCreditNotes(credit, docEntryNC).Result; + if (Actualizacion.StatusCode == -1) + { + Advertencias.Add($"se crearon las transferencias {string.Join(", ", ListDocEntry)} pero no se pudo agregar su referencia a la NC: {Actualizacion.Message}"); + } } + + return Advertencias.Count == 0 + ? "" + : " ADVERTENCIA: la nota de credito se creo, pero " + string.Join("; ", Advertencias) + "."; } } } diff --git a/Net.Data/WMS/Picking/PickingRepository.cs b/Net.Data/WMS/Picking/PickingRepository.cs index a6de160..958f824 100644 --- a/Net.Data/WMS/Picking/PickingRepository.cs +++ b/Net.Data/WMS/Picking/PickingRepository.cs @@ -282,8 +282,8 @@ namespace Net.Data.WMS.Picking else { // Transferencias de stock automaticas por almacen destino (U_ITC_ALMDES) y su referencia en la NC - TransferenciaAutomaticaNC.Crear(creditNotesNotes, (int)result_creditNotesRepository.Data.DocEntry, _clientFactory, _configuration, _creditNotesRepository); - return resultadoTransaccion.GetInformacionResultado((int)result_creditNotesRepository.Data.DocEntry, result_creditNotesRepository.Data.DocNum.ToString(), "Se registro correctamente...!!!", entidad); + var advertenciaTransferencias = TransferenciaAutomaticaNC.Crear(creditNotesNotes, (int)result_creditNotesRepository.Data.DocEntry, _clientFactory, _configuration, _creditNotesRepository); + return resultadoTransaccion.GetInformacionResultado((int)result_creditNotesRepository.Data.DocEntry, result_creditNotesRepository.Data.DocNum.ToString(), "Se registro correctamente...!!!" + advertenciaTransferencias, entidad); } } else @@ -464,8 +464,8 @@ namespace Net.Data.WMS.Picking { // Transferencias de stock automaticas por almacen destino (U_ITC_ALMDES) y su referencia en la NC - TransferenciaAutomaticaNC.Crear(creditNotesNotes, (int)result_creditNotesRepository.Data.DocEntry, _clientFactory, _configuration, _creditNotesRepository); - return resultadoTransaccion.GetInformacionResultado((int)result_creditNotesRepository.Data.DocEntry, result_creditNotesRepository.Data.DocNum.ToString(), "Se registro correctamente...!!!", entidad); + var advertenciaTransferencias = TransferenciaAutomaticaNC.Crear(creditNotesNotes, (int)result_creditNotesRepository.Data.DocEntry, _clientFactory, _configuration, _creditNotesRepository); + return resultadoTransaccion.GetInformacionResultado((int)result_creditNotesRepository.Data.DocEntry, result_creditNotesRepository.Data.DocNum.ToString(), "Se registro correctamente...!!!" + advertenciaTransferencias, entidad); } } else diff --git a/Net.Data/WMS/Recibo/ReciboRepository.cs b/Net.Data/WMS/Recibo/ReciboRepository.cs index c15bb40..dfe7eeb 100644 --- a/Net.Data/WMS/Recibo/ReciboRepository.cs +++ b/Net.Data/WMS/Recibo/ReciboRepository.cs @@ -531,8 +531,8 @@ namespace Net.Data.WMS.Recibo { // Transferencias de stock automaticas por almacen destino (U_ITC_ALMDES). OJO: en Recibo las lineas de la NC no llenan // U_ITC_ALMDES, por lo que hoy no se genera ninguna - TransferenciaAutomaticaNC.Crear(creditNotesNotes, (int)result_creditNotesRepository.Data.DocEntry, _clientFactory, _configuration, _creditNotesRepository); - return resultadoTransaccion.GetInformacionResultado((int)result_creditNotesRepository.Data.DocEntry, result_creditNotesRepository.Data.DocNum.ToString(), "Se registro correctamente...!!!", entidad); + var advertenciaTransferencias = TransferenciaAutomaticaNC.Crear(creditNotesNotes, (int)result_creditNotesRepository.Data.DocEntry, _clientFactory, _configuration, _creditNotesRepository); + return resultadoTransaccion.GetInformacionResultado((int)result_creditNotesRepository.Data.DocEntry, result_creditNotesRepository.Data.DocNum.ToString(), "Se registro correctamente...!!!" + advertenciaTransferencias, entidad); } }