private void btn_imprimir_Click(object sender, EventArgs e)
        {
            if (dgv_OTproductosPadres.Rows.Count > 0)
            {
                if (dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].DefaultCellStyle.BackColor == Color.LightSalmon)
                {
                    OrdenDeTrabajo orden = new OrdenDeTrabajo();

                    orden.producto = new Producto() { idProducto = (int)dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].Cells["idProducto"].Value };
                    orden.fechaCreacion = Convert.ToDateTime(dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].Cells["fechaCreacion"].Value);
                    orden.idPlan = (int)dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].Cells["idPlan"].Value;

                    Emitir_Orden_De_Trabajo emitir = new Emitir_Orden_De_Trabajo();

                    emitir._orden = orden;
                    emitir._reporte = reporteOT.intermedio;
                    emitir.ShowDialog();

                    emitir = new Emitir_Orden_De_Trabajo();

                    emitir._orden = orden;
                    emitir._reporte = reporteOT.final;
                    emitir.ShowDialog();

                }
                else
                {
                    MessageBox.Show("Esta Orden de Trabajo ya fue Finalizada", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show("No Hay Ordenes a Imprimir", "Atención", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }
        private void btn_guardar_Click(object sender, EventArgs e)
        {
            if (_estado == estados.nuevo && validarDatos() == termino.aprobado)
            {
                OrdenDeTrabajo orden = new OrdenDeTrabajo()
                {
                    fechaPlan = infoPlan.fechaProduccion,
                    estado = new Estado() { idEstado = 19 },
                    idPlan = infoPlan.idPlan,
                    producto = new Producto() { idProducto = infoPlan.producto.idProducto },
                    horaInicio = Convert.ToDateTime(txt_inicio.Text),
                    horaFin = Convert.ToDateTime(txt_fin.Text),
                    maquinaria = new Maquinaria() { idMaquinaria = (int)cmb_maquinaria.SelectedValue },
                    empleado = new Empleado() { idEmpleado = (int)cmb_empleado.SelectedValue },
                    fechaCreacion = dtp_creacion_OT.Value.Date,
                    cantidad=(float)Convert.ToDouble(lbl_cant.Text),

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

                }

                MessageBox.Show("Registrado con Exito", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);

                bloquear = false;
                btn_guardar.Enabled = false;
                btn_cargar_combos.Enabled = false;
                txt_inicio.Enabled = false;
                limpiar();
                _estado = estados.guardado;
            }
            else
            {

            }

            btn_salir_consulta_Click(sender, e);
        }
        private void dgv_OTproductosPadres_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgv_OTproductosPadres.CurrentCell is DataGridViewButtonCell)
                {
                    if (dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].DefaultCellStyle.BackColor != Color.LightGreen)
                    {
                        if (tieneHijosFinalizados() == true)
                        {
                            try
                            {
                                double cant = (double)dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].Cells["cantidad"].Value;
                                if (dgv_OTproductosPadres.CurrentRow.Cells["cantiReal"].Value != String.Empty)
                                {
                                    double cantidadPlan = 0;
                                    double cantidadPedido = DetallePlanProduccionDAO.GetCantidadPedidosParaOT((int)dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].Cells["idProducto"].Value, Convert.ToDateTime(dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].Cells["fechaCreacion"].Value));
                                    cantidadPlan = cant - cantidadPedido;
                                    DateTime fecha = Convert.ToDateTime(dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].Cells["fechaCreacion"].Value);

                                    OrdenDeTrabajo orden = new OrdenDeTrabajo();
                                    orden.idOrdenTrabajo = int.Parse(dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].Cells["idOrden"].Value.ToString());
                                    Producto prod = new Producto();
                                    prod.idProducto = int.Parse(dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].Cells["idProducto"].Value.ToString());
                                    prod.Nombre = dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].Cells["nomProducto"].Value.ToString();
                                    UnidadMedida unidad = new UnidadMedida();
                                    unidad.Nombre = dgv_OTproductosPadres.Rows[dgv_OTproductosPadres.CurrentRow.Index].Cells["unidad"].Value.ToString();
                                    prod.Unidad = unidad;
                                    orden.fechaCreacion = fecha;
                                    orden.producto = prod;
                                    orden.cantidad = cant;
                                    ActualizarStock act = new ActualizarStock(orden, cantidadPedido,cantidadPlan);
                                    act.ShowDialog();
                                    if (orden.estado != null)
                                    {
                                        if (orden.estado.Nombre == "LISTO")
                                        {
                                            MessageBox.Show("Finalizado con éxito", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                                            dgv_OTproductosPadres.CurrentRow.DefaultCellStyle.BackColor = Color.LightGreen;
                                            dgv_OTproductosPadres.CurrentRow.Cells["cantiReal"].Value = orden.cantidadReal;
                                            cargarGrilla();
                                        }
                                    }
                                }
                            }
                            catch (FormatException ex)
                            {

                                MessageBox.Show("Ingrese solo números", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);

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

                        }
                        else
                        {
                            MessageBox.Show("Primero debe Finalizar las Ordenes de Trabajo de los Productos Intermedios", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);

                        }

                    }

            }
        }
        private void btn_guardar_Click(object sender, EventArgs e)
        {
            if (_estado == estados.nuevo && validarDatos() == termino.aprobado)
            {
                OrdenDeTrabajo orden = new OrdenDeTrabajo();

                    orden.fechaPlan = infoPlan.fechaProduccion;
                    orden.estado = new Estado() { idEstado = 19 };
                    orden.idPlan = infoPlan.idPlan;
                    orden.producto=new Producto(){idProducto=infoPlan.producto.idProducto};
                    orden.horaInicio = Convert.ToDateTime(txt_inicio.Text);
                    orden.horaFin = Convert.ToDateTime(txt_fin.Text);
                    orden.productoIntermedio = new Producto() { idProducto = prodInt.idProducto };
                    orden.maquinaria = new Maquinaria() { idMaquinaria = (int)cmb_maquinaria.SelectedValue, Nombre = ((Maquinaria)cmb_maquinaria.SelectedItem).Nombre};
                    orden.empleado = new Empleado() { idEmpleado = (int)cmb_empleado.SelectedValue, Nombre = ((Empleado)cmb_empleado.SelectedItem).Nombre };
                    orden.fechaCreacion=dtp_creacion_OT.Value.Date;
                    orden.cantidad = (float)Convert.ToDouble(lbl_cant.Text);

                iniciador.otHija = orden;

                MessageBox.Show("Registrado con Exito", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                _estado = estados.guardado;
                Close();
                Dispose();
            }
            else
            {

            }
        }
        private void dgv_OTproductosHijos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgv_OTproductosHijos.CurrentCell is DataGridViewButtonCell)
            {
                if (dgv_OTproductosHijos.Rows[dgv_OTproductosHijos.CurrentRow.Index].DefaultCellStyle.BackColor != Color.LightGreen)
                {
                    try
                    {
                        double canti = (double)dgv_OTproductosHijos.Rows[dgv_OTproductosHijos.CurrentRow.Index].Cells["cant"].Value;
                        OrdenDeTrabajo orden = new OrdenDeTrabajo();
                        orden.idOrdenTrabajo = (int)dgv_OTproductosHijos.Rows[dgv_OTproductosHijos.CurrentRow.Index].Cells["idOT"].Value;
                        Producto prod = new Producto();
                        prod.idProducto =(int)dgv_OTproductosHijos.Rows[dgv_OTproductosHijos.CurrentRow.Index].Cells["idProd"].Value;
                        prod.Nombre = dgv_OTproductosHijos.Rows[dgv_OTproductosHijos.CurrentRow.Index].Cells["poductoDetalle"].Value.ToString();
                        UnidadMedida unidad = new UnidadMedida();
                        unidad.Nombre = dgv_OTproductosHijos.Rows[dgv_OTproductosHijos.CurrentRow.Index].Cells["unidadMedida"].Value.ToString();
                        prod.Unidad = unidad;
                        orden.producto = prod;
                        orden.cantidad = canti;
                        ActualizarStock act = new ActualizarStock(orden);
                        act.ShowDialog();
                        if (orden.estado != null)
                        {
                            if (orden.estado.Nombre == "LISTO")
                            {
                                MessageBox.Show("Finalizado con éxito", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                                dgv_OTproductosHijos.CurrentRow.DefaultCellStyle.BackColor = Color.LightGreen;
                                dgv_OTproductosHijos.CurrentRow.Cells["cantReal"].Value = orden.cantidadReal;
                            }
                        }
                    }
                    catch (ApplicationException ex)
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    }
                    catch (FormatException ex)
                    {

                        MessageBox.Show("Ingrese solo números", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);

                    }

                }

             }
            dgv_OTproductosHijos.ClearSelection();
        }
        public static void Update(OrdenDeTrabajo ot, SqlConnection cn, SqlTransaction trans)
        {
            Acceso ac = new Acceso();

            string sql="UPDATE [Luiggi].[dbo].[OrdenTrabajo] SET [idOTPadre] = @idPadre WHERE fechaCreacion = @fechaCreacion and idPlan = @idPlan  and idProducto =  @idProducto and idProdIntermedio is Not Null";

            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.AddWithValue("@idPadre", ot.idOrdenTrabajo);
            cmd.Parameters.AddWithValue("@fechaCreacion", ot.fechaCreacion );
            cmd.Parameters.AddWithValue("@idPlan", ot.idPlan );
            cmd.Parameters.AddWithValue("@idProducto", ot.producto.idProducto );

            try
            {
                cmd.Connection = cn;
                cmd.Transaction = trans;
                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;
                cmd.ExecuteNonQuery();

            }
            catch (ArgumentException ex)
            {
                throw new ApplicationException("Error en BD: " + ex.Message);
            }
            catch (SqlException ex)
            {
                throw new ApplicationException("Error en BD: " + ex.Message);
            }
        }
        public static void finalizarOTPadre(OrdenDeTrabajo ot, double canPed, double canPlan, List<DetalleProducto> tabla )
        {
            Acceso ac = new Acceso();

            SqlConnection cn = new SqlConnection(ac.getCadenaConexion());
            SqlTransaction tran=null;

            string sql = "UPDATE [Luiggi].[dbo].[OrdenTrabajo] SET [idEstado] = 20, [cantidadProducidaReal]= @cantreal, [observaciones] = @observaciones WHERE idOrdenTrabajo =  @idOrdenTrabajo ";

            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.AddWithValue("@idOrdenTrabajo", ot.idOrdenTrabajo);
            cmd.Parameters.AddWithValue("@cantreal", ot.cantidadReal);
            cmd.Parameters.AddWithValue("@observaciones", ot.observaciones );

            try
            {
                cn.Open();
                tran = cn.BeginTransaction();
                cmd.Connection = cn;
                cmd.Transaction = tran;
                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;
                cmd.ExecuteNonQuery();

                ProductoDAO.UpdateStockReservadoYDisponibleOTFinalizada(ot.producto.idProducto, canPlan, canPed, cn, tran);

                foreach (DetalleProducto det in tabla)
                {
                    ProductoDAO.UpdateStockReservadoYDisponibleMatiaPrimaOTfinalizada(det.idProducto, det.cantidad, det.cantidadProductos, cn, tran);
                }

                DetallePedidoDAO.finalizarDetalleDePedido(ot.fechaCreacion, ot.producto.idProducto, tran, cn);

                tran.Commit();

            }
            catch (ArgumentException ex)
            {
                tran.Rollback();
                throw new ApplicationException("Error en BD: " + ex.Message);
            }
            catch (SqlException ex)
            {
                tran.Rollback();
                throw new ApplicationException("Error en BD: " + ex.Message);
            }
            finally
            {
                cn.Close();
            }
        }
        public static void InsertPadre(OrdenDeTrabajo OT, List<OrdenDeTrabajo> hijas)
        {
            Acceso ac = new Acceso();
            SqlTransaction tran = null;

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

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

            cmd.Parameters.AddWithValue("@fechaPlan", OT.fechaPlan);
            cmd.Parameters.AddWithValue("@idPlan", OT.idPlan);
            cmd.Parameters.AddWithValue("@idProducto", OT.producto.idProducto);
            cmd.Parameters.AddWithValue("@horaInicio", OT.horaInicio);
            cmd.Parameters.AddWithValue("@horaFin", OT.horaFin);
            //cmd.Parameters.AddWithValue("@idOTPadre", OT.idOrdenTrabajoPadre );
            cmd.Parameters.AddWithValue("@idEstado", OT.estado.idEstado);
            //cmd.Parameters.AddWithValue("@idProductoIntermedio", OT.productoIntermedio.idProducto);
            cmd.Parameters.AddWithValue("@fechaCreacion", OT.fechaCreacion);
            cmd.Parameters.AddWithValue("@idMaquinaria", OT.maquinaria.idMaquinaria);
            cmd.Parameters.AddWithValue("@idEmpleado", OT.empleado.idEmpleado);
            cmd.Parameters.AddWithValue("@cantidad", OT.cantidad);

            try
            {
                conexion.Open();
                tran = conexion.BeginTransaction();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Transaction = tran;
                cmd.ExecuteNonQuery();

                SqlCommand cmdIdentity = new SqlCommand("select @@Identity", conexion, tran);

                OT.idOrdenTrabajo = Convert.ToInt32((cmdIdentity.ExecuteScalar()));

                foreach (OrdenDeTrabajo hija in hijas)
                {
                    InsertHijo(hija, tran, conexion, OT.idOrdenTrabajo);
                }
                //Update(OT,conexion,tran);

                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 InsertHijo(OrdenDeTrabajo  OT, SqlTransaction tran, SqlConnection con, int idPadre)
        {
            SqlCommand cmd = new SqlCommand("sp_insert_OT", con);

            cmd.Parameters.AddWithValue("@fechaPlan", OT.fechaPlan );
            cmd.Parameters.AddWithValue("@idPlan", OT.idPlan );
            cmd.Parameters.AddWithValue("@idProducto", OT.producto.idProducto );
            cmd.Parameters.AddWithValue("@horaInicio", OT.horaInicio );
            cmd.Parameters.AddWithValue("@horaFin", OT.horaFin );
            cmd.Parameters.AddWithValue("@idOTPadre", idPadre );
            cmd.Parameters.AddWithValue("@idEstado", OT.estado.idEstado );
            cmd.Parameters.AddWithValue("@idProductoIntermedio", OT.productoIntermedio.idProducto );
            cmd.Parameters.AddWithValue("@fechaCreacion", OT.fechaCreacion );
            cmd.Parameters.AddWithValue("@idMaquinaria", OT.maquinaria.idMaquinaria );
            cmd.Parameters.AddWithValue("@idEmpleado", OT.empleado.idEmpleado );
            cmd.Parameters.AddWithValue("@cantidad", OT.cantidad);

            try
            {

                cmd.Transaction = tran;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.ExecuteNonQuery();

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

            }
        }
        public static List<OrdenDeTrabajo> GetAllOTPadre()
        {
            Acceso ac = new Acceso();

            List<OrdenDeTrabajo> ordenes = new List<OrdenDeTrabajo>();

            string sql = "SELECT * from CONSULTAR_OT_Padre order by fechaCreacion desc, horaInicio 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();

                Producto p;

                UnidadMedida u;
                Maquinaria m;
                Estado e;
                OrdenDeTrabajo ot;
                Empleado em;
                while (dr.Read())
                {
                    em = new Empleado();
                    em.idEmpleado = Convert.ToInt32(dr["idEmpleado"]);
                    em.Nombre = dr["empleado"].ToString();
                    em.Apellido = dr["apellido"].ToString();

                    e = new Estado();
                    e.idEstado = Convert.ToInt32(dr["idEstado"]);
                    e.Nombre = dr["estado"].ToString();

                    m = new Maquinaria();
                    m.idMaquinaria = Convert.ToInt32(dr["idMaquinaria"]);
                    m.Nombre = dr["maquinaria"].ToString();

                    u = new UnidadMedida();

                    u.Nombre = dr["unidad"].ToString();

                    //c = new Categoria();
                    ////c.IDCategoria = Convert.ToInt32(dr["idCategoria"]);
                    //c.Nombre = dr["categoria"].ToString();

                    p = new Producto();
                    p.idProducto = Convert.ToInt32(dr["idProducto"]);
                    p.Nombre = dr["producto"].ToString();
                    //p.Categoria = c;
                    p.Unidad = u;

                    ot = new OrdenDeTrabajo();

                    ot.idOrdenTrabajo = Convert.ToInt32(dr["idOrdenTrabajo"]);
                    ot.idPlan = Convert.ToInt32(dr["idPlan"]);
                    ot.fechaPlan = Convert.ToDateTime(dr["fechaPlan"]);
                    ot.horaInicio = Convert.ToDateTime(dr["horaInicio"]);
                    ot.horaFin = Convert.ToDateTime(dr["horaFin"]);
                    ot.fechaCreacion = Convert.ToDateTime(dr["fechaCreacion"]);
                    ot.estado = e;
                    ot.empleado = em;
                    ot.maquinaria = m;
                    ot.producto = p;
                    ot.cantidadReal = Convert.ToDouble(dr["cantReal"]);
                    ot.cantidad = Convert.ToDouble(dr["cantidad"]);
                    ordenes.Add(ot);

                }

            }

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

            return ordenes;
        }
        public static List<OrdenDeTrabajo> GetAllOTHija(int idProd, DateTime fecha, int idPlan)
        {
            Acceso ac = new Acceso();

            List<OrdenDeTrabajo> ordenes = new List<OrdenDeTrabajo>();

            string sql = "SELECT * from CONSULTAR_OT_HIJA where fechaCreacion = @fecha and idPlan = @idPlan and idProducto = @idProd ";
            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.AddWithValue("@fecha", fecha);
            cmd.Parameters.AddWithValue("@idPlan", idPlan);
            cmd.Parameters.AddWithValue("@idProd", idProd);
            SqlConnection conexion = new SqlConnection(ac.getCadenaConexion());

            try
            {
                conexion.Open();

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

                SqlDataReader dr = cmd.ExecuteReader();

                Producto pi;
                //Categoria c;
                UnidadMedida u;
                Maquinaria m;
                Estado e;
                OrdenDeTrabajo ot;
                Empleado em;
                while (dr.Read())
                {
                    em = new Empleado();
                    em.idEmpleado = Convert.ToInt32(dr["idEmpleado"]);
                    em.Nombre = dr["nombre"].ToString();
                    em.Apellido = dr["apellido"].ToString();

                    e = new Estado();
                    e.idEstado = Convert.ToInt32(dr["idEstado"]);
                    e.Nombre = dr["estado"].ToString();

                    m = new Maquinaria();
                    m.idMaquinaria  = Convert.ToInt32(dr["idMaquinaria"]);
                    m.Nombre = dr["maquinaria"].ToString();

                    u = new UnidadMedida();
                    u.Nombre = dr["unidad"].ToString();

                    pi = new Producto();
                    pi.idProducto = Convert.ToInt32(dr["idProdIntermedio"]);
                    pi.Nombre = dr["nombreHijo"].ToString();
                    //pi.Categoria = c;
                    pi.Unidad = u;

                    ot = new OrdenDeTrabajo();

                    ot.idOrdenTrabajo = Convert.ToInt32(dr["idOrdenTrabajo"]);
                    ot.idOrdenTrabajoPadre = Convert.ToInt32(dr["idOTPadre"]);
                    //ot.fechaPlan = Convert.ToDateTime(dr["fechaPlan"]);
                    ot.horaInicio = Convert.ToDateTime(dr["horaInicio"]);
                    ot.horaFin = Convert.ToDateTime(dr["horaFin"]);
                    ot.fechaCreacion = Convert.ToDateTime(dr["fechaCreacion"]);
                    ot.estado = e;
                    ot.empleado = em;
                    ot.maquinaria = m;

                    ot.productoIntermedio = pi;
                    ot.cantidad = Convert.ToDouble (dr["cantidad"]);
                    ot.cantidadReal = Convert.ToDouble(dr["cantReal"]);

                    ordenes.Add(ot);

                }

            }

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

            return ordenes;
        }
        public static void finalizarOTHija(OrdenDeTrabajo ot, List<DetalleProducto> tabla)
        {
            Acceso ac = new Acceso();

            SqlConnection cn = new SqlConnection(ac.getCadenaConexion());
            SqlTransaction tran = null;

            string sql = "UPDATE [Luiggi].[dbo].[OrdenTrabajo] SET [idEstado] = 20, [cantidadProducidaReal]= @cantreal, [observaciones] = @observaciones WHERE idOrdenTrabajo =  @idOrdenTrabajo ";

            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.AddWithValue("@idOrdenTrabajo", ot.idOrdenTrabajo);
            cmd.Parameters.AddWithValue("@cantreal",ot.cantidadReal);
            cmd.Parameters.AddWithValue("@observaciones", ot.observaciones);

            try
            {
                cn.Open();
                tran = cn.BeginTransaction();
                cmd.Connection = cn;
                cmd.Transaction = tran;
                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;
                cmd.ExecuteNonQuery();

                //ACTUALIZAR EL STOCK DE PROD INTERMEDIOS
                if (ot.cantidad >= ot.cantidadReal)
                {
                    sql = "Update Producto set stockActual = stockActual + @cantreal, stockReservado = stockReservado + @cantreal where idProducto = @idProducto";
                    cmd.CommandText = sql;
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddWithValue("@idProducto", ot.producto.idProducto);
                    cmd.Parameters.AddWithValue("@cantreal", ot.cantidadReal);
                    cmd.ExecuteNonQuery();
                }
                if (ot.cantidad < ot.cantidadReal)
                {
                    sql = "Update Producto set stockActual = stockActual + @cantreal, stockReservado = stockReservado + @cant, stockDisponible = stockDisponible + @cantreal - @cant where idProducto = @idProducto";
                    cmd.CommandText = sql;
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddWithValue("@idProducto", ot.producto.idProducto);
                    cmd.Parameters.AddWithValue("@cantreal", ot.cantidadReal);
                    cmd.Parameters.AddWithValue("@cant", ot.cantidad);
                    cmd.ExecuteNonQuery();
                }
                ////////////////////////////////////////////
                //ACTUALIZAR EL STOCK DE INSUMOS
                foreach (DetalleProducto det in tabla)
                {
                    ProductoDAO.UpdateStockReservadoYDisponibleMatiaPrimaOTfinalizada(det.idProducto, det.cantidad, det.cantidadProductos, cn, tran);
                }
                //////////////////////////////////////

                tran.Commit();

            }
            catch (ArgumentException ex)
            {
                tran.Rollback();
                throw new ApplicationException("Error en BD: " + ex.Message);
            }
            catch (SqlException ex)
            {
                tran.Rollback();
                throw new ApplicationException("Error en BD: " + ex.Message);
            }
            finally
            {
                cn.Close();
            }
        }