public static void actualizarStock(DetallePlanProduccion detPlan, SqlConnection con, SqlTransaction trans, PlanMaestroProduccion plan, List<Producto> ProductosConPocaMP)
        {
            DataTable ProductosIntermedio;
            DataTable MateriaPrima;

            int idProductoFinal = 0;

            double cantidad = 0;

            idProductoFinal = detPlan.producto.idProducto;//OBTENEMOS EL ID DEL PRODUCTO FINAL
            cantidad = detPlan.cantidadPedido + detPlan.cantidadPLan;//OBTENEMOS LA CANTIDAD DE PRODUCTOS

            MateriaPrima = ProductoDAO.GetMateriaPrima(idProductoFinal,trans,con);//CARGAMOS EN LA TABLA LOS DATOS DE LAS MATERIAS PRIMAS
            DataTable MateriaPrimaXIntermedio = new DataTable();
            ProductosIntermedio = ProductoDAO.GetProductoIntermedio(idProductoFinal,con,trans);//CARGAMOS EN LA TABLA LOS DATOS DE LOS PRODUCTOS INTERMEDIO

            obtenerMateriasPrimas(MateriaPrima, MateriaPrimaXIntermedio, ProductosIntermedio, cantidad, idProductoFinal, con, trans,ProductosConPocaMP);
        }
        public static List<PlanMaestroProduccion> GetAll()
        {
            Acceso ac = new Acceso();

            List<PlanMaestroProduccion> planes = new List<PlanMaestroProduccion>();

            string sql = "SELECT * from CONSULTA_PLAN_PRODUCCION order by fechainicio desc";
            SqlCommand cmd = new SqlCommand();
            SqlConnection conexion = new SqlConnection(ac.getCadenaConexion());

            try
            {
                conexion.Open();

                cmd.Connection = conexion;
                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;

                SqlDataReader dr = cmd.ExecuteReader();

                PlanMaestroProduccion p;

                Estado e;

                while (dr.Read())
                {
                    p = new PlanMaestroProduccion();
                    e = new Estado();

                    e.idEstado = Convert.ToInt32(dr["idEstado"]);
                    e.Nombre = dr["nombre"].ToString();

                    p.IDPlanProduccion = Convert.ToInt32(dr["idPlanProduccion"]);
                    p.fechaCreacion = Convert.ToDateTime(dr["fechaCreacion"]);
                    p.fechaInicio = Convert.ToDateTime(dr["fechaInicio"]);
                    p.fechaFin = Convert.ToDateTime(dr["fechaFin"]);
                    p.observaciones = dr["observaciones"].ToString();
                    p.fechaCancelacion = Convert.ToDateTime(dr["fechaCancelacion"]);
                    p.motivoCancelacion  = dr["motivoCancelacion"].ToString();
                    p.estado = e;

                    planes.Add(p);

                }

            }
            catch (InvalidOperationException ex)
            {
                throw new ApplicationException(ex.Message);
            }
            catch (SqlException ex)
            {
                throw new ApplicationException("Error en BD: " + ex.Message);
            }
            finally
            {
                conexion.Close();
            }

            return planes;
        }
        public static void Update(PlanMaestroProduccion ped, List<DetallePlanProduccion> desreservar,List<Producto> productosConPocaMP)
        {
            Acceso ac = new Acceso();
            SqlTransaction tran = null;

            SqlConnection conexion = new SqlConnection(ac.getCadenaConexion());

            SqlCommand cmd = new SqlCommand("UPDATE [Luiggi].[dbo].[PlanMaestroProduccion] SET [fechaInicio] = @fechaInicio, [fechaFin] = @fechaFin, [observaciones] = @observaciones  WHERE idPlanProduccion = @idPlanProduccion", conexion);

            cmd.Parameters.AddWithValue("@fechaInicio", ped.fechaInicio );
            cmd.Parameters.AddWithValue("@fechaFin", ped.fechaFin );
            cmd.Parameters.AddWithValue("@observaciones", ped.observaciones );
            cmd.Parameters.AddWithValue("@idPlanProduccion", ped.IDPlanProduccion);

            try
            {
                conexion.Open();
                tran = conexion.BeginTransaction();
                cmd.CommandType = CommandType.Text;
                cmd.Transaction = tran;
                cmd.ExecuteNonQuery();
                //SqlCommand cmdIdentity = new SqlCommand("select @@Identity", conexion, tran);
                //ped.idPedido = Convert.ToInt32((cmdIdentity.ExecuteScalar()));
                 DetallePlanProduccionDAO.Delete(ped.IDPlanProduccion,conexion,tran );

                foreach(DetallePlanProduccion det in desreservar)
                {
                    det.cantidadPedido = det.cantidadPedido * -1;
                    det.cantidadPLan = det.cantidadPLan * -1;

                    actualizarStock(det, conexion, tran, ped,productosConPocaMP);
                }

                foreach (DetallePlanProduccion  detPed in ped.detallePlan )
                {
                    //detPed.pedido.idPedido = ped.idPedido;
                    DetallePlanProduccionDAO.Insert(detPed, conexion, tran, ped.IDPlanProduccion);
                    actualizarStock(detPed, conexion, tran, ped, productosConPocaMP);
                }
                tran.Commit();

            }
            catch (ArgumentException ex)
            {
                if (conexion.State == ConnectionState.Open)
                {
                    tran.Rollback();
                }
                throw new ApplicationException(ex.Message);
            }
            catch (SqlException ex)
            {
                if (conexion.State == ConnectionState.Open)
                {
                    tran.Rollback();
                }
                throw new ApplicationException("Error en BD: " + ex.Message);
            }
            finally
            {

                conexion.Close();
            }
        }
        public static void Insert(PlanMaestroProduccion plan, List<Producto> productosConPocaMP)
        {
            Acceso ac = new Acceso();
            SqlTransaction tran = null;

            SqlConnection conexion = new SqlConnection(ac.getCadenaConexion());

            SqlCommand cmd = new SqlCommand("sp_PlanProduccion_insert", conexion);

            cmd.Parameters.AddWithValue("@fechaCreacion", plan.fechaCreacion );
            cmd.Parameters.AddWithValue("@fechaInicio", plan.fechaInicio );
            cmd.Parameters.AddWithValue("@fechaFin", plan.fechaFin );
            cmd.Parameters.AddWithValue("@idEstado", plan.estado.idEstado );
            cmd.Parameters.AddWithValue("@observaciones", plan.observaciones );

            try
            {
                conexion.Open();
                tran = conexion.BeginTransaction();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Transaction = tran;
                cmd.ExecuteNonQuery();
                SqlCommand cmdIdentity = new SqlCommand("select @@Identity", conexion, tran);
                plan.IDPlanProduccion  = Convert.ToInt32((cmdIdentity.ExecuteScalar()));

                foreach (DetallePlanProduccion  detPlan in plan.detallePlan)
                {
                    //detPed.pedido.idPedido = ped.idPedido;

                    DetallePlanProduccionDAO.Insert(detPlan, conexion, tran, plan.IDPlanProduccion);

                    actualizarStock(detPlan, conexion, tran, plan,productosConPocaMP);
                }

                tran.Commit();

            }
            catch (ArgumentException ex)
            {
                if (conexion.State == ConnectionState.Open)
                {
                    tran.Rollback();
                }
                throw new ApplicationException(ex.Message);
            }
            catch (SqlException ex)
            {
                throw new ApplicationException("Error en BD: " + ex.Message);
            }
            finally
            {

                conexion.Close();
            }
        }
        public static List<PlanMaestroProduccion> GetByFiltros(int est, DateTime? fInicioDesde, DateTime? fFinHasta)
        {
            Acceso ac = new Acceso();

            List<PlanMaestroProduccion> planes = new List<PlanMaestroProduccion>();

            string sql = "SELECT * from CONSULTA_PLAN_PRODUCCION where 1=1";
            SqlCommand cmd = new SqlCommand();
            SqlConnection conexion = new SqlConnection(ac.getCadenaConexion());

            if (est != -1 && est != 0)
            {
                sql += " and idEstado = @est";
                cmd.Parameters.AddWithValue("@est", est);
            }

            if (fInicioDesde.HasValue)
            {
                sql += " and fechaInicio >= @fInicioDesde";
                cmd.Parameters.AddWithValue("@fInicioDesde", fInicioDesde.Value);
            }
            //if (fInicioHasta.HasValue)
            //{
            //    sql += " and fechaInicio <= @fInicioHasta";
            //    cmd.Parameters.AddWithValue("@fInicioHasta", fInicioHasta.Value);
            //}

            //if (fFinDesde.HasValue)
            //{
            //    sql += " and fechaFin >= @fFinDesde";
            //    cmd.Parameters.AddWithValue("@fFinDesde", fFinDesde.Value);
            //}
            if (fFinHasta.HasValue)
            {
                sql += " and fechaFin <= @fFinHasta";
                cmd.Parameters.AddWithValue("@fFinHasta", fFinHasta.Value);
            }

            try
            {
                conexion.Open();

                cmd.Connection = conexion;
                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;

                SqlDataReader dr = cmd.ExecuteReader();

                PlanMaestroProduccion p;

                Estado e;

                while (dr.Read())
                {
                    p = new PlanMaestroProduccion();
                    e = new Estado();

                    e.idEstado = Convert.ToInt32(dr["idEstado"]);
                    e.Nombre = dr["nombre"].ToString();

                    p.IDPlanProduccion = Convert.ToInt32(dr["idPlanProduccion"]);
                    p.fechaCreacion = Convert.ToDateTime(dr["fechaCreacion"]);
                    p.fechaInicio = Convert.ToDateTime(dr["fechaInicio"]);
                    p.fechaFin = Convert.ToDateTime(dr["fechaFin"]);
                    p.observaciones = dr["observaciones"].ToString();
                    p.fechaCancelacion = Convert.ToDateTime(dr["fechaCancelacion"]);
                    p.motivoCancelacion = dr["motivoCancelacion"].ToString();
                    p.estado = e;

                    planes.Add(p);

                }

            }
            catch (InvalidOperationException ex)
            {
                throw new ApplicationException(ex.Message);
            }
            catch (SqlException ex)
            {
                throw new ApplicationException("Error en BD: " + ex.Message);
            }
            finally
            {
                conexion.Close();
            }

            return planes;
        }
        private void btn_guardar_Click(object sender, EventArgs e)
        {
            if (estadoFormulario == estados.nuevo)
                    {
                        if (PlanMaestroProduccionDAO.verificarExistenciaPlanParaPeriodo(dtp_fecha_inicio.Value.Date, dtp_fecha_final.Value.Date)==false)
                        {
                            PlanMaestroProduccion plan = new PlanMaestroProduccion()
                                            {
                                                detallePlan = crearDetalle(),
                                                fechaCreacion = dtp_creacion_plan.Value.Date,
                                                fechaInicio = dtp_fecha_inicio.Value.Date,
                                                fechaFin = dtp_fecha_final.Value.Date,
                                                observaciones = txt_observaciones.Text,
                                                estado = new Estado() { idEstado = 17 }

                                            };

                            try
                            {
                                List<Producto> productosConPocaMP = new List<Producto>();
                                PlanMaestroProduccionDAO.Insert(plan, productosConPocaMP);
                                ////////////// MOSTRAR LOS PRODUCTOS CON BAJO STOCK
                                if (productosConPocaMP.Count > 0)
                                {
                                    string mensaje = "";
                                    List<Producto> prodConPocoStock = new List<Producto>();
                                    Boolean MPRepetida = false;
                                    foreach (Producto Prod in productosConPocaMP)
                                    {
                                        foreach (Producto P in prodConPocoStock)
                                        {
                                            if (P.idProducto == Prod.idProducto)
                                            {
                                                MPRepetida = true;
                                                break;
                                            }
                                        }
                                        if (MPRepetida == false)
                                        {
                                            mensaje += Environment.NewLine + Prod.Nombre.ToString();
                                            prodConPocoStock.Add(Prod);
                                        }

                                    }
                                    MessageBox.Show("Los siguientes productos estan con bajo stock: " + mensaje, "Atencion", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                }
                                /////////////////////////////////////////////////////////////

                                MessageBox.Show("Registrado con Exito", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                                limpiar();
                                _estado = estados.guardado;

                            }
                            catch (ApplicationException ex)
                            {
                                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                            }
                        }
                        else
                        {
                            MessageBox.Show("Ya Existe un Plan Para ese Periodo", "Atencion", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);

                        }
                    }
                    else
                    {
                        PlanMaestroProduccion plan = new PlanMaestroProduccion()
                        {
                            IDPlanProduccion = planModificar.IDPlanProduccion,
                            detallePlan = crearDetalle(),
                            fechaCreacion = dtp_creacion_plan.Value.Date,
                            fechaInicio = dtp_fecha_inicio.Value.Date,
                            fechaFin = dtp_fecha_final.Value.Date,
                            observaciones = txt_observaciones.Text,
                            estado = new Estado() { idEstado = 17 }

                        };
                        if (estadoFormulario == estados.modificar)
                        {
                            try
                            {
                                List<Producto> productosConPocaMP = new List<Producto>();
                                PlanMaestroProduccionDAO.Update(plan,desreservar, productosConPocaMP);
                                ////////////// MOSTRAR LOS PRODUCTOS CON BAJO STOCK
                                if (productosConPocaMP.Count > 0)
                                {
                                    string mensaje = "";
                                    List<Producto> prodConPocoStock = new List<Producto>();
                                    Boolean MPRepetida = false;
                                    foreach (Producto Prod in productosConPocaMP)
                                    {
                                        foreach (Producto P in prodConPocoStock)
                                        {
                                            if (P.idProducto == Prod.idProducto)
                                            {
                                                MPRepetida = true;
                                                break;
                                            }
                                        }
                                        if (MPRepetida == false)
                                        {
                                            mensaje += Environment.NewLine + Prod.Nombre.ToString();
                                            prodConPocoStock.Add(Prod);
                                        }

                                    }
                                    MessageBox.Show("Los siguientes productos estan con bajo stock: " + mensaje, "Atencion", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                }
                                /////////////////////////////////////////////////////////////
                                MessageBox.Show("Registrado con Exito", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                                limpiar();
                                _estado = estados.guardado;
                                dtp_fecha_inicio.Enabled = true;

                            }
                            catch (ApplicationException ex)
                            {
                                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                            }

                        }
                    }
        }
        private void dgv_planes_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            String estado = dgv_planes.Rows[dgv_planes.CurrentRow.Index].Cells["Estado"].Value.ToString();
            if (estado == "Pendiente de fabricación")
            {
                PlanMaestroProduccion plan = new PlanMaestroProduccion();

                plan.IDPlanProduccion = (int)dgv_planes.Rows[dgv_planes.CurrentRow.Index].Cells["nroPlan"].Value;

                GestionPlanMaestroProduccion gestPlan = new GestionPlanMaestroProduccion();
                gestPlan._estado = estados.modificar;
                gestPlan._planModificar = plan;

                gestPlan.ShowDialog();

                cargarGrilla();
                dgv_detalle_plan.Rows.Clear();
            }
        }