/// <summary>
 /// Método que inserta un nuevo registro a la tabla de Preciario
 /// </summary>
 /// <param name="iPreciario"></param>
 public static string Insertar(PreciarioGeneral iPreciario)
 {
     return PreciarioGeneralDataAccess.Insertar(iPreciario);
 }
 /// <summary>
 /// Método que actualiza un nuevo registro a la tabla de Preciarios
 /// </summary>
 /// <param name="uPreciario"></param>
 /// <returns></returns>
 public static int Actualizar(PreciarioGeneral uPreciario)
 {
     return PreciarioGeneralDataAccess.Actualizar(uPreciario);
 }
        /// <summary>
        /// Método que inserta un nuevo registro a la tabla de Preciario
        /// </summary>
        /// <param name="iPreciario"></param>
        public static string Insertar(PreciarioGeneral iPreciario)
        {
            try
            {
                //1. Configurar la conexión y el tipo de comando
                SqlConnection sqlcConectar = new SqlConnection(ConfigurationManager.ConnectionStrings["OSEF"].ConnectionString);
                SqlCommand sqlcComando = new SqlCommand();
                sqlcComando.Connection = sqlcConectar;
                sqlcComando.CommandType = CommandType.StoredProcedure;
                sqlcComando.CommandText = "web_spI_InsertarPreciarioGeneral";

                //2. Declarar los parametros
                SqlParameter sqlpID = new SqlParameter();
                sqlpID.ParameterName = "@ID";
                sqlpID.SqlDbType = SqlDbType.Char;
                sqlpID.Size = 7;
                sqlpID.Direction = ParameterDirection.Output;

                SqlParameter sqlpDescripcion = new SqlParameter();
                sqlpDescripcion.ParameterName = "@Descripcion";
                sqlpDescripcion.SqlDbType = SqlDbType.VarChar;
                sqlpDescripcion.Value = iPreciario.Descripcion;

                SqlParameter sqlpArchivo = new SqlParameter();
                sqlpArchivo.ParameterName = "@Archivo";
                sqlpArchivo.SqlDbType = SqlDbType.VarChar;
                sqlpArchivo.Value = iPreciario.Archivo;

                SqlParameter sqlpEstatus = new SqlParameter();
                sqlpEstatus.ParameterName = "@Estatus";
                sqlpEstatus.SqlDbType = SqlDbType.VarChar;
                sqlpEstatus.Value = iPreciario.Estatus;

                SqlParameter sqlpUsuario = new SqlParameter();
                sqlpUsuario.ParameterName = "@Usuario";
                sqlpUsuario.SqlDbType = SqlDbType.VarChar;
                sqlpUsuario.Value = iPreciario.Usuario;

                SqlParameter sqlpFechaAlta = new SqlParameter();
                sqlpFechaAlta.ParameterName = "@FechaAlta";
                sqlpFechaAlta.SqlDbType = SqlDbType.SmallDateTime;
                sqlpFechaAlta.Value = iPreciario.FechaAlta;

                SqlParameter sqlpTipoObra = new SqlParameter();
                sqlpTipoObra.ParameterName = "@TipoObra";
                sqlpTipoObra.SqlDbType = SqlDbType.Bit;
                sqlpTipoObra.Value = iPreciario.TipoObra;

                SqlParameter sqlpTipoMantenimiento = new SqlParameter();
                sqlpTipoMantenimiento.ParameterName = "@TipoMantenimiento";
                sqlpTipoMantenimiento.SqlDbType = SqlDbType.Bit;
                sqlpTipoMantenimiento.Value = iPreciario.TipoMantenimiento;

                SqlParameter sqlpCliente = new SqlParameter();
                sqlpCliente.ParameterName = "@Cliente";
                sqlpCliente.SqlDbType = SqlDbType.Char;
                sqlpCliente.Size = 8;
                if (iPreciario.Cliente == null)
                {
                    sqlpCliente.Value = DBNull.Value;
                }
                else
                {
                    sqlpCliente.Value = iPreciario.Cliente;
                }
                //3. Agregar los parametros al comando
                sqlcComando.Parameters.Add(sqlpID);
                sqlcComando.Parameters.Add(sqlpDescripcion);
                sqlcComando.Parameters.Add(sqlpArchivo);
                sqlcComando.Parameters.Add(sqlpEstatus);
                sqlcComando.Parameters.Add(sqlpUsuario);
                sqlcComando.Parameters.Add(sqlpFechaAlta);
                sqlcComando.Parameters.Add(sqlpTipoObra);
                sqlcComando.Parameters.Add(sqlpTipoMantenimiento);
                sqlcComando.Parameters.Add(sqlpCliente);
                //4. Abrir la conexión
                sqlcComando.Connection.Open();

                //5. Ejecutar la instrucción INSERT que regresa un dato que es el ID
                sqlcComando.ExecuteScalar();

                //6. Cerrar la conexión
                sqlcComando.Connection.Close();

                //7. Regresar el resultado
                return sqlcComando.Parameters["@ID"].Value.ToString();
            }
            catch (Exception ex)
            {
                throw new Exception("Error capa de datos (public static int Insertar(PreciarioGeneral " + iPreciario.ID + ")): " + ex.Message);
            }
        }
        /// <summary>
        /// Método que actualiza un nuevo registro a la tabla de Preciarios
        /// </summary>
        /// <param name="uPreciario"></param>
        public static int Actualizar(PreciarioGeneral uPreciario)
        {
            try
            {
                //1. Configurar la conexión y el tipo de comando
                SqlConnection sqlcConectar = new SqlConnection(ConfigurationManager.ConnectionStrings["OSEF"].ConnectionString);
                SqlCommand sqlcComando = new SqlCommand();
                sqlcComando.Connection = sqlcConectar;
                sqlcComando.CommandType = CommandType.StoredProcedure;
                sqlcComando.CommandText = "web_spU_ActualizarPreciarioGeneral";

                //2. Declarar los parametros
                SqlParameter sqlpID = new SqlParameter();
                sqlpID.ParameterName = "@ID";
                sqlpID.SqlDbType = SqlDbType.Char;
                sqlpID.Size = 7;
                sqlpID.Value = uPreciario.ID;

                SqlParameter sqlpDescripcion = new SqlParameter();
                sqlpDescripcion.ParameterName = "@Descripcion";
                sqlpDescripcion.SqlDbType = SqlDbType.VarChar;
                sqlpDescripcion.Value = uPreciario.Descripcion;

                SqlParameter sqlpCliente = new SqlParameter();
                sqlpCliente.ParameterName = "@Cliente";
                sqlpCliente.SqlDbType = SqlDbType.Char;
                sqlpCliente.Size = 8;
                if (uPreciario.Cliente == null)
                {
                    sqlpCliente.Value = DBNull.Value;
                }
                else
                {
                    sqlpCliente.Value = uPreciario.Cliente;
                }

                SqlParameter sqlpEstatus = new SqlParameter();
                sqlpEstatus.ParameterName = "@Estatus";
                sqlpEstatus.SqlDbType = SqlDbType.VarChar;
                sqlpEstatus.Value = uPreciario.Estatus;

                //3. Agregar los parametros al comando
                sqlcComando.Parameters.Add(sqlpID);
                sqlcComando.Parameters.Add(sqlpDescripcion);
                sqlcComando.Parameters.Add(sqlpCliente);
                sqlcComando.Parameters.Add(sqlpEstatus);
                //4. Abrir la conexión
                sqlcComando.Connection.Open();

                //5. Ejecutar la instrucción UPDATE que no regresa filas
                int result = sqlcComando.ExecuteNonQuery();

                //6. Cerrar la conexión
                sqlcComando.Connection.Close();

                //7. Regresar el resultado
                return result;
            }
            catch (Exception ex)
            {
                throw new Exception("Error capa de datos (public static int Actualizar(Preciario " + uPreciario.ID + ")): " + ex.Message);
            }
        }
        /// <summary>
        /// Evento de clic del botón Guardar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void imgbtnGuardar_Click(object sender, DirectEventArgs e)
        {
            //1. Obtener datos de la Forma y saber si es edición o nuevo
            string strRegistro = e.ExtraParams["registro"];
            string strEstatus = e.ExtraParams["estatus"];
            string strArchivo = e.ExtraParams["archivo"];
            string rTipoObra = e.ExtraParams["tipoObra"];
            string rTipoMtno = e.ExtraParams["tipoMnto"];

            string strRegistrosNuevos = e.ExtraParams["registrosnuevos"];
            string strRegistrosActualizados = e.ExtraParams["registrosactualizados"];
            string strRegistrosEliminados = e.ExtraParams["registroseliminados"];

            string strcookieEditarPreciario = Cookies.GetCookie("cookieEditarPreciarioGeneral").Value;
            Dictionary<string, string> dRegistro = JSON.Deserialize<Dictionary<string, string>>(strRegistro);
            string strPreciarioDetalle = e.ExtraParams["DetallePreciario"];

            //2. Se guarda en una lista el Store que contiene todos los campos para deserealizarlos y usarlos para el insert
            List<PreciarioGeneralConcepto> lDetallePreciario = JSON.Deserialize<List<PreciarioGeneralConcepto>>(strPreciarioDetalle);

            PreciarioGeneral oPreciario = new PreciarioGeneral();

            //3. Por cada elemento del submit de la Forma detectar el campo y asignarlo al objeto correspondiente
            foreach (KeyValuePair<string, string> sd in dRegistro)
            {
                switch (sd.Key)
                {
                    //4. Datos del preciario
                    case "txtfDescripcion":
                        oPreciario.Descripcion = sd.Value;
                        break;
                    case "IdCliente":
                        oPreciario.Cliente = sd.Value;
                        break;
                }
            }

            //5. Se toma el nombre del archivo de Excel que se está cargando
            oPreciario.Archivo = fufArchivoExcel.FileName;

            //6. Validar si es nuevo o es uno existente
            if (strcookieEditarPreciario.Equals("Nuevo"))
            {
                //7. Traemeos el objeto de sesion para llenr el objeto con los datos de usuario
                oPreciario.FechaAlta = DateTime.Now;

                //Checar ticket de autenticación
                UsuarioBusiness.checkValidSession(this);

                Usuario oUsuario = (Usuario)Session["Usuario"];
                oPreciario.Usuario = oUsuario.ID;
                oPreciario.Estatus = strEstatus;

                if (rTipoObra.Equals("true"))
                {
                    oPreciario.TipoObra = true;
                }

                if (rTipoMtno.Equals("true"))
                {
                    oPreciario.TipoMantenimiento = true;
                }

                if (PreciarioGeneralBusiness.ObtenerPreciariosGeneralesRepetidos(oPreciario.Descripcion))
                {
                    var success = new JFunction { Fn = "imgbtnGuardar_Click_SuccessRepetido" };
                    X.Msg.Alert("Alerta", "<p align='center'>El preciario ya se encuentra registrado con el nombre: <br/>" + oPreciario.Descripcion + ".</p>", success).Show();

                }
                else
                {

                    //8. Insertar en la base de datos
                    oPreciario.ID = PreciarioGeneralBusiness.Insertar(oPreciario);
                    string categoria = "";
                    string subcategoria = "";
                    string subsubcategoria = "";

                    foreach (PreciarioGeneralConcepto sd in lDetallePreciario)
                    {
                        //9. Insertar Categoria
                        if (sd.Tipo.Equals("1"))
                        {
                            PreciarioGeneralCategoria c = new PreciarioGeneralCategoria();
                            c.Clave = sd.Clave;
                            c.Preciario = oPreciario.ID;
                            c.Descripcion = sd.Descripcion;
                            c.Usuario = oUsuario.ID;
                            c.Estatus = sd.Estatus;
                            c.FechaAlta = sd.FechaAlta;
                            categoria = PreciarioGeneralCategoriaBusiness.Insertar(c);
                        }
                        //10. Insertar SubCategoria
                        if (sd.Tipo.Equals("2"))
                        {
                            PreciarioGeneralSubCategoria sc = new PreciarioGeneralSubCategoria();
                            sc.Clave = sd.Clave;
                            sc.Preciario = oPreciario.ID;
                            sc.Descripcion = sd.Descripcion;
                            sc.Categoria = categoria;
                            sc.Usuario = oUsuario.ID;
                            sc.Estatus = sd.Estatus;
                            sc.FechaAlta = sd.FechaAlta;
                            subcategoria = PreciarioGeneralSubCategoriaBusiness.Insertar(sc);
                        }
                        //11. Insertar SubSubCategoria
                        if (sd.Tipo.Equals("3"))
                        {
                            PreciarioGeneralSubSubCategoria ssc = new PreciarioGeneralSubSubCategoria();
                            ssc.Clave = sd.Clave;
                            ssc.Preciario = oPreciario.ID;
                            ssc.Descripcion = sd.Descripcion;
                            ssc.Categoria = categoria;
                            ssc.SubCategoria = subcategoria;
                            ssc.Usuario = oUsuario.ID;
                            ssc.Estatus = sd.Estatus;
                            ssc.FechaAlta = sd.FechaAlta;
                            subsubcategoria = PreciarioGeneralSubSubCategoriaBusiness.Insertar(ssc);
                        }
                        //12. Insertar Concepto
                        if (sd.Tipo.Equals(""))
                        {
                            PreciarioGeneralConcepto pc = new PreciarioGeneralConcepto();
                            pc.Clave = sd.Clave;
                            pc.Preciario = oPreciario.ID;
                            pc.Descripcion = sd.Descripcion;
                            pc.Unidad = sd.Unidad;
                            pc.Cantidad = sd.Cantidad;
                            pc.Costo = sd.Costo;
                            pc.Categoria = categoria;
                            pc.SubCategoria = subcategoria;
                            pc.SubSubCategoria = subsubcategoria;
                            pc.Usuario = oUsuario.ID;
                            pc.Estatus = sd.Estatus;
                            pc.FechaAlta = sd.FechaAlta;
                            pc.Moneda = sd.Moneda;
                            PreciarioGeneralConceptoBusiness.Insertar(pc);
                        }
                    }
                    //Inserta las categorias de otros
                    PreciarioGeneralCategoria catg = new PreciarioGeneralCategoria();
                    catg.Clave = "OTR-001";
                    catg.Preciario = oPreciario.ID;
                    catg.Descripcion = "OTROS ADICIONALES";
                    catg.Usuario = oUsuario.ID;
                    catg.Estatus = strEstatus;
                    catg.FechaAlta = DateTime.Now;
                    categoria = PreciarioGeneralCategoriaBusiness.Insertar(catg);

                    PreciarioGeneralSubCategoria scatg = new PreciarioGeneralSubCategoria();
                    scatg.Clave = "OTR-001";
                    scatg.Preciario = oPreciario.ID;
                    scatg.Descripcion = "OTROS ADICIONALES";
                    scatg.Usuario = oUsuario.ID;
                    scatg.Categoria = categoria;
                    scatg.Estatus = strEstatus;
                    scatg.FechaAlta = DateTime.Now;
                    subcategoria = PreciarioGeneralSubCategoriaBusiness.Insertar(scatg);

                    PreciarioGeneralSubSubCategoria sscatg = new PreciarioGeneralSubSubCategoria();
                    sscatg.Clave = "OTR-001";
                    sscatg.Preciario = oPreciario.ID;
                    sscatg.Descripcion = "OTROS ADICIONALES";
                    sscatg.Categoria = categoria;
                    sscatg.SubCategoria = subcategoria;
                    sscatg.Usuario = oUsuario.ID;
                    sscatg.Estatus = strEstatus;
                    sscatg.FechaAlta = DateTime.Now;
                    PreciarioGeneralSubSubCategoriaBusiness.Insertar(sscatg);

                    //13. Mandar mensaje con el código del Preciario
                    var success = new JFunction { Fn = "imgbtnGuardar_Click_Success" };
                    X.Msg.Alert("Registro completo", "<p align='center'>Preciario registrado con ID: <br/>" + oPreciario.ID + ".</p>", success).Show();

                    sCarga.DataSource = PreciarioGeneralConceptoBusiness.ObtenerPreciarioGeneralConceptoPorPreciario(oPreciario.ID);
                    sCarga.DataBind();
                }
            }
            else
            {
                //14. Valida que archivo guardar
                if (fufArchivoExcel.FileName.Equals(""))
                    oPreciario.Archivo = strArchivo;
                else
                    oPreciario.Archivo = fufArchivoExcel.FileName;

                //15. Tomamos la sucursal y estatus como parametro independiente por que ya esta deshabilitada
                oPreciario.ID = strcookieEditarPreciario;//ID PRE
                oPreciario.Estatus = strEstatus;

                //16. Actualizar los datos del Preciario
                PreciarioGeneralBusiness.Actualizar(oPreciario);

                //16.1 Validamos si tiene nuevos conceptos
                Usuario usr = (Usuario)Session["Usuario"];
                    if (!strRegistrosNuevos.Equals("0"))
                    {
                        List<PreciarioGeneralConcepto> lDetallePreciarioNuevos = JSON.Deserialize<List<PreciarioGeneralConcepto>>(strRegistrosNuevos);
                         foreach (PreciarioGeneralConcepto sd in lDetallePreciarioNuevos)
                        {
                            PreciarioGeneralConcepto npgc = new PreciarioGeneralConcepto();
                            npgc.Clave = sd.Clave;
                            npgc.Preciario = oPreciario.ID;
                            npgc.Descripcion = sd.Descripcion;
                            npgc.Unidad = sd.Unidad;
                            npgc.Cantidad = sd.Cantidad;
                            npgc.Costo = sd.Costo;
                            npgc.Categoria = sd.Categoria;
                            npgc.SubCategoria = sd.SubCategoria;
                            npgc.SubSubCategoria = sd.SubSubCategoria;
                            npgc.Usuario = usr.ID;
                            npgc.Estatus = oPreciario.Estatus;
                            npgc.FechaAlta = DateTime.Now ;
                            npgc.Moneda = sd.Moneda;
                            PreciarioGeneralConceptoBusiness.Insertar(npgc);
                        }
                    }
                    if (!strRegistrosActualizados.Equals("0"))
                    {
                        List<PreciarioGeneralConcepto> lDetallePreciarioActualizados = JSON.Deserialize<List<PreciarioGeneralConcepto>>(strRegistrosActualizados);
                        foreach (PreciarioGeneralConcepto sd in lDetallePreciarioActualizados)
                        {
                            PreciarioGeneralConcepto npgc = new PreciarioGeneralConcepto();
                            npgc.ID = sd.ID;
                            npgc.Clave = sd.Clave;
                            npgc.Preciario = oPreciario.ID;
                            npgc.Descripcion = sd.Descripcion;
                            npgc.Unidad = sd.Unidad;
                            npgc.Cantidad = sd.Cantidad;
                            npgc.Costo = sd.Costo;
                            npgc.Categoria = sd.Categoria;
                            npgc.SubCategoria = sd.SubCategoria;
                            npgc.SubSubCategoria = sd.SubSubCategoria;
                            npgc.Usuario = usr.ID;
                            npgc.Estatus = oPreciario.Estatus;
                            npgc.FechaAlta = DateTime.Now;
                            npgc.Moneda = sd.Moneda;
                            PreciarioGeneralConceptoBusiness.Actualizar(npgc);
                        }
                    }
                    if (!strRegistrosEliminados.Equals("0"))
                    {
                        List<PreciarioGeneralConcepto> lDetallePreciarioEliminados = JSON.Deserialize<List<PreciarioGeneralConcepto>>(strRegistrosEliminados);
                        foreach (PreciarioGeneralConcepto sd in lDetallePreciarioEliminados)
                        {
                            PreciarioGeneralConceptoBusiness.Borrar(sd.ID, sd.Clave);
                        }
                    }

                //17. Mandar mensaje con el código del preciario
                var success = new JFunction { Fn = "imgbtnGuardar_Click_Success" };
                X.Msg.Alert("Actualización completa", "<p align='center'>Se han actualizado los datos del preciario <br/>" + oPreciario.ID + ".</p>", success).Show();
            }
        }