diff --git a/OP/OP.aspx b/OP/OP.aspx
index 4bb7a8c47..82f0c1184 100644
--- a/OP/OP.aspx
+++ b/OP/OP.aspx
@@ -776,6 +776,16 @@
+
+
+
+
@@ -877,6 +887,73 @@
+
+
+
+
+
+
+
+
+
+
Materia Prima
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -892,7 +969,7 @@
}
}
-
+
diff --git a/OP/OP.aspx.vb b/OP/OP.aspx.vb
index d53c63686..da0815cfa 100644
--- a/OP/OP.aspx.vb
+++ b/OP/OP.aspx.vb
@@ -107,6 +107,8 @@ Partial Class OP_OP
CreaPS()
SetValues()
End If
+
+ BtnCancelarOP.Visible = (CveOP > 0 AndAlso TipoEstatus <> 3 AndAlso TipoEstatus <> 4)
End Sub
Private Sub CreaPS()
@@ -900,6 +902,133 @@ Partial Class OP_OP
End If
End Sub
+#Region "Cancelar"
+ Protected Sub BtnCancelarOP_Click(sender As Object, e As EventArgs)
+ ' Cargar almacenes
+ DdlAlmacenSalidaMP.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 1")
+ DdlAlmacenSalidaMP.DataBind()
+ DdlAlmacenDevolucionCancel.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 1")
+ DdlAlmacenDevolucionCancel.DataBind()
+ DdlAlmacenMermas.DataSource = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltraParametros("CveTipoAlmacen = 1")
+ DdlAlmacenMermas.DataBind()
+
+ ' Cargar MP
+ GvMPCancelacion.DataSource = DtMP.FiltraParametros("Tipo = 'MP'")
+ GvMPCancelacion.DataBind()
+
+ RegistraScript("$('#DVModalCancelarOP').modal('show');")
+ UpModalCancelar.Update()
+ End Sub
+
+ Protected Sub BtnAceptarCancelacion_Click(sender As Object, e As EventArgs)
+ Dim ObjInventario As New ClsInventarios()
+ Dim TieneError As Boolean = False
+ Dim MensajeError As String = ""
+ ObjInventario.IniciaTransacSQL()
+ Dim ObjConta As New ClsContabilidad(ObjInventario.IniciaTransacSQL())
+ Dim ObjOP As New ClsOP(ObjInventario.IniciaTransacSQL())
+
+ Try
+
+
+ ' Validaciones
+ If DdlAlmacenSalidaMP.SelectedValue = "-1" OrElse
+ DdlAlmacenDevolucionCancel.SelectedValue = "-1" Then
+ Throw New Exception("Seleccione todos los almacenes requeridos")
+ End If
+
+ ' 1. Movimiento de Salida MP
+ Dim CveMovSalida As Integer = ObjInventario.AddMovimiento(
+ DdlAlmacenSalidaMP.SelectedValue.ToEntero(), 26, 1, NowADS, -1,
+ UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa,
+ Observaciones:="Cancelación OP #" & LblFolio.Text)
+
+ ' 2. Movimiento de Entrada Devoluciones
+ Dim CveMovEntradaDev As Integer = ObjInventario.AddMovimiento(
+ DdlAlmacenDevolucionCancel.SelectedValue.ToEntero(), 27, 1, NowADS, -1,
+ UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa)
+
+ ' 3. Procesar cada material
+ For Each row As GridViewRow In GvMPCancelacion.Rows
+ Dim Cantidad As Decimal = CDec(row.Cells(2).Text)
+ Dim Merma As Decimal = row.FCTextBox("TxtMerma").Text.ToDecimal()
+ Dim Devolucion As Decimal = row.FCTextBox("TxtDevolucionCancel").Text.ToDecimal()
+
+ If (Merma + Devolucion) > Cantidad Then
+ Throw New Exception("La suma de merma y devolución no puede exceder la cantidad")
+ End If
+
+ Dim CvePS As Integer = GvMPCancelacion.DataKeys(row.RowIndex).Values(0)
+ Dim CveUM As Integer = GvMPCancelacion.DataKeys(row.RowIndex).Values(1)
+
+ ' Registrar salida
+ ObjInventario.AddMovimientoDetalle(CveMovSalida, Cantidad, CveUM, CvePS, 0)
+
+ ' Registrar devolución
+ If Devolucion > 0 Then
+ ObjInventario.AddMovimientoDetalle(CveMovEntradaDev, Devolucion, CveUM, CvePS, 0)
+ End If
+ Next
+
+ ' 4. Registrar mermas si existen
+ Dim TotalMermas As Decimal = 0
+ If DdlAlmacenMermas.SelectedValue <> "-1" Then
+ Dim CveMovMerma As Integer = ObjInventario.AddMovimiento(
+ DdlAlmacenMermas.SelectedValue.ToEntero(), 26, 1, NowADS, -1,
+ UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa)
+
+ For Each row As GridViewRow In GvMPCancelacion.Rows
+ Dim Merma As Decimal = row.FCTextBox("TxtMerma").Text.ToDecimal()
+ If Merma > 0 Then
+ Dim CvePS As Integer = GvMPCancelacion.DataKeys(row.RowIndex).Values(0)
+ Dim CveUM As Integer = GvMPCancelacion.DataKeys(row.RowIndex).Values(1)
+ ObjInventario.AddMovimientoDetalle(CveMovMerma, Merma, CveUM, CvePS, 0)
+ TotalMermas += Merma
+ End If
+ Next
+ End If
+
+ ' 5. Generar pólizas contables
+ Dim CvePrePoliza As Integer = ObjConta.AddPrePolizas("OP/Cancelacion", 53, 0, 0, 1, NowADS,
+ "Cancelación OP #" & LblFolio.Text,
+ UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa)
+
+ ' Salida MP (Abono 68)
+ ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, TotalMP, TotalMP, 68, "Salida MP Cancelación")
+
+ ' Entrada Devoluciones (Cargo 68)
+ ObjConta.AddPrePolizasDetalle(CvePrePoliza, False, TotalDevoluciones, TotalDevoluciones, 68, "Devoluciones Cancelación")
+
+ If TotalMermas > 0 Then
+ ' Salida Mermas (Abono 68)
+ ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, TotalMermas, TotalMermas, 68, "Mermas Cancelación")
+ ' Cargo Mermas (95)
+ ObjConta.AddPrePolizasDetalle(CvePrePoliza, False, TotalMermas, TotalMermas, 95, "Ajuste por Mermas")
+ End If
+
+ ' 6. Actualizar estatus OP
+
+ If ObjOP.UpdateEstatusOP(CveOP, 4, UsuarioActual.CveEmpresa) Then
+ ObjInventario.Commit()
+ TxtEstatus.Text = "Cancelado"
+ BtnCancelarOP.Visible = False
+ UpOP.Update()
+ RegistraScript("$('#DVModalCancelarOP').modal('hide');")
+ Alert("OP cancelada correctamente", TipoMensaje.MsgInformacion)
+ Else
+ Throw New Exception("Error al actualizar el estatus de la OP")
+ End If
+
+ Catch ex As Exception
+ ObjInventario.RollBack()
+ Alert($"Error: {ex.Message}", TipoMensaje.MsgError)
+ Finally
+ ObjInventario.Dispose()
+ ObjConta.Dispose()
+ End Try
+ End Sub
+#End Region
+
#Region "Finalizar"