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