From 0414862fcdbd9e9684370d507ec39fd3bc824a8b Mon Sep 17 00:00:00 2001 From: rrene Date: Mon, 7 Mar 2022 12:59:03 -0700 Subject: [PATCH] timbrado 4.0, complementos de pago --- App_Code/CFDITimbre.vb | 29 +++++-- App_Code/ClsBancos.vb | 4 +- App_Code/Timbrado.vb | 189 +++++++++++++++++++++++++++-------------- 3 files changed, 148 insertions(+), 74 deletions(-) diff --git a/App_Code/CFDITimbre.vb b/App_Code/CFDITimbre.vb index e506f303e..68164a131 100644 --- a/App_Code/CFDITimbre.vb +++ b/App_Code/CFDITimbre.vb @@ -395,7 +395,8 @@ End Class Public Class CFDIRetenciones Public Property Impuesto As String - Public Property Importe As Double + Public Property Importe As Decimal + Public Property TasaOCuota As String End Class @@ -439,8 +440,8 @@ Public Class CFDIComplementoPagos Public Property FormaDePagoP As String = "" Public Property MonedaP As String = "" Public Property NumOperacion As String = "" - Public Property TipoCambioP As Double = 0 - Public Property Monto As Double + Public Property TipoCambioP As Decimal = 0 + Public Property Monto As Decimal Public Property RfcEmisorCtaOrd As String = "" Public Property NomBancoOrdExt As String = "" Public Property CtaOrdenante As String = "" @@ -453,7 +454,7 @@ Public Class CFDIComplementoPagos Public Property DocumentosRelacionados As List(Of CFDIComplementoPagosDocsRelacionados) Public Property Impuestos As List(Of CFDIConceptosImpuestos) - Public ReadOnly Property TotalImpuestosRetenidos As Double + Public ReadOnly Property TotalImpuestosRetenidos As Decimal Get Return (From c In Impuestos Where c.TrasladooRetencion = "R" @@ -461,7 +462,7 @@ Public Class CFDIComplementoPagos End Get End Property - Public ReadOnly Property TotalImpuestosTrasladados As Double + Public ReadOnly Property TotalImpuestosTrasladados As Decimal Get Return (From c In Impuestos Where c.TrasladooRetencion = "T" @@ -469,6 +470,20 @@ Public Class CFDIComplementoPagos End Get End Property + Public ReadOnly Property TotalImpuestosTrasladados(Impuesto As String, Tasa As Decimal, Optional Dato As String = "Base") As Decimal + Get + + If Dato = "Base" Then + Return (From c In Traslados Where c.Impuesto = Impuesto And c.TasaOCuota = Tasa + Select c.Base).Sum() + Else + Return (From c In Traslados Where c.Impuesto = Impuesto And c.TasaOCuota = Tasa + Select c.Importe).Sum() + End If + + End Get + End Property + Public ReadOnly Property TotalPagos As Decimal Get Return (From c In DocumentosRelacionados @@ -476,6 +491,8 @@ Public Class CFDIComplementoPagos End Get End Property + + Sub New() DocumentosRelacionados = New List(Of CFDIComplementoPagosDocsRelacionados) @@ -534,7 +551,6 @@ Public Class CFDIComplementoPagos tRetorno = Nothing Return TTraslados - End Get End Property @@ -548,6 +564,7 @@ Public Class CFDIComplementoPagosDocsRelacionados Public Property MonedaDR As String = "" Public Property MetodoDePagoDR As String = "" Public Property TipoCambioDR As Decimal + Public Property EquivalenciaDR As Decimal = 1 Public Property NumParcialidad As Integer = 1 Public Property ImpSaldoAnt As Decimal Public Property ImpPagado As Decimal diff --git a/App_Code/ClsBancos.vb b/App_Code/ClsBancos.vb index 7ddc1e495..55ee851fb 100644 --- a/App_Code/ClsBancos.vb +++ b/App_Code/ClsBancos.vb @@ -1091,9 +1091,9 @@ Public Class ClsBancos End If Timbre = Timbrado.PreparaTimbrePago40(RFCEmpresa, UsuarioActual.Empresa.Empresa, UsuarioActual.Empresa.CodigoRegimenFiscal, - RFCCliente, dr("NombreCliente").ToString, RFCCliente, dr("NombreCliente").ToString, Serie, Folio.ToString, FechaTimbrado, Cuentapago, + RFCCliente, dr("NombreCliente").ToString, dr("ClienteCP").ToString, dr("CodigoRegimenFiscal").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) + UsuarioActual.Empresa.CP.ToString, CuentaBeneficiario, dr("TipoCambioPago").ToString.ToDecimal, dttpagos, dttpagosimpuestos, CFDIRelacionado:=CFDIRelacionado) Else Timbre = Timbrado.PreparaTimbrePago(RFCEmpresa, UsuarioActual.Empresa.Empresa, UsuarioActual.Empresa.CodigoRegimenFiscal, diff --git a/App_Code/Timbrado.vb b/App_Code/Timbrado.vb index 60a04e2e9..7e6a090c2 100644 --- a/App_Code/Timbrado.vb +++ b/App_Code/Timbrado.vb @@ -897,8 +897,8 @@ Public Class Timbrado Public Function PreparaTimbrePago(EmisorRFC As String, EmisorNombre As String, EmisorRegimenFiscal As String, ReceptorRFC As String, ReceptorNombre 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 Double, LugarExpedicion As String, - CuentaBeneficiario As String, TipoCambioP As Double, dttpagos As Data.DataTable, + 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, 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 @@ -956,7 +956,7 @@ Public Class Timbrado Dim ImporteCancelacion As Decimal = 1 Dim MonedaCancelacion As String = "MXN" - Dim TipoCambioCancelacion As Double = 1 + Dim TipoCambioCancelacion As Decimal = 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 @@ -965,7 +965,7 @@ Public Class Timbrado Timbre.ComplementoPagos.FechaPago = FechaPago Timbre.ComplementoPagos.FormaDePagoP = FormaPago Timbre.ComplementoPagos.MonedaP = MonedaPago - Timbre.ComplementoPagos.Monto = If(EsCancelacion, ImporteCancelacion, Monto) + Timbre.ComplementoPagos.Monto = If(EsCancelacion, ImporteCancelacion, Monto).RoundSQL Timbre.ComplementoPagos.TipoCambioP = If(EsCancelacion, TipoCambioCancelacion, TipoCambioP) @@ -1029,11 +1029,7 @@ Public Class Timbrado 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 + Optional UsoCFDI As String = "CP01", Optional CFDIRelacionado As String = "") As CFDITimbre Dim Timbre As New CFDITimbre @@ -1089,8 +1085,8 @@ Public Class Timbrado Dim ImporteCancelacion As Decimal = 1 Dim MonedaCancelacion As String = "MXN" - Dim TipoCambioCancelacion As Double = 1 - If EsCancelacion Then MonedaPago = MonedaCancelacion + Dim TipoCambioCancelacion As Decimal = 1 + '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 @@ -1098,8 +1094,8 @@ Public Class Timbrado 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) + Timbre.ComplementoPagos.Monto = Monto.RoundSQL + Timbre.ComplementoPagos.TipoCambioP = TipoCambioP Dim VentaFolioFiscal, VentaSerie, VentaFolio, VentaAbreviaturaSAT, VentaMetodoPago, ObjetoImpuesto As String @@ -1123,7 +1119,9 @@ Public Class Timbrado 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 + If MonedaPago = VentaAbreviaturaSAT Then + VentaTipoCambio = 1 + End If 'condiciones especiales para el pago en pesos, facturas en moneda extranjera If MonedaPago = "MXN" AndAlso VentaAbreviaturaSAT <> "MXN" Then @@ -1136,20 +1134,21 @@ Public Class Timbrado .Folio = VentaFolio, .MonedaDR = VentaAbreviaturaSAT, .MetodoDePagoDR = VentaMetodoPago, - .ImpPagado = If(EsCancelacion, 1, VentaImportePago), - .ImpSaldoInsoluto = If(EsCancelacion, VentaImporteSaldoAnterior - 1, VentaImporteSaldoInsoluto), + .ImpPagado = VentaImportePago, + .ImpSaldoInsoluto = VentaImporteSaldoInsoluto, .ImpSaldoAnt = VentaImporteSaldoAnterior, .TipoCambioDR = VentaTipoCambio, + .EquivalenciaDR = VentaTipoCambio, .NumParcialidad = VentaNumParcialidad, - .ObjetoImpuesto = OBjetoImpuesto} 'If(drr("MetodoPago").ToString = "PUE", 0, drr("NumParcialidad").ToString.ToEntero)} + .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, + .Base = drp("Base").ToString.ToDecimal.RoundSQL, .TasaOCuota = drp("PorcentajeImpuesto").ToString().ToDecimal, .Impuesto = drp("TipoImpuesto").ToString, - .Importe = drp("Importe").ToString().ToDecimal + .Importe = drp("Importe").ToString().ToDecimal.RoundSQL } ) @@ -1353,7 +1352,7 @@ Public Class Timbrado For Each Ret In ObjCFDITimbre.Retenciones Dim clbImp As ClbNegBICFDv3_3.Impuesto = If(Ret.Impuesto = "002", ClbNegBICFDv3_3.Impuesto.IVA, If(Ret.Impuesto = "003", ClbNegBICFDv3_3.Impuesto.IEPS, ClbNegBICFDv3_3.Impuesto.ISR)) - Msg = CFDi.ImpuestosRetencionesCfd(clbImp, Ret.Importe.ToDecimal) + Msg = CFDi.ImpuestosRetencionesCfd(clbImp, Ret.Importe) Next If Not HasErrorRetenciones Then @@ -3700,6 +3699,10 @@ Public Class Timbrado #End Region #Region "Receptor" + If ObjCFDITimbre.Receptor.RFC.ToUpper.Contiene("XAXX010101000", "XEXX010101000") Then 'Condición del SAT. CFDI40149 + ObjCFDITimbre.Receptor.DomicilioFiscalReceptor = ObjCFDITimbre.Comprobante.LugarExpedicion + End If + comprobante.Receptor = New Profact.TimbraCFDI40.ComprobanteReceptor() comprobante.Receptor.Rfc = ObjCFDITimbre.Receptor.RFC comprobante.Receptor.Nombre = ObjCFDITimbre.Receptor.Nombre @@ -3824,7 +3827,7 @@ Public Class Timbrado For Each Ret In ObjCFDITimbre.Retenciones comprobante.Impuestos.Retenciones(w) = New Profact.TimbraCFDI40.ComprobanteImpuestosRetencion() comprobante.Impuestos.Retenciones(w).Impuesto = Ret.Impuesto - comprobante.Impuestos.Retenciones(w).Importe = Ret.Importe.ToDecimal + comprobante.Impuestos.Retenciones(w).Importe = Ret.Importe w += 1 Next @@ -4048,9 +4051,9 @@ Public Class Timbrado ComPag.Pago(0).FechaPago = ObjCFDITimbre.ComplementoPagos.FechaPago.ToString("yyyy-MM-ddTHH:mm:ss").ToDate() ComPag.Pago(0).FormaDePagoP = ObjCFDITimbre.ComplementoPagos.FormaDePagoP ComPag.Pago(0).MonedaP = ObjCFDITimbre.ComplementoPagos.MonedaP - ComPag.Pago(0).TipoCambioPSpecified = If(ObjCFDITimbre.ComplementoPagos.MonedaP = "MXN", False, True) - ComPag.Pago(0).TipoCambioP = ObjCFDITimbre.ComplementoPagos.TipoCambioP.ToDecimal - ComPag.Pago(0).Monto = ObjCFDITimbre.ComplementoPagos.Monto.ToDecimal + ComPag.Pago(0).TipoCambioPSpecified = True 'If(ObjCFDITimbre.ComplementoPagos.MonedaP = "MXN", False, True) + ComPag.Pago(0).TipoCambioP = ObjCFDITimbre.ComplementoPagos.TipoCambioP + ComPag.Pago(0).Monto = ObjCFDITimbre.ComplementoPagos.Monto If ObjCFDITimbre.ComplementoPagos.NumOperacion <> "" Then ComPag.Pago(0).NumOperacion = ObjCFDITimbre.ComplementoPagos.NumOperacion End If @@ -4085,6 +4088,29 @@ Public Class Timbrado End If If ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count > 0 Then + Dim Totales As New Profact.TimbraCFDI40.Complementos.Pagos20.PagosTotales() + 'Totales Generales + Totales.MontoTotalPagos = ObjCFDITimbre.ComplementoPagos.TotalPagos.RoundSQL + + Totales.TotalTrasladosBaseIVA16 = ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados("002", 0.16D, "Base") + Totales.TotalTrasladosBaseIVA16Specified = Totales.TotalTrasladosBaseIVA16 > 0 + Totales.TotalTrasladosImpuestoIVA16 = ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados("002", 0.16D, "Impuesto").RoundSQL + Totales.TotalTrasladosImpuestoIVA16Specified = Totales.TotalTrasladosBaseIVA16 > 0 + + Totales.TotalTrasladosBaseIVA8 = ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados("002", 0.08D, "Base") + Totales.TotalTrasladosBaseIVA8Specified = Totales.TotalTrasladosBaseIVA8 > 0 + Totales.TotalTrasladosImpuestoIVA8 = ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados("002", 0.08D, "Impuesto").RoundSQL + Totales.TotalTrasladosImpuestoIVA8Specified = Totales.TotalTrasladosBaseIVA8 > 0 + + Totales.TotalTrasladosBaseIVA0 = ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados("002", 0.00D, "Base") + Totales.TotalTrasladosBaseIVA0Specified = Totales.TotalTrasladosBaseIVA0 > 0 + Totales.TotalTrasladosImpuestoIVA0 = 0 + Totales.TotalTrasladosImpuestoIVA0Specified = Totales.TotalTrasladosBaseIVA0 > 0 + + + Totales.TotalRetencionesIEPSSpecified = False + ComPag.Totales = Totales + ComPag.Pago(0).DoctoRelacionado = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoDoctoRelacionado(ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count - 1) {} Dim i As Integer For Each doc As CFDIComplementoPagosDocsRelacionados In ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados @@ -4096,10 +4122,12 @@ Public Class Timbrado ComPag.Pago(0).DoctoRelacionado(i).Folio = doc.Folio ComPag.Pago(0).DoctoRelacionado(i).MonedaDR = doc.MonedaDR ComPag.Pago(0).DoctoRelacionado(i).NumParcialidad = doc.NumParcialidad.ToString - ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoAnt = doc.ImpSaldoAnt + ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoAnt = doc.ImpSaldoAnt.RoundSQL ComPag.Pago(0).DoctoRelacionado(i).ImpPagadoSpecified = True - ComPag.Pago(0).DoctoRelacionado(i).ImpPagado = doc.ImpPagado - ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsoluto = doc.ImpSaldoInsoluto + ComPag.Pago(0).DoctoRelacionado(i).ImpPagado = doc.ImpPagado.RoundSQL + ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsoluto = doc.ImpSaldoInsoluto.RoundSQL + ComPag.Pago(0).DoctoRelacionado(i).EquivalenciaDR = doc.EquivalenciaDR + ComPag.Pago(0).DoctoRelacionado(i).EquivalenciaDRSpecified = True ComPag.Pago(0).DoctoRelacionado(i).ObjetoImpDR = doc.ObjetoImpuesto If doc.Impuestos IsNot Nothing Then @@ -4116,6 +4144,9 @@ Public Class Timbrado Tra.ImporteDRSpecified = True Tra.ImporteDR = docimp.Importe Tra.ImpuestoDR = docimp.Impuesto + Tra.TipoFactorDR = docimp.TipoFactor + Tra.TasaOCuotaDRSpecified = True + Tra.TasaOCuotaDR = docimp.TasaOCuota ComPag.Pago(0).DoctoRelacionado(i).ImpuestosDR.TrasladosDR(j) = Tra End If j += 1 @@ -4132,54 +4163,80 @@ Public Class Timbrado Tra.BaseDR = docimp.Base Tra.ImporteDR = docimp.Importe Tra.ImpuestoDR = docimp.Impuesto + Tra.TipoFactorDR = docimp.TipoFactor + Tra.TasaOCuotaDR = docimp.TasaOCuota ComPag.Pago(0).DoctoRelacionado(i).ImpuestosDR.RetencionesDR(j) = Tra End If j += 1 Next End If End If - - - i += 1 Next - 'Estos impuestos aplicarían para anticipos - If ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos > 0 OrElse ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados > 0 Then + If ObjCFDITimbre.ComplementoPagos.Traslados.Count > 0 Then + Dim x As Integer ComPag.Pago(0).ImpuestosP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosP(0) {} ComPag.Pago(0).ImpuestosP(0) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosP() - 'ComPag.Pago(0).ImpuestosP(0).TotalImpuestosRetenidosSpecifiedP = True - 'ComPag.Pago(0).ImpuestosP(0).TotalImpuestosRetenidos = ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos.ToDecimal - 'ComPag.Pago(0).ImpuestosP(0).TotalImpuestosTrasladadosSpecified = True - 'ComPag.Pago(0).ImpuestosP(0).TotalImpuestosTrasladados = ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados.ToDecimal - - If (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "R").Count > 0 Then - Dim x As Integer - ComPag.Pago(0).ImpuestosP(0).RetencionesP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPRetencionP((ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "R").Count - 1) {} - For Each Ret As CFDIConceptosImpuestos In (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "R") - ComPag.Pago(0).ImpuestosP(0).RetencionesP(x) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPRetencionP() - ComPag.Pago(0).ImpuestosP(0).RetencionesP(x).ImpuestoP = Ret.Impuesto - ComPag.Pago(0).ImpuestosP(0).RetencionesP(x).ImporteP = Ret.Importe - x += 1 - Next - End If - If (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "T").Count > 0 Then - Dim x As Integer - ComPag.Pago(0).ImpuestosP(0).TrasladosP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPTrasladoP((ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "T").Count - 1) {} - For Each Tra As CFDIConceptosImpuestos In (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "T") - ComPag.Pago(0).ImpuestosP(0).TrasladosP(x) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPTrasladoP() - ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).ImpuestoP = Tra.Impuesto - ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).TipoFactorP = Tra.TipoFactor - ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).TasaOCuotaP = Tra.TasaOCuota - ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).ImporteP = Tra.Importe - x += 1 - Next - End If + ComPag.Pago(0).ImpuestosP(0).TrasladosP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPTrasladoP((ObjCFDITimbre.ComplementoPagos.Traslados).Count - 1) {} + For Each Tra As CFDITraslados In (ObjCFDITimbre.ComplementoPagos.Traslados) + ComPag.Pago(0).ImpuestosP(0).TrasladosP(x) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPTrasladoP() + ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).ImpuestoP = Tra.Impuesto + ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).TipoFactorP = Tra.TipoFactor + ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).TasaOCuotaP = Tra.TasaOCuota + ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).ImporteP = Tra.Importe + ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).BaseP = Tra.Base + x += 1 + Next + End If + If (ObjCFDITimbre.ComplementoPagos.Retenciones).Count > 0 Then + Dim x As Integer + If ComPag.Pago(0).ImpuestosP(0) Is Nothing Then ComPag.Pago(0).ImpuestosP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosP(0) {} + ComPag.Pago(0).ImpuestosP(0).RetencionesP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPRetencionP((ObjCFDITimbre.ComplementoPagos.Retenciones).Count - 1) {} + For Each Ret As CFDIRetenciones In ObjCFDITimbre.ComplementoPagos.Retenciones + ComPag.Pago(0).ImpuestosP(0).RetencionesP(x) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPRetencionP() + ComPag.Pago(0).ImpuestosP(0).RetencionesP(x).ImpuestoP = Ret.Impuesto + ComPag.Pago(0).ImpuestosP(0).RetencionesP(x).ImporteP = Ret.Importe + x += 1 + Next End If - Dim nsComp As New System.Xml.Serialization.XmlSerializerNamespaces() + ''Estos impuestos aplicarían para anticipos + 'If ObjCFDITimbre.ComplementoPagos.tota > 0 OrElse ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados > 0 Then + ' ComPag.Pago(0).ImpuestosP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosP(0) {} + ' ComPag.Pago(0).ImpuestosP(0) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosP() + + ' If (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "T").Count > 0 Then + ' Dim x As Integer + ' ComPag.Pago(0).ImpuestosP(0).TrasladosP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPTrasladoP((ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "T").Count - 1) {} + ' For Each Tra As CFDIConceptosImpuestos In (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "T") + ' ComPag.Pago(0).ImpuestosP(0).TrasladosP(x) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPTrasladoP() + ' ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).ImpuestoP = Tra.Impuesto + ' ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).TipoFactorP = Tra.TipoFactor + ' ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).TasaOCuotaP = Tra.TasaOCuota + ' ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).ImporteP = Tra.Importe + ' x += 1 + ' Next + ' End If + + ' If (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "R").Count > 0 Then + ' Dim x As Integer + ' ComPag.Pago(0).ImpuestosP(0).RetencionesP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPRetencionP((ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "R").Count - 1) {} + ' For Each Ret As CFDIConceptosImpuestos In (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "R") + ' ComPag.Pago(0).ImpuestosP(0).RetencionesP(x) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPRetencionP() + ' ComPag.Pago(0).ImpuestosP(0).RetencionesP(x).ImpuestoP = Ret.Impuesto + ' ComPag.Pago(0).ImpuestosP(0).RetencionesP(x).ImporteP = Ret.Importe + ' x += 1 + ' Next + ' End If + + + 'End If + + + Dim nsComp As New System.Xml.Serialization.XmlSerializerNamespaces() 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() @@ -4820,7 +4877,6 @@ Public Class Timbrado If FolioFiscal <> "" Then resultadoTimbre.GuardaXml(RutaArchivo, NombreArchivoXML) - If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then 'Actualiza Estatus Factura @@ -4914,6 +4970,7 @@ Public Class Timbrado End If End If + resultadoTimbre.GuardaXml(RutaArchivo, NombreArchivoXML) Catch ex As Exception Retorno = ex.ToString() End Try @@ -6220,7 +6277,7 @@ Public Class Timbrado For Each Ret In ObjCFDITimbre.Retenciones comprobante.Impuestos.Retenciones(w) = New Profact.TimbraCFDI33.ComprobanteImpuestosRetencion() comprobante.Impuestos.Retenciones(w).Impuesto = Ret.Impuesto - comprobante.Impuestos.Retenciones(w).Importe = Ret.Importe.ToDecimal + comprobante.Impuestos.Retenciones(w).Importe = Ret.Importe w += 1 Next @@ -6444,8 +6501,8 @@ Public Class Timbrado ComPag.Pago(0).FormaDePagoP = ObjCFDITimbre.ComplementoPagos.FormaDePagoP ComPag.Pago(0).MonedaP = ObjCFDITimbre.ComplementoPagos.MonedaP ComPag.Pago(0).TipoCambioPSpecified = If(ObjCFDITimbre.ComplementoPagos.MonedaP = "MXN", False, True) - ComPag.Pago(0).TipoCambioP = ObjCFDITimbre.ComplementoPagos.TipoCambioP.ToDecimal - ComPag.Pago(0).Monto = ObjCFDITimbre.ComplementoPagos.Monto.ToDecimal + ComPag.Pago(0).TipoCambioP = ObjCFDITimbre.ComplementoPagos.TipoCambioP + ComPag.Pago(0).Monto = ObjCFDITimbre.ComplementoPagos.Monto If ObjCFDITimbre.ComplementoPagos.NumOperacion <> "" Then ComPag.Pago(0).NumOperacion = ObjCFDITimbre.ComplementoPagos.NumOperacion End If @@ -6511,9 +6568,9 @@ Public Class Timbrado ComPag.Pago(0).Impuestos = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoImpuestos(0) {} ComPag.Pago(0).Impuestos(0) = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoImpuestos() ComPag.Pago(0).Impuestos(0).TotalImpuestosRetenidosSpecified = True - ComPag.Pago(0).Impuestos(0).TotalImpuestosRetenidos = ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos.ToDecimal + ComPag.Pago(0).Impuestos(0).TotalImpuestosRetenidos = ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos ComPag.Pago(0).Impuestos(0).TotalImpuestosTrasladadosSpecified = True - ComPag.Pago(0).Impuestos(0).TotalImpuestosTrasladados = ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados.ToDecimal + ComPag.Pago(0).Impuestos(0).TotalImpuestosTrasladados = ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados If (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "R").Count > 0 Then Dim x As Integer