diff --git a/App_Code/ClsCompras.vb b/App_Code/ClsCompras.vb index a2491dbad..84ee4f34b 100644 --- a/App_Code/ClsCompras.vb +++ b/App_Code/ClsCompras.vb @@ -1776,27 +1776,72 @@ Public Class ClsCompras End Function - Public Function AddFactura(Serie As String, Folio As String, FechaFactura As DateTime, NombreProveedor As String, RFCDe As String, SubTotal As Double, - IVA As Double, Total As Double, UUID As String, RFCPara As String, XML As String, PDF As String, - VersionCFD As String, Descuento As Double, Moneda As String, TipodeComprobante As String, TipoCambio As Double, FueValidado As Integer, - CveEmpresa As Integer, PreFijo As String) As Integer - Dim Retorno As Integer = -1 + 'Public Function AddFactura(Serie As String, Folio As String, FechaFactura As DateTime, NombreProveedor As String, RFCDe As String, SubTotal As Double, + 'IVA As Double, Total As Double, UUID As String, RFCPara As String, XML As String, PDF As String, + 'VersionCFD As String, Descuento As Double, Moneda As String, TipodeComprobante As String, TipoCambio As Double, FueValidado As Integer, + 'CveEmpresa As Integer, PreFijo As String) As Integer + ' Dim Retorno As Integer = -1 - Dim StrSQL As StringBuilder = New StringBuilder() - StrSQL.Append(" BEGIN ") - StrSQL.Append(" DECLARE @tTotal INT; ") - StrSQL.Append(" ") - StrSQL.Append(" SELECT @tTotal = ISNULL(MAX(CveFactura),0) FROM Comp_Facturas WHERE UUID = @UUID;") - StrSQL.Append(" IF @tTotal = 0 ") - StrSQL.Append(" BEGIN ") - StrSQL.Append(" INSERT INTO Comp_Facturas (Serie, Folio, FechaFactura, NombreProveedor, RFCDe, Total, UUID, RFCPara, XML, PDF, FueValidado, CveEmpresa, TipoFactura,Version, TipoComprobante) ") - StrSQL.Append(" VALUES (@Serie, @Folio, @FechaFactura, @NombreProveedor, @RFCDe, @Total, @UUID, @RFCPara, @XML, @PDF, @FueValidado, @CveEmpresa, @PreFijo, @Version,@TipodeComprobante); ") - StrSQL.Append(" SET @Retorno = 1; ") - StrSQL.Append(" SET @CveFactura = SCOPE_IDENTITY(); ") - StrSQL.Append(" UPDATE Comp_Facturas SET XML = CONCAT(@CveFactura,'.xml'), PDF = CONCAT(@CveFactura ,'.pdf') WHERE CveFactura = @CveFactura; ") - StrSQL.Append(" END ") - StrSQL.Append(" ELSE BEGIN SET @CveFactura = @tTotal; END ") - StrSQL.Append(" END ") + ' Dim StrSQL As StringBuilder = New StringBuilder() + ' StrSQL.Append(" BEGIN ") + ' StrSQL.Append(" DECLARE @tTotal INT; ") + ' StrSQL.Append(" ") + ' StrSQL.Append(" SELECT @tTotal = ISNULL(MAX(CveFactura),0) FROM Comp_Facturas WHERE UUID = @UUID;") + ' StrSQL.Append(" IF @tTotal = 0 ") + ' StrSQL.Append(" BEGIN ") + ' StrSQL.Append(" INSERT INTO Comp_Facturas (Serie, Folio, FechaFactura, NombreProveedor, RFCDe, Total, UUID, RFCPara, XML, PDF, FueValidado, CveEmpresa, TipoFactura,Version, TipoComprobante,) ") + ' StrSQL.Append(" VALUES (@Serie, @Folio, @FechaFactura, @NombreProveedor, @RFCDe, @Total, @UUID, @RFCPara, @XML, @PDF, @FueValidado, @CveEmpresa, @PreFijo, @Version,@TipodeComprobante); ") + ' StrSQL.Append(" SET @Retorno = 1; ") + ' StrSQL.Append(" SET @CveFactura = SCOPE_IDENTITY(); ") + ' StrSQL.Append(" UPDATE Comp_Facturas SET XML = CONCAT(@CveFactura,'.xml'), PDF = CONCAT(@CveFactura ,'.pdf') WHERE CveFactura = @CveFactura; ") + ' StrSQL.Append(" END ") + ' StrSQL.Append(" ELSE BEGIN SET @CveFactura = @tTotal; END ") + ' StrSQL.Append(" END ") + + ' If PreFijo.ToLower() = "cfdi" Then + ' PreFijo = "CFDi" + ' ElseIf PreFijo.ToLower() = "cfd" Then + ' PreFijo = "CFD" + ' End If + + ' DataAdapter(StrSQL.ToString(), CommandType.Text) + ' With SqlAdapter.SelectCommand.Parameters + ' .Add("@Serie", SqlDbType.VarChar).Value = Serie + ' .Add("@Folio", SqlDbType.VarChar).Value = Folio + ' .Add("@FechaFactura", SqlDbType.[Date]).Value = FechaFactura + ' .Add("@NombreProveedor", SqlDbType.VarChar).Value = NombreProveedor + ' .Add("@RFCDe", SqlDbType.VarChar).Value = RFCDe + ' .Add("@Total", SqlDbType.Money).Value = Total + ' .Add("@UUID", SqlDbType.VarChar).Value = UUID + ' .Add("@RFCPara", SqlDbType.VarChar).Value = RFCPara + ' .Add("@XML", SqlDbType.VarChar).Value = XML + ' .Add("@PDF", SqlDbType.VarChar).Value = PDF + ' .Add("@Version", SqlDbType.VarChar).Value = VersionCFD + ' .Add("@FueValidado", SqlDbType.Int).Value = FueValidado + ' .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + ' .Add("@PreFijo", SqlDbType.VarChar).Value = PreFijo + ' .Add("@TipodeComprobante", SqlDbType.VarChar).Value = TipodeComprobante.ToUpper + ' .Add("@CveFactura", SqlDbType.Int).Direction = ParameterDirection.Output + ' .Add("@Retorno", SqlDbType.Int).Direction = ParameterDirection.Output + ' End With + + + ' Try + ' SqlAdapter.Fill(Data) + + ' Retorno = SqlAdapter.SelectCommand.Parameters("@Retorno").Value.ToString().ToEntero() + + ' CveFactura = SqlAdapter.SelectCommand.Parameters("@CveFactura").Value.ToString().ToEntero() + ' Catch ex As Exception + ' ModExtensiones.OnError(Me, "Ocurrió un error al intentar Guardar", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo()) + ' End Try + + ' Return Retorno + 'End Function + + + Public Function AddFactura(Serie As String, Folio As String, FechaFactura As DateTime, NombreProveedor As String, RFCDe As String, SubTotal As Decimal, IVA As Decimal, Total As Decimal, UUID As String, RFCPara As String, XML As String, PDF As String, VersionCFD As String, Descuento As Decimal, TipoCambio As Decimal, FueValidado As Integer, CveEmpresa As Integer, PreFijo As String, TipoComprobante As String, MONEDA As String, METODODEPAGO As String, Optional TipoRecepcion As Integer = 0, Optional Version As String = "3.3", Optional IEPS As Decimal = 0, Optional RetIVA As Decimal = 0, Optional RetISR As Decimal = 0) As Integer + Dim Retorno As Integer = -1 If PreFijo.ToLower() = "cfdi" Then PreFijo = "CFDi" @@ -1804,40 +1849,50 @@ Public Class ClsCompras PreFijo = "CFD" End If - DataAdapter(StrSQL.ToString(), CommandType.Text) - With SqlAdapter.SelectCommand.Parameters - .Add("@Serie", SqlDbType.VarChar).Value = Serie - .Add("@Folio", SqlDbType.VarChar).Value = Folio - .Add("@FechaFactura", SqlDbType.[Date]).Value = FechaFactura - .Add("@NombreProveedor", SqlDbType.VarChar).Value = NombreProveedor - .Add("@RFCDe", SqlDbType.VarChar).Value = RFCDe - .Add("@Total", SqlDbType.Money).Value = Total - .Add("@UUID", SqlDbType.VarChar).Value = UUID - .Add("@RFCPara", SqlDbType.VarChar).Value = RFCPara - .Add("@XML", SqlDbType.VarChar).Value = XML - .Add("@PDF", SqlDbType.VarChar).Value = PDF - .Add("@Version", SqlDbType.VarChar).Value = VersionCFD - .Add("@FueValidado", SqlDbType.Int).Value = FueValidado - .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa - .Add("@PreFijo", SqlDbType.VarChar).Value = PreFijo - .Add("@TipodeComprobante", SqlDbType.VarChar).Value = TipodeComprobante.ToUpper - .Add("@CveFactura", SqlDbType.Int).Direction = ParameterDirection.Output - .Add("@Retorno", SqlDbType.Int).Direction = ParameterDirection.Output - End With + DataAdapter("PA_eFacturas_FacturasAdd", CommandType.StoredProcedure) + SqlAdapter.SelectCommand.Parameters.Add("@Serie", SqlDbType.VarChar).Value = Serie + SqlAdapter.SelectCommand.Parameters.Add("@Folio", SqlDbType.VarChar).Value = Folio + SqlAdapter.SelectCommand.Parameters.Add("@FechaFactura", SqlDbType.Date).Value = FechaFactura + SqlAdapter.SelectCommand.Parameters.Add("@NombreProveedor", SqlDbType.VarChar).Value = NombreProveedor + SqlAdapter.SelectCommand.Parameters.Add("@RFCDe", SqlDbType.VarChar).Value = RFCDe + SqlAdapter.SelectCommand.Parameters.Add("@TipoComprobante", SqlDbType.VarChar).Value = TipoComprobante + SqlAdapter.SelectCommand.Parameters.Add("@Total", SqlDbType.Money).Value = Total + SqlAdapter.SelectCommand.Parameters.Add("@UUID", SqlDbType.VarChar).Value = UUID + SqlAdapter.SelectCommand.Parameters.Add("@RFCPara", SqlDbType.VarChar).Value = RFCPara + SqlAdapter.SelectCommand.Parameters.Add("@XML", SqlDbType.VarChar).Value = XML + SqlAdapter.SelectCommand.Parameters.Add("@PDF", SqlDbType.VarChar).Value = PDF + SqlAdapter.SelectCommand.Parameters.Add("@Version", SqlDbType.VarChar).Value = VersionCFD + SqlAdapter.SelectCommand.Parameters.Add("@FueValidado", SqlDbType.Int).Value = FueValidado + SqlAdapter.SelectCommand.Parameters.Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + SqlAdapter.SelectCommand.Parameters.Add("@PreFijo", SqlDbType.VarChar).Value = PreFijo + SqlAdapter.SelectCommand.Parameters.Add("@TipoRecepcion", SqlDbType.Int).Value = TipoRecepcion + SqlAdapter.SelectCommand.Parameters.Add("@CveFactura", SqlDbType.Int).Direction = ParameterDirection.Output + SqlAdapter.SelectCommand.Parameters.Add("@Retorno", SqlDbType.Int).Direction = ParameterDirection.Output + SqlAdapter.SelectCommand.Parameters.Add("@MONEDA", SqlDbType.VarChar).Value = MONEDA + SqlAdapter.SelectCommand.Parameters.Add("@METODODEPAGO", SqlDbType.VarChar).Value = METODODEPAGO + + SqlAdapter.SelectCommand.Parameters.Add("@TipoCambio", SqlDbType.SmallMoney).Value = TipoCambio + SqlAdapter.SelectCommand.Parameters.Add("@SubTotal", SqlDbType.Money).Value = SubTotal + SqlAdapter.SelectCommand.Parameters.Add("@IVA", SqlDbType.Money).Value = IVA + SqlAdapter.SelectCommand.Parameters.Add("@IEPS", SqlDbType.Money).Value = IEPS + SqlAdapter.SelectCommand.Parameters.Add("@RetIVA", SqlDbType.Money).Value = RetIVA + SqlAdapter.SelectCommand.Parameters.Add("@RetISR", SqlDbType.Money).Value = RetISR + SqlAdapter.SelectCommand.Parameters.Add("@Descuento", SqlDbType.Money).Value = Descuento Try SqlAdapter.Fill(Data) - Retorno = SqlAdapter.SelectCommand.Parameters("@Retorno").Value.ToString().ToEntero() + Retorno = Convert.ToInt32(SqlAdapter.SelectCommand.Parameters("@Retorno").Value) + CveFactura = Convert.ToInt32(SqlAdapter.SelectCommand.Parameters("@CveFactura").Value) - CveFactura = SqlAdapter.SelectCommand.Parameters("@CveFactura").Value.ToString().ToEntero() Catch ex As Exception ModExtensiones.OnError(Me, "Ocurrió un error al intentar Guardar", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo()) End Try Return Retorno End Function + Public Function UpdateArchivo(CveFactura As Integer, Columna As String) As Boolean Dim Retorno As Boolean = False Dim Str As String = "" @@ -1851,9 +1906,12 @@ Public Class ClsCompras DataAdapter(Str, CommandType.Text) Try SqlAdapter.Fill(Data) + + SqlAdapter.SelectCommand.Parameters.Add("@CveFactura", SqlDbType.Int).Value = CveFactura + Retorno = True Catch ex As Exception - ModExtensiones.OnError(Me, "Ocurrió un error al agregar el Tipo de Cambio", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo()) + ModExtensiones.OnError(Me, "Ocurrió un error al actualizar la factura", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo()) End Try Return Retorno End Function diff --git a/App_Code/modExtensiones.vb b/App_Code/modExtensiones.vb index 0785bc7fe..61beb671e 100644 --- a/App_Code/modExtensiones.vb +++ b/App_Code/modExtensiones.vb @@ -2014,6 +2014,12 @@ Namespace Extensiones End Sub + + Public Function CopyToDataTable(Of T)(ByVal source As IEnumerable(Of T), ByVal flag As Boolean) As DataTable + Return New ObjectShredder(Of T)().Shred(source, Nothing, Nothing) + End Function + + Public Sub ExportToExcel2(GridView As GridView, NombreArchivoXLSX As String) diff --git a/Compras/Compras.aspx.vb b/Compras/Compras.aspx.vb index 4137467d2..73230e99f 100644 --- a/Compras/Compras.aspx.vb +++ b/Compras/Compras.aspx.vb @@ -9155,7 +9155,7 @@ Partial Class Compras_Compras ObjCompra.RollBack() If ObjContaAC IsNot Nothing Then ObjContaAC.RollBack() - SeActualizoDetalle = False + Finally If Retorno Then If ObjContabilidad.MensajePolizaDescuadre IsNot Nothing AndAlso ObjContabilidad.MensajePolizaDescuadre.ToString <> "" Then @@ -9192,23 +9192,22 @@ Partial Class Compras_Compras UpBitacora.Update() - If SeActualizoDetalle Then - MandaCorreoActualizacionDetalle(CveCompra) + If SeActualizoDetalle AndAlso UsuarioActual.CveEmpresa = 119 Then + MandaCorreoActualizacionDetalle() End If End Sub - Private Sub MandaCorreoActualizacionDetalle(CveCompra As Integer) + Private Sub MandaCorreoActualizacionDetalle() + - If UsuarioActual.CveRol <> 1 Then - Exit Sub - End If Dim DTCorreos As New DataTable Dim DTMovimientos As New DataTable Dim strBody As New StringBuilder Dim Asunto, Para, ArrayCC, Body As String - Para = GlobalDTUsuarios(UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa).FiltroPrimeroValor("Correo") + 'Para = GlobalDTUsuarios(UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa).FiltroPrimeroValor("Correo") + Para = "fernanda.romo@agrojam.com.mx" If Para.ToString = "" AndAlso UsuarioActual.CveRol = 1 Then Para = Para & ";oscar.irigoyen@adssistemas.mx;rene.molina@adssistemas.mx" @@ -9260,8 +9259,8 @@ Partial Class Compras_Compras Asunto = $"Actualizacion de Compra: {SerieFolioCompra} Proveedor: {HplProveedor.Text}" ArrayCC = "" Body = strBody.ToString - Dim Mail As New ClsSisMail() - Mail.SendMail(ClsPaginas.EmpresaNotificaciones, Para, Asunto, Body, ArrayCC) + Dim Mail As New ClsSisMail() + Mail.SendMail(ClsPaginas.EmpresaNotificaciones, Para, Asunto, Body, ArrayCC) diff --git a/Compras/eFacturas.aspx.vb b/Compras/eFacturas.aspx.vb index 1bdcb7b62..39f14166c 100644 --- a/Compras/eFacturas.aspx.vb +++ b/Compras/eFacturas.aspx.vb @@ -19,6 +19,16 @@ Imports Microsoft.Reporting.WebForms Imports Newtonsoft.Json.Linq Imports ClsPaginas Imports ADS.eFacturas +'Imports Telerik.Web.UI.Widgets +'Imports DocumentFormat.OpenXml.Drawing.Diagrams +Imports SharpCompress.Archive.Rar +Imports SharpCompress.Common +Imports SharpCompress.Reader +Imports System.Drawing +Imports Microsoft.Owin.Security.Provider +Imports Telerik.Web.UI +'Imports Telerik.Web.UI + @@ -1496,6 +1506,15 @@ Partial Class Compras_eFacturas ' Exit Sub 'End If + Dim DTLOG As New DataTable + DTLOG.Columns.Add("Serie", GetType(String)) + DTLOG.Columns.Add("Folio", GetType(String)) + DTLOG.Columns.Add("Fecha", GetType(Date)) + DTLOG.Columns.Add("Proveedor", GetType(String)) + DTLOG.Columns.Add("Importe", GetType(Decimal)) + DTLOG.Columns.Add("Motivo", GetType(String)) + 'Serie Folio Fecha Proveedor Importe Motivo + Dim sw As New Diagnostics.Stopwatch Dim swmili As Long = 0 Dim swTiempo As New StringBuilder @@ -1508,138 +1527,286 @@ Partial Class Compras_eFacturas Dim ListXML As New List(Of String) Dim ListPDF As New List(Of String) + Dim ListComprimidos As New List(Of String) Dim ListDirectorios As New List(Of String) + Dim ListFacturas As New List(Of Factura) + + For Each fileItem As Archivo In filesgral FileExtension = IO.Path.GetExtension(String.Format("{0}Temp\{1}", AppDomain.CurrentDomain.BaseDirectory, fileItem.filename)).Replace(".", "") filemove = fileItem.filename If filemove <> "" Then - 'filemove.FilesMove("", String.Format("{0}\Temp\Facturas", UsuarioActual.Empresa.Ruta)) - 'filemove.FilesMove("", String.Format("Empresas\{0}\Temp\Facturas", UsuarioActual.CveEmpresa)) - filemove.FilesMove("", String.Format("{0}Temp\Facturas", UsuarioActual.Empresa.Ruta), ConcatenarDirectorioBase:=False) - 'AGREGA XML A LA LISTA - If FileExtension.ToUpper = "XML" Or FileExtension.ToUpper = "PDF" Then - ListXML.Add(String.Format("{0}Temp\Facturas\{1}", UsuarioActual.Empresa.Ruta, filemove)) + filemove.FilesMove("", String.Format("{0}Temp\Facturas", UsuarioActual.Empresa.Ruta), ConcatenarDirectorioBase:=False, Sobreescribir:=True) + If FileExtension.ToUpper = "RAR" Or FileExtension.ToUpper = "ZIP" Then + ListComprimidos.Add(String.Format("{0}Temp\Facturas\{1}", UsuarioActual.Empresa.Ruta, filemove)) End If End If Next - Dim fileEntries As String() = Directory.GetFiles(String.Format("{0}Temp\Facturas", UsuarioActual.Empresa.Ruta)) + For Each comprmido As String In ListComprimidos - Dim ListaDirectoriosTemporales As New List(Of String) - Dim ListaComprimidos As New List(Of String) + Dim FiInfo As New FileInfo(comprmido) - 'Dim fileName As String - Dim ArchivoExtension As String - Dim sOnlyFilename As String + Using stream As Stream = System.IO.File.OpenRead(FiInfo.FullName) + Try + Dim reader = ReaderFactory.Open(stream) - For Each filePath As String In fileEntries + Dim Multiparte As Boolean = False + If Path.GetExtension(FiInfo.FullName.ToUpper()) = ".RAR" And FiInfo.FullName.ToUpper().Contains(".PART") Then + 'SI ES .RAR, PUEDE SER MULTI PART Y PUEDE TRONAR + Using archive As RarArchive = RarArchive.Open(FiInfo.FullName) + If archive.IsMultipartVolume() Then + Multiparte = True + End If + End Using + End If - ArchivoExtension = IO.Path.GetExtension(String.Format("{0}", filePath)).Replace(".", "") - sOnlyFilename = System.IO.Path.GetFileName(filePath) + Dim PdfList As New List(Of String) + If Not Multiparte Then + 'puede tronar si el archivo es multiparte + While reader.MoveToNextEntry() + If Not reader.Entry.IsDirectory Then + 'Si es un archivo XML, lo leo y lo guardo + + Dim nombreArchivo As String = "" + + If reader.Entry.FilePath.Contains("/") Then + nombreArchivo = reader.Entry.FilePath.Substring(reader.Entry.FilePath.LastIndexOf("/") + 1) + Else + nombreArchivo = reader.Entry.FilePath + End If + + If Path.GetExtension(reader.Entry.FilePath.ToUpper()) = ".XML" Then + reader.WriteEntryToDirectory(String.Format("{0}Temp\Facturas", UsuarioActual.Empresa.Ruta), ExtractOptions.None Or ExtractOptions.Overwrite) + ListXML.Add(String.Format("{0}Temp\Facturas\{1}", UsuarioActual.Empresa.Ruta, nombreArchivo)) + End If + If Path.GetExtension(reader.Entry.FilePath.ToUpper()) = ".PDF" Then + 'este sale de un error al leer el pdf, como lo estoy recorriendo de una vez lo guardo y lo vinculo, si la coincidencia es por nombre o número de folio + 'string RFCEmisor = BuscaFactura(System.IO.Path.GetFileNameWithoutExtension(reader.Entry.FilePath).ToUpper(), Arreglo, True); + 'if (!string.IsNullOrEmpty(RFCEmisor)) + ' { + 'If Not Directory.Exists(String.Format("{0}{1}", Temporal, RFCEmisor)) Then Directory.CreateDirectory(String.Format("{0}{1}", Temporal, RFCEmisor)) + + 'reader.WriteEntryToDirectory(String.Format("{0}{1}", Temporal, ""), ExtractOptions.None Or ExtractOptions.Overwrite) + reader.WriteEntryToDirectory(String.Format("{0}{1}", String.Format("{0}Temp\Facturas", UsuarioActual.Empresa.Ruta), ""), ExtractOptions.None Or ExtractOptions.Overwrite) + ListPDF.Add(String.Format("{0}Temp\Facturas\{1}", UsuarioActual.Empresa.Ruta, nombreArchivo)) + + End If + End If + End While + End If + Catch ex As Exception + GuardaLog("'ERROR :" & ex.Message) + End Try + End Using + Next + + + For Each fileItem As Archivo In filesgral + FileExtension = IO.Path.GetExtension(String.Format("{0}Temp\{1}", AppDomain.CurrentDomain.BaseDirectory, fileItem.filename)).Replace(".", "") + filemove = fileItem.filename + + If filemove <> "" AndAlso (FileExtension.ToUpper() <> "ZIP" And FileExtension.ToUpper() <> "RAR") Then + + 'filemove.FilesMove("", String.Format("{0}Temp\Facturas", UsuarioActual.Empresa.Ruta), ConcatenarDirectorioBase:=False, Sobreescribir:=True) + + If FileExtension.ToUpper = "XML" Then + ListXML.Add(String.Format("{0}Temp\Facturas\{1}", UsuarioActual.Empresa.Ruta, filemove)) + End If + + If FileExtension.ToUpper = "PDF" Then + ListPDF.Add(String.Format("{0}Temp\Facturas\{1}", UsuarioActual.Empresa.Ruta, filemove)) + End If - If ArchivoExtension.ToUpper = "RAR" Or ArchivoExtension.ToUpper = "ZIP" Then - ListXML.Add(filePath) End If Next - Dim Arreglo As New ArrayList() - Dim Bandera As Boolean = True - Dim Retorno As String = "" - Dim ListaArchivosMail As New List(Of ClsSisMail.ArchivoMail) - sw.Stop() - swTiempo.AppendFormat("ReadFiles: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() + 'Dim fileEntries As String() = Directory.GetFiles(String.Format("{0}Temp\Facturas", UsuarioActual.Empresa.Ruta)) + + 'Dim ListaDirectoriosTemporales As New List(Of String) + 'Dim ListaComprimidos As New List(Of String) + + ''Dim fileName As String + 'Dim ArchivoExtension As String + 'Dim sOnlyFilename As String + + 'For Each filePath As String In fileEntries + + ' ArchivoExtension = IO.Path.GetExtension(String.Format("{0}", filePath)).Replace(".", "") + ' sOnlyFilename = System.IO.Path.GetFileName(filePath) + + ' If ArchivoExtension.ToUpper = "RAR" Or ArchivoExtension.ToUpper = "ZIP" Then + ' ListXML.Add(filePath) + ' End If + 'Next + + 'Dim Arreglo As New ArrayList() + 'Dim Bandera As Boolean = True + 'Dim Retorno As String = "" + 'Dim ListaArchivosMail As New List(Of ClsSisMail.ArchivoMail) + + 'sw.Stop() + 'swTiempo.AppendFormat("ReadFiles: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + 'swmili = sw.ElapsedMilliseconds + 'sw.Start() Anexo.Text = "" UPAddFacturas.Update() - For Each filePath As String In ListXML + For Each filePathXML As String In ListXML - If File.Exists(filePath) Then + Dim rowLog As DataRow = DTLOG.NewRow + rowLog("Serie") = "" + rowLog("Folio") = "" + rowLog("Fecha") = NowADS() + rowLog("Proveedor") = "" + rowLog("Importe") = 0 + rowLog("Motivo") = "" + + Dim fInfoXML As New FileInfo(filePathXML) + + Dim RutaPDF As String = "" + + For Each filePathPDF As String In ListPDF + + Dim fInfoPDF As New FileInfo(filePathPDF) + + + Dim fxml As String = fInfoXML.Name.ToUpper().Replace(".XML", "") + Dim fpdf As String = fInfoPDF.Name.ToUpper().Replace(".PDF", "") + Dim fpdfSplit As String() = fpdf.Split("-"c) + + If fpdfSplit.Length >= 2 AndAlso fpdfSplit(0).Length = 18 Then + fpdf = fpdf.Replace($"{fpdfSplit(0)}-", "") + End If + + If fxml.Contains(fpdf) Then + RutaPDF = fInfoPDF.FullName + Exit For + End If + + Next + + If File.Exists(filePathXML) Then Dim a As New ComprobanteFactura - Dim FF As Factura = a.CargaComprobanteXML(File.ReadAllText(filePath)) - 'Dim ArchivoAdjunto As New ClsSisMail.ArchivoMail - 'ArchivoAdjunto.ArchivoBinario = File.ReadAllBytes(filePath) - 'ArchivoAdjunto.Ruta = filePath - 'ArchivoAdjunto.NombreArchivo = New FileInfo(filePath).Name + Dim FF As Factura = a.CargaComprobanteXML(File.ReadAllText(filePathXML), UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.RFC, UsuarioActual.CveEmpresa, True, rowLog, NombreArchivo:=fInfoXML.Name) - 'ListaArchivosMail.Add(ArchivoAdjunto) + If FF IsNot Nothing AndAlso FF.CveFactura > 0 Then + If RutaPDF = "" Then + a.GeneraPDF(UsuarioActual.Empresa.Ruta, FF, UsuarioActual.Empresa.Ruta, True) + Else + Dim PDfDestino As String = $"{UsuarioActual.Empresa.Ruta}\Compras\{FF.EmisorRFC}\{FF.CveFactura}.PDF" + If File.Exists(PDfDestino) Then + File.Delete(PDfDestino) + End If + File.Move(RutaPDF, PDfDestino) + End If + + End If End If + DTLOG.Rows.Add(rowLog) + Next sw.Stop() swTiempo.AppendFormat("Fill ClsSisMail.ArchivoMail: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) swmili = sw.ElapsedMilliseconds sw.Start() - If ListaArchivosMail.Count > 0 Then - Dim Correo As New ClsSisMail + 'If ListaArchivosMail.Count > 0 Then - 'If Correo.SendMail(UsuarioActual.Empresa, "sig.buzon@gmail.com", "Facturas Efacturas " & NowADS().ToString("yyyyMMddhhmmss"), "Facturas", Archivos:=ListaArchivosMail) Then + ' Dim Correo As New ClsSisMail - If Correo.SendMail(UsuarioActual.Empresa, UsuarioActual.Empresa.Buzon_Mail, "Facturas Efacturas " & NowADS().ToString("yyyyMMddhhmmss"), "Facturas", Archivos:=ListaArchivosMail) Then + ' 'If Correo.SendMail(UsuarioActual.Empresa, "sig.buzon@gmail.com", "Facturas Efacturas " & NowADS().ToString("yyyyMMddhhmmss"), "Facturas", Archivos:=ListaArchivosMail) Then - sw.Stop() - swTiempo.AppendFormat("EnvioCorreo: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() - System.Threading.Thread.Sleep(3000) - 'ProcesaBuzon() + ' If Correo.SendMail(UsuarioActual.Empresa, UsuarioActual.Empresa.Buzon_Mail, "Facturas Efacturas " & NowADS().ToString("yyyyMMddhhmmss"), "Facturas", Archivos:=ListaArchivosMail) Then - sw.Stop() - swTiempo.AppendFormat("espera: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() + ' sw.Stop() + ' swTiempo.AppendFormat("EnvioCorreo: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + ' swmili = sw.ElapsedMilliseconds + ' sw.Start() + ' System.Threading.Thread.Sleep(3000) + ' 'ProcesaBuzon() - If VerificaCorreo(True) Then - CargaDatos() - End If + ' sw.Stop() + ' swTiempo.AppendFormat("espera: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + ' swmili = sw.ElapsedMilliseconds + ' sw.Start() - sw.Stop() - swTiempo.AppendFormat("Verifica En la app: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() - Else - Alert("Se presento un error al procesar las facturas.") - End If + ' If VerificaCorreo(True) Then + ' CargaDatos() + ' End If - End If + ' sw.Stop() + ' swTiempo.AppendFormat("Verifica En la app: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + ' swmili = sw.ElapsedMilliseconds + ' sw.Start() + ' Else + ' Alert("Se presento un error al procesar las facturas.") + ' End If + + 'End If sw.Stop() swTiempo.AppendFormat("BorrarInicio: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) swmili = sw.ElapsedMilliseconds sw.Start() - For Each filePath As String In ListXML - Try - File.Delete(filePath) - Catch ex As Exception - End Try - Next - For Each s As String In ListaComprimidos + + 'For Each filePath As String In ListXML + ' Try + ' File.Delete(filePath) + ' Catch ex As Exception + ' End Try + 'Next + + + 'For Each filePath As String In ListPDF + ' Try + ' File.Delete(filePath) + ' Catch ex As Exception + ' End Try + 'Next + + 'For Each s As String In ListaComprimidos + ' Try + ' File.Delete(s) + ' Catch ex As Exception + ' End Try + 'Next + + + + + 'For Each d As String In ListaDirectoriosTemporales + ' Try + ' Directory.Delete(d, True) + ' Catch ex As Exception + ' End Try + 'Next + + For Each s As String In ListXML Try File.Delete(s) Catch ex As Exception End Try Next - For Each d As String In ListaDirectoriosTemporales + For Each s As String In ListComprimidos Try - Directory.Delete(d, True) + File.Delete(s) Catch ex As Exception End Try Next - sw.Stop() swTiempo.AppendFormat("BorrarEnd: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) swmili = sw.ElapsedMilliseconds @@ -1716,11 +1883,47 @@ Partial Class Compras_eFacturas RegistraScript(String.Format("$('#{0}').modal('hide');", "ModalFacturas")) + RegistraScript("$('#ModalBitacoraEfacturas').modal()") + CargaDatosBitacora() + mesajeFaturasSubidas(DTLOG) 'Alert(String.Format("Se cargaron {0} Facturas", Arreglo.Count), TipoMensaje.MsgInformacion) End Sub + + Private Sub mesajeFaturasSubidas(DTLOG As DataTable) + + + Dim Str As New StringBuilder + + + Dim conta As Integer = 1 + Str.Append("Se procesó la información con la siguiente información:
") + + For Each dr As DataRow In DTLOG.Rows + + Str.AppendFormat("", If(conta Mod 2 = 0, "TextoAlterno", "Texto")) + + Str.AppendFormat("", dr("Serie")) + Str.AppendFormat("", dr("Folio")) + Str.AppendFormat("", If(dr("Fecha").ToString <> "", dr("Fecha").ToString.ToDate.ToShortDateString, "")) + Str.AppendFormat("", dr("Proveedor")) + Str.AppendFormat("", dr("Importe").ToString.ToDouble.FormatoNumero) + Str.AppendFormat("", dr("Motivo")) + Str.Append("") + conta += 1 + Next + + + + If DTLOG.Rows.Count > 0 Then 'si las facturas no recividas son matores a cero se muestra el mensaje + Alert(Str.ToString, TipoMensaje.MsgInformacion) + End If + + + End Sub + Public Sub GuardaLogefacturas(Str As String) Dim ArchivoW As StreamWriter Dim strLineaTMP As String @@ -1744,83 +1947,83 @@ Partial Class Compras_eFacturas ArchivoW.Close() ArchivoW.Dispose() End Sub - Private Function AgregaFactura(Fact As Modelos.eFactura) As String - Dim Retorno As String = "" - Dim Correcto As Boolean = False + 'Private Function AgregaFactura(Fact As Modelos.eFactura) As String + ' Dim Retorno As String = "" + ' Dim Correcto As Boolean = False - If Fact.Version = "3.2" Then Fact.TipodeComprobante = Fact.TipodeComprobante.Substring(0, 1) + ' If Fact.Version = "3.2" Then Fact.TipodeComprobante = Fact.TipodeComprobante.Substring(0, 1) - Dim ObjDatos As New ClsCompras - ObjDatos.IniciaTransacSQL() - ObjDatos.CveFactura = 0 - Dim Ret As Integer = ObjDatos.AddFactura(Fact.Serie, Fact.Folio, Convert.ToDateTime(Fact.Fecha), Fact.EmisorNombre, Fact.EmisorRFC, Fact.subTotal, - Fact.TrasladoIVA, Fact.Total, Fact.TFDUUID, Fact.ReceptorRFC, Fact.ArchivoXML, Fact.ArchivoPDF, - Fact.Version, Fact.Descuento, Fact.Moneda, Fact.TipodeComprobante, Fact.TipoCambio, Fact.Validada, - Fact.CveEmpresa, Fact.sUPPrefijo) + ' Dim ObjDatos As New ClsCompras + ' ObjDatos.IniciaTransacSQL() + ' ObjDatos.CveFactura = 0 + ' Dim Ret As Integer = ObjDatos.AddFactura(Fact.Serie, Fact.Folio, Convert.ToDateTime(Fact.Fecha), Fact.EmisorNombre, Fact.EmisorRFC, Fact.subTotal, + ' Fact.TrasladoIVA, Fact.Total, Fact.TFDUUID, Fact.ReceptorRFC, Fact.ArchivoXML, Fact.ArchivoPDF, + ' Fact.Version, Fact.Descuento, Fact.Moneda, Fact.TipodeComprobante, Fact.TipoCambio, Fact.Validada, + ' Fact.CveEmpresa, Fact.sUPPrefijo) - If Ret >= 0 Then - If Not Directory.Exists(Destino + Fact.EmisorRFC) Then - Directory.CreateDirectory(Destino + Fact.EmisorRFC) - End If - 'Try - ' If File.Exists(Destino & Retorno.EmisorRFC & "\" & NombreArchivo) Then File.Delete(Destino & Retorno.EmisorRFC & "\" & NombreArchivo) - ' File.Move(Temporal & NombreArchivo, Destino & Retorno.EmisorRFC & "\" & NombreArchivo) + ' If Ret >= 0 Then + ' If Not Directory.Exists(Destino + Fact.EmisorRFC) Then + ' Directory.CreateDirectory(Destino + Fact.EmisorRFC) + ' End If + ' 'Try + ' ' If File.Exists(Destino & Retorno.EmisorRFC & "\" & NombreArchivo) Then File.Delete(Destino & Retorno.EmisorRFC & "\" & NombreArchivo) + ' ' File.Move(Temporal & NombreArchivo, Destino & Retorno.EmisorRFC & "\" & NombreArchivo) - 'Catch ex As IOException - ' GuardaLog("'ERROR :" & ex.Message) - 'End Try + ' 'Catch ex As IOException + ' ' GuardaLog("'ERROR :" & ex.Message) + ' 'End Try - Select Case Ret - Case 0 + ' Select Case Ret + ' Case 0 - Correcto = True - Dim RRutaDestino As String = String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjDatos.CveFactura) - 'ModExtensiones.GuardaLog(String.Format(" '--------{0} Compra ya insertada : {1}{2} - {3}", ContadorGeneral, Fact.Serie, Fact.Folio, RRutaDestino)) + ' Correcto = True + ' Dim RRutaDestino As String = String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjDatos.CveFactura) + ' 'ModExtensiones.GuardaLog(String.Format(" '--------{0} Compra ya insertada : {1}{2} - {3}", ContadorGeneral, Fact.Serie, Fact.Folio, RRutaDestino)) - If Not File.Exists(RRutaDestino) Then - File.Move(String.Format("{0}Temp\{1}", AppDomain.CurrentDomain.BaseDirectory, Fact.ArchivoXML), RRutaDestino) - ObjDatos.UpdateArchivo(ObjDatos.CveFactura, "XML") - ModExtensiones.GuardaLog(" '--------XML Actualizado ") - End If + ' If Not File.Exists(RRutaDestino) Then + ' File.Move(String.Format("{0}Temp\{1}", AppDomain.CurrentDomain.BaseDirectory, Fact.ArchivoXML), RRutaDestino) + ' ObjDatos.UpdateArchivo(ObjDatos.CveFactura, "XML") + ' ModExtensiones.GuardaLog(" '--------XML Actualizado ") + ' End If - Correcto = True - Exit Select - Case 1 - 'muevo el archivo y lo renombro - Dim StrMover As String = "" - Try - File.Move(String.Format("{0}\{1}", Fact.DirectorioTemporal, Fact.ArchivoXML), String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) - File.Move(String.Format("{0}\{1}", Fact.DirectorioTemporal, Fact.ArchivoPDF), String.Format("{0}{1}\{2}.pdf", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) - ModExtensiones.GuardaLog(" '++++++++ Archivo :" + String.Format("{0}\{1}", Fact.DirectorioTemporal, Fact.ArchivoXML) + " - " + String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) - ModExtensiones.GuardaLog(" '++++++++ Archivo :" + String.Format("{0}\{1}", Fact.DirectorioTemporal, Fact.ArchivoPDF) + " - " + String.Format("{0}{1}\{2}.pdf", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) - 'si se movieron los dos archivos, los marca como correcto - If File.Exists(String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) AndAlso File.Exists(String.Format("{0}{1}\{2}.pdf", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) Then - Correcto = True - End If - Catch ex As Exception - StrMover = ex.Message - End Try + ' Correcto = True + ' Exit Select + ' Case 1 + ' 'muevo el archivo y lo renombro + ' Dim StrMover As String = "" + ' Try + ' File.Move(String.Format("{0}\{1}", Fact.DirectorioTemporal, Fact.ArchivoXML), String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) + ' File.Move(String.Format("{0}\{1}", Fact.DirectorioTemporal, Fact.ArchivoPDF), String.Format("{0}{1}\{2}.pdf", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) + ' ModExtensiones.GuardaLog(" '++++++++ Archivo :" + String.Format("{0}\{1}", Fact.DirectorioTemporal, Fact.ArchivoXML) + " - " + String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) + ' ModExtensiones.GuardaLog(" '++++++++ Archivo :" + String.Format("{0}\{1}", Fact.DirectorioTemporal, Fact.ArchivoPDF) + " - " + String.Format("{0}{1}\{2}.pdf", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) + ' 'si se movieron los dos archivos, los marca como correcto + ' If File.Exists(String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) AndAlso File.Exists(String.Format("{0}{1}\{2}.pdf", Destino, Fact.EmisorRFC, ObjDatos.CveFactura)) Then + ' Correcto = True + ' End If + ' Catch ex As Exception + ' StrMover = ex.Message + ' End Try - ModExtensiones.GuardaLog(Convert.ToString(" '++++++++ Compra Insertada :" + Fact.Serie + Fact.Folio + " - Correcto:" + (If(Correcto, "Si", "No" + " Obs: "))) & StrMover) - Exit Select - End Select - End If - If Correcto Then - ObjDatos.Commit() - 'ya se insertó o está insertada - Dim Idioma As New CultureInfo("es-MX") - 'regreso el format 2014-07 Julio - Retorno = Fact.Fecha.ToDate().ToString("yyyy-MM MMMM", Idioma) - Else - ObjDatos.RollBack() - End If - ObjDatos.Dispose() + ' ModExtensiones.GuardaLog(Convert.ToString(" '++++++++ Compra Insertada :" + Fact.Serie + Fact.Folio + " - Correcto:" + (If(Correcto, "Si", "No" + " Obs: "))) & StrMover) + ' Exit Select + ' End Select + ' End If + ' If Correcto Then + ' ObjDatos.Commit() + ' 'ya se insertó o está insertada + ' Dim Idioma As New CultureInfo("es-MX") + ' 'regreso el format 2014-07 Julio + ' Retorno = Fact.Fecha.ToDate().ToString("yyyy-MM MMMM", Idioma) + ' Else + ' ObjDatos.RollBack() + ' End If + ' ObjDatos.Dispose() - Return Retorno + ' Return Retorno - End Function + 'End Function Private Sub CargarFacturas(PathArchivo As String, NombreArchivo As String) Dim RFC As String = CargaEmisordeXML(String.Format("{0}", PathArchivo), "RFC", UsuarioActual.Empresa.RFC) If RFC IsNot Nothing Then @@ -4016,7 +4219,7 @@ Partial Class Compras_eFacturas #End Region Public Sub ImprimirPDFXML(NombreArchivo As String, rutaxml As String) - Dim objxml As XmlSatCFDI = XmlSatCFDI.readXML(rutaxml) + Dim objxml As ADSistemaLibrary.SatXml.XmlSatCFDI = ADSistemaLibrary.SatXml.XmlSatCFDI.readXML(rutaxml) Dim rutaReporte As String = String.Format("{0}{1}", ModExtensiones.DirectorioBaseEmpresas, "\Empresas\Grales\Formatos\CFDIV3.rdlc") Dim cQr As Byte() = ClsPaginas.GeneraQRSAT(objxml.emisor.Rfc, objxml.receptor.Rfc, objxml.comprobante.Total, objxml.complemento.UUID) @@ -4064,7 +4267,7 @@ Partial Class Compras_eFacturas ltotales.Add(New utilValores("Descuento", objxml.comprobante.Descuento.ToString("N2"))) End If - For Each item As CFDIImpuesto In objxml.Impuestos + For Each item As ADSistemaLibrary.SatXml.CFDIImpuesto In objxml.Impuestos If item.Importe > 0 Then Dim TasaOCuota As Decimal = 0 @@ -4196,7 +4399,7 @@ Partial Class Compras_eFacturas End Sub Protected Sub LnkRegenerarPdfnew_Click(sender As Object, e As EventArgs) Dim gvrow As GridViewRow = DirectCast(DirectCast(sender, LinkButton).NamingContainer, GridViewRow) - Dim objxml As XmlSatCFDI = XmlSatCFDI.readXML(String.Format("{0}{1}\{2}", Destino, gvrow.DataKey("RFCDe"), gvrow.DataKey("XML"))) + Dim objxml As ADSistemaLibrary.SatXml.XmlSatCFDI = ADSistemaLibrary.SatXml.XmlSatCFDI.readXML(String.Format("{0}{1}\{2}", Destino, gvrow.DataKey("RFCDe"), gvrow.DataKey("XML"))) Dim XmlRutaArchivo As String = File.ReadAllText(String.Format("{0}{1}\{2}", Destino, gvrow.DataKey("RFCDe"), gvrow.DataKey("XML"))) @@ -7048,6 +7251,11 @@ End Class Namespace ADS.eFacturas Public Class Factura + + Public Property CveFactura As Integer = -1 + Public Property RespuestaInsert As Integer = -1 + + Friend noCertificado As String = "" Public Property CveEmpresa As Integer Public Property Version As String Public Property Serie As String @@ -7060,7 +7268,7 @@ Namespace ADS.eFacturas Public Property TipoComprobante As String Public Property Descuento As Decimal Public Property TipoCambio As Decimal - Public Property MetododePago As String + Public Property MetododePago As String = "" Public Property EmisorRFC As String Public Property EmisorNombre As String Public Property EmisorRegimenFiscal As String @@ -7078,10 +7286,116 @@ Namespace ADS.eFacturas Public Property RetencionISR As Decimal Public Property sUPPrefijo As String Public Property UUID As String - Public Property Validada As Integer + Public Property Validada As Integer = 0 Public Property ArchivoXML As String Public Property ArchivoPDF As String - Public Property Pagos As List(Of Pago) + Public Property Pagos As New List(Of Pago) + Public Property IEPS As Decimal + Public Property TFDFechaTimbrado As String + Public Property TFDSelloCFD As String + Public Property TFDNoCertSAT As String + Public Property TFDSelloSAT As String + Public Property FormaDePago As String + Public Property DTConceptos As DataTable + Public Property EmiRFC As String + Public Property EmiNombre As String + Public Property DomFisCalle As String + Public Property DomFisNoExt As String + Public Property DomFisCol As String + Public Property DomFisCP As String + Public Property DomFisMun As String + Public Property DomFisLoc As String + Public Property DomFisEst As String + Public Property DomFisPais As String + Public Property ExpEnCalle As String + Public Property ExpEnNoExt As String + Public Property ExpEnCol As String + Public Property ExpEnCP As String + Public Property ExpEnMun As String + Public Property ExpEnLoc As String + Public Property ExpEnEst As String + Public Property ExpEnPais As String + Public Property Regimen As String + Public Property RecRfc As String + Public Property RecNombre As String + Public Property DomRecCalle As String + Public Property DomRecFisNoExt As String + Public Property DomRecFisNoInt As String + Public Property DomRecCol As String + Public Property DomRecCP As String + Public Property DomRecMun As String + Public Property DomRecLoc As String + Public Property DomRecEst As String + Public Property DomRecPais As String + Public Property condicionesDePago As String + Public Property NumCtaPagoNumCtaPago As String + + + Public ReadOnly Property DtPagos As DataTable + Get + + If Pagos.Count > 0 Then + + Dim query = From p In Me.Pagos Select New With {.FechaPago = p.FechaPago, .FormaDePagoP = p.FormaDePagoP, .MonedaP = p.MonedaP, .ImportePago = p.Monto} + Dim DtPagosNew As DataTable = ModExtensiones.CopyToDataTable(query, True) + DtPagosNew.TableName = "DsPagos" + Return DtPagosNew + Else + Dim DtPagosNew As New DataTable + DtPagosNew.TableName = "DsPagos" + Return DtPagosNew + End If + + End Get + End Property + + Public ReadOnly Property DtDocumentosR As DataTable + Get + If Pagos.Count > 0 Then + + Dim DtDocumentosRNew As DataTable = ModExtensiones.CopyToDataTable(Pagos(0).Documentos, True) + DtDocumentosRNew.TableName = "DsDocRelacionados" + Return DtDocumentosRNew + + Else + Dim DtDocumentosRNew As New DataTable + DtDocumentosRNew.TableName = "DsDocRelacionados" + Return DtDocumentosRNew + + End If + End Get + End Property + + Private Sub CreaDTConceptos() + DTConceptos = New DataTable() + DTConceptos.Columns.Add("Consec", GetType(Integer)) + DTConceptos.Columns.Add("Cantidad", GetType(Double)) + DTConceptos.Columns.Add("UM", GetType(String)) + DTConceptos.Columns.Add("PS", GetType(String)) + DTConceptos.Columns.Add("PU", GetType(Double)) + DTConceptos.Columns.Add("IVA", GetType(Double)) + DTConceptos.Columns.Add("Total", GetType(Double)) + End Sub + + Public Sub New() + CreaDTConceptos() + End Sub + + Public Sub AddPS(ByVal Cantidad As Double, ByVal UM As String, ByVal PS As String, ByVal PU As Double, ByVal IVA As Double, Optional ByVal Total As Double = 0) + If PS <> "IVA" Then + Dim Row As DataRow = Nothing + Row = DTConceptos.NewRow() + Row("Consec") = DTConceptos.Rows.Count + 1 + Row("Cantidad") = Cantidad + Row("UM") = UM + Row("PS") = PS + Row("PU") = PU + Row("IVA") = IVA + Row("Total") = If(Total > 0, Total, (Cantidad * PU)) + DTConceptos.Rows.Add(Row) + End If + End Sub + End Class Public Class Pago @@ -7386,10 +7700,14 @@ Namespace ADS.eFacturas ' End If 'End Sub - Public Function CargaComprobanteXML(StrFuente As String, CveEmpresa As Integer) As Factura + Public Function CargaComprobanteXML(StrFuente As String, DirectorioEmpresa As String, RFCEmpresa As String, CveEmpresa As Integer, Registrar As Boolean, ByRef rowLog As DataRow, NombreArchivo As String) As Factura + + + Dim SeValido As Boolean = False Dim XMLCargaExistosa As Boolean = False Dim XMlStr As String = StrFuente.Replace("<br>", "").Replace("<", "").Replace("o;?", "") Dim XMLDoc As New XmlDocument + Try XMLDoc.LoadXml(XMlStr) XMLCargaExistosa = True @@ -7399,13 +7717,17 @@ Namespace ADS.eFacturas XMLCargaExistosa = False End Try - If Not XMLCargaExistosa Then Return Nothing + If Not XMLCargaExistosa Then + rowLog("Motivo") = $"Error extructura XML archivo {NombreArchivo}" + Return Nothing + End If Dim nodo As XmlNode = XMLDoc.DocumentElement Dim Fact As Factura = New Factura() Fact.Serie = ValorXML(nodo, "serie") Dim StrCFDIVersion As String = ValorXML(nodo, "version") + Fact.Version = StrCFDIVersion Fact.Folio = ValorXML(nodo, "folio") @@ -7414,22 +7736,17 @@ Namespace ADS.eFacturas Fact.Total = ValorXML(nodo, "total").ToDecimal Fact.Descuento = ValorXML(nodo, "descuento").ToDecimal Fact.Moneda = ValorXML(nodo, "Moneda") - Fact.CveMoneda = ClsPaginas.GlobalDTMonedas().FiltroPrimeroValor("CveMoneda", $" AbreviaturaSAT = '{Fact.Moneda}' ").ToEntero - 'If Not CveMoneda > 0 Then - ' GuardaLog($"Moneda {Moneda} no se obtuvo la clabe") - ' Errores.AppendLine($"Moneda {Moneda} no se obtuvo la clabe") - ' XMLCargaExistosa = False - ' Exit Sub - 'End If - Fact.TipoComprobante = ValorXML(nodo, "tipoDeComprobante") Fact.TipoCambio = ValorXML(nodo, "TipoCambio", "1").ToDecimal + Fact.noCertificado = ValorXML(nodo, "NoCertificado") + Fact.FormaDePago = ValorXML(nodo, "formaDePago") + Fact.condicionesDePago = ValorXML(nodo, "condicionesDePago", "") + Fact.NumCtaPagoNumCtaPago = ValorXML(nodo, "NumCtaPago", "") If Fact.Version = "3.3" Or Fact.Version = "4.0" Then Dim drm As DataRow = ClsPaginas.GlobalDTVtaMetodoPago.FiltroPrimero(String.Format("ClaveMetodoPagoSAT = '{0}'", ValorXML(nodo, "MetodoPago"))) If drm IsNot Nothing Then - 'Fact.MetododePago = drm("CveMetodoPago").ToString.ToEntero Fact.MetododePago = drm("MetodoPagoSAT").ToString End If End If @@ -7446,12 +7763,99 @@ Namespace ADS.eFacturas Else ' se considera que es la version 4.0 cfdVer = "http://www.sat.gob.mx/cfd/4" End If + namespaces.AddNamespace(Prefijo, cfdVer) namespaces.AddNamespace("aerolineas", "http://www.sat.gob.mx/aerolineas") namespaces.AddNamespace("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital") namespaces.AddNamespace("implocal", "http://www.sat.gob.mx/implocal") namespaces.AddNamespace("registrofiscal", "http://www.sat.gob.mx/registrofiscal") + Fact.sUPPrefijo = Prefijo + + If StrCFDIVersion = "3.2" Then + + For i As Integer = 0 To XMLDoc.DocumentElement.ChildNodes(2).ChildNodes.Count - 1 + nodo = XMLDoc.DocumentElement.ChildNodes(2).ChildNodes(i) + Fact.AddPS(Convert.ToDouble(nodo.Attributes.GetNamedItem("cantidad").Value), nodo.Attributes.GetNamedItem("unidad").Value, nodo.Attributes.GetNamedItem("descripcion").Value, Convert.ToDouble(nodo.Attributes.GetNamedItem("valorUnitario").Value), 0, Convert.ToDouble(nodo.Attributes.GetNamedItem("importe").Value)) + Next + + Try + + Dim nodosEmisor = XMLDoc.DocumentElement.ChildNodes.Cast(Of XmlNode)().FirstOrDefault(Function(n) n.Name.Equals("cfdi:Emisor", StringComparison.OrdinalIgnoreCase)) + + Dim nodoEmisor As XmlNode = nodosEmisor + + Fact.EmiRFC = ValorXML(nodoEmisor, "rfc", "") + Fact.EmiNombre = ValorXML(nodoEmisor, "nombre", "") + + nodoEmisor = nodosEmisor.ChildNodes(0) + Fact.DomFisCalle = ValorXML(nodoEmisor, "calle", "") + Fact.DomFisNoExt = ValorXML(nodoEmisor, "noExterior", "") + Fact.DomFisCol = ValorXML(nodoEmisor, "colonia", "") + Fact.DomFisCP = ValorXML(nodoEmisor, "codigoPostal", "") + Fact.DomFisMun = ValorXML(nodoEmisor, "municipio", "") + Fact.DomFisLoc = ValorXML(nodoEmisor, "localidad", "") + Fact.DomFisEst = ValorXML(nodoEmisor, "estado", "") + Fact.DomFisPais = ValorXML(nodoEmisor, "pais", "") + + nodoEmisor = nodosEmisor.ChildNodes(1) + Fact.ExpEnCalle = ValorXML(nodoEmisor, "calle", "") + Fact.ExpEnNoExt = ValorXML(nodoEmisor, "noExterior", "") + Fact.ExpEnCol = ValorXML(nodoEmisor, "colonia", "") + Fact.ExpEnCP = ValorXML(nodoEmisor, "codigoPostal", "") + Fact.ExpEnMun = ValorXML(nodoEmisor, "municipio", "") + Fact.ExpEnLoc = ValorXML(nodoEmisor, "localidad", "") + Fact.ExpEnEst = ValorXML(nodoEmisor, "estado", "") + Fact.ExpEnPais = ValorXML(nodoEmisor, "pais", "") + + nodoEmisor = nodoEmisor.ChildNodes(2) + Fact.Regimen = ValorXML(nodo, "Regimen", "") + Catch ex As Exception + Throw New Exception($"Error CargaEmisorXML - {ex.Message} - {ex.StackTrace}") + End Try + + Try + Dim nodosReceptor = XMLDoc.DocumentElement.ChildNodes.Cast(Of XmlNode)().FirstOrDefault(Function(n) n.Name.Equals("cfdi:Receptor", StringComparison.OrdinalIgnoreCase)) + + Dim nodoReceptor As XmlNode = nodosReceptor + Fact.RecRfc = ValorXML(nodoReceptor, "rfc", "") + Fact.RecNombre = ValorXML(nodoReceptor, "nombre", "") + + nodoReceptor = nodosReceptor.ChildNodes(0) + Fact.DomRecCalle = ValorXML(nodoReceptor, "calle", "") + Fact.DomRecFisNoExt = ValorXML(nodoReceptor, "noExterior", "") + Fact.DomRecFisNoInt = ValorXML(nodoReceptor, "noInterior", "") + Fact.DomRecCol = ValorXML(nodoReceptor, "colonia", "") + Fact.DomRecCP = ValorXML(nodoReceptor, "codigoPostal", "") + Fact.DomRecMun = ValorXML(nodoReceptor, "municipio", "") + Fact.DomRecLoc = ValorXML(nodoReceptor, "localidad", "") + Fact.DomRecEst = ValorXML(nodoReceptor, "estado", "") + Fact.DomRecPais = ValorXML(nodoReceptor, "pais", "") + Catch ex As Exception + Throw New Exception($"Error CargaReceptorXML - {ex.Message} - {ex.StackTrace}") + End Try + + + ElseIf StrCFDIVersion = "3.3" OrElse StrCFDIVersion = "4.0" Then + Try + Dim nodos = XMLDoc.DocumentElement.ChildNodes.Cast(Of XmlNode)().Where(Function(n) n.Name.Equals("cfdi:Conceptos", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().ChildNodes + + For Each item As XmlNode In nodos + Dim cantidad = Convert.ToDouble(item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("cantidad", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value) + Dim unidad = item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("ClaveUnidad", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value + Dim descripcion = item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("descripcion", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value + Dim valorUnitario = Convert.ToDouble(item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("valorUnitario", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value) + Dim importe = Convert.ToDouble(item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("importe", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value) + + Fact.AddPS(cantidad, unidad, descripcion, valorUnitario, 0, importe) + Next + Catch ex As Exception + Throw New Exception($"Error CargaConceptosXML - {ex.Message} - {ex.StackTrace}") + End Try + End If + + + If Fact.TipoComprobante.ToUpper = "E" AndAlso (Fact.Version.Contiene("3.3", "4.0")) Then Dim UUIDS As String = "" @@ -7464,7 +7868,6 @@ Namespace ADS.eFacturas UUIDSLista.Add("" & CFDIRelacionados.Attributes("UUID").Value.ToString & "") Next End If - 'DocumentosRelacionadosUUIDSList = UUIDSLista End If Dim node As XmlNode @@ -7481,21 +7884,6 @@ Namespace ADS.eFacturas Fact.ReceptorRFC = ValorXML(node, "RFC") End If - 'If UsuarioActual.CveEmpresa.Contiene(119, 7) Then - ' node = XMLDoc.SelectSingleNode(String.Format("//{0}:CfdiRelacionados", Prefijo), namespaces) - ' If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then - ' If ValorXML(node, "TipoRelacion").ToString.Contiene("07") Then - ' Dim nodeDocumentosRelacionados As XmlNodeList = XMLDoc.SelectNodes(String.Format("//{0}:CfdiRelacionado", Prefijo), namespaces) - ' For Each documento As XmlNode In nodeDocumentosRelacionados - ' If documento.Attributes("UUID").Value <> "" Then - ' DocumentosRelacionadosAnticiposUUIDList.Add(documento.Attributes("UUID").Value) - ' End If - ' TieneAnticiposXML = True - ' Next - ' End If - ' End If - 'End If - node = XMLDoc.SelectSingleNode(String.Format("//{0}:Impuestos", Prefijo), namespaces) If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then Dim nodeRetenciones As XmlNodeList = XMLDoc.SelectNodes(String.Format("//{0}:Comprobante/{0}:Impuestos/{0}:Retenciones/{0}:Retencion", Prefijo), namespaces) @@ -7540,7 +7928,7 @@ Namespace ADS.eFacturas End If Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) - If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + If nodeComp IsNot Nothing AndAlso nodeComp.ChildNodes.Count > 0 Then Dim nodeTFD As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:TimbreFiscalDigital", "tfd"), namespaces) Fact.UUID = ValorXML(nodeTFD, "UUID", "") @@ -7551,25 +7939,1558 @@ Namespace ADS.eFacturas End If End If - Dim ObjCompra As New ClsCompras + If Fact.TipoComprobante = "P" Then + CargaPagos(XMLDoc, Fact) + End If - ObjCompra.AddFactura(Fact.Serie, Fact.Folio, Fact.Fecha, Fact.EmisorNombre, Fact.EmisorRFC, Fact.SubTotal, Fact.RetencionIVA, Fact.Total, Fact.UUID, Fact.ReceptorRFC, "", "", Fact.Version, Fact.Descuento, Fact.Moneda, Fact.TipoComprobante, Fact.TipoCambio, 0, CveEmpresa, "") + rowLog("Serie") = Fact.Serie + rowLog("Folio") = Fact.Folio + rowLog("Fecha") = Fact.Fecha + rowLog("Proveedor") = Fact.EmisorNombre + rowLog("Importe") = Fact.Total + rowLog("Motivo") = "" - ObjCompra.Dispose() + If Registrar Then + + If Fact.ReceptorRFC = RFCEmpresa Then + + Dim ObjCompra As New ClsCompras + Dim Correcto As Boolean = False + + ObjCompra.IniciaTransacSQL() + + Fact.RespuestaInsert = ObjCompra.AddFactura(Fact.Serie, Fact.Folio, Fact.Fecha, Fact.EmisorNombre, Fact.EmisorRFC, Fact.SubTotal, Fact.TrasladoIVA, Fact.Total, Fact.UUID, Fact.ReceptorRFC, "", "", Fact.Version, Fact.Descuento, Fact.TipoCambio, Fact.Validada, CveEmpresa, Fact.sUPPrefijo, Fact.TipoComprobante, Fact.Moneda, Fact.MetododePago, 3, Fact.Version, Fact.IEPS, Fact.RetencionIVA, Fact.RetencionISR) + + If Fact.RespuestaInsert >= 0 Then + + Dim Destino As String = $"{DirectorioEmpresa}\Compras\" + + Try + If Not Directory.Exists(Destino & Fact.EmisorRFC) Then + Directory.CreateDirectory(Destino & Fact.EmisorRFC) + End If + + Select Case Fact.RespuestaInsert + Case 0 + Dim RRutaDestino As String = String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjCompra.CveFactura) + ModExtensiones.GuardaLog(String.Format(" '--------{0} Compra ya insertada : {1}{2} - {3}", 1, Fact.Serie, Fact.Folio, RRutaDestino)) + + File.WriteAllText(RRutaDestino, StrFuente, UTF8Encoding.UTF8) + 'ObjCompra.UpdateArchivo(ObjCompra.CveFactura, "XML") + ModExtensiones.GuardaLog(" '--------XML Actualizado ") + rowLog("Motivo") = $"Ya registrado {Fact.Serie}-{Fact.Folio} se actualiza XML." + + Correcto = True + Exit Select + + Case 1 + + Dim StrMover As String = "" + Try + File.WriteAllText(String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjCompra.CveFactura), StrFuente, UTF8Encoding.UTF8) + ' ObjCompra.UpdateArchivo(ObjCompra.CveFactura, "XML") + ModExtensiones.GuardaLog($" '-------- XML Guardado Factura: {Fact.Serie}-{Fact.Folio} UUID: {Fact.UUID} , RFC Emisor: {Fact.EmisorRFC}") + + ' Si se movieron los dos archivos, los marca como correcto + If File.Exists(String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjCompra.CveFactura)) Then + Correcto = True + Else + Correcto = False + End If + + ModExtensiones.GuardaLog(" '++++++++ Compra Insertada :" & Fact.Serie & Fact.Folio & " - Correcto:" & If(Correcto, "Si", "No" & " Obs: ")) + rowLog("Motivo") = $"Agregado {Fact.Serie}-{Fact.Folio}" + + Catch ex As Exception + StrMover = ex.Message + Correcto = False + ModExtensiones.GuardaLog(" '++++++++ Compra no Insertada :" & Fact.Serie & Fact.Folio & " - Correcto:" & If(Correcto, "Si", "No" & " Obs: ") & StrMover) + rowLog("Motivo") = $"Error al agregar {Fact.Serie}-{Fact.Folio}" + End Try + + Exit Select + End Select + + Catch ex As Exception + Correcto = True + GuardaLog(ex.ToString()) + End Try + + Else + rowLog("Motivo") = $"RFC ""{Fact.ReceptorRFC}"" Error al insertar" + End If + + + If Correcto Then + ObjCompra.Commit() + Fact.CveFactura = ObjCompra.CveFactura + Fact.ArchivoXML = $"{ObjCompra.CveFactura}.xml" + Else + ObjCompra.RollBack() + End If + + ObjCompra.Dispose() + + Else + ModExtensiones.GuardaLog($" '++++++++ Compra RFC Distinto RFC Empresa: {RFCEmpresa}, RFC XML: {Fact.ReceptorRFC} ") + rowLog("Motivo") = "RFC Distinto" + rowLog("Motivo") = $"RFC ""{Fact.ReceptorRFC}"" Incorrecto" + End If + + End If - 'If XMLCargaExistosa Then - ' If Not ValidateUUID(UUID) Then - ' GuardaLog($"UUID Invalido {UUID} .") - ' Errores.AppendLine($"UUID Invalido {UUID} .") - ' XMLCargaExistosa = False - ' End If - 'End If Return Fact End Function + + + + Public Function GeneraPDF(ByVal Ruta As String, ByVal Fact As Factura, DirectorioEmpresa As String, Guardar As Boolean) As Boolean + Dim RutaXML As String = String.Empty + Dim RutaPDF As String = String.Empty + Dim Retorno As Boolean = False + Try + Dim XMLDoc As New XmlDocument() + Dim TmpArchivoPDF As String = $"{Ruta}\Temp\Facturas\{Path.GetFileNameWithoutExtension(Fact.ArchivoXML)}-ttt.pdf" + Dim TmpArchivoQR As String = $"{Ruta}\Temp\Facturas\{Path.GetFileNameWithoutExtension(Fact.ArchivoXML)}-ttt.jpg" + Dim ArchivoXML As String = String.Format("{0}\Compras\{2}\{1}", DirectorioEmpresa, Fact.ArchivoXML, Fact.EmisorRFC) + Dim ArchivoPDF As String = String.Format("{0}\Compras\{2}\{1}.pdf", DirectorioEmpresa, Fact.CveFactura, Fact.EmisorRFC) + Dim dtotal As Decimal = If(Fact.Total <= 0.0D, 0.0001D, Fact.Total) + Dim cfdi As New RVCFDI33.GeneraCFDI() + + Try + Dim b As Byte() = cfdi.ConvertirQrCode(String.Format("?re={0}&rr={1}&tt={2}&id={3}", Fact.EmisorRFC, Fact.ReceptorRFC, String.Format("{0,12:F6}", dtotal).Trim(), Fact.UUID)) + File.WriteAllBytes(TmpArchivoQR, b) + Catch ex As Exception + ModExtensiones.GuardaLog(ex.Message) + End Try + + If System.IO.File.Exists(TmpArchivoQR) Then + Dim TipoDocto As String = "" + If Fact.Version = "3.3" Or Fact.Version = "4.0" Then + Select Case Fact.TipoComprobante + Case "I" + TipoDocto = "Ing" + Case "E" + TipoDocto = "Egs" + Case "P" + TipoDocto = "Pag" + Case "T" + TipoDocto = "Tra" + Case Else + End Select + Else + TipoDocto = Fact.TipoComprobante + End If + + 'Dim DtPagos As DataTable = Nothing + 'Dim DtDocumentosR As DataTable = Nothing + + If Fact.TipoComprobante.Contiene("P", "T") Then + ModExtensiones.GuardaLog(String.Format(" '--------PDF Generar Tipo {0}", Fact.TipoComprobante)) + Retorno = GenGoPdf(ArchivoXML, TmpArchivoPDF, DirectorioEmpresas) + Fact.ArchivoPDF = Path.GetFileName(TmpArchivoPDF) + + Try + If Guardar Then + If File.Exists(ArchivoPDF) Then + File.Delete(ArchivoPDF) + End If + File.Move(TmpArchivoPDF, ArchivoPDF) + End If + Retorno = True + Catch ex As Exception + Retorno = False + End Try + + Else + + If (Fact.Version = "3.3" Or Fact.Version = "4.0") Then + Dim cxml As XmlSatCFDI = XmlSatCFDI.readXML(ArchivoXML) + ModExtensiones.GuardaLog(String.Format(" *********** UUID : {0} ***********", cxml.complemento.UUID)) + cxml.ImprimirPDF(TmpArchivoPDF, DirectorioEmpresa, Fact.TipoComprobante) + Fact.ArchivoPDF = Path.GetFileName(TmpArchivoPDF) + + Try + If Guardar Then + If File.Exists(ArchivoPDF) Then + File.Delete(ArchivoPDF) + End If + File.Move(TmpArchivoPDF, ArchivoPDF) + End If + Retorno = True + Catch ex As Exception + Retorno = False + End Try + + Else + ModExtensiones.GuardaLog(String.Format(" *********** TFDUUID : {0} ***********", Fact.UUID)) + Dim DomFiscal As String = String.Format("Domicilio Fiscal {0}{1} {2}{0}Col.{3}{0}CP. {4} {5},{6},{7}", vbCr, Fact.DomFisCalle, Fact.DomFisNoExt, Fact.DomFisCol, Fact.DomFisCP, Fact.DomFisMun, Fact.DomFisEst, Fact.DomFisPais) + + If GeneraPDFNew(TmpArchivoPDF, Fact.UUID, Fact.SubTotal, Fact.Descuento, Fact.Total, Fact.TrasladoIVA.FormatoNumero(), Fact.Moneda, Fact.FormaDePago, Fact.TFDNoCertSAT, Fact.TFDFechaTimbrado.ToDate(), Fact.noCertificado, + Fact.DTConceptos, Fact.TFDSelloCFD, Fact.TFDSelloSAT, TmpArchivoQR, Fact.Serie + Fact.Folio, Fact.TipoComprobante, "", Fact.ReceptorRFC, Fact.RecNombre, Fact.DomRecCalle, Fact.DomRecCol, Fact.DomRecFisNoExt, + Fact.DomRecFisNoInt, Fact.DomRecCP, Fact.DomRecMun, Fact.DomRecEst, Fact.Regimen, Fact.condicionesDePago, Fact.MetododePago, Fact.NumCtaPagoNumCtaPago, NowADS, Fact.DtPagos, Fact.DtDocumentosR, Fact.RetencionIVA, + Fact.RetencionISR, Fact.EmiNombre, Fact.EmiRFC, Fact.ReceptorNombre, DirectorioEmpresa, DomFiscal) Then + + Fact.ArchivoPDF = Path.GetFileName(TmpArchivoPDF) + Retorno = True + + If Guardar Then + + End If + + End If + + + + End If + + File.Delete(TmpArchivoQR) + + End If + + RutaPDF = TmpArchivoPDF + Else + Retorno = False + + End If + 'If DTConceptos IsNot Nothing Then DTConceptos.Dispose() + Catch ex As Exception + Dim MensajeError As String = "***********Ocurrio un error al generar el pdf: " & ex.Message & "" + + If ex.InnerException Is Nothing Then + MensajeError &= "." + Else + MensajeError &= " - " & ex.InnerException.ToString() + End If + + ModExtensiones.GuardaLog(MensajeError) + End Try + Return Retorno + End Function + + + Private Function GeneraPDFNew(ByVal TmpArchivoPDF As String, ByVal FolioFiscal As String, ByVal SubTotal As Decimal, ByVal Descuento As Decimal, ByVal Total As Decimal, ByVal IVA As String, ByVal Moneda As String, ByVal FormaDePago As String, + ByVal NoSerieCertificado As String, ByVal FechaCertificacion As DateTime, ByVal NoSerieCertificadoContribuyente As String, ByVal DTConceptos As DataTable, ByVal SelloCFDi As String, ByVal SelloSAT As String, + ByVal CBB As String, ByVal Folio As String, ByVal TipodeComprobante As String, ByVal CadenaOriginalCFD As String, ByVal RFC As String, ByVal Cliente As String, ByVal Direccion As String, ByVal Colonia As String, + ByVal NoExt As String, ByVal NoInt As String, ByVal CP As String, ByVal Ciudad As String, ByVal Estado As String, ByVal Regimen As String, ByVal CondicionPago As String, ByVal MetodoPago As String, ByVal NumCtaPago As String, + ByVal fecha As DateTime, Optional ByVal DtPagos As DataTable = Nothing, Optional ByVal DtRelacionados As DataTable = Nothing, Optional ByVal RetIVA As Double = 0, Optional ByVal RetISR As Double = 0, + Optional EmiNombre As String = "", Optional EmiRFC As String = "", Optional NombreEmpresa As String = "", Optional DirectorioEmpresa As String = "", Optional DomFiscal As String = "") As Boolean + + + Dim RutaRDLC As String = If(TipodeComprobante = "Pag", $"{DirectorioEmpresa}..\Grales\Formatos\CFDIPago.rdlc", $"{DirectorioEmpresa}..\Grales\Formatos\CFDI.rdlc") + + Dim Retorno As Boolean = False + Dim NombreArchivo As String = TmpArchivoPDF + Dim CadenaOriginal As String = "||1.0|" & FolioFiscal & "|" & FechaCertificacion.ToString("yyyy-MM-dd") & "T" & FechaCertificacion.ToString("HH:mm:ss") & "|" & SelloCFDi & "|" & NoSerieCertificado & "||" + Dim RutaFormato As String = RutaRDLC + + + Try + Dim Archivo As New System.IO.FileInfo(RutaFormato) + + If Archivo.Exists Then + Dim parametros As New List(Of ReportParameter)() + parametros.Add(New ReportParameter("FolioFiscal", FolioFiscal)) + parametros.Add(New ReportParameter("SubTotal", SubTotal.FormatoNumero())) + parametros.Add(New ReportParameter("Descuento", Descuento.FormatoNumero())) + parametros.Add(New ReportParameter("Total", Total.FormatoNumero())) + parametros.Add(New ReportParameter("IVA", IVA.FormatoNumero())) + parametros.Add(New ReportParameter("RetIVA", RetIVA.FormatoNumero())) + parametros.Add(New ReportParameter("RetISR", RetISR.FormatoNumero())) + parametros.Add(New ReportParameter("Moneda", Moneda)) + parametros.Add(New ReportParameter("FormaDePago", FormaDePago)) + parametros.Add(New ReportParameter("NoSerieCertificado", NoSerieCertificado)) + parametros.Add(New ReportParameter("FechaCertificacion", FechaCertificacion.ToString("yyyy-MM-dd") & "T" & FechaCertificacion.ToString("HH:mm:ss"))) + parametros.Add(New ReportParameter("NoSerieCertificadoContribuyente", NoSerieCertificadoContribuyente)) + parametros.Add(New ReportParameter("SelloCFDi", SelloCFDi)) + parametros.Add(New ReportParameter("SelloSAT", SelloSAT)) + parametros.Add(New ReportParameter("CBB", String.Format("file:///{0}", CBB))) + parametros.Add(New ReportParameter("Folio", Folio)) + parametros.Add(New ReportParameter("TipodeComprobante", TipodeComprobante.ToUpper())) + parametros.Add(New ReportParameter("CadenaOriginalCFD", CadenaOriginalCFD)) + parametros.Add(New ReportParameter("RFC", RFC)) + parametros.Add(New ReportParameter("Cliente", Cliente)) + parametros.Add(New ReportParameter("Direccion", Direccion)) + parametros.Add(New ReportParameter("Colonia", Colonia)) + parametros.Add(New ReportParameter("NoExt", NoExt)) + parametros.Add(New ReportParameter("NoInt", NoInt)) + parametros.Add(New ReportParameter("CP", CP)) + parametros.Add(New ReportParameter("Ciudad", Ciudad)) + parametros.Add(New ReportParameter("Estado", Estado)) + parametros.Add(New ReportParameter("Regimen", Regimen)) + parametros.Add(New ReportParameter("CondicionPago", CondicionPago)) + parametros.Add(New ReportParameter("MetodoPago", MetodoPago)) + parametros.Add(New ReportParameter("NumCtaPago", NumCtaPago)) + parametros.Add(New ReportParameter("fecha", fecha.ToString("yyyy-MM-dd") & "T" & fecha.ToString("HH:mm:ss"))) + parametros.Add(New ReportParameter("Fiscal", DomFiscal)) + parametros.Add(New ReportParameter("EmiNombre", EmiNombre)) + parametros.Add(New ReportParameter("EmiRFC", EmiRFC)) + parametros.Add(New ReportParameter("TotalLetra", ModExtensiones.Texto2Letras(Total))) + parametros.Add(New ReportParameter("Empresa", NombreEmpresa)) + + + + Using MR As New ReportViewer() + Dim rds1 As New ReportDataSource() + rds1.Name = "DsOC" + rds1.Value = DTConceptos + + MR.LocalReport.DataSources.Add(rds1) + + If DtPagos IsNot Nothing Then + Dim rds2 As New ReportDataSource() + rds2.Name = "DsPago" + rds2.Value = DtPagos + MR.LocalReport.DataSources.Add(rds2) + End If + If DtRelacionados IsNot Nothing Then + Dim rds3 As New ReportDataSource() + rds3.Name = "DsDocRelacionados" + rds3.Value = DtRelacionados + MR.LocalReport.DataSources.Add(rds3) + End If + + MR.LocalReport.ReportPath = RutaFormato + MR.ProcessingMode = ProcessingMode.Local + MR.LocalReport.EnableExternalImages = True + MR.LocalReport.SetParameters(parametros) + MR.LocalReport.Refresh() + + Dim warnings As Warning() = Nothing + Dim streamids As String() = Nothing + Dim mimeType As String = Nothing + Dim encoding As String = Nothing + Dim extension As String = Nothing + Dim bytes As Byte() = Nothing + bytes = MR.LocalReport.Render("PDF", Nothing, mimeType, encoding, extension, streamids, warnings) + + Using fs As New FileStream(NombreArchivo, FileMode.Create) + fs.Write(bytes, 0, bytes.Length) + fs.Close() + End Using + End Using + Retorno = True + Else + ModExtensiones.GuardaLog("ERROR: No existe Formato Base") + End If + Catch ex As Exception + ModExtensiones.GuardaLog(String.Format("Ocurrio un Error al generar el reporte RLDC :" & ex.ToString())) + Retorno = False + End Try + Return Retorno + End Function + + + Private Sub CargaPagos(ByVal XMLDoc As XmlDocument, ByRef Fact As Factura) + + Fact.Pagos.Clear() + + Dim nodo = XMLDoc.DocumentElement + + Dim Prefijo As String = If(String.IsNullOrEmpty(XMLDoc.DocumentElement.Prefix), "cfd", XMLDoc.DocumentElement.Prefix) + Dim cfdVer As String = "http://www.sat.gob.mx/cfd/3" + Dim namespaces As New XmlNamespaceManager(XMLDoc.NameTable) + + Dim Version As String = ValorXML(nodo, "version").Replace("..", ".") + Dim PrefijoPagos As String = "" + + If Prefijo.ToLower() <> "cfdi" Then + cfdVer = "http://www.sat.gob.mx/cfd/2" + End If + + If Version = "3.3" Then + PrefijoPagos = "pago10" + namespaces.AddNamespace(PrefijoPagos, "http://www.sat.gob.mx/Pagos") + Prefijo = "cfdi" + cfdVer = "http://www.sat.gob.mx/cfd/3" + namespaces.AddNamespace(Prefijo, cfdVer) + ElseIf Version = "4.0" Then + PrefijoPagos = "pago20" + namespaces.AddNamespace(PrefijoPagos, "http://www.sat.gob.mx/Pagos20") + Prefijo = "cfdi" + cfdVer = "http://www.sat.gob.mx/cfd/4" + namespaces.AddNamespace(Prefijo, cfdVer) + End If + + Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + + If Version = "3.3" OrElse Version = "4.0" Then + If nodeComp IsNot Nothing AndAlso nodeComp.ChildNodes.Count > 0 Then + Dim NodosNodePagos As XmlNodeList = nodeComp.SelectNodes($"//{PrefijoPagos}:Pago", namespaces) + + If NodosNodePagos IsNot Nothing Then + Try + Dim nodePagos As XmlNode = nodeComp.SelectSingleNode($"//{PrefijoPagos}:Pagos", namespaces) + If Version = "3.3" Then + XMLNodosPagos = nodePagos.InnerXml.Replace("pago10:", "").Replace("pagos10:", "").Replace(PrefijoPagos & ":", "") + Else + XMLNodosPagos = nodePagos.InnerXml.Replace("pago20:", "").Replace("pagos20:", "").Replace(PrefijoPagos & ":", "") + End If + Catch ex As Exception + ModExtensiones.GuardaLog(ex.ToString()) + End Try + End If + + Dim Pagos As New List(Of Pago)() + For Each nodePago As XmlNode In NodosNodePagos + Dim FechaPago As DateTime = NowADS() + Try + FechaPago = ValorXML(nodePago, "FechaPago").ToDate() + Catch e As Exception + End Try + + Dim pago As New Pago() + pago.FechaPago = FechaPago + pago.FormaDePagoP = ValorXML(nodePago, "FormaDePagoP").ToString() + pago.MonedaP = ValorXML(nodePago, "MonedaP").ToString() + pago.Monto = ValorXML(nodePago, "Monto").ToString().ToDecimal() + + Dim docs As New List(Of DoctoRelacionado)() + Dim NodosPagosRelacionados As XmlNodeList = nodePago.SelectNodes($"//{PrefijoPagos}:DoctoRelacionado", namespaces) + + For Each docto As XmlNode In NodosPagosRelacionados + Dim idDoc = ValorXML(docto, "idDocumento") + Dim ImportePago = ValorXML(docto, "ImpPagado").ToDecimal() + Dim serie = ValorXML(docto, "Serie") + Dim Folio = ValorXML(docto, "Folio") + Dim MonedaDR = ValorXML(docto, "MonedaDR") + Dim MetodoDePagoDR = ValorXML(docto, "MetodoDePagoDR") + Dim NumParcialidad = ValorXML(docto, "NumParcialidad") + Dim ImpSaldoInsoluto = ValorXML(docto, "ImpSaldoInsoluto").ToDecimal() + Dim ImpSaldoAnt = ValorXML(docto, "ImpSaldoAnt").ToDecimal() + docs.Add(New DoctoRelacionado() With { + .idDocumento = idDoc, + .ImportePago = ImportePago, + .Serie = serie, + .Folio = Folio, + .MonedaDR = MonedaDR, + .MetodoDePagoDR = MetodoDePagoDR, + .NumParcialidad = NumParcialidad, + .ImpSaldoAnt = ImpSaldoAnt, + .ImpSaldoInsoluto = ImpSaldoInsoluto + }) + Next + + pago.Documentos = docs + Pagos.Add(pago) + Next + Fact.Pagos = Pagos + End If + End If + End Sub + + + Private Function GenGoPdf(ByVal XmlRutaArchivo As String, ByVal PDFRutaArchivo As String, DirectorioEmpresa As String) As Boolean + ModExtensiones.GuardaLog(" '--------PDF GenGoPdf Inicia ") + + Dim Respuesta As Boolean = False + Dim RutaRDLC As String = $"{DirectorioEmpresa}\Grales\Formatos\ReciboDePagoGOPDF.rdlc" 'String.Format("{0}{1}", Extensiones.ApplicationParameter.RutaArchivos, "Empresas\Grales\Formatos\ReciboDePagoGOPDF.rdlc") + + Dim Inicio As DateTime = DateTime.Now + Dim goPdf As New GoPdf.GoPdf() + Dim logotipo As Byte() = Nothing 'File.ReadAllBytes(@"C:\inetpub\WWWSIGGit\Empresas\119\Logo.jpg") + + Try + Dim XmlString As String = File.ReadAllText(XmlRutaArchivo) + Dim result As Byte() = goPdf.ExportarPdf(XmlString, logotipo, "", RutaRDLC, New GoPdf.Modelos.DatosAdicionales() With {.DomicilioReceptor = ""}) + + Dim Fin As DateTime = DateTime.Now + If result IsNot Nothing Then + File.WriteAllBytes(PDFRutaArchivo, result) + Respuesta = True + ModExtensiones.GuardaLog($" '--------PDF GenGoPdf Generado") + Else + ModExtensiones.GuardaLog($" '--------PDF GenGoPdf Error se genero nulo \n RDLC: {RutaRDLC} Ruta Xml: {XmlRutaArchivo} Ruta PDF: {PDFRutaArchivo} \n MensajeError: {goPdf.MensajeError} CodigoError :{goPdf.CodigoError}") + End If + Catch ex As Exception + ModExtensiones.GuardaLog($" '--------PDF GenGoPdf Error {ex.Message} -- > {ex.StackTrace} \n RDLC: {RutaRDLC} Ruta Xml: {XmlRutaArchivo} Ruta PDF: {PDFRutaArchivo}") + End Try + + ModExtensiones.GuardaLog(" '--------PDF GenGoPdf Finaliza ") + Return Respuesta + End Function + + End Class + + + + ''' + ''' Clase para contener los valores de un xml CFDI cambio norma + ''' + Public Class XmlSatCFDI + Public Sub New() + comprobante = New CFDIComprobante() + emisor = New CFDIEmisor() + receptor = New CFDIReceptor() + complemento = New CFDIComplemento() + cFDIRelacionados = New List(Of CFDIRelacionado)() + conceptos = New List(Of CFDIConcepto)() + Impuestos = New List(Of CFDIImpuesto)() + End Sub + + Public comprobante As CFDIComprobante + Public emisor As CFDIEmisor + Public receptor As CFDIReceptor + Public complemento As CFDIComplemento + Public cFDIRelacionados As List(Of CFDIRelacionado) + Public conceptos As List(Of CFDIConcepto) + Public Impuestos As List(Of CFDIImpuesto) + + Public Function GetConceptosforpdf() As List(Of CFDIConcepto_I) + Dim lcon As New List(Of CFDIConcepto_I)() + If conceptos IsNot Nothing Then + Dim _orden As Integer = 0 + For Each item As CFDIConcepto In conceptos + _orden += 1 + Dim con As New CFDIConcepto_I With { + .tipo = 1, + .orden = _orden, + .ClaveProdServ = item.ClaveProdServ, + .NoIdentificacion = item.NoIdentificacion, + .Cantidad = item.Cantidad, + .ClaveUnidad = item.ClaveUnidad, + .Unidad = item.Unidad, + .ValorUnitario = item.ValorUnitario, + .Importe = item.Importe, + .Descuento = item.Descuento, + .NumeroPedimento = item.NumeroPedimento, + .CuentaPredial = item.CuentaPredial, + .Descripcion = item.Descripcion + } + Dim index As Integer = 0 + For Each Imp As CFDIConceptoImpuesto In item.Impuestos + index += 1 + If index > 1 Then + lcon.Add(con) + con = New CFDIConcepto_I With { + .tipo = 2, + .orden = _orden + } + End If + + con.Impuesto = Imp.ImpuestoTexto + con.Impuesto_Tipo = Imp.Tipo + con.Impuesto_Base = Imp.Base + con.Impuesto_TipoFactor = Imp.TipoFactor + con.Impuesto_TasaOCuota = Imp.TasaOCuota + con.Impuesto_Importe = Imp.Importe + Next + lcon.Add(con) + Next + End If + + Return lcon + End Function + + Public Shared Function readXML(fileUrl As String) As XmlSatCFDI + Dim xmlCFDI As New XmlSatCFDI() + Dim canread As Boolean = True + ' Keys + Dim keyComprobante As String = "cfdi:Comprobante" + Dim keyCfdiRelacionados As String = "cfdi:CfdiRelacionados" + Dim keyEmisor As String = "cfdi:Emisor" + Dim keyReceptor As String = "cfdi:Receptor" + Dim keyConceptos As String = "cfdi:Conceptos" + Dim keyImpuestos As String = "cfdi:Impuestos" + Dim keyComplemento As String = "cfdi:Complemento" + ' Endkeys + Dim PrimerNivel As String() = {keyCfdiRelacionados, keyEmisor, keyReceptor, keyConceptos, keyImpuestos, keyComplemento} + + ' (canread = xtr.Read()) para evitar ciclos infinitos, todos los .Read() los guardo en la variable Canread y en los while reviso primero esta variable + If File.Exists(fileUrl) Then + Dim settings As New XmlReaderSettings() + settings.ConformanceLevel = ConformanceLevel.Fragment + settings.IgnoreWhitespace = True + settings.IgnoreComments = True + Using xtr As XmlReader = XmlReader.Create(fileUrl, settings) + While (InlineAssignHelper.Assign(canread, xtr.Read())) AndAlso Not (xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyComprobante) + 'if (xtr.NodeType != XmlNodeType.Element) { while (xtr.Read() && xtr.NodeType != XmlNodeType.Element) { } } + End While + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyComprobante Then + Dim Nivel As Integer = xtr.Depth + Dim cont As Boolean = xtr.MoveToFirstAttribute() + While cont + Select Case xtr.Name.ToUpper() + Case "XMLNS:CFDI" + xmlCFDI.comprobante.xmlns_cfdi = xtr.Value + Case "XMLNS:XSI" + xmlCFDI.comprobante.xmlns_xsi = xtr.Value + Case "XSI:SCHEMALOCATION" + xmlCFDI.comprobante.xsi_schemaLocation = xtr.Value + Case "VERSION" + xmlCFDI.comprobante.Version = xtr.Value + Case "SERIE" + xmlCFDI.comprobante.Serie = xtr.Value + Case "FOLIO" + xmlCFDI.comprobante.Folio = xtr.Value + Case "FECHA" + xmlCFDI.comprobante.Fecha = xtr.Value + Case "MONEDA" + xmlCFDI.comprobante.Moneda = xtr.Value + Case "SUBTOTAL" + Dim SubTotal As Decimal = 0 + Decimal.TryParse(xtr.Value, SubTotal) + xmlCFDI.comprobante.SubTotal = SubTotal + Case "TOTAL" + Dim Total As Decimal = 0 + Decimal.TryParse(xtr.Value, Total) + xmlCFDI.comprobante.Total = Total + Case "DESCUENTO" + Dim Descuento As Decimal = 0 + Decimal.TryParse(xtr.Value, Descuento) + xmlCFDI.comprobante.Descuento = Descuento + Case "TIPOCAMBIO" + Dim TipoCambio As Decimal = 0 + Decimal.TryParse(xtr.Value, TipoCambio) + xmlCFDI.comprobante.TipoCambio = TipoCambio + Case "TIPODECOMPROBANTE" + xmlCFDI.comprobante.TipoDeComprobante = xtr.Value + Case "FORMAPAGO", "FORMADEPAGO" + xmlCFDI.comprobante.FormaPago = xtr.Value + Case "METODOPAGO", "METODODEPAGO" + xmlCFDI.comprobante.MetodoPago = xtr.Value + Case "CONDICIONESDEPAGO" + xmlCFDI.comprobante.CondicionesDePago = xtr.Value + Case "LUGAREXPEDICION" + xmlCFDI.comprobante.LugarExpedicion = xtr.Value + Case "CONFIRMACION" + xmlCFDI.comprobante.Confirmacion = xtr.Value + Case "NOCERTIFICADO" + xmlCFDI.comprobante.NoCertificado = xtr.Value + Case "SELLO" + xmlCFDI.comprobante.Sello = xtr.Value + Case "CERTIFICADO" + xmlCFDI.comprobante.Certificado = xtr.Value + End Select + cont = xtr.MoveToNextAttribute() + End While + + cont = xtr.MoveToFirstAttribute() + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > Nivel + If PrimerNivel.Contains(xtr.Name) Then + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyCfdiRelacionados Then + Dim cDepth As Integer = xtr.Depth + + Dim TipoRelacion As String = Nothing + cont = xtr.MoveToFirstAttribute() + While cont + If xtr.Name.ToUpper() = "TIPORELACION" Then + TipoRelacion = xtr.Value + End If + cont = xtr.MoveToNextAttribute() + End While + + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepth + If xtr.Name = "cfdi:CfdiRelacionado" Then + Dim cfdir As New CFDIRelacionado() + cfdir.TipoRelacion = TipoRelacion + cfdir.UUID = xtr.GetAttribute("UUID") + xmlCFDI.cFDIRelacionados.Add(cfdir) + End If + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End While + + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyEmisor Then + Dim curentNivel As Integer = xtr.Depth + cont = xtr.MoveToFirstAttribute() + While cont + Select Case xtr.Name.ToUpper() + Case "REGIMENFISCAL" + xmlCFDI.emisor.RegimenFiscal = xtr.Value + Case "NOMBRE" + xmlCFDI.emisor.Nombre = xtr.Value + Case "RFC" + xmlCFDI.emisor.Rfc = xtr.Value + End Select + cont = xtr.MoveToNextAttribute() + End While + + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso Not (xtr.NodeType = XmlNodeType.Element AndAlso curentNivel >= xtr.Depth) + End While 'continua hasta que no tenga nodos y (el nodo sea tipo elemento y este en el mismo nivel) + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyReceptor Then + Dim curentNivel As Integer = xtr.Depth + cont = xtr.MoveToFirstAttribute() + While cont + Select Case xtr.Name.ToUpper() + Case "RFC" + xmlCFDI.receptor.Rfc = xtr.Value + Case "NOMBRE" + xmlCFDI.receptor.Nombre = xtr.Value + Case "RESIDENCIAFISCAL" + xmlCFDI.receptor.ResidenciaFiscal = xtr.Value + Case "NUMREGIDTRIB" + xmlCFDI.receptor.NumRegIdTrib = xtr.Value + Case "USOCFDI" + xmlCFDI.receptor.UsoCFDI = xtr.Value + End Select + cont = xtr.MoveToNextAttribute() + End While + + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso Not (xtr.NodeType = XmlNodeType.Element AndAlso curentNivel >= xtr.Depth) + End While 'continua hasta que no tenga nodos y (el nodo sea tipo elemento y este en el mismo nivel) + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyConceptos Then + Dim cDepth As Integer = xtr.Depth + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepth + If xtr.Name = "cfdi:Concepto" Then + Dim cDepthb As Integer = xtr.Depth + Dim concepto As New CFDIConcepto() + + cont = xtr.MoveToFirstAttribute() + While cont + Select Case xtr.Name.ToUpper() + Case "CLAVEPRODSERV" + concepto.ClaveProdServ = xtr.Value + Case "NOIDENTIFICACION" + concepto.NoIdentificacion = xtr.Value + Case "CANTIDAD" + concepto.Cantidad = xtr.Value + Case "CLAVEUNIDAD" + concepto.ClaveUnidad = xtr.Value + Case "UNIDAD" + concepto.Unidad = xtr.Value + Case "VALORUNITARIO" + Dim ValorUnitario As Decimal = 0 + Decimal.TryParse(xtr.Value, ValorUnitario) + concepto.ValorUnitario = ValorUnitario + Case "IMPORTE" + Dim Importe As Decimal = 0 + Decimal.TryParse(xtr.Value, Importe) + concepto.Importe = Importe + Case "DESCUENTO" + Dim DDescuento As Decimal = 0 + Decimal.TryParse(xtr.Value, DDescuento) + concepto.Descuento = DDescuento + Case "DESCRIPCION" + concepto.Descripcion = xtr.Value + End Select + cont = xtr.MoveToNextAttribute() + End While + + xtr.MoveToFirstAttribute() + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepthb + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = "cfdi:Impuestos" Then + Dim cDepthc As Integer = xtr.Depth + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepthc + If xtr.Name = "cfdi:Traslado" OrElse xtr.Name = "cfdi:Retencion" Then + Dim impuesto As New CFDIConceptoImpuesto() + impuesto.Impuesto = xtr.GetAttribute("Impuesto") + impuesto.Tipo = xtr.LocalName + Dim Base As Decimal = 0 + Decimal.TryParse(xtr.GetAttribute("Base"), Base) + impuesto.Base = Base + impuesto.TipoFactor = xtr.GetAttribute("TipoFactor") + Dim tasaOCuota As Decimal = 0 + Decimal.TryParse(xtr.GetAttribute("TasaOCuota"), tasaOCuota) + impuesto.TasaOCuota = If(impuesto.TipoFactor = "Tasa", (tasaOCuota * 100).ToString("N4"), xtr.GetAttribute("TasaOCuota")) + Dim ImImporte As Decimal = 0 + Decimal.TryParse(xtr.GetAttribute("Importe"), ImImporte) + impuesto.Importe = ImImporte + + concepto.Impuestos.Add(impuesto) + End If + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End While + Else + Dim rednew As Boolean = True + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = "cfdi:InformacionAduanera" Then + concepto.NumeroPedimento = xtr.GetAttribute("NumeroPedimento") + rednew = False + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End If + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = "cfdi:CuentaPredial" Then + concepto.CuentaPredial = xtr.GetAttribute("CuentaPredial") + rednew = False + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End If + If rednew Then + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End If + End If + End While + + xmlCFDI.conceptos.Add(concepto) + End If + End While + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyImpuestos Then + Dim cDepth As Integer = xtr.Depth + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepth + Dim impuest As New CFDIImpuesto() + If (xtr.Name = "cfdi:Traslado" OrElse xtr.Name = "cfdi:Retencion") AndAlso xmlCFDI.comprobante.Version IsNot Nothing Then + impuest.Tipo = If(xtr.LocalName = "Traslado", "Traslados", If(xtr.LocalName = "Retencion", "Retenciones", "")) + impuest.Impuesto = If(xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "4.0", xtr.GetAttribute("Impuesto"), xtr.GetAttribute("impuesto")) + impuest.TipoFactor = xtr.GetAttribute("TipoFactor") + impuest.TasaOCuota = If(xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "4.0", xtr.GetAttribute("TasaOCuota"), xtr.GetAttribute("tasa")) + Dim ImImporte As Decimal = 0 + Decimal.TryParse(If(xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "4.0", xtr.GetAttribute("Importe"), xtr.GetAttribute("importe")), ImImporte) + impuest.Importe = ImImporte + xmlCFDI.Impuestos.Add(impuest) + End If + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End While + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyComplemento Then + Dim cDepth As Integer = xtr.Depth + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepth + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.LocalName = "TimbreFiscalDigital" AndAlso xmlCFDI.comprobante.Version IsNot Nothing Then + xmlCFDI.complemento.xmlns_tfd = xtr.GetAttribute("xmlns:tfd") + xmlCFDI.complemento.xsi_schemaLocation = xtr.GetAttribute("xsi:schemaLocation") + xmlCFDI.complemento.Version = xtr.GetAttribute("Version") + xmlCFDI.complemento.UUID = xtr.GetAttribute("UUID") + xmlCFDI.complemento.FechaTimbrado = xtr.GetAttribute("FechaTimbrado") + xmlCFDI.complemento.RfcProvCertif = xtr.GetAttribute("RfcProvCertif") + xmlCFDI.complemento.SelloCFD = If(xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "4.0", xtr.GetAttribute("SelloCFD"), xtr.GetAttribute("selloCFD")) + xmlCFDI.complemento.NoCertificadoSAT = If(xmlCFDI.comprobante.Version = "3.3", xtr.GetAttribute("NoCertificadoSAT"), xtr.GetAttribute("noCertificadoSAT")) + xmlCFDI.complemento.SelloSAT = If(xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "4.0", xtr.GetAttribute("SelloSAT"), xtr.GetAttribute("selloSAT")) + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.LocalName = "Pagos" AndAlso xmlCFDI.comprobante.Version IsNot Nothing Then + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + xmlCFDI.complemento.Pagos = New CFDIPago() + Dim depthpagos As Integer = xtr.Depth + Dim conts As Boolean = xtr.MoveToFirstAttribute() + While conts + Dim Base As Decimal = 0 + Select Case xtr.Name.ToUpper() + Case "FECHAPAGO" + xmlCFDI.complemento.Pagos.FechaPago = xtr.Value + Case "FORMADEPAGOP" + xmlCFDI.complemento.Pagos.FormaDePagoP = xtr.Value + Case "FORMADEPAGOPTEXT" + xmlCFDI.complemento.Pagos.FormaDePagoPText = xtr.Value + Case "MONEDAP" + xmlCFDI.complemento.Pagos.MonedaP = xtr.Value + Case "MONTO" + Decimal.TryParse(xtr.Value, Base) + xmlCFDI.complemento.Pagos.Monto = Base + Case "TIPOCAMBIOP" + Decimal.TryParse(xtr.Value, Base) + xmlCFDI.complemento.Pagos.TipoCambioP = Base + Case "NUMOPERACION" + xmlCFDI.complemento.Pagos.NumOperacion = xtr.Value + Case "NOMBANCOORDEXT" + xmlCFDI.complemento.Pagos.NomBancoOrdExt = xtr.Value + Case "RFCEMISORCTAORD" + xmlCFDI.complemento.Pagos.RfcEmisorCtaOrd = xtr.Value + Case "CTAORDENANTE" + xmlCFDI.complemento.Pagos.CtaOrdenante = xtr.Value + Case "RFCEMISORCTABEN" + xmlCFDI.complemento.Pagos.RfcEmisorCtaBen = xtr.Value + Case "CTABENEFICIARIO" + xmlCFDI.complemento.Pagos.CtaBeneficiario = xtr.Value + End Select + conts = xtr.MoveToNextAttribute() + End While + + conts = xtr.MoveToFirstAttribute() + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > depthpagos + Dim objpago As New CFDIPagoDoctoRelacionado() + conts = xtr.MoveToFirstAttribute() + While conts + Dim Basep As Decimal = 0 + Select Case xtr.Name.ToUpper() + Case "IDDOCUMENTO" + objpago.IdDocumento = xtr.Value + Case "SERIE" + objpago.Serie = xtr.Value + Case "FOLIO" + objpago.Folio = xtr.Value + Case "MONEDADR" + objpago.MonedaDR = xtr.Value + Case "METODODEPAGODR" + objpago.MetodoDePagoDR = xtr.Value + Case "NUMPARCIALIDAD" + objpago.NumParcialidad = xtr.Value + Case "IMPSALDOANT" + Decimal.TryParse(xtr.Value, Basep) + objpago.ImpSaldoAnt = Basep + Case "IMPPAGADO" + Decimal.TryParse(xtr.Value, Basep) + objpago.ImpPagado = Basep + Case "IMPSALDOINSOLUTO" + Decimal.TryParse(xtr.Value, Basep) + objpago.ImpSaldoInsoluto = Basep + End Select + conts = xtr.MoveToNextAttribute() + End While + + conts = xtr.MoveToFirstAttribute() + xmlCFDI.complemento.Pagos.doctosRelacionados.Add(objpago) + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End While + Else + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End If + End While + End If + Else + 'si no entro en ninguna de los anteriores no se debe ciclar + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End If + End While + End If + End Using + End If + + If xmlCFDI.comprobante.Version = "4.0" OrElse xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "3.2" Then + Return xmlCFDI + Else + Return Nothing + End If + End Function + + Public Sub ImprimirPDF(NombreArchivo As String, DirectorioEmpresa As String, TipodeComprobante As String) + Dim objxml As XmlSatCFDI = Me + + Dim rutaReporte As String = If(TipodeComprobante = "Pag", $"{DirectorioEmpresa}..\Grales\Formatos\CFDIV3Pago.rdlc", $"{DirectorioEmpresa}..\Grales\Formatos\CFDIV3.rdlc") + + + Dim cQr As Byte() = Nothing + Try + Dim cfdi As New RVCFDI33.GeneraCFDI() + cQr = cfdi.ConvertirQrCode($"?re={objxml.emisor.Rfc}&rr={objxml.receptor.Rfc}&tt={(If(objxml.complemento.Pagos Is Nothing, objxml.comprobante.Total, objxml.complemento.Pagos.Monto))}&id={objxml.complemento.UUID}") + Catch exQR As Exception + ModExtensiones.GuardaLog("Error al generar QR - " & exQR.Message & " - " & exQR.StackTrace.ToString()) + End Try + + Dim parametros As New List(Of ReportParameter)() + ' Comprobante + parametros.Add(New ReportParameter("comprobante_Certificado", objxml.comprobante.Certificado)) + parametros.Add(New ReportParameter("comprobante_CondicionesDePago", objxml.comprobante.CondicionesDePago)) + parametros.Add(New ReportParameter("comprobante_Confirmacion", objxml.comprobante.Confirmacion)) + parametros.Add(New ReportParameter("comprobante_Fecha", objxml.comprobante.Fecha)) + parametros.Add(New ReportParameter("comprobante_Serie", objxml.comprobante.Serie)) + parametros.Add(New ReportParameter("comprobante_Folio", objxml.comprobante.Folio)) + parametros.Add(New ReportParameter("comprobante_Descuento", objxml.comprobante.Descuento.ToString("N2"))) + parametros.Add(New ReportParameter("comprobante_SubTotal", objxml.comprobante.SubTotal.ToString("N2"))) + parametros.Add(New ReportParameter("comprobante_Total", objxml.comprobante.Total.ToString("N2"))) + parametros.Add(New ReportParameter("comprobante_Version", objxml.comprobante.Version)) + parametros.Add(New ReportParameter("comprobante_TipoDeComprobante", objxml.comprobante.TipoDeComprobanteTexto)) + parametros.Add(New ReportParameter("comprobante_FormaPago", objxml.comprobante.FormaPagoTexto)) + parametros.Add(New ReportParameter("comprobante_LugarExpedicion", objxml.comprobante.LugarExpedicion)) + parametros.Add(New ReportParameter("comprobante_NoCertificado", objxml.comprobante.NoCertificado)) + parametros.Add(New ReportParameter("comprobante_Sello", objxml.comprobante.Sello)) + parametros.Add(New ReportParameter("comprobante_Moneda", objxml.comprobante.Moneda)) + parametros.Add(New ReportParameter("comprobante_TipoCambio", objxml.comprobante.TipoCambio.ToString("N2"))) + parametros.Add(New ReportParameter("comprobante_MetodoPago", objxml.comprobante.MetodoPagoTexto)) + ' Emisor + parametros.Add(New ReportParameter("emisor_Rfc", objxml.emisor.Rfc)) + parametros.Add(New ReportParameter("emisor_Nombre", objxml.emisor.Nombre)) + parametros.Add(New ReportParameter("emisor_RegimenFiscal", objxml.emisor.RegimenFiscalTexto)) + ' Receptor + parametros.Add(New ReportParameter("receptor_Rfc", objxml.receptor.Rfc)) + parametros.Add(New ReportParameter("receptor_Nombre", objxml.receptor.Nombre)) + parametros.Add(New ReportParameter("receptor_NumRegIdTrib", objxml.receptor.NumRegIdTrib)) + parametros.Add(New ReportParameter("receptor_ResidenciaFiscal", objxml.receptor.ResidenciaFiscal)) + parametros.Add(New ReportParameter("receptor_UsoCFDI", objxml.receptor.UsoCFDITexto)) + ' Complemento + parametros.Add(New ReportParameter("complemento_FechaTimbrado", objxml.complemento.FechaTimbrado)) + parametros.Add(New ReportParameter("complemento_NoCertificadoSAT", objxml.complemento.NoCertificadoSAT)) + parametros.Add(New ReportParameter("complemento_RfcProvCertif", objxml.complemento.RfcProvCertif)) + parametros.Add(New ReportParameter("complemento_SelloCFD", objxml.complemento.SelloCFD)) + parametros.Add(New ReportParameter("complemento_SelloSAT", objxml.complemento.SelloSAT)) + parametros.Add(New ReportParameter("complemento_UUID", objxml.complemento.UUID)) + parametros.Add(New ReportParameter("complemento_CadenaOriginal", objxml.complemento.CadenaOriginal)) + ' Pagos + If objxml.complemento.Pagos IsNot Nothing Then + parametros.Add(New ReportParameter("CPFechaPago", objxml.complemento.Pagos.FechaPago)) + parametros.Add(New ReportParameter("CPFormaDePagoP", objxml.complemento.Pagos.FormaDePagoP)) + parametros.Add(New ReportParameter("CPFormaDePagoPText", objxml.complemento.Pagos.FormaDePagoPText)) + parametros.Add(New ReportParameter("CPMonedaP", objxml.complemento.Pagos.MonedaP)) + parametros.Add(New ReportParameter("CPMonto", objxml.complemento.Pagos.Monto.ToString())) + parametros.Add(New ReportParameter("CPTipoCambioP", objxml.complemento.Pagos.TipoCambioP.ToString())) + parametros.Add(New ReportParameter("CPNumOperacion", objxml.complemento.Pagos.NumOperacion)) + parametros.Add(New ReportParameter("CPNomBancoOrdExt", objxml.complemento.Pagos.NomBancoOrdExt)) + parametros.Add(New ReportParameter("CPRfcEmisorCtaOrd", objxml.complemento.Pagos.RfcEmisorCtaOrd)) + parametros.Add(New ReportParameter("CPCtaOrdenante", objxml.complemento.Pagos.CtaOrdenante)) + parametros.Add(New ReportParameter("CPRfcEmisorCtaBen", objxml.complemento.Pagos.RfcEmisorCtaBen)) + parametros.Add(New ReportParameter("CPCtaBeneficiario", objxml.complemento.Pagos.CtaBeneficiario)) + End If + + Using MR As New ReportViewer() + Dim rdsTotales As New ReportDataSource() + Dim ltotales As New List(Of utilValores)() + ltotales.Add(New utilValores("Subtotal", objxml.comprobante.SubTotal.ToString("N2"))) + If objxml.comprobante.Descuento > 0 Then + ltotales.Add(New utilValores("Descuento", objxml.comprobante.Descuento.ToString("N2"))) + End If + + For Each item As CFDIImpuesto In objxml.Impuestos + If item.Importe > 0 Then + Dim TasaOCuota As Decimal = 0 + Decimal.TryParse(item.TasaOCuota, TasaOCuota) + ltotales.Add(New utilValores($"Impuestos {item.Tipo} {item.ImpuestoTexto} {(If(item.TipoFactor = "Tasa", (TasaOCuota * 100).ToString("N4"), item.TasaOCuota))} {(If(item.TipoFactor = "Tasa", "%", ""))}", item.Importe.ToString("N2"))) + End If + Next + + ltotales.Add(New utilValores("Total", objxml.comprobante.Total.ToString("N2"))) + rdsTotales.Name = "dsTotales" + rdsTotales.Value = ltotales + MR.LocalReport.DataSources.Add(rdsTotales) + + Dim rds2 As New ReportDataSource() + Dim limagenes As New List(Of utilImage)() + limagenes.Add(New utilImage(cQr)) + rds2.Name = "dsImagenes" + rds2.Value = limagenes + MR.LocalReport.DataSources.Add(rds2) + + Dim rdsrelacionados As New ReportDataSource() + rdsrelacionados.Name = "dsRelacionados" + rdsrelacionados.Value = objxml.cFDIRelacionados + MR.LocalReport.DataSources.Add(rdsrelacionados) + + Dim rds1 As New ReportDataSource() + rds1.Name = "dsConceptos" + rds1.Value = objxml.GetConceptosforpdf() + MR.LocalReport.DataSources.Add(rds1) + + If objxml.complemento.Pagos IsNot Nothing Then + Dim rdsp As New ReportDataSource() + rdsp.Name = "dsPagos" + rdsp.Value = objxml.complemento.Pagos.doctosRelacionados + MR.LocalReport.DataSources.Add(rdsp) + End If + + MR.LocalReport.ReportPath = rutaReporte + MR.ProcessingMode = ProcessingMode.Local + MR.LocalReport.EnableExternalImages = True + MR.LocalReport.SetParameters(parametros) + MR.LocalReport.Refresh() + + Dim warnings As Warning() = Nothing + Dim streamids As String() = Nothing + Dim mimeType As String = Nothing + Dim encoding As String = Nothing + Dim extension As String = Nothing + Dim bytes As Byte() = Nothing + bytes = MR.LocalReport.Render("PDF", Nothing, mimeType, encoding, extension, streamids, warnings) + + Using fs As New FileStream(NombreArchivo, FileMode.Create) + fs.Write(bytes, 0, bytes.Length) + fs.Close() + End Using + End Using + End Sub + + Public Class utilValores + Public Sub New(nombre As String, valor As String) + Me.Nombre = nombre + Me.Valor = valor + End Sub + Public Property Nombre As String + Public Property Valor As String + End Class + + Public Class utilImage + Public Sub New(imagenByte As Byte()) + Me.ImagenByte = imagenByte + End Sub + Public Property ImagenByte As Byte() + End Class + End Class + + Public Module InlineAssignHelper + Public Function Assign(Of T)(ByRef target As T, value As T) As T + target = value + Return value + End Function + End Module + +#Region "impresion nd" + Public Class CFDIComprobante + Public Property xmlns_cfdi As String + Public Property xmlns_xsi As String + Public Property xsi_schemaLocation As String + Public Property Version As String + Public Property Serie As String + Public Property Folio As String + Public Property Fecha As String + Public Property Moneda As String + Public Property SubTotal As Decimal + Public Property Total As Decimal + Public Property Descuento As Decimal + Public Property TipoCambio As Decimal + Public Property TipoDeComprobante As String + Public ReadOnly Property TipoDeComprobanteTexto As String + Get + Dim retorno As String = "" + If Version = "3.3" OrElse Version = "4.0" Then + Select Case TipoDeComprobante + Case "I" + retorno = "Ingreso" + Case "E" + retorno = "Egreso" + Case "P" + retorno = "Pago" + Case "T" + retorno = "Traslado" + Case "N" + retorno = "Nómina" + Case Else + retorno = TipoDeComprobante + End Select + End If + If Version = "3.2" Then + Select Case TipoDeComprobante + Case "ingreso" + retorno = "Ing" + Case "egreso" + retorno = "Egs" + Case "P" + retorno = "PA" + Case Else + retorno = TipoDeComprobante + End Select + Else + retorno = TipoDeComprobante + End If + Return retorno + End Get + End Property + Public ReadOnly Property TipoDeComprobanteSIG As String + Get + Dim retorno As String = "" + If Version = "3.3" OrElse Version = "4.0" Then + Select Case TipoDeComprobante + Case "I" + retorno = "Ing" + Case "E" + retorno = "Egs" + Case "P" + retorno = "PA" + Case Else + retorno = TipoDeComprobante + End Select + End If + If Version = "3.2" Then + Select Case TipoDeComprobante + Case "ingreso" + retorno = "Ing" + Case "egreso" + retorno = "Egs" + Case "P" + retorno = "PA" + Case Else + retorno = TipoDeComprobante + End Select + Else + retorno = TipoDeComprobante + End If + Return retorno + End Get + End Property + Public Property FormaPago As String + Public ReadOnly Property FormaPagoTexto As String + Get + Dim retorno As String = "" + Select Case FormaPago + Case "01" + retorno = "Efectivo" + Case "02" + retorno = "Cheque nominativo" + Case "03" + retorno = "Transferencia electrónica de fondos" + Case "04" + retorno = "Tarjeta de crédito" + Case "05" + retorno = "Monedero electrónico" + Case "06" + retorno = "Dinero electrónico" + Case "08" + retorno = "Vales de despensa" + Case "12" + retorno = "Dación en pago" + Case "13" + retorno = "Pago por subrogación" + Case "14" + retorno = "Pago por consignación" + Case "15" + retorno = "Condonación" + Case "17" + retorno = "Compensación" + Case "23" + retorno = "Novación" + Case "24" + retorno = "Confusión" + Case "25" + retorno = "Remisión de deuda" + Case "26" + retorno = "Prescripción o caducidad" + Case "27" + retorno = "A satisfacción del acreedor" + Case "28" + retorno = "Tarjeta de débito" + Case "29" + retorno = "Tarjeta de servicios" + Case "30" + retorno = "Aplicación de anticipos" + Case "31" + retorno = "Intermediario pagos" + Case "99" + retorno = "Por definir" + Case Else + retorno = FormaPago + End Select + Return retorno + End Get + End Property + Public Property MetodoPago As String + Public ReadOnly Property MetodoPagoTexto As String + Get + Dim retorno As String = "" + Select Case MetodoPago + Case "PUE" + retorno = "Pago en una sola exhibición" + Case "PPD" + retorno = "Pago en parcialidades o diferido" + Case Else + retorno = MetodoPago + End Select + Return retorno + End Get + End Property + Public Property CondicionesDePago As String + Public Property LugarExpedicion As String + Public Property Confirmacion As String + Public Property NoCertificado As String + Public Property Sello As String + Public Property Certificado As String + End Class + + Public Class CFDIEmisor + Public Property RegimenFiscal As String + Public ReadOnly Property RegimenFiscalTexto As String + Get + Dim retorno As String = "" + Select Case RegimenFiscal + Case "601" + retorno = "General de Ley Personas Morales" + Case "603" + retorno = "Personas Morales con Fines no Lucrativos" + Case "605" + retorno = "Sueldos y Salarios e Ingresos Asimilados a Salarios" + Case "606" + retorno = "Arrendamiento" + Case "608" + retorno = "Demás ingresos" + Case "609" + retorno = "Consolidación" + Case "610" + retorno = "Residentes en el Extranjero sin Establecimiento Permanente en México" + Case "611" + retorno = "Ingresos por Dividendos (socios y accionistas)" + Case "612" + retorno = "Personas Físicas con Actividades Empresariales y Profesionales" + Case "614" + retorno = "Ingresos por intereses" + Case "616" + retorno = "Sin obligaciones fiscales" + Case "620" + retorno = "Sociedades Cooperativas de Producción que optan por diferir sus ingresos" + Case "621" + retorno = "Incorporación Fiscal" + Case "622" + retorno = "Actividades Agrícolas, Ganaderas, Silvícolas y Pesqueras" + Case "623" + retorno = "Opcional para Grupos de Sociedades" + Case "624" + retorno = "Coordinados" + Case "628" + retorno = "Hidrocarburos" + Case "607" + retorno = "Régimen de Enajenación o Adquisición de Bienes" + Case "629" + retorno = "De los Regímenes Fiscales Preferentes y de las Empresas Multinacionales" + Case "630" + retorno = "Enajenación de acciones en bolsa de valores" + Case "615" + retorno = "Régimen de los ingresos por obtención de premios" + End Select + Return retorno + End Get + End Property + Public Property Nombre As String + Public Property Rfc As String + End Class + + Public Class CFDIReceptor + Public Property Rfc As String + Public Property Nombre As String + Public Property ResidenciaFiscal As String + Public Property NumRegIdTrib As String + Public Property UsoCFDI As String + Public ReadOnly Property UsoCFDITexto As String + Get + Dim retorno As String = "N/A" + Select Case UsoCFDI + Case "G01" + retorno = "Adquisición de mercancías" + Case "G02" + retorno = "Devoluciones, descuentos o bonificaciones" + Case "G03" + retorno = "Gastos en general" + Case "I01" + retorno = "Construcciones" + Case "I02" + retorno = "Mobiliario y equipo de oficina por inversiones" + Case "I03" + retorno = "Equipo de transporte" + Case "I04" + retorno = "Equipo de cómputo y accesorios" + Case "I05" + retorno = "Dados, troqueles, moldes, matrices y herramental" + Case "I06" + retorno = "Comunicaciones telefónicas" + Case "I07" + retorno = "Comunicaciones satelitales" + Case "I08" + retorno = "Otra maquinaria y equipo" + Case "D01" + retorno = "Honorarios médicos, dentales y gastos hospitalarios." + Case "D02" + retorno = "Gastos médicos por incapacidad o discapacidad" + Case "D03" + retorno = "Gastos funerales." + Case "D04" + retorno = "Donativos." + Case "D05" + retorno = "Intereses reales efectivamente pagados por créditos hipotecarios (casa habitación)." + Case "D06" + retorno = "Aportaciones voluntarias al SAR." + Case "D07" + retorno = "Primas por seguros de gastos médicos." + Case "D08" + retorno = "Gastos de transportación escolar obligatoria." + Case "D09" + retorno = "Depósitos en cuentas para el ahorro, primas que tengan como base planes de pensiones." + Case "D10" + retorno = "Pagos por servicios educativos (colegiaturas)" + Case "P01" + retorno = "Por definir" + Case Else + retorno = UsoCFDI + End Select + Return retorno + End Get + End Property + End Class + + Public Class CFDIComplemento + Public Property xmlns_tfd As String + Public Property xsi_schemaLocation As String + Public Property Version As String + Public Property UUID As String + Public Property FechaTimbrado As String + Public Property RfcProvCertif As String + Public Property SelloCFD As String + Public Property NoCertificadoSAT As String + Public Property SelloSAT As String + Public Property Pagos As CFDIPago + + Public ReadOnly Property CadenaOriginal As String + Get + Return $"||{Version}|{UUID}|{FechaTimbrado}|{RfcProvCertif}|{SelloCFD}|{NoCertificadoSAT}||" + End Get + End Property + End Class + + Public Class CFDIPago + Public Sub New() + doctosRelacionados = New List(Of CFDIPagoDoctoRelacionado)() + End Sub + + Public Property FechaPago As String + Public Property FormaDePagoP As String + Public Property FormaDePagoPText As String + Public Property MonedaP As String + Public Property Monto As Decimal + Public Property TipoCambioP As Decimal + Public Property NumOperacion As String + Public Property NomBancoOrdExt As String + Public Property RfcEmisorCtaOrd As String + Public Property CtaOrdenante As String + Public Property RfcEmisorCtaBen As String + Public Property CtaBeneficiario As String + Public Property doctosRelacionados As List(Of CFDIPagoDoctoRelacionado) + End Class + + Public Class CFDIPagoDoctoRelacionado + Public Property IdDocumento As String + Public Property Serie As String + Public Property Folio As String + Public Property MonedaDR As String + Public Property MetodoDePagoDR As String + Public Property NumParcialidad As String + Public Property ImpSaldoAnt As Decimal + Public Property ImpPagado As Decimal + Public Property ImpSaldoInsoluto As Decimal + End Class + + Public Class CFDIRelacionado + Public Property TipoRelacion As String + Public ReadOnly Property TipoRelacionTexto As String + Get + Dim retorno As String = "" + Select Case TipoRelacion + Case "01" + retorno = "Nota de crédito de los documentos relacionados" + Case "02" + retorno = "Nota de débito de los documentos relacionados" + Case "03" + retorno = "Devolución de mercancía sobre facturas o traslados previos" + Case "04" + retorno = "Sustitución de los CFDI previos" + Case "05" + retorno = "Traslados de mercancías facturados previamente" + Case "06" + retorno = "Factura generada por los traslados previos" + Case "07" + retorno = "CFDI por aplicación de anticipo" + Case Else + retorno = "Por definir" + End Select + Return retorno + End Get + End Property + Public Property UUID As String + End Class + + Public Class CFDIConcepto + Public Sub New() + Impuestos = New List(Of CFDIConceptoImpuesto)() + End Sub + + Public Property ClaveProdServ As String + Public Property NoIdentificacion As String + Public Property Cantidad As String + Public Property ClaveUnidad As String + Public Property Unidad As String + Public Property ValorUnitario As Decimal + Public Property Importe As Decimal + Public Property Descuento As Decimal + Public Property NumeroPedimento As String + Public Property CuentaPredial As String + Public Property Descripcion As String + Public Property Impuestos As List(Of CFDIConceptoImpuesto) + End Class + + Public Class CFDIConceptoImpuesto + Public Property Impuesto As String + Public ReadOnly Property ImpuestoTexto As String + Get + Dim retorno As String = "" + Select Case Impuesto + Case "001" + retorno = "ISR" + Case "002" + retorno = "IVA" + Case "003" + retorno = "IEPS" + End Select + Return retorno + End Get + End Property + Public Property Tipo As String + Public Property Base As Decimal + Public Property TipoFactor As String + Public Property TasaOCuota As String + Public Property Importe As Decimal + End Class + + Public Class CFDIImpuesto + Public Property Tipo As String + Public Property Impuesto As String + Public ReadOnly Property ImpuestoTexto As String + Get + Dim retorno As String = "" + Select Case Impuesto + Case "001" + retorno = "ISR" + Case "002" + retorno = "IVA" + Case "003" + retorno = "IEPS" + End Select + Return retorno + End Get + End Property + Public Property TipoFactor As String + Public Property TasaOCuota As String + Public Property Importe As Decimal + End Class + + Public Class CFDIConcepto_I + Public Property tipo As Integer + Public Property orden As Integer + Public Property ClaveProdServ As String + Public Property NoIdentificacion As String + Public Property Cantidad As String + Public Property ClaveUnidad As String + Public Property Unidad As String + Public Property ValorUnitario As Decimal + Public Property Importe As Decimal + Public Property Descuento As Decimal + Public Property NumeroPedimento As String + Public Property CuentaPredial As String + Public Property Descripcion As String + Public Property Impuesto As String + Public Property Impuesto_Tipo As String + Public Property Impuesto_Base As Decimal + Public Property Impuesto_TipoFactor As String + Public Property Impuesto_TasaOCuota As String + Public Property Impuesto_Importe As Decimal + End Class + +#End Region + End Namespace Public Class GeneralesAPIeFacturas diff --git a/Ventas/Ventas.aspx.vb b/Ventas/Ventas.aspx.vb index 4ab55aa65..779f48636 100644 --- a/Ventas/Ventas.aspx.vb +++ b/Ventas/Ventas.aspx.vb @@ -12239,7 +12239,7 @@ Partial Class Ventas ObjFactura.Det_OrdenCompra = TxtDet_OrdenCompra.Text.Trim ObjFactura.Det_FechaOrdenCompra = TxtDet_FechaOrdenCompra.Text.Trim ObjFactura.Det_ContraRecibo = TxtDet_ContraRecibo.Text.Trim - ObjFactura.MonedaAbreviatura = "" + ObjFactura.MonedaAbreviatura = DdlMoneda.SelectedItem.Text If UsuarioActual.Empresa.Funcionalidad(578) = "1" AndAlso DvModalRequiereOSFecha.Visible Then ObjFactura.FechaEjecucion = TxtFechaOS.Text.Trim.ToDateTime
SerieFolioFechaProveedorImporteMotivo
{0}{0}{0}{0}{0}{0}