diff --git a/App_Code/Timbrado.vb b/App_Code/Timbrado.vb
index 58f118109..ef77aa206 100644
--- a/App_Code/Timbrado.vb
+++ b/App_Code/Timbrado.vb
@@ -1,3388 +1,3393 @@
-Option Explicit On
-Option Strict On
-
-Imports Extensiones
-Imports System.IO
-Imports System.Linq
-Imports System.Xml
-Imports System.Data
-Public Class Timbrado
-
-#Region "P R O P I E D A D E S"
- Public Property MensajeErrorCFDI As String
- Public Property UUID As String = ""
- Public Property CancelacionAcuse As String
- Public Property CancelacionState As Integer
- Public Property CancelacionMensaje As String
- Public Property CancelacionFecha As Date
-
-
- Public Class AcuseCancelacionSAT
- Public Property CodigoEstatus As String
- Public Property EsCancelable As String
- Public Property Estado As String
- Public Property EstatusCancelacion As String
- End Class
-
-#End Region
-
- Public Shared Function VerificarVigenciaSAT(uuid As String, emisor As String, receptor As String, total As String, produccion As Boolean) As AcuseCancelacionSAT
- Dim Retorno As AcuseCancelacionSAT = Nothing
- Dim resp As Cancelacion.AcuseSat = New Cancelacion.AcuseSat()
- Using ws As Cancelacion.CancelacionSoapClient = New Cancelacion.CancelacionSoapClient
- Try
- If Not produccion Then
- Dim PACUsuario As String = "rene.molina@adsistemas.mx"
- Dim PACContrasenia As String = "rene2018"
- resp = ws.ConsultaVigenciaTest(emisor, PACUsuario, PACContrasenia, uuid, receptor, total)
- Retorno = New AcuseCancelacionSAT()
- Else
- resp = ws.ConsultaVigencia(emisor, "UserTest", "1234567890", uuid, receptor, total)
- Retorno = New AcuseCancelacionSAT()
- End If
- Catch ex As Exception
- Return Nothing
- End Try
-
- If Retorno IsNot Nothing Then
- Retorno.CodigoEstatus = resp.CodigoEstatus
- Retorno.Estado = resp.Estado
- Retorno.EsCancelable = resp.EsCancelable
- Retorno.EstatusCancelacion = resp.EstatusCancelacion
- End If
-
- End Using
- Return Retorno
- End Function
- Public Function CFDICancelar(Empresa As Empresa, FolioFiscal As String, Total As Decimal, RFCReceptor As String, RFCEmisor As String, Optional CvePACCancelacion As Integer = 2, Optional ValidaFactura As Boolean = True) As Boolean
- Dim Retorno As Boolean = False
- Dim MsgCancelacion As New StringBuilder
- If ValidaFactura Then
- Dim Vigencia = VerificarVigenciaSAT(FolioFiscal, RFCEmisor, RFCReceptor, Total.ToString(), True)
- If Vigencia IsNot Nothing Then
- If Vigencia.EsCancelable.ToUpper() = "NO CANCELABLE" Then
- Return False
- End If
- Else
- Return False
- End If
- End If
-
-
- MsgCancelacion.AppendFormat("CvePAC:{0}", CvePACCancelacion)
-
- Select Case CvePACCancelacion
- Case 1
- MsgCancelacion.AppendFormat("1.1")
- Try
- Dim CFDi As New ClbNegBICFDv3_2.ClsNegEDI
- Dim Respuesta As New ClbNegBICFDv3_2.ClsNegRespuesta
- Respuesta = CFDi.CancelaCFdi(Empresa.BIUsuario, Empresa.BIContraseña, Empresa.Ruta & "Certificados\" & Empresa.ArchivoPfx, Empresa.ContraseñaKey, Empresa.RFC, FolioFiscal, "http://portalbiinform.com.mx/srvCFDi/service1.asmx")
-
- If Respuesta IsNot Nothing AndAlso Respuesta.SelloSAT <> "" Then
- Dim xml64 As String = ""
- Dim myXml As String = Respuesta.SelloSAT
- Dim resp As XElement = XElement.Parse(myXml)
- For Each elem As XElement In resp.Descendants
- If elem.Name = "xmlBase64" Then xml64 = elem.Value
- Next
-
- 'If Respuesta.UUDI.Contiene("0", "201", "202") Then
- Dim xmlDoc As New System.Xml.XmlDocument()
- xmlDoc.LoadXml(If(xml64 = "", Respuesta.SelloSAT, Encoding.UTF8.GetString(Convert.FromBase64String(xml64))))
- Dim AcuseChild = xmlDoc.ChildNodes.Cast(Of XmlNode).Where(Function(a) a.Name.Equals("Acuse", StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault()
-
- Dim FoliosChild = AcuseChild.ChildNodes.Cast(Of XmlNode).Where(Function(a) a.LocalName.Equals("Folios", StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault()
- Dim SignatureChild = AcuseChild.ChildNodes.Cast(Of XmlNode).Where(Function(a) a.LocalName.Equals("Signature", StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault()
-
- Dim prefixFol As String = FoliosChild.Prefix
- If prefixFol <> "" Then prefixFol = $"{prefixFol}:" 'se le agregan los ":" si tiene prefijo
-
- CancelacionState = xmlDoc.GetElementsByTagName($"{prefixFol}EstatusUUID")(0).InnerText.ToEntero
- 'verificación basada en el resultado del xml.
- If CancelacionState.Contiene(201, 202) Then
-
- Dim prefixSig = SignatureChild.Prefix
- If prefixSig <> "" Then prefixSig = $"{prefixSig}:" 'se le agregan los ":" si tiene prefijo
- Dim SignatureValue = xmlDoc.GetElementsByTagName($"{prefixSig}SignatureValue")
- CancelacionAcuse = If(SignatureValue.Count < 1, SignatureValue(0).InnerText, SignatureValue(0).InnerText)
- Try
- CancelacionFecha = AcuseChild.Attributes("Fecha").Value.ToDate
- Catch ex As Exception
- CancelacionFecha = xmlDoc.GetElementsByTagName("CancelaCFDResult")(0).Attributes("Fecha").Value.ToDate
- End Try
- Retorno = True
- End If
-
- 'End If
-
- Else
- Me.GuardaLog(CFDi.MsgError)
- End If
- Respuesta = Nothing
- CFDi = Nothing
- Catch ex As Exception
- GuardaLog($"{ex.Message}")
- End Try
-
- Case 2
- MsgCancelacion.AppendFormat("2.1")
- Dim ArchivoLLave As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoKey}"
- Dim ArchivoCertificado As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoCer}"
- Dim UsuarioServicio As String = If(CvePACCancelacion = 2, Empresa.RFC, "rene.molina@adsistemas.mx")
- Dim ClaveServicio As String = If(CvePACCancelacion = 2, Empresa.RFC.ToLower, "rene2018")
- Dim Clave As String = Empresa.ContraseñaKey
- Dim UrlServicio As String = "" ' Produccion
- Select Case CvePACCancelacion
- Case 2
- UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL"
- Case 4
- UrlServicio = "http://192.168.0.2:8080/ADSistemas/Timbrado.asmx?WSDL"
- End Select
-
- If Not Empresa.FacturaProduccion Then
- ArchivoLLave = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
- ArchivoCertificado = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
- Select Case CvePACCancelacion
- Case 2
- UsuarioServicio = "fgomez"
- ClaveServicio = "12121212"
- UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL"
- Case 4
- UsuarioServicio = "UserTest"
- ClaveServicio = "1234567890"
- UrlServicio = "http://192.168.0.2:8080/ADSistemas/Timbrado.asmx?WSDL"
- End Select
- End If
-
-#Region "Valida"
- If Not File.Exists(ArchivoCertificado) Then
- Alert("El archivo de certificado no existe", TipoMensaje.MsgError)
- Return False
- End If
- If Not File.Exists(ArchivoLLave) Then
- Alert("El archivo de llave privada no existe", TipoMensaje.MsgError)
- Return False
- End If
- If Empresa.ContraseñaKey = "" Then
- Alert("La clave no puede ser vacía", TipoMensaje.MsgError)
- Return False
- End If
-#End Region
-
-#Region "Variables"
- Dim llaveByte As Byte(), certByte As Byte()
- Dim llaveBase64 As String, certBase64 As String
- Dim cfdi As New RVCFDI.GeneraCFDI()
- 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 False
- 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 False
-
- End Try
-#End Region
-
-
- Dim base64 As String
- Dim ObjCancelacion As New RVCancelacion.Cancelacion()
-
- Dim xmlCancelacion As String = ObjCancelacion.crearXMLCancelacion(certBase64, llaveBase64, Clave, FolioFiscal)
- If (ObjCancelacion.MensajeDeError = "") Then
-
- base64 = CodificarABase64(xmlCancelacion)
-
- Dim objWS As RVCFDI.WSGeneraCFDI.Service = Nothing
- Dim objAuthSoapHD As RVCFDI.WSGeneraCFDI.AuthSoapHd
- Dim objResponse As RVCFDI.WSGeneraCFDI.StructCfd
- Dim objCancel As RVCFDI.WSGeneraCFDI.StructCancel
-
- Try
-
-
- 'Variables de consumo de servicio web
- objWS = New RVCFDI.WSGeneraCFDI.Service()
- objAuthSoapHD = New RVCFDI.WSGeneraCFDI.AuthSoapHd()
- 'creacion de Autorizacion de cabecera Soap
- objCancel = New RVCFDI.WSGeneraCFDI.StructCancel()
- 'Configura el servicio
- objWS.Url = UrlServicio
-
- objAuthSoapHD.strPassword = ClaveServicio
- objAuthSoapHD.strUserName = UsuarioServicio
- 'Coloca la cabecera
- objWS.AuthSoapHdValue = objAuthSoapHD
- 'Obtiene el resultado
- objCancel = objWS.CancelTicket(base64)
- 'Valida la respuesta
- ''Codigos del SAT
- ''201 - El folio se ha cancelado con éxito.
- ''202 - El CFDI ya había sido cancelado previamente.
- ''203 - UUID no corresponde al emisor.
- ''204 - El CFDI no aplica para cancelación.
- ''205 - El UUID no existe o no ha sido procesado por el SAT.
- ''402 - El Contribuyente no se encuentra el la LCO o la validez de obligaciones se reporta como negativa.
- CancelacionState = objCancel.state
- CancelacionMensaje = objCancel.Descripcion
-
- If objCancel.state.Contiene(0, 201, 202) Then
- CancelacionFecha = Now
-
- Select Case CvePACCancelacion
- Case 2
- Dim solicitud As New WSRVConsultas.Service1SoapClient
- Dim resp As New WSRVConsultas.resp_Acuse()
- resp = solicitud.ConsultarAcuseCancelacion(RFCEmisor, UsuarioServicio, ClaveServicio, FolioFiscal, CancelacionFecha.ToShortDateString)
- CancelacionMensaje = objCancel.Descripcion
-
- If (resp.Estado = 0) Then
-
- Dim xmlDoc As New System.Xml.XmlDocument()
- xmlDoc.LoadXml(Encoding.UTF8.GetString(Convert.FromBase64String(resp.Xml)))
- Dim xpath As String = "Acuse/Folios"
- Dim nodes = xmlDoc.SelectNodes(xpath)
- CancelacionState = xmlDoc.GetElementsByTagName("EstatusUUID")(0).InnerText.ToEntero
-
- xpath = "Acuse/Signature"
- nodes = xmlDoc.SelectNodes(xpath)
-
- CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText
- CancelacionFecha = xmlDoc.SelectSingleNode("Acuse").Attributes("Fecha").Value.ToDate
- Retorno = True
- Else
- CancelacionAcuse = resp.MensajeDeError
- Retorno = False
- End If
- solicitud = Nothing
- Case 4
-
- Dim solicitud As New WSGF.Service1SoapClient
- Dim resp As New WSGF.StructXml()
- resp = solicitud.GetAcuse(RFCEmisor, UsuarioServicio, ClaveServicio, FolioFiscal)
- CancelacionMensaje = objCancel.Descripcion
-
- If (resp.Estado = 0) Then
-
- Dim xmlDoc As New System.Xml.XmlDocument()
- xmlDoc.LoadXml(Encoding.UTF8.GetString(Convert.FromBase64String(resp.CfdiB64)))
- Dim xpath As String = "Acuse/Folios"
- Dim nodes = xmlDoc.SelectNodes(xpath)
- CancelacionState = xmlDoc.GetElementsByTagName("EstatusUUID")(0).InnerText.ToEntero
-
- xpath = "Acuse/Signature"
- nodes = xmlDoc.SelectNodes(xpath)
-
- CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText
- CancelacionFecha = xmlDoc.SelectSingleNode("Acuse").Attributes("Fecha").Value.ToDate
- Retorno = True
- Else
- CancelacionAcuse = resp.Descripcion
- Retorno = False
- End If
- solicitud = Nothing
- End Select
-
-
- End If
- Catch ex As Exception
- CancelacionMensaje += $" | ex: {ex}"
- Retorno = False
- End Try
-
- 'Libera memoria
- objWS.Dispose()
- objResponse = Nothing
- objAuthSoapHD = Nothing
- GC.Collect()
- End If
-
-
- Case 3
- MsgCancelacion.AppendFormat("3.1")
- Dim ArchivoLLave As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoKey}"
- Dim ArchivoCertificado As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoCer}"
- Dim UsuarioServicio As String = Empresa.RFC
- Dim ClaveServicio As String = Empresa.RFC.ToLower
- Dim Clave As String = Empresa.ContraseñaKey
- Dim UrlServicio As String = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL"
- Dim AmbienteProductivo As Boolean = True
-
- If Not Empresa.FacturaProduccion OrElse Empresa.CveEmpresa = 1 Then
- UsuarioServicio = "fgomez"
- ClaveServicio = "12121212"
- Clave = "12345678a"
- ArchivoLLave = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
- ArchivoCertificado = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
- UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" '"http://108.60.211.43/rvltimbrado/service1.asmx"
- AmbienteProductivo = False
- End If
-
-
-#Region "Valida"
- If Not File.Exists(ArchivoCertificado) Then
- Alert("El archivo de certificado no existe", TipoMensaje.MsgError)
- Return False
- End If
- If Not File.Exists(ArchivoLLave) Then
- Alert("El archivo de llave privada no existe", TipoMensaje.MsgError)
- Return False
- End If
- If Empresa.ContraseñaKey = "" Then
- Alert("La clave no puede ser vacía", TipoMensaje.MsgError)
- Return False
- End If
-#End Region
-
- Dim conector As New Profact.TimbraCFDI33.Conector(AmbienteProductivo)
-
- If Not AmbienteProductivo Then
- conector.EstableceCredenciales("mvpNUXmQfK8=")
- Else
- conector.EstableceCredenciales("vSGxMFWnNRy/nDoowxqrqw==|Sia123654")
- End If
-
- Dim resultadoCancelacion As Profact.TimbraCFDI.ResultadoCancelacionAck
- resultadoCancelacion = conector.CancelaCFDIAck(RFCEmisor, FolioFiscal)
- CancelacionFecha = Now
- Dim resp As Profact.TimbraCFDI.ResultadoConsulta
- resp = conector.ObtieneCFDI(RFCEmisor, FolioFiscal)
- If resultadoCancelacion.Exitoso Then
- CancelacionMensaje = resultadoCancelacion.Descripcion
- Dim xmlDoc As New System.Xml.XmlDocument()
- xmlDoc.LoadXml(Encoding.UTF8.GetString(Convert.FromBase64String(resp.Xml)))
- Dim xpath As String = "Acuse/Folios"
- Dim nodes = xmlDoc.SelectNodes(xpath)
- CancelacionState = xmlDoc.GetElementsByTagName("EstatusUUID")(0).InnerText.ToEntero
-
- xpath = "Acuse/Signature"
- nodes = xmlDoc.SelectNodes(xpath)
-
- CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText
- CancelacionFecha = xmlDoc.SelectSingleNode("Acuse").Attributes("Fecha").Value.ToDate
- Retorno = True
- Else
- CancelacionAcuse = resp.NumeroError
- Retorno = False
- End If
-
- Case 4
- MsgCancelacion.AppendFormat("4.1-")
- Dim ArchivoLLave As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoKey}"
- Dim ArchivoCertificado As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoCer}"
- Dim UsuarioServicio As String = If(CvePACCancelacion = 2, Empresa.RFC, "rene.molina@adsistemas.mx")
- Dim ClaveServicio As String = If(CvePACCancelacion = 2, Empresa.RFC.ToLower, "rene2018")
- Dim Clave As String = Empresa.ContraseñaKey
- Dim UrlServicio As String = "" ' Produccion
-
- UrlServicio = "http://juancalderon-001-site1.ftempurl.com/timbrado.asmx?WSDL"
-
- If Not Empresa.FacturaProduccion Then
- ArchivoLLave = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
- ArchivoCertificado = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
-
- UsuarioServicio = "UserTest"
- ClaveServicio = "1234567890"
- UrlServicio = "http://juancalderon-001-site6.ftempurl.com/cancelacion.asmx?WSDL"
-
- End If
-
-#Region "Valida"
- If Not File.Exists(ArchivoCertificado) Then
- Alert("El archivo de certificado no existe", TipoMensaje.MsgError)
- Return False
- End If
- If Not File.Exists(ArchivoLLave) Then
- Alert("El archivo de llave privada no existe", TipoMensaje.MsgError)
- Return False
- End If
- If Empresa.ContraseñaKey = "" Then
- Alert("La clave no puede ser vacía", TipoMensaje.MsgError)
- Return False
- End If
-#End Region
-
-#Region "Variables"
- Dim llaveByte As Byte(), certByte As Byte()
- Dim llaveBase64 As String, certBase64 As String
- Dim objCan As New GoFac.GoCfdi()
- 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 False
- 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 False
-
- End Try
-#End Region
- objCan.CancelacionCfdi = True
- objCan.FechaCancelacion = System.DateTime.Now.AddMinutes(-120) ' operación requerida para que no se presente problemas con fechas adelantadas del PAC
- MsgCancelacion.AppendFormat("4.3-")
- objCan.GeneraCancelacionB64(certBase64, llaveBase64, Clave, FolioFiscal)
- If (objCan.MensajeError = "") Then
- MsgCancelacion.AppendFormat("4.4-")
- objCan.CancelaCfdi(UsuarioServicio, ClaveServicio, UrlServicio, Empresa.FacturaProduccion)
- MsgCancelacion.AppendFormat("4.5-")
- '' Verifica el resultado, 0. cancelado, 202, cancelado previamente
- If (objCan.CodigoError.Contiene(0, 202)) Then
-
- MsgCancelacion.AppendFormat("4.5.1-")
- Dim xmlDoc As New System.Xml.XmlDocument()
- xmlDoc.LoadXml(objCan.Xml)
- Dim xpath As String = "Acuse/Folios"
- Dim nodes = xmlDoc.SelectNodes(xpath)
-
- xpath = "Acuse/Signature"
- nodes = xmlDoc.SelectNodes(xpath)
-
- CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText
- CancelacionFecha = xmlDoc.DocumentElement.Attributes("Fecha").Value.ToDate
- Retorno = True
- MsgCancelacion.AppendFormat("4.5.2-")
- End If
-
- End If
- MsgCancelacion.AppendFormat("{0} --Código:{1} -- XML: {2}", objCan.MensajeError, objCan.CodigoError, objCan.Xml)
-
- End Select
-
-
- If Not Retorno Then
- GuardaLog($"****** Error al cancelar factura ****** Estatus: {CancelacionState} | Mensaje: {CancelacionMensaje} | Mensaje SAT: {MsgCancelacion.ToString} ")
- End If
-
- Return Retorno
- End Function
- 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,
- 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.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 = ""}
- 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 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
- ' 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} 'If(drr("MetodoPago").ToString = "PUE", 0, drr("NumParcialidad").ToString.ToEntero)}
- 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
-
- End Function
- Public Function TimbrarFactura(UsuarioActual As Usuario, Ventas As Modelos.Factura, Optional CvePACEspecial As Integer = -1) As Boolean
-
- Dim Retorno As Boolean = False
- Dim tCvePAC As Integer = UsuarioActual.Empresa.CvePAC
- If CvePACEspecial <> -1 Then tCvePAC = CvePACEspecial
-
- Select Case tCvePAC
- Case 1
- ' Retorno = TimbrarFacturaBIInform33(UsuarioActual, Ventas, FM, TmpDTConceptos, TmpDTImpuestos, TmpDT7Eleven, TmpDTComplementos, Ruta, LstFordASN, FordGSDBM, ObjV)
- Dim Ret As String = TimbrarFacturaBIInform33(Ventas, UsuarioActual)
- Retorno = If(Ret = "", True, False)
-
- Case 2
- 'Retorno = TimbrarFacturaRealVirtual(UsuarioActual, Ventas, TmpDTConceptos, TmpDTImpuestos, TmpDTComplementos, Ruta, LstFordASN, FordGSDBM, ObjV)
- Dim Ret As String = TimbrarFacturaRealVirtualv33(Ventas, UsuarioActual)
- Retorno = If(Ret = "", True, False)
-
- Case 3
- Retorno = TimbrarFacturaProFact(UsuarioActual, Ventas)
- 'Retorno = TimbrarFacturaProFact(UsuarioActual, Ventas, TmpDTConceptos, TmpDTImpuestos, TmpDTComplementos, Ruta, LstFordASN, FordGSDBM, ObjV)
- Case 4
-
- Dim Ret As String = TimbrarFacturaGoCFDIv33(Ventas, UsuarioActual)
- Retorno = If(Ret = "", True, False)
-
- End Select
-
-
- Return Retorno
- End Function
- Public Function TimbrarFacturaBIInform33(Ventas As Modelos.Factura, UsuarioActual As Usuario) As String
-
-
- Dim Retorno As String = ""
-
- 'Dim SucMatriz As SubProyectoModel = Ventas.SubProyectoMatriz
- 'Dim SucEmpresa As SubProyectoModel = Ventas.SubProyecto
- 'Dim SucCliente As SucursalModel = Ventas.ClienteSucursal
- Dim ObjCFDITimbre As CFDITimbre = Ventas.Timbre
- Dim ArchivoLLave As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoKey}"
- Dim ArchivoCertificado As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoCer}"
- Dim ArchivoPFX As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoPfx}"
- 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://portalbiinform.com.mx/srvCFDi33/service1.asmx" ' Produccion
- Dim RutaArchivo As String = $"{UsuarioActual.Empresa.Ruta}XML\{Ventas.TipoDocto}\"
- Dim NombreArchivoXML As String = $"{ObjCFDITimbre.Comprobante.SerieFolio}"
- Dim TimbraProduccion As Boolean = True
-
- 'Dim sevenElevenNumProveedor = TmpDT7Eleven.Rows(0)("sevenElevenNumProveedor").ToString
- 'Dim sevenElevenFolio = TmpDT7Eleven.Rows(0)("sevenElevenFolio").ToString
- 'Dim sevenElevenTienda = TmpDT7Eleven.Rows(0)("sevenElevenTienda").ToString
- 'Dim sevenElevenFecha = TmpDT7Eleven.Rows(0)("sevenElevenFecha").ToString
-
- If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then
- UsuarioServicio = UsuarioActual.Empresa.BIUsuario
- ClaveServicio = UsuarioActual.Empresa.BIContraseña
- Clave = "12345678a"
- EmisorRFC = "AAA010101AAA"
- ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
- ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
- UrlServicio = "http://portalmacropro.com.mx/srvCFDi33prueba/service1.asmx"
- TimbraProduccion = False
- End If
-
- Dim CFDi As New ClbNegBICFDv3_3.ClsNegEDI
- Dim ObjFemsa As New ClbNegBICFDv3_3.ClsNegAddFemsa
- Dim ObjDetallista As New ClbNegBICFDv3_3.ClsNegEDICompDet
- Dim ImpLoc As New ClbNegBICFDv3_3.ClsNegEDICompImplocal
-
- Dim Msg As String = String.Empty
- 'Nodo Comprobante
- Dim clbcomp As ClbNegBICFDv3_3.TipoDeComprobante = If(ObjCFDITimbre.Comprobante.TipoComprobante = "I", ClbNegBICFDv3_3.TipoDeComprobante.I, If(ObjCFDITimbre.Comprobante.TipoComprobante = "E", ClbNegBICFDv3_3.TipoDeComprobante.E, If(ObjCFDITimbre.Comprobante.TipoComprobante = "P", ClbNegBICFDv3_3.TipoDeComprobante.P, ClbNegBICFDv3_3.TipoDeComprobante.T)))
- Msg = CFDi.comprobantecfd(0, 0, ObjCFDITimbre.Comprobante.Serie,
- ObjCFDITimbre.Comprobante.Folio.ToString,
- ObjCFDITimbre.Comprobante.Fecha,
- ObjCFDITimbre.Comprobante.FormadePago,
- ObjCFDITimbre.Comprobante.CondicionesdePago,
- ObjCFDITimbre.Comprobante.Subtotal,
- ObjCFDITimbre.Comprobante.Descuentos,
- ObjCFDITimbre.Comprobante.TipoCambio.ToDecimal,
- ObjCFDITimbre.Comprobante.Moneda,
- ObjCFDITimbre.Comprobante.Total,
- ObjCFDITimbre.Comprobante.MetodoPago,
- clbcomp,
- ObjCFDITimbre.Comprobante.LugarExpedicion,
- ObjCFDITimbre.Comprobante.Confirmacion)
-
- If Msg = String.Empty Then
- 'Nodo emisor
- Msg = CFDi.EmisorCfd(If(UsuarioActual.Empresa.FacturaProduccion, UsuarioActual.Empresa.RFC, "AAA010101AAA"), UsuarioActual.Empresa.Empresa, UsuarioActual.Empresa.CodigoRegimenFiscal)
- If Msg = String.Empty Then
-
- 'Nodo receptor
- Msg = CFDi.ReceptorCfd(Ventas.Cliente.RFC, Ventas.Cliente.Nombre, "", "", Ventas.ClaveUsoCFDI)
- If Msg = String.Empty Then
-
- 'Nodo conceptos, se agregan los PS
- Dim HasErrorConceptos As Boolean = False
-
- If ObjCFDITimbre.Conceptos IsNot Nothing AndAlso ObjCFDITimbre.Conceptos.Count > 0 Then
- For Each concep As CFDIConceptos In ObjCFDITimbre.Conceptos
- CFDi.ConceptosCfd(concep.ClaveProdServ, concep.Cantidad, concep.Unidad, concep.Noidentificacion, concep.Descripcion, concep.ValorUnitario, concep.Importe, concep.ClaveUnidad, concep.Descuento)
- For Each imp As CFDIConceptosImpuestos In concep.Impuestos
- Dim clbImp As ClbNegBICFDv3_3.Impuesto = If(imp.Impuesto = "002", ClbNegBICFDv3_3.Impuesto.IVA, If(imp.Impuesto = "003", ClbNegBICFDv3_3.Impuesto.IEPS, ClbNegBICFDv3_3.Impuesto.ISR))
- Dim clbTipo As ClbNegBICFDv3_3.TipoFactor = If(imp.TipoFactor = "Tasa", ClbNegBICFDv3_3.TipoFactor.Tasa, If(imp.TipoFactor = "Cuota", ClbNegBICFDv3_3.TipoFactor.Cuota, ClbNegBICFDv3_3.TipoFactor.Exento))
- Dim Posicion As Integer = imp.TasaOCuota.ToString.IndexOf(".")
- If imp.TrasladooRetencion = "T" Then
- CFDi.ConceptosTrasladosCfd(imp.Base, clbImp, clbTipo, imp.TasaOCuota.ToString.PadRight(imp.TasaOCuota.ToString.Length + (6 - imp.TasaOCuota.ToString.Substring(Posicion, imp.TasaOCuota.ToString.Length - 1).Length.ToEntero + 1), Convert.ToChar("0")), imp.Importe)
- Else
- CFDi.ConceptosRetencionesCfd(imp.Base, clbImp, clbTipo, imp.TasaOCuota.ToString.PadRight(imp.TasaOCuota.ToString.Length + (6 - imp.TasaOCuota.ToString.Substring(Posicion, imp.TasaOCuota.ToString.Length - 1).Length.ToEntero + 1), Convert.ToChar("0")), imp.Importe)
- End If
-
- Next
- Next
- End If
-
-
- If Not HasErrorConceptos Then
- 'Nodo Impuestos, se agrega el total de impuestos
- Msg = CFDi.ImpuestosCfd(Ventas.RetIVATC + Ventas.RetISRTC, Ventas.IVATC)
- If Msg = String.Empty Then
-
- Dim HasErrorRetenciones As Boolean = False
- 'Nodo Impuestos-retenciones
-
-
- 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)
- Next
-
- If Not HasErrorRetenciones Then
-
- 'Nodo Impuestos-traslado
- Dim HasErrorIVA As Boolean = False
- ''se acumulan los importes
- For Each Tras In ObjCFDITimbre.Traslados
- Dim Posicion As Integer = Tras.TasaOCuota.ToString.IndexOf(".")
- Dim tipfact As ClbNegBICFDv3_3.TipoFactor = If(Tras.TipoFactor = "Tasa", ClbNegBICFDv3_3.TipoFactor.Tasa, If(Tras.TipoFactor = "Cuota", ClbNegBICFDv3_3.TipoFactor.Cuota, ClbNegBICFDv3_3.TipoFactor.Exento))
- Msg = CFDi.ImpuestosTrasladosCfd(ClbNegBICFDv3_3.Impuesto.IVA, Tras.TasaOCuota.ToString.PadRight(Tras.TasaOCuota.ToString.Length + (6 - Tras.TasaOCuota.ToString.Substring(Posicion, Tras.TasaOCuota.ToString.Length - 1).Length.ToEntero + 1), Convert.ToChar("0")), Tras.Importe, tipfact)
- Next
-
-
- If Not HasErrorIVA Then
- 'Nodo Impuestos locales
- 'JJMQ 20150826: Se habilitó de nueva cuenta impuestos locales
- Dim HasErrorImpuestosLocales As Boolean = False
- Dim TieneImpuestosLocales As Boolean = False
-
-
- If ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe) > 0 Then
-
- For Each ret As CFDIRetencionesLocales In ObjCFDITimbre.RetencionesLocales
- If ret.Importe > 0 Then
- Msg = ImpLoc.RetencionesLocales(ret.ImpuestoLocalRetenido, ret.TasaRetencion, ret.Importe)
- TieneImpuestosLocales = True
- End If
- Next
- End If
-
- CFDi.CompImplocal = ImpLoc
- If Msg <> String.Empty Then HasErrorImpuestosLocales = True
-
- If Not HasErrorImpuestosLocales Then
-
-
-
- 'Agrega Adenda FEMSA
- Dim HasErrorFEMSA As Boolean = False
- If Ventas.Cliente.AplicaFEMSA Then
-
- Msg = ObjFemsa.Carga(Ventas.FemsaFactura.FEMSA_Version, Ventas.ClaseDoctoSat, Ventas.FemsaFactura.FEMSA_NumSociedad, Ventas.FemsaFactura.FEMSA_NumProveedor, Ventas.FemsaFactura.FEMSA_NumPedido,
- Ventas.MonedaAbreviatura, Ventas.FemsaFactura.FEMSA_NumEntrada, Ventas.FemsaFactura.FEMSA_NumRemision, Ventas.FemsaFactura.FEMSA_NumSocio, Ventas.FemsaFactura.FEMSA_CentroCosto,
- Ventas.FemsaFactura.FEMSA_IPeriodoLiquidacion, Ventas.FemsaFactura.FEMSA_FPeriodoLiquidacion, Ventas.FemsaFactura.FEMSA_CodRetencion1, Ventas.FemsaFactura.FEMSA_CodRetencion2,
- Ventas.FemsaFactura.FEMSA_Mail)
- If Msg <> String.Empty Then HasErrorFEMSA = True
- End If
-
- If Not HasErrorFEMSA Then
- If Ventas.Cliente.AplicaFEMSA Then Msg = CFDi.AddendaFemsa(ObjFemsa)
- If Msg = String.Empty Then
- 'Agrega Complemento Detallista
- Dim HasErrorDetallista As Boolean = False
- If Ventas.Cliente.AplicaDetallista Then
- 'Desarrollar Detallista
- If Msg <> String.Empty Then HasErrorDetallista = True
- '1
- Msg = ObjDetallista._1_1R_requestForPaymentIdentification(ClbNegBICFDv3_3.CompDetEntityType.INVOICE)
- If Msg <> String.Empty Then HasErrorDetallista = True
- '2
- Dim LstInstruccionComercial As New List(Of String)
- LstInstruccionComercial.Add(Ventas.TotalTC.ToString.ToDouble.Texto2Letras.ToUpper)
- Msg = ObjDetallista._2_1O_SpecialInstruction(ClbNegBICFDv3_3.CompDetCode.ZZZ, LstInstruccionComercial)
- If Msg <> String.Empty Then HasErrorDetallista = True
- '3
- Msg = ObjDetallista._3_1R_OrderIdentification_ReferenceIdentification("ON", Ventas.Det_OrdenCompra)
- If Msg <> String.Empty Then HasErrorDetallista = True
- Msg = ObjDetallista._3_2O_OrderIdentification_ReferenceDate(Ventas.Det_FechaOrdenCompra.ToDate)
- If Msg <> String.Empty Then HasErrorDetallista = True
- '4
- Msg = ObjDetallista._4_1R_AdditionalInformation_ReferenceIdentification("DQ", Ventas.Det_ContraRecibo)
- If Msg <> String.Empty Then HasErrorDetallista = True
- '5
- Msg = ObjDetallista._5_1R_DeliveryNote_ReferenceIdentification(Ventas.Det_ContraRecibo)
- If Msg <> String.Empty Then HasErrorDetallista = True
- Msg = ObjDetallista._5_2O_DeliveryNote_ReferenceDate(Ventas.Det_FechaOrdenCompra.ToDate)
- If Msg <> String.Empty Then HasErrorDetallista = True
- '6
- Msg = ObjDetallista._6_1R_Buyer(Ventas.Cliente.Detallista_GLNComprador, Ventas.Cliente.Detallista_Departamento)
- If Msg <> String.Empty Then HasErrorDetallista = True
- '7
- Msg = ObjDetallista._7_1R_Seller(Ventas.Cliente.Detallista_GLNVendedor, "SELLER_ASSIGNED_IDENTIFIER_FOR_A_PARTY", Ventas.Cliente.Detallista_NumProveedor)
- If Msg <> String.Empty Then HasErrorDetallista = True
- '8
- Msg = ObjDetallista._8_1O_AllowanceCharge(ClbNegBICFDv3_3.CompDetNetAllowanceChargeType.ALLOWANCE_GLOBAL,
- ClbNegBICFDv3_3.CompDetNetSettlementType.OFF_INVOICE,
- "0",
- ClbNegBICFDv3_3.CompDetNetSpecialServicesType.AJ,
- ClbNegBICFDv3_3.CompDetNetMonetaryAmountOrPercentageBase.INVOICE_VALUE,
- If(Ventas.DescuentoTC > 0 AndAlso Ventas.SubTotalTC > 0, (Ventas.DescuentoTC * 100) / Ventas.SubTotalTC, 0))
- If Msg <> String.Empty Then HasErrorDetallista = True
- '9
- Dim LineNumber As Integer = 1
- If ObjCFDITimbre.Conceptos IsNot Nothing AndAlso ObjCFDITimbre.Conceptos.Count > 0 Then
- For Each Row As DataRow In Ventas.DtDetalle.Rows
- Dim PS As String = If(Row("PS").ToString.Length = 1, Row("Obs").ToString, If(Row("PS").ToString.Length = 0, "", Row("PS").ToString & " ") & Row("Obs").ToString & If(Row("Obs").ToString.Trim.Length > 0, vbLf, "")) & vbLf
- Msg = ObjDetallista._9_1R_LineItem("SimpleInvoidLineItemType",
- LineNumber,
- Row("Codigo").ToString,
- ClbNegBICFDv3_3.CompDetAlternateTradeItemIdentification.SUPPLIER_ASSIGNED,
- Row("Codigo").ToString,
- ClbNegBICFDv3_3.CompDetNetLanguage.ES,
- If((Row("Codigo").ToString & If(Row("Codigo").ToString.Length > 0, "-", "") & PS).Length > 35, (Row("Codigo").ToString & If(Row("Codigo").ToString.Length > 0, "-", "") & PS).Substring(0, 34), (Row("Codigo").ToString & If(Row("Codigo").ToString.Length > 0, "-", "") & PS)),
- If(Row("UM").ToString.ToLower = "no aplica", "NA", Row("UM").ToString),
- Row("Cantidad").ToString,
- Row("PU").ToString.ToDecimal,
- Row("PU").ToString.ToDecimal * (1 + Row("IVA").ToString.ToDecimal),
- Row("Cantidad").ToString.ToDecimal * Row("PU").ToString.ToDecimal,
- (Row("Cantidad").ToString.ToDecimal * Row("PU").ToString.ToDecimal) * (1 + Row("IVA").ToString.ToDecimal))
- LineNumber = LineNumber + 1
- Next
- End If
- If Msg <> String.Empty Then HasErrorDetallista = True
- '10
- Msg = ObjDetallista._10_1R_TotalAmount(Ventas.SubTotalTC)
- If Msg <> String.Empty Then HasErrorDetallista = True
- '11
- Msg = ObjDetallista._11_1R_TotalAllowanceCharge(ClbNegBICFDv3_3.CompDetNetAllowanceOrChargeType.ALLOWANCE,
- ClbNegBICFDv3_3.CompDetNetSpecialServicesType.AA,
- Ventas.DescuentoTC)
- If Msg <> String.Empty Then HasErrorDetallista = True
- End If
- If Not HasErrorDetallista Then
- If Ventas.Cliente.AplicaDetallista Then Msg = CFDi.ClomplementoDetallistaCfd(ObjDetallista)
- If Msg <> String.Empty Then HasErrorDetallista = True
- 'Timbrar
-
- 'Web Services de producción: http://biinform.com.mx/srvCFDi/service1.asmx
- 'Web Services de pruebasd: http://biinform.com.mx/srvCFDiPrueba/service1.asmx
-
-
-
-
- If Not System.IO.Directory.Exists(UsuarioActual.Empresa.Ruta & "XML\") Then System.IO.Directory.CreateDirectory(UsuarioActual.Empresa.Ruta & "XML\")
- If Not System.IO.Directory.Exists(UsuarioActual.Empresa.Ruta & "XML\" & Ventas.TipoDocto) Then System.IO.Directory.CreateDirectory(UsuarioActual.Empresa.Ruta & "XML\" & Ventas.TipoDocto)
-
- 'GENERAR TIMBRE
- CFDi.Generar(ArchivoPFX,
- UsuarioActual.Empresa.ContraseñaKey,
- ArchivoCertificado,
- $"{RutaArchivo }{NombreArchivoXML}.xml",
- UsuarioActual.Empresa.Ruta & "Certificados\",
- UsuarioServicio,
- ClaveServicio,
- UrlServicio,
- True)
-
-
- If CFDi.MsgError <> String.Empty Then
- OnError($"Ocurrió un error al generar el timbre, el mensaje del SAT fue: {CFDi.MsgError}. Emp:{UsuarioActual.CveEmpresa}. MetPag: {Ventas.ClaveMetodoPagoSAT}", New Exception(CFDi.MsgError))
- Retorno = $"Ocurrió un error al generar el timbre, el mensaje del SAT fue: {CFDi.MsgError}. Emp:{UsuarioActual.CveEmpresa}. MetPag: {Ventas.ClaveMetodoPagoSAT}"
- Else
- Dim CBB As New ClbNegBICFDv3_3.ClsNegCBBGenerar()
- Dim FechaCertificacion As DateTime
- Dim FolioFiscal, NoSerieCertificado, NoSerieCertificadoContribuyente, SelloCFDi, SelloSAT As String
-
- FolioFiscal = CFDi.Timbrado.UUDI 'XmlDoc.DocumentElement("cfdi:Complemento").FirstChild.Attributes("UUID").InnerText
- NoSerieCertificado = CFDi.Timbrado.NoCertificadoSAT
- FechaCertificacion = CFDi.Timbrado.FechaTimbrado
- SelloCFDi = CFDi.Timbrado.SelloCFD
- SelloSAT = CFDi.Timbrado.SelloSAT
- NoSerieCertificadoContribuyente = CFDi.Timbrado.NoCertificado
-
-
- Dim ObjVentas As New ClsVentas()
- If Not ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", ObjCFDITimbre.Comprobante.Fecha, Ventas.CveVenta, CvePAC:=1) Then
- Retorno = "No se pudo registrar el folio fiscal"
- End If
- ObjVentas.Dispose()
-
-
- ''Actualiza Cliente (NumeroCuenta)
- 'If Not UsuarioActual.CveEmpresa.Contiene(72, 80) Then
- ' Dim Hilo2 As New System.Threading.Thread(Sub() ActualizaCliente(UsuarioActual.CveUsuario, Ventas.Cliente.NumCtaPago, Ventas.CveMetodoPago, Ventas.CveCliente))
- ' Hilo2.Start()
- 'End If
-
-
- Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\{ObjCFDITimbre.Comprobante.SerieFolio}.jpg"
- CBB.GenerarCBB(UsuarioActual.Empresa.RFC, Ventas.Cliente.RFC, Ventas.TotalTC, FolioFiscal, RutaCBB)
-
- ''Genero la addenda de 7-Eleven
- 'If sevenElevenNumProveedor <> "" AndAlso sevenElevenFolio <> "" AndAlso sevenElevenTienda <> "" AndAlso sevenElevenFecha <> "" AndAlso sevenElevenFecha <> "__/__/____" Then
- ' Dim RutaCadena As String = $"{Ruta}XML\{Ventas.TipoDocto}\{Ventas.SerieFolio}.xml" 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio))
-
- ' GeneraAddenda7Eleven(RutaCadena, TmpDTConceptos, TmpDT7Eleven)
- 'End If
-
- 'Genero la addenda Ford
- If Ventas.Cliente.Ford_GSDB <> "" Then
-
- Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio))
-
- Dim FolioFactura As String = ""
- If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura
- GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB)
-
- End If
- End If
- Else
- Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Complemento Detallista"
- Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Complemento Detallista", New Exception)
- End If
- Else
- Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: AddendaFemsa"
- Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: AddendaFemsa", New Exception)
- End If
- Else
- Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: AddendaFemsa"
- Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: AdendaFEMSA", New Exception)
- End If
- Else
- Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: RetencionesLocales"
- Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: RetencionesLocales", New Exception)
- End If
- Else
- Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ImpuestosTrasladoCfd"
- Me.OnError("El SAT regresó el siguieente mensaje: " & Msg & ". Objeto: ImpuestosTrasladoCfd", New Exception)
- End If
-
- Else
- Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ImpuestosRetencionesCfd "
- Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ImpuestosRetencionesCfd ", New Exception)
- End If
- Else
- Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ImpuestosCfd"
- Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ImpuestosCfd", New Exception)
- End If
- Else
- Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ConceptosCfd"
- Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ConceptosCfd", New Exception)
- End If
-
- Else
- Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ReceptorCfd"
- Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ReceptorCfd", New Exception)
- End If
-
- Else
- Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: EmisorCfd"
- Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: EmisorCfd", New Exception)
- End If
- Else
- Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Comprobante"
- Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Comprobante", New Exception)
- End If
- MensajeErrorCFDI = Retorno
- Return Retorno
- End Function
- Public Function TimbrarFacturaRealVirtualv33(Ventas As Modelos.Factura, UsuarioActual As Usuario) As String
- 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
- ' 'Sucursal matriz de la empresa
- 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(UsuarioActual.Empresa.CvePAC = 2, UsuarioActual.Empresa.RFC, "rene.molina@adsistemas.mx")
- Dim ClaveServicio As String = If(UsuarioActual.Empresa.CvePAC = 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)
-
- Select Case UsuarioActual.Empresa.CvePAC
- Case 2
- UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL"
- Case 4
- UrlServicio = "http://192.168.0.2:8080/ADSistemas/Timbrado.asmx?WSDL"
- End Select
-
- If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then
-
- EmisorRFC = "AAA010101AAA"
- ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
- ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
- Clave = "12345678a"
- TimbraProduccion = False
- Select Case UsuarioActual.Empresa.CvePAC
- Case 2
- UsuarioServicio = "fgomez"
- ClaveServicio = "12121212"
- UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" '"http://108.60.211.43/rvltimbrado/service1.asmx"
- Case 4
- UsuarioServicio = "UserTest"
- ClaveServicio = "1234567890"
- UrlServicio = "http://192.168.0.2:8080/ADSistemas/Timbrado.asmx?WSDLL"
- End Select
- End If
-
-#Region "Valida"
- If Not File.Exists(ArchivoCertificado) Then
- Alert("El archivo de certificado no existe", TipoMensaje.MsgError)
- Return ""
- End If
- If Not File.Exists(ArchivoLLave) Then
- Alert("El archivo de llave privada no existe", TipoMensaje.MsgError)
- Return ""
- End If
- If UsuarioActual.Empresa.ContraseñaKey = "" Then
- Alert("La clave no puede ser vacía", TipoMensaje.MsgError)
- Return ""
- End If
-#End Region
-
-#Region "Variables"
- Dim llaveByte As Byte(), certByte As Byte()
- Dim llaveBase64 As String, certBase64 As String
- Dim cfdi As New RVCFDI33.GeneraCFDI()
- 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 ""
- 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 ""
-
- End Try
-#End Region
-
-
- sw.Stop()
- swTiempo.AppendFormat("Verificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
-
- ' cfdi.saltarValidacion("bNtMuvZockPVhEjaPj0E")
- ' cfdi.Decimales = 4
-#Region "Certificado"
- cfdi.agregarCertificado(ArchivoCertificado)
-#End Region
-
-
-#Region "Comprobante"
-
- cfdi.agregarComprobante33(
- 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.MetodoPago,
- ObjCFDITimbre.Comprobante.LugarExpedicion,
- ObjCFDITimbre.Comprobante.Confirmacion)
-
- If ObjCFDITimbre.CFDIRelacionados.TipoRelacion <> "" Then
- cfdi.agregarCfdiRelacionados(ObjCFDITimbre.CFDIRelacionados.TipoRelacion)
- For Each uid As String In ObjCFDITimbre.CFDIRelacionados.UUID
- cfdi.agregarCfdiRelacionado(uid)
- Next
- End If
-#Region "Emisor"
- ' cfdi.agregarCfdiRelacionados()
- cfdi.agregarEmisor(EmisorRFC, UsuarioActual.Empresa.Empresa, UsuarioActual.Empresa.CodigoRegimenFiscal)
-
-#End Region
-
-#Region "Receptor"
-
- cfdi.agregarReceptor(ObjCFDITimbre.Receptor.RFC, ObjCFDITimbre.Receptor.Nombre, ObjCFDITimbre.Receptor.ResidenciaFiscal, ObjCFDITimbre.Receptor.NumeroRegistroTributario, 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.agregarConcepto(concep.ClaveProdServ, concep.Noidentificacion, concep.Cantidad, concep.ClaveUnidad, concep.Unidad, concep.Descripcion, concep.ValorUnitario, concep.Importe, concep.Descuento)
- For Each imp As CFDIConceptosImpuestos In concep.Impuestos
- If imp.TrasladooRetencion = "T" Then
- cfdi.agregarImpuestoConceptoTraslado(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe)
- Else
- cfdi.agregarImpuestoConceptoRetenido(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe)
- End If
- Next
- If concep.CuentaPredial <> "" Then cfdi.agregarCuentaPredial(concep.CuentaPredial)
- Next
- End If
-
-#End Region
-
- If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E") Then
-
-#Region "Impuestos"
-
- cfdi.agregarImpuestos(ObjCFDITimbre.TotalImpuestosRetenidos, ObjCFDITimbre.TotalImpuestosTrasladados)
-
-#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.agregarRetencion(Ret.Impuesto, Ret.Importe)
- Next
- End If
-
- ''se acumulan los importes
- For Each Tras In ObjCFDITimbre.Traslados
- cfdi.agregarTraslado(Tras.Impuesto, Tras.TipoFactor, Tras.TasaOCuota, Tras.Importe)
- Next
-#End Region
-
-#Region "Impuestos Locales"
-
- If ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe) > 0 Then
- cfdi.agregarImpuestosLocales("1.0", ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe), 0)
- For Each ret As CFDIRetencionesLocales In ObjCFDITimbre.RetencionesLocales
- If ret.Importe > 0 Then
- cfdi.agregarRetencionesLocales(ret.ImpuestoLocalRetenido, ret.TasaRetencion, ret.Importe)
- End If
- Next
- End If
-
- If Ventas.CveComplementoTimbrado > 0 Then
-
- Select Case Ventas.CveComplementoTimbrado
- Case 5 'INE Proceso Ordinario Directivo Estatal"
- cfdi.agregarIne11("Ordinario", "Directivo Estatal", "0")
-
- cfdi.agregarEntidad(Ventas.ComplementoINE.INEEntidad, "")
- cfdi.agregarIneContabilidad(Ventas.ComplementoINE.INEIdContabilidad)
- Case 6 'INE Proceso Ordinario Ejecutivo Estatal"
- cfdi.agregarIne11("Ordinario", "Ejecutivo Estatal", "0")
-
- cfdi.agregarEntidad(Ventas.ComplementoINE.INEEntidad, "")
- cfdi.agregarIneContabilidad(Ventas.ComplementoINE.INEIdContabilidad)
- Case 7 'INE Proceso Ordinario Ejecutivo Nacional"
-
- cfdi.agregarIne11("Ordinario", "Ejecutivo Nacional", Ventas.ComplementoINE.INEIdContabilidad.ToString)
- Case 8 'INE PreCampaña
- cfdi.agregarIne11(Ventas.ComplementoINE.INETipoProceso, "", "0")
-
- cfdi.agregarEntidad(Ventas.ComplementoINE.INEEntidad, Ventas.ComplementoINE.INETipoComite)
- cfdi.agregarIneContabilidad(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.agregarComercioExterior11(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.agregarComercioExterior11Emisor(If(EmisorRFC.Length >= 12, "", ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CURP))
- cfdi.agregarComercioExterior11Domicilio(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.agregarComercioExterior11Receptor(ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumRegIdTrib)
- cfdi.agregarComercioExterior11DomicilioReceptor(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.agregarComercioExterior11Destinatario(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.agregarComercioExterior11Mercancia(concep.NoIdentificacion, concep.FraccionArancelaria, concep.CantidadAduana, concep.UnidadAduana, concep.ValorUnitarioAduana, concep.ValorDolares)
- If concep.DescripcionesEspecificas.Marca <> "" Then
- cfdi.agregarComercioExterior11MercanciaDescripcionesEspeciales(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 "Complemento Pago"
-
- If ObjCFDITimbre.Comprobante.TipoComprobante = "P" Then
-
- cfdi.agregarPago10(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.agregarPago10DoctoRelacionado(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.agregarPago10Impuestos(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.agregarPago10Retencion(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.agregarPago10Traslado(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.agregarNomina12(ObjCFDITimbre.Nomina.Version, ObjCFDITimbre.Nomina.TipoNomina, ObjCFDITimbre.Nomina.FechaPago.ToString, ObjCFDITimbre.Nomina.FechaInicio, ObjCFDITimbre.Nomina.FechaFin, ObjCFDITimbre.Nomina.NumDiasPagados.ToString, If(ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0, ObjCFDITimbre.Nomina.TotalPercepciones.ToString, ""), If(ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0, ObjCFDITimbre.Nomina.TotalDeducciones.ToString, ""), If(ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing AndAlso ObjCFDITimbre.Nomina.OtrosPagos.Count > 0, ObjCFDITimbre.Nomina.TotalOtrosPagos.ToString, ""))
-
- cfdi.agregarNominaEmisor12(ObjCFDITimbre.Emisor.CURP, If(ObjCFDITimbre.Nomina.Receptor.TipoContrato = "99", "", ObjCFDITimbre.Emisor.RegistroPatronal), ObjCFDITimbre.Emisor.RFC)
-
- If UsuarioActual.Empresa.UsaAC Then cfdi.agregarNominaEmisorEntidadSNCF12("IF", "90")
-
- If ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0 Then
- Dim TotalIndemnizacion As String = If(ObjCFDITimbre.Nomina.TotalIndemnizacion > 0, ObjCFDITimbre.Nomina.TotalIndemnizacion.ToString, "")
- Dim TotalJubilacion As String = If(ObjCFDITimbre.Nomina.TotalJubilacion > 0, ObjCFDITimbre.Nomina.TotalJubilacion.ToString, "")
- cfdi.agregarNominaPercepciones12(ObjCFDITimbre.Nomina.TotalSueldos.ToString, TotalIndemnizacion, TotalJubilacion, ObjCFDITimbre.Nomina.TotalPercepcionesGravado.ToString, ObjCFDITimbre.Nomina.TotalPercepcionesExento.ToString)
- For Each percep As CFDINominaPercepciones In ObjCFDITimbre.Nomina.Percepciones
- cfdi.agregarNominaPercepcionesPercepcion12(percep.TipoPercepcion, percep.Clave, percep.Concepto, Math.Round(percep.ImporteGravado, 2).ToString, Math.Round(percep.ImporteExento, 2).ToString)
- Next
- End If
- 'cfdi.agregarNominaReceptorSubContratacion12("AAD990814BP6", "50")
- 'cfdi.agregarNominaPercepcionesPercepcionAccionesOTitulos12("100", "200");
- 'cfdi.agregarNominaPercepcionesSeparacionIndemnizacion12("100", "10", "1000", "100", "50");
- 'cfdi.agregarNominaPercepcionesJubilacionPensionRetiro12("50", "100", "10", "100", "0");
-
- If ObjCFDITimbre.Nomina.HorasExtras IsNot Nothing AndAlso ObjCFDITimbre.Nomina.HorasExtras.Count > 0 Then
- For Each HoraExtra As CFDINominaHorasExtras In ObjCFDITimbre.Nomina.HorasExtras
- cfdi.agregarNominaPercepcionesPercepcionHorasExtra12(HoraExtra.Dias, HoraExtra.TipoHoras, HoraExtra.HorasExtra.ToString, HoraExtra.ImportePagado.ToString)
- Next
- 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.agregarNominaIncapacidadesIncapacidad12(Incap.DiasIncapacidad, Incap.TipoIncapacidad, Incap.Importe.ToString)
- Next
- End If
-
- If ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0 Then
- cfdi.agregarNominaDeducciones12(If(Not ObjCFDITimbre.Nomina.TotalDeduccionesOtras.ToString.ToDecimal > 0, "", ObjCFDITimbre.Nomina.TotalDeduccionesOtras.ToString), If(Not ObjCFDITimbre.Nomina.TotalDeduccionesImpuestosRetenidos.ToString.ToDecimal > 0, "", Math.Round(ObjCFDITimbre.Nomina.TotalDeduccionesImpuestosRetenidos, 2).ToString))
- For Each deduc As CFDINominaDeducciones In ObjCFDITimbre.Nomina.Deducciones
- cfdi.agregarNominaDeduccionesDeduccion12(deduc.TipoDeduccion, deduc.Clave, deduc.Concepto, Math.Round(deduc.Importe, 2).ToString)
- 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.agregarNominaOtrosPagosOtroPago12(otpag.TipoOtroPago, otpag.Clave, otpag.Concepto, otpag.Importe.ToString)
- If otpag.TipoOtroPago = "002" Then
- cfdi.agregarNominaOtrosPagosOtroPagoSubsidioAlEmpleo12(otpag.Importe.ToString)
- End If
-
- Next
- End If
- End If
-
-
-#Region "Receptor"
-
- cfdi.agregarNominaReceptor12(ObjCFDITimbre.Nomina.Receptor.CURP,
- ObjCFDITimbre.Nomina.Receptor.NSS,
- ObjCFDITimbre.Nomina.Receptor.FechaInicioContrato,
- 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.ToString,
- ObjCFDITimbre.Nomina.Receptor.SDI.ToString,
- ObjCFDITimbre.Nomina.Receptor.CodigoEntidadFederativa)
-
-
- End If
-#End Region
-
-#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.GenerarXMLBase64(llaveBase64, Clave)
- cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML)
- ArchivoGenerado = True
- Catch ex As Exception
- Retorno = cfdi.MensajeError
- MensajeErrorCFDI = cfdi.MensajeError
- End Try
-
-#End Region
- sw.Stop()
- swTiempo.AppendFormat("Guardado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
-
-#Region "Timbra"
- If ArchivoGenerado Then
-
- cfdi.TimbrarCfdi(UsuarioServicio, ClaveServicio, UrlServicio, TimbraProduccion)
-
- sw.Stop()
- swTiempo.AppendFormat("Timbrado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
- 'Verifica el error
- If cfdi.CodigoError = 0 Then
-
- 'Dim FechaCertificacion As DateTime
- Dim FolioFiscal As String
-
- UUID = cfdi.UUID
- FolioFiscal = cfdi.UUID 'obtenerAtributo(cfdi.XmlTimbrado, "TimbreFiscalDigital", "UUID") 'XmlDoc.DocumentElement("cfdi:Complemento").FirstChild.Attributes("UUID").InnerText
-
- If FolioFiscal <> "" Then
-
- File.WriteAllText(String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML), cfdi.XmlTimbrado, System.Text.UTF8Encoding.UTF8)
-
-
- If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then
-
- 'Actualiza Estatus Factura
- If Ventas.CveVenta > 0 Then
-
- Dim ObjVentas As New ClsVentas()
- If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", ObjCFDITimbre.Comprobante.Fecha, Ventas.CveVenta, CvePAC:=UsuarioActual.Empresa.CvePAC) Then
- Retorno = ""
- Else
- Retorno = "Error"
- End If
- ObjVentas.Dispose()
-
-
- ''Actualiza Cliente (NumeroCuenta)
- 'If Not UsuarioActual.CveEmpresa.Contiene(72, 80, 119) Then
- ' Dim Hilo2 As New System.Threading.Thread(Sub() ActualizaCliente(UsuarioActual.CveUsuario, Ventas.Cliente.NumCtaPago, Ventas.CveMetodoPago, Ventas.CveCliente))
- ' Hilo2.Start()
- 'End If
-
- 'Genero la addenda Ford
- If Ventas.Cliente.Ford_GSDB <> "" Then
-
- Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio))
-
- Dim FolioFactura As String = ""
- If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura
- GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB)
-
- End If
-
- End If
-
- If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then
- Using ObjNomina2 As New ClsNominas()
-
- If ObjNomina2.UpdateEstatusNomNominas(3, UsuarioActual.Empresa.CvePAC, FolioFiscal, "", ("01/01/2000").ToDate, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) Then
- Retorno = ""
- Else
- Retorno = "Error"
- End If
- End Using
- End If
-
- If ObjCFDITimbre.Comprobante.TipoComprobante = "T" Then
- Using ObjInv As New ClsInventarios()
-
- If ObjInv.UpdateMovimientoTimbrado(Ventas.Inv_CveMovimiento, 1, FolioFiscal, MinFecha) Then
- Retorno = ""
- Else
- Retorno = "Error"
- End If
- End Using
- End If
-
- End If
-
- If Not IO.Directory.Exists($"{UsuarioActual.Empresa.Ruta}CBB\") Then IO.Directory.CreateDirectory($"{UsuarioActual.Empresa.Ruta}CBB\")
-
- Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\{ObjCFDITimbre.Comprobante.SerieFolio}.jpg"
- Dim b As Byte() = cfdi.ConvertirQrCode($"?re={UsuarioActual.Empresa.RFC}&rr={ObjCFDITimbre.Receptor.RFC}&tt={String.Format("{0,12:F6}", ObjCFDITimbre.Comprobante.Total).Trim()}&id={FolioFiscal}")
- File.WriteAllBytes(RutaCBB, b)
-
- Retorno = ""
- Else
- Retorno = "No se pudo timbrar ante el SAT. UUID no generado."
- End If
- sw.Stop()
- swTiempo.AppendFormat("Actualizado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
-
- Else
- Retorno = cfdi.MensajeError
- MensajeErrorCFDI = cfdi.MensajeError
- End If
- End If
-
- GuardaLogTimbrado(swTiempo.ToString, UsuarioActual.Empresa.CvePAC)
-#End Region
- 'GC.Collect()
- Return Retorno
- End Function
- Public Function TimbrarFacturaGoCFDIv33(Ventas As Modelos.Factura, UsuarioActual As Usuario) As String
- 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
- ' 'Sucursal matriz de la empresa
- 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(UsuarioActual.Empresa.CvePAC = 2, UsuarioActual.Empresa.RFC, "rene.molina@adsistemas.mx")
- Dim ClaveServicio As String = If(UsuarioActual.Empresa.CvePAC = 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)
-
- Select Case UsuarioActual.Empresa.CvePAC
- Case 2
- UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL"
- Case 4
- UrlServicio = "http://juancalderon-001-site1.ftempurl.com/timbrado.asmx?WSDL"
- End Select
-
- If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then
-
- EmisorRFC = "AAA010101AAA"
- ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
- ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
- Clave = "12345678a"
- TimbraProduccion = False
- Select Case UsuarioActual.Empresa.CvePAC
- Case 2
- UsuarioServicio = "fgomez"
- ClaveServicio = "12121212"
- UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" '"http://108.60.211.43/rvltimbrado/service1.asmx"
- Case 4
- UsuarioServicio = "UserTest"
- ClaveServicio = "1234567890"
- UrlServicio = "http://juancalderon-001-site1.ftempurl.com/timbrado.asmx?WSDL"
- End Select
- 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.GoCfdi()
- 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()
-
- ' cfdi.saltarValidacion("bNtMuvZockPVhEjaPj0E")
- ' cfdi.Decimales = 4
-#Region "Certificado"
- cfdi.CertificadoArchivo(ArchivoCertificado)
-#End Region
-
-
- sw.Stop()
- swTiempo.AppendFormat("Certificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
-
-#Region "Comprobante"
-
- cfdi.Comprobante33(
- 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.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.ResidenciaFiscal, ObjCFDITimbre.Receptor.NumeroRegistroTributario, 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)
- For Each imp As CFDIConceptosImpuestos In concep.Impuestos
- If imp.TrasladooRetencion = "T" Then
- cfdi.ImpuestoConceptoTraslado(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe)
- Else
- cfdi.ImpuestoConceptoRetenido(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe)
- End If
- Next
- If concep.CuentaPredial <> "" Then cfdi.CuentaPredial(concep.CuentaPredial)
- Next
- End If
-
-#End Region
-
- If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E") Then
-
-#Region "Impuestos"
-
- cfdi.Impuestos(ObjCFDITimbre.TotalImpuestosRetenidos, ObjCFDITimbre.TotalImpuestosTrasladados)
-
-#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.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 "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 = "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 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))
- Next
- 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.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
-
- 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
-
- 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.Importe)
- End If
-
- Next
- End If
- 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.MensajeError
- 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
- sw.Start()
-
-#Region "Timbra"
- If ArchivoGenerado Then
-
- cfdi.TimbrarCfdi(UsuarioServicio, ClaveServicio, UrlServicio, TimbraProduccion)
-
- sw.Stop()
- swTiempo.AppendFormat("Timbrado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
- 'Verifica el error
- If cfdi.CodigoError = 0 Then
-
- Dim FolioFiscal As String
-
- UUID = cfdi.UUID
- FolioFiscal = cfdi.UUID 'obtenerAtributo(cfdi.XmlTimbrado, "TimbreFiscalDigital", "UUID") 'XmlDoc.DocumentElement("cfdi:Complemento").FirstChild.Attributes("UUID").InnerText
-
- If FolioFiscal <> "" Then
-
- cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML)
-
- If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then
-
- 'Actualiza Estatus Factura
- If Ventas.CveVenta > 0 Then
-
- Using ObjVentas As New ClsVentas()
-
- If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", ObjCFDITimbre.Comprobante.Fecha, Ventas.CveVenta, CvePAC:=UsuarioActual.Empresa.CvePAC) Then
- Retorno = ""
- Else
- Retorno = "Error"
- End If
- End Using
-
- 'Genero la addenda Ford
- If Ventas.Cliente.Ford_GSDB <> "" Then
-
- Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio))
-
- Dim FolioFactura As String = ""
- If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura
- GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB)
-
- End If
-
- End If
-
- If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then
- Using ObjNomina2 As New ClsNominas()
-
- If ObjNomina2.UpdateEstatusNomNominas(3, UsuarioActual.Empresa.CvePAC, FolioFiscal, "", ("01/01/2000").ToDate, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) Then
- Retorno = ""
- Else
- Retorno = "Error"
- End If
- End Using
- End If
-
- If ObjCFDITimbre.Comprobante.TipoComprobante = "T" Then
- Using ObjInv As New ClsInventarios()
- If ObjInv.UpdateMovimientoTimbrado(Ventas.Inv_CveMovimiento, 1, FolioFiscal, MinFecha) Then
- Retorno = ""
- Else
- Retorno = "Error"
- End If
- End Using
- End If
- End If
-
- If Not IO.Directory.Exists($"{UsuarioActual.Empresa.Ruta}CBB\") Then IO.Directory.CreateDirectory($"{UsuarioActual.Empresa.Ruta}CBB\")
-
- Try
- Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\{ObjCFDITimbre.Comprobante.SerieFolio}.jpg"
- Dim b As Byte() = cfdi.QrCode($"?re={UsuarioActual.Empresa.RFC}&rr={ObjCFDITimbre.Receptor.RFC}&tt={String.Format("{0,12:F6}", ObjCFDITimbre.Comprobante.Total).Trim()}&id={FolioFiscal}")
- File.WriteAllBytes(RutaCBB, b)
- Catch ex As Exception
- OnError("Ocurrió un error al generar el QR", ex)
- End Try
- Retorno = ""
- Else
- Retorno = "No se pudo timbrar ante el SAT. UUID no generado."
- End If
- sw.Stop()
- swTiempo.AppendFormat("Actualizado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
-
- Else
- Retorno = cfdi.MensajeError
- MensajeErrorCFDI = cfdi.MensajeError
- If cfdi.Xml <> "" Then cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML)
-
- End If
- End If
-
-#End Region
- GuardaLogTimbrado(swTiempo.ToString, UsuarioActual.Empresa.CvePAC)
- Return Retorno
- End Function
- Public Sub GuardaLogTimbrado(Str As String, CvePAC As Integer)
- Dim ArchivoW As StreamWriter
- Dim strLineaTMP As String
-
- ' strLineaTMP = Chr(13) & Chr(10) & Day(Now) & "/" & Month(Now) & "/" & Year(Now) & " " & Hour(Now) & ":" & Minuto & ". " & Str & Chr(13) & Chr(10)
- strLineaTMP = String.Format("{0}{1} .. PAC: {2} - {3} ..{4}:{5}", Chr(13), Chr(10), CvePAC, Str, DateTime.Now.ToShortDateString, DateTime.Now.ToShortTimeString)
- Try
- ArchivoW = New StreamWriter(String.Format("{0}\LogTimbrado.txt", AppDomain.CurrentDomain.BaseDirectory), True, System.Text.Encoding.UTF8)
- Catch ex As UnauthorizedAccessException
- 'Alert("No hay permisos para guardar en el Log.", Extensiones.TipoMensaje.MsgError)
- Exit Sub
- Catch ex As Exception
- Exit Sub
- End Try
-
- Try
- ArchivoW.WriteLine(strLineaTMP)
- Catch
- End Try
-
- ArchivoW.Close()
- ArchivoW.Dispose()
- End Sub
- Public Function TimbrarFacturaProFactv33(Ventas As Modelos.Factura, UsuarioActual As Usuario) As String
- Dim sw As New Diagnostics.Stopwatch
- Dim swTiempo As New StringBuilder
- Dim swmili As Long = 0
- sw.Start()
-
- Dim Retorno As String = ""
- Dim ObjCFDITimbre As CFDITimbre = Ventas.Timbre
- ' '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 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
- 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"
- UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" '"http://108.60.211.43/rvltimbrado/service1.asmx"
- End If
-
-
-#Region "Valida"
- If Not File.Exists(ArchivoCertificado) Then
- Alert("El archivo de certificado no existe", TipoMensaje.MsgError)
- Return ""
- End If
- If Not File.Exists(ArchivoLLave) Then
- Alert("El archivo de llave privada no existe", TipoMensaje.MsgError)
- Return ""
- End If
- If UsuarioActual.Empresa.ContraseñaKey = "" Then
- Alert("La clave no puede ser vacía", TipoMensaje.MsgError)
- Return ""
- End If
-#End Region
-
-#Region "Variables"
- Dim llaveByte As Byte(), certByte As Byte()
- Dim llaveBase64 As String, certBase64 As String
-
- Dim complemento As String = ""
- Dim complementoConcepto As String = ""
- '//Inicializamos el conector el parámetro indica el ambiente en el que se utilizará
- '//Fasle = Ambiente de pruebas
- '//True = Ambiente de producción
- Dim cfdi As New Profact.TimbraCFDI33.Conector(AmbienteProductivo)
- Dim comprobante As New Profact.TimbraCFDI33.Comprobante()
-
- If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then
- cfdi.EstableceCredenciales("mvpNUXmQfK8=")
- Else
- cfdi.EstableceCredenciales($"vSGxMFWnNRy/nDoowxqrqw==|Sia123654")
- End If
-
-#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 ""
- 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 ""
-
- End Try
- sw.Stop()
- swTiempo.AppendFormat("Verificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
-#End Region
-
-
-#Region "Comprobante"
-
-
- If ObjCFDITimbre.Comprobante.Serie <> "" Then comprobante.Serie = ObjCFDITimbre.Comprobante.Serie
- comprobante.Folio = ObjCFDITimbre.Comprobante.Folio
- comprobante.Version = "3.3"
- comprobante.Fecha = ObjCFDITimbre.Comprobante.Fecha
- comprobante.FormaPago = ObjCFDITimbre.Comprobante.FormadePago
- If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then comprobante.CondicionesDePago = ObjCFDITimbre.Comprobante.CondicionesdePago
-
- comprobante.SubTotal = ObjCFDITimbre.Comprobante.Subtotal
- If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then
- comprobante.DescuentoSpecified = True
- comprobante.Descuento = ObjCFDITimbre.Comprobante.Descuentos
- End If
- comprobante.Moneda = ObjCFDITimbre.Comprobante.Moneda
- comprobante.TipoCambio = ObjCFDITimbre.Comprobante.TipoCambio.ToDecimal
- comprobante.TipoCambioSpecified = If(ObjCFDITimbre.Comprobante.Moneda <> "XXX", True, False)
- comprobante.Total = ObjCFDITimbre.Comprobante.Total
- comprobante.TipoDeComprobante = ObjCFDITimbre.Comprobante.TipoComprobante
- comprobante.FormaPagoSpecified = If(ObjCFDITimbre.Comprobante.FormadePago <> "", True, False)
- comprobante.MetodoPago = ObjCFDITimbre.Comprobante.MetodoPago
- comprobante.MetodoPagoSpecified = If(ObjCFDITimbre.Comprobante.MetodoPago <> "", True, False)
- comprobante.LugarExpedicion = ObjCFDITimbre.Comprobante.LugarExpedicion
-
-#Region "Emisor"
- comprobante.Emisor = New Profact.TimbraCFDI33.ComprobanteEmisor()
- comprobante.Emisor.Rfc = EmisorRFC
- comprobante.Emisor.Nombre = UsuarioActual.Empresa.Empresa
- comprobante.Emisor.RegimenFiscal = UsuarioActual.Empresa.CodigoRegimenFiscal
-
-#End Region
-
-#Region "Receptor"
- comprobante.Receptor = New Profact.TimbraCFDI33.ComprobanteReceptor()
- comprobante.Receptor.Rfc = ObjCFDITimbre.Receptor.RFC
- comprobante.Receptor.Nombre = ObjCFDITimbre.Receptor.Nombre
- comprobante.Receptor.UsoCFDI = ObjCFDITimbre.Receptor.UsoCFDI
-
-#End Region
-
-#End Region
-
-#Region "Conceptos"
-
- 'Nodo conceptos, se agregan los PS
- comprobante.Conceptos = New Profact.TimbraCFDI33.ComprobanteConcepto(ObjCFDITimbre.Conceptos.Count - 1) {}
-
- If ObjCFDITimbre.Conceptos IsNot Nothing AndAlso ObjCFDITimbre.Conceptos.Count > 0 Then
- Dim i As Integer = 0
- Dim j As Integer = 0
- Dim k As Integer = 0
- For Each concep As CFDIConceptos In ObjCFDITimbre.Conceptos
- comprobante.Conceptos(i) = New Profact.TimbraCFDI33.ComprobanteConcepto()
- comprobante.Conceptos(i).Cantidad = concep.Cantidad
-
- 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).Importe = concep.Importe
- comprobante.Conceptos(i).ClaveProdServ = concep.ClaveProdServ
-
- If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then
- comprobante.Conceptos(i).Descuento = concep.Descuento
- comprobante.Conceptos(i).DescuentoSpecified = True
- End If
-
- If concep.Noidentificacion <> "" Then comprobante.Conceptos(i).NoIdentificacion = concep.Noidentificacion
-
- j = 0
- k = 0
- If Not ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("P", "N") Then
- comprobante.Conceptos(i).Impuestos = New Profact.TimbraCFDI33.ComprobanteConceptoImpuestos()
- comprobante.Conceptos(i).Impuestos.Traslados = New Profact.TimbraCFDI33.ComprobanteConceptoImpuestosTraslado(concep.Impuestos.FindAll(Function(p As CFDIConceptosImpuestos) p.TrasladooRetencion = "T").Count - 1) {}
- If concep.Impuestos.FindAll(Function(p As CFDIConceptosImpuestos) p.TrasladooRetencion <> "T").Count > 0 Then
- comprobante.Conceptos(i).Impuestos.Retenciones = New Profact.TimbraCFDI33.ComprobanteConceptoImpuestosRetencion(concep.Impuestos.FindAll(Function(p As CFDIConceptosImpuestos) p.TrasladooRetencion <> "T").Count - 1) {}
-
- End If
- For Each imp As CFDIConceptosImpuestos In concep.Impuestos
- If imp.TrasladooRetencion = "T" Then
- comprobante.Conceptos(i).Impuestos.Traslados(j) = New Profact.TimbraCFDI33.ComprobanteConceptoImpuestosTraslado()
- comprobante.Conceptos(i).Impuestos.Traslados(j).Base = imp.Base
- comprobante.Conceptos(i).Impuestos.Traslados(j).Impuesto = imp.Impuesto
- comprobante.Conceptos(i).Impuestos.Traslados(j).TipoFactor = imp.TipoFactor
- comprobante.Conceptos(i).Impuestos.Traslados(j).Importe = imp.Importe
- comprobante.Conceptos(i).Impuestos.Traslados(j).ImporteSpecified = True
- comprobante.Conceptos(i).Impuestos.Traslados(j).TasaOCuota = imp.TasaOCuota.FormatoNumero(6)
- comprobante.Conceptos(i).Impuestos.Traslados(j).TasaOCuotaSpecified = True
- j += 1
- Else
- comprobante.Conceptos(i).Impuestos.Retenciones(k) = New Profact.TimbraCFDI33.ComprobanteConceptoImpuestosRetencion()
- comprobante.Conceptos(i).Impuestos.Retenciones(k).Base = imp.Base
- comprobante.Conceptos(i).Impuestos.Retenciones(k).Impuesto = imp.Impuesto
- comprobante.Conceptos(i).Impuestos.Retenciones(k).TipoFactor = imp.TipoFactor
- comprobante.Conceptos(i).Impuestos.Retenciones(k).Importe = imp.Importe
- comprobante.Conceptos(i).Impuestos.Retenciones(k).TasaOCuota = imp.TasaOCuota.ToString.ToDecimal
- k += 1
- End If
- Next
- End If
- i += 1
- Next
- End If
-
-#End Region
-
-
- Dim LXmlComplementos As New List(Of XmlElement)()
- Dim TieneComplemento As Boolean = False
-
- If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E") Then
-
-#Region "Impuestos"
-
-
- comprobante.Impuestos = New Profact.TimbraCFDI33.ComprobanteImpuestos()
- comprobante.Impuestos.Traslados = New Profact.TimbraCFDI33.ComprobanteImpuestosTraslado(ObjCFDITimbre.Traslados.Count - 1) {}
-
- Dim y As Integer = 0
-
- For Each Tras In ObjCFDITimbre.Traslados
- comprobante.Impuestos.Traslados(y) = New Profact.TimbraCFDI33.ComprobanteImpuestosTraslado()
- comprobante.Impuestos.Traslados(y).Impuesto = Tras.Impuesto
- comprobante.Impuestos.Traslados(y).TipoFactor = Tras.TipoFactor
- comprobante.Impuestos.Traslados(y).TasaOCuota = Tras.TasaOCuota.FormatoNumero(6)
- comprobante.Impuestos.Traslados(y).Importe = Tras.Importe
- y += 1
- Next
-
- comprobante.Impuestos.TotalImpuestosTrasladados = ObjCFDITimbre.TotalImpuestosTrasladados
- comprobante.Impuestos.TotalImpuestosTrasladadosSpecified = True
-
- If ObjCFDITimbre.TotalImpuestosRetenidos > 0 Then
- comprobante.Impuestos.Retenciones = New Profact.TimbraCFDI33.ComprobanteImpuestosRetencion(ObjCFDITimbre.Retenciones.Count - 1) {}
-
- Dim w As Integer = 0
-
- 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
- w += 1
- Next
-
- comprobante.Impuestos.TotalImpuestosRetenidos = ObjCFDITimbre.TotalImpuestosRetenidos
- comprobante.Impuestos.TotalImpuestosRetenidosSpecified = True
- End If
-
-
-
-#End Region
-
-
-#Region "Impuestos Locales"
-
-
- If ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe) > 0 Then
- Dim Imp = New Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocales()
- Imp.version = "1.0"
- Imp.TotaldeRetenciones = ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe).FormatoNumero().ToDecimal
- Imp.TotaldeTraslados = 0
- Imp.RetencionesLocales = New Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocalesRetencionesLocales(ObjCFDITimbre.RetencionesLocales.Count - 1) {}
- Dim i As Integer = 0
- For Each ret As CFDIRetencionesLocales In ObjCFDITimbre.RetencionesLocales
- If ret.Importe > 0 Then
- Imp.RetencionesLocales(i) = New Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocalesRetencionesLocales()
- Imp.RetencionesLocales(i).ImpLocRetenido = ret.ImpuestoLocalRetenido
- Imp.RetencionesLocales(i).TasadeRetencion = ret.TasaRetencion.FormatoNumero().ToDecimal
- Imp.RetencionesLocales(i).Importe = ret.Importe.FormatoNumero().ToDecimal
- i += 1
- End If
- Next
-
- Dim nsImpLocal As New System.Xml.Serialization.XmlSerializerNamespaces()
- nsImpLocal.Add("implocal", "http://www.sat.gob.mx/implocal")
- Dim xmlImpLocal As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(Imp, GetType(Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocales), nsImpLocal)
- Dim docImpLocal As New XmlDocument()
- docImpLocal.LoadXml(xmlImpLocal)
- LXmlComplementos.Add(docImpLocal.DocumentElement)
- comprobante.ImpLocalSpecified = True
- TieneComplemento = True
- 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
- Dim ComExt = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExterior()
- ComExt.Version = "1.1"
- ComExt.MotivoTrasladoSpecified = True
- ComExt.MotivoTraslado = ObjCFDITimbre.Complementos.ComercioExterior11.MotivoTraslado
- ComExt.TipoOperacion = ObjCFDITimbre.Complementos.ComercioExterior11.TipoOperacion
- ComExt.ClaveDePedimentoSpecified = True
- ComExt.ClaveDePedimento = ObjCFDITimbre.Complementos.ComercioExterior11.ClavedePedimento
- ComExt.CertificadoOrigenSpecified = True
- ComExt.CertificadoOrigen = ObjCFDITimbre.Complementos.ComercioExterior11.CertificadoOrigen.ToEntero
- If ObjCFDITimbre.Complementos.ComercioExterior11.NumCertificadoOrigen <> "" Then
- ComExt.NumCertificadoOrigen = ObjCFDITimbre.Complementos.ComercioExterior11.NumCertificadoOrigen
- End If
- If ObjCFDITimbre.Complementos.ComercioExterior11.NumeroExportadorConfiable <> "" Then
- ComExt.NumeroExportadorConfiable = ObjCFDITimbre.Complementos.ComercioExterior11.NumeroExportadorConfiable
- End If
- ComExt.IncotermSpecified = True
- ComExt.Incoterm = ObjCFDITimbre.Complementos.ComercioExterior11.Incoterm
- ComExt.SubdivisionSpecified = True
- ComExt.Subdivision = ObjCFDITimbre.Complementos.ComercioExterior11.Subdivision.ToEntero
- If ObjCFDITimbre.Complementos.ComercioExterior11.Observaciones <> "" Then
- ComExt.Observaciones = ObjCFDITimbre.Complementos.ComercioExterior11.Observaciones
- End If
- ComExt.TipoCambioUSDSpecified = True
- ComExt.TipoCambioUSD = ObjCFDITimbre.Complementos.ComercioExterior11.TipoCambioUSD
- ComExt.TotalUSDSpecified = True
- ComExt.TotalUSD = ObjCFDITimbre.Complementos.ComercioExterior11.TotalUSD
-
- 'EMISOR
- ComExt.Emisor = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorEmisor()
- If EmisorRFC.Length < 12 Then
- ComExt.Emisor.Curp = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CURP
- End If
- ComExt.Emisor.Domicilio = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorEmisorDomicilio
- ComExt.Emisor.Domicilio.Calle = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Calle
- ComExt.Emisor.Domicilio.CodigoPostal = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CP
- ComExt.Emisor.Domicilio.ColoniaSpecified = True
- ComExt.Emisor.Domicilio.Colonia = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Colonia
- ComExt.Emisor.Domicilio.Estado = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Estado
- If ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Localidad <> "" Then
- ComExt.Emisor.Domicilio.LocalidadSpecified = False
- ComExt.Emisor.Domicilio.Localidad = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Localidad
- End If
- ComExt.Emisor.Domicilio.MunicipioSpecified = True
- ComExt.Emisor.Domicilio.Municipio = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Municipio
- ComExt.Emisor.Domicilio.NumeroExterior = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.NumeroExterior
- ComExt.Emisor.Domicilio.NumeroInterior = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.NumeroInterior
- ComExt.Emisor.Domicilio.Pais = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Pais
- If ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Referencia <> "" Then
- ComExt.Emisor.Domicilio.Referencia = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Referencia
- End If
-
- 'RECEPTOR
- ComExt.Receptor = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorReceptor
- If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumRegIdTrib <> "" Then
- ComExt.Receptor.NumRegIdTrib = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumRegIdTrib
- End If
- ComExt.Receptor.Domicilio = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorReceptorDomicilio
- ComExt.Receptor.Domicilio.Calle = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Calle
- ComExt.Receptor.Domicilio.CodigoPostal = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.CP
- If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Colonia <> "" Then
- ComExt.Receptor.Domicilio.Colonia = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Colonia
- End If
- ComExt.Receptor.Domicilio.Estado = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Estado
- If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Localidad <> "" Then
- ComExt.Receptor.Domicilio.Localidad = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Localidad
- End If
- If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Municipio <> "" Then
- ComExt.Receptor.Domicilio.Municipio = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Municipio
- End If
- If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroExterior <> "" Then
- ComExt.Receptor.Domicilio.NumeroExterior = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroExterior
- End If
- If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroInterior <> "" Then
- ComExt.Receptor.Domicilio.NumeroInterior = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroInterior
- End If
- ComExt.Receptor.Domicilio.Pais = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Pais
- If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Referencia <> "" Then
- ComExt.Receptor.Domicilio.Referencia = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Referencia
- End If
-
- 'DESTINATARIO
- ComExt.Destinatario = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatario(0) {}
- ComExt.Destinatario(0) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatario()
- ComExt.Destinatario(0).Nombre = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Nombre
- If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumRegIdTrib <> "" Then
- ComExt.Destinatario(0).NumRegIdTrib = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumRegIdTrib
- End If
- ComExt.Destinatario(0).Domicilio = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatarioDomicilio(0) {}
- ComExt.Destinatario(0).Domicilio(0) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatarioDomicilio()
- ComExt.Destinatario(0).Domicilio(0).Calle = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Calle
- ComExt.Destinatario(0).Domicilio(0).CodigoPostal = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.CP
- If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Colonia <> "" Then
- ComExt.Destinatario(0).Domicilio(0).Colonia = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Colonia
- End If
- ComExt.Destinatario(0).Domicilio(0).Estado = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Estado
- If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Localidad <> "" Then
- ComExt.Destinatario(0).Domicilio(0).Localidad = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Localidad
- End If
- If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Municipio <> "" Then
- ComExt.Destinatario(0).Domicilio(0).Municipio = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Municipio
- End If
- If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroExterior <> "" Then
- ComExt.Destinatario(0).Domicilio(0).NumeroExterior = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroExterior
- End If
- If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroInterior <> "" Then
- ComExt.Destinatario(0).Domicilio(0).NumeroInterior = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroInterior
- End If
- ComExt.Destinatario(0).Domicilio(0).Pais = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Pais
- If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Referencia <> "" Then
- ComExt.Destinatario(0).Domicilio(0).Referencia = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Referencia
- End If
-
- 'MERCANCIAS
- If ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias IsNot Nothing AndAlso ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias.Count > 0 Then
- ComExt.Mercancias = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercancia(ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias.Count - 1) {}
- Dim i As Integer
- For Each concep As CFDIComercioExterior11Mercancias In ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias
- ComExt.Mercancias(i) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercancia()
- ComExt.Mercancias(i).NoIdentificacion = concep.NoIdentificacion
- ComExt.Mercancias(i).FraccionArancelariaSpecified = True
- ComExt.Mercancias(i).FraccionArancelaria = concep.FraccionArancelaria
- ComExt.Mercancias(i).CantidadAduanaSpecified = True
- ComExt.Mercancias(i).CantidadAduana = concep.CantidadAduana
- ComExt.Mercancias(i).UnidadAduanaSpecified = True
- ComExt.Mercancias(i).UnidadAduana = concep.UnidadAduana
- ComExt.Mercancias(i).ValorUnitarioAduanaSpecified = True
- ComExt.Mercancias(i).ValorUnitarioAduana = concep.ValorUnitarioAduana
- ComExt.Mercancias(i).ValorDolares = concep.ValorDolares
- If concep.DescripcionesEspecificas.Marca <> "" Then
- ComExt.Mercancias(i).DescripcionesEspecificas = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercanciaDescripcionesEspecificas(0) {}
- ComExt.Mercancias(i).DescripcionesEspecificas(0) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercanciaDescripcionesEspecificas()
- If concep.DescripcionesEspecificas.Marca <> "" Then
- ComExt.Mercancias(i).DescripcionesEspecificas(0).Marca = concep.DescripcionesEspecificas.Marca
- End If
- If concep.DescripcionesEspecificas.Modelo <> "" Then
- ComExt.Mercancias(i).DescripcionesEspecificas(0).Modelo = concep.DescripcionesEspecificas.Modelo
- End If
- If concep.DescripcionesEspecificas.SubModelo <> "" Then
- ComExt.Mercancias(i).DescripcionesEspecificas(0).SubModelo = concep.DescripcionesEspecificas.SubModelo
- End If
- If concep.DescripcionesEspecificas.NumeroSerie <> "" Then
- ComExt.Mercancias(i).DescripcionesEspecificas(0).NumeroSerie = concep.DescripcionesEspecificas.NumeroSerie
- End If
- End If
- i += 1
- Next
- End If
- Dim nsComer As New System.Xml.Serialization.XmlSerializerNamespaces()
- nsComer.Add("cce11", "http://www.sat.gob.mx/ComercioExterior11")
- Dim xmlComer As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(ComExt, GetType(Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExterior), nsComer)
- Dim docComer As New XmlDocument()
- docComer.LoadXml(xmlComer)
- LXmlComplementos.Add(docComer.DocumentElement)
- comprobante.ComercioExterior11Specified = True
- TieneComplemento = True
- End If
- End If
-
-#End Region
-
-
-
-
-
-
- End If
-
-#Region "Complemento Pago"
-
- If ObjCFDITimbre.Comprobante.TipoComprobante = "P" Then
- Dim ComPag = New Profact.TimbraCFDI33.Complementos.Pagos10.Pagos()
- ComPag.Pago = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPago(0) {}
- ComPag.Pago(0) = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPago()
- 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).TipoCadPagoSpecified = If(ObjCFDITimbre.ComplementoPagos.MonedaP = "MXN", False, True)
- ComPag.Pago(0).TipoCambioP = ObjCFDITimbre.ComplementoPagos.TipoCambioP.ToDecimal
- ComPag.Pago(0).Monto = ObjCFDITimbre.ComplementoPagos.Monto.ToDecimal
- If ObjCFDITimbre.ComplementoPagos.NumOperacion <> "" Then
- ComPag.Pago(0).NumOperacion = ObjCFDITimbre.ComplementoPagos.NumOperacion
- End If
- If ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaOrd <> "" Then
- ComPag.Pago(0).RfcEmisorCtaOrd = ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaOrd
- End If
- If ObjCFDITimbre.ComplementoPagos.NomBancoOrdExt <> "" Then
- ComPag.Pago(0).NomBancoOrdExt = ObjCFDITimbre.ComplementoPagos.NomBancoOrdExt
- End If
- If ObjCFDITimbre.ComplementoPagos.CtaOrdenante <> "" Then
- ComPag.Pago(0).CtaOrdenante = ObjCFDITimbre.ComplementoPagos.CtaOrdenante
- End If
- If ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaBen <> "" Then
- ComPag.Pago(0).RfcEmisorCtaBen = ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaBen
- End If
- If ObjCFDITimbre.ComplementoPagos.CtaBeneficiario <> "" Then
- ComPag.Pago(0).CtaBeneficiario = ObjCFDITimbre.ComplementoPagos.CtaBeneficiario
- End If
- ComPag.Pago(0).TipoCadPago = ObjCFDITimbre.ComplementoPagos.TipoCadPago
- If ObjCFDITimbre.ComplementoPagos.CertPago <> "" Then
- 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).ToString
- End If
-
- If ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count > 0 Then
- ComPag.Pago(0).DoctoRelacionado = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoDoctoRelacionado(ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count - 1) {}
- Dim i As Integer
- For Each doc As CFDIComplementoPagosDocsRelacionados In ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados
- ComPag.Pago(0).DoctoRelacionado(i) = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoDoctoRelacionado()
- ComPag.Pago(0).DoctoRelacionado(i).IdDocumento = doc.IdDocumento
- If Not String.IsNullOrEmpty(doc.Serie) Then
- ComPag.Pago(0).DoctoRelacionado(i).Serie = doc.Serie
- End If
- ComPag.Pago(0).DoctoRelacionado(i).Folio = doc.Folio
- ComPag.Pago(0).DoctoRelacionado(i).MonedaDR = doc.MonedaDR
- ComPag.Pago(0).DoctoRelacionado(i).TipoCambioDRSpecified = If(doc.TipoCambioDR.ToDecimal = 0, False, True)
- ComPag.Pago(0).DoctoRelacionado(i).TipoCambioDR = doc.TipoCambioDR.ToDecimal
- 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).ImpPagadoSpecified = True
- ComPag.Pago(0).DoctoRelacionado(i).ImpPagado = doc.ImpPagado.ToDecimal
-
- ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsolutoSpecified = True
- ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsoluto = doc.ImpSaldoInsoluto.ToDecimal
- i += 1
- Next
-
- 'Estos impuestos aplicarían para anticipos
- If ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos > 0 OrElse ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados > 0 Then
- 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).TotalImpuestosTrasladadosSpecified = True
- ComPag.Pago(0).Impuestos(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).Impuestos(0).Retenciones = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoImpuestosRetencion((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).Impuestos(0).Retenciones(x) = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoImpuestosRetencion()
- ComPag.Pago(0).Impuestos(0).Retenciones(x).Impuesto = Ret.Impuesto
- ComPag.Pago(0).Impuestos(0).Retenciones(x).Importe = 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).Impuestos(0).Traslados = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoImpuestosTraslado((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).Impuestos(0).Traslados(x) = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoImpuestosTraslado()
- ComPag.Pago(0).Impuestos(0).Traslados(x).Impuesto = Tra.Impuesto
- ComPag.Pago(0).Impuestos(0).Traslados(x).TipoFactor = Tra.TipoFactor
- ComPag.Pago(0).Impuestos(0).Traslados(x).TasaOCuota = Tra.TasaOCuota.ToString
- ComPag.Pago(0).Impuestos(0).Traslados(x).Importe = Tra.Importe
- x += 1
- Next
- End If
-
- End If
-
-
- Dim nsComp As New System.Xml.Serialization.XmlSerializerNamespaces()
- nsComp.Add("pago10", "http://www.sat.gob.mx/Pagos")
- Dim xmlComp As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(ComPag, GetType(Profact.TimbraCFDI33.Complementos.Pagos10.Pagos), nsComp)
- Dim docComp As New XmlDocument()
- docComp.LoadXml(xmlComp)
- comprobante.PagosSpecified = True
- LXmlComplementos.Add(docComp.DocumentElement)
- TieneComplemento = True
- End If
-
- End If
-#End Region
-
-#Region "Nomina12"
- If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then
- Dim Nom = New Profact.TimbraCFDI33.Complementos.Nomina12.Nomina()
- 'cfdi.Esquema.AgregarEsquema("http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd")
- Nom.Version = ObjCFDITimbre.Nomina.Version
- Nom.TipoNomina = ObjCFDITimbre.Nomina.TipoNomina
- Nom.FechaPago = ObjCFDITimbre.Nomina.FechaPago
- Nom.FechaInicialPago = ObjCFDITimbre.Nomina.FechaInicio.ToDate
- Nom.FechaFinalPago = ObjCFDITimbre.Nomina.FechaFin.ToDate
- Nom.NumDiasPagados = ObjCFDITimbre.Nomina.NumDiasPagados.ToString
- Nom.TotalPercepcionesSpecified = True
- Nom.TotalPercepciones = ObjCFDITimbre.Nomina.TotalPercepciones.ToDecimal
- Nom.TotalDeduccionesSpecified = True
- Nom.TotalDeducciones = ObjCFDITimbre.Nomina.TotalDeducciones.ToDecimal
- Nom.TotalOtrosPagosSpecified = True
- Nom.TotalOtrosPagos = ObjCFDITimbre.Nomina.TotalOtrosPagos.ToDecimal
-
- Nom.Emisor = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaEmisor
- Nom.Emisor.Curp = ObjCFDITimbre.Emisor.CURP
- Nom.Emisor.RegistroPatronal = ObjCFDITimbre.Emisor.RegistroPatronal
- Nom.Emisor.RfcPatronOrigen = ObjCFDITimbre.Emisor.RFC
-
- If UsuarioActual.Empresa.UsaAC Then Nom.Emisor.EntidadSNCF.OrigenRecurso = "IF" : Nom.Emisor.EntidadSNCF.MontoRecursoPropio = 90
-
- If ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0 Then
- Dim TotalIndemnizacion As String = If(ObjCFDITimbre.Nomina.TotalIndemnizacion > 0, ObjCFDITimbre.Nomina.TotalIndemnizacion.ToString, "")
- Dim TotalJubilacion As String = If(ObjCFDITimbre.Nomina.TotalJubilacion > 0, ObjCFDITimbre.Nomina.TotalJubilacion.ToString, "")
- Nom.Percepciones = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepciones
- Nom.Percepciones.TotalSueldosSpecified = True
- Nom.Percepciones.TotalSueldos = ObjCFDITimbre.Nomina.TotalSueldos.ToDecimal
- Nom.Percepciones.TotalSeparacionIndemnizacionSpecified = True
- Nom.Percepciones.TotalSeparacionIndemnizacion = TotalIndemnizacion.ToDecimal
- Nom.Percepciones.TotalJubilacionPensionRetiroSpecified = True
- Nom.Percepciones.TotalJubilacionPensionRetiro = TotalJubilacion.ToDecimal
- Nom.Percepciones.TotalGravado = ObjCFDITimbre.Nomina.TotalPercepcionesGravado.ToDecimal
- Nom.Percepciones.TotalExento = ObjCFDITimbre.Nomina.TotalPercepcionesExento.ToDecimal
- Nom.Percepciones.Percepcion = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcion(ObjCFDITimbre.Nomina.Percepciones.Count - 1) {}
- Dim i As Integer = 0
- For Each percep As CFDINominaPercepciones In ObjCFDITimbre.Nomina.Percepciones
- Nom.Percepciones.Percepcion(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcion()
- Nom.Percepciones.Percepcion(i).TipoPercepcion = percep.TipoPercepcion
- Nom.Percepciones.Percepcion(i).Clave = percep.Clave
- Nom.Percepciones.Percepcion(i).Concepto = percep.Concepto
- Nom.Percepciones.Percepcion(i).ImporteGravado = Math.Round(percep.ImporteGravado, 2).ToString.ToDecimal
- Nom.Percepciones.Percepcion(i).ImporteExento = Math.Round(percep.ImporteExento, 2).ToString.ToDecimal
-
- If ObjCFDITimbre.Nomina.HorasExtras IsNot Nothing AndAlso ObjCFDITimbre.Nomina.HorasExtras.Count > 0 Then
- Nom.Percepciones.Percepcion(i).HorasExtra = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcionHorasExtra(ObjCFDITimbre.Nomina.HorasExtras.Count - 1) {}
- Dim x As Integer = 0
- For Each HoraExtra As CFDINominaHorasExtras In ObjCFDITimbre.Nomina.HorasExtras
- Nom.Percepciones.Percepcion(i).HorasExtra(x) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcionHorasExtra()
- Nom.Percepciones.Percepcion(i).HorasExtra(x).Dias = HoraExtra.Dias.ToEntero
- Nom.Percepciones.Percepcion(i).HorasExtra(x).TipoHoras = HoraExtra.TipoHoras
- Nom.Percepciones.Percepcion(i).HorasExtra(x).HorasExtra = HoraExtra.HorasExtra.ToEntero
- Nom.Percepciones.Percepcion(i).HorasExtra(x).ImportePagado = HoraExtra.ImportePagado.ToDecimal
- x += 1
- Next
- End If
-
- i += 1
- Next
- End If
- 'cfdi.agregarNominaReceptorSubContratacion12("AAD990814BP6", "50")
- 'cfdi.agregarNominaPercepcionesPercepcionAccionesOTitulos12("100", "200");
- 'cfdi.agregarNominaPercepcionesSeparacionIndemnizacion12("100", "10", "1000", "100", "50");
- 'cfdi.agregarNominaPercepcionesJubilacionPensionRetiro12("50", "100", "10", "100", "0");
-
-
-
- If ObjCFDITimbre.Nomina.Incapacidades IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Incapacidades.Count > 0 Then
- Nom.Incapacidades = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaIncapacidad(ObjCFDITimbre.Nomina.Incapacidades.Count - 1) {}
- Dim i As Integer = 0
- For Each Incap As CFDINominaIncapacidades In ObjCFDITimbre.Nomina.Incapacidades
- Nom.Incapacidades(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaIncapacidad()
- Nom.Incapacidades(i).DiasIncapacidad = Incap.DiasIncapacidad.ToEntero
- Nom.Incapacidades(i).TipoIncapacidad = Incap.TipoIncapacidad
- Nom.Incapacidades(i).ImporteMonetarioSpecified = True
- Nom.Incapacidades(i).ImporteMonetario = Incap.Importe.ToDecimal
- i += 1
- Next
- End If
-
- If ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0 Then
- Nom.Deducciones = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaDeducciones()
- Nom.Deducciones.TotalOtrasDeduccionesSpecified = True
- Nom.Deducciones.TotalOtrasDeducciones = Math.Round(ObjCFDITimbre.Nomina.TotalDeduccionesOtras, 2)
- Nom.Deducciones.TotalImpuestosRetenidosSpecified = True
- Nom.Deducciones.TotalImpuestosRetenidos = Math.Round(ObjCFDITimbre.Nomina.TotalDeduccionesImpuestosRetenidos, 2)
- Nom.Deducciones.Deduccion = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaDeduccionesDeduccion(ObjCFDITimbre.Nomina.Deducciones.Count - 1) {}
- Dim i As Integer = 0
- For Each deduc As CFDINominaDeducciones In ObjCFDITimbre.Nomina.Deducciones
- Nom.Deducciones.Deduccion(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaDeduccionesDeduccion()
- Nom.Deducciones.Deduccion(i).TipoDeduccion = deduc.TipoDeduccion
- Nom.Deducciones.Deduccion(i).Clave = deduc.Clave
- Nom.Deducciones.Deduccion(i).Concepto = deduc.Concepto
- Nom.Deducciones.Deduccion(i).Importe = Math.Round(deduc.Importe, 2)
- i += 1
- 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
- Nom.OtrosPagos = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaOtroPago(ObjCFDITimbre.Nomina.OtrosPagos.Count - 1) {}
- Dim i As Integer = 0
- For Each otpag As CFDINominaOtrosPagos In ObjCFDITimbre.Nomina.OtrosPagos
- Nom.OtrosPagos(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaOtroPago()
- Nom.OtrosPagos(i).TipoOtroPago = otpag.TipoOtroPago
- Nom.OtrosPagos(i).Clave = otpag.Clave
- Nom.OtrosPagos(i).Concepto = otpag.Concepto
- Nom.OtrosPagos(i).Importe = otpag.Importe.ToDecimal
- If otpag.TipoOtroPago = "002" Then
- Nom.OtrosPagos(i).SubsidioAlEmpleo = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaOtroPagoSubsidioAlEmpleo()
- Nom.OtrosPagos(i).SubsidioAlEmpleo.SubsidioCausado = otpag.Importe.ToDecimal
- End If
- i += 1
- Next
- End If
- End If
-
-
-#Region "Receptor"
- Nom.Receptor = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaReceptor()
- Nom.Receptor.Curp = ObjCFDITimbre.Nomina.Receptor.CURP
- Nom.Receptor.NumSeguridadSocial = ObjCFDITimbre.Nomina.Receptor.NSS
- Nom.Receptor.FechaInicioRelLaboralSpecified = True
- Nom.Receptor.FechaInicioRelLaboral = ObjCFDITimbre.Nomina.Receptor.FechaInicioContrato.ToDate
- Nom.Receptor.Antigüedad = ObjCFDITimbre.Nomina.Receptor.Antiguedad
- Nom.Receptor.TipoContrato = ObjCFDITimbre.Nomina.Receptor.TipoContrato
- 'Nom.Receptor.Sindicalizado = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaReceptorSindicalizado()
- 'Nom.Receptor.Sindicalizado = ObjCFDITimbre.Nomina.Receptor.Sindicalizado
- Nom.Receptor.TipoJornadaSpecified = True
- Nom.Receptor.TipoJornada = ObjCFDITimbre.Nomina.Receptor.CodigoTipoJornada
- Nom.Receptor.TipoRegimen = ObjCFDITimbre.Nomina.Receptor.CodigoRegimenContratacion
- Nom.Receptor.NumEmpleado = ObjCFDITimbre.Nomina.Receptor.CodigoEmpleado
- Nom.Receptor.Departamento = ObjCFDITimbre.Nomina.Receptor.Departamento
- Nom.Receptor.Puesto = ObjCFDITimbre.Nomina.Receptor.Puesto
- Nom.Receptor.RiesgoPuestoSpecified = True
- Nom.Receptor.RiesgoPuesto = ObjCFDITimbre.Nomina.Receptor.CodigoRiesgoPuesto
- Nom.Receptor.PeriodicidadPago = ObjCFDITimbre.Nomina.Receptor.TipoPeriodo
- Nom.Receptor.BancoSpecified = True
- Nom.Receptor.Banco = ObjCFDITimbre.Nomina.Receptor.CodigoBanco
- Nom.Receptor.CuentaBancaria = ObjCFDITimbre.Nomina.Receptor.NumeroCuenta
- Nom.Receptor.SalarioBaseCotAporSpecified = True
- Nom.Receptor.SalarioBaseCotApor = ObjCFDITimbre.Nomina.Receptor.SBC.ToDecimal
- Nom.Receptor.SalarioDiarioIntegradoSpecified = True
- Nom.Receptor.SalarioDiarioIntegrado = ObjCFDITimbre.Nomina.Receptor.SDI.ToDecimal
- Nom.Receptor.ClaveEntFed = ObjCFDITimbre.Nomina.Receptor.CodigoEntidadFederativa
-
- Dim nsNom As New System.Xml.Serialization.XmlSerializerNamespaces()
- nsNom.Add("nomina12", "http://www.sat.gob.mx/nomina12")
- Dim xmlNom As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(Nom, GetType(Profact.TimbraCFDI33.Complementos.Nomina12.Nomina), nsNom)
- Dim docNom As New XmlDocument()
- docNom.LoadXml(xmlNom)
- LXmlComplementos.Add(docNom.DocumentElement)
- TieneComplemento = True
-
-
- End If
-#End Region
-
-#End Region
-
-#Region "Detallista"
- If Ventas.Cliente.AplicaDetallista Then
- Dim detallista As Profact.TimbraCFDI33.Complementos.Detallista.detallista = New Profact.TimbraCFDI33.Complementos.Detallista.detallista
- detallista.type = "SimpleInvoiceType"
- detallista.contentVersion = "1.3.1"
- detallista.documentStructureVersion = "AMC8.1"
- detallista.documentStatus = Profact.TimbraCFDI33.Complementos.Detallista.detallistaDocumentStatus.ORIGINAL
-
- detallista.DeliveryNote = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaDeliveryNote
- detallista.DeliveryNote.referenceIdentification = New String((1)) {}
- detallista.DeliveryNote.referenceIdentification(0) = "1"
- detallista.DeliveryNote.ReferenceDate = New DateTime
- detallista.DeliveryNote.ReferenceDate = comprobante.Fecha
- detallista.DeliveryNote.ReferenceDateSpecified = True
-
- detallista.requestForPaymentIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaRequestForPaymentIdentification
- detallista.requestForPaymentIdentification.entityType = Profact.TimbraCFDI33.Complementos.Detallista.detallistaRequestForPaymentIdentificationEntityType.INVOICE
-
- detallista.specialInstruction = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaSpecialInstruction((1)) {}
- detallista.specialInstruction(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaSpecialInstruction
- detallista.specialInstruction(0).code = Profact.TimbraCFDI33.Complementos.Detallista.detallistaSpecialInstructionCode.ZZZ
- Dim TotalTexto = New String() {Ventas.TotalTC.ToString.ToDouble.Texto2Letras.ToUpper()}
- Dim propertyInfo = detallista.specialInstruction(0).GetType().GetProperty("text")
- propertyInfo.SetValue(detallista.specialInstruction(0), Convert.ChangeType(TotalTexto, propertyInfo.PropertyType), Nothing)
-
- detallista.orderIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaOrderIdentification
- detallista.orderIdentification.referenceIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaOrderIdentificationReferenceIdentification((1)) {}
- detallista.orderIdentification.referenceIdentification(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaOrderIdentificationReferenceIdentification
- detallista.orderIdentification.referenceIdentification(0).type = Profact.TimbraCFDI33.Complementos.Detallista.detallistaOrderIdentificationReferenceIdentificationType.ON
- detallista.orderIdentification.referenceIdentification(0).Value = Ventas.Det_OrdenCompra
- detallista.orderIdentification.ReferenceDateSpecified = True
- detallista.orderIdentification.ReferenceDate = Ventas.Det_FechaOrdenCompra.ToDate()
-
- detallista.AdditionalInformation = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaReferenceIdentification((1)) {}
- detallista.AdditionalInformation(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaReferenceIdentification
- detallista.AdditionalInformation(0).type = Profact.TimbraCFDI33.Complementos.Detallista.detallistaReferenceIdentificationType.ATZ
- detallista.AdditionalInformation(0).Value = Ventas.Det_ContraRecibo
-
- detallista.DeliveryNote = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaDeliveryNote
- detallista.DeliveryNote.ReferenceDate = Ventas.Det_FechaOrdenCompra.ToDate
- detallista.DeliveryNote.referenceIdentification = New String((1)) {}
- detallista.DeliveryNote.referenceIdentification(0) = Ventas.Det_ContraRecibo
-
- detallista.buyer = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaBuyer
- detallista.buyer.gln = Ventas.Cliente.Detallista_GLNComprador
- detallista.buyer.contactInformation = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaBuyerContactInformation
- detallista.buyer.contactInformation.personOrDepartmentName = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaBuyerContactInformationPersonOrDepartmentName
- detallista.buyer.contactInformation.personOrDepartmentName.text = Ventas.Cliente.Detallista_Departamento
-
- detallista.seller = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaSeller
- detallista.seller.gln = Ventas.Cliente.Detallista_GLNVendedor
- detallista.seller.alternatePartyIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaSellerAlternatePartyIdentification
- detallista.seller.alternatePartyIdentification.type = Profact.TimbraCFDI33.Complementos.Detallista.detallistaSellerAlternatePartyIdentificationType.SELLER_ASSIGNED_IDENTIFIER_FOR_A_PARTY
- detallista.seller.alternatePartyIdentification.Value = Ventas.Cliente.Detallista_NumProveedor
-
- 'detallista.shipTo = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaShipTo
- 'detallista.shipTo.gln = "0000000000000"
- 'detallista.shipTo.nameAndAddress = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaShipToNameAndAddress
- 'detallista.shipTo.nameAndAddress.name = New String((1)) {}
- 'detallista.shipTo.nameAndAddress.name(0) = Ventas.Cliente.Direccion
- 'detallista.shipTo.nameAndAddress.streetAddressOne = New String((1)) {}
- 'detallista.shipTo.nameAndAddress.streetAddressOne(0) = Ventas.Cliente.NoInt
- 'detallista.shipTo.nameAndAddress.city = New String((1)) {}
- 'detallista.shipTo.nameAndAddress.city(0) = Ventas.Cliente.Ciudad
- 'detallista.shipTo.nameAndAddress.postalCode = New String((1)) {}
- 'detallista.shipTo.nameAndAddress.postalCode(0) = Ventas.Cliente.CP
-
- detallista.paymentTerms = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTerms
- detallista.paymentTerms.netPayment = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTermsNetPayment
- detallista.paymentTerms.netPayment.paymentTimePeriod = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTermsNetPaymentPaymentTimePeriod
- detallista.paymentTerms.netPayment.paymentTimePeriod.timePeriodDue = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTermsNetPaymentPaymentTimePeriodTimePeriodDue
- detallista.paymentTerms.netPayment.paymentTimePeriod.timePeriodDue.timePeriod = Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTermsNetPaymentPaymentTimePeriodTimePeriodDueTimePeriod.DAYS
- detallista.paymentTerms.netPayment.paymentTimePeriod.timePeriodDue.value = "0"
-
- detallista.paymentTerms.discountPayment = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTermsDiscountPayment
- detallista.paymentTerms.discountPayment.percentage = If(Ventas.DescuentoTC > 0 AndAlso Ventas.SubTotalTC > 0, (Ventas.DescuentoTC * 100) / Ventas.SubTotalTC, 0).ToString().FormatoNumero()
-
- detallista.currency = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrency((1)) {}
- detallista.currency(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrency
- detallista.currency(0).currencyISOCode = If(Ventas.CveMoneda = 1, Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrencyCurrencyISOCode.MXN, Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrencyCurrencyISOCode.USD)
- detallista.currency(0).currencyFunction = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrencyCurrencyFunction((1)) {}
- detallista.currency(0).currencyFunction(0) = Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrencyCurrencyFunction.BILLING_CURRENCY
- detallista.currency(0).rateOfChangeSpecified = True
- detallista.currency(0).rateOfChange = 1
-
- detallista.allowanceCharge = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaAllowanceCharge(1) {}
- detallista.allowanceCharge(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaAllowanceCharge
- detallista.allowanceCharge(0).monetaryAmountOrPercentage = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaAllowanceChargeMonetaryAmountOrPercentage
- detallista.allowanceCharge(0).monetaryAmountOrPercentage.rate = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaAllowanceChargeMonetaryAmountOrPercentageRate
- detallista.allowanceCharge(0).monetaryAmountOrPercentage.rate.base = Profact.TimbraCFDI33.Complementos.Detallista.detallistaAllowanceChargeMonetaryAmountOrPercentageRateBase.INVOICE_VALUE
- detallista.allowanceCharge(0).monetaryAmountOrPercentage.rate.percentage = If(Ventas.DescuentoTC > 0 AndAlso Ventas.SubTotalTC > 0, (Ventas.DescuentoTC * 100) / Ventas.SubTotalTC, 0)
-
- Dim articuloCounter As Integer = 0
- For Each concepto As Profact.TimbraCFDI33.ComprobanteConcepto In comprobante.Conceptos
- articuloCounter = (articuloCounter + 1)
- Next
- detallista.lineItem = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItem((articuloCounter)) {}
- Dim counter As Integer = 0
- For Each concepto As Profact.TimbraCFDI33.ComprobanteConcepto In comprobante.Conceptos
- detallista.lineItem(counter) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItem
- detallista.lineItem(counter).type = "SimpleInvoiceLineItemType"
- detallista.lineItem(counter).number = (counter + 1).ToString
- detallista.lineItem(counter).tradeItemIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemIdentification
- detallista.lineItem(counter).tradeItemIdentification.gtin = comprobante.Conceptos(counter).NoIdentificacion
- detallista.lineItem(counter).alternateTradeItemIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentification(1) {}
- detallista.lineItem(counter).alternateTradeItemIdentification(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentification
- detallista.lineItem(counter).alternateTradeItemIdentification(0).type = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentificationType
- detallista.lineItem(counter).alternateTradeItemIdentification(0).type = Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentificationType.BUYER_ASSIGNED
- detallista.lineItem(counter).tradeItemDescriptionInformation = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemDescriptionInformation
- If (comprobante.Conceptos(counter).Descripcion.Length > 34) Then
- detallista.lineItem(counter).tradeItemDescriptionInformation.longText = comprobante.Conceptos(counter).Descripcion.Substring(0, 34)
- Else
- detallista.lineItem(counter).tradeItemDescriptionInformation.longText = comprobante.Conceptos(counter).Descripcion
- End If
- detallista.lineItem(counter).invoicedQuantity = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemInvoicedQuantity
- detallista.lineItem(counter).invoicedQuantity.unitOfMeasure = comprobante.Conceptos(counter).Unidad
- detallista.lineItem(counter).invoicedQuantity.Text = New String((1)) {}
- detallista.lineItem(counter).invoicedQuantity.Text(0) = comprobante.Conceptos(counter).Cantidad.ToString
-
- detallista.lineItem(counter).aditionalQuantity = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAditionalQuantity(1) {}
- detallista.lineItem(counter).aditionalQuantity(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAditionalQuantity
- detallista.lineItem(counter).aditionalQuantity(0).QuantityType = Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAditionalQuantityQuantityType.NUM_CONSUMER_UNITS
- detallista.lineItem(counter).aditionalQuantity(0).Text = New String((1)) {}
- detallista.lineItem(counter).aditionalQuantity(0).Text(0) = "1"
-
- detallista.lineItem(counter).grossPrice = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemGrossPrice
- detallista.lineItem(counter).grossPrice.Amount = comprobante.Conceptos(counter).ValorUnitario
-
- detallista.lineItem(counter).netPrice = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemNetPrice
- detallista.lineItem(counter).netPrice.Amount = comprobante.Conceptos(counter).ValorUnitario
-
- detallista.lineItem(counter).AdditionalInformation = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAdditionalInformation
- detallista.lineItem(counter).AdditionalInformation.referenceIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAdditionalInformationReferenceIdentification
- detallista.lineItem(counter).AdditionalInformation.referenceIdentification.type = Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAdditionalInformationReferenceIdentificationType.ON
- detallista.lineItem(counter).AdditionalInformation.referenceIdentification.Value = "1587"
- 'Impuestos
- Dim tasa As Decimal = 0
- Dim importeImp As Decimal = 0
- Try
- If (Not (comprobante.Impuestos.Traslados) Is Nothing) Then
- For Each traslado As Profact.TimbraCFDI33.ComprobanteImpuestosTraslado In comprobante.Impuestos.Traslados
- tasa = Decimal.Parse(traslado.TasaOCuota)
- importeImp = (comprobante.Conceptos(counter).Importe * (tasa / 100))
- Next
- End If
-
- Catch ex As System.Exception
-
- End Try
-
- detallista.lineItem(counter).tradeItemTaxInformation = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemTaxInformation(1) {}
- detallista.lineItem(counter).tradeItemTaxInformation(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemTaxInformation
- detallista.lineItem(counter).tradeItemTaxInformation(0).taxTypeDescription = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemTaxInformationTaxTypeDescription
- detallista.lineItem(counter).tradeItemTaxInformation(0).taxTypeDescription = Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemTaxInformationTaxTypeDescription.VAT
- detallista.lineItem(counter).tradeItemTaxInformation(0).tradeItemTaxAmount = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemTaxInformationTradeItemTaxAmount
- detallista.lineItem(counter).tradeItemTaxInformation(0).tradeItemTaxAmount.taxPercentage = tasa
- detallista.lineItem(counter).tradeItemTaxInformation(0).tradeItemTaxAmount.taxAmount = importeImp
-
- detallista.lineItem(counter).totalLineAmount = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTotalLineAmount
- detallista.lineItem(counter).totalLineAmount.grossAmount = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTotalLineAmountGrossAmount
- detallista.lineItem(counter).totalLineAmount.grossAmount.Amount = comprobante.Conceptos(counter).Importe
- detallista.lineItem(counter).totalLineAmount.netAmount = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTotalLineAmountNetAmount
- detallista.lineItem(counter).totalLineAmount.netAmount.Amount = comprobante.Conceptos(counter).Importe
- counter = (counter + 1)
- Next
- detallista.totalAmount = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaTotalAmount
- detallista.totalAmount.Amount = comprobante.SubTotal
-
- detallista.TotalAllowanceCharge = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaTotalAllowanceCharge(1) {}
- detallista.TotalAllowanceCharge(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaTotalAllowanceCharge
- detallista.TotalAllowanceCharge(0).allowanceOrChargeType = Profact.TimbraCFDI33.Complementos.Detallista.detallistaTotalAllowanceChargeAllowanceOrChargeType.ALLOWANCE
- detallista.TotalAllowanceCharge(0).Amount = Ventas.DescuentoTC
-
- Dim nombres As System.Xml.Serialization.XmlSerializerNamespaces = New System.Xml.Serialization.XmlSerializerNamespaces
- nombres.Add("detallista", "http://www.sat.gob.mx/detallista")
- Dim xmlDetallista As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(detallista, GetType(Profact.TimbraCFDI33.Complementos.Detallista.detallista), nombres)
-
- Dim docDetallista As XmlDocument = New XmlDocument
- docDetallista.LoadXml(xmlDetallista)
- comprobante.DetallistaSpecified = True
- LXmlComplementos.Add(docDetallista.DocumentElement)
-
- TieneComplemento = True
- End If
-#End Region
-
- If TieneComplemento Then
- comprobante.Complemento = New Profact.TimbraCFDI33.ComprobanteComplemento
- comprobante.Complemento.Any = LXmlComplementos.ToArray()
- End If
-
- sw.Stop()
- swTiempo.AppendFormat("Armado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
-
-#Region "Genera XML"
- ' Try
- ' cfdi.GenerarXMLBase64(llaveBase64, Clave)
- ' cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML)
- ' Catch ex As Exception
-
- ' End Try
- '//Timbramos el CFDI por medio del conector y guardamos resultado
- Dim resultadoTimbre As Profact.TimbraCFDI.ResultadoTimbre
-
-#End Region
-
- sw.Stop()
- swTiempo.AppendFormat("Genera: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
-
-#Region "Timbra"
- resultadoTimbre = cfdi.TimbraCFDI(comprobante)
-#End Region
-
- sw.Stop()
- swTiempo.AppendFormat("Timbrado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
-
- 'Verifica el error
- If resultadoTimbre.Exitoso Then
-
- 'Dim FechaCertificacion As DateTime
- Dim FolioFiscal As String
-
- UUID = resultadoTimbre.FolioUUID
- FolioFiscal = resultadoTimbre.FolioUUID
- If FolioFiscal <> "" Then
- resultadoTimbre.GuardaXml(RutaArchivo, NombreArchivoXML)
-
-
- If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then
-
- 'Actualiza Estatus Factura
- If Ventas.CveVenta > 0 Then
-
-
- Dim ObjVentas As New ClsVentas()
- If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", Now, Ventas.CveVenta, CvePAC:=UsuarioActual.Empresa.CvePAC) Then
- Retorno = ""
- Else
- Retorno = "Error"
- End If
- ObjVentas.Dispose()
-
-
- ''Actualiza Cliente (NumeroCuenta)
- 'If Not UsuarioActual.CveEmpresa.Contiene(72, 80) Then
- ' Dim Hilo2 As New System.Threading.Thread(Sub() ActualizaCliente(UsuarioActual.CveUsuario, Ventas.Cliente.NumCtaPago, Ventas.CveMetodoPago, Ventas.CveCliente))
- ' Hilo2.Start()
- 'End If
-
- End If
- End If
-
- If Not IO.Directory.Exists($"{UsuarioActual.Empresa.Ruta}CBB\") Then IO.Directory.CreateDirectory($"{UsuarioActual.Empresa.Ruta}CBB\")
-
- Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\"
- Dim NombreCBB As String = $"{ObjCFDITimbre.Comprobante.SerieFolio}.jpg"
- resultadoTimbre.GuardaCodigoBidimensional(RutaCBB, NombreCBB)
-
- 'Genero la addenda Ford
- If Ventas.Cliente.Ford_GSDB <> "" Then
-
- Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio))
-
- Dim FolioFactura As String = ""
- If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura
- GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB)
-
- End If
-
- If ObjCFDITimbre.Comprobante.TipoComprobante = "T" Then
- Dim ObjInv As New ClsInventarios()
- If ObjInv.UpdateMovimientoTimbrado(Ventas.Inv_CveMovimiento, 1, FolioFiscal, MinFecha) Then
- Retorno = ""
- Else
- Retorno = "Error"
- End If
- ObjInv.Dispose()
- End If
-
- 'Pendiente. Ruta guardar archivos
- sw.Stop()
- swTiempo.AppendFormat("Actualizado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
- swmili = sw.ElapsedMilliseconds
- sw.Start()
-
- Retorno = ""
- Else
- Retorno = "No se pudo timbrar ante el SAT. UUID no generado."
- End If
-
-
- Else
- Dim Resultados = Newtonsoft.Json.Linq.JArray.Parse(resultadoTimbre.Detalle)
- If Resultados.Count > 0 Then
- Retorno = Resultados(0)("Value").ToString()
- MensajeErrorCFDI = Resultados(0)("Value").ToString()
- Else
- Retorno = resultadoTimbre.Detalle
- MensajeErrorCFDI = resultadoTimbre.Detalle
- End If
-
- End If
-
- GuardaLogTimbrado(swTiempo.ToString, UsuarioActual.Empresa.CvePAC)
- Return Retorno
- End Function
-
-#Region "F U N C I O N E S"
- Private Function obtenerAtributo(cadena_xml As String, nodo As String, nombre_atributo As String) As String
- Try
- 'Variables
- Dim valor As String
- Dim inicio As Integer = 0
- Dim fin As Integer = 0
- Dim inicionodo As Integer = cadena_xml.IndexOf(nodo)
- If inicionodo = -1 Then
- Return ""
- End If
- 'Buscamos inicio
- inicio = cadena_xml.IndexOf((Convert.ToString(" ") & nombre_atributo) + "=""", inicionodo) + nombre_atributo.Length + 3
- 'Buscamos el final
- fin = cadena_xml.IndexOf("""", inicio)
- 'Cortamos la cadena
- valor = cadena_xml.Substring(inicio, fin - inicio)
- 'Retorna el valor
- Return valor
- Catch
- Return ""
- End Try
- End Function
- Private Function TimbrarFacturaProFact(UsuarioActual As Usuario, Optional Ventas As Modelos.Factura = Nothing, Optional TmpDTConceptos As DataTable = Nothing, Optional TmpDTImpuestos As DataTable = Nothing, Optional TmpDTComplementos As DataTable = Nothing, Optional Ruta As String = "", Optional LstFordASN As ListBox = Nothing, Optional FordGSDBM As String = "", Optional ObjV As ClsVentas = Nothing) As Boolean
-
- Dim Ret As String = TimbrarFacturaProFactv33(Ventas, UsuarioActual)
- Return If(Ret = "", True, False)
-
- End Function
- Private Sub GeneraAddenda7Eleven(Archivo As String, TmpDTConceptos As DataTable, TmpDT7Eleven As DataTable)
- Dim cfdi As String = ""
- Dim SB As New StringBuilder
- Try
- Using sr As New StreamReader(Archivo)
-
- cfdi = sr.ReadToEnd()
-
- End Using
- Catch e As Exception
- Alert("The file could not be read:", TipoMensaje.MsgError)
-
- End Try
-
- cfdi = cfdi.Replace("", "")
-
- SB.Append(cfdi)
-
- SB.Append("")
- SB.AppendFormat("", TmpDT7Eleven.Rows(0)("sevenElevenNumProveedor").ToString)
- SB.AppendFormat("", TmpDT7Eleven.Rows(0)("sevenElevenFolio").ToString, TmpDT7Eleven.Rows(0)("sevenElevenTienda").ToString, TmpDT7Eleven.Rows(0)("sevenElevenFecha").ToString)
-
- For Each Row As DataRow In TmpDTConceptos.Rows
-
- SB.AppendFormat("", Row("Codigo"), Row("PS"), Row("Cantidad").ToString.ToDouble.FormatoNumero(), Row("PU").ToString.ToDouble.FormatoNumero())
-
- Next
-
- SB.Append("")
-
-
- Using outfile As New StreamWriter(Archivo)
- outfile.Write(SB.ToString())
- End Using
-
- End Sub
- Private Sub GeneraAddendaFord(Archivo As String, pFolio As String, LstFordASN As String, FordGSDBM As String)
- Dim cfdi As String = ""
- Dim SB As New StringBuilder
- Try
- Using sr As New StreamReader(Archivo)
-
- cfdi = sr.ReadToEnd()
-
- End Using
- Catch e As Exception
- Alert("The file could not be read:", TipoMensaje.MsgError)
-
- End Try
-
-
- cfdi = cfdi.Replace("", "")
-
- SB.Append(cfdi)
-
- SB.Append("")
- SB.AppendFormat("{0}", FordGSDBM.Trim.ToUpper)
-
- If pFolio <> "" Then SB.AppendFormat("{0}", pFolio)
- 'If TxtFordASN2.Text.Trim <> "" Then SB.AppendFormat("{0}", TxtFordASN2.Text.Trim)
-
- For Each li As String In LstFordASN.Split(","c)
-
- If li <> "" Then SB.AppendFormat("{0}", li)
-
- Next
-
- SB.Append("")
-
-
- Using outfile As New StreamWriter(Archivo)
- outfile.Write(SB.ToString())
- End Using
-
- End Sub
- Private Sub GeneraAddendaFord(Archivo As String, pFolio As String, LstFordASN As ListBox, FordGSDBM As String)
- Dim cfdi As String = ""
- Dim SB As New StringBuilder
- Try
- Using sr As New StreamReader(Archivo)
-
- cfdi = sr.ReadToEnd()
-
- End Using
- Catch e As Exception
- Alert("The file could not be read:", TipoMensaje.MsgError)
-
- End Try
-
-
- cfdi = cfdi.Replace("", "")
-
- SB.Append(cfdi)
-
- SB.Append("")
- SB.AppendFormat("{0}", FordGSDBM.Trim.ToUpper)
-
- If pFolio <> "" Then SB.AppendFormat("{0}", pFolio)
- 'If TxtFordASN2.Text.Trim <> "" Then SB.AppendFormat("{0}", TxtFordASN2.Text.Trim)
-
- For Each li As ListItem In LstFordASN.Items
-
- SB.AppendFormat("{0}", li.Text)
-
- Next
-
- SB.Append("")
-
-
- Using outfile As New StreamWriter(Archivo)
- outfile.Write(SB.ToString())
- End Using
-
- End Sub
- Private Function DecodeBase64(ByVal strXMLCodificado As String) As String
- Try
- Dim decbuff As Byte() = Convert.FromBase64String(strXMLCodificado)
- Return System.Text.Encoding.UTF8.GetString(decbuff)
- Catch
- Return ""
- End Try
- End Function
- Private Function CodificarABase64(strXML As String) As String
- Dim utf8Bytes As Byte() = UTF8Encoding.UTF8.GetBytes(strXML)
- Return Convert.ToBase64String(utf8Bytes)
- End Function
-#End Region
-
-End Class
+Option Explicit On
+Option Strict On
+
+Imports Extensiones
+Imports System.IO
+Imports System.Linq
+Imports System.Xml
+Imports System.Data
+Public Class Timbrado
+
+#Region "P R O P I E D A D E S"
+ Public Property MensajeErrorCFDI As String
+ Public Property UUID As String = ""
+ Public Property CancelacionAcuse As String
+ Public Property CancelacionState As Integer
+ Public Property CancelacionMensaje As String
+ Public Property CancelacionFecha As Date
+
+
+ Public Class AcuseCancelacionSAT
+ Public Property CodigoEstatus As String
+ Public Property EsCancelable As String
+ Public Property Estado As String
+ Public Property EstatusCancelacion As String
+ End Class
+
+#End Region
+
+ Public Shared Function VerificarVigenciaSAT(uuid As String, emisor As String, receptor As String, total As String, produccion As Boolean) As AcuseCancelacionSAT
+ Dim Retorno As AcuseCancelacionSAT = Nothing
+ Dim resp As Cancelacion.AcuseSat = New Cancelacion.AcuseSat()
+ Using ws As Cancelacion.CancelacionSoapClient = New Cancelacion.CancelacionSoapClient
+ Try
+ If Not produccion Then
+ Dim PACUsuario As String = "rene.molina@adsistemas.mx"
+ Dim PACContrasenia As String = "rene2018"
+ resp = ws.ConsultaVigenciaTest(emisor, PACUsuario, PACContrasenia, uuid, receptor, total)
+ Retorno = New AcuseCancelacionSAT()
+ Else
+ resp = ws.ConsultaVigencia(emisor, "UserTest", "1234567890", uuid, receptor, total)
+ Retorno = New AcuseCancelacionSAT()
+ End If
+ Catch ex As Exception
+ Return Nothing
+ End Try
+
+ If Retorno IsNot Nothing Then
+ Retorno.CodigoEstatus = resp.CodigoEstatus
+ Retorno.Estado = resp.Estado
+ Retorno.EsCancelable = resp.EsCancelable
+ Retorno.EstatusCancelacion = resp.EstatusCancelacion
+ End If
+
+ End Using
+ Return Retorno
+ End Function
+ Public Function CFDICancelar(Empresa As Empresa, FolioFiscal As String, Total As Decimal, RFCReceptor As String, RFCEmisor As String, Optional CvePACCancelacion As Integer = 2, Optional ValidaFactura As Boolean = True) As Boolean
+ Dim Retorno As Boolean = False
+ Dim MsgCancelacion As New StringBuilder
+ If ValidaFactura Then
+ Dim Vigencia = VerificarVigenciaSAT(FolioFiscal, RFCEmisor, RFCReceptor, Total.ToString(), True)
+ If Vigencia IsNot Nothing Then
+ If Vigencia.EsCancelable.ToUpper() = "NO CANCELABLE" Then
+ Return False
+ End If
+ Else
+ Return False
+ End If
+ End If
+
+
+ MsgCancelacion.AppendFormat("CvePAC:{0}", CvePACCancelacion)
+
+ Select Case CvePACCancelacion
+ Case 1
+ MsgCancelacion.AppendFormat("1.1")
+ Try
+ Dim CFDi As New ClbNegBICFDv3_2.ClsNegEDI
+ Dim Respuesta As New ClbNegBICFDv3_2.ClsNegRespuesta
+ Respuesta = CFDi.CancelaCFdi(Empresa.BIUsuario, Empresa.BIContraseña, Empresa.Ruta & "Certificados\" & Empresa.ArchivoPfx, Empresa.ContraseñaKey, Empresa.RFC, FolioFiscal, "http://portalbiinform.com.mx/srvCFDi/service1.asmx")
+
+ If Respuesta IsNot Nothing AndAlso Respuesta.SelloSAT <> "" Then
+ Dim xml64 As String = ""
+ Dim myXml As String = Respuesta.SelloSAT
+ Dim resp As XElement = XElement.Parse(myXml)
+ For Each elem As XElement In resp.Descendants
+ If elem.Name = "xmlBase64" Then xml64 = elem.Value
+ Next
+
+ 'If Respuesta.UUDI.Contiene("0", "201", "202") Then
+ Dim xmlDoc As New System.Xml.XmlDocument()
+ xmlDoc.LoadXml(If(xml64 = "", Respuesta.SelloSAT, Encoding.UTF8.GetString(Convert.FromBase64String(xml64))))
+ Dim AcuseChild = xmlDoc.ChildNodes.Cast(Of XmlNode).Where(Function(a) a.Name.Equals("Acuse", StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault()
+
+ Dim FoliosChild = AcuseChild.ChildNodes.Cast(Of XmlNode).Where(Function(a) a.LocalName.Equals("Folios", StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault()
+ Dim SignatureChild = AcuseChild.ChildNodes.Cast(Of XmlNode).Where(Function(a) a.LocalName.Equals("Signature", StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault()
+
+ Dim prefixFol As String = FoliosChild.Prefix
+ If prefixFol <> "" Then prefixFol = $"{prefixFol}:" 'se le agregan los ":" si tiene prefijo
+
+ CancelacionState = xmlDoc.GetElementsByTagName($"{prefixFol}EstatusUUID")(0).InnerText.ToEntero
+ 'verificación basada en el resultado del xml.
+ If CancelacionState.Contiene(201, 202) Then
+
+ Dim prefixSig = SignatureChild.Prefix
+ If prefixSig <> "" Then prefixSig = $"{prefixSig}:" 'se le agregan los ":" si tiene prefijo
+ Dim SignatureValue = xmlDoc.GetElementsByTagName($"{prefixSig}SignatureValue")
+ CancelacionAcuse = If(SignatureValue.Count < 1, SignatureValue(0).InnerText, SignatureValue(0).InnerText)
+ Try
+ CancelacionFecha = AcuseChild.Attributes("Fecha").Value.ToDate
+ Catch ex As Exception
+ CancelacionFecha = xmlDoc.GetElementsByTagName("CancelaCFDResult")(0).Attributes("Fecha").Value.ToDate
+ End Try
+ Retorno = True
+ End If
+
+ 'End If
+
+ Else
+ Me.GuardaLog(CFDi.MsgError)
+ End If
+ Respuesta = Nothing
+ CFDi = Nothing
+ Catch ex As Exception
+ GuardaLog($"{ex.Message}")
+ End Try
+
+ Case 2
+ MsgCancelacion.AppendFormat("2.1")
+ Dim ArchivoLLave As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoKey}"
+ Dim ArchivoCertificado As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoCer}"
+ Dim UsuarioServicio As String = If(CvePACCancelacion = 2, Empresa.RFC, "rene.molina@adsistemas.mx")
+ Dim ClaveServicio As String = If(CvePACCancelacion = 2, Empresa.RFC.ToLower, "rene2018")
+ Dim Clave As String = Empresa.ContraseñaKey
+ Dim UrlServicio As String = "" ' Produccion
+ Select Case CvePACCancelacion
+ Case 2
+ UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL"
+ Case 4
+ UrlServicio = "http://192.168.0.2:8080/ADSistemas/Timbrado.asmx?WSDL"
+ End Select
+
+ If Not Empresa.FacturaProduccion Then
+ ArchivoLLave = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
+ ArchivoCertificado = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
+ Select Case CvePACCancelacion
+ Case 2
+ UsuarioServicio = "fgomez"
+ ClaveServicio = "12121212"
+ UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL"
+ Case 4
+ UsuarioServicio = "UserTest"
+ ClaveServicio = "1234567890"
+ UrlServicio = "http://192.168.0.2:8080/ADSistemas/Timbrado.asmx?WSDL"
+ End Select
+ End If
+
+#Region "Valida"
+ If Not File.Exists(ArchivoCertificado) Then
+ Alert("El archivo de certificado no existe", TipoMensaje.MsgError)
+ Return False
+ End If
+ If Not File.Exists(ArchivoLLave) Then
+ Alert("El archivo de llave privada no existe", TipoMensaje.MsgError)
+ Return False
+ End If
+ If Empresa.ContraseñaKey = "" Then
+ Alert("La clave no puede ser vacía", TipoMensaje.MsgError)
+ Return False
+ End If
+#End Region
+
+#Region "Variables"
+ Dim llaveByte As Byte(), certByte As Byte()
+ Dim llaveBase64 As String, certBase64 As String
+ Dim cfdi As New RVCFDI.GeneraCFDI()
+ 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 False
+ 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 False
+
+ End Try
+#End Region
+
+
+ Dim base64 As String
+ Dim ObjCancelacion As New RVCancelacion.Cancelacion()
+
+ Dim xmlCancelacion As String = ObjCancelacion.crearXMLCancelacion(certBase64, llaveBase64, Clave, FolioFiscal)
+ If (ObjCancelacion.MensajeDeError = "") Then
+
+ base64 = CodificarABase64(xmlCancelacion)
+
+ Dim objWS As RVCFDI.WSGeneraCFDI.Service = Nothing
+ Dim objAuthSoapHD As RVCFDI.WSGeneraCFDI.AuthSoapHd
+ Dim objResponse As RVCFDI.WSGeneraCFDI.StructCfd
+ Dim objCancel As RVCFDI.WSGeneraCFDI.StructCancel
+
+ Try
+
+
+ 'Variables de consumo de servicio web
+ objWS = New RVCFDI.WSGeneraCFDI.Service()
+ objAuthSoapHD = New RVCFDI.WSGeneraCFDI.AuthSoapHd()
+ 'creacion de Autorizacion de cabecera Soap
+ objCancel = New RVCFDI.WSGeneraCFDI.StructCancel()
+ 'Configura el servicio
+ objWS.Url = UrlServicio
+
+ objAuthSoapHD.strPassword = ClaveServicio
+ objAuthSoapHD.strUserName = UsuarioServicio
+ 'Coloca la cabecera
+ objWS.AuthSoapHdValue = objAuthSoapHD
+ 'Obtiene el resultado
+ objCancel = objWS.CancelTicket(base64)
+ 'Valida la respuesta
+ ''Codigos del SAT
+ ''201 - El folio se ha cancelado con éxito.
+ ''202 - El CFDI ya había sido cancelado previamente.
+ ''203 - UUID no corresponde al emisor.
+ ''204 - El CFDI no aplica para cancelación.
+ ''205 - El UUID no existe o no ha sido procesado por el SAT.
+ ''402 - El Contribuyente no se encuentra el la LCO o la validez de obligaciones se reporta como negativa.
+ CancelacionState = objCancel.state
+ CancelacionMensaje = objCancel.Descripcion
+
+ If objCancel.state.Contiene(0, 201, 202) Then
+ CancelacionFecha = Now
+
+ Select Case CvePACCancelacion
+ Case 2
+ Dim solicitud As New WSRVConsultas.Service1SoapClient
+ Dim resp As New WSRVConsultas.resp_Acuse()
+ resp = solicitud.ConsultarAcuseCancelacion(RFCEmisor, UsuarioServicio, ClaveServicio, FolioFiscal, CancelacionFecha.ToShortDateString)
+ CancelacionMensaje = objCancel.Descripcion
+
+ If (resp.Estado = 0) Then
+
+ Dim xmlDoc As New System.Xml.XmlDocument()
+ xmlDoc.LoadXml(Encoding.UTF8.GetString(Convert.FromBase64String(resp.Xml)))
+ Dim xpath As String = "Acuse/Folios"
+ Dim nodes = xmlDoc.SelectNodes(xpath)
+ CancelacionState = xmlDoc.GetElementsByTagName("EstatusUUID")(0).InnerText.ToEntero
+
+ xpath = "Acuse/Signature"
+ nodes = xmlDoc.SelectNodes(xpath)
+
+ CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText
+ CancelacionFecha = xmlDoc.SelectSingleNode("Acuse").Attributes("Fecha").Value.ToDate
+ Retorno = True
+ Else
+ CancelacionAcuse = resp.MensajeDeError
+ Retorno = False
+ End If
+ solicitud = Nothing
+ Case 4
+
+ Dim solicitud As New WSGF.Service1SoapClient
+ Dim resp As New WSGF.StructXml()
+ resp = solicitud.GetAcuse(RFCEmisor, UsuarioServicio, ClaveServicio, FolioFiscal)
+ CancelacionMensaje = objCancel.Descripcion
+
+ If (resp.Estado = 0) Then
+
+ Dim xmlDoc As New System.Xml.XmlDocument()
+ xmlDoc.LoadXml(Encoding.UTF8.GetString(Convert.FromBase64String(resp.CfdiB64)))
+ Dim xpath As String = "Acuse/Folios"
+ Dim nodes = xmlDoc.SelectNodes(xpath)
+ CancelacionState = xmlDoc.GetElementsByTagName("EstatusUUID")(0).InnerText.ToEntero
+
+ xpath = "Acuse/Signature"
+ nodes = xmlDoc.SelectNodes(xpath)
+
+ CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText
+ CancelacionFecha = xmlDoc.SelectSingleNode("Acuse").Attributes("Fecha").Value.ToDate
+ Retorno = True
+ Else
+ CancelacionAcuse = resp.Descripcion
+ Retorno = False
+ End If
+ solicitud = Nothing
+ End Select
+
+
+ End If
+ Catch ex As Exception
+ CancelacionMensaje += $" | ex: {ex}"
+ Retorno = False
+ End Try
+
+ 'Libera memoria
+ objWS.Dispose()
+ objResponse = Nothing
+ objAuthSoapHD = Nothing
+ GC.Collect()
+ End If
+
+
+ Case 3
+ MsgCancelacion.AppendFormat("3.1")
+ Dim ArchivoLLave As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoKey}"
+ Dim ArchivoCertificado As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoCer}"
+ Dim UsuarioServicio As String = Empresa.RFC
+ Dim ClaveServicio As String = Empresa.RFC.ToLower
+ Dim Clave As String = Empresa.ContraseñaKey
+ Dim UrlServicio As String = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL"
+ Dim AmbienteProductivo As Boolean = True
+
+ If Not Empresa.FacturaProduccion OrElse Empresa.CveEmpresa = 1 Then
+ UsuarioServicio = "fgomez"
+ ClaveServicio = "12121212"
+ Clave = "12345678a"
+ ArchivoLLave = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
+ ArchivoCertificado = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
+ UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" '"http://108.60.211.43/rvltimbrado/service1.asmx"
+ AmbienteProductivo = False
+ End If
+
+
+#Region "Valida"
+ If Not File.Exists(ArchivoCertificado) Then
+ Alert("El archivo de certificado no existe", TipoMensaje.MsgError)
+ Return False
+ End If
+ If Not File.Exists(ArchivoLLave) Then
+ Alert("El archivo de llave privada no existe", TipoMensaje.MsgError)
+ Return False
+ End If
+ If Empresa.ContraseñaKey = "" Then
+ Alert("La clave no puede ser vacía", TipoMensaje.MsgError)
+ Return False
+ End If
+#End Region
+
+ Dim conector As New Profact.TimbraCFDI33.Conector(AmbienteProductivo)
+
+ If Not AmbienteProductivo Then
+ conector.EstableceCredenciales("mvpNUXmQfK8=")
+ Else
+ conector.EstableceCredenciales("vSGxMFWnNRy/nDoowxqrqw==|Sia123654")
+ End If
+
+ Dim resultadoCancelacion As Profact.TimbraCFDI.ResultadoCancelacionAck
+ resultadoCancelacion = conector.CancelaCFDIAck(RFCEmisor, FolioFiscal)
+ CancelacionFecha = Now
+ Dim resp As Profact.TimbraCFDI.ResultadoConsulta
+ resp = conector.ObtieneCFDI(RFCEmisor, FolioFiscal)
+ If resultadoCancelacion.Exitoso Then
+ CancelacionMensaje = resultadoCancelacion.Descripcion
+ Dim xmlDoc As New System.Xml.XmlDocument()
+ xmlDoc.LoadXml(Encoding.UTF8.GetString(Convert.FromBase64String(resp.Xml)))
+ Dim xpath As String = "Acuse/Folios"
+ Dim nodes = xmlDoc.SelectNodes(xpath)
+ CancelacionState = xmlDoc.GetElementsByTagName("EstatusUUID")(0).InnerText.ToEntero
+
+ xpath = "Acuse/Signature"
+ nodes = xmlDoc.SelectNodes(xpath)
+
+ CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText
+ CancelacionFecha = xmlDoc.SelectSingleNode("Acuse").Attributes("Fecha").Value.ToDate
+ Retorno = True
+ Else
+ CancelacionAcuse = resp.NumeroError
+ Retorno = False
+ End If
+
+ Case 4
+ MsgCancelacion.AppendFormat("4.1-")
+ Dim ArchivoLLave As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoKey}"
+ Dim ArchivoCertificado As String = $"{Empresa.Ruta}Certificados\{Empresa.ArchivoCer}"
+ Dim UsuarioServicio As String = If(CvePACCancelacion = 2, Empresa.RFC, "rene.molina@adsistemas.mx")
+ Dim ClaveServicio As String = If(CvePACCancelacion = 2, Empresa.RFC.ToLower, "rene2018")
+ Dim Clave As String = Empresa.ContraseñaKey
+ Dim UrlServicio As String = "" ' Produccion
+
+ UrlServicio = "http://juancalderon-001-site1.ftempurl.com/timbrado.asmx?WSDL"
+
+ If Not Empresa.FacturaProduccion Then
+ ArchivoLLave = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
+ ArchivoCertificado = $"{Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
+
+ UsuarioServicio = "UserTest"
+ ClaveServicio = "1234567890"
+ UrlServicio = "http://juancalderon-001-site6.ftempurl.com/cancelacion.asmx?WSDL"
+
+ End If
+
+#Region "Valida"
+ If Not File.Exists(ArchivoCertificado) Then
+ Alert("El archivo de certificado no existe", TipoMensaje.MsgError)
+ Return False
+ End If
+ If Not File.Exists(ArchivoLLave) Then
+ Alert("El archivo de llave privada no existe", TipoMensaje.MsgError)
+ Return False
+ End If
+ If Empresa.ContraseñaKey = "" Then
+ Alert("La clave no puede ser vacía", TipoMensaje.MsgError)
+ Return False
+ End If
+#End Region
+
+#Region "Variables"
+ Dim llaveByte As Byte(), certByte As Byte()
+ Dim llaveBase64 As String, certBase64 As String
+ Dim objCan As New GoFac.GoCfdi()
+ 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 False
+ 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 False
+
+ End Try
+#End Region
+ objCan.CancelacionCfdi = True
+ objCan.FechaCancelacion = System.DateTime.Now.AddMinutes(-120) ' operación requerida para que no se presente problemas con fechas adelantadas del PAC
+ MsgCancelacion.AppendFormat("4.3-")
+ objCan.GeneraCancelacionB64(certBase64, llaveBase64, Clave, FolioFiscal)
+ If (objCan.MensajeError = "") Then
+ MsgCancelacion.AppendFormat("4.4-")
+ objCan.CancelaCfdi(UsuarioServicio, ClaveServicio, UrlServicio, Empresa.FacturaProduccion)
+ MsgCancelacion.AppendFormat("4.5-")
+ '' Verifica el resultado, 0. cancelado, 202, cancelado previamente
+ If (objCan.CodigoError.Contiene(0, 202)) Then
+
+ MsgCancelacion.AppendFormat("4.5.1-")
+ Dim xmlDoc As New System.Xml.XmlDocument()
+ xmlDoc.LoadXml(objCan.Xml)
+ Dim xpath As String = "Acuse/Folios"
+ Dim nodes = xmlDoc.SelectNodes(xpath)
+
+ xpath = "Acuse/Signature"
+ nodes = xmlDoc.SelectNodes(xpath)
+
+ CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText
+ CancelacionFecha = xmlDoc.DocumentElement.Attributes("Fecha").Value.ToDate
+ Retorno = True
+ MsgCancelacion.AppendFormat("4.5.2-")
+ End If
+
+ End If
+ MsgCancelacion.AppendFormat("{0} --Código:{1} -- XML: {2}", objCan.MensajeError, objCan.CodigoError, objCan.Xml)
+
+ End Select
+
+
+ If Not Retorno Then
+ GuardaLog($"****** Error al cancelar factura ****** Estatus: {CancelacionState} | Mensaje: {CancelacionMensaje} | Mensaje SAT: {MsgCancelacion.ToString} ")
+ End If
+
+ Return Retorno
+ End Function
+ 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,
+ 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.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 = ""}
+ 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 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
+ ' 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} 'If(drr("MetodoPago").ToString = "PUE", 0, drr("NumParcialidad").ToString.ToEntero)}
+ 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
+
+ End Function
+ Public Function TimbrarFactura(UsuarioActual As Usuario, Ventas As Modelos.Factura, Optional CvePACEspecial As Integer = -1) As Boolean
+
+ Dim Retorno As Boolean = False
+ Dim tCvePAC As Integer = UsuarioActual.Empresa.CvePAC
+ If CvePACEspecial <> -1 Then tCvePAC = CvePACEspecial
+
+ Select Case tCvePAC
+ Case 1
+ ' Retorno = TimbrarFacturaBIInform33(UsuarioActual, Ventas, FM, TmpDTConceptos, TmpDTImpuestos, TmpDT7Eleven, TmpDTComplementos, Ruta, LstFordASN, FordGSDBM, ObjV)
+ Dim Ret As String = TimbrarFacturaBIInform33(Ventas, UsuarioActual)
+ Retorno = If(Ret = "", True, False)
+
+ Case 2
+ 'Retorno = TimbrarFacturaRealVirtual(UsuarioActual, Ventas, TmpDTConceptos, TmpDTImpuestos, TmpDTComplementos, Ruta, LstFordASN, FordGSDBM, ObjV)
+ Dim Ret As String = TimbrarFacturaRealVirtualv33(Ventas, UsuarioActual)
+ Retorno = If(Ret = "", True, False)
+
+ Case 3
+ Retorno = TimbrarFacturaProFact(UsuarioActual, Ventas)
+ 'Retorno = TimbrarFacturaProFact(UsuarioActual, Ventas, TmpDTConceptos, TmpDTImpuestos, TmpDTComplementos, Ruta, LstFordASN, FordGSDBM, ObjV)
+ Case 4
+
+ Dim Ret As String = TimbrarFacturaGoCFDIv33(Ventas, UsuarioActual)
+ Retorno = If(Ret = "", True, False)
+
+ End Select
+
+
+ Return Retorno
+ End Function
+ Public Function TimbrarFacturaBIInform33(Ventas As Modelos.Factura, UsuarioActual As Usuario) As String
+
+
+ Dim Retorno As String = ""
+
+ 'Dim SucMatriz As SubProyectoModel = Ventas.SubProyectoMatriz
+ 'Dim SucEmpresa As SubProyectoModel = Ventas.SubProyecto
+ 'Dim SucCliente As SucursalModel = Ventas.ClienteSucursal
+ Dim ObjCFDITimbre As CFDITimbre = Ventas.Timbre
+ Dim ArchivoLLave As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoKey}"
+ Dim ArchivoCertificado As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoCer}"
+ Dim ArchivoPFX As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoPfx}"
+ 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://portalbiinform.com.mx/srvCFDi33/service1.asmx" ' Produccion
+ Dim RutaArchivo As String = $"{UsuarioActual.Empresa.Ruta}XML\{Ventas.TipoDocto}\"
+ Dim NombreArchivoXML As String = $"{ObjCFDITimbre.Comprobante.SerieFolio}"
+ Dim TimbraProduccion As Boolean = True
+
+ 'Dim sevenElevenNumProveedor = TmpDT7Eleven.Rows(0)("sevenElevenNumProveedor").ToString
+ 'Dim sevenElevenFolio = TmpDT7Eleven.Rows(0)("sevenElevenFolio").ToString
+ 'Dim sevenElevenTienda = TmpDT7Eleven.Rows(0)("sevenElevenTienda").ToString
+ 'Dim sevenElevenFecha = TmpDT7Eleven.Rows(0)("sevenElevenFecha").ToString
+
+ If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then
+ UsuarioServicio = UsuarioActual.Empresa.BIUsuario
+ ClaveServicio = UsuarioActual.Empresa.BIContraseña
+ Clave = "12345678a"
+ EmisorRFC = "AAA010101AAA"
+ ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
+ ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
+ UrlServicio = "http://portalmacropro.com.mx/srvCFDi33prueba/service1.asmx"
+ TimbraProduccion = False
+ End If
+
+ Dim CFDi As New ClbNegBICFDv3_3.ClsNegEDI
+ Dim ObjFemsa As New ClbNegBICFDv3_3.ClsNegAddFemsa
+ Dim ObjDetallista As New ClbNegBICFDv3_3.ClsNegEDICompDet
+ Dim ImpLoc As New ClbNegBICFDv3_3.ClsNegEDICompImplocal
+
+ Dim Msg As String = String.Empty
+ 'Nodo Comprobante
+ Dim clbcomp As ClbNegBICFDv3_3.TipoDeComprobante = If(ObjCFDITimbre.Comprobante.TipoComprobante = "I", ClbNegBICFDv3_3.TipoDeComprobante.I, If(ObjCFDITimbre.Comprobante.TipoComprobante = "E", ClbNegBICFDv3_3.TipoDeComprobante.E, If(ObjCFDITimbre.Comprobante.TipoComprobante = "P", ClbNegBICFDv3_3.TipoDeComprobante.P, ClbNegBICFDv3_3.TipoDeComprobante.T)))
+ Msg = CFDi.comprobantecfd(0, 0, ObjCFDITimbre.Comprobante.Serie,
+ ObjCFDITimbre.Comprobante.Folio.ToString,
+ ObjCFDITimbre.Comprobante.Fecha,
+ ObjCFDITimbre.Comprobante.FormadePago,
+ ObjCFDITimbre.Comprobante.CondicionesdePago,
+ ObjCFDITimbre.Comprobante.Subtotal,
+ ObjCFDITimbre.Comprobante.Descuentos,
+ ObjCFDITimbre.Comprobante.TipoCambio.ToDecimal,
+ ObjCFDITimbre.Comprobante.Moneda,
+ ObjCFDITimbre.Comprobante.Total,
+ ObjCFDITimbre.Comprobante.MetodoPago,
+ clbcomp,
+ ObjCFDITimbre.Comprobante.LugarExpedicion,
+ ObjCFDITimbre.Comprobante.Confirmacion)
+
+ If Msg = String.Empty Then
+ 'Nodo emisor
+ Msg = CFDi.EmisorCfd(If(UsuarioActual.Empresa.FacturaProduccion, UsuarioActual.Empresa.RFC, "AAA010101AAA"), UsuarioActual.Empresa.Empresa, UsuarioActual.Empresa.CodigoRegimenFiscal)
+ If Msg = String.Empty Then
+
+ 'Nodo receptor
+ Msg = CFDi.ReceptorCfd(Ventas.Cliente.RFC, Ventas.Cliente.Nombre, "", "", Ventas.ClaveUsoCFDI)
+ If Msg = String.Empty Then
+
+ 'Nodo conceptos, se agregan los PS
+ Dim HasErrorConceptos As Boolean = False
+
+ If ObjCFDITimbre.Conceptos IsNot Nothing AndAlso ObjCFDITimbre.Conceptos.Count > 0 Then
+ For Each concep As CFDIConceptos In ObjCFDITimbre.Conceptos
+ CFDi.ConceptosCfd(concep.ClaveProdServ, concep.Cantidad, concep.Unidad, concep.Noidentificacion, concep.Descripcion, concep.ValorUnitario, concep.Importe, concep.ClaveUnidad, concep.Descuento)
+ For Each imp As CFDIConceptosImpuestos In concep.Impuestos
+ Dim clbImp As ClbNegBICFDv3_3.Impuesto = If(imp.Impuesto = "002", ClbNegBICFDv3_3.Impuesto.IVA, If(imp.Impuesto = "003", ClbNegBICFDv3_3.Impuesto.IEPS, ClbNegBICFDv3_3.Impuesto.ISR))
+ Dim clbTipo As ClbNegBICFDv3_3.TipoFactor = If(imp.TipoFactor = "Tasa", ClbNegBICFDv3_3.TipoFactor.Tasa, If(imp.TipoFactor = "Cuota", ClbNegBICFDv3_3.TipoFactor.Cuota, ClbNegBICFDv3_3.TipoFactor.Exento))
+ Dim Posicion As Integer = imp.TasaOCuota.ToString.IndexOf(".")
+ If imp.TrasladooRetencion = "T" Then
+ CFDi.ConceptosTrasladosCfd(imp.Base, clbImp, clbTipo, imp.TasaOCuota.ToString.PadRight(imp.TasaOCuota.ToString.Length + (6 - imp.TasaOCuota.ToString.Substring(Posicion, imp.TasaOCuota.ToString.Length - 1).Length.ToEntero + 1), Convert.ToChar("0")), imp.Importe)
+ Else
+ CFDi.ConceptosRetencionesCfd(imp.Base, clbImp, clbTipo, imp.TasaOCuota.ToString.PadRight(imp.TasaOCuota.ToString.Length + (6 - imp.TasaOCuota.ToString.Substring(Posicion, imp.TasaOCuota.ToString.Length - 1).Length.ToEntero + 1), Convert.ToChar("0")), imp.Importe)
+ End If
+
+ Next
+ Next
+ End If
+
+
+ If Not HasErrorConceptos Then
+ 'Nodo Impuestos, se agrega el total de impuestos
+ Msg = CFDi.ImpuestosCfd(Ventas.RetIVATC + Ventas.RetISRTC, Ventas.IVATC)
+ If Msg = String.Empty Then
+
+ Dim HasErrorRetenciones As Boolean = False
+ 'Nodo Impuestos-retenciones
+
+
+ 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)
+ Next
+
+ If Not HasErrorRetenciones Then
+
+ 'Nodo Impuestos-traslado
+ Dim HasErrorIVA As Boolean = False
+ ''se acumulan los importes
+ For Each Tras In ObjCFDITimbre.Traslados
+ Dim Posicion As Integer = Tras.TasaOCuota.ToString.IndexOf(".")
+ Dim tipfact As ClbNegBICFDv3_3.TipoFactor = If(Tras.TipoFactor = "Tasa", ClbNegBICFDv3_3.TipoFactor.Tasa, If(Tras.TipoFactor = "Cuota", ClbNegBICFDv3_3.TipoFactor.Cuota, ClbNegBICFDv3_3.TipoFactor.Exento))
+ Msg = CFDi.ImpuestosTrasladosCfd(ClbNegBICFDv3_3.Impuesto.IVA, Tras.TasaOCuota.ToString.PadRight(Tras.TasaOCuota.ToString.Length + (6 - Tras.TasaOCuota.ToString.Substring(Posicion, Tras.TasaOCuota.ToString.Length - 1).Length.ToEntero + 1), Convert.ToChar("0")), Tras.Importe, tipfact)
+ Next
+
+
+ If Not HasErrorIVA Then
+ 'Nodo Impuestos locales
+ 'JJMQ 20150826: Se habilitó de nueva cuenta impuestos locales
+ Dim HasErrorImpuestosLocales As Boolean = False
+ Dim TieneImpuestosLocales As Boolean = False
+
+
+ If ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe) > 0 Then
+
+ For Each ret As CFDIRetencionesLocales In ObjCFDITimbre.RetencionesLocales
+ If ret.Importe > 0 Then
+ Msg = ImpLoc.RetencionesLocales(ret.ImpuestoLocalRetenido, ret.TasaRetencion, ret.Importe)
+ TieneImpuestosLocales = True
+ End If
+ Next
+ End If
+
+ CFDi.CompImplocal = ImpLoc
+ If Msg <> String.Empty Then HasErrorImpuestosLocales = True
+
+ If Not HasErrorImpuestosLocales Then
+
+
+
+ 'Agrega Adenda FEMSA
+ Dim HasErrorFEMSA As Boolean = False
+ If Ventas.Cliente.AplicaFEMSA Then
+
+ Msg = ObjFemsa.Carga(Ventas.FemsaFactura.FEMSA_Version, Ventas.ClaseDoctoSat, Ventas.FemsaFactura.FEMSA_NumSociedad, Ventas.FemsaFactura.FEMSA_NumProveedor, Ventas.FemsaFactura.FEMSA_NumPedido,
+ Ventas.MonedaAbreviatura, Ventas.FemsaFactura.FEMSA_NumEntrada, Ventas.FemsaFactura.FEMSA_NumRemision, Ventas.FemsaFactura.FEMSA_NumSocio, Ventas.FemsaFactura.FEMSA_CentroCosto,
+ Ventas.FemsaFactura.FEMSA_IPeriodoLiquidacion, Ventas.FemsaFactura.FEMSA_FPeriodoLiquidacion, Ventas.FemsaFactura.FEMSA_CodRetencion1, Ventas.FemsaFactura.FEMSA_CodRetencion2,
+ Ventas.FemsaFactura.FEMSA_Mail)
+ If Msg <> String.Empty Then HasErrorFEMSA = True
+ End If
+
+ If Not HasErrorFEMSA Then
+ If Ventas.Cliente.AplicaFEMSA Then Msg = CFDi.AddendaFemsa(ObjFemsa)
+ If Msg = String.Empty Then
+ 'Agrega Complemento Detallista
+ Dim HasErrorDetallista As Boolean = False
+ If Ventas.Cliente.AplicaDetallista Then
+ 'Desarrollar Detallista
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ '1
+ Msg = ObjDetallista._1_1R_requestForPaymentIdentification(ClbNegBICFDv3_3.CompDetEntityType.INVOICE)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ '2
+ Dim LstInstruccionComercial As New List(Of String)
+ LstInstruccionComercial.Add(Ventas.TotalTC.ToString.ToDouble.Texto2Letras.ToUpper)
+ Msg = ObjDetallista._2_1O_SpecialInstruction(ClbNegBICFDv3_3.CompDetCode.ZZZ, LstInstruccionComercial)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ '3
+ Msg = ObjDetallista._3_1R_OrderIdentification_ReferenceIdentification("ON", Ventas.Det_OrdenCompra)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ Msg = ObjDetallista._3_2O_OrderIdentification_ReferenceDate(Ventas.Det_FechaOrdenCompra.ToDate)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ '4
+ Msg = ObjDetallista._4_1R_AdditionalInformation_ReferenceIdentification("DQ", Ventas.Det_ContraRecibo)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ '5
+ Msg = ObjDetallista._5_1R_DeliveryNote_ReferenceIdentification(Ventas.Det_ContraRecibo)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ Msg = ObjDetallista._5_2O_DeliveryNote_ReferenceDate(Ventas.Det_FechaOrdenCompra.ToDate)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ '6
+ Msg = ObjDetallista._6_1R_Buyer(Ventas.Cliente.Detallista_GLNComprador, Ventas.Cliente.Detallista_Departamento)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ '7
+ Msg = ObjDetallista._7_1R_Seller(Ventas.Cliente.Detallista_GLNVendedor, "SELLER_ASSIGNED_IDENTIFIER_FOR_A_PARTY", Ventas.Cliente.Detallista_NumProveedor)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ '8
+ Msg = ObjDetallista._8_1O_AllowanceCharge(ClbNegBICFDv3_3.CompDetNetAllowanceChargeType.ALLOWANCE_GLOBAL,
+ ClbNegBICFDv3_3.CompDetNetSettlementType.OFF_INVOICE,
+ "0",
+ ClbNegBICFDv3_3.CompDetNetSpecialServicesType.AJ,
+ ClbNegBICFDv3_3.CompDetNetMonetaryAmountOrPercentageBase.INVOICE_VALUE,
+ If(Ventas.DescuentoTC > 0 AndAlso Ventas.SubTotalTC > 0, (Ventas.DescuentoTC * 100) / Ventas.SubTotalTC, 0))
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ '9
+ Dim LineNumber As Integer = 1
+ If ObjCFDITimbre.Conceptos IsNot Nothing AndAlso ObjCFDITimbre.Conceptos.Count > 0 Then
+ For Each Row As DataRow In Ventas.DtDetalle.Rows
+ Dim PS As String = If(Row("PS").ToString.Length = 1, Row("Obs").ToString, If(Row("PS").ToString.Length = 0, "", Row("PS").ToString & " ") & Row("Obs").ToString & If(Row("Obs").ToString.Trim.Length > 0, vbLf, "")) & vbLf
+ Msg = ObjDetallista._9_1R_LineItem("SimpleInvoidLineItemType",
+ LineNumber,
+ Row("Codigo").ToString,
+ ClbNegBICFDv3_3.CompDetAlternateTradeItemIdentification.SUPPLIER_ASSIGNED,
+ Row("Codigo").ToString,
+ ClbNegBICFDv3_3.CompDetNetLanguage.ES,
+ If((Row("Codigo").ToString & If(Row("Codigo").ToString.Length > 0, "-", "") & PS).Length > 35, (Row("Codigo").ToString & If(Row("Codigo").ToString.Length > 0, "-", "") & PS).Substring(0, 34), (Row("Codigo").ToString & If(Row("Codigo").ToString.Length > 0, "-", "") & PS)),
+ If(Row("UM").ToString.ToLower = "no aplica", "NA", Row("UM").ToString),
+ Row("Cantidad").ToString,
+ Row("PU").ToString.ToDecimal,
+ Row("PU").ToString.ToDecimal * (1 + Row("IVA").ToString.ToDecimal),
+ Row("Cantidad").ToString.ToDecimal * Row("PU").ToString.ToDecimal,
+ (Row("Cantidad").ToString.ToDecimal * Row("PU").ToString.ToDecimal) * (1 + Row("IVA").ToString.ToDecimal))
+ LineNumber = LineNumber + 1
+ Next
+ End If
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ '10
+ Msg = ObjDetallista._10_1R_TotalAmount(Ventas.SubTotalTC)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ '11
+ Msg = ObjDetallista._11_1R_TotalAllowanceCharge(ClbNegBICFDv3_3.CompDetNetAllowanceOrChargeType.ALLOWANCE,
+ ClbNegBICFDv3_3.CompDetNetSpecialServicesType.AA,
+ Ventas.DescuentoTC)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ End If
+ If Not HasErrorDetallista Then
+ If Ventas.Cliente.AplicaDetallista Then Msg = CFDi.ClomplementoDetallistaCfd(ObjDetallista)
+ If Msg <> String.Empty Then HasErrorDetallista = True
+ 'Timbrar
+
+ 'Web Services de producción: http://biinform.com.mx/srvCFDi/service1.asmx
+ 'Web Services de pruebasd: http://biinform.com.mx/srvCFDiPrueba/service1.asmx
+
+
+
+
+ If Not System.IO.Directory.Exists(UsuarioActual.Empresa.Ruta & "XML\") Then System.IO.Directory.CreateDirectory(UsuarioActual.Empresa.Ruta & "XML\")
+ If Not System.IO.Directory.Exists(UsuarioActual.Empresa.Ruta & "XML\" & Ventas.TipoDocto) Then System.IO.Directory.CreateDirectory(UsuarioActual.Empresa.Ruta & "XML\" & Ventas.TipoDocto)
+
+ 'GENERAR TIMBRE
+ CFDi.Generar(ArchivoPFX,
+ UsuarioActual.Empresa.ContraseñaKey,
+ ArchivoCertificado,
+ $"{RutaArchivo }{NombreArchivoXML}.xml",
+ UsuarioActual.Empresa.Ruta & "Certificados\",
+ UsuarioServicio,
+ ClaveServicio,
+ UrlServicio,
+ True)
+
+
+ If CFDi.MsgError <> String.Empty Then
+ OnError($"Ocurrió un error al generar el timbre, el mensaje del SAT fue: {CFDi.MsgError}. Emp:{UsuarioActual.CveEmpresa}. MetPag: {Ventas.ClaveMetodoPagoSAT}", New Exception(CFDi.MsgError))
+ Retorno = $"Ocurrió un error al generar el timbre, el mensaje del SAT fue: {CFDi.MsgError}. Emp:{UsuarioActual.CveEmpresa}. MetPag: {Ventas.ClaveMetodoPagoSAT}"
+ Else
+ Dim CBB As New ClbNegBICFDv3_3.ClsNegCBBGenerar()
+ Dim FechaCertificacion As DateTime
+ Dim FolioFiscal, NoSerieCertificado, NoSerieCertificadoContribuyente, SelloCFDi, SelloSAT As String
+
+ FolioFiscal = CFDi.Timbrado.UUDI 'XmlDoc.DocumentElement("cfdi:Complemento").FirstChild.Attributes("UUID").InnerText
+ NoSerieCertificado = CFDi.Timbrado.NoCertificadoSAT
+ FechaCertificacion = CFDi.Timbrado.FechaTimbrado
+ SelloCFDi = CFDi.Timbrado.SelloCFD
+ SelloSAT = CFDi.Timbrado.SelloSAT
+ NoSerieCertificadoContribuyente = CFDi.Timbrado.NoCertificado
+
+
+ Dim ObjVentas As New ClsVentas()
+ If Not ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", ObjCFDITimbre.Comprobante.Fecha, Ventas.CveVenta, CvePAC:=1) Then
+ Retorno = "No se pudo registrar el folio fiscal"
+ End If
+ ObjVentas.Dispose()
+
+
+ ''Actualiza Cliente (NumeroCuenta)
+ 'If Not UsuarioActual.CveEmpresa.Contiene(72, 80) Then
+ ' Dim Hilo2 As New System.Threading.Thread(Sub() ActualizaCliente(UsuarioActual.CveUsuario, Ventas.Cliente.NumCtaPago, Ventas.CveMetodoPago, Ventas.CveCliente))
+ ' Hilo2.Start()
+ 'End If
+
+
+ Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\{ObjCFDITimbre.Comprobante.SerieFolio}.jpg"
+ CBB.GenerarCBB(UsuarioActual.Empresa.RFC, Ventas.Cliente.RFC, Ventas.TotalTC, FolioFiscal, RutaCBB)
+
+ ''Genero la addenda de 7-Eleven
+ 'If sevenElevenNumProveedor <> "" AndAlso sevenElevenFolio <> "" AndAlso sevenElevenTienda <> "" AndAlso sevenElevenFecha <> "" AndAlso sevenElevenFecha <> "__/__/____" Then
+ ' Dim RutaCadena As String = $"{Ruta}XML\{Ventas.TipoDocto}\{Ventas.SerieFolio}.xml" 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio))
+
+ ' GeneraAddenda7Eleven(RutaCadena, TmpDTConceptos, TmpDT7Eleven)
+ 'End If
+
+ 'Genero la addenda Ford
+ If Ventas.Cliente.Ford_GSDB <> "" Then
+
+ Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio))
+
+ Dim FolioFactura As String = ""
+ If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura
+ GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB)
+
+ End If
+ End If
+ Else
+ Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Complemento Detallista"
+ Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Complemento Detallista", New Exception)
+ End If
+ Else
+ Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: AddendaFemsa"
+ Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: AddendaFemsa", New Exception)
+ End If
+ Else
+ Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: AddendaFemsa"
+ Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: AdendaFEMSA", New Exception)
+ End If
+ Else
+ Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: RetencionesLocales"
+ Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: RetencionesLocales", New Exception)
+ End If
+ Else
+ Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ImpuestosTrasladoCfd"
+ Me.OnError("El SAT regresó el siguieente mensaje: " & Msg & ". Objeto: ImpuestosTrasladoCfd", New Exception)
+ End If
+
+ Else
+ Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ImpuestosRetencionesCfd "
+ Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ImpuestosRetencionesCfd ", New Exception)
+ End If
+ Else
+ Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ImpuestosCfd"
+ Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ImpuestosCfd", New Exception)
+ End If
+ Else
+ Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ConceptosCfd"
+ Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ConceptosCfd", New Exception)
+ End If
+
+ Else
+ Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ReceptorCfd"
+ Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: ReceptorCfd", New Exception)
+ End If
+
+ Else
+ Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: EmisorCfd"
+ Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: EmisorCfd", New Exception)
+ End If
+ Else
+ Retorno = "El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Comprobante"
+ Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Comprobante", New Exception)
+ End If
+ MensajeErrorCFDI = Retorno
+ Return Retorno
+ End Function
+ Public Function TimbrarFacturaRealVirtualv33(Ventas As Modelos.Factura, UsuarioActual As Usuario) As String
+ 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
+ ' 'Sucursal matriz de la empresa
+ 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(UsuarioActual.Empresa.CvePAC = 2, UsuarioActual.Empresa.RFC, "rene.molina@adsistemas.mx")
+ Dim ClaveServicio As String = If(UsuarioActual.Empresa.CvePAC = 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)
+
+ Select Case UsuarioActual.Empresa.CvePAC
+ Case 2
+ UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL"
+ Case 4
+ UrlServicio = "http://192.168.0.2:8080/ADSistemas/Timbrado.asmx?WSDL"
+ End Select
+
+ If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then
+
+ EmisorRFC = "AAA010101AAA"
+ ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
+ ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
+ Clave = "12345678a"
+ TimbraProduccion = False
+ Select Case UsuarioActual.Empresa.CvePAC
+ Case 2
+ UsuarioServicio = "fgomez"
+ ClaveServicio = "12121212"
+ UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" '"http://108.60.211.43/rvltimbrado/service1.asmx"
+ Case 4
+ UsuarioServicio = "UserTest"
+ ClaveServicio = "1234567890"
+ UrlServicio = "http://192.168.0.2:8080/ADSistemas/Timbrado.asmx?WSDLL"
+ End Select
+ End If
+
+#Region "Valida"
+ If Not File.Exists(ArchivoCertificado) Then
+ Alert("El archivo de certificado no existe", TipoMensaje.MsgError)
+ Return ""
+ End If
+ If Not File.Exists(ArchivoLLave) Then
+ Alert("El archivo de llave privada no existe", TipoMensaje.MsgError)
+ Return ""
+ End If
+ If UsuarioActual.Empresa.ContraseñaKey = "" Then
+ Alert("La clave no puede ser vacía", TipoMensaje.MsgError)
+ Return ""
+ End If
+#End Region
+
+#Region "Variables"
+ Dim llaveByte As Byte(), certByte As Byte()
+ Dim llaveBase64 As String, certBase64 As String
+ Dim cfdi As New RVCFDI33.GeneraCFDI()
+ 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 ""
+ 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 ""
+
+ End Try
+#End Region
+
+
+ sw.Stop()
+ swTiempo.AppendFormat("Verificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+
+ ' cfdi.saltarValidacion("bNtMuvZockPVhEjaPj0E")
+ ' cfdi.Decimales = 4
+#Region "Certificado"
+ cfdi.agregarCertificado(ArchivoCertificado)
+#End Region
+
+
+#Region "Comprobante"
+
+ cfdi.agregarComprobante33(
+ 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.MetodoPago,
+ ObjCFDITimbre.Comprobante.LugarExpedicion,
+ ObjCFDITimbre.Comprobante.Confirmacion)
+
+ If ObjCFDITimbre.CFDIRelacionados.TipoRelacion <> "" Then
+ cfdi.agregarCfdiRelacionados(ObjCFDITimbre.CFDIRelacionados.TipoRelacion)
+ For Each uid As String In ObjCFDITimbre.CFDIRelacionados.UUID
+ cfdi.agregarCfdiRelacionado(uid)
+ Next
+ End If
+#Region "Emisor"
+ ' cfdi.agregarCfdiRelacionados()
+ cfdi.agregarEmisor(EmisorRFC, UsuarioActual.Empresa.Empresa, UsuarioActual.Empresa.CodigoRegimenFiscal)
+
+#End Region
+
+#Region "Receptor"
+
+ cfdi.agregarReceptor(ObjCFDITimbre.Receptor.RFC, ObjCFDITimbre.Receptor.Nombre, ObjCFDITimbre.Receptor.ResidenciaFiscal, ObjCFDITimbre.Receptor.NumeroRegistroTributario, 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.agregarConcepto(concep.ClaveProdServ, concep.Noidentificacion, concep.Cantidad, concep.ClaveUnidad, concep.Unidad, concep.Descripcion, concep.ValorUnitario, concep.Importe, concep.Descuento)
+ For Each imp As CFDIConceptosImpuestos In concep.Impuestos
+ If imp.TrasladooRetencion = "T" Then
+ cfdi.agregarImpuestoConceptoTraslado(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe)
+ Else
+ cfdi.agregarImpuestoConceptoRetenido(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe)
+ End If
+ Next
+ If concep.CuentaPredial <> "" Then cfdi.agregarCuentaPredial(concep.CuentaPredial)
+ Next
+ End If
+
+#End Region
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E") Then
+
+#Region "Impuestos"
+
+ cfdi.agregarImpuestos(ObjCFDITimbre.TotalImpuestosRetenidos, ObjCFDITimbre.TotalImpuestosTrasladados)
+
+#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.agregarRetencion(Ret.Impuesto, Ret.Importe)
+ Next
+ End If
+
+ ''se acumulan los importes
+ For Each Tras In ObjCFDITimbre.Traslados
+ cfdi.agregarTraslado(Tras.Impuesto, Tras.TipoFactor, Tras.TasaOCuota, Tras.Importe)
+ Next
+#End Region
+
+#Region "Impuestos Locales"
+
+ If ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe) > 0 Then
+ cfdi.agregarImpuestosLocales("1.0", ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe), 0)
+ For Each ret As CFDIRetencionesLocales In ObjCFDITimbre.RetencionesLocales
+ If ret.Importe > 0 Then
+ cfdi.agregarRetencionesLocales(ret.ImpuestoLocalRetenido, ret.TasaRetencion, ret.Importe)
+ End If
+ Next
+ End If
+
+ If Ventas.CveComplementoTimbrado > 0 Then
+
+ Select Case Ventas.CveComplementoTimbrado
+ Case 5 'INE Proceso Ordinario Directivo Estatal"
+ cfdi.agregarIne11("Ordinario", "Directivo Estatal", "0")
+
+ cfdi.agregarEntidad(Ventas.ComplementoINE.INEEntidad, "")
+ cfdi.agregarIneContabilidad(Ventas.ComplementoINE.INEIdContabilidad)
+ Case 6 'INE Proceso Ordinario Ejecutivo Estatal"
+ cfdi.agregarIne11("Ordinario", "Ejecutivo Estatal", "0")
+
+ cfdi.agregarEntidad(Ventas.ComplementoINE.INEEntidad, "")
+ cfdi.agregarIneContabilidad(Ventas.ComplementoINE.INEIdContabilidad)
+ Case 7 'INE Proceso Ordinario Ejecutivo Nacional"
+
+ cfdi.agregarIne11("Ordinario", "Ejecutivo Nacional", Ventas.ComplementoINE.INEIdContabilidad.ToString)
+ Case 8 'INE PreCampaña
+ cfdi.agregarIne11(Ventas.ComplementoINE.INETipoProceso, "", "0")
+
+ cfdi.agregarEntidad(Ventas.ComplementoINE.INEEntidad, Ventas.ComplementoINE.INETipoComite)
+ cfdi.agregarIneContabilidad(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.agregarComercioExterior11(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.agregarComercioExterior11Emisor(If(EmisorRFC.Length >= 12, "", ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CURP))
+ cfdi.agregarComercioExterior11Domicilio(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.agregarComercioExterior11Receptor(ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumRegIdTrib)
+ cfdi.agregarComercioExterior11DomicilioReceptor(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.agregarComercioExterior11Destinatario(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.agregarComercioExterior11Mercancia(concep.NoIdentificacion, concep.FraccionArancelaria, concep.CantidadAduana, concep.UnidadAduana, concep.ValorUnitarioAduana, concep.ValorDolares)
+ If concep.DescripcionesEspecificas.Marca <> "" Then
+ cfdi.agregarComercioExterior11MercanciaDescripcionesEspeciales(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 "Complemento Pago"
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante = "P" Then
+
+ cfdi.agregarPago10(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.agregarPago10DoctoRelacionado(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.agregarPago10Impuestos(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.agregarPago10Retencion(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.agregarPago10Traslado(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.agregarNomina12(ObjCFDITimbre.Nomina.Version, ObjCFDITimbre.Nomina.TipoNomina, ObjCFDITimbre.Nomina.FechaPago.ToString, ObjCFDITimbre.Nomina.FechaInicio, ObjCFDITimbre.Nomina.FechaFin, ObjCFDITimbre.Nomina.NumDiasPagados.ToString, If(ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0, ObjCFDITimbre.Nomina.TotalPercepciones.ToString, ""), If(ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0, ObjCFDITimbre.Nomina.TotalDeducciones.ToString, ""), If(ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing AndAlso ObjCFDITimbre.Nomina.OtrosPagos.Count > 0, ObjCFDITimbre.Nomina.TotalOtrosPagos.ToString, ""))
+
+ cfdi.agregarNominaEmisor12(ObjCFDITimbre.Emisor.CURP, If(ObjCFDITimbre.Nomina.Receptor.TipoContrato = "99", "", ObjCFDITimbre.Emisor.RegistroPatronal), ObjCFDITimbre.Emisor.RFC)
+
+ If UsuarioActual.Empresa.UsaAC Then cfdi.agregarNominaEmisorEntidadSNCF12("IF", "90")
+
+ If ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0 Then
+ Dim TotalIndemnizacion As String = If(ObjCFDITimbre.Nomina.TotalIndemnizacion > 0, ObjCFDITimbre.Nomina.TotalIndemnizacion.ToString, "")
+ Dim TotalJubilacion As String = If(ObjCFDITimbre.Nomina.TotalJubilacion > 0, ObjCFDITimbre.Nomina.TotalJubilacion.ToString, "")
+ cfdi.agregarNominaPercepciones12(ObjCFDITimbre.Nomina.TotalSueldos.ToString, TotalIndemnizacion, TotalJubilacion, ObjCFDITimbre.Nomina.TotalPercepcionesGravado.ToString, ObjCFDITimbre.Nomina.TotalPercepcionesExento.ToString)
+ For Each percep As CFDINominaPercepciones In ObjCFDITimbre.Nomina.Percepciones
+ cfdi.agregarNominaPercepcionesPercepcion12(percep.TipoPercepcion, percep.Clave, percep.Concepto, Math.Round(percep.ImporteGravado, 2).ToString, Math.Round(percep.ImporteExento, 2).ToString)
+ Next
+ End If
+ 'cfdi.agregarNominaReceptorSubContratacion12("AAD990814BP6", "50")
+ 'cfdi.agregarNominaPercepcionesPercepcionAccionesOTitulos12("100", "200");
+ 'cfdi.agregarNominaPercepcionesSeparacionIndemnizacion12("100", "10", "1000", "100", "50");
+ 'cfdi.agregarNominaPercepcionesJubilacionPensionRetiro12("50", "100", "10", "100", "0");
+
+ If ObjCFDITimbre.Nomina.HorasExtras IsNot Nothing AndAlso ObjCFDITimbre.Nomina.HorasExtras.Count > 0 Then
+ For Each HoraExtra As CFDINominaHorasExtras In ObjCFDITimbre.Nomina.HorasExtras
+ cfdi.agregarNominaPercepcionesPercepcionHorasExtra12(HoraExtra.Dias, HoraExtra.TipoHoras, HoraExtra.HorasExtra.ToString, HoraExtra.ImportePagado.ToString)
+ Next
+ 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.agregarNominaIncapacidadesIncapacidad12(Incap.DiasIncapacidad, Incap.TipoIncapacidad, Incap.Importe.ToString)
+ Next
+ End If
+
+ If ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0 Then
+ cfdi.agregarNominaDeducciones12(If(Not ObjCFDITimbre.Nomina.TotalDeduccionesOtras.ToString.ToDecimal > 0, "", ObjCFDITimbre.Nomina.TotalDeduccionesOtras.ToString), If(Not ObjCFDITimbre.Nomina.TotalDeduccionesImpuestosRetenidos.ToString.ToDecimal > 0, "", Math.Round(ObjCFDITimbre.Nomina.TotalDeduccionesImpuestosRetenidos, 2).ToString))
+ For Each deduc As CFDINominaDeducciones In ObjCFDITimbre.Nomina.Deducciones
+ cfdi.agregarNominaDeduccionesDeduccion12(deduc.TipoDeduccion, deduc.Clave, deduc.Concepto, Math.Round(deduc.Importe, 2).ToString)
+ 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.agregarNominaOtrosPagosOtroPago12(otpag.TipoOtroPago, otpag.Clave, otpag.Concepto, otpag.Importe.ToString)
+ If otpag.TipoOtroPago = "002" Then
+ cfdi.agregarNominaOtrosPagosOtroPagoSubsidioAlEmpleo12(otpag.Importe.ToString)
+ End If
+
+ Next
+ End If
+ End If
+
+
+#Region "Receptor"
+
+ cfdi.agregarNominaReceptor12(ObjCFDITimbre.Nomina.Receptor.CURP,
+ ObjCFDITimbre.Nomina.Receptor.NSS,
+ ObjCFDITimbre.Nomina.Receptor.FechaInicioContrato,
+ 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.ToString,
+ ObjCFDITimbre.Nomina.Receptor.SDI.ToString,
+ ObjCFDITimbre.Nomina.Receptor.CodigoEntidadFederativa)
+
+
+ End If
+#End Region
+
+#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.GenerarXMLBase64(llaveBase64, Clave)
+ cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML)
+ ArchivoGenerado = True
+ Catch ex As Exception
+ Retorno = cfdi.MensajeError
+ MensajeErrorCFDI = cfdi.MensajeError
+ End Try
+
+#End Region
+ sw.Stop()
+ swTiempo.AppendFormat("Guardado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+
+#Region "Timbra"
+ If ArchivoGenerado Then
+
+ cfdi.TimbrarCfdi(UsuarioServicio, ClaveServicio, UrlServicio, TimbraProduccion)
+
+ sw.Stop()
+ swTiempo.AppendFormat("Timbrado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+ 'Verifica el error
+ If cfdi.CodigoError = 0 Then
+
+ 'Dim FechaCertificacion As DateTime
+ Dim FolioFiscal As String
+
+ UUID = cfdi.UUID
+ FolioFiscal = cfdi.UUID 'obtenerAtributo(cfdi.XmlTimbrado, "TimbreFiscalDigital", "UUID") 'XmlDoc.DocumentElement("cfdi:Complemento").FirstChild.Attributes("UUID").InnerText
+
+ If FolioFiscal <> "" Then
+
+ File.WriteAllText(String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML), cfdi.XmlTimbrado, System.Text.UTF8Encoding.UTF8)
+
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then
+
+ 'Actualiza Estatus Factura
+ If Ventas.CveVenta > 0 Then
+
+ Dim ObjVentas As New ClsVentas()
+ If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", ObjCFDITimbre.Comprobante.Fecha, Ventas.CveVenta, CvePAC:=UsuarioActual.Empresa.CvePAC) Then
+ Retorno = ""
+ Else
+ Retorno = "Error"
+ End If
+ ObjVentas.Dispose()
+
+
+ ''Actualiza Cliente (NumeroCuenta)
+ 'If Not UsuarioActual.CveEmpresa.Contiene(72, 80, 119) Then
+ ' Dim Hilo2 As New System.Threading.Thread(Sub() ActualizaCliente(UsuarioActual.CveUsuario, Ventas.Cliente.NumCtaPago, Ventas.CveMetodoPago, Ventas.CveCliente))
+ ' Hilo2.Start()
+ 'End If
+
+ 'Genero la addenda Ford
+ If Ventas.Cliente.Ford_GSDB <> "" Then
+
+ Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio))
+
+ Dim FolioFactura As String = ""
+ If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura
+ GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB)
+
+ End If
+
+ End If
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then
+ Using ObjNomina2 As New ClsNominas()
+
+ If ObjNomina2.UpdateEstatusNomNominas(3, UsuarioActual.Empresa.CvePAC, FolioFiscal, "", ("01/01/2000").ToDate, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) Then
+ Retorno = ""
+ Else
+ Retorno = "Error"
+ End If
+ End Using
+ End If
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante = "T" Then
+ Using ObjInv As New ClsInventarios()
+
+ If ObjInv.UpdateMovimientoTimbrado(Ventas.Inv_CveMovimiento, 1, FolioFiscal, MinFecha) Then
+ Retorno = ""
+ Else
+ Retorno = "Error"
+ End If
+ End Using
+ End If
+
+ End If
+
+ If Not IO.Directory.Exists($"{UsuarioActual.Empresa.Ruta}CBB\") Then IO.Directory.CreateDirectory($"{UsuarioActual.Empresa.Ruta}CBB\")
+
+ Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\{ObjCFDITimbre.Comprobante.SerieFolio}.jpg"
+ Dim b As Byte() = cfdi.ConvertirQrCode($"?re={UsuarioActual.Empresa.RFC}&rr={ObjCFDITimbre.Receptor.RFC}&tt={String.Format("{0,12:F6}", ObjCFDITimbre.Comprobante.Total).Trim()}&id={FolioFiscal}")
+ File.WriteAllBytes(RutaCBB, b)
+
+ Retorno = ""
+ Else
+ Retorno = "No se pudo timbrar ante el SAT. UUID no generado."
+ End If
+ sw.Stop()
+ swTiempo.AppendFormat("Actualizado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+
+ Else
+ Retorno = cfdi.MensajeError
+ MensajeErrorCFDI = cfdi.MensajeError
+ End If
+ End If
+
+ GuardaLogTimbrado(swTiempo.ToString, UsuarioActual.Empresa.CvePAC)
+#End Region
+ 'GC.Collect()
+ Return Retorno
+ End Function
+ Public Function TimbrarFacturaGoCFDIv33(Ventas As Modelos.Factura, UsuarioActual As Usuario) As String
+ 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
+ ' 'Sucursal matriz de la empresa
+ 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(UsuarioActual.Empresa.CvePAC = 2, UsuarioActual.Empresa.RFC, "rene.molina@adsistemas.mx")
+ Dim ClaveServicio As String = If(UsuarioActual.Empresa.CvePAC = 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)
+
+ Select Case UsuarioActual.Empresa.CvePAC
+ Case 2
+ UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL"
+ Case 4
+ UrlServicio = "http://juancalderon-001-site1.ftempurl.com/timbrado.asmx?WSDL"
+ End Select
+
+ If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then
+
+ EmisorRFC = "AAA010101AAA"
+ ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key"
+ ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer"
+ Clave = "12345678a"
+ TimbraProduccion = False
+ Select Case UsuarioActual.Empresa.CvePAC
+ Case 2
+ UsuarioServicio = "fgomez"
+ ClaveServicio = "12121212"
+ UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" '"http://108.60.211.43/rvltimbrado/service1.asmx"
+ Case 4
+ UsuarioServicio = "UserTest"
+ ClaveServicio = "1234567890"
+ UrlServicio = "http://juancalderon-001-site1.ftempurl.com/timbrado.asmx?WSDL"
+ End Select
+ 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.GoCfdi()
+ 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()
+
+ ' cfdi.saltarValidacion("bNtMuvZockPVhEjaPj0E")
+ ' cfdi.Decimales = 4
+#Region "Certificado"
+ cfdi.CertificadoArchivo(ArchivoCertificado)
+#End Region
+
+
+ sw.Stop()
+ swTiempo.AppendFormat("Certificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+
+#Region "Comprobante"
+
+ cfdi.Comprobante33(
+ 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.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.ResidenciaFiscal, ObjCFDITimbre.Receptor.NumeroRegistroTributario, 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)
+ For Each imp As CFDIConceptosImpuestos In concep.Impuestos
+ If imp.TrasladooRetencion = "T" Then
+ cfdi.ImpuestoConceptoTraslado(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe)
+ Else
+ cfdi.ImpuestoConceptoRetenido(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe)
+ End If
+ Next
+ If concep.CuentaPredial <> "" Then cfdi.CuentaPredial(concep.CuentaPredial)
+ Next
+ End If
+
+#End Region
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E") Then
+
+#Region "Impuestos"
+
+ cfdi.Impuestos(ObjCFDITimbre.TotalImpuestosRetenidos, ObjCFDITimbre.TotalImpuestosTrasladados)
+
+#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.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 "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 = "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 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))
+ Next
+ 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.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
+
+ 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
+
+ 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.Importe)
+ End If
+
+ Next
+ End If
+ 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.MensajeError
+ 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
+ sw.Start()
+
+#Region "Timbra"
+ If ArchivoGenerado Then
+
+ cfdi.TimbrarCfdi(UsuarioServicio, ClaveServicio, UrlServicio, TimbraProduccion)
+
+ sw.Stop()
+ swTiempo.AppendFormat("Timbrado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+ 'Verifica el error
+ If cfdi.CodigoError = 0 Then
+
+ Dim FolioFiscal As String
+
+ UUID = cfdi.UUID
+ FolioFiscal = cfdi.UUID 'obtenerAtributo(cfdi.XmlTimbrado, "TimbreFiscalDigital", "UUID") 'XmlDoc.DocumentElement("cfdi:Complemento").FirstChild.Attributes("UUID").InnerText
+
+ If FolioFiscal <> "" Then
+
+ cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML)
+
+ sw.Stop()
+ swTiempo.AppendFormat("Guardado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then
+
+ 'Actualiza Estatus Factura
+ If Ventas.CveVenta > 0 Then
+
+ Using ObjVentas As New ClsVentas()
+
+ If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", ObjCFDITimbre.Comprobante.Fecha, Ventas.CveVenta, CvePAC:=UsuarioActual.Empresa.CvePAC) Then
+ Retorno = ""
+ Else
+ Retorno = "Error"
+ End If
+ End Using
+
+ 'Genero la addenda Ford
+ If Ventas.Cliente.Ford_GSDB <> "" Then
+
+ Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio))
+
+ Dim FolioFactura As String = ""
+ If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura
+ GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB)
+
+ End If
+
+ End If
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then
+ Using ObjNomina2 As New ClsNominas()
+
+ If ObjNomina2.UpdateEstatusNomNominas(3, UsuarioActual.Empresa.CvePAC, FolioFiscal, "", ("01/01/2000").ToDate, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) Then
+ Retorno = ""
+ Else
+ Retorno = "Error"
+ End If
+ End Using
+ End If
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante = "T" Then
+ Using ObjInv As New ClsInventarios()
+ If ObjInv.UpdateMovimientoTimbrado(Ventas.Inv_CveMovimiento, 1, FolioFiscal, MinFecha) Then
+ Retorno = ""
+ Else
+ Retorno = "Error"
+ End If
+ End Using
+ End If
+ End If
+
+ If Not IO.Directory.Exists($"{UsuarioActual.Empresa.Ruta}CBB\") Then IO.Directory.CreateDirectory($"{UsuarioActual.Empresa.Ruta}CBB\")
+
+ Try
+ Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\{ObjCFDITimbre.Comprobante.SerieFolio}.jpg"
+ Dim b As Byte() = cfdi.QrCode($"?re={UsuarioActual.Empresa.RFC}&rr={ObjCFDITimbre.Receptor.RFC}&tt={String.Format("{0,12:F6}", ObjCFDITimbre.Comprobante.Total).Trim()}&id={FolioFiscal}")
+ File.WriteAllBytes(RutaCBB, b)
+ Catch ex As Exception
+ OnError("Ocurrió un error al generar el QR", ex)
+ End Try
+ Retorno = ""
+ Else
+ Retorno = "No se pudo timbrar ante el SAT. UUID no generado."
+ End If
+ sw.Stop()
+ swTiempo.AppendFormat("Actualizado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+
+ Else
+ Retorno = cfdi.MensajeError
+ MensajeErrorCFDI = cfdi.MensajeError
+ If cfdi.Xml <> "" Then cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML)
+
+ End If
+ End If
+
+#End Region
+ GuardaLogTimbrado(swTiempo.ToString, UsuarioActual.Empresa.CvePAC)
+ Return Retorno
+ End Function
+ Public Sub GuardaLogTimbrado(Str As String, CvePAC As Integer)
+ Dim ArchivoW As StreamWriter
+ Dim strLineaTMP As String
+
+ ' strLineaTMP = Chr(13) & Chr(10) & Day(Now) & "/" & Month(Now) & "/" & Year(Now) & " " & Hour(Now) & ":" & Minuto & ". " & Str & Chr(13) & Chr(10)
+ strLineaTMP = String.Format("{0}{1} .. PAC: {2} - {3} ..{4}:{5}", Chr(13), Chr(10), CvePAC, Str, DateTime.Now.ToShortDateString, DateTime.Now.ToShortTimeString)
+ Try
+ ArchivoW = New StreamWriter(String.Format("{0}\LogTimbrado.txt", AppDomain.CurrentDomain.BaseDirectory), True, System.Text.Encoding.UTF8)
+ Catch ex As UnauthorizedAccessException
+ 'Alert("No hay permisos para guardar en el Log.", Extensiones.TipoMensaje.MsgError)
+ Exit Sub
+ Catch ex As Exception
+ Exit Sub
+ End Try
+
+ Try
+ ArchivoW.WriteLine(strLineaTMP)
+ Catch
+ End Try
+
+ ArchivoW.Close()
+ ArchivoW.Dispose()
+ End Sub
+ Public Function TimbrarFacturaProFactv33(Ventas As Modelos.Factura, UsuarioActual As Usuario) As String
+ Dim sw As New Diagnostics.Stopwatch
+ Dim swTiempo As New StringBuilder
+ Dim swmili As Long = 0
+ sw.Start()
+
+ Dim Retorno As String = ""
+ Dim ObjCFDITimbre As CFDITimbre = Ventas.Timbre
+ ' '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 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
+ 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"
+ UrlServicio = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" '"http://108.60.211.43/rvltimbrado/service1.asmx"
+ End If
+
+
+#Region "Valida"
+ If Not File.Exists(ArchivoCertificado) Then
+ Alert("El archivo de certificado no existe", TipoMensaje.MsgError)
+ Return ""
+ End If
+ If Not File.Exists(ArchivoLLave) Then
+ Alert("El archivo de llave privada no existe", TipoMensaje.MsgError)
+ Return ""
+ End If
+ If UsuarioActual.Empresa.ContraseñaKey = "" Then
+ Alert("La clave no puede ser vacía", TipoMensaje.MsgError)
+ Return ""
+ End If
+#End Region
+
+#Region "Variables"
+ Dim llaveByte As Byte(), certByte As Byte()
+ Dim llaveBase64 As String, certBase64 As String
+
+ Dim complemento As String = ""
+ Dim complementoConcepto As String = ""
+ '//Inicializamos el conector el parámetro indica el ambiente en el que se utilizará
+ '//Fasle = Ambiente de pruebas
+ '//True = Ambiente de producción
+ Dim cfdi As New Profact.TimbraCFDI33.Conector(AmbienteProductivo)
+ Dim comprobante As New Profact.TimbraCFDI33.Comprobante()
+
+ If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then
+ cfdi.EstableceCredenciales("mvpNUXmQfK8=")
+ Else
+ cfdi.EstableceCredenciales($"vSGxMFWnNRy/nDoowxqrqw==|Sia123654")
+ End If
+
+#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 ""
+ 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 ""
+
+ End Try
+ sw.Stop()
+ swTiempo.AppendFormat("Verificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+#End Region
+
+
+#Region "Comprobante"
+
+
+ If ObjCFDITimbre.Comprobante.Serie <> "" Then comprobante.Serie = ObjCFDITimbre.Comprobante.Serie
+ comprobante.Folio = ObjCFDITimbre.Comprobante.Folio
+ comprobante.Version = "3.3"
+ comprobante.Fecha = ObjCFDITimbre.Comprobante.Fecha
+ comprobante.FormaPago = ObjCFDITimbre.Comprobante.FormadePago
+ If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then comprobante.CondicionesDePago = ObjCFDITimbre.Comprobante.CondicionesdePago
+
+ comprobante.SubTotal = ObjCFDITimbre.Comprobante.Subtotal
+ If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then
+ comprobante.DescuentoSpecified = True
+ comprobante.Descuento = ObjCFDITimbre.Comprobante.Descuentos
+ End If
+ comprobante.Moneda = ObjCFDITimbre.Comprobante.Moneda
+ comprobante.TipoCambio = ObjCFDITimbre.Comprobante.TipoCambio.ToDecimal
+ comprobante.TipoCambioSpecified = If(ObjCFDITimbre.Comprobante.Moneda <> "XXX", True, False)
+ comprobante.Total = ObjCFDITimbre.Comprobante.Total
+ comprobante.TipoDeComprobante = ObjCFDITimbre.Comprobante.TipoComprobante
+ comprobante.FormaPagoSpecified = If(ObjCFDITimbre.Comprobante.FormadePago <> "", True, False)
+ comprobante.MetodoPago = ObjCFDITimbre.Comprobante.MetodoPago
+ comprobante.MetodoPagoSpecified = If(ObjCFDITimbre.Comprobante.MetodoPago <> "", True, False)
+ comprobante.LugarExpedicion = ObjCFDITimbre.Comprobante.LugarExpedicion
+
+#Region "Emisor"
+ comprobante.Emisor = New Profact.TimbraCFDI33.ComprobanteEmisor()
+ comprobante.Emisor.Rfc = EmisorRFC
+ comprobante.Emisor.Nombre = UsuarioActual.Empresa.Empresa
+ comprobante.Emisor.RegimenFiscal = UsuarioActual.Empresa.CodigoRegimenFiscal
+
+#End Region
+
+#Region "Receptor"
+ comprobante.Receptor = New Profact.TimbraCFDI33.ComprobanteReceptor()
+ comprobante.Receptor.Rfc = ObjCFDITimbre.Receptor.RFC
+ comprobante.Receptor.Nombre = ObjCFDITimbre.Receptor.Nombre
+ comprobante.Receptor.UsoCFDI = ObjCFDITimbre.Receptor.UsoCFDI
+
+#End Region
+
+#End Region
+
+#Region "Conceptos"
+
+ 'Nodo conceptos, se agregan los PS
+ comprobante.Conceptos = New Profact.TimbraCFDI33.ComprobanteConcepto(ObjCFDITimbre.Conceptos.Count - 1) {}
+
+ If ObjCFDITimbre.Conceptos IsNot Nothing AndAlso ObjCFDITimbre.Conceptos.Count > 0 Then
+ Dim i As Integer = 0
+ Dim j As Integer = 0
+ Dim k As Integer = 0
+ For Each concep As CFDIConceptos In ObjCFDITimbre.Conceptos
+ comprobante.Conceptos(i) = New Profact.TimbraCFDI33.ComprobanteConcepto()
+ comprobante.Conceptos(i).Cantidad = concep.Cantidad
+
+ 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).Importe = concep.Importe
+ comprobante.Conceptos(i).ClaveProdServ = concep.ClaveProdServ
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then
+ comprobante.Conceptos(i).Descuento = concep.Descuento
+ comprobante.Conceptos(i).DescuentoSpecified = True
+ End If
+
+ If concep.Noidentificacion <> "" Then comprobante.Conceptos(i).NoIdentificacion = concep.Noidentificacion
+
+ j = 0
+ k = 0
+ If Not ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("P", "N") Then
+ comprobante.Conceptos(i).Impuestos = New Profact.TimbraCFDI33.ComprobanteConceptoImpuestos()
+ comprobante.Conceptos(i).Impuestos.Traslados = New Profact.TimbraCFDI33.ComprobanteConceptoImpuestosTraslado(concep.Impuestos.FindAll(Function(p As CFDIConceptosImpuestos) p.TrasladooRetencion = "T").Count - 1) {}
+ If concep.Impuestos.FindAll(Function(p As CFDIConceptosImpuestos) p.TrasladooRetencion <> "T").Count > 0 Then
+ comprobante.Conceptos(i).Impuestos.Retenciones = New Profact.TimbraCFDI33.ComprobanteConceptoImpuestosRetencion(concep.Impuestos.FindAll(Function(p As CFDIConceptosImpuestos) p.TrasladooRetencion <> "T").Count - 1) {}
+
+ End If
+ For Each imp As CFDIConceptosImpuestos In concep.Impuestos
+ If imp.TrasladooRetencion = "T" Then
+ comprobante.Conceptos(i).Impuestos.Traslados(j) = New Profact.TimbraCFDI33.ComprobanteConceptoImpuestosTraslado()
+ comprobante.Conceptos(i).Impuestos.Traslados(j).Base = imp.Base
+ comprobante.Conceptos(i).Impuestos.Traslados(j).Impuesto = imp.Impuesto
+ comprobante.Conceptos(i).Impuestos.Traslados(j).TipoFactor = imp.TipoFactor
+ comprobante.Conceptos(i).Impuestos.Traslados(j).Importe = imp.Importe
+ comprobante.Conceptos(i).Impuestos.Traslados(j).ImporteSpecified = True
+ comprobante.Conceptos(i).Impuestos.Traslados(j).TasaOCuota = imp.TasaOCuota.FormatoNumero(6)
+ comprobante.Conceptos(i).Impuestos.Traslados(j).TasaOCuotaSpecified = True
+ j += 1
+ Else
+ comprobante.Conceptos(i).Impuestos.Retenciones(k) = New Profact.TimbraCFDI33.ComprobanteConceptoImpuestosRetencion()
+ comprobante.Conceptos(i).Impuestos.Retenciones(k).Base = imp.Base
+ comprobante.Conceptos(i).Impuestos.Retenciones(k).Impuesto = imp.Impuesto
+ comprobante.Conceptos(i).Impuestos.Retenciones(k).TipoFactor = imp.TipoFactor
+ comprobante.Conceptos(i).Impuestos.Retenciones(k).Importe = imp.Importe
+ comprobante.Conceptos(i).Impuestos.Retenciones(k).TasaOCuota = imp.TasaOCuota.ToString.ToDecimal
+ k += 1
+ End If
+ Next
+ End If
+ i += 1
+ Next
+ End If
+
+#End Region
+
+
+ Dim LXmlComplementos As New List(Of XmlElement)()
+ Dim TieneComplemento As Boolean = False
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E") Then
+
+#Region "Impuestos"
+
+
+ comprobante.Impuestos = New Profact.TimbraCFDI33.ComprobanteImpuestos()
+ comprobante.Impuestos.Traslados = New Profact.TimbraCFDI33.ComprobanteImpuestosTraslado(ObjCFDITimbre.Traslados.Count - 1) {}
+
+ Dim y As Integer = 0
+
+ For Each Tras In ObjCFDITimbre.Traslados
+ comprobante.Impuestos.Traslados(y) = New Profact.TimbraCFDI33.ComprobanteImpuestosTraslado()
+ comprobante.Impuestos.Traslados(y).Impuesto = Tras.Impuesto
+ comprobante.Impuestos.Traslados(y).TipoFactor = Tras.TipoFactor
+ comprobante.Impuestos.Traslados(y).TasaOCuota = Tras.TasaOCuota.FormatoNumero(6)
+ comprobante.Impuestos.Traslados(y).Importe = Tras.Importe
+ y += 1
+ Next
+
+ comprobante.Impuestos.TotalImpuestosTrasladados = ObjCFDITimbre.TotalImpuestosTrasladados
+ comprobante.Impuestos.TotalImpuestosTrasladadosSpecified = True
+
+ If ObjCFDITimbre.TotalImpuestosRetenidos > 0 Then
+ comprobante.Impuestos.Retenciones = New Profact.TimbraCFDI33.ComprobanteImpuestosRetencion(ObjCFDITimbre.Retenciones.Count - 1) {}
+
+ Dim w As Integer = 0
+
+ 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
+ w += 1
+ Next
+
+ comprobante.Impuestos.TotalImpuestosRetenidos = ObjCFDITimbre.TotalImpuestosRetenidos
+ comprobante.Impuestos.TotalImpuestosRetenidosSpecified = True
+ End If
+
+
+
+#End Region
+
+
+#Region "Impuestos Locales"
+
+
+ If ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe) > 0 Then
+ Dim Imp = New Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocales()
+ Imp.version = "1.0"
+ Imp.TotaldeRetenciones = ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe).FormatoNumero().ToDecimal
+ Imp.TotaldeTraslados = 0
+ Imp.RetencionesLocales = New Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocalesRetencionesLocales(ObjCFDITimbre.RetencionesLocales.Count - 1) {}
+ Dim i As Integer = 0
+ For Each ret As CFDIRetencionesLocales In ObjCFDITimbre.RetencionesLocales
+ If ret.Importe > 0 Then
+ Imp.RetencionesLocales(i) = New Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocalesRetencionesLocales()
+ Imp.RetencionesLocales(i).ImpLocRetenido = ret.ImpuestoLocalRetenido
+ Imp.RetencionesLocales(i).TasadeRetencion = ret.TasaRetencion.FormatoNumero().ToDecimal
+ Imp.RetencionesLocales(i).Importe = ret.Importe.FormatoNumero().ToDecimal
+ i += 1
+ End If
+ Next
+
+ Dim nsImpLocal As New System.Xml.Serialization.XmlSerializerNamespaces()
+ nsImpLocal.Add("implocal", "http://www.sat.gob.mx/implocal")
+ Dim xmlImpLocal As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(Imp, GetType(Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocales), nsImpLocal)
+ Dim docImpLocal As New XmlDocument()
+ docImpLocal.LoadXml(xmlImpLocal)
+ LXmlComplementos.Add(docImpLocal.DocumentElement)
+ comprobante.ImpLocalSpecified = True
+ TieneComplemento = True
+ 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
+ Dim ComExt = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExterior()
+ ComExt.Version = "1.1"
+ ComExt.MotivoTrasladoSpecified = True
+ ComExt.MotivoTraslado = ObjCFDITimbre.Complementos.ComercioExterior11.MotivoTraslado
+ ComExt.TipoOperacion = ObjCFDITimbre.Complementos.ComercioExterior11.TipoOperacion
+ ComExt.ClaveDePedimentoSpecified = True
+ ComExt.ClaveDePedimento = ObjCFDITimbre.Complementos.ComercioExterior11.ClavedePedimento
+ ComExt.CertificadoOrigenSpecified = True
+ ComExt.CertificadoOrigen = ObjCFDITimbre.Complementos.ComercioExterior11.CertificadoOrigen.ToEntero
+ If ObjCFDITimbre.Complementos.ComercioExterior11.NumCertificadoOrigen <> "" Then
+ ComExt.NumCertificadoOrigen = ObjCFDITimbre.Complementos.ComercioExterior11.NumCertificadoOrigen
+ End If
+ If ObjCFDITimbre.Complementos.ComercioExterior11.NumeroExportadorConfiable <> "" Then
+ ComExt.NumeroExportadorConfiable = ObjCFDITimbre.Complementos.ComercioExterior11.NumeroExportadorConfiable
+ End If
+ ComExt.IncotermSpecified = True
+ ComExt.Incoterm = ObjCFDITimbre.Complementos.ComercioExterior11.Incoterm
+ ComExt.SubdivisionSpecified = True
+ ComExt.Subdivision = ObjCFDITimbre.Complementos.ComercioExterior11.Subdivision.ToEntero
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Observaciones <> "" Then
+ ComExt.Observaciones = ObjCFDITimbre.Complementos.ComercioExterior11.Observaciones
+ End If
+ ComExt.TipoCambioUSDSpecified = True
+ ComExt.TipoCambioUSD = ObjCFDITimbre.Complementos.ComercioExterior11.TipoCambioUSD
+ ComExt.TotalUSDSpecified = True
+ ComExt.TotalUSD = ObjCFDITimbre.Complementos.ComercioExterior11.TotalUSD
+
+ 'EMISOR
+ ComExt.Emisor = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorEmisor()
+ If EmisorRFC.Length < 12 Then
+ ComExt.Emisor.Curp = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CURP
+ End If
+ ComExt.Emisor.Domicilio = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorEmisorDomicilio
+ ComExt.Emisor.Domicilio.Calle = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Calle
+ ComExt.Emisor.Domicilio.CodigoPostal = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CP
+ ComExt.Emisor.Domicilio.ColoniaSpecified = True
+ ComExt.Emisor.Domicilio.Colonia = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Colonia
+ ComExt.Emisor.Domicilio.Estado = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Estado
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Localidad <> "" Then
+ ComExt.Emisor.Domicilio.LocalidadSpecified = False
+ ComExt.Emisor.Domicilio.Localidad = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Localidad
+ End If
+ ComExt.Emisor.Domicilio.MunicipioSpecified = True
+ ComExt.Emisor.Domicilio.Municipio = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Municipio
+ ComExt.Emisor.Domicilio.NumeroExterior = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.NumeroExterior
+ ComExt.Emisor.Domicilio.NumeroInterior = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.NumeroInterior
+ ComExt.Emisor.Domicilio.Pais = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Pais
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Referencia <> "" Then
+ ComExt.Emisor.Domicilio.Referencia = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Referencia
+ End If
+
+ 'RECEPTOR
+ ComExt.Receptor = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorReceptor
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumRegIdTrib <> "" Then
+ ComExt.Receptor.NumRegIdTrib = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumRegIdTrib
+ End If
+ ComExt.Receptor.Domicilio = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorReceptorDomicilio
+ ComExt.Receptor.Domicilio.Calle = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Calle
+ ComExt.Receptor.Domicilio.CodigoPostal = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.CP
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Colonia <> "" Then
+ ComExt.Receptor.Domicilio.Colonia = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Colonia
+ End If
+ ComExt.Receptor.Domicilio.Estado = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Estado
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Localidad <> "" Then
+ ComExt.Receptor.Domicilio.Localidad = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Localidad
+ End If
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Municipio <> "" Then
+ ComExt.Receptor.Domicilio.Municipio = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Municipio
+ End If
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroExterior <> "" Then
+ ComExt.Receptor.Domicilio.NumeroExterior = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroExterior
+ End If
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroInterior <> "" Then
+ ComExt.Receptor.Domicilio.NumeroInterior = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroInterior
+ End If
+ ComExt.Receptor.Domicilio.Pais = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Pais
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Referencia <> "" Then
+ ComExt.Receptor.Domicilio.Referencia = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Referencia
+ End If
+
+ 'DESTINATARIO
+ ComExt.Destinatario = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatario(0) {}
+ ComExt.Destinatario(0) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatario()
+ ComExt.Destinatario(0).Nombre = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Nombre
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumRegIdTrib <> "" Then
+ ComExt.Destinatario(0).NumRegIdTrib = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumRegIdTrib
+ End If
+ ComExt.Destinatario(0).Domicilio = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatarioDomicilio(0) {}
+ ComExt.Destinatario(0).Domicilio(0) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatarioDomicilio()
+ ComExt.Destinatario(0).Domicilio(0).Calle = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Calle
+ ComExt.Destinatario(0).Domicilio(0).CodigoPostal = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.CP
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Colonia <> "" Then
+ ComExt.Destinatario(0).Domicilio(0).Colonia = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Colonia
+ End If
+ ComExt.Destinatario(0).Domicilio(0).Estado = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Estado
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Localidad <> "" Then
+ ComExt.Destinatario(0).Domicilio(0).Localidad = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Localidad
+ End If
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Municipio <> "" Then
+ ComExt.Destinatario(0).Domicilio(0).Municipio = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Municipio
+ End If
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroExterior <> "" Then
+ ComExt.Destinatario(0).Domicilio(0).NumeroExterior = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroExterior
+ End If
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroInterior <> "" Then
+ ComExt.Destinatario(0).Domicilio(0).NumeroInterior = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroInterior
+ End If
+ ComExt.Destinatario(0).Domicilio(0).Pais = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Pais
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Referencia <> "" Then
+ ComExt.Destinatario(0).Domicilio(0).Referencia = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Referencia
+ End If
+
+ 'MERCANCIAS
+ If ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias IsNot Nothing AndAlso ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias.Count > 0 Then
+ ComExt.Mercancias = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercancia(ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias.Count - 1) {}
+ Dim i As Integer
+ For Each concep As CFDIComercioExterior11Mercancias In ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias
+ ComExt.Mercancias(i) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercancia()
+ ComExt.Mercancias(i).NoIdentificacion = concep.NoIdentificacion
+ ComExt.Mercancias(i).FraccionArancelariaSpecified = True
+ ComExt.Mercancias(i).FraccionArancelaria = concep.FraccionArancelaria
+ ComExt.Mercancias(i).CantidadAduanaSpecified = True
+ ComExt.Mercancias(i).CantidadAduana = concep.CantidadAduana
+ ComExt.Mercancias(i).UnidadAduanaSpecified = True
+ ComExt.Mercancias(i).UnidadAduana = concep.UnidadAduana
+ ComExt.Mercancias(i).ValorUnitarioAduanaSpecified = True
+ ComExt.Mercancias(i).ValorUnitarioAduana = concep.ValorUnitarioAduana
+ ComExt.Mercancias(i).ValorDolares = concep.ValorDolares
+ If concep.DescripcionesEspecificas.Marca <> "" Then
+ ComExt.Mercancias(i).DescripcionesEspecificas = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercanciaDescripcionesEspecificas(0) {}
+ ComExt.Mercancias(i).DescripcionesEspecificas(0) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercanciaDescripcionesEspecificas()
+ If concep.DescripcionesEspecificas.Marca <> "" Then
+ ComExt.Mercancias(i).DescripcionesEspecificas(0).Marca = concep.DescripcionesEspecificas.Marca
+ End If
+ If concep.DescripcionesEspecificas.Modelo <> "" Then
+ ComExt.Mercancias(i).DescripcionesEspecificas(0).Modelo = concep.DescripcionesEspecificas.Modelo
+ End If
+ If concep.DescripcionesEspecificas.SubModelo <> "" Then
+ ComExt.Mercancias(i).DescripcionesEspecificas(0).SubModelo = concep.DescripcionesEspecificas.SubModelo
+ End If
+ If concep.DescripcionesEspecificas.NumeroSerie <> "" Then
+ ComExt.Mercancias(i).DescripcionesEspecificas(0).NumeroSerie = concep.DescripcionesEspecificas.NumeroSerie
+ End If
+ End If
+ i += 1
+ Next
+ End If
+ Dim nsComer As New System.Xml.Serialization.XmlSerializerNamespaces()
+ nsComer.Add("cce11", "http://www.sat.gob.mx/ComercioExterior11")
+ Dim xmlComer As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(ComExt, GetType(Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExterior), nsComer)
+ Dim docComer As New XmlDocument()
+ docComer.LoadXml(xmlComer)
+ LXmlComplementos.Add(docComer.DocumentElement)
+ comprobante.ComercioExterior11Specified = True
+ TieneComplemento = True
+ End If
+ End If
+
+#End Region
+
+
+
+
+
+
+ End If
+
+#Region "Complemento Pago"
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante = "P" Then
+ Dim ComPag = New Profact.TimbraCFDI33.Complementos.Pagos10.Pagos()
+ ComPag.Pago = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPago(0) {}
+ ComPag.Pago(0) = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPago()
+ 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).TipoCadPagoSpecified = If(ObjCFDITimbre.ComplementoPagos.MonedaP = "MXN", False, True)
+ ComPag.Pago(0).TipoCambioP = ObjCFDITimbre.ComplementoPagos.TipoCambioP.ToDecimal
+ ComPag.Pago(0).Monto = ObjCFDITimbre.ComplementoPagos.Monto.ToDecimal
+ If ObjCFDITimbre.ComplementoPagos.NumOperacion <> "" Then
+ ComPag.Pago(0).NumOperacion = ObjCFDITimbre.ComplementoPagos.NumOperacion
+ End If
+ If ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaOrd <> "" Then
+ ComPag.Pago(0).RfcEmisorCtaOrd = ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaOrd
+ End If
+ If ObjCFDITimbre.ComplementoPagos.NomBancoOrdExt <> "" Then
+ ComPag.Pago(0).NomBancoOrdExt = ObjCFDITimbre.ComplementoPagos.NomBancoOrdExt
+ End If
+ If ObjCFDITimbre.ComplementoPagos.CtaOrdenante <> "" Then
+ ComPag.Pago(0).CtaOrdenante = ObjCFDITimbre.ComplementoPagos.CtaOrdenante
+ End If
+ If ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaBen <> "" Then
+ ComPag.Pago(0).RfcEmisorCtaBen = ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaBen
+ End If
+ If ObjCFDITimbre.ComplementoPagos.CtaBeneficiario <> "" Then
+ ComPag.Pago(0).CtaBeneficiario = ObjCFDITimbre.ComplementoPagos.CtaBeneficiario
+ End If
+ ComPag.Pago(0).TipoCadPago = ObjCFDITimbre.ComplementoPagos.TipoCadPago
+ If ObjCFDITimbre.ComplementoPagos.CertPago <> "" Then
+ 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).ToString
+ End If
+
+ If ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count > 0 Then
+ ComPag.Pago(0).DoctoRelacionado = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoDoctoRelacionado(ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count - 1) {}
+ Dim i As Integer
+ For Each doc As CFDIComplementoPagosDocsRelacionados In ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados
+ ComPag.Pago(0).DoctoRelacionado(i) = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoDoctoRelacionado()
+ ComPag.Pago(0).DoctoRelacionado(i).IdDocumento = doc.IdDocumento
+ If Not String.IsNullOrEmpty(doc.Serie) Then
+ ComPag.Pago(0).DoctoRelacionado(i).Serie = doc.Serie
+ End If
+ ComPag.Pago(0).DoctoRelacionado(i).Folio = doc.Folio
+ ComPag.Pago(0).DoctoRelacionado(i).MonedaDR = doc.MonedaDR
+ ComPag.Pago(0).DoctoRelacionado(i).TipoCambioDRSpecified = If(doc.TipoCambioDR.ToDecimal = 0, False, True)
+ ComPag.Pago(0).DoctoRelacionado(i).TipoCambioDR = doc.TipoCambioDR.ToDecimal
+ 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).ImpPagadoSpecified = True
+ ComPag.Pago(0).DoctoRelacionado(i).ImpPagado = doc.ImpPagado.ToDecimal
+
+ ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsolutoSpecified = True
+ ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsoluto = doc.ImpSaldoInsoluto.ToDecimal
+ i += 1
+ Next
+
+ 'Estos impuestos aplicarían para anticipos
+ If ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos > 0 OrElse ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados > 0 Then
+ 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).TotalImpuestosTrasladadosSpecified = True
+ ComPag.Pago(0).Impuestos(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).Impuestos(0).Retenciones = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoImpuestosRetencion((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).Impuestos(0).Retenciones(x) = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoImpuestosRetencion()
+ ComPag.Pago(0).Impuestos(0).Retenciones(x).Impuesto = Ret.Impuesto
+ ComPag.Pago(0).Impuestos(0).Retenciones(x).Importe = 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).Impuestos(0).Traslados = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoImpuestosTraslado((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).Impuestos(0).Traslados(x) = New Profact.TimbraCFDI33.Complementos.Pagos10.PagosPagoImpuestosTraslado()
+ ComPag.Pago(0).Impuestos(0).Traslados(x).Impuesto = Tra.Impuesto
+ ComPag.Pago(0).Impuestos(0).Traslados(x).TipoFactor = Tra.TipoFactor
+ ComPag.Pago(0).Impuestos(0).Traslados(x).TasaOCuota = Tra.TasaOCuota.ToString
+ ComPag.Pago(0).Impuestos(0).Traslados(x).Importe = Tra.Importe
+ x += 1
+ Next
+ End If
+
+ End If
+
+
+ Dim nsComp As New System.Xml.Serialization.XmlSerializerNamespaces()
+ nsComp.Add("pago10", "http://www.sat.gob.mx/Pagos")
+ Dim xmlComp As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(ComPag, GetType(Profact.TimbraCFDI33.Complementos.Pagos10.Pagos), nsComp)
+ Dim docComp As New XmlDocument()
+ docComp.LoadXml(xmlComp)
+ comprobante.PagosSpecified = True
+ LXmlComplementos.Add(docComp.DocumentElement)
+ TieneComplemento = True
+ End If
+
+ End If
+#End Region
+
+#Region "Nomina12"
+ If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then
+ Dim Nom = New Profact.TimbraCFDI33.Complementos.Nomina12.Nomina()
+ 'cfdi.Esquema.AgregarEsquema("http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd")
+ Nom.Version = ObjCFDITimbre.Nomina.Version
+ Nom.TipoNomina = ObjCFDITimbre.Nomina.TipoNomina
+ Nom.FechaPago = ObjCFDITimbre.Nomina.FechaPago
+ Nom.FechaInicialPago = ObjCFDITimbre.Nomina.FechaInicio.ToDate
+ Nom.FechaFinalPago = ObjCFDITimbre.Nomina.FechaFin.ToDate
+ Nom.NumDiasPagados = ObjCFDITimbre.Nomina.NumDiasPagados.ToString
+ Nom.TotalPercepcionesSpecified = True
+ Nom.TotalPercepciones = ObjCFDITimbre.Nomina.TotalPercepciones.ToDecimal
+ Nom.TotalDeduccionesSpecified = True
+ Nom.TotalDeducciones = ObjCFDITimbre.Nomina.TotalDeducciones.ToDecimal
+ Nom.TotalOtrosPagosSpecified = True
+ Nom.TotalOtrosPagos = ObjCFDITimbre.Nomina.TotalOtrosPagos.ToDecimal
+
+ Nom.Emisor = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaEmisor
+ Nom.Emisor.Curp = ObjCFDITimbre.Emisor.CURP
+ Nom.Emisor.RegistroPatronal = ObjCFDITimbre.Emisor.RegistroPatronal
+ Nom.Emisor.RfcPatronOrigen = ObjCFDITimbre.Emisor.RFC
+
+ If UsuarioActual.Empresa.UsaAC Then Nom.Emisor.EntidadSNCF.OrigenRecurso = "IF" : Nom.Emisor.EntidadSNCF.MontoRecursoPropio = 90
+
+ If ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0 Then
+ Dim TotalIndemnizacion As String = If(ObjCFDITimbre.Nomina.TotalIndemnizacion > 0, ObjCFDITimbre.Nomina.TotalIndemnizacion.ToString, "")
+ Dim TotalJubilacion As String = If(ObjCFDITimbre.Nomina.TotalJubilacion > 0, ObjCFDITimbre.Nomina.TotalJubilacion.ToString, "")
+ Nom.Percepciones = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepciones
+ Nom.Percepciones.TotalSueldosSpecified = True
+ Nom.Percepciones.TotalSueldos = ObjCFDITimbre.Nomina.TotalSueldos.ToDecimal
+ Nom.Percepciones.TotalSeparacionIndemnizacionSpecified = True
+ Nom.Percepciones.TotalSeparacionIndemnizacion = TotalIndemnizacion.ToDecimal
+ Nom.Percepciones.TotalJubilacionPensionRetiroSpecified = True
+ Nom.Percepciones.TotalJubilacionPensionRetiro = TotalJubilacion.ToDecimal
+ Nom.Percepciones.TotalGravado = ObjCFDITimbre.Nomina.TotalPercepcionesGravado.ToDecimal
+ Nom.Percepciones.TotalExento = ObjCFDITimbre.Nomina.TotalPercepcionesExento.ToDecimal
+ Nom.Percepciones.Percepcion = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcion(ObjCFDITimbre.Nomina.Percepciones.Count - 1) {}
+ Dim i As Integer = 0
+ For Each percep As CFDINominaPercepciones In ObjCFDITimbre.Nomina.Percepciones
+ Nom.Percepciones.Percepcion(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcion()
+ Nom.Percepciones.Percepcion(i).TipoPercepcion = percep.TipoPercepcion
+ Nom.Percepciones.Percepcion(i).Clave = percep.Clave
+ Nom.Percepciones.Percepcion(i).Concepto = percep.Concepto
+ Nom.Percepciones.Percepcion(i).ImporteGravado = Math.Round(percep.ImporteGravado, 2).ToString.ToDecimal
+ Nom.Percepciones.Percepcion(i).ImporteExento = Math.Round(percep.ImporteExento, 2).ToString.ToDecimal
+
+ If ObjCFDITimbre.Nomina.HorasExtras IsNot Nothing AndAlso ObjCFDITimbre.Nomina.HorasExtras.Count > 0 Then
+ Nom.Percepciones.Percepcion(i).HorasExtra = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcionHorasExtra(ObjCFDITimbre.Nomina.HorasExtras.Count - 1) {}
+ Dim x As Integer = 0
+ For Each HoraExtra As CFDINominaHorasExtras In ObjCFDITimbre.Nomina.HorasExtras
+ Nom.Percepciones.Percepcion(i).HorasExtra(x) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcionHorasExtra()
+ Nom.Percepciones.Percepcion(i).HorasExtra(x).Dias = HoraExtra.Dias.ToEntero
+ Nom.Percepciones.Percepcion(i).HorasExtra(x).TipoHoras = HoraExtra.TipoHoras
+ Nom.Percepciones.Percepcion(i).HorasExtra(x).HorasExtra = HoraExtra.HorasExtra.ToEntero
+ Nom.Percepciones.Percepcion(i).HorasExtra(x).ImportePagado = HoraExtra.ImportePagado.ToDecimal
+ x += 1
+ Next
+ End If
+
+ i += 1
+ Next
+ End If
+ 'cfdi.agregarNominaReceptorSubContratacion12("AAD990814BP6", "50")
+ 'cfdi.agregarNominaPercepcionesPercepcionAccionesOTitulos12("100", "200");
+ 'cfdi.agregarNominaPercepcionesSeparacionIndemnizacion12("100", "10", "1000", "100", "50");
+ 'cfdi.agregarNominaPercepcionesJubilacionPensionRetiro12("50", "100", "10", "100", "0");
+
+
+
+ If ObjCFDITimbre.Nomina.Incapacidades IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Incapacidades.Count > 0 Then
+ Nom.Incapacidades = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaIncapacidad(ObjCFDITimbre.Nomina.Incapacidades.Count - 1) {}
+ Dim i As Integer = 0
+ For Each Incap As CFDINominaIncapacidades In ObjCFDITimbre.Nomina.Incapacidades
+ Nom.Incapacidades(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaIncapacidad()
+ Nom.Incapacidades(i).DiasIncapacidad = Incap.DiasIncapacidad.ToEntero
+ Nom.Incapacidades(i).TipoIncapacidad = Incap.TipoIncapacidad
+ Nom.Incapacidades(i).ImporteMonetarioSpecified = True
+ Nom.Incapacidades(i).ImporteMonetario = Incap.Importe.ToDecimal
+ i += 1
+ Next
+ End If
+
+ If ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0 Then
+ Nom.Deducciones = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaDeducciones()
+ Nom.Deducciones.TotalOtrasDeduccionesSpecified = True
+ Nom.Deducciones.TotalOtrasDeducciones = Math.Round(ObjCFDITimbre.Nomina.TotalDeduccionesOtras, 2)
+ Nom.Deducciones.TotalImpuestosRetenidosSpecified = True
+ Nom.Deducciones.TotalImpuestosRetenidos = Math.Round(ObjCFDITimbre.Nomina.TotalDeduccionesImpuestosRetenidos, 2)
+ Nom.Deducciones.Deduccion = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaDeduccionesDeduccion(ObjCFDITimbre.Nomina.Deducciones.Count - 1) {}
+ Dim i As Integer = 0
+ For Each deduc As CFDINominaDeducciones In ObjCFDITimbre.Nomina.Deducciones
+ Nom.Deducciones.Deduccion(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaDeduccionesDeduccion()
+ Nom.Deducciones.Deduccion(i).TipoDeduccion = deduc.TipoDeduccion
+ Nom.Deducciones.Deduccion(i).Clave = deduc.Clave
+ Nom.Deducciones.Deduccion(i).Concepto = deduc.Concepto
+ Nom.Deducciones.Deduccion(i).Importe = Math.Round(deduc.Importe, 2)
+ i += 1
+ 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
+ Nom.OtrosPagos = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaOtroPago(ObjCFDITimbre.Nomina.OtrosPagos.Count - 1) {}
+ Dim i As Integer = 0
+ For Each otpag As CFDINominaOtrosPagos In ObjCFDITimbre.Nomina.OtrosPagos
+ Nom.OtrosPagos(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaOtroPago()
+ Nom.OtrosPagos(i).TipoOtroPago = otpag.TipoOtroPago
+ Nom.OtrosPagos(i).Clave = otpag.Clave
+ Nom.OtrosPagos(i).Concepto = otpag.Concepto
+ Nom.OtrosPagos(i).Importe = otpag.Importe.ToDecimal
+ If otpag.TipoOtroPago = "002" Then
+ Nom.OtrosPagos(i).SubsidioAlEmpleo = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaOtroPagoSubsidioAlEmpleo()
+ Nom.OtrosPagos(i).SubsidioAlEmpleo.SubsidioCausado = otpag.Importe.ToDecimal
+ End If
+ i += 1
+ Next
+ End If
+ End If
+
+
+#Region "Receptor"
+ Nom.Receptor = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaReceptor()
+ Nom.Receptor.Curp = ObjCFDITimbre.Nomina.Receptor.CURP
+ Nom.Receptor.NumSeguridadSocial = ObjCFDITimbre.Nomina.Receptor.NSS
+ Nom.Receptor.FechaInicioRelLaboralSpecified = True
+ Nom.Receptor.FechaInicioRelLaboral = ObjCFDITimbre.Nomina.Receptor.FechaInicioContrato.ToDate
+ Nom.Receptor.Antigüedad = ObjCFDITimbre.Nomina.Receptor.Antiguedad
+ Nom.Receptor.TipoContrato = ObjCFDITimbre.Nomina.Receptor.TipoContrato
+ 'Nom.Receptor.Sindicalizado = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaReceptorSindicalizado()
+ 'Nom.Receptor.Sindicalizado = ObjCFDITimbre.Nomina.Receptor.Sindicalizado
+ Nom.Receptor.TipoJornadaSpecified = True
+ Nom.Receptor.TipoJornada = ObjCFDITimbre.Nomina.Receptor.CodigoTipoJornada
+ Nom.Receptor.TipoRegimen = ObjCFDITimbre.Nomina.Receptor.CodigoRegimenContratacion
+ Nom.Receptor.NumEmpleado = ObjCFDITimbre.Nomina.Receptor.CodigoEmpleado
+ Nom.Receptor.Departamento = ObjCFDITimbre.Nomina.Receptor.Departamento
+ Nom.Receptor.Puesto = ObjCFDITimbre.Nomina.Receptor.Puesto
+ Nom.Receptor.RiesgoPuestoSpecified = True
+ Nom.Receptor.RiesgoPuesto = ObjCFDITimbre.Nomina.Receptor.CodigoRiesgoPuesto
+ Nom.Receptor.PeriodicidadPago = ObjCFDITimbre.Nomina.Receptor.TipoPeriodo
+ Nom.Receptor.BancoSpecified = True
+ Nom.Receptor.Banco = ObjCFDITimbre.Nomina.Receptor.CodigoBanco
+ Nom.Receptor.CuentaBancaria = ObjCFDITimbre.Nomina.Receptor.NumeroCuenta
+ Nom.Receptor.SalarioBaseCotAporSpecified = True
+ Nom.Receptor.SalarioBaseCotApor = ObjCFDITimbre.Nomina.Receptor.SBC.ToDecimal
+ Nom.Receptor.SalarioDiarioIntegradoSpecified = True
+ Nom.Receptor.SalarioDiarioIntegrado = ObjCFDITimbre.Nomina.Receptor.SDI.ToDecimal
+ Nom.Receptor.ClaveEntFed = ObjCFDITimbre.Nomina.Receptor.CodigoEntidadFederativa
+
+ Dim nsNom As New System.Xml.Serialization.XmlSerializerNamespaces()
+ nsNom.Add("nomina12", "http://www.sat.gob.mx/nomina12")
+ Dim xmlNom As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(Nom, GetType(Profact.TimbraCFDI33.Complementos.Nomina12.Nomina), nsNom)
+ Dim docNom As New XmlDocument()
+ docNom.LoadXml(xmlNom)
+ LXmlComplementos.Add(docNom.DocumentElement)
+ TieneComplemento = True
+
+
+ End If
+#End Region
+
+#End Region
+
+#Region "Detallista"
+ If Ventas.Cliente.AplicaDetallista Then
+ Dim detallista As Profact.TimbraCFDI33.Complementos.Detallista.detallista = New Profact.TimbraCFDI33.Complementos.Detallista.detallista
+ detallista.type = "SimpleInvoiceType"
+ detallista.contentVersion = "1.3.1"
+ detallista.documentStructureVersion = "AMC8.1"
+ detallista.documentStatus = Profact.TimbraCFDI33.Complementos.Detallista.detallistaDocumentStatus.ORIGINAL
+
+ detallista.DeliveryNote = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaDeliveryNote
+ detallista.DeliveryNote.referenceIdentification = New String((1)) {}
+ detallista.DeliveryNote.referenceIdentification(0) = "1"
+ detallista.DeliveryNote.ReferenceDate = New DateTime
+ detallista.DeliveryNote.ReferenceDate = comprobante.Fecha
+ detallista.DeliveryNote.ReferenceDateSpecified = True
+
+ detallista.requestForPaymentIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaRequestForPaymentIdentification
+ detallista.requestForPaymentIdentification.entityType = Profact.TimbraCFDI33.Complementos.Detallista.detallistaRequestForPaymentIdentificationEntityType.INVOICE
+
+ detallista.specialInstruction = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaSpecialInstruction((1)) {}
+ detallista.specialInstruction(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaSpecialInstruction
+ detallista.specialInstruction(0).code = Profact.TimbraCFDI33.Complementos.Detallista.detallistaSpecialInstructionCode.ZZZ
+ Dim TotalTexto = New String() {Ventas.TotalTC.ToString.ToDouble.Texto2Letras.ToUpper()}
+ Dim propertyInfo = detallista.specialInstruction(0).GetType().GetProperty("text")
+ propertyInfo.SetValue(detallista.specialInstruction(0), Convert.ChangeType(TotalTexto, propertyInfo.PropertyType), Nothing)
+
+ detallista.orderIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaOrderIdentification
+ detallista.orderIdentification.referenceIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaOrderIdentificationReferenceIdentification((1)) {}
+ detallista.orderIdentification.referenceIdentification(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaOrderIdentificationReferenceIdentification
+ detallista.orderIdentification.referenceIdentification(0).type = Profact.TimbraCFDI33.Complementos.Detallista.detallistaOrderIdentificationReferenceIdentificationType.ON
+ detallista.orderIdentification.referenceIdentification(0).Value = Ventas.Det_OrdenCompra
+ detallista.orderIdentification.ReferenceDateSpecified = True
+ detallista.orderIdentification.ReferenceDate = Ventas.Det_FechaOrdenCompra.ToDate()
+
+ detallista.AdditionalInformation = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaReferenceIdentification((1)) {}
+ detallista.AdditionalInformation(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaReferenceIdentification
+ detallista.AdditionalInformation(0).type = Profact.TimbraCFDI33.Complementos.Detallista.detallistaReferenceIdentificationType.ATZ
+ detallista.AdditionalInformation(0).Value = Ventas.Det_ContraRecibo
+
+ detallista.DeliveryNote = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaDeliveryNote
+ detallista.DeliveryNote.ReferenceDate = Ventas.Det_FechaOrdenCompra.ToDate
+ detallista.DeliveryNote.referenceIdentification = New String((1)) {}
+ detallista.DeliveryNote.referenceIdentification(0) = Ventas.Det_ContraRecibo
+
+ detallista.buyer = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaBuyer
+ detallista.buyer.gln = Ventas.Cliente.Detallista_GLNComprador
+ detallista.buyer.contactInformation = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaBuyerContactInformation
+ detallista.buyer.contactInformation.personOrDepartmentName = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaBuyerContactInformationPersonOrDepartmentName
+ detallista.buyer.contactInformation.personOrDepartmentName.text = Ventas.Cliente.Detallista_Departamento
+
+ detallista.seller = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaSeller
+ detallista.seller.gln = Ventas.Cliente.Detallista_GLNVendedor
+ detallista.seller.alternatePartyIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaSellerAlternatePartyIdentification
+ detallista.seller.alternatePartyIdentification.type = Profact.TimbraCFDI33.Complementos.Detallista.detallistaSellerAlternatePartyIdentificationType.SELLER_ASSIGNED_IDENTIFIER_FOR_A_PARTY
+ detallista.seller.alternatePartyIdentification.Value = Ventas.Cliente.Detallista_NumProveedor
+
+ 'detallista.shipTo = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaShipTo
+ 'detallista.shipTo.gln = "0000000000000"
+ 'detallista.shipTo.nameAndAddress = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaShipToNameAndAddress
+ 'detallista.shipTo.nameAndAddress.name = New String((1)) {}
+ 'detallista.shipTo.nameAndAddress.name(0) = Ventas.Cliente.Direccion
+ 'detallista.shipTo.nameAndAddress.streetAddressOne = New String((1)) {}
+ 'detallista.shipTo.nameAndAddress.streetAddressOne(0) = Ventas.Cliente.NoInt
+ 'detallista.shipTo.nameAndAddress.city = New String((1)) {}
+ 'detallista.shipTo.nameAndAddress.city(0) = Ventas.Cliente.Ciudad
+ 'detallista.shipTo.nameAndAddress.postalCode = New String((1)) {}
+ 'detallista.shipTo.nameAndAddress.postalCode(0) = Ventas.Cliente.CP
+
+ detallista.paymentTerms = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTerms
+ detallista.paymentTerms.netPayment = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTermsNetPayment
+ detallista.paymentTerms.netPayment.paymentTimePeriod = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTermsNetPaymentPaymentTimePeriod
+ detallista.paymentTerms.netPayment.paymentTimePeriod.timePeriodDue = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTermsNetPaymentPaymentTimePeriodTimePeriodDue
+ detallista.paymentTerms.netPayment.paymentTimePeriod.timePeriodDue.timePeriod = Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTermsNetPaymentPaymentTimePeriodTimePeriodDueTimePeriod.DAYS
+ detallista.paymentTerms.netPayment.paymentTimePeriod.timePeriodDue.value = "0"
+
+ detallista.paymentTerms.discountPayment = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaPaymentTermsDiscountPayment
+ detallista.paymentTerms.discountPayment.percentage = If(Ventas.DescuentoTC > 0 AndAlso Ventas.SubTotalTC > 0, (Ventas.DescuentoTC * 100) / Ventas.SubTotalTC, 0).ToString().FormatoNumero()
+
+ detallista.currency = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrency((1)) {}
+ detallista.currency(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrency
+ detallista.currency(0).currencyISOCode = If(Ventas.CveMoneda = 1, Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrencyCurrencyISOCode.MXN, Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrencyCurrencyISOCode.USD)
+ detallista.currency(0).currencyFunction = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrencyCurrencyFunction((1)) {}
+ detallista.currency(0).currencyFunction(0) = Profact.TimbraCFDI33.Complementos.Detallista.detallistaCurrencyCurrencyFunction.BILLING_CURRENCY
+ detallista.currency(0).rateOfChangeSpecified = True
+ detallista.currency(0).rateOfChange = 1
+
+ detallista.allowanceCharge = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaAllowanceCharge(1) {}
+ detallista.allowanceCharge(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaAllowanceCharge
+ detallista.allowanceCharge(0).monetaryAmountOrPercentage = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaAllowanceChargeMonetaryAmountOrPercentage
+ detallista.allowanceCharge(0).monetaryAmountOrPercentage.rate = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaAllowanceChargeMonetaryAmountOrPercentageRate
+ detallista.allowanceCharge(0).monetaryAmountOrPercentage.rate.base = Profact.TimbraCFDI33.Complementos.Detallista.detallistaAllowanceChargeMonetaryAmountOrPercentageRateBase.INVOICE_VALUE
+ detallista.allowanceCharge(0).monetaryAmountOrPercentage.rate.percentage = If(Ventas.DescuentoTC > 0 AndAlso Ventas.SubTotalTC > 0, (Ventas.DescuentoTC * 100) / Ventas.SubTotalTC, 0)
+
+ Dim articuloCounter As Integer = 0
+ For Each concepto As Profact.TimbraCFDI33.ComprobanteConcepto In comprobante.Conceptos
+ articuloCounter = (articuloCounter + 1)
+ Next
+ detallista.lineItem = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItem((articuloCounter)) {}
+ Dim counter As Integer = 0
+ For Each concepto As Profact.TimbraCFDI33.ComprobanteConcepto In comprobante.Conceptos
+ detallista.lineItem(counter) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItem
+ detallista.lineItem(counter).type = "SimpleInvoiceLineItemType"
+ detallista.lineItem(counter).number = (counter + 1).ToString
+ detallista.lineItem(counter).tradeItemIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemIdentification
+ detallista.lineItem(counter).tradeItemIdentification.gtin = comprobante.Conceptos(counter).NoIdentificacion
+ detallista.lineItem(counter).alternateTradeItemIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentification(1) {}
+ detallista.lineItem(counter).alternateTradeItemIdentification(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentification
+ detallista.lineItem(counter).alternateTradeItemIdentification(0).type = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentificationType
+ detallista.lineItem(counter).alternateTradeItemIdentification(0).type = Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentificationType.BUYER_ASSIGNED
+ detallista.lineItem(counter).tradeItemDescriptionInformation = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemDescriptionInformation
+ If (comprobante.Conceptos(counter).Descripcion.Length > 34) Then
+ detallista.lineItem(counter).tradeItemDescriptionInformation.longText = comprobante.Conceptos(counter).Descripcion.Substring(0, 34)
+ Else
+ detallista.lineItem(counter).tradeItemDescriptionInformation.longText = comprobante.Conceptos(counter).Descripcion
+ End If
+ detallista.lineItem(counter).invoicedQuantity = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemInvoicedQuantity
+ detallista.lineItem(counter).invoicedQuantity.unitOfMeasure = comprobante.Conceptos(counter).Unidad
+ detallista.lineItem(counter).invoicedQuantity.Text = New String((1)) {}
+ detallista.lineItem(counter).invoicedQuantity.Text(0) = comprobante.Conceptos(counter).Cantidad.ToString
+
+ detallista.lineItem(counter).aditionalQuantity = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAditionalQuantity(1) {}
+ detallista.lineItem(counter).aditionalQuantity(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAditionalQuantity
+ detallista.lineItem(counter).aditionalQuantity(0).QuantityType = Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAditionalQuantityQuantityType.NUM_CONSUMER_UNITS
+ detallista.lineItem(counter).aditionalQuantity(0).Text = New String((1)) {}
+ detallista.lineItem(counter).aditionalQuantity(0).Text(0) = "1"
+
+ detallista.lineItem(counter).grossPrice = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemGrossPrice
+ detallista.lineItem(counter).grossPrice.Amount = comprobante.Conceptos(counter).ValorUnitario
+
+ detallista.lineItem(counter).netPrice = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemNetPrice
+ detallista.lineItem(counter).netPrice.Amount = comprobante.Conceptos(counter).ValorUnitario
+
+ detallista.lineItem(counter).AdditionalInformation = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAdditionalInformation
+ detallista.lineItem(counter).AdditionalInformation.referenceIdentification = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAdditionalInformationReferenceIdentification
+ detallista.lineItem(counter).AdditionalInformation.referenceIdentification.type = Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemAdditionalInformationReferenceIdentificationType.ON
+ detallista.lineItem(counter).AdditionalInformation.referenceIdentification.Value = "1587"
+ 'Impuestos
+ Dim tasa As Decimal = 0
+ Dim importeImp As Decimal = 0
+ Try
+ If (Not (comprobante.Impuestos.Traslados) Is Nothing) Then
+ For Each traslado As Profact.TimbraCFDI33.ComprobanteImpuestosTraslado In comprobante.Impuestos.Traslados
+ tasa = Decimal.Parse(traslado.TasaOCuota)
+ importeImp = (comprobante.Conceptos(counter).Importe * (tasa / 100))
+ Next
+ End If
+
+ Catch ex As System.Exception
+
+ End Try
+
+ detallista.lineItem(counter).tradeItemTaxInformation = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemTaxInformation(1) {}
+ detallista.lineItem(counter).tradeItemTaxInformation(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemTaxInformation
+ detallista.lineItem(counter).tradeItemTaxInformation(0).taxTypeDescription = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemTaxInformationTaxTypeDescription
+ detallista.lineItem(counter).tradeItemTaxInformation(0).taxTypeDescription = Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemTaxInformationTaxTypeDescription.VAT
+ detallista.lineItem(counter).tradeItemTaxInformation(0).tradeItemTaxAmount = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTradeItemTaxInformationTradeItemTaxAmount
+ detallista.lineItem(counter).tradeItemTaxInformation(0).tradeItemTaxAmount.taxPercentage = tasa
+ detallista.lineItem(counter).tradeItemTaxInformation(0).tradeItemTaxAmount.taxAmount = importeImp
+
+ detallista.lineItem(counter).totalLineAmount = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTotalLineAmount
+ detallista.lineItem(counter).totalLineAmount.grossAmount = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTotalLineAmountGrossAmount
+ detallista.lineItem(counter).totalLineAmount.grossAmount.Amount = comprobante.Conceptos(counter).Importe
+ detallista.lineItem(counter).totalLineAmount.netAmount = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaLineItemTotalLineAmountNetAmount
+ detallista.lineItem(counter).totalLineAmount.netAmount.Amount = comprobante.Conceptos(counter).Importe
+ counter = (counter + 1)
+ Next
+ detallista.totalAmount = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaTotalAmount
+ detallista.totalAmount.Amount = comprobante.SubTotal
+
+ detallista.TotalAllowanceCharge = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaTotalAllowanceCharge(1) {}
+ detallista.TotalAllowanceCharge(0) = New Profact.TimbraCFDI33.Complementos.Detallista.detallistaTotalAllowanceCharge
+ detallista.TotalAllowanceCharge(0).allowanceOrChargeType = Profact.TimbraCFDI33.Complementos.Detallista.detallistaTotalAllowanceChargeAllowanceOrChargeType.ALLOWANCE
+ detallista.TotalAllowanceCharge(0).Amount = Ventas.DescuentoTC
+
+ Dim nombres As System.Xml.Serialization.XmlSerializerNamespaces = New System.Xml.Serialization.XmlSerializerNamespaces
+ nombres.Add("detallista", "http://www.sat.gob.mx/detallista")
+ Dim xmlDetallista As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(detallista, GetType(Profact.TimbraCFDI33.Complementos.Detallista.detallista), nombres)
+
+ Dim docDetallista As XmlDocument = New XmlDocument
+ docDetallista.LoadXml(xmlDetallista)
+ comprobante.DetallistaSpecified = True
+ LXmlComplementos.Add(docDetallista.DocumentElement)
+
+ TieneComplemento = True
+ End If
+#End Region
+
+ If TieneComplemento Then
+ comprobante.Complemento = New Profact.TimbraCFDI33.ComprobanteComplemento
+ comprobante.Complemento.Any = LXmlComplementos.ToArray()
+ End If
+
+ sw.Stop()
+ swTiempo.AppendFormat("Armado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+
+#Region "Genera XML"
+ ' Try
+ ' cfdi.GenerarXMLBase64(llaveBase64, Clave)
+ ' cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML)
+ ' Catch ex As Exception
+
+ ' End Try
+ '//Timbramos el CFDI por medio del conector y guardamos resultado
+ Dim resultadoTimbre As Profact.TimbraCFDI.ResultadoTimbre
+
+#End Region
+
+ sw.Stop()
+ swTiempo.AppendFormat("Genera: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+
+#Region "Timbra"
+ resultadoTimbre = cfdi.TimbraCFDI(comprobante)
+#End Region
+
+ sw.Stop()
+ swTiempo.AppendFormat("Timbrado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+
+ 'Verifica el error
+ If resultadoTimbre.Exitoso Then
+
+ 'Dim FechaCertificacion As DateTime
+ Dim FolioFiscal As String
+
+ UUID = resultadoTimbre.FolioUUID
+ FolioFiscal = resultadoTimbre.FolioUUID
+ If FolioFiscal <> "" Then
+ resultadoTimbre.GuardaXml(RutaArchivo, NombreArchivoXML)
+
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then
+
+ 'Actualiza Estatus Factura
+ If Ventas.CveVenta > 0 Then
+
+
+ Dim ObjVentas As New ClsVentas()
+ If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", Now, Ventas.CveVenta, CvePAC:=UsuarioActual.Empresa.CvePAC) Then
+ Retorno = ""
+ Else
+ Retorno = "Error"
+ End If
+ ObjVentas.Dispose()
+
+
+ ''Actualiza Cliente (NumeroCuenta)
+ 'If Not UsuarioActual.CveEmpresa.Contiene(72, 80) Then
+ ' Dim Hilo2 As New System.Threading.Thread(Sub() ActualizaCliente(UsuarioActual.CveUsuario, Ventas.Cliente.NumCtaPago, Ventas.CveMetodoPago, Ventas.CveCliente))
+ ' Hilo2.Start()
+ 'End If
+
+ End If
+ End If
+
+ If Not IO.Directory.Exists($"{UsuarioActual.Empresa.Ruta}CBB\") Then IO.Directory.CreateDirectory($"{UsuarioActual.Empresa.Ruta}CBB\")
+
+ Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\"
+ Dim NombreCBB As String = $"{ObjCFDITimbre.Comprobante.SerieFolio}.jpg"
+ resultadoTimbre.GuardaCodigoBidimensional(RutaCBB, NombreCBB)
+
+ 'Genero la addenda Ford
+ If Ventas.Cliente.Ford_GSDB <> "" Then
+
+ Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio))
+
+ Dim FolioFactura As String = ""
+ If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura
+ GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB)
+
+ End If
+
+ If ObjCFDITimbre.Comprobante.TipoComprobante = "T" Then
+ Dim ObjInv As New ClsInventarios()
+ If ObjInv.UpdateMovimientoTimbrado(Ventas.Inv_CveMovimiento, 1, FolioFiscal, MinFecha) Then
+ Retorno = ""
+ Else
+ Retorno = "Error"
+ End If
+ ObjInv.Dispose()
+ End If
+
+ 'Pendiente. Ruta guardar archivos
+ sw.Stop()
+ swTiempo.AppendFormat("Actualizado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds)
+ swmili = sw.ElapsedMilliseconds
+ sw.Start()
+
+ Retorno = ""
+ Else
+ Retorno = "No se pudo timbrar ante el SAT. UUID no generado."
+ End If
+
+
+ Else
+ Dim Resultados = Newtonsoft.Json.Linq.JArray.Parse(resultadoTimbre.Detalle)
+ If Resultados.Count > 0 Then
+ Retorno = Resultados(0)("Value").ToString()
+ MensajeErrorCFDI = Resultados(0)("Value").ToString()
+ Else
+ Retorno = resultadoTimbre.Detalle
+ MensajeErrorCFDI = resultadoTimbre.Detalle
+ End If
+
+ End If
+
+ GuardaLogTimbrado(swTiempo.ToString, UsuarioActual.Empresa.CvePAC)
+ Return Retorno
+ End Function
+
+#Region "F U N C I O N E S"
+ Private Function obtenerAtributo(cadena_xml As String, nodo As String, nombre_atributo As String) As String
+ Try
+ 'Variables
+ Dim valor As String
+ Dim inicio As Integer = 0
+ Dim fin As Integer = 0
+ Dim inicionodo As Integer = cadena_xml.IndexOf(nodo)
+ If inicionodo = -1 Then
+ Return ""
+ End If
+ 'Buscamos inicio
+ inicio = cadena_xml.IndexOf((Convert.ToString(" ") & nombre_atributo) + "=""", inicionodo) + nombre_atributo.Length + 3
+ 'Buscamos el final
+ fin = cadena_xml.IndexOf("""", inicio)
+ 'Cortamos la cadena
+ valor = cadena_xml.Substring(inicio, fin - inicio)
+ 'Retorna el valor
+ Return valor
+ Catch
+ Return ""
+ End Try
+ End Function
+ Private Function TimbrarFacturaProFact(UsuarioActual As Usuario, Optional Ventas As Modelos.Factura = Nothing, Optional TmpDTConceptos As DataTable = Nothing, Optional TmpDTImpuestos As DataTable = Nothing, Optional TmpDTComplementos As DataTable = Nothing, Optional Ruta As String = "", Optional LstFordASN As ListBox = Nothing, Optional FordGSDBM As String = "", Optional ObjV As ClsVentas = Nothing) As Boolean
+
+ Dim Ret As String = TimbrarFacturaProFactv33(Ventas, UsuarioActual)
+ Return If(Ret = "", True, False)
+
+ End Function
+ Private Sub GeneraAddenda7Eleven(Archivo As String, TmpDTConceptos As DataTable, TmpDT7Eleven As DataTable)
+ Dim cfdi As String = ""
+ Dim SB As New StringBuilder
+ Try
+ Using sr As New StreamReader(Archivo)
+
+ cfdi = sr.ReadToEnd()
+
+ End Using
+ Catch e As Exception
+ Alert("The file could not be read:", TipoMensaje.MsgError)
+
+ End Try
+
+ cfdi = cfdi.Replace("", "")
+
+ SB.Append(cfdi)
+
+ SB.Append("")
+ SB.AppendFormat("", TmpDT7Eleven.Rows(0)("sevenElevenNumProveedor").ToString)
+ SB.AppendFormat("", TmpDT7Eleven.Rows(0)("sevenElevenFolio").ToString, TmpDT7Eleven.Rows(0)("sevenElevenTienda").ToString, TmpDT7Eleven.Rows(0)("sevenElevenFecha").ToString)
+
+ For Each Row As DataRow In TmpDTConceptos.Rows
+
+ SB.AppendFormat("", Row("Codigo"), Row("PS"), Row("Cantidad").ToString.ToDouble.FormatoNumero(), Row("PU").ToString.ToDouble.FormatoNumero())
+
+ Next
+
+ SB.Append("")
+
+
+ Using outfile As New StreamWriter(Archivo)
+ outfile.Write(SB.ToString())
+ End Using
+
+ End Sub
+ Private Sub GeneraAddendaFord(Archivo As String, pFolio As String, LstFordASN As String, FordGSDBM As String)
+ Dim cfdi As String = ""
+ Dim SB As New StringBuilder
+ Try
+ Using sr As New StreamReader(Archivo)
+
+ cfdi = sr.ReadToEnd()
+
+ End Using
+ Catch e As Exception
+ Alert("The file could not be read:", TipoMensaje.MsgError)
+
+ End Try
+
+
+ cfdi = cfdi.Replace("", "")
+
+ SB.Append(cfdi)
+
+ SB.Append("")
+ SB.AppendFormat("{0}", FordGSDBM.Trim.ToUpper)
+
+ If pFolio <> "" Then SB.AppendFormat("{0}", pFolio)
+ 'If TxtFordASN2.Text.Trim <> "" Then SB.AppendFormat("{0}", TxtFordASN2.Text.Trim)
+
+ For Each li As String In LstFordASN.Split(","c)
+
+ If li <> "" Then SB.AppendFormat("{0}", li)
+
+ Next
+
+ SB.Append("")
+
+
+ Using outfile As New StreamWriter(Archivo)
+ outfile.Write(SB.ToString())
+ End Using
+
+ End Sub
+ Private Sub GeneraAddendaFord(Archivo As String, pFolio As String, LstFordASN As ListBox, FordGSDBM As String)
+ Dim cfdi As String = ""
+ Dim SB As New StringBuilder
+ Try
+ Using sr As New StreamReader(Archivo)
+
+ cfdi = sr.ReadToEnd()
+
+ End Using
+ Catch e As Exception
+ Alert("The file could not be read:", TipoMensaje.MsgError)
+
+ End Try
+
+
+ cfdi = cfdi.Replace("", "")
+
+ SB.Append(cfdi)
+
+ SB.Append("")
+ SB.AppendFormat("{0}", FordGSDBM.Trim.ToUpper)
+
+ If pFolio <> "" Then SB.AppendFormat("{0}", pFolio)
+ 'If TxtFordASN2.Text.Trim <> "" Then SB.AppendFormat("{0}", TxtFordASN2.Text.Trim)
+
+ For Each li As ListItem In LstFordASN.Items
+
+ SB.AppendFormat("{0}", li.Text)
+
+ Next
+
+ SB.Append("")
+
+
+ Using outfile As New StreamWriter(Archivo)
+ outfile.Write(SB.ToString())
+ End Using
+
+ End Sub
+ Private Function DecodeBase64(ByVal strXMLCodificado As String) As String
+ Try
+ Dim decbuff As Byte() = Convert.FromBase64String(strXMLCodificado)
+ Return System.Text.Encoding.UTF8.GetString(decbuff)
+ Catch
+ Return ""
+ End Try
+ End Function
+ Private Function CodificarABase64(strXML As String) As String
+ Dim utf8Bytes As Byte() = UTF8Encoding.UTF8.GetBytes(strXML)
+ Return Convert.ToBase64String(utf8Bytes)
+ End Function
+#End Region
+
+End Class