/// <summary>
 /// Método que inserta un nuevo registro a la tabla de PreciarioCategoria
 /// </summary>
 /// <param name="iPreciarioCategoria"></param>
 public static string Insertar(PreciarioCategoria iPreciarioCategoria)
 {
     return PreciarioCategoriaDataAccess.Insertar(iPreciarioCategoria);
 }
 /// <summary>
 /// Método que actualiza un nuevo registro a la tabla de PreciariosCategoria
 /// </summary>
 /// <param name="uPreciarioCategoria"></param>
 /// <returns></returns>
 public static int Actualizar(PreciarioCategoria uPreciarioCategoria)
 {
     return PreciarioCategoriaDataAccess.Actualizar(uPreciarioCategoria);
 }
        /// <summary>
        /// Método que actualiza un nuevo registro a la tabla de PreciariosCategorias
        /// </summary>
        /// <param name="uPreciarioCategorias"></param>
        public static int Actualizar(PreciarioCategoria uPreciarioCategoria)
        {
            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_ActualizarPreciarioCategorias";

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

                SqlParameter sqlpClave = new SqlParameter();
                sqlpID.ParameterName = "@Clave";
                sqlpID.SqlDbType = SqlDbType.Char;
                sqlpID.Size = 7;
                sqlpID.Value = uPreciarioCategoria.Clave;

                SqlParameter sqlpPreciario = new SqlParameter();
                sqlpPreciario.ParameterName = "@Preciario";
                sqlpPreciario.SqlDbType = SqlDbType.VarChar;
                sqlpPreciario.Value = uPreciarioCategoria.Descripcion;

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

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

                //3. Agregar los parametros al comando
                sqlcComando.Parameters.Add(sqlpID);
                sqlcComando.Parameters.Add(sqlpClave);
                sqlcComando.Parameters.Add(sqlpPreciario);
                sqlcComando.Parameters.Add(sqlpDescripcion);
                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 " + uPreciarioCategoria.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 strSucursal = e.ExtraParams["sucursal"];

            string strcookieEditarPreciario = Cookies.GetCookie("cookieEditarPreciario").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<PreciarioConcepto> lDetallePreciario = JSON.Deserialize<List<PreciarioConcepto>>(strPreciarioDetalle);
            Preciario oPreciario = new Preciario();

            //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 "txtfID":
                        oPreciario.ID = sd.Value;
                        break;
                    case "txtfDescripcion":
                        oPreciario.Descripcion = sd.Value;
                        break;
                    case "cmbEstatus":
                        oPreciario.Estatus = 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"))
            {
                //Checar ticket de autenticación
                UsuarioBusiness.checkValidSession(this);

                //7. Traemeos el objeto de sesion para llenr el objeto con los datos de usuario
                oPreciario.FechaAlta = DateTime.Now;
                Usuario oUsuario = (Usuario)Session["Usuario"];
                oPreciario.Usuario = oUsuario.ID;
                oPreciario.Estatus = strEstatus;
                oPreciario.Sucursal = strSucursal;

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

                foreach (PreciarioConcepto sd in lDetallePreciario)
                {
                    //9. Insertar Categoria
                    if (sd.Tipo.Equals("1"))
                    {
                        PreciarioCategoria c = new PreciarioCategoria();
                        c.Clave = sd.Clave;
                        c.Preciario = oPreciario.ID;
                        c.Descripcion = sd.Descripcion;
                        c.Usuario = oUsuario.ID;
                        c.Estatus = sd.Estatus;
                        c.FechaAlta =Convert.ToDateTime(sd.FechaAlta);
                        categoria =PreciarioCategoriaBuisness.Insertar(c);
                    }
                    //10. Insertar SubCategoria
                    if (sd.Tipo.Equals("2"))
                    {
                        PreciarioSubCategoria sc = new PreciarioSubCategoria();
                        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 = Convert.ToDateTime(sd.FechaAlta);
                        subcategoria= PreciarioSubCategoriaBusiness.Insertar(sc);
                    }
                    //11. Insertar SubSubCategoria
                    if (sd.Tipo.Equals("3"))
                    {
                        PreciarioSubSubCategoria ssc = new PreciarioSubSubCategoria();
                        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 = Convert.ToDateTime(sd.FechaAlta);
                        subsubcategoria= PreciarioSubSubCategoriaBusiness.Insertar(ssc);
                    }
                    //12. Insertar Concepto
                    if (sd.Tipo.Equals(""))
                    {
                        PreciarioConcepto pc = new PreciarioConcepto();
                        pc.Clave = sd.Clave;
                        pc.Preciario = oPreciario.ID;
                        pc.Descripcion = sd.Descripcion;
                        pc.Unidad = sd.Unidad;
                        pc.Cantidad = sd.Cantidad;
                        pc.Utilizada = 0;
                        pc.Costo = sd.Costo;
                        pc.Importe = sd.Importe;
                        pc.Importefinal = 0;
                        pc.Categoria = categoria;
                        pc.SubCategoria = subcategoria;
                        pc.SubSubCategoria = subsubcategoria;
                        pc.Usuario = oUsuario.ID;
                        pc.Estatus = sd.Estatus;
                        pc.FechaAlta = sd.FechaAlta;
                        PreciarioConceptoBusiness.Insertar(pc);
                    }
                }

                //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 registrada con ID: <br/>" + oPreciario.ID + ".</p>", success).Show();
            }
            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 desabilitada
                oPreciario.ID = strcookieEditarPreciario;
                oPreciario.Sucursal = strSucursal;
                oPreciario.Estatus = strEstatus;

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

                //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();
            }
        }
        /// <summary>
        /// Método que inserta un nuevo registro a la tabla de PreciarioCategoria
        /// </summary>
        /// <param name="iPreciarioCategorias"></param>
        public static string Insertar(PreciarioCategoria iPreciarioCategoria)
        {
            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_InsertarPreciarioCategoria";

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

                SqlParameter sqlpClave = new SqlParameter();
                sqlpClave.ParameterName = "@Clave";
                sqlpClave.SqlDbType = SqlDbType.Char;
                sqlpClave.Size = 7;
                sqlpClave.Value = iPreciarioCategoria.Clave;

                SqlParameter sqlpPreciario = new SqlParameter();
                sqlpPreciario.ParameterName = "@Preciario";
                sqlpPreciario.SqlDbType = SqlDbType.Char;
                sqlpPreciario.Size = 7;
                sqlpPreciario.Value = iPreciarioCategoria.Preciario;

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

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

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

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

                //3. Agregar los parametros al comando
                sqlcComando.Parameters.Add(sqlpID);
                sqlcComando.Parameters.Add(sqlpClave);
                sqlcComando.Parameters.Add(sqlpPreciario);
                sqlcComando.Parameters.Add(sqlpDescripcion);
                sqlcComando.Parameters.Add(sqlpUsuario);
                sqlcComando.Parameters.Add(sqlpEstatus);
                sqlcComando.Parameters.Add(sqlpFechaAlta);

                //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(PreciarioCategoria " + iPreciarioCategoria.Clave + ")): " + ex.Message);
            }
        }