diff --git a/OP/OP.aspx b/OP/OP.aspx index 5ee985b8d..fe32d2f50 100644 --- a/OP/OP.aspx +++ b/OP/OP.aspx @@ -175,6 +175,8 @@ + @@ -233,6 +235,13 @@ + + +
+ +
diff --git a/OP/OP.aspx.vb b/OP/OP.aspx.vb index fe1b4e75e..9d92e2ee3 100644 --- a/OP/OP.aspx.vb +++ b/OP/OP.aspx.vb @@ -195,7 +195,7 @@ Partial Class OP_OP rowMP("Tipo") = "MP" rowMP("Clave") = CvePS rowMP("Producto") = drMP("producto").ToString() - rowMP("UnidadMedida") = drMP("UnidadMedida").ToString() + rowMP("UnidadMedida") = drMP("UnidadMedidaMateriaPrima").ToString() rowMP("Cantidad") = drMP("Cantidad").ToString().ToDecimal() rowMP("Surtido") = 0 DtMP.Rows.Add(rowMP) @@ -231,22 +231,172 @@ Partial Class OP_OP ActualizarGrids() End Sub + Protected Sub BtnEliminarProducto_Click(sender As Object, e As EventArgs) + If DdlPS.SelectedValue = "-1" Then + Alert("Seleccione un producto del listado.", TipoMensaje.MsgAdvertencia) + Return + End If + + Dim CveProducto As Integer = DdlPS.SelectedValue.ToEntero() + + Dim filasProducto As DataRow() = DtPS.Select($"Clave = {CveProducto}") + If filasProducto.Length > 0 Then + DtPS.Rows.Remove(filasProducto(0)) + End If + + EliminarDatosRelacionados(CveProducto) + + ActualizarGrids() + End Sub + + Private Sub EliminarDatosRelacionados(CveProducto As Integer) + Dim filasMP As DataRow() = DtMP.Select($"Clave = {CveProducto}") + For Each fila As DataRow In filasMP + DtMP.Rows.Remove(fila) + Next + + Dim filasMO As DataRow() = DtMO.Select($"Clave = {CveProducto}") + For Each fila As DataRow In filasMO + DtMO.Rows.Remove(fila) + Next + + Dim filasCI As DataRow() = DtCI.Select($"Clave = {CveProducto}") + For Each fila As DataRow In filasCI + DtCI.Rows.Remove(fila) + Next + End Sub + + Protected Sub BtnGuardarOP_Click(sender As Object, e As EventArgs) + ' Validar campos obligatorios + If DdlClientes.SelectedValue = "-1" Then + Alert("Seleccione un cliente.", TipoMensaje.MsgAdvertencia) + Return + End If + + If DtPS.Rows.Count = 0 Then + Alert("Agregue al menos un producto.", TipoMensaje.MsgAdvertencia) + Return + End If + + ' Iniciar transacción + Dim clsOP As New ClsOP() + clsOP.IniciaTransacSQL() + + Try + ' Insertar/Actualizar cabecera de la OP usando UpdateOP + Dim CveOP As Integer = Me.CveOP ' Si es nuevo, CveOP = -1 + Dim Success As Boolean = clsOP.UpdateOP( + CveOP:=CveOP, + Descripcion:=TxtDescripcion.Text, + CveCliente:=DdlClientes.SelectedValue.ToEntero(), + CvePS:=DdlPS.SelectedValue.ToEntero(), + CveSubProyecto:=DdlSubProyecto.SelectedValue.ToEntero(), + Cantidad:=1, ' Ajustar según lógica de negocio + Fecha:=Convert.ToDateTime(Txtfecha.Text), + CveEmpresa:=UsuarioActual.CveEmpresa, + CveUsuario:=UsuarioActual.CveUsuario + ) + + If Not Success Then + Throw New Exception("Error al guardar la cabecera de la OP.") + End If + + ' Obtener el CveOP generado (asumiendo que se actualiza en la propiedad) + If Me.CveOP = -1 Then + ' Si es nuevo, recuperar el CveOP de la base de datos + ' (Requiere que el SP PA_OP_OrdendeProduccionUp devuelva el ID) + ' Esto depende de la implementación del SP. + ' Ejemplo hipotético: + clsOP.GetOP(-1, DdlClientes.SelectedValue.ToEntero(), DdlSubProyecto.SelectedValue.ToEntero(), -1, -1, -1, MinFecha, MaxFecha, UsuarioActual.CveEmpresa) + If clsOP.DtResultados.Rows.Count > 0 Then + Me.CveOP = clsOP.DtResultados.Rows(0)("CveOP").ToString.ToEntero() + End If + End If + + ' Insertar detalles de Productos, MP, MO, CI + For Each drProducto As DataRow In DtPS.Rows + Dim CvePS As Integer = drProducto("Clave").ToString().ToEntero() + + ' Insertar Materia Prima relacionada + For Each drMP As DataRow In DtMP.Select($"Clave = {CvePS}") + clsOP.AddMP( + Cantidad:=drMP("Cantidad").ToString().ToDecimal(), + CvePS:=CvePS, + CvePSMateriaPrima:=drMP("CvePSMateriaPrima").ToString().ToEntero(), + CveUM:=drMP("CveUM").ToString().ToEntero(), + CveUMMateriaPrima:=drMP("CveUMMateriaPrima").ToString().ToEntero() + ) + Next + + ' Insertar Mano de Obra relacionada + For Each drMO As DataRow In DtMO.Select($"Clave = {CvePS}") + clsOP.AddMO( + Cantidad:=drMO("Cantidad").ToString().ToDecimal(), + CvePS:=CvePS, + CvePuesto:=drMO("CvePuesto").ToString().ToEntero(), + CveUM:=drMO("CveUM").ToString().ToEntero() + ) + Next + + ' Insertar Costos Indirectos relacionados + For Each drCI As DataRow In DtCI.Select($"Clave = {CvePS}") + clsOP.AddCI( + Cantidad:=drCI("Cantidad").ToString().ToDecimal(), + CvePS:=CvePS, + CvePSMateriaPrima:=drCI("CvePSMateriaPrima").ToString().ToEntero(), + CveUM:=drCI("CveUM").ToString().ToEntero(), + CveUMMateriaPrima:=drCI("CveUMMateriaPrima").ToString().ToEntero() + ) + Next + Next + + ' Commit si todo es exitoso + clsOP.Commit() + Alert("Orden de Producción guardada correctamente.", TipoMensaje.MsgInformacion) + Response.Redirect($"OP.aspx?CveOP={Me.CveOP}") ' Redirigir a la OP guardada + + Catch ex As Exception + ' Rollback en caso de error + clsOP.RollBack() + Alert($"Error al guardar: {ex.Message}", TipoMensaje.MsgError) + Finally + clsOP.Dispose() + End Try + End Sub + Private Sub ActualizarGrids() - GvProductos.DataSource = DtPS.Select("Tipo = 'Producto'").CopyToDataTable() + Dim dtProductosFiltrados As DataTable = DtPS.Clone() ' Clona la estructura + Dim rowsProductos As DataRow() = DtPS.Select("Tipo = 'Producto'") + If rowsProductos.Length > 0 Then + dtProductosFiltrados = rowsProductos.CopyToDataTable() + End If + GvProductos.DataSource = dtProductosFiltrados GvProductos.DataBind() - - GvMateriaPrima.DataSource = DtMP.Select("Tipo = 'MP'").CopyToDataTable() + Dim dtMPFiltrados As DataTable = DtMP.Clone() + Dim rowsMP As DataRow() = DtMP.Select("Tipo = 'MP'") + If rowsMP.Length > 0 Then + dtMPFiltrados = rowsMP.CopyToDataTable() + End If + GvMateriaPrima.DataSource = dtMPFiltrados GvMateriaPrima.DataBind() - GvManoObra.DataSource = DtMO.Select("Tipo = 'MO'").CopyToDataTable() + Dim dtMOFiltrados As DataTable = DtMO.Clone() + Dim rowsMO As DataRow() = DtMO.Select("Tipo = 'MO'") + If rowsMO.Length > 0 Then + dtMOFiltrados = rowsMO.CopyToDataTable() + End If + GvManoObra.DataSource = dtMOFiltrados GvManoObra.DataBind() - - GvCostosIndirectos.DataSource = DtCI.Select("Tipo = 'CI'").CopyToDataTable() + Dim dtCIFiltrados As DataTable = DtCI.Clone() + Dim rowsCI As DataRow() = DtCI.Select("Tipo = 'CI'") + If rowsCI.Length > 0 Then + dtCIFiltrados = rowsCI.CopyToDataTable() + End If + GvCostosIndirectos.DataSource = dtCIFiltrados GvCostosIndirectos.DataBind() - UpGvDatosOP.Update() End Sub