diff --git a/App_Code/CFDITimbre.vb b/App_Code/CFDITimbre.vb index 3138f25ba..e506f303e 100644 --- a/App_Code/CFDITimbre.vb +++ b/App_Code/CFDITimbre.vb @@ -469,6 +469,13 @@ Public Class CFDIComplementoPagos End Get End Property + Public ReadOnly Property TotalPagos As Decimal + Get + Return (From c In DocumentosRelacionados + Select c.ImpPagado).Sum() + End Get + End Property + Sub New() DocumentosRelacionados = New List(Of CFDIComplementoPagosDocsRelacionados) @@ -476,6 +483,61 @@ Public Class CFDIComplementoPagos End Sub + Public ReadOnly Property Retenciones As List(Of CFDIRetenciones) + Get + Dim tRetorno As New List(Of CFDIRetenciones) + Dim TRetenciones As New List(Of CFDIRetenciones) + + For Each c As CFDIComplementoPagosDocsRelacionados In DocumentosRelacionados + For Each imp As CFDIConceptosImpuestos In c.Impuestos + If imp.TrasladooRetencion = "R" Then + tRetorno.Add(New CFDIRetenciones With {.Impuesto = imp.Impuesto, .Importe = imp.Importe}) + + End If + Next + Next + If tRetorno.Count > 0 Then + TRetenciones = tRetorno.GroupBy(Function(t) New With {Key t.Impuesto}) _ + .Select(Function(t) New CFDIRetenciones With {.Impuesto = t.Key.Impuesto, + .Importe = t.Sum(Function(tt) tt.Importe)}) _ + .OrderBy(Function(x) x.Impuesto).ToList + End If + + tRetorno = Nothing + Return TRetenciones + + End Get + End Property + + Public ReadOnly Property Traslados As List(Of CFDITraslados) + Get + Dim tRetorno As New List(Of CFDITraslados) + Dim TTraslados As New List(Of CFDITraslados) + For Each c As CFDIComplementoPagosDocsRelacionados In DocumentosRelacionados + For Each imp As CFDIConceptosImpuestos In c.Impuestos + If imp.TrasladooRetencion = "T" Then + tRetorno.Add(New CFDITraslados With {.Impuesto = imp.Impuesto, .Base = imp.Base, .Importe = imp.Importe, .TasaOCuota = imp.TasaOCuota, .TipoFactor = imp.TipoFactor}) + End If + Next + Next + 'ya generado todos los registros posibles, los agrupo y los sumo + If tRetorno.Count > 0 Then + TTraslados = tRetorno.GroupBy(Function(t) New With {Key t.TipoFactor, Key t.Impuesto, Key t.TasaOCuota}) _ + .Select(Function(t) New CFDITraslados With {.Impuesto = t.Key.Impuesto, + .TipoFactor = t.Key.TipoFactor, + .TasaOCuota = t.Key.TasaOCuota, + .Base = t.Sum(Function(tt) tt.Base), + .Importe = t.Sum(Function(tt) tt.Importe)}) _ + .OrderBy(Function(x) x.Impuesto).ToList + + End If + tRetorno = Nothing + Return TTraslados + + + End Get + End Property + End Class @@ -487,9 +549,14 @@ Public Class CFDIComplementoPagosDocsRelacionados Public Property MetodoDePagoDR As String = "" Public Property TipoCambioDR As Decimal Public Property NumParcialidad As Integer = 1 - Public Property ImpSaldoAnt As Double - Public Property ImpPagado As Double - Public Property ImpSaldoInsoluto As Double + Public Property ImpSaldoAnt As Decimal + Public Property ImpPagado As Decimal + Public Property ImpSaldoInsoluto As Decimal + Public Property ObjetoImpuesto As String = "01" + Public Property Impuestos As List(Of CFDIConceptosImpuestos) + Sub New() + Impuestos = New List(Of CFDIConceptosImpuestos) + End Sub End Class diff --git a/App_Code/ClsBancos.vb b/App_Code/ClsBancos.vb index 3d3f33619..7ddc1e495 100644 --- a/App_Code/ClsBancos.vb +++ b/App_Code/ClsBancos.vb @@ -953,6 +953,7 @@ Public Class ClsBancos Dim Estatus As Integer = 1 Dim dttpagos As DataTable = Nothing + Dim dttpagosimpuestos As DataTable = Nothing Dim dr As Data.DataRow = Nothing If GetComplementoPagosRep(-1, Now.AddYears(-5), Now, If(CvePrePoliza > 0, -1, CveIE), CveVenta, If(EsRegeneracion, 2, 1), UsuarioActual.CveEmpresa, CvePrePoliza:=CvePrePoliza) Then @@ -996,7 +997,6 @@ Public Class ClsBancos 'ReceptorRFC = drr("RFC").ToString 'ReceptorNombre = drr("NombreCliente").ToString - Folio = FActual ComplementoSerieFolio = $"{Serie}-{Folio}" @@ -1084,12 +1084,25 @@ Public Class ClsBancos Dim Timbre As CFDITimbre = Nothing Dim Timbrado As New Timbrado + If UsuarioActual.Empresa.Funcionalidad(350) = "1" Then + If GetComplementoPagosImpuestos(CveIE, UsuarioActual.CveEmpresa) Then + dttpagosimpuestos = DtResultados + End If - Timbre = Timbrado.PreparaTimbrePago(RFCEmpresa, UsuarioActual.Empresa.Empresa, UsuarioActual.Empresa.CodigoRegimenFiscal, + Timbre = Timbrado.PreparaTimbrePago40(RFCEmpresa, UsuarioActual.Empresa.Empresa, UsuarioActual.Empresa.CodigoRegimenFiscal, + RFCCliente, dr("NombreCliente").ToString, RFCCliente, dr("NombreCliente").ToString, Serie, Folio.ToString, FechaTimbrado, Cuentapago, + dr("FechaDocumento").ToString.ToDate, dr("ClaveFormaPagoSAT").ToString, dr("AbreviaturaSAT").ToString, dr("VentasTotalPagado").ToString.ToDecimal, + UsuarioActual.Empresa.CP.ToString, CuentaBeneficiario, dr("TipoCambioPago").ToString.ToDecimal, dttpagos, dttpagosimpuestos, CFDIRelacionado:=CFDIRelacionado, EsCancelacion:=False) + + Else + Timbre = Timbrado.PreparaTimbrePago(RFCEmpresa, UsuarioActual.Empresa.Empresa, UsuarioActual.Empresa.CodigoRegimenFiscal, RFCCliente, dr("NombreCliente").ToString, Serie, Folio.ToString, FechaTimbrado, Cuentapago, - dr("FechaDocumento").ToString.ToDate, dr("ClaveFormaPagoSAT").ToString, dr("AbreviaturaSAT").ToString, dr("VentasTotalPagado").ToString.ToDouble, - UsuarioActual.Empresa.CP.ToString, CuentaBeneficiario, dr("TipoCambioPago").ToString.ToDouble, dttpagos, CFDIRelacionado:=CFDIRelacionado, EsCancelacion:=False) + dr("FechaDocumento").ToString.ToDate, dr("ClaveFormaPagoSAT").ToString, dr("AbreviaturaSAT").ToString, dr("VentasTotalPagado").ToString.ToDecimal, + UsuarioActual.Empresa.CP.ToString, CuentaBeneficiario, dr("TipoCambioPago").ToString.ToDecimal, dttpagos, CFDIRelacionado:=CFDIRelacionado, EsCancelacion:=False) + + End If + ''PREPARA PARA CANCELACION POR SUSTITUCION DE COMPLEMENTO DE PAGO 'If CFDIRelacionado <> "-1" And CFDIRelacionado <> "" Then @@ -1365,6 +1378,26 @@ Public Class ClsBancos Return Retorno End Function + Public Function GetComplementoPagosImpuestos(CveIE As Integer, CveEmpresa As Integer) As Boolean + Dim Retorno As Boolean = False + + DataAdapter("PA_Banc_ComplementoPagoImpuestosGet") + + With SqlAdapter.SelectCommand.Parameters + .Add("@CveIE", SqlDbType.Int).Value = CveIE + .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + End With + Try + SqlAdapter.Fill(Data) + + Retorno = True + Catch ex As Exception + OnError("Ocurrió un error al obtener informacion de complementos de pago en impuestos.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo()) + End Try + + Return Retorno + End Function + Public Function GetComplementoPagos(CveComplementoPago As Integer, CveIE As Integer, CveVenta As Integer, CveEmpresa As Integer) As Boolean Dim Retorno As Boolean = False diff --git a/App_Code/ClsNominas.vb b/App_Code/ClsNominas.vb index 90ca3f680..409c84a51 100644 --- a/App_Code/ClsNominas.vb +++ b/App_Code/ClsNominas.vb @@ -338,7 +338,7 @@ Public Class ClsNominas Return retorno End Function - Public Function SUAMovmientosAfiliatoriosGET(cveEmpresa As Integer, FechaInicio As DateTime, FechaFin As DateTime, CveTipoPeriodo As Integer) As Boolean + Public Function SUAMovmientosAfiliatoriosGET(cveEmpresa As Integer, FechaInicio As DateTime, FechaFin As DateTime, CveTipoPeriodo As Integer, Optional CveRegistroPatronal As Integer = -1) As Boolean Dim retorno As Boolean = False DTSet = New DataSet() DataAdapter("[PA_Nom_SUAMovmientosAfiliatoriosGET]", CommandType.StoredProcedure) @@ -347,6 +347,7 @@ Public Class ClsNominas .Add("@FechaInicio", SqlDbType.Date).Value = FechaInicio .Add("@FechaFin", SqlDbType.Date).Value = FechaFin .Add("@TipoPeriodo", SqlDbType.Int).Value = CveTipoPeriodo + .Add("@CveRegistroPatronal", SqlDbType.Int).Value = CveRegistroPatronal End With Try SqlAdapter.Fill(DTSet) diff --git a/App_Code/ClsPaginas.vb b/App_Code/ClsPaginas.vb index 996f5a829..cbcfc5e3c 100644 --- a/App_Code/ClsPaginas.vb +++ b/App_Code/ClsPaginas.vb @@ -5517,6 +5517,8 @@ Public Class ClsPaginas PaginaDict.Add("/Ventas/CatAutorizacionLimites.aspx".ToUpper(), 781) PaginaDict.Add("/Ventas/RepComisionesServec.aspx".ToUpper(), 782) PaginaDict.Add("/Ventas/RepComisionesServecDetalle.aspx".ToUpper(), 782) + PaginaDict.Add("/Ventas/RepCancelacionesVentas.aspx".ToUpper(), 1325) + #End Region diff --git a/App_Code/ClsVentas.vb b/App_Code/ClsVentas.vb index a42ef2585..6a393bec7 100644 --- a/App_Code/ClsVentas.vb +++ b/App_Code/ClsVentas.vb @@ -1445,7 +1445,7 @@ Public Class ClsVentas CveVendedor As String, CveUsuario As Integer, CveEstatus As String, IVA As String, CveEmpresa As Integer, Gpo As Integer, Optional TipoDocto As String = "-1", Optional CveProyecto As Integer = -1, Optional CveSubProyecto As String = "-1", Optional TipoCambio As Integer = 1, Optional TCEspecifico As Decimal = -1, Optional CveUsuarioConsulta As Integer = -1, Optional CveClienteClasificacion As Integer = -1, Optional CveCondicionesPago As Integer = -1, Optional TipoCliente As Integer = -1, Optional ModalidadContable As Boolean = False, - Optional EsDistribuidor As Integer = -1) As Boolean + Optional EsDistribuidor As Integer = -1, Optional CveTipoRelacion As Integer = -1) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_Vta_VentasGetRep") @@ -1474,6 +1474,7 @@ Public Class ClsVentas .Add("@TipoCliente", SqlDbType.Int).Value = TipoCliente .Add("@EsDistribuidor", SqlDbType.Int).Value = EsDistribuidor .Add("@ModalidadContable", SqlDbType.Bit).Value = ModalidadContable + .Add("@CveTipoRelacion", SqlDbType.Int).Value = CveTipoRelacion End With Try @@ -1580,7 +1581,7 @@ Public Class ClsVentas CveSubProyectoEjecucion As Integer, CveEmpresa As Integer, FechaIEjec As Date, FechaFEjec As Date, Optional CveProyecto As Integer = -1, Optional CveSubProyecto As String = "-1", Optional TipoCambio As Integer = 1, Optional TCEspecifico As Decimal = -1, Optional CveMoneda As Integer = -1, Optional CveUsuarioConsulta As Integer = -1, Optional CveClienteClasificacion As Integer = -1, Optional CveCondicionesPago As Integer = -1, Optional TipoCliente As Integer = -1, Optional ModalidadContable As Boolean = False, - Optional EsDistribuidor As Integer = -1) As Boolean + Optional EsDistribuidor As Integer = -1, Optional CveTipoRelacion As Integer = -1) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_Vta_VentasGetRepDetalle") @@ -1614,6 +1615,7 @@ Public Class ClsVentas .Add("@TipoCliente", SqlDbType.Int).Value = TipoCliente .Add("@EsDistribuidor", SqlDbType.Int).Value = EsDistribuidor .Add("@ModalidadContable", SqlDbType.Bit).Value = ModalidadContable + .Add("@CveTipoRelacion", SqlDbType.Int).Value = CveTipoRelacion End With Try @@ -5391,6 +5393,30 @@ Public Class ClsVentas End Function + Public Function GetRepCancelacionVentas(FechaI As Date, FechaF As Date, CveSubProyecto As Integer, CveCliente As Integer, CveMotivoCancelacion As Integer, CveUsuario As Integer, CveEmpresa As Integer) As Boolean + + Dim Retorno As Boolean = False + DataAdapter("PA_Vta_RepCancelacionesVentasGet") + With SqlAdapter.SelectCommand.Parameters + + .Add("@FechaI", SqlDbType.Date).Value = FechaI + .Add("@FechaF", SqlDbType.Date).Value = FechaF + .Add("@CveSubProyecto", SqlDbType.Int).Value = CveSubProyecto + .Add("@CveCliente", SqlDbType.Int).Value = CveCliente + .Add("@CveMotivoCancelacion", SqlDbType.Int).Value = CveMotivoCancelacion + .Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario + .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + + End With + Try + SqlAdapter.Fill(Data) + Retorno = True + Catch ex As Exception + OnError("Ocurrió un error obtener las ventas canceladas.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo()) + End Try + Return Retorno + End Function + #Region "C L I E N T E S V E N D E D O R E S S U B P R O Y E C T O S" Public Function GetClientesVendedoresSubProyectos(CveCliente As Integer, CveVendedor As Integer, CveSubProyecto As Integer, CveEmpresa As Integer) As Boolean diff --git a/App_Code/Modelos.vb b/App_Code/Modelos.vb index 92d95b07b..af1e4838d 100644 --- a/App_Code/Modelos.vb +++ b/App_Code/Modelos.vb @@ -686,7 +686,7 @@ Namespace Modelos Return Not ErrorPrePolizas End Function - Public Function EmitirFactura(Optional Timbrar As Boolean = True, Optional Transac As SqlClient.SqlTransaction = Nothing, Optional ObjContPaqTransac As ClsContPAQi = Nothing) As MMensajeFactura + Public Function EmitirFactura(Optional Timbrar As Boolean = True, Optional Transac As SqlClient.SqlTransaction = Nothing, Optional ObjContPaqTransac As ClsContPAQi = Nothing, Optional Modulo As String = "Modelos/GuardarVentaM") As MMensajeFactura Dim Retorno As New MMensajeFactura() If Me.Version = "3.3" AndAlso Not Me.TipoDocto.Contiene("Ped", "PeC") Then @@ -782,7 +782,7 @@ Namespace Modelos Next End If - GuardarVenta(Me, ObjVentas, ObjConta, ObjInventario, ObjContr, DtDetalle, Me.CveNCaVincular, ObjContPaq, ObjBancos, ObjOS, ObjEventos, ObjCGame, ObjClientes, ObjAcum:=ObjAcum, Resp:=Retorno) + GuardarVenta(Me, ObjVentas, ObjConta, ObjInventario, ObjContr, DtDetalle, Me.CveNCaVincular, ObjContPaq, ObjBancos, ObjOS, ObjEventos, ObjCGame, ObjClientes, ObjAcum:=ObjAcum, Resp:=Retorno, Modulo:=Modulo) 'SI ES REFACTURACION Dim ObjNC As List(Of Object) = Nothing @@ -1453,10 +1453,10 @@ Namespace Modelos End If End Sub - Public Sub GuardarVenta(ByRef factura As Modelos.Factura, ByRef ObjVentas As ClsVentas, ByRef ObjConta As ClsContabilidad, ByRef ObjInventario As ClsInventarios, ByRef ObjContr As ClsContratos, ByRef TmpDTDetalle As DataTable, CveNCaVincular As Integer, ByRef objContPaqi As ClsContPAQi, Optional ByRef ObjBancos As ClsBancos = Nothing, Optional ByRef ObjOS As ClsOS = Nothing, ByRef Optional ObjEventos As ClsOIEventos = Nothing, ByRef Optional ObjCGame As ClsCGame = Nothing, ByRef Optional ObjCliente As ClsClientes = Nothing, Optional EsNotaCredito As Boolean = False, Optional ObjAcum As ClsAcumuladores = Nothing, ByRef Optional Resp As MMensajeFactura = Nothing) + Public Sub GuardarVenta(ByRef factura As Modelos.Factura, ByRef ObjVentas As ClsVentas, ByRef ObjConta As ClsContabilidad, ByRef ObjInventario As ClsInventarios, ByRef ObjContr As ClsContratos, ByRef TmpDTDetalle As DataTable, CveNCaVincular As Integer, ByRef objContPaqi As ClsContPAQi, Optional ByRef ObjBancos As ClsBancos = Nothing, Optional ByRef ObjOS As ClsOS = Nothing, ByRef Optional ObjEventos As ClsOIEventos = Nothing, ByRef Optional ObjCGame As ClsCGame = Nothing, ByRef Optional ObjCliente As ClsClientes = Nothing, Optional EsNotaCredito As Boolean = False, Optional ObjAcum As ClsAcumuladores = Nothing, ByRef Optional Resp As MMensajeFactura = Nothing, Optional Modulo As String = "Modelos/GuardarVentaM") Dim Msgok As New StringBuilder - factura.CvePrePoliza = ObjConta.AddPrePolizas("Modelos/GuardarVentaM", factura.CvePlantillaPoliza, factura.TotalTC, factura.TotalTC, factura.CveMoneda, factura.Fecha, If(factura.CveEmpresaCRM > 0, factura.EmpresaCRM, factura.Cliente.Nombre), factura.CveUsuario, factura.CveEmpresa) + factura.CvePrePoliza = ObjConta.AddPrePolizas(Modulo, factura.CvePlantillaPoliza, factura.TotalTC, factura.TotalTC, factura.CveMoneda, factura.Fecha, If(factura.CveEmpresaCRM > 0, factura.EmpresaCRM, factura.Cliente.Nombre), factura.CveUsuario, factura.CveEmpresa) Dim RFCReceptor As String = "" diff --git a/App_Code/Timbrado.vb b/App_Code/Timbrado.vb index 4a327d03f..60a04e2e9 100644 --- a/App_Code/Timbrado.vb +++ b/App_Code/Timbrado.vb @@ -10,6 +10,7 @@ Imports System.Data Imports System.Xml.Serialization Imports System.Net Imports ProfactCartaPorte = Profact.TimbraCFDI33.Complementos.CartaPorte20 +Imports System.Reflection Public Class Timbrado @@ -1017,6 +1018,156 @@ Public Class Timbrado If PorcentajeIEPS > 0 Then Timbre.ComplementoPagos.Impuestos.Add(New CFDIConceptosImpuestos With {.Base = VentaImportePago * PorcentajeIEPS, .TasaOCuota = PorcentajeIEPS, .Impuesto = "003"}) + 'Next + + Return Timbre + + End Function + + Public Function PreparaTimbrePago40(EmisorRFC As String, EmisorNombre As String, EmisorRegimenFiscal As String, + ReceptorRFC As String, ReceptorNombre As String, ReceptorDomicilioFiscal As String, ReceptorRegimenFiscal As String, + Serie As String, Folio As String, FechaTimbrado As DateTime, + CuentaPago As String, FechaPago As DateTime, FormaPago As String, MonedaPago As String, Monto As Decimal, LugarExpedicion As String, + CuentaBeneficiario As String, TipoCambioP As Decimal, dttpagos As Data.DataTable, dttpagosimpuestos As DataTable, + Optional UsoCFDI As String = "P01", Optional CFDIRelacionado As String = "", Optional EsCancelacion As Boolean = False) As CFDITimbre + ' validación extra para cuando es cancelación requiere el folio relacionado + If EsCancelacion AndAlso CFDIRelacionado = "" Then + Return Nothing + End If + + Dim Timbre As New CFDITimbre + + Timbre.Comprobante.TipoComprobante = "P" + Timbre.Comprobante.Folio = Folio + Timbre.Comprobante.Serie = Serie + Timbre.Comprobante.Fecha = FechaTimbrado + Timbre.Comprobante.FormadePago = "" + Timbre.Comprobante.CondicionesdePago = "" + Timbre.Comprobante.MetodoPago = "" + Timbre.Comprobante.SubTotal = 0 + Timbre.Comprobante.Descuentos = 0 + Timbre.Comprobante.Moneda = "XXX" + Timbre.Comprobante.TipoCambio = "" + Timbre.Comprobante.Total = 0 + + Timbre.Comprobante.LugarExpedicion = LugarExpedicion + + Timbre.Emisor.RegimenFiscal = EmisorRegimenFiscal + Timbre.Emisor.Nombre = EmisorNombre + Timbre.Emisor.RFC = EmisorRFC + + Timbre.Receptor.RFC = ReceptorRFC + Timbre.Receptor.Nombre = ReceptorNombre + Timbre.Receptor.DomicilioFiscalReceptor = ReceptorDomicilioFiscal + Timbre.Receptor.RegimenFiscalReceptor = ReceptorRegimenFiscal + Timbre.Receptor.UsoCFDI = UsoCFDI + + If CFDIRelacionado <> "-1" And CFDIRelacionado <> "" Then + Timbre.CFDIRelacionados.TipoRelacion = "04" + Timbre.CFDIRelacionados.UUID.Add(CFDIRelacionado) + End If + + 'detalles + + Dim concepto As New CFDIConceptos With {.Cantidad = 1, + .Descripcion = "Pago", + .ValorUnitario = 0, + .Importe = 0, + .Unidad = "", + .ClaveUnidad = "ACT", + .ClaveProdServ = "84111506", + .Noidentificacion = "", + .ObjetoImpuesto = "01"} + Timbre.Conceptos.Add(concepto) + + Select Case FormaPago + Case "01" + CuentaPago = "" + CuentaBeneficiario = "" + + End Select + + Dim ImporteCancelacion As Decimal = 1 + Dim MonedaCancelacion As String = "MXN" + Dim TipoCambioCancelacion As Double = 1 + If EsCancelacion Then MonedaPago = MonedaCancelacion + 'como registra un peso por cada fatura que se cancele, se tiene que multiplicar por el numero de facturas, para que se pueda emitir el timbre + If dttpagos IsNot Nothing AndAlso dttpagos.Rows.Count > 0 Then ImporteCancelacion = ImporteCancelacion * dttpagos.Rows.Count + Timbre.ComplementoPagos.CtaOrdenante = CuentaPago + Timbre.ComplementoPagos.CtaBeneficiario = CuentaBeneficiario + Timbre.ComplementoPagos.FechaPago = FechaPago + Timbre.ComplementoPagos.FormaDePagoP = FormaPago + Timbre.ComplementoPagos.MonedaP = MonedaPago + Timbre.ComplementoPagos.Monto = If(EsCancelacion, ImporteCancelacion, Monto) + Timbre.ComplementoPagos.TipoCambioP = If(EsCancelacion, TipoCambioCancelacion, TipoCambioP) + + + Dim VentaFolioFiscal, VentaSerie, VentaFolio, VentaAbreviaturaSAT, VentaMetodoPago, ObjetoImpuesto As String + Dim VentaImportePago, VentaImporteSaldoInsoluto, VentaImporteSaldoAnterior, VentaTipoCambio, PorcentajeIVA, PorcentajeIEPS As Decimal + Dim VentaNumParcialidad As Integer + + If dttpagos IsNot Nothing AndAlso dttpagos.Rows.Count > 0 Then + + For Each dr As Data.DataRow In dttpagos.Rows + VentaFolioFiscal = dr("FolioFiscal").ToString + VentaSerie = dr("VentaSerie").ToString + VentaFolio = dr("VentaFolio").ToString + VentaAbreviaturaSAT = dr("VentaAbreviaturaSAT").ToString + VentaMetodoPago = dr("MetodoPago").ToString + VentaImportePago = dr("VentaImportePagado").ToString.ToDecimal + VentaImporteSaldoInsoluto = dr("ImpSaldoInsoluto").ToString.ToDecimal + VentaImporteSaldoAnterior = dr("ImpSaldoAnterior").ToString.ToDecimal + VentaTipoCambio = dr("TipoCambio").ToString.ToDecimal + VentaNumParcialidad = dr("NumParcialidad").ToString.ToEntero + PorcentajeIVA = dr("PorcentajeIVA").ToString.ToDecimal + PorcentajeIEPS = dr("PorcentajeIEPS").ToString.ToDecimal + ObjetoImpuesto = dr("ObjetoImpuesto").ToString + ' si la moneda es igual, se omite el tipo de cambio de la venta + If MonedaPago = VentaAbreviaturaSAT Then VentaTipoCambio = 0 + + 'condiciones especiales para el pago en pesos, facturas en moneda extranjera + If MonedaPago = "MXN" AndAlso VentaAbreviaturaSAT <> "MXN" Then + VentaTipoCambio = 1 / VentaTipoCambio + End If + + ' For Each drr As Data.DataRow In DtFacturasPagadas.Rows + Dim doc As New CFDIComplementoPagosDocsRelacionados With {.IdDocumento = VentaFolioFiscal, + .Serie = VentaSerie, + .Folio = VentaFolio, + .MonedaDR = VentaAbreviaturaSAT, + .MetodoDePagoDR = VentaMetodoPago, + .ImpPagado = If(EsCancelacion, 1, VentaImportePago), + .ImpSaldoInsoluto = If(EsCancelacion, VentaImporteSaldoAnterior - 1, VentaImporteSaldoInsoluto), + .ImpSaldoAnt = VentaImporteSaldoAnterior, + .TipoCambioDR = VentaTipoCambio, + .NumParcialidad = VentaNumParcialidad, + .ObjetoImpuesto = OBjetoImpuesto} 'If(drr("MetodoPago").ToString = "PUE", 0, drr("NumParcialidad").ToString.ToEntero)} + + For Each drp As DataRow In dttpagosimpuestos.FiltraParametros(String.Format("FolioFiscal = '{0}'", VentaFolioFiscal.ToLower)).Rows + doc.Impuestos.Add(New CFDIConceptosImpuestos With { + .TrasladooRetencion = drp("Tipo").ToString, + .Base = drp("Base").ToString.ToDecimal, + .TasaOCuota = drp("PorcentajeImpuesto").ToString().ToDecimal, + .Impuesto = drp("TipoImpuesto").ToString, + .Importe = drp("Importe").ToString().ToDecimal + } + ) + + Next + + Timbre.ComplementoPagos.DocumentosRelacionados.Add(doc) + + Next + + + End If + 'If drr("IVA").ToString.ToDouble > 0 Then + 'If PorcentajeIVA > 0 Then Timbre.ComplementoPagos.Impuestos.Add(New CFDIConceptosImpuestos With {.TrasladooRetencion = "T", .Base = VentaImportePago * PorcentajeIVA, .TasaOCuota = PorcentajeIVA, .Impuesto = "002"}) + 'Timbre.ComplementoPagos.Impuestos.Add(New CFDIConceptosImpuestos With {.TrasladooRetencion = "R", .Base = 0, .TasaOCuota = 0, .Impuesto = "002"}) + + 'If PorcentajeIEPS > 0 Then Timbre.ComplementoPagos.Impuestos.Add(New CFDIConceptosImpuestos With {.Base = VentaImportePago * PorcentajeIEPS, .TasaOCuota = PorcentajeIEPS, .Impuesto = "003"}) + + 'Next Return Timbre @@ -1078,10 +1229,17 @@ Public Class Timbrado Case 5 + If UsuarioActual.Empresa.Funcionalidad(350) = "1" Then + Dim Ret As String = TimbrarFacturaPADEv40(Ventas, UsuarioActual, CvePACEspecial) + If Ret <> "" Then MensajeErrorCFDI = Ret + Retorno = If(Ret = "", True, False) + Else + Dim Ret As String = TimbrarFacturaPADEv33(Ventas, UsuarioActual, CvePACEspecial) + If Ret <> "" Then MensajeErrorCFDI = Ret + Retorno = If(Ret = "", True, False) + End If + - Dim Ret As String = TimbrarFacturaPADEv33(Ventas, UsuarioActual, CvePACEspecial) - If Ret <> "" Then MensajeErrorCFDI = Ret - Retorno = If(Ret = "", True, False) End Select @@ -3409,36 +3567,30 @@ Public Class Timbrado ' 'Sucursal matriz de la empresa Dim ArchivoLLave As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoKey}" Dim ArchivoCertificado As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoCer}" - Dim UsuarioServicio As String = UsuarioActual.Empresa.RFC - Dim ClaveServicio As String = UsuarioActual.Empresa.RFC.ToLower + Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey Dim EmisorRFC As String = UsuarioActual.Empresa.RFC - Dim UrlServicio As String = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" ' Produccion + Dim EmisorNombre As String = UsuarioActual.Empresa.Empresa + Dim RutaArchivo As String = $"{UsuarioActual.Empresa.Ruta}XML\{Ventas.TipoDocto}\" Dim NombreArchivoXML As String = $"{ObjCFDITimbre.Comprobante.SerieFolio}" + Dim SubTotal As Decimal = 0 Dim AmbienteProductivo As Boolean = True Dim NumDecimalesImporte As Integer = 2 + If Not Directory.Exists(RutaArchivo) Then Directory.CreateDirectory(RutaArchivo) If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then AmbienteProductivo = False - UsuarioServicio = "fgomez" - ClaveServicio = "12121212" Clave = "12345678a" - - 'EmisorRFC = "AAA010101AAA" - 'ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key" - 'ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer" - - EmisorRFC = "ZUÑ920208KL4" - ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_ZUÑ920208KL4.key" - ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_ZUÑ920208KL4.cer" - - UrlServicio = "https://pruebas.timbracfdi33.mx/Timbrado.asmx" + EmisorRFC = "IIA040805DZ4" + EmisorNombre = "INDISTRIA ILUMINADORA DE ALMACENES SA DE CV" + ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\publicKey.key" + ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\publicCer.cer" + UsuarioActual.Empresa.CodigoRegimenFiscal = "601" End If - #Region "Valida" If Not File.Exists(ArchivoCertificado) Then Alert("El archivo de certificado no existe", TipoMensaje.MsgError) @@ -3525,6 +3677,7 @@ Public Class Timbrado comprobante.MetodoPago = ObjCFDITimbre.Comprobante.MetodoPago comprobante.MetodoPagoSpecified = If(ObjCFDITimbre.Comprobante.MetodoPago <> "", True, False) comprobante.LugarExpedicion = ObjCFDITimbre.Comprobante.LugarExpedicion + comprobante.Exportacion = ObjCFDITimbre.Comprobante.Exportacion If ObjCFDITimbre.CFDIRelacionados.TipoRelacion <> "" Then Dim CfdiRelacionados As New Profact.TimbraCFDI40.ComprobanteCfdiRelacionados @@ -3541,7 +3694,7 @@ Public Class Timbrado #Region "Emisor" comprobante.Emisor = New Profact.TimbraCFDI40.ComprobanteEmisor() comprobante.Emisor.Rfc = EmisorRFC - comprobante.Emisor.Nombre = UsuarioActual.Empresa.Empresa + comprobante.Emisor.Nombre = EmisorNombre comprobante.Emisor.RegimenFiscal = UsuarioActual.Empresa.CodigoRegimenFiscal #End Region @@ -3552,6 +3705,7 @@ Public Class Timbrado comprobante.Receptor.Nombre = ObjCFDITimbre.Receptor.Nombre comprobante.Receptor.UsoCFDI = ObjCFDITimbre.Receptor.UsoCFDI comprobante.Receptor.RegimenFiscalReceptor = ObjCFDITimbre.Receptor.RegimenFiscalReceptor + comprobante.Receptor.DomicilioFiscalReceptor = ObjCFDITimbre.Receptor.DomicilioFiscalReceptor #End Region #End Region @@ -3572,9 +3726,10 @@ Public Class Timbrado If concep.Unidad <> "" Then comprobante.Conceptos(i).Unidad = concep.Unidad comprobante.Conceptos(i).ClaveUnidad = concep.ClaveUnidad comprobante.Conceptos(i).Descripcion = concep.Descripcion - comprobante.Conceptos(i).ValorUnitario = concep.ValorUnitario + comprobante.Conceptos(i).ValorUnitario = concep.ValorUnitario.RoundSQL(6) comprobante.Conceptos(i).Importe = concep.Importe.RoundSQL(NumDecimalesImporte) comprobante.Conceptos(i).ClaveProdServ = concep.ClaveProdServ + comprobante.Conceptos(i).ObjetoImp = concep.ObjetoImpuesto If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then If concep.Descuento > 0 Then @@ -3650,6 +3805,7 @@ Public Class Timbrado For Each Tras In ObjCFDITimbre.Traslados comprobante.Impuestos.Traslados(y) = New Profact.TimbraCFDI40.ComprobanteImpuestosTraslado() + comprobante.Impuestos.Traslados(y).Base = Tras.Base comprobante.Impuestos.Traslados(y).Impuesto = Tras.Impuesto comprobante.Impuestos.Traslados(y).TipoFactor = Tras.TipoFactor comprobante.Impuestos.Traslados(y).TasaOCuota = Tras.TasaOCuota.FormatoNumero(6) @@ -3919,13 +4075,13 @@ Public Class Timbrado End If If ObjCFDITimbre.ComplementoPagos.CertPago <> "" Then - ComPag.Pago(0).CertPago = System.Text.Encoding.Default.GetBytes(ObjCFDITimbre.ComplementoPagos.CertPago) + ComPag.Pago(0).CertPago = System.Text.Encoding.Default.GetBytes(ObjCFDITimbre.ComplementoPagos.CertPago).ToString() End If If ObjCFDITimbre.ComplementoPagos.CadPago <> "" Then ComPag.Pago(0).CadPago = ObjCFDITimbre.ComplementoPagos.CadPago End If If ObjCFDITimbre.ComplementoPagos.SelloPago <> "" Then - ComPag.Pago(0).SelloPago = System.Text.Encoding.Default.GetBytes(ObjCFDITimbre.ComplementoPagos.SelloPago) + ComPag.Pago(0).SelloPago = System.Text.Encoding.Default.GetBytes(ObjCFDITimbre.ComplementoPagos.SelloPago).ToString() End If If ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count > 0 Then @@ -3939,19 +4095,52 @@ Public Class Timbrado End If ComPag.Pago(0).DoctoRelacionado(i).Folio = doc.Folio ComPag.Pago(0).DoctoRelacionado(i).MonedaDR = doc.MonedaDR - 'ComPag.Pago(0).DoctoRelacionado(i).TipoCambioDRSpecifiedP = If(doc.TipoCambioDR = 0, False, True) - 'ComPag.Pago(0).DoctoRelacionado(i).TipoCambioDR = doc.TipoCambioDR - 'ComPag.Pago(0).DoctoRelacionado(i).MetodoDePagoDR = doc.MetodoDePagoDR ComPag.Pago(0).DoctoRelacionado(i).NumParcialidad = doc.NumParcialidad.ToString - - 'ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoAntSpecified = True - ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoAnt = doc.ImpSaldoAnt.ToDecimal - + ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoAnt = doc.ImpSaldoAnt ComPag.Pago(0).DoctoRelacionado(i).ImpPagadoSpecified = True - ComPag.Pago(0).DoctoRelacionado(i).ImpPagado = doc.ImpPagado.ToDecimal + ComPag.Pago(0).DoctoRelacionado(i).ImpPagado = doc.ImpPagado + ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsoluto = doc.ImpSaldoInsoluto + ComPag.Pago(0).DoctoRelacionado(i).ObjetoImpDR = doc.ObjetoImpuesto + + If doc.Impuestos IsNot Nothing Then + ComPag.Pago(0).DoctoRelacionado(i).ImpuestosDR = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoDoctoRelacionadoImpuestosDR + ''traslados + If (doc.Impuestos).Where(Function(x) x.TrasladooRetencion = "T").Count > 0 Then + Dim j As Integer = 0 + For Each docimp As CFDIConceptosImpuestos In doc.Impuestos.Where(Function(x) x.TrasladooRetencion = "T") + + ComPag.Pago(0).DoctoRelacionado(i).ImpuestosDR.TrasladosDR = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoDoctoRelacionadoImpuestosDRTrasladoDR(doc.Impuestos.Where(Function(x) x.TrasladooRetencion = "T").Count - 1) {} + If docimp.TrasladooRetencion = "T" Then + Dim Tra As New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoDoctoRelacionadoImpuestosDRTrasladoDR + Tra.BaseDR = docimp.Base + Tra.ImporteDRSpecified = True + Tra.ImporteDR = docimp.Importe + Tra.ImpuestoDR = docimp.Impuesto + ComPag.Pago(0).DoctoRelacionado(i).ImpuestosDR.TrasladosDR(j) = Tra + End If + j += 1 + Next + End If + + ''retenciones + If (doc.Impuestos).Where(Function(x) x.TrasladooRetencion = "R").Count > 0 Then + Dim j As Integer = 0 + For Each docimp As CFDIConceptosImpuestos In doc.Impuestos.Where(Function(x) x.TrasladooRetencion = "R") + ComPag.Pago(0).DoctoRelacionado(i).ImpuestosDR.RetencionesDR = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoDoctoRelacionadoImpuestosDRRetencionDR(doc.Impuestos.Where(Function(x) x.TrasladooRetencion = "R").Count - 1) {} + If docimp.TrasladooRetencion = "R" Then + Dim Tra As New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoDoctoRelacionadoImpuestosDRRetencionDR + Tra.BaseDR = docimp.Base + Tra.ImporteDR = docimp.Importe + Tra.ImpuestoDR = docimp.Impuesto + ComPag.Pago(0).DoctoRelacionado(i).ImpuestosDR.RetencionesDR(j) = Tra + End If + j += 1 + Next + End If + End If + + - 'ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsolutoSpecified = True - ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsoluto = doc.ImpSaldoInsoluto.ToDecimal i += 1 Next @@ -3991,8 +4180,8 @@ Public Class Timbrado Dim nsComp As New System.Xml.Serialization.XmlSerializerNamespaces() - nsComp.Add("pago20", "http://www.sat.gob.mx/Pagos") - Dim xmlComp As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(ComPag, GetType(Profact.TimbraCFDI33.Complementos.Pagos10.Pagos), nsComp) + nsComp.Add("pago20", "http://www.sat.gob.mx/Pagos20") + Dim xmlComp As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(ComPag, GetType(Profact.TimbraCFDI40.Complementos.Pagos20.Pagos), nsComp) Dim docComp As New XmlDocument() docComp.LoadXml(xmlComp) 'comprobante.PagosSpecified = True @@ -4602,7 +4791,7 @@ Public Class Timbrado ' End Try '//Timbramos el CFDI por medio del conector y guardamos resultado - Dim resultadoTimbre As Profact.TimbraCFDI.ResultadoTimbre + Dim resultadoTimbre As Profact.TimbraCFDI.ResultadoTimbre = Nothing #End Region @@ -4697,29 +4886,38 @@ Public Class Timbrado Else - If String.IsNullOrEmpty(resultadoTimbre.Detalle) Then - Dim Resultados = Newtonsoft.Json.Linq.JArray.Parse(resultadoTimbre.Detalle) + If Not String.IsNullOrEmpty(resultadoTimbre.Detalle) Then + Try + Dim Resultados = Newtonsoft.Json.Linq.JArray.Parse(resultadoTimbre.Detalle) - If Resultados.Count > 0 Then - If resultadoTimbre.Descripcion.Contains("RFC del receptor no existe") Then - Retorno = $"El RFC { Resultados(0)("Value").ToString() } no existe en las bases de datos publicadas por el SAT, corrobore este dato con su cliente" - MensajeErrorCFDI = $"El RFC { Resultados(0)("Value").ToString() } no existe en las bases de datos publicadas por el SAT, corrobore este dato con su cliente" + If Resultados.Count > 0 Then + If resultadoTimbre.Descripcion.Contains("RFC del receptor no existe") Then + Retorno = $"El RFC { Resultados(0)("Value").ToString() } no existe en las bases de datos publicadas por el SAT, corrobore este dato con su cliente" + MensajeErrorCFDI = $"El RFC { Resultados(0)("Value").ToString() } no existe en las bases de datos publicadas por el SAT, corrobore este dato con su cliente" + Else + Dim sbMsg As New StringBuilder + For Each msg In Resultados + sbMsg.AppendFormat("{0}.
", msg("Value")) + Next + Retorno = sbMsg.ToString() + MensajeErrorCFDI = Retorno + End If Else - Retorno = Resultados(0)("Value").ToString() - MensajeErrorCFDI = Resultados(0)("Value").ToString() - End If - Else - Retorno = resultadoTimbre.Detalle - MensajeErrorCFDI = resultadoTimbre.Detalle + Retorno = resultadoTimbre.Detalle + MensajeErrorCFDI = resultadoTimbre.Detalle - If Retorno = "[]" Then - Retorno = resultadoTimbre.Descripcion + If Retorno = "[]" Then + Retorno = resultadoTimbre.Descripcion + End If + If MensajeErrorCFDI = "[]" Then + Retorno = resultadoTimbre.Descripcion + End If + End If - If MensajeErrorCFDI = "[]" Then - Retorno = resultadoTimbre.Descripcion - End If + Catch ex As Exception + Retorno = ex.ToString() + End Try - End If Else Retorno = resultadoTimbre.Detalle MensajeErrorCFDI = resultadoTimbre.Detalle @@ -4730,107 +4928,17 @@ Public Class Timbrado GuardaLogTimbrado(swTiempo.ToString, UsuarioActual.Empresa.CvePAC) Return Retorno End Function - Public Function TimbrarFacturaGoCFDIv40(Ventas As Modelos.Factura, UsuarioActual As Usuario, Optional CvePACEspecial As Integer = -1) As String - If CvePACEspecial = -1 Then - CvePACEspecial = UsuarioActual.Empresa.CvePAC - End If - Dim sw As New Diagnostics.Stopwatch - Dim swmili As Long = 0 - Dim swTiempo As New StringBuilder - sw.Start() + + Private Function GenerarXMLGoCFDIv40(ByRef cfdi As GoFac.Cfdi4, EmisorRFC As String, ArchivoCertificado As String, llaveBase64 As String, Clave As String, Ventas As Modelos.Factura, UsuarioActual As Usuario, Optional CvePACEspecial As Integer = -1) As String Dim Retorno As String = "" - Dim ObjCFDITimbre As CFDITimbre = Ventas.Timbre - - Dim ArchivoLLave As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoKey) - Dim ArchivoCertificado As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoCer) - Dim UsuarioServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC, "rene.molina@adsistemas.mx") - Dim ClaveServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC.ToLower, "rene2018") - Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey - Dim EmisorRFC As String = UsuarioActual.Empresa.RFC - Dim UrlServicio As String = "" ' Produccion - Dim RutaArchivo As String = String.Format("{0}XML\{1}\", UsuarioActual.Empresa.Ruta, Ventas.TipoDocto) - Dim NombreArchivoXML As String = ObjCFDITimbre.Comprobante.SerieFolio - Dim SubTotal As Decimal = 0 - Dim TimbraProduccion As Boolean = True - If Not Directory.Exists(RutaArchivo) Then Directory.CreateDirectory(RutaArchivo) - - UrlServicio = "https://cfdi.gofac.com.mx/timbrado.asmx?WSDL" - - If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then - - EmisorRFC = "EKU9003173C9" - UsuarioActual.Empresa.Empresa = "ESCUELA KEMPER URGATE SA DE CV" - ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\EKU9003173C9.key" - ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\EKU9003173C9.cer" - - Clave = "12345678a" - TimbraProduccion = False - UsuarioServicio = "UserTest" - ClaveServicio = "1234567890" - - End If - -#Region "Valida" - If Not File.Exists(ArchivoCertificado) Then - Alert("El archivo de certificado no existe", TipoMensaje.MsgError) - Return "El archivo de certificado no existe" - End If - If Not File.Exists(ArchivoLLave) Then - Alert("El archivo de llave privada no existe", TipoMensaje.MsgError) - Return "El archivo de llave privada no existe" - End If - If UsuarioActual.Empresa.ContraseñaKey = "" Then - Alert("La clave no puede ser vacía", TipoMensaje.MsgError) - Return "La clave no puede ser vacía" - End If -#End Region - -#Region "Variables" - Dim llaveByte As Byte(), certByte As Byte() - Dim llaveBase64 As String, certBase64 As String - Dim cfdi As New GoFac.Cfdi4 - Dim complemento As String = "" - Dim complementoConcepto As String = "" - -#End Region - -#Region "Verifica" - Try - llaveByte = System.IO.File.ReadAllBytes(ArchivoLLave) - llaveBase64 = Convert.ToBase64String(llaveByte) - Catch ex As Exception - Alert($"Error al leer la llave privada: {ex.Message}", TipoMensaje.MsgError) - Return "Error al leer la llave privada" - End Try - - - Try - certByte = System.IO.File.ReadAllBytes(ArchivoCertificado) - certBase64 = Convert.ToBase64String(certByte) - Catch ex As Exception - Alert($"Error al leer el certificado: {ex.Message}", TipoMensaje.MsgError) - Return "Error al leer el certificado" - - End Try -#End Region - - - sw.Stop() - swTiempo.AppendFormat("Verificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() - + MensajeErrorCFDI = "" 'cfdi.QuitarCerosDecimalDerecha = True ' no limita a 2 decimales, el atributo, de cantidad y precio unitario #Region "Certificado" cfdi.CertArchivo(ArchivoCertificado) #End Region - - sw.Stop() - swTiempo.AppendFormat("Certificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() + Dim ObjCFDITimbre As CFDITimbre = Ventas.Timbre #Region "Comprobante" @@ -5119,8 +5227,9 @@ Public Class Timbrado #Region "Complemento Pago" If ObjCFDITimbre.Comprobante.TipoComprobante = "P" Then + cfdi.Pago20Totales(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ObjCFDITimbre.ComplementoPagos.TotalPagos) - cfdi.Pago(ObjCFDITimbre.ComplementoPagos.FechaPago.ToString("yyyy-MM-ddTHH:mm:ss"), + cfdi.Pago20(ObjCFDITimbre.ComplementoPagos.FechaPago.ToString("yyyy-MM-ddTHH:mm:ss"), ObjCFDITimbre.ComplementoPagos.FormaDePagoP, ObjCFDITimbre.ComplementoPagos.MonedaP, ObjCFDITimbre.ComplementoPagos.TipoCambioP, @@ -5141,16 +5250,17 @@ Public Class Timbrado For Each doc As CFDIComplementoPagosDocsRelacionados In ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados - cfdi.PagoDoctoRelacionado(doc.IdDocumento, + cfdi.Pago20DoctoRelacionado(doc.IdDocumento, doc.Serie, doc.Folio, doc.MonedaDR, doc.TipoCambioDR, - doc.MetodoDePagoDR, doc.NumParcialidad, doc.ImpSaldoAnt, doc.ImpPagado, - doc.ImpSaldoInsoluto) + doc.ImpSaldoInsoluto, + doc.ObjetoImpuesto) + 'falta impuestos Next @@ -5279,15 +5389,14 @@ Public Class Timbrado End If #End Region - sw.Stop() - swTiempo.AppendFormat("Armado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() #Region "Genera XML" Dim ArchivoGenerado As Boolean = False Try cfdi.GenerarXmlB64(llaveBase64, Clave) ArchivoGenerado = True + If ArchivoGenerado Then + Retorno = "" + End If Catch ex As Exception Retorno = cfdi.Mensaje If Retorno = "" OrElse IsNothing(Retorno) Then @@ -5296,14 +5405,115 @@ Public Class Timbrado MensajeErrorCFDI = Retorno End Try + If Not String.IsNullOrEmpty(MensajeErrorCFDI) Then + Retorno = MensajeErrorCFDI + End If + #End Region + + Return Retorno + End Function + + Public Function TimbrarFacturaGoCFDIv40(Ventas As Modelos.Factura, UsuarioActual As Usuario, Optional CvePACEspecial As Integer = -1) As String + If CvePACEspecial = -1 Then + CvePACEspecial = UsuarioActual.Empresa.CvePAC + End If + Dim sw As New Diagnostics.Stopwatch + Dim swmili As Long = 0 + Dim swTiempo As New StringBuilder + sw.Start() + Dim Retorno As String = "" + Dim ObjCFDITimbre As CFDITimbre = Ventas.Timbre + + Dim ArchivoLLave As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoKey) + Dim ArchivoCertificado As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoCer) + Dim UsuarioServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC, "rene.molina@adsistemas.mx") + Dim ClaveServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC.ToLower, "rene2018") + Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey + Dim EmisorRFC As String = UsuarioActual.Empresa.RFC + Dim UrlServicio As String = "" ' Produccion + Dim RutaArchivo As String = String.Format("{0}XML\{1}\", UsuarioActual.Empresa.Ruta, Ventas.TipoDocto) + Dim NombreArchivoXML As String = ObjCFDITimbre.Comprobante.SerieFolio + Dim SubTotal As Decimal = 0 + Dim TimbraProduccion As Boolean = True + If Not Directory.Exists(RutaArchivo) Then Directory.CreateDirectory(RutaArchivo) + + UrlServicio = "https://cfdi.gofac.com.mx/timbrado.asmx?WSDL" + + If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then + + EmisorRFC = "EKU9003173C9" + UsuarioActual.Empresa.Empresa = "ESCUELA KEMPER URGATE SA DE CV" + ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\EKU9003173C9.key" + ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\EKU9003173C9.cer" + + Clave = "12345678a" + TimbraProduccion = False + UsuarioServicio = "UserTest" + ClaveServicio = "1234567890" + + End If + +#Region "Valida" + If Not File.Exists(ArchivoCertificado) Then + Alert("El archivo de certificado no existe", TipoMensaje.MsgError) + Return "El archivo de certificado no existe" + End If + If Not File.Exists(ArchivoLLave) Then + Alert("El archivo de llave privada no existe", TipoMensaje.MsgError) + Return "El archivo de llave privada no existe" + End If + If UsuarioActual.Empresa.ContraseñaKey = "" Then + Alert("La clave no puede ser vacía", TipoMensaje.MsgError) + Return "La clave no puede ser vacía" + End If +#End Region + +#Region "Variables" + Dim llaveByte As Byte(), certByte As Byte() + Dim llaveBase64 As String, certBase64 As String + Dim cfdi As New GoFac.Cfdi4 + Dim complemento As String = "" + Dim complementoConcepto As String = "" + +#End Region + +#Region "Verifica" + Try + llaveByte = System.IO.File.ReadAllBytes(ArchivoLLave) + llaveBase64 = Convert.ToBase64String(llaveByte) + Catch ex As Exception + Alert($"Error al leer la llave privada: {ex.Message}", TipoMensaje.MsgError) + Return "Error al leer la llave privada" + End Try + + + Try + certByte = System.IO.File.ReadAllBytes(ArchivoCertificado) + certBase64 = Convert.ToBase64String(certByte) + Catch ex As Exception + Alert($"Error al leer el certificado: {ex.Message}", TipoMensaje.MsgError) + Return "Error al leer el certificado" + + End Try +#End Region + + + sw.Stop() + swTiempo.AppendFormat("Verificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() + + + Dim RespGeneracionXML As String = GenerarXMLGoCFDIv40(cfdi, EmisorRFC, ArchivoCertificado, llaveBase64, Clave, Ventas, UsuarioActual, CvePACEspecial) + sw.Stop() swTiempo.AppendFormat("Genera: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) swmili = sw.ElapsedMilliseconds sw.Start() #Region "Timbra" - If ArchivoGenerado Then + If RespGeneracionXML = "" Then cfdi.TimbrarCfdi(UsuarioServicio, ClaveServicio, TimbraProduccion) @@ -5437,18 +5647,19 @@ Public Class Timbrado Dim ArchivoLLave As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoKey) Dim ArchivoCertificado As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoCer) - Dim UsuarioServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC, "rene.molina@adsistemas.mx") - Dim ClaveServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC.ToLower, "rene2018") + + Dim UsuarioServicio As String = "rene.molina@adssistemas.mx" + Dim ClaveServicio As String = "Facturacion2021#" + Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey Dim EmisorRFC As String = UsuarioActual.Empresa.RFC - Dim UrlServicio As String = "" ' Produccion + Dim RutaArchivo As String = String.Format("{0}XML\{1}\", UsuarioActual.Empresa.Ruta, Ventas.TipoDocto) Dim NombreArchivoXML As String = ObjCFDITimbre.Comprobante.SerieFolio Dim SubTotal As Decimal = 0 Dim TimbraProduccion As Boolean = True If Not Directory.Exists(RutaArchivo) Then Directory.CreateDirectory(RutaArchivo) - UrlServicio = "https://cfdi.gofac.com.mx/timbrado.asmx?WSDL" If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then @@ -5459,9 +5670,6 @@ Public Class Timbrado Clave = "12345678a" TimbraProduccion = False - UsuarioServicio = "UserTest" - ClaveServicio = "1234567890" - End If #Region "Valida" @@ -5514,483 +5722,8 @@ Public Class Timbrado swmili = sw.ElapsedMilliseconds sw.Start() + Dim RespGeneracionXML As String = GenerarXMLGoCFDIv40(cfdi, EmisorRFC, ArchivoCertificado, llaveBase64, Clave, Ventas, UsuarioActual, CvePACEspecial) - 'cfdi.QuitarCerosDecimalDerecha = True ' no limita a 2 decimales, el atributo, de cantidad y precio unitario -#Region "Certificado" - cfdi.CertArchivo(ArchivoCertificado) -#End Region - - - sw.Stop() - swTiempo.AppendFormat("Certificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() - -#Region "Comprobante" - - cfdi.Comprobante( - ObjCFDITimbre.Comprobante.Serie, - ObjCFDITimbre.Comprobante.Folio, - ObjCFDITimbre.Comprobante.Fecha.ToString("yyyy-MM-ddTHH:mm:ss"), - ObjCFDITimbre.Comprobante.FormadePago, - ObjCFDITimbre.Comprobante.CondicionesdePago, - ObjCFDITimbre.Comprobante.SubTotal, - ObjCFDITimbre.Comprobante.Descuentos, - ObjCFDITimbre.Comprobante.Moneda, - ObjCFDITimbre.Comprobante.TipoCambio.ToString, - ObjCFDITimbre.Comprobante.Total, - ObjCFDITimbre.Comprobante.TipoComprobante, - ObjCFDITimbre.Comprobante.Exportacion, - ObjCFDITimbre.Comprobante.MetodoPago, - ObjCFDITimbre.Comprobante.LugarExpedicion, - ObjCFDITimbre.Comprobante.Confirmacion) - - If ObjCFDITimbre.CFDIRelacionados.TipoRelacion <> "" Then - cfdi.CfdiRelacionados(ObjCFDITimbre.CFDIRelacionados.TipoRelacion) - For Each uid As String In ObjCFDITimbre.CFDIRelacionados.UUID - cfdi.CfdiRelacionado(uid) - Next - End If -#Region "Emisor" - ' cfdi.agregarCfdiRelacionados() - cfdi.Emisor(EmisorRFC, UsuarioActual.Empresa.Empresa, UsuarioActual.Empresa.CodigoRegimenFiscal, "") - -#End Region - -#Region "Receptor" - - cfdi.Receptor(ObjCFDITimbre.Receptor.RFC, ObjCFDITimbre.Receptor.Nombre, ObjCFDITimbre.Receptor.DomicilioFiscalReceptor, ObjCFDITimbre.Receptor.ResidenciaFiscal, ObjCFDITimbre.Receptor.NumeroRegistroTributario, ObjCFDITimbre.Receptor.RegimenFiscalReceptor, ObjCFDITimbre.Receptor.UsoCFDI) - -#End Region - -#End Region - -#Region "Conceptos" - - 'Nodo conceptos, se agregan los PS - - If ObjCFDITimbre.Conceptos IsNot Nothing AndAlso ObjCFDITimbre.Conceptos.Count > 0 Then - For Each concep As CFDIConceptos In ObjCFDITimbre.Conceptos - cfdi.Concepto(concep.ClaveProdServ, concep.Noidentificacion, concep.Cantidad, concep.ClaveUnidad, concep.Unidad, concep.Descripcion, concep.ValorUnitario, concep.Importe, concep.Descuento, concep.ObjetoImpuesto) - For Each imp As CFDIConceptosImpuestos In concep.Impuestos - If imp.TrasladooRetencion = "T" Then - cfdi.ConceptoTraslado(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe) - Else - cfdi.ConceptoRetencion(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe) - End If - Next - If concep.CuentaPredial <> "" Then cfdi.CuentaPredial(concep.CuentaPredial) - If concep.NumeroPedimento <> "" Then cfdi.InformacionAduanera(concep.NumeroPedimento) - Next - End If - -#End Region - - If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E") Then - -#Region "Impuestos" - 'SI NO ES FACTURA EN 0 AGREGA LOS IMPUESTOS - If Ventas.Total <> 0 OrElse (ObjCFDITimbre.TotalImpuestosRetenidos > 0 OrElse ObjCFDITimbre.TotalImpuestosTrasladados > 0) Then - cfdi.Impuestos(ObjCFDITimbre.TotalImpuestosRetenidos, ObjCFDITimbre.TotalImpuestosTrasladados) - End If -#End Region -#Region " Traslados y Retenciones" - - - If ObjCFDITimbre.Retenciones.Sum(Function(x) x.Importe) > 0 Then - ''se acumulan los importes - For Each Ret In ObjCFDITimbre.Retenciones - cfdi.Retencion(Ret.Impuesto, Ret.Importe) - Next - End If - - ''se acumulan los importes - For Each Tras In ObjCFDITimbre.Traslados - cfdi.Traslado(Tras.Base, Tras.Impuesto, Tras.TipoFactor, Tras.TasaOCuota, Tras.Importe) - Next -#End Region - -#Region "Impuestos Locales" - - If ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe) > 0 OrElse ObjCFDITimbre.TrasladosLocales.Sum(Function(x) x.Importe) > 0 Then - - cfdi.ImpuestosLocales(ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe), ObjCFDITimbre.TrasladosLocales.Sum(Function(x) x.Importe)) - - For Each ret As CFDIRetencionesLocales In ObjCFDITimbre.RetencionesLocales - If ret.Importe > 0 Then - cfdi.RetencionLocal(ret.ImpuestoLocalRetenido, ret.TasaRetencion, ret.Importe) - End If - Next - - For Each ret As CFDITrasladosLocales In ObjCFDITimbre.TrasladosLocales - If ret.Importe > 0 Then - cfdi.TrasladoLocal(ret.ImpuestoLocalTraslado, ret.TasaTraslado, ret.Importe) - End If - Next - End If - - 'If Ventas.CveComplementoTimbrado > 0 Then - - ' Select Case Ventas.CveComplementoTimbrado - ' Case 5 'INE Proceso Ordinario Directivo Estatal" - ' cfdi.Ine11("Ordinario", "Directivo Estatal", "0") - - ' cfdi.IneEntidad(Ventas.ComplementoINE.INEEntidad, "") - ' cfdi.IneContabilidad(Ventas.ComplementoINE.INEIdContabilidad) - ' Case 6 'INE Proceso Ordinario Ejecutivo Estatal" - ' cfdi.Ine11("Ordinario", "Ejecutivo Estatal", "0") - - ' cfdi.IneEntidad(Ventas.ComplementoINE.INEEntidad, "") - ' cfdi.IneContabilidad(Ventas.ComplementoINE.INEIdContabilidad) - ' Case 7 'INE Proceso Ordinario Ejecutivo Nacional" - - ' cfdi.Ine11("Ordinario", "Ejecutivo Nacional", Ventas.ComplementoINE.INEIdContabilidad.ToString) - ' Case 8 'INE PreCampaña - ' cfdi.Ine11(Ventas.ComplementoINE.INETipoProceso, "", "0") - - ' cfdi.IneEntidad(Ventas.ComplementoINE.INEEntidad, Ventas.ComplementoINE.INETipoComite) - ' cfdi.IneContabilidad(Ventas.ComplementoINE.INEIdContabilidad) - ' End Select - - 'End If - - - -#End Region - - -#Region "Comercio Exterior" - - 'If Ventas.Cliente.AplicaComercioExterior And ObjCFDITimbre.Complementos.ComercioExterior11.AplicaComercioExteriorSubProyecto Then - ' If ObjCFDITimbre.Complementos.ComercioExterior11 IsNot Nothing Then - - ' 'DATOS GENERALES - ' cfdi.ComercioExterior11(ObjCFDITimbre.Complementos.ComercioExterior11.MotivoTraslado, - ' ObjCFDITimbre.Complementos.ComercioExterior11.TipoOperacion, - ' ObjCFDITimbre.Complementos.ComercioExterior11.ClavedePedimento, - ' ObjCFDITimbre.Complementos.ComercioExterior11.CertificadoOrigen, - ' ObjCFDITimbre.Complementos.ComercioExterior11.NumCertificadoOrigen, - ' ObjCFDITimbre.Complementos.ComercioExterior11.NumeroExportadorConfiable, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Incoterm, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Subdivision, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Observaciones, - ' ObjCFDITimbre.Complementos.ComercioExterior11.TipoCambioUSD, - ' ObjCFDITimbre.Complementos.ComercioExterior11.TotalUSD) - ' 'EMISOR - ' cfdi.ComercioExterior11Emisor(If(EmisorRFC.Length >= 12, "", ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CURP)) - ' cfdi.ComercioExterior11Domicilio(ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Calle, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.NumeroExterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.NumeroInterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Colonia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Localidad, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Referencia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Municipio, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Estado, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Pais, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CP) - ' 'RECEPTOR - ' cfdi.ComercioExterior11Receptor(ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumRegIdTrib) - ' cfdi.ComercioExterior11DomicilioReceptor(ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Calle, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroExterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroInterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Colonia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Localidad, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Referencia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Municipio, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Estado, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Pais, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.CP) - ' cfdi.ComercioExterior11Destinatario(ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumRegIdTrib, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Nombre, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Calle, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroExterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroInterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Colonia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Localidad, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Referencia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Municipio, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Estado, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Pais, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.CP) - ' 'MERCANCIAS - ' If ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias IsNot Nothing AndAlso ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias.Count > 0 Then - ' For Each concep As CFDIComercioExterior11Mercancias In ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias - ' cfdi.ComercioExterior11Mercancia(concep.NoIdentificacion, concep.FraccionArancelaria, concep.CantidadAduana, concep.UnidadAduana, concep.ValorUnitarioAduana, concep.ValorDolares) - ' If concep.DescripcionesEspecificas.Marca <> "" Then - ' cfdi.ComercioExterior11MercanciaDescripcionesEspeciales(concep.DescripcionesEspecificas.Marca, - ' concep.DescripcionesEspecificas.Modelo, - ' concep.DescripcionesEspecificas.SubModelo, - ' concep.DescripcionesEspecificas.NumeroSerie) - ' End If - ' Next - - ' End If - - - ' End If - 'End If - -#End Region - - - End If - - - -#Region "C O M P L E M E N T O C A R T A P O R T E" - - - If ObjCFDITimbre.Complementos.CartaPorte IsNot Nothing Then - - Dim Carta As CFDICartaPorte = ObjCFDITimbre.Complementos.CartaPorte - - ''DATOS GENERALES - cfdi.CartaPorte(Carta.TranspInternac, Carta.EntradaSalidaMercancia, "", Carta.ViaEntradaSalida, Carta.TotalDistanciaRecorrida) - - 'UBICACIONES - If Carta.Ubicaciones IsNot Nothing AndAlso Carta.Ubicaciones.Count > 0 Then - For Each ubica As CFDICartaPorteUbicacion In Carta.Ubicaciones - 'origen - cfdi.CartaPorteUbicacion(ubica.TipoUbicacion, ubica.IDUbicacion, ubica.RFCRemitenteDestinatario, ubica.NombreRemitenteDestinatario, ubica.NumRegIdTrib, ubica.ResidenciaFiscal, ubica.NumEstacion, ubica.NombreEstacion, ubica.NavegacionTrafico, ubica.FechaHoraSalidaLlegada, ubica.TipoEstacion, ubica.DistanciaRecorrida) - 'cfdi.CartaPorteOrigen(ubica.Origen.IDOrigen, ubica.Origen.RFCRemitente, ubica.Origen.NombreRemitente, ubica.NumRegIdTrib, ubica.Origen.ResidenciaFiscal, ubica.Origen.NumEstacion, ubica.Origen.NombreEstacion, ubica.Origen.NavegacionTrafico, ubica.Origen.FechaHoraSalida) - cfdi.CartaPorteDomicilio(ubica.Domicilio.Calle, ubica.Domicilio.NumeroExterior, ubica.Domicilio.NumeroInterior, ubica.Domicilio.Colonia, ubica.Domicilio.Localidad, ubica.Domicilio.Referencia, ubica.Domicilio.Municipio, ubica.Domicilio.Estado, ubica.Domicilio.Pais, ubica.Domicilio.CP) - Next - - End If - - 'MERCANCIAS - If Carta.Mercancias IsNot Nothing Then - cfdi.CartaPorteMercancias(Carta.Mercancias.PesoBrutoTotal, Carta.Mercancias.UnidadPeso, Carta.Mercancias.PesoNetoTotal, Carta.Mercancias.NumTotalMercancias, Carta.Mercancias.CargoporTasacion) - If Carta.Mercancias IsNot Nothing AndAlso Carta.Mercancias.Mercancias.Count > 0 Then - For Each concep As CFDICartaPorteMercancia In Carta.Mercancias.Mercancias - cfdi.CartaPorteMercancia(concep.BienesTransp, concep.ClaveSTCC, concep.Descripción, concep.Cantidad, concep.ClaveUnidad, concep.Unidad, concep.Dimensiones, concep.MaterialPeligroso, concep.ClaveMaterialPeligroso, If(concep.ClaveMaterialPeligroso <> "", concep.Embalaje, ""), If(concep.ClaveMaterialPeligroso <> "", concep.DescripEmbalaje, ""), concep.PesoenKg, concep.ValorMercancia, concep.Moneda, concep.FraccionArrancelaria, concep.UUIDComercioExt) - For Each transp In concep.MercanciasCantidadTransporta - cfdi.CartaPorteCantidadTransporta(transp.Cantidad, transp.IDOrigen, transp.IDDestino, transp.CvesTransportes) - Next - Next - End If - End If - ' - If Carta.FiguraTransporte IsNot Nothing Then - - If Carta.FiguraTransporte.AutoTransporte IsNot Nothing Then - - cfdi.CartaPorteAutotransporte(Carta.FiguraTransporte.AutoTransporte.PermisoSCT, Carta.FiguraTransporte.AutoTransporte.NumPermisoSCT) - - cfdi.CartaPorteIdentificacionVehicular(Carta.FiguraTransporte.AutoTransporte.Vehiculo.ConfigVehicular, Carta.FiguraTransporte.AutoTransporte.Vehiculo.PlacaVM, Carta.FiguraTransporte.AutoTransporte.Vehiculo.AnioModeloVM) - - cfdi.CartaPorteSeguros(Carta.FiguraTransporte.AutoTransporte.NombreSeguroResponsabilidadCivil, Carta.FiguraTransporte.AutoTransporte.PolizaSeguroResponsabilidadCivil, - Carta.FiguraTransporte.AutoTransporte.NombreSeguroMedioAmbiente, Carta.FiguraTransporte.AutoTransporte.PolizaSeguroMedioAmbiente, - Carta.FiguraTransporte.AutoTransporte.NombreSeguroCarga, Carta.FiguraTransporte.AutoTransporte.PolizaSeguroCarga, - Carta.FiguraTransporte.AutoTransporte.PrimaSeguro) - - If Carta.FiguraTransporte.AutoTransporte.Remolques IsNot Nothing AndAlso Carta.FiguraTransporte.AutoTransporte.Remolques.Count > 0 Then - For Each concep As CFDICartaPorteRemolque In Carta.FiguraTransporte.AutoTransporte.Remolques - cfdi.CartaPorteRemolque(concep.SubTipoRemolque, concep.Placa) - Next - - End If - End If - - If Carta.FiguraTransporte.Operadores IsNot Nothing AndAlso Carta.FiguraTransporte.Operadores.Count > 0 Then - For Each concep As CFDICartaPorteOperador In Carta.FiguraTransporte.Operadores - cfdi.CartaPorteTiposFigura(concep.TipoFigura, concep.RFCFigura, concep.NumLicencia, concep.NombreFigura, concep.NumRegidTribFigura, If(concep.ResidenciaFiscalFigura <> "MEX", concep.ResidenciaFiscalFigura, "")) - If concep.TipoFigura.Contiene("02", "03") Then ' “02”- Propietario o “03” -Arrendador - cfdi.CartaPortePartesTransporte("PT01") - cfdi.CartaPortePartesTransporteDomicilio(concep.Domicilio.Calle, concep.Domicilio.NumeroExterior, concep.Domicilio.NumeroInterior, concep.Domicilio.Colonia, concep.Domicilio.Localidad, concep.Domicilio.Referencia, concep.Domicilio.Municipio, concep.Domicilio.Estado, concep.Domicilio.Pais, concep.Domicilio.CP) - End If - Next - End If - - End If - - End If - - -#End Region - - -#Region "Complemento Pago" - - If ObjCFDITimbre.Comprobante.TipoComprobante = "P" Then - - cfdi.Pago(ObjCFDITimbre.ComplementoPagos.FechaPago.ToString("yyyy-MM-ddTHH:mm:ss"), - ObjCFDITimbre.ComplementoPagos.FormaDePagoP, - ObjCFDITimbre.ComplementoPagos.MonedaP, - ObjCFDITimbre.ComplementoPagos.TipoCambioP, - ObjCFDITimbre.ComplementoPagos.Monto, - ObjCFDITimbre.ComplementoPagos.NumOperacion, - ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaOrd, - ObjCFDITimbre.ComplementoPagos.NomBancoOrdExt, - ObjCFDITimbre.ComplementoPagos.CtaOrdenante, - ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaBen, - ObjCFDITimbre.ComplementoPagos.CtaBeneficiario, - ObjCFDITimbre.ComplementoPagos.TipoCadPago, - ObjCFDITimbre.ComplementoPagos.CertPago, - ObjCFDITimbre.ComplementoPagos.CadPago, - ObjCFDITimbre.ComplementoPagos.SelloPago) - - - If ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count > 0 Then - - - For Each doc As CFDIComplementoPagosDocsRelacionados In ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados - cfdi.PagoDoctoRelacionado(doc.IdDocumento, - doc.Serie, - doc.Folio, - doc.MonedaDR, - doc.TipoCambioDR, - doc.MetodoDePagoDR, - doc.NumParcialidad, - doc.ImpSaldoAnt, - doc.ImpPagado, - doc.ImpSaldoInsoluto) - - Next - - 'Estos impuestos aplicarían para anticipos - If ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos > 0 OrElse ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados > 0 Then - - cfdi.PagoImpuestos(ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos, ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados) - If (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "R").Count > 0 Then - For Each Ret As CFDIConceptosImpuestos In (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "R") - cfdi.PagoRetencion(Ret.Impuesto, Ret.Importe) - Next - End If - If (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "T").Count > 0 Then - For Each Tra As CFDIConceptosImpuestos In (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "T") - cfdi.PagoTraslado(Tra.Impuesto, Tra.TipoFactor, Tra.TasaOCuota, Tra.Importe) - Next - End If - - End If - - - - End If - - End If -#End Region - - - -#Region "Nomina12" - If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then - - 'cfdi.Esquema.AgregarEsquema("http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd") - cfdi.Nomina12(ObjCFDITimbre.Nomina.TipoNomina, ObjCFDITimbre.Nomina.FechaPago.ToString("yyyy-MM-dd"), ObjCFDITimbre.Nomina.FechaInicio.ToDate().ToString("yyyy-MM-dd"), ObjCFDITimbre.Nomina.FechaFin.ToDate().ToString("yyyy-MM-dd"), ObjCFDITimbre.Nomina.NumDiasPagados, If(ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0, ObjCFDITimbre.Nomina.TotalPercepciones, 0), If(ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0, ObjCFDITimbre.Nomina.TotalDeducciones, 0), If(ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing AndAlso ObjCFDITimbre.Nomina.OtrosPagos.Count > 0, ObjCFDITimbre.Nomina.TotalOtrosPagos, 0)) - - cfdi.Nomina12Emisor(ObjCFDITimbre.Emisor.CURP, If(ObjCFDITimbre.Nomina.Receptor.TipoContrato.Contiene("09", "10", "99"), "", ObjCFDITimbre.Emisor.RegistroPatronal), ObjCFDITimbre.Emisor.RFC) - - If UsuarioActual.Empresa.UsaAC Then cfdi.Nomina12EntidadSNCF("IF", 90) - - -#Region "Receptor" - - cfdi.Nomina12Receptor(ObjCFDITimbre.Nomina.Receptor.CURP, - ObjCFDITimbre.Nomina.Receptor.NSS, - ObjCFDITimbre.Nomina.Receptor.FechaInicioContrato.ToDate().ToString("yyyy-MM-dd"), - ObjCFDITimbre.Nomina.Receptor.Antiguedad, - ObjCFDITimbre.Nomina.Receptor.TipoContrato, - ObjCFDITimbre.Nomina.Receptor.Sindicalizado, - ObjCFDITimbre.Nomina.Receptor.CodigoTipoJornada, - ObjCFDITimbre.Nomina.Receptor.CodigoRegimenContratacion, - ObjCFDITimbre.Nomina.Receptor.CodigoEmpleado, - ObjCFDITimbre.Nomina.Receptor.Departamento, - ObjCFDITimbre.Nomina.Receptor.Puesto, - ObjCFDITimbre.Nomina.Receptor.CodigoRiesgoPuesto, - If(ObjCFDITimbre.Nomina.TipoNomina = "E", "99", ObjCFDITimbre.Nomina.Receptor.TipoPeriodo), - ObjCFDITimbre.Nomina.Receptor.CodigoBanco, - ObjCFDITimbre.Nomina.Receptor.NumeroCuenta, - ObjCFDITimbre.Nomina.Receptor.SBC, - ObjCFDITimbre.Nomina.Receptor.SDI, - ObjCFDITimbre.Nomina.Receptor.CodigoEntidadFederativa) - 'cfdi.Nomina12SubContratacion("", "0") - 'cfdi.agregarNominaPercepcionesPercepcionAccionesOTitulos12("100", "200"); - 'cfdi.agregarNominaPercepcionesSeparacionIndemnizacion12("100", "10", "1000", "100", "50"); - 'cfdi.agregarNominaPercepcionesJubilacionPensionRetiro12("50", "100", "10", "100", "0"); - - - End If -#End Region - If ObjCFDITimbre.Nomina IsNot Nothing Then - 'If cfdi.Nomina12SeparacionIndemnizacion Then - If ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0 Then - cfdi.Nomina12Percepciones(ObjCFDITimbre.Nomina.TotalSueldos, ObjCFDITimbre.Nomina.TotalIndemnizacion, ObjCFDITimbre.Nomina.TotalJubilacion, ObjCFDITimbre.Nomina.TotalPercepcionesGravado, ObjCFDITimbre.Nomina.TotalPercepcionesExento) - For Each percep As CFDINominaPercepciones In ObjCFDITimbre.Nomina.Percepciones - cfdi.Nomina12Percepcion(percep.TipoPercepcion, percep.Clave, percep.Concepto, Math.Round(percep.ImporteGravado, 2), Math.Round(percep.ImporteExento, 2)) - If percep.TipoPercepcion.ToEntero() = 19 Then - - If ObjCFDITimbre.Nomina.HorasExtras IsNot Nothing AndAlso ObjCFDITimbre.Nomina.HorasExtras.Count > 0 Then - For Each HoraExtra As CFDINominaHorasExtras In ObjCFDITimbre.Nomina.HorasExtras - cfdi.Nomina12HorasExtra(HoraExtra.Dias.ToEntero, HoraExtra.TipoHoras, HoraExtra.HorasExtra, HoraExtra.ImportePagado) - Next - End If - End If - Next - End If - - If ObjCFDITimbre.IStimbreFiniquito Then - 'ObjCFDITimbre.Nomina. - Dim UltimoSueldoOrdinario As Double = ObjCFDITimbre.Nomina.UltimoSueldoOrdinario.ToString().ToDouble() - Dim TotalIndemnizacion As Double = ObjCFDITimbre.Nomina.TotalIndemnizacion - Dim t1 As Double = If(UltimoSueldoOrdinario < TotalIndemnizacion, UltimoSueldoOrdinario, TotalIndemnizacion) - Dim t2 As Double = If(UltimoSueldoOrdinario < TotalIndemnizacion, TotalIndemnizacion, UltimoSueldoOrdinario) - cfdi.Nomina12SeparacionIndemnizacion(TotalIndemnizacion, ObjCFDITimbre.Nomina.Antiguedad, UltimoSueldoOrdinario, t1, t2 - t1) - - End If - 'deducciones al final - If ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0 Then - cfdi.Nomina12Deducciones(ObjCFDITimbre.Nomina.TotalDeduccionesOtras, Math.Round(ObjCFDITimbre.Nomina.TotalDeduccionesImpuestosRetenidos, 2)) - For Each deduc As CFDINominaDeducciones In ObjCFDITimbre.Nomina.Deducciones - cfdi.Nomina12Deduccion(deduc.TipoDeduccion, deduc.Clave, deduc.Concepto, Math.Round(deduc.Importe, 2)) - Next - End If - If ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing Then - ' cfdi.agregarNominaOtrosPagosOtroPago12("002", "002", "Subsidio", "10.00"); - ' cfdi.agregarNominaOtrosPagosOtroPagoSubsidioAlEmpleo12("10.00"); - If ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing AndAlso ObjCFDITimbre.Nomina.OtrosPagos.Count > 0 Then - For Each otpag As CFDINominaOtrosPagos In ObjCFDITimbre.Nomina.OtrosPagos - cfdi.Nomina12OtroPago(otpag.TipoOtroPago, otpag.Clave, otpag.Concepto, otpag.Importe) - If otpag.TipoOtroPago = "002" Then - cfdi.Nomina12SubsidioAlEmpleo(otpag.Subsidiocausado) - End If - - If otpag.TipoOtroPago = "004" AndAlso otpag.Importe > 0 Then - If otpag.ejercicio > 0 Then - cfdi.CompensacionSaldosAFavor(otpag.SaldoAFavor, otpag.ejercicio, otpag.RemanenteSalFav) 'otpag.SaldoAFavor - End If - End If - - Next - End If - End If - If ObjCFDITimbre.Nomina.Incapacidades IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Incapacidades.Count > 0 Then - For Each Incap As CFDINominaIncapacidades In ObjCFDITimbre.Nomina.Incapacidades - cfdi.Nomina12Incapacidad(Incap.DiasIncapacidad.ToEntero, Incap.TipoIncapacidad, Incap.Importe) - Next - End If - End If -#End Region - - sw.Stop() - swTiempo.AppendFormat("Armado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() -#Region "Genera XML" - Dim ArchivoGenerado As Boolean = False - Try - cfdi.GenerarXmlB64(llaveBase64, Clave) - ArchivoGenerado = True - Catch ex As Exception - Retorno = cfdi.Mensaje - If Retorno = "" OrElse IsNothing(Retorno) Then - Retorno = $"llaveBase64 ={llaveBase64}
Clave ={Clave}
{ex.ToString()}" - End If - MensajeErrorCFDI = Retorno - End Try - -#End Region sw.Stop() swTiempo.AppendFormat("Genera: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) swmili = sw.ElapsedMilliseconds @@ -5999,7 +5732,18 @@ Public Class Timbrado Dim msgErrorGeneracion As String = If(String.IsNullOrEmpty(cfdi.Mensaje), "", cfdi.Mensaje) #Region "Timbra" - If ArchivoGenerado Then + If RespGeneracionXML = "" Then + 'OBTENER EL XML DE LA VARIABLE PRIVADA "_xml" YA QUE NO ES ACCESIBLE POR MEDIO DE LA PROPIEDAD "XML" ANTES DE TIMBRAR + Dim valorXML = "" + Try + + Dim tipo = GetType(GoFac.Cfdi4) + Dim info = tipo.GetField("_xml", BindingFlags.NonPublic Or BindingFlags.Instance) + valorXML = info?.GetValue(cfdi).ToString() + Catch ex As Exception + valorXML = "" + OnError("Ocurrió un error al generar el xml", ex) + End Try Dim Respuesta As String = "" @@ -6011,12 +5755,11 @@ Public Class Timbrado New JProperty("certBase64", certBase64), New JProperty("keyBase64", llaveBase64), New JProperty("keyPass", Clave), - New JProperty("xmlBase64", cfdi.Xml.ToBase64Encode()), + New JProperty("xmlBase64", valorXML.ToString().ToBase64Encode()), New JProperty("prueba", (Not TimbraProduccion).ToString().ToLower), New JProperty("opciones", New String(0) {""}) ) - 'Respuesta = EnviarInformacionPADE("https://timbrado.pade.mx/servicio/rest/timbrado/timbrarConCSD", payload.ToString(), TokenAuth) - Respuesta = EnviarInformacionPADE("https://timbrado.pade.mx/servicio/rest/timbrado/timbrarConCSD", payload.ToString(), TokenAuth) + Respuesta = EnviarInformacionPADE("https://timbrado.pade.mx/servicio/rest/timbrado40/timbrarConCSD", payload.ToString(), TokenAuth) End If ' Aumentamos el timeout de la operación @@ -6042,7 +5785,13 @@ Public Class Timbrado If result.timbradoOk Then Dim FolioFiscal As String = result.UUID 'GUARDA EL XML RETORNADO POR EL PAC - 'cfdi.EscribirXML(result.xmlBase64.ToBase64Decode(), RutaArchivo, NombreArchivoXML) + Try + Dim xdoc As New XmlDocument() + xdoc.LoadXml(result.xmlBase64.ToBase64Decode()) + xdoc.Save(RutaArchivo & NombreArchivoXML & ".xml") + Catch ex As Exception + OnError("Ocurrió un error al guardar el xml", ex) + End Try sw.Stop() swTiempo.AppendFormat("Guardado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) @@ -6157,7 +5906,6 @@ Public Class Timbrado End Function #End Region - Public Class PADEServicioTimbradoResp @@ -6313,7 +6061,7 @@ Public Class Timbrado comprobante.FormaPago = ObjCFDITimbre.Comprobante.FormadePago If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E", "N") Then comprobante.CondicionesDePago = ObjCFDITimbre.Comprobante.CondicionesdePago - comprobante.SubTotal = ObjCFDITimbre.Comprobante.Subtotal.RoundSQL(NumDecimalesImporte) + comprobante.SubTotal = ObjCFDITimbre.Comprobante.SubTotal.RoundSQL(NumDecimalesImporte) If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E", "N") Then If ObjCFDITimbre.Comprobante.Descuentos > 0 Then comprobante.DescuentoSpecified = True @@ -6748,13 +6496,13 @@ Public Class Timbrado ComPag.Pago(0).DoctoRelacionado(i).NumParcialidad = doc.NumParcialidad.ToString ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoAntSpecified = True - ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoAnt = doc.ImpSaldoAnt.ToDecimal + ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoAnt = doc.ImpSaldoAnt ComPag.Pago(0).DoctoRelacionado(i).ImpPagadoSpecified = True - ComPag.Pago(0).DoctoRelacionado(i).ImpPagado = doc.ImpPagado.ToDecimal + ComPag.Pago(0).DoctoRelacionado(i).ImpPagado = doc.ImpPagado ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsolutoSpecified = True - ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsoluto = doc.ImpSaldoInsoluto.ToDecimal + ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsoluto = doc.ImpSaldoInsoluto i += 1 Next diff --git a/Bancos/IE.aspx.vb b/Bancos/IE.aspx.vb index 96ed401a4..8be4b0926 100644 --- a/Bancos/IE.aspx.vb +++ b/Bancos/IE.aspx.vb @@ -4624,7 +4624,8 @@ Partial Class Bancos_IE End If Else - If ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscalCancelar, 0, RFCReceptorCancelar, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) Then + Dim respCancelacion = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscalCancelar, 0, RFCReceptorCancelar, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) + If respCancelacion.Verificado Then If Banc.UpdateComplementoPago(CveComplementoPagoCancelar, "-1", -1, UsuarioActual.CveEmpresa, 2, CvePACCancelacion, FechaCancelacion:=ObjCancelacion.CancelacionFecha, SelloCancelacion:=ObjCancelacion.CancelacionAcuse, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) Then CargaComplementosPago() @@ -6695,8 +6696,8 @@ Partial Class Bancos_IE Else - - If ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscalCancelar, 0, RFCReceptorCancelar, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) Then + Dim resp = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscalCancelar, 0, RFCReceptorCancelar, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) + If resp.Verificado Then If ObjBanco.UpdateComplementoPago(CveComplementoPagoCancelar, "-1", -1, UsuarioActual.CveEmpresa, 2, CvePACCancelacion, FechaCancelacion:=ObjCancelacion.CancelacionFecha, SelloCancelacion:=ObjCancelacion.CancelacionAcuse, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) Then diff --git a/Bancos/PopIECompras.aspx b/Bancos/PopIECompras.aspx index f76cdd80c..9fd27ba8a 100644 --- a/Bancos/PopIECompras.aspx +++ b/Bancos/PopIECompras.aspx @@ -434,7 +434,7 @@
+ ToolTip="Listado de Movimientos" data-height="200" CssClass="table table-striped table-advance table-hover Widthall ScrollAD" GridLines="None" HeaderStyle-ForeColor="Black"> @@ -450,7 +450,7 @@ Folio - + diff --git a/Bancos/PopIECompras.aspx.vb b/Bancos/PopIECompras.aspx.vb index 3b4d46051..e0111b63a 100644 --- a/Bancos/PopIECompras.aspx.vb +++ b/Bancos/PopIECompras.aspx.vb @@ -832,19 +832,21 @@ Partial Class Bancos_PopIECompras ObjMov.Dispose() End Sub - Protected Sub CargaVentas(Optional CveMoneda As Integer = 1) - Dim ObjVentas As New ClsVentas + Protected Sub CargaVentas(Optional CveMoneda As Integer = 1) + Dim ObjCliente As New ClsClientes - Dim CveCliente As Integer = -1 - - If ObjVentas.GetVentas(UsuarioActual.CveEmpresa, "-1", "-1", -1, "-1", -1, -1, -1, -1, "-1", "-1", "-1", ClienteRFC:=RFCProveedor, CveUsuarioConsulta:=UsuarioActual.CveUsuario) Then - If ObjVentas.DtResultados.FiltraParametros("Saldo > 0").Rows.Count > 0 Then - CveCliente = ObjVentas.DtResultados(0)("CveCliente").ToString.ToEntero - GvVentas.DataSource = ObjVentas.DtResultados.FiltraParametros($"Saldo > 0 AND CveMoneda = {CveMoneda}") - GvVentas.DataBind() - End If - End If - + Dim ObjMovtos As New ClsMovimientos + + Dim CveCliente As Integer = GlobalDTCliente(UsuarioActual.CveEmpresa).FiltroPrimeroValor("CveCliente", String.Format("RFC = '{0}'", RFCProveedor)).ToEntero + + If ObjMovtos.GetCxCClienteDetalle(CveCliente, "-1", "-1", -1, -1, UsuarioActual.CveEmpresa, -1) Then + + GvVentas.DataSource = ObjMovtos.DtResultados.FiltraParametros($" Saldo > 0 AND CveVenta > 0 AND CveMoneda = {CveMoneda}") + + End If + ObjMovtos.Dispose() + GvVentas.DataBind() + If CveCliente > 0 Then If ObjCliente.GetClientes(CveCliente, "-1", "-1", "-1", "-1", "-1", "-1", -1, UsuarioActual.CveEmpresa) Then ViewState("IdCuentaCliente") = ObjCliente.IdCtaContClientes @@ -854,10 +856,10 @@ Partial Class Bancos_PopIECompras ViewState("IdCtaContMonedaExtranjeraCliente") = ObjCliente.IdCtaContMonedaExtranjera End If - End If - - - ObjVentas.Dispose() + End If + + + ObjCliente.Dispose() UpDatos.Update() End Sub diff --git a/Bancos/RepComplementoPago.aspx.vb b/Bancos/RepComplementoPago.aspx.vb index 001edbfc8..d02dcc978 100644 --- a/Bancos/RepComplementoPago.aspx.vb +++ b/Bancos/RepComplementoPago.aspx.vb @@ -596,8 +596,8 @@ Partial Class Bancos_RepComplementoPago End If Else - - If ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, Can_FolioFiscalCancelar, 0, Can_RFCReceptorCancelar, UsuarioActual.Empresa.RFC, Can_CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) Then + Dim resp = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, Can_FolioFiscalCancelar, 0, Can_RFCReceptorCancelar, UsuarioActual.Empresa.RFC, Can_CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) + If resp.Verificado Then If ObjBanco.UpdateComplementoPago(Can_CveComplementoPagoCancelar, "-1", -1, UsuarioActual.CveEmpresa, 2, Can_CvePACCancelacion, FechaCancelacion:=ObjCancelacion.CancelacionFecha, SelloCancelacion:=ObjCancelacion.CancelacionAcuse, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) Then Alert("El complemento se cancelo correctamente.") diff --git a/Bin/Profact.TimbraCFDI.dll b/Bin/Profact.TimbraCFDI.dll index 5bf77d18a..b1c756dcf 100644 Binary files a/Bin/Profact.TimbraCFDI.dll and b/Bin/Profact.TimbraCFDI.dll differ diff --git a/Compras/Proveedores.aspx b/Compras/Proveedores.aspx index 7c37fe741..cc984ed03 100644 --- a/Compras/Proveedores.aspx +++ b/Compras/Proveedores.aspx @@ -1504,27 +1504,27 @@ - + - + - + - +   - +   diff --git a/Contabilidad/RegPrePolizaS.aspx b/Contabilidad/RegPrePolizaS.aspx index 6c509ab63..218ddd031 100644 --- a/Contabilidad/RegPrePolizaS.aspx +++ b/Contabilidad/RegPrePolizaS.aspx @@ -470,7 +470,7 @@ Concepto - + @@ -622,8 +622,7 @@ Cuenta
-
- +
TC diff --git a/Empresas/Grales/Formatos/FormatoEntradasSalidas.xlsx b/Empresas/Grales/Formatos/FormatoEntradasSalidas.xlsx index 82c7b4c30..942579b3e 100644 Binary files a/Empresas/Grales/Formatos/FormatoEntradasSalidas.xlsx and b/Empresas/Grales/Formatos/FormatoEntradasSalidas.xlsx differ diff --git a/GPS/Trayectos.aspx b/GPS/Trayectos.aspx index b7e70ad7d..bf619391a 100644 --- a/GPS/Trayectos.aspx +++ b/GPS/Trayectos.aspx @@ -88,8 +88,11 @@
  • - - + + + + +
  • @@ -146,7 +149,7 @@
    - +
    diff --git a/GPS/Trayectos.aspx.vb b/GPS/Trayectos.aspx.vb index 611d4da95..6b851af94 100644 --- a/GPS/Trayectos.aspx.vb +++ b/GPS/Trayectos.aspx.vb @@ -37,9 +37,18 @@ Partial Class GPS_Trayectos Set(value As DataTable) ViewState("DtPosiciones") = value End Set - End Property + End Property + Private Property DtTrayectos As DataTable + Get + Return CType(ViewState("DtTrayectos"), DataTable) + End Get + Set(value As DataTable) + ViewState("DtTrayectos") = value + End Set + End Property + #End Region - + Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load If Not Page.IsPostBack Then DirectCast(Master.FindControl("TSM"), ScriptManager).EnablePageMethods = True @@ -52,7 +61,6 @@ Partial Class GPS_Trayectos CargaDispositivos() CargaGeoReferencias() CargaEstatus() - CargaDdlTrayectos() CargaTrayectos() End Sub @@ -98,28 +106,32 @@ Partial Class GPS_Trayectos Dim CveEstatus As Integer = -1 If ChkActivas.Checked AndAlso DdlEstatusTrayecto.SelectedValue.ToEntero() <= 0 Then - CveEstatus = -2 + CveEstatus = -2 Else CveEstatus = DdlEstatusTrayecto.SelectedValue.ToEntero() End If Dim ObjGPS As New ClsGPS If ObjGPS.GetTrayectos(-1, DdlDispositivoFiltro.SelectedValue.ToEntero(), UsuarioActual.CveCliente, CveEstatus, FechaI, FechaF) Then - GvBarra.DataSource = ObjGPS.DtResultados + DtTrayectos = ObjGPS.DtResultados.Copy() End If ObjGPS.Dispose() + + GvBarra.DataSource = DtTrayectos GvBarra.DataBind() UPGV.Update() End Sub - Public Sub CargaDdlTrayectos() - Dim ObjGPS As New ClsGPS - If ObjGPS.GetTrayectos(-1, -1, UsuarioActual.CveCliente) Then - DdlTrayecto.DataSource = ObjGPS.DtResultados.FiltraParametros("EsFin = True") - End If - ObjGPS.Dispose() + Public Sub CargaDdlTrayectos() + 'Dim ObjGPS As New ClsGPS + 'If ObjGPS.GetTrayectos(-1, -1, UsuarioActual.CveCliente) Then + ' DdlTrayecto.DataSource = ObjGPS.DtResultados.FiltraParametros("EsFin = True") + 'End If + 'ObjGPS.Dispose() + + DdlTrayecto.DataSource = DtTrayectos DdlTrayecto.DataBind() - UpAgregar.Update() + UpDdlTrayecto.Update() End Sub Public Sub CargaEstatus() Dim ObjGPS As New ClsGPS @@ -469,5 +481,9 @@ Partial Class GPS_Trayectos TimmerRefresh.Enabled = ChkTimmer.Checked UPGV.Update() - End Sub + End Sub + Protected Sub LnkAddE_Click(sender As Object, e As EventArgs) + CargaDdlTrayectos() + RegistraScript("$('#DivCrearApatir').modal({backdrop: 'static', keyboard: false});") + End Sub End Class diff --git a/Inventarios/RepTraspasoEmitido.aspx.cs b/Inventarios/RepTraspasoEmitido.aspx.cs index c670c1054..fbb396b49 100644 --- a/Inventarios/RepTraspasoEmitido.aspx.cs +++ b/Inventarios/RepTraspasoEmitido.aspx.cs @@ -62,7 +62,8 @@ public partial class Inventarios_RepTraspasoEmitido : ClsPaginas int CveEstatusTimbrado = 0; string FolioFiscal = Gvr.DataKey("FolioFiscal").ToString(),SelloCancelacion =""; int CveMovimiento = Gvr.DataKey("CveMovimiento").ToEntero(); - if (ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscal, 0, UsuarioActual.Empresa.RFC, UsuarioActual.Empresa.RFC, 4,false)) + var resp = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscal, 0, UsuarioActual.Empresa.RFC, UsuarioActual.Empresa.RFC, 4, false); + if (resp.Verificado) { CancelacionFecha = ObjCancelacion.CancelacionFecha; SelloCancelacion = ObjCancelacion.CancelacionAcuse; diff --git a/Nomina/CatPeriodos.aspx.vb b/Nomina/CatPeriodos.aspx.vb index f3d8b51dd..59330e05f 100644 --- a/Nomina/CatPeriodos.aspx.vb +++ b/Nomina/CatPeriodos.aspx.vb @@ -24,6 +24,8 @@ Partial Class Nomina_CatPeriodos ViewState("Orden") = "" CargaTipoPeriodo() cargaEjercicios() + CargaTurnos() + CargaDatos() ''Permiso Registro @@ -62,6 +64,8 @@ Partial Class Nomina_CatPeriodos DdlTipoPeriodo.DataBind() DdlTipoPeriodoAdd.DataBind() + + End Sub Private Sub cargaEjercicios() @@ -76,6 +80,15 @@ Partial Class Nomina_CatPeriodos DdlEjercicio.Items.Insert(0, New ListItem("Todos", "-1")) End Sub + + Private Sub CargaTurnos() + DdlTurno.DataSource = GlobalDTTurno.FiltraParametros($"CveEmpresa = {UsuarioActual.CveEmpresa}") + DdlTurno.DataBind() + DdlTurno.Items.Insert(0, New ListItem("Seleccione uno", "-1")) + End Sub + + + #End Region #Region "G V D A T O S" @@ -329,6 +342,7 @@ Partial Class Nomina_CatPeriodos TxtFechaInicioAdd.Text = "" TxtFechaFinAdd.Text = "" DdlEstatusAdd.SelectedValueExist(-1) + DdlTurno.SelectedValueExist(-1) For Each item As ListItem In CBLchk.Items Select Case item.Value.ToEntero() Case 1 diff --git a/Nomina/MovimientosSUA.aspx b/Nomina/MovimientosSUA.aspx index 1ecd6f58d..c3f2edcd9 100644 --- a/Nomina/MovimientosSUA.aspx +++ b/Nomina/MovimientosSUA.aspx @@ -30,14 +30,14 @@
    -
    +
    -
    +
    @@ -47,7 +47,7 @@
    -
    +
    @@ -56,7 +56,15 @@
    + +
    + + +
    + + +
    diff --git a/Nomina/MovimientosSUA.aspx.cs b/Nomina/MovimientosSUA.aspx.cs index 83e1797aa..729e74b05 100644 --- a/Nomina/MovimientosSUA.aspx.cs +++ b/Nomina/MovimientosSUA.aspx.cs @@ -27,9 +27,33 @@ public partial class Nomina_MovimientosSUA : ClsPaginas { TxtRpdFechaInicio.Text = string.Format(" {0:dd/MM/yyyy}", DateTime.Now.AddMonths(-1).FirstDayOfMonth()); TxtRpdFechaFin.Text = string.Format(" {0:dd/MM/yyyy}", DateTime.Now.AddMonths(-1).LastDayOfMonth()); + CargaCombos(); CargaTiposPeriodo(); } } + + private void CargaCombos() + { + + ClsRH ObjRH = new ClsRH(); + + + if (ObjRH.GetRegistrosPatronales(-1, UsuarioActual.CveEmpresa, -1)) + { + DdlRegistroPatronal.DataSource = ObjRH.DtResultados; + } + else + { + DdlRegistroPatronal.DataSource = null; + } + + ObjRH.Dispose(); + DdlRegistroPatronal.DataBind(); + + DdlRegistroPatronal.Items.Insert(0, new ListItem("Todos","-1")); + + } + private void CargaTiposPeriodo() { DdlTipoPeriodo.DataSource = GlobalDTTipoPeriodo.FiltraParametros("Estatus = 'Activo'"); @@ -45,7 +69,8 @@ public partial class Nomina_MovimientosSUA : ClsPaginas { using (ClsNominas onom = new ClsNominas()) { - if (onom.SUAMovmientosAfiliatoriosGET(UsuarioActual.CveEmpresa, TxtRpdFechaInicio.Text.ToDateTime(), TxtRpdFechaFin.Text.ToDateTime(), DdlTipoPeriodo.SelectedValue.ToEntero()) + + if (onom.SUAMovmientosAfiliatoriosGET(UsuarioActual.CveEmpresa, TxtRpdFechaInicio.Text.ToDateTime(), TxtRpdFechaFin.Text.ToDateTime(), DdlTipoPeriodo.SelectedValue.ToEntero(), CveRegistroPatronal:DdlRegistroPatronal.SelectedValue.ToEntero()) && onom.DTSetResultados.Tables.Count > 3) { GVAsistencia.DataSource = onom.DTSetResultados.Tables[0]; diff --git a/Ventas/Clientes.aspx.vb b/Ventas/Clientes.aspx.vb index f999d2e09..495e49793 100644 --- a/Ventas/Clientes.aspx.vb +++ b/Ventas/Clientes.aspx.vb @@ -2064,20 +2064,25 @@ Partial Class Clientes DdlSucursalFormaPago33.DataSource = GlobalDTVtaFormaPago DdlSucursalFormaPago33.DataBind() End Sub - Private Sub CargaComboCFDI() + Private Sub CargaComboCFDI() + Dim RegimenFiscalCliente = DdlRegimenFiscal.SelectedValue.ToString() + If UsuarioActual.Empresa.Funcionalidad(350) <> "1" Then + RegimenFiscalCliente = "-1" + End If + DdlUsoCFDI.Items.Clear() - DdlUsoCFDI.DataSource = GlobalDTSATUsosCFDI(UsuarioActual.Empresa.EsPersonaFisica) + DdlUsoCFDI.DataSource = GlobalDTSATUsosCFDI(UsuarioActual.Empresa.EsPersonaFisica, RegimenFiscalReceptor:=RegimenFiscalCliente) DdlUsoCFDI.DataBind() DdlUsoCFDI.Items.Insert(0, New ListItem("Seleccione", "-1")) DdlSucursalUsoCFDI.Items.Clear() - DdlSucursalUsoCFDI.DataSource = GlobalDTSATUsosCFDI(UsuarioActual.Empresa.EsPersonaFisica) + DdlSucursalUsoCFDI.DataSource = GlobalDTSATUsosCFDI(UsuarioActual.Empresa.EsPersonaFisica, RegimenFiscalReceptor:=RegimenFiscalCliente) DdlSucursalUsoCFDI.DataBind() - End Sub + End Sub #End Region - + #Region "V E R M Á S" - + Protected Sub BtnVerMasVentas_Click(sender As Object, e As EventArgs) If BtnVerMasVentas.Text = "Ver Más" Then CargaHistorial(-1) diff --git a/Ventas/PV.aspx.vb b/Ventas/PV.aspx.vb index 280686c3a..e7065a8a7 100644 --- a/Ventas/PV.aspx.vb +++ b/Ventas/PV.aspx.vb @@ -758,6 +758,15 @@ Partial Class PV End Set End Property + Private Property CantidadAntesEdicion As Decimal + Get + Return If(IsNothing(ViewState("CantidadAntesEdicion")), "0", ViewState("CantidadAntesEdicion").ToString()).ToDecimal() + End Get + Set(value As Decimal) + ViewState("CantidadAntesEdicion") = value + End Set + End Property + #End Region #Region "PROPIEDADES CONTRATOS" @@ -1071,6 +1080,7 @@ Partial Class PV ViewState("ClienteRetIVA") = 0 ViewState("ClienteRetISR") = 0 ViewState("EnviarCorreoCliente") = False + Me.CantidadAntesEdicion = 0 HdnPorcentajeDescuentoMaximo.Value = If(UsuarioActual.DescuentoAutorizado > 0, UsuarioActual.DescuentoAutorizado, 15).ToString() CveVentaDetalle = -1 EstablecioFolio = False @@ -5125,7 +5135,15 @@ Partial Class PV If DdlTipoComprobante.SelectedValue <> "Cot" Then 'VALIDA EXISTENCIA If UsuarioActual.CveEmpresa.Contiene({1, 72, 80, 119, 140}) Then - If Existencia - TmpDT.SUM("Cantidad", $"CvePS = {CvePS}") < TxtCantidad.Text.ToDouble Then + Dim CantidadAgregada As Decimal = TmpDT.SUMD("Cantidad", $"CvePS = {CvePS}") + + If Modalidad = "U" Then + CantidadAgregada = CantidadAgregada - CantidadAntesEdicion + TxtCantidad.Text.ToDecimal() + Else + CantidadAgregada = CantidadAgregada + TxtCantidad.Text.ToDecimal() + End If + + If Existencia < CantidadAgregada Then Alert("No cuenta con la cantidad suficiente en inventario. Cuenta con " + Existencia.FormatoNumero(2) + ".", TipoMensaje.MsgAdvertencia) Return False End If @@ -5229,6 +5247,7 @@ Partial Class PV End Sub Private Sub CargaAgregar() Modalidad = "A" + CantidadAntesEdicion = 0 LnkAgregarPS.Text = "Agregar" CargaBCI() LimpiaAgregar() @@ -5268,6 +5287,7 @@ Partial Class PV End If DdlPSIndexChange(DdlPS.SelectedValue.ToEntero, DdlPS) DdlUnidadMedida.SelectedValueExist(GvRow.DataKey("CveUM")) + CantidadAntesEdicion = GvRow.DataKey("Cantidad").ToDecimal() TxtCantidad.Text = GvRow.DataKey("Cantidad") 'Dim TotalCargos As Decimal = 0 @@ -5324,6 +5344,9 @@ Partial Class PV RegistraScript("$('#DivAddVenta').modal({backdrop: 'static', keyboard: false});", "EdicionVenta") End Sub Protected Sub LnkAgregarPS_Click(sender As Object, e As EventArgs) + + Dim DrPS As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=DdlPS.SelectedValue.ToEntero).FiltroPrimero("") + If ChkAjuste.Checked Then Dim FolioGarantia As MFolioGarantiaMensaje = ValidaFolioGarantia(DdlPSAjuste.SelectedValue.ToEntero(), DdlFolioGarantia.SelectedValue.ToEntero()) @@ -5337,25 +5360,34 @@ Partial Class PV Exit Sub End If - If String.IsNullOrEmpty(TxtAnioVehiculo.Text.Trim()) Then - Alert("El campo año esta vacío.", TipoMensaje.MsgAdvertencia) - Exit Sub - End If + If DrPS IsNot Nothing Then + 'SOLO DEBE AGREGAR POLIZA VIRTUAL SI ES ACUMULADOR + If DrPS("CveClasificacion").ToString().ToEntero().Contiene(20520, 20522, 20513, 20511, 20521, 20512, 20514, 20229) Then + If String.IsNullOrEmpty(TxtAnioVehiculo.Text.Trim()) Then + Alert("El campo año esta vacío.", TipoMensaje.MsgAdvertencia) + Exit Sub + End If - If TxtAnioVehiculo.Text.ToDecimal() < 1900 Then - Alert("El campo año debe ser mayor a 1900.", TipoMensaje.MsgAdvertencia) - Exit Sub + If TxtAnioVehiculo.Text.ToDecimal() < 1900 Then + Alert("El campo año debe ser mayor a 1900.", TipoMensaje.MsgAdvertencia) + Exit Sub + End If + End If End If - Else - If Not String.IsNullOrEmpty(TxtAnioVehiculo.Text.Trim()) Then - If TxtAnioVehiculo.Text.ToDecimal() < 1900 Then - Alert("El año del vehiculo del vehículo no tiene el formato correcto.", TipoMensaje.MsgAdvertencia) - Exit Sub + If DrPS IsNot Nothing Then + 'SOLO DEBE AGREGAR POLIZA VIRTUAL SI ES ACUMULADOR + If DrPS("CveClasificacion").ToString().ToEntero().Contiene(20520, 20522, 20513, 20511, 20521, 20512, 20514, 20229) Then + If Not String.IsNullOrEmpty(TxtAnioVehiculo.Text.Trim()) Then + If TxtAnioVehiculo.Text.ToDecimal() < 1900 Then + Alert("El año del vehiculo del vehículo no tiene el formato correcto.", TipoMensaje.MsgAdvertencia) + Exit Sub + End If + End If End If End If - End If + End If If AgregarPS() Then diff --git a/Ventas/RepCancelacionesVentas.aspx b/Ventas/RepCancelacionesVentas.aspx new file mode 100644 index 000000000..303327e11 --- /dev/null +++ b/Ventas/RepCancelacionesVentas.aspx @@ -0,0 +1,148 @@ +<%@ Page Title="Rep. Cancelación Ventas" Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="RepCancelacionesVentas.aspx.vb" Inherits="Compras_RepCancelacionesVentas" %> + + + + + + + + Rep. Cancelación Ventas + + + + + + + + + + + +
  • + Excel +
  • +
    + + + +
    +
    +
    +
    + + + + + + + +
    +
    +
    + + "> + +
    +
    +
    + + SubProyecto: +
    + + +
    + +
    Fecha Inicio:
    +
    +
    + + + + + + + + +
    +
    +
    Fecha Fin:
    +
    +
    + + + + + + + + +
    +
    + + + + +
    + + +
    + + +
    +
    +
    +
    > +
    + + + + +
    + + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + diff --git a/Ventas/RepCancelacionesVentas.aspx.vb b/Ventas/RepCancelacionesVentas.aspx.vb new file mode 100644 index 000000000..a42833c13 --- /dev/null +++ b/Ventas/RepCancelacionesVentas.aspx.vb @@ -0,0 +1,124 @@ +Option Explicit On +Option Strict On + +Imports System.Data +Imports Extensiones +Imports Microsoft.Reporting.WebForms + +Partial Class Compras_RepCancelacionesVentas + Inherits ClsPaginas + + 'Private Property DTComplemntos As DataTable + ' Get + ' If ViewState("DTComplemntos") Is Nothing Then + ' Return New DataTable + ' Else + ' Return DirectCast(ViewState("DTComplemntos"), DataTable) + ' End If + ' End Get + ' Set(value As DataTable) + ' ViewState("DTComplemntos") = value + ' End Set + 'End Property + + + Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load + If Not IsPostBack Then + + InicializaValores() + + End If + End Sub + +#Region " INICIALIZA VALORES " + Private Sub InicializaValores() + + TxtFiltrosFechaInicio.Text = Now.FirstDayOfMonth.ToShortDateString + TxtFiltrosFechaFin.Text = Now.ToShortDateString + + + + Dim EsWS = If(UsuarioActual.Empresa.Funcionalidad(105) = "1" Or UsuarioActual.Empresa.Funcionalidad(141) = "1", True, False) + If EsWS Then + DdlClientes.setEsWebService(True) + Else + DdlClientes.setEsWebService(False) + DdlClientes.DataSource = GlobalDTCliente(UsuarioActual.CveEmpresa, -1) + DdlClientes.DataBind() + DdlClientes.ddl.Items.Insert(0, New ListItem("Todos", "-1")) + End If + + + + DdlMotivoCancelacion.DataSource = GlobalDTMotivosCancelacionEmpresa(UsuarioActual.CveEmpresa).FiltraParametros("CveSATMotivoCancelacion IN (2,3)") + DdlMotivoCancelacion.DataBind() + + DdlMotivoCancelacion.Items.Insert(0, New ListItem("Todos", "-1")) + + + CargarCentrosDeCosto(Nothing, DdlSubProyecto, Nothing, LblSubProyecto:=LblSubProyecto) + + GvDatos.Columns(4).HeaderText = LblSubProyecto.Text + + + UpFiltros.Update() + End Sub +#End Region + + +#Region " CARGA DATOS " + Protected Sub BtnConsultarFiltros_Click(sender As Object, e As EventArgs) + CargaDatos() + End Sub + Private Sub CargaDatos() + + LnkExcel.Visible = False + + Dim CveCliente As Integer = If(DdlClientes.SelectedValue = "", -1, DdlClientes.SelectedValue.ToEntero) + Dim FechaInicio = If(IsDate(TxtFiltrosFechaInicio.Text), TxtFiltrosFechaInicio.Text.ToDate, MinFecha) + Dim FechaFin = If(IsDate(TxtFiltrosFechaFin.Text), TxtFiltrosFechaFin.Text.ToDate, MaxFecha) + + + Dim ObjVentas As New ClsVentas + If ObjVentas.GetRepCancelacionVentas(FechaInicio, FechaFin, DdlSubProyecto.SelectedValue.ToEntero, CveCliente, DdlMotivoCancelacion.SelectedValue.ToEntero, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) Then + GvDatos.DataSource = ObjVentas.DtResultados + + If ObjVentas.DtResultados.Rows.Count > 0 Then + LnkExcel.Visible = True + End If + Else + GvDatos.DataSource = Nothing + End If + + ObjVentas.Dispose() + + GvDatos.DataBind() + + UpAcciones.Update() + UpDatos.Update() + + + End Sub + Protected Sub GvDatos_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GvDatos.RowDataBound + If e.Row.RowType = DataControlRowType.DataRow Then + + End If + End Sub +#End Region + + + + +#Region "IMPRESION" + + Protected Sub LnkExcel_Click(sender As Object, e As EventArgs) + GeneraImpresion() + End Sub + + Private Sub GeneraImpresion() + + GvDatos.ExportToExcel2("RepCancelacionVentas.xlsx") + + End Sub +#End Region +End Class diff --git a/Ventas/RepRemisionesDetalle.aspx b/Ventas/RepRemisionesDetalle.aspx index 5710c6555..f40f707ca 100644 --- a/Ventas/RepRemisionesDetalle.aspx +++ b/Ventas/RepRemisionesDetalle.aspx @@ -205,8 +205,8 @@ - - + + diff --git a/Ventas/RepVentaDetalle.aspx b/Ventas/RepVentaDetalle.aspx index 4e87ac242..093dde449 100644 --- a/Ventas/RepVentaDetalle.aspx +++ b/Ventas/RepVentaDetalle.aspx @@ -308,6 +308,11 @@
    + +
    + + +
    diff --git a/Ventas/RepVentaDetalle.aspx.vb b/Ventas/RepVentaDetalle.aspx.vb index 7a8b22dc2..4ccbcd9c5 100644 --- a/Ventas/RepVentaDetalle.aspx.vb +++ b/Ventas/RepVentaDetalle.aspx.vb @@ -125,7 +125,7 @@ Partial Class RepVentaDetalle Private Sub InicializaValores() - Dim Grupo, CveCliente, CveSucursal, CveSubProyectoEjecucion, CveVendedor, CveUsuario, CveEstatusFactura, CveCorte, IVA, TipoDocto, CveClienteClasificacion, CveCondicionesPago As String + Dim Grupo, CveCliente, CveSucursal, CveSubProyectoEjecucion, CveVendedor, CveUsuario, CveEstatusFactura, CveCorte, IVA, TipoDocto, CveClienteClasificacion, CveCondicionesPago, CveTipoRelacion As String Dim Anio, Mes, AnioMes, Fecha, FechaI, FechaF As String Dim AnioEjec, MesEjec, AnioMesEjec, FechaEjec, FechaIEjec, FechaFEjec As String 'Dim CveSubProyecto As Integer @@ -162,6 +162,8 @@ Partial Class RepVentaDetalle CveMoneda = If(Request("CveMoneda") IsNot Nothing, Request("CveMoneda").ToString.ToEntero, -1).ToString.ToEntero TipoCliente = If(Request("TipoCliente") IsNot Nothing, Request("TipoCliente").ToString.ToEntero, -1).ToString.ToEntero + CveTipoRelacion = If(Request("CveTipoRelacion") IsNot Nothing, Request("CveTipoRelacion").ToString, "-1").ToString + DdlTipoCliente.SelectedValueExist(TipoCliente) 'LISTBOXS @@ -184,6 +186,8 @@ Partial Class RepVentaDetalle DdlVendedor.SelectedValuesIfExistM(CveVendedor) DdlClienteClasificacion.SelectedValueExist(CveClienteClasificacion) + DdlTipoRelacion.SelectedValueExist(CveTipoRelacion) + CargaClientes() DdlClientes.SelectedValue = CveCliente DdlUsuario.SelectedValueExist(CveUsuario) @@ -389,7 +393,12 @@ Partial Class RepVentaDetalle 'Carga Clasificacion Cliente DdlClienteClasificacion.DataSource = GlobalDTClienteClasificaciones(UsuarioActual.CveEmpresa) DdlClienteClasificacion.DataBind() - DdlClienteClasificacion.Items.Insert(0, New ListItem("Todos", "-1")) + DdlClienteClasificacion.Items.Insert(0, New ListItem("Todos", "-1")) + + + DdlTipoRelacion.DataSource = GlobalDTVtaTiposRelacion + DdlTipoRelacion.DataBind() + DdlTipoRelacion.Items.Insert(0, New ListItem("Todos", "-1")) CargaGrupo() CargaTipoCentroCosto() @@ -490,7 +499,7 @@ Partial Class RepVentaDetalle IVA, Vendedores, DdlUsuario.SelectedValue.ToEntero, Estatus, FechaI, FechaF, CveCorte.ToEntero, TipoComprobante, DdlSubProyectoEjecucion.SelectedValue.ToEntero, UsuarioActual.CveEmpresa, FechaIEjec, FechaFEjec, CveProyecto, Sucursales, TipoCambio, TCEspecifico, CveMoneda, CveUsuarioConsulta:=UsuarioActual.CveUsuario, CveClienteClasificacion:=DdlClienteClasificacion.SelectedValue.ToEntero, - CveCondicionesPago:=CveCondicionesPago, TipoCliente:=DdlTipoCliente.SelectedValue.ToEntero, ModalidadContable:=Not ChkLecturaAdmin.Checked) Then + CveCondicionesPago:=CveCondicionesPago, TipoCliente:=DdlTipoCliente.SelectedValue.ToEntero, ModalidadContable:=Not ChkLecturaAdmin.Checked, CveTipoRelacion:=DdlTipoRelacion.SelectedValue.ToEntero()) Then DtVentas = AddRows(ObjVentas.DtResultados) ImgImprimir.Enabled = True GvDatos.DataSource = AddRows(ObjVentas.DtResultados) diff --git a/Ventas/RepVentas.aspx b/Ventas/RepVentas.aspx index a4bbed3be..459cf763a 100644 --- a/Ventas/RepVentas.aspx +++ b/Ventas/RepVentas.aspx @@ -299,7 +299,7 @@ -
    +
    @@ -312,6 +312,11 @@
    + +
    + + +
    @@ -520,7 +525,7 @@