From 1e802e8fc03c207098c3ed68b1304c302d3b4fd6 Mon Sep 17 00:00:00 2001 From: Jonathan Alexis Perez Morales Date: Fri, 16 Aug 2019 09:16:24 -0700 Subject: [PATCH] Calcular tiempo de timbrado --- App_Code/Timbrado.vb | 6781 +++++++++++++++++++++--------------------- 1 file changed, 3393 insertions(+), 3388 deletions(-) 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