diff --git a/App_Code/ClsInventarios.vb b/App_Code/ClsInventarios.vb index e0cc7a960..74be2b92d 100644 --- a/App_Code/ClsInventarios.vb +++ b/App_Code/ClsInventarios.vb @@ -3061,6 +3061,24 @@ Public Class ClsInventarios Return Retorno End Function + Public Function GetMovimientosDevoluciones(CveVenta As Integer, CveEmpresa As Integer) As Boolean + Dim Retorno As Boolean = False + DataAdapter("PA_Vta_VentaDetalleAlmacenDevolucion") + + With SqlAdapter.SelectCommand.Parameters + .Add("@CveVenta", SqlDbType.Int).Value = CveVenta + .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + End With + + Try + SqlAdapter.Fill(Data) + Retorno = True + Catch ex As Exception + OnError("Ocurrió un error al obtener datos de devolucion.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) + End Try + + Return Retorno + End Function Public Function GetDevolucionRemisionesFacturadas(CveVenta As Integer) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_Inv_DevolucionRemisionesFacturadas") diff --git a/App_Code/Modelos.vb b/App_Code/Modelos.vb index bb508bd69..defd19cb5 100644 --- a/App_Code/Modelos.vb +++ b/App_Code/Modelos.vb @@ -4340,13 +4340,14 @@ Namespace Modelos End If 'CUANDO LA CANCELACION ESTA EN PROCESO NO DEBE REALIZAR NADA DE ESTE PROCESO - If Not EsRefacturacion AndAlso (CveEstatus > 0 AndAlso CveEstatus <> 20) AndAlso CveEstatusRefacturacion = 0 Then + If Not ErrorCancelar AndAlso Not EsRefacturacion AndAlso (CveEstatus > 0 AndAlso CveEstatus <> 20) AndAlso CveEstatusRefacturacion = 0 Then 'DEVOLUCION DE ALMACEN If Not ErrorCancelar AndAlso TieneAlmacen Then Dim TieneSalida As Boolean = False Dim DtInventario As DataTable = Nothing - Dim DtMovimientos As DataTable = Nothing + Dim DtSalidas As DataTable = Nothing + Dim DtDevoluciones As DataTable = Nothing Dim DtExistencias As DataTable = Nothing Dim DtRemisionesFacturadas As DataTable = Nothing @@ -4375,14 +4376,16 @@ Namespace Modelos ErrorCancelar = True End If - If ObjInventario.GetInv_Mov(CveVenta, UsuarioActual.CveEmpresa) Then - DtInventario = ObjInventario.DtResultados.Copy() - DtMovimientos = DtInventario.FiltraParametros($"CvePS IS NULL AND {Filtro}") - DtExistencias = DtInventario.FiltraParametros($"CvePS IS NOT NULL AND {Filtro} AND CveTipoPS = 2") - TieneSalida = DtExistencias.Rows.Count > 0 - Else - ErrorCancelar = True - MensajeError = "Ocurrió un error al cargar los datos de devolución. Por favor vuelva a intentar." + If Not ErrorCancelar Then + If ObjInventario.GetInv_Mov(CveVenta, UsuarioActual.CveEmpresa) Then + DtInventario = ObjInventario.DtResultados.Copy() + DtSalidas = DtInventario.FiltraParametros($"CvePS IS NULL AND {Filtro}") + DtExistencias = DtInventario.FiltraParametros($"CvePS IS NOT NULL AND {Filtro} AND CveTipoPS = 2") + TieneSalida = DtExistencias.Rows.Count > 0 + 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 @@ -4390,38 +4393,42 @@ Namespace Modelos If Not ErrorCancelar AndAlso TieneSalida Then If Not ErrorCancelar AndAlso RealizarDevolucionAlmacen Then - - For Each RowMovimiento As DataRow In DtMovimientos.Rows + 'REALIZA DEVOLUCION A LAS SALIDAS PENDIENTES + For Each RowMovimiento As DataRow In DtSalidas.Rows Dim CveConceptoDevolucion As Integer = -1 Dim CveAlmacenDevolucion As Integer = -1 + + Dim CveMovimientoDevolucion As Integer = 0 + Dim Folio As Integer = 0 + Select Case RowMovimiento("CveConcepto").ToString().ToEntero() Case 3 CveConceptoDevolucion = 18 'DEVOLUCION DEL CLIENTE CveAlmacenDevolucion = RowMovimiento("CveAlmacen").ToString().ToEntero() Case 40 CveConceptoDevolucion = 41 'DEVOLUCIÓN DEL CLIENTE DIRECTA - '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() + CveAlmacenDevolucion = 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 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 - Else - CveAlmacenDevolucion = RowMovimiento("CveAlmacen").ToString().ToEntero() - End If + ' Dim CveRemision As Integer = RowRemision("CveRemision").ToString().ToEntero() + ' 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 + + 'Else + ' CveAlmacenDevolucion = RowMovimiento("CveAlmacen").ToString().ToEntero() + 'End If End Select - Dim CveMovimientoDevolucion As Integer = 0 - Dim Folio As Integer = 0 - - 'VERIFICAR SI YA TIENE UNA DEVOLUCION + '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(CveAlmacenDevolucion, CveConceptoDevolucion, 1, Now, -1, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, -1, CveVenta, -1, -1, Observaciones:="", Guia:="", CveContrato:=CveContrato, CveAlmacenDestino:=-1) @@ -4518,30 +4525,15 @@ Namespace Modelos End If End If End If - 'Else - ' 'UTILIZA LA DEVOLUCION YA REALIZADA - ' Dim CveConceptoDevolucion As Integer = 18 'DEVOLUCION DEL CLIENTE - ' If UsuarioActual.Empresa.Funcionalidad(575) = "1" Then - ' CveConceptoDevolucion = 41 'DEVOLUCIÓN DEL CLIENTE DIRECTA - ' End If - - ' If ObjInventario.GetInv_Mov(CveVenta, UsuarioActual.CveEmpresa) Then - ' CveMovimientoDevolucion = ObjInventario.DtResultados.FiltroPrimeroValor("CveMovimiento", $"CvePS IS NULL AND CveConcepto = {CveConceptoDevolucion}").ToEntero() - ' Else - ' ErrorCancelar = True - ' MensajeError = "Ocurrió un error al cargar los datos de devolución. Por favor vuelva a intentar." - ' 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 CveConceptoDevolucion = 18 Then - If Not ErrorCancelar 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 + If Not ErrorCancelar AndAlso CveConceptoDevolucion = 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 @@ -4556,12 +4548,45 @@ Namespace Modelos Next + '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 + + 'SI EXISTEN HAY EXISTENCIA EN (ENTREGA POR ADELANTADO) SE TIENE QUE REGRESAR AL ALMACEN GENERAL + If Not ErrorCancelar AndAlso ListaRemisionesCancelar IsNot Nothing AndAlso ListaRemisionesCancelar.Count > 0 Then + For Each CveRemision As Integer In ListaRemisionesCancelar + For Each RowDevolucion As DataRow In DtDevoluciones.FiltraParametros($"CveRemision={CveRemision}", DistinctColumns:={"CveRemision", "CveAlmacen", "CveAlmacenDestino"}).Rows + + Dim DtDevRemision As DataTable = DtDevoluciones.FiltraParametros($"CveRemision={CveRemision}") + + CveAlmacen = RowDevolucion("CveAlmacen").ToString().ToEntero() + CveAlmacenDevolucion = RowDevolucion("CveAlmacenDestino").ToString().ToEntero() + + 'DEBE REGRESAR LA EXISTENCIA DE (ENTREGA POR ADELANTADO) AL ALMACEN GENERAL + If Not CancelarMovimientosRemision(CveRemision, CveAlmacen, CveAlmacenDevolucion, DtDevRemision, ObjVentas, ObjInventario) Then + ErrorCancelar = True + MensajeError = "Ocurrió un error al cancelar los movimientos de la remisión." + Exit For + End If + + DtDevRemision.Dispose() + Next + Next + End If + 'REALIZA LA DEVOLUCION AL ALMACEN VIRTUAL If Not GeneraMovimientosVirtuales(CveVenta, ObjInventario) Then ErrorCancelar = True MensajeError = "Ocurrió un error al cargar los datos de devolución. Por favor vuelva a intentar." End If + 'VERIFICAR MOVIMIENTOS DE APARTADOS If Not ErrorCancelar Then If Not GeneraMovimientosApartados(ObjInventario) Then ErrorCancelar = True @@ -4957,6 +4982,69 @@ Namespace Modelos Return Not ErrorCancelar End Function + Private Function CancelarMovimientosRemision(CveRemision As Integer, CveAlmacen As Integer, CveAlmacenDestino As Integer, DtMovDetalle As DataTable, ByRef ObjVentas As ClsVentas, ByRef ObjInventario As ClsInventarios) As Boolean + Dim ErrorCancelar As Boolean = False + + Dim CveMovimientoSalidaDevRem As Integer = 0 + Dim FolioMovimientoSalidaDevRem As Integer = 0 + + Dim CveMovimientoEntradaDevRem As Integer = 0 + Dim FolioMovimientoEntradaDevRem As Integer = 0 + + 'SALIDA DE (ENTREGA POR ADELANTADO) + CveMovimientoSalidaDevRem = ObjInventario.AddMovimiento(CveAlmacen, 8, 1, Now, -1, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, -1, CveRemision, -1, -1, Observaciones:="", Guia:="", CveContrato:=CveContrato, CveAlmacenDestino:=CveAlmacenDestino) + FolioMovimientoSalidaDevRem = ObjInventario.Folio + + 'ENTRADA A (ALMACEN GENERAL) + CveMovimientoEntradaDevRem = ObjInventario.AddMovimiento(CveAlmacenDestino, 9, 1, Now, -1, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, -1, CveRemision, -1, -1, Observaciones:="", Guia:="", CveContrato:=CveContrato, CveMovimientoRelacionado:=CveMovimientoSalidaDevRem, CveAlmacenDestino:=CveAlmacenDestino) + FolioMovimientoEntradaDevRem = ObjInventario.Folio + + If Not (CveMovimientoSalidaDevRem > 0 And CveMovimientoEntradaDevRem > 0) Then + ErrorCancelar = True + End If + + 'SALIDA DE (ENTREGA POR ADELANTADO) + If Not ErrorCancelar Then + For Each DrRem As DataRow In DtMovDetalle.FiltraParametros($"CveRemision = {CveRemision}").Rows + Dim CveVentaDetalleRem = DrRem("CveVentaDetalleRemision").ToString.ToEntero + Dim CantidadRem = DrRem("Cantidad").ToString.ToDecimal + + If Not CveVentaDetalleRem > 0 Then + ErrorCancelar = True + Exit For + End If + + If Not ObjInventario.AddMovimientoDetalle(CveMovimientoSalidaDevRem, DrRem("Cantidad").ToString.ToDecimal, DrRem("CveUM").ToString.ToEntero, DrRem("CvePS").ToString.ToEntero, DrRem("PU").ToString.ToDecimal, DrRem("CveActivoFijo").ToString.ToEntero, -1, DrRem("SerieLote").ToString, CveVentaDetalle:=CveVentaDetalleRem, Lote:=DrRem("Lote").ToString, Batch:=DrRem("Batch").ToString) Then + ErrorCancelar = True + Exit For + End If + + If ErrorCancelar Then + Exit For + End If + Next + End If + + 'ENTRADA A (ALMACEN GENERAL) + If Not ErrorCancelar Then + If ObjInventario.GetMovimientosDetalle(CveMovimientoSalidaDevRem, UsuarioActual.CveEmpresa) Then + For Each Dr As DataRow In ObjInventario.DtResultados.Rows + If Not ObjInventario.AddMovimientoDetalle(CveMovimientoEntradaDevRem, Dr("Cantidad").ToString.ToDecimal, Dr("CveUM").ToString.ToEntero, Dr("CvePS").ToString.ToEntero, Dr("PU").ToString.ToDecimal, Dr("CveAF").ToString.ToEntero, -1, Dr("SerieLote").ToString, CveMovimientoDetalleEntrada:=Dr("CveMovimientoDetalle").ToString().ToEntero(), CveVentaDetalle:=Dr("CveVentaDetalle").ToString.ToEntero, Lote:=Dr("Lote").ToString, Batch:=Dr("Batch").ToString) Then + ErrorCancelar = True + Exit For + End If + Next + End If + End If + + + If Not ObjVentas.UpdateVentasDevolucionAlmacen(2, CveRemision) Then + ErrorCancelar = True + End If + + Return Not ErrorCancelar + End Function + Private Function GeneraMovimientosApartados(ByRef ObjInventario As ClsInventarios) As Boolean Dim ErrorCancelar As Boolean = False If Not ErrorCancelar Then diff --git a/Ventas/Ventas.aspx.vb b/Ventas/Ventas.aspx.vb index a8fbdcd89..c78cf82fc 100644 --- a/Ventas/Ventas.aspx.vb +++ b/Ventas/Ventas.aspx.vb @@ -4334,7 +4334,7 @@ Partial Class Ventas If DdlTipoComprobante.SelectedValue.Contiene("Ing", "Ant") AndAlso GvRemisiones.Rows.Count > 0 Then ChkDevAlm.Checked = True ChkDevAlm.Enabled = False - LiDevolucionAlmacen.Visible = False + 'LiDevolucionAlmacen.Visible = False End If End If