diff --git a/App_Code/Modelos.vb b/App_Code/Modelos.vb
index d35d6198d..20b07a50d 100644
--- a/App_Code/Modelos.vb
+++ b/App_Code/Modelos.vb
@@ -5664,16 +5664,16 @@ Namespace Modelos
'''
'''
'''
- Public Function CancelarFactura(RealizarDevolucionAlmacen As Integer, Optional ListaRemisionesCancelar As List(Of Integer) = Nothing, Optional CveMotivoCancelacion As Integer = -1, Optional Motivo As String = "", Optional ValidarSAT As Boolean = True, Optional CveEstadoCancelacion As Integer = 0, Optional CancelarBoletos As Boolean = False, Optional AplicaCancelacionConPagos As Boolean = False, Optional GeneraIxCconPago As Boolean = False) As MCancelacionVentaMensaje
+ Public Function CancelarFactura(RealizarDevolucionAlmacen As Integer, Optional ListaRemisionesCancelar As List(Of Integer) = Nothing, Optional CveMotivoCancelacion As Integer = -1, Optional Motivo As String = "", Optional ValidarSAT As Boolean = True, Optional CveEstadoCancelacion As Integer = 0, Optional CancelarBoletos As Boolean = False, Optional AplicaCancelacionConPagos As Boolean = False, Optional GeneraIxCconPago As Boolean = False, Optional ForzarDevolucion As Boolean = False) As MCancelacionVentaMensaje
'Comprobante emitido con errores sin relación
- Return CancelarVenta(Me, Me.UsuarioActual, RealizarDevolucionAlmacen:=RealizarDevolucionAlmacen, ListaRemisionesCancelar:=ListaRemisionesCancelar, CveMotivoCancelacion:=CveMotivoCancelacion, MotivoCancelacion:=Motivo, CveEstadoCancelacion:=CveEstadoCancelacion, CancelarBoletos:=CancelarBoletos, AplicaCancelacionConPagos:=AplicaCancelacionConPagos, GeneraIxCconPago:=GeneraIxCconPago)
+ Return CancelarVenta(Me, Me.UsuarioActual, RealizarDevolucionAlmacen:=RealizarDevolucionAlmacen, ListaRemisionesCancelar:=ListaRemisionesCancelar, CveMotivoCancelacion:=CveMotivoCancelacion, MotivoCancelacion:=Motivo, CveEstadoCancelacion:=CveEstadoCancelacion, CancelarBoletos:=CancelarBoletos, AplicaCancelacionConPagos:=AplicaCancelacionConPagos, GeneraIxCconPago:=GeneraIxCconPago, ForzarDevolucion:=ForzarDevolucion)
End Function
Private Function CancelarVenta(ObjFactura As Modelos.Factura, UsuarioActual As Usuario, Optional EsRefacturacion As Boolean = False, Optional RealizarDevolucionAlmacen As Integer = 0,
Optional ListaRemisionesCancelar As List(Of Integer) = Nothing, Optional CveEstatusFacturaAsignado As Integer = -1, Optional FechaCancelacion As String = "-1",
Optional AcuseCancelacion As String = "", Optional CveMotivoCancelacion As Integer = -1, Optional MotivoCancelacion As String = "",
Optional FolioSustitucion As String = "", Optional ValidarSAT As Boolean = True, Optional CveEstadoCancelacion As Integer = 0,
- Optional CancelarBoletos As Boolean = False, Optional AplicaCancelacionConPagos As Boolean = False, Optional GeneraIxCconPago As Boolean = False) As MCancelacionVentaMensaje
+ Optional CancelarBoletos As Boolean = False, Optional AplicaCancelacionConPagos As Boolean = False, Optional GeneraIxCconPago As Boolean = False, Optional ForzarDevolucion As Boolean = False) As MCancelacionVentaMensaje
Dim Retorno As New MCancelacionVentaMensaje()
Dim ErrorList As New List(Of String)
@@ -6185,275 +6185,398 @@ Namespace Modelos
End If
+ Dim MoverInventario As Boolean = False
+
+ If TieneAlmacen Then
+ MoverInventario = (Not EsRefacturacion AndAlso (CveEstatus > 0 AndAlso Not CveEstatus.Contiene(20, 23)) AndAlso CveEstatusRefacturacion = 0) OrElse ForzarDevolucion
+ End If
+
'CUANDO LA CANCELACION ESTA EN PROCESO NO DEBE REALIZAR NADA DE ESTE PROCESO
- If Not ErrorCancelar AndAlso Not EsRefacturacion AndAlso (CveEstatus > 0 AndAlso Not CveEstatus.Contiene(20, 23)) AndAlso CveEstatusRefacturacion = 0 Then
+ If Not ErrorCancelar AndAlso MoverInventario Then
'DEVOLUCION DE ALMACEN
- If Not ErrorCancelar AndAlso TieneAlmacen Then
- Dim TieneSalida As Boolean = False
- Dim DtInventario As DataTable = Nothing
- Dim DtSalidas As DataTable = Nothing
- Dim DtVirtuales As DataTable = Nothing
- Dim DtDevPrevias As DataTable = Nothing
- Dim DtDevoluciones As DataTable = Nothing
- Dim DtExistencias As DataTable = Nothing
- Dim DtRemisionesFacturadas As DataTable = Nothing
+ Dim TieneSalida As Boolean = False
+ Dim DtInventario As DataTable = Nothing
+ Dim DtSalidas As DataTable = Nothing
+ Dim DtVirtuales As DataTable = Nothing
+ Dim DtDevPrevias As DataTable = Nothing
+ Dim DtDevoluciones As DataTable = Nothing
+ Dim DtExistencias As DataTable = Nothing
+ Dim DtRemisionesFacturadas As DataTable = Nothing
- 'CUANDO SE VAYA A REALIZAR LA DEVOLUCION AQUI DEBE MARCALA PARA NO SOLICITARLA DE NUEVO, SI NO LA SOLICITARA
- If ObjFactura.EsDevolucionVenta = 0 Then
- Dim EstatusDevolucion As Integer = 1
- If Not ObjVentas.UpdateVentasDevolucionAlmacen(EstatusDevolucion, CveVenta) Then
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al solicitar la devolución de almacen."
- End If
+ 'CUANDO SE VAYA A REALIZAR LA DEVOLUCION AQUI DEBE MARCALA PARA NO SOLICITARLA DE NUEVO, SI NO LA SOLICITARA
+ If ObjFactura.EsDevolucionVenta = 0 Then
+ Dim EstatusDevolucion As Integer = 1
+ If Not ObjVentas.UpdateVentasDevolucionAlmacen(EstatusDevolucion, CveVenta) Then
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al solicitar la devolución de almacen."
+ End If
+ End If
+
+ If Not ErrorCancelar Then
+ Dim Filtro As String = ""
+ Dim FiltroDevAlmacen As String = ""
+ Dim FiltroEntradaUsados As String = ""
+
+ Select Case ObjFactura.TipoDocto
+ Case "Ing"
+ Filtro = "CveConcepto IN (3, 40)"
+ FiltroDevAlmacen = "CveConcepto IN (18, 41)"
+ Case "Dev"
+ Filtro = "CveConcepto = 18"
+ Case Else
+ Filtro = "CveConcepto = 9"
+ 'VERIFICA SI TIENE ENTRADAS DE USADOS TAMBIEN
+ If UsuarioActual.Empresa.Funcionalidad(531) = "1" AndAlso ObjFactura.TipoDocto = "Rem" Then
+ FiltroEntradaUsados = "CveConcepto = 42"
+ End If
+ End Select
+
+ 'CARGA REMISIONES DE LA VENTA DEVUELTA
+ If ObjInventario.GetDevolucionRemisionesFacturadas(CveVenta) Then
+ DtRemisionesFacturadas = ObjInventario.DtResultados.FiltraParametros("CantidadAlmacen > 0")
+ Else
+ ErrorCancelar = True
End If
If Not ErrorCancelar Then
- Dim Filtro As String = ""
- Dim FiltroDevAlmacen As String = ""
- Dim FiltroEntradaUsados As String = ""
+ If ObjInventario.GetInv_Mov(CveVenta, UsuarioActual.CveEmpresa) Then
+ DtInventario = ObjInventario.DtResultados.Copy()
+ DtSalidas = DtInventario.FiltraParametros($"CvePS IS NULL AND {Filtro}")
- Select Case ObjFactura.TipoDocto
- Case "Ing"
- Filtro = "CveConcepto IN (3, 40)"
- FiltroDevAlmacen = "CveConcepto IN (18, 41)"
- Case "Dev"
- Filtro = "CveConcepto = 18"
- Case Else
- Filtro = "CveConcepto = 9"
- 'VERIFICA SI TIENE ENTRADAS DE USADOS TAMBIEN
- If UsuarioActual.Empresa.Funcionalidad(531) = "1" AndAlso ObjFactura.TipoDocto = "Rem" Then
- FiltroEntradaUsados = "CveConcepto = 42"
+ If UsuarioActual.Empresa.Funcionalidad(573) = "1" Then
+ DtVirtuales = DtInventario.FiltraParametros($"CvePS IS NULL AND CveConcepto = 37")
+ If ObjFactura.TipoDocto = "Dev" Then
+ DtVirtuales = DtInventario.FiltraParametros($"CvePS IS NULL AND CveConcepto = 36")
End If
- End Select
+ End If
- 'CARGA REMISIONES DE LA VENTA DEVUELTA
- If ObjInventario.GetDevolucionRemisionesFacturadas(CveVenta) Then
- DtRemisionesFacturadas = ObjInventario.DtResultados.FiltraParametros("CantidadAlmacen > 0")
+ If ObjFactura.TipoDocto = "Ing" Then
+ DtDevPrevias = DtInventario.FiltraParametros($"CvePS IS NULL AND {FiltroDevAlmacen}")
+ End If
+
+ DtExistencias = DtInventario.FiltraParametros($"CvePS IS NOT NULL AND {Filtro} AND CveTipoPS = 2")
+ TieneSalida = DtExistencias.Rows.Count > 0
+
+ 'VERIFICA SI SOLO TIENE CARGA DE USADOS EN CASO DE NO TENER SALIDAS DE ALMACEN
+ If UsuarioActual.Empresa.Funcionalidad(531) = "1" AndAlso ObjFactura.TipoDocto = "Rem" Then
+ FiltroEntradaUsados = "CveConcepto = 42"
+ If Not TieneSalida Then
+ TieneSalida = DtInventario.FiltraParametros($"CvePS IS NOT NULL AND {FiltroEntradaUsados}").Rows.Count > 0
+ End If
+ End If
Else
ErrorCancelar = True
+ MensajeError = "Ocurrió un error al cargar los datos de devolución. Por favor vuelva a intentar."
End If
-
- If Not ErrorCancelar Then
- If ObjInventario.GetInv_Mov(CveVenta, UsuarioActual.CveEmpresa) Then
- DtInventario = ObjInventario.DtResultados.Copy()
- DtSalidas = DtInventario.FiltraParametros($"CvePS IS NULL AND {Filtro}")
-
- If UsuarioActual.Empresa.Funcionalidad(573) = "1" Then
- DtVirtuales = DtInventario.FiltraParametros($"CvePS IS NULL AND CveConcepto = 37")
- If ObjFactura.TipoDocto = "Dev" Then
- DtVirtuales = DtInventario.FiltraParametros($"CvePS IS NULL AND CveConcepto = 36")
- End If
- End If
-
- If ObjFactura.TipoDocto = "Ing" Then
- DtDevPrevias = DtInventario.FiltraParametros($"CvePS IS NULL AND {FiltroDevAlmacen}")
- End If
-
- DtExistencias = DtInventario.FiltraParametros($"CvePS IS NOT NULL AND {Filtro} AND CveTipoPS = 2")
- TieneSalida = DtExistencias.Rows.Count > 0
-
- 'VERIFICA SI SOLO TIENE CARGA DE USADOS EN CASO DE NO TENER SALIDAS DE ALMACEN
- If UsuarioActual.Empresa.Funcionalidad(531) = "1" AndAlso ObjFactura.TipoDocto = "Rem" Then
- FiltroEntradaUsados = "CveConcepto = 42"
- If Not TieneSalida Then
- TieneSalida = DtInventario.FiltraParametros($"CvePS IS NOT NULL AND {FiltroEntradaUsados}").Rows.Count > 0
- End If
- End If
- Else
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al cargar los datos de devolución. Por favor vuelva a intentar."
- End If
- End If
-
End If
- If Not ErrorCancelar AndAlso TieneSalida Then
+ End If
- If Not ErrorCancelar AndAlso RealizarDevolucionAlmacen = 1 Then
- 'REALIZA DEVOLUCION A LAS SALIDAS PENDIENTES
- If Not ObjFactura.TipoDocto.Contiene("Rem", "Ped") Then
- For Each RowMovimiento As DataRow In DtSalidas.Rows
- Dim CveConceptoMovimiento As Integer = -1
- Dim CveAlmacenMovimiento As Integer = -1
+ If Not ErrorCancelar AndAlso TieneSalida Then
+ If Not ErrorCancelar AndAlso RealizarDevolucionAlmacen = 1 Then
+ 'REALIZA DEVOLUCION A LAS SALIDAS PENDIENTES
+ If Not ObjFactura.TipoDocto.Contiene("Rem", "Ped") Then
+ For Each RowMovimiento As DataRow In DtSalidas.Rows
+ Dim CveConceptoMovimiento As Integer = -1
+ Dim CveAlmacenMovimiento As Integer = -1
- Dim CveMovimientoDevolucion As Integer = 0
- Dim Folio As Integer = 0
+ Dim CveMovimientoDevolucion As Integer = 0
+ Dim Folio As Integer = 0
- Dim CveMovimientoSalida As Integer = -1
+ Dim CveMovimientoSalida As Integer = -1
- Select Case RowMovimiento("CveConcepto").ToString().ToEntero()
- Case 3
- CveConceptoMovimiento = 18 'DEVOLUCION DEL CLIENTE
- CveAlmacenMovimiento = RowMovimiento("CveAlmacen").ToString().ToEntero()
- CveMovimientoSalida = RowMovimiento("CveMovimiento").ToString().ToEntero()
- Case 40
- CveConceptoMovimiento = 41 'DEVOLUCIÓN DEL CLIENTE DIRECTA
- CveAlmacenMovimiento = RowMovimiento("CveAlmacen").ToString().ToEntero()
- Case 18
- CveConceptoMovimiento = 3 'SALIDA DE ALMACEN
- CveAlmacenMovimiento = RowMovimiento("CveAlmacen").ToString().ToEntero()
- ''SI TIENE REMISIONES RELACIONADAS
- 'If DtRemisionesFacturadas.Rows.Count > 0 Then
- ' Dim RowRemision As DataRow = DtExistencias.FiltroPrimero($"CveMovimiento = {RowMovimiento("CveMovimiento").ToString()}")
+ Select Case RowMovimiento("CveConcepto").ToString().ToEntero()
+ Case 3
+ CveConceptoMovimiento = 18 'DEVOLUCION DEL CLIENTE
+ CveAlmacenMovimiento = RowMovimiento("CveAlmacen").ToString().ToEntero()
+ CveMovimientoSalida = RowMovimiento("CveMovimiento").ToString().ToEntero()
+ Case 40
+ CveConceptoMovimiento = 41 'DEVOLUCIÓN DEL CLIENTE DIRECTA
+ CveAlmacenMovimiento = RowMovimiento("CveAlmacen").ToString().ToEntero()
+ Case 18
+ CveConceptoMovimiento = 3 'SALIDA DE ALMACEN
+ CveAlmacenMovimiento = RowMovimiento("CveAlmacen").ToString().ToEntero()
+ ''SI TIENE REMISIONES RELACIONADAS
+ 'If DtRemisionesFacturadas.Rows.Count > 0 Then
+ ' Dim RowRemision As DataRow = DtExistencias.FiltroPrimero($"CveMovimiento = {RowMovimiento("CveMovimiento").ToString()}")
- ' Dim CveRemision As Integer = RowRemision("CveRemision").ToString().ToEntero()
+ ' Dim CveRemision As Integer = RowRemision("CveRemision").ToString().ToEntero()
- ' Dim CancelarRemision As Boolean = (ListaRemisionesCancelar IsNot Nothing) AndAlso (ListaRemisionesCancelar.Any(Function(CveRemisionCancelar) CveRemisionCancelar = CveRemision))
+ ' Dim CancelarRemision As Boolean = (ListaRemisionesCancelar IsNot Nothing) AndAlso (ListaRemisionesCancelar.Any(Function(CveRemisionCancelar) CveRemisionCancelar = CveRemision))
- ' 'SI LA REMISION SE VA A CANCELAR DEBE REGRESAR AL ALMACEN GENERAL
- ' If CancelarRemision Then
- ' CveAlmacenDevolucion = RowRemision("CveAlmacenDevolucion").ToString().ToEntero()
- ' Else
- ' CveAlmacenDevolucion = RowMovimiento("CveAlmacen").ToString().ToEntero()
- ' End If
+ ' 'SI LA REMISION SE VA A CANCELAR DEBE REGRESAR AL ALMACEN GENERAL
+ ' If CancelarRemision Then
+ ' CveAlmacenDevolucion = RowRemision("CveAlmacenDevolucion").ToString().ToEntero()
+ ' Else
+ ' CveAlmacenDevolucion = RowMovimiento("CveAlmacen").ToString().ToEntero()
+ ' End If
- 'Else
- ' CveAlmacenDevolucion = RowMovimiento("CveAlmacen").ToString().ToEntero()
- 'End If
- End Select
+ 'Else
+ ' CveAlmacenDevolucion = RowMovimiento("CveAlmacen").ToString().ToEntero()
+ 'End If
+ End Select
- 'SI TIENE SALDO PENDIENTE POR DEVOLVER GENERA UN MOVIMIENTO DE DEVOLUCION
- If ObjFactura.SaldoAlmacen <> 0 Then
- 'SALIDA DE ALMACEN - SALIDA POR TRASPASO CUANDO ES REMISION - DEVOLUCION (SI ES TRASPASO Y TIENE CONTRATO NO HACE DEVOLUCIóN)
- CveMovimientoDevolucion = ObjInventario.AddMovimiento(CveAlmacenMovimiento, CveConceptoMovimiento, 1, ClsPaginas.NowADS(), -1, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, -1, CveVenta, -1, -1, Observaciones:="", Guia:="", CveContrato:=CveContrato, CveAlmacenDestino:=-1, CveMovimientoRelacionado:=CveMovimientoSalida, Modulo:="Mod/CV1")
- Folio = ObjInventario.Folio
+ 'SI TIENE SALDO PENDIENTE POR DEVOLVER GENERA UN MOVIMIENTO DE DEVOLUCION
+ If ObjFactura.SaldoAlmacen <> 0 Then
+ 'SALIDA DE ALMACEN - SALIDA POR TRASPASO CUANDO ES REMISION - DEVOLUCION (SI ES TRASPASO Y TIENE CONTRATO NO HACE DEVOLUCIóN)
+ CveMovimientoDevolucion = ObjInventario.AddMovimiento(CveAlmacenMovimiento, CveConceptoMovimiento, 1, ClsPaginas.NowADS(), -1, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, -1, CveVenta, -1, -1, Observaciones:="", Guia:="", CveContrato:=CveContrato, CveAlmacenDestino:=-1, CveMovimientoRelacionado:=CveMovimientoSalida, Modulo:="Mod/CV1")
+ Folio = ObjInventario.Folio
- If CveMovimientoDevolucion > 0 Then
- For Each Dr As DataRow In DtExistencias.FiltraParametros($"CveMovimiento = {RowMovimiento("CveMovimiento").ToString()}").Rows
+ If CveMovimientoDevolucion > 0 Then
+ For Each Dr As DataRow In DtExistencias.FiltraParametros($"CveMovimiento = {RowMovimiento("CveMovimiento").ToString()}").Rows
- Dim FechaCaducidad As Date = MinFecha
- If Not String.IsNullOrEmpty(Dr("FechaCaducidad").ToString()) Then
- If IsDate(Dr("FechaCaducidad")) Then
- FechaCaducidad = Dr("FechaCaducidad").ToString().ToDate()
- End If
- End If
-
- Dim CveVentaDetalleRemision As Integer = -1
- If CveConceptoMovimiento = 41 Then
- CveVentaDetalleRemision = Dr("CveVentaDetalleRemision").ToString.ToEntero()
- End If
-
- If Not ObjInventario.AddMovimientoDetalle(CveMovimientoDevolucion, Dr("Cantidad").ToString.ToDecimal, Dr("CveUM").ToString.ToEntero, Dr("CvePS").ToString.ToEntero, Dr("PU").ToString.ToDecimal, -1, Serie:=Dr("Serie").ToString, Lote:=Dr("Lote").ToString, CveVentaDetalle:=Dr("CveVentaDetalle").ToString.ToEntero, CveSeccionAlmacen:=Dr("CveSeccionAlmacen").ToString.ToEntero, FechaCaducidad:=FechaCaducidad, CveVentaDetalleRemision:=CveVentaDetalleRemision) Then
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al procesar los conceptos de salida. Por favor vuelva a intentar."
- Exit For
- End If
- Next
- Else
- MensajeError = "Ocurrió un error al agregar el movimiento"
- ErrorCancelar = True
- End If
-
- 'GENERA PREPOLIZA DEL MOVIMIENTO DE DEVOLUCION
- If Not ErrorCancelar Then
- Dim DtCostos As DataTable = Nothing
- Dim ValorInventario As Decimal = 0
- If ObjInventario.GetMovimientosDetalle(CveMovimientoDevolucion, UsuarioActual.CveEmpresa) Then
- DtCostos = ObjInventario.DtResultados
- Dim tmpCostos As DataTable = DtCostos.FiltraParametros("", "", {"CveClasificacion"})
- If tmpCostos.Rows.Count > 0 Then
- Dim Multiplicador As Decimal = -1D
- If ObjFactura.TipoDocto = "Dev" Then
- Multiplicador = 1D
- End If
-
- 'If ObjVentas.GetVenta(CveVenta, UsuarioActual.CveEmpresa) Then
- Dim Fecha As Date = ClsPaginas.NowADS()
- Dim CveCliente As Integer = ObjFactura.CveCliente 'ObjVentas.DtResultados(0)("CveCliente").ToString.ToEntero
- Dim ClienteNombre As String = ObjFactura.Cliente.Nombre 'ObjVentas.DtResultados(0)("ClienteNombre").ToString
- Dim SerieFolio As String = ObjFactura.SerieFolio ' ObjVentas.DtResultados(0)("SerieFolio").ToString
- Dim TotalCosto As Decimal = DtCostos.SUMD("Total").RoundAD()
- Dim TotalCostoAcumulado As Decimal = 0
- Dim cont As Integer = 1
-
- Dim CvePrePolizaDev As Integer = ObjConta.AddPrePolizas("Modelos/RecepcionEntrega", 4, TotalCosto, TotalCosto, 1, Fecha, ClienteNombre, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa)
- 'SE AGREGA MOVIMIENTO SEPARADO POR LA CUENTA DE VENTAS (ER)
- For Each RowInv As DataRow In tmpCostos.Rows
- ValorInventario = DtCostos.SUMD("Total", $"CveClasificacion = {RowInv("CveClasificacion")}").RoundAD()
- TotalCostoAcumulado += ValorInventario
-
- 'CUANDO ES EL ÚLTIMO MOVIMIENTO Y HAY DIFERENCIAS EN LOS IMPORTES
- If cont = DtCostos.Rows.Count AndAlso TotalCosto <> TotalCostoAcumulado Then
- ValorInventario = ValorInventario + (TotalCosto - TotalCostoAcumulado)
- End If
-
- If Not ErrorCancelar Then
- If Not ObjConta.AddPrePolizasDetalle(CvePrePolizaDev, False, Multiplicador * ValorInventario, Multiplicador * ValorInventario, 69, SerieFolio, SerieFolio, CveVenta:=CveVenta, CveCliente:=CveCliente, CveMovimientoAlmacen:=CveMovimientoDevolucion, CveSubProyecto:=ObjFactura.CveSubProyecto, CveClasificacion:=RowInv("CveClasificacion").ToString.ToEntero) Then
- ErrorCancelar = True
- End If
- End If
- cont += 1
- Next
-
- If Not ObjConta.AddPrePolizasDetalle(CvePrePolizaDev, True, Multiplicador * TotalCosto, Multiplicador * TotalCosto, 68, SerieFolio, SerieFolio, CveVenta:=CveVenta, CveCliente:=CveCliente, CveMovimientoAlmacen:=CveMovimientoDevolucion, CveSubProyecto:=ObjFactura.CveSubProyecto) Then
- ErrorCancelar = True
- End If
-
- 'AUTOCONTA - EL MOVIMIENTO 1 ES EL DE VENTA
-
- Dim AutoConta As Boolean = UsuarioActual.Empresa.Funcionalidad(200) = "1"
-
- If UsuarioActual.CveEmpresa = 119 AndAlso ObjFactura.TipoDocto.Contiene("Ant", "Rem", "RNC", "Cot", "Ped", "Pd2", "PA", "Egs", "Dev") Then
- AutoConta = False
- End If
-
- If Not ErrorCancelar AndAlso ObjConta.ValidacionesPrePoliza(CvePrePolizaDev, UsuarioActual) Then
- If ObjConta.ValorPolizaDescuadre > 0 Then
- GuardaLogAD($"Modelos/RecepcionEntrega | Error{ObjConta.MensajePolizaDescuadre} Diferencia{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}", "LogPrePolizas")
- ErrorCancelar = True
- End If
- End If
-
- If AutoConta And Not ErrorCancelar Then
- If Not ObjConta.ContabilizarPrePoliza(CvePrePolizaDev, UsuarioActual.CveUsuario, UsuarioActual.Empresa) Then
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al contabilizar la prepoliza."
- End If
- End If
- ' Else
- 'ErrorCancelar = True
- 'MensajeError = "Ocurrió un Error al ingresar las prepolizas"
- 'End If
+ Dim FechaCaducidad As Date = MinFecha
+ If Not String.IsNullOrEmpty(Dr("FechaCaducidad").ToString()) Then
+ If IsDate(Dr("FechaCaducidad")) Then
+ FechaCaducidad = Dr("FechaCaducidad").ToString().ToDate()
End If
End If
- End If
- 'AGREGA BITACORA A VENTA
- If Not ErrorCancelar AndAlso RealizarDevolucionAlmacen = 1 AndAlso CveMovimientoDevolucion > 0 Then
- Dim MensajeBitacora As String = "Devuelta"
- If Not ObjEventos.AddEventoBitacora(String.Format("Venta {2} en Folio: {1}", CveMovimientoDevolucion, Folio, MensajeBitacora), "-1", UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveVenta:=CveVenta) Then
- MensajeError = "Ocurrió un error al agregar la bitacora."
+ Dim CveVentaDetalleRemision As Integer = -1
+ If CveConceptoMovimiento = 41 Then
+ CveVentaDetalleRemision = Dr("CveVentaDetalleRemision").ToString.ToEntero()
+ End If
+
+ If Not ObjInventario.AddMovimientoDetalle(CveMovimientoDevolucion, Dr("Cantidad").ToString.ToDecimal, Dr("CveUM").ToString.ToEntero, Dr("CvePS").ToString.ToEntero, Dr("PU").ToString.ToDecimal, -1, Serie:=Dr("Serie").ToString, Lote:=Dr("Lote").ToString, CveVentaDetalle:=Dr("CveVentaDetalle").ToString.ToEntero, CveSeccionAlmacen:=Dr("CveSeccionAlmacen").ToString.ToEntero, FechaCaducidad:=FechaCaducidad, CveVentaDetalleRemision:=CveVentaDetalleRemision) Then
ErrorCancelar = True
+ MensajeError = "Ocurrió un error al procesar los conceptos de salida. Por favor vuelva a intentar."
+ Exit For
+ End If
+ Next
+ Else
+ MensajeError = "Ocurrió un error al agregar el movimiento"
+ ErrorCancelar = True
+ End If
+
+ 'GENERA PREPOLIZA DEL MOVIMIENTO DE DEVOLUCION
+ If Not ErrorCancelar Then
+ Dim DtCostos As DataTable = Nothing
+ Dim ValorInventario As Decimal = 0
+ If ObjInventario.GetMovimientosDetalle(CveMovimientoDevolucion, UsuarioActual.CveEmpresa) Then
+ DtCostos = ObjInventario.DtResultados
+ Dim tmpCostos As DataTable = DtCostos.FiltraParametros("", "", {"CveClasificacion"})
+ If tmpCostos.Rows.Count > 0 Then
+ Dim Multiplicador As Decimal = -1D
+ If ObjFactura.TipoDocto = "Dev" Then
+ Multiplicador = 1D
+ End If
+
+ 'If ObjVentas.GetVenta(CveVenta, UsuarioActual.CveEmpresa) Then
+ Dim Fecha As Date = ClsPaginas.NowADS()
+ Dim CveCliente As Integer = ObjFactura.CveCliente 'ObjVentas.DtResultados(0)("CveCliente").ToString.ToEntero
+ Dim ClienteNombre As String = ObjFactura.Cliente.Nombre 'ObjVentas.DtResultados(0)("ClienteNombre").ToString
+ Dim SerieFolio As String = ObjFactura.SerieFolio ' ObjVentas.DtResultados(0)("SerieFolio").ToString
+ Dim TotalCosto As Decimal = DtCostos.SUMD("Total").RoundAD()
+ Dim TotalCostoAcumulado As Decimal = 0
+ Dim cont As Integer = 1
+
+ Dim CvePrePolizaDev As Integer = ObjConta.AddPrePolizas("Modelos/RecepcionEntrega", 4, TotalCosto, TotalCosto, 1, Fecha, ClienteNombre, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa)
+ 'SE AGREGA MOVIMIENTO SEPARADO POR LA CUENTA DE VENTAS (ER)
+ For Each RowInv As DataRow In tmpCostos.Rows
+ ValorInventario = DtCostos.SUMD("Total", $"CveClasificacion = {RowInv("CveClasificacion")}").RoundAD()
+ TotalCostoAcumulado += ValorInventario
+
+ 'CUANDO ES EL ÚLTIMO MOVIMIENTO Y HAY DIFERENCIAS EN LOS IMPORTES
+ If cont = DtCostos.Rows.Count AndAlso TotalCosto <> TotalCostoAcumulado Then
+ ValorInventario = ValorInventario + (TotalCosto - TotalCostoAcumulado)
+ End If
+
+ If Not ErrorCancelar Then
+ If Not ObjConta.AddPrePolizasDetalle(CvePrePolizaDev, False, Multiplicador * ValorInventario, Multiplicador * ValorInventario, 69, SerieFolio, SerieFolio, CveVenta:=CveVenta, CveCliente:=CveCliente, CveMovimientoAlmacen:=CveMovimientoDevolucion, CveSubProyecto:=ObjFactura.CveSubProyecto, CveClasificacion:=RowInv("CveClasificacion").ToString.ToEntero) Then
+ ErrorCancelar = True
+ End If
+ End If
+ cont += 1
+ Next
+
+ If Not ObjConta.AddPrePolizasDetalle(CvePrePolizaDev, True, Multiplicador * TotalCosto, Multiplicador * TotalCosto, 68, SerieFolio, SerieFolio, CveVenta:=CveVenta, CveCliente:=CveCliente, CveMovimientoAlmacen:=CveMovimientoDevolucion, CveSubProyecto:=ObjFactura.CveSubProyecto) Then
+ ErrorCancelar = True
+ End If
+
+ 'AUTOCONTA - EL MOVIMIENTO 1 ES EL DE VENTA
+
+ Dim AutoConta As Boolean = UsuarioActual.Empresa.Funcionalidad(200) = "1"
+
+ If UsuarioActual.CveEmpresa = 119 AndAlso ObjFactura.TipoDocto.Contiene("Ant", "Rem", "RNC", "Cot", "Ped", "Pd2", "PA", "Egs", "Dev") Then
+ AutoConta = False
+ End If
+
+ If Not ErrorCancelar AndAlso ObjConta.ValidacionesPrePoliza(CvePrePolizaDev, UsuarioActual) Then
+ If ObjConta.ValorPolizaDescuadre > 0 Then
+ GuardaLogAD($"Modelos/RecepcionEntrega | Error{ObjConta.MensajePolizaDescuadre} Diferencia{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}", "LogPrePolizas")
+ ErrorCancelar = True
+ End If
+ End If
+
+ If AutoConta And Not ErrorCancelar Then
+ If Not ObjConta.ContabilizarPrePoliza(CvePrePolizaDev, UsuarioActual.CveUsuario, UsuarioActual.Empresa) Then
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al contabilizar la prepoliza."
+ End If
+ End If
+ ' Else
+ 'ErrorCancelar = True
+ 'MensajeError = "Ocurrió un Error al ingresar las prepolizas"
+ 'End If
+ End If
+ End If
+ End If
+
+ 'AGREGA BITACORA A VENTA
+ If Not ErrorCancelar AndAlso RealizarDevolucionAlmacen = 1 AndAlso CveMovimientoDevolucion > 0 Then
+ Dim MensajeBitacora As String = "Devuelta"
+ If Not ObjEventos.AddEventoBitacora(String.Format("Venta {2} en Folio: {1}", CveMovimientoDevolucion, Folio, MensajeBitacora), "-1", UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveVenta:=CveVenta) Then
+ MensajeError = "Ocurrió un error al agregar la bitacora."
+ ErrorCancelar = True
+ End If
+ End If
+
+ Else
+ 'SI EXISTE UNA DEVOLUCION PREVIAMENTE HECHA UTILIZAR COMO REFERENCIA
+ If DtDevPrevias IsNot Nothing AndAlso DtDevPrevias.Rows.Count > 0 Then
+ CveMovimientoDevolucion = DtDevPrevias.FiltroPrimeroValor("CveMovimiento", $"CveConcepto = {CveConceptoMovimiento}").ToEntero()
+ End If
+
+ End If
+
+
+ 'DEVOLUCION REMISION - REGRESA LAS EXISTENCIAS A ENTREGA POR ADELANTADO SI LA FACTURA VIENE DE REMISION
+ 'SI ES DEVOLUCION DEL CLIENTE DEBE REGRESAR A ENTREGA POR ADELANTADO
+ If Not ErrorCancelar AndAlso CveConceptoMovimiento = 18 AndAlso RevivirRemisiones Then
+ If Not GeneraMovimientosEntregaPorAdelantadoRemision(CveMovimientoDevolucion, ObjVentas, ObjInventario, DtDevRem, ListaRemisionesCancelar) Then
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al generar los movimientos de devolución a remisión"
+ End If
+ End If
+
+ If DtVirtuales IsNot Nothing Then
+ For Each RowVirtual As DataRow In DtVirtuales.Rows
+ 'REALIZA LA DEVOLUCION AL ALMACEN VIRTUAL
+ If Not ErrorCancelar AndAlso Not CancelarMovimientosVirtuales(CveVenta, CveMovimientoDevolucion, RowVirtual("CveMovimiento").ToString().ToEntero(), ObjInventario, TipoDocto:=ObjFactura.TipoDocto) Then
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al realizar la devolución del virtual. Por favor vuelva a intentar."
+ End If
+ Next
+ End If
+
+ If ErrorCancelar Then
+ Exit For
+ End If
+
+ Next
+ End If
+
+ 'SI EXISTEN HAY EXISTENCIA EN (ENTREGA POR ADELANTADO) SE TIENE QUE REGRESAR AL ALMACEN ORGINAL (GENERAL,SIN COSTO)
+ If Not ErrorCancelar AndAlso ObjFactura.TipoDocto <> "Rem" AndAlso ListaRemisionesCancelar IsNot Nothing AndAlso ListaRemisionesCancelar.Count > 0 Then
+
+ 'VERIFICA LOS MOVIMIENTOS DE DEVOLUCION YA GENERADOS QUE TENGAN EXISTENCIA EN (ENTREGA POR ADELANTADO)
+ If Not ErrorCancelar Then
+ If ObjInventario.GetMovimientosDevoluciones(CveVenta, UsuarioActual.CveEmpresa) Then
+ DtDevoluciones = ObjInventario.DtResultados.FiltraParametros("CveTipoAlmacen = 10")
+ Else
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al cargar los datos de devolución. Por favor vuelva a intentar."
+ End If
+ End If
+
+ 'DEBE REGRESAR LA EXISTENCIA DE (ENTREGA POR ADELANTADO) AL ALMACEN ORGINAL (GENERAL,SIN COSTO)
+ If Not ErrorCancelar AndAlso DtDevoluciones IsNot Nothing AndAlso DtDevoluciones.Rows.Count > 0 Then
+ For Each CveRemision As Integer In ListaRemisionesCancelar
+ Dim ObjRemision As New Factura(UsuarioActual, CveRemision, UsuarioActual.CveEmpresa, VerificaAlmacen:=True)
+
+ If ObjRemision IsNot Nothing AndAlso ObjRemision.CveVenta > 0 Then
+
+ If ObjRemision.SaldoAlmacen <> 0 Then
+ Dim SaldoAlmacenExA As Decimal = 0
+ Dim SaldoAlmacenUsados As Decimal = 0
+ Dim DtSaldosAlmacenRemision As DataTable = Nothing
+ 'VERIFICA SI HACE FALTA DEVOLVER PRODUCTOS Y USADOS EN ESPECIFICO
+ If Not ErrorCancelar Then
+ If ObjInventario.GetSaldoVentaDetalleAlmacen(ObjRemision.CveVenta, UsuarioActual.CveEmpresa) Then
+ DtSaldosAlmacenRemision = ObjInventario.DtResultados.Copy()
+ Else
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al cargar los saldos de devolución. Por favor vuelva a intentar."
+ End If
+ End If
+
+
+ Dim DtDevRemision As DataTable = DtDevoluciones.FiltraParametros($"CveRemision={CveRemision}")
+
+ Dim DtDevMovs As DataTable = DtDevRemision.FiltraParametros("", DistinctColumns:={"CveMovimiento", "CveRemision", "CveAlmacen", "CveAlmacenDestino"})
+
+ For Each RowDevolucion As DataRow In DtDevMovs.Rows
+ CveAlmacen = RowDevolucion("CveAlmacen").ToString().ToEntero()
+ CveAlmacenDevolucion = RowDevolucion("CveAlmacenDestino").ToString().ToEntero()
+
+ If CveAlmacen > 0 AndAlso DtSaldosAlmacenRemision IsNot Nothing Then
+ SaldoAlmacenExA = DtSaldosAlmacenRemision.SUMD("SaldoAlmacen", $"CveAlmacen = {CveAlmacen}")
+ End If
+
+ If SaldoAlmacenExA <> 0 Then
+ If Not CancelarMovimientosRemision(CveRemision, CveAlmacen, CveAlmacenDevolucion, DtDevRemision.FiltraParametros($"CveMovimiento={RowDevolucion("CveMovimiento")}"), ObjVentas, ObjInventario, ObjConta) Then
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al cancelar los movimientos de la remisión."
+ Exit For
+ End If
+ End If
+
+ Next
+
+ 'CANCELAR MOVIMIENTOS DE USADOS SI TIENE
+ If Not ErrorCancelar AndAlso UsuarioActual.Empresa.Funcionalidad(531) = "1" Then
+ Dim CveAlmacenUsado As Integer = 0
+ Dim CveMovimientoUsado As Integer = 0
+
+ If ObjInventario.GetInv_Mov(ObjRemision.CveVenta, UsuarioActual.CveEmpresa) Then
+ CveMovimientoUsado = ObjInventario.DtResultados.FiltroPrimeroValor("CveMovimiento", "CvePS IS NULL AND CveConcepto = 42").ToEntero()
+ CveAlmacenUsado = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CvePS IS NULL AND CveConcepto = 42").ToEntero()
+ Else
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al cargar los datos de devolución de usado. Por favor vuelva a intentar."
+ End If
+
+ If CveAlmacenUsado > 0 AndAlso DtSaldosAlmacenRemision IsNot Nothing Then
+ SaldoAlmacenUsados = DtSaldosAlmacenRemision.SUMD("SaldoAlmacen", $"CveAlmacen = {CveAlmacenUsado}")
+ End If
+
+ If Not ErrorCancelar AndAlso CveMovimientoUsado > 0 AndAlso SaldoAlmacenUsados <> 0 Then
+ If CancelarInventarioUsado(ObjRemision, CveAlmacenUsado, CveMovimientoUsado, ObjInventario, ObjConta, Contabilizable:=False) <= 0 Then
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al cancelar los usados. Por favor vuelva a intentar."
+ End If
+ End If
+
+ 'CANCELAR MOVIMIENTOS DE GARANTIA SI TIENE
+ If Not ErrorCancelar AndAlso Not GenerarMovimientoGarantia(15, "Salida Garantía", ClsPaginas.NowADS(), ObjRemision, ObjAcum, ObjInventario, ObjConta) Then
+ ErrorCancelar = True
+ End If
+
+ 'CANCELA LOS FOLIOS DE GARANTIA
+ If Not ErrorCancelar AndAlso Not ObjAcum.UpdateGarantiaCancelacion(ObjRemision.CveVenta) Then
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al actualizar la garantía"
+ End If
+
+ End If
+
+ If DtDevRemision IsNot Nothing Then
+ DtDevRemision.Dispose()
+ End If
+
+ If DtDevMovs IsNot Nothing Then
+ DtDevMovs.Dispose()
End If
End If
Else
- 'SI EXISTE UNA DEVOLUCION PREVIAMENTE HECHA UTILIZAR COMO REFERENCIA
- If DtDevPrevias IsNot Nothing AndAlso DtDevPrevias.Rows.Count > 0 Then
- CveMovimientoDevolucion = DtDevPrevias.FiltroPrimeroValor("CveMovimiento", $"CveConcepto = {CveConceptoMovimiento}").ToEntero()
- End If
-
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al cargar los datos de la remisión. Por favor vuelva a intentar."
End If
-
- 'DEVOLUCION REMISION - REGRESA LAS EXISTENCIAS A ENTREGA POR ADELANTADO SI LA FACTURA VIENE DE REMISION
- 'SI ES DEVOLUCION DEL CLIENTE DEBE REGRESAR A ENTREGA POR ADELANTADO
- If Not ErrorCancelar AndAlso CveConceptoMovimiento = 18 AndAlso RevivirRemisiones Then
- If Not GeneraMovimientosEntregaPorAdelantadoRemision(CveMovimientoDevolucion, ObjVentas, ObjInventario, DtDevRem, ListaRemisionesCancelar) Then
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al generar los movimientos de devolución a remisión"
- End If
- End If
-
- If DtVirtuales IsNot Nothing Then
- For Each RowVirtual As DataRow In DtVirtuales.Rows
- 'REALIZA LA DEVOLUCION AL ALMACEN VIRTUAL
- If Not ErrorCancelar AndAlso Not CancelarMovimientosVirtuales(CveVenta, CveMovimientoDevolucion, RowVirtual("CveMovimiento").ToString().ToEntero(), ObjInventario, TipoDocto:=ObjFactura.TipoDocto) Then
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al realizar la devolución del virtual. Por favor vuelva a intentar."
- End If
- Next
+ If ObjRemision IsNot Nothing Then
+ ObjRemision.Dispose()
End If
If ErrorCancelar Then
@@ -6463,243 +6586,126 @@ Namespace Modelos
Next
End If
- 'SI EXISTEN HAY EXISTENCIA EN (ENTREGA POR ADELANTADO) SE TIENE QUE REGRESAR AL ALMACEN ORGINAL (GENERAL,SIN COSTO)
- If Not ErrorCancelar AndAlso ObjFactura.TipoDocto <> "Rem" AndAlso ListaRemisionesCancelar IsNot Nothing AndAlso ListaRemisionesCancelar.Count > 0 Then
+ End If
- 'VERIFICA LOS MOVIMIENTOS DE DEVOLUCION YA GENERADOS QUE TENGAN EXISTENCIA EN (ENTREGA POR ADELANTADO)
- If Not ErrorCancelar Then
- If ObjInventario.GetMovimientosDevoluciones(CveVenta, UsuarioActual.CveEmpresa) Then
- DtDevoluciones = ObjInventario.DtResultados.FiltraParametros("CveTipoAlmacen = 10")
- Else
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al cargar los datos de devolución. Por favor vuelva a intentar."
+ 'CANCELACION DE MOVIMIENTOS DE REMISION, PEDIDOS
+ If Not ErrorCancelar AndAlso ObjFactura.TipoDocto.Contiene("Rem", "Ped") AndAlso RealizarDevolucionAlmacen = 1 AndAlso ObjFactura.SaldoAlmacen <> 0 Then
+ Dim CveMovimientoUsado As Integer = -1
+ Dim CveAlmacenUsado As Integer = 0
+ Dim CveAlmacenGeneral As Integer = 0
+ Dim CveAlmacenExA As Integer = 0
+
+ Dim SaldoAlmacenExA As Decimal = 0
+ Dim SaldoAlmacenUsados As Decimal = 0
+
+ Dim DtMovRemision As DataTable = Nothing
+ 'VERIFICA LOS MOVIMIENTOS DE DEVOLUCION YA GENERADOS QUE TENGAN EXISTENCIA EN (ENTREGA POR ADELANTADO)
+ If Not ErrorCancelar Then
+ If ObjInventario.GetInv_Mov(CveVenta, UsuarioActual.CveEmpresa) Then
+ DtMovRemision = ObjInventario.DtResultados.FiltraParametros("CveTipoAlmacen IN (10)")
+ CveAlmacenGeneral = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CveTipoAlmacen IN (1,4)").ToEntero()
+ 'SI ES SERVICIO A DOMICILIO DEBE REGRESAR A ESTE TIPO DE ALMACEN
+ If Me.ServicioDomicilio Then
+ CveAlmacenGeneral = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CveTipoAlmacen = 29").ToEntero()
End If
+
+ CveAlmacenExA = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CveTipoAlmacen = 10").ToEntero()
+ If CveAlmacenExA <= 0 Then
+ CveAlmacenExA = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CveTipoAlmacen = 4").ToEntero()
+ DtMovRemision = ObjInventario.DtResultados.FiltraParametros("CveTipoAlmacen IN (4)")
+ End If
+
+ CveMovimientoUsado = ObjInventario.DtResultados.FiltroPrimeroValor("CveMovimiento", "CvePS IS NULL AND CveConcepto = 42").ToEntero()
+ CveAlmacenUsado = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CvePS IS NULL AND CveConcepto = 42").ToEntero()
+ Else
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al cargar los datos de devolución. Por favor vuelva a intentar."
End If
+ End If
- 'DEBE REGRESAR LA EXISTENCIA DE (ENTREGA POR ADELANTADO) AL ALMACEN ORGINAL (GENERAL,SIN COSTO)
- If Not ErrorCancelar AndAlso DtDevoluciones IsNot Nothing AndAlso DtDevoluciones.Rows.Count > 0 Then
- For Each CveRemision As Integer In ListaRemisionesCancelar
- Dim ObjRemision As New Factura(UsuarioActual, CveRemision, UsuarioActual.CveEmpresa, VerificaAlmacen:=True)
+ 'VERIFICA SI HACE FALTA DEVOLVER PRODUCTOS Y USADOS EN ESPECIFICO
+ If Not ErrorCancelar Then
+ If ObjInventario.GetSaldoVentaDetalleAlmacen(CveVenta, UsuarioActual.CveEmpresa) Then
+ If CveAlmacenExA > 0 Then
+ SaldoAlmacenExA = ObjInventario.DtResultados.SUMD("SaldoAlmacen", $"CveAlmacen = {CveAlmacenExA}")
+ End If
+ If CveAlmacenUsado > 0 Then
+ SaldoAlmacenUsados = ObjInventario.DtResultados.SUMD("SaldoAlmacen", $"CveAlmacen = {CveAlmacenUsado}")
+ End If
+ Else
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al cargar los saldos de devolución. Por favor vuelva a intentar."
+ End If
+ End If
- If ObjRemision IsNot Nothing AndAlso ObjRemision.CveVenta > 0 Then
+ 'DEBE REGRESAR LA EXISTENCIA DE (ENTREGA POR ADELANTADO) AL ALMACEN ORGINAL (GENERAL,SIN COSTO)
+ If Not ErrorCancelar AndAlso DtMovRemision IsNot Nothing AndAlso DtMovRemision.Rows.Count > 0 AndAlso SaldoAlmacenExA <> 0 Then
- If ObjRemision.SaldoAlmacen <> 0 Then
- Dim SaldoAlmacenExA As Decimal = 0
- Dim SaldoAlmacenUsados As Decimal = 0
- Dim DtSaldosAlmacenRemision As DataTable = Nothing
- 'VERIFICA SI HACE FALTA DEVOLVER PRODUCTOS Y USADOS EN ESPECIFICO
- If Not ErrorCancelar Then
- If ObjInventario.GetSaldoVentaDetalleAlmacen(ObjRemision.CveVenta, UsuarioActual.CveEmpresa) Then
- DtSaldosAlmacenRemision = ObjInventario.DtResultados.Copy()
- Else
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al cargar los saldos de devolución. Por favor vuelva a intentar."
- End If
- End If
+ Dim DtDevMovs As DataTable = DtMovRemision.FiltraParametros("", DistinctColumns:={"CveMovimiento", "CveAlmacen"})
+ For Each RowDevolucion As DataRow In DtDevMovs.Rows
+ CveAlmacen = RowDevolucion("CveAlmacen").ToString().ToEntero()
+ Dim tdtt As DataTable = DtMovRemision.FiltraParametros($"CveMovimiento={RowDevolucion("CveMovimiento")} AND CvePS > 0 AND SaldoAlmacen <> 0")
- Dim DtDevRemision As DataTable = DtDevoluciones.FiltraParametros($"CveRemision={CveRemision}")
-
- Dim DtDevMovs As DataTable = DtDevRemision.FiltraParametros("", DistinctColumns:={"CveMovimiento", "CveRemision", "CveAlmacen", "CveAlmacenDestino"})
-
- For Each RowDevolucion As DataRow In DtDevMovs.Rows
- CveAlmacen = RowDevolucion("CveAlmacen").ToString().ToEntero()
- CveAlmacenDevolucion = RowDevolucion("CveAlmacenDestino").ToString().ToEntero()
-
- If CveAlmacen > 0 AndAlso DtSaldosAlmacenRemision IsNot Nothing Then
- SaldoAlmacenExA = DtSaldosAlmacenRemision.SUMD("SaldoAlmacen", $"CveAlmacen = {CveAlmacen}")
- End If
-
- If SaldoAlmacenExA <> 0 Then
- If Not CancelarMovimientosRemision(CveRemision, CveAlmacen, CveAlmacenDevolucion, DtDevRemision.FiltraParametros($"CveMovimiento={RowDevolucion("CveMovimiento")}"), ObjVentas, ObjInventario, ObjConta) Then
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al cancelar los movimientos de la remisión."
- Exit For
- End If
- End If
-
- Next
-
- 'CANCELAR MOVIMIENTOS DE USADOS SI TIENE
- If Not ErrorCancelar AndAlso UsuarioActual.Empresa.Funcionalidad(531) = "1" Then
- Dim CveAlmacenUsado As Integer = 0
- Dim CveMovimientoUsado As Integer = 0
-
- If ObjInventario.GetInv_Mov(ObjRemision.CveVenta, UsuarioActual.CveEmpresa) Then
- CveMovimientoUsado = ObjInventario.DtResultados.FiltroPrimeroValor("CveMovimiento", "CvePS IS NULL AND CveConcepto = 42").ToEntero()
- CveAlmacenUsado = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CvePS IS NULL AND CveConcepto = 42").ToEntero()
- Else
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al cargar los datos de devolución de usado. Por favor vuelva a intentar."
- End If
-
- If CveAlmacenUsado > 0 AndAlso DtSaldosAlmacenRemision IsNot Nothing Then
- SaldoAlmacenUsados = DtSaldosAlmacenRemision.SUMD("SaldoAlmacen", $"CveAlmacen = {CveAlmacenUsado}")
- End If
-
- If Not ErrorCancelar AndAlso CveMovimientoUsado > 0 AndAlso SaldoAlmacenUsados <> 0 Then
- If CancelarInventarioUsado(ObjRemision, CveAlmacenUsado, CveMovimientoUsado, ObjInventario, ObjConta, Contabilizable:=False) <= 0 Then
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al cancelar los usados. Por favor vuelva a intentar."
- End If
- End If
-
- 'CANCELAR MOVIMIENTOS DE GARANTIA SI TIENE
- If Not ErrorCancelar AndAlso Not GenerarMovimientoGarantia(15, "Salida Garantía", ClsPaginas.NowADS(), ObjRemision, ObjAcum, ObjInventario, ObjConta) Then
- ErrorCancelar = True
- End If
-
- 'CANCELA LOS FOLIOS DE GARANTIA
- If Not ErrorCancelar AndAlso Not ObjAcum.UpdateGarantiaCancelacion(ObjRemision.CveVenta) Then
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al actualizar la garantía"
- End If
-
- End If
-
- If DtDevRemision IsNot Nothing Then
- DtDevRemision.Dispose()
- End If
-
- If DtDevMovs IsNot Nothing Then
- DtDevMovs.Dispose()
- End If
- End If
-
- Else
+ If tdtt IsNot Nothing AndAlso tdtt.Rows.Count > 0 Then
+ If Not CancelarMovimientosRemision(CveVenta, CveAlmacen, CveAlmacenGeneral, tdtt, ObjVentas, ObjInventario, ObjConta) Then
ErrorCancelar = True
- MensajeError = "Ocurrió un error al cargar los datos de la remisión. Por favor vuelva a intentar."
- End If
-
- If ObjRemision IsNot Nothing Then
- ObjRemision.Dispose()
- End If
-
- If ErrorCancelar Then
+ MensajeError = "Ocurrió un error al cancelar los movimientos de la remisión."
Exit For
End If
-
- Next
- End If
-
+ End If
+ Next
End If
- 'CANCELACION DE MOVIMIENTOS DE REMISION, PEDIDOS
- If Not ErrorCancelar AndAlso ObjFactura.TipoDocto.Contiene("Rem", "Ped") AndAlso RealizarDevolucionAlmacen = 1 AndAlso ObjFactura.SaldoAlmacen <> 0 Then
- Dim CveMovimientoUsado As Integer = -1
- Dim CveAlmacenUsado As Integer = 0
- Dim CveAlmacenGeneral As Integer = 0
- Dim CveAlmacenExA As Integer = 0
-
- Dim SaldoAlmacenExA As Decimal = 0
- Dim SaldoAlmacenUsados As Decimal = 0
-
- Dim DtMovRemision As DataTable = Nothing
- 'VERIFICA LOS MOVIMIENTOS DE DEVOLUCION YA GENERADOS QUE TENGAN EXISTENCIA EN (ENTREGA POR ADELANTADO)
- If Not ErrorCancelar Then
- If ObjInventario.GetInv_Mov(CveVenta, UsuarioActual.CveEmpresa) Then
- DtMovRemision = ObjInventario.DtResultados.FiltraParametros("CveTipoAlmacen IN (10)")
- CveAlmacenGeneral = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CveTipoAlmacen IN (1,4)").ToEntero()
- 'SI ES SERVICIO A DOMICILIO DEBE REGRESAR A ESTE TIPO DE ALMACEN
- If Me.ServicioDomicilio Then
- CveAlmacenGeneral = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CveTipoAlmacen = 29").ToEntero()
- End If
-
- CveAlmacenExA = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CveTipoAlmacen = 10").ToEntero()
- If CveAlmacenExA <= 0 Then
- CveAlmacenExA = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CveTipoAlmacen = 4").ToEntero()
- DtMovRemision = ObjInventario.DtResultados.FiltraParametros("CveTipoAlmacen IN (4)")
- End If
-
- CveMovimientoUsado = ObjInventario.DtResultados.FiltroPrimeroValor("CveMovimiento", "CvePS IS NULL AND CveConcepto = 42").ToEntero()
- CveAlmacenUsado = ObjInventario.DtResultados.FiltroPrimeroValor("CveAlmacen", "CvePS IS NULL AND CveConcepto = 42").ToEntero()
- Else
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al cargar los datos de devolución. Por favor vuelva a intentar."
- End If
- End If
-
- 'VERIFICA SI HACE FALTA DEVOLVER PRODUCTOS Y USADOS EN ESPECIFICO
- If Not ErrorCancelar Then
- If ObjInventario.GetSaldoVentaDetalleAlmacen(CveVenta, UsuarioActual.CveEmpresa) Then
- If CveAlmacenExA > 0 Then
- SaldoAlmacenExA = ObjInventario.DtResultados.SUMD("SaldoAlmacen", $"CveAlmacen = {CveAlmacenExA}")
- End If
- If CveAlmacenUsado > 0 Then
- SaldoAlmacenUsados = ObjInventario.DtResultados.SUMD("SaldoAlmacen", $"CveAlmacen = {CveAlmacenUsado}")
- End If
- Else
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al cargar los saldos de devolución. Por favor vuelva a intentar."
- End If
- End If
-
- 'DEBE REGRESAR LA EXISTENCIA DE (ENTREGA POR ADELANTADO) AL ALMACEN ORGINAL (GENERAL,SIN COSTO)
- If Not ErrorCancelar AndAlso DtMovRemision IsNot Nothing AndAlso DtMovRemision.Rows.Count > 0 AndAlso SaldoAlmacenExA <> 0 Then
-
- Dim DtDevMovs As DataTable = DtMovRemision.FiltraParametros("", DistinctColumns:={"CveMovimiento", "CveAlmacen"})
-
- For Each RowDevolucion As DataRow In DtDevMovs.Rows
- CveAlmacen = RowDevolucion("CveAlmacen").ToString().ToEntero()
- Dim tdtt As DataTable = DtMovRemision.FiltraParametros($"CveMovimiento={RowDevolucion("CveMovimiento")} AND CvePS > 0 AND SaldoAlmacen <> 0")
-
- If tdtt IsNot Nothing AndAlso tdtt.Rows.Count > 0 Then
- If Not CancelarMovimientosRemision(CveVenta, CveAlmacen, CveAlmacenGeneral, tdtt, ObjVentas, ObjInventario, ObjConta) Then
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al cancelar los movimientos de la remisión."
- Exit For
- End If
- End If
- Next
- End If
-
- 'CANCELAR MOVIMIENTOS DE USADOS SI TIENE
- If UsuarioActual.Empresa.Funcionalidad(531) = "1" AndAlso Not ErrorCancelar AndAlso CveMovimientoUsado > 0 AndAlso SaldoAlmacenUsados <> 0 Then
- If CancelarInventarioUsado(ObjFactura, CveAlmacenUsado, CveMovimientoUsado, ObjInventario, ObjConta, Contabilizable:=False) <= 0 Then
- ErrorCancelar = True
- MensajeError = "Ocurrió un error al cancelar los movimientos de usados."
- End If
- End If
-
- 'CANCELAR MOVIMIENTOS DE GARANTIA SI TIENE
- If Not ErrorCancelar AndAlso UsuarioActual.Empresa.Funcionalidad(531) = "1" Then
- If Not GenerarMovimientoGarantia(15, "Salida Garantía", ClsPaginas.NowADS(), ObjFactura, ObjAcum, ObjInventario, ObjConta) Then
- ErrorCancelar = True
- End If
- End If
- End If
-
- 'VERIFICAR MOVIMIENTOS DE APARTADOS
- If Not ErrorCancelar Then
- If Not GeneraMovimientosApartados(ObjInventario) Then
+ 'CANCELAR MOVIMIENTOS DE USADOS SI TIENE
+ If UsuarioActual.Empresa.Funcionalidad(531) = "1" AndAlso Not ErrorCancelar AndAlso CveMovimientoUsado > 0 AndAlso SaldoAlmacenUsados <> 0 Then
+ If CancelarInventarioUsado(ObjFactura, CveAlmacenUsado, CveMovimientoUsado, ObjInventario, ObjConta, Contabilizable:=False) <= 0 Then
ErrorCancelar = True
- MensajeError = "Ocurrió un error al guardar los movimientos de control de apartados"
+ MensajeError = "Ocurrió un error al cancelar los movimientos de usados."
End If
End If
- 'QUEMA DEVOLUCION | QUEMA = LA QUITA DE PENDIENTE POR RECIBIR (DEVOLVER)
- If Not ErrorCancelar Then
- If Not ObjVentas.UpdateVentasDevolucionAlmacen(2, CveVenta) Then
- MensajeError = "Ocurrió un error al hacer la devolucion. Por favor vuelva a intentar."
+ 'CANCELAR MOVIMIENTOS DE GARANTIA SI TIENE
+ If Not ErrorCancelar AndAlso UsuarioActual.Empresa.Funcionalidad(531) = "1" Then
+ If Not GenerarMovimientoGarantia(15, "Salida Garantía", ClsPaginas.NowADS(), ObjFactura, ObjAcum, ObjInventario, ObjConta) Then
ErrorCancelar = True
End If
End If
End If
- End If
- 'EMPRESA HOSPITALARIA - SI ES PEDIDO LA DEVOLUCION SE DEBE HACER DESPUES DE CANCELAR EL PEDIDO
- If Not ErrorCancelar AndAlso UsuarioActual.Empresa.Funcionalidad(578) = "1" AndAlso ObjFactura.TipoDocto = "Ped" Then
- If Not RealizarDevolucionAlmacen = 1 AndAlso TieneAlmacen Then
- If Not ObjInventario.ActualizarEsDevolucionVenta(ObjFactura.CveVenta, 1, AplicaDevolucionCompleta:=True) Then
+ 'VERIFICAR MOVIMIENTOS DE APARTADOS
+ If Not ErrorCancelar Then
+ If Not GeneraMovimientosApartados(ObjInventario) Then
+ ErrorCancelar = True
+ MensajeError = "Ocurrió un error al guardar los movimientos de control de apartados"
+ End If
+ End If
+
+ 'QUEMA DEVOLUCION | QUEMA = LA QUITA DE PENDIENTE POR RECIBIR (DEVOLVER)
+ If Not ErrorCancelar Then
+ If Not ObjVentas.UpdateVentasDevolucionAlmacen(2, CveVenta) Then
+ MensajeError = "Ocurrió un error al hacer la devolucion. Por favor vuelva a intentar."
ErrorCancelar = True
- MensajeError = "No se pudo actualizar el estatus de almacen del pedido"
End If
End If
End If
End If
+ 'EMPRESA HOSPITALARIA - SI ES PEDIDO LA DEVOLUCION SE DEBE HACER DESPUES DE CANCELAR EL PEDIDO
+ If Not ErrorCancelar AndAlso UsuarioActual.Empresa.Funcionalidad(578) = "1" AndAlso ObjFactura.TipoDocto = "Ped" Then
+ If Not RealizarDevolucionAlmacen = 1 AndAlso TieneAlmacen Then
+ If Not ObjInventario.ActualizarEsDevolucionVenta(ObjFactura.CveVenta, 1, AplicaDevolucionCompleta:=True) Then
+ ErrorCancelar = True
+ MensajeError = "No se pudo actualizar el estatus de almacen del pedido"
+ End If
+ End If
+ End If
+
+ End If
+ 'CUANDO LA CANCELACION ESTA EN PROCESO NO DEBE REALIZAR NADA DE ESTE PROCESO
+ If Not ErrorCancelar AndAlso (Not EsRefacturacion AndAlso (CveEstatus > 0 AndAlso Not CveEstatus.Contiene(20, 23)) AndAlso CveEstatusRefacturacion = 0) Then
'CANCELA CONTRATOS
If Not ErrorCancelar Then
If ObjFactura.CveContrato > 0 AndAlso ObjFactura.TipoDocto.Contiene("Ing", "Ant") Then
@@ -6822,7 +6828,6 @@ Namespace Modelos
End If
End If
End If
-
End If
'MARCA LA VENTA PARA REALIZAR LA DEVOLUCION POSTERIORMENTE
diff --git a/Ventas/PVCobranza.aspx.vb b/Ventas/PVCobranza.aspx.vb
index fe9fc7c94..f44faf8d6 100644
--- a/Ventas/PVCobranza.aspx.vb
+++ b/Ventas/PVCobranza.aspx.vb
@@ -659,8 +659,10 @@ Partial Class Ventas_PVCobranza
Dim msBuild As New StringBuilder()
Dim MsgTimbrado As String = ""
+ Dim DebeTimbrar As Boolean = False
+
'SI SE GENERO FACTURA DE INGRESO, TIMBRARLA DESPUES DE REALIZAR EL PAGO
- If respFactura IsNot Nothing Then
+ If DebeTimbrar AndAlso respFactura IsNot Nothing Then
'VERIFICA SI SE GENERO NC
If respNC IsNot Nothing Then
AjustarTimbre(respFactura.Factura, respNC.Factura)
diff --git a/Ventas/Ventas.aspx.vb b/Ventas/Ventas.aspx.vb
index c54508a7e..0d066f908 100644
--- a/Ventas/Ventas.aspx.vb
+++ b/Ventas/Ventas.aspx.vb
@@ -26667,7 +26667,13 @@ Partial Class Ventas
GenerarIxC = ChkGeneraIxC.Checked
End If
- resp = ObjFacturaCancelacion.CancelarFactura(If(ChkDevAlm.Checked, 1, 0), ListaRemisionesCancelar, CveMotivoCancelacion:=DdlMotivoCancelacion.SelectedValue.ToEntero(), Motivo:=TxtMotivoCancelacion.Text.Trim(), CveEstadoCancelacion:=Me.CveEstadoCancelacion, AplicaCancelacionConPagos:=AplicaCancelacionConPagos, GeneraIxCconPago:=GenerarIxC)
+ Dim ForzarDevolucion As Boolean = False
+
+ If ChkDevAlm.Checked AndAlso UsuarioActual.CveEmpresa = 189 Then
+ ForzarDevolucion = True
+ End If
+
+ resp = ObjFacturaCancelacion.CancelarFactura(If(ChkDevAlm.Checked, 1, 0), ListaRemisionesCancelar, CveMotivoCancelacion:=DdlMotivoCancelacion.SelectedValue.ToEntero(), Motivo:=TxtMotivoCancelacion.Text.Trim(), CveEstadoCancelacion:=Me.CveEstadoCancelacion, AplicaCancelacionConPagos:=AplicaCancelacionConPagos, GeneraIxCconPago:=GenerarIxC, ForzarDevolucion:=ForzarDevolucion)
strMensaje.Append(resp.Mensaje)
Dim DtBonificaciones As DataTable = Nothing