diff --git a/Business/Business.csproj b/Business/Business.csproj index e7919c36..b594d108 100644 --- a/Business/Business.csproj +++ b/Business/Business.csproj @@ -78,6 +78,7 @@ C:\Users\Carolina\Downloads\002.GenerarQRCrystalReportsWeb\55.GenerarQRCrystalReportsWeb\GenerarQRWebForms\GenerarQRWebForms\bin\QRCoder.dll + 3.5 diff --git a/Business/Data/Laboratorio/Protocolo.cs b/Business/Data/Laboratorio/Protocolo.cs index 97cc0395..50e2ff36 100644 --- a/Business/Data/Laboratorio/Protocolo.cs +++ b/Business/Data/Laboratorio/Protocolo.cs @@ -11,6 +11,9 @@ insert license info here using System.IO; using System.Drawing; using QRCoder; +using System.Configuration; +using System.Collections.Generic; +using System.Linq; namespace Business.Data.Laboratorio { @@ -3157,6 +3160,292 @@ where a.IdUsuarioValida>0 return s_resultadoAnterior; } - + + public class ResultadoDTO + { + public string Codigo { get; set; } + public Item IdItem { get; set; } + public Item IdSubItem { get; set; } + } + public static string VerificarAnalisisContenidos(string TxtDatos, string analisisOriginales, string idProtocolo, Usuario oUser, string muestraAsociada) + { + bool devolver = true; + string[] tabla = TxtDatos.Split('@'); + string[] tablaOriginal = analisisOriginales.Split(';'); + string listaCodigo = ""; + string error = string.Empty; + + Dictionary itemsPorCodigo = new Dictionary(); + Protocolo oRegistro = null; + + List codigos = new List(); + List codigosOriginal = new List(); + DataTable dt = new DataTable(); + + + //Armo los buffers de datos para no ir tantas veces a la base de datos + + + if (idProtocolo != null) //Es Modificacion, me traigo todos los iditems cargados a DataSet(ds) + { + //Instancio Protocolo fuera de la repetitiva + oRegistro = (Business.Data.Laboratorio.Protocolo) oRegistro.Get(typeof(Business.Data.Laboratorio.Protocolo),int.Parse(idProtocolo.ToString())); + + foreach (string fila in tablaOriginal) + { + string[] codigo = fila.Split('#'); + codigosOriginal.Add(codigo[1]); + } + + foreach (string fila in tabla) + { + string[] codigo = fila.Split('#'); + codigos.Add(codigo[1]); + } + + string[] diferencia = codigosOriginal.Intersect(codigos).ToArray(); //Solo los codigos que estan en BD y no borraron de la grilla + + string resultado = string.Join(", ", diferencia.Select(v => $"'{v}'")); + + string m_ssql = @"SELECT I.codigo, DP.idItem, DP.idSubItem + from LAB_DetalleProtocolo AS DP with (nolock) + INNER JOIN LAB_Item AS I with (nolock) ON DP.idSubItem = I.idItem + WHERE DP.idProtocolo = " + idProtocolo + + " and codigo in (" + resultado + ")"; + //ISession m_session = NHibernateHttpModule.CurrentSession; + //ICriteria criteria = m_session.CreateCriteria(typeof(DetalleProtocolo)) + //.CreateAlias("DP.IdSubItem", "I") + //.CreateAlias("DP.IdProtocolo", "P") + //.Add(Expression.Eq("P.IdProtocolo", idProtocolo)) + //.Add(Expression.In("I.Codigo", diferencia.ToArray())))); + + // criteria.SetProjection( + //Projections.ProjectionList() + // .Add(Projections.Property("I.Codigo"), "Codigo") + // .Add(Projections.Property("DP.IdItem"), "IdItem") + // .Add(Projections.Property("DP.IdSubItem"), "IdSubItem") +//); + //criteria.SetResultTransformer(Transformers.AliasToBean()); + // IList detalles = criteria.List(); + } + + for (int i = 0; i < tabla.Length - 1; i++) + { + string[] fila = tabla[i].Split('#'); + string codigo = fila[1].ToString(); + if (listaCodigo == "") + listaCodigo = "'" + codigo + "'"; + else + listaCodigo += ",'" + codigo + "'"; + + if (codigo != "") + { + Item oItem; ; + + if (!itemsPorCodigo.TryGetValue(codigo, out oItem)) + { + oItem = new Item(); + oItem = (Item)oItem.Get(typeof(Item), "Codigo", codigo, "Baja", false); + itemsPorCodigo[codigo] = oItem; //Tambien lo guardo en un buffer //Aca la key es el codigo + + if (oItem.Tipo == "P") //Para las practicas guardo los idItem tambien en el buffer + { + ISession m_session = NHibernateHttpModule.CurrentSession; + ICriteria crit = m_session.CreateCriteria(typeof(PracticaDeterminacion)); + crit.Add(Expression.Eq("IdItemPractica", oItem)); + crit.Add(Expression.Eq("IdEfector", oUser.IdEfector)); + IList detalle = crit.List(); + + List idsDeterminaciones = new List(); + foreach (PracticaDeterminacion item in detalle) + { + idsDeterminaciones.Add(item.IdItemDeterminacion); + } + + if (idsDeterminaciones.Count > 0) + { + ICriteria critItems = m_session.CreateCriteria(typeof(Item)); + critItems.Add(Expression.In("IdItem", idsDeterminaciones)); + IList determinaciones = critItems.List(); + foreach (Item oItem2 in determinaciones) + { + string key = oItem2.IdItem.ToString(); + if (!itemsPorCodigo.ContainsKey(key)) + { + itemsPorCodigo[key] = oItem2; //La key para estos items es su IdItem + } + } + } + } + + //1- Si el idItem ya esta en DetalleProtocolo (para los casos de "Modifica" no verifico Analisis) + if (oRegistro != null)//Caro: unifico instanciacion de protocolo cuando es modificacion + { + if (oItem != null) + { + if (!codigosOriginal.Contains(codigo))//no esta en la base + { + devolver = VerificaMuestrasAsociadas(codigo, oItem, tabla, muestraAsociada, oUser, dt, itemsPorCodigo); + } + } + } + else // Para el alta + { + devolver = VerificaMuestrasAsociadas(codigo, oItem, tabla, muestraAsociada, oUser, dt, itemsPorCodigo); + } + + + } + }/// if codigo + + if (!devolver) break; + } + + if ((devolver) && (listaCodigo != "")) + { error = VerificarAnalisisComplejosContenidos(listaCodigo, oUser); } + + return error; + + } + + private static bool VerificaMuestrasAsociadas(string codigo, Item oItem, string[] tabla, string muestraAsociada, Usuario oUser, DataTable dt = null, Dictionary itemsPorCodigo = null) + { + string error = string.Empty; + + + //Verifica si la muestra asociada es la correcta + if (oItem.VerificaMuestrasAsociadas(int.Parse(muestraAsociada))) + { + for (int j = 0; j < tabla.Length - 1; j++) + { + string[] fila2 = tabla[j].Split('#'); + string codigo2 = fila2[1].ToString(); + //Verifico que el item y subItem no estan repetidos + + if ((codigo2 != "") && (codigo != codigo2)) + { + Item oItem2; + if (itemsPorCodigo != null && itemsPorCodigo.TryGetValue(codigo2, out oItem2)) + { + oItem2 = itemsPorCodigo[codigo2]; + } + else + { + oItem2 = new Item(); + oItem2 = (Item)oItem2.Get(typeof(Item), "Codigo", codigo2, "Baja", false); + if (itemsPorCodigo != null) + itemsPorCodigo[codigo2] = oItem2; //lo guardo en un buffer para la proxima busqueda + } + + + //MultiEfector: filtro por efector + ISession m_session = NHibernateHttpModule.CurrentSession; + ICriteria crit = m_session.CreateCriteria(typeof(PracticaDeterminacion)); + crit.Add(Expression.Eq("IdItemPractica", oItem)); + crit.Add(Expression.Eq("IdItemDeterminacion", oItem2.IdItem)); + crit.Add(Expression.Eq("IdEfector", oUser.IdEfector)); + PracticaDeterminacion oGrupo = (PracticaDeterminacion)crit.UniqueResult(); + + if (oGrupo != null) + { + error = "Ha cargado análisis contenidos en otros. Verifique los códigos " + codigo + " y " + codigo2 + "!"; + break; + } + + //Verifica analisis contendo en otro pero con en el buffer + + if (dt != null) + { + Item oItemExistente = new Item(); + bool hayConflicto = false; + int itemExistente = 0; + + + + if (oItem.Tipo == "P") //Es practica + { + foreach (PracticaDeterminacion item in detalle) + { + if (itemsEnBD.ContainsKey(item.IdItemDeterminacion)) + { + itemExistente = itemsEnBD[item.IdItemDeterminacion]; + hayConflicto = true; break; + } + } + } + else //es determinacion simple idItem=idSubitem + { + if (itemsEnBD.ContainsKey(oItem.IdItem)) + { + itemExistente = itemsEnBD[oItem.IdItem]; + hayConflicto = true; + } + } + + if (hayConflicto) + { + string mensajeerror = ""; + oItemExistente = (Item)oItemExistente.Get(typeof(Item), "IdItem", itemExistente);//, "Baja", false); //Caro: le saco la condicion de baja porque si fue grabado en la base y despues lo pusieron de baja no lo va a encontrar + if (oItemExistente != null)///Caro agrego control de que exista si no va a dar error al usarlo + { + mensajeerror = + "Ha cargado análisis contenidos en otros. Verifique los códigos " + + codigo + " y " + oItemExistente.Codigo + "!"; + + } + else + mensajeerror = "Ha cargado análisis contenidos en otros. Verifique los códigos "; + + error = mensajeerror; + + } + + } + } + + }////for + } + else + { + error = "Ha ingresado tipo de muestra que no corresponde con el codigo " + codigo + ". Verifique configuracion."; + + + } + + return error; + } + + private static string VerificarAnalisisComplejosContenidos(string listaCodigo, Usuario oUser) + { ///Este es un segundo nivel de validacion en donde los analisis contenidos no estan directamente sino en diagramas + string error= string.Empty; + string m_ssql = "SELECT distinct PD.idItemDeterminacion, I.codigo" + + " FROM LAB_PracticaDeterminacion AS PD " + + " INNER JOIN LAB_Item AS I ON PD.idItemPractica = I.idItem " + + " WHERE I.codigo IN (" + listaCodigo + ") AND (I.baja = 0)" + + " and PD.idEfector= " + oUser.IdEfector.IdEfector.ToString() + " ORDER BY PD.idItemDeterminacion "; + + //NHibernate.Cfg.Configuration oConf = new NHibernate.Cfg.Configuration(); + //String strconn = oConf.GetProperty("hibernate.connection.connection_string"); + SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SIL_ReadOnly"].ConnectionString); ///Performance: conexion de solo lectura + SqlDataAdapter da = new SqlDataAdapter(m_ssql, conn); + DataSet ds = new DataSet(); + da.Fill(ds); + + string itempivot = ""; + string codigopivot = ""; + for (int i = 0; i < ds.Tables[0].Rows.Count; i++) + { + if (ds.Tables[0].Rows[i][0].ToString() == itempivot) + { + error = "Ha cargado análisis contenidos en otros. Verifique los códigos " + codigopivot + " y " + ds.Tables[0].Rows[i][1].ToString() + "!"; + break; + } + codigopivot = ds.Tables[0].Rows[i][1].ToString(); + itempivot = ds.Tables[0].Rows[i][0].ToString(); + } + return error; + + } + } } diff --git a/WebLab/Protocolos/ProtocoloEdit2.aspx.cs b/WebLab/Protocolos/ProtocoloEdit2.aspx.cs index 087267f5..911e1f3b 100644 --- a/WebLab/Protocolos/ProtocoloEdit2.aspx.cs +++ b/WebLab/Protocolos/ProtocoloEdit2.aspx.cs @@ -6,7 +6,7 @@ using Business; using Business.Data.Laboratorio; using Business.Data; - +using System.Linq; using NHibernate; using NHibernate.Expression; using System.Data.SqlClient; @@ -3675,333 +3675,11 @@ protected void cvAnalisis_ServerValidate(object source, ServerValidateEventArgs } - protected void cvValidacionInput_ServerValidate_vane(object source, ServerValidateEventArgs args) - { - - string[] bk = TxtDatosCargados.Value.Split(';'); - - TxtDatosCargados.Value = TxtDatos.Value; - - string sDatos = ""; - - string[] tabla = TxtDatos.Value.Split('@'); - - for (int i = 0; i < tabla.Length - 1; i++) - { - string[] fila = tabla[i].Split('#'); - string codigo = fila[1].ToString(); - string muestra= fila[2].ToString(); - string conResultado = "false"; - - //Cargo el valor del resultado para no perderlo si da error la validacion - if (i < bk.Length && bk.Length > 1) //TxtDatosCargados en Alta no tiene valores! - { - string[] filaBk = bk[i].Split('#'); - conResultado = filaBk[2].ToString(); - } - if (sDatos == "") - sDatos = codigo + "#" + muestra + "#" + conResultado; - else - sDatos += ";" + codigo + "#" + muestra + "#" + conResultado; - - } - - - - - TxtDatosCargados.Value = sDatos; - //saco restriccion de forma temporal - //if (Request["Operacion"].ToString()!="Modifica") - // if (!VerificarFechaPacienteMuestra()) - // { - // TxtDatos.Value = ""; - // args.IsValid = false; - // this.cvValidacionInput.ErrorMessage = "No es posible ingresar para la misma fecha, muestra y paciente un nuevo protocolo."; - // return; - // } - - if (!VerificarAnalisisContenidos() ) - { TxtDatos.Value = ""; - args.IsValid = false; - - return; - } - else - { - - - - /// - - if ((TxtDatos.Value == "") || (TxtDatos.Value == "1###on@")) - { - - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe completar al menos un análisis"; - return; - } - else args.IsValid = true; - - - //validacion Diagnostico - if (oC.DiagObligatorio) - {if (lstDiagnosticosFinal.Items.Count == 0) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar al menos un diagnóstico presuntivo del paciente"; - return; - } - } - - ///Validacion de la fecha de protocolo - if (txtFecha.Value == "") - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar la fecha del protocolo"; - return; - } - else - { - - if (DateTime.Parse(txtFecha.Value) > DateTime.Now) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "La fecha del protocolo no puede ser superior a la fecha actual"; - return; - } - else - args.IsValid = true; - } - - - if ((ddlSectorServicio.SelectedValue == "0")) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar sector"; - return; - } - - if ((ddlOrigen.SelectedValue == "0")) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar Origen"; - return; - } - - if ((ddlPrioridad.SelectedValue == "0")) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar Prioridad"; - return; - } - - if ((ddlMuestra.SelectedValue == "0") && (pnlMuestra.Visible)) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar Tipo de Muestra"; - return; - } - /// Valida que debe seleccionar un caracter si es un caso notificable a SISA - - - - if ((VerificaRequiereCaracter(sDatos)) && (ddlCaracter.SelectedValue == "0")) - //if ((sDatos.Contains(oC.CodigoCovid) && (ddlCaracter.SelectedValue=="0"))) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe seleccionar el caracter del protocolo"; - return; - } - // fin valida - // validacion si es sospechoso o detctar ingresar fecha de inicio de sintomas - - if (VerificaObligatoriedadFIS()) - { - if ((txtFechaFIS.Value == "") && (chkSinFIS.Checked==false)) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar fecha de inicio de síntomas"; - return; - } - } - // validacion si es contacto ingresar fecha de ultimo contacto - if ((ddlCaracter.SelectedValue == "4") && (txtFechaFUC.Value=="") && (chkSinFUC.Checked==false)) - { - - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar fecha de último contacto"; - return; - - } - if ((ddlEspecialista.SelectedValue=="-1") && (oC.MedicoObligatorio)) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar la mátricula del médico solicitante"; - return; - } - if (ddlOrigen.SelectedValue == "0") - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar el origen"; - return; - } - if ((oC.IdSectorDefecto== 0) && (ddlSectorServicio.SelectedValue == "0")) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar el Servicio"; - return; - } - - - if ((lblAlertaObraSocial.Visible) && (lblObraSocial.Text == "-")) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar la obra social/financiador"; - return; - } - - ///Validacion de la fecha de la orden - - if (txtFechaOrden.Value == "") - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar la fecha de la orden"; - return; - } - else - { - if (DateTime.Parse(txtFechaOrden.Value) > DateTime.Now) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "La fecha de la orden no puede ser superior a la fecha actual"; - return; - } - else - { - if (DateTime.Parse(txtFechaOrden.Value) > DateTime.Parse(txtFecha.Value)) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "La fecha de la orden no puede ser superior a la fecha del protocolo"; - return; - } - else - args.IsValid = true; - } - } - - - - - if (txtFechaTomaMuestra.Value == "") - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "Debe ingresar la fecha de toma de muestra"; - return; - } - else - { - if (DateTime.Parse(txtFechaTomaMuestra.Value) > DateTime.Now) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "La fecha de toma de muestra no puede ser superior a la fecha actual"; - return; - } - else - { - if (DateTime.Parse(txtFechaTomaMuestra.Value) > DateTime.Parse(txtFecha.Value)) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "La fecha de toma de muestra no puede ser superior a la fecha del protocolo"; - return; - } - else - args.IsValid = true; - } - } - - - /// control de fecha inicio de sintomas - /// - - if (txtFechaFIS.Value != "") - - { - if (DateTime.Parse(txtFechaFIS.Value) > DateTime.Now) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "La FIS no puede ser superior a la fecha actual"; - return; - } - else - { - if (DateTime.Parse(txtFechaTomaMuestra.Value) < DateTime.Parse(txtFechaFIS.Value)) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "La FIS no puede ser despues de la fecha de toma de muestra"; - return; - } - else - args.IsValid = true; - } - }//fin control - - - /// control de fecha inicio de sintomas - /// - - - if (txtFechaFUC.Value != "") - - { - if (DateTime.Parse(txtFechaFUC.Value) > DateTime.Now) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "La FUC no puede ser superior a la fecha actual"; - return; - } - else - { - if (DateTime.Parse(txtFechaTomaMuestra.Value) < DateTime.Parse(txtFechaFUC.Value)) - { - TxtDatos.Value = ""; - args.IsValid = false; - this.cvValidacionInput.ErrorMessage = "La FUC no puede ser despues de la fecha de toma de muestra"; - return; - } - else - args.IsValid = true; - } - }//fin control - - } - } + protected void cvValidacionInput_ServerValidate(object source, ServerValidateEventArgs args) - { - + { + string tablaOriginal = TxtDatosCargados.Value; TxtDatosCargados.Value = TxtDatos.Value; @@ -4036,10 +3714,11 @@ protected void cvValidacionInput_ServerValidate(object source, ServerValidateEve // return; // } - if (!VerificarAnalisisContenidos() ) + string error = Protocolo.VerificarAnalisisContenidos(sDatos, tablaOriginal, ddlMuestra.SelectedValue, oUser, Request["idProtocolo"]); + if (!string.IsNullOrEmpty(error)) { TxtDatos.Value = ""; args.IsValid = false; - + this.cvValidacionInput.ErrorMessage = error; return; } else @@ -4373,18 +4052,18 @@ private bool VerificarAnalisisContenidos() bool devolver = true; string[] tabla = TxtDatos.Value.Split('@'); string listaCodigo = ""; + - for (int i = 0; i < tabla.Length - 1; i++) - + + for (int i = 0; i < tabla.Length - 1; i++) { - string[] fila = tabla[i].Split('#'); - string codigo = fila[1].ToString(); + string[] fila = tabla[i].Split('#'); + string codigo = fila[1].ToString(); if (listaCodigo == "") listaCodigo = "'" + codigo + "'"; else listaCodigo += ",'" + codigo + "'"; - int i_idItemPractica = 0; if (codigo != "") { @@ -4392,8 +4071,7 @@ private bool VerificarAnalisisContenidos() oItem = (Item)oItem.Get(typeof(Item), "Codigo", codigo, "Baja", false); if (oItem.VerificaMuestrasAsociadas(int.Parse(ddlMuestra.SelectedValue))) { - - i_idItemPractica = oItem.IdItem; + for (int j = 0; j < tabla.Length - 1; j++) { @@ -4427,13 +4105,13 @@ private bool VerificarAnalisisContenidos() } }////for - } - else - { - this.cvValidacionInput.ErrorMessage = "Ha ingresado tipo de muestra que no corresponde con el codigo " + codigo + ". Verifique configuracion."; - devolver = false; break; + } + else + { + this.cvValidacionInput.ErrorMessage = "Ha ingresado tipo de muestra que no corresponde con el codigo " + codigo + ". Verifique configuracion."; + devolver = false; break; - } + } }/// if codigo if (!devolver) break;