diff --git a/App_Code/ClsNominas.vb b/App_Code/ClsNominas.vb index da4c880b2..ea1675b67 100644 --- a/App_Code/ClsNominas.vb +++ b/App_Code/ClsNominas.vb @@ -2828,7 +2828,7 @@ Public Class ClsNominas Dim retorno As Boolean = False Try - DataAdapter("PA_RH_PersonalVacacionesGET", CommandType.StoredProcedure) + DataAdapter("PA_RH_PersonalVacacionesDesgloseDiasGet", CommandType.StoredProcedure) With SqlAdapter.SelectCommand.Parameters .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa .Add("@CvePersonal", SqlDbType.Decimal).Value = CvePersonal 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 b/Ventas/PVCobranza.aspx index a233aa62b..bca1d3fa9 100644 --- a/Ventas/PVCobranza.aspx +++ b/Ventas/PVCobranza.aspx @@ -1282,9 +1282,9 @@ let TipoAnticipo = $('#<%= DdlTipoAmortizacionAnticipo.ClientID %>').val(); //si es con.nc,es.el.total - let Total = ToDouble($get("C_LtlSaldo").value); + let Total = ToDouble($get("C_LtlSaldo").value.replace(",","")); - let SaldoCompra = parseFloat(parseFloat($get("C_LtlSaldo").value).toFixed(2)); + let SaldoCompra = parseFloat(parseFloat($get("C_LtlSaldo").value.replace(",", "")).toFixed(2)); if (t.checked) { @@ -1319,13 +1319,13 @@ function FnCambiaAnt(chk, txt, saldo) { - let Total = ToDouble($get("C_LtlSaldo").value);// ToDouble($get('TxtSubTotal').value); + let Total = ToDouble($get("C_LtlSaldo").value.replace(",", ""));// ToDouble($get('TxtSubTotal').value); let TipoAnticipo = $('#<%= DdlTipoAmortizacionAnticipo.ClientID %>').val(); let importeTxt = parseFloat(txt.value.replace(/,/g, '')); if (TipoAnticipo == '4') { - Total = ToDouble($get("C_LtlSaldo").value); + Total = ToDouble($get("C_LtlSaldo").value.replace(",", "")); } if (isNaN(importeTxt)) { diff --git a/Ventas/PVCobranza.aspx.vb b/Ventas/PVCobranza.aspx.vb index 9e5893aeb..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) @@ -758,123 +760,122 @@ Partial Class Ventas_PVCobranza Private Function GenerarFactura(ByRef VentaRemision As Venta, ByRef ObjVentas As ClsVentas, ByRef ObjClientes As ClsClientes) As Modelos.Factura.MMensajeFactura Dim Retorno As Modelos.Factura.MMensajeFactura = Nothing - - Dim DtRemisiones As New DataTable - DtRemisiones.Columns.Add(New DataColumn("CveVenta", GetType(Integer))) - DtRemisiones.Columns.Add(New DataColumn("SerieFolio", GetType(String))) - - DtRemisiones.Rows.Add({VentaRemision.CveVenta, VentaRemision.SerieFolio}) - - Dim RemisionesLista As New List(Of Integer) - RemisionesLista.Add(VentaRemision.CveVenta) - - Dim DtRemisionesPS As New DataTable() - Dim DtPagosFacturaGlobal As New DataTable() - - If ObjClientes.GetVentasRemisionesTotales(VentaRemision.CveCliente, VentaRemision.CveVenta.ToString(), 1, UsuarioActual.CveEmpresa) Then - DtRemisionesPS = ObjClientes.DtResultados.Copy() - End If - - Dim ObjFactura = Modelos.Factura.CrearVentaNueva(UsuarioActual, VentaRemision.CveSubProyecto, VentaRemision.CveCliente, VentaRemision.CveMoneda, "Ing") - - ObjFactura.RemisionesLista = RemisionesLista - ObjFactura.DtRemisionesPS = DtRemisionesPS - ObjFactura.DtRemisiones = DtRemisiones - - Dim DtPagos As DataTable = New DataTable("DtPagosFactura") - DtPagos.Columns.Add(New DataColumn("CveFormaPago", GetType(Integer))) - DtPagos.Columns.Add(New DataColumn("Importe", GetType(Decimal))) - - If TxtImporteCredito.Text.ToDecimal > 0 Then - DtPagos.Rows.Add({4, TxtImporteCredito.Text.ToDecimal}) - End If - - If TxtImporteDebito.Text.ToDecimal > 0 Then - DtPagos.Rows.Add({18, TxtImporteDebito.Text.ToDecimal}) - End If - - If TxtImporteCheque.Text.ToDecimal > 0 Then - DtPagos.Rows.Add({2, TxtImporteCheque.Text.ToDecimal}) - End If - - If TxtImporteTransferencia.Text.ToDecimal > 0 Then - DtPagos.Rows.Add({3, TxtImporteTransferencia.Text.ToDecimal}) - End If - - If TxtImporteEfectivo.Text.ToDecimal > 0 Then - DtPagos.Rows.Add({1, TxtImporteEfectivo.Text.ToDecimal}) - End If - - - Dim PagoMaximo = DtPagos.MAX("Importe") - - Dim CveFormaPago As Integer = DtPagos.FiltroPrimeroValor("CveFormaPago", $"Importe = {PagoMaximo}").ToEntero() - - If CveFormaPago > 0 Then - ObjFactura.CveFormaPago33 = CveFormaPago - ObjFactura.CveMetodoPago33 = 1 - End If - - For Each Dr As DataRow In ObjFactura.DtRemisionesPS.Rows - ObjFactura.AgregarPS(Dr("CvePS").ToString().ToEntero(), Dr("Cantidad").ToString().ToDecimal(), Dr("PU").ToString().ToDecimal(), Dr("Descuento").ToString().ToDecimal, Dr("Obs").ToString(), CveUM:=Dr("CveUM").ToString().ToEntero(), - CveProyecto:=Dr("CveProyecto").ToString().ToEntero(), CveSubProyecto:=Dr("CveSubProyecto").ToString().ToEntero(), CveVentaDetallePadre:=Dr("CveVentaDetalle").ToString().ToEntero(), CveVentaDetalleRemision:=Dr("CveVentaDetalle").ToString().ToEntero(), - PorcentajeIVA:=Dr("PorcentajeIVA").ToString().ToDecimal()) - Next - - If UsuarioActual.Empresa.Funcionalidad(567) = "1" Then - ObjFactura.GenerarSalidaAlmacen = True - ObjFactura.DtInventario = ObjFactura.DtDetalle.FiltraParametros("CveTipoPS = 2").Copy() - ObjFactura.CveAlmacen = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltroPrimeroValor("CveAlmacen", $"CveTipoAlmacen = 1 AND CveSubProyecto = {VentaRemision.CveSubProyecto}", "Orden").ToString().ToEntero() - End If - - - ObjFactura.CalculaTotales() - - ObjFactura.PreparaTimbre() - - If HdnTipoAmortizacion.Value = "4" Then - Dim DtAnticipos As New DataTable() - DtAnticipos.Columns.Add("CveVenta", GetType(Integer)) - DtAnticipos.Columns.Add("Importe", GetType(Decimal)) - DtAnticipos.Columns.Add("CveConceptoContable", GetType(Integer)) - DtAnticipos.Columns.Add("CveIE", GetType(Integer)) - DtAnticipos.Columns.Add("FolioFiscal", GetType(String)) - DtAnticipos.Columns.Add("Descuentos", GetType(Decimal)) - DtAnticipos.Columns.Add("TotalAnticipo", GetType(Decimal)) - DtAnticipos.Columns.Add("SubTotalAnticipo", GetType(Decimal)) - DtAnticipos.Columns.Add("CveMoneda", GetType(Decimal)) - DtAnticipos.Columns.Add("Fecha", GetType(DateTime)) - DtAnticipos.Columns.Add("TipoCambioPago", GetType(Decimal)) - DtAnticipos.Columns.Add("Folio", GetType(String)) - - For Each GvRow As GridViewRow In GVAnticipos.Rows - If GvRow.FCCheckBox("Chk" & GvRow.RowIndex) IsNot Nothing AndAlso GvRow.FCCheckBox("Chk" & GvRow.RowIndex).Checked Then - Dim CveVenta = GvRow.DataKey("CveVenta").ToEntero() - Dim Importe = GvRow.FCTextBox(String.Format("TxtAnticipo{0}", GvRow.RowIndex)).Text.ToDecimal() - Dim CveConceptoContable = GvRow.DataKey("CveConceptoContable").ToEntero() - Dim CveIE = GvRow.DataKey("CveIE").ToEntero() - - Dim FolioFiscal = GvRow.DataKey("FolioFiscal") - Dim Descuentos As Decimal = GvRow.DataKey("Descuentos").ToDecimal() - Dim TotalAnticipo As Decimal = GvRow.DataKey("TotalAnticipo").ToDecimal() - Dim SubTotalAnticipo As Decimal = GvRow.DataKey("SubTotalAnticipo").ToDecimal() - Dim CveMoneda As Integer = GvRow.DataKey("CveMoneda").ToEntero() - Dim Fecha As DateTime = GvRow.DataKey("Fecha").ToDateTime() - Dim TipoCambioPago As Decimal = GvRow.DataKey("TipoCambioPago").ToDecimal() - Dim Folio = GvRow.DataKey("Folio") - - DtAnticipos.Rows.Add(CveVenta, Importe, CveConceptoContable, CveIE, FolioFiscal, Descuentos, TotalAnticipo, SubTotalAnticipo, CveMoneda, Fecha, TipoCambioPago, Folio) - End If - Next - - ObjFactura.EsNCAmortizacion = True - ObjFactura.CveTipoAmortizacionAnticipo = 4 - ObjFactura.DtAnticiposAplicados = DtAnticipos - End If - Dim SbAlert As New StringBuilder() Try + Dim DtRemisiones As New DataTable + DtRemisiones.Columns.Add(New DataColumn("CveVenta", GetType(Integer))) + DtRemisiones.Columns.Add(New DataColumn("SerieFolio", GetType(String))) + + DtRemisiones.Rows.Add({VentaRemision.CveVenta, VentaRemision.SerieFolio}) + + Dim RemisionesLista As New List(Of Integer) + RemisionesLista.Add(VentaRemision.CveVenta) + + Dim DtRemisionesPS As New DataTable() + Dim DtPagosFacturaGlobal As New DataTable() + + If ObjClientes.GetVentasRemisionesTotales(VentaRemision.CveCliente, VentaRemision.CveVenta.ToString(), 1, UsuarioActual.CveEmpresa) Then + DtRemisionesPS = ObjClientes.DtResultados.Copy() + End If + + Dim ObjFactura = Modelos.Factura.CrearVentaNueva(UsuarioActual, VentaRemision.CveSubProyecto, VentaRemision.CveCliente, VentaRemision.CveMoneda, "Ing") + + ObjFactura.RemisionesLista = RemisionesLista + ObjFactura.DtRemisionesPS = DtRemisionesPS + ObjFactura.DtRemisiones = DtRemisiones + + Dim DtPagos As DataTable = New DataTable("DtPagosFactura") + DtPagos.Columns.Add(New DataColumn("CveFormaPago", GetType(Integer))) + DtPagos.Columns.Add(New DataColumn("Importe", GetType(Decimal))) + + If TxtImporteCredito.Text.ToDecimal > 0 Then + DtPagos.Rows.Add({4, TxtImporteCredito.Text.ToDecimal}) + End If + + If TxtImporteDebito.Text.ToDecimal > 0 Then + DtPagos.Rows.Add({18, TxtImporteDebito.Text.ToDecimal}) + End If + + If TxtImporteCheque.Text.ToDecimal > 0 Then + DtPagos.Rows.Add({2, TxtImporteCheque.Text.ToDecimal}) + End If + + If TxtImporteTransferencia.Text.ToDecimal > 0 Then + DtPagos.Rows.Add({3, TxtImporteTransferencia.Text.ToDecimal}) + End If + + If TxtImporteEfectivo.Text.ToDecimal > 0 Then + DtPagos.Rows.Add({1, TxtImporteEfectivo.Text.ToDecimal}) + End If + + + Dim PagoMaximo = DtPagos.MAX("Importe") + + Dim CveFormaPago As Integer = DtPagos.FiltroPrimeroValor("CveFormaPago", $"Importe = {PagoMaximo}").ToEntero() + + If CveFormaPago > 0 Then + ObjFactura.CveFormaPago33 = CveFormaPago + ObjFactura.CveMetodoPago33 = 1 + End If + + For Each Dr As DataRow In ObjFactura.DtRemisionesPS.Rows + ObjFactura.AgregarPS(Dr("CvePS").ToString().ToEntero(), Dr("Cantidad").ToString().ToDecimal(), Dr("PU").ToString().ToDecimal(), Dr("Descuento").ToString().ToDecimal, Dr("Obs").ToString(), CveUM:=Dr("CveUM").ToString().ToEntero(), + CveProyecto:=Dr("CveProyecto").ToString().ToEntero(), CveSubProyecto:=Dr("CveSubProyecto").ToString().ToEntero(), CveVentaDetallePadre:=Dr("CveVentaDetalle").ToString().ToEntero(), CveVentaDetalleRemision:=Dr("CveVentaDetalle").ToString().ToEntero(), + PorcentajeIVA:=Dr("PorcentajeIVA").ToString().ToDecimal()) + Next + + If UsuarioActual.Empresa.Funcionalidad(567) = "1" Then + ObjFactura.GenerarSalidaAlmacen = True + ObjFactura.DtInventario = ObjFactura.DtDetalle.FiltraParametros("CveTipoPS = 2").Copy() + ObjFactura.CveAlmacen = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltroPrimeroValor("CveAlmacen", $"CveTipoAlmacen = 1 AND CveSubProyecto = {VentaRemision.CveSubProyecto}", "Orden").ToString().ToEntero() + End If + + + ObjFactura.CalculaTotales() + + ObjFactura.PreparaTimbre() + + If HdnTipoAmortizacion.Value = "4" Then + Dim DtAnticipos As New DataTable() + DtAnticipos.Columns.Add("CveVenta", GetType(Integer)) + DtAnticipos.Columns.Add("Importe", GetType(Decimal)) + DtAnticipos.Columns.Add("CveConceptoContable", GetType(Integer)) + DtAnticipos.Columns.Add("CveIE", GetType(Integer)) + DtAnticipos.Columns.Add("FolioFiscal", GetType(String)) + DtAnticipos.Columns.Add("Descuentos", GetType(Decimal)) + DtAnticipos.Columns.Add("TotalAnticipo", GetType(Decimal)) + DtAnticipos.Columns.Add("SubTotalAnticipo", GetType(Decimal)) + DtAnticipos.Columns.Add("CveMoneda", GetType(Decimal)) + DtAnticipos.Columns.Add("Fecha", GetType(DateTime)) + DtAnticipos.Columns.Add("TipoCambioPago", GetType(Decimal)) + DtAnticipos.Columns.Add("Folio", GetType(String)) + + For Each GvRow As GridViewRow In GVAnticipos.Rows + If GvRow.FCCheckBox("Chk" & GvRow.RowIndex) IsNot Nothing AndAlso GvRow.FCCheckBox("Chk" & GvRow.RowIndex).Checked Then + Dim CveVenta = GvRow.DataKey("CveVenta").ToEntero() + Dim Importe = GvRow.FCTextBox(String.Format("TxtAnticipo{0}", GvRow.RowIndex)).Text.ToDecimal() + Dim CveConceptoContable = GvRow.DataKey("CveConceptoContable").ToEntero() + Dim CveIE = GvRow.DataKey("CveIE").ToEntero() + + Dim FolioFiscal = GvRow.DataKey("FolioFiscal") + Dim Descuentos As Decimal = GvRow.DataKey("Descuentos").ToDecimal() + Dim TotalAnticipo As Decimal = GvRow.DataKey("TotalAnticipo").ToDecimal() + Dim SubTotalAnticipo As Decimal = GvRow.DataKey("SubTotalAnticipo").ToDecimal() + Dim CveMoneda As Integer = GvRow.DataKey("CveMoneda").ToEntero() + Dim Fecha As DateTime = GvRow.DataKey("Fecha").ToDateTime() + Dim TipoCambioPago As Decimal = GvRow.DataKey("TipoCambioPago").ToDecimal() + Dim Folio = GvRow.DataKey("Folio") + + DtAnticipos.Rows.Add(CveVenta, Importe, CveConceptoContable, CveIE, FolioFiscal, Descuentos, TotalAnticipo, SubTotalAnticipo, CveMoneda, Fecha, TipoCambioPago, Folio) + End If + Next + + ObjFactura.EsNCAmortizacion = True + ObjFactura.CveTipoAmortizacionAnticipo = 4 + ObjFactura.DtAnticiposAplicados = DtAnticipos + End If + Retorno = ObjFactura.EmitirFactura(False, Transac:=ObjVentas.IniciaTransacSQL(), Modulo:="Cobranza/GuardarVenta", MostrarURL:=True) Retorno.Factura = ObjFactura @@ -944,81 +945,85 @@ Partial Class Ventas_PVCobranza Private Function GenerarNC(ByRef Venta As Venta, ByRef ObjVentas As ClsVentas) As Modelos.Factura.MMensajeFactura Dim Retorno As Modelos.Factura.MMensajeFactura = Nothing - Dim ObjNC = Modelos.Factura.CrearVentaNueva(UsuarioActual, Venta.CveSubProyecto, Venta.CveCliente, Venta.CveMoneda, "Egs") - - Dim Total As Decimal = TxtNCDev.Text.ToDecimal() - Dim subTotal As Decimal = (Total / (1D + Venta.PorcentajeIVA)) - 'Dim IVA = (subTotal * Factura.PorcentajeIVA).RoundSQL(2) - Dim PU As Decimal = subTotal - Dim Cantidad As Decimal = 1D - Dim Descuento As Decimal = 0 - Dim Obs = "" - - ObjNC.AgregarPS(DdlNCPSAnt.SelectedValue.ToEntero(), Cantidad, PU, Descuento, Obs, CveSubProyecto:=Venta.CveSubProyecto, PorcentajeIVA:=Venta.PorcentajeIVA) - ObjNC.CalculaTotales() - - Dim DtVentasNC = New DataTable - DtVentasNC.Columns.Add("CveVenta", GetType(Integer)) - DtVentasNC.Columns.Add("Importe", GetType(Decimal)) - DtVentasNC.Columns.Add("FolioFiscal", GetType(String)) - DtVentasNC.Columns.Add(New DataColumn With {.ColumnName = "TC", .DataType = GetType(Decimal), .DefaultValue = 1}) - DtVentasNC.Columns.Add(New DataColumn With {.ColumnName = "TCCambioValuacion", .DataType = GetType(Decimal), .DefaultValue = 1}) - DtVentasNC.Columns.Add(New DataColumn With {.ColumnName = "CveEstatusFactura", .DataType = GetType(Integer), .DefaultValue = -1}) - DtVentasNC.Columns.Add(New DataColumn With {.ColumnName = "Folio", .DataType = GetType(String), .DefaultValue = ""}) - - DtVentasNC.Rows.Add(Venta.CveVenta, Total, "") - - ObjNC.DtVentasNC = DtVentasNC - - Dim DtVentasRelacionadas As New DataTable() - DtVentasRelacionadas.Columns.Add("CveVenta", GetType(Integer)) - DtVentasRelacionadas.Rows.Add(Venta.CveVenta) - - ObjNC.DtVentasRelacionadas = DtVentasRelacionadas - - Dim DtAnticipos As New DataTable() - DtAnticipos.Columns.Add("CveVenta", GetType(Integer)) - DtAnticipos.Columns.Add("Importe", GetType(Decimal)) - DtAnticipos.Columns.Add("CveConceptoContable", GetType(Integer)) - DtAnticipos.Columns.Add("CveIE", GetType(Integer)) - DtAnticipos.Columns.Add("FolioFiscal", GetType(String)) - DtAnticipos.Columns.Add("Descuentos", GetType(Decimal)) - DtAnticipos.Columns.Add("TotalAnticipo", GetType(Decimal)) - DtAnticipos.Columns.Add("SubTotalAnticipo", GetType(Decimal)) - DtAnticipos.Columns.Add("CveMoneda", GetType(Decimal)) - DtAnticipos.Columns.Add("Fecha", GetType(DateTime)) - DtAnticipos.Columns.Add("TipoCambioPago", GetType(Decimal)) - DtAnticipos.Columns.Add("Folio", GetType(String)) - - For Each GvRow As GridViewRow In GVAnticipos.Rows - If GvRow.FCCheckBox("Chk" & GvRow.RowIndex) IsNot Nothing AndAlso GvRow.FCCheckBox("Chk" & GvRow.RowIndex).Checked Then - Dim CveVenta = GvRow.DataKey("CveVenta").ToEntero() - Dim Importe = GvRow.FCTextBox(String.Format("TxtAnticipo{0}", GvRow.RowIndex)).Text.ToDecimal() - Dim CveConceptoContable = GvRow.DataKey("CveConceptoContable").ToEntero() - Dim CveIE = GvRow.DataKey("CveIE").ToEntero() - - Dim FolioFiscal = GvRow.DataKey("FolioFiscal") - Dim Descuentos As Decimal = GvRow.DataKey("Descuentos").ToDecimal() - Dim TotalAnticipo As Decimal = GvRow.DataKey("TotalAnticipo").ToDecimal() - Dim SubTotalAnticipo As Decimal = GvRow.DataKey("SubTotalAnticipo").ToDecimal() - Dim CveMoneda As Integer = GvRow.DataKey("CveMoneda").ToEntero() - Dim Fecha As DateTime = GvRow.DataKey("Fecha").ToDateTime() - Dim TipoCambioPago As Decimal = GvRow.DataKey("TipoCambioPago").ToDecimal() - Dim Folio = GvRow.DataKey("Folio") - - DtAnticipos.Rows.Add(CveVenta, Importe, CveConceptoContable, CveIE, FolioFiscal, Descuentos, TotalAnticipo, SubTotalAnticipo, CveMoneda, Fecha, TipoCambioPago, Folio) - End If - Next - - ObjNC.EsNCAmortizacion = True - ObjNC.CveTipoAmortizacionAnticipo = 2 - ObjNC.DtAnticiposAplicados = DtAnticipos - - ObjNC.PreparaTimbre() - Dim SbAlert As New StringBuilder() Try + Dim ObjNC = Modelos.Factura.CrearVentaNueva(UsuarioActual, Venta.CveSubProyecto, Venta.CveCliente, Venta.CveMoneda, "Egs") + + Dim Total As Decimal = TxtNCDev.Text.ToDecimal() + Dim subTotal As Decimal = (Total / (1D + Venta.PorcentajeIVA)) + 'Dim IVA = (subTotal * Factura.PorcentajeIVA).RoundSQL(2) + Dim PU As Decimal = subTotal + Dim Cantidad As Decimal = 1D + Dim Descuento As Decimal = 0 + Dim Obs = "" + + ObjNC.AgregarPS(DdlNCPSAnt.SelectedValue.ToEntero(), Cantidad, PU, Descuento, Obs, CveSubProyecto:=Venta.CveSubProyecto, PorcentajeIVA:=Venta.PorcentajeIVA) + ObjNC.CalculaTotales() + + Dim DtVentasNC = New DataTable + DtVentasNC.Columns.Add("CveVenta", GetType(Integer)) + DtVentasNC.Columns.Add("Importe", GetType(Decimal)) + DtVentasNC.Columns.Add("FolioFiscal", GetType(String)) + DtVentasNC.Columns.Add(New DataColumn With {.ColumnName = "TC", .DataType = GetType(Decimal), .DefaultValue = 1}) + DtVentasNC.Columns.Add(New DataColumn With {.ColumnName = "TCCambioValuacion", .DataType = GetType(Decimal), .DefaultValue = 1}) + DtVentasNC.Columns.Add(New DataColumn With {.ColumnName = "CveEstatusFactura", .DataType = GetType(Integer), .DefaultValue = -1}) + DtVentasNC.Columns.Add(New DataColumn With {.ColumnName = "Folio", .DataType = GetType(String), .DefaultValue = ""}) + + DtVentasNC.Rows.Add(Venta.CveVenta, Total, "") + + ObjNC.DtVentasNC = DtVentasNC + + Dim DtVentasRelacionadas As New DataTable() + DtVentasRelacionadas.Columns.Add("CveVenta", GetType(Integer)) + DtVentasRelacionadas.Rows.Add(Venta.CveVenta) + + ObjNC.DtVentasRelacionadas = DtVentasRelacionadas + + Dim DtAnticipos As New DataTable() + DtAnticipos.Columns.Add("CveVenta", GetType(Integer)) + DtAnticipos.Columns.Add("Importe", GetType(Decimal)) + DtAnticipos.Columns.Add("CveConceptoContable", GetType(Integer)) + DtAnticipos.Columns.Add("CveIE", GetType(Integer)) + DtAnticipos.Columns.Add("FolioFiscal", GetType(String)) + DtAnticipos.Columns.Add("Descuentos", GetType(Decimal)) + DtAnticipos.Columns.Add("TotalAnticipo", GetType(Decimal)) + DtAnticipos.Columns.Add("SubTotalAnticipo", GetType(Decimal)) + DtAnticipos.Columns.Add("CveMoneda", GetType(Decimal)) + DtAnticipos.Columns.Add("Fecha", GetType(DateTime)) + DtAnticipos.Columns.Add("TipoCambioPago", GetType(Decimal)) + DtAnticipos.Columns.Add("Folio", GetType(String)) + + For Each GvRow As GridViewRow In GVAnticipos.Rows + If GvRow.FCCheckBox("Chk" & GvRow.RowIndex) IsNot Nothing AndAlso GvRow.FCCheckBox("Chk" & GvRow.RowIndex).Checked Then + Dim CveVenta = GvRow.DataKey("CveVenta").ToEntero() + Dim Importe = GvRow.FCTextBox(String.Format("TxtAnticipo{0}", GvRow.RowIndex)).Text.ToDecimal() + Dim CveConceptoContable = GvRow.DataKey("CveConceptoContable").ToEntero() + Dim CveIE = GvRow.DataKey("CveIE").ToEntero() + + Dim FolioFiscal = GvRow.DataKey("FolioFiscal") + Dim Descuentos As Decimal = GvRow.DataKey("Descuentos").ToDecimal() + Dim TotalAnticipo As Decimal = GvRow.DataKey("TotalAnticipo").ToDecimal() + Dim SubTotalAnticipo As Decimal = GvRow.DataKey("SubTotalAnticipo").ToDecimal() + Dim CveMoneda As Integer = GvRow.DataKey("CveMoneda").ToEntero() + Dim Fecha As DateTime = GvRow.DataKey("Fecha").ToDateTime() + Dim TipoCambioPago As Decimal = GvRow.DataKey("TipoCambioPago").ToDecimal() + Dim Folio = GvRow.DataKey("Folio") + + DtAnticipos.Rows.Add(CveVenta, Importe, CveConceptoContable, CveIE, FolioFiscal, Descuentos, TotalAnticipo, SubTotalAnticipo, CveMoneda, Fecha, TipoCambioPago, Folio) + End If + Next + + ObjNC.EsNCAmortizacion = True + ObjNC.CveTipoAmortizacionAnticipo = 2 + ObjNC.DtAnticiposAplicados = DtAnticipos + + ObjNC.PreparaTimbre() + + ObjNC.CveFormaPago33 = 21 'Aplicación de anticipos + ObjNC.CveMetodoPago33 = 1 + ObjNC.CveMetodoPago = 1 + Retorno = ObjNC.EmitirFactura(False, Transac:=ObjVentas.IniciaTransacSQL(), Modulo:="Cobranza/GuardarVenta", MostrarURL:=True) Retorno.Factura = ObjNC diff --git a/Ventas/Ventas.aspx.vb b/Ventas/Ventas.aspx.vb index 49859c516..bcd0bf04e 100644 --- a/Ventas/Ventas.aspx.vb +++ b/Ventas/Ventas.aspx.vb @@ -7805,6 +7805,10 @@ Partial Class Ventas DdlTipoComprobante.Items.Remove(DdlTipoComprobante.Items.FindByValue("Ant")) End If DdlTipoComprobante.Items.Remove(DdlTipoComprobante.Items.FindByValue("Rem")) + + If (DdlTipoComprobante.SelectedValue = "Cot" AndAlso CveVenta > 0) Then + BtnsFacturar.Visible = False + End If End If Dim Bloqueo As Boolean = False @@ -26673,7 +26677,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