/// <summary>
        /// Este metodo es el encargardo de validar que los valores de las columnas sean iguales a un valor o
        /// a otra columna dependiento la regla configurada en el archivo JSON.
        /// </summary>
        /// <param name="template">Reglas de la columna</param>
        /// <param name="row">El registro o fila del archivo</param>
        /// <param name="value">EL valor de la columna*fila</param>
        private void validateRangeEq(TemplateRulesPriorityPatient template, IXLTableRow row, object value, string type)
        {
            RangeEq[] lstRangeEq;

            if (template.LstRangeEq != null && template.LstRangeEq.Length > 0)
            {
                lstRangeEq = template.LstRangeEq;

                foreach (var rangeEq in lstRangeEq)
                {
                    string valueTmp = Convert.ToString(value).Trim();

                    // Si el valor es igual al del campo

                    if (rangeEq.Equal.Equals(valueTmp))
                    {
                        // Si hay un valor para comparar si es igual
                        if (rangeEq.ValueColumnEq != null && !rangeEq.ValueColumnEq.Equals("-1") && !rangeEq.ValueColumnEq.Equals(""))
                        {
                            var s = row.Cell(rangeEq.Column);
                            // Se compara si es diferente con otra columna, si lo es, esta incorrecto, deberia ser igual
                            if (!row.Cell(rangeEq.Column).GetString().Trim().Equals(rangeEq.ValueColumnEq.Trim()))
                            {
                                //Insertar en la tabla de pacientes prioritarios
                                insertVariablePriorityPatient(template.Name, valueTmp, $"553@validateRangeEq@=@Column@{rangeEq.Column}@value@{rangeEq.ValueColumnEq}", row);
                            }
                        }
                        // Si hay un valor para comparar si es diferente
                        else if (rangeEq.Different != null && !rangeEq.Different.Equals("-1") && !rangeEq.Different.Equals(""))
                        {
                            // Se compara si es igual con otra columna, si lo es, esta incorrecto, deberia ser diferente
                            if (row.Cell(rangeEq.Column).GetString().Trim().Equals(rangeEq.Different.Trim()))
                            {
                                //Insertar en la tabla de pacientes prioritarios
                                insertVariablePriorityPatient(template.Name, valueTmp, $"563@validateRangeEq@<>@Column@{rangeEq.Column}@value@{rangeEq.Different}", row);
                            }
                        }
                        // Si hay un valor para comparar si es menor o igual
                        else if (rangeEq.MinEq != null && !rangeEq.MinEq.Equals("-1") && !rangeEq.MinEq.Equals(""))
                        {
                            double tmpValue;

                            if (double.TryParse(rangeEq.MinEq, out tmpValue))
                            {
                                double valColumnDbTmp;

                                if (double.TryParse(row.Cell(rangeEq.Column).GetString(), out valColumnDbTmp))
                                {
                                    // Se compara si es mayor con otra columna, si lo es, esta incorrecto, deberia ser menor o igual
                                    if (valColumnDbTmp > tmpValue)
                                    {
                                        //Insertar en la tabla de pacientes prioritarios
                                        insertVariablePriorityPatient(template.Name, valueTmp, $"581@validateRangeEq@>=@Column@{rangeEq.Column}@value@{tmpValue}", row);
                                    }

                                    continue;
                                }

                                // Se compara si es mayor con otra columna, si lo es, esta incorrecto, deberia ser menor o igual
                                if (Convert.ToDouble(row.Cell(rangeEq.Column).GetString()) > tmpValue)
                                {
                                    //Insertar en la tabla de pacientes prioritarios
                                    insertVariablePriorityPatient(template.Name, valueTmp, $"591@validateRangeEq@>=@Column@{rangeEq.Column}@value@{tmpValue}", row);
                                }
                            }
                            else
                            {
                                // Se compara si es mayor con otra columna, si lo es, esta incorrecto, deberia ser menor o igual
                                if (row.Cell(rangeEq.Column).GetDateTime() > Convert.ToDateTime(rangeEq.MinEq))
                                {
                                    //Insertar en la tabla de pacientes prioritarios
                                    insertVariablePriorityPatient(template.Name, valueTmp, $"600@validateRangeEq@>=@Column@{rangeEq.Column}@value@{rangeEq.MinEq}", row);
                                }
                            }
                        }
                        // Si hay un valor para comparar si es mayor o igual
                        else
                        {
                            double tmpValue;

                            if (rangeEq.HigEq != null && double.TryParse(rangeEq.HigEq, out tmpValue))
                            {
                                string dataTmp = row.Cell(rangeEq.Column).GetString();

                                double valColumnIntTmp;
                                double valColumnDbTmp;

                                if (double.TryParse(dataTmp, out valColumnIntTmp))
                                {
                                    // Se compara si es menor con otra columna, si lo es, esta incorrecto, deberia ser mayor o igual
                                    if (valColumnIntTmp < tmpValue)
                                    {
                                        //Insertar en la tabla de pacientes prioritarios
                                        insertVariablePriorityPatient(template.Name, valueTmp, $"623@validateRangeEq@>=@Column@{rangeEq.Column}@value@{tmpValue}", row);
                                    }
                                    continue;
                                }

                                if (double.TryParse(dataTmp, out valColumnDbTmp))
                                {
                                    // Se compara si es menor con otra columna, si lo es, esta incorrecto, deberia ser mayor o igual
                                    if (valColumnDbTmp < tmpValue)
                                    {
                                        //Insertar en la tabla de pacientes prioritarios
                                        insertVariablePriorityPatient(template.Name, valueTmp, $"634@validateRangeEq@>=@Column@{rangeEq.Column}@value@{tmpValue}", row);
                                    }
                                    continue;
                                }
                            }
                            else
                            {
                                // Se compara si es menor con otra columna, si lo es, esta incorrecto, deberia ser mayor o igual
                                if (row.Cell(rangeEq.Column).GetDateTime() < Convert.ToDateTime(rangeEq.HigEq))
                                {
                                    //Insertar en la tabla de pacientes prioritarios
                                    insertVariablePriorityPatient(template.Name, valueTmp, $"646@validateRangeEq@>=@Column@{rangeEq.Column}@value@{rangeEq.HigEq}", row);
                                }
                            }
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Este metodo es el encargardo de validar que los valores de las columnas sean diferentes a un valor o
        /// a otra columna dependiento la regla configurada en el archivo JSON.
        /// </summary>
        /// <param name="template">Reglas de la columna</param>
        /// <param name="row">El registro o fila del archivo</param>
        /// <param name="value">EL valor de la columna*fila</param>
        private void validateRangeDif(TemplateRulesPriorityPatient template, IXLTableRow row, object value, string type)
        {
            RangeDif[] lstRangeDif;

            if (template.LstRangeDif != null && template.LstRangeDif.Length > 0)
            {
                lstRangeDif = template.LstRangeDif;

                foreach (var rangeDif in lstRangeDif)
                {
                    string valueTmp = Convert.ToString(value).Trim();

                    // Si el valor es diferente
                    if (!rangeDif.Dif.Equals(value))
                    {
                        // Si hay un valor para comparar si es igual
                        if (!rangeDif.ValueColumnEq.Equals("-1") && !rangeDif.ValueColumnEq.Equals(""))
                        {
                            // Se compara si es diferente con otra columna, si lo es, esta incorrecto, deberia ser igual
                            if (!row.Cell(rangeDif.Column).GetString().Trim().Equals(rangeDif.ValueColumnEq.Trim()))
                            {
                                //Insertar en la tabla de pacientes prioritarios
                                insertVariablePriorityPatient(template.Name, valueTmp, $"459@validateRangeDif@=@Column@{rangeDif.Column}@value@{rangeDif.ValueColumnEq}", row);
                            }
                        }
                        // Si hay un valor para comparar si es diferente
                        else if (!rangeDif.Different.Equals("-1") && !rangeDif.Different.Equals(""))
                        {
                            // Se compara si es igual con otra columna, si lo es, esta incorrecto, deberia ser diferente
                            if (row.Cell(rangeDif.Column).GetString().Trim().Equals(rangeDif.Different.Trim()))
                            {
                                //Insertar en la tabla de pacientes prioritarios
                                insertVariablePriorityPatient(template.Name, valueTmp, $"496@validateRangeDif@!=@Column@{rangeDif.Column}@value@{rangeDif.Different}", row);
                            }
                        }
                        // Si hay un valor para comparar si es menor o igual
                        else if (!rangeDif.MinEq.Equals("-1") && !rangeDif.MinEq.Equals(""))
                        {
                            double tmpValue;

                            if (double.TryParse(rangeDif.MinEq, out tmpValue))
                            {
                                // Se compara si es mayor con otra columna, si lo es, esta incorrecto, deberia ser menor o igual
                                if (Convert.ToDouble(row.Cell(rangeDif.Column).GetString()) > tmpValue)
                                {
                                    //Insertar en la tabla de pacientes prioritarios
                                    insertVariablePriorityPatient(template.Name, valueTmp, $"483@validateRangeDif@<=@Column@{rangeDif.Column}@value@{tmpValue}", row);
                                }
                            }
                            else
                            {
                                // Se compara si es mayor con otra columna, si lo es, esta incorrecto, deberia ser menor o igual
                                if (row.Cell(rangeDif.Column).GetDateTime() > Convert.ToDateTime(rangeDif.MinEq))
                                {
                                    //Insertar en la tabla de pacientes prioritarios
                                    insertVariablePriorityPatient(template.Name, valueTmp, $"492@validateRangeDif@<=@Column@{rangeDif.Column}@value@{rangeDif.MinEq}", row);
                                }
                            }
                        }
                        // Si hay un valor para comparar si es mayor o igual
                        else
                        {
                            double tmpValue;

                            if (double.TryParse(rangeDif.HigEq, out tmpValue))
                            {
                                // Se compara si es menor con otra columna, si lo es, esta incorrecto, deberia ser mayor o igual
                                if (Convert.ToDouble(row.Cell(rangeDif.Column).GetString()) < tmpValue)
                                {
                                    //Insertar en la tabla de pacientes prioritarios
                                    insertVariablePriorityPatient(template.Name, valueTmp, $"508@validateRangeDif@>=@Column@{rangeDif.Column}@value@{tmpValue}", row);
                                }
                            }
                            else
                            {
                                // Se compara si es menor con otra columna, si lo es, esta incorrecto, deberia ser mayor o igual
                                if (row.Cell(rangeDif.Column).GetDateTime() < Convert.ToDateTime(rangeDif.HigEq))
                                {
                                    //Insertar en la tabla de pacientes prioritarios
                                    insertVariablePriorityPatient(template.Name, valueTmp, $"517@validateRangeDif@>=@Column@{rangeDif.Column}@value@{rangeDif.HigEq}", row);
                                }
                            }
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Este metodo es el encargardo de validar que los valores de las columnas sean mayor a un valor o
        /// a otra columna dependiento la regla configurada en el archivo JSON.
        /// </summary>
        /// <param name="template">Reglas de la columna</param>
        /// <param name="row">El registro o fila del archivo</param>
        /// <param name="value">EL valor de la columna*fila</param>
        private void validateRangeHigher(TemplateRulesPriorityPatient template, IXLTableRow row, object value)
        {
            RangeHigher[] lstRangeHigher;

            if (template.LstRangeHigher != null && template.LstRangeHigher.Length > 0)
            {
                string valueTmp = value.ToString();

                lstRangeHigher = template.LstRangeHigher;

                double tmpValueInt;
                double tmpValueDb;

                foreach (var rangeHigh in lstRangeHigher)
                {
                    if (rangeHigh.HigEq.Equals("sys"))
                    {
                        if (Convert.ToDateTime(valueTmp) < DateTime.Now)
                        {
                            //Insertar en la tabla de pacientes prioritarios
                            insertVariablePriorityPatient(template.Name, Convert.ToDateTime(valueTmp).ToShortDateString(), $"239@validateRangeHigher@>@Column@{rangeHigh.Column}@value@{rangeHigh.HigEq}", row);
                        }

                        continue;
                    }

                    string[] vals = rangeHigh.HigEq.Split('|');

                    if (vals.Length > 0 && vals[0].Equals("column"))
                    {
                        if (double.TryParse(valueTmp, out tmpValueInt))
                        {
                            if (tmpValueInt < Convert.ToDouble(row.Cell(vals[1]).GetString()))
                            {
                                insertVariablePriorityPatient(template.Name, valueTmp, $"253@validateRangeHigher@>=@Column@{vals[1]}@value@{row.Cell(vals[1]).GetString()}", row);
                            }

                            continue;
                        }

                        if (Convert.ToDateTime(valueTmp) < row.Cell(vals[1]).GetDateTime())
                        {
                            insertVariablePriorityPatient(template.Name, valueTmp, $"261@validateRangeHigher@>=@Column@{vals[1]}@value@{row.Cell(vals[1]).GetString()}", row);
                        }

                        continue;
                    }

                    if (double.TryParse(valueTmp, out tmpValueInt))
                    {
                        double higEqtmp;

                        if (double.TryParse(rangeHigh.HigEq, out higEqtmp))
                        {
                            if (tmpValueInt < higEqtmp)
                            {
                                insertVariablePriorityPatient(template.Name, valueTmp, $"277@validateRangeHigher@>=@Column@{rangeHigh.Column}@value@{rangeHigh.HigEq}", row);
                            }

                            continue;
                        }

                        if (tmpValueInt < Convert.ToDouble(rangeHigh.HigEq))
                        {
                            insertVariablePriorityPatient(template.Name, valueTmp, $"285@validateRangeHigher@>=@Column@{rangeHigh.Column}@value@{rangeHigh.HigEq}", row);
                        }

                        continue;
                    }

                    if (double.TryParse(valueTmp, out tmpValueDb))
                    {
                        if (tmpValueDb < Convert.ToDouble(rangeHigh.HigEq))
                        {
                            insertVariablePriorityPatient(template.Name, valueTmp, $"295@validateRangeHigher@>=@Column@{rangeHigh.Column}@value@{rangeHigh.HigEq}", row);
                        }

                        continue;
                    }

                    DateTime dateTimeTmp;

                    if (DateTime.TryParse(valueTmp, out dateTimeTmp))
                    {
                        if (dateTimeTmp < Convert.ToDateTime(rangeHigh.HigEq))
                        {
                            insertVariablePriorityPatient(template.Name, dateTimeTmp.ToShortDateString(), $"307@validateRangeHigher@>=@Column@{rangeHigh.Column}@value@{Convert.ToDateTime(rangeHigh.HigEq).ToShortDateString()}", row);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Este metodo es el encargado de validar que los valores de las columnas sean menor a un valor o
        /// a otra columna dependiento la regla configurada en el archivo JSON.
        /// </summary>
        /// <param name="template">Reglas de la columna</param>
        /// <param name="row">El registro o fila del archivo</param>
        /// <param name="value">EL valor de la columna*fila</param>
        private void validateRangeMin(TemplateRulesPriorityPatient template, IXLTableRow row, object value)
        {
            RangeMin[] lstRangeMin;

            if (template.LstRangeMin != null && template.LstRangeMin.Length > 0)
            {
                string valueTmp = value.ToString();

                lstRangeMin = template.LstRangeMin;

                double tmpValueInt;
                double tmpValueDb;

                foreach (var rangeMin in lstRangeMin)
                {
                    if (rangeMin.MinEq.Equals("sys"))
                    {
                        DateTime fecha = Convert.ToDateTime(valueTmp);

                        if (fecha > DateTime.Now)
                        {
                            //Insertar en la tabla de pacientes prioritarios
                            insertVariablePriorityPatient(template.Name, valueTmp, $"338@validateRangeMin@<=@Column@{rangeMin.Column}@value@{rangeMin.MinEq}", row);
                        }

                        continue;
                    }

                    string[] vals = rangeMin.MinEq.Split('|');

                    if (vals.Length > 0 && vals[0].Equals("column"))
                    {
                        if (double.TryParse(valueTmp, out tmpValueInt))
                        {
                            if (tmpValueInt > Convert.ToDouble(row.Cell(vals[1]).GetString()))
                            {
                                insertVariablePriorityPatient(template.Name, valueTmp, $"353@validateRangeMin@<=@Column@{vals[1]}@value@{row.Cell(vals[1]).GetString()}", row);
                            }

                            continue;
                        }


                        if (Convert.ToDateTime(valueTmp) > row.Cell(vals[1]).GetDateTime())
                        {
                            insertVariablePriorityPatient(template.Name, Convert.ToDateTime(valueTmp).ToShortDateString(), $"362@validateRangeMin@<=@Column@{vals[1]}@value@{row.Cell(vals[1]).GetString()}", row);//fecha pero no hay cambio, solo se muestra el valor en string, quizas porque no se sabe el tipo de dato...aunque se está haciendo la validación con una fecha.
                        }

                        continue;
                    }

                    if (rangeMin.Column != 0)
                    {
                        if (double.TryParse(valueTmp, out tmpValueInt) || double.TryParse(valueTmp, out tmpValueDb))
                        {
                            var s_s_s = rangeMin.Column;
                            var s_s   = row.Cell(s_s_s).GetString();
                            var s     = Convert.ToDouble(s_s);
                            var a_a   = rangeMin.ValueColumnEq;
                            var a     = Convert.ToDouble(a_a);
                            if (s != a)
                            {
                                insertVariablePriorityPatient(template.Name, valueTmp, $"374@validateRangeMin@==@Column@{rangeMin.Column}@value@{rangeMin.ValueColumnEq}", row);
                            }

                            continue;
                        }

                        if (Convert.ToDateTime(valueTmp) > Convert.ToDateTime(rangeMin.ValueColumnEq))
                        {
                            insertVariablePriorityPatient(template.Name, Convert.ToDateTime(valueTmp).ToShortDateString(), $"382@validateRangeMin@==@Column@{rangeMin.Column}@value@{Convert.ToDateTime(rangeMin.MinEq).ToShortDateString()}", row); //debería ser el valor == pero está el valor menor.
                        }

                        continue;
                    }

                    if (double.TryParse(valueTmp, out tmpValueInt))
                    {
                        double minEqtmp;

                        if (double.TryParse(rangeMin.MinEq, out minEqtmp))
                        {
                            if (tmpValueInt > minEqtmp)
                            {
                                insertVariablePriorityPatient(template.Name, valueTmp, $"396@validateRangeMin@>=@Column@{rangeMin.Column}@value@{rangeMin.MinEq}", row);
                            }

                            continue;
                        }

                        if (tmpValueInt > Convert.ToInt32(rangeMin.MinEq))
                        {
                            insertVariablePriorityPatient(template.Name, valueTmp, $"404@validateRangeMin@>=@Column@{rangeMin.Column}@value@{rangeMin.MinEq}", row);
                        }

                        continue;
                    }

                    if (double.TryParse(valueTmp, out tmpValueDb))
                    {
                        if (tmpValueDb > Convert.ToDouble(rangeMin.MinEq))
                        {
                            insertVariablePriorityPatient(template.Name, valueTmp, $"414@validateRangeMin@>=@Column@{rangeMin.Column}@value@{rangeMin.MinEq}", row);
                        }

                        continue;
                    }

                    DateTime dateTimeTmp;

                    if (DateTime.TryParse(valueTmp, out dateTimeTmp))
                    {
                        if (dateTimeTmp > Convert.ToDateTime(rangeMin.MinEq))
                        {
                            insertVariablePriorityPatient(template.Name, dateTimeTmp.ToShortDateString(), $"427@validateRangeMin@>=@Column@{rangeMin.Column}@value@{rangeMin.MinEq}", row);
                        }
                    }
                }
            }
        }
        private void ColumnValidator(TemplateRulesPriorityPatient template, IXLCell columndata, IXLTableRow row)
        {
            // Si el tipo es DATETIME
            if (template.Type == Configuration.GetValueConf(Constants.DATE_TIME_TYPE))
            {
                // Se valida si la fecha del examen esta desactualizada
                if (template.ValidateOutdated && !columndata.GetString().Trim().Equals(""))
                {
                    if (template.UnknowValue != null &&
                        template.NotApply != null &&
                        !template.UnknowValue.Equals("") &&
                        !template.NotApply.Equals(""))
                    {
                        // Se compara si el valor es el de default si es no se realiza validaciones

                        if (Convert.ToDateTime(columndata.GetString().Trim()).Equals(Convert.ToDateTime(template.UnknowValue)) ||
                            Convert.ToDateTime(columndata.GetString().Trim()).Equals(Convert.ToDateTime(template.NotApply)))
                        {
                            return;
                        }
                    }

                    try
                    {
                        DateTime dateValidation = DateTime.Now.AddMonths(template.MonthOutdated * -1);

                        if (columndata.GetDateTime() < dateValidation)
                        {
                            var    val    = columndata.GetDateTime() < DateTime.Now ? DateTime.Now - columndata.GetDateTime() : columndata.GetDateTime() - DateTime.Now;
                            string result = $"Vigencia minima: {template.MonthOutdated} Total: {(int)Math.Truncate((val.TotalDays) / 30)}";
                            // Inserta en variables desactualizadas y no realiza mas validaciones
                            insertOutdated(template.Name, columndata.GetString(), result, row);
                            return;
                        }
                    }
                    catch (Exception ex)
                    {
                        IOUtilities.WriteExceptionLog(ex, Configuration.GetClassName <PriorityPatient>());
                    }
                }
            }

            // Existe un valor desconocido para la columna tipo fecha
            if ((template.UnknowValue != null && !template.UnknowValue.Equals("")) || (template.NotApply != null && !template.NotApply.Equals("")))
            {
                // Se compara si el valor es el de default si es no se realiza validaciones
                if (Convert.ToDateTime(columndata.GetString().Trim()).Equals(Convert.ToDateTime(template.UnknowValue)) ||
                    Convert.ToDateTime(columndata.GetString().Trim()).Equals(Convert.ToDateTime(template.NotApply)))
                {
                    return;
                }
            }

            // Existen un valores permitidos para la columna tipo numero
            if (template.AllowValues != null && !template.AllowValues.Equals(""))
            {
                int dataTmp;

                if (int.TryParse(columndata.GetString(), out dataTmp))
                {
                    if (template.AllowValues.Split(',').Where(val => Convert.ToInt32(val) == dataTmp).Count() != 0)
                    {
                        return;
                    }
                }
            }

            validateRangeEq(template, row, columndata.GetString(), template.Type);

            validateRangeDif(template, row, columndata.GetString(), template.Type);

            validateRangeMin(template, row, columndata.GetString());

            validateRangeHigher(template, row, columndata.GetString());
        }