diff --git a/WebLab/Protocolos/ProtocoloEdit2.aspx.cs b/WebLab/Protocolos/ProtocoloEdit2.aspx.cs index 81d5c3f..9a49dd9 100644 --- a/WebLab/Protocolos/ProtocoloEdit2.aspx.cs +++ b/WebLab/Protocolos/ProtocoloEdit2.aspx.cs @@ -1111,12 +1111,16 @@ private void MostrarDeterminaciones(Protocolo oRegistro) crit.AddOrder(Order.Asc("IdDetalleProtocolo")); IList items = crit.List(); - string pivot = ""; + string pivot = ""; string sDatos = ""; - + HashSet pivote = new HashSet(); + foreach (DetalleProtocolo oDet in items) { - if (pivot != oDet.IdItem.Nombre) + //Debo cambiar la manera que verifica los repetidos, porque ahora cuando se regenera un subItem el IdDetalleProtocolo no es secuencial + //Y en la vista del protocolo se ve "duplicado" + //if (pivot != oDet.IdItem.Nombre) + if (pivote.Add(oDet.IdItem.Nombre)) // Si Add devuelve True es porque lo agrego porque no hay duplicados { /*if (sDatos == "") sDatos = oDet.IdItem.Codigo + "#" + oDet.TrajoMuestra + "#" + oDet.ConResultado; @@ -2673,6 +2677,8 @@ private void GuardarDetalle(Business.Data.Laboratorio.Protocolo oRegistro) { /// si cambió la marca de sin muetsra foreach (DetalleProtocolo oDetalle in listadetalle) { + + if (trajomuestra == "true") /// es no trajo { if (oDetalle.TrajoMuestra == "Si") // estaba grabado Si @@ -2689,6 +2695,39 @@ private void GuardarDetalle(Business.Data.Laboratorio.Protocolo oRegistro) oDetalle.TrajoMuestra = "Si"; oDetalle.GrabarAuditoriaDetalleProtocolo("Con Muestra", oUser.IdUsuario); oDetalle.Save(); + + /* Bug sobre la edición de determinaciones con la marca “sin muestra”: + * Si se genero el protocolo con un analisis "S/muestra" de una practica no se generan los idItem del diagrama + * (porque GuardarDetallePractica solo actualizaba TrajoMuestra del codigo de la practica) + * Correcion: si en protocolo se cambia a "Con muestra",se regeneran los detalles faltantes de la practica + */ + + if (oDetalle.IdItem == oDetalle.IdSubItem) + { + /* Si ValidadoTotal (en ProtocoloEdit2) cargó idUsuarioValida por un caso de + * "sin muestra" se debe resetear idUsuarioValida para evitar inconsistencias + */ + + //Caso 1: el análisis aún no tiene resultados (simple o compuesto), + if (!oDetalle.ConResultado) + { + oDetalle.IdUsuarioValida = 0; + oDetalle.FechaValida = DateTime.Parse("01/01/1900"); + } + + //Caso 2: Es derivacion. + //Los analisis Derivados no tienen IdUsuarioValida, solo idUsuarioResultado + + if (oDetalle.ResultadoCar == "Pendiente de derivar") + { + oDetalle.IdUsuarioValida = 0; + oDetalle.FechaValida = DateTime.Parse("01/01/1900"); + } + if (oItem.IdCategoria == 1 ) + { + GuardarDetallePractica(oDetalle, true); //regenera=true --> se omite si es Derivacion para no generar una nueva Derivacion + } + } } } @@ -2869,11 +2908,11 @@ private void GuardarDetalle(Business.Data.Laboratorio.Protocolo oRegistro) - private void GuardarDetallePractica(DetalleProtocolo oDet) + private void GuardarDetallePractica(DetalleProtocolo oDet, bool regenera=false) { - - - if (oDet.VerificarSiEsDerivable(oUser.IdEfector)) //oDet.IdItem.IdEfector.IdEfector != oDet.IdItem.IdEfectorDerivacion.IdEfector) //Si es un item derivable no busca hijos y guarda directamente. + //Alta normal (regenera = false) --> el código funciona como antes + // Modificación con regeneración(regenera = true) --> se omite si es Derivacion para no generar una nueva Derivacion + if (!regenera && oDet.VerificarSiEsDerivable(oUser.IdEfector)) //oDet.IdItem.IdEfector.IdEfector != oDet.IdItem.IdEfectorDerivacion.IdEfector) //Si es un item derivable no busca hijos y guarda directamente. { oDet.IdSubItem = oDet.IdItem; oDet.Save(); diff --git a/WebLab/Resultados/AnalisisEdit.aspx.cs b/WebLab/Resultados/AnalisisEdit.aspx.cs index 9c13abc..a122d53 100644 --- a/WebLab/Resultados/AnalisisEdit.aspx.cs +++ b/WebLab/Resultados/AnalisisEdit.aspx.cs @@ -109,9 +109,14 @@ private void MuestraDatos() IList items = crit.List(); string pivot = ""; string sDatos = ""; + HashSet pivote = new HashSet(); + foreach (DetalleProtocolo oDet in items) { - if (pivot != oDet.IdItem.Nombre) + //if (pivot != oDet.IdItem.Nombre) //Debo cambiar la manera que verifica los repetidos, + // porque ahora cuando se regenera un subItem el IdDetalleProtocolo no es secuencial + // Y en la vista del protocolo se ve "duplicado" + if (pivote.Add(oDet.IdItem.Nombre)) // Si Add devuelve True es porque lo agrego sin problemas de duplicados { if (sDatos == "") sDatos = oDet.IdItem.Codigo + "#" + oDet.TrajoMuestra + "#" + oDet.ConResultado; @@ -389,18 +394,62 @@ private void GuardarDetalle(Business.Data.Laboratorio.Protocolo oRegistro) // GuardarDerivacion(oDetalle); //oDetalle.GuardarDerivacion(oUser); } - else //si ya esta actualizo si trajo muestra o no + else //si ya esta actualizo si trajo muestra o no //3/3/2026 Y regenero los analisis de las practicas si no estaban en el alta { + foreach (DetalleProtocolo oDetalle in listadetalle) { if (trajomuestra == "true") oDetalle.TrajoMuestra = "No"; - else + + else // (trajomuestra == "false" + { + /* Bug sobre la edición de determinaciones con la marca “sin muestra”: + * Si se genero el protocolo con un analisis "S/muestra" de una practica no se generan los idItem del diagrama + * (porque GuardarDetallePractica solo actualizaba TrajoMuestra del codigo de la practica) + * Correcion: si en Validacion se cambia a "Con muestra",se regeneran los detalles faltantes de la practica + */ + + + bool antesSinMuestra = (oDetalle.TrajoMuestra == "No"); oDetalle.TrajoMuestra = "Si"; + + if (antesSinMuestra && oDetalle.IdItem == oDetalle.IdSubItem && + (oRegistro.IdTipoServicio.IdTipoServicio == 1 || oRegistro.IdTipoServicio.IdTipoServicio ==3)) //Solo pasa en Labo y Microbiologia, en NO Pacientes se generan todos los items sin muesta + { + /* Si ValidadoTotal (en ProtocoloEdit2) cargó idUsuarioValida por un caso de + * "sin muestra" se debe resetear idUsuarioValida para evitar inconsistencias + */ + + //Caso 1: el análisis aún no tiene resultados (simple o compuesto), + if (!oDetalle.ConResultado) + { + oDetalle.IdUsuarioValida = 0; + oDetalle.FechaValida = DateTime.Parse("01/01/1900"); + } + + //Caso 2: Es derivacion. + //Los analisis Derivados no tienen IdUsuarioValida, solo idUsuarioResultado + if (oDetalle.ResultadoCar == "Pendiente de derivar") + { + oDetalle.IdUsuarioValida = 0; + oDetalle.FechaValida = DateTime.Parse("01/01/1900"); + } + + /* Si es un analisis Compuesto Regenero analisis. + * Considero que si el analisis es Derivacion no se debe regenerar + * Considero idItem = idSubItem + */ + + if ( oItem.IdCategoria == 1 ) + GuardarDetallePractica(oDetalle, true); //true --> se omite si es Derivacion para no generar una nueva Derivacion + } + + } oDetalle.Save(); + } - } } } @@ -541,10 +590,12 @@ private void GuardarDetalle2(Business.Data.Laboratorio.Protocolo oRegistro) - private void GuardarDetallePractica(DetalleProtocolo oDet) + private void GuardarDetallePractica(DetalleProtocolo oDet, bool regenera = false) { + //Alta normal (regenera = false) → el código funciona como antes + // Modificación con regeneración(regenera = true) → se omite si es Derivacion para no generar una nueva Derivacion - if (oDet.VerificarSiEsDerivable(oDet.IdProtocolo.IdEfector)) //oDet.IdItem.IdEfector.IdEfector != oDet.IdItem.IdEfectorDerivacion.IdEfector) //Si es un item derivable no busca hijos y guarda directamente. + if (!regenera && oDet.VerificarSiEsDerivable(oDet.IdProtocolo.IdEfector)) //oDet.IdItem.IdEfector.IdEfector != oDet.IdItem.IdEfectorDerivacion.IdEfector) //Si es un item derivable no busca hijos y guarda directamente. { oDet.IdSubItem = oDet.IdItem; oDet.Save();