From 6a820197348d05c11e7da9c18c2263a35b42e024 Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 30 Oct 2025 10:33:27 -0600 Subject: [PATCH] Initial commit - clean repository excluding bin/Debug and bin/Release --- .gitignore | 260 + CFDI.sln | 25 + CFDI/CFDI.Designer.cs | 1594 ++ CFDI/CFDI.cs | 20964 ++++++++++++++++ CFDI/CFDI.csproj | 171 + CFDI/CFDI.resx | 1799 ++ CFDI/FodyWeavers.xml | 4 + CFDI/Program.cs | 21 + CFDI/Properties/AssemblyInfo.cs | 36 + CFDI/Properties/Resources.Designer.cs | 163 + CFDI/Properties/Resources.resx | 148 + CFDI/Properties/Settings.Designer.cs | 61 + CFDI/Properties/Settings.settings | 15 + CFDI/Resources/SAT-logo.png | Bin 0 -> 9795 bytes CFDI/Resources/_background 1427x739px.jpg | Bin 0 -> 91087 bytes .../_fondo transparente 871x655px.png | Bin 0 -> 3351 bytes CFDI/Resources/_icono error 140x140px.png | Bin 0 -> 7626 bytes CFDI/Resources/_icono timbrado 140x140px.png | Bin 0 -> 5553 bytes CFDI/Resources/_logo 491x408px.png | Bin 0 -> 55828 bytes .../_recuadro notificaciones 491x319px.png | Bin 0 -> 5698 bytes CFDI/Resources/save.png | Bin 0 -> 7076 bytes CFDI/Resources/spinner.gif | Bin 0 -> 174084 bytes CFDI/app.config | 21 + CFDI/ico.ico | Bin 0 -> 99678 bytes CFDI/opensslkey.cs | 516 + CFDI/packages.config | 8 + 26 files changed, 25806 insertions(+) create mode 100644 .gitignore create mode 100644 CFDI.sln create mode 100644 CFDI/CFDI.Designer.cs create mode 100644 CFDI/CFDI.cs create mode 100644 CFDI/CFDI.csproj create mode 100644 CFDI/CFDI.resx create mode 100644 CFDI/FodyWeavers.xml create mode 100644 CFDI/Program.cs create mode 100644 CFDI/Properties/AssemblyInfo.cs create mode 100644 CFDI/Properties/Resources.Designer.cs create mode 100644 CFDI/Properties/Resources.resx create mode 100644 CFDI/Properties/Settings.Designer.cs create mode 100644 CFDI/Properties/Settings.settings create mode 100644 CFDI/Resources/SAT-logo.png create mode 100644 CFDI/Resources/_background 1427x739px.jpg create mode 100644 CFDI/Resources/_fondo transparente 871x655px.png create mode 100644 CFDI/Resources/_icono error 140x140px.png create mode 100644 CFDI/Resources/_icono timbrado 140x140px.png create mode 100644 CFDI/Resources/_logo 491x408px.png create mode 100644 CFDI/Resources/_recuadro notificaciones 491x319px.png create mode 100644 CFDI/Resources/save.png create mode 100644 CFDI/Resources/spinner.gif create mode 100644 CFDI/app.config create mode 100644 CFDI/ico.ico create mode 100644 CFDI/opensslkey.cs create mode 100644 CFDI/packages.config diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6e2110d --- /dev/null +++ b/.gitignore @@ -0,0 +1,260 @@ +# Archivos específicos de CFDI que NO quieres en el repo +CFDI/bin/ +CFDI/obj/ +CFDI/.vs/ + +# Archivos de datos y binarios +*.xls +*.xlsx +*.zip +*.rar +*.exe +*.dll +*.a +*.sql +*.TPS + +# Configuración local +Configuracion.ini +*.user +*.suo + +CFDI/bin/Debug/Configuracion.ini +*.TPS +*.xls +*.sql +.vs/ + +# Created by http://www.gitignore.io + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ +bin/ + +# Roslyn cache directories +*.ide/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +#NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding addin-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# If using the old MSBuild-Integrated Package Restore, uncomment this: +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + + +### Windows ### +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Carpetas binarias de Visual Studio +[Bb]in/ +[Oo]bj/ + +# Específicamente las carpetas problemáticas +CFDI/bin/Debug/ +CFDI/bin/Release/ + +# Archivos de Visual Studio +.vs/ +*.user +*.suo +*.sln.docstates + +# Archivos de datos grandes +*.xls +*.xlsx +*.zip +*.rar +*.exe +*.dll +*.a +*.sql +*.TPS + +# Configuración local +Configuracion.ini diff --git a/CFDI.sln b/CFDI.sln new file mode 100644 index 0000000..d0b20b3 --- /dev/null +++ b/CFDI.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2036 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CFDI", "CFDI\CFDI.csproj", "{0ACB8D28-684B-4043-9756-FDBD2E4B6FEB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0ACB8D28-684B-4043-9756-FDBD2E4B6FEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0ACB8D28-684B-4043-9756-FDBD2E4B6FEB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0ACB8D28-684B-4043-9756-FDBD2E4B6FEB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0ACB8D28-684B-4043-9756-FDBD2E4B6FEB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {32B2C895-B946-46E9-899D-99DE021BCAE9} + EndGlobalSection +EndGlobal diff --git a/CFDI/CFDI.Designer.cs b/CFDI/CFDI.Designer.cs new file mode 100644 index 0000000..22e7287 --- /dev/null +++ b/CFDI/CFDI.Designer.cs @@ -0,0 +1,1594 @@ +namespace CFDI +{ + partial class frmCFDI + { + /// + /// Variable del diseñador necesaria. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Limpiar los recursos que se estén usando. + /// + /// true si los recursos administrados se deben desechar; false en caso contrario. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Código generado por el Diseñador de Windows Forms + + /// + /// Método necesario para admitir el Diseñador. No se puede modificar + /// el contenido de este método con el editor de código. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmCFDI)); + this.labPro = new System.Windows.Forms.Label(); + this.btnPubBet = new System.Windows.Forms.Button(); + this.btnLisBet = new System.Windows.Forms.Button(); + this.btnPubRel = new System.Windows.Forms.Button(); + this.lbReportes = new System.Windows.Forms.Label(); + this.btnSMFacESQL = new System.Windows.Forms.Button(); + this.btnCGFacESQL = new System.Windows.Forms.Button(); + this.btnSMTrasSQL = new System.Windows.Forms.Button(); + this.btnSMCEP = new System.Windows.Forms.Button(); + this.btnCGPagoSQL = new System.Windows.Forms.Button(); + this.btnSMReteSQL = new System.Windows.Forms.Button(); + this.btnCGAntESqlCFDI = new System.Windows.Forms.Button(); + this.txbSysID = new System.Windows.Forms.TextBox(); + this.btnTimbres = new System.Windows.Forms.Button(); + this.chCTUid = new System.Windows.Forms.CheckBox(); + this.cmCTYear = new System.Windows.Forms.ComboBox(); + this.lbRepTimAño = new System.Windows.Forms.Label(); + this.lbRepTimMes = new System.Windows.Forms.Label(); + this.cmCTMes = new System.Windows.Forms.ComboBox(); + this.btnLisRel = new System.Windows.Forms.Button(); + this.btnCGCEP = new System.Windows.Forms.Button(); + this.panel5 = new System.Windows.Forms.Panel(); + this.rbCancelar = new System.Windows.Forms.RadioButton(); + this.rbRecuperar = new System.Windows.Forms.RadioButton(); + this.rbTimbrar = new System.Windows.Forms.RadioButton(); + this.lbBMS = new System.Windows.Forms.Label(); + this.btnSMFactSQL = new System.Windows.Forms.Button(); + this.btnSMNotCSQL = new System.Windows.Forms.Button(); + this.btnSMPagPSQL = new System.Windows.Forms.Button(); + this.lblCG2 = new System.Windows.Forms.Label(); + this.btnCGAntSqlCFDI = new System.Windows.Forms.Button(); + this.btnCGNotCSQL = new System.Windows.Forms.Button(); + this.lbSysID = new System.Windows.Forms.Label(); + this.btnCGFactSQL = new System.Windows.Forms.Button(); + this.pnPAC = new System.Windows.Forms.Panel(); + this.rbPACCD = new System.Windows.Forms.RadioButton(); + this.rbPACED = new System.Windows.Forms.RadioButton(); + this.lbMod = new System.Windows.Forms.Label(); + this.pnMod = new System.Windows.Forms.Panel(); + this.rbModoP = new System.Windows.Forms.RadioButton(); + this.rbModoN = new System.Windows.Forms.RadioButton(); + this.lbPAC = new System.Windows.Forms.Label(); + this.txtSQLSrv = new System.Windows.Forms.TextBox(); + this.btnSQLTst = new System.Windows.Forms.Button(); + this.lbServidor = new System.Windows.Forms.Label(); + this.lbPuerto = new System.Windows.Forms.Label(); + this.lbBaseDatos = new System.Windows.Forms.Label(); + this.txtSQLPor = new System.Windows.Forms.TextBox(); + this.lbUsuario = new System.Windows.Forms.Label(); + this.txtSQLPwd = new System.Windows.Forms.TextBox(); + this.lbContraseña = new System.Windows.Forms.Label(); + this.txtSQLUsr = new System.Windows.Forms.TextBox(); + this.txtSQLDB = new System.Windows.Forms.TextBox(); + this.rtbResultados = new System.Windows.Forms.RichTextBox(); + this.lblPie = new System.Windows.Forms.Label(); + this.openFileDialogCEP = new System.Windows.Forms.OpenFileDialog(); + this.picLoad = new System.Windows.Forms.PictureBox(); + this.picLog = new System.Windows.Forms.PictureBox(); + this.pbNot = new System.Windows.Forms.PictureBox(); + this.pnFondo = new System.Windows.Forms.Panel(); + this.pnPruebas = new System.Windows.Forms.Panel(); + this.CB_Status = new System.Windows.Forms.CheckBox(); + this.RBCancela = new System.Windows.Forms.CheckBox(); + this.button1 = new System.Windows.Forms.Button(); + this.btnxml = new System.Windows.Forms.Button(); + this.btnBMSAntSqlCFDI = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.CbActualizarSistema = new System.Windows.Forms.ComboBox(); + this.pnActualizacion = new System.Windows.Forms.Panel(); + this.rbPubAct = new System.Windows.Forms.RadioButton(); + this.rbPubCFDI = new System.Windows.Forms.RadioButton(); + this.lbPublicarOpcion = new System.Windows.Forms.Label(); + this.tbActualizarRuta = new System.Windows.Forms.TextBox(); + this.lbRuta = new System.Windows.Forms.Label(); + this.btnActualizar = new System.Windows.Forms.Button(); + this.lbActualizar = new System.Windows.Forms.Label(); + this.btnActCFDI = new System.Windows.Forms.Button(); + this.lbPublicar = new System.Windows.Forms.Label(); + this.lbListaClientes = new System.Windows.Forms.Label(); + this.lbListaOpcion = new System.Windows.Forms.Label(); + this.chCTFol = new System.Windows.Forms.CheckBox(); + this.pnLista = new System.Windows.Forms.Panel(); + this.rbListaEnviar = new System.Windows.Forms.RadioButton(); + this.rbListaVer = new System.Windows.Forms.RadioButton(); + this.cbCTCliente = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.lbOpe = new System.Windows.Forms.Label(); + this.lblConfiguracion = new System.Windows.Forms.Label(); + this.txtResult = new System.Windows.Forms.TextBox(); + this.pnConfiguracion = new System.Windows.Forms.Panel(); + this.label5 = new System.Windows.Forms.Label(); + this.Count_TrasladosP = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.Count_TrasladosDR = new System.Windows.Forms.NumericUpDown(); + this.cbLogSQL = new System.Windows.Forms.CheckBox(); + this.label3 = new System.Windows.Forms.Label(); + this.btnPFX = new System.Windows.Forms.Button(); + this.pnVer = new System.Windows.Forms.Panel(); + this.rbVerDeb = new System.Windows.Forms.RadioButton(); + this.rbVerRel = new System.Windows.Forms.RadioButton(); + this.lbVersion = new System.Windows.Forms.Label(); + this.lbSQLSRV = new System.Windows.Forms.Label(); + this.btResultados = new System.Windows.Forms.Button(); + this.btConfiguracion = new System.Windows.Forms.Button(); + this.tbPruebas = new System.Windows.Forms.Button(); + this.fdAplicacion = new System.Windows.Forms.OpenFileDialog(); + this.imglisAvance = new System.Windows.Forms.ImageList(this.components); + this.panel5.SuspendLayout(); + this.pnPAC.SuspendLayout(); + this.pnMod.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picLoad)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.picLog)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pbNot)).BeginInit(); + this.pnFondo.SuspendLayout(); + this.pnPruebas.SuspendLayout(); + this.pnActualizacion.SuspendLayout(); + this.pnLista.SuspendLayout(); + this.pnConfiguracion.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.Count_TrasladosP)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.Count_TrasladosDR)).BeginInit(); + this.pnVer.SuspendLayout(); + this.SuspendLayout(); + // + // labPro + // + this.labPro.AutoSize = true; + this.labPro.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labPro.Location = new System.Drawing.Point(35, 479); + this.labPro.MaximumSize = new System.Drawing.Size(320, 0); + this.labPro.MinimumSize = new System.Drawing.Size(320, 0); + this.labPro.Name = "labPro"; + this.labPro.Size = new System.Drawing.Size(320, 24); + this.labPro.TabIndex = 8; + this.labPro.Text = "Comprobantes Fiscales CFDI 4.0"; + this.labPro.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // btnPubBet + // + this.btnPubBet.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnPubBet.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnPubBet.Location = new System.Drawing.Point(440, 302); + this.btnPubBet.Name = "btnPubBet"; + this.btnPubBet.Size = new System.Drawing.Size(80, 25); + this.btnPubBet.TabIndex = 40; + this.btnPubBet.Text = "Beta"; + this.btnPubBet.UseVisualStyleBackColor = true; + this.btnPubBet.Click += new System.EventHandler(this.btnPubBet_Click); + // + // btnLisBet + // + this.btnLisBet.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnLisBet.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnLisBet.Location = new System.Drawing.Point(270, 272); + this.btnLisBet.Name = "btnLisBet"; + this.btnLisBet.Size = new System.Drawing.Size(80, 25); + this.btnLisBet.TabIndex = 39; + this.btnLisBet.Text = "Beta"; + this.btnLisBet.UseVisualStyleBackColor = true; + this.btnLisBet.Click += new System.EventHandler(this.btnLisBet_Click); + // + // btnPubRel + // + this.btnPubRel.BackColor = System.Drawing.Color.PaleGreen; + this.btnPubRel.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnPubRel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnPubRel.Location = new System.Drawing.Point(355, 302); + this.btnPubRel.Name = "btnPubRel"; + this.btnPubRel.Size = new System.Drawing.Size(80, 25); + this.btnPubRel.TabIndex = 38; + this.btnPubRel.Text = "Release"; + this.btnPubRel.UseVisualStyleBackColor = false; + this.btnPubRel.Click += new System.EventHandler(this.btnPubRel_Click); + // + // lbReportes + // + this.lbReportes.AutoSize = true; + this.lbReportes.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbReportes.Location = new System.Drawing.Point(190, 205); + this.lbReportes.Name = "lbReportes"; + this.lbReportes.Size = new System.Drawing.Size(152, 17); + this.lbReportes.TabIndex = 37; + this.lbReportes.Text = "Reporte de Timbres"; + // + // btnSMFacESQL + // + this.btnSMFacESQL.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnSMFacESQL.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSMFacESQL.Location = new System.Drawing.Point(185, 145); + this.btnSMFacESQL.Name = "btnSMFacESQL"; + this.btnSMFacESQL.Size = new System.Drawing.Size(80, 25); + this.btnSMFacESQL.TabIndex = 36; + this.btnSMFacESQL.Text = "Factura E"; + this.btnSMFacESQL.UseVisualStyleBackColor = true; + this.btnSMFacESQL.Click += new System.EventHandler(this.btnSMFacESQL_Click); + // + // btnCGFacESQL + // + this.btnCGFacESQL.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnCGFacESQL.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnCGFacESQL.Location = new System.Drawing.Point(185, 65); + this.btnCGFacESQL.Name = "btnCGFacESQL"; + this.btnCGFacESQL.Size = new System.Drawing.Size(80, 25); + this.btnCGFacESQL.TabIndex = 35; + this.btnCGFacESQL.Text = "Factura E"; + this.btnCGFacESQL.UseVisualStyleBackColor = true; + this.btnCGFacESQL.Click += new System.EventHandler(this.btnCGFacESQL_Click); + // + // btnSMTrasSQL + // + this.btnSMTrasSQL.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnSMTrasSQL.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSMTrasSQL.Location = new System.Drawing.Point(270, 115); + this.btnSMTrasSQL.Name = "btnSMTrasSQL"; + this.btnSMTrasSQL.Size = new System.Drawing.Size(80, 25); + this.btnSMTrasSQL.TabIndex = 34; + this.btnSMTrasSQL.Text = "Traslado"; + this.btnSMTrasSQL.UseVisualStyleBackColor = true; + this.btnSMTrasSQL.Click += new System.EventHandler(this.btnSMTrasSQL_Click); + // + // btnSMCEP + // + this.btnSMCEP.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnSMCEP.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSMCEP.Location = new System.Drawing.Point(355, 115); + this.btnSMCEP.Name = "btnSMCEP"; + this.btnSMCEP.Size = new System.Drawing.Size(80, 25); + this.btnSMCEP.TabIndex = 33; + this.btnSMCEP.Text = "Leer CEP"; + this.btnSMCEP.UseVisualStyleBackColor = true; + this.btnSMCEP.Click += new System.EventHandler(this.btnSMCEP_Click); + // + // btnCGPagoSQL + // + this.btnCGPagoSQL.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnCGPagoSQL.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnCGPagoSQL.Location = new System.Drawing.Point(100, 35); + this.btnCGPagoSQL.Name = "btnCGPagoSQL"; + this.btnCGPagoSQL.Size = new System.Drawing.Size(80, 25); + this.btnCGPagoSQL.TabIndex = 32; + this.btnCGPagoSQL.Text = "Pago"; + this.btnCGPagoSQL.UseVisualStyleBackColor = true; + this.btnCGPagoSQL.Click += new System.EventHandler(this.btnCGPagoSQL_Click); + // + // btnSMReteSQL + // + this.btnSMReteSQL.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnSMReteSQL.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSMReteSQL.Location = new System.Drawing.Point(440, 115); + this.btnSMReteSQL.Name = "btnSMReteSQL"; + this.btnSMReteSQL.Size = new System.Drawing.Size(80, 25); + this.btnSMReteSQL.TabIndex = 31; + this.btnSMReteSQL.Text = "Retención"; + this.btnSMReteSQL.UseVisualStyleBackColor = true; + this.btnSMReteSQL.Click += new System.EventHandler(this.btnSMReteSQL_Click); + // + // btnCGAntESqlCFDI + // + this.btnCGAntESqlCFDI.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnCGAntESqlCFDI.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnCGAntESqlCFDI.Location = new System.Drawing.Point(270, 65); + this.btnCGAntESqlCFDI.Name = "btnCGAntESqlCFDI"; + this.btnCGAntESqlCFDI.Size = new System.Drawing.Size(80, 25); + this.btnCGAntESqlCFDI.TabIndex = 30; + this.btnCGAntESqlCFDI.Text = "Anticipo E"; + this.btnCGAntESqlCFDI.UseVisualStyleBackColor = true; + this.btnCGAntESqlCFDI.Click += new System.EventHandler(this.btnCGAntESqlCFDI_Click); + // + // txbSysID + // + this.txbSysID.Location = new System.Drawing.Point(130, 175); + this.txbSysID.Name = "txbSysID"; + this.txbSysID.Size = new System.Drawing.Size(70, 20); + this.txbSysID.TabIndex = 1; + // + // btnTimbres + // + this.btnTimbres.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btnTimbres.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnTimbres.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnTimbres.Location = new System.Drawing.Point(440, 225); + this.btnTimbres.Name = "btnTimbres"; + this.btnTimbres.Size = new System.Drawing.Size(80, 25); + this.btnTimbres.TabIndex = 24; + this.btnTimbres.Text = "Reporte"; + this.btnTimbres.UseVisualStyleBackColor = true; + this.btnTimbres.Click += new System.EventHandler(this.btnTimbres_Click); + // + // chCTUid + // + this.chCTUid.AutoSize = true; + this.chCTUid.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chCTUid.Location = new System.Drawing.Point(353, 204); + this.chCTUid.Name = "chCTUid"; + this.chCTUid.Size = new System.Drawing.Size(87, 20); + this.chCTUid.TabIndex = 29; + this.chCTUid.Text = "Con UUID"; + this.chCTUid.UseVisualStyleBackColor = true; + // + // cmCTYear + // + this.cmCTYear.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmCTYear.FormattingEnabled = true; + this.cmCTYear.Location = new System.Drawing.Point(198, 225); + this.cmCTYear.Name = "cmCTYear"; + this.cmCTYear.Size = new System.Drawing.Size(50, 21); + this.cmCTYear.TabIndex = 28; + // + // lbRepTimAño + // + this.lbRepTimAño.AutoSize = true; + this.lbRepTimAño.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbRepTimAño.Location = new System.Drawing.Point(169, 228); + this.lbRepTimAño.Name = "lbRepTimAño"; + this.lbRepTimAño.Size = new System.Drawing.Size(32, 16); + this.lbRepTimAño.TabIndex = 27; + this.lbRepTimAño.Text = "Año"; + // + // lbRepTimMes + // + this.lbRepTimMes.AutoSize = true; + this.lbRepTimMes.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbRepTimMes.Location = new System.Drawing.Point(249, 228); + this.lbRepTimMes.Name = "lbRepTimMes"; + this.lbRepTimMes.Size = new System.Drawing.Size(34, 16); + this.lbRepTimMes.TabIndex = 26; + this.lbRepTimMes.Text = "Mes"; + // + // cmCTMes + // + this.cmCTMes.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmCTMes.FormattingEnabled = true; + this.cmCTMes.Items.AddRange(new object[] { + "Enero", + "Febrero", + "Marzo", + "Abril", + "Mayo", + "Junio", + "Julio", + "Agosto", + "Septiembre", + "Octubre", + "Noviembre", + "Diciembre"}); + this.cmCTMes.Location = new System.Drawing.Point(282, 225); + this.cmCTMes.Name = "cmCTMes"; + this.cmCTMes.Size = new System.Drawing.Size(70, 21); + this.cmCTMes.TabIndex = 25; + // + // btnLisRel + // + this.btnLisRel.BackColor = System.Drawing.Color.PaleGreen; + this.btnLisRel.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnLisRel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnLisRel.Location = new System.Drawing.Point(185, 272); + this.btnLisRel.Name = "btnLisRel"; + this.btnLisRel.Size = new System.Drawing.Size(80, 25); + this.btnLisRel.TabIndex = 23; + this.btnLisRel.Text = "Release"; + this.btnLisRel.UseVisualStyleBackColor = false; + this.btnLisRel.Click += new System.EventHandler(this.btnLis_Click); + // + // btnCGCEP + // + this.btnCGCEP.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnCGCEP.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnCGCEP.Location = new System.Drawing.Point(355, 35); + this.btnCGCEP.Name = "btnCGCEP"; + this.btnCGCEP.Size = new System.Drawing.Size(80, 25); + this.btnCGCEP.TabIndex = 22; + this.btnCGCEP.Text = "Leer CEP"; + this.btnCGCEP.UseVisualStyleBackColor = true; + this.btnCGCEP.Click += new System.EventHandler(this.btnCGCEP_Click); + // + // panel5 + // + this.panel5.Controls.Add(this.rbCancelar); + this.panel5.Controls.Add(this.rbRecuperar); + this.panel5.Controls.Add(this.rbTimbrar); + this.panel5.Location = new System.Drawing.Point(250, 175); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(270, 24); + this.panel5.TabIndex = 21; + // + // rbCancelar + // + this.rbCancelar.AutoSize = true; + this.rbCancelar.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbCancelar.Location = new System.Drawing.Point(185, 2); + this.rbCancelar.Name = "rbCancelar"; + this.rbCancelar.Size = new System.Drawing.Size(80, 20); + this.rbCancelar.TabIndex = 2; + this.rbCancelar.Text = "Cancelar"; + this.rbCancelar.UseVisualStyleBackColor = true; + // + // rbRecuperar + // + this.rbRecuperar.AutoSize = true; + this.rbRecuperar.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbRecuperar.Location = new System.Drawing.Point(85, 2); + this.rbRecuperar.Name = "rbRecuperar"; + this.rbRecuperar.Size = new System.Drawing.Size(90, 20); + this.rbRecuperar.TabIndex = 1; + this.rbRecuperar.Text = "Recuperar"; + this.rbRecuperar.UseVisualStyleBackColor = true; + // + // rbTimbrar + // + this.rbTimbrar.AutoSize = true; + this.rbTimbrar.Checked = true; + this.rbTimbrar.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbTimbrar.Location = new System.Drawing.Point(4, 2); + this.rbTimbrar.Name = "rbTimbrar"; + this.rbTimbrar.Size = new System.Drawing.Size(73, 20); + this.rbTimbrar.TabIndex = 0; + this.rbTimbrar.TabStop = true; + this.rbTimbrar.Text = "Timbrar"; + this.rbTimbrar.UseVisualStyleBackColor = true; + // + // lbBMS + // + this.lbBMS.AutoSize = true; + this.lbBMS.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbBMS.Location = new System.Drawing.Point(201, 95); + this.lbBMS.Name = "lbBMS"; + this.lbBMS.Size = new System.Drawing.Size(130, 17); + this.lbBMS.TabIndex = 16; + this.lbBMS.Text = "Service Manager"; + // + // btnSMFactSQL + // + this.btnSMFactSQL.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnSMFactSQL.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSMFactSQL.Location = new System.Drawing.Point(185, 115); + this.btnSMFactSQL.Name = "btnSMFactSQL"; + this.btnSMFactSQL.Size = new System.Drawing.Size(80, 25); + this.btnSMFactSQL.TabIndex = 6; + this.btnSMFactSQL.Text = "Factura I"; + this.btnSMFactSQL.UseVisualStyleBackColor = true; + this.btnSMFactSQL.Click += new System.EventHandler(this.btnSMFactSQL_Click); + // + // btnSMNotCSQL + // + this.btnSMNotCSQL.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnSMNotCSQL.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSMNotCSQL.Location = new System.Drawing.Point(15, 115); + this.btnSMNotCSQL.Name = "btnSMNotCSQL"; + this.btnSMNotCSQL.Size = new System.Drawing.Size(80, 25); + this.btnSMNotCSQL.TabIndex = 7; + this.btnSMNotCSQL.Text = "NtaCredito"; + this.btnSMNotCSQL.UseVisualStyleBackColor = true; + this.btnSMNotCSQL.Click += new System.EventHandler(this.btnSMNotCSQL_Click); + // + // btnSMPagPSQL + // + this.btnSMPagPSQL.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnSMPagPSQL.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSMPagPSQL.Location = new System.Drawing.Point(100, 115); + this.btnSMPagPSQL.Name = "btnSMPagPSQL"; + this.btnSMPagPSQL.Size = new System.Drawing.Size(80, 25); + this.btnSMPagPSQL.TabIndex = 5; + this.btnSMPagPSQL.Text = "Pago"; + this.btnSMPagPSQL.UseVisualStyleBackColor = true; + this.btnSMPagPSQL.Click += new System.EventHandler(this.btnSMCarPSQL_Click); + // + // lblCG2 + // + this.lblCG2.AutoSize = true; + this.lblCG2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblCG2.Location = new System.Drawing.Point(197, 15); + this.lblCG2.Name = "lblCG2"; + this.lblCG2.Size = new System.Drawing.Size(138, 17); + this.lblCG2.TabIndex = 12; + this.lblCG2.Text = "Cuenta de Gastos"; + // + // btnCGAntSqlCFDI + // + this.btnCGAntSqlCFDI.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnCGAntSqlCFDI.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnCGAntSqlCFDI.Location = new System.Drawing.Point(270, 35); + this.btnCGAntSqlCFDI.Name = "btnCGAntSqlCFDI"; + this.btnCGAntSqlCFDI.Size = new System.Drawing.Size(80, 25); + this.btnCGAntSqlCFDI.TabIndex = 3; + this.btnCGAntSqlCFDI.Text = "Anticipo I"; + this.btnCGAntSqlCFDI.UseVisualStyleBackColor = true; + this.btnCGAntSqlCFDI.Click += new System.EventHandler(this.btnCGAntSqlCFDI_Click); + // + // btnCGNotCSQL + // + this.btnCGNotCSQL.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnCGNotCSQL.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnCGNotCSQL.Location = new System.Drawing.Point(15, 35); + this.btnCGNotCSQL.Name = "btnCGNotCSQL"; + this.btnCGNotCSQL.Size = new System.Drawing.Size(80, 25); + this.btnCGNotCSQL.TabIndex = 4; + this.btnCGNotCSQL.Text = "NtaCredito"; + this.btnCGNotCSQL.UseVisualStyleBackColor = true; + this.btnCGNotCSQL.Click += new System.EventHandler(this.btnCGNotCSQL_Click); + // + // lbSysID + // + this.lbSysID.AutoSize = true; + this.lbSysID.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbSysID.Location = new System.Drawing.Point(86, 177); + this.lbSysID.Name = "lbSysID"; + this.lbSysID.Size = new System.Drawing.Size(47, 16); + this.lbSysID.TabIndex = 9; + this.lbSysID.Text = "SysID:"; + // + // btnCGFactSQL + // + this.btnCGFactSQL.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnCGFactSQL.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnCGFactSQL.Location = new System.Drawing.Point(185, 35); + this.btnCGFactSQL.Name = "btnCGFactSQL"; + this.btnCGFactSQL.Size = new System.Drawing.Size(80, 25); + this.btnCGFactSQL.TabIndex = 2; + this.btnCGFactSQL.Text = "Factura I"; + this.btnCGFactSQL.UseVisualStyleBackColor = true; + this.btnCGFactSQL.Click += new System.EventHandler(this.btnCGFactSQL_Click); + // + // pnPAC + // + this.pnPAC.Controls.Add(this.rbPACCD); + this.pnPAC.Controls.Add(this.rbPACED); + this.pnPAC.Location = new System.Drawing.Point(30, 80); + this.pnPAC.Name = "pnPAC"; + this.pnPAC.Size = new System.Drawing.Size(174, 22); + this.pnPAC.TabIndex = 2; + // + // rbPACCD + // + this.rbPACCD.AutoSize = true; + this.rbPACCD.BackColor = System.Drawing.Color.Transparent; + this.rbPACCD.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbPACCD.Location = new System.Drawing.Point(3, 1); + this.rbPACCD.Name = "rbPACCD"; + this.rbPACCD.Size = new System.Drawing.Size(81, 20); + this.rbPACCD.TabIndex = 24; + this.rbPACCD.Text = "Com Dig "; + this.rbPACCD.UseVisualStyleBackColor = false; + // + // rbPACED + // + this.rbPACED.AutoSize = true; + this.rbPACED.BackColor = System.Drawing.Color.Transparent; + this.rbPACED.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbPACED.Location = new System.Drawing.Point(90, 1); + this.rbPACED.Name = "rbPACED"; + this.rbPACED.Size = new System.Drawing.Size(72, 20); + this.rbPACED.TabIndex = 25; + this.rbPACED.Text = "Edicom"; + this.rbPACED.UseVisualStyleBackColor = false; + // + // lbMod + // + this.lbMod.AutoSize = true; + this.lbMod.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbMod.Location = new System.Drawing.Point(30, 15); + this.lbMod.Name = "lbMod"; + this.lbMod.Size = new System.Drawing.Size(144, 16); + this.lbMod.TabIndex = 0; + this.lbMod.Text = "Modo de Timbrado:"; + // + // pnMod + // + this.pnMod.Controls.Add(this.rbModoP); + this.pnMod.Controls.Add(this.rbModoN); + this.pnMod.Location = new System.Drawing.Point(30, 35); + this.pnMod.Name = "pnMod"; + this.pnMod.Size = new System.Drawing.Size(150, 22); + this.pnMod.TabIndex = 1; + // + // rbModoP + // + this.rbModoP.AutoSize = true; + this.rbModoP.BackColor = System.Drawing.Color.Transparent; + this.rbModoP.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbModoP.Location = new System.Drawing.Point(3, 1); + this.rbModoP.Name = "rbModoP"; + this.rbModoP.Size = new System.Drawing.Size(70, 20); + this.rbModoP.TabIndex = 20; + this.rbModoP.TabStop = true; + this.rbModoP.Text = "Prueba"; + this.rbModoP.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.rbModoP.UseVisualStyleBackColor = false; + // + // rbModoN + // + this.rbModoN.AutoSize = true; + this.rbModoN.BackColor = System.Drawing.Color.Transparent; + this.rbModoN.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbModoN.Location = new System.Drawing.Point(90, 1); + this.rbModoN.Name = "rbModoN"; + this.rbModoN.Size = new System.Drawing.Size(55, 20); + this.rbModoN.TabIndex = 22; + this.rbModoN.TabStop = true; + this.rbModoN.Text = "Real"; + this.rbModoN.UseVisualStyleBackColor = false; + // + // lbPAC + // + this.lbPAC.AutoSize = true; + this.lbPAC.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)), true); + this.lbPAC.Location = new System.Drawing.Point(30, 60); + this.lbPAC.Name = "lbPAC"; + this.lbPAC.Size = new System.Drawing.Size(271, 16); + this.lbPAC.TabIndex = 0; + this.lbPAC.Text = "Proveedor Autorizado de Certificación"; + // + // txtSQLSrv + // + this.txtSQLSrv.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtSQLSrv.Location = new System.Drawing.Point(140, 222); + this.txtSQLSrv.Name = "txtSQLSrv"; + this.txtSQLSrv.Size = new System.Drawing.Size(200, 22); + this.txtSQLSrv.TabIndex = 4; + // + // btnSQLTst + // + this.btnSQLTst.BackgroundImage = global::CFDI.Properties.Resources.save; + this.btnSQLTst.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btnSQLTst.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnSQLTst.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSQLTst.Location = new System.Drawing.Point(315, 332); + this.btnSQLTst.Name = "btnSQLTst"; + this.btnSQLTst.Size = new System.Drawing.Size(24, 24); + this.btnSQLTst.TabIndex = 9; + this.btnSQLTst.UseVisualStyleBackColor = true; + this.btnSQLTst.Click += new System.EventHandler(this.btnSQLTst_Click); + // + // lbServidor + // + this.lbServidor.AutoSize = true; + this.lbServidor.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbServidor.Location = new System.Drawing.Point(30, 224); + this.lbServidor.Name = "lbServidor"; + this.lbServidor.Size = new System.Drawing.Size(62, 16); + this.lbServidor.TabIndex = 0; + this.lbServidor.Text = "Servidor:"; + // + // lbPuerto + // + this.lbPuerto.AutoSize = true; + this.lbPuerto.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbPuerto.Location = new System.Drawing.Point(30, 337); + this.lbPuerto.Name = "lbPuerto"; + this.lbPuerto.Size = new System.Drawing.Size(50, 16); + this.lbPuerto.TabIndex = 0; + this.lbPuerto.Text = "Puerto:"; + // + // lbBaseDatos + // + this.lbBaseDatos.AutoSize = true; + this.lbBaseDatos.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbBaseDatos.Location = new System.Drawing.Point(30, 252); + this.lbBaseDatos.Name = "lbBaseDatos"; + this.lbBaseDatos.Size = new System.Drawing.Size(101, 16); + this.lbBaseDatos.TabIndex = 0; + this.lbBaseDatos.Text = "Base de Datos:"; + // + // txtSQLPor + // + this.txtSQLPor.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtSQLPor.Location = new System.Drawing.Point(140, 332); + this.txtSQLPor.Name = "txtSQLPor"; + this.txtSQLPor.Size = new System.Drawing.Size(168, 22); + this.txtSQLPor.TabIndex = 8; + // + // lbUsuario + // + this.lbUsuario.AutoSize = true; + this.lbUsuario.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbUsuario.Location = new System.Drawing.Point(30, 282); + this.lbUsuario.Name = "lbUsuario"; + this.lbUsuario.Size = new System.Drawing.Size(58, 16); + this.lbUsuario.TabIndex = 0; + this.lbUsuario.Text = "Usuario:"; + // + // txtSQLPwd + // + this.txtSQLPwd.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtSQLPwd.Location = new System.Drawing.Point(140, 306); + this.txtSQLPwd.Multiline = true; + this.txtSQLPwd.Name = "txtSQLPwd"; + this.txtSQLPwd.PasswordChar = '•'; + this.txtSQLPwd.Size = new System.Drawing.Size(200, 20); + this.txtSQLPwd.TabIndex = 7; + // + // lbContraseña + // + this.lbContraseña.AutoSize = true; + this.lbContraseña.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbContraseña.Location = new System.Drawing.Point(30, 310); + this.lbContraseña.Name = "lbContraseña"; + this.lbContraseña.Size = new System.Drawing.Size(80, 16); + this.lbContraseña.TabIndex = 0; + this.lbContraseña.Text = "Contraseña:"; + // + // txtSQLUsr + // + this.txtSQLUsr.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtSQLUsr.Location = new System.Drawing.Point(140, 278); + this.txtSQLUsr.Name = "txtSQLUsr"; + this.txtSQLUsr.Size = new System.Drawing.Size(200, 22); + this.txtSQLUsr.TabIndex = 6; + // + // txtSQLDB + // + this.txtSQLDB.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtSQLDB.Location = new System.Drawing.Point(140, 250); + this.txtSQLDB.Name = "txtSQLDB"; + this.txtSQLDB.Size = new System.Drawing.Size(200, 22); + this.txtSQLDB.TabIndex = 5; + // + // rtbResultados + // + this.rtbResultados.BackColor = System.Drawing.Color.White; + this.rtbResultados.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rtbResultados.Location = new System.Drawing.Point(19, 14); + this.rtbResultados.Name = "rtbResultados"; + this.rtbResultados.ReadOnly = true; + this.rtbResultados.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.rtbResultados.Size = new System.Drawing.Size(529, 366); + this.rtbResultados.TabIndex = 10; + this.rtbResultados.Text = ""; + this.rtbResultados.KeyDown += new System.Windows.Forms.KeyEventHandler(this.rtbResultados_KeyDown); + // + // lblPie + // + this.lblPie.AutoSize = true; + this.lblPie.BackColor = System.Drawing.Color.Transparent; + this.lblPie.Font = new System.Drawing.Font("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblPie.ForeColor = System.Drawing.Color.Black; + this.lblPie.Location = new System.Drawing.Point(437, 501); + this.lblPie.Name = "lblPie"; + this.lblPie.Size = new System.Drawing.Size(445, 16); + this.lblPie.TabIndex = 9; + this.lblPie.Text = "© 2018 Aduanasoft, S.A. de C.V. • Derechos Reservados MMXVIII • Versión"; + // + // openFileDialogCEP + // + this.openFileDialogCEP.FileName = "openFileDialogCEP"; + // + // picLoad + // + this.picLoad.AccessibleRole = System.Windows.Forms.AccessibleRole.None; + this.picLoad.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.picLoad.Image = global::CFDI.Properties.Resources.SAT_logo; + this.picLoad.Location = new System.Drawing.Point(146, 349); + this.picLoad.Name = "picLoad"; + this.picLoad.Size = new System.Drawing.Size(100, 100); + this.picLoad.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.picLoad.TabIndex = 7; + this.picLoad.TabStop = false; + // + // picLog + // + this.picLog.BackColor = System.Drawing.Color.Transparent; + this.picLog.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.picLog.Image = global::CFDI.Properties.Resources._logo_491x408px; + this.picLog.Location = new System.Drawing.Point(20, 0); + this.picLog.Name = "picLog"; + this.picLog.Size = new System.Drawing.Size(352, 292); + this.picLog.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.picLog.TabIndex = 6; + this.picLog.TabStop = false; + // + // pbNot + // + this.pbNot.BackColor = System.Drawing.Color.Transparent; + this.pbNot.BackgroundImage = global::CFDI.Properties.Resources._recuadro_notificaciones_491x319px; + this.pbNot.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.pbNot.Location = new System.Drawing.Point(20, 299); + this.pbNot.Name = "pbNot"; + this.pbNot.Size = new System.Drawing.Size(352, 229); + this.pbNot.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pbNot.TabIndex = 10; + this.pbNot.TabStop = false; + // + // pnFondo + // + this.pnFondo.BackColor = System.Drawing.Color.Transparent; + this.pnFondo.BackgroundImage = global::CFDI.Properties.Resources._fondo_transparente_871x655px; + this.pnFondo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.pnFondo.Controls.Add(this.pnPruebas); + this.pnFondo.Controls.Add(this.lblConfiguracion); + this.pnFondo.Controls.Add(this.txtResult); + this.pnFondo.Controls.Add(this.pnConfiguracion); + this.pnFondo.Controls.Add(this.rtbResultados); + this.pnFondo.Location = new System.Drawing.Point(392, 78); + this.pnFondo.Name = "pnFondo"; + this.pnFondo.Size = new System.Drawing.Size(683, 425); + this.pnFondo.TabIndex = 14; + // + // pnPruebas + // + this.pnPruebas.BackColor = System.Drawing.Color.White; + this.pnPruebas.Controls.Add(this.CB_Status); + this.pnPruebas.Controls.Add(this.RBCancela); + this.pnPruebas.Controls.Add(this.button1); + this.pnPruebas.Controls.Add(this.btnxml); + this.pnPruebas.Controls.Add(this.btnBMSAntSqlCFDI); + this.pnPruebas.Controls.Add(this.label2); + this.pnPruebas.Controls.Add(this.CbActualizarSistema); + this.pnPruebas.Controls.Add(this.txbSysID); + this.pnPruebas.Controls.Add(this.pnActualizacion); + this.pnPruebas.Controls.Add(this.lbPublicarOpcion); + this.pnPruebas.Controls.Add(this.tbActualizarRuta); + this.pnPruebas.Controls.Add(this.panel5); + this.pnPruebas.Controls.Add(this.lbRuta); + this.pnPruebas.Controls.Add(this.btnActualizar); + this.pnPruebas.Controls.Add(this.lbActualizar); + this.pnPruebas.Controls.Add(this.btnActCFDI); + this.pnPruebas.Controls.Add(this.lbPublicar); + this.pnPruebas.Controls.Add(this.lbListaClientes); + this.pnPruebas.Controls.Add(this.lbListaOpcion); + this.pnPruebas.Controls.Add(this.chCTFol); + this.pnPruebas.Controls.Add(this.pnLista); + this.pnPruebas.Controls.Add(this.cbCTCliente); + this.pnPruebas.Controls.Add(this.label1); + this.pnPruebas.Controls.Add(this.btnPubBet); + this.pnPruebas.Controls.Add(this.lbOpe); + this.pnPruebas.Controls.Add(this.btnLisBet); + this.pnPruebas.Controls.Add(this.btnCGPagoSQL); + this.pnPruebas.Controls.Add(this.btnPubRel); + this.pnPruebas.Controls.Add(this.btnCGFactSQL); + this.pnPruebas.Controls.Add(this.btnLisRel); + this.pnPruebas.Controls.Add(this.btnCGNotCSQL); + this.pnPruebas.Controls.Add(this.lbReportes); + this.pnPruebas.Controls.Add(this.btnTimbres); + this.pnPruebas.Controls.Add(this.btnCGAntSqlCFDI); + this.pnPruebas.Controls.Add(this.chCTUid); + this.pnPruebas.Controls.Add(this.cmCTYear); + this.pnPruebas.Controls.Add(this.btnSMFacESQL); + this.pnPruebas.Controls.Add(this.lbRepTimAño); + this.pnPruebas.Controls.Add(this.lblCG2); + this.pnPruebas.Controls.Add(this.lbRepTimMes); + this.pnPruebas.Controls.Add(this.btnSMTrasSQL); + this.pnPruebas.Controls.Add(this.cmCTMes); + this.pnPruebas.Controls.Add(this.btnCGFacESQL); + this.pnPruebas.Controls.Add(this.btnSMCEP); + this.pnPruebas.Controls.Add(this.btnCGCEP); + this.pnPruebas.Controls.Add(this.btnSMReteSQL); + this.pnPruebas.Controls.Add(this.btnCGAntESqlCFDI); + this.pnPruebas.Controls.Add(this.lbSysID); + this.pnPruebas.Controls.Add(this.lbBMS); + this.pnPruebas.Controls.Add(this.btnSMFactSQL); + this.pnPruebas.Controls.Add(this.btnSMPagPSQL); + this.pnPruebas.Controls.Add(this.btnSMNotCSQL); + this.pnPruebas.Location = new System.Drawing.Point(23, 13); + this.pnPruebas.Name = "pnPruebas"; + this.pnPruebas.Size = new System.Drawing.Size(532, 366); + this.pnPruebas.TabIndex = 36; + // + // CB_Status + // + this.CB_Status.AutoSize = true; + this.CB_Status.Location = new System.Drawing.Point(439, 27); + this.CB_Status.Name = "CB_Status"; + this.CB_Status.Size = new System.Drawing.Size(56, 17); + this.CB_Status.TabIndex = 57; + this.CB_Status.Text = "Status"; + this.CB_Status.UseVisualStyleBackColor = true; + // + // RBCancela + // + this.RBCancela.AutoSize = true; + this.RBCancela.Location = new System.Drawing.Point(435, 3); + this.RBCancela.Name = "RBCancela"; + this.RBCancela.Size = new System.Drawing.Size(97, 17); + this.RBCancela.TabIndex = 56; + this.RBCancela.Text = "CancelaNuevo"; + this.RBCancela.UseVisualStyleBackColor = true; + this.RBCancela.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); + // + // button1 + // + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.button1.Location = new System.Drawing.Point(355, 145); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(80, 25); + this.button1.TabIndex = 55; + this.button1.Text = "Anticipo E"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // btnxml + // + this.btnxml.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnxml.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnxml.Location = new System.Drawing.Point(23, 200); + this.btnxml.Name = "btnxml"; + this.btnxml.Size = new System.Drawing.Size(80, 25); + this.btnxml.TabIndex = 54; + this.btnxml.Text = "xml"; + this.btnxml.UseVisualStyleBackColor = true; + this.btnxml.Click += new System.EventHandler(this.btnxml_Click); + // + // btnBMSAntSqlCFDI + // + this.btnBMSAntSqlCFDI.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnBMSAntSqlCFDI.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnBMSAntSqlCFDI.Location = new System.Drawing.Point(270, 145); + this.btnBMSAntSqlCFDI.Name = "btnBMSAntSqlCFDI"; + this.btnBMSAntSqlCFDI.Size = new System.Drawing.Size(80, 25); + this.btnBMSAntSqlCFDI.TabIndex = 53; + this.btnBMSAntSqlCFDI.Text = "Anticipo I"; + this.btnBMSAntSqlCFDI.UseVisualStyleBackColor = true; + this.btnBMSAntSqlCFDI.Click += new System.EventHandler(this.btnBMSAntSqlCFDI_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.Location = new System.Drawing.Point(100, 305); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(191, 17); + this.label2.TabIndex = 52; + this.label2.Text = "Actualizador de Sistemas"; + // + // CbActualizarSistema + // + this.CbActualizarSistema.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.CbActualizarSistema.FormattingEnabled = true; + this.CbActualizarSistema.Items.AddRange(new object[] { + "BMS_Cli", + "BMS_AS"}); + this.CbActualizarSistema.Location = new System.Drawing.Point(73, 332); + this.CbActualizarSistema.Name = "CbActualizarSistema"; + this.CbActualizarSistema.Size = new System.Drawing.Size(70, 21); + this.CbActualizarSistema.TabIndex = 48; + this.CbActualizarSistema.SelectedIndexChanged += new System.EventHandler(this.CbActualizarSistema_SelectedIndexChanged); + // + // pnActualizacion + // + this.pnActualizacion.Controls.Add(this.rbPubAct); + this.pnActualizacion.Controls.Add(this.rbPubCFDI); + this.pnActualizacion.Location = new System.Drawing.Point(405, 274); + this.pnActualizacion.Name = "pnActualizacion"; + this.pnActualizacion.Size = new System.Drawing.Size(112, 24); + this.pnActualizacion.TabIndex = 41; + // + // rbPubAct + // + this.rbPubAct.AutoSize = true; + this.rbPubAct.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbPubAct.Location = new System.Drawing.Point(58, 2); + this.rbPubAct.Name = "rbPubAct"; + this.rbPubAct.Size = new System.Drawing.Size(48, 20); + this.rbPubAct.TabIndex = 1; + this.rbPubAct.Text = "Act."; + this.rbPubAct.UseVisualStyleBackColor = true; + // + // rbPubCFDI + // + this.rbPubCFDI.AutoSize = true; + this.rbPubCFDI.Checked = true; + this.rbPubCFDI.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbPubCFDI.Location = new System.Drawing.Point(4, 2); + this.rbPubCFDI.Name = "rbPubCFDI"; + this.rbPubCFDI.Size = new System.Drawing.Size(56, 20); + this.rbPubCFDI.TabIndex = 0; + this.rbPubCFDI.TabStop = true; + this.rbPubCFDI.Text = "CFDI"; + this.rbPubCFDI.UseVisualStyleBackColor = true; + // + // lbPublicarOpcion + // + this.lbPublicarOpcion.AutoSize = true; + this.lbPublicarOpcion.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbPublicarOpcion.Location = new System.Drawing.Point(352, 275); + this.lbPublicarOpcion.Name = "lbPublicarOpcion"; + this.lbPublicarOpcion.Size = new System.Drawing.Size(54, 16); + this.lbPublicarOpcion.TabIndex = 42; + this.lbPublicarOpcion.Text = "Opción:"; + // + // tbActualizarRuta + // + this.tbActualizarRuta.Location = new System.Drawing.Point(180, 333); + this.tbActualizarRuta.Name = "tbActualizarRuta"; + this.tbActualizarRuta.Size = new System.Drawing.Size(255, 20); + this.tbActualizarRuta.TabIndex = 50; + this.tbActualizarRuta.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.tbActualizarRuta_MouseDoubleClick); + // + // lbRuta + // + this.lbRuta.AutoSize = true; + this.lbRuta.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbRuta.Location = new System.Drawing.Point(142, 333); + this.lbRuta.Name = "lbRuta"; + this.lbRuta.Size = new System.Drawing.Size(39, 16); + this.lbRuta.TabIndex = 51; + this.lbRuta.Text = "Ruta:"; + // + // btnActualizar + // + this.btnActualizar.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnActualizar.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnActualizar.Location = new System.Drawing.Point(440, 330); + this.btnActualizar.Name = "btnActualizar"; + this.btnActualizar.Size = new System.Drawing.Size(80, 25); + this.btnActualizar.TabIndex = 49; + this.btnActualizar.Text = "Actualizar"; + this.btnActualizar.UseVisualStyleBackColor = true; + this.btnActualizar.Click += new System.EventHandler(this.btnActualizar_Click); + // + // lbActualizar + // + this.lbActualizar.AutoSize = true; + this.lbActualizar.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbActualizar.Location = new System.Drawing.Point(15, 333); + this.lbActualizar.Name = "lbActualizar"; + this.lbActualizar.Size = new System.Drawing.Size(60, 16); + this.lbActualizar.TabIndex = 47; + this.lbActualizar.Text = "Sistema:"; + // + // btnActCFDI + // + this.btnActCFDI.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnActCFDI.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnActCFDI.Location = new System.Drawing.Point(15, 172); + this.btnActCFDI.Name = "btnActCFDI"; + this.btnActCFDI.Size = new System.Drawing.Size(70, 25); + this.btnActCFDI.TabIndex = 46; + this.btnActCFDI.Text = "Act.CFDI"; + this.btnActCFDI.UseVisualStyleBackColor = true; + this.btnActCFDI.Click += new System.EventHandler(this.btnActCFDI_Click); + // + // lbPublicar + // + this.lbPublicar.AutoSize = true; + this.lbPublicar.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbPublicar.Location = new System.Drawing.Point(353, 250); + this.lbPublicar.Name = "lbPublicar"; + this.lbPublicar.Size = new System.Drawing.Size(168, 17); + this.lbPublicar.TabIndex = 45; + this.lbPublicar.Text = "Publicar Actualización"; + // + // lbListaClientes + // + this.lbListaClientes.AutoSize = true; + this.lbListaClientes.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbListaClientes.Location = new System.Drawing.Point(82, 249); + this.lbListaClientes.Name = "lbListaClientes"; + this.lbListaClientes.Size = new System.Drawing.Size(218, 17); + this.lbListaClientes.TabIndex = 44; + this.lbListaClientes.Text = "Lista de Clientes del Sistema"; + // + // lbListaOpcion + // + this.lbListaOpcion.AutoSize = true; + this.lbListaOpcion.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbListaOpcion.Location = new System.Drawing.Point(15, 275); + this.lbListaOpcion.Name = "lbListaOpcion"; + this.lbListaOpcion.Size = new System.Drawing.Size(54, 16); + this.lbListaOpcion.TabIndex = 40; + this.lbListaOpcion.Text = "Opción:"; + // + // chCTFol + // + this.chCTFol.AutoSize = true; + this.chCTFol.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chCTFol.Location = new System.Drawing.Point(353, 225); + this.chCTFol.Name = "chCTFol"; + this.chCTFol.Size = new System.Drawing.Size(84, 20); + this.chCTFol.TabIndex = 43; + this.chCTFol.Text = "Con Folio"; + this.chCTFol.UseVisualStyleBackColor = true; + // + // pnLista + // + this.pnLista.Controls.Add(this.rbListaEnviar); + this.pnLista.Controls.Add(this.rbListaVer); + this.pnLista.Location = new System.Drawing.Point(69, 274); + this.pnLista.Name = "pnLista"; + this.pnLista.Size = new System.Drawing.Size(112, 24); + this.pnLista.TabIndex = 39; + // + // rbListaEnviar + // + this.rbListaEnviar.AutoSize = true; + this.rbListaEnviar.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbListaEnviar.Location = new System.Drawing.Point(50, 2); + this.rbListaEnviar.Name = "rbListaEnviar"; + this.rbListaEnviar.Size = new System.Drawing.Size(61, 20); + this.rbListaEnviar.TabIndex = 1; + this.rbListaEnviar.Text = "Editar"; + this.rbListaEnviar.UseVisualStyleBackColor = true; + // + // rbListaVer + // + this.rbListaVer.AutoSize = true; + this.rbListaVer.Checked = true; + this.rbListaVer.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbListaVer.Location = new System.Drawing.Point(4, 2); + this.rbListaVer.Name = "rbListaVer"; + this.rbListaVer.Size = new System.Drawing.Size(47, 20); + this.rbListaVer.TabIndex = 0; + this.rbListaVer.TabStop = true; + this.rbListaVer.Text = "Ver"; + this.rbListaVer.UseVisualStyleBackColor = true; + // + // cbCTCliente + // + this.cbCTCliente.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cbCTCliente.FormattingEnabled = true; + this.cbCTCliente.Location = new System.Drawing.Point(61, 225); + this.cbCTCliente.Name = "cbCTCliente"; + this.cbCTCliente.Size = new System.Drawing.Size(110, 21); + this.cbCTCliente.TabIndex = 42; + this.cbCTCliente.SelectedIndexChanged += new System.EventHandler(this.cbCTCliente_SelectedIndexChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(15, 228); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(49, 16); + this.label1.TabIndex = 41; + this.label1.Text = "Cliente"; + // + // lbOpe + // + this.lbOpe.AutoSize = true; + this.lbOpe.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbOpe.Location = new System.Drawing.Point(200, 177); + this.lbOpe.Name = "lbOpe"; + this.lbOpe.Size = new System.Drawing.Size(54, 16); + this.lbOpe.TabIndex = 38; + this.lbOpe.Text = "Opción:"; + // + // lblConfiguracion + // + this.lblConfiguracion.AutoSize = true; + this.lblConfiguracion.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblConfiguracion.ForeColor = System.Drawing.SystemColors.ButtonHighlight; + this.lblConfiguracion.Location = new System.Drawing.Point(57, 5); + this.lblConfiguracion.Name = "lblConfiguracion"; + this.lblConfiguracion.Size = new System.Drawing.Size(85, 17); + this.lblConfiguracion.TabIndex = 1; + this.lblConfiguracion.Text = "Contraseña:"; + this.lblConfiguracion.Visible = false; + // + // txtResult + // + this.txtResult.Location = new System.Drawing.Point(144, 4); + this.txtResult.Name = "txtResult"; + this.txtResult.PasswordChar = '*'; + this.txtResult.Size = new System.Drawing.Size(100, 20); + this.txtResult.TabIndex = 0; + this.txtResult.Visible = false; + this.txtResult.TextChanged += new System.EventHandler(this.txtResult_TextChanged); + // + // pnConfiguracion + // + this.pnConfiguracion.BackColor = System.Drawing.Color.White; + this.pnConfiguracion.Controls.Add(this.label5); + this.pnConfiguracion.Controls.Add(this.Count_TrasladosP); + this.pnConfiguracion.Controls.Add(this.label4); + this.pnConfiguracion.Controls.Add(this.Count_TrasladosDR); + this.pnConfiguracion.Controls.Add(this.cbLogSQL); + this.pnConfiguracion.Controls.Add(this.label3); + this.pnConfiguracion.Controls.Add(this.btnPFX); + this.pnConfiguracion.Controls.Add(this.pnVer); + this.pnConfiguracion.Controls.Add(this.lbVersion); + this.pnConfiguracion.Controls.Add(this.txtSQLSrv); + this.pnConfiguracion.Controls.Add(this.lbSQLSRV); + this.pnConfiguracion.Controls.Add(this.txtSQLPor); + this.pnConfiguracion.Controls.Add(this.lbServidor); + this.pnConfiguracion.Controls.Add(this.txtSQLPwd); + this.pnConfiguracion.Controls.Add(this.lbPuerto); + this.pnConfiguracion.Controls.Add(this.txtSQLUsr); + this.pnConfiguracion.Controls.Add(this.btnSQLTst); + this.pnConfiguracion.Controls.Add(this.txtSQLDB); + this.pnConfiguracion.Controls.Add(this.lbBaseDatos); + this.pnConfiguracion.Controls.Add(this.lbPAC); + this.pnConfiguracion.Controls.Add(this.lbUsuario); + this.pnConfiguracion.Controls.Add(this.lbMod); + this.pnConfiguracion.Controls.Add(this.pnPAC); + this.pnConfiguracion.Controls.Add(this.lbContraseña); + this.pnConfiguracion.Controls.Add(this.pnMod); + this.pnConfiguracion.Location = new System.Drawing.Point(21, 15); + this.pnConfiguracion.Name = "pnConfiguracion"; + this.pnConfiguracion.Size = new System.Drawing.Size(641, 365); + this.pnConfiguracion.TabIndex = 28; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label5.Location = new System.Drawing.Point(430, 78); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(212, 16); + this.label5.TabIndex = 16; + this.label5.Text = "Base e Importe (TrasladosP):"; + // + // Count_TrasladosP + // + this.Count_TrasladosP.Location = new System.Drawing.Point(433, 97); + this.Count_TrasladosP.Maximum = new decimal(new int[] { + 6, + 0, + 0, + 0}); + this.Count_TrasladosP.Minimum = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.Count_TrasladosP.Name = "Count_TrasladosP"; + this.Count_TrasladosP.Size = new System.Drawing.Size(42, 20); + this.Count_TrasladosP.TabIndex = 15; + this.Count_TrasladosP.Value = new decimal(new int[] { + 4, + 0, + 0, + 0}); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label4.Location = new System.Drawing.Point(426, 17); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(153, 16); + this.label4.TabIndex = 14; + this.label4.Text = "Base e Importe (DR):"; + // + // Count_TrasladosDR + // + this.Count_TrasladosDR.Location = new System.Drawing.Point(430, 36); + this.Count_TrasladosDR.Maximum = new decimal(new int[] { + 6, + 0, + 0, + 0}); + this.Count_TrasladosDR.Minimum = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.Count_TrasladosDR.Name = "Count_TrasladosDR"; + this.Count_TrasladosDR.Size = new System.Drawing.Size(45, 20); + this.Count_TrasladosDR.TabIndex = 13; + this.Count_TrasladosDR.Tag = "ImporteDR"; + this.Count_TrasladosDR.Value = new decimal(new int[] { + 4, + 0, + 0, + 0}); + // + // cbLogSQL + // + this.cbLogSQL.AutoSize = true; + this.cbLogSQL.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cbLogSQL.Location = new System.Drawing.Point(121, 172); + this.cbLogSQL.Name = "cbLogSQL"; + this.cbLogSQL.Size = new System.Drawing.Size(107, 20); + this.cbLogSQL.TabIndex = 12; + this.cbLogSQL.Text = "Registro SQL"; + this.cbLogSQL.UseVisualStyleBackColor = true; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)), true); + this.label3.Location = new System.Drawing.Point(30, 150); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(66, 16); + this.label3.TabIndex = 11; + this.label3.Text = "Utilerias"; + // + // btnPFX + // + this.btnPFX.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnPFX.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnPFX.Location = new System.Drawing.Point(30, 170); + this.btnPFX.Name = "btnPFX"; + this.btnPFX.Size = new System.Drawing.Size(80, 25); + this.btnPFX.TabIndex = 10; + this.btnPFX.Text = "Crear PFX"; + this.btnPFX.UseVisualStyleBackColor = true; + this.btnPFX.Click += new System.EventHandler(this.btnPFX_Click); + // + // pnVer + // + this.pnVer.Controls.Add(this.rbVerDeb); + this.pnVer.Controls.Add(this.rbVerRel); + this.pnVer.Location = new System.Drawing.Point(30, 125); + this.pnVer.Name = "pnVer"; + this.pnVer.Size = new System.Drawing.Size(185, 22); + this.pnVer.TabIndex = 3; + // + // rbVerDeb + // + this.rbVerDeb.AutoSize = true; + this.rbVerDeb.BackColor = System.Drawing.Color.Transparent; + this.rbVerDeb.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbVerDeb.Location = new System.Drawing.Point(3, 1); + this.rbVerDeb.Name = "rbVerDeb"; + this.rbVerDeb.Size = new System.Drawing.Size(54, 20); + this.rbVerDeb.TabIndex = 23; + this.rbVerDeb.TabStop = true; + this.rbVerDeb.Text = "Beta"; + this.rbVerDeb.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.rbVerDeb.UseVisualStyleBackColor = false; + // + // rbVerRel + // + this.rbVerRel.AutoSize = true; + this.rbVerRel.BackColor = System.Drawing.Color.Transparent; + this.rbVerRel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rbVerRel.Location = new System.Drawing.Point(90, 1); + this.rbVerRel.Name = "rbVerRel"; + this.rbVerRel.Size = new System.Drawing.Size(94, 20); + this.rbVerRel.TabIndex = 25; + this.rbVerRel.Text = "Producción"; + this.rbVerRel.UseVisualStyleBackColor = false; + // + // lbVersion + // + this.lbVersion.AutoSize = true; + this.lbVersion.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)), true); + this.lbVersion.Location = new System.Drawing.Point(30, 105); + this.lbVersion.Name = "lbVersion"; + this.lbVersion.Size = new System.Drawing.Size(177, 16); + this.lbVersion.TabIndex = 0; + this.lbVersion.Text = "Versión de la Aplicación"; + // + // lbSQLSRV + // + this.lbSQLSRV.AutoSize = true; + this.lbSQLSRV.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)), true); + this.lbSQLSRV.Location = new System.Drawing.Point(30, 200); + this.lbSQLSRV.Name = "lbSQLSRV"; + this.lbSQLSRV.Size = new System.Drawing.Size(209, 16); + this.lbSQLSRV.TabIndex = 0; + this.lbSQLSRV.Text = "Conexión a la Base de Datos"; + // + // btResultados + // + this.btResultados.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(29)))), ((int)(((byte)(90)))), ((int)(((byte)(173))))); + this.btResultados.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btResultados.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btResultados.ForeColor = System.Drawing.Color.White; + this.btResultados.Location = new System.Drawing.Point(392, 20); + this.btResultados.Name = "btResultados"; + this.btResultados.Size = new System.Drawing.Size(128, 40); + this.btResultados.TabIndex = 33; + this.btResultados.Text = "Resultados"; + this.btResultados.UseVisualStyleBackColor = false; + this.btResultados.Click += new System.EventHandler(this.btResultados_Click); + this.btResultados.MouseLeave += new System.EventHandler(this.btResultados_MouseLeave); + this.btResultados.MouseHover += new System.EventHandler(this.btResultados_MouseHover); + // + // btConfiguracion + // + this.btConfiguracion.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(29)))), ((int)(((byte)(90)))), ((int)(((byte)(173))))); + this.btConfiguracion.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btConfiguracion.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btConfiguracion.ForeColor = System.Drawing.Color.White; + this.btConfiguracion.Location = new System.Drawing.Point(525, 20); + this.btConfiguracion.Name = "btConfiguracion"; + this.btConfiguracion.Size = new System.Drawing.Size(128, 40); + this.btConfiguracion.TabIndex = 34; + this.btConfiguracion.Text = "Configuración"; + this.btConfiguracion.UseVisualStyleBackColor = false; + this.btConfiguracion.Click += new System.EventHandler(this.btConfiguracion_Click); + this.btConfiguracion.MouseLeave += new System.EventHandler(this.btConfiguracion_MouseLeave); + this.btConfiguracion.MouseHover += new System.EventHandler(this.btConfiguracion_MouseHover); + // + // tbPruebas + // + this.tbPruebas.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(29)))), ((int)(((byte)(90)))), ((int)(((byte)(173))))); + this.tbPruebas.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.tbPruebas.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tbPruebas.ForeColor = System.Drawing.Color.White; + this.tbPruebas.Location = new System.Drawing.Point(658, 20); + this.tbPruebas.Name = "tbPruebas"; + this.tbPruebas.Size = new System.Drawing.Size(128, 40); + this.tbPruebas.TabIndex = 35; + this.tbPruebas.Text = "Pruebas"; + this.tbPruebas.UseVisualStyleBackColor = false; + this.tbPruebas.Click += new System.EventHandler(this.btPruebas_Click); + this.tbPruebas.MouseLeave += new System.EventHandler(this.btPruebas_MouseLeave); + this.tbPruebas.MouseHover += new System.EventHandler(this.btPruebas_MouseHover); + // + // fdAplicacion + // + this.fdAplicacion.FileName = "fdAplicacion"; + // + // imglisAvance + // + this.imglisAvance.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; + this.imglisAvance.ImageSize = new System.Drawing.Size(100, 100); + this.imglisAvance.TransparentColor = System.Drawing.Color.Transparent; + // + // frmCFDI + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.White; + this.BackgroundImage = global::CFDI.Properties.Resources._background_1427x739px; + this.ClientSize = new System.Drawing.Size(1106, 528); + this.Controls.Add(this.btResultados); + this.Controls.Add(this.tbPruebas); + this.Controls.Add(this.btConfiguracion); + this.Controls.Add(this.labPro); + this.Controls.Add(this.picLoad); + this.Controls.Add(this.lblPie); + this.Controls.Add(this.pbNot); + this.Controls.Add(this.picLog); + this.Controls.Add(this.pnFondo); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "frmCFDI"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Aduanasoft | Comprobantes Fiscales CFDI 4.0"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmCFDI_FormClosing); + this.Load += new System.EventHandler(this.frmCFDI_Load); + this.panel5.ResumeLayout(false); + this.panel5.PerformLayout(); + this.pnPAC.ResumeLayout(false); + this.pnPAC.PerformLayout(); + this.pnMod.ResumeLayout(false); + this.pnMod.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picLoad)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.picLog)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pbNot)).EndInit(); + this.pnFondo.ResumeLayout(false); + this.pnFondo.PerformLayout(); + this.pnPruebas.ResumeLayout(false); + this.pnPruebas.PerformLayout(); + this.pnActualizacion.ResumeLayout(false); + this.pnActualizacion.PerformLayout(); + this.pnLista.ResumeLayout(false); + this.pnLista.PerformLayout(); + this.pnConfiguracion.ResumeLayout(false); + this.pnConfiguracion.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.Count_TrasladosP)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.Count_TrasladosDR)).EndInit(); + this.pnVer.ResumeLayout(false); + this.pnVer.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.PictureBox picLoad; + private System.Windows.Forms.Label labPro; + private System.Windows.Forms.Button btnCGAntSqlCFDI; + private System.Windows.Forms.Button btnSQLTst; + private System.Windows.Forms.Label lbPuerto; + private System.Windows.Forms.TextBox txtSQLPor; + private System.Windows.Forms.TextBox txtSQLPwd; + private System.Windows.Forms.TextBox txtSQLUsr; + private System.Windows.Forms.TextBox txtSQLDB; + private System.Windows.Forms.TextBox txtSQLSrv; + private System.Windows.Forms.Label lbContraseña; + private System.Windows.Forms.Label lbUsuario; + private System.Windows.Forms.Label lbBaseDatos; + private System.Windows.Forms.Label lbServidor; + private System.Windows.Forms.Button btnCGFactSQL; + private System.Windows.Forms.Button btnCGNotCSQL; + private System.Windows.Forms.Label lbSysID; + private System.Windows.Forms.TextBox txbSysID; + private System.Windows.Forms.Label lbBMS; + private System.Windows.Forms.Button btnSMPagPSQL; + private System.Windows.Forms.Button btnSMFactSQL; + private System.Windows.Forms.Label lblCG2; + private System.Windows.Forms.Label lblPie; + private System.Windows.Forms.RichTextBox rtbResultados; + private System.Windows.Forms.PictureBox picLog; + private System.Windows.Forms.Button btnSMNotCSQL; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.RadioButton rbTimbrar; + private System.Windows.Forms.RadioButton rbCancelar; + private System.Windows.Forms.RadioButton rbRecuperar; + private System.Windows.Forms.Panel pnPAC; + private System.Windows.Forms.RadioButton rbPACCD; + private System.Windows.Forms.RadioButton rbPACED; + private System.Windows.Forms.Label lbMod; + private System.Windows.Forms.Panel pnMod; + private System.Windows.Forms.RadioButton rbModoP; + private System.Windows.Forms.RadioButton rbModoN; + private System.Windows.Forms.Label lbPAC; + private System.Windows.Forms.Button btnCGCEP; + private System.Windows.Forms.OpenFileDialog openFileDialogCEP; + private System.Windows.Forms.Button btnLisRel; + private System.Windows.Forms.ComboBox cmCTMes; + private System.Windows.Forms.Button btnTimbres; + private System.Windows.Forms.Label lbRepTimMes; + private System.Windows.Forms.Label lbRepTimAño; + private System.Windows.Forms.ComboBox cmCTYear; + private System.Windows.Forms.CheckBox chCTUid; + private System.Windows.Forms.Button btnCGAntESqlCFDI; + private System.Windows.Forms.Button btnSMReteSQL; + private System.Windows.Forms.Button btnCGPagoSQL; + private System.Windows.Forms.Button btnSMCEP; + private System.Windows.Forms.Button btnSMTrasSQL; + private System.Windows.Forms.Button btnCGFacESQL; + private System.Windows.Forms.Button btnSMFacESQL; + private System.Windows.Forms.Label lbReportes; + private System.Windows.Forms.Button btnPubRel; + private System.Windows.Forms.Button btnLisBet; + private System.Windows.Forms.Button btnPubBet; + private System.Windows.Forms.PictureBox pbNot; + private System.Windows.Forms.Panel pnFondo; + private System.Windows.Forms.Button btResultados; + private System.Windows.Forms.Button btConfiguracion; + private System.Windows.Forms.Button tbPruebas; + private System.Windows.Forms.Panel pnConfiguracion; + private System.Windows.Forms.Label lbSQLSRV; + private System.Windows.Forms.Panel pnPruebas; + private System.Windows.Forms.Label lbOpe; + private System.Windows.Forms.Panel pnVer; + private System.Windows.Forms.RadioButton rbVerRel; + private System.Windows.Forms.Label lbVersion; + private System.Windows.Forms.RadioButton rbVerDeb; + private System.Windows.Forms.ComboBox cbCTCliente; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.CheckBox chCTFol; + private System.Windows.Forms.Label lbListaOpcion; + private System.Windows.Forms.Panel pnLista; + private System.Windows.Forms.RadioButton rbListaEnviar; + private System.Windows.Forms.RadioButton rbListaVer; + private System.Windows.Forms.Label lbPublicar; + private System.Windows.Forms.Label lbListaClientes; + private System.Windows.Forms.Button btnPFX; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox cbLogSQL; + private System.Windows.Forms.Button btnActCFDI; + private System.Windows.Forms.ComboBox CbActualizarSistema; + private System.Windows.Forms.Label lbActualizar; + private System.Windows.Forms.Button btnActualizar; + private System.Windows.Forms.TextBox tbActualizarRuta; + private System.Windows.Forms.Label lbRuta; + private System.Windows.Forms.Label lbPublicarOpcion; + private System.Windows.Forms.Panel pnActualizacion; + private System.Windows.Forms.RadioButton rbPubAct; + private System.Windows.Forms.RadioButton rbPubCFDI; + private System.Windows.Forms.OpenFileDialog fdAplicacion; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button btnBMSAntSqlCFDI; + private System.Windows.Forms.Button btnxml; + private System.Windows.Forms.ImageList imglisAvance; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.TextBox txtResult; + private System.Windows.Forms.Label lblConfiguracion; + private System.Windows.Forms.CheckBox RBCancela; + private System.Windows.Forms.CheckBox CB_Status; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.NumericUpDown Count_TrasladosDR; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.NumericUpDown Count_TrasladosP; + } +} + diff --git a/CFDI/CFDI.cs b/CFDI/CFDI.cs new file mode 100644 index 0000000..5322477 --- /dev/null +++ b/CFDI/CFDI.cs @@ -0,0 +1,20964 @@ +//Codigo Bidimensional +using Gma.QrCodeNet.Encoding; +using Gma.QrCodeNet.Encoding.Windows.Render; +//openssl +using JavaScience; +//microsoft +using System; + +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Reflection; +//md5 +using System.Security.Cryptography; +//cliente de sql +using System.Data.SqlClient; +//hilos +using System.Threading; + +//componente xml +using System.Xml; +using System.Xml.Linq; +using System.Xml.XPath; +//transformacion +using System.Xml.Xsl; +//zip +using Ionic.Zip; +//valdaciones del sistema operativo +using System.Diagnostics; +//validaciones ereg +using System.Text.RegularExpressions; +//configuracion regional +using System.Globalization; +//validar permisos en directorio +using System.Security.AccessControl; + +//apoyo comercio digital pac +using cte_cancV4.Clases; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System.Net.NetworkInformation; + + +namespace CFDI +{ + /* + ===================================================== + Que este código nos llene de orgullo no de vergüenza. + ===================================================== + */ + + /* + ============================================================== + Aduanasoft 2018 © Derechos Reservados Aduanasoft, S.A. de C.V. + Programa para generar Comprobantes Fiscales CFDI Ver 3.3 + ============================================================== + */ + + //notas importantes + #region notas importantes + + /* + ========================================================== + Si usas RAD es porque no estás seguro de tus conocimientos + ========================================================== + */ + + /* + ------------------ NOTA: Sobre el nombre de la aplicacion ------------------ + Los nombres CFDI.exe y Actualizador.exe esta en codigo no se deben renombrar + ---------------------------------------------------------------------------- + */ + + /* + ----------- NOTA: Sobre el modo de publicacion ----------- + Publicar en Release para version de produccion + Publicar en Debug para version beta + Puede utilizar el boton ↑ Ver (Rel | Bet) para subir al FTP + ----------------------------------------------------------- + */ + + /* + ------------ NOTA: Sobre la ruta del proyecto ------------ + Utilice la ruta C:\Proyectos\ para mostrar el boton pruebas + ----------------------------------------------------------- + */ + + /* + ------------------ NOTA: Sobre la versión de Framework de la aplicacion ------------------ + Este apliacion usa framework.net 4 para poder ejecutarse en windows XP y posteriores. + Esta version no tiene zip nativo, los clientes web y ftp esta limitados pero funcionales. + Se uso por que es necesario tener compatibilidad con sistemas operativos obsoletos NT 5.1. + ----------------------------------------------------------------------------------------- + */ + + /* + ------------------------ NOTA: Sobre paquetes requeridos ------------------------ + QrCode.Net generador del codigo bidimensional. + DotNetZip descomprimir zip + Costura.Fody para embeber librerias en el exe. + + Puede instalar los paquetes desde: + Herramientas\Administrador de paquetes NuGet\consola del Administrador de paquetes + + Una vez en la consola NuGet copie uno por uno los paquetes y presione ENTER: + Install-Package QrCode.Net + Install-Package DotNetZip + Install-Package Costura.Fody + ----------------------------------------------------------------------------------- + */ + + /* + ----------------- NOTA: sobre Open SSL ----------------- + Al momento del desarrollo no habia un paquete de OpenSQL personalizable + Se agrego con using el archivo opensslkey.cs + -------------------------------------------------------- + */ + + /* + ---------------------------------- DESCARTADO: Generacion y validacion mediante xsd --------------------------------- + Esta maravilla de IDE y lenguaje de primer mundo hecha por uno de las empresas mas poderosas e influyentes del mundo. + Cuenta con un proceso para generar y validar el xml. Por desgracia los catálogos y validaciones de los XSD provocaban + que la aplicación fuera grande y el proceso de compliacion lento lo que comprometeria el desarrollo y rendimiento. + + La clase para crear el XML se genera con la herramienta de desarrollo de software: .NET Frameworks Xml Schema Tool en: + C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools + La instruccion para generar las declaraciones necesarias: + xsd /C cfdv33.xsd tdCFDI.xsd catCFDI.xsd + Esta instruccion se ejecuta en cmd y las urls de los archivos deben remplazarse por recursos locales existentes. + Se genera un archivo cs llamado comprobante.cs contiene todas las declaraciones necesarias. + ---------------------------------------------------------------------------------------------------------------------- + */ + + /* + -------------------------------- Definiciones -------------------------------- + XSD: XML Schema define la estructura del XML + XML: Extensible Markup Language archivo que almacena datos en nodos nombrados + CFDI: Comprobante fiscal por internet. + PAC: Proveedor autorizado de certificacion. + ------------------------------------------------------------------------------ + */ + + /* + Notas: Edgar + Los colores de hover no corresponden al diseño original + Mejora no necesaria descargar xsd y xlst del sat para transformacion y validacion?? + */ + #endregion notas importantes + + public partial class frmCFDI : Form + { + //declaraciones de variables + #region declaraciones de variables + //encriptacion no cambiar o sera necesario reconfigurar las conexiones a sql en cada equipo. + #region encriptacion key + const string DESKey = "KOXPRWBC"; + const string DESIV = "QLTNUFMO"; + #endregion encriptacion key + + //cuenta ftp actualizacion + #region autentificacion ftp + const string FTPSrv = "ftp://aduanasoft.com"; + const string FTPUsr = "winsaai"; + const string FTPPwd = "soluciones"; + #endregion autentificacion ftp + + //variables del sistema + #region variables del sistema + public string SysNombre = "Aduanasoft CFDI 4.0"; + public string SysQueryEncabezado; + public string SysQueryPartidas; + public string SysQueryRelacionados; + public string SysQueryINE; + public string SysQueryPago10; + public string SysQueryNotariosPublicos; + public string SysQueryComercioExterior; + + //CartaPorte Query Strings + public string SysQueryCartaPorte; + public string SysQueryUbicaciones; + public string SysQueryPedimentos; + public string SysQueryGuiasIdentificacion; + //public string SysQueryAutoTransporteFederal; + public string SysQueryMercancias; + public string SysQueryMercancias_Mercancia; + public string SysQueryMercancias_CantidadTransporta; + public string SysQueryFiguraTransporte; + + + + + + public string SysErrores; + public string SysDir = AppDomain.CurrentDomain.BaseDirectory; + public string SysDirOri = Directory.GetCurrentDirectory() + "\\"; + public string SysTem = Environment.GetEnvironmentVariable("temp") + "\\"; + public string SysVer = typeof(Program).Assembly.GetName().Version.ToString().Replace(".0.0", string.Empty); + public string SysCmd; + public bool SysDeb; + public int SysProcesso; + public string SysRepEnc; + public string SysRepDet; + public string SysEnvErr; + + #endregion + + //variables sql + #region variables sql + public string SQLSrv; + public string SQLDb; + public string SQLUsr; + public string SQLPwd; + public string SQLPor; + public string CFDIMod; + + public string CFDIPac; + public bool AnticiposAS=false; + public string CFDIVer; + #endregion variables sql + + //variables pac + #region variables pac + public string CFDIPacUsr; + public string CFDIPacPwd; + public string CFDIPacUrl; + public string CFDIPacFun; + public string CFDIPacRes; + public string CFDIRfc; + public string CFDISis; + public string CFDIPet; + public string CFDILog; + public string CFDINumCer; + public string TIPOC; + public string ConfigKEYRuta; + public string ConfigCERRuta; + #endregion variables pac + + //paramteros cmd + #region paramteros cmd + public string ComprobanteDBAplicacion; + public string ComprobanteDBTipoComprobante; + public int ComprobanteDBSysId; + public string ComprobanteDBOperacion; + public string ComprobanteDBPwd; + public bool ComprobanteDBIncUUID; + public bool ComprobanteDBIncFolio; + public string ComprobanteDBRFC; + public bool ComprobanteDBCmd; + public string Sin_CP = ""; + + + #endregion paramteros cmd + + //configuracion + #region configuracion + public string ComprobanteDBOrigen; + public string ComprobanteDBArchivo; + public string ComprobanteDBArchivoTimbrado; + public string ComprobanteDBRutaEntrada; + public string ComprobanteDBRutaSalida; + #endregion configuracion + + //actualizar + #region actualizar + public class Actualiza + { + public string Nombre; + public string Ruta; + } + public List Actualizar = new List(); + #endregion actualizar + + //variables encabezado + #region variables encabezado + public string ConfigCertificadoNumero; + public string ConfigCertificadoRuta; + public string ConfigKeyRuta; + public string ConfigKeyClave; + public string ConfigPfxRuta; + public string ConfigPfxClave; + public string ConfigFacturaNombre; + public string ConfigClienteClave; + public string ConfigFacturaSufijo; + public string ConfigFacturaTipo; + public string ConfigPedimentoTipo; + + public int Comprobante_LugarExpedicion; + public string Comprobante_MetodoPago; + public string Comprobante_TipoDeComprobante; + public double Comprobante_Total; + public double Comprobante_TipoCambio; + public string Comprobante_Moneda; + public string Comprobante_Certificado; + public string Comprobante_CondicionesDePago; + public string Comprobante_CertificadoSubject; //se utilizar para validar rfc y vigencia del certificado + public double Comprobante_SubTotal; + public double Comprobante_Descuento; + public string Comprobante_NoCertificado; + public string Comprobante_FormaPago; + public string Comprobante_Sello; + public string Comprobante_Fecha; + public string Comprobante_Folio; + public string Comprobante_Serie; + public string Comprobante_Version; + public string Comprobante_CadenaOriginal; + public string Comprobante_CadenaOriginal_2; + public string Comprobante_CadenaOriginal_3; + public string Comprobante_Estatus; + public string PAC_RFC; + public string Comprobante_EstatusIngreso; + public string Comprobante_CuentaPredial; + public string Comprobante_Confirmacion; + public bool CancelaNuevo = false; + public string Comprobante_NomenclaturaCNE; + + //-----CFDI 4.0 + public bool CFDI4 =true; + //PAW is the production or local for send request false = production + public bool PAW = false; + public bool API_V2 = false; + public bool actualiza = false; + public string fullpath; + public double IVA_Cero_cantidad =0; + public string DRF_Token; + public string GeneralURL; + + + public string Comprobante_Exportacion; + public bool ES_GLOBAL = false; + public string Comprobante_InfoGlo_Periodicidad; + public string Comprobante_InfoGlo_Meses; + public string Comprobante_InfoGlo_Anio; + public string Comprobante_Receptor_DomicilioFiscal; + public string Comprobante_Receptor_RegimenFiscal; + public bool IVA_CERO_ENC = false; + public bool iva_excento = false; + public double suma_exento = 0; + + //New Cancela + public string Comprobante_Motivo_Cancela; + public string comprobante_Folio_Cancela; + + public class Comprobante_Impuesto + { + public string Impuesto; + public string TipoFactor; + public double TasaOCuota; + public double Importe; + public double Base; + } + public List Comprobante_Retencion = new List(); + public List Comprobante_Traslado = new List(); + + public string Emisor_Rfc; + public string Emisor_Nombre; + public string Emisor_RegimenFiscal; + + public string Receptor_Rfc; + public string Receptor_Nombre; + public string Receptor_UsoCFDI; + public string Receptor_ResidenciaFiscal; + public string Receptor_NumRegIdTrib; + public string ReceptorClienteV2; + public bool SinRelacionV2; + public double Comprobante_TotalImpuestosTrasladados; + public double Comprobante_TotalImpuestosRetenidos; + public string PO; + public bool ES_CFDI4; + + // Variables Complemento Terceros + public bool Complemento_Terceros; + public string Numero_Pedimento_Terceros; + public string Fecha_Pedimento_Terceros; + public string Aduana_Terceros; + public string _TipoConcepto; + + //variable Complemento IEDU (bandera) + public bool Complemento_IEDU_Activo; + + #endregion variables encabezado + + //variables retencion + #region variables retencion + public bool bolRet; + public string Retenciones_Emisor_RFCEmisor; + public string Retenciones_Emisor_NomDenRazSocE; + public string Retenciones_Emisor_CURPE; + public string Retenciones_Emisor_RegimenFiscal; + + public string Retenciones_Receptor_Nacional_RFCRecep; + public string Retenciones_Receptor_Nacional_NomDenRazSocR; + public string Retenciones_Receptor_Nacional_CURPR; + public string Retenciones_Receptor_Extranjero_NumRegIdTrib; + public string Retenciones_Receptor_DomicilioFiscalR; + public string Retenciones_Receptor_Extranjero_NomDenRazSocR;// + public string Retenciones_Receptor_Nacionalidad; + + public int Retenciones_Periodo_MesIni; + public int Retenciones_Periodo_MesFin; + public int Retenciones_Periodo_Ejerc; + + public class ImpRetenido + { + public double BaseRet; + public string Impuesto; + public double montoRet; + public string TipoPagoRet; + } + public List Retenciones_Totales_ImpRetenidos = new List(); + + public double Retenciones_Totales_MontoTotOperacion; + public double Retenciones_Totales_MontoTotGrav; + public double Retenciones_Totales_MontoTotExent; + public double Retenciones_Totales_MontoTotRet; + + public string Retenciones_Version; + public string Retenciones_CveRetenc; + public string Retenciones_DescRetenc; + + //complemento Arrendamientoenfideicomiso + public string Arrendamientoenfideicomiso_Version; + public double Arrendamientoenfideicomiso_PagProvEfecPorFiduc; + public double Arrendamientoenfideicomiso_RendimFideicom; + public double Arrendamientoenfideicomiso_DeduccCorresp; + public double Arrendamientoenfideicomiso_MontTotRet; + public double Arrendamientoenfideicomiso_MontResFiscDistFibras; + public double Arrendamientoenfideicomiso_MontOtrosConceptDistr; + public string Arrendamientoenfideicomiso_DescrMontOtrosConceptDistr; + + //complemento Dividendos + public string Dividendos_Version; + public string Dividendos_DividOUtil_CveTipDivOUtil; + public double Dividendos_DividOUtil_MontISRAcredRetMexico; + public double Dividendos_DividOUtil_MontISRAcredRetExtranjero; + public double Dividendos_DividOUtil_MontRetExtDivExt; + public string Dividendos_DividOUtil_TipoSocDistrDiv; + public double Dividendos_DividOUtil_MontISRAcredNal; + public double Dividendos_DividOUtil_MontDivAcumNal; + public double Dividendos_DividOUtil_MontDivAcumExt; + public double Dividendos_Remanente_ProporcionRem; + + //complemento EnajenaciondeAcciones + public string EnajenaciondeAcciones_Version; + public string EnajenaciondeAcciones_ContratoIntermediacion; + public double EnajenaciondeAcciones_Ganancia; + public double EnajenaciondeAcciones_Perdida; + + //complemento Fideicomisonoempresarial + public string Fideicomisonoempresarial_Version; + public string Fideicomisonoempresarial_IngresosOEntradas_IntegracIngresos_Concepto; + public double Fideicomisonoempresarial_IngresosOEntradas_MontTotEntradasPeriodo; + public double Fideicomisonoempresarial_IngresosOEntradas_PartPropAcumDelFideicom; + public double Fideicomisonoempresarial_IngresosOEntradas_PropDelMontTot; + public string Fideicomisonoempresarial_DeduccOSalidas_IntegracEgresos_ConceptoS; + public double Fideicomisonoempresarial_DeduccOSalidas_MontTotEgresPeriodo; + public double Fideicomisonoempresarial_DeduccOSalidas_PartPropDelFideicom; + public double Fideicomisonoempresarial_DeduccOSalidas_PropDelMontTot; + public double Fideicomisonoempresarial_RetEfectFideicomiso_MontRetRelPagFideic; + public string Fideicomisonoempresarial_RetEfectFideicomiso_DescRetRelPagFideic; + + //complemento Intereses + public string Intereses_Version; + public string Intereses_SistFinanciero; + public string Intereses_RetiroAORESRetInt; + public string Intereses_OperFinancDerivad; + public double Intereses_MontIntNominal; + public double Intereses_MontIntReal; + public double Intereses_Perdida; + + //complemento Intereseshipotecarios + public string Intereseshipotecarios_Version; + public string Intereseshipotecarios_CreditoDeInstFinanc; + public double Intereseshipotecarios_SaldoInsoluto; + public double Intereseshipotecarios_PropDeducDelCredit; + public double Intereseshipotecarios_MontTotIntNominalesDev; + public double Intereseshipotecarios_MontTotIntNominalesDevYPag; + public double Intereseshipotecarios_MontTotIntRealPagDeduc; + public string Intereseshipotecarios_NumContrato; + + //complemento Operacionesconderivados + public string Operacionesconderivados_Version; + public double Operacionesconderivados_MontGanAcum; + public double Operacionesconderivados_MontPerdDed; + + //complemento Pagosaextranjeros + public string Pagosaextranjeros_Version; + public string Pagosaextranjeros_NoBeneficiario_PaisDeResidParaEfecFisc; + public int Pagosaextranjeros_NoBeneficiario_ConceptoPago; + public string Pagosaextranjeros_NoBeneficiario_DescripcionConcepto; + public string Pagosaextranjeros_Beneficiario_RFC; + public string Pagosaextranjeros_Beneficiario_CURP; + public string Pagosaextranjeros_Beneficiario_NomDenRazSocB; + public int Pagosaextranjeros_Beneficiario_ConceptoPago; + public string Pagosaextranjeros_Beneficiario_DescripcionConcepto; + public string Pagosaextranjeros_EsBenefEfectDelCobro; + + //complemento Planesderetiro + public string Planesderetiro_Version; + public string Planesderetiro_SistemaFinanc; + public double Planesderetiro_MontTotAportAnioInmAnterior; + public double Planesderetiro_MontIntRealesDevengAniooInmAnt; + public string Planesderetiro_HuboRetirosAnioInmAntPer; + public double Planesderetiro_MontTotRetiradoAnioInmAntPer; + public double Planesderetiro_MontTotExentRetiradoAnioInmAnt; + public double Planesderetiro_MontTotExedenteAnioInmAnt; + public string Planesderetiro_HuboRetirosAnioInmAnt; + public double Planesderetiro_MontTotRetiradoAnioInmAnt; + + //complemento Premios + public string Premios_Version; + public string Premios_EntidadFederativa; + public double Premios_MontTotPago; + public double Premios_MontTotPagoGrav; + public double Premios_MontTotPagoExent; + + //complemento SectorFinanciero + public string SectorFinanciero_Version; + public string SectorFinanciero_IdFideicom; + public string SectorFinanciero_NomFideicom; + public string SectorFinanciero_DescripFideicom; + + #endregion variables retencion + + //variables partidas + #region variables partidas + + //Partidas de Carta Porte + + public string TranspInternac; + public string EntradaSalidaMerc; + public string ViaEntradaSalida; + public string PaisOrigenDestino; + public double TotalDistRec; + public bool CartaPorte; + + //Auto Transporte Federal + public string FIGURA_TRAN_CLAVETRANSPORTE; + public string PermSCT; + public string NumPermisoSCT; + public string NombreAseg; + public string NumPolizaSeguro; + public string ConfigVehicular; + public string PlacaVM; + public string AnioModeloVM; + public string SubTipoRem; + public string Placa; + public string SubTipoRem2; + public string Placa2; + + //Seguros + public string AseguraRespCivil; + public string PolizaRespCivil; + public string AseguraMedAmbiente; + public string PolizaMedAmbiente; + public string AseguraCarga; + public string PolizaCarga; + public double PrimaSeguro; + + /*Campos Nuevos 3.0*/ + public string ID_Complemento; + public string REGIMENADUANERO; + public string REGISTROISTMO; + public string UBICACIONPOLOORIGEN; + public string UBICACIONPOLODESTINO; + public string LogisticaInv; + public string CP_MCIAS_AUTOFED_IDV_PESOBRUTOVEHICULAR; + + + //Figura Transporte + public class FiguraTransporte { + public string TIPOFIGURA; + //Operador + public int Conse; + public int Linea; + public string RFCOperador; + public string NumLicencia; + public string NombreOperador; + public string NumRegIdTribOperador; + public string ResidenciaFiscalOperador; + + //Propietario + public string RFCPropietario; + public string NombrePropietario; + public string NumRegIdTribPropietario; + public string ResidenciaFiscalPropietario; + + //Arrendatario + public string RFCArrendatario; + public string NombreArrendatario; + public string NumRegIdTribArrendatario; + public string ResidenciaFiscalArrendatario; + + //Notificado + public string RFCNotificado; + public string NombreNotificado; + public string NumRegIdTribNotificado; + public string ResidenciaFiscalNotificado; + + //Domicilio + public string Calle; + public string NumeroExterior; + public string NumeroInterior; + public string Colonia; + public string Localidad; + public string Referencia; + public string Municipio; + public string Estado; + public string Pais; + public string CodigoPostal; + + + } + public List Figura_Transportes = new List(); + + //Ubicaciones + public class PartidasUbicacion { + public int Id_Carta_Porte; + public int Linea; + public bool Origen; + public bool Destino; + public string TipoEstacion; + public double DistanciaRecorrida; + + //Origen + public string IDOrigen; + public string RFCRemitente; + public string NombreRemitente; + public string NumRegIdTrib_Ori; + public string ResidenciaFiscal_Ori; + public string NumEstacion_Ori; + public string NombreEstacion_Ori; + public string NavegacionTrafico_Ori; + public string FechaHoraSalida_Ori; + + //Destino + public string IDDestino; + public string RFCDestinatario; + public string NombreDestinatario; + public string NumRegIdTrib_Des; + public string ResidenciaFiscal_Des; + public string NumEstacion_Des; + public string NombreEstacion_Des; + public string NavegacionTrafico_Des; + public string FechaHoraSalida_Des; + + public string Calle; + public string NumeroExterior; + public string NumeroInterior; + public string Colonia; + public string Localidad; + public string Referencia; + public string Municipio; + public string Estado; + public string Pais; + public string CodigoPostal; + } + public List Partidas_Ubicacion = new List(); + + //Mercancias + public class PartidasMercanciaCantidadTransporta + { + + public int ID; + public int Linea_Merca; + public int LineaCantTrans; + + public double Cantidad; + public string IDOrigen; + public string IDDestino; + public string CvesTransporte; + + + + } + public List PartidasMercancia_CantidadTransporta = new List(); + + public class PartidasMercancia { + public int CartaPorteMerca; + public int LineaMerca; + + public double PesoBrutoTotal; + public string UnidadPesoM; + public double PesoNetoTotal; + public int NumTotalMercancias; + public double CargoPorTasacion; + + + public string BienesTransp; + public string ClaveSTCC; + public string Descripcion; + public double Cantidad; + public string ClaveUnidad; + public string Unidad; + public string Dimensiones; + public string MaterialPeligroso; + public string CveMaterialPeligroso; + public string Embalaje; + public string DescripEmbalaje; + public double PesoEnKg; + public string Moneda; + public double ValorMercancia; + public string MonedaMercancia; + public string FraccionArancelaria; + public string UUIDComercioExt; + public string UnidadPeso; + public double PesoBruto; + public double PesoNeto; + public double PesoTara; + public int NumPiezas; + + // --MERCANCIAS-- NUEVOS CCP 3.0 + public string CPM_SECTORCOFEPRIS; + public string CPM_NombreIngredienteActivo; + public string CPM_NomQuimico; + public string CPM_DenominacionGenericaProd; + public string CPM_DenominacionDistintivaProd; + public string CPM_Fabricante; + public string CPM_FechaCaducidad; + public string CPM_LoteMedicamento; + public string CPM_FormaFarmaceutica; + public string CPM_CondicionesEspTransp; + public string CPM_RegistroSanitarioFolioAutorizacion; + public string CPM_PermisoImportacion; + public string CPM_FolioImpoVUCEM; + public string CPM_NumCAS; + public string CPM_RazonSocialEmpImp; + public string CPM_NumRegSanPlagCOFEPRIS; + public string CPM_DatosFabricante; + public string CPM_DatosFormulador; + public string CPM_DatosMaquilador; + public string CPM_UsoAutorizado; + public string CPM_TipoMateria; + public string CPM_DescripcionMateria; + + } + public List Partidas_Mercancias = new List(); + + //Pedimentos + public class Pedimentos { + public int ID_CP_MERANCIA_PEDIMENTO; + public int LINEAMERCANCIA; + public int LINEAPEDIMENTOMERCA; + public string PEDIMENTO; + + /*--PEDIMENTOS--Nuevos CCP3.0*/ + public string TIPODOCUMENTO; + public string IdentDocAduanero; + public string RFCImpo; + } + public List Pedimentos_Mercancias = new List(); + + //Guias Identificacion + public class Guias_Identificaicon { + public int ID_CARTAPORTE_MERCANCIA; + public int LINEAMERCANCIA; + public int LINEAGUIAIDENTIFICACION; + public string NUMEROGUIAIDENTIFICACION; + public string DESCRIPGUIAIDENTIFICACION; + public double PESOGUIAIDENTIFICACION; + } + public List Guias_Identificacion_Mercancias = new List(); + // fin CARTA PORTE + + //Partidas Compemento IEDU + public class partidas_IEDU + { + public string Comprobante_IEDU_NombreAlumno; + public string Comprobante_IEDU_CURP; + public string Comprobante_IEDU_nivelEducativo; + public string Comprobante_IEDU_autROVE; + public string Comprobante_IEDU_rfcPago; + } + + public class partidas_Terceros_Cliente + { + public bool Partidas_Terceros_Activo; + //Partida_Complemento_Tercero_Activo + public string Clave_Cliente_Terceros; + public string RFC; + public string NOMBREFISCAL; + public string DIRECCION; + public string NUMEROEXT; + public string NOINTERIOR; + public string COLONIA; + public string CIUDAD; + public string ESTADO; + public string PAIS; + public string CP; + + } + + public class ComprobantePartida + { + public int PartidaID; + public string ClaveProdServ; + public string NoIdentificacion; + public double Cantidad; + public string ClaveUnidad; + public string Unidad; + public string Descripcion; + public double Descuento; + public double ValorUnitario; + public double Importe; + public int Traslados; + public int Retenciones; + public String TipoConcepto; + public partidas_IEDU Complemento_IEDU; + public partidas_Terceros_Cliente Comp_Terceros; + + + //-----CFDI4.0 + public string ObjetoImp; + public int IVA_CERO = 0; + public string RFC_Terceros; + public string Nombre_Terceros; + public string Regimen_Terceros; + public string Domicilio_Terceros; + + } + public List Comprobante_Partida = new List(); + public List Comprobante_Partida_Terceros = new List(); + + public class ComprobantePartida_Impuesto + { + public int PartidaID; + public double Base; + public string Impuesto; + public string TipoFactor; + public double TasaOCuota; + public double Importe; + public int IVA_CERO = 0; + public string objOmp = string.Empty; + } + public List Comprobante_Partida_Retencion = new List(); + public List Comprobante_Partida_Traslado = new List(); + + public List Complemento_Partida_Terceros_Retencion = new List(); + public List Complemento_Partida_Terceros_Traslado = new List(); + + //asigna impuestos a partidas de anticipo + public List Comprobante_Partida_Retencion_Anticipo = new List(); + public List Comprobante_Partida_Traslado_Anticipo = new List(); + + //Paritdas Complemento INE + public class partidas_INE + { + public int IdContabilidad; + public string ClaveEntidad; + public string Ambito; + } + public List Partida_INE = new List(); + + #endregion variables partidas + + //lista de clientes + #region lista clientes + public class Cliente + { + public string RFC; + public string RFC_Des; + public string RazonSocial; + public int Activo; + public int Baja_Año; + public int Baja_Mes; + public int bms; + public int cg2; + } + public List Clientes_Enviar = new List(); + public List Clientes_Recibir = new List(); + #endregion lista clientes + + //complemento pago variables + #region complemento pago + public string Pago10_FechaPago; + public string Pago10_FormaDePagoP; + public string Pago10_MonedaP; + public double Pago10_TipoCambioP; + public double Pago10_Monto; + + public string Pago10_RfcEmisorCtaOrd; + public string Pago10_NomBancoOrdExt; + public string Pago10_CtaOrdenante; + public string Pago10_RfcEmisorCtaBen; + public string Pago10_CtaBeneficiario; + public string Pago10_TipoCadPago; + public string Pago10_CadPago; + public string Pago10_CertPago; + public string Pago10_SelloPago; + public string Pago10_CEPRuta; + public string Pago10_NumeroOperacion; + + public class Pago10_Partida + { + public string IdDocumento; + public string Serie; + public string Folio; + public string MonedaDR; + public double TipoCambioDR; + public string MetodoDePagoDR; + public int NumParcialidad; + public double ImpSaldoAnt; + public double ImpPagado; + public double ImpSaldoInsoluto; + + //CFDI4 + public string ObjetoImpDR; + public double EquivalenciaDR; + //iva + public double RET_BASEDR; + public string RET_IMPUESTODR; + public string RET_TIPOFACTORDR; + public double RET_TASAOCUOTADR; + public double RET_IMPORTEDR; + public bool IVA_CERO = false; + public double IVA_CERO_CANT = 0; + + //ivaret + public double TRAS_BASEDR; + public string TRAS_IMPUESTODR; + public string TRAS_TIPOFACTORDR; + public double TRAS_TASAOCUOTADR; + public double TRAS_IMPORTEDR; + + //ISR + public double RET_BASEDR_1; + public string RET_IMPUESTODR_1; + public string RET_TIPOFACTORDR_1; + public double RET_TASAOCUOTADR_1; + public double RET_IMPORTEDR_1; + + } + public List Pago10_Partidas = new List(); + #endregion pago10 + + //cfdi relacionados + #region cfdi relacionados + //REXCOM + public string CfdiRelacionados_TipoRelacion; + public class CfdiRelacionado + { + public string UUID; + public string CfdiRelacionados_TipoRelacion; + } + + public List CfdiRelacionados = new List(); + #endregion cfdi relacionados + + //complemento notaria + #region complemento notaria + + public int ComplementoNotaria; + public string DescInmueble_TipoInmueble; + public string DescInmueble_Calle; + public string DescInmueble_NoExterior; + public string DescInmueble_NoInterior; + public string DescInmueble_Colonia; + public string DescInmueble_Localidad; + public string DescInmueble_Referencia; + public string DescInmueble_Municipio; + public string DescInmueble_Estado; + public string DescInmueble_Pais; + public string DescInmueble_CodigoPostal; + + public string DatosOperacion_NumInstrumentoNotarial; + public string DatosOperacion_FechaInstNotarial; + public double DatosOperacion_MontoOperacion; + public double DatosOperacion_Subtotal; + public double DatosOperacion_IVA; + + public string DatosNotario_CURP; + public string DatosNotario_NumNotaria; + public string DatosNotario_EntidadFederativa; + public string DatosNotario_Adscripcion; + + public string DatosEnajenante_CoproSocConyugalE; + + public string DatosUnEnajenante_Nombre; + public string DatosUnEnajenante_ApellidoPaterno; + public string DatosUnEnajenante_ApellidoMaterno; + public string DatosUnEnajenante_RFC; + public string DatosUnEnajenante_CURP; + + public class DatosCopSC + { + public string Nombre; + public string ApellidoPaterno; + public string ApellidoMaterno; + public string RFC; + public string CURP; + public double Porcentaje; + public string Figura; + public string Tipo; + } + public List DatosCop = new List(); + + public string DatosUnAdquiriente_Nombre; + public string DatosUnAdquiriente_ApellidoPaterno; + public string DatosUnAdquiriente_ApellidoMaterno; + public string DatosUnAdquiriente_RFC; + public string DatosUnAdquiriente_CURP; + + public string DatosAdquiriente_CoproSocConyugalE; + + #endregion complemento notaria + + //complemento comercio exterior + #region complemento comercio exterior + public bool ComercioExterior_Activo; + public string ComercioExterior_Emisor_Curp; + public string ComercioExterior_Emisor_Domicilio_Calle; + public string ComercioExterior_Emisor_Domicilio_NumeroExterior; + public string ComercioExterior_Emisor_Domicilio_NumeroInterior; + public string ComercioExterior_Emisor_Domicilio_Colonia; + public string ComercioExterior_Emisor_Domicilio_Localidad; + public string ComercioExterior_Emisor_Domicilio_Referencia; + public string ComercioExterior_Emisor_Domicilio_Municipio; + public string ComercioExterior_Emisor_Domicilio_Estado; + public string ComercioExterior_Emisor_Domicilio_Pais; + public string ComercioExterior_Emisor_Domicilio_CodigoPostal; + public string ComercioExterior_Propietario_NumRegIdTrib; + public string ComercioExterior_Propietario_ResidenciaFiscal; + public string ComercioExterior_Receptor_NumRegIdTrib; + public string ComercioExterior_Receptor_Domicilio_Calle; + public string ComercioExterior_Receptor_Domicilio_NumeroExterior; + public string ComercioExterior_Receptor_Domicilio_NumeroInterior; + public string ComercioExterior_Receptor_Domicilio_Colonia; + public string ComercioExterior_Receptor_Domicilio_Localidad; + public string ComercioExterior_Receptor_Domicilio_Referencia; + public string ComercioExterior_Receptor_Domicilio_Municipio; + public string ComercioExterior_Receptor_Domicilio_Estado; + public string ComercioExterior_Receptor_Domicilio_Pais; + public string ComercioExterior_Receptor_Domicilio_CodigoPostal; + public string ComercioExterior_Destinatario_NumRegIdTrib; + public string ComercioExterior_Destinatario_Nombre; + public string ComercioExterior_Destinatario_Domicilio_Calle; + public string ComercioExterior_Destinatario_Domicilio_NumeroExterior; + public string ComercioExterior_Destinatario_Domicilio_NumeroInterior; + public string ComercioExterior_Destinatario_Domicilio_Colonia; + public string ComercioExterior_Destinatario_Domicilio_Localidad; + public string ComercioExterior_Destinatario_Domicilio_Referencia; + public string ComercioExterior_Destinatario_Domicilio_Municipio; + public string ComercioExterior_Destinatario_Domicilio_Estado; + public string ComercioExterior_Destinatario_Domicilio_Pais; + public string ComercioExterior_Destinatario_Domicilio_CodigoPostal; + + public class ComercioExterior_Mercancias_Mercancia + { + public string NoIdentificacion; + public string FraccionArancelaria; + public double CantidadAduana; + public string UnidadAduana; + public double ValorUnitarioAduana; + public double ValorDolares; + public string DescripcionesEspecificas_Marca; + public string DescripcionesEspecificas_Modelo; + public string DescripcionesEspecificas_SubModelo; + public string DescripcionesEspecificas_NumeroSerie; + } + public List lisComercioExterior_Mercancias = new List(); + + public string ComercioExterior_Version; + public string ComercioExterior_MotivoTraslado; + public string ComercioExterior_TipoOperacion; + public string ComercioExterior_ClaveDePedimento; + public string ComercioExterior_CertificadoOrigen; + public string ComercioExterior_NumCertificadoOrigen; + public string ComercioExterior_NumeroExportadorConfiable; + public string ComercioExterior_Incoterm; + public string ComercioExterior_Subdivision; + public string ComercioExterior_Observaciones; + public double ComercioExterior_TipoCambioUSD; + public double ComercioExterior_TotalUSD; + #endregion complemento comercio exterior + + //complemento INE Delcaracion de Variables (1) + #region INE + public bool INE_Activo; + public string Comprobante_INE_TipoProceso; + public string Comprobante_INE_TipoComite; + public int Comprobante_INE_IdContabilidad; + #endregion INE + + //timbre fiscal + #region complemento timbrefiscal + public string Complemento_TimbreFiscalDigital_Version; + public string Complemento_TimbreFiscalDigital_UUID; + public string Complemento_TimbreFiscalDigital_FechaTimbrado; + public string Complemento_TimbreFiscalDigital_RfcProvCertif; + public string Complemento_TimbreFiscalDigital_SelloCFD; + public string Complemento_TimbreFiscalDigital_NoCertificadoSAT; + public string Complemento_TimbreFiscalDigital_SelloSAT; + public string Complemento_TimbreFiscalDigital_CadenaOriginalSAT; + #endregion complemento timbrefiscal + + //sql update + #region sql update + public string SQLUpdateTbl; + public string SQLUpdateTblKey; + public int SQLUpdateTblID; + public string SQLUpdateTblVal; + public class SQLCol + { + public string SQLNom; + public double SQLDob; + public string SQLStr; + public bool SQLFun; + } + public List SQLUpdate = new List(); + public string IsCancelable; + public string CancelStatus; + public string Status; + #endregion sql update + + #endregion declaraciones de variables + public class ApiResponseV2 + { + public bool Success { get; set; } + public string Message { get; set; } + public dynamic Data { get; set; } + public string Error { get; set; } + public dynamic Details { get; set; } + public bool IsError { get; set; } + } + public class class_ErroresSat + { + public string Code; + public string Desc; + } + public List ERRORESSAT = new List(); + + public void cargaErroresSAT() + { + + #region lista_erroresSAT + ERRORESSAT.Add(new class_ErroresSat + { + Code = "200", + Desc = "El proceso de cancelación se ha completado correctamente." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "211", + Desc = "La solicitud de cancelación del CFDI con folio fiscal se encuentra en proceso." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "500", + Desc = "Han ocurrido errores internos que han impedido que se registre la solicitud de cancelación, reintentar." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "501", + Desc = "Ha ocurrido un error interno de comunicación con la base de datos, reintentar." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "601", + Desc = "Error de autenticación,el nombre de usuario o contraseña son incorrectos." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "602", + Desc = "La cuenta de usuario se encuentra bloqueada." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "603", + Desc = "La contraseña de la cuenta ha expirado." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "604", + Desc = "Se ha superado el número máximo permitido de intentos fallidos de autenticación." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "605", + Desc = "El usuario se encuentra inactivo" + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "611", + Desc = "Los datos recibidos están incompletos o no se encuentran donde se esperarían." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "620", + Desc = "Permiso denegado." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "621", + Desc = "Formato o estructura de argumento no válida para el tipo de dato." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "630", + Desc = "La implementación no tiene folios disponibles." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "631", + Desc = "La cuenta del usuario no tiene timbres disponibles." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "633", + Desc = "Uso indebido de cuenta de producción en pruebas o cuenta de prueba en producción." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "640", + Desc = "Aplicación inactiva." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1701", + Desc = "La llave privada y la llave pública del CSD no corresponden." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1702", + Desc = "La llave privada de la contraseña es incorrecta." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1703", + Desc = "La llave privada no cumple con la estructura esperada." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1704", + Desc = "La llave Privada no es una llave RSA." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1710", + Desc = "La estructura del certificado no cumple con la estructura X509 esperada." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1711", + Desc = "El certificado no esá vigente todavía." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1712", + Desc = "El certificado ha expirado." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1713", + Desc = "La llave pública contenida en el certificado no es una llave RSA." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "300", + Desc = "Usuario No Válido." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "301", + Desc = "XML Mal Formado." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "302", + Desc = "Sello Mal Formado." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "304", + Desc = "Certificado Revocado o Caduco." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "305", + Desc = "Certificado Inválido." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "310", + Desc = "CSD Inválido." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1300", + Desc = "Autenticación no válida." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1301", + Desc = "XML mal formado." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1302", + Desc = "Estructura de folios no válida." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1303", + Desc = "Estructura de RFC no válida." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1304", + Desc = "Estructura de fecha no válida." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1305", + Desc = "Certificado no corresponde al emisor" + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1306", + Desc = "Certificado no vigente." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1307", + Desc = "Uso de FIEL no permitido." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1308", + Desc = "Certificado revocado o caduco." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1309", + Desc = "Firma mal formada o inválida." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1313", + Desc = "Solicitud fuera de la declaración anual." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1314", + Desc = "Relación no valida." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "201", + Desc = "Solicitud de cancelación recibida." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "202", + Desc = "Folio Fiscal Previamente Cancelado" + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "203", + Desc = "Folio Fiscal No Correspondiente al Emisor." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "204", + Desc = "Folio Fiscal No Aplicable a Cancelación." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "205", + Desc = "Folio Fiscal No Existente." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "206", + Desc = "UUID no corresponde a un CFDI del Sector Primario" + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "207", + Desc = "Folio sustitución Inválido." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "208", + Desc = "La Fecha de Solicitud de Cancelación es mayor a la fecha de declaración" + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "209", + Desc = "La Fecha de Solicitud de Cancelación límite para factura global" + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "310", + Desc = "CSD Inválido." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "311", + Desc = "Clave de motivo de cancelación no válida." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "312", + Desc = "UUID no relacionado de acuerdo a la clave de motivo de cancelación." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1201", + Desc = "Solicitud de cancelación recibida." + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1202", + Desc = "UUID Previamente cancelado" + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1203", + Desc = "UUID no corresponde con el emisor" + }); + ERRORESSAT.Add(new class_ErroresSat + { + Code = "1205", + Desc = "UUID No existe" + }); + #endregion lista_erroresSAT + } + + //inicializar componentes + #region cfdi33 inicializar + public frmCFDI() + { + InitializeComponent(); + } + #endregion cfdi33 inicializar + + public bool CheckEnvVar( bool pruebas, string DeviceToken) { + + + try { + + if (pruebas) + { + //si es pruebas + DeviceToken = System.Environment.GetEnvironmentVariable("DeviceToken", EnvironmentVariableTarget.User); + } + else { + DeviceToken = System.Environment.GetEnvironmentVariable("DeviceTokenProd", EnvironmentVariableTarget.User); + } + + return true; + } + catch(Exception e){ + //MessageBox.Show(e.Message.ToString()); + return false; + } + } + + public bool setEnvVar(bool pruebas , string DeviceToken) { + + try { + if (pruebas) + { + System.Environment.SetEnvironmentVariable("DeviceToken", DeviceToken, EnvironmentVariableTarget.User); + } + else { + System.Environment.SetEnvironmentVariable("DeviceTokenProd", DeviceToken, EnvironmentVariableTarget.User); + } + + return true; + } + catch (Exception e) { + //MessageBox.Show(e.Message.ToString()); + return false; + } + + } + + + + + + + + public bool setSettingVar(bool pruebas, string DeviceToken, out string exception) { + exception = string.Empty; + try { + if (pruebas) + { + Properties.Settings.Default.DeviceToken = DeviceToken; + } + else { + Properties.Settings.Default.DeviceTokenProd = DeviceToken; + } + Properties.Settings.Default.Save(); + return true; + } + catch (Exception e) { + exception = e.Message.ToString(); + + return false; + } + } + + public static void systemDownload( string GeneralURL, string ruta, string Token,bool PAW, string CFDIRfc, out string excep) { + excep = null; + + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + + + string url = string.Format("{0}", GeneralURL);// PAW ? "http://127.0.0.1:8000/sistemas/download_version_FromServer/?sys=Actualizador": "https://Aduanasoft.pythonanywhere.com/sistemas/download_version_FromServer/?sys=Actualizador"; + //string archivo = SysDir + "CFDI.zip"; + + try + { + + using (WebClient webclient = new WebClient()) { + webclient.Headers.Add("Authorization", Token); + webclient.DownloadFile(url, ruta); + + } + } + catch (Exception ex) { + excep = ex.Message.ToString(); + } + } + + public void GetPAC_from_server(string GeneralURL,string DRF_Token, string UUID , out string PAC, out string exception ) { + PAC = ""; + exception = ""; + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + using (WebClient webClient = new WebClient()) { + try + { + string prod = string.Format("{0}/cancela_timbre/", GeneralURL);//PAW ? "http://127.0.0.1:8000/cancela_timbre/" : "https://Aduanasoft.pythonanywhere.com/cancela_timbre/"; + string url = $"{prod}?uuid={UUID}"; + string Response = ""; + webClient.Headers[HttpRequestHeader.ContentType] = "application/json"; + webClient.Headers.Add("Authorization", DRF_Token); + + Response = webClient.DownloadString(url); + + ApiResponse res = JsonConvert.DeserializeObject(Response); + + PAC = string.IsNullOrEmpty(res.detail) ? res.rfcp : ""; + + exception = !string.IsNullOrEmpty(res.detail) ? res.detail : ""; + + } + catch (WebException ex) + { + + SysErrores = ex.Message.ToString(); + sys_mensaje_error($"AS_009: Errores en la cancelacion: {SysErrores}", 1); + sys_proceso_fin(SysErrores, 1); + } + } + } + + + + public bool CheckarVersion(string url, string Token, out string excep) { + try + { + excep = ""; + string exePath = Assembly.GetExecutingAssembly().Location; + FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(exePath); + string version = fileVersionInfo.FileVersion; + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + using (WebClient webClient = new WebClient()) { + + webClient.Headers[HttpRequestHeader.ContentType] = "application/json"; + webClient.Headers.Add("Authorization", Token); + var jsondata = new { version = version }; + var jsonString = JsonConvert.SerializeObject(jsondata); + string response = webClient.UploadString(url, "POST", jsonString); + ErrorCheck errors = JsonConvert.DeserializeObject(response); + if (errors.isError) + { + excep = errors.Error; + return false; + } + + dynamic responseJson = JsonConvert.DeserializeObject(response); + bool actaulizar = responseJson.actualizar; + if (actaulizar) { + return true; + } + } + return false; + } + catch (WebException e) { + //MessageBox.Show(string.Format("Error: {0}",e.Message.ToString())); + excep = e.Message.ToString(); + return false; + } + + } + + public bool ObtenerIP_MAC(out string macAddress, out string IPAddress, out string UserName, out string PC, out string OSversion ) { + macAddress = ""; + IPAddress = ""; + UserName = Environment.UserName; + PC = Environment.MachineName; + OSversion = Environment.OSVersion.ToString(); + + try + { + + //GET MAC address from device + foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) + { + if (nic.OperationalStatus == OperationalStatus.Up) + { + macAddress = nic.GetPhysicalAddress().ToString(); + break; + } + } + + // GET IP ADDRESS + IPHostEntry Host = default(IPHostEntry); + string Hostname = null; + Hostname = System.Environment.MachineName; + Host = Dns.GetHostEntry(Hostname); + foreach (IPAddress IP in Host.AddressList) + { + if (IP.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) IPAddress = Convert.ToString(IP); + } + return true; + } + catch (Exception e) + { + sys_mensaje_error(string.Format("Error: AS_002 {0}", e.Message.ToString()), 1); + return false; + } + + + } + + + public bool Checar_RFC(string rfc, out string exception) { + bool Todofine = false; + exception = string.Empty; + //MessageBox.Show($"CFDI { CFDIRfc.ToString().Trim()}, CFDIRfc.Length: {CFDIRfc.Length.ToString()}"); + if (CFDIRfc.Length < 12) + { + + + string RFCQuery = CFDISis == "cg2" ? "SELECT EMPRESARFC AS RFC FROM Configuracion" : "select RFC AS RFC from empresas where EMPRESADEFAULT=1"; + SqlConnection RFC_con = new SqlConnection(sql_conexion()); + try + { + + SqlCommand comm_RFC = new SqlCommand(RFCQuery, RFC_con); + comm_RFC.CommandTimeout = 30; + RFC_con.Open(); + SqlDataReader Reader_RFC = comm_RFC.ExecuteReader(); + if (Reader_RFC != null) + { + while (Reader_RFC.Read()) + { + //CFDIRfc = Reader_RFC["RFC"].ToString(); + Todofine = true; + } + if (!Todofine) + { + exception = "AS_008: No se encontro RFC "; + //sys_mensaje_error("AS_008: No se encontro RFC ", 1); + } + } + Reader_RFC.Close(); + Reader_RFC.Dispose(); + RFC_con.Close(); + } + catch (SqlException Ex) + { + RFC_con.Close(); + string strErr = sys_sql_error(Ex); + //sys_mensaje_error("Error AS_009: " + strErr, 1); + exception = $"Error AS_009: {strErr}"; + } + catch (Exception Ex) + { + if (RFC_con != null) + { + RFC_con.Close(); + } + //sys_mensaje_error($"Error AS_010: {Ex}", 1); + //exe_err(Ex, "Buscar RFC "); + + exception = $"Error AS_010: {Ex}"; + } + } + else { + Todofine = true; + } + return Todofine; + } + + + //descarga la lista de clientes autorizados para timbrar y descargar actualizaciones en caso de existir. + #region cfdi33 descargar clientes + public bool cfdi33_descargar_clientes() + { + + + //---VERIFICAR EL RFC DEL CLIENTE este completo + bool is_valid = Checar_RFC(CFDIRfc, out string exceptionRFC); + //MessageBox.Show($"{CFDIRfc}"); + if (!is_valid || !string.IsNullOrEmpty(exceptionRFC)) + { + sys_mensaje_error($"RFC NO VALIDO: {exceptionRFC}", 1); + // si no es true validar que no se tomó el token + return false; + } + + + //DRF_Token = "Token fb3219e68a394cbb7fad2a7786728a4a6542f425"; + check_cliente(GeneralURL,PAW, CFDIRfc, DRF_Token, CFDIRfc, out string excep2, out bool activo); + if (!string.IsNullOrEmpty(excep2) || !activo) + { + sys_mensaje_error(!string.IsNullOrEmpty(excep2) ? excep2 : "AS_001: Cliente no esta activo, comunicarse con Aduanasoft para aclarar situación", 1); + return false; + } + + + return true; + + + } + #endregion cfdi33 descargar clientes + + #region Prueba_conexion_SCAII + public bool conexionSCAII( string query, out string exceptMSN ) { + exceptMSN = string.Empty; + + ////this varables are empty for now, but will be assigned to a proper conection string + // en el metodo "cfdi33_parametros()" se toman los argumentos y se lenan las variables SCAII_ + string puerto = !string.IsNullOrEmpty(SCAII_SQLPor) ? ", " + SCAII_SQLPor : string.Empty; + string conexion_string = string.Empty; + + SCAII_SQLSrv = @"ASJUA-WEB05\SQLEXPRESS"; + SCAII_SQLDb = @"SCAII-SCAF-SQL"; + SCAII_SQLUsr = @"sa"; + SCAII_SQLPwd = @"Soluciones28"; + query = @"select GETDATE() "; + + //cadena de conexion + conexion_string = @"data source = " + SCAII_SQLSrv + puerto + "; initial catalog = " + SCAII_SQLDb + "; user id = " + SCAII_SQLUsr + "; password = " + SCAII_SQLPwd; + + SqlConnection SCAII_Conexion = new SqlConnection(conexion_string); + try + { + + sql_log("QuerySCAII", query); //this make a txt sql code query + SqlCommand command = new SqlCommand(query, SCAII_Conexion); + command.CommandTimeout = 30; + SCAII_Conexion.Open(); + + SqlDataReader readerSQL = command.ExecuteReader(); + if (readerSQL != null) + { + + while (readerSQL.Read()) + { + + + } + } + readerSQL.Close(); + readerSQL.Dispose(); + SCAII_Conexion.Close(); + } + catch (SqlException ex) + { + exceptMSN = ex.Message.ToString(); + SCAII_Conexion.Close(); + + return false; + } + catch (Exception ex) + { + exceptMSN = ex.Message.ToString(); + SCAII_Conexion.Close(); + return false; + } + + + + + return true; + } + #endregion Prueba_conexion_SCAII + + //int prueba conexion a sql + #region cfdi33 prueba sql + public bool cfdi33_prueba_sql() + { + //probar conexion a sql + bool bolSQLCon = false; + if (!string.IsNullOrEmpty(SQLSrv) && !string.IsNullOrEmpty(SQLDb)) + { + string strCon = sql_conexion(); + SqlConnection sqlcontst = new SqlConnection(strCon); + try + { + //abrir y cerrar la conexion + sqlcontst.Open(); + bolSQLCon = true; + sqlcontst.Close(); + } + catch (SqlException Ex) + { + sqlcontst.Close(); + sql_err(Ex, "PruSQL", strCon); + } + catch (Exception Ex) + { + if (sqlcontst != null) + { + sqlcontst.Close(); + } + exe_err(Ex, "PruSQL"); + } + } + return bolSQLCon; + } + #endregion cfdi33 prueba sql + + //guardar xml configuracion y conexion a sql + #region cfdi33 conexion xml + public void cfdi33_conexion_xml() + { + try + { + //guardar xml de conexión y configuración + string por = !String.IsNullOrEmpty(SQLPor) ? DESEncrypt(SQLPor) : string.Empty; + string mod = !String.IsNullOrEmpty(CFDIMod) ? DESEncrypt(CFDIMod) : string.Empty; + string pac = !String.IsNullOrEmpty(CFDIPac) ? DESEncrypt(CFDIPac) : string.Empty; + string ver = !String.IsNullOrEmpty(CFDIVer) ? DESEncrypt(CFDIVer) : string.Empty; + string rfc = !String.IsNullOrEmpty(CFDIRfc) ? DESEncrypt("_" + CFDIRfc + "_") : string.Empty; + string sis = !String.IsNullOrEmpty(CFDISis) ? DESEncrypt("_" + CFDISis + "_") : string.Empty; + string log = !String.IsNullOrEmpty(CFDILog) ? DESEncrypt((CFDILog)) : string.Empty; + + XElement sql = new XElement("sql"); + sql.Add(new XAttribute("server", DESEncrypt(SQLSrv))); + sql.Add(new XAttribute("database", DESEncrypt(SQLDb))); + sql.Add(new XAttribute("user", DESEncrypt(SQLUsr))); + sql.Add(new XAttribute("password", DESEncrypt(SQLPwd))); + sql.Add(new XAttribute("port", por)); + sql.Add(new XAttribute("modo", mod)); + sql.Add(new XAttribute("pac", pac)); + sql.Add(new XAttribute("ver", ver)); + sql.Add(new XAttribute("rfc", rfc)); + sql.Add(new XAttribute("sis", sis)); + sql.Add(new XAttribute("log", log)); + + sql.Add(new XAttribute("TrasladosDR",Count_TrasladosDR.Value )); + sql.Add(new XAttribute("TrasladosP", Count_TrasladosP.Value)); + + sys_arc(SysDir + "sql.xml"); + XDocument xml = new XDocument( + sql + ); + xml.Save(SysDir + "sql.xml"); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al guardar la configuración."); + exe_err(Ex, "SQL_XML_Sav"); + } + } + #endregion cfdi33 conexion xml + + + //1 + //inicio de la aplicacion + #region cfdi33 inicio + public void cfdi33_inicio() + { + /*variable que dice si las peticiones se hacen a produccion en + + Implementado + PAW =flase en default en declaracion, ---> aduanasoft.PythonAnyWhere.com + PAW=true -->asadmin.onrender.com + DRF_Token=null; en declaracion al salir de server_check se asigna segun servidor este online + */ + string except =string.Empty; + server_check(out PAW, out except, out DRF_Token, out GeneralURL); + if (!string.IsNullOrEmpty(except)) { + MessageBox.Show(except); + } + + //PAW =false; + // NEW Token Render "Token fb3219e68a394cbb7fad2a7786728a4a6542f425" + //DRF_Token = PAW == false ? "Token 3c347967cbb53ebb5c5ef72e867549b20614fe53" : "Token fb3219e68a394cbb7fad2a7786728a4a6542f425";//"Token 3c347967cbb53ebb5c5ef72e867549b20614fe53"; + + // en true es para poder observar los Devices en asadmin.onrender "nevas fucionalidades sin romper produccion con datos de produccion" + API_V2 = false; + + + string strDeb = string.Empty; + #if DEBUG + strDeb = " "; + SysDeb = true; + #else + SysDeb = false; + #endif + imglisAvance.Images.Add("sat", CFDI.Properties.Resources.SAT_logo); + imglisAvance.Images.Add("spinner", CFDI.Properties.Resources.spinner); + imglisAvance.Images.Add("error", CFDI.Properties.Resources._icono_error_140x140px); + imglisAvance.Images.Add("qr", CFDI.Properties.Resources._icono_timbrado_140x140px); + if (SysDir.IndexOf("C:\\Proyectos\\") < 0) + { + tbPruebas.Hide(); + } + else + { + //1.1 verifica el nombre del sistema que ejecuta bms_cli o cg2 + //ademas de la ruta del exe para su actualizacion (obsoleta ) + actualizador_xml(); + } + panels_hide(); + try + { + this.Text = this.Text + " | Ver. " + SysVer + strDeb; + lblPie.Text = lblPie.Text + " " + SysVer; + cmCTYear.Items.Add(DateTime.Now.Year); + cmCTYear.Items.Add(DateTime.Now.Year - 1); + bool bolAct = false; + bool bolLis = false; + //leer solo configuracion y pac + if (File.Exists(SysDir + "sql.xml")) + { + //1.2 + cfdi33_conexion_sql(); + } + + /// + /// Generar V2 + /// + + if (API_V2) { + + + ObtenerIP_MAC(out string _macAddress, out string IPAddress, out string UserName, out string PC, out string OSversion); + var deviceData = new + { + database = SQLDb, + ip_address = IPAddress, + device_os = OSversion, + device_name = PC, + client = CFDIRfc, + sistema = "CFDI", + macAddress = _macAddress + }; + + + bool success = RegisterDevice( + GeneralURL, + true, //pongo true para ejecutar en server test + DRF_Token, + deviceData, CFDIRfc, + out var errorMessage, + out var apiResponse + ); + + + //Si no es EXITOSA el registro o llamada + if (!success) + { + if (apiResponse.IsError) + { + Console.WriteLine($"Error: {apiResponse.Error}"); + + // Manejo específico para errores de validación + if (apiResponse.Details != null) + { + Console.WriteLine("Detalles del error:"); + Console.WriteLine(JsonConvert.SerializeObject(apiResponse.Details)); + } + } + else + { + Console.WriteLine($"Error en la conexión: {errorMessage}"); + } + } + else { + // Éxito - Procesar la respuesta + Console.WriteLine($"Éxito: {apiResponse.Message}"); + Console.WriteLine($"Token del dispositivo: {apiResponse.Data.token}"); + Console.WriteLine($"ID del dispositivo: {apiResponse.Data.device_id}"); + } + + } + ///////Fin API_V2 + + + bolLis = cfdi33_descargar_clientes(); + + if (bolLis) + { + //leer parametros linea de comandos + //1.3 + bolAct = cfdi33_parametros(); + //bolAct = false; + + if (bolAct) + { + //actualiza es una bool global que indica si se ejecuta el actualizador + //de lo contrario se mostro una excepcion al usuario y se cerrara el sistema + if (actualiza) { + Process.Start(fullpath, "FromCFDI"); + } + + Environment.Exit(1); + return; + } + + bool bolSQLCon = false; + if (ComprobanteDBCmd) + { + //leer conexion del ini que llama al sistema + //1.4 + bolSQLCon = cfdi33_ini_conexion(); + } + else + { + bolSQLCon = cfdi33_prueba_sql(); + } + + //si hay conexion + if (bolSQLCon) + { + if (!string.IsNullOrEmpty(ComprobanteDBTipoComprobante) && !string.IsNullOrEmpty(ComprobanteDBAplicacion) && ComprobanteDBSysId > 0) + { + if (CFDISis == "bms") + { + //1.5 + //copiar_actualizador(); + } + //2 + + sys_proceso_inicio(); + } + //proceso para detectar las operaciones de listas + else if (!string.IsNullOrEmpty(ComprobanteDBTipoComprobante) && !string.IsNullOrEmpty(ComprobanteDBAplicacion) && (ComprobanteDBOperacion == "lista_beta" || ComprobanteDBOperacion == "lista") && ComprobanteDBSysId == 0) + { + if (CFDISis == "bms") + { + //1.5 + //copiar_actualizador(); + } + //2 + sys_proceso_inicio(); + } + } + else + { + if (!File.Exists(SysDir + "sql.xml")) + { + sys_mensaje_error("No se ha configurado la conexión al servidor SQL.", 1); + sys_proceso_error("¡Error en configuración!"); + } + if (File.Exists(SysDir + "sql.xml") && !bolSQLCon) + { + sys_mensaje_error("No hay conexión al servidor SQL.", 2); + } + } + } + } + catch (Exception Ex) + { + MessageBox.Show("Ocurrio un error inesperado.", SysNombre + " - Error inesperado", MessageBoxButtons.OK, MessageBoxIcon.Error); + exe_err(Ex, "IneErr"); + } + + } + #endregion cfdi33 inicio + + //1.1 + //actualizador xml + #region actualizador xml + public void actualizador_xml(bool bolCfg = false) + { + try + { + if (File.Exists(SysDir + "act.xml")) + { + FileStream fsXml = new FileStream(SysDir + "act.xml", FileMode.Open); + XmlReader xmlReader = XmlReader.Create(fsXml); + + while (xmlReader.Read()) + { + if (xmlReader.HasAttributes) + { + string strNom = string.Empty; + string strRut = string.Empty; + while (xmlReader.MoveToNextAttribute()) + { + if (!string.IsNullOrEmpty(xmlReader.Value)) + { + switch (xmlReader.Name) + { + case "nom": + strNom = xmlReader.Value; + break; + case "rut": + strRut = xmlReader.Value; + break; + } + } + } + if (!string.IsNullOrEmpty(strNom)) + { + Actualizar.Add(new Actualiza + { + Nombre = strNom, + Ruta = strRut + }); + } + xmlReader.MoveToElement(); + } + } + fsXml.Close(); + } + } + catch (Exception Ex) + { + sys_mensaje_error("Error al leer algunos parametros de actualización."); + exe_err(Ex, "Lec_Act_XML"); + } + } + #endregion actualizador xml + + //1.2 + //string de conexion al servidor sql + #region cfdi33 conexion sql + public void cfdi33_conexion_sql(bool bolCfg = false) + { + try + { + if (File.Exists(SysDir + "sql.xml")) + { + //paramatertos de conexion al servidor sql + FileStream fsXml = new FileStream(SysDir + "sql.xml", FileMode.Open); + XmlReader xmlReader = XmlReader.Create(fsXml); + + // Lectura de todos los nodos del documento XML: + while (xmlReader.Read()) + { + // Comprueba que el elemento actual contenga atributos: + if (xmlReader.HasAttributes) + { + + while (xmlReader.MoveToNextAttribute()) + { + switch (xmlReader.Name) + { + case "server": + SQLSrv = !string.IsNullOrEmpty(xmlReader.Value) ? DESDecrypt(xmlReader.Value) : string.Empty; + + txtSQLSrv.Text = SQLSrv; + break; + case "database": + SQLDb = !string.IsNullOrEmpty(xmlReader.Value) ? DESDecrypt(xmlReader.Value) : string.Empty; + txtSQLDB.Text = SQLDb; + break; + case "user": + SQLUsr = !string.IsNullOrEmpty(xmlReader.Value) ? DESDecrypt(xmlReader.Value) : string.Empty; + txtSQLUsr.Text = SQLUsr; + break; + case "password": + SQLPwd = !string.IsNullOrEmpty(xmlReader.Value) ? DESDecrypt(xmlReader.Value) : string.Empty; + txtSQLPwd.Text = SQLPwd; + break; + case "port": + SQLPor = !string.IsNullOrEmpty(xmlReader.Value) ? DESDecrypt(xmlReader.Value) : string.Empty; + txtSQLPor.Text = SQLPor; + break; + case "modo": + CFDIMod = !string.IsNullOrEmpty(xmlReader.Value) ? DESDecrypt(xmlReader.Value) : string.Empty; + break; + case "pac": + CFDIPac = !string.IsNullOrEmpty(xmlReader.Value) ? DESDecrypt(xmlReader.Value) : string.Empty; + //CFDIPac = CFDIPac == "EdiCom" ? "ComDig" : "ComDig"; + break; + case "ver": + CFDIVer = !string.IsNullOrEmpty(xmlReader.Value) ? DESDecrypt(xmlReader.Value) : string.Empty; + break; + case "rfc": + CFDIRfc = !string.IsNullOrEmpty(xmlReader.Value) ? DESDecrypt(xmlReader.Value) : string.Empty; + + CFDIRfc = CFDIRfc.Replace("_", string.Empty); + break; + case "sis": + CFDISis = !string.IsNullOrEmpty(xmlReader.Value) ? DESDecrypt(xmlReader.Value) : string.Empty; + + CFDISis = CFDISis.Replace("_", string.Empty); + break; + case "log": + CFDILog = !string.IsNullOrEmpty(xmlReader.Value) ? DESDecrypt(xmlReader.Value) : string.Empty; + break; + case "TrasladosDR": + Count_TrasladosDR.Value= int.Parse(xmlReader.Value)!= 0 ? int.Parse(xmlReader.Value) : 2; + break; + case "TrasladosP": + Count_TrasladosP.Value = int.Parse(xmlReader.Value) != 0 ? int.Parse(xmlReader.Value) : 2; + break; + } + } + xmlReader.MoveToElement(); + } + } + fsXml.Close(); + if (CFDILog == "Act") + { + cbLogSQL.Checked = true; + } + if (CFDIMod == "Normal") + { + rbModoN.Checked = true; + } + if (CFDIMod == "Prueba") + { + rbModoP.Checked = true; + } + if (CFDIPac == "EdiCom") + { + rbPACED.Checked = true; + } + if (CFDIPac == "ComDig") + { + rbPACCD.Checked = true; + } + if (string.IsNullOrEmpty(CFDIVer)) + { + CFDIVer = "Rel"; + cfdi33_conexion_xml(); + } + if (CFDIVer == "Rel") + { + rbVerRel.Checked = true; + } + if (CFDIVer == "Deb") + { + rbVerDeb.Checked = true; + if (!SysDeb) + { + SysDeb = true; + } + } + } + } + catch (Exception Ex) + { + + exe_err(Ex, "Lec_SQL_XML"); + } + } + #endregion cfdi conexion sql + + /* + en este segmento se recorrera en el foreach dependiendo del numero de parametros que le haya mandado SM o CGII + */ + + + //this varables are empty for now, but will be assigned to a proper conection string for SCAII + string SCAII_SQLPor = string.Empty; + string SCAII_SQLSrv = string.Empty; + string SCAII_SQLDb = string.Empty; + string SCAII_SQLUsr = string.Empty; + string SCAII_SQLPwd = string.Empty; + + string SCAII_Operacion = string.Empty; + string SCAII_Consecutivo = string.Empty; + + //1.3 + //leer parametros de linea de comandos + #region cfdi33 parametros + public bool cfdi33_parametros() + { + + //limpiar variables + cfdi33_constructor(); + + //array con argumentos del cmd + String[] parametros = Environment.GetCommandLineArgs(); + + + + int intPar = 0; + bool no4 = false; + + SCAII_Operacion = parametros.Length > 11 ? parametros[11] : null; + SCAII_Consecutivo = parametros.Length > 12 ? parametros[12] : null; + + SCAII_SQLSrv = parametros.Length > 13 ? parametros[13] : null; + SCAII_SQLDb = parametros.Length > 14 ? parametros[14] : null; + SCAII_SQLUsr = parametros.Length > 15 ? parametros[15] : null; + SCAII_SQLPwd = parametros.Length > 16 ? parametros[16] : null; + SCAII_SQLPor = parametros.Length > 17 ? parametros[17] : null; + + foreach (string par in parametros) + { + if (intPar > 0) + { + SysCmd += par + " "; + } + switch (intPar) + { + case 1: + + ComprobanteDBTipoComprobante = par; + break; + case 2: + + ComprobanteDBAplicacion = par; + break; + case 3: + + int.TryParse(par, out ComprobanteDBSysId); + break; + case 4: + + ComprobanteDBOperacion = par; + break; + case 5: + + ComprobanteDBPwd = par; + break; + case 6: + if (par == "E") + { + CFDIPac = "EdiCom"; + } + else if (par == "C") + { + //mas abajo se valida esta variable + no4 = true; + } + ComprobanteDBIncUUID = par == "1" ? true : false; + break; + case 7: + ComprobanteDBIncFolio = par == "1" ? true : false; + break; + case 8: + + ComprobanteDBRFC = par; + break; + case 9: + + if (par == "CFDI4") + { + CFDI4 = par == "CFDI4" ? true : false; + } + else + { + if (par == "SIN_CP4") + { + CFDI4 = true; + } + //se usa SIN_CP en metodos posteriores, por eso se asigna manual + //aun que se recibe en arg con SIN_CP4 para activar CFDI 4.0 en service manager + Sin_CP = "SIN_CP"; + } + + break; + case 10: + + CFDIPac = par =="C" ? "ComDig":"EdiCom"; + //MessageBox.Show(string.Format("Configuracion del PAC por sistemas, {0}", CFDIPac)); + break; + case 11: + //Agregar validaciones para Anticipos AS + AnticiposAS = par =="AnticipoAS" ? true: false; + break; + } + intPar++; + } + + + //Asignar los datos de conexion de SCAII + + //MessageBox.Show("Operación\nTipCom " + ComprobanteDBTipoComprobante + "\nApp " + ComprobanteDBAplicacion + "\nSysId " + ComprobanteDBSysId + "\nOpe " + ComprobanteDBOperacion + "\nIncUUID " + ComprobanteDBIncUUID + "\nIncFolio " + ComprobanteDBIncFolio + "\nRFC " + ComprobanteDBRFC + "\npass " + ComprobanteDBPwd +"\nIncUUID "+ ComprobanteDBIncUUID +"\nIncFOl "+ ComprobanteDBIncFolio+"\nRFC "+ ComprobanteDBRFC +"\nCFDI4 "+ CFDI4 +"\nSIN_CP "+ Sin_CP); + ComprobanteDBTipoComprobante = ComprobanteDBTipoComprobante.ToLower() == "comprobante" ? "factura" : ComprobanteDBTipoComprobante; + ComprobanteDBOperacion = string.IsNullOrEmpty(ComprobanteDBOperacion) && ComprobanteDBSysId > 0 ? "timbrar" : ComprobanteDBOperacion; + if (intPar > 1) + { + ComprobanteDBCmd = true; + } + else + { + SysCmd = string.Empty; + SysDirOri = string.Empty; + } + + //mostrar forma + this.Show(); + + //traer al frente forma + this.BringToFront(); + //MessageBox.Show(no4.ToString()+" "+ CFDI4.ToString()); + if (no4) { + sys_mensaje_error("El PAC Comercio Digital no timbra en version 3.3"); + return true; + } + + //si regresa true el cfdi33_update(), manda llamar el actualizador + + if (cfdi33_update()) + { + + return true; + } + + + + if (ComprobanteDBSysId > 0) + { + ComprobanteDBOrigen = "cmd"; + if (string.IsNullOrEmpty(ComprobanteDBAplicacion)) + { + sys_mensaje_error("No especificó la aplicación de origen."); ; + } + else if (string.IsNullOrEmpty(ComprobanteDBTipoComprobante)) + { + sys_mensaje_error("No especificó un tipo de comprobante."); + } + } + if (intPar == 1 && !string.IsNullOrEmpty(ComprobanteDBTipoComprobante) && ComprobanteDBTipoComprobante.ToLower() != "cargar" && ComprobanteDBTipoComprobante.ToLower() != "contador") + { + sys_mensaje_error("No especificó un número de registro para el comprobante."); + } + return false; + } + #endregion cfdi parametros + + //1.3.1 + //buscar actualizacion de internet y descarga una nueva version del actualizador en caso de cambios. + #region cfdi33 actualizar + public bool cfdi33_update() + { + //devuelve falso si no se encontro actualizacion y viceversa + bool bolAct = true; + + + + //ChecarVersion CFDI en Server + string url = string.Format("{0}/sistemas/checkVersion/", GeneralURL);//PAW ? "http://127.0.0.1:8000/sistemas/checkVersion/" : "https://aduanasoft.pythonanywhere.com/sistemas/checkVersion/"; + + + + actualiza = CheckarVersion(url, DRF_Token, out string excep); + + if (!string.IsNullOrEmpty(excep)) + { + sys_mensaje_error(string.Format("{0}", excep)); + return true;//return true and actualiza equal to false for exit the CFDI + } + + if (actualiza) + { + try { + if (File.Exists(SysDir + "Actualizador.zip")) + { + File.Delete(SysDir + "Actualizador.zip"); + } + string zipFile = "Actualizador.zip"; + string cfdiPath = Assembly.GetExecutingAssembly().Location; + string exeDir = Path.GetDirectoryName(cfdiPath); + string zipPath = Path.Combine(exeDir, zipFile); + fullpath = Path.Combine(exeDir, "Actualizador.exe"); + systemDownload(GeneralURL,zipPath, DRF_Token, PAW, CFDIRfc, out string excepSystem); + + if (string.IsNullOrEmpty(excepSystem)) { + ZipFile zip = ZipFile.Read(SysDir + "Actualizador.zip"); + foreach (ZipEntry e in zip) { + e.Extract(SysDir, ExtractExistingFileAction.OverwriteSilently); + } + zip.Dispose(); + File.Delete(SysDir + "Actualizador.zip"); + } + + this.Hide(); + return true; + } + catch (Exception e) { + actualiza = false; + sys_mensaje_error(string.Format("Error al intentar actualizar CFDI {0}\n\n {1}, ", e.Message.ToString(), e.StackTrace.ToString() )); + return true;//return true and actualiza equal to false for exit the CFDI + } + } + + //be cause it's false it will not update + return actualiza; + + } + #endregion cfdi33 update + + //1.4 + //leer ini de conexion + #region cfdi33 ini conexion + public bool cfdi33_ini_conexion() + { + bool bolSQLCon = false; + string nomarc = string.Empty; + string nomsrv = string.Empty; + string nomdb = string.Empty; + string nompor = string.Empty; + string nomusr = string.Empty; + string nompwd = string.Empty; + + string valsrv = string.Empty; + string valdb = string.Empty; + string valpor = string.Empty; + string valusr = string.Empty; + string valpwd = string.Empty; + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + nomarc = "CuentaGastosII.ini"; + nomsrv = "Server="; + nomdb = "DatabaseName="; + nompor = "Port="; + nomusr = "UserName="; + nompwd = "Password="; + } + if (ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + nomarc = "myodbfm3.ini"; + nomsrv = "MSSQLServer="; + nomdb = "MSSQLDatabaseName="; + nompor = "MSSQLPort="; + nomusr = "MSSQLUserName="; + nompwd = "MSSQLPassword="; + } + string line; + try + { + if (File.Exists(SysDirOri + nomarc)) + { + System.IO.StreamReader file = new System.IO.StreamReader(SysDirOri + nomarc); + while ((line = file.ReadLine()) != null) + { + valsrv = line.IndexOf(nomsrv) == 0 && string.IsNullOrEmpty(valsrv) ? line.Replace(nomsrv, string.Empty) : valsrv; + valdb = line.IndexOf(nomdb) == 0 && string.IsNullOrEmpty(valdb) ? line.Replace(nomdb, string.Empty) : valdb; + valpor = line.IndexOf(nompor) == 0 && string.IsNullOrEmpty(valpor) ? line.Replace(nompor, string.Empty) : valpor; + valusr = line.IndexOf(nomusr) == 0 && string.IsNullOrEmpty(valusr) ? line.Replace(nomusr, string.Empty) : valusr; + valpwd = line.IndexOf(nompwd) == 0 && string.IsNullOrEmpty(valpwd) ? line.Replace(nompwd, string.Empty) : valpwd; + } + file.Close(); + valpwd = !string.IsNullOrEmpty(ComprobanteDBPwd) ? ComprobanteDBPwd : valpwd; + if (rbPACCD.Checked == false && rbPACED.Checked == false) + { + rbPACED.Checked = true; + CFDIPac = "ComDig"; + } + if (rbVerDeb.Checked == false && rbVerRel.Checked == false) + { + rbVerRel.Checked = true; + CFDIVer = "Rel"; + } + if (rbModoN.Checked == false && rbModoP.Checked == false) + { + string strRes = MessageBox.Show("¿Desea utilizar el sistema en Modo Real?\nLos comprobantes tendrán validez ante el SAT.", SysNombre, MessageBoxButtons.YesNo, MessageBoxIcon.Question).ToString(); + if (strRes == "Yes") + { + rbModoN.Checked = true; + CFDIMod = "Normal"; + } + else + { + rbModoP.Checked = true; + CFDIMod = "Prueba"; + } + pnConfiguracion.Refresh(); + } + SQLSrv = !string.IsNullOrEmpty(valsrv) && SQLSrv != valsrv ? valsrv : SQLSrv; + SQLDb = !string.IsNullOrEmpty(valdb) && SQLDb != valdb ? valdb : SQLDb; + SQLUsr = !string.IsNullOrEmpty(valusr) && SQLUsr != valusr ? valusr : SQLUsr; + SQLPwd = !string.IsNullOrEmpty(valpwd) && SQLPwd != valpwd && string.IsNullOrEmpty(ComprobanteDBPwd) ? valpwd : SQLPwd; + SQLPor = !string.IsNullOrEmpty(valpor) ? valpor : SQLPor; + SQLPor = SQLPor == "0" ? string.Empty : valpor; + bolSQLCon = cfdi33_prueba_sql(); + if (bolSQLCon) + { + txtSQLSrv.Text = SQLSrv; + txtSQLDB.Text = SQLDb; + txtSQLUsr.Text = SQLUsr; + txtSQLPwd.Text = SQLPwd; + txtSQLPor.Text = SQLPor; + pnConfiguracion.Refresh(); + cfdi33_conexion_xml(); + } + else + { + + sys_mensaje_error("No se logró conectar al servidor SQL con los parámetros del ini."); + } + } + if (!bolSQLCon) + { + if (File.Exists(SysDir + "sql.xml")) + { + cfdi33_conexion_sql(); + bolSQLCon = cfdi33_prueba_sql(); + } + } + } + catch (Exception Ex) + { + string strCurDir = Directory.GetCurrentDirectory() + @"\"; + if (strCurDir != SysDir) + { + sys_mensaje_error("Error al leer el ini de configuración. \n " + Ex); + } + exe_err(Ex, "LeeIni"); + } + return bolSQLCon; + } + #endregion cfdi33 ini conexion + + //1.5 + //copiar actualizador + #region copiar actualizador + public void copiar_actualizador(bool bolBor = false) + { + try + { + if (Environment.CurrentDirectory + "\\" != SysDir && File.Exists(Environment.CurrentDirectory + "\\Actualizador.exe")) + { + if (bolBor) + { + sys_arc(Environment.CurrentDirectory + "\\Actualizador.exe"); + } + if (!File.Exists(Environment.CurrentDirectory + "\\Actualizador.exe")) + { + File.Copy(SysDir + "Actualizador.exe", Environment.CurrentDirectory + "\\Actualizador.exe"); + } + } + } + catch (Exception Ex) + { + sys_mensaje_error("Error al copiar el actualizador del sistema."); + exe_err(Ex, "CpyAct"); + } + } + #endregion copiar actualizador + + //2 + //sys proceso inicio + #region sys proceso inicio + public void sys_proceso_inicio() + { + //mostrar loading + picLoad.Image = imglisAvance.Images["spinner"]; + sys_estatus("Leyendo datos..."); + rtbResultados.Text = string.Empty; + + if (ComprobanteDBOrigen == "cmd") + { + cfdi33_hilo(); + } + else + { + if (SysDeb) + { + cfdi33_operacion(); + } + else + { + cfdi33_hilo(); + } + } + } + #endregion sys proceso + + //2.1 + /* + aqui se llama a la operacion solicitada desde argumentos(parametros) + */ + //cfdi33 operacion + #region cfdi33 operacion + public void cfdi33_operacion() + { + + if (SysDeb && SysDir.IndexOf("C:\\Proyectos\\") >= 0) + { + + MessageBox.Show("Operación\nTipCom " + ComprobanteDBTipoComprobante + "\nApp " + ComprobanteDBAplicacion + "\nSysId " + ComprobanteDBSysId + "\nOpe " + ComprobanteDBOperacion + "\nIncUUID " + ComprobanteDBIncUUID + "\nIncFolio " + ComprobanteDBIncFolio + "\nRFC " + ComprobanteDBRFC + "\npass " + ComprobanteDBPwd + "\nIncUUID " + ComprobanteDBIncUUID + "\nIncFOl " + ComprobanteDBIncFolio + "\nRFC " + ComprobanteDBRFC + "\nCFDI4 " + CFDI4 + "\nSIN_CP " + Sin_CP+"\nPAC"+CFDIPac); + } + + //PAW = false; //si es false para produccion + if (ComprobanteDBOperacion=="cancelar_nuevo") { + //MessageBox.Show("tomar cancelacion"); + + } + if (CFDIPac == "EdiCom") + { + #region pwd pac + CFDIPacUsr = "SCT050708EB2"; + //CFDIPacPwd = "wwjrzykhi"; + CFDIPacPwd = "Soluciones28@"; + + #endregion pwd pac + } + else if (CFDIPac == "ComDig") + { + + #region pwd pac + + CFDIPacUsr = CFDIMod == "Prueba" ? "SCT050708AD1" : "SCT050708AD1"; + CFDIPacPwd = CFDIMod == "Prueba" ? "0dcu2SwCv" : "0dcu2SwCv"; + CFDIPacUrl = CFDIMod == "Prueba" ? "" : "ws.comercio-digital.mx"; + //mejorar el timpo de consulta de saldo para que no se haga mas de unas cuantas veces al dia + int saldo = get_saldo(CFDIPacUsr, CFDIPacPwd,CFDIRfc, out int result, out string lex); + string excep = string.Empty; + //cada 180 min (3 hrs) + if (CheckAndUpdateLastTime(minutesToCheck: 180)) + { + + set_saldo(GeneralURL, PAW, saldo, DRF_Token, CFDIRfc, out excep); + } + + if (!string.IsNullOrEmpty(excep)) + { + sys_mensaje_error(!string.IsNullOrEmpty(excep) ? excep : "Error PAC Comercio Digital Saldo", 1); + } + + if (saldo == 0) + { + sys_mensaje_error(!string.IsNullOrEmpty(lex) ? lex : "Error PAC ComDig: \\nCambiar PAC", 1); + } + + #endregion pwd pac + } + if (ComprobanteDBAplicacion.ToLower() != "cuentagastos" && ComprobanteDBAplicacion.ToLower() != "servicemanager") + { + if (!string.IsNullOrEmpty(ComprobanteDBAplicacion)) + { + sys_mensaje_error("La aplicación " + ComprobanteDBAplicacion + " no es válida.", 1); + } + else + { + sys_mensaje_error("No se especificó una aplicación de origen.", 1); + } + } + if (string.IsNullOrEmpty(SysErrores)) + { + string strSis = ComprobanteDBAplicacion.ToLower() == "servicemanager" ? "bms" : "cg2"; + if (strSis != CFDISis) + { + CFDISis = strSis; + cfdi33_conexion_xml(); + } + switch (ComprobanteDBOperacion.ToLower()) + { + case "timbrar": + //3.1 + cfdi33_timbrar(); + break; + case "cancelar": + CancelaNuevo = true; + //3.2 + cfdi33_cancelar(); + break; + case "cancelar_nuevo": + CancelaNuevo = true; + cfdi33_cancelar(); + break; + case "status": + cfdi33_recuperar(); + break; + case "recuperar": + //3.3 + cfdi33_recuperar(); + break; + case "xml": + //3.4 + cfdi33_cep(); + break; + case "lista": + //3.5 + if (ComprobanteDBSysId == 1) + { + cfdi33_ver_clientes(); + } + else + { + cfdi33_cargar_clientes(); + } + break; + case "lista_beta": + //3.5 + if (ComprobanteDBSysId == 1) + { + cfdi33_ver_clientes(true); + } + else + { + cfdi33_cargar_clientes(true); + } + break; + case "contador": + //3.6 + cfdi33_contador(); + break; + default: + if (!string.IsNullOrEmpty(ComprobanteDBOperacion)) + { + sys_mensaje_error("La operación " + ComprobanteDBOperacion + " no es válida.", 1); + } + else + { + sys_mensaje_error("No se especificó una operación.", 1); + } + break; + } + } + } + #endregion cfdi33 operacion + + //3.1 + //llenar datos para timbrar comprobante + #region cfdi33 timbrar + public void cfdi33_timbrar() + { + if (CFDIMod == "Prueba") + { + string resultado = MessageBox.Show("El sistema está en modo pruebas\nLos comprobantes no tienen validez.\nDesea continuar ?", SysNombre + " - Timbre No Valido", MessageBoxButtons.YesNo, MessageBoxIcon.Information).ToString(); + if (resultado != "Yes") + { + Environment.Exit(1); + return; + } + } + sys_estatus("Leyendo datos..."); + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + //3.1.1 a + queries_timbrar_cg2(); + } + if (ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + //3.1.1 b + queries_timbrar_bms(); + } + + if (!string.IsNullOrEmpty(SysQueryEncabezado) && !string.IsNullOrEmpty(SysQueryPartidas)) + { + if (ComprobanteDBTipoComprobante.ToLower() == "retencion") + { + + //3.1.2 a + cfdi33_timbrar_retencion_data(); + } + else + { + //3.1.2 b + cfdi33_timbrar_data(); + } + if (CFDIRfc != Emisor_Rfc && !string.IsNullOrEmpty(Emisor_Rfc)) + { + CFDIRfc = Emisor_Rfc; + cfdi33_conexion_xml(); + } + } + else + { + string strErrMen = string.Empty; + strErrMen = string.IsNullOrEmpty(SysQueryEncabezado) || string.IsNullOrEmpty(SysQueryPartidas) ? "No se especificó un tipo de comprobante valido." : strErrMen; + sys_mensaje_error(strErrMen, 1); + } + } + #endregion cfdi33 timbrar + + //3.1.1 a + //queries timbrar cuenta de gastos + #region queries timbrar cg2 + public void queries_timbrar_cg2() + { + //campos que no cambian con el tipo de comprobante + SysQueryEncabezado = @" +SELECT +ISNULL((SELECT TOP 1 LLAVEPUBLICACER FROM Configuracion), '') AS Certificado_Ruta, +ISNULL((SELECT TOP 1 LLAVEPRIVADAKEY FROM Configuracion), '') AS Key_Ruta, +ISNULL((SELECT TOP 1 CONTRASEÑALLAVEPRIVADA FROM Configuracion), '') AS Key_Clave, +ISNULL((SELECT TOP 1 NOCERTIFICADODIGITAL FROM Configuracion), '') AS Comprobante_NoCertificado, +ISNULL((SELECT TOP 1 RUTAFACTURASXML FROM Configuracion), '') AS ComprobanteDBRutaSalida, +ISNULL((SELECT TOP 1 RUTAENTRADAXML FROM Configuracion), '') AS ComprobanteDBRutaEntrada,"; + SysQueryPartidas = @" +SELECT "; + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + #region cg2 anticipo timbrar + if (CFDI4) { + SysQueryEncabezado += @" +ISNULL(cg2_ant.Exportacion, '') AS Exportacion, +ISNULL(cg2_ant.InfoGlo_Periodicidad, '') AS Periodicidad, +ISNULL(cg2_ant.InfoGlo_Meses, '') AS Meses, +ISNULL(cg2_ant.InfoGlo_Anio, '') AS Anio, +isnull((select codigopostal from clientes where clave = cg2_ant.cliente ),'') AS Receptor_DomicilioFiscal, +isnull((select CLAVEREGIMEN from clientes where clave = cg2_ant.cliente ),'') AS Receptor_RegimenFiscal, +"; + } + SysQueryEncabezado += @" +ISNULL(cg2_ant.REGIMENPAGO, '') AS Emisor_RegimenFiscal, +ISNULL(cg2_ant.RFCRECEPTOR, '') AS Receptor_Rfc, +ISNULL(cg2_ant.PAIS, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(cg2_ant.NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(cg2_ant.USOCFDI, '') AS Receptor_UsoCFDI,"; + if (CFDI4) { + SysQueryEncabezado += @" +(select isnull(EXPEDIDOEMPRESA,'') from Configuracion)AS Emisor_Nombre, +(select ISNULL(NOMBRECFDI40,'') from Clientes where clave = cg2_ant.cliente ) AS Receptor_Nombre,"; + } else { + SysQueryEncabezado += @" +CASE WHEN ISNULL(cg2_ant.EXPEDIDOEMPRESA, '') = '' THEN ISNULL(cg2_ant.EMPRESAEMISOR, '') ELSE ISNULL(cg2_ant.EXPEDIDOEMPRESA, '') END AS Emisor_Nombre, +ISNULL(cg2_ant.NOMBRERECEPTOR, '') AS Receptor_Nombre,"; + } + SysQueryEncabezado += @" +CASE WHEN ISNULL(cg2_ant.EXPEDIDORFC, '') = '' THEN ISNULL(cg2_ant.RFCEMISOR, '') ELSE ISNULL(cg2_ant.EXPEDIDORFC, '') END AS Emisor_Rfc, +CASE WHEN ISNULL(cg2_ant.EXPEDIDOCP, '') = '' THEN ISNULL(cg2_ant.CPEMISOR, '') ELSE ISNULL(cg2_ant.EXPEDIDOCP, '') END AS Comprobante_LugarExpedicion, +ISNULL(cg2_ant.TIPOCOMPROBANTECLAVE, '') AS Comprobante_TipoDeComprobante, +ISNULL(cg2_ant.FORMAPAGOCLAVE, '') AS Comprobante_FormaPago, +ISNULL(cg2_ant.METODOPAGOCLAVE, '') AS Comprobante_MetodoPago, +ISNULL(cg2_ant.SERIEANTICIPOS, '') AS Comprobante_Serie, +ISNULL(cg2_ant.FOLIOANTICIPOS, '') AS Comprobante_Folio, +ISNULL(cg2_ant.TOTAL, 0) AS Comprobante_Total, +ISNULL(cg2_ant.TIPOCAMBIO, 0) AS Comprobante_TipoCambio, +ISNULL(cg2_ant.SUBTOTAL, 0) AS Comprobante_SubTotal, +ISNULL(cg2_ant.Moneda, '') AS Comprobante_Moneda, +ISNULL(cg2_ant.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_ant.ESTATUS, '') AS Comprobante_Estatus, +0 AS Comprobante_Descuento, +CASE WHEN ISNULL(cg2_ant.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_ant.IVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(cg2_ant.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_ant.IVAPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje, +CASE WHEN ISNULL(cg2_ant.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_ant.IVARETENIDO, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenido, +CASE WHEN ISNULL(cg2_ant.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_ant.IVARETENIDOPOR, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenidoPorcentaje, +CASE WHEN ISNULL(cg2_ant.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_ant.ISR, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISR, +CASE WHEN ISNULL(cg2_ant.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_ant.ISRPOR, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISRPorcentaje +FROM Anticipos AS cg2_ant +WHERE cg2_ant.SYSID = " + ComprobanteDBSysId; + if (CFDI4) { + SysQueryPartidas += @" +ISNULL(cg2_ant.OBJETOIMPUESTO,'') AS ObjetoImp, +ISNULL(cg2_antdet.RFCACUENTATERCEROS,'') AS RFC_Terceros, +ISNULL(cg2_antdet.NOMBREACUENTATERCEROS,'') AS Nombre_Terceros, +ISNULL(cg2_antdet.RegimenFiscalACuentaTerceros,'') AS Regimen_Terceros, +ISNULL(cg2_antdet.DomicilioFiscalACuentaTerceros,'') AS Domicilio_Terceros, +"; + } + + SysQueryPartidas += @" +ISNULL(cg2_ant.OBJETOIMPUESTO,'') AS ObjetoImp, +ISNULL(cg2_antdet.RFCACUENTATERCEROS,'') AS RFC_Terceros, +ISNULL(cg2_antdet.NOMBREACUENTATERCEROS,'') AS Nombre_Terceros, +ISNULL(cg2_antdet.RegimenFiscalACuentaTerceros,'') AS Regimen_Terceros, +ISNULL(cg2_antdet.DomicilioFiscalACuentaTerceros,'') AS Domicilio_Terceros, + +case when cg2_ant.TIPO = 'P' then ISNULL(cg2_antdet.PRODUCTOCLAVE, '') when cg2_ant.TIPO = 'C' then '84111506' end AS ClaveProdServ, +'' AS NoIdentificacion, +case when cg2_ant.TIPO = 'P' then ISNULL(cg2_antdet.CANTIDAD, 0) when cg2_ant.TIPO = 'C' then '1' end AS Cantidad, +case when cg2_ant.TIPO = 'P' then ISNULL(cg2_antdet.UNIDADMEDIDACLAVE, '') when cg2_ant.TIPO = 'C' then 'ACT' end AS ClaveUnidad, +'' AS Unidad, +case when cg2_ant.TIPO = 'P' then ISNULL(cg2_antdet.DESCRIPCION, '') when cg2_ant.TIPO = 'C' then 'Anticipo del bien o servicio' end AS Descripcion, +0 AS Descuento, +case when cg2_ant.TIPO = 'P' then ISNULL(cg2_antdet.PRECIOUNITARIO, 0) when cg2_ant.TIPO = 'C' then ISNULL(cg2_ant.SUBTOTAL,0) end AS ValorUnitario, +case when cg2_ant.TIPO = 'P' then ISNULL(cg2_antdet.IMPORTE, 0)when cg2_ant.TIPO = 'C' then ISNULL(cg2_ant.SUBTOTAL,0) end AS Importe, + +case when cg2_ant.TIPO = 'P' then (CASE WHEN ISNULL(cg2_antdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antdet.IVA, 0) AS VARCHAR(100)) END ) when cg2_ant.TIPO = 'C' then ISNULL(cg2_ant.IVA, 0) end AS PartidaIVA, +case when cg2_ant.TIPO = 'P' then (CASE WHEN ISNULL(cg2_antdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antdet.IVAPOR, 0) AS VARCHAR(100)) END ) when cg2_ant.TIPO = 'C' then (case when ISNULL(cg2_ant.IVAPORCENTAJE, 0) = 0 then 'NA' else CAST(ISNULL(cg2_ant.IVAPORCENTAJE, 0) AS VARCHAR(100)) end ) end AS PartidaIVAPorcentaje, + +case when cg2_ant.TIPO = 'P' then ( CASE WHEN ISNULL(cg2_antdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antdet.IVARETENIDO, 0) AS VARCHAR(100)) END ) when cg2_ant.TIPO = 'C' then (case when ISNULL(cg2_ant.IVARETENIDO,0) = 0 then 'NA' else CAST(ISNULL(cg2_ant.IVARETENIDO,0) AS VARCHAR(100)) end ) end AS PartidaIVARetenido, +case when cg2_ant.TIPO = 'P' then ( CASE WHEN ISNULL(cg2_antdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antdet.IVARETPOR, 0) AS VARCHAR(100)) END ) when cg2_ant.TIPO = 'C' then (case when ISNULL(cg2_ant.IVARETENIDOPOR, 0) = 0 then 'NA' else CAST(ISNULL(cg2_ant.IVARETENIDOPOR, 0) AS VARCHAR(100)) end ) end AS PartidaIVARetenidoPorcentaje, + +case when cg2_ant.TIPO = 'P' then ( CASE WHEN ISNULL(cg2_antdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antdet.ISR, 0) AS VARCHAR(100)) END ) when cg2_ant.TIPO = 'C' then (case when ISNULL(cg2_ant.ISR, 0) = 0 then 'NA' else CAST(ISNULL(cg2_ant.ISR, 0) AS VARCHAR(100)) end ) end AS PartidaISR, +case when cg2_ant.TIPO = 'P' then ( CASE WHEN ISNULL(cg2_antdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antdet.ISRPOR, 0) AS VARCHAR(100)) END ) when cg2_ant.TIPO = 'C' then (case when ISNULL(cg2_ant.ISRPOR, 0) = 0 then 'NA' else CAST(ISNULL(cg2_ant.ISRPOR, 0) AS VARCHAR(100)) end ) end AS PartidaISRPorcentaje +FROM Anticipos cg2_ant +left join AnticipoDetalles cg2_antdet on cg2_antdet.ANTICIPOSYSID = cg2_ant.SYSID +WHERE cg2_ant.SYSID = " + ComprobanteDBSysId + " ORDER BY cg2_antdet.LINEA"; + + #endregion cg2 anticipo timbrar + break; + case "anticipo_egreso": + #region cg2 anticipo egreso timbrar + if (CFDI4) { + SysQueryEncabezado += @" +ISNULL(cg2_antegr.Exportacion, '') AS Exportacion, +ISNULL(cg2_antegr.InfoGlo_Periodicidad, '') AS Periodicidad, +ISNULL(cg2_antegr.InfoGlo_Meses, '') AS Meses, +ISNULL(cg2_antegr.InfoGlo_Anio, '') AS Anio, +isnull((select codigopostal from clientes where clave = cg2_antegr.cliente ),'') AS Receptor_DomicilioFiscal, +isnull((select CLAVEREGIMEN from clientes where clave = cg2_antegr.cliente ),'') AS Receptor_RegimenFiscal,"; + } + SysQueryEncabezado += @" +ISNULL(cg2_antegr.REGIMENPAGO, '') AS Emisor_RegimenFiscal, +ISNULL(cg2_antegr.RFCRECEPTOR, '') AS Receptor_Rfc, +ISNULL(cg2_antegr.PAIS, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(cg2_antegr.NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(cg2_antegr.USOCFDI, '') AS Receptor_UsoCFDI,"; + + if (CFDI4) { + SysQueryEncabezado += @" +(select ISNULL(NOMBRECFDI40, '') from Clientes where clave = cg2_antegr.cliente ) AS Receptor_Nombre, +(select isnull(EXPEDIDOEMPRESA,'') from Configuracion)AS Emisor_Nombre, +"; + } + else { + SysQueryEncabezado += @" +ISNULL(cg2_antegr.NOMBRERECEPTOR, '') AS Receptor_Nombre, +CASE WHEN ISNULL(cg2_antegr.EXPEDIDOEMPRESA, '') = '' THEN ISNULL(cg2_antegr.EMPRESAEMISOR, '') ELSE ISNULL(cg2_antegr.EXPEDIDOEMPRESA, '') END AS Emisor_Nombre, +"; + } + + SysQueryEncabezado += @" +CASE WHEN ISNULL(cg2_antegr.EXPEDIDORFC, '') = '' THEN ISNULL(cg2_antegr.RFCEMISOR, '') ELSE ISNULL(cg2_antegr.EXPEDIDORFC, '') END AS Emisor_Rfc, +CASE WHEN ISNULL(cg2_antegr.EXPEDIDOCP, '') = '' THEN ISNULL(cg2_antegr.CPEMISOR, '') ELSE ISNULL(cg2_antegr.EXPEDIDOCP, '') END AS Comprobante_LugarExpedicion, +'E' AS Comprobante_TipoDeComprobante, +'30' AS Comprobante_FormaPago, +ISNULL(cg2_antegr.METODOPAGOCLAVE, '') AS Comprobante_MetodoPago, +ISNULL(cg2_antegr.SERIEANTICIPOS, '') AS Comprobante_Serie, +ISNULL(cg2_antegr.FOLIOANTICIPOS, '') AS Comprobante_Folio, +ISNULL(cg2_antegrdet.TOTAL, 0) AS Comprobante_Total, +ISNULL(cg2_antegr.TIPOCAMBIO, 0) AS Comprobante_TipoCambio, +ISNULL(cg2_antegrdet.SUBTOTAL, 0) AS Comprobante_SubTotal, +ISNULL(cg2_antegr.Moneda, '') AS Comprobante_Moneda, +ISNULL(cg2_antegrdet.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_antegrdet.ESTATUS, '') AS Comprobante_Estatus, +0 AS Comprobante_Descuento, +CASE WHEN ISNULL(cg2_antegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.IVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(cg2_antegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.IVAPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje, +CASE WHEN ISNULL(cg2_antegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.IVARETENIDO, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenido, +CASE WHEN ISNULL(cg2_antegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.IVARETENIDOPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenidoPorcentaje, +CASE WHEN ISNULL(cg2_antegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.ISR, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISR, +CASE WHEN ISNULL(cg2_antegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.ISRPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISRPorcentaje, +ISNULL(cg2_antegr.ESTATUS, '') AS Comprobante_EstatusIngreso +FROM Anticipos AS cg2_antegr +INNER JOIN Anticipos_Egresos_Detalles AS cg2_antegrdet ON cg2_antegrdet.ANTICIPOSYSID = cg2_antegr.SYSID +WHERE cg2_antegrdet.CONSECUTIVO = " + ComprobanteDBSysId; + + if (CFDI4) { + SysQueryPartidas += @" +ISNULL(cg2_antegrdet.OBJETOIMPUESTO,'') AS ObjetoImp, +ISNULL(cg2_antegrdet.RFCACUENTATERCEROS,'') AS RFC_Terceros, +ISNULL(cg2_antegrdet.NOMBREACUENTATERCEROS,'') AS Nombre_Terceros, +ISNULL(cg2_antegrdet.RegimenFiscalACuentaTerceros,'') AS Regimen_Terceros, +ISNULL(cg2_antegrdet.DomicilioFiscalACuentaTerceros,'') AS Domicilio_Terceros, +"; + } + + SysQueryPartidas += @" +ISNULL(cg2_antegrdet.PRODUCTOCLAVE, '') AS ClaveProdServ, +'' AS NoIdentificacion, +ISNULL(cg2_antegrdet.CANTIDAD, 0) AS Cantidad, +ISNULL(cg2_antegrdet.UNIDADMEDIDACLAVE, '') AS ClaveUnidad, +'' AS Unidad, +ISNULL(cg2_antegrdet.DESCRIPCION, '') AS Descripcion, +0 AS Descuento, +ISNULL(cg2_antegrdet.VALORUNITARIO, 0) AS ValorUnitario, +ISNULL(cg2_antegrdet.IMPORTE, 0) AS Importe, +CASE WHEN ISNULL(cg2_antegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.IVA, 0) AS VARCHAR(100)) END AS PartidaIVA, +CASE WHEN ISNULL(cg2_antegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.IVAPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVAPorcentaje, +CASE WHEN ISNULL(cg2_antegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.IVARETENIDO, 0) AS VARCHAR(100)) END AS PartidaIVARetenido, +CASE WHEN ISNULL(cg2_antegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.IVARETENIDOPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVARetenidoPorcentaje, +CASE WHEN ISNULL(cg2_antegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.ISR, 0) AS VARCHAR(100)) END AS PartidaISR, +CASE WHEN ISNULL(cg2_antegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_antegrdet.ISRPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaISRPorcentaje +FROM Anticipos_Egresos_Detalles AS cg2_antegrdet +WHERE cg2_antegrdet.CONSECUTIVO = " + ComprobanteDBSysId + " ORDER BY cg2_antegrdet.LINEA"; + SysQueryRelacionados = @" +SELECT +ISNULL(cg2_antegr.UUIDTIMBRADO, '') AS UUID +FROM Anticipos AS cg2_antegr +--INNER JOIN AnticiposAplicacion AS cg2_antegr_apl ON cg2_antegr.SYSID = cg2_antegr_apl.ANTICIPOSYSID +--INNER JOIN Facturas AS cg2_fac ON cg2_antegr_apl.FACTURA = cg2_fac.FACTURA +INNER JOIN Anticipos_Egresos_Detalles AS cg2_antegrdet ON cg2_antegrdet.ANTICIPOSYSID = cg2_antegr.SYSID +WHERE cg2_antegrdet.CONSECUTIVO = " + ComprobanteDBSysId; + #endregion cg2 anticipo egreso timbrar + break; + case "factura": + #region cg2 factura timbrar + //clave cliente + SysQueryEncabezado += @" +ISNULL(cg2_fac.ADUANA, '-') + ISNULL(cg2_fac.PATENTE, '-') + ISNULL(cg2_fac.PEDIMENTO, '-') AS ConfigFacturaSufijo, +ISNULL((SELECT TOP 1 NOM_FACELEC FROM Configuracion), '') AS ConfigFacturaNombre, +ISNULL(cg2_fac.CLIENTE, '') AS ConfigClienteClave, +ISNULL(cg2_fac.TIPOFACTURA, '') AS ConfigFacturaTipo, +ISNULL(cg2_fac.TIPOPEDIMENTO, '') AS ConfigPedimentoTipo,"; + SysQueryComercioExterior = @" +SELECT +ISNULL(cg2_fac.CE_Curp_Emisor, '') AS ComercioExterior_Emisor_Curp, +ISNULL(cg2_fac.CE_Calle_Emisor_Domicilio, '') AS ComercioExterior_Emisor_Domicilio_Calle, +ISNULL(cg2_fac.CE_NumeroExterior_Emisor_Domicilio, '') AS ComercioExterior_Emisor_Domicilio_NumeroExterior, +ISNULL(cg2_fac.CE_NumeroInterior_Emisor_Domicilio, '') AS ComercioExterior_Emisor_Domicilio_NumeroInterior, +ISNULL(cg2_fac.CE_Colonia_Emisor_Domicilio, '') AS ComercioExterior_Emisor_Domicilio_Colonia, +ISNULL(cg2_fac.CE_Localidad_Emisor_Domicilio, '') AS ComercioExterior_Emisor_Domicilio_Localidad, +ISNULL(cg2_fac.CE_Referencia_Emisor_Domicilio, '') AS ComercioExterior_Emisor_Domicilio_Referencia, +ISNULL(cg2_fac.CE_Municipio_Emisor_Domicilio, '') AS ComercioExterior_Emisor_Domicilio_Municipio, +ISNULL(cg2_fac.CE_Estado_Emisor_Domicilio, '') AS ComercioExterior_Emisor_Domicilio_Estado, +ISNULL(cg2_fac.CE_Pais_Emisor_Domicilio, '') AS ComercioExterior_Emisor_Domicilio_Pais, +ISNULL(cg2_fac.CE_CodigoPostal_Emisor_Domicilio, '') AS ComercioExterior_Emisor_Domicilio_CodigoPostal, +ISNULL(cg2_fac.CE_NumRegIdTrib_Propietario, '') AS ComercioExterior_Propietario_NumRegIdTrib, +ISNULL(cg2_fac.CE_ResidenciaFiscal_Propietario, '') AS ComercioExterior_Propietario_ResidenciaFiscal, +ISNULL(cg2_fac.CE_NumRegIdTrib_Receptor_Domicilio, '') AS ComercioExterior_Receptor_NumRegIdTrib, +ISNULL(cg2_fac.CE_Calle_Receptor_Domicilio, '') AS ComercioExterior_Receptor_Domicilio_Calle, +ISNULL(cg2_fac.CE_NumeroExterior_Receptor_Domicilio, '') AS ComercioExterior_Receptor_Domicilio_NumeroExterior, +ISNULL(cg2_fac.CE_NumeroInterior_Receptor_Domicilio, '') AS ComercioExterior_Receptor_Domicilio_NumeroInterior, +ISNULL(cg2_fac.CE_Colonia_Receptor_Domicilio, '') AS ComercioExterior_Receptor_Domicilio_Colonia, +ISNULL(cg2_fac.CE_Localidad_Receptor_Domicilio, '') AS ComercioExterior_Receptor_Domicilio_Localidad, +ISNULL(cg2_fac.CE_Referencia_Receptor_Domicilio, '') AS ComercioExterior_Receptor_Domicilio_Referencia, +ISNULL(cg2_fac.CE_Municipio_Receptor_Domicilio, '') AS ComercioExterior_Receptor_Domicilio_Municipio, +ISNULL(cg2_fac.CE_Estado_Receptor_Domicilio, '') AS ComercioExterior_Receptor_Domicilio_Estado, +ISNULL(cg2_fac.CE_Pais_Receptor_Domicilio, '') AS ComercioExterior_Receptor_Domicilio_Pais, +ISNULL(cg2_fac.CE_CodigoPostal_Receptor_Domicilio, '') AS ComercioExterior_Receptor_Domicilio_CodigoPostal, +ISNULL(cg2_fac.CE_NumRegIdTrib_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_NumRegIdTrib, +ISNULL(cg2_fac.CE_Nombre_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_Nombre, +ISNULL(cg2_fac.CE_Calle_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_Domicilio_Calle, +ISNULL(cg2_fac.CE_NumeroExterior_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_Domicilio_NumeroExterior, +ISNULL(cg2_fac.CE_NumeroInterior_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_Domicilio_NumeroInterior, +ISNULL(cg2_fac.CE_Colonia_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_Domicilio_Colonia, +ISNULL(cg2_fac.CE_Localidad_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_Domicilio_Localidad, +ISNULL(cg2_fac.CE_Referencia_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_Domicilio_Referencia, +ISNULL(cg2_fac.CE_Municipio_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_Domicilio_Municipio, +ISNULL(cg2_fac.CE_Estado_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_Domicilio_Estado, +ISNULL(cg2_fac.CE_Pais_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_Domicilio_Pais, +ISNULL(cg2_fac.CE_CodigoPostal_Destinatario_Domicilio, '') AS ComercioExterior_Destinatario_Domicilio_CodigoPostal, +ISNULL(cg2_fac.CE_Version, '') AS ComercioExterior_Version, +ISNULL(cg2_fac.CE_MotivoTraslado, '') AS ComercioExterior_MotivoTraslado, +ISNULL(cg2_fac.CE_TipoOperacion, '') AS ComercioExterior_TipoOperacion, +ISNULL(cg2_fac.CE_ClaveDePedimento, '') AS ComercioExterior_ClaveDePedimento, +ISNULL(cg2_fac.CE_CertificadoOrigen, '') AS ComercioExterior_CertificadoOrigen, +ISNULL(cg2_fac.CE_NumCertificadoOrigen, '') AS ComercioExterior_NumCertificadoOrigen, +ISNULL(cg2_fac.CE_NumeroExportadorConfiable, '') AS ComercioExterior_NumeroExportadorConfiable, +ISNULL(cg2_fac.CE_Incoterm, '') AS ComercioExterior_Incoterm, +ISNULL(cg2_fac.CE_Subdivision, '') AS ComercioExterior_Subdivision, +ISNULL(cg2_fac.CE_Observaciones, '') AS ComercioExterior_Observaciones, +ISNULL(cg2_fac.CE_TotalUSD, 0) AS ComercioExterior_TotalUSD +FROM FacturaComercioExterior AS cg2_fac +WHERE cg2_fac.CUENTAGASTOS = " + ComprobanteDBSysId; + + if (CFDI4) + { + SysQueryEncabezado += @" +ISNULL(FACTURACIONGLOBAL,0) AS ES_GLOBAL, +isnull(cg2_fac.Exportacion,'') AS Exportacion, +ISNULL(cg2_fac.INFOGLO_PERIODICIDAD,'') AS Periodicidad, +ISNULL(cg2_fac.INFOGLO_MESES,'') AS Meses, +ISNULL(cg2_fac.INFOGLO_ANIO,'') AS Anio, +isnull((select codigopostal from clientes where clave = cg2_fac.cliente ),'') AS Receptor_DomicilioFiscal, +isnull((select CLAVEREGIMEN from clientes where clave = cg2_fac.cliente ),'') AS Receptor_RegimenFiscal, +"; + } + + + SysQueryEncabezado += @" +ISNULL(cg2_fac.ACTIVARCOMERCIOEXTERIOR, 0) AS ComercioExterior_Activo, +ISNULL(cg2_fac.CFDI33_Cmpto_3eros,0) AS Complemento_Terceros, +ISNULL(cg2_fac.REGIMENFISCALCLAVE, '') AS Emisor_RegimenFiscal, + +ISNULL(cg2_fac.RFCCLI, '') AS Receptor_Rfc, +ISNULL(cg2_fac.PAISCLI, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(cg2_fac.NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(cg2_fac.USOCFDI, '') AS Receptor_UsoCFDI, +"; + + if (CFDI4) { + SysQueryEncabezado += @" +(select isnull(EXPEDIDOEMPRESA,'') from Configuracion)AS Emisor_Nombre, +(select ISNULL(NOMBRECFDI40,'') from Clientes where clave = cg2_fac.cliente ) AS Receptor_Nombre, +"; + } else { + SysQueryEncabezado += @" +ISNULL(cg2_fac.NOMBRECLI, '') AS Receptor_Nombre, +CASE WHEN ISNULL(cg2_fac.EXPEDIDOEMPRESA, '') = '' THEN ISNULL(cg2_fac.EMPRESA, '') ELSE ISNULL(cg2_fac.EXPEDIDOEMPRESA, '') END AS Emisor_Nombre, +"; + } + SysQueryEncabezado += @" +ISNULL(cg2_fac.EmpresaRFC, '') AS Emisor_Rfc, +CASE WHEN ISNULL(cg2_fac.EXPEDIDOCP, '') = '' THEN ISNULL(cg2_fac.CodigoPostal, '') ELSE ISNULL(cg2_fac.EXPEDIDOCP, '') END AS Comprobante_LugarExpedicion, +ISNULL(cg2_fac.TIPOCOMPROBANTECLAVE, '') AS Comprobante_TipoDeComprobante, +ISNULL(cg2_fac.FORMAPAGO, '') AS Comprobante_FormaPago, +ISNULL(cg2_fac.METODOPAGOCLAVE, '') AS Comprobante_MetodoPago, +ISNULL(cg2_fac.SERIE, '') AS Comprobante_Serie, +ISNULL(cg2_fac.FOLIO, '') AS Comprobante_Folio, +ISNULL(cg2_fac.TOTAL_INGRESOS, 0) AS Comprobante_Total, +ISNULL(cg2_fac.TIPOCAMBIO, 0) AS Comprobante_TipoCambio, +ISNULL(cg2_fac.INGRESOS, 0) AS Comprobante_SubTotal, +ISNULL(cg2_fac.Moneda, '') AS Comprobante_Moneda, +ISNULL(cg2_fac.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_fac.ESTATUSCERTELEC, '') AS Comprobante_Estatus, +ISNULL(cg2_fac.CUENTAPREDIAL, '') AS Comprobante_CuentaPredial, +ISNULL(cg2_fac.CondicionesPago, '') AS Comprobante_CondicionesDePago, +ISNULL(cg2_fac.DESCUENTOFACT, 0) AS Comprobante_Descuento,"; + if (CFDI4) + { + SysQueryEncabezado += @"(select ISNULL(sum(IMPORTE),0) from FacturaConceptos where CUENTAGASTOS= " + ComprobanteDBSysId + @" and INGRESONOGENERAIVA=0 and TIPOCONCEPTO !='P' ) AS Base_IVA, +(select ISNULL(count(Linea),0) from FacturaConceptos where CUENTAGASTOS= " + ComprobanteDBSysId + @" and INGRESONOGENERAIVA=1 and TIPOCONCEPTO !='P' ) AS IVA_CERO_ENC, +CASE WHEN ISNULL(cg2_fac.IVA, 0) = 0 and (select ISNULL(count(LINEA),0) from FacturaConceptos where CUENTAGASTOS=" + ComprobanteDBSysId + @" and INGRESONOGENERAIVA=1 and TIPOCONCEPTO !='P' ) =0 THEN 'NA' ELSE CAST(ISNULL(cg2_fac.IVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(cg2_fac.IVA, 0) = 0 and (select ISNULL(count(LINEA),0) from FacturaConceptos where CUENTAGASTOS=" + ComprobanteDBSysId + @" and INGRESONOGENERAIVA=1 and TIPOCONCEPTO !='P' ) =0 THEN 'NA' ELSE CAST(ISNULL(cg2_fac.PORCENTAJEIVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje,"; + } + else { + SysQueryEncabezado += @" +CASE WHEN ISNULL(cg2_fac.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_fac.IVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(cg2_fac.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_fac.PORCENTAJEIVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje,"; + } + SysQueryEncabezado += @" +CASE WHEN ISNULL(cg2_fac.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_fac.IVARETENIDO, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenido, +CASE WHEN ISNULL(cg2_fac.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_fac.PORCENTAJEIVARET, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenidoPorcentaje,"; + + SysQueryEncabezado += @" +CASE WHEN ISNULL(cg2_fac.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_fac.ISR, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISR, +CASE WHEN ISNULL(cg2_fac.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_fac.PORCENTAJEISR, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISRPorcentaje, +CASE WHEN ISNULL(cg2_fac.CFDI33_Cmpto_3eros,0) = 0 THEN 'NA' ELSE ISNULL(replace(cg2_fac.Pedimento,'-','NA'),'NA') END AS Terceros_PEDIMENTO, +CASE WHEN (ISNULL(cg2_fac.CFDI33_Cmpto_3eros,0) = 1 AND ISNULL(replace(cg2_fac.Pedimento,'-','NA'),'NA') = 'NA') +OR (ISNULL(cg2_fac.CFDI33_Cmpto_3eros,0) = 0 AND ISNULL(replace(cg2_fac.Pedimento,'-','NA'),'NA') != 'NA') THEN 'NA' ELSE cg2_fac.ADUANA END AS Terceros_Aduana, +CASE WHEN (ISNULL(cg2_fac.CFDI33_Cmpto_3eros,0) = 1 AND ISNULL(replace(cg2_fac.Pedimento,'-','NA'),'NA') = 'NA') +OR (ISNULL(cg2_fac.CFDI33_Cmpto_3eros,0) = 0 AND ISNULL(replace(cg2_fac.Pedimento,'-','NA'),'NA') != 'NA') THEN 'NA' +ELSE + +/*(SUBSTRING(Convert( VarChar(50),DateAdd(day,(select fecharecepcion from pedimentos where ADUANA = cg2_fac.ADUANA and PATENTE = cg2_fac.PATENTE and PEDIMENTO= cg2_fac.PEDIMENTO ),'1800-12-28'),121),1,11)) */ +case when (select fecharecepcion from pedimentos where ADUANA = cg2_fac.ADUANA and PATENTE = cg2_fac.PATENTE and PEDIMENTO= cg2_fac.PEDIMENTO) = 0 + then 'NA' + else + (SUBSTRING(Convert( VarChar(50),DateAdd(day,( + (select fecharecepcion from pedimentos where ADUANA = cg2_fac.ADUANA and PATENTE = cg2_fac.PATENTE and PEDIMENTO= cg2_fac.PEDIMENTO ) + ),'1800-12-28'),121),1,11)) + end +END AS Terceros_FechaPedimento + +FROM Facturas AS cg2_fac +WHERE cg2_fac.CUENTAGASTOS = " + ComprobanteDBSysId; + + if (CFDI4) + { + SysQueryPartidas += @" +ISNULL(INGRESONOGENERAIVA, 0) AS IVA_CERO, +ISNULL(cg2_facdet.OBJETOIMPUESTO,'') AS ObjetoImp, +ISNULL(cg2_facdet.RFCACUENTATERCEROS,'') AS RFC_Terceros, +ISNULL(cg2_facdet.NOMBREACUENTATERCEROS,'') AS Nombre_Terceros, +ISNULL(cg2_facdet.RegimenFiscalACuentaTerceros,'') AS Regimen_Terceros, +ISNULL(cg2_facdet.DomicilioFiscalACuentaTerceros,'') AS Domicilio_Terceros, +"; + } + + SysQueryPartidas += @" +ISNULL(cg2_facdet.CE_Activo, 0) AS ComercioExterior_Activo, +ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) AS Complemento_Terceros_Activo, +CASE WHEN ISNULL(CE_No_Identificacion,'') !='' then + cg2_facdet.CE_No_Identificacion +else + cg2_facdet.NOIDENTIFICACION +END AS NoIdentificacion, +ISNULL(cg2_facdet.CE_FraccionArancelaria, '') AS FraccionArancelaria, +ISNULL(cg2_facdet.CE_CantidadAduana, 0) AS CantidadAduana, +ISNULL(cg2_facdet.CE_UnidadAduana, '') AS UnidadAduana, +ISNULL(cg2_facdet.CE_ValorUnitarioAduana, 0) AS ValorUnitarioAduana, +ISNULL(cg2_facdet.CE_ValorDolares, 0) AS ValorDolares, +ISNULL(cg2_facdet.CE_Marca_Desc_Especifica, '') AS DescripcionesEspecificas_Marca, +ISNULL(cg2_facdet.CE_Modelo_Desc_Especifica, '') AS DescripcionesEspecificas_Modelo, +ISNULL(cg2_facdet.CE_SubModelo_Desc_Especifica, '') AS DescripcionesEspecificas_SubModelo, +ISNULL(cg2_facdet.CE_NumSerie_Desc_Especifica, '') AS DescripcionesEspecificas_NumeroSerie,"; + SysQueryPartidas += @" +ISNULL(cg2_facdet.CONCEPTO, '') AS ClaveProdServ, +/*ISNULL(cg2_facdet.NoIdentificacion, '') AS NoIdentificacion,*/ +ISNULL(cg2_facdet.CANTIDAD, 0) AS Cantidad, +ISNULL(cg2_facdet.UMC, '') AS ClaveUnidad, +ISNULL(cg2_facdet.CG_UNIDAD, '') AS Unidad, +CASE WHEN ISNULL((SELECT TOP 1 UTILIZARDESCRIPCIONCG FROM Configuracion), 0) = 1 THEN ISNULL(cg2_facdet.CG_Descripcion, '') ELSE ISNULL(cg2_facdet.DESCRIPCION, '') END AS Descripcion, +ISNULL(cg2_facdet.DESCUENTO, 0) AS Descuento, +ISNULL(cg2_facdet.PRECIOUNITARIO, 0) AS ValorUnitario, +ISNULL(cg2_facdet.IMPORTE, 0) AS Importe, +CASE WHEN ISNULL(cg2_facdet.IVA, 0) = 0 AND ISNULL(cg2_facdet.INGRESONOGENERAIVA,0)=0 THEN 'NA' ELSE CAST(ISNULL(cg2_facdet.IVA, 0) AS VARCHAR(100)) END AS PartidaIVA, +CASE WHEN ISNULL(cg2_facdet.IVA, 0) = 0 AND ISNULL(cg2_facdet.INGRESONOGENERAIVA,0)=0 THEN 'NA' ELSE CAST(ISNULL(cg2_facdet.PORCENTAJEIVA, 0) AS VARCHAR(100)) END AS PartidaIVAPorcentaje, +CASE WHEN ISNULL(cg2_facdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facdet.IVARETENIDO, 0) AS VARCHAR(100)) END AS PartidaIVARetenido, +CASE WHEN ISNULL(cg2_facdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facdet.PORCENTAJEIVARETENIDO, 0) AS VARCHAR(100)) END AS PartidaIVARetenidoPorcentaje, +CASE WHEN ISNULL(cg2_facdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facdet.ISR, 0) AS VARCHAR(100)) END AS PartidaISR, +CASE WHEN ISNULL(cg2_facdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facdet.PORCENTAJEISR, 0) AS VARCHAR(100)) END AS PartidaISRPorcentaje, + +CASE WHEN ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) = 0 THEN 'NA' ELSE ISNULL((select CFDI33_CLI_CMPTO_3EROS from Facturas where CUENTAGASTOS = cg2_facdet.CUENTAGASTOS ),'') END AS Cliente_Terceros, +CASE WHEN ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) = 0 THEN 'NA' ELSE (select CASE WHEN ISNULL(RFC,'') = '' THEN '' ELSE ISNULL(RFC,'') END AS RFC_TERCERO FROM Clientes WHERE CLAVE = (select CFDI33_CLI_CMPTO_3EROS from Facturas where CUENTAGASTOS = cg2_facdet.CUENTAGASTOS)) END AS RFC_Tercero, +CASE WHEN ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) = 0 THEN 'NA' ELSE (SELECT ISNULL(NOMBRE,'') FROM clientes WHERE CLAVE = (select CFDI33_CLI_CMPTO_3EROS from Facturas where CUENTAGASTOS = cg2_facdet.CUENTAGASTOS)) END AS NOMBREFISCAL_Tercero, +CASE WHEN ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) = 0 THEN 'NA' ELSE (SELECT ISNULL(CALLE,'') FROM clientes WHERE CLAVE = (select CFDI33_CLI_CMPTO_3EROS from Facturas where CUENTAGASTOS = cg2_facdet.CUENTAGASTOS)) END AS DIRECCION_Tercero, +CASE WHEN ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) = 0 THEN 'NA' ELSE (SELECT ISNULL(NUMEROEXTERIOR,'') FROM clientes WHERE CLAVE = (select CFDI33_CLI_CMPTO_3EROS from Facturas where CUENTAGASTOS = cg2_facdet.CUENTAGASTOS)) END AS NUMEROEXT_Tercero, +CASE WHEN ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) = 0 THEN 'NA' ELSE (SELECT ISNULL(NUMEROINTERIOR,'') FROM clientes WHERE CLAVE = (select CFDI33_CLI_CMPTO_3EROS from Facturas where CUENTAGASTOS = cg2_facdet.CUENTAGASTOS)) END AS NOINTERIOR_Tercero, +CASE WHEN ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) = 0 THEN 'NA' ELSE (SELECT ISNULL(COLONIA,'') FROM clientes WHERE CLAVE = (select CFDI33_CLI_CMPTO_3EROS from Facturas where CUENTAGASTOS = cg2_facdet.CUENTAGASTOS)) END AS COLONIA_Tercero, +CASE WHEN ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) = 0 THEN 'NA' ELSE (SELECT ISNULL(MUNICIPIO,'') FROM clientes WHERE CLAVE = (select CFDI33_CLI_CMPTO_3EROS from Facturas where CUENTAGASTOS = cg2_facdet.CUENTAGASTOS)) END AS CIUDAD_Tercero, +CASE WHEN ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) = 0 THEN 'NA' ELSE (SELECT ISNULL(ENTIDADFEDERATIVA,'') FROM clientes WHERE CLAVE = (select CFDI33_CLI_CMPTO_3EROS from Facturas where CUENTAGASTOS = cg2_facdet.CUENTAGASTOS)) END AS ESTADO_Tercero, +CASE WHEN ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) = 0 THEN 'NA' ELSE (SELECT ISNULL(PAIS,'') FROM clientes WHERE CLAVE = (select CFDI33_CLI_CMPTO_3EROS from Facturas where CUENTAGASTOS = cg2_facdet.CUENTAGASTOS)) END AS PAIS_Tercero, +CASE WHEN ISNULL(cg2_facdet.CFDI33Cmpto_3erosActivo, 0) = 0 THEN 'NA' ELSE (SELECT ISNULL(CODIGOPOSTAL,'') FROM clientes WHERE CLAVE = (select CFDI33_CLI_CMPTO_3EROS from Facturas where CUENTAGASTOS = cg2_facdet.CUENTAGASTOS)) END AS CP_Tercero, +ISNULL(cg2_facdet.TIPOCONCEPTO,'I') AS TipoConcepto + +FROM FacturaConceptos AS cg2_facdet +WHERE +cg2_facdet.CUENTAGASTOS = " + ComprobanteDBSysId + "ORDER BY /*cg2_facdet.LINEA*/ cg2_facdet.TIPOCONCEPTO "; + + SysQueryRelacionados = @" +IF EXISTS (select tiporelacion from Facturas where CUENTAGASTOS =" + ComprobanteDBSysId + @" and tiporelacion IS NOT NULL) + begin + (Select + ISNULL(DRFI.UUID,'') AS UUID, + ISNULL(FF.TIPORELACION,'') AS TipoRelacion + FROM CFD33DocumentosRelacionados_FI DRFI + LEFT JOIN facturas FF ON FF.CUENTAGASTOS = DRFI.SYSID_DR + WHERE DRFI.SYSID_DR = " + ComprobanteDBSysId + @") + end +IF exists (SELECT ISNULL(cg2_ant.UUIDTIMBRADO, '') FROM Anticipos AS cg2_ant INNER JOIN AnticiposAplicacion AS cg2_ant_apl + ON cg2_ant.SYSID = cg2_ant_apl.ANTICIPOSYSID INNER JOIN Facturas AS cg2_fac ON cg2_ant_apl.FACTURA = cg2_fac.FACTURA + WHERE cg2_fac.CUENTAGASTOS = " + ComprobanteDBSysId + @" and cg2_ant.UUIDTIMBRADO is not null) + begin + (SELECT + ISNULL(cg2_ant.UUIDTIMBRADO, '') AS UUID, + '07' AS TipoRelacion + FROM Anticipos AS cg2_ant + INNER JOIN AnticiposAplicacion AS cg2_ant_apl ON cg2_ant.SYSID = cg2_ant_apl.ANTICIPOSYSID + INNER JOIN Facturas AS cg2_fac ON cg2_ant_apl.FACTURA = cg2_fac.FACTURA + WHERE cg2_fac.CUENTAGASTOS = " + ComprobanteDBSysId + @") + end"; + #endregion cg2 factura timbrar + break; + case "factura_egreso": + #region cg2 factura egreso timbrar + + if (CFDI4) { + SysQueryEncabezado += @" +isnull(cg2_facegrdet.Exportacion,'') AS Exportacion, +ISNULL(cg2_facegr.INFOGLO_PERIODICIDAD,'') AS Periodicidad, +ISNULL(cg2_facegr.INFOGLO_MESES,'') AS Meses, +ISNULL(cg2_facegr.INFOGLO_ANIO,'') AS Anio, +isnull((select codigopostal from clientes where clave = cg2_facegr.cliente ),'') AS Receptor_DomicilioFiscal, +isnull((select CLAVEREGIMEN from clientes where clave = cg2_facegr.cliente ),'') AS Receptor_RegimenFiscal, +"; + } + + SysQueryEncabezado += @" +ISNULL(cg2_facegr.ADUANA, '-') + ISNULL(cg2_facegr.PATENTE, '-') + ISNULL(cg2_facegr.PEDIMENTO, '-') AS ConfigFacturaSufijo, +ISNULL((SELECT TOP 1 NOM_FACELEC FROM Configuracion), '') AS ConfigFacturaNombre, +ISNULL(cg2_facegr.CLIENTE, '') AS ConfigClienteClave, +ISNULL(cg2_facegr.TIPOFACTURA, '') AS ConfigFacturaTipo, +ISNULL(cg2_facegr.TIPOPEDIMENTO, '') AS ConfigPedimentoTipo,"; + SysQueryEncabezado += @" +ISNULL(cg2_facegr.ACTIVARCOMERCIOEXTERIOR, 0) AS ComercioExterior_Activo, +ISNULL(cg2_facegr.REGIMENFISCALCLAVE, '') AS Emisor_RegimenFiscal, + +ISNULL(cg2_facegr.RFCCLI, '') AS Receptor_Rfc, +ISNULL(cg2_facegr.PAISCLI, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(cg2_facegr.NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(cg2_facegrdet.USOCFDI, '') AS Receptor_UsoCFDI, +"; + if (CFDI4) { + SysQueryEncabezado += @" +(select ISNULL(NOMBRECFDI40,'') from Clientes where clave = cg2_facegr.cliente ) AS Receptor_Nombre, +(select isnull(EXPEDIDOEMPRESA,'') from Configuracion)AS Emisor_Nombre, +"; + } else { + SysQueryEncabezado += @" +ISNULL(cg2_facegr.NOMBRECLI, '') AS Receptor_Nombre, +CASE WHEN ISNULL(cg2_facegr.EXPEDIDOEMPRESA, '') = '' THEN ISNULL(cg2_facegr.EMPRESA, '') ELSE ISNULL(cg2_facegr.EXPEDIDOEMPRESA, '') END AS Emisor_Nombre,"; + } + + SysQueryEncabezado += @" +ISNULL(cg2_facegr.EmpresaRFC, '') AS Emisor_Rfc, +CASE WHEN ISNULL(cg2_facegr.EXPEDIDOCP, '') = '' THEN ISNULL(cg2_facegr.CodigoPostal, '') ELSE ISNULL(cg2_facegr.EXPEDIDOCP, '') END AS Comprobante_LugarExpedicion, +'E' AS Comprobante_TipoDeComprobante, + +ISNULL(cg2_facegrdet.FORMAPAGO, '') AS Comprobante_FormaPago, + +ISNULL(cg2_facegrdet.METODODEPAGO, '') AS Comprobante_MetodoPago, +(case when (SELECT TOP 1 formatofactura FROM Configuracion) = '5' then + isnull((SELECT TOP 1 sierienc FROM Configuracion), '') +else + ISNULL(cg2_facegr.SERIE, '') +end) as Comprobante_Serie, + +ISNULL(cg2_facegr.TIPOCAMBIO, 0) AS Comprobante_TipoCambio, +ISNULL(cg2_facegrdet.EGRESOSYSID, '') AS Comprobante_Folio, + +ISNULL(cg2_facegrdet.TOTAL, 0) + ISNULL(cg2_facegrdet.TOTAL_0,0) AS Comprobante_Total, +ISNULL((cg2_facegrdet.SUBTOTAL), 0) + ISNULL(cg2_facegrdet.TOTAL_0,0) AS Comprobante_SubTotal, + +ISNULL(cg2_facegr.Moneda, '') AS Comprobante_Moneda, +ISNULL(cg2_facegrdet.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_facegr.ESTATUSCERTELEC, '') AS Comprobante_Estatus, +ISNULL(cg2_facegr.CUENTAPREDIAL, '') AS Comprobante_CuentaPredial, +ISNULL(cg2_facegr.CondicionesPago, '') AS Comprobante_CondicionesDePago, +0 AS Comprobante_Descuento, +CASE WHEN ISNULL(cg2_facegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(cg2_facegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVAPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje, +CASE WHEN ISNULL(cg2_facegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVARETENIDO, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenido, +CASE WHEN ISNULL(cg2_facegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVARETENIDOPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenidoPorcentaje, +CASE WHEN ISNULL(cg2_facegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.ISR, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISR, +CASE WHEN ISNULL(cg2_facegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.ISRPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISRPorcentaje, + +CASE WHEN ISNULL(cg2_facegrdet.TOTAL_0, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.TOTAL_0,0) AS VARCHAR(100)) END AS Importe_Cero + +FROM Facturas AS cg2_facegr +INNER JOIN Facturas_Egresos_Detalles AS cg2_facegrdet ON cg2_facegr.CUENTAGASTOS = cg2_facegrdet.CUENTAGASTOSSYSID +WHERE cg2_facegrdet.EGRESOSYSID = " + ComprobanteDBSysId; + + if (CFDI4) { + SysQueryPartidas += @" +ISNULL(cg2_facegrdet.CFDI33_OBJETOIMP,'') AS ObjetoImp, +ISNULL(cg2_facegrdet.RFCACUENTATERCEROS,'') AS RFC_Terceros, +ISNULL(cg2_facegrdet.NOMBREACUENTATERCEROS,'') AS Nombre_Terceros, +ISNULL(cg2_facegrdet.RegimenFiscalACuentaTerceros,'') AS Regimen_Terceros, +ISNULL(cg2_facegrdet.DomicilioFiscalACuentaTerceros,'') AS Domicilio_Terceros, +"; + } + + SysQueryPartidas += @" +ISNULL(cg2_facegrdet.PRODUCTOCLAVE, '') AS ClaveProdServ, +'' AS NoIdentificacion, +ISNULL(cg2_facegrdet.CANTIDAD, 0) AS Cantidad, +ISNULL(cg2_facegrdet.UNIDADMEDIDACLAVE, '') AS ClaveUnidad, +'' AS Unidad, +ISNULL(cg2_facegrdet.DESCRIPCION, '') AS Descripcion, +ISNULL(cg2_facegrdet.VALORUNITARIO, 0) AS ValorUnitario, +ISNULL(cg2_facegrdet.IMPORTE, 0) AS Importe, +0 AS Descuento, +CASE WHEN ISNULL(cg2_facegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVA, 0) AS VARCHAR(100)) END AS PartidaIVA, +CASE WHEN ISNULL(cg2_facegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVAPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVAPorcentaje, +CASE WHEN ISNULL(cg2_facegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVARETENIDO, 0) AS VARCHAR(100)) END AS PartidaIVARetenido, +CASE WHEN ISNULL(cg2_facegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVARETENIDOPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVARetenidoPorcentaje, +CASE WHEN ISNULL(cg2_facegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.ISR, 0) AS VARCHAR(100)) END AS PartidaISR, +CASE WHEN ISNULL(cg2_facegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.ISRPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaISRPorcentaje, +0 AS IVA_CERO +FROM Facturas_Egresos_Detalles AS cg2_facegrdet +INNER JOIN Facturas AS cg2_fac ON cg2_fac.CUENTAGASTOS = cg2_facegrdet.CUENTAGASTOSSYSID +WHERE cg2_facegrdet.EGRESOSYSID = " + ComprobanteDBSysId+ " and ISNULL(cg2_facegrdet.IMPORTE,0) > 0"; + + + //----SE AGREGO PARTIDA AL IVA 0% + SysQueryPartidas += @" +union all + +SELECT +ISNULL(cg2_facegrdet.CFDI33_OBJETOIMP,'') AS ObjetoImp, +'' AS RFC_Terceros, +'' AS Nombre_Terceros, +'' AS Regimen_Terceros, +'' AS Domicilio_Terceros, +ISNULL(cg2_facegrdet.PRODUCTOCLAVE, '') AS ClaveProdServ, +'' AS NoIdentificacion, +ISNULL(cg2_facegrdet.CANTIDAD, 0) AS Cantidad, +ISNULL(cg2_facegrdet.UNIDADMEDIDACLAVE, '') AS ClaveUnidad, +'' AS Unidad, +ISNULL(cg2_facegrdet.DESCRIPCION, '') AS Descripcion, +ISNULL(cg2_facegrdet.TOTAL_0,0) AS ValorUnitario, +ISNULL(cg2_facegrdet.TOTAL_0,0) AS Importe, +0 AS Descuento, +'0' AS PartidaIVA, +'0' AS PartidaIVAPorcentaje, +'NA' AS PartidaIVARetenido, +'NA' AS PartidaIVARetenidoPorcentaje, +'NA' AS PartidaISR, +'NA' AS PartidaISRPorcentaje, +1 AS IVA_CERO + +FROM Facturas_Egresos_Detalles AS cg2_facegrdet +INNER JOIN Facturas AS cg2_fac ON cg2_fac.CUENTAGASTOS = cg2_facegrdet.CUENTAGASTOSSYSID +WHERE cg2_facegrdet.EGRESOSYSID = " + ComprobanteDBSysId + " and ISNULL(cg2_facegrdet.TOTAL_0, 0) > 0"; + + SysQueryRelacionados = @" +SELECT +ISNULL(cg2_fac.UUIDTIMBRADO, '') AS UUID, +ISNULL(cg2_facegr.TipoRelacion, '') AS TipoRelacion +FROM Facturas_Egresos_Detalles AS cg2_facegr +INNER JOIN Facturas AS cg2_fac ON cg2_fac.CUENTAGASTOS = cg2_facegr.CUENTAGASTOSSYSID +WHERE cg2_facegr.EGRESOSYSID = " + ComprobanteDBSysId; + #endregion cg2 factura timbrar + break; + case "factura_egresoglobal": + #region cg2 factura egreso Global timbrar + SysQueryEncabezado += @" + --COonfiguracion +ISNULL((SELECT TOP 1 NOM_FACELEC FROM Configuracion), '') AS ConfigFacturaNombre, +/* +ISNULL(cg2_facegr.CFDI_3_2, '') AS CFDI_3_2, +Facturas +ISNULL(cg2_facegr.ADUANA, '-') + ISNULL(cg2_facegr.PATENTE, '-') + ISNULL(cg2_facegr.PEDIMENTO, '-') AS ConfigFacturaSufijo, +ISNULL(cg2_facegr.Receptor_Nombre, '') AS ConfigClienteClave, +ISNULL(cg2_facegr.TIPOFACTURA, '') AS ConfigFacturaTipo, +ISNULL(cg2_facegr.TIPOPEDIMENTO, '') AS ConfigPedimentoTipo, +*/ +ISNULL(cg2_facegr.ComercioExterior_Activo, 0) AS ComercioExterior_Activo, +ISNULL(cg2_facegr.Emisor_RegimenFiscal, '') AS Emisor_RegimenFiscal, +/*ISNULL(cg2_facegr.Receptor_Nombre, '') AS Receptor_Nombre,*/ +(select ISNULL(NOMBRECFDI40,'') from Clientes where RFC= cg2_facegr.Receptor_Rfc ) AS Receptor_Nombre, +ISNULL(cg2_facegr.Receptor_Rfc, '') AS Receptor_Rfc, +ISNULL(cg2_facegr.Receptor_ResidenciaFiscal, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(cg2_facegr.Receptor_NumRegIdTrib, '') AS Receptor_NumRegIdTrib, +ISNULL(cg2_facegr.Receptor_UsoCFDI, '') AS Receptor_UsoCFDI, +ISNULL(cg2_facegr.Emisor_Nombre, '') AS Emisor_Nombre, +ISNULL(cg2_facegr.Emisor_Rfc, '') AS Emisor_Rfc, +ISNULL(cg2_facegr.Comprobante_LugarExpedicion, '') AS Comprobante_LugarExpedicion, +'E' AS Comprobante_TipoDeComprobante, +ISNULL(cg2_facegr.Comprobante_TipoCambio, 0) AS Comprobante_TipoCambio, +ISNULL(cg2_facegr.Comprobante_Moneda, '') AS Comprobante_Moneda, +ISNULL(cg2_facegr.Comprobante_Estatus, '') AS Comprobante_Estatus, +ISNULL(cg2_facegr.Comprobante_CuentaPredial, '') AS Comprobante_CuentaPredial, +ISNULL(cg2_facegr.Comprobante_CondicionesDePago, '') AS Comprobante_CondicionesDePago, + +--Facturas_Egresos_Detalles +ISNULL(cg2_facegr.Comprobante_FormaPago, '') AS Comprobante_FormaPago, +ISNULL(cg2_facegr.Comprobante_MetodoPago, '') AS Comprobante_MetodoPago, +ISNULL(cg2_facegr.Comprobante_Folio, '') AS Comprobante_Folio, +ISNULL(cg2_facegr.Comprobante_Total, 0) AS Comprobante_Total, +ISNULL((cg2_facegr.Comprobante_SubTotal), 0) AS Comprobante_SubTotal, +ISNULL(cg2_facegr.Comprobante_Fecha, '') AS Comprobante_Fecha, +0 AS Comprobante_Descuento, +CASE WHEN ISNULL(cg2_facegr.Comprobante_ImporteIVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegr.Comprobante_ImporteIVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(cg2_facegr.Comprobante_ImporteIVAPorcentaje, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegr.Comprobante_ImporteIVAPorcentaje, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje, +CASE WHEN ISNULL(cg2_facegr.Comprobante_ImporteIVARetenidoPorcentaje, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(Sum(cg2_facegrdet.IVARETENIDO), 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenido, +CASE WHEN ISNULL(cg2_facegr.Comprobante_ImporteIVARetenido, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegr.Comprobante_ImporteISRPorcentaje, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenidoPorcentaje, +CASE WHEN ISNULL(cg2_facegr.Comprobante_ImporteISRPorcentaje, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(SUM(cg2_facegrdet.ISR), 0) AS VARCHAR(100)) END AS Comprobante_ImporteISR, +CASE WHEN ISNULL(cg2_facegr.Comprobante_ImporteISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegr.Comprobante_ImporteISRPorcentaje, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISRPorcentaje, + +(case when(SELECT TOP 1 formatofactura FROM Configuracion) = '5' then + isnull((SELECT TOP 1 sierienc FROM Configuracion), '') +else + ISNULL(cg2_facegr.Comprobante_Serie, '') +end) as Comprobante_Serie + +FROM EgresosGlobales AS cg2_facegr +LEFT JOIN Egresos_Detalles_Globales AS cg2_facegrdet ON cg2_facegr.id_EgresoG = cg2_facegrdet.ID_EGRESO_GLOBAL +WHERE cg2_facegr.id_egresog =" + ComprobanteDBSysId + @"group by cg2_facegr.Receptor_Nombre,cg2_facegr.ComercioExterior_Activo,cg2_facegr.Emisor_RegimenFiscal,cg2_facegr.Receptor_Nombre, +cg2_facegr.Receptor_Rfc,cg2_facegr.Receptor_ResidenciaFiscal,cg2_facegr.Receptor_NumRegIdTrib,cg2_facegr.Receptor_UsoCFDI, +cg2_facegr.Emisor_Nombre,cg2_facegr.Emisor_Rfc,cg2_facegr.Comprobante_LugarExpedicion,cg2_facegr.Comprobante_TipoCambio, +cg2_facegr.Comprobante_Moneda,cg2_facegr.Comprobante_Estatus,cg2_facegr.Comprobante_CuentaPredial, +cg2_facegr.Comprobante_CondicionesDePago,cg2_facegr.Comprobante_FormaPago,cg2_facegr.Comprobante_MetodoPago, +cg2_facegr.Comprobante_Folio,cg2_facegr.Comprobante_Total,cg2_facegr.Comprobante_SubTotal,cg2_facegr.Comprobante_Fecha, +--cg2_facegrdet.IVA, +cg2_facegr.Comprobante_ImporteIVA,cg2_facegr.Comprobante_ImporteIVAPorcentaje, +cg2_facegr.Comprobante_ImporteIVARetenidoPorcentaje,cg2_facegrdet.IVARETENIDO,cg2_facegr.Comprobante_ImporteIVARetenido, +cg2_facegrdet.IVARETENIDOPORCENTAJE,cg2_facegr.Comprobante_ImporteISRPorcentaje,cg2_facegrdet.ISR, +cg2_facegr.Comprobante_ImporteISR,cg2_facegrdet.ISRPORCENTAJE,cg2_facegr.Comprobante_Serie +--, +--cg2_facegr.CFDI_3_2"; + + SysQueryPartidas += @" +ISNULL(cg2_facegrdet.PRODUCTOCLAVE, '') AS ClaveProdServ, +'' AS NoIdentificacion, +ISNULL(cg2_facegrdet.CANTIDAD, 0) AS Cantidad, +ISNULL(cg2_facegrdet.UNIDADMEDIDACLAVE, '') AS ClaveUnidad, +'' AS Unidad, +ISNULL(cg2_facegrdet.DESCRIPCION, '') AS Descripcion, +ISNULL(cg2_facegrdet.VALORUNITARIO, 0) AS ValorUnitario, +ISNULL(cg2_facegrdet.IMPORTE, 0) AS Importe, +0 AS Descuento, +CASE WHEN ISNULL(cg2_facegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVA, 0) AS VARCHAR(100)) END AS PartidaIVA, +CASE WHEN ISNULL(cg2_facegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVAPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVAPorcentaje, +CASE WHEN ISNULL(cg2_facegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVARETENIDO, 0) AS VARCHAR(100)) END AS PartidaIVARetenido, +CASE WHEN ISNULL(cg2_facegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.IVARETENIDOPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVARetenidoPorcentaje, +CASE WHEN ISNULL(cg2_facegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.ISR, 0) AS VARCHAR(100)) END AS PartidaISR, +CASE WHEN ISNULL(cg2_facegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_facegrdet.ISRPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaISRPorcentaje +FROM EgresosGlobales AS cg2_facegr +LEFT JOIN Egresos_Detalles_Globales AS cg2_facegrdet ON cg2_facegr.id_EgresoG = cg2_facegrdet.ID_EGRESO_GLOBAL +WHERE cg2_facegr.id_egresog = " + ComprobanteDBSysId + " ORDER BY cg2_facegrdet.LINEA"; + + SysQueryRelacionados = @" +Select +ISNULL((select UUIDTIMBRADO from facturas where cuentagastos=cg2_facegr.FACTURA_I), '') AS UUID, +ISNULL(cg2_fac.CFDI_RELACION, '') AS TipoRelacion +FROM Egresos_Detalles_Globales AS cg2_facegr +INNER JOIN EgresosGlobales AS cg2_fac ON cg2_fac.id_EgresoG = cg2_facegr.ID_EGRESO_GLOBAL +WHERE cg2_fac.id_EgresoG = " + ComprobanteDBSysId; + + #endregion cg2 factura egreso Global timbrar + break; + case "notacredito": + #region cg2 notacredito timbrar + SysQueryEncabezado += @" +ISNULL(cg2_ntc.REGIMENFISCALCLAVE, '') AS Emisor_RegimenFiscal, +ISNULL(cg2_ntc.CLIENTENOMBRE, '') AS Receptor_Nombre, +ISNULL(cg2_ntc.CLIENTERFC, '') AS Receptor_Rfc, +ISNULL(cg2_ntc.CLIENTEPAIS, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(cg2_ntc.NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(cg2_ntc.USOCFDI, '') AS Receptor_UsoCFDI, +CASE WHEN ISNULL(cg2_ntc.EXPEDIDOEMPRESA, '') = '' THEN ISNULL(cg2_ntc.NOMBREEMISOR, '') ELSE ISNULL(cg2_ntc.EXPEDIDOEMPRESA, '') END AS Emisor_Nombre, +CASE WHEN ISNULL(cg2_ntc.EXPEDIDORFC, '') = '' THEN ISNULL(cg2_ntc.RFCEMISOR, '') ELSE ISNULL(cg2_ntc.EXPEDIDORFC, '') END AS Emisor_Rfc, +CASE WHEN ISNULL(cg2_ntc.EXPEDIDOCP, '') = '' THEN ISNULL(cg2_ntc.CPEMISOR, '') ELSE ISNULL(cg2_ntc.EXPEDIDOCP, '') END AS Comprobante_LugarExpedicion, +ISNULL(cg2_ntc.TIPOCOMPROBANTE, '') AS Comprobante_TipoDeComprobante, +ISNULL(cg2_ntc.FORMADEPAGO, '') AS Comprobante_FormaPago, +ISNULL(cg2_ntc.METODOPAGOCLAVE, '') AS Comprobante_MetodoPago, +ISNULL(cg2_ntc.SERIE, '') AS Comprobante_Serie, +ISNULL(cg2_ntc.FOLIO, '') AS Comprobante_Folio, +ISNULL(cg2_ntc.TOTAL, 0) AS Comprobante_Total, +ISNULL(cg2_ntc.TIPOCAMBIO, 0) AS Comprobante_TipoCambio, +ISNULL((cg2_ntc.SUBTOTAL), '') AS Comprobante_SubTotal, +ISNULL(cg2_ntc.Moneda, '') AS Comprobante_Moneda, +ISNULL(cg2_ntc.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_ntc.CERTIFICADA, '') AS Comprobante_Estatus, +0 AS Comprobante_Descuento, +CASE WHEN ISNULL(cg2_ntc.IVAIMPORTE, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_ntc.IVAIMPORTE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(cg2_ntc.IVAIMPORTE, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_ntc.IVATASA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje, +CASE WHEN ISNULL(cg2_ntc.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_ntc.IVARETENIDO, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenido, +CASE WHEN ISNULL(cg2_ntc.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(cg2_ntc.PORCENTAJEIVARETENIDO, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenidoPorcentaje, +'NA' AS Comprobante_ImporteISR, +'NA' AS Comprobante_ImporteISRPorcentaje +FROM NotasCredito AS cg2_ntc +WHERE cg2_ntc.NOTASYSID = " + ComprobanteDBSysId; + SysQueryPartidas += @" +ISNULL(cg2_ntcdet.CODIGO, '') AS ClaveProdServ, +'' AS NoIdentificacion, +ISNULL(cg2_ntcdet.CANTIDAD, 0) AS Cantidad, +ISNULL(cg2_ntcdet.UMC, '') AS ClaveUnidad, +'' AS Unidad, +CASE WHEN ISNULL((SELECT TOP 1 UTILIZARDESCRIPCIONCG FROM Configuracion), 0) = 1 THEN ISNULL(cg2_ntcdet.CG_Descripcion, '') ELSE ISNULL(cg2_ntcdet.DESRIPCION, '') END AS Descripcion, +0 AS Descuento, +ISNULL(cg2_ntcdet.VALORUNITARIO, 0) AS ValorUnitario, +CASE WHEN ISNULL(cg2_ntcdet.IMPORTE, 0) > 0 THEN cg2_ntcdet.IMPORTE ELSE cg2_ntcdet.IMPORTENOIVA END AS Importe, +CASE WHEN ISNULL(cg2_ntcdet.IVA, 0) > 0 THEN CAST(cg2_ntcdet.IVA AS VARCHAR(100)) ELSE 'NA' END AS PartidaIVA, +CASE WHEN ISNULL(cg2_ntcdet.IVA, 0) > 0 THEN CAST(cg2_ntcdet.PORCENTAJEIVA AS VARCHAR(100)) ELSE 'NA' END AS PartidaIVAPorcentaje, +CASE WHEN ISNULL(cg2_ntcdet.IMPORTEIVARET, 0) > 0 THEN CAST(cg2_ntcdet.IMPORTEIVARET AS VARCHAR(100)) ELSE 'NA' END AS PartidaIVARetenido, +CASE WHEN ISNULL(cg2_ntcdet.IMPORTEIVARET, 0) > 0 THEN CAST(cg2_ntcdet.PORCENTAJEIVARET AS VARCHAR(100)) ELSE 'NA' END AS PartidaIVARetenidoPorcentaje, +'NA' AS PartidaISR, +'NA' AS PartidaISRPorcentaje +FROM NotasCreditoConceptos AS cg2_ntcdet +WHERE cg2_ntcdet.NOTASYSID = " + ComprobanteDBSysId + " ORDER BY cg2_ntcdet.LINEA"; + #endregion cg2 notacredito timbrar + break; + case "pago": + #region cg2 pago timbrar + + if (CFDI4) + { + SysQueryEncabezado += @" +'01' AS Exportacion, +'NA' AS Periodicidad, +'NA' AS Meses, +'NA' AS Anio, +isnull((select codigopostal from clientes where clave = cg2_pag.CLIENTEFACTURA ),'') AS Receptor_DomicilioFiscal, +isnull((select CLAVEREGIMEN from clientes where clave = cg2_pag.CLIENTEFACTURA ),'') AS Receptor_RegimenFiscal, +isnull((select RFC from Clientes where CLAVE = cg2_pag.CLIENTEFACTURA ),'') AS Receptor_Rfc, +isnull((select PAIS from Clientes where clave = cg2_pag.CLIENTEFACTURA ),'') AS Receptor_ResidenciaFiscal, +isnull((select NOMBRECFDI40 from Clientes where CLAVE = cg2_pag.CLIENTEFACTURA ),'') AS Receptor_Nombre, +ISNULL(cg2_pag.USOCFDI ,'') AS Receptor_UsoCFDI, +ISNULL((select NUMREGIDTRIB from clientes where clave = cg2_pag.CLIENTEFACTURA ),'') AS Receptor_NumRegIdTrib, + +(select isnull(EXPEDIDOEMPRESA,'') from Configuracion)AS Emisor_Nombre, +ISNULL(cg2_pag.REGIMENFISCALCLAVE, '') AS Emisor_RegimenFiscal, +"; + } + + + SysQueryEncabezado += @" +CASE WHEN ISNULL(cg2_pag.RFCEXPEDIDO, '') = '' THEN ISNULL(cg2_pag.RFCEMPRESA, '') ELSE ISNULL(cg2_pag.RFCEXPEDIDO, '') END AS Emisor_Rfc, +ISNULL(cg2_pag.CODIGOPOSTAL, '') AS Comprobante_LugarExpedicion, +ISNULL(cg2_pag.TIPOCOMPROBANTECLAVE, '') AS Comprobante_TipoDeComprobante, +'' AS Comprobante_FormaPago, +ISNULL(cg2_pag.METODOPAGOCLAVE, '') AS Comprobante_MetodoPago, +ISNULL(cg2_pag.SERIE, '') AS Comprobante_Serie, +ISNULL(cg2_pag.SYSID, '') AS Comprobante_Folio, +0 AS Comprobante_Total, +0 AS Comprobante_TipoCambio, +0 AS Comprobante_SubTotal, +'XXX' AS Comprobante_Moneda, +ISNULL(cg2_pag.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_pag.ESTATUS, '') AS Comprobante_Estatus, +0 AS Comprobante_Descuento, +'NA' AS Comprobante_ImporteIVA, +'NA' AS Comprobante_ImporteIVAPorcentaje, +'NA' AS Comprobante_ImporteIVARetenido, +'NA' AS Comprobante_ImporteIVARetenidoPorcentaje, +'NA' AS Comprobante_ImporteISR, +'NA' AS Comprobante_ImporteISRPorcentaje, +ISNULL(cg2_pag.FECHAPAGO, '') AS Pago10_FechaPago, +ISNULL(cg2_pag.FORMADEPAGOP, '') AS Pago10_FormaDePagoP, +ISNULL(cg2_pag.MONEDA, '') AS Pago10_MonedaP, +ISNULL(cg2_pag.TIPOCAMBIO, 0) AS Pago10_TipoCambioP, +ISNULL(cg2_pag.IMPORTETIMBRADO, 0) AS Pago10_Monto, + +ISNULL(cg2_pag.RFCEmisorCuentaOrdenada,'') AS Pago10_RfcEmisorCtaOrd, +ISNULL(cg2_pag.NOMBREBANCO, '') AS Pago10_NomBancoOrdExt, +ISNULL(cg2_pag.CtaOrdenante, '') AS Pago10_CtaOrdenante, +ISNULL(cg2_pag.RFCReceptorCuentaOrdenada,'') AS Pago10_RfcEmisorCtaBen, +ISNULL(cg2_pag.CtaBeneficiario, '') AS Pago10_CtaBeneficiario, + +ISNULL(cg2_pag.TipoCadenaPagoTEF, '') AS Pago10_TipoCadPago, +ISNULL(cg2_pag.CadenaPagoTEF, '') AS Pago10_CadPago, +ISNULL(cg2_pag.CertificadoPagoTEF, '') AS Pago10_CertPago, +ISNULL(cg2_pag.SellodePagoTEF, '') AS Pago10_SelloPago, +ISNULL(cg2_pag.Pago10_NumeroOperacion,'') AS Pago10_NumeroOperacion +FROM Pagos AS cg2_pag +WHERE cg2_pag.SYSID = " + ComprobanteDBSysId; + SysQueryPartidas += @" +'84111506' AS ClaveProdServ, +'' AS NoIdentificacion, +1 AS Cantidad, +'ACT' AS ClaveUnidad, +'' AS Unidad, +'Pago' AS Descripcion, +0 AS Descuento, +0 AS ValorUnitario, +0 AS Importe, +'NA' AS PartidaIVA, +'NA' AS PartidaIVAPorcentaje, +'NA' AS PartidaIVARetenido, +'NA' AS PartidaIVARetenidoPorcentaje, +'NA' AS PartidaISR, +'NA' AS PartidaISRPorcentaje +"; + SysQueryPago10 = @" +SELECT +ISNULL(cg2_pag_det.UUID, '') AS IdDocumento, +ISNULL(cg2_pag_det.MONEDADR, '') AS MonedaDR, +ISNULL(cg2_pag_det.TipoCambioDR, 0) AS TipoCambioDR, +ISNULL(cg2_fac.METODOPAGOCLAVE, '') AS MetodoDePagoDR, +ISNULL(cg2_fac.SERIE, '') AS Serie, +ISNULL(cg2_fac.FOLIO, '') AS Folio, +ISNULL(cg2_pag_det.PPDNUMERO, 0) AS NumParcialidad, +"; + + SysQueryPago10 += @" +CASE WHEN cg2_pag_det.MONEDADR ='P' THEN + ISNULL(cg2_pag_det.ImpSaldoAntPesos, 0) +ELSE + ISNULL(cg2_pag_det.ImpSaldoAntDLLS, 0) +END AS ImpSaldoAnt, +CASE WHEN cg2_pag_det.MONEDADR ='P' THEN + ISNULL(cg2_pag_det.ImporteTimbradoPESOS, 0) +ELSE + ISNULL(cg2_pag_det.ImporteTimbradoDLLS, 0) +END AS ImpPagado, +CASE WHEN cg2_pag_det.MONEDADR ='P' THEN + ISNULL(cg2_pag_det.ImpPagoInsolutoPesos, 0) +else + ISNULL(cg2_pag_det.ImpPagoInsolutoDLLS, 0) +end AS ImpSaldoInsoluto +"; + + if (CFDI4) + { + SysQueryPago10 += @", +isnull(cg2_pag_det.EquivalenciaDR,0) as EquivalenciaDR, +isnull(cg2_pag_det.ObjetoImpDR,'') as ObjetoImpDR, + +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.RET_BASEDR,0) else 0 end as RET_BASEDR, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.RET_IMPUESTODR,'') else '' end as RET_IMPUESTODR, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.RET_TIPOFACTORDR,'') else '' end as RET_TIPOFACTORDR, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.RET_TASAOCUOTADR,0) else 0 end as RET_TASAOCUOTADR, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.RET_IMPORTEDR,0) else 0 end as RET_IMPORTEDR, + +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.TRAS_BASEDR,0) else 0 end as TRAS_BASEDR, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.TRAS_IMPUESTODR,'') else '' end as TRAS_IMPUESTODR, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.TRAS_TIPOFACTORDR,'') else '' end as TRAS_TIPOFACTORDR, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.TRAS_TASAOCUOTADR,0) else 0 end as TRAS_TASAOCUOTADR, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.TRAS_IMPORTEDR,0) else 0 end as TRAS_IMPORTEDR, + +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.RET_BASEDR_1,0) else 0 end as RET_BASEDR_1, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.RET_IMPUESTODR_1,'') else '' end as RET_IMPUESTODR_1, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.RET_TIPOFACTORDR_1,'') else '' end as RET_TIPOFACTORDR_1, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.RET_TASAOCUOTADR_1,0) else 0 end as RET_TASAOCUOTADR_1, +CASE WHEN isnull(cg2_pag_det.ObjetoImpDR,'') = '02' then isnull(cg2_pag_det.RET_IMPORTEDR_1,0) else 0 end as RET_IMPORTEDR_1, + +(select ISNULL(count(Linea),0) from FacturaConceptos where CUENTAGASTOS= cg2_fac.CUENTAGASTOS and INGRESONOGENERAIVA=1 ) AS IVA_CERO_ENC, +(select ISNULL(sum(IMPORTE),0) from FacturaConceptos where CUENTAGASTOS= cg2_fac.CUENTAGASTOS and INGRESONOGENERAIVA=1 ) AS Base_IVA, +isnull(cg2_pag_det.iva_cero_cant,0) as Cantidad_IVA_Cero +"; + } + + SysQueryPago10 += @" +FROM Pagos AS cg2_pag +INNER JOIN PagoDetalles AS cg2_pag_det ON cg2_pag.SYSID = cg2_pag_det.PAGOSYSID +INNER JOIN Facturas AS cg2_fac ON cg2_fac.FACTURA = cg2_pag_det.FACTURA +WHERE cg2_pag.SYSID = " + ComprobanteDBSysId + @" +AND ISNULL(cg2_pag_det.ImpPagado, 0) > 0 +AND ISNULL(cg2_pag_det.PPDNUMERO, 0) > 0 +--order by +-- case when RET_BASEDR = 0 then 0 else RET_BASEDR end, +-- case when RET_BASEDR_1 = 0 then 0 else RET_BASEDR_1 end"; + + + SysQueryRelacionados = @" +Select +ISNULL(DR.UUID, '') AS UUID, + ISNULL(FP.RELACIONCLAVE, '') AS TipoRelacion +FROM CFD33DocumentosRelacionados DR +LEFT JOIN pagos FP ON FP.SYSID = DR.SYSID_DR +WHERE DR.SYSID_DR = " + ComprobanteDBSysId; + + #endregion cg2 pago timbrar + break; + default: + SysQueryEncabezado = string.Empty; + break; + } + } + #endregion queries timbrar cg2 + + //3.1.1 b + //queries timbrar service manager + #region queries timbrar bms + public void queries_timbrar_bms() + { + //campos que no cambian con el tipo de comprobante + SysQueryEncabezado = @" +SELECT +ISNULL((SELECT TOP 1 PATHFILECER FROM Configuracion), '') AS Certificado_Ruta, +ISNULL((SELECT TOP 1 PATHFILEKEY FROM Configuracion), '') AS Key_Ruta, +ISNULL((SELECT TOP 1 PASSWORDKEYFILE FROM Configuracion), '') AS Key_Clave, +ISNULL((SELECT TOP 1 NOCERTIFICADO FROM Configuracion), '') AS Comprobante_NoCertificado, +ISNULL((SELECT TOP 1 PATHFACTURAS FROM Configuracion), '') AS ComprobanteDBRutaSalida, +ISNULL((SELECT TOP 1 PATHFACTURAS FROM Configuracion), '') AS ComprobanteDBRutaEntrada,"; + SysQueryPartidas = @" +SELECT "; + switch (ComprobanteDBTipoComprobante.ToLower()) + { + //carta porte es ahora traslado + //todos los importes van en ceros + case "anticipo": + #region bms anticipo timbrar + SysQueryEncabezado += @" +ISNULL(bms_ant.Emisor_RegimenFiscal, '') AS Emisor_RegimenFiscal, +ISNULL(bms_ant.Receptor_Nombre, '') AS Receptor_Nombre, +ISNULL(bms_ant.RECEPTOR_RFC, '') AS Receptor_Rfc, +ISNULL(bms_ant.Receptor_ResidenciaFiscal, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(bms_ant.Receptor_NumRegIdTrib, '') AS Receptor_NumRegIdTrib, +ISNULL(bms_ant.Receptor_UsoCFDI, '') AS Receptor_UsoCFDI, +CASE WHEN ISNULL(bms_ant.Emisor_Nombre, '') = '' THEN ISNULL(bms_ant.Emisor_Nombre, '') ELSE ISNULL(bms_ant.Emisor_Nombre, '') END AS Emisor_Nombre, +CASE WHEN ISNULL(bms_ant.Emisor_Rfc, '') = '' THEN ISNULL(bms_ant.Emisor_Rfc, '') ELSE ISNULL(bms_ant.Emisor_Rfc, '') END AS Emisor_Rfc, +CASE WHEN ISNULL(bms_ant.Comprobante_LugarExpedicion, '') = '' THEN ISNULL(bms_ant.Comprobante_LugarExpedicion, '') ELSE ISNULL(bms_ant.Comprobante_LugarExpedicion, '') END AS Comprobante_LugarExpedicion, +ISNULL(bms_ant.Comprobante_TipoDeComprobante, '') AS Comprobante_TipoDeComprobante, +ISNULL(bms_ant.Comprobante_FormaPago, '') AS Comprobante_FormaPago, +ISNULL(bms_ant.Comprobante_MetodoPago, '') AS Comprobante_MetodoPago, +ISNULL(bms_ant.Comprobante_Serie, '') AS Comprobante_Serie, +ISNULL(bms_ant.numero, 0) AS Comprobante_Folio, +ISNULL(bms_ant.Comprobante_Total, 0) AS Comprobante_Total, +ISNULL(bms_ant.Comprobante_TipoCambio, 0) AS Comprobante_TipoCambio, +ISNULL(bms_ant.Comprobante_SubTotal, 0) AS Comprobante_SubTotal, +ISNULL(bms_ant.Comprobante_Moneda, '') AS Comprobante_Moneda, +ISNULL(bms_ant.Comprobante_Fecha, '') AS Comprobante_Fecha, +ISNULL(bms_ant.Comprobante_Estatus, '') AS Comprobante_Estatus, +0 AS Comprobante_Descuento, +CASE WHEN ISNULL(bms_ant.Comprobante_ImporteIVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ant.Comprobante_ImporteIVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(bms_ant.Comprobante_ImporteIVAPorcentaje, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ant.Comprobante_ImporteIVAPorcentaje, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje, +CASE WHEN ISNULL(bms_ant.Comprobante_ImporteIVARetenido, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ant.Comprobante_ImporteIVARetenido, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenido, +CASE WHEN ISNULL(bms_ant.Comprobante_ImporteIVARetenidoPorcentaje, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ant.Comprobante_ImporteIVARetenidoPorcentaje, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenidoPorcentaje, +CASE WHEN ISNULL(bms_ant.Comprobante_ImporteISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ant.Comprobante_ImporteISR, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISR, +CASE WHEN ISNULL(bms_ant.Comprobante_ImporteISRPorcentaje, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ant.Comprobante_ImporteISRPorcentaje, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISRPorcentaje +FROM Anticipos AS bms_ant +WHERE bms_ant.SYSID = " + ComprobanteDBSysId; + SysQueryPartidas += @" +ISNULL(bms_antdet.ClaveProdServ, '') AS ClaveProdServ, +'' AS NoIdentificacion, +ISNULL(bms_antdet.CANTIDAD, 0) AS Cantidad, +ISNULL(bms_antdet.ClaveUnidad, '') AS ClaveUnidad, +'' AS Unidad, +ISNULL(bms_antdet.DESCRIPCION, '') AS Descripcion, +0 AS Descuento, +ISNULL(bms_antdet.ValorUnitario, 0) AS ValorUnitario, +ISNULL(bms_antdet.IMPORTE, 0) AS Importe, +CASE WHEN ISNULL(bms_antdet.PartidaIVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antdet.PartidaIVA, 0) AS VARCHAR(100)) END AS PartidaIVA, +CASE WHEN ISNULL(bms_antdet.PartidaIVAPorcentaje, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antdet.PartidaIVAPorcentaje, 0) AS VARCHAR(100)) END AS PartidaIVAPorcentaje, +CASE WHEN ISNULL(bms_antdet.PartidaIVARetenido, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antdet.PartidaIVARetenido, 0) AS VARCHAR(100)) END AS PartidaIVARetenido, +CASE WHEN ISNULL(bms_antdet.PartidaIVARetenidoPorcentaje, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antdet.PartidaIVARetenidoPorcentaje, 0) AS VARCHAR(100)) END AS PartidaIVARetenidoPorcentaje, +CASE WHEN ISNULL(bms_antdet.PartidaISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antdet.PartidaISR, 0) AS VARCHAR(100)) END AS PartidaISR, +CASE WHEN ISNULL(bms_antdet.PartidaISRPorcentaje, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antdet.PartidaISRPorcentaje, 0) AS VARCHAR(100)) END AS PartidaISRPorcentaje +FROM AnticipoDetalles AS bms_antdet +JOIN Anticipos AS bms_ant ON bms_ant.SYSID = bms_antdet.ANTICIPOSYSID +WHERE bms_antdet.ANTICIPOSYSID = " + ComprobanteDBSysId + " ORDER BY bms_antdet.ANTICIPOSYSID"; + #endregion bms anticipo timbrar + break; + case "anticipo_egreso"://Agregado + #region anticipo_egreso + SysQueryEncabezado += @" +ISNULL(bms_antegr.EMISOR_REGIMENFISCAL, '') AS Emisor_RegimenFiscal, +ISNULL(bms_antegr.RECEPTOR_NOMBRE, '') AS Receptor_Nombre, +ISNULL(bms_antegr.RECEPTOR_RFC, '') AS Receptor_Rfc, +ISNULL(bms_antegr.RECEPTOR_RESIDENCIAFISCAL, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(bms_antegr.RECEPTOR_NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(bms_antegr.RECEPTOR_USOCFDI, '') AS Receptor_UsoCFDI, +ISNULL(bms_antegr.EMISOR_NOMBRE, '') AS Emisor_Nombre, +ISNULL(bms_antegr.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_antegr.COMPROBANTE_LUGAREXPEDICION, '') AS Comprobante_LugarExpedicion, +'E' AS Comprobante_TipoDeComprobante, +'30' AS Comprobante_FormaPago, +ISNULL(bms_antegr.COMPROBANTE_METODOPAGO, '') AS Comprobante_MetodoPago, +ISNULL(bms_antegr.COMPROBANTE_SERIE, '') AS Comprobante_Serie, +ISNULL(bms_antegr.COMPROBANTE_FOLIO, '') AS Comprobante_Folio, +ISNULL(bms_antegrdet.TOTAL, 0) AS Comprobante_Total, +ISNULL(bms_antegr.COMPROBANTE_TIPOCAMBIO, 0) AS Comprobante_TipoCambio, +ISNULL(bms_antegrdet.SUBTOTAL, 0) AS Comprobante_SubTotal, +ISNULL(bms_antegr.COMPROBANTE_MONEDA, '') AS Comprobante_Moneda, +ISNULL(bms_antegrdet.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_antegrdet.ESTATUS, '') AS Comprobante_Estatus, +0 AS Comprobante_Descuento, +CASE WHEN ISNULL(bms_antegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.IVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(bms_antegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.IVAPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje, +CASE WHEN ISNULL(bms_antegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.IVARETENIDO, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenido, +CASE WHEN ISNULL(bms_antegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.IVARETENIDOPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenidoPorcentaje, +CASE WHEN ISNULL(bms_antegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.ISR, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISR, +CASE WHEN ISNULL(bms_antegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.ISRPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISRPorcentaje, +ISNULL(bms_antegr.ESTATUS, '') AS Comprobante_EstatusIngreso +FROM Anticipos AS bms_antegr +INNER JOIN Anticipos_Egresos_Detalles AS bms_antegrdet ON bms_antegrdet.ANTICIPOSYSID = bms_antegr.SYSID +WHERE bms_antegrdet.ANTICIPOSYSID = " + ComprobanteDBSysId; + SysQueryPartidas += @" +ISNULL(bms_antegrdet.PRODUCTOCLAVE, '') AS ClaveProdServ, +'' AS NoIdentificacion, +ISNULL(bms_antegrdet.CANTIDAD, 0) AS Cantidad, +ISNULL(bms_antegrdet.UNIDADMEDIDACLAVE, '') AS ClaveUnidad, +'' AS Unidad, +ISNULL(bms_antegrdet.DESCRIPCION, '') AS Descripcion, +0 AS Descuento, +ISNULL(bms_antegrdet.VALORUNITARIO, 0) AS ValorUnitario, +ISNULL(bms_antegrdet.IMPORTE, 0) AS Importe, +CASE WHEN ISNULL(bms_antegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.IVA, 0) AS VARCHAR(100)) END AS PartidaIVA, +CASE WHEN ISNULL(bms_antegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.IVAPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVAPorcentaje, +CASE WHEN ISNULL(bms_antegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.IVARETENIDO, 0) AS VARCHAR(100)) END AS PartidaIVARetenido, +CASE WHEN ISNULL(bms_antegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.IVARETENIDOPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVARetenidoPorcentaje, +CASE WHEN ISNULL(bms_antegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.ISR, 0) AS VARCHAR(100)) END AS PartidaISR, +CASE WHEN ISNULL(bms_antegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_antegrdet.ISRPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaISRPorcentaje +FROM Anticipos_Egresos_Detalles AS bms_antegrdet +WHERE bms_antegrdet.ANTICIPOSYSID = " + ComprobanteDBSysId + " ORDER BY bms_antegrdet.LINEA"; + SysQueryRelacionados = @" +SELECT +ISNULL(bms_antegr.FOLIOPAC, '') AS UUID +FROM Anticipos AS bms_antegr +INNER JOIN AnticiposAplicacion AS bms_antegr_apl ON bms_antegr.SYSID = bms_antegr_apl.SYSID_APLICACION +INNER JOIN factfactura AS bms_fac ON bms_antegr_apl.FACTURA =(select ff.CONSECUTIVO from factfactura ff where ff.FACTURA = bms_fac.FACTURA ) +INNER JOIN Anticipos_Egresos_Detalles AS bms_antegrdet ON bms_antegrdet.ANTICIPOSYSID = bms_antegr.SYSID +WHERE bms_antegrdet.ANTICIPOSYSID = " + ComprobanteDBSysId; + #endregion anticipo_egreso + break; + case "traslado": + #region bms traslado timbrar + + SysQueryEncabezado += @" +ISNULL(bms_tra.CFDI33_EmisorRegimenFiscal, '') AS Emisor_RegimenFiscal, +ISNULL(bms_tra.RECEPTOR_NOMBRE, '') AS Receptor_Nombre, +ISNULL(bms_tra.RECEPTOR_RFC, '') AS Receptor_Rfc, +ISNULL(bms_tra.CFDI33_RESIDENCIAFISCAL, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(bms_tra.CFDI33_NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(bms_tra.CFDI33_Receptor_UsoCFDI, '') AS Receptor_UsoCFDI, +ISNULL(bms_tra.EMISOR_NOMBRE, '') AS Emisor_Nombre, +ISNULL(bms_tra.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_tra.EMISOR_CP, '') AS Comprobante_LugarExpedicion, +ISNULL(bms_tra.TRASLADO_CFDI33_TIPOCOMPROBANTE, '') AS Comprobante_TipoDeComprobante, +ISNULL(bms_tra.CONDICIONPAGO, '') AS Comprobante_FormaPago, +ISNULL(bms_tra.CFDI33_MetodoPago, '') AS Comprobante_MetodoPago, +ISNULL(bms_tra.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_tra.FACTURA, '') AS Comprobante_Folio, +0 AS Comprobante_Total, +ISNULL(bms_tra.TIPOCAMBIO, 0) AS Comprobante_TipoCambio, +0 AS Comprobante_SubTotal, +ISNULL(bms_tra.Moneda, '') AS Comprobante_Moneda, +ISNULL(bms_tra.CFDI33_FechaYHoraEmision, '') AS Comprobante_Fecha, +ISNULL(bms_tra.TRASLADO_ESTATUS, '') AS Comprobante_Estatus, +0 AS Comprobante_Descuento, +'NA' AS Comprobante_ImporteIVA, +'NA' AS Comprobante_ImporteIVAPorcentaje, +'NA' AS Comprobante_ImporteIVARetenido, +'NA' AS Comprobante_ImporteIVARetenidoPorcentaje, +'NA' AS Comprobante_ImporteISR, +'NA' AS Comprobante_ImporteISRPorcentaje, +ISNULL(bms_tra.CFDI33_CartaPorte,0) as CartaPorte, + +--CFDI4.0 +isnull(bms_tra.Exportacion,'') AS Exportacion, +ISNULL(bms_tra.INFOGLO_PERIODICIDAD,'') AS Periodicidad, +ISNULL(bms_tra.INFOGLO_MESES,'') AS Meses, +ISNULL(bms_tra.INFOGLO_ANIO,'') AS Anio, +--isnull((select CFDI33_DomicilioFiscal from cliente where clave = bms_tra.CLIENTE ),'') AS Receptor_DomicilioFiscal, +--isnull((select CFDI33_REGIMENFISCAL from cliente where clave = bms_tra.CLIENTE ),'') AS Receptor_RegimenFiscal +bms_tra.RECEPTOR_CP AS Receptor_DomicilioFiscal, +bms_tra.CFDI33_EmisorRegimenFiscal AS Receptor_RegimenFiscal + +FROM factfactura AS bms_tra +WHERE bms_tra.CONSECUTIVO = " + ComprobanteDBSysId; + + if (CFDI4) + { + SysQueryPartidas += @" +ISNULL(bms_tradet.CFDI33_OBJETOIMP,'') AS ObjetoImp, +ISNULL(bms_tradet.RFCACUENTATERCEROS,'') AS RFC_Terceros, +ISNULL(bms_tradet.NOMBREACUENTATERCEROS,'') AS Nombre_Terceros, +ISNULL(bms_tradet.RegimenFiscalACuentaTerceros,'') AS Regimen_Terceros, +ISNULL(bms_tradet.DomicilioFiscalACuentaTerceros,'') AS Domicilio_Terceros, +"; + } + + SysQueryPartidas += @" +ISNULL(bms_tradet.CFDI33_CLAVEPRODSERV, '') AS ClaveProdServ, +'' AS NoIdentificacion, +ISNULL(bms_tradet.CANTIDAD, 0) AS Cantidad, +ISNULL(bms_tradet.CFDI33_CLAVEUNIDAD, '') AS ClaveUnidad, +'' AS Unidad, +ISNULL(bms_tradet.DESCRIPCION, '') AS Descripcion, +0 AS Descuento, +0 AS ValorUnitario, +0 AS Importe, +'NA' AS PartidaIVA, +'NA' AS PartidaIVAPorcentaje, +'NA' AS PartidaIVARetenido, +'NA' AS PartidaIVARetenidoPorcentaje, +'NA' AS PartidaISR, +'NA' AS PartidaISRPorcentaje +FROM factdetfacturas AS bms_tradet +JOIN factfactura AS bms_tra ON bms_tra.CONSECUTIVO = bms_tradet.CONSECUTIVO +WHERE ISNULL(bms_tradet.TOTAL, 0) = 0 AND bms_tradet.CONSECUTIVO = " + ComprobanteDBSysId + " ORDER BY bms_tradet.LINEA"; + + //-------COMETADO PARA PRUEBAS + //--SELECT + //--ISNULL(bms_tra.FOLIOPAC, '') AS UUID + //--FROM factfactura AS bms_tra + //--WHERE ISNULL(bms_tra.FOLIOPAC, '') != '' AND ISNULL(bms_tra.CFDI33_CARTAPORTE, 0) = 1 AND bms_tra.CONSECUTIVO = + //-------COMETADO PARA PRUEBAS + SysQueryRelacionados = @" +Select ISNULL(UUID, '') AS UUID +from CFD33DocumentosRelacionadosFI +where SYSID_DR =" + ComprobanteDBSysId; + + + SysQueryCartaPorte += @" +select +CP.FIGURA_TRAN_CLAVETRANSPORTE AS FIGURA_TRAN_CLAVETRANSPORTE, +iif(CP.CARTAPORTE_TRANSPINTERNAC='Si','Sí','No') AS TranspInternac , +iif(CP.CARTAPORTE_TRANSPINTERNAC ='No','',CARTAPORTE_ENTRADASALIDAMERC) AS EntradaSalidaMerc , +iif (CP.CARTAPORTE_TRANSPINTERNAC ='No','',CARTAPORTE_VIAENTRADASALIDA) AS ViaEntradaSalida, +iif (CP.CARTAPORTE_TRANSPINTERNAC ='Si',CP.CartaPorte_PaisOrigenDestino,'') AS PaisOrigenDestino, +(select isNULL(sum(UBICACION_DISTANCIARECORRIDA),0) from CFDI33_CartaPorte_Ubicaciones where ID_CARTAPORTE_ = CP.ID_FACTURA_CONSECUTIVO) AS TotalDistRec, +--iif(CP.CP_MCIAS_AUTOFED = 1,'True','false') +IsNull(CP_MCIAS_AUTOFED,0) , +IsNull(CP_MCIAS_AUTOFED_PERMSCT,'') AS PermSCT, +isNull(CP_MCIAS_AUTOFED_NUMPERMISOSCT,'') AS NumPermisoSCT, +isNUll(CP_MCIAS_AUTOFED_NOMBREASEG, '') AS NombreAseg, +isNUll(CP_MCIAS_AUTOFED_NUMPOLIZASEGURO,'') AS NumPolizaSeguro, + +--AutotransporteFederal:identificacion Vehicular +ISNULL(CP.CP_MCIAS_AUTOFED_IDV_CONFIGVEHICULAR,'') AS ConfigVehicular, +isNUll(CP.CP_MCIAS_AUTOFED_IDV_PLACAVM,'') AS PlacaVM, +isNull(CP.CP_MCIAS_AUTOFED_IDV_ANIOMODELOVM,'') AS AnioModeloVM, + +--AutoTransporteFederal:Remolques +IsNull(CP.CP_MCIAS_AUTOFED_REM1_SUBTIPOREM,'') AS SubTipoRem, +isNUll(CP.CP_MCIAS_AUTOFED_REM1_PLACA,'') AS Placa, +IsNull(CP.CP_MCIAS_AUTOFED_REM2_SUBTIPOREM,'') AS SubTipoRem2, +isNUll(CP.CP_MCIAS_AUTOFED_REM2_PLACA,'') AS Placa2, + +--SEGUROS +ISNULL(ASEGURARESPCIVIL,'') AS AseguraRespCivil, +ISNULL(PolizaRespCivil, '') AS PolizaRespCivil, +ISNULL(AseguraMedAmbiente, '') AS AseguraMedAmbiente, +ISNULL(PolizaMedAmbiente, '') AS PolizaMedAmbiente, +ISNULL(AseguraCarga, '') AS AseguraCarga, +ISNULL(PolizaCarga, '') AS PolizaCarga, +ISNULL(PrimaSeguro, 0) AS PrimaSeguro, + +/*Campos Nuevos 3.0*/ +ISNULL(IDCCP,'') AS ID_Complemento, +ISNULL(REGIMENADUANERO,'') AS REGIMENADUANERO, +ISNULL(REGISTROISTMO,'') AS REGISTROISTMO, +ISNULL(UBICACIONPOLOORIGEN,'') AS UBICACIONPOLOORIGEN, +ISNULL(UBICACIONPOLODESTINO,'') AS UBICACIONPOLODESTINO, +ISNULL(LOGISTICAINVERSARECOLECCIONDEVOLUCION, '') AS LogisticaInv, +ISNULL(CP_MCIAS_AUTOFED_IDV_PESOBRUTOVEHICULAR,'') AS CP_MCIAS_AUTOFED_IDV_PESOBRUTOVEHICULAR + + + +from CFDI33_CartaPorte CP +JOIN factfactura f on f.CONSECUTIVO = CP.ID_FACTURA_CONSECUTIVO +join CFDI33_CartaPorte_Seguros cps on cps.ID_CP_SEGUROS = CP.ID_FACTURA_CONSECUTIVO +where CP.ID_FACTURA_CONSECUTIVO=" + ComprobanteDBSysId; + SysQueryPedimentos = ""; + SysQueryPedimentos += @" +select +ISNULL(ID_CP_MERANCIA_PEDIMENTO, 0) AS ID_CP_MERANCIA_PEDIMENTO, +ISNULL(LINEAMERCANCIA, 0) AS LINEAMERCANCIA, +ISNULL(LINEAPEDIMENTOMERCA, 0) AS LINEAPEDIMENTOMERCA, +ISNULL(PEDIMENTO, '') AS PEDIMENTO +from CFDI33_CartaPorte_Pedimentos +where ID_CP_MERANCIA_PEDIMENTO = " + ComprobanteDBSysId; + SysQueryGuiasIdentificacion = ""; + SysQueryGuiasIdentificacion += @" +select +ISNULL(ID_CARTAPORTE_MERCANCIA, 0) AS ID_CARTAPORTE_MERCANCIA, +ISNULL(LINEAMERCANCIA, 0) AS LINEAMERCANCIA, +ISNULL(LINEAGUIAIDENTIFICACION, 0) AS LINEAGUIAIDENTIFICACION, +ISNULL(NUMEROGUIAIDENTIFICACION,'') AS NUMEROGUIAIDENTIFICACION, +ISNULL(DESCRIPGUIAIDENTIFICACION, '') AS DESCRIPGUIAIDENTIFICACION, +ISNULL(PESOGUIAIDENTIFICACION, 0) AS PESOGUIAIDENTIFICACION +from CFDI33_CartaPorte_GuiasIdentificacion +where ID_CARTAPORTE_MERCANCIA =" + ComprobanteDBSysId; + + + SysQueryUbicaciones += @" +select +CPU.ID_CARTAPORTE_ AS Id_Carta_Porte, +cpu.LINEA AS Linea, +CPU.UBICACION_ORIGEN AS Origen, +CPU.UBICACION_DESTINO AS Destino, + +iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0,'NA',isNull(CPU.UBICACION_TIPOESTACION,'')) AS TipoEstacion, +isNUll(CPU.UBICACION_DISTANCIARECORRIDA,0) AS DistanciaRecorrida, +--Origen +iif(CPU.UBICACION_ORIGEN=1,isNull(CPU.UBICACION_ORIGEN_IDORIGEN,''),'NA') AS IDOrigen, +iif(CPU.UBICACION_ORIGEN=1,isNUll(CPU.UBICACION_ORIGEN_RFCREMITENTE,''),'NA') AS RFCRemitente, +iif(CPU.UBICACION_ORIGEN=1,isNUll(CPU.UBICACION_ORIGEN_NOMBREREMITENTE,'NA'),'NA') AS NombreRemitente, +iif(CPU.UBICACION_ORIGEN=1,ISNULL(CPU.UBICACION_ORIGEN_NUMREGIDTRIB,''),'NA') AS NumRegIdTrib_Ori, +iif(CPU.UBICACION_ORIGEN=1,isNull(CPU.UBICACION_ORIGEN_RESIDENCIAFISCAL,''),'NA') AS ResidenciaFiscal_Ori, +iif(CPU.UBICACION_ORIGEN=1,iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0,'NA',ISNULL(CPU.UBICACION_ORIGEN_NUMESTACION,'')),'NA') AS NumEstacion_Ori, +iif(CPU.UBICACION_ORIGEN=1,iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0,'NA', isNull(CPU.UBICACION_ORIGEN_NOMBREESTACION,'')),'NA') AS NombreEstacion_Ori, +iif(CPU.UBICACION_ORIGEN=1,isNull(CPU.UBICACION_ORIGEN_NAVEGACIONTRAFICO,''),'NA') AS NavegacionTrafico_Ori, +iif(CPU.UBICACION_ORIGEN=1,isNull(CPU.UBICACION_ORIGEN_FECHAHORASALIDA,''),'NA') AS FechaHoraSalida_Ori, +--Destino +iif(CPU.UBICACION_DESTINO=1,isNull(CPU.UBICACION_DESTINO_IDDESTINO,''),'NA') AS IDDestino, +iif(CPU.UBICACION_DESTINO=1,isNUll(CPU.UBICACION_DESTINO_RFCDESTINATARIO,''),'NA') AS RFCDestinatario, +iif(CPU.UBICACION_DESTINO=1,isNUll(CPU.UBICACION_DESTINO_NOMBRE,'NA'),'NA') AS NombreDestinatario, +iif(CPU.UBICACION_DESTINO=1,ISNULL(CPU.UBICACION_DESTINO_NUMREGIDTRIB,''),'NA') AS NumRegIdTrib_Des, +iif(CPU.UBICACION_DESTINO=1,isNull(CPU.UBICACION_DESTINO_RESIDENCIAFISCAL,''),'NA') AS ResidenciaFiscal_Des, +iif(CPU.UBICACION_DESTINO=1,iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0,'NA',ISNULL(CPU.UBICACION_DESTINO_NUMESTACION,'')), 'NA')AS NumEstacion_Des, +iif(CPU.UBICACION_DESTINO=1,iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0,'NA',isNull(CPU.UBICACION_DESTINO_NOMBREESTACION,'')),'NA') AS NombreEstacion_Des, +iif(CPU.UBICACION_DESTINO=1,isNull(CPU.UBICACION_DESTINO_NAVEGACIONTRAFICO,''),'NA') AS NavegacionTrafico_Des, +iif(CPU.UBICACION_DESTINO=1,isNull(CPU.UBICACION_DESTINO_FECHAHORAPROGLLEGADA,''),'NA') AS FechaHoraSalida_Des, + +--Ubicacion:Domicilio +isNull(CPU.UBICACION_DOMICILIO_CALLE,'') AS Calle, +isNUll(CPU.UBICACION_DOMICILIO_NUMEROEXTERIOR,'') AS NumeroExterior, +isNUll(CPU.UBICACION_DOMICILIO_NUMEROINTERIOR,'') AS NumeroInterior, +isNull(CPU.UBICACION_DOMICILIO_COLONIA,'') AS Colonia, +isNUll(CPU.UBICACION_DOMICILIO_LOCALIDAD,'') AS Localidad, +ISNULL(CPU.UBICACION_DOMICILIO_REFERENCIA,'') AS Referencia, +isNUll(CPU.UBICACION_DOMICILIO_MUNICIPIO,'') AS Municipio, +isNull(CPU.UBICACION_DOMICILIO_ESTADO,'') AS Estado, +isNUll(CPU.UBICACION_DOMICILIO_PAIS,'') AS Pais, +isNull(CPU.UBICACION_DOMICILIO_CODIGOPOSTAL,'') AS CodigoPostal +from CFDI33_CartaPorte_Ubicaciones CPU +Join CFDI33_CartaPorte CP on cp.ID_FACTURA_CONSECUTIVO =CPU.ID_CARTAPORTE_ +where CPU.ID_CARTAPORTE_ =" + ComprobanteDBSysId; + + SysQueryFiguraTransporte += @" +select +ID_FAC_CARTAPORTE_FIGURATRANS as Conse, +LINEA_FIGURATRANS AS linea, +TIPOFIGURA AS TIPOFIGURA, +--Operador +iif(TIPOFIGURA='O',OPE_RFCOPERADOR,'NA') AS RFCOperador, +iif(TIPOFIGURA='O',OPE_NUMLICENCIA,'NA') AS NumLicencia, +iif(TIPOFIGURA='O',OPE_NOMBREOPERADOR,'NA') AS NombreOperador, +iif(TIPOFIGURA='O',OPE_NUMREGIDTRIBOPERADOR,'NA') AS NumRegIdTribOperador, +iif(TIPOFIGURA='O',OPE_RESIDENCIAFISCALOPERADOR,'NA') AS ResidenciaFiscalOperador, + +--Propietario +iif(TIPOFIGURA='P',PROP_RFCPROPIETARIO,'NA') AS RFCPropietario, +iif(TIPOFIGURA='P',PROP_NOMBREPROPIETARIO,'NA') AS NombrePropietario, +iif(TIPOFIGURA='P',PROP_NUMREGIDTRIBPROPIETARIO,'NA') AS NumRegIdTribPropietario, +iif(TIPOFIGURA='P',PROP_RESIDENCIAFISCALPROPIETARIO,'NA') AS ResidenciaFiscalPropietario, + +--Arrendatario + +iif(TIPOFIGURA='A',ARRE_RFCARRENDATARIO,'NA') AS RFCArrendatario, +iif(TIPOFIGURA='A',ARRE_NOMBREARRENDATARIO,'NA') AS NombreArrendatario, +iif(TIPOFIGURA='A',ARRE_NUMREGIDTRIBARRENDATARIO,'NA') AS NumRegIdTribArrendatario, +iif(TIPOFIGURA='A',ARRE_RESIDENCIAFISCALARRENDATARIO,'NA') AS ResidenciaFiscalArrendatario, + +--Notificado +iif(TIPOFIGURA='N',NOTI_RFCNOTIFICADO,'NA') AS RFCNotificado, +iif(TIPOFIGURA='N',NOTI_NOMBRENOTIFICADO,'NA') AS NombreNotificado, +iif(TIPOFIGURA='N',NOTI_NUMREGIDTRIBNOTIFICADO,'NA') AS NumRegIdTribNotificado, +iif(TIPOFIGURA='N',NOTI_RESIDENCIAFISCALNOTIFICADO,'NA') AS ResidenciaFiscalNotificado, +--Domicilio +isNull(CALLE, '') AS Calle, +isNull(NUMEROEXTERIOR, '') AS NumeroExterior, +isNull(NUMEROINTERIOR, '') AS NumeroInterior, +isNull(COLONIA,'') AS Colonia, +isNull(LOCALIDAD,'') AS Localidad, +isNull(REFERENCIA,'') AS Referencia, +isNull(MUNICIPIO,'') AS Municipio, +isNull(ESTADO,'') AS Estado, +isNull(PAIS,'') AS Pais, +isNull(CODIGOPOSTAL,'') AS CodigoPostal +from CFDI33_FiguraTransporte +where ID_FAC_CARTAPORTE_FIGURATRANS =" + ComprobanteDBSysId; + + + SysQueryMercancias += @" +select +CPM.ID_CARTAPORTE_MERCANCIA As CartaPorteMerca, +CPM.LINEAMERCANCIA AS Linea, + +iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0 +,isNull(CP.CP_MCIAS_PESOBRUTOTOTAL,0),0) AS PesoBrutoTotal, + +iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0 +,isNUll(CP.CP_MCIAS_UNIDADPESO,''),'NA') AS UnidadPesoM, + +iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0 +,0,isNUll(CP.CP_MCIAS_PESONETOTOTAL,0)) AS PesoNetoTotal, + +isNUll(CP.CP_MCIAS_NUMTOTALMERCANCIAS,0) AS NumTotalMercancias, + +iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0 +,0,isNull(CP.CP_MCIAS_CARGOPORTASACION,0)) AS CargoPorTasacion, + +--Mercancia +isNull(CPM.BIENESTRANSP,'') AS BienesTransp, +isNull(CPM.ClaveSTCC,'') AS ClaveSTCC, +isNull(CPM.Descripcion,'') AS Descripcion, +isNull(CPM.CANTIDAD,0) AS Cantidad, +isNull(CPM.ClaveUnidad,'') AS ClaveUnidad, +isNull(CPM.Unidad,'') AS Unidad, +isNull(CPM.DIMENSIONES,'') AS Dimensiones, +isNull(CPM.MATERIALPELIGROSO,'No') AS MaterialPeligroso, +iif(isNull(CPM.MATERIALPELIGROSO,'No')='No','NA',isNull(CPM.CVEMATERIALPELIGROSO,'NA')) AS CveMaterialPeligroso, +iif(isNull(CPM.MATERIALPELIGROSO,'No')='No','NA',isNull(CPM.EMBALAJE,'NA')) AS Embalaje, +iif(isNull(CPM.MATERIALPELIGROSO,'No')='No','NA',isNull(CPM.DESCRIPEMBALAJE,'NA')) AS DescripEmbalaje, +isNull(CPM.PESOENKG,0) AS PesoEnKg, +isNull(CPM.VALORMERCANCIA,0) AS ValorMercancia, + +isNull(CPM.MONEDA,0) AS MonedaMercancia, +isNull(CPM.FRACCIONARANCELARIA,0) AS FraccionArancelaria, +isNull(CPM.UUIDCOMERCIOEXT,0) AS UUIDComercioExt, + +--Detalles Mercancia +isNull(CPM.DETALLEMERCANCIA_UNIDADPESO,0) AS UnidadPeso, +isNull(CPM.DETALLEMERCANCIA_PESOBRUTO,0) AS PesoBruto, +isNull(CPM.DETALLEMERCANCIA_PESONETO,0) AS PesoNeto, +isNull(CPM.DETALLEMERCANCIA_PESOTARA,0) AS PesoTara, +isNull(CPM.DETALLEMERCANCIA_NUMPIEZAS,0) AS NumPiezas, + +/*Nuevos campos CCP 3.0*/ +ISNULL(CPM.SECTORCOFEPRIS,'') AS CPM_SECTORCOFEPRIS, +ISNULL(CPM.NombreIngredienteActivo,'') AS CPM_NombreIngredienteActivo, +ISNULL(CPM.NomQuimico,'') AS CPM_NomQuimico, +ISNULL(CPM.DenominacionGenericaProd,'') AS CPM_DenominacionGenericaProd, +ISNULL(CPM.DenominacionDistintivaProd,'') AS CPM_DenominacionDistintivaProd, +ISNULL(CPM.Fabricante,'') AS CPM_Fabricante, +ISNULL(CPM.FechaCaducidad,'') AS CPM_FechaCaducidad, +ISNULL(CPM.LoteMedicamento,'') AS CPM_LoteMedicamento, +ISNULL(CPM.SECTORCOFEPRIS,'') AS CPM_FormaFarmaceutica, +ISNULL(CPM.CondicionesEspTransp,'') AS CPM_CondicionesEspTransp, +ISNULL(CPM.RegistroSanitarioFolioAutorizacion,'') AS CPM_RegistroSanitarioFolioAutorizacion, +ISNULL(CPM.PermisoImportacion,'') AS CPM_PermisoImportacion, +ISNULL(CPM.FolioImpoVUCEM,'') AS CPM_FolioImpoVUCEM, +ISNULL(CPM.NumCAS,'') AS CPM_NumCAS, +ISNULL(CPM.RazonSocialEmpImp,'') AS CPM_RazonSocialEmpImp, +ISNULL(CPM.NumRegSanPlagCOFEPRIS,'') AS CPM_NumRegSanPlagCOFEPRIS, +ISNULL(CPM.DatosFabricante,'') AS CPM_DatosFabricante, +ISNULL(CPM.DatosFormulador,'') AS CPM_DatosFormulador, +ISNULL(CPM.DatosMaquilador,'') AS CPM_DatosMaquilador, +ISNULL(CPM.UsoAutorizado,'') AS CPM_UsoAutorizado, +ISNULL(CPM.TipoMateria,'') AS CPM_TipoMateria, +ISNULL(CPM.DescripcionMateria,'') AS CPM_DescripcionMateria + +from CFDI33_CartaPorte_Mercancias CPM +Join CFDI33_CartaPorte CP on cp.ID_FACTURA_CONSECUTIVO =CPM.ID_CARTAPORTE_MERCANCIA +where CPM.ID_CARTAPORTE_MERCANCIA=" + ComprobanteDBSysId; + + + + + SysQueryMercancias_CantidadTransporta += @" +select +CPCT.ID_CARTAPORTE_MERCANCIA AS ID, +CPCT.LINEAMERCANCIA AS Linea_Merca , +CPCT.ID_CANTIDADTRANSPORTA AS LineaCantTrans, +isNull(CPCT.MCIA_CANTIDAD, 0) AS Cantidad, +isNull(CPCT.MCIA_IDORIGEN,'') AS IDOrigen, +isNull(CPCT.MCIA_IDDESTINO,'') AS IDDestino, +isNull(CPCT.MCIA_CVESTRANSPORTE,'') AS CvesTransporte +from CFDI33_CartaPorte_CantidadTransporta CPCT +join CFDI33_CartaPorte_Mercancias CPM on CPM.ID_CARTAPORTE_MERCANCIA=CPCT.ID_CARTAPORTE_MERCANCIA +and CPM.LINEAMERCANCIA = CPCT.LINEAMERCANCIA +where CPCT.ID_CARTAPORTE_MERCANCIA=" + ComprobanteDBSysId; + + #endregion bms traslado timbrar + break; + case "factura": + #region bms factura timbrar + //complemento comercio exterior + SysQueryComercioExterior = @" +SELECT +ISNULL(bms_fac.ComercioExterior_Emisor_Curp, '') AS ComercioExterior_Emisor_Curp, +ISNULL(bms_fac.ComercioExterior_Emisor_Domicilio_Calle, '') AS ComercioExterior_Emisor_Domicilio_Calle, +ISNULL(bms_fac.ComercioExterior_Emisor_Domicilio_NumeroExterior, '') AS ComercioExterior_Emisor_Domicilio_NumeroExterior, +ISNULL(bms_fac.ComercioExterior_Emisor_Domicilio_NumeroInterior, '') AS ComercioExterior_Emisor_Domicilio_NumeroInterior, +ISNULL(bms_fac.ComercioExterior_Emisor_Domicilio_Colonia, '') AS ComercioExterior_Emisor_Domicilio_Colonia, +ISNULL(bms_fac.ComercioExterior_Emisor_Domicilio_Localidad, '') AS ComercioExterior_Emisor_Domicilio_Localidad, +ISNULL(bms_fac.ComercioExterior_Emisor_Domicilio_Referencia, '') AS ComercioExterior_Emisor_Domicilio_Referencia, +ISNULL(bms_fac.ComercioExterior_Emisor_Domicilio_Municipio, '') AS ComercioExterior_Emisor_Domicilio_Municipio, +ISNULL(bms_fac.ComercioExterior_Emisor_Domicilio_Estado, '') AS ComercioExterior_Emisor_Domicilio_Estado, +ISNULL(bms_fac.ComercioExterior_Emisor_Domicilio_Pais, '') AS ComercioExterior_Emisor_Domicilio_Pais, +ISNULL(bms_fac.ComercioExterior_Emisor_Domicilio_CodigoPostal, '') AS ComercioExterior_Emisor_Domicilio_CodigoPostal, +ISNULL(bms_fac.ComercioExterior_Propietario_NumRegIdTrib, '') AS ComercioExterior_Propietario_NumRegIdTrib, +ISNULL(bms_fac.ComercioExterior_Propietario_ResidenciaFiscal, '') AS ComercioExterior_Propietario_ResidenciaFiscal, +ISNULL(bms_fac.ComercioExterior_Receptor_NumRegIdTrib, '') AS ComercioExterior_Receptor_NumRegIdTrib, +ISNULL(bms_fac.ComercioExterior_Receptor_Domicilio_Calle, '') AS ComercioExterior_Receptor_Domicilio_Calle, +ISNULL(bms_fac.ComercioExterior_Receptor_Domicilio_NumeroExterior, '') AS ComercioExterior_Receptor_Domicilio_NumeroExterior, +ISNULL(bms_fac.ComercioExterior_Receptor_Domicilio_NumeroInterior, '') AS ComercioExterior_Receptor_Domicilio_NumeroInterior, +ISNULL(bms_fac.ComercioExterior_Receptor_Domicilio_Colonia, '') AS ComercioExterior_Receptor_Domicilio_Colonia, +ISNULL(bms_fac.ComercioExterior_Receptor_Domicilio_Localidad, '') AS ComercioExterior_Receptor_Domicilio_Localidad, +ISNULL(bms_fac.ComercioExterior_Receptor_Domicilio_Referencia, '') AS ComercioExterior_Receptor_Domicilio_Referencia, +ISNULL(bms_fac.ComercioExterior_Receptor_Domicilio_Municipio, '') AS ComercioExterior_Receptor_Domicilio_Municipio, +ISNULL(bms_fac.ComercioExterior_Receptor_Domicilio_Estado, '') AS ComercioExterior_Receptor_Domicilio_Estado, +ISNULL(bms_fac.ComercioExterior_Receptor_Domicilio_Pais, '') AS ComercioExterior_Receptor_Domicilio_Pais, +ISNULL(bms_fac.ComercioExterior_Receptor_Domicilio_CodigoPostal, '') AS ComercioExterior_Receptor_Domicilio_CodigoPostal, +ISNULL(bms_fac.ComercioExterior_Destinatario_NumRegIdTrib, '') AS ComercioExterior_Destinatario_NumRegIdTrib, +ISNULL(bms_fac.ComercioExterior_Destinatario_Nombre, '') AS ComercioExterior_Destinatario_Nombre, +ISNULL(bms_fac.ComercioExterior_Destinatario_Domicilio_Calle, '') AS ComercioExterior_Destinatario_Domicilio_Calle, +ISNULL(bms_fac.ComercioExterior_Destinatario_Domicilio_NumeroExterior, '') AS ComercioExterior_Destinatario_Domicilio_NumeroExterior, +ISNULL(bms_fac.ComercioExterior_Destinatario_Domicilio_NumeroInterior, '') AS ComercioExterior_Destinatario_Domicilio_NumeroInterior, +ISNULL(bms_fac.ComercioExterior_Destinatario_Domicilio_Colonia, '') AS ComercioExterior_Destinatario_Domicilio_Colonia, +ISNULL(bms_fac.ComercioExterior_Destinatario_Domicilio_Localidad, '') AS ComercioExterior_Destinatario_Domicilio_Localidad, +ISNULL(bms_fac.ComercioExterior_Destinatario_Domicilio_Referencia, '') AS ComercioExterior_Destinatario_Domicilio_Referencia, +ISNULL(bms_fac.ComercioExterior_Destinatario_Domicilio_Municipio, '') AS ComercioExterior_Destinatario_Domicilio_Municipio, +ISNULL(bms_fac.ComercioExterior_Destinatario_Domicilio_Estado, '') AS ComercioExterior_Destinatario_Domicilio_Estado, +ISNULL(bms_fac.ComercioExterior_Destinatario_Domicilio_Pais, '') AS ComercioExterior_Destinatario_Domicilio_Pais, +ISNULL(bms_fac.ComercioExterior_Destinatario_Domicilio_CodigoPostal, '') AS ComercioExterior_Destinatario_Domicilio_CodigoPostal, +ISNULL(bms_fac.ComercioExterior_Version, '') AS ComercioExterior_Version, +ISNULL(bms_fac.ComercioExterior_MotivoTraslado, '') AS ComercioExterior_MotivoTraslado, +ISNULL(bms_fac.ComercioExterior_TipoOperacion, '') AS ComercioExterior_TipoOperacion, +ISNULL(bms_fac.ComercioExterior_ClaveDePedimento, '') AS ComercioExterior_ClaveDePedimento, +ISNULL(bms_fac.ComercioExterior_CertificadoOrigen, '') AS ComercioExterior_CertificadoOrigen, +ISNULL(bms_fac.ComercioExterior_NumCertificadoOrigen, '') AS ComercioExterior_NumCertificadoOrigen, +ISNULL(bms_fac.ComercioExterior_NumeroExportadorConfiable, '') AS ComercioExterior_NumeroExportadorConfiable, +ISNULL(bms_fac.ComercioExterior_Incoterm, '') AS ComercioExterior_Incoterm, +ISNULL(bms_fac.ComercioExterior_Subdivision, '') AS ComercioExterior_Subdivision, +ISNULL(bms_fac.ComercioExterior_Observaciones, '') AS ComercioExterior_Observaciones, +ISNULL(bms_fac.ComercioExterior_TotalUSD, 0) AS ComercioExterior_TotalUSD + +FROM FacturaComercioExterior AS bms_fac +WHERE bms_fac.CONSECUTIVO = " + ComprobanteDBSysId; + //complemento de INE + SysQueryEncabezado += @" +ISNULL(bms_fac.TipoProceso, '') AS TipoProceso, +ISNULL(bms_fac.TipoComite, '') AS TipoComite, +ISNULL(bms_fac.IdContabilidad, '') AS IdContabilidad, +"; + //Complemento Notaria + SysQueryEncabezado += @" +ISNULL(bms_fac.ADDCOMPLEMENTONOTARIO, 0) AS ComplementoNotaria, +ISNULL(bms_fac.INMUEBLE_TIPO, '') AS DescInmueble_TipoInmueble, +ISNULL(bms_fac.INMUEBLE_CALLE, '') AS DescInmueble_Calle, +ISNULL(bms_fac.INMUEBLE_NOEXTERIOR, '') AS DescInmueble_NoExterior, +ISNULL(bms_fac.INMUEBLE_NOINTERIOR, '') AS DescInmueble_NoInterior, +ISNULL(bms_fac.INMUEBLE_COLONIA, '') AS DescInmueble_Colonia, +ISNULL(bms_fac.INMUEBLE_LOCALIDAD, '') AS DescInmueble_Localidad, +ISNULL(bms_fac.INMUEBLE_REFERENCIA, '') AS DescInmueble_Referencia, +ISNULL(bms_fac.INMUEBLE_MUNICIPIO, '') AS DescInmueble_Municipio, +ISNULL(bms_fac.INMUEBLE_ESTADO, '') AS DescInmueble_Estado, +ISNULL(bms_fac.INMUEBLE_PAIS, '') AS DescInmueble_Pais, +ISNULL(bms_fac.INMUEBLE_CODIGOPOSTAL, '') AS DescInmueble_CodigoPostal, +ISNULL(bms_fac.OPERACION_NUMINSTRUMENTONOTARIAL, '') AS DatosOperacion_NumInstrumentoNotarial, +ISNULL(bms_fac.CFDI33_OPERACION_FECHAINSTNOTARIAL, '') AS DatosOperacion_FechaInstNotarial, +ISNULL(bms_fac.OPERACION_MONTOOPERACION, 0) AS DatosOperacion_MontoOperacion, +ISNULL(bms_fac.OPERACION_SUBTOTAL, 0) AS DatosOperacion_Subtotal, +ISNULL(bms_fac.OPERACION_IVA, 0) AS DatosOperacion_IVA, +ISNULL(bms_fac.NOTARIO_CURP, '') AS DatosNotario_CURP, +ISNULL(bms_fac.NOTARIO_NUMNOTARIA, '') AS DatosNotario_NumNotaria, +ISNULL(bms_fac.NOTARIO_ENTIDADFEDERATIVA, '') AS DatosNotario_EntidadFederativa, +ISNULL(bms_fac.NOTARIA_ADSCRIPCION, '') AS DatosNotario_Adscripcion, +ISNULL(bms_fac.ENAJENANTE_COPROSOCCONYUGALE, '') AS DatosEnajenante_CoproSocConyugalE, +ISNULL(bms_fac.ADQUIRIENTE_COPROSOCCONYUGALE, '') AS DatosAdquiriente_CoproSocConyugalE, +"; + + + if (CFDI4) { + SysQueryEncabezado += @" +isnull(bms_fac.Exportacion, '') AS Exportacion, +ISNULL(bms_fac.INFOGLO_PERIODICIDAD, '') AS Periodicidad, +ISNULL(bms_fac.INFOGLO_MESES, '') AS Meses, +ISNULL(bms_fac.INFOGLO_ANIO, '') AS Anio, +isnull((select CFDI33_DomicilioFiscal from cliente where clave = bms_fac.CLIENTE ),'') AS Receptor_DomicilioFiscal, +isnull((select CFDI33_REGIMENFISCAL from cliente where clave = bms_fac.CLIENTE ),'') AS Receptor_RegimenFiscal,"; + } + + //timbrado Normal Factura y Banderas de complementos + SysQueryEncabezado += @" +ISNULL(bms_fac.ComercioExterior_Activo, 0) AS ComercioExterior_Activo, +ISNULL(bms_fac.INE_Activo, 0) AS INE_Activo, +--ISNULL(bms_fac.Complemento_IEDU_Activo, 0) AS Complemento_IEDU_Activo, +ISNULL(bms_fac.CFDI33_EmisorRegimenFiscal, '') AS Emisor_RegimenFiscal, +/*ISNULL(bms_fac.RECEPTOR_NOMBRE, '') AS Receptor_Nombre,*/ +( select case when LEN(NOMBREFISCAL) > 101 then ISNULL(NOMBREFISCAL,'') else ISNULL(bms_fac.RECEPTOR_NOMBRE,'') end from cliente where CLAVE=bms_fac.cliente) AS Receptor_Nombre , +ISNULL(bms_fac.RECEPTOR_RFC, '') AS Receptor_Rfc, +ISNULL(bms_fac.CFDI33_RESIDENCIAFISCAL, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(bms_fac.CFDI33_NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(bms_fac.CFDI33_Receptor_UsoCFDI, '') AS Receptor_UsoCFDI, +ISNULL(bms_fac.EMISOR_NOMBRE, '') AS Emisor_Nombre, +ISNULL(bms_fac.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_fac.EMISOR_CP, '') AS Comprobante_LugarExpedicion, +ISNULL(bms_fac.CFDI33_TipoComprobante, '') AS Comprobante_TipoDeComprobante, +ISNULL(bms_fac.CONDICIONPAGO, '') AS Comprobante_FormaPago, +ISNULL(bms_fac.CFDI33_MetodoPago, '') AS Comprobante_MetodoPago, +ISNULL(bms_fac.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_fac.FACTURA, '') AS Comprobante_Folio, +CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN ISNULL(bms_fac.TOTALDOLARES, 0) ELSE ISNULL(bms_fac.TOTAL, 0) END AS Comprobante_Total, +ISNULL(bms_fac.TIPOCAMBIO, 0) AS Comprobante_TipoCambio, +CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN ISNULL(bms_fac.SUBTOTALDOLARES, 0) ELSE ISNULL(bms_fac.SUBTOTAL, 0) END AS Comprobante_SubTotal, +ISNULL(bms_fac.Moneda, '') AS Comprobante_Moneda, +ISNULL(bms_fac.CFDI33_FechaYHoraEmision, '') AS Comprobante_Fecha, +ISNULL(bms_fac.ESTATUS, '') AS Comprobante_Estatus, +ISNULL(bms_fac.CFDI33_CUENTAPREDIAL, '') AS Comprobante_CuentaPredial, +'' AS Comprobante_CondicionesDePago, +CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN ISNULL(bms_fac.DESCUENTODOLARES, 0) ELSE ISNULL(bms_fac.DESCUENTO, 0) END AS Comprobante_Descuento, +CASE WHEN ISNULL(bms_fac.IVA, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN CAST(ISNULL(IVADOLARES, 0) AS VARCHAR (100)) ELSE CAST(ISNULL(IVA, 0) AS VARCHAR (100)) END END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(bms_fac.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_fac.PORCENTAJEIVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje, +CASE WHEN ISNULL(bms_fac.RETENCIONIVAPESOS, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN CAST(ISNULL(RETENCIONIVADOLARES, 0) AS VARCHAR (100)) ELSE CAST(ISNULL(RETENCIONIVAPESOS, 0) AS VARCHAR (100)) END END AS Comprobante_ImporteIVARetenido, +CASE WHEN ISNULL(bms_fac.RETENCIONIVAPESOS, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_fac.PORCENTAJERETENCIONIVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenidoPorcentaje, +CASE WHEN ISNULL(bms_fac.RETENCIONISRPESOS, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN CAST(ISNULL(RETENCIONISRDOLARES, 0) AS VARCHAR (100)) ELSE CAST(ISNULL(RETENCIONISRPESOS, 0) AS VARCHAR (100)) END END AS Comprobante_ImporteISR, +CASE WHEN ISNULL(bms_fac.RETENCIONISRPESOS, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_fac.PORCENTAJERETENCIONISR, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISRPorcentaje, +ISNULL(bms_fac.ordencompra, '') AS Comprobante_PO, +ISNULL(bms_fac.CFDI33_CartaPorte,0) as CartaPorte +FROM factfactura AS bms_fac +WHERE bms_fac.CONSECUTIVO = " + ComprobanteDBSysId; + + + + SysQueryINE = @" +select +--isnull(Linea,0) as Linea, +isnull(IdContabilidad,'') as IdContabilidad, +isnull(ClaveEntidad,'') as ClaveEntidad, +ISNULL(AMBITO,'') as AMBITO + from cfdi_INE where id_factura =" + ComprobanteDBSysId; + + //complemento comercio exterior + SysQueryPartidas += @" +ISNULL(bms_facdet.ComercioExterior_Activo, 0) AS ComercioExterior_Activo, +ISNULL(bms_facdet.ComercioExterior_NoIdentificacion, '') AS NoIdentificacion, +ISNULL(bms_facdet.ComercioExterior_FraccionArancelaria, '') AS FraccionArancelaria, +ISNULL(bms_facdet.ComercioExterior_CantidadAduana, 0) AS CantidadAduana, +ISNULL(bms_facdet.ComercioExterior_UnidadAduana, '') AS UnidadAduana, +ISNULL(bms_facdet.ComercioExterior_ValorUnitarioAduana, 0) AS ValorUnitarioAduana, +ISNULL(bms_facdet.ComercioExterior_ValorDolares, 0) AS ValorDolares, +ISNULL(bms_facdet.ComercioExterior_DescripcionesEspecificas_Marca, '') AS DescripcionesEspecificas_Marca, +ISNULL(bms_facdet.ComercioExterior_DescripcionesEspecificas_Modelo, '') AS DescripcionesEspecificas_Modelo, +ISNULL(bms_facdet.ComercioExterior_DescripcionesEspecificas_SubModelo, '') AS DescripcionesEspecificas_SubModelo, +ISNULL(bms_facdet.ComercioExterior_DescripcionesEspecificas_NumeroSerie, '') AS DescripcionesEspecificas_NumeroSerie,"; + + if (CFDI4) { + SysQueryPartidas += @" +ISNULL(bms_facdet.CFDI33_OBJETOIMP,'') AS ObjetoImp, +ISNULL(bms_facdet.RFCACUENTATERCEROS,'') AS RFC_Terceros, +ISNULL(bms_facdet.NOMBREACUENTATERCEROS,'') AS Nombre_Terceros, +ISNULL(bms_facdet.RegimenFiscalACuentaTerceros,'') AS Regimen_Terceros, +ISNULL(bms_facdet.DomicilioFiscalACuentaTerceros,'') AS Domicilio_Terceros, +"; + } + + SysQueryPartidas += @" +ISNULL(bms_facdet.CFDI33_CLAVEPRODSERV, '') AS ClaveProdServ, +ISNULL(bms_facdet.ComercioExterior_NoIdentificacion, '') AS NoIdentificacion, +ISNULL(bms_facdet.CANTIDAD, 0) AS Cantidad, +ISNULL(bms_facdet.CFDI33_CLAVEUNIDAD, '') AS ClaveUnidad, +'' AS Unidad, +ISNULL(bms_facdet.DESCRIPCION, '') AS Descripcion, +CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN ISNULL(bms_facdet.CFDI33_DESCUENTODOLARES, 0) ELSE ISNULL(bms_facdet.CFDI33_DESCUENTOPESOS, 0) END AS Descuento, +CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN ISNULL(bms_facdet.COSTOUNITARIO, 0) ELSE ISNULL(bms_facdet.COSTOUNITARIOPESOS, 0) END AS ValorUnitario, +CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN ISNULL(bms_facdet.TOTALDOLARES, 0) ELSE ISNULL(bms_facdet.TOTAL, 0) END AS Importe, +CASE WHEN ISNULL(bms_facdet.PARTIDAAPLICAIVA, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN CAST(bms_facdet.PARTIDAIVA_Dlls AS VARCHAR(100)) ELSE CAST(bms_facdet.PARTIDAIVA AS VARCHAR(100)) END END AS PartidaIVA, +CASE WHEN ISNULL(bms_facdet.PARTIDAAPLICAIVA, 0) = 0 THEN 'NA' ELSE CAST(bms_facdet.PARTIDAIVAPORCENTAJE AS VARCHAR(100)) END AS PartidaIVAPorcentaje, +CASE WHEN ISNULL(bms_facdet.PARTIDAAPLICAIVA_RETENIDO, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN CAST(bms_facdet.PARTIDAIVARETENIDO_Dlls AS VARCHAR(100)) ELSE CAST(bms_facdet.PARTIDAIVARETENIDO AS VARCHAR(100)) END END AS PartidaIVARetenido, +CASE WHEN ISNULL(bms_facdet.PARTIDAAPLICAIVA_RETENIDO, 0) = 0 THEN 'NA' ELSE CAST(bms_facdet.PARTIDAIVARETENIDOPORCENTAJE AS VARCHAR(100)) END AS PartidaIVARetenidoPorcentaje, +CASE WHEN ISNULL(bms_facdet.PARTIDAAPLICAISR, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN CAST(bms_facdet.PARTIDAISR_Dlls AS VARCHAR(100)) ELSE CAST(bms_facdet.PARTIDAISR AS VARCHAR(100)) END END AS PartidaISR, +CASE WHEN ISNULL(bms_facdet.PARTIDAAPLICAISR, 0) = 0 THEN 'NA' ELSE CAST(bms_facdet.PARTIDAISRPORCENTAJE AS VARCHAR(100)) END AS PartidaISRPorcentaje + + +FROM factdetfacturas AS bms_facdet +JOIN factfactura AS bms_fac ON bms_fac.CONSECUTIVO = bms_facdet.CONSECUTIVO +WHERE ISNULL(bms_facdet.TOTAL, 0) > 0 AND bms_facdet.CONSECUTIVO = " + ComprobanteDBSysId + " ORDER BY bms_facdet.LINEA"; + SysQueryNotariosPublicos = @" +SELECT +ISNULL(bmsfac_adq.NOMBRE, '') AS Nombre, +ISNULL(bmsfac_adq.APELLIDOPATERNO, '') AS ApellidoPaterno, +ISNULL(bmsfac_adq.APELLIDOMATERNO, '') AS ApellidoMaterno, +ISNULL(bmsfac_adq.RFC, '') AS RFC, +ISNULL(bmsfac_adq.CURP, '') AS CURP, +ISNULL(bmsfac_adq.PORCENTAJE, 0) AS Porcentaje, +ISNULL(bmsfac_adq.PERSONA, '') AS Figura, +'Adquiriente' AS 'Tipo' +FROM FacNotarioAdquiriente AS bmsfac_adq +WHERE bmsfac_adq.CONSECUTIVO = " + ComprobanteDBSysId + @" +UNION +SELECT +ISNULL(bmsfac_ena.NOMBRE, '') AS Nombre, +ISNULL(bmsfac_ena.APELLIDOPATERNO, '') AS ApellidoPaterno, +ISNULL(bmsfac_ena.APELLIDOMATERNO, '') AS ApellidoMaterno, +ISNULL(bmsfac_ena.RFC, '') AS RFC, +ISNULL(bmsfac_ena.CURP, '') AS CURP, +ISNULL(bmsfac_ena.PORCENTAJE, 0) AS Porcentaje, +ISNULL(bmsfac_ena.PERSONA, '') AS Figura, +'Enajenante' AS 'Tipo' +FROM FacNotarioEnajenante AS bmsfac_ena +WHERE bmsfac_ena.CONSECUTIVO = " + ComprobanteDBSysId; + + SysQueryRelacionados = @" +Select +ISNULL(DRFI.UUID,'') AS UUID, +ISNULL(FF.TIPORELACIONCFDI33,'') AS TipoRelacion +FROM CFD33DocumentosRelacionadosFI DRFI +LEFT JOIN FACTFACTURA FF ON FF.CONSECUTIVO = DRFI.SYSID_DR +WHERE DRFI.SYSID_DR = " + ComprobanteDBSysId + " AND FF.TIPORELACIONCFDI33 <> '' "; + #endregion bms factura timbrar + break; + case "factura_egreso": + #region bms factura egreso timbrar 2 + + if (CFDI4) { + SysQueryEncabezado += @" +'01' AS Exportacion, +'' AS Periodicidad, +'' AS Meses, +'' AS Anio, +isnull((select CFDI33_DomicilioFiscal from cliente where clave = bms_facegr.CLIENTE ),'') AS Receptor_DomicilioFiscal, +isnull((select CFDI33_REGIMENFISCAL from cliente where clave = bms_facegr.CLIENTE ),'') AS Receptor_RegimenFiscal, +ISNULL(bms_facegrdet.CLIENTE, '') AS ReceptorClienteV2, +ISNULL(bms_facegrdet.SIN_RELACION, 0) AS SinRelacionV2,"; + } + + + SysQueryEncabezado += @" +ISNULL(bms_facegr.COMERCIOEXTERIOR_ACTIVO, 0) AS ComercioExterior_Activo, +ISNULL(bms_facegr.CFDI33_EMISORREGIMENFISCAL, '') AS Emisor_RegimenFiscal, +/*ISNULL(bms_facegr.RECEPTOR_NOMBRE, '') AS Receptor_Nombre,*/ +(select case when LEN(NOMBREFISCAL) > 101 then isNull(NOMBREFISCAL,'') else isNUll(cliente,'') end from cliente where CLAVE=bms_facegr.CLIENTE) as Receptor_Nombre, +ISNULL(bms_facegr.RECEPTOR_RFC, '') AS Receptor_Rfc, +ISNULL(bms_facegr.CFDI33_ResidenciaFiscal, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(bms_facegr.CFDI33_NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(bms_facegrdet.USOCFDI, bms_facegr.CFDI33_RECEPTOR_USOCFDI) AS Receptor_UsoCFDI, +ISNULL(bms_facegr.EMISOR_NOMBRE,'') AS Emisor_Nombre, +ISNULL(bms_facegr.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_facegr.EMISOR_CP, '') AS Comprobante_LugarExpedicion, +'E' AS Comprobante_TipoDeComprobante, +ISNULL(bms_facegrdet.FORMAPAGO , bms_facegr.CONDICIONPAGO) AS Comprobante_FormaPago, +ISNULL(bms_facegr.CFDI33_METODOPAGO, '') AS Comprobante_MetodoPago, +ISNULL(bms_facegr.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_facegrdet.Folio, '') AS Comprobante_Folio, +ISNULL(bms_facegrdet.TOTAL, 0) AS Comprobante_Total, +ISNULL(bms_facegr.TIPOCAMBIO, 0) AS Comprobante_TipoCambio, +ISNULL((bms_facegrdet.SUBTOTAL), 0) AS Comprobante_SubTotal, +ISNULL(bms_facegr.Moneda, '') AS Comprobante_Moneda, +ISNULL(bms_facegrdet.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_facegrdet.ESTATUS, '') AS Comprobante_Estatus, +ISNULL(bms_facegr.CFDI33_CUENTAPREDIAL, '') AS Comprobante_CuentaPredial, +'' AS Comprobante_CondicionesDePago, +0 AS Comprobante_Descuento, +CASE WHEN ISNULL(bms_facegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.IVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(bms_facegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.IVAPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje, +CASE WHEN ISNULL(bms_facegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.IVARETENIDO, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenido, +CASE WHEN ISNULL(bms_facegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.IVARETENIDOPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenidoPorcentaje, +CASE WHEN ISNULL(bms_facegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.ISR, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISR, +CASE WHEN ISNULL(bms_facegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.ISRPORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISRPorcentaje +FROM factfactura AS bms_facegr +INNER JOIN Facturas_Egresos_Detalles AS bms_facegrdet ON bms_facegr.CONSECUTIVO = bms_facegrdet.SYSID_FACTURA +WHERE bms_facegrdet.EGRESOSYSID = " + ComprobanteDBSysId; + + SysQueryPartidas += @" + +ISNULL(bms_facegrdet.Obj_Impuesto, '02')AS ObjetoImp, + +ISNULL(bms_facegrdet.PRODUCTOCLAVE, '') AS ClaveProdServ, +'' AS NoIdentificacion, +ISNULL(bms_facegrdet.CANTIDAD, 0) AS Cantidad, +ISNULL(bms_facegrdet.UNIDADMEDIDACLAVE, '') AS ClaveUnidad, +'' AS Unidad, +ISNULL(bms_facegrdet.DESCRIPCION, '') AS Descripcion, +ISNULL(bms_facegrdet.VALORUNITARIO, 0) AS ValorUnitario, +ISNULL(bms_facegrdet.IMPORTE, 0) AS Importe, +0 AS Descuento, +CASE WHEN ISNULL(bms_facegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.IVA, 0) AS VARCHAR(100)) END AS PartidaIVA, +CASE WHEN ISNULL(bms_facegrdet.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.IVAPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVAPorcentaje, +CASE WHEN ISNULL(bms_facegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.IVARETENIDO, 0) AS VARCHAR(100)) END AS PartidaIVARetenido, +CASE WHEN ISNULL(bms_facegrdet.IVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.IVARETENIDOPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVARetenidoPorcentaje, +CASE WHEN ISNULL(bms_facegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.ISR, 0) AS VARCHAR(100)) END AS PartidaISR, +CASE WHEN ISNULL(bms_facegrdet.ISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_facegrdet.ISRPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaISRPorcentaje +FROM Facturas_Egresos_Detalles AS bms_facegrdet +INNER JOIN factfactura AS bms_fac ON bms_fac.CONSECUTIVO = bms_facegrdet.SYSID_FACTURA +WHERE bms_facegrdet.EGRESOSYSID = " + ComprobanteDBSysId + " ORDER BY bms_facegrdet.LINEA "; + + SysQueryRelacionados = @" +SELECT +ISNULL(bms_fac.FOLIOPAC, '') AS UUID, +ISNULL(bms_facegr.TipoRelacion, '') AS TipoRelacion +FROM Facturas_Egresos_Detalles AS bms_facegr +INNER JOIN factfactura AS bms_fac ON bms_fac.consecutivo = bms_facegr.SYSID_FACTURA +WHERE bms_facegr.EGRESOSYSID = " + ComprobanteDBSysId + " and isnull(bms_facegr.SIN_RELACION,0) !=1"; + #endregion bms factura egreso timbrar 2 + break; + case "notacredito": + #region bms notacredito timbrar + SysQueryEncabezado += @" +ISNULL(bms_ntc.CFDI33_EMISORREGIMENFISCAL, '') AS Emisor_RegimenFiscal, +ISNULL(bms_ntc.RECEPTOR_NOMBRE, '') AS Receptor_Nombre, +ISNULL(bms_ntc.RECEPTOR_RFC, '') AS Receptor_Rfc, +ISNULL(bms_ntc.CFDI33_RESIDENCIAFISCAL, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(bms_ntc.CFDI33_NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(bms_ntc.CFDI33_RECEPTOR_USOCFDI, '') AS Receptor_UsoCFDI, +ISNULL(bms_ntc.EMISOR_NOMBRE, '') AS Emisor_Nombre, +ISNULL(bms_ntc.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_ntc.EMISOR_CP, '') AS Comprobante_LugarExpedicion, +ISNULL(bms_ntc.CFDI33_TIPOCOMPROBANTE, '') AS Comprobante_TipoDeComprobante, +ISNULL(bms_ntc.CONDICIONPAGO, '') AS Comprobante_FormaPago, +ISNULL(bms_ntc.CFDI33_METODOPAGO, '') AS Comprobante_MetodoPago, +ISNULL(bms_ntc.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_ntc.NOTA, '') AS Comprobante_Folio, +CASE WHEN ISNULL(bms_ntc.MONEDA, '') = 'Dolares' THEN ISNULL(bms_ntc.TOTALDOLARES, 0) ELSE ISNULL(bms_ntc.TOTAL, 0) END AS Comprobante_Total, +ISNULL(bms_ntc.TIPOCAMBIO, 0) AS Comprobante_TipoCambio, +CASE WHEN ISNULL(bms_ntc.MONEDA, '') = 'Dolares' THEN ISNULL(bms_ntc.SUBTOTALDOLARES, 0) ELSE ISNULL(bms_ntc.SUBTOTAL, 0) END AS Comprobante_SubTotal, +ISNULL(bms_ntc.Moneda, '') AS Comprobante_Moneda, +ISNULL(bms_ntc.CFDI33_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_ntc.ESTATUS, '') AS Comprobante_Estatus, +0 AS Comprobante_Descuento, +CASE WHEN ISNULL(bms_ntc.IVA, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_ntc.MONEDA, '') = 'Dolares' THEN CAST(ISNULL(bms_ntc.IVADOLARES, 0) AS VARCHAR (100)) ELSE CAST(ISNULL(bms_ntc.IVA, 0) AS VARCHAR (100)) END END AS Comprobante_ImporteIVA, +CASE WHEN ISNULL(bms_ntc.IVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ntc.PORCENTAJEIVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVAPorcentaje, +CASE WHEN ISNULL(bms_ntc.RETENCIONIVA, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_ntc.MONEDA, '') = 'Dolares' THEN CAST(ISNULL(bms_ntc.CFDI33_IVARETENIDO_DLLS, 0) AS VARCHAR (100)) ELSE CAST(ISNULL(bms_ntc.RETENCIONIVA, 0) AS VARCHAR (100)) END END AS Comprobante_ImporteIVARetenido, +CASE WHEN ISNULL(bms_ntc.RETENCIONIVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ntc.PCTRETIVA, 0) AS VARCHAR(100)) END AS Comprobante_ImporteIVARetenidoPorcentaje, +CASE WHEN ISNULL(bms_ntc.CFDI33_ISR_MONTO, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_ntc.MONEDA, '') = 'Dolares' THEN CAST(ISNULL(bms_ntc.CFDI33_ISR_MONTO_DOLARES, 0) AS VARCHAR (100)) ELSE CAST(ISNULL(bms_ntc.CFDI33_ISR_MONTO, 0) AS VARCHAR (100)) END END AS Comprobante_ImporteISR, +CASE WHEN ISNULL(bms_ntc.CFDI33_ISR_PORCENTAJE, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ntc.CFDI33_ISR_PORCENTAJE, 0) AS VARCHAR(100)) END AS Comprobante_ImporteISRPorcentaje +FROM notcredito AS bms_ntc +WHERE bms_ntc.CONSECUTIVO = " + ComprobanteDBSysId; + SysQueryPartidas += @" +ISNULL(bms_ntcdet.CFDI33_CLAVEPRODSERV, '') AS ClaveProdServ, +'' AS NoIdentificacion, +ISNULL(bms_ntcdet.CANTIDAD, 0) AS Cantidad, +ISNULL(bms_ntcdet.CFDI33_CLAVEUNIDAD, '') AS ClaveUnidad, +'' AS Unidad, +ISNULL(bms_ntcdet.DESCRIPCION, '') AS Descripcion, +0 AS Descuento, +CASE WHEN ISNULL(bms_ntc.MONEDA, '') = 'Dolares' THEN ISNULL(bms_ntcdet.COSTOUNITARIO_DOLARES, 0) ELSE ISNULL(bms_ntcdet.COSTOUNITARIOPESOS, 0) END AS ValorUnitario, +CASE WHEN ISNULL(bms_ntc.MONEDA, '') = 'Dolares' THEN ISNULL(bms_ntcdet.TOTALDOLARES, 0) ELSE ISNULL(bms_ntcdet.TOTAL, 0) END AS Importe, +CASE WHEN ISNULL(bms_ntcdet.CFDI33_PARTIDAIVA, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_ntc.MONEDA, '') = 'Dolares' THEN CAST(ISNULL(bms_ntcdet.CFDI33_PARTIDAIVA_DLLS, 0) AS VARCHAR (100)) ELSE CAST(ISNULL(bms_ntcdet.CFDI33_PARTIDAIVA, 0) AS VARCHAR (100)) END END AS PartidaIVA, +CASE WHEN ISNULL(bms_ntcdet.CFDI33_PARTIDAIVA, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ntcdet.CFDI33_PARTIDAIVAPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVAPorcentaje, +CASE WHEN ISNULL(bms_ntcdet.CFDI33_PARTIDAIVARETENIDO, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_ntc.MONEDA, '') = 'Dolares' THEN CAST(ISNULL(bms_ntcdet.CFDI33_PARTIDAIVARETENIDO_DLLS, 0) AS VARCHAR (100)) ELSE CAST(ISNULL(bms_ntcdet.CFDI33_PARTIDAIVARETENIDO, 0) AS VARCHAR (100)) END END AS PartidaIVARetenido, +CASE WHEN ISNULL(bms_ntcdet.CFDI33_PARTIDAIVARETENIDO, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ntcdet.CFDI33_PARTIDAIVARETENIDOPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaIVARetenidoPorcentaje, +CASE WHEN ISNULL(bms_ntcdet.CFDI33_PARTIDAISR, 0) = 0 THEN 'NA' ELSE CASE WHEN ISNULL(bms_ntc.MONEDA, '') = 'Dolares' THEN CAST(ISNULL(bms_ntcdet.CFDI33_PARTIDAISR_DLLS, 0) AS VARCHAR (100)) ELSE CAST(ISNULL(bms_ntcdet.CFDI33_PARTIDAISR, 0) AS VARCHAR (100)) END END AS PartidaISR, +CASE WHEN ISNULL(bms_ntcdet.CFDI33_PARTIDAISR, 0) = 0 THEN 'NA' ELSE CAST(ISNULL(bms_ntcdet.CFDI33_PARTIDAISRPORCENTAJE, 0) AS VARCHAR(100)) END AS PartidaISRPorcentaje +FROM NotdetCredito AS bms_ntcdet +JOIN notcredito AS bms_ntc ON bms_ntc.CONSECUTIVO = bms_ntcdet.CONSECUTIVO +WHERE bms_ntcdet.CONSECUTIVO = " + ComprobanteDBSysId + " ORDER BY bms_ntcdet.LINEA"; + #endregion bms notacredito timbrar + break; + case "pago": + #region bms pago timbrar + SysQueryEncabezado += @" +ISNULL(bms_pag.CFDI33_EMISORREGIMENFISCAL, '') AS Emisor_RegimenFiscal, +ISNULL((Select nombrefiscal from cliente where clave= bms_pag.CLIENTE), '') AS Receptor_Nombre, +ISNULL(bms_pag.CFDI33_RECEPTORRFC, '') AS Receptor_Rfc, +ISNULL(bms_pag.CFDI33_RECEPTORPAIS, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(bms_pag.CFDI33_NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(bms_pag.CFDI33_USO, '') AS Receptor_UsoCFDI, +ISNULL(bms_pag.CFDI33_EMISORNOMBRE, '') AS Emisor_Nombre, +ISNULL(bms_pag.CFDI33_EMISORRFC, '') AS Emisor_Rfc, +ISNULL(bms_pag.CFDI33_EMISORCP, '') AS Comprobante_LugarExpedicion, +ISNULL(bms_pag.CFDI33_TIPOCOMPROBANTE, '') AS Comprobante_TipoDeComprobante, +'' AS Comprobante_FormaPago, +ISNULL(bms_pag.CFDI33_METODOPAGO, '') AS Comprobante_MetodoPago, +ISNULL(bms_pag.CFDI33_SERIE, '') AS Comprobante_Serie, +ISNULL(bms_pag.CFDI33_FOLIO, '') AS Comprobante_Folio, +0 AS Comprobante_Total, +0 AS Comprobante_TipoCambio, +0 AS Comprobante_SubTotal, +'XXX' AS Comprobante_Moneda, +ISNULL(bms_pag.CFDI33_FechaYHoraEmision, '') AS Comprobante_Fecha, +ISNULL(bms_pag.ESTADO, '') AS Comprobante_Estatus, +0 AS Comprobante_Descuento, +'NA' AS Comprobante_ImporteIVA, +'NA' AS Comprobante_ImporteIVAPorcentaje, +'NA' AS Comprobante_ImporteIVARetenido, +'NA' AS Comprobante_ImporteIVARetenidoPorcentaje, +'NA' AS Comprobante_ImporteISR, +'NA' AS Comprobante_ImporteISRPorcentaje, +ISNULL(bms_pag.CEP_FECHAPAGO, '') AS Pago10_FechaPago, +ISNULL(bms_pag.CFDI33_FORMAPAGO, '') AS Pago10_FormaDePagoP, +ISNULL(bms_pag.MONEDA, '') AS Pago10_MonedaP, +ISNULL(bms_pag.TIPOCAMBIO, 0) AS Pago10_TipoCambioP, +CASE WHEN ISNULL(bms_pag.MONEDA, '') = 'Dolares' THEN (select isnull(sum(IMPORTEDOLARES ),0) from factdetpagos where NUMERO = " + ComprobanteDBSysId + ") ELSE (Select isnull(sum(IMPORTE ),0) from factdetpagos where NUMERO = " + ComprobanteDBSysId + @") END AS Pago10_Monto, +ISNULL(bms_pag.CEP_RFCEMISORCTAORD,'') AS Pago10_RfcEmisorCtaOrd, +ISNULL(bms_pag.CEP_BANCOEMISOR, '') AS Pago10_NomBancoOrdExt, +ISNULL(bms_pag.CEP_CTAORDENANTEEMISOR, '') AS Pago10_CtaOrdenante, +ISNULL(bms_pag.CEP_RFCRECEPTORCTAORD,'') AS Pago10_RfcEmisorCtaBen, +ISNULL(bms_pag.CEP_CTAORDENANTERECEPTOR, '') AS Pago10_CtaBeneficiario, +ISNULL(bms_pag.CEP_TipoCadPago, '') AS Pago10_TipoCadPago, +ISNULL(bms_pag.CEP_CadPago, '') AS Pago10_CadPago, +ISNULL(bms_pag.CEP_CertificadoPago, '') AS Pago10_CertPago, +ISNULL(bms_pag.CEP_SelloPago, '') AS Pago10_SelloPago, + +--CFDI4.0 +'01' AS Exportacion, +'NA' AS Periodicidad, +'NA' AS Meses, +'NA' AS Anio, +isnull((select CFDI33_DomicilioFiscal from cliente where clave = bms_pag.CLIENTE ),'') AS Receptor_DomicilioFiscal, +isnull((select CFDI33_REGIMENFISCAL from cliente where clave = bms_pag.CLIENTE ),'') AS Receptor_RegimenFiscal + +FROM factpagos AS bms_pag +WHERE bms_pag.NUMERO = " + ComprobanteDBSysId; + SysQueryPartidas += @" +'84111506' AS ClaveProdServ, +'' AS NoIdentificacion, +1 AS Cantidad, +'ACT' AS ClaveUnidad, +'' AS Unidad, +'Pago' AS Descripcion, +0 AS Descuento, +0 AS ValorUnitario, +0 AS Importe, +'NA' AS PartidaIVA, +'NA' AS PartidaIVAPorcentaje, +'NA' AS PartidaIVARetenido, +'NA' AS PartidaIVARetenidoPorcentaje, +'NA' AS PartidaISR, +'NA' AS PartidaISRPorcentaje"; + SysQueryPago10 = @" +SELECT +ISNULL(bms_fac.FOLIOPAC, '') AS IdDocumento, +ISNULL(bms_fac.MONEDA, '') AS MonedaDR, +--CASE WHEN ISNULL(bms_pag.aplicado, 0) = 0 THEN ISNULL(bms_fac.TIPOCAMBIO, 0) ELSE ISNULL(bms_pag.TIPOCAMBIO, 0) END AS TipoCambioDR, +CASE +WHEN ( rtrim(ISNULL(bms_Pag.MONEDA, '')) = 'Pesos' and rtrim(ISNULL(bms_fac.MONEDA, '')) = 'Dolares') THEN ISNULL(1 / bms_pag.TIPOCAMBIO, 0) +WHEN ( rtrim(ISNULL(bms_Pag.MONEDA, '')) = 'Dolares' and rtrim(ISNULL(bms_fac.MONEDA, '')) = 'Pesos') THEN isNULL(bms_pag.TIPOCAMBIO, 0) +END AS TipoCambioDR, +ISNULL(bms_fac.CFDI33_METODOPAGO, '') AS MetodoDePagoDR, +ISNULL(bms_fac.SERIECFD, '') AS Serie, +ISNULL(bms_fac.FACTURA, '') AS Folio, +ISNULL(bms_pagdet.LINEA, 0) AS NumParcialidad, +CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN ISNULL(bms_pagdet.SALDO_ANTERIOR_DOLARES, 0) ELSE ISNULL(bms_pagdet.SALDO_ANTERIOR, 0) END AS ImpSaldoAnt, +CASE WHEN ISNULL(bms_fac.MONEDA, '') = 'Dolares' THEN ISNULL(bms_pagdet.IMPORTEDOLARES, 0) ELSE ISNULL(bms_pagdet.IMPORTE, 0) END AS ImpPagado, +CASE WHEN ISNULL(bms_Fac.MONEDA, '') = 'Dolares' THEN ISNULL(bms_pagdet.SALDO_DOLARES, 0) ELSE ISNULL(bms_pagdet.SALDO, 0) END AS ImpSaldoInsoluto, + +/*CFDI40*/ +isnull(bms_pagdet.ObjetoImpDR,'') as ObjetoImpDR, +isnull(bms_pagdet.EquivalenciaDR,0) as EquivalenciaDR, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.RET_BASEDR,0) else 0 end as RET_BASEDR, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.RET_IMPUESTODR,'') else '' end as RET_IMPUESTODR, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.RET_TIPOFACTORDR,'') else '' end as RET_TIPOFACTORDR, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.RET_TASAOCUOTADR,0) else 0 end as RET_TASAOCUOTADR, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.RET_IMPORTEDR,0) else 0 end as RET_IMPORTEDR, + +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.TRAS_BASEDR,0) else 0 end as TRAS_BASEDR, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.TRAS_IMPUESTODR,'') else '' end as TRAS_IMPUESTODR, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.TRAS_TIPOFACTORDR,'') else '' end as TRAS_TIPOFACTORDR, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.TRAS_TASAOCUOTADR,0) else 0 end as TRAS_TASAOCUOTADR, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.TRAS_IMPORTEDR,0) else 0 end as TRAS_IMPORTEDR, + +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.RET_BASEDR_1,0) else 0 end as RET_BASEDR_1, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.RET_IMPUESTODR_1,'') else '' end as RET_IMPUESTODR_1, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.RET_TIPOFACTORDR_1,'') else '' end as RET_TIPOFACTORDR_1, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.RET_TASAOCUOTADR_1,0) else 0 end as RET_TASAOCUOTADR_1, +CASE WHEN isnull(bms_pagdet.ObjetoImpDR,'') = '02' then isnull(bms_pagdet.RET_IMPORTEDR_1,0) else 0 end as RET_IMPORTEDR_1 + +FROM factdetpagos AS bms_pagdet +INNER JOIN factfactura AS bms_fac ON bms_fac.FACTURA = bms_pagdet.FACTURA +INNER JOIN factpagos AS bms_pag ON bms_pag.NUMERO = bms_pagdet.NUMERO +WHERE bms_pagdet.NUMERO = " + ComprobanteDBSysId + @" +ORDER BY bms_fac.MONEDA"; + SysQueryRelacionados = @" +SELECT ISNULL(DR.UUID,'') AS UUID, +ISNULL(FP.TIPORELACIONCFDI, '') AS TipoRelacion +FROM CFD33DocumentosRelacionados DR +LEFT JOIN FACTPAGOS FP ON FP.NUMERO=DR.SYSID_DR +WHERE DR.SYSID_DR = " + ComprobanteDBSysId + " AND FP.tiporelacionCFDI <>'' "; + #endregion bms pago timbrar + break; + case "retencion": + #region bms retencion timbrar + SysQueryEncabezado += @" +ISNULL(bms_ret.EMISOR_RFC, '') AS Retenciones_Emisor_RFCEmisor, +ISNULL(bms_ret.EMISOR_NOMBRE, '') AS Retenciones_Emisor_NomDenRazSocE, +--cfdi4 +ISNULL(bms_ret.CFDI33_EmisorRegimenFiscal, '') AS Retenciones_Emisor_RegimenFiscal, +ISNULL(bms_ret.EMISOR_CP,'') AS Retenciones_LugarExpedicion, +'' AS Retenciones_Emisor_CURPE,"; + + if (CFDI4) + { + SysQueryEncabezado += @" +CASE WHEN ISNULL(cli.CFDI33_Residencia_Fiscal, '' ) ='MEX' OR ISNULL(cli.CFDI33_Residencia_Fiscal,'') ='' THEN ISNULL(cli.RFC, '') ELSE '' END AS Retenciones_Receptor_Nacional_RFCRecep, +CASE WHEN ISNULL(cli.CFDI33_Residencia_Fiscal, '' ) ='MEX' OR ISNULL(cli.CFDI33_Residencia_Fiscal,'') ='' THEN ISNULL(cli.NOMBREFISCAL, '') ELSE '' END AS Retenciones_Receptor_Nacional_NomDenRazSocR, +CASE WHEN ISNULL(cli.CFDI33_Residencia_Fiscal, '' ) ='MEX' OR ISNULL(cli.CFDI33_Residencia_Fiscal,'') ='' THEN '' ELSE '' END AS Retenciones_Receptor_Nacional_CURPR, +CASE WHEN ISNULL(cli.CFDI33_Residencia_Fiscal, '' ) ='MEX' OR ISNULL(cli.CFDI33_Residencia_Fiscal,'') ='' THEN ISNULL(cli.CFDI33_DomicilioFiscal, '') ELSE '' END AS Retenciones_Receptor_DomicilioFiscalR, + +CASE WHEN ISNULL(cli.CFDI33_Residencia_Fiscal, '' ) ='MEX' OR ISNULL(cli.CFDI33_Residencia_Fiscal,'') ='' THEN ISNULL(cli.CFDI33_NUMREGIDTRIB ,'') ELSE '' END AS Retenciones_Receptor_Extranjero_NumRegIdTrib, +CASE WHEN ISNULL(cli.CFDI33_Residencia_Fiscal, '' ) ='MEX' OR ISNULL(cli.CFDI33_Residencia_Fiscal,'') ='' THEN ISNULL(cli.cliente, '') ELSE '' END AS Retenciones_Receptor_Extranjero_NomDenRazSocR, +CASE WHEN ISNULL(cli.CFDI33_Residencia_Fiscal, '' ) ='MEX' OR ISNULL(cli.CFDI33_Residencia_Fiscal,'') ='' THEN 'Nacional' ELSE 'Extranjero' END AS Retenciones_Receptor_Nacionalidad, +"; + } + else + { + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.CFDI33_RESIDENCIAFISCAL, '') != 'MEX' AND ISNULL(bms_ret.CFDI33_RESIDENCIAFISCAL, '') != '' THEN '' ELSE ISNULL(bms_ret.RECEPTOR_RFC, '') END AS Retenciones_Receptor_Nacional_RFCRecep, +CASE WHEN ISNULL(bms_ret.CFDI33_RESIDENCIAFISCAL, '') != 'MEX' AND ISNULL(bms_ret.CFDI33_RESIDENCIAFISCAL, '') != '' THEN '' ELSE ISNULL(bms_ret.RECEPTOR_NOMBRE, '') END AS Retenciones_Receptor_Nacional_NomDenRazSocR, +'' AS Retenciones_Receptor_Nacional_CURPR, +--CFDI4 +isnull((select CFDI33_DomicilioFiscal from cliente where clave = bms_ret.CLIENTE ),'') AS Retenciones_Receptor_DomicilioFiscalR, +CASE WHEN ISNULL(bms_ret.CFDI33_RESIDENCIAFISCAL, '') != 'MEX' AND ISNULL(bms_ret.CFDI33_RESIDENCIAFISCAL, '') != '' THEN ISNULL(bms_ret.CFDI33_NUMREGIDTRIB, '') ELSE '' END AS Retenciones_Receptor_Extranjero_NumRegIdTrib, +CASE WHEN ISNULL(bms_ret.CFDI33_RESIDENCIAFISCAL, '') != 'MEX' AND ISNULL(bms_ret.CFDI33_RESIDENCIAFISCAL, '') != '' THEN ISNULL(bms_ret.RECEPTOR_NOMBRE, '') ELSE '' END AS Retenciones_Receptor_Extranjero_NomDenRazSocR, +CASE WHEN ISNULL(bms_ret.CFDI33_RESIDENCIAFISCAL, '') != 'MEX' AND ISNULL(bms_ret.CFDI33_RESIDENCIAFISCAL, '') != '' THEN 'Extranjero' ELSE 'Nacional' END AS Retenciones_Receptor_Nacionalidad,"; + } + + + + SysQueryEncabezado += @" +ISNULL(bms_ret.RETENCIONMESINI, 0) AS Retenciones_Periodo_MesIni, +ISNULL(bms_ret.RETENCIONMESFIN, 0) AS Retenciones_Periodo_MesFin, +ISNULL(bms_ret.RETENCIONEJERCICIO, 0) AS Retenciones_Periodo_Ejerc, +ISNULL(bms_ret.BaseRet, 0) AS Retenciones_Totales_ImpRetenidos_BaseRet, +ISNULL(bms_ret.RETENCION_ImpRetenidos_Impuesto, '') AS Retenciones_Totales_ImpRetenidos_Impuesto, +ISNULL(bms_ret.RETENCION_IMPRETENIDOS_MONTORET, 0) AS Retenciones_Totales_ImpRetenidos_montoRet, + +--CASE WHEN ISNULL(bms_ret.TipoPagoRet, 'D') = 'D' THEN 'Pago definitivo' ELSE 'Pago provisional' END AS Retenciones_Totales_ImpRetenidos_TipoPagoRet, +--CFDI4 +ISNULL(bms_ret.TipoPagoRet, '') AS Retenciones_Totales_ImpRetenidos_TipoPagoRet, +ISNULL(bms_ret.CFDI4_TipoPagoRet, '') AS Retenciones_Totales_ImpRetenidos_TipoPagoRet2, + +ISNULL(bms_ret.MONTTOTPAGO, 0) AS Retenciones_Totales_MontoTotOperacion, +ISNULL(bms_ret.MONTTOTPAGOGRAV, 0) AS Retenciones_Totales_MontoTotGrav, +ISNULL(bms_ret.MONTTOTPAGOEXENT, 0) AS Retenciones_Totales_MontoTotExent, +ISNULL(bms_ret.RETENCION_MontoTotRet, 0) AS Retenciones_Totales_MontoTotRet, +'1.0' AS Retenciones_Version, +ISNULL(bms_ret.RETENCION_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_ret.CLAVERETSAT, '') AS Retenciones_CveRetenc, +'' AS Retenciones_DescRetenc, +ISNULL(bms_ret.FACTURA, '') AS Comprobante_Folio, +ISNULL(bms_ret.RETENCION_ESTADO, '') AS Retenciones_Estatus,"; + + //Arrendamientoenfideicomiso + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.PAGPROVEFECPORFIDUC, 0) = 0 THEN '' ELSE '1.0' END AS Arrendamientoenfideicomiso_Version, +ISNULL(bms_ret.PAGPROVEFECPORFIDUC, 0) AS Arrendamientoenfideicomiso_PagProvEfecPorFiduc, +ISNULL(bms_ret.RENDIMFIDEICOM, 0) AS Arrendamientoenfideicomiso_RendimFideicom, +ISNULL(bms_ret.DEDUCCCORRESP, 0) AS Arrendamientoenfideicomiso_DeduccCorresp, +ISNULL(bms_ret.MONTTOTRET, 0) AS Arrendamientoenfideicomiso_MontTotRet, +ISNULL(bms_ret.MONTRESFISCDISTFIBRAS, 0) AS Arrendamientoenfideicomiso_MontResFiscDistFibras, +ISNULL(bms_ret.MONTOTROSCONCEPTDISTR, 0) AS Arrendamientoenfideicomiso_MontOtrosConceptDistr, +ISNULL(bms_ret.DESCRMONTOTROSCONCEPTDISTR, '') AS Arrendamientoenfideicomiso_DescrMontOtrosConceptDistr,"; + //Dividendos + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.CVETIPDIVOUTIL, '') = '' THEN '' ELSE '1.0' END AS Dividendos_Version, +ISNULL(bms_ret.CVETIPDIVOUTIL, '') AS Dividendos_DividOUtil_CveTipDivOUtil, +ISNULL(bms_ret.MONTISRACREDRETMEXICO, 0) AS Dividendos_DividOUtil_MontISRAcredRetMexico, +ISNULL(bms_ret.MONTISRACREDRETEXTRANJERO, 0) AS Dividendos_DividOUtil_MontISRAcredRetExtranjero, +ISNULL(bms_ret.MONTRETEXTDIVEXT, 0) AS Dividendos_DividOUtil_MontRetExtDivExt, +ISNULL(bms_ret.TIPOSOCDISTRDIV, '') AS Dividendos_DividOUtil_TipoSocDistrDiv, +ISNULL(bms_ret.MONTISRACREDNAL, 0) AS Dividendos_DividOUtil_MontISRAcredNal, +ISNULL(bms_ret.MONTDIVACUMNAL, 0) AS Dividendos_DividOUtil_MontDivAcumNal, +ISNULL(bms_ret.MONTDIVACUMEXT, 0) AS Dividendos_DividOUtil_MontDivAcumExt, +ISNULL(bms_ret.PROPORCIONREM, 0) AS Dividendos_Remanente_ProporcionRem,"; + //EnajenaciondeAcciones + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.CONTRATOINTERMEDIACION, '') = '' THEN '' ELSE '1.0' END AS EnajenaciondeAcciones_Version, +ISNULL(bms_ret.CONTRATOINTERMEDIACION, '') AS EnajenaciondeAcciones_ContratoIntermediacion, +ISNULL(bms_ret.GANANCIA, 0) AS EnajenaciondeAcciones_Ganancia, +ISNULL(bms_ret.PERDIDA, 0) AS EnajenaciondeAcciones_Perdida,"; + //Fideicomisonoempresarial + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.MontRetRelPagFideic, 0) = 0 THEN '' ELSE '1.0' END AS Fideicomisonoempresarial_Version, +ISNULL(bms_ret.CONCEPTO_INTEGRACINGRESOS, '') AS Fideicomisonoempresarial_IngresosOEntradas_IntegracIngresos_Concepto, +ISNULL(bms_ret.MONTTOTENTRADASPERIODO, 0) AS Fideicomisonoempresarial_IngresosOEntradas_MontTotEntradasPeriodo, +ISNULL(bms_ret.PARTPROPDELFIDEICOM, 0) AS Fideicomisonoempresarial_IngresosOEntradas_PartPropAcumDelFideicom, +ISNULL(bms_ret.PROPDELMONTTOT_INGRESOSOENTRADAS, 0) AS Fideicomisonoempresarial_IngresosOEntradas_PropDelMontTot, +ISNULL(bms_ret.CONCEPTO_INTEGRACEGRESOS, '') AS Fideicomisonoempresarial_DeduccOSalidas_IntegracEgresos_ConceptoS, +ISNULL(bms_ret.MONTTOTEGRESPERIODO, 0) AS Fideicomisonoempresarial_DeduccOSalidas_MontTotEgresPeriodo, +ISNULL(bms_ret.PARTPROPDELFIDEICOM, 0) AS Fideicomisonoempresarial_DeduccOSalidas_PartPropDelFideicom, +ISNULL(bms_ret.PROPDELMONTTOT_DEDUCCOSALIDAS, 0) AS Fideicomisonoempresarial_DeduccOSalidas_PropDelMontTot, +ISNULL(bms_ret.MONTRETRELPAGFIDEIC, 0) AS Fideicomisonoempresarial_RetEfectFideicomiso_MontRetRelPagFideic, +ISNULL(bms_ret.DESCRETRELPAGFIDEC, '') AS Fideicomisonoempresarial_RetEfectFideicomiso_DescRetRelPagFideic,"; + + //Intereses + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.SistFinanciero, '') = '' THEN '' ELSE '1.0' END AS Intereses_Version, +ISNULL(bms_ret.SISTFINANCIERO, '') AS Intereses_SistFinanciero, +ISNULL(bms_ret.RETIROAORESRETINT, '') AS Intereses_RetiroAORESRetInt, +ISNULL(bms_ret.OPERFINANCDERIVAD, '') AS Intereses_OperFinancDerivad, +ISNULL(bms_ret.MONTINTNOMINAL, 0) AS Intereses_MontIntNominal, +ISNULL(bms_ret.MONTINTREAL, 0) AS Intereses_MontIntReal, +ISNULL(bms_ret.PERDIDA, 0) AS Intereses_Perdida,"; + + //Intereseshipotecarios + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.CreditoDeInstFinanc, '') = '' THEN '' ELSE '1.0' END Intereseshipotecarios_Version, +ISNULL(bms_ret.CreditoDeInstFinanc, '') AS Intereseshipotecarios_CreditoDeInstFinanc, +ISNULL(bms_ret.SaldoInsoluto, 0) AS Intereseshipotecarios_SaldoInsoluto, +ISNULL(bms_ret.PropDeducDelCredit, 0) AS Intereseshipotecarios_PropDeducDelCredit, +ISNULL(bms_ret.MontTotIntNominalesDev, 0) AS Intereseshipotecarios_MontTotIntNominalesDev, +ISNULL(bms_ret.MontTotIntNominalesDevYPag, 0) AS Intereseshipotecarios_MontTotIntNominalesDevYPag, +ISNULL(bms_ret.MontTotIntRealPagDeduc, 0) AS Intereseshipotecarios_MontTotIntRealPagDeduc, +ISNULL(bms_ret.NumContrato, '') AS Intereseshipotecarios_NumContrato,"; + + //Operacionesconderivados + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.MONTGANACUM, 0) = 0 THEN '' ELSE '1.0' END AS Operacionesconderivados_Version, +ISNULL(bms_ret.MONTGANACUM, 0) AS Operacionesconderivados_MontGanAcum, +ISNULL(bms_ret.MONTPERDDED, 0) AS Operacionesconderivados_MontPerdDed,"; + + //Pagosaextranjeros + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.EsBenefEfectDelCobro, '') = '' THEN '' ELSE '1.0' END AS Pagosaextranjeros_Version, +ISNULL(bms_ret.PAISDERESIDPARAEFECFISC, '') AS Pagosaextranjeros_NoBeneficiario_PaisDeResidParaEfecFisc, +ISNULL(bms_ret.CONCEPTOPAGO_NOBENEFICIARIO, 0) AS Pagosaextranjeros_NoBeneficiario_ConceptoPago, +ISNULL(bms_ret.DESCRIPCIONCONCEPTO_NOBENEFICIARIO, '') AS Pagosaextranjeros_NoBeneficiario_DescripcionConcepto, +ISNULL(bms_ret.RFC, '') AS Pagosaextranjeros_Beneficiario_RFC, +ISNULL(bms_ret.CURP, '') AS Pagosaextranjeros_Beneficiario_CURP, +ISNULL(bms_ret.NOMDENRAZSOCB, '') AS Pagosaextranjeros_Beneficiario_NomDenRazSocB, +ISNULL(bms_ret.CONCEPTOPAGO_BENEFICIARIO, 0) AS Pagosaextranjeros_Beneficiario_ConceptoPago, +ISNULL(bms_ret.DESCRMONTOTROSCONCEPTDISTR, '') AS Pagosaextranjeros_Beneficiario_DescripcionConcepto, +ISNULL(bms_ret.ESBENEFEFECTDELCOBRO, '') AS Pagosaextranjeros_EsBenefEfectDelCobro,"; + + //Planesderetiro + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.SISTEMAFINANC, '') = '' THEN '' ELSE '1.0' END AS Planesderetiro_Version, +ISNULL(bms_ret.SISTEMAFINANC, '') AS Planesderetiro_SistemaFinanc, +ISNULL(bms_ret.MONTTOTAPORTANIOINMANTERIOR, 0) AS Planesderetiro_MontTotAportAnioInmAnterior, +ISNULL(bms_ret.MONTINTREALESDEVENGANIOOINMANT, 0) AS Planesderetiro_MontIntRealesDevengAniooInmAnt, +ISNULL(bms_ret.HUBORETIROSANIOINMANTPER, '') AS Planesderetiro_HuboRetirosAnioInmAntPer, +ISNULL(bms_ret.MONTTOTRETIRADOANIOINMANTPER, 0) AS Planesderetiro_MontTotRetiradoAnioInmAntPer, +ISNULL(bms_ret.MONTTOTEXENTRETIRADOANIOINMANT, 0) AS Planesderetiro_MontTotExentRetiradoAnioInmAnt, +ISNULL(bms_ret.MONTTOTEXEDENTEANIOINMANT, 0) AS Planesderetiro_MontTotExedenteAnioInmAnt, +ISNULL(bms_ret.HUBORETIROSANIOINMANT, '') AS Planesderetiro_HuboRetirosAnioInmAnt, +ISNULL(bms_ret.MONTTOTRETIRADOANIOINMANT, 0) AS Planesderetiro_MontTotRetiradoAnioInmAnt,"; + + //Premios + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.ENTIDADFEDERATIVA, '') = '' THEN '' ELSE '1.0' END AS Premios_Version, +ISNULL(bms_ret.ENTIDADFEDERATIVA, '') AS Premios_EntidadFederativa, +ISNULL(bms_ret.RETENCION_MONTTOTPAGO, 0) AS Premios_MontTotPago, +ISNULL(bms_ret.RETENCION_MONTTOTPAGOGRAV, 0) AS Premios_MontTotPagoGrav, +ISNULL(bms_ret.RETENCION_MONTTOTPAGOEXENT, 0) AS Premios_MontTotPagoExent,"; + + //SectorFinanciero SISTEMAFINANC + SysQueryEncabezado += @" +CASE WHEN ISNULL(bms_ret.IdFideicom, '') = '' THEN '' ELSE '1.0' END AS SectorFinanciero_Version, +ISNULL(bms_ret.IDFIDEICOM, '') AS SectorFinanciero_IdFideicom, +ISNULL(bms_ret.NOMFIDEICOM, '') AS SectorFinanciero_NomFideicom, +ISNULL(bms_ret.DESCRIPFIDEICOM, '') AS SectorFinanciero_DescripFideicom"; + SysQueryEncabezado += @" +FROM factfactura AS bms_ret"; + + if (CFDI4) + { + SysQueryEncabezado += @" +left join cliente cli on cli.CLAVE = ( select clineteclave from FacNotarioEnajenante where CONSECUTIVO = " + ComprobanteDBSysId + @" and ES_RETENCION = 1 ) +"; + } + SysQueryEncabezado += @" +WHERE CONSECUTIVO = " + ComprobanteDBSysId; + #endregion bms retencion timbrar + break; + default: + SysQueryEncabezado = string.Empty; + break; + } + } + #endregion queries timbrar bms + + + //3.1.2 a + //leer datos de retenciones + #region cfdi33_timbrar_retencion_data + public void cfdi33_timbrar_retencion_data() + { + + //datos de relacionados si es CFDI 4.0 + if (!string.IsNullOrEmpty(SysQueryRelacionados) && CFDI4) + { + cfdi33_data_relacionados(); + } + + SqlConnection con_ret = new SqlConnection(sql_conexion()); + try + { + sql_log("com_ret", SysQueryEncabezado); + SqlCommand cmd_ret = new SqlCommand(SysQueryEncabezado, con_ret); + cmd_ret.CommandTimeout = 30; + con_ret.Open(); + SqlDataReader rdr_ret = cmd_ret.ExecuteReader(); + if (rdr_ret != null) + { + while (rdr_ret.Read()) + { + + ConfigCertificadoRuta = uni_dec(rdr_ret["Certificado_Ruta"].ToString()); + ConfigKeyRuta = uni_dec(rdr_ret["Key_Ruta"].ToString()); + ConfigKeyClave = uni_dec(rdr_ret["Key_Clave"].ToString()); + Comprobante_NoCertificado = uni_dec(rdr_ret["Comprobante_NoCertificado"].ToString()); + Comprobante_Certificado = cfdi33_certificado(); + ComprobanteDBRutaEntrada = uni_dec(rdr_ret["ComprobanteDBRutaEntrada"].ToString()); + ComprobanteDBRutaSalida = uni_dec(rdr_ret["ComprobanteDBRutaSalida"].ToString()); + + + //Version 4.0 + Retenciones_Version = CFDI4 ? "2.0" : uni_dec(rdr_ret["Retenciones_Version"].ToString()); + Comprobante_Folio = uni_dec(rdr_ret["Comprobante_Folio"].ToString()); + Retenciones_CveRetenc = uni_dec(rdr_ret["Retenciones_CveRetenc"].ToString()); + Retenciones_CveRetenc = Retenciones_CveRetenc.Length == 1 ? "0" + Retenciones_CveRetenc : Retenciones_CveRetenc; + Retenciones_DescRetenc = uni_dec(rdr_ret["Retenciones_DescRetenc"].ToString()); + Comprobante_Estatus = uni_dec(rdr_ret["Retenciones_Estatus"].ToString()); + + if (CFDI4) { + int.TryParse(uni_dec(rdr_ret["Retenciones_LugarExpedicion"].ToString()), out Comprobante_LugarExpedicion); + } + + + Comprobante_Fecha = uni_dec(rdr_ret["Comprobante_Fecha"].ToString()); + + //Emisor + Retenciones_Emisor_RFCEmisor = uni_dec(rdr_ret["Retenciones_Emisor_RFCEmisor"].ToString()); + Retenciones_Emisor_NomDenRazSocE = uni_dec(rdr_ret["Retenciones_Emisor_NomDenRazSocE"].ToString()); + Retenciones_Emisor_CURPE = uni_dec(rdr_ret["Retenciones_Emisor_CURPE"].ToString()); + //CFDI4 + if (CFDI4) { Retenciones_Emisor_RegimenFiscal = uni_dec(rdr_ret["Retenciones_Emisor_RegimenFiscal"].ToString()); } + + + //Receptor + Retenciones_Receptor_Nacional_RFCRecep = uni_dec(rdr_ret["Retenciones_Receptor_Nacional_RFCRecep"].ToString()); + Retenciones_Receptor_Nacional_NomDenRazSocR = uni_dec(rdr_ret["Retenciones_Receptor_Nacional_NomDenRazSocR"].ToString()); + Retenciones_Receptor_Nacional_CURPR = uni_dec(rdr_ret["Retenciones_Receptor_Nacional_CURPR"].ToString()); + Retenciones_Receptor_Extranjero_NumRegIdTrib = uni_dec(rdr_ret["Retenciones_Receptor_Extranjero_NumRegIdTrib"].ToString()); + if (CFDI4) { + Retenciones_Receptor_DomicilioFiscalR = uni_dec(rdr_ret["Retenciones_Receptor_DomicilioFiscalR"].ToString()); + } + Retenciones_Receptor_Extranjero_NomDenRazSocR = uni_dec(rdr_ret["Retenciones_Receptor_Extranjero_NomDenRazSocR"].ToString()); + Retenciones_Receptor_Nacionalidad = uni_dec(rdr_ret["Retenciones_Receptor_Nacionalidad"].ToString()); + + int.TryParse(uni_dec(rdr_ret["Retenciones_Periodo_MesIni"].ToString()), out Retenciones_Periodo_MesIni); + int.TryParse(uni_dec(rdr_ret["Retenciones_Periodo_MesFin"].ToString()), out Retenciones_Periodo_MesFin); + int.TryParse(uni_dec(rdr_ret["Retenciones_Periodo_Ejerc"].ToString()), out Retenciones_Periodo_Ejerc); + + //la bd solo permite registrar un impuesto a retener + double Retenciones_Totales_ImpRetenidos_BaseRet = 0; + double Retenciones_Totales_ImpRetenidos_montoRet = 0; + double.TryParse(uni_dec(rdr_ret["Retenciones_Totales_ImpRetenidos_BaseRet"].ToString()), out Retenciones_Totales_ImpRetenidos_BaseRet); + double.TryParse(uni_dec(rdr_ret["Retenciones_Totales_ImpRetenidos_montoRet"].ToString()), out Retenciones_Totales_ImpRetenidos_montoRet); + + string TipoPago_ = CFDI4 ? uni_dec(rdr_ret["Retenciones_Totales_ImpRetenidos_TipoPagoRet2"].ToString()) + : uni_dec(rdr_ret["Retenciones_Totales_ImpRetenidos_TipoPagoRet"].ToString()); + + + Retenciones_Totales_ImpRetenidos.Add(new ImpRetenido + { + BaseRet = Retenciones_Totales_ImpRetenidos_BaseRet, + Impuesto = uni_dec(rdr_ret["Retenciones_Totales_ImpRetenidos_Impuesto"].ToString()), + TipoPagoRet = TipoPago_, + montoRet = Retenciones_Totales_ImpRetenidos_montoRet + }); + double.TryParse(uni_dec(rdr_ret["Retenciones_Totales_MontoTotOperacion"].ToString()), out Retenciones_Totales_MontoTotOperacion); + double.TryParse(uni_dec(rdr_ret["Retenciones_Totales_MontoTotGrav"].ToString()), out Retenciones_Totales_MontoTotGrav); + double.TryParse(uni_dec(rdr_ret["Retenciones_Totales_MontoTotExent"].ToString()), out Retenciones_Totales_MontoTotExent); + double.TryParse(uni_dec(rdr_ret["Retenciones_Totales_MontoTotRet"].ToString()), out Retenciones_Totales_MontoTotRet); + Intereseshipotecarios_Version = uni_dec(rdr_ret["Intereseshipotecarios_Version"].ToString()); + Intereseshipotecarios_CreditoDeInstFinanc = uni_dec(rdr_ret["Intereseshipotecarios_CreditoDeInstFinanc"].ToString()); + double.TryParse(uni_dec(rdr_ret["Intereseshipotecarios_SaldoInsoluto"].ToString()), out Intereseshipotecarios_SaldoInsoluto); + double.TryParse(uni_dec(rdr_ret["Intereseshipotecarios_PropDeducDelCredit"].ToString()), out Intereseshipotecarios_PropDeducDelCredit); + double.TryParse(uni_dec(rdr_ret["Intereseshipotecarios_MontTotIntNominalesDev"].ToString()), out Intereseshipotecarios_MontTotIntNominalesDev); + double.TryParse(uni_dec(rdr_ret["Intereseshipotecarios_MontTotIntNominalesDevYPag"].ToString()), out Intereseshipotecarios_MontTotIntNominalesDevYPag); + double.TryParse(uni_dec(rdr_ret["Intereseshipotecarios_MontTotIntRealPagDeduc"].ToString()), out Intereseshipotecarios_MontTotIntRealPagDeduc); + Intereseshipotecarios_NumContrato = uni_dec(rdr_ret["Intereseshipotecarios_NumContrato"].ToString()); + + + + + Arrendamientoenfideicomiso_Version = uni_dec(rdr_ret["Arrendamientoenfideicomiso_Version"].ToString()); + double.TryParse(uni_dec(rdr_ret["Arrendamientoenfideicomiso_PagProvEfecPorFiduc"].ToString()), out Arrendamientoenfideicomiso_PagProvEfecPorFiduc); + double.TryParse(uni_dec(rdr_ret["Arrendamientoenfideicomiso_RendimFideicom"].ToString()), out Arrendamientoenfideicomiso_RendimFideicom); + double.TryParse(uni_dec(rdr_ret["Arrendamientoenfideicomiso_DeduccCorresp"].ToString()), out Arrendamientoenfideicomiso_DeduccCorresp); + double.TryParse(uni_dec(rdr_ret["Arrendamientoenfideicomiso_MontTotRet"].ToString()), out Arrendamientoenfideicomiso_MontTotRet); + double.TryParse(uni_dec(rdr_ret["Arrendamientoenfideicomiso_MontResFiscDistFibras"].ToString()), out Arrendamientoenfideicomiso_MontResFiscDistFibras); + double.TryParse(uni_dec(rdr_ret["Arrendamientoenfideicomiso_MontOtrosConceptDistr"].ToString()), out Arrendamientoenfideicomiso_MontOtrosConceptDistr); + Arrendamientoenfideicomiso_DescrMontOtrosConceptDistr = uni_dec(rdr_ret["Arrendamientoenfideicomiso_DescrMontOtrosConceptDistr"].ToString()); + + Dividendos_Version = uni_dec(rdr_ret["Dividendos_Version"].ToString()); + Dividendos_DividOUtil_CveTipDivOUtil = uni_dec(rdr_ret["Dividendos_DividOUtil_CveTipDivOUtil"].ToString()); + double.TryParse(uni_dec(rdr_ret["Dividendos_DividOUtil_MontISRAcredRetMexico"].ToString()), out Dividendos_DividOUtil_MontISRAcredRetMexico); + double.TryParse(uni_dec(rdr_ret["Dividendos_DividOUtil_MontISRAcredRetExtranjero"].ToString()), out Dividendos_DividOUtil_MontISRAcredRetExtranjero); + double.TryParse(uni_dec(rdr_ret["Dividendos_DividOUtil_MontRetExtDivExt"].ToString()), out Dividendos_DividOUtil_MontRetExtDivExt); + Dividendos_DividOUtil_TipoSocDistrDiv = uni_dec(rdr_ret["Dividendos_DividOUtil_TipoSocDistrDiv"].ToString()); + double.TryParse(uni_dec(rdr_ret["Dividendos_DividOUtil_MontISRAcredNal"].ToString()), out Dividendos_DividOUtil_MontISRAcredNal); + double.TryParse(uni_dec(rdr_ret["Dividendos_DividOUtil_MontDivAcumNal"].ToString()), out Dividendos_DividOUtil_MontDivAcumNal); + double.TryParse(uni_dec(rdr_ret["Dividendos_DividOUtil_MontDivAcumExt"].ToString()), out Dividendos_DividOUtil_MontDivAcumExt); + double.TryParse(uni_dec(rdr_ret["Dividendos_Remanente_ProporcionRem"].ToString()), out Dividendos_Remanente_ProporcionRem); + + EnajenaciondeAcciones_Version = uni_dec(rdr_ret["EnajenaciondeAcciones_Version"].ToString()); + EnajenaciondeAcciones_ContratoIntermediacion = uni_dec(rdr_ret["EnajenaciondeAcciones_ContratoIntermediacion"].ToString()); + double.TryParse(uni_dec(rdr_ret["EnajenaciondeAcciones_Ganancia"].ToString()), out EnajenaciondeAcciones_Ganancia); + double.TryParse(uni_dec(rdr_ret["EnajenaciondeAcciones_Perdida"].ToString()), out EnajenaciondeAcciones_Perdida); + + Fideicomisonoempresarial_Version = uni_dec(rdr_ret["Fideicomisonoempresarial_Version"].ToString()); + Fideicomisonoempresarial_IngresosOEntradas_IntegracIngresos_Concepto = uni_dec(rdr_ret["Fideicomisonoempresarial_IngresosOEntradas_IntegracIngresos_Concepto"].ToString()); + double.TryParse(uni_dec(rdr_ret["Fideicomisonoempresarial_IngresosOEntradas_MontTotEntradasPeriodo"].ToString()), out Fideicomisonoempresarial_IngresosOEntradas_MontTotEntradasPeriodo); + double.TryParse(uni_dec(rdr_ret["Fideicomisonoempresarial_IngresosOEntradas_PartPropAcumDelFideicom"].ToString()), out Fideicomisonoempresarial_IngresosOEntradas_PartPropAcumDelFideicom); + double.TryParse(uni_dec(rdr_ret["Fideicomisonoempresarial_IngresosOEntradas_PropDelMontTot"].ToString()), out Fideicomisonoempresarial_IngresosOEntradas_PropDelMontTot); + Fideicomisonoempresarial_DeduccOSalidas_IntegracEgresos_ConceptoS = uni_dec(rdr_ret["Fideicomisonoempresarial_DeduccOSalidas_IntegracEgresos_ConceptoS"].ToString()); + double.TryParse(uni_dec(rdr_ret["Fideicomisonoempresarial_DeduccOSalidas_MontTotEgresPeriodo"].ToString()), out Fideicomisonoempresarial_DeduccOSalidas_MontTotEgresPeriodo); + double.TryParse(uni_dec(rdr_ret["Fideicomisonoempresarial_DeduccOSalidas_PartPropDelFideicom"].ToString()), out Fideicomisonoempresarial_DeduccOSalidas_PartPropDelFideicom); + double.TryParse(uni_dec(rdr_ret["Fideicomisonoempresarial_DeduccOSalidas_PropDelMontTot"].ToString()), out Fideicomisonoempresarial_DeduccOSalidas_PropDelMontTot); + double.TryParse(uni_dec(rdr_ret["Fideicomisonoempresarial_RetEfectFideicomiso_MontRetRelPagFideic"].ToString()), out Fideicomisonoempresarial_RetEfectFideicomiso_MontRetRelPagFideic); + Fideicomisonoempresarial_RetEfectFideicomiso_DescRetRelPagFideic = uni_dec(rdr_ret["Fideicomisonoempresarial_RetEfectFideicomiso_DescRetRelPagFideic"].ToString()); + + Intereses_Version = uni_dec(rdr_ret["Intereses_Version"].ToString()); + Intereses_SistFinanciero = uni_dec(rdr_ret["Intereses_SistFinanciero"].ToString()); + Intereses_RetiroAORESRetInt = uni_dec(rdr_ret["Intereses_RetiroAORESRetInt"].ToString()); + Intereses_OperFinancDerivad = uni_dec(rdr_ret["Intereses_OperFinancDerivad"].ToString()); + double.TryParse(uni_dec(rdr_ret["Intereses_MontIntNominal"].ToString()), out Intereses_MontIntNominal); + double.TryParse(uni_dec(rdr_ret["Intereses_MontIntReal"].ToString()), out Intereses_MontIntReal); + double.TryParse(uni_dec(rdr_ret["Intereses_Perdida"].ToString()), out Intereses_Perdida); + + Intereseshipotecarios_Version = uni_dec(rdr_ret["Intereseshipotecarios_Version"].ToString()); + Intereseshipotecarios_CreditoDeInstFinanc = uni_dec(rdr_ret["Intereseshipotecarios_CreditoDeInstFinanc"].ToString()); + double.TryParse(uni_dec(rdr_ret["Intereseshipotecarios_SaldoInsoluto"].ToString()), out Intereseshipotecarios_SaldoInsoluto); + double.TryParse(uni_dec(rdr_ret["Intereseshipotecarios_PropDeducDelCredit"].ToString()), out Intereseshipotecarios_PropDeducDelCredit); + double.TryParse(uni_dec(rdr_ret["Intereseshipotecarios_MontTotIntNominalesDev"].ToString()), out Intereseshipotecarios_MontTotIntNominalesDev); + double.TryParse(uni_dec(rdr_ret["Intereseshipotecarios_MontTotIntNominalesDevYPag"].ToString()), out Intereseshipotecarios_MontTotIntNominalesDevYPag); + double.TryParse(uni_dec(rdr_ret["Intereseshipotecarios_MontTotIntRealPagDeduc"].ToString()), out Intereseshipotecarios_MontTotIntRealPagDeduc); + Intereseshipotecarios_NumContrato = uni_dec(rdr_ret["Intereseshipotecarios_NumContrato"].ToString()); + + Operacionesconderivados_Version = uni_dec(rdr_ret["Operacionesconderivados_Version"].ToString()); + double.TryParse(uni_dec(rdr_ret["Operacionesconderivados_MontGanAcum"].ToString()), out Operacionesconderivados_MontGanAcum); + double.TryParse(uni_dec(rdr_ret["Operacionesconderivados_MontPerdDed"].ToString()), out Operacionesconderivados_MontPerdDed); + + Pagosaextranjeros_Version = uni_dec(rdr_ret["Pagosaextranjeros_Version"].ToString()); + Pagosaextranjeros_NoBeneficiario_PaisDeResidParaEfecFisc = uni_dec(rdr_ret["Pagosaextranjeros_NoBeneficiario_PaisDeResidParaEfecFisc"].ToString()); + int.TryParse(uni_dec(rdr_ret["Pagosaextranjeros_NoBeneficiario_ConceptoPago"].ToString()), out Pagosaextranjeros_NoBeneficiario_ConceptoPago); + Pagosaextranjeros_NoBeneficiario_DescripcionConcepto = uni_dec(rdr_ret["Pagosaextranjeros_NoBeneficiario_DescripcionConcepto"].ToString()); + Pagosaextranjeros_Beneficiario_RFC = uni_dec(rdr_ret["Pagosaextranjeros_Beneficiario_RFC"].ToString()); + Pagosaextranjeros_Beneficiario_CURP = uni_dec(rdr_ret["Pagosaextranjeros_Beneficiario_CURP"].ToString()); + Pagosaextranjeros_Beneficiario_NomDenRazSocB = uni_dec(rdr_ret["Pagosaextranjeros_Beneficiario_NomDenRazSocB"].ToString()); + int.TryParse(uni_dec(rdr_ret["Pagosaextranjeros_Beneficiario_ConceptoPago"].ToString()), out Pagosaextranjeros_Beneficiario_ConceptoPago); + Pagosaextranjeros_Beneficiario_DescripcionConcepto = uni_dec(rdr_ret["Pagosaextranjeros_Beneficiario_DescripcionConcepto"].ToString()); + Pagosaextranjeros_EsBenefEfectDelCobro = uni_dec(rdr_ret["Pagosaextranjeros_EsBenefEfectDelCobro"].ToString()); + + Planesderetiro_Version = uni_dec(rdr_ret["Planesderetiro_Version"].ToString()); + Planesderetiro_SistemaFinanc = uni_dec(rdr_ret["Planesderetiro_SistemaFinanc"].ToString()); + double.TryParse(uni_dec(rdr_ret["Planesderetiro_MontTotAportAnioInmAnterior"].ToString()), out Planesderetiro_MontTotAportAnioInmAnterior); + double.TryParse(uni_dec(rdr_ret["Planesderetiro_MontIntRealesDevengAniooInmAnt"].ToString()), out Planesderetiro_MontIntRealesDevengAniooInmAnt); + Planesderetiro_HuboRetirosAnioInmAntPer = uni_dec(rdr_ret["Planesderetiro_HuboRetirosAnioInmAntPer"].ToString()); + double.TryParse(uni_dec(rdr_ret["Planesderetiro_MontTotRetiradoAnioInmAntPer"].ToString()), out Planesderetiro_MontTotRetiradoAnioInmAntPer); + double.TryParse(uni_dec(rdr_ret["Planesderetiro_MontTotExentRetiradoAnioInmAnt"].ToString()), out Planesderetiro_MontTotExentRetiradoAnioInmAnt); + double.TryParse(uni_dec(rdr_ret["Planesderetiro_MontTotExedenteAnioInmAnt"].ToString()), out Planesderetiro_MontTotExedenteAnioInmAnt); + Planesderetiro_HuboRetirosAnioInmAnt = uni_dec(rdr_ret["Planesderetiro_HuboRetirosAnioInmAnt"].ToString()); + double.TryParse(uni_dec(rdr_ret["Planesderetiro_MontTotRetiradoAnioInmAnt"].ToString()), out Planesderetiro_MontTotRetiradoAnioInmAnt); + + Premios_Version = uni_dec(rdr_ret["Premios_Version"].ToString()); + Premios_EntidadFederativa = uni_dec(rdr_ret["Premios_EntidadFederativa"].ToString()); + double.TryParse(uni_dec(rdr_ret["Premios_MontTotPago"].ToString()), out Premios_MontTotPago); + double.TryParse(uni_dec(rdr_ret["Premios_MontTotPagoGrav"].ToString()), out Premios_MontTotPagoGrav); + double.TryParse(uni_dec(rdr_ret["Premios_MontTotPagoExent"].ToString()), out Premios_MontTotPagoExent); + + SectorFinanciero_Version = uni_dec(rdr_ret["SectorFinanciero_Version"].ToString()); + SectorFinanciero_IdFideicom = uni_dec(rdr_ret["SectorFinanciero_IdFideicom"].ToString()); + SectorFinanciero_NomFideicom = uni_dec(rdr_ret["SectorFinanciero_NomFideicom"].ToString()); + SectorFinanciero_DescripFideicom = uni_dec(rdr_ret["SectorFinanciero_DescripFideicom"].ToString()); + + + + //cfdi33_validar_licencia(Retenciones_Emisor_RFCEmisor); + } + } + rdr_ret.Close(); + rdr_ret.Dispose(); + con_ret.Close(); + //validaciones para bms + if (ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + if (Comprobante_Estatus.ToLower() == "timbrado" || Comprobante_Estatus.ToLower() == "timbrada") + { + sys_mensaje_error("El comprobante ya fue timbrado.", 1); + } + } + //si no se ha producido ningun error se validan los datos + if (string.IsNullOrEmpty(SysErrores)) + { + //validaciones + cfdi33_validar_configuracion(); + cfdi33_validar_retencion(); + cfdi33_xml_nombre(); + if (string.IsNullOrEmpty(SysErrores)) + { + cfdi33_xmlret(); + } + } + if (!string.IsNullOrEmpty(SysErrores)) + { + sys_proceso_error(); + } + } + catch (SqlException Ex) + { + con_ret.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de retenciones." + strErr, 1); + sql_err(Ex, "Ret", SysQueryEncabezado); + } + catch (Exception Ex) + { + if (con_ret != null) + { + con_ret.Close(); + } + sys_mensaje_error("Error al leer los datos de retenciones.", 1); + exe_err(Ex, "Ret"); + } + } + #endregion cfdi33_timbrar_retencion_data + + //3.1.2 b + + //leer datos comprobante encabezado y partidas comprobantes + #region cfdi33 timbrar data + public void cfdi33_timbrar_data() + { + //datos del encabezado + bool bolEnc = cfdi33_data_encabezado(); + bool bolPar = false; + //datos del partidas + if (bolEnc && string.IsNullOrEmpty(SysErrores)) + { + bolPar = cfdi33_data_partidas(); + } + if (bolEnc && bolPar && string.IsNullOrEmpty(SysErrores)) + { + //datos de relacionados + if (!string.IsNullOrEmpty(SysQueryRelacionados)) + { + cfdi33_data_relacionados(); + } + //datos Carta Porte Solo para Service Manager + //if (CartaPorte && ComprobanteDBTipoComprobante.ToLower() == "traslado" && ComprobanteDBAplicacion == "servicemanager") + if (CartaPorte && ComprobanteDBAplicacion == "servicemanager" && Sin_CP != "SIN_CP") + { + bool CP = cfdi33_CP(); + bool Ubicaciones = cfdi33_Ubicaciones(); + bool Mercancias = cfdi33_Mercancias(); + bool Pedimentos_Mercancia = Mercancias ? cfdi33_Ped_Mercancia() : false; + bool GuiasIdent_Mercancia = Mercancias ? cfdi33_Guias_Mercancia() : false; + bool Merca_CantTra = cfdi33_Mercancia_CantidadTransporta(); + bool FiguraTrans = cfdi33_FiguraTransporte(); + + if (CP && Ubicaciones && Mercancias && Merca_CantTra && FiguraTrans && string.IsNullOrEmpty(SysErrores)) + { + + string ErroStr = null; + if (TranspInternac == "Sí") { + if (string.IsNullOrEmpty(EntradaSalidaMerc)) + { + ErroStr += @"\n-El campo Entrada Salida de Mercancia debe contener un valor."; + } + if (string.IsNullOrEmpty(ViaEntradaSalida)) + { + ErroStr += @"\n-El campo via entrada Salida de Mercancia debe conenter un valor."; + } + + } + + foreach (var Ubi in Partidas_Ubicacion) + { + + + if (string.IsNullOrEmpty(Ubi.FechaHoraSalida_Ori) && Ubi.Origen) + { + ErroStr += @"El campo Fecha Hora salida de Origen es obligatorio.\\n"; + } + if (string.IsNullOrEmpty(Ubi.FechaHoraSalida_Des) && Ubi.Destino) + { + ErroStr += @"El Campo Fecha Hora Programada Llegada, es obligatorio.\\n"; + } + + if (string.IsNullOrEmpty(Ubi.Pais)) + { + ErroStr += Ubi.Origen && !Ubi.Destino ? @"El País del Origen, es obligatorio. " : @"El País del Destino, es obligatorio.\\n"; + } + if (Ubi.Pais == "MEX") + { + if (string.IsNullOrEmpty(Ubi.Calle)) + { + ErroStr += Ubi.Origen && !Ubi.Destino ? @"La Calle del Origen es obligatoria.\\" : @"La Calle del Destino es obligatoria.\\n"; + } + + if (string.IsNullOrEmpty(Ubi.Estado)) + { + ErroStr += Ubi.Origen && !Ubi.Destino ? @"El Estado del Origen, es obligatorio. " : @"El Estado del Destino, es obligatorio.\\n"; + } + + if (string.IsNullOrEmpty(Ubi.CodigoPostal) ) + { + ErroStr += Ubi.Origen && !Ubi.Destino ? @"El Código Postal del Origen, es obligatorio. " : @"El Código Postal del Destino, es obligatorio.\\n"; + } + } + + } + + + int cont = (from m in Partidas_Mercancias select m).Count(); + + if (cont > 0) + { + foreach (var mer in Partidas_Mercancias) + { + + if (mer.NumTotalMercancias == 0) + { + ErroStr += @"El Número de mercancias no esta sumarizado.\\n"; + } + + if (mer.PesoEnKg == 0.00) + { + ErroStr += @"El peso total en Kgs de mercancias es obligatorio.\\n"; + } + if (TranspInternac == "Sí") + { + if (mer.FraccionArancelaria == "") + { + ErroStr += @"La Fracción Arancelario es requerida cuando es transporte Internacional"; + } + //if (mer.UUIDComercioExt == "") + //{ + // ErroStr += @"El UUID de comercio exterios es requerido cuando es transporte Internacional"; + //} + } + + } + } + + int cantT = (from can in PartidasMercancia_CantidadTransporta select can).Count(); + if (cantT > 0) + { + foreach (var cantTras in PartidasMercancia_CantidadTransporta) + { + + if (cantTras.Cantidad == 0) + { + ErroStr += @"\n-La cantidad de la linea " + cantTras.LineaCantTrans + " esta vacía."; + } + if (string.IsNullOrEmpty(cantTras.IDOrigen)) + { + ErroStr += @"\n-El Id Origen de la linea " + cantTras.LineaCantTrans + " esta vacío."; + } + if (string.IsNullOrEmpty(cantTras.IDDestino)) + { + ErroStr += @"\nEl Id Destino de la linea " + cantTras.LineaCantTrans + " esta vacío."; + } + + } + } + + //Verifica que los DocumentosAduaneros en este caso que sean 01-Pedimento no tengan otra info no correspondiente + if (EntradaSalidaMerc == "Entrada") + { + int cont_ped = Pedimentos_Mercancia ? (from ped in Pedimentos_Mercancias select ped).Count() : 0; + if (cont_ped > 0) + { + foreach (var MPed in Pedimentos_Mercancias) + { + if (MPed.TIPODOCUMENTO !="01") { + ErroStr += @"\n -El Tipo de documento no es 01-Pedimento, cuando es entrada de Mercancia debe ser el pedimento en este nodo"; + } + if (string.IsNullOrEmpty(MPed.PEDIMENTO)) + { + ErroStr += @"\n -El Nodo Documentacion Aduanera; el Pedimentos no esta dado de alta correctamente"; + } + if (string.IsNullOrEmpty(MPed.RFCImpo)) { + ErroStr += @"\n -El Nodo Docuemtacion Aduanera; el RFC debe cumplir con las normas de RFC, si es extranjero poner 'XEXX010101000' generico extranjero"; + } + } + + } + } + int cont_Guias = GuiasIdent_Mercancia ? (from guias in Guias_Identificacion_Mercancias select guias).Count() : 0; + if (cont_Guias > 0) + { + foreach (var MGuias in Guias_Identificacion_Mercancias) + { + if (string.IsNullOrEmpty(MGuias.DESCRIPGUIAIDENTIFICACION)) + { + ErroStr += @"-Hay guias de identificaión sin descripción"; + } + if (string.IsNullOrEmpty(MGuias.NUMEROGUIAIDENTIFICACION)) + { + ErroStr += @"-Hay guias de identificaión sin número de guia"; + } + if (string.IsNullOrEmpty(MGuias.PESOGUIAIDENTIFICACION.ToString())) + { + ErroStr += @"-Hay guias de identificaión sin peso."; + } + + } + } + + if (TotalDistRec == 0) + { + ErroStr += @"\n -La Distancia Total de las mercancias es 0, favor de ingresar al menos el minimo requerido en una ubicacion Orgien y/o Destino 0.01."; + } + + + //AutoTransporteFederal + + if (string.IsNullOrEmpty(PermSCT)) + { + ErroStr += @"El Permiso de la SCT, es obligatorio.\\n"; + } + if (string.IsNullOrEmpty(NumPermisoSCT)) + { + ErroStr += @"El Numero de Permiso SCT es obligatorio.\\n"; + } + if (string.IsNullOrEmpty(NombreAseg)) + { + //ErroStr += @"El Nombre de la aseguradora es Obligatorio.\\n"; + } + + + if (string.IsNullOrEmpty(NumPolizaSeguro)) + { + //ErroStr += @"El Número de la poliza es Obligatorio.\\n"; + } + + + //IdentificacionVehicular + if (string.IsNullOrEmpty(ConfigVehicular)) + { + ErroStr += @"El Campo Configuracion Vehicular es obligatorio.\\n"; + } + + if (string.IsNullOrEmpty(PlacaVM)) + { + ErroStr += @"La Placa del vehiculo, es obligatoria.\\n"; + } + + if (string.IsNullOrEmpty(AnioModeloVM)) + { + ErroStr += @"El año del vehiculo es obligatorio.\\n"; + } + + if (string.IsNullOrEmpty(SubTipoRem)) + { + if (ConfigVehicular != "C2") + { + ErroStr += @"El subtipo remolque del vehiculo es obligatorio.\\n"; + } + } + + + + if (string.IsNullOrEmpty(Placa)) + { + if (ConfigVehicular != "C2") + { + ErroStr += @"El Placa del remolque vehiculo es obligatorio.\\n"; + } + + } + + + //FiguraTransporte + foreach (var figTra in Figura_Transportes) + { + string s = ""; + if (figTra.TIPOFIGURA == "O") { + s = "Operador"; + if (string.IsNullOrEmpty(figTra.Calle)) + { + ErroStr += @"La Calle del " + s + " es Obligatoria.\\n"; + } + if (string.IsNullOrEmpty(figTra.Estado)) + { + ErroStr += @"El Estado del " + s + " es Obligatorio.\\n"; + } + if (string.IsNullOrEmpty(figTra.Pais)) + { + ErroStr += @"El País del " + s + " es Obligatorio.\\n"; + } + if (string.IsNullOrEmpty(figTra.CodigoPostal)) + { + ErroStr += @"El Código Postal del " + s + " es Obligatorio.\\n"; + } + } + if (figTra.TIPOFIGURA == "P") + { + s = "Propietario"; + if (string.IsNullOrEmpty(figTra.Calle)) + { + ErroStr += @"La Calle del " + s + " es Obligatoria.\\n"; + } + if (string.IsNullOrEmpty(figTra.Estado)) + { + ErroStr += @"El Estado del " + s + " es Obligatorio.\\n"; + } + if (string.IsNullOrEmpty(figTra.Pais)) + { + ErroStr += @"El País del " + s + " es Obligatorio.\\n"; + } + if (string.IsNullOrEmpty(figTra.CodigoPostal)) + { + ErroStr += @"El Código Postal del " + s + " es Obligatorio.\\n"; + } + } + if (figTra.TIPOFIGURA == "A") + { + s = "Arrendatario"; + if (string.IsNullOrEmpty(figTra.Calle)) + { + ErroStr += @"La Calle del " + s + " es Obligatoria.\\n"; + } + if (string.IsNullOrEmpty(figTra.Estado)) + { + ErroStr += @"El Estado del " + s + " es Obligatorio.\\n"; + } + if (string.IsNullOrEmpty(figTra.Pais)) + { + ErroStr += @"El País del " + s + " es Obligatorio.\\n"; + } + if (string.IsNullOrEmpty(figTra.CodigoPostal)) + { + ErroStr += @"El Código Postal del " + s + " es Obligatorio.\\n"; + } + } + if (figTra.TIPOFIGURA == "N") + { + s = "Notificado"; + if (string.IsNullOrEmpty(figTra.Calle)) + { + ErroStr += @"La Calle del " + s + " es Obligatoria.\\n"; + } + if (string.IsNullOrEmpty(figTra.Estado)) + { + ErroStr += @"El Estado del " + s + " es Obligatorio.\\n"; + } + if (string.IsNullOrEmpty(figTra.Pais)) + { + ErroStr += @"El País del " + s + " es Obligatorio.\\n"; + } + if (string.IsNullOrEmpty(figTra.CodigoPostal)) + { + ErroStr += @"El Código Postal del " + s + " es Obligatorio.\\n"; + } + } + + + + } + + + if (!string.IsNullOrEmpty(ErroStr)) + { + sys_mensaje_error(ErroStr, 1); + } + + + } + + } + + //datos del complemento INE + if (!string.IsNullOrEmpty(SysQueryINE) && INE_Activo) + { + cfdi33_data_INE(); + } + //datos de pagos + if (ComprobanteDBTipoComprobante.ToLower() == "pago" && string.IsNullOrEmpty(SysErrores)) + { + cfdi33_data_pagos(); + } + //datos de notarios + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComplementoNotaria == 1 && ComprobanteDBAplicacion.ToLower() == "servicemanager" && string.IsNullOrEmpty(SysErrores)) + { + cfdi33_data_notaria(); + } + //validaciones para cg2 + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + //validaciones para anticipo egreso + if (ComprobanteDBTipoComprobante.ToLower() == "anticipo_egreso") + { + string strAntErr = string.Empty; + if (!(Comprobante_EstatusIngreso.ToLower() == "timbrado")) + { + sys_mensaje_error("Solo se puede timbrar el egreso del anticipo Si el anticipo fue timbrado" + strAntErr, 1); + } + } + //validaciones para egreso de factura y anticipo + if (ComprobanteDBTipoComprobante.ToLower() == "factura_egreso" || ComprobanteDBTipoComprobante.ToLower() == "anticipo_egreso" || ComprobanteDBTipoComprobante.ToLower() == "factura_egresoglobal") + { + if ((Comprobante_Estatus.ToLower() == "egresado" || Comprobante_Estatus.ToLower() == "egresada")) + { + sys_mensaje_error("El comprobante ya tiene un egreso.", 1); + } + } + else + { + if (Comprobante_Estatus.ToLower() == "timbrado" || Comprobante_Estatus.ToLower() == "timbrada") + { + sys_mensaje_error("El comprobante ya fue timbrado.", 1); + } + else if (Comprobante_Estatus.ToLower() == "cancelado" || Comprobante_Estatus.ToLower() == "cancelada" || Comprobante_Estatus.ToLower() == "en espera respuesta") + { + sys_mensaje_error("El comprobante ya fue cancelado.", 1); + } + } + } + //validaciones para bms + if (ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + if (Comprobante_Estatus.ToLower() == "timbrado" || Comprobante_Estatus.ToLower() == "timbrada" && ComprobanteDBTipoComprobante.ToLower() != "factura_egreso") + { + sys_mensaje_error("El comprobante ya fue timbrado.", 1); + } + else if (Comprobante_Estatus.ToLower() == "egresada" && ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") + { + sys_mensaje_error("El comprobante ya fue timbrado.", 1); + } + else if (Comprobante_Estatus.ToLower() == "cancelado" || Comprobante_Estatus.ToLower() == "cancelada") + { + sys_mensaje_error("El comprobante ya fue cancelado.", 1); + } + if (INE_Activo && Partida_INE.Count() == 0) + { + sys_mensaje_error("El comprobante tiene activo el Complemento INE y no tiene partidas declaradas.", 1); + } + } + //si no se ha producido ningun error se validan los datos + if (string.IsNullOrEmpty(SysErrores)) + { + //validaciones + cfdi33_validar_configuracion(); + cfdi33_validar_encabezado(); + cfdi33_validar_partidas(); + if (string.IsNullOrEmpty(SysErrores)) + { + cfdi33_xml_nombre(); + cfdi33_xml(); + } + } + } + if (!string.IsNullOrEmpty(SysErrores)) + { + sys_proceso_error(); + } + } + #endregion cfdi33 data + + + /////////////////////////////////////-------------CARTA PORTE------------------///////////////////////// + + //Llenar Querys Carta porte New esquema + public void llenaQuerysCP() { + SysQueryEncabezado = ""; + SysQueryEncabezado = @" +select +ISNULL(bms_tra.CFDI33_EmisorRegimenFiscal, '') AS Emisor_RegimenFiscal, +ISNULL(bms_tra.RECEPTOR_NOMBRE, '') AS Receptor_Nombre, +ISNULL(bms_tra.RECEPTOR_RFC, '') AS Receptor_Rfc, +ISNULL(bms_tra.CFDI33_RESIDENCIAFISCAL, 'MEX') AS Receptor_ResidenciaFiscal, +ISNULL(bms_tra.CFDI33_NUMREGIDTRIB, '') AS Receptor_NumRegIdTrib, +ISNULL(bms_tra.CFDI33_Receptor_UsoCFDI, '') AS Receptor_UsoCFDI, +ISNULL(bms_tra.EMISOR_NOMBRE, '') AS Emisor_Nombre, +ISNULL(bms_tra.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_tra.EMISOR_CP, '') AS Comprobante_LugarExpedicion, +ISNULL(bms_tra.TRASLADO_CFDI33_TIPOCOMPROBANTE, '') AS Comprobante_TipoDeComprobante, +ISNULL(bms_tra.CONDICIONPAGO, '') AS Comprobante_FormaPago, +ISNULL(bms_tra.CFDI33_MetodoPago, '') AS Comprobante_MetodoPago, +ISNULL(bms_tra.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_tra.FACTURA, '') AS Comprobante_Folio, +0 AS Comprobante_Total, +ISNULL(bms_tra.TIPOCAMBIO, 0) AS Comprobante_TipoCambio, +0 AS Comprobante_SubTotal, +ISNULL(bms_tra.Moneda, '') AS Comprobante_Moneda, +ISNULL(bms_tra.CFDI33_FechaYHoraEmision, '') AS Comprobante_Fecha, +ISNULL(bms_tra.TRASLADO_ESTATUS, '') AS Comprobante_Estatus, +0 AS Comprobante_Descuento, +'NA' AS Comprobante_ImporteIVA, +'NA' AS Comprobante_ImporteIVAPorcentaje, +'NA' AS Comprobante_ImporteIVARetenido, +'NA' AS Comprobante_ImporteIVARetenidoPorcentaje, +'NA' AS Comprobante_ImporteISR, +'NA' AS Comprobante_ImporteISRPorcentaje, + +ISNULL(bms_tra.CFDI33_CartaPorte,0) as CartaPorte, +--CFDI4.0 +isnull(bms_tra.Exportacion,'') AS Exportacion, +ISNULL(bms_tra.INFOGLO_PERIODICIDAD,'') AS Periodicidad, +ISNULL(bms_tra.INFOGLO_MESES,'') AS Meses, +ISNULL(bms_tra.INFOGLO_ANIO,'') AS Anio, +isnull((select CFDI33_DomicilioFiscal from cliente where clave = bms_tra.CLIENTE ),'') AS Receptor_DomicilioFiscal, +isnull((select CFDI33_REGIMENFISCAL from cliente where clave = bms_tra.CLIENTE ),'') AS Receptor_RegimenFiscal + +FROM factfactura AS bms_tra +WHERE bms_tra.CONSECUTIVO = " + ComprobanteDBSysId; + SysQueryPartidas += @" +ISNULL(bms_tradet.CFDI33_CLAVEPRODSERV, '') AS ClaveProdServ, +'' AS NoIdentificacion, +ISNULL(bms_tradet.CANTIDAD, 0) AS Cantidad, +ISNULL(bms_tradet.CFDI33_CLAVEUNIDAD, '') AS ClaveUnidad, +'' AS Unidad, +ISNULL(bms_tradet.DESCRIPCION, '') AS Descripcion, +0 AS Descuento, +0 AS ValorUnitario, +0 AS Importe, +'NA' AS PartidaIVA, +'NA' AS PartidaIVAPorcentaje, +'NA' AS PartidaIVARetenido, +'NA' AS PartidaIVARetenidoPorcentaje, +'NA' AS PartidaISR, +'NA' AS PartidaISRPorcentaje +FROM factdetfacturas AS bms_tradet +JOIN factfactura AS bms_tra ON bms_tra.CONSECUTIVO = bms_tradet.CONSECUTIVO +WHERE ISNULL(bms_tradet.TOTAL, 0) = 0 AND bms_tradet.CONSECUTIVO = " + ComprobanteDBSysId + " ORDER BY bms_tradet.LINEA"; + SysQueryRelacionados = @" +SELECT +ISNULL(bms_tra.FOLIOPAC, '') AS UUID +FROM factfactura AS bms_tra +WHERE ISNULL(bms_tra.FOLIOPAC, '') != '' AND ISNULL(bms_tra.CFDI33_CARTAPORTE, 0) = 1 AND bms_tra.CONSECUTIVO = " + ComprobanteDBSysId; + + + SysQueryCartaPorte += @" +select +CP.FIGURA_TRAN_CLAVETRANSPORTE AS FIGURA_TRAN_CLAVETRANSPORTE, +iif(CP.CARTAPORTE_TRANSPINTERNAC='Si','Sí','No') AS TranspInternac , +iif(CP.CARTAPORTE_TRANSPINTERNAC ='No','',CARTAPORTE_ENTRADASALIDAMERC) AS EntradaSalidaMerc , +iif (CP.CARTAPORTE_TRANSPINTERNAC ='No','',CARTAPORTE_VIAENTRADASALIDA) AS ViaEntradaSalida, +iif (CP.CARTAPORTE_TRANSPINTERNAC ='Si',CP.CartaPorte_PaisOrigenDestino,'') AS PaisOrigenDestino, +(select isNULL(sum(UBICACION_DISTANCIARECORRIDA),0) from CFDI33_CartaPorte_Ubicaciones where ID_CARTAPORTE_ = CP.ID_FACTURA_CONSECUTIVO) AS TotalDistRec, + +--iif(CP.CP_MCIAS_AUTOFED = 1,'True','false') +IsNull(CP_MCIAS_AUTOFED,0) , +IsNull(CP_MCIAS_AUTOFED_PERMSCT,'') AS PermSCT, +isNull(CP_MCIAS_AUTOFED_NUMPERMISOSCT,'') AS NumPermisoSCT, +isNUll(CP_MCIAS_AUTOFED_NOMBREASEG, '') AS NombreAseg, + +isNUll(CP_MCIAS_AUTOFED_NUMPOLIZASEGURO,'') AS NumPolizaSeguro, + +--AutotransporteFederal:identificacion Vehicular +ISNULL(CP.CP_MCIAS_AUTOFED_IDV_CONFIGVEHICULAR,'') AS ConfigVehicular, +isNUll(CP.CP_MCIAS_AUTOFED_IDV_PLACAVM,'') AS PlacaVM, +isNull(CP.CP_MCIAS_AUTOFED_IDV_ANIOMODELOVM,'') AS AnioModeloVM, + +--AutoTransporteFederal:Remolques +IsNull(CP.CP_MCIAS_AUTOFED_REM1_SUBTIPOREM,'') AS SubTipoRem, +isNUll(CP.CP_MCIAS_AUTOFED_REM1_PLACA,'') AS Placa, +IsNull(CP.CP_MCIAS_AUTOFED_REM2_SUBTIPOREM,'') AS SubTipoRem2, +isNUll(CP.CP_MCIAS_AUTOFED_REM2_PLACA,'') AS Placa2, + +--SEGUROS +ISNULL(ASEGURARESPCIVIL,'') AS AseguraRespCivil, +ISNULL(PolizaRespCivil, '') AS PolizaRespCivil, +ISNULL(AseguraMedAmbiente, '') AS AseguraMedAmbiente, +ISNULL(PolizaMedAmbiente, '') AS PolizaMedAmbiente, +ISNULL(AseguraCarga, '') AS AseguraCarga, +ISNULL(PolizaCarga, '') AS PolizaCarga, +ISNULL(PrimaSeguro, 0) AS PrimaSeguro, + +/*Campos Nuevos 3.0*/ +ISNULL(IDCCP,'') AS ID_Complemento, +ISNULL(REGIMENADUANERO,'') AS REGIMENADUANERO, +ISNULL(REGISTROISTMO,'') AS REGISTROISTMO, +ISNULL(UBICACIONPOLOORIGEN,'') AS UBICACIONPOLOORIGEN, +ISNULL(UBICACIONPOLODESTINO,'') AS UBICACIONPOLODESTINO, +ISNULL(LOGISTICAINVERSARECOLECCIONDEVOLUCION, '') AS LogisticaInv, +ISNULL(CP_MCIAS_AUTOFED_IDV_PESOBRUTOVEHICULAR,'') AS CP_MCIAS_AUTOFED_IDV_PESOBRUTOVEHICULAR + + +from CFDI33_CartaPorte CP +JOIN factfactura f on f.CONSECUTIVO = CP.ID_FACTURA_CONSECUTIVO +JOIN CFDI33_CartaPorte_Seguros cps on cps.ID_CP_SEGUROS = CP.ID_FACTURA_CONSECUTIVO +where CP.ID_FACTURA_CONSECUTIVO=" + ComprobanteDBSysId; + + SysQueryPedimentos = ""; + SysQueryPedimentos += @" +select +ISNULL(ID_CP_MERANCIA_PEDIMENTO, 0) AS ID_CP_MERANCIA_PEDIMENTO, +ISNULL(LINEAMERCANCIA, 0) AS LINEAMERCANCIA, +ISNULL(LINEAPEDIMENTOMERCA, 0) AS LINEAPEDIMENTOMERCA, +ISNULL(PEDIMENTO, '') AS PEDIMENTO, + +/*Nuevos CCP3.0*/ +ISNULL(TIPODOCUMENTO,'' )AS TIPODOCUMENTO, +ISNULL(IdentDocAduanero, '')AS IdentDocAduanero, +ISNULL(RFCImpo,'') AS RFCImpo + +from CFDI33_CartaPorte_Pedimentos +where ID_CP_MERANCIA_PEDIMENTO = " + ComprobanteDBSysId; + SysQueryGuiasIdentificacion = ""; + SysQueryGuiasIdentificacion += @" +select +ISNULL(ID_CARTAPORTE_MERCANCIA, 0) AS ID_CARTAPORTE_MERCANCIA, +ISNULL(LINEAMERCANCIA, 0) AS LINEAMERCANCIA, +ISNULL(LINEAGUIAIDENTIFICACION, 0) AS LINEAGUIAIDENTIFICACION, +ISNULL(NUMEROGUIAIDENTIFICACION,'') AS NUMEROGUIAIDENTIFICACION, +ISNULL(DESCRIPGUIAIDENTIFICACION, '') AS DESCRIPGUIAIDENTIFICACION, +ISNULL(PESOGUIAIDENTIFICACION, 0) AS PESOGUIAIDENTIFICACION +from CFDI33_CartaPorte_GuiasIdentificacion +where ID_CARTAPORTE_MERCANCIA =" + ComprobanteDBSysId; + + SysQueryUbicaciones += @" +select +CPU.ID_CARTAPORTE_ AS Id_Carta_Porte, +cpu.LINEA AS Linea, +CPU.UBICACION_ORIGEN AS Origen, +CPU.UBICACION_DESTINO AS Destino, + +iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0,'NA',isNull(CPU.UBICACION_TIPOESTACION,'')) AS TipoEstacion, +isNUll(CPU.UBICACION_DISTANCIARECORRIDA,0) AS DistanciaRecorrida, +--Origen +iif(CPU.UBICACION_ORIGEN=1,isNull(CPU.UBICACION_ORIGEN_IDORIGEN,''),'NA') AS IDOrigen, +iif(CPU.UBICACION_ORIGEN=1,isNUll(CPU.UBICACION_ORIGEN_RFCREMITENTE,''),'NA') AS RFCRemitente, +iif(CPU.UBICACION_ORIGEN=1,isNUll(CPU.UBICACION_ORIGEN_NOMBREREMITENTE,''),'NA') AS NombreRemitente, +iif(CPU.UBICACION_ORIGEN=1,ISNULL(CPU.UBICACION_ORIGEN_NUMREGIDTRIB,''),'NA') AS NumRegIdTrib_Ori, +iif(CPU.UBICACION_ORIGEN=1,isNull(CPU.UBICACION_ORIGEN_RESIDENCIAFISCAL,''),'NA') AS ResidenciaFiscal_Ori, +iif(CPU.UBICACION_ORIGEN=1,iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0,'NA',ISNULL(CPU.UBICACION_ORIGEN_NUMESTACION,'')),'NA') AS NumEstacion_Ori, +iif(CPU.UBICACION_ORIGEN=1,iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0,'NA', isNull(CPU.UBICACION_ORIGEN_NOMBREESTACION,'')),'NA') AS NombreEstacion_Ori, +iif(CPU.UBICACION_ORIGEN=1,isNull(CPU.UBICACION_ORIGEN_NAVEGACIONTRAFICO,''),'NA') AS NavegacionTrafico_Ori, +iif(CPU.UBICACION_ORIGEN=1,isNull(CPU.UBICACION_ORIGEN_FECHAHORASALIDA,''),'NA') AS FechaHoraSalida_Ori, +--Destino +iif(CPU.UBICACION_DESTINO=1,isNull(CPU.UBICACION_DESTINO_IDDESTINO,''),'NA') AS IDDestino, +iif(CPU.UBICACION_DESTINO=1,isNUll(CPU.UBICACION_DESTINO_RFCDESTINATARIO,''),'NA') AS RFCDestinatario, +iif(CPU.UBICACION_DESTINO=1,isNUll(CPU.UBICACION_DESTINO_NOMBRE,'NA'),'NA') AS NombreDestinatario, +iif(CPU.UBICACION_DESTINO=1,ISNULL(CPU.UBICACION_DESTINO_NUMREGIDTRIB,''),'NA') AS NumRegIdTrib_Des, +iif(CPU.UBICACION_DESTINO=1,isNull(CPU.UBICACION_DESTINO_RESIDENCIAFISCAL,''),'NA') AS ResidenciaFiscal_Des, +iif(CPU.UBICACION_DESTINO=1,iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0,'NA',ISNULL(CPU.UBICACION_DESTINO_NUMESTACION,'')), 'NA')AS NumEstacion_Des, +iif(CPU.UBICACION_DESTINO=1,iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0,'NA',isNull(CPU.UBICACION_DESTINO_NOMBREESTACION,'')),'NA') AS NombreEstacion_Des, +iif(CPU.UBICACION_DESTINO=1,isNull(CPU.UBICACION_DESTINO_NAVEGACIONTRAFICO,''),'NA') AS NavegacionTrafico_Des, +iif(CPU.UBICACION_DESTINO=1,isNull(CPU.UBICACION_DESTINO_FECHAHORAPROGLLEGADA,''),'NA') AS FechaHoraSalida_Des, + +--Ubicacion:Domicilio +isNull(CPU.UBICACION_DOMICILIO_CALLE,'') AS Calle, +isNUll(CPU.UBICACION_DOMICILIO_NUMEROEXTERIOR,'') AS NumeroExterior, +isNUll(CPU.UBICACION_DOMICILIO_NUMEROINTERIOR,'') AS NumeroInterior, +isNull(CPU.UBICACION_DOMICILIO_COLONIA,'') AS Colonia, +isNUll(CPU.UBICACION_DOMICILIO_LOCALIDAD,'') AS Localidad, +ISNULL(CPU.UBICACION_DOMICILIO_REFERENCIA,'') AS Referencia, +isNUll(CPU.UBICACION_DOMICILIO_MUNICIPIO,'') AS Municipio, +isNull(CPU.UBICACION_DOMICILIO_ESTADO,'') AS Estado, +isNUll(CPU.UBICACION_DOMICILIO_PAIS,'') AS Pais, +isNull(CPU.UBICACION_DOMICILIO_CODIGOPOSTAL,'') AS CodigoPostal +from CFDI33_CartaPorte_Ubicaciones CPU +Join CFDI33_CartaPorte CP on cp.ID_FACTURA_CONSECUTIVO =CPU.ID_CARTAPORTE_ +where CPU.ID_CARTAPORTE_ =" + ComprobanteDBSysId; + + SysQueryFiguraTransporte += @" +select +ID_FAC_CARTAPORTE_FIGURATRANS as Conse, +LINEA_FIGURATRANS AS linea, +TIPOFIGURA AS TIPOFIGURA, +--Operador +iif(TIPOFIGURA='O',OPE_RFCOPERADOR,'NA') AS RFCOperador, +iif(TIPOFIGURA='O',OPE_NUMLICENCIA,'NA') AS NumLicencia, +iif(TIPOFIGURA='O',OPE_NOMBREOPERADOR,'NA') AS NombreOperador, +iif(TIPOFIGURA='O',OPE_NUMREGIDTRIBOPERADOR,'NA') AS NumRegIdTribOperador, +iif(TIPOFIGURA='O',OPE_RESIDENCIAFISCALOPERADOR,'NA') AS ResidenciaFiscalOperador, + +--Propietario +iif(TIPOFIGURA='P',PROP_RFCPROPIETARIO,'NA') AS RFCPropietario, +iif(TIPOFIGURA='P',PROP_NOMBREPROPIETARIO,'NA') AS NombrePropietario, +iif(TIPOFIGURA='P',PROP_NUMREGIDTRIBPROPIETARIO,'NA') AS NumRegIdTribPropietario, +iif(TIPOFIGURA='P',PROP_RESIDENCIAFISCALPROPIETARIO,'NA') AS ResidenciaFiscalPropietario, + +--Arrendatario + +iif(TIPOFIGURA='A',ARRE_RFCARRENDATARIO,'NA') AS RFCArrendatario, +iif(TIPOFIGURA='A',ARRE_NOMBREARRENDATARIO,'NA') AS NombreArrendatario, +iif(TIPOFIGURA='A',ARRE_NUMREGIDTRIBARRENDATARIO,'NA') AS NumRegIdTribArrendatario, +iif(TIPOFIGURA='A',ARRE_RESIDENCIAFISCALARRENDATARIO,'NA') AS ResidenciaFiscalArrendatario, + +--Notificado +iif(TIPOFIGURA='N',NOTI_RFCNOTIFICADO,'NA') AS RFCNotificado, +iif(TIPOFIGURA='N',NOTI_NOMBRENOTIFICADO,'NA') AS NombreNotificado, +iif(TIPOFIGURA='N',NOTI_NUMREGIDTRIBNOTIFICADO,'NA') AS NumRegIdTribNotificado, +iif(TIPOFIGURA='N',NOTI_RESIDENCIAFISCALNOTIFICADO,'NA') AS ResidenciaFiscalNotificado, +--Domicilio +isNull(CALLE, '') AS Calle, +isNull(NUMEROEXTERIOR, '') AS NumeroExterior, +isNull(NUMEROINTERIOR, '') AS NumeroInterior, +isNull(COLONIA,'') AS Colonia, +isNull(LOCALIDAD,'') AS Localidad, +isNull(REFERENCIA,'') AS Referencia, +isNull(MUNICIPIO,'') AS Municipio, +isNull(ESTADO,'') AS Estado, +isNull(PAIS,'') AS Pais, +isNull(CODIGOPOSTAL,'') AS CodigoPostal +from CFDI33_FiguraTransporte +where ID_FAC_CARTAPORTE_FIGURATRANS =" + ComprobanteDBSysId; + + + SysQueryMercancias += @" +select +CPM.ID_CARTAPORTE_MERCANCIA As CartaPorteMerca, +CPM.LINEAMERCANCIA AS Linea, + +iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0 +,isNull(CP.CP_MCIAS_PESOBRUTOTOTAL,0),0) AS PesoBrutoTotal, + +iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0 +,isNUll(CP.CP_MCIAS_UNIDADPESO,''),'NA') AS UnidadPesoM, + +iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0 +,0,isNUll(CP.CP_MCIAS_PESONETOTOTAL,0)) AS PesoNetoTotal, + +isNUll(CP.CP_MCIAS_NUMTOTALMERCANCIAS,0) AS NumTotalMercancias, + +iif(CP.CP_MCIAS_AUTOFED =1 and isnull(CP.CP_MCIAS_TAEREO,0) =0 and isnull(CP.CP_MCIAS_TFERR,0)=0 and isnull(CP.CP_MCIAS_TRANMAR,0)=0 +,0,isNull(CP.CP_MCIAS_CARGOPORTASACION,0)) AS CargoPorTasacion, + +--Mercancia +isNull(CPM.BIENESTRANSP,'') AS BienesTransp, +isNull(CPM.ClaveSTCC,'') AS ClaveSTCC, +isNull(CPM.Descripcion,'') AS Descripcion, +isNull(CPM.CANTIDAD,0) AS Cantidad, +isNull(CPM.ClaveUnidad,'') AS ClaveUnidad, +isNull(CPM.Unidad,'') AS Unidad, +isNull(CPM.DIMENSIONES,'') AS Dimensiones, +isNull(CPM.MATERIALPELIGROSO,'No') AS MaterialPeligroso, +iif(isNull(CPM.MATERIALPELIGROSO,'No')='No','NA',isNull(CPM.CVEMATERIALPELIGROSO,'NA')) AS CveMaterialPeligroso, +iif(isNull(CPM.MATERIALPELIGROSO,'No')='No','NA',isNull(CPM.EMBALAJE,'NA')) AS Embalaje, +iif(isNull(CPM.MATERIALPELIGROSO,'No')='No','NA',isNull(CPM.DESCRIPEMBALAJE,'NA')) AS DescripEmbalaje, +isNull(CPM.PESOENKG,0) AS PesoEnKg, +isNull(CPM.VALORMERCANCIA,0) AS ValorMercancia, +isNull(CPM.MONEDA,0) AS MonedaMercancia, +isNull(CPM.FRACCIONARANCELARIA,0) AS FraccionArancelaria, +isNull(CPM.UUIDCOMERCIOEXT,0) AS UUIDComercioExt, + +--Detalles Mercancia +isNull(CPM.DETALLEMERCANCIA_UNIDADPESO,0) AS UnidadPeso, +isNull(CPM.DETALLEMERCANCIA_PESOBRUTO,0) AS PesoBruto, +isNull(CPM.DETALLEMERCANCIA_PESONETO,0) AS PesoNeto, +isNull(CPM.DETALLEMERCANCIA_PESOTARA,0) AS PesoTara, +isNull(CPM.DETALLEMERCANCIA_NUMPIEZAS,0) AS NumPiezas, + +/*Nuevos campos CCP 3.0*/ +ISNULL(CPM.SECTORCOFEPRIS,'') AS CPM_SECTORCOFEPRIS, +ISNULL(CPM.NombreIngredienteActivo,'') AS CPM_NombreIngredienteActivo, +ISNULL(CPM.NomQuimico,'') AS CPM_NomQuimico, +ISNULL(CPM.DenominacionGenericaProd,'') AS CPM_DenominacionGenericaProd, +ISNULL(CPM.DenominacionDistintivaProd,'') AS CPM_DenominacionDistintivaProd, +ISNULL(CPM.Fabricante,'') AS CPM_Fabricante, +ISNULL(CPM.FechaCaducidad,'') AS CPM_FechaCaducidad, +ISNULL(CPM.LoteMedicamento,'') AS CPM_LoteMedicamento, +ISNULL(CPM.SECTORCOFEPRIS,'') AS CPM_FormaFarmaceutica, +ISNULL(CPM.CondicionesEspTransp,'') AS CPM_CondicionesEspTransp, +ISNULL(CPM.RegistroSanitarioFolioAutorizacion,'') AS CPM_RegistroSanitarioFolioAutorizacion, +ISNULL(CPM.PermisoImportacion,'') AS CPM_PermisoImportacion, +ISNULL(CPM.FolioImpoVUCEM,'') AS CPM_FolioImpoVUCEM, +ISNULL(CPM.NumCAS,'') AS CPM_NumCAS, +ISNULL(CPM.RazonSocialEmpImp,'') AS CPM_RazonSocialEmpImp, +ISNULL(CPM.NumRegSanPlagCOFEPRIS,'') AS CPM_NumRegSanPlagCOFEPRIS, +ISNULL(CPM.DatosFabricante,'') AS CPM_DatosFabricante, +ISNULL(CPM.DatosFormulador,'') AS CPM_DatosFormulador, +ISNULL(CPM.DatosMaquilador,'') AS CPM_DatosMaquilador, +ISNULL(CPM.UsoAutorizado,'') AS CPM_UsoAutorizado, +ISNULL(CPM.TipoMateria,'') AS CPM_TipoMateria, +ISNULL(CPM.DescripcionMateria,'') AS CPM_DescripcionMateria + + + +from CFDI33_CartaPorte_Mercancias CPM +Join CFDI33_CartaPorte CP on cp.ID_FACTURA_CONSECUTIVO =CPM.ID_CARTAPORTE_MERCANCIA +where CPM.ID_CARTAPORTE_MERCANCIA=" + ComprobanteDBSysId; + + + + + SysQueryMercancias_CantidadTransporta += @" +select +CPCT.ID_CARTAPORTE_MERCANCIA AS ID, +CPCT.LINEAMERCANCIA AS Linea_Merca , +CPCT.ID_CANTIDADTRANSPORTA AS LineaCantTrans, +isNull(CPCT.MCIA_CANTIDAD, 0) AS Cantidad, +isNull(CPCT.MCIA_IDORIGEN,'') AS IDOrigen, +isNull(CPCT.MCIA_IDDESTINO,'') AS IDDestino, +isNull(CPCT.MCIA_CVESTRANSPORTE,'') AS CvesTransporte +from CFDI33_CartaPorte_CantidadTransporta CPCT +join CFDI33_CartaPorte_Mercancias CPM on CPM.ID_CARTAPORTE_MERCANCIA=CPCT.ID_CARTAPORTE_MERCANCIA +and CPM.LINEAMERCANCIA = CPCT.LINEAMERCANCIA +where CPCT.ID_CARTAPORTE_MERCANCIA=" + ComprobanteDBSysId; + + } + //------------------------------------- + + //3.1.2 c (Si es Carta Porte) + #region CartaPorte + public bool cfdi33_CP() { + + llenaQuerysCP(); + bool TodoFine = false; + SqlConnection conexion_CP = new SqlConnection(sql_conexion()); + try { + sql_log("CP_Encabezado", SysQueryCartaPorte); + SqlCommand Command_CP_Encabezado = new SqlCommand(SysQueryCartaPorte, conexion_CP); + Command_CP_Encabezado.CommandTimeout = 30; + conexion_CP.Open(); + SqlDataReader Read_CP_Encabezado = Command_CP_Encabezado.ExecuteReader(); + if (Read_CP_Encabezado != null) { + while (Read_CP_Encabezado.Read()) { + FIGURA_TRAN_CLAVETRANSPORTE = uni_dec(Read_CP_Encabezado["FIGURA_TRAN_CLAVETRANSPORTE"].ToString()); + TranspInternac = uni_dec(Read_CP_Encabezado["TranspInternac"].ToString()); + EntradaSalidaMerc = uni_dec(Read_CP_Encabezado["EntradaSalidaMerc"].ToString()); + ViaEntradaSalida = uni_dec(Read_CP_Encabezado["ViaEntradaSalida"].ToString()); + PaisOrigenDestino = uni_dec(Read_CP_Encabezado["PaisOrigenDestino"].ToString()); + double.TryParse(uni_dec(Read_CP_Encabezado["TotalDistRec"].ToString()), out TotalDistRec); + + //Auto Transporte + PermSCT = uni_dec(Read_CP_Encabezado["PermSCT"].ToString()); + NumPermisoSCT = uni_dec(Read_CP_Encabezado["NumPermisoSCT"].ToString()); + NombreAseg = uni_dec(Read_CP_Encabezado["NombreAseg"].ToString()); + NumPolizaSeguro = uni_dec(Read_CP_Encabezado["NumPolizaSeguro"].ToString()); + + ConfigVehicular = uni_dec(Read_CP_Encabezado["ConfigVehicular"].ToString()); + PlacaVM = uni_dec(Read_CP_Encabezado["PlacaVM"].ToString()); + AnioModeloVM = uni_dec(Read_CP_Encabezado["AnioModeloVM"].ToString()); + SubTipoRem = uni_dec(Read_CP_Encabezado["SubTipoRem"].ToString()); + Placa = uni_dec(Read_CP_Encabezado["Placa"].ToString()); + SubTipoRem2 = uni_dec(Read_CP_Encabezado["SubTipoRem2"].ToString()); + Placa2 = uni_dec(Read_CP_Encabezado["Placa2"].ToString()); + + //Seguros + AseguraRespCivil = uni_dec(Read_CP_Encabezado["AseguraRespCivil"].ToString()); + PolizaRespCivil = uni_dec(Read_CP_Encabezado["PolizaRespCivil"].ToString()); + AseguraMedAmbiente = uni_dec(Read_CP_Encabezado["AseguraMedAmbiente"].ToString()); + PolizaMedAmbiente = uni_dec(Read_CP_Encabezado["PolizaMedAmbiente"].ToString()); + AseguraCarga = uni_dec(Read_CP_Encabezado["AseguraCarga"].ToString()); + PolizaCarga = uni_dec(Read_CP_Encabezado["PolizaCarga"].ToString()); + double.TryParse(uni_dec(Read_CP_Encabezado["PrimaSeguro"].ToString()), out PrimaSeguro); + + //NUEVOS CCP 3.0 + ID_Complemento= uni_dec(Read_CP_Encabezado["ID_Complemento"].ToString()); + REGIMENADUANERO= uni_dec(Read_CP_Encabezado["REGIMENADUANERO"].ToString()); + REGISTROISTMO = uni_dec(Read_CP_Encabezado["REGISTROISTMO"].ToString()); + UBICACIONPOLOORIGEN = uni_dec(Read_CP_Encabezado["UBICACIONPOLOORIGEN"].ToString()); + UBICACIONPOLODESTINO = uni_dec(Read_CP_Encabezado["UBICACIONPOLODESTINO"].ToString()); + LogisticaInv = uni_dec(Read_CP_Encabezado["LogisticaInv"].ToString()); + CP_MCIAS_AUTOFED_IDV_PESOBRUTOVEHICULAR= uni_dec(Read_CP_Encabezado["CP_MCIAS_AUTOFED_IDV_PESOBRUTOVEHICULAR"].ToString()); + + TodoFine = true; + } + if (!TodoFine) { + sys_mensaje_error("No Existen comprobantes con el SysID " + ComprobanteDBSysId, 1); + } + } + Read_CP_Encabezado.Close(); + Read_CP_Encabezado.Dispose(); + conexion_CP.Close(); + } + catch (SqlException Ex) { + conexion_CP.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta del encabezado Carta Porte " + strErr, 1); + } + catch (Exception Ex) { + if (conexion_CP != null) { + conexion_CP.Close(); + } + sys_mensaje_error("Error al leer Datos de Carta Porte.", 1); + exe_err(Ex, "CP_ENCABEZADO"); + } + return TodoFine; + } + #endregion CartaPorte + + //leer Figura transporte + #region CartPorte_FiguraTransporte + public bool cfdi33_FiguraTransporte() + { + bool TodoFine = false; + SqlConnection conexion_FiguraTrans = new SqlConnection(sql_conexion()); + try + { + sql_log("Figura_Trans_CP", SysQueryFiguraTransporte); + SqlCommand Command_FiguraTrans = new SqlCommand(SysQueryFiguraTransporte, conexion_FiguraTrans); + Command_FiguraTrans.CommandTimeout = 30; + conexion_FiguraTrans.Open(); + SqlDataReader Reader_FiguraTrans = Command_FiguraTrans.ExecuteReader(); + if (Reader_FiguraTrans != null) { + while (Reader_FiguraTrans.Read()) { + + + if (Reader_FiguraTrans["TIPOFIGURA"].ToString() == "O") { + Figura_Transportes.Add(new FiguraTransporte + { + TIPOFIGURA = Reader_FiguraTrans["TIPOFIGURA"].ToString(), + RFCOperador = uni_dec(Reader_FiguraTrans["RFCOperador"].ToString()), + NumLicencia = uni_dec(Reader_FiguraTrans["NumLicencia"].ToString()), + NombreOperador = uni_dec(Reader_FiguraTrans["NombreOperador"].ToString()), + NumRegIdTribOperador = uni_dec(Reader_FiguraTrans["NumRegIdTribOperador"].ToString()), + ResidenciaFiscalOperador = uni_dec(Reader_FiguraTrans["ResidenciaFiscalOperador"].ToString()), + + Calle = uni_dec(Reader_FiguraTrans["Calle"].ToString()), + NumeroExterior = uni_dec(Reader_FiguraTrans["NumeroExterior"].ToString()), + NumeroInterior = uni_dec(Reader_FiguraTrans["NumeroInterior"].ToString()), + Colonia = uni_dec(Reader_FiguraTrans["Colonia"].ToString()), + Localidad = uni_dec(Reader_FiguraTrans["Localidad"].ToString()), + Referencia = uni_dec(Reader_FiguraTrans["Referencia"].ToString()), + Municipio = uni_dec(Reader_FiguraTrans["Municipio"].ToString()), + Estado = uni_dec(Reader_FiguraTrans["Estado"].ToString()), + Pais = uni_dec(Reader_FiguraTrans["Pais"].ToString()), + CodigoPostal = uni_dec(Reader_FiguraTrans["CodigoPostal"].ToString()) + + }); + } + else if (Reader_FiguraTrans["TIPOFIGURA"].ToString() == "P") { + Figura_Transportes.Add(new FiguraTransporte + { + TIPOFIGURA = Reader_FiguraTrans["TIPOFIGURA"].ToString(), + RFCPropietario = uni_dec(Reader_FiguraTrans["RFCPropietario"].ToString()), + NombrePropietario = uni_dec(Reader_FiguraTrans["NombrePropietario"].ToString()), + NumRegIdTribPropietario = uni_dec(Reader_FiguraTrans["NumRegIdTribPropietario"].ToString()), + ResidenciaFiscalPropietario = uni_dec(Reader_FiguraTrans["ResidenciaFiscalPropietario"].ToString()), + + Calle = uni_dec(Reader_FiguraTrans["Calle"].ToString()), + NumeroExterior = uni_dec(Reader_FiguraTrans["NumeroExterior"].ToString()), + NumeroInterior = uni_dec(Reader_FiguraTrans["NumeroInterior"].ToString()), + Colonia = uni_dec(Reader_FiguraTrans["Colonia"].ToString()), + Localidad = uni_dec(Reader_FiguraTrans["Localidad"].ToString()), + Referencia = uni_dec(Reader_FiguraTrans["Referencia"].ToString()), + Municipio = uni_dec(Reader_FiguraTrans["Municipio"].ToString()), + Estado = uni_dec(Reader_FiguraTrans["Estado"].ToString()), + Pais = uni_dec(Reader_FiguraTrans["Pais"].ToString()), + CodigoPostal = uni_dec(Reader_FiguraTrans["CodigoPostal"].ToString()) + }); + } + else if (Reader_FiguraTrans["TIPOFIGURA"].ToString() == "A") + { + Figura_Transportes.Add(new FiguraTransporte + { + + TIPOFIGURA = Reader_FiguraTrans["TIPOFIGURA"].ToString(), + RFCArrendatario = uni_dec(Reader_FiguraTrans["RFCArrendatario"].ToString()), + NombreArrendatario = uni_dec(Reader_FiguraTrans["NombreArrendatario"].ToString()), + NumRegIdTribArrendatario = uni_dec(Reader_FiguraTrans["NumRegIdTribArrendatario"].ToString()), + ResidenciaFiscalArrendatario = uni_dec(Reader_FiguraTrans["ResidenciaFiscalArrendatario"].ToString()), + + Calle = uni_dec(Reader_FiguraTrans["Calle"].ToString()), + NumeroExterior = uni_dec(Reader_FiguraTrans["NumeroExterior"].ToString()), + NumeroInterior = uni_dec(Reader_FiguraTrans["NumeroInterior"].ToString()), + Colonia = uni_dec(Reader_FiguraTrans["Colonia"].ToString()), + Localidad = uni_dec(Reader_FiguraTrans["Localidad"].ToString()), + Referencia = uni_dec(Reader_FiguraTrans["Referencia"].ToString()), + Municipio = uni_dec(Reader_FiguraTrans["Municipio"].ToString()), + Estado = uni_dec(Reader_FiguraTrans["Estado"].ToString()), + Pais = uni_dec(Reader_FiguraTrans["Pais"].ToString()), + CodigoPostal = uni_dec(Reader_FiguraTrans["CodigoPostal"].ToString()) + }); + } + else if (Reader_FiguraTrans["TIPOFIGURA"].ToString() == "N") + { + Figura_Transportes.Add(new FiguraTransporte + { + TIPOFIGURA = Reader_FiguraTrans["TIPOFIGURA"].ToString(), + RFCNotificado = uni_dec(Reader_FiguraTrans["RFCNotificado"].ToString()), + NombreNotificado = uni_dec(Reader_FiguraTrans["NombreNotificado"].ToString()), + NumRegIdTribNotificado = uni_dec(Reader_FiguraTrans["NumRegIdTribNotificado"].ToString()), + ResidenciaFiscalNotificado = uni_dec(Reader_FiguraTrans["ResidenciaFiscalNotificado"].ToString()), + + Calle = uni_dec(Reader_FiguraTrans["Calle"].ToString()), + NumeroExterior = uni_dec(Reader_FiguraTrans["NumeroExterior"].ToString()), + NumeroInterior = uni_dec(Reader_FiguraTrans["NumeroInterior"].ToString()), + Colonia = uni_dec(Reader_FiguraTrans["Colonia"].ToString()), + Localidad = uni_dec(Reader_FiguraTrans["Localidad"].ToString()), + Referencia = uni_dec(Reader_FiguraTrans["Referencia"].ToString()), + Municipio = uni_dec(Reader_FiguraTrans["Municipio"].ToString()), + Estado = uni_dec(Reader_FiguraTrans["Estado"].ToString()), + Pais = uni_dec(Reader_FiguraTrans["Pais"].ToString()), + CodigoPostal = uni_dec(Reader_FiguraTrans["CodigoPostal"].ToString()) + }); + } + TodoFine = true; + + } + } + if (!TodoFine) { + sys_mensaje_error("No existen datos figura Transporte con el consecutivo " + ComprobanteDBSysId, 1); + } + Reader_FiguraTrans.Close(); + Reader_FiguraTrans.Dispose(); + conexion_FiguraTrans.Close(); + } + catch (SqlException Ex) + { + conexion_FiguraTrans.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de Figura Transporte " + strErr, 1); + sql_err(Ex, "Figura_Trans_CP", SysQueryFiguraTransporte); + } + catch (Exception Ex) + { + if (conexion_FiguraTrans != null) + { + conexion_FiguraTrans.Close(); + } + sys_mensaje_error("Error al leer los datos Figura Transporte.", 1); + exe_err(Ex, "Figura_Transp"); + } + return TodoFine; + } + #endregion CartPorte_FiguraTransporte + + // Ubicaciones Carta Porte + #region CartaPorte_Ubicaciones + public bool cfdi33_Ubicaciones() { + bool TodoFine = false; + SqlConnection conexion_Ubicaciones = new SqlConnection(sql_conexion()); + try + { + sql_log("CP_Ubicaciones", SysQueryUbicaciones); + SqlCommand command_Ubicaciones = new SqlCommand(SysQueryUbicaciones, conexion_Ubicaciones); + command_Ubicaciones.CommandTimeout = 30; + conexion_Ubicaciones.Open(); + SqlDataReader reader_Ubicaciones = command_Ubicaciones.ExecuteReader(); + if (reader_Ubicaciones != null) { + while (reader_Ubicaciones.Read()) { + + int ID = 0; + int.TryParse(uni_dec(reader_Ubicaciones["Id_Carta_Porte"].ToString()), out ID); + + int Lin = 0; + int.TryParse(uni_dec(reader_Ubicaciones["Linea"].ToString()), out Lin); + + double DistanciaReco = 0; + double.TryParse(uni_dec(reader_Ubicaciones["DistanciaRecorrida"].ToString()), out DistanciaReco); + + bool Ori = reader_Ubicaciones["Origen"].ToString() == "1" ? true : false; + bool Des = reader_Ubicaciones["Destino"].ToString() == "1" ? true : false; + + //Origen + + Partidas_Ubicacion.Add(new PartidasUbicacion { + + Id_Carta_Porte = ID, + Linea = Lin, + Origen = Ori, + Destino = Des, + TipoEstacion = reader_Ubicaciones["TipoEstacion"].ToString(), + DistanciaRecorrida = DistanciaReco, + + IDOrigen = Ori ? reader_Ubicaciones["IDOrigen"].ToString() : "", + RFCRemitente = Ori ? reader_Ubicaciones["RFCRemitente"].ToString() : "", + NombreRemitente = Ori ? reader_Ubicaciones["NombreRemitente"].ToString() : "", + NumRegIdTrib_Ori = Ori ? reader_Ubicaciones["NumRegIdTrib_Ori"].ToString() : "", + ResidenciaFiscal_Ori = Ori ? reader_Ubicaciones["ResidenciaFiscal_Ori"].ToString() : "", + NumEstacion_Ori = Ori ? reader_Ubicaciones["NumEstacion_Ori"].ToString() : "", + NombreEstacion_Ori = Ori ? reader_Ubicaciones["NombreEstacion_Ori"].ToString() : "", + NavegacionTrafico_Ori = Ori ? reader_Ubicaciones["NavegacionTrafico_Ori"].ToString() : "", + FechaHoraSalida_Ori = Ori ? reader_Ubicaciones["FechaHoraSalida_Ori"].ToString() : "", + + IDDestino = Des ? reader_Ubicaciones["IDDestino"].ToString() : "", + RFCDestinatario = Des ? reader_Ubicaciones["RFCDestinatario"].ToString() : "", + NombreDestinatario = Des ? reader_Ubicaciones["NombreDestinatario"].ToString() : "", + NumRegIdTrib_Des = Des ? reader_Ubicaciones["NumRegIdTrib_Des"].ToString() : "", + ResidenciaFiscal_Des = Des ? reader_Ubicaciones["ResidenciaFiscal_Des"].ToString() : "", + NumEstacion_Des = Des ? reader_Ubicaciones["NumEstacion_Des"].ToString() : "", + NombreEstacion_Des = Des ? reader_Ubicaciones["NombreEstacion_Des"].ToString() : "", + NavegacionTrafico_Des = Des ? reader_Ubicaciones["NavegacionTrafico_Des"].ToString() : "", + FechaHoraSalida_Des = Des ? reader_Ubicaciones["FechaHoraSalida_Des"].ToString() : "", + + Calle = reader_Ubicaciones["Calle"].ToString(), + NumeroExterior = reader_Ubicaciones["NumeroExterior"].ToString(), + NumeroInterior = reader_Ubicaciones["NumeroInterior"].ToString(), + Colonia = reader_Ubicaciones["Colonia"].ToString(), + Localidad = reader_Ubicaciones["Localidad"].ToString(), + Referencia = reader_Ubicaciones["Referencia"].ToString(), + Municipio = reader_Ubicaciones["Municipio"].ToString(), + Estado = reader_Ubicaciones["Estado"].ToString(), + Pais = reader_Ubicaciones["Pais"].ToString(), + CodigoPostal = reader_Ubicaciones["CodigoPostal"].ToString() + }); + + + TodoFine = true; + } + + } + if (!TodoFine) + { + sys_mensaje_error("No existen datos para Ubicaciones carta porte", 1); + } + reader_Ubicaciones.Close(); + reader_Ubicaciones.Dispose(); + conexion_Ubicaciones.Close(); + + + } + catch (SqlException Ex) { + conexion_Ubicaciones.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en consulta de datos Ubicaciones " + strErr, 1); + sql_err(Ex, "Ubicaciones CP", SysQueryPartidas); + } + catch (Exception Ex) { + if (conexion_Ubicaciones != null) + { + conexion_Ubicaciones.Close(); + } + sys_mensaje_error("Error al leer datos Ubicaciones.", 1); + exe_err(Ex, "Ubicaciones_CP"); + } + return TodoFine; + + } + #endregion CartaPorte_Ubicaciones + + + //Nuevo nodo Mercancias--------Pedimentos---- + #region Mercancias_CartaPorte + public bool cfdi33_Ped_Mercancia() { + bool TodoFine = false; + SqlConnection conexion_Ped_Mercancias = new SqlConnection(sql_conexion()); + + try { + sql_log("CP_Pedimento_Mercancias", SysQueryPedimentos); + SqlCommand command_Mercancias_Pedimento = new SqlCommand(SysQueryPedimentos, conexion_Ped_Mercancias); + command_Mercancias_Pedimento.CommandTimeout = 30; + conexion_Ped_Mercancias.Open(); + SqlDataReader reader_Mercancias_Pedimento = command_Mercancias_Pedimento.ExecuteReader(); + if (reader_Mercancias_Pedimento != null && reader_Mercancias_Pedimento.HasRows) + { + while (reader_Mercancias_Pedimento.Read()) + { + int conse = 0; + int.TryParse(uni_dec(reader_Mercancias_Pedimento["ID_CP_MERANCIA_PEDIMENTO"].ToString()), out conse); + + int LinMer = 0; + int.TryParse(uni_dec(reader_Mercancias_Pedimento["LINEAMERCANCIA"].ToString()), out LinMer); + + int LinPed = 0; + int.TryParse(uni_dec(reader_Mercancias_Pedimento["LINEAPEDIMENTOMERCA"].ToString()), out LinPed); + + Pedimentos_Mercancias.Add(new Pedimentos { + ID_CP_MERANCIA_PEDIMENTO = conse, + LINEAMERCANCIA = LinMer, + LINEAPEDIMENTOMERCA = LinPed, + PEDIMENTO = reader_Mercancias_Pedimento["PEDIMENTO"].ToString(), + TIPODOCUMENTO = reader_Mercancias_Pedimento["TIPODOCUMENTO"].ToString(), + IdentDocAduanero = reader_Mercancias_Pedimento["IdentDocAduanero"].ToString(), + RFCImpo = reader_Mercancias_Pedimento["RFCImpo"].ToString() + }); + + TodoFine = true; + } + if (!TodoFine) + { + sys_mensaje_error("Hubo inconsistencias en Pedimentos Mercancias CartaPorte con el SysID " + ComprobanteDBSysId + ".", 1); + } + + } + reader_Mercancias_Pedimento.Close(); + reader_Mercancias_Pedimento.Dispose(); + conexion_Ped_Mercancias.Close(); + } + catch (SqlException Ex) + { + conexion_Ped_Mercancias.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta del Nodo Mercancias-Pedimentos Carta Porte." + strErr, 1); + sql_err(Ex, "Mercancias_PEDIMENTOS_CartaParte", SysQueryPedimentos); + } + catch (Exception Ex) + { + if (conexion_Ped_Mercancias != null) + { + conexion_Ped_Mercancias.Close(); + } + sys_mensaje_error("Error al leer los Mercancias-Pedimentos Carta Porte.", 1); + exe_err(Ex, "Mercancias_PEDIMENTOS_CartaPorte"); + + } + return TodoFine; + } + //Nuevo Nodo Mercancias ------- Guias de Identificacion--- + public bool cfdi33_Guias_Mercancia() { + bool TodoFine = false; + SqlConnection conexion_Guias = new SqlConnection(sql_conexion()); + try + { + sql_log("CP_Guias_Identificacion", SysQueryGuiasIdentificacion); + SqlCommand command_Guias = new SqlCommand(SysQueryGuiasIdentificacion, conexion_Guias); + command_Guias.CommandTimeout = 30; + conexion_Guias.Open(); + SqlDataReader reader_Guias = command_Guias.ExecuteReader(); + if (reader_Guias != null) + { + while (reader_Guias.Read()) + { + int conse = 0; + int.TryParse(uni_dec(reader_Guias["ID_CARTAPORTE_MERCANCIA"].ToString()), out conse); + + int LineaMer = 0; + int.TryParse(uni_dec(reader_Guias["LINEAMERCANCIA"].ToString()), out LineaMer); + + int LineaGuia = 0; + int.TryParse(uni_dec(reader_Guias["LINEAGUIAIDENTIFICACION"].ToString()), out LineaGuia); + + double pesoGuia = 0; + double.TryParse(uni_dec(reader_Guias["PESOGUIAIDENTIFICACION"].ToString()), out pesoGuia); + + Guias_Identificacion_Mercancias.Add(new Guias_Identificaicon { + ID_CARTAPORTE_MERCANCIA = conse, + LINEAMERCANCIA = LineaMer, + LINEAGUIAIDENTIFICACION = LineaGuia, + NUMEROGUIAIDENTIFICACION = reader_Guias["NUMEROGUIAIDENTIFICACION"].ToString(), + DESCRIPGUIAIDENTIFICACION = reader_Guias["DESCRIPGUIAIDENTIFICACION"].ToString(), + PESOGUIAIDENTIFICACION = pesoGuia + }); + TodoFine = true; + + } + if (!TodoFine) + { + + //sys_mensaje_error("No existen Mercancias Guias Transporte CartaPorte con el SysID " + ComprobanteDBSysId + ".", 1); + } + } + reader_Guias.Close(); + reader_Guias.Dispose(); + conexion_Guias.Close(); + + } + catch (SqlException Ex) + { + conexion_Guias.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta del Nodo Mercancias Guias Identificacion Carta Porte." + strErr, 1); + sql_err(Ex, "Mercancias_GuiasIdentificacion_CartaParte", SysQueryGuiasIdentificacion); + } + catch (Exception Ex) + { + if (conexion_Guias != null) + { + conexion_Guias.Close(); + } + sys_mensaje_error("Error al leer los Mercancias-Guias identificacion Carta Porte.", 1); + exe_err(Ex, "Mercancias_GuiasIdentificacion_CartaPorte"); + + } + return TodoFine; + } + + + + public bool cfdi33_Mercancias() { + bool TodoFine = false; + SqlConnection conexion_Mercancias = new SqlConnection(sql_conexion()); + try { + sql_log("CP_Mercancias", SysQueryMercancias); + SqlCommand command_Mercancias = new SqlCommand(SysQueryMercancias, conexion_Mercancias); + command_Mercancias.CommandTimeout = 30; + conexion_Mercancias.Open(); + SqlDataReader reader_Mercancias = command_Mercancias.ExecuteReader(); + if (reader_Mercancias != null) { + while (reader_Mercancias.Read()) { + + int conse = 0; + int.TryParse(uni_dec(reader_Mercancias["CartaPorteMerca"].ToString()), out conse); + + int Lin = 0; + int.TryParse(uni_dec(reader_Mercancias["Linea"].ToString()), out Lin); + + double PesoBrutoTot = 0; + double.TryParse(uni_dec(reader_Mercancias["PesoBrutoTotal"].ToString()), out PesoBrutoTot); + + double PesoNetoTot = 0; + double.TryParse(uni_dec(reader_Mercancias["PesoNetoTotal"].ToString()), out PesoNetoTot); + + int NumTotalMerc = 0; + int.TryParse(uni_dec(reader_Mercancias["NumTotalMercancias"].ToString()), out NumTotalMerc); + + double CargoPorTas = 0; + double.TryParse(uni_dec(reader_Mercancias["CargoPorTasacion"].ToString()), out CargoPorTas); + + double cant = 0; + double.TryParse(uni_dec(reader_Mercancias["Cantidad"].ToString()), out cant); + + double PesoEnKgs = 0; + double.TryParse(uni_dec(reader_Mercancias["PesoEnKg"].ToString()), out PesoEnKgs); + + double ValorMercancias = 0; + double.TryParse(uni_dec(reader_Mercancias["ValorMercancia"].ToString()), out ValorMercancias); + + + + double PesoBrutos = 0; + double.TryParse(uni_dec(reader_Mercancias["PesoBruto"].ToString()), out PesoBrutos); + + double PesoNetos = 0; + double.TryParse(uni_dec(reader_Mercancias["PesoNeto"].ToString()), out PesoNetos); + + double PesoTaraS = 0; + double.TryParse(uni_dec(reader_Mercancias["PesoNeto"].ToString()), out PesoTaraS); + + int NumPiezass = 0; + int.TryParse(uni_dec(reader_Mercancias["NumPiezas"].ToString()), out NumPiezass); + + Partidas_Mercancias.Add(new PartidasMercancia { + CartaPorteMerca = conse, + LineaMerca = Lin, + PesoBrutoTotal = PesoBrutoTot, + UnidadPesoM = reader_Mercancias["UnidadPesoM"].ToString(), + PesoNetoTotal = PesoNetoTot, + NumTotalMercancias = NumTotalMerc, + CargoPorTasacion = CargoPorTas, + + BienesTransp = reader_Mercancias["BienesTransp"].ToString(), + ClaveSTCC = reader_Mercancias["ClaveSTCC"].ToString(), + Descripcion = reader_Mercancias["Descripcion"].ToString(), + Cantidad = cant, + ClaveUnidad = reader_Mercancias["ClaveUnidad"].ToString(), + Unidad = reader_Mercancias["Unidad"].ToString(), + Dimensiones = reader_Mercancias["Dimensiones"].ToString(), + MaterialPeligroso = reader_Mercancias["MaterialPeligroso"].ToString(), + CveMaterialPeligroso = reader_Mercancias["CveMaterialPeligroso"].ToString(), + Embalaje = reader_Mercancias["Embalaje"].ToString(), + DescripEmbalaje = reader_Mercancias["DescripEmbalaje"].ToString(), + PesoEnKg = PesoEnKgs, + ValorMercancia = ValorMercancias, + MonedaMercancia = reader_Mercancias["MonedaMercancia"].ToString(), + FraccionArancelaria = reader_Mercancias["FraccionArancelaria"].ToString(), + UUIDComercioExt = reader_Mercancias["UUIDComercioExt"].ToString(), + + UnidadPeso = reader_Mercancias["UnidadPeso"].ToString(), + PesoBruto = PesoBrutos, + PesoNeto = PesoNetos, + PesoTara = PesoTaraS, + NumPiezas = NumPiezass, + + /*Campos nuevos CCP 3.0*/ + CPM_SECTORCOFEPRIS = reader_Mercancias["CPM_SECTORCOFEPRIS"].ToString(), + CPM_NombreIngredienteActivo = reader_Mercancias["CPM_NombreIngredienteActivo"].ToString(), + CPM_NomQuimico = reader_Mercancias["CPM_NomQuimico"].ToString(), + CPM_DenominacionGenericaProd = reader_Mercancias["CPM_DenominacionGenericaProd"].ToString(), + CPM_DenominacionDistintivaProd = reader_Mercancias["CPM_DenominacionDistintivaProd"].ToString(), + CPM_Fabricante = reader_Mercancias["CPM_Fabricante"].ToString(), + CPM_FechaCaducidad = reader_Mercancias["CPM_FechaCaducidad"].ToString(), + CPM_LoteMedicamento = reader_Mercancias["CPM_LoteMedicamento"].ToString(), + CPM_FormaFarmaceutica = reader_Mercancias["CPM_FormaFarmaceutica"].ToString(), + CPM_CondicionesEspTransp = reader_Mercancias["CPM_CondicionesEspTransp"].ToString(), + CPM_RegistroSanitarioFolioAutorizacion = reader_Mercancias["CPM_RegistroSanitarioFolioAutorizacion"].ToString(), + CPM_PermisoImportacion = reader_Mercancias["CPM_PermisoImportacion"].ToString(), + CPM_FolioImpoVUCEM = reader_Mercancias["CPM_FolioImpoVUCEM"].ToString(), + CPM_NumCAS = reader_Mercancias["CPM_NumCAS"].ToString(), + CPM_RazonSocialEmpImp = reader_Mercancias["CPM_RazonSocialEmpImp"].ToString(), + CPM_NumRegSanPlagCOFEPRIS = reader_Mercancias["CPM_NumRegSanPlagCOFEPRIS"].ToString(), + CPM_DatosFabricante = reader_Mercancias["CPM_DatosFabricante"].ToString(), + CPM_DatosFormulador = reader_Mercancias["CPM_DatosFormulador"].ToString(), + CPM_DatosMaquilador = reader_Mercancias["CPM_DatosMaquilador"].ToString(), + CPM_UsoAutorizado = reader_Mercancias["CPM_UsoAutorizado"].ToString(), + CPM_TipoMateria = reader_Mercancias["CPM_TipoMateria"].ToString(), + CPM_DescripcionMateria = reader_Mercancias["CPM_DescripcionMateria"].ToString() + }); + TodoFine = true; + } + //TodoFine = true; + //Partidas_Mercancias.Add(new PartidasMercancia + //{ NumTotalMercancias = 1, + // PesoEnKg =1}); + if (!TodoFine) { + sys_mensaje_error("No existen Mercancias CartaPorte con el SysID " + ComprobanteDBSysId + ".", 1); + } + } + reader_Mercancias.Close(); + reader_Mercancias.Dispose(); + conexion_Mercancias.Close(); + } + catch (SqlException Ex) { + conexion_Mercancias.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta del Nodo Mercancias Carta Porte." + strErr, 1); + sql_err(Ex, "Mercancias_CartaParte", SysQueryEncabezado); + } + catch (Exception Ex) + { + if (conexion_Mercancias != null) { + conexion_Mercancias.Close(); + } + sys_mensaje_error("Error al leer los Mercancias Carta Porte.", 1); + exe_err(Ex, "Mercancias_CartaPorte"); + + } + + return TodoFine; + } + #endregion Mercancias_CartaPorte + + #region Mercancias_CantidadTransporta + public bool cfdi33_Mercancia_CantidadTransporta() { + bool TodoFine = false; + SqlConnection conexion_CanTrans = new SqlConnection(sql_conexion()); + try { + sql_log("Mercancia_CantidadTransporta", SysQueryMercancias_CantidadTransporta); + SqlCommand command_CantTrans = new SqlCommand(SysQueryMercancias_CantidadTransporta, conexion_CanTrans); + command_CantTrans.CommandTimeout = 30; + conexion_CanTrans.Open(); + SqlDataReader reader_CantTrans = command_CantTrans.ExecuteReader(); + if (reader_CantTrans != null) + { + while (reader_CantTrans.Read()) + { + + int Id = 0; + int.TryParse(uni_dec(reader_CantTrans["ID"].ToString()), out Id); + + int LineaMerca = 0; + int.TryParse(uni_dec(reader_CantTrans["Linea_Merca"].ToString()), out LineaMerca); + + int LineaCantTra = 0; + int.TryParse(uni_dec(reader_CantTrans["LineaCantTrans"].ToString()), out LineaCantTra); + + double cant = 0; + double.TryParse(uni_dec(reader_CantTrans["Cantidad"].ToString()), out cant); + + PartidasMercancia_CantidadTransporta.Add(new PartidasMercanciaCantidadTransporta + { + ID = Id, + Linea_Merca = LineaMerca, + LineaCantTrans = LineaCantTra, + + Cantidad = cant, + IDOrigen = reader_CantTrans["IDOrigen"].ToString(), + IDDestino = reader_CantTrans["IDDestino"].ToString(), + CvesTransporte = reader_CantTrans["CvesTransporte"].ToString() + + }); + TodoFine = true; + } + TodoFine = true; + } + + if (!TodoFine) { + sys_mensaje_error("No existen partidas del comprobante Mercancias Cantidad Transporta con el SysID " + ComprobanteDBSysId + ".", 1); + } + reader_CantTrans.Close(); + reader_CantTrans.Dispose(); + conexion_CanTrans.Close(); + + } + catch (SqlException Ex) { + conexion_CanTrans.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de las partidas Cantidad Transporte CP." + strErr, 1); + sql_err(Ex, "Mercancia_CantTransp_CP", SysQueryPartidas); + } + catch (Exception Ex) + { + if (conexion_CanTrans != null) + { + conexion_CanTrans.Close(); + } + sys_mensaje_error("Error al leer los datos de las partidas Cantidad Transportada CP.", 1); + exe_err(Ex, "Mercancia_CantTransp_CP"); + } + + return TodoFine; + } + #endregion Mercancias_CantidadTransporta + + //////////////////////------------------------FIN CARTAS PORTES-------------////////////////////////// + + //3.2 + //cancelar cfdi33 + #region cfdi33 cancelar + class ApiResponse + { + public string rfcp { get; set; } + public string detail { get; set; } + } + public void cfdi33_cancelar() + { + SQLUpdate.Clear(); + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + cfdi33_cancelar_cg2(); + } + else + { + cfdi33_cancelar_bms(); + } + + if (string.IsNullOrEmpty(SysQueryEncabezado)) + { + sys_mensaje_error("La opción " + ComprobanteDBTipoComprobante + " no es válida para cancelación.", 1); + } + SqlDataReader rdr_can = sql_reader_function(SysQueryEncabezado, "cancelación", "can_comp"); + if (rdr_can.HasRows) + { + while (rdr_can.Read()) + { + ConfigPfxRuta = rdr_can["ConfigPfxRuta"].ToString(); + ConfigPfxClave = rdr_can["ConfigPfxClave"].ToString(); + Emisor_Rfc = rdr_can["Emisor_Rfc"].ToString(); + + Receptor_Rfc = rdr_can["Receptor_Rfc"].ToString(); + + Complemento_TimbreFiscalDigital_UUID = rdr_can["Complemento_TimbreFiscalDigital_UUID"].ToString(); + double.TryParse(uni_dec(rdr_can["Comprobante_Total"].ToString()), out Comprobante_Total); + Comprobante_Fecha = rdr_can["Comprobante_Fecha"].ToString(); + Comprobante_Serie = rdr_can["Comprobante_Serie"].ToString(); + Comprobante_Folio = rdr_can["Comprobante_Folio"].ToString(); + ComprobanteDBRutaSalida = rdr_can["ComprobanteDBRutaSalida"].ToString(); + ComprobanteDBRutaEntrada = rdr_can["ComprobanteDBRutaEntrada"].ToString(); + Comprobante_Estatus = rdr_can["Comprobante_Estatus"].ToString(); + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") { + PAC_RFC = rdr_can["PAC_RFC"].ToString(); + } + + + if (CFDIPac == "ComDig") + { + TIPOC = rdr_can["TIPOC"].ToString(); + ConfigKEYRuta = rdr_can["ConfigKEYRuta"].ToString(); + ConfigCERRuta = rdr_can["ConfigCERRuta"].ToString(); + bool is_ret = ComprobanteDBTipoComprobante.ToLower() == "retencion" ? true : false; + SysErrores = string.IsNullOrEmpty(TIPOC) && !is_ret ? SysErrores + @"No se ha especificado el tipo de comprobante.\par " : SysErrores; + } + + + Comprobante_Motivo_Cancela = rdr_can["Comprobante_MotivoCancelacion"].ToString(); + + comprobante_Folio_Cancela = rdr_can["Comprobante_Folio_Cancelacion"].ToString(); + + SysErrores = string.IsNullOrEmpty(Comprobante_Motivo_Cancela) ? SysErrores + @"No se especifico Motivo Cancelación del comprobante\par" : SysErrores; + if (Comprobante_Motivo_Cancela == "01") + { + SysErrores = string.IsNullOrEmpty(comprobante_Folio_Cancela) ? SysErrores + @"Ya que el motivo es 01-Comprobantes emitidos con errores con relación \par se debe agregar un folio relacionado." : SysErrores; + } + SysErrores = string.IsNullOrEmpty(ConfigPfxRuta) || !File.Exists(ConfigPfxRuta) ? SysErrores + @"No existe o no hay acceso a certificado.PFX\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ConfigPfxClave) ? SysErrores + @"No se ha especificado la clave del certificado PFX.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Emisor_Rfc) ? SysErrores + @"No se ha especificado el RFC del Emisor.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Complemento_TimbreFiscalDigital_UUID) ? SysErrores + @"No se ha especificado el UUID del comprobante.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Comprobante_Fecha) ? SysErrores + @"No se ha especificado la fecha del comprobante.\par " : SysErrores; + //cfdi33_validar_licencia(Emisor_Rfc); + } + + rdr_can.Close(); + if (string.IsNullOrEmpty(Complemento_TimbreFiscalDigital_UUID)) + { + sys_mensaje_error("No existe el UUID", 1); + sys_proceso_error(); + return; + } + #region CFDI_Mayor_A_5000 + if (Comprobante_Total >= 5000 && ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + SQLUpdate.Clear(); + + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + #region cg2 anticipo cancelar + SQLUpdateTbl = "Anticipos"; + SQLUpdateTblKey = "SYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "EN ESPERA RESPUESTA" }); + #endregion cg2 anticipo cancelar + break; + case "anticipo_egreso": + #region cg2 anticipo egreso cancelar + SQLUpdateTbl = "Anticipos_Egresos_Detalles"; + SQLUpdateTblKey = "ANTICIPOSYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "EN ESPERA RESPUESTA" }); + + #endregion cg2 anticipo egreso cancelar + break; + case "factura": + #region cg2 factura cancelar + SQLUpdateTbl = "Facturas"; + SQLUpdateTblKey = "CUENTAGASTOS"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUSCERTELEC", SQLStr = "EN ESPERA RESPUESTA" }); + + #endregion cg2 factura cancelar + break; + case "factura_egreso": + #region cg2 factura cancelar + SQLUpdateTbl = "Facturas_Egresos_Detalles"; + SQLUpdateTblKey = "EGRESOSYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "EN ESPERA RESPUESTA" }); + + #endregion cg2 factura cancelar + break; + case "notacredito": + #region cg2 notacredito cancelar + SQLUpdateTbl = "NotasCredito"; + SQLUpdateTblKey = "NOTASYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "CERTIFICADA", SQLStr = "EN ESPERA RESPUESTA" }); + + #endregion cg2 notacredito cancelar + break; + case "pago": + #region cg2 pago cancelar + SQLUpdateTbl = "Pagos"; + SQLUpdateTblKey = "SYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "EN ESPERA RESPUESTA" }); + + #endregion cg2 pago cancelar + break; + default: + SysQueryEncabezado = string.Empty; + break; + } + + } + #endregion CFDI_Mayor_A_5000 + + } + else + { + sys_mensaje_error("No existen comprobantes con el SysID " + ComprobanteDBSysId + ".", 1); + sys_proceso_error(); + return; + } + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") { + if (string.IsNullOrEmpty(PAC_RFC)) + { + //CFDIPac == "EdiCom" + //SCD110105654 + //EME000602QR9 + //Complemento_TimbreFiscalDigital_UUID + //mandar llamar la api si el RFC del PAC esta vacio + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + using (WebClient webClient = new WebClient()) + { + try + { + string prod = string.Format("{0}/cancela_timbre/", GeneralURL);//PAW ? "http://127.0.0.1:8000/cancela_timbre/" : "https://Aduanasoft.pythonanywhere.com/cancela_timbre/"; + + string url = $"{prod}?uuid={Complemento_TimbreFiscalDigital_UUID}"; + webClient.Headers[HttpRequestHeader.ContentType] = "application/json"; + webClient.Headers.Add("Authorization", DRF_Token); + string Response = webClient.DownloadString(url); + ApiResponse res = JsonConvert.DeserializeObject(Response); + + if (string.IsNullOrEmpty(res.detail)) + { + PAC_RFC = res.rfcp; + CFDIPac = PAC_RFC == "EME000602QR9" ? "EdiCom" : "ComDig"; + } + else + { + //si el res.detail no esta vacio + + } + } + catch (WebException ex) + { + SysErrores = ex.Message.ToString(); + sys_mensaje_error($"AS_009: Errores en la cancelacion: {SysErrores}", 1); + + return; + } + + } + } + else{ + //no esta vacio el RFC del PAC en BD y es EDICOM pero esta configurado con ComDig + CFDIPac = PAC_RFC == "EME000602QR9" ? "EdiCom" : "ComDig"; + } + if (CFDIPac == "EdiCom") + { + CFDIPacUsr = "SCT050708EB2"; + //CFDIPacPwd = "wwjrzykhi"; + CFDIPacPwd = "Soluciones28@"; + } + else { + CFDIPacUsr = CFDIMod == "Prueba" ? "SCT050708AD1" : "SCT050708AD1"; + CFDIPacPwd = CFDIMod == "Prueba" ? "0dcu2SwCv" : "0dcu2SwCv"; + CFDIPacUrl = CFDIMod == "Prueba" ? "" : "ws.comercio-digital.mx"; + } + } + + + if (!string.IsNullOrEmpty(SysErrores)) { + sys_mensaje_error(@"\par Error datos cancelacion", 1); + //sys_proceso_error(); + return; + } + if (Comprobante_Estatus.ToLower() == "cancelado" || Comprobante_Estatus.ToLower() == "cancelada" || Comprobante_Estatus.ToLower() == "en espera respuesta") + { + if (Comprobante_Estatus.ToLower() == "cancelado" || Comprobante_Estatus.ToLower() == "cancelada") + { + SysErrores = SysErrores + @"El comprobante ya se canceló.\par "; + } + else + { + SysErrores = SysErrores + @"El comprobante se encuentra en espera de respuesta, favor consulte su Estatus.\par "; + } + sys_proceso_error(); + return; + } + else + { + if (CFDIRfc != Emisor_Rfc && !string.IsNullOrEmpty(Emisor_Rfc)) + { + CFDIRfc = Emisor_Rfc; + cfdi33_conexion_xml(); + } + bool bolRet = ComprobanteDBTipoComprobante.ToLower() == "retencion" ? true : false; + + + if (CFDIPac == "EdiCom") + { + //edicom_cancelar(bolRet); + edicom_cancelar_Nvo(bolRet); + } + else + { + //Com Dig + cargaErroresSAT();// carga lista de errores SAT + + var bytes_key = File.ReadAllBytes(ConfigKEYRuta); + string base64_KEY = Convert.ToBase64String(bytes_key); + + var bytes_cer = File.ReadAllBytes(ConfigCERRuta); + string base64_CER = Convert.ToBase64String(bytes_cer); + + //MessageBox.Show("TIPOC:" + TIPOC + " total:" + Comprobante_Total.ToString() +" UUID:"+ Complemento_TimbreFiscalDigital_UUID + " Receptor_Rfc:" + Receptor_Rfc + " Emisor_Rfc" + Emisor_Rfc); + + cte_canc.cancelarPorUUIDconCSD + ( + bolRet ? "reten" : "cfdi", CFDIPacUsr, CFDIPacPwd, + Emisor_Rfc, + Complemento_TimbreFiscalDigital_UUID, + ConfigPfxClave, base64_KEY, base64_CER, "", "", + Receptor_Rfc, + Comprobante_Total.ToString(), + bolRet ? "" : TIPOC, + Comprobante_Motivo_Cancela, + comprobante_Folio_Cancela, + //Host pruebas or cancela production + CFDIMod == "Prueba" ? "pruebas" : "cancela", + CFDIRfc, + out int codigo, out string mensaje, out string acuse + ); + + + + if (codigo == 0 && string.IsNullOrEmpty(mensaje)) + { + + XDocument xDoc = XDocument.Parse(acuse); + + XDocument xmld = new XDocument(xDoc); + xmld.Save(SysTem + "C_" + Comprobante_Serie + Comprobante_Folio + "_response.xml"); + + string UUID = ""; + string CODE = ""; + string DESC = ""; + XElement xDoc2 = XElement.Load(SysTem + "C_" + Comprobante_Serie + Comprobante_Folio + "_response.xml"); + IEnumerable cancelaFolios = from el in xDoc2.Elements("Folios").Descendants("UUID") select el; + IEnumerable cancelaFoliosCODE = from el in xDoc2.Elements("Folios").Descendants("EstatusUUID") select el; + + foreach (XElement el in cancelaFolios) { + UUID = el.FirstNode.ToString(); + } + foreach (XElement el in cancelaFoliosCODE) + { + CODE = el.FirstNode.ToString(); + } + if (!string.IsNullOrEmpty(CODE)) { + foreach (var err in ERRORESSAT) { + if (err.Code == CODE) { + DESC = err.Desc; + break; + } + } + } + CancelStatus = CODE + "-" + DESC; + IsCancelable = "NA"; + llena_estatus_cancelacion_campos(CODE, CancelStatus, IsCancelable); + sql_update(); + //agregar informacion de cancelaciones Comercio Digital + string stri = send_timbre_cancela( + GeneralURL, + PAW, + Complemento_TimbreFiscalDigital_UUID, + DRF_Token, + CFDIRfc, + Complemento_TimbreFiscalDigital_RfcProvCertif, + Comprobante_Folio, Comprobante_Fecha, out string lex + ); + + sys_proceso_fin(CODE + " " + DESC, 1); + cfdi33_constructor(); + } + else { + SysErrores += "Errores Cancleacion AS_032: " + mensaje + " Codigo: " + codigo.ToString(); + sys_mensaje_error("Error Respuesta de cancelación", 1); + sys_proceso_error(); + return; + } + } + } + } + #endregion cfdi33 cancelar + public void llena_estatus_cancelacion_campos(string CODE, string CancelStatus, string IsCancelable) { + List Canceled = new List { "200", "202", "1202" }; + SQLUpdate.Clear(); + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Canceled.Contains(CODE) ? "CANCELADO" : "TIMBRADO" }); + break; + case "anticipo_egreso": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Canceled.Contains(CODE) ? "CANCELADO" : "TIMBRADO" }); + break; + case "factura": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUSCERTELEC", SQLStr = Canceled.Contains(CODE) ? "CANCELADA" : "TIMBRADA" }); + break; + case "factura_egreso": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Canceled.Contains(CODE) ? "CANCELADA" : "TIMBRADA" }); + break; + case "factura_egresoglobal": + SQLUpdate.Add(new SQLCol { SQLNom = "Comprobante_Estatus", SQLStr = Canceled.Contains(CODE) ? "CANCELADO" : "TIMBRADO" }); + break; + case "pago": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Canceled.Contains(CODE) ? "CANCELADO" : "TIMBRADO" }); + break; + } + } + else + { + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Canceled.Contains(CODE) ? "CANCELADO" : "TIMBRADO" }); + break; + + case "anticipo_egreso": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Canceled.Contains(CODE) ? "CANCELADO" : "TIMBRADO" }); + break; + + case "traslado": + SQLUpdate.Add(new SQLCol { SQLNom = "TRASLADO_ESTATUS", SQLStr = Canceled.Contains(CODE) ? "CANCELADA" : "CANCELADA" }); + break; + + case "factura": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Canceled.Contains(CODE) ? "CANCELADA" : "TIMBRADA" }); + break; + + case "factura_egreso": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Canceled.Contains(CODE) ? "CANCELADA" : "TIMBRADA" }); + break; + + case "pago": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTADO", SQLStr = Canceled.Contains(CODE) ? "CANCELADO" : "TIMBRADO" }); + break; + + case "retencion": + SQLUpdate.Add(new SQLCol { SQLNom = "RETENCION_ESTADO", SQLStr = Canceled.Contains(CODE) ? "CANCELADA" : "TIMBRADA" }); + + break; + } + } + if (ComprobanteDBTipoComprobante.ToLower() == "retencion") + { + SQLUpdate.Add(new SQLCol { SQLNom = "RET_ISCANCELABLE", SQLStr = IsCancelable }); + SQLUpdate.Add(new SQLCol { SQLNom = "RET_CANCELSTATUS", SQLStr = CancelStatus }); + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ISCANCELABLE_CFDI33", SQLStr = IsCancelable }); + SQLUpdate.Add(new SQLCol { SQLNom = "CANCELSTATUS_CFDI33", SQLStr = CancelStatus }); + } + + } + + + + + //3.3 + //recuperar cfdi33 + #region cfdi33 recuperar + public void cfdi33_recuperar() + { + + SQLUpdate.Clear(); + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + cfdi33_recuperar_cg2(); + } + else + { + cfdi33_recuperar_bms(); + } + + if (string.IsNullOrEmpty(SysQueryEncabezado)) + { + sys_mensaje_error("La opción " + ComprobanteDBTipoComprobante + " no es válida para recuperación.", 1); + return; + } + SqlDataReader rdr_rec = sql_reader_function(SysQueryEncabezado, "Recuperación", "rec_comp"); + if (rdr_rec.HasRows) + { + while (rdr_rec.Read()) + { + Emisor_Rfc = rdr_rec["Emisor_Rfc"].ToString(); + Receptor_Rfc = rdr_rec["Receptor_Rfc"].ToString(); + Complemento_TimbreFiscalDigital_UUID = rdr_rec["Complemento_TimbreFiscalDigital_UUID"].ToString(); + double.TryParse(uni_dec(rdr_rec["Comprobante_Total"].ToString()), out Comprobante_Total); + Comprobante_Fecha = rdr_rec["Comprobante_Fecha"].ToString(); + Comprobante_Serie = rdr_rec["Comprobante_Serie"].ToString(); + Comprobante_Folio = rdr_rec["Comprobante_Folio"].ToString(); + Comprobante_Sello = rdr_rec["Comprobante_Sello"].ToString(); + ComprobanteDBRutaSalida = rdr_rec["ComprobanteDBRutaSalida"].ToString(); + ComprobanteDBRutaEntrada = rdr_rec["ComprobanteDBRutaEntrada"].ToString(); + Comprobante_Estatus = rdr_rec["Comprobante_Estatus"].ToString(); + SysErrores = string.IsNullOrEmpty(Emisor_Rfc) ? SysErrores + @"No se ha especificado el RFC del Emisor\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Complemento_TimbreFiscalDigital_UUID) ? SysErrores + @"No se ha especificado el UUID del comprobante\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Comprobante_Fecha) ? SysErrores + @"No se ha especificado la fecha del comprobante\par " : SysErrores; + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + SysErrores = string.IsNullOrEmpty(ComprobanteDBRutaEntrada) || !Directory.Exists(ComprobanteDBRutaEntrada) ? SysErrores + @"No existe o no hay acceso a la ruta de Entrada de los XML\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ComprobanteDBRutaSalida) || !Directory.Exists(ComprobanteDBRutaSalida) ? SysErrores + @"No existe o no hay acceso a la ruta de Salida de los XML\par " : SysErrores; + if (CFDIPac == "ComDig") + { + ES_CFDI4 = rdr_rec["ES_CFDI4"].ToString() == "1" ? true : false; + } + + //PAC_RFC = rdr_rec["RFC_PAC"].ToString(); + } + else + { + SysErrores = string.IsNullOrEmpty(ComprobanteDBRutaSalida) || !Directory.Exists(ComprobanteDBRutaSalida) ? SysErrores + @"No existe o no hay acceso a la ruta de los Comprobantes XML\par " : SysErrores; + } + + try + { + PAC_RFC = rdr_rec["RFC_PAC"].ToString().Trim(); + } + catch (Exception) + { + + PAC_RFC = ""; + } + + + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + ConfigClienteClave = rdr_rec["ConfigClienteClave"].ToString(); + ConfigFacturaNombre = rdr_rec["ConfigFacturaNombre"].ToString(); + ConfigFacturaSufijo = rdr_rec["ConfigFacturaSufijo"].ToString(); + ConfigFacturaTipo = rdr_rec["ConfigFacturaTipo"].ToString(); + ConfigPedimentoTipo = rdr_rec["ConfigPedimentoTipo"].ToString(); + + //Nomenclatura C&N + if (ComprobanteDBOperacion.ToLower() == "recuperar") + { + Comprobante_NomenclaturaCNE = rdr_rec["Comprobante_NomenclaturaCNE"].ToString(); + } + } + //cfdi33_validar_licencia(Emisor_Rfc); + } + if (string.IsNullOrEmpty(Complemento_TimbreFiscalDigital_UUID)) + { + sys_mensaje_error("No existe el UUID", 1); + sys_proceso_error(); + return; + } + } + else + { + sys_mensaje_error("No existen comprobantes con el SysID " + ComprobanteDBSysId + ".", 1); + sys_proceso_error(); + return; + } + rdr_rec.Close(); + + cfdi33_xml_nombre(); + + if (CFDIRfc != Emisor_Rfc && !string.IsNullOrEmpty(Emisor_Rfc)) + { + CFDIRfc = Emisor_Rfc; + cfdi33_conexion_xml(); + } + sys_estatus("Generando QR..."); + cfdi33_codigoqr(); + sys_estatus("Recuperando Comprobante..."); + + ////----INYECTAR PROCESO DE RECUPERACION DE PAC( con UUID) + //Complemento_TimbreFiscalDigital_UUID + //DRF_Token + // internamente usa la variable "PAW" para saber a que url si es production o pruebas + + if (string.IsNullOrEmpty(PAC_RFC)) + { + + string Exception = ""; + + GetPAC_from_server(GeneralURL,DRF_Token, Complemento_TimbreFiscalDigital_UUID, out PAC_RFC, out Exception); + } + + if (!string.IsNullOrEmpty(PAC_RFC)) + { + CFDIPac = PAC_RFC == "EME000602QR9" ? "EdiCom" : "ComDig"; + ES_CFDI4 = true; + + } + else { + string resultado = MessageBox.Show($"El sistema está configurado con '{CFDIPac}'\nDesea intentar recuperar el Comprobante con {CFDIPac}?\n\n Nota si seleciona 'No' se intentara recuperar con el otro PAC ","Recuperacion CFDI", MessageBoxButtons.YesNo, MessageBoxIcon.Information).ToString(); + if (resultado == "No") + { + + CFDIPac = CFDIPac == "EdiCom" ? "ComDig": "EdiCom"; + ES_CFDI4 = true; + } + } + + if (CFDIPac == "EdiCom") + { + CFDIPacUsr = "SCT050708EB2"; + //CFDIPacPwd = "wwjrzykhi"; + CFDIPacPwd = "Soluciones28@"; + } + else + { + CFDIPacUsr = CFDIMod == "Prueba" ? "SCT050708AD1" : "SCT050708AD1"; + CFDIPacPwd = CFDIMod == "Prueba" ? "0dcu2SwCv" : "0dcu2SwCv"; + CFDIPacUrl = CFDIMod == "Prueba" ? "" : "ws.comercio-digital.mx"; + } + + + + //PROCESO NORMAL + if (CFDIPac == "EdiCom") + { + if (ComprobanteDBOperacion.ToLower() == "status") + { + if (ComprobanteDBTipoComprobante.ToLower() == "pago") + { + Comprobante_Total = 0; + } + + edicom_Recuperar_Status(); + } + else + { + edicom_recuperar(); + } + + } + else//-----------------------------Comercio Digital Consulta y Recuperacion + { + + + //-------------------status method + if (ComprobanteDBOperacion.ToLower() == "status") + { + + if (ComprobanteDBTipoComprobante.ToLower() == "pago") + { + Comprobante_Total = 0; + } + + formatRequestConsulta + ( + CFDIPacUsr, CFDIPacPwd, + Receptor_Rfc, Emisor_Rfc, + Comprobante_Total.ToString(), + Complemento_TimbreFiscalDigital_UUID, + out string codigo, out string msg, out string acuse + ); + + + if (string.IsNullOrEmpty(codigo) && string.IsNullOrEmpty(msg)) + { + //como manejar cuando no existe 205, el acuse siempre trae en sus primeros 3 caracteres el codigo, + + string[] existe = acuse.Split(' '); + + if (existe[0] == "000") + { + //cuando si existe CFDI + string[] words = acuse.Split('\n'); + string[] stat = words[3].Split(':'); + string[] stat2 = words[2].Split(':'); + string[] stat3 = words[1].Split(':'); + CancelStatus = stat[1]; + IsCancelable = stat2[1]; + Comprobante_Estatus = stat3[1].Replace(" ", ""); + string CODE = Comprobante_Estatus == "Cancelado" ? "200" : "000"; + + llena_estatus_cancelacion_campos(CODE, CancelStatus, IsCancelable); + sql_update(); + } + sys_proceso_fin(acuse, 1); + } + else + { + SysErrores += "Errores: " + msg + " Codigo: " + codigo; + sys_mensaje_error("Error Respuesta de consulta", 1); + sys_proceso_error(); + } + } + else { + //-----------------------------Recuperar method + //---------------------------Recuperarrrrrr XML + string tipoCFDI = "cfdi4.0"; + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") { + tipoCFDI = ES_CFDI4 ? "cfdi4.0" : "cfdi3.3"; + } + //MessageBox.Show(Receptor_Rfc + " - " + Emisor_Rfc + " - " + Comprobante_Total.ToString() + " - " + Complemento_TimbreFiscalDigital_UUID+" - "+ tipoCFDI+" -- "+ CFDIMod); + recuperarXML + ( + CFDIMod, + CFDIPacUsr, + CFDIPacPwd, + Complemento_TimbreFiscalDigital_UUID, + tipoCFDI, + out string codigo2, + out string errMsg, out string xml_tim + ); + if (string.IsNullOrEmpty(codigo2) && string.IsNullOrEmpty(errMsg)) + { + XDocument Comprobante1 = XDocument.Parse(xml_tim); + try + { + XDocument cfdi33 = new XDocument( + Comprobante1 + ); + cfdi33.Save(ComprobanteDBArchivoTimbrado); + + } + catch (Exception Ex) + { + exe_err(Ex, "Gua_XML_RECUP_COM_DIG"); + } + + sys_proceso_fin("!Comprobante Recuperado!", 1, "\nEn la ruta:\n" + ComprobanteDBArchivoTimbrado); + } + else + { + SysErrores += "Errores: " + errMsg + " Codigo: " + codigo2; + sys_mensaje_error("Error recuperacion CFDI", 1); + sys_proceso_error(); + } + } + } + } + #endregion cfdi33 recuperar + + //3.4 + //leer cep cfdi33 + #region cfdi33 cep + public void cfdi33_cep() + { + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + SysQueryEncabezado = @" + SELECT + ISNULL(cg2_pag.RUTACERTIFICADOPAGOTEF, '') AS Pago10_CEPRuta, + ISNULL(cg2_pag.ESTATUS, '') AS Comprobante_Estatus, + ISNULL(cg2_pag.FORMADEPAGOP, '') AS Comprobante_MetodoPago + FROM Pagos AS cg2_pag + WHERE cg2_pag.SYSID = " + ComprobanteDBSysId; + } + if (ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + SysQueryEncabezado = @" + SELECT + ISNULL(bms_pag.CEP_Ruta, '') AS Pago10_CEPRuta, + ISNULL(bms_pag.ESTADO, '') AS Comprobante_Estatus, + ISNULL(bms_pag.CFDI33_FORMAPAGO, '') AS Comprobante_MetodoPago + FROM factpagos AS bms_pag + WHERE bms_pag.NUMERO = " + ComprobanteDBSysId; + } + + sys_estatus("Leyendo XML de CEP..."); + + SqlConnection con_cep = new SqlConnection(sql_conexion()); + try + { + sql_log("xml_cep", SysQueryEncabezado); + SqlCommand cmd_cep = new SqlCommand(SysQueryEncabezado, con_cep); + cmd_cep.CommandTimeout = 30; + con_cep.Open(); + SqlDataReader rdr_cep = cmd_cep.ExecuteReader(); + if (rdr_cep != null) + { + while (rdr_cep.Read()) + { + if (ComprobanteDBOrigen == "cmd") + { + Pago10_CEPRuta = rdr_cep["Pago10_CEPRuta"].ToString(); + } + Comprobante_Estatus = rdr_cep["Comprobante_Estatus"].ToString(); + Comprobante_MetodoPago = rdr_cep["Comprobante_MetodoPago"].ToString(); + } + } + rdr_cep.Close(); + rdr_cep.Dispose(); + con_cep.Close(); + try + { + if (File.Exists(Pago10_CEPRuta) && !string.IsNullOrEmpty(Pago10_CEPRuta) && Comprobante_Estatus.ToLower() != "timbrado" && Comprobante_MetodoPago == "03") + { + int intNod = 0; + FileStream fsXml = new FileStream(Pago10_CEPRuta, FileMode.Open); + XmlReader xmlReader = XmlReader.Create(fsXml); + + string FechaPago = string.Empty; + string HoraPago = string.Empty; + // Lectura de todos los nodos del documento XML: + while (xmlReader.Read()) + { + // Comprueba que el elemento actual contenga atributos: + if (xmlReader.HasAttributes) + { + while (xmlReader.MoveToNextAttribute()) + { + switch (xmlReader.Name) + { + case "FechaOperacion": + FechaPago = xmlReader.Value; + break; + case "Hora": + HoraPago = xmlReader.Value; + break; + case "sello": + Pago10_SelloPago = xmlReader.Value; + break; + case "cadenaCDA": + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(xmlReader.Value.Replace(Pago10_SelloPago, string.Empty)); + Pago10_CadPago = System.Convert.ToBase64String(plainTextBytes); + break; + case "BancoEmisor": + Pago10_NomBancoOrdExt = xmlReader.Value; + break; + case "Cuenta": + if (string.IsNullOrEmpty(Pago10_CtaBeneficiario)) + { + Pago10_CtaBeneficiario = xmlReader.Value; + } + else + { + Pago10_CtaOrdenante = xmlReader.Value; + } + break; + case "MontoPago": + double.TryParse(xmlReader.Value, out Pago10_Monto); + break; + } + } + xmlReader.MoveToElement(); + intNod++; + } + Pago10_FechaPago = FechaPago + " " + HoraPago; + } + fsXml.Close(); + var bytes = File.ReadAllBytes(Pago10_CEPRuta); + Pago10_CertPago = Convert.ToBase64String(bytes); + string strErr = string.Empty; + strErr = string.IsNullOrEmpty(FechaPago) ? strErr + @"No se localizo la fecha de pago.\n" : strErr; + strErr = string.IsNullOrEmpty(HoraPago) ? strErr + @"No se localizo la hora de pago.\n" : strErr; + strErr = string.IsNullOrEmpty(Pago10_SelloPago) ? strErr + @"No se localizo el sello de pago.\n" : strErr; + strErr = string.IsNullOrEmpty(Pago10_CadPago) ? strErr + @"No se localizo la cadena de pago.\n" : strErr; + strErr = string.IsNullOrEmpty(Pago10_NomBancoOrdExt) ? strErr + @"No se localizo el banco ordenante.\n" : strErr; + strErr = string.IsNullOrEmpty(Pago10_CtaOrdenante) ? strErr + @"No se localizo la cuenta ordenante.\n" : strErr; + strErr = string.IsNullOrEmpty(Pago10_CtaBeneficiario) ? strErr + @"No se localizo la cuenta beneficiaria.\n" : strErr; + strErr = Pago10_Monto == 0 ? strErr + @"No se localizo el monto de pago.\n" : strErr; + if (string.IsNullOrEmpty(strErr)) + { + cfdi33_cep_update(); + } + else + { + sys_mensaje_error(strErr, 1); + } + } + else + { + string strErr = "No se agregó el CEP al comprobante revise:"; + if (Comprobante_MetodoPago.ToLower() != "03") + { + strErr += "\\par El método de pago debe ser 03."; + } + if (Comprobante_Estatus.ToLower() == "timbrado") + { + strErr += "\\par El comprobante ya ha sido timbrado."; + } + if (string.IsNullOrEmpty(Pago10_CEPRuta)) + { + strErr += "\\par No especificó la ruta del XML de pago."; + } + if (!File.Exists(Pago10_CEPRuta)) + { + strErr += "\\par No se localizo el XML de pago"; + } + sys_mensaje_error(strErr, 4); + } + } + catch (Exception Ex) + { + sys_mensaje_error("Error al leer los datos del XML de pago.", 1); + exe_err(Ex, "Cep"); + } + } + catch (SqlException Ex) + { + con_cep.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de CEP de pago." + strErr, 1); + sql_err(Ex, "Cep", SysQueryEncabezado); + } + catch (Exception Ex) + { + if (con_cep != null) + { + con_cep.Close(); + } + sys_mensaje_error("Error al leer los datos de CEP de pago.", 1); + exe_err(Ex, "Cep"); + } + } + #endregion cfdi33 cep + + //3.5.1 + //ver lista de clientes autorizados para timbrar + #region cfdi33 ver clientes + public void cfdi33_ver_clientes(bool bolBet = false) + { + string strBet = bolBet ? "_Beta" : string.Empty; + string strTit = bolBet ? "Beta" : "Producción"; + try + { + sys_arc(SysDir + "config_ver.asx"); + WebClient webClient = new WebClient(); + webClient.DownloadFile("http://aduanasoft.com/Herramientas/CFDI" + strBet + "/config.asx", SysDir + "config_ver.asx"); + webClient.Dispose(); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al descargar lista de clientes autorizados para timbrar."); + exe_err(Ex, "DesLic"); + } + try + { + + string strNeg = "style='background-color:#000;color:#fff;font-weight:bold;'"; + string strRepEnc = ""; + string strRepDet = string.Empty; + + //regresar de base 64 a text el xml con la lista de clientes autorizados para timbrar + byte[] plain = Convert.FromBase64String(File.ReadAllText(SysDir + "config_ver.asx")); + System.IO.File.WriteAllBytes(SysTem + @"\config_ver.asx", plain); + + //leer el xml con los clientes autorizados para timbrar + sys_arc(SysDir + "config_ver.asx"); + FileStream fsXml = new FileStream(SysTem + @"\config_ver.asx", FileMode.Open); + XmlReader xmlReader = XmlReader.Create(fsXml); + while (xmlReader.Read()) + { + if (xmlReader.HasAttributes) + { + string strRFC = string.Empty; + string strRazonSocial = string.Empty; + string strSis = string.Empty; + string strAct = string.Empty; + string strBaj = string.Empty; + while (xmlReader.MoveToNextAttribute()) + { + switch (xmlReader.Name) + { + case "r": + strRFC = DESDecrypt(xmlReader.Value); + break; + case "n": + strRazonSocial = DESDecrypt(xmlReader.Value); + break; + case "y": + strBaj += xmlReader.Value != "0" ? xmlReader.Value + "-" : strBaj; + break; + case "m": + strBaj += xmlReader.Value != "0" ? xmlReader.Value : strBaj; + break; + case "a": + strAct = xmlReader.Value == "1" ? "Activo" : "Inactivo"; + break; + case "b": + strSis += "BMS "; + break; + case "c": + strSis += "CG2 "; + break; + } + } + xmlReader.MoveToElement(); + if (!string.IsNullOrEmpty(strRFC)) + { + strRepDet += ""; + } + } + } + fsXml.Close(); + sys_arc(SysTem + @"\config_ver.asx"); + string strRep = strRepEnc + strRepDet + "
Clientes autorizados para timbrar " + strTit + "
RFCClienteEstadoFecha BajaSistema
" + strRFC + "" + strRazonSocial + " " + strAct + "" + strBaj + "" + strSis + "
"; + sys_mkdir(SysDir + "rep"); + + string strRepNom = SysDir + @"rep\Rep_Clientes_" + DateTime.Today.ToString("yyyyMMdd") + "_" + DateTime.Now.ToString("HHmmss") + ".xls"; + System.IO.File.WriteAllText(strRepNom, strRep); + + picLoad.Image = imglisAvance.Images["qr"]; + sys_estatus("Abriendo Reporte..."); + + //limpiar datos + cfdi33_constructor(); + + MessageBox.Show("Abiendo archivo...\nIndique que si desea abrir el archivo...", SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Information); + Process.Start("explorer.exe", strRepNom); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al generar el reporte de clientes autorizados para timbrar", 3); + exe_err(Ex, "Rep_Cli"); + } + } + #endregion cfdi33 ver clientes + + //3.5.2 + //llena una lista de clientes autorizados para timbrar + #region cfdi33 cargar clientes + public void cfdi33_cargar_clientes(bool bolBet = false) + { + + string strMod = bolBet ? "beta" : string.Empty; + string strTit = bolBet ? "beta" : "producción"; + Clientes_Enviar.Clear(); + string strRes = MessageBox.Show("Desea publicar una nueva lista de clientes en " + strTit + " ", SysNombre, MessageBoxButtons.YesNo).ToString(); + if (strRes != "Yes") + { + return; + } + sys_estatus("Leyendo datos..."); + SysQueryEncabezado = @"SELECT +ISNULL(rfcfiscal, '') AS RFC, +ISNULL(cliente, '') AS Nombre, +ISNULL(CFDI33_CONTROL_ACTIVO, 0) AS Activo, +ISNULL(CFDI33_CONTROL_INACTIVO, 0) AS Inactivo, +ISNULL(CFDI33_CONTROL_BMS, 0) AS BMS, +ISNULL(CFDI33_CONTROL_CG2, 0) AS CG2, +ISNULL(CFDI33_CONTROL_BAJAMES, 0) AS BajaMes, +ISNULL(CFDI33_CONTROL_BAJAANIO, 0) AS BajaAño +FROM cliente +WHERE +--ISNULL(CFDI33_CONTROL_ACTIVO, 0) = 1 --OR ISNULL(CFDI33_CONTROL_INACTIVO, 0) = 1 and +RFC in( +'SCT050708EB2', +'HEGA640919KM7', +'C&A010417QS6', +'CIS9509275Z6', +'CIS041117RQ2', +'CLI060718763', +'DLO090206SY9', +'POVE881208CB0', +'RAME6507194S9', +'CEGG681106263', +'GPC170418BL7', +'DODG680623K20', +'AACP780811MT5', +'CORL651115978', +'ROCL940924AT9', +'LAR070313DQ2', +'NSL130520FU8', +'MAGP6406291F2', +'PDN920220J94', +'MAGR600701E40', +'RAA041014JA2', +'SME1809266A9', +'SAA150218M66', +'SPI001121E78', +'WAA021220796', +'WCC0702151FA', +'RVA980220B3A', +'BLO190930298' +) +ORDER BY cliente"; + if (!string.IsNullOrEmpty(SysQueryEncabezado)) + { + SqlConnection con_lis = new SqlConnection(sql_conexion()); + try + { + sql_log("Lis_Cli", SysQueryEncabezado); + SqlCommand cmd_lis = new SqlCommand(SysQueryEncabezado, con_lis); + cmd_lis.CommandTimeout = 30; + con_lis.Open(); + SqlDataReader rdr_lis = cmd_lis.ExecuteReader(); + if (rdr_lis != null) + { + while (rdr_lis.Read()) + { + int.TryParse(rdr_lis["Activo"].ToString(), out int intActivo); + int.TryParse(rdr_lis["Inactivo"].ToString(), out int intInactivo); + int.TryParse(rdr_lis["BajaMes"].ToString(), out int intBajaMes); + int.TryParse(rdr_lis["BajaAño"].ToString(), out int intBajaAño); + int.TryParse(rdr_lis["CG2"].ToString(), out int intCg2); + int.TryParse(rdr_lis["BMS"].ToString(), out int intBms); + intActivo = intInactivo == 1 ? 0 : intActivo; + Clientes_Enviar.Add(new Cliente + { + RFC = DESEncrypt(rdr_lis["RFC"].ToString()), + RFC_Des = rdr_lis["RFC"].ToString(), + RazonSocial = DESEncrypt(rdr_lis["Nombre"].ToString()), + Baja_Año = intBajaAño, + Baja_Mes = intBajaMes, + Activo = intActivo, + cg2 = intCg2, + bms = intBms + }); + } + } + rdr_lis.Close(); + rdr_lis.Dispose(); + con_lis.Close(); + } + catch (SqlException Ex) + { + con_lis.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de lista de clientes." + strErr, 1); + sql_err(Ex, "Lis_Cli", SysQueryEncabezado); + return; + } + catch (Exception Ex) + { + if (con_lis != null) + { + con_lis.Close(); + } + sys_mensaje_error("Error al leer los datos de lista de clientes.", 1); + exe_err(Ex, "Lis_Cli"); + return; + } + } + sys_estatus("Validando lista..."); + foreach (Cliente cte in Clientes_Recibir) + { + Cliente res = Clientes_Enviar.Find(buscar => buscar.RFC_Des == cte.RFC); + if (res == null) + { + sys_mensaje_error("Omitió el RFC " + cte.RFC, 5); + return; + } + } + sys_estatus("Generando lista..."); + XElement Clientes = new XElement("Clientes"); + foreach (var atr in Clientes_Enviar) + { + XElement Cliente = new XElement("Cliente"); + Cliente.Add(new XAttribute("r", atr.RFC)); + Cliente.Add(new XAttribute("n", atr.RazonSocial)); + Cliente.Add(new XAttribute("y", atr.Baja_Año)); + Cliente.Add(new XAttribute("m", atr.Baja_Mes)); + Cliente.Add(new XAttribute("a", atr.Activo)); + Cliente.Add(new XAttribute("b", atr.bms)); + Cliente.Add(new XAttribute("c", atr.cg2)); + Clientes.Add(Cliente); + } + XDocument Lista = new XDocument( + Clientes + ); + try + { + sys_estatus("Enviando lista..."); + Lista.Save(SysDir + "env_config.asx"); + //codificar en base 64 la lista + var bytes = File.ReadAllBytes(SysDir + "env_config.asx"); + string base64 = Convert.ToBase64String(bytes); + sys_arc(SysDir + "env_config.asx"); + System.IO.File.WriteAllText(SysDir + "env_config.asx", base64); + try + { + using (System.Net.WebClient client = new System.Net.WebClient()) + { + string strBet = bolBet ? "_Beta" : string.Empty; + client.Credentials = new System.Net.NetworkCredential(FTPUsr, FTPPwd); + client.UploadFile(FTPSrv + "/Herramientas/CFDI" + strBet + "/config.asx", SysDir + "env_config.asx"); + sys_arc(SysDir + "env_config.asx"); + + //limpiar datos + cfdi33_constructor(); + + sys_proceso_fin("Se han actualizado los clientes activos en " + strTit, 1); + } + } + catch (Exception Ex) + { + sys_mensaje_error("Error al actualizar los clientes activos del sistema.\n El antivirus bloqueo la conexion con el FTP", 1); + exe_err(Ex, "ActCli"); + } + } + catch (Exception Ex) + { + sys_mensaje_error("Error al guardar el archivo de clientes actvos del sistema.", 1); + exe_err(Ex, "ArcCli"); + } + } + #endregion cfdi33 cargar clientes + + //3.6 + //cfdi33 contador + #region cfdi33 contador + public void cfdi33_contador() + { + bool bolLis = cfdi33_descargar_clientes(); + + if (bolLis) + { + picLoad.Image = imglisAvance.Images["spinner"]; + sys_estatus("Consultando Timbres..."); + + + string strMes = string.Empty; + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "enero": + strMes = "01"; + break; + case "febrero": + strMes = "02"; + break; + case "marzo": + strMes = "03"; + break; + case "abril": + strMes = "04"; + break; + case "mayo": + strMes = "05"; + break; + case "junio": + strMes = "06"; + break; + case "julio": + strMes = "07"; + break; + case "agosto": + strMes = "08"; + break; + case "septiembre": + strMes = "09"; + break; + case "octubre": + strMes = "10"; + break; + case "noviembre": + strMes = "11"; + break; + case "diciembre": + strMes = "12"; + break; + } + + string strRepNom = SysDir + @"rep\Rep_Timbres_" + DateTime.Today.ToString("yyyyMMdd") + "_" + DateTime.Now.ToString("HHmmss") + ".xls"; + if (CFDIPac == "EdiCom") + { + string strNeg = "style='background-color:#000;color:#fff;font-weight:bold;'"; + SysRepEnc = ""; + SysRepDet = string.Empty; + if (!string.IsNullOrEmpty(ComprobanteDBRFC)) + { + string strNomSel = string.Empty; + Cliente res = Clientes_Recibir.Find(buscar => buscar.RFC == ComprobanteDBRFC); + try + { + strNomSel = res.RazonSocial; + edicom_contador(ComprobanteDBRFC, strNomSel, strMes); + } + catch + { + MessageBox.Show("El no existe en lista de clientes autorizados para timbrar."); + } + } + else + { + foreach (Cliente cte in Clientes_Recibir) + { + if ((cte.Baja_Año == 0 && cte.Baja_Mes == 0) || (cte.Baja_Año.ToString() == ComprobanteDBSysId.ToString() && cte.Baja_Mes.ToString().ToLower() == strMes)) + { + edicom_contador(cte.RFC, cte.RazonSocial, strMes); + } + } + } + sys_mkdir(SysDir + @"rep"); + string strRep = SysRepEnc + SysRepDet + "
" + ComprobanteDBTipoComprobante.ToString() + " de " + ComprobanteDBSysId + "
Expedido RFCExpedido EmpresaTimbres
"; + System.IO.File.WriteAllText(strRepNom, strRep); + } + + picLoad.Image = imglisAvance.Images["qr"]; + sys_estatus("Abriendo Reporte..."); + + //limpiar datos + cfdi33_constructor(); + + MessageBox.Show("Abiendo archivo...\nIndique que si desea abrir el archivo...", SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Information); + Process.Start("explorer.exe", strRepNom); + } + else + { + MessageBox.Show("Error al consultar timbres", SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + #endregion + + //colores tabs + #region colores tabs + public void colores_tabs(string strBtn, string strEve) + { + tbPruebas.BackColor = Color.FromArgb(29, 90, 173); + tbPruebas.ForeColor = Color.White; + btConfiguracion.BackColor = Color.FromArgb(29, 90, 173); + btConfiguracion.ForeColor = Color.White; + btResultados.BackColor = Color.FromArgb(29, 90, 173); + btResultados.ForeColor = Color.White; + } + #endregion colores tabs + + //ocultar paneles + #region panels hide + public void panels_hide() + { + + rtbResultados.Hide(); + pnConfiguracion.Hide(); + pnPruebas.Hide(); + this.txtResult.Hide(); + this.lblConfiguracion.Hide(); + } + #endregion panels hide + + //crear pfx + #region cambiar certificado + public void cambiar_certificado() + { + SQLUpdateTbl = "Configuracion"; + if (CFDISis == "bms") + { + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = 1; + SQLUpdate.Add(new SQLCol { SQLNom = "NOCERTIFICADO", SQLStr = Comprobante_NoCertificado }); + } + else + { + SQLUpdateTblKey = "SYSID"; + SQLUpdateTblID = 1; + SQLUpdate.Add(new SQLCol { SQLNom = "NOCERTIFICADODIGITAL", SQLStr = Comprobante_NoCertificado }); + } + sql_update(); + } + #endregion cambiar certificado + + //crear pfx + #region crear pfx + public void crear_pfx() + { + if (string.IsNullOrEmpty(CFDISis)) + { + SysErrores = "Genere, recupere o cancele un comprobante para configurar CFDI."; + sys_proceso_error("No ha utilizado CFDI"); + return; + } + sys_mkdir(SysDir + "ext"); + if (!File.Exists(SysDir + "ext\\openssl.exe")) + { + sys_estatus("Descargando OpenSSL"); + try + { + WebClient webClient = new WebClient(); + webClient.DownloadFile("http://aduanasoft.com/Herramientas/CFDI/ext/openssl.zip", SysDir + "ext\\openssl.zip"); + webClient.Dispose(); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al descargar openSSL.", 1); + exe_err(Ex, "Des_OpenSSL"); + return; + } + try + { + sys_estatus("Descomprimiendo OpenSSL"); + ZipFile zip = ZipFile.Read(SysDir + "ext\\openssl.zip"); + foreach (ZipEntry e in zip) + { + e.Extract(SysDir + "ext\\", ExtractExistingFileAction.OverwriteSilently); + } + zip.Dispose(); + sys_arc(SysDir + "ext\\openssl.zip"); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al descomprimir el actualizador del sistema."); + exe_err(Ex, "ZipAct"); + } + } + + sys_estatus("Leyendo datos..."); + string strQuery = string.Empty; + if (CFDISis == "bms") + { + strQuery = @" +SELECT +ISNULL((SELECT TOP 1 PATHFILECER FROM Configuracion), '') AS Certificado_Ruta, +ISNULL((SELECT TOP 1 PATHFILEKEY FROM Configuracion), '') AS Key_Ruta, +ISNULL((SELECT TOP 1 PASSWORDKEYFILE FROM Configuracion), '') AS Key_Clave, +ISNULL((SELECT TOP 1 NOCERTIFICADO FROM Configuracion), '') AS Comprobante_NoCertificado, +ISNULL((SELECT TOP 1 PATHFACTURAS FROM Configuracion), '') AS ComprobanteDBRutaSalida"; + } + else + { + strQuery = @" +SELECT +ISNULL((SELECT TOP 1 LLAVEPUBLICACER FROM Configuracion), '') AS Certificado_Ruta, +ISNULL((SELECT TOP 1 LLAVEPRIVADAKEY FROM Configuracion), '') AS Key_Ruta, +ISNULL((SELECT TOP 1 CONTRASEÑALLAVEPRIVADA FROM Configuracion), '') AS Key_Clave, +ISNULL((SELECT TOP 1 NOCERTIFICADODIGITAL FROM Configuracion), '') AS Comprobante_NoCertificado, +ISNULL((SELECT TOP 1 RUTAFACTURASXML FROM Configuracion), '') AS ComprobanteDBRutaSalida"; + } + try + { + sql_log("gen_pfx", strQuery); + SqlConnection con_pfx = new SqlConnection(sql_conexion()); + SqlCommand cmd_pfx = new SqlCommand(strQuery, con_pfx); + cmd_pfx.CommandTimeout = 30; + con_pfx.Open(); + SqlDataReader rdr_pfx = cmd_pfx.ExecuteReader(); + if (rdr_pfx != null) + { + while (rdr_pfx.Read()) + { + ConfigCertificadoRuta = rdr_pfx["Certificado_Ruta"].ToString(); + ConfigKeyRuta = rdr_pfx["Key_Ruta"].ToString(); + ConfigKeyClave = rdr_pfx["Key_Clave"].ToString(); + ComprobanteDBRutaSalida = rdr_pfx["ComprobanteDBRutaSalida"].ToString(); + Comprobante_NoCertificado = rdr_pfx["Comprobante_NoCertificado"].ToString(); + ConfigPfxRuta = ComprobanteDBRutaSalida + "\\pfx\\pfx_" + Comprobante_NoCertificado + ".pfx"; + ConfigPfxClave = ConfigKeyClave; + } + SQLUpdateTbl = "Configuracion"; + if (CFDISis == "bms") + { + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = 1; + SQLUpdate.Add(new SQLCol { SQLNom = "PATHCANCELFILEPFX", SQLStr = ConfigPfxRuta }); + SQLUpdate.Add(new SQLCol { SQLNom = "PFXPWD", SQLStr = ConfigPfxClave }); + } + else + { + SQLUpdateTblKey = "SYSID"; + SQLUpdateTblID = 1; + SQLUpdate.Add(new SQLCol { SQLNom = "RUTAPFX", SQLStr = ConfigPfxRuta }); + SQLUpdate.Add(new SQLCol { SQLNom = "PASWORDPFX", SQLStr = ConfigPfxClave }); + } + } + rdr_pfx.Close(); + rdr_pfx.Dispose(); + con_pfx.Close(); + } + catch (SqlException Ex) + { + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de configuración." + strErr, 1); + sql_err(Ex, "Con_Pfx", strQuery); + return; + } + catch (Exception Ex) + { + sys_mensaje_error("Error al leer los datos de configuración.", 1); + exe_err(Ex, "Asi_Pfx"); + return; + } + + SysErrores = string.IsNullOrEmpty(ConfigKeyClave) ? SysErrores + @"No se especifico contraseña del archivo Key.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Comprobante_NoCertificado) ? SysErrores + @"No se especifico Número de Certificado.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ConfigKeyRuta) || !File.Exists(ConfigKeyRuta) ? SysErrores + @"No existe o no se especifico el archivo Key.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ConfigCertificadoRuta) || !File.Exists(ConfigCertificadoRuta) ? SysErrores + @"No existe o no se especifico el certificado.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ComprobanteDBRutaSalida) || !Directory.Exists(ComprobanteDBRutaSalida) ? SysErrores + @"No existe o no se especifico la ruta de Salida de los XML.\par " : SysErrores; + SysErrores = Directory.Exists(ComprobanteDBRutaSalida) && !HasWritePermissionOnDir(ComprobanteDBRutaSalida) ? SysErrores + @"No hay permisos de escritura en la ruta de Salida de los XML.\par " : SysErrores; + if (!string.IsNullOrEmpty(SysErrores)) + { + sys_proceso_error("Datos incompletos"); + return; + } + try + { + string strArcC = SysDir + "ext\\c.pem"; + string strArcK = SysDir + "ext\\k.pem"; + sys_arc(strArcC); + sys_arc(strArcK); + sys_estatus("Generando CPEM."); + Process pro1 = new Process(); + pro1.StartInfo.RedirectStandardOutput = true; + pro1.StartInfo.UseShellExecute = false; + pro1.StartInfo.CreateNoWindow = true; + pro1.StartInfo.FileName = SysDir + "ext\\openssl.exe"; + pro1.StartInfo.Arguments = "x509 -inform DER -in \"" + ConfigCertificadoRuta + "\" -out \"" + strArcC + "\""; + pro1.Start(); + pro1.WaitForExit(); + if (File.Exists(strArcC)) + { + sys_estatus("Generando KPEM."); + Process pro2 = new Process(); + pro2.StartInfo.RedirectStandardOutput = true; + pro2.StartInfo.UseShellExecute = false; + pro2.StartInfo.CreateNoWindow = true; + pro2.StartInfo.FileName = SysDir + "ext\\openssl.exe"; + pro2.StartInfo.Arguments = "pkcs8 -inform DER -in \"" + ConfigKeyRuta + "\" -passin pass:" + ConfigKeyClave + " -out \"" + strArcK + "\""; + pro2.Start(); + pro2.WaitForExit(); + } + else + { + sys_mensaje_error("Error al generar archivo CPEM."); + return; + } + if (File.Exists(strArcK)) + { + sys_estatus("Generando PFX."); + sys_mkdir(ComprobanteDBRutaSalida + "\\pfx\\"); + Process pro3 = new Process(); + pro3.StartInfo.RedirectStandardOutput = true; + pro3.StartInfo.UseShellExecute = false; + pro3.StartInfo.CreateNoWindow = true; + pro3.StartInfo.FileName = SysDir + "ext\\openssl.exe"; + pro3.StartInfo.Arguments = "pkcs12 -export -out \"" + ConfigPfxRuta + "\" -inkey \"" + strArcK + "\" -in \"" + strArcC + "\" -passout pass:" + ConfigPfxClave; + pro3.Start(); + pro3.WaitForExit(); + sys_arc(strArcC); + sys_arc(strArcK); + if (File.Exists(ConfigPfxRuta)) + { + sql_update(); + sys_proceso_fin("PFX configurado", 1); + } + else + { + sys_mensaje_error("Error al generar archivo PFX."); + } + } + else + { + sys_mensaje_error("Error al generar archivo KPEM."); + } + } + catch (Exception Ex) + { + sys_mensaje_error("Error al generar PFX.", 1); + exe_err(Ex, "Gen_Pfx"); + } + } + #endregion crear pfx + + //sellar el combrobante en sha256 o sha1 + #region cfdi33 sello + public string cfdi33_sello(bool bolRet = false) + { + sys_estatus("Calculando Sello..."); + string strSello = string.Empty; + + string strSHA = bolRet ? "SHA1" : "SHA256"; + if (CFDIPac == "ComDig" && bolRet) { strSHA = "SHA256"; } + //if (!string.IsNullOrEmpty(Comprobante_CadenaOriginal_2)) + //{ + // Comprobante_CadenaOriginal += Comprobante_CadenaOriginal_2 ; + // if (!string.IsNullOrEmpty(Comprobante_CadenaOriginal_3)) + // { + // Comprobante_CadenaOriginal += Comprobante_CadenaOriginal_3; + // } + //} + //MessageBox.Show(Comprobante_CadenaOriginal.Length.ToString()); + if (File.Exists(ConfigKeyRuta) && HasWritePermissionOnDir(ConfigKeyRuta) && !string.IsNullOrEmpty(Comprobante_CadenaOriginal) && !string.IsNullOrEmpty(ConfigKeyClave)) + { + try + { + System.Security.SecureString passwordSeguro = new System.Security.SecureString(); + passwordSeguro.Clear(); + foreach (char c in ConfigKeyClave.ToCharArray()) + { + passwordSeguro.AppendChar(c); + } + byte[] llavePrivadaBytes = File.ReadAllBytes(ConfigKeyRuta); + RSACryptoServiceProvider rsa = opensslkey.DecodeEncryptedPrivateKeyInfo(llavePrivadaBytes, passwordSeguro); + if (rsa != null) + { + byte[] bytesFirmados = rsa.SignData(Encoding.UTF8.GetBytes(Comprobante_CadenaOriginal), strSHA); + strSello = Convert.ToBase64String(bytesFirmados); + } + else + { + sys_mensaje_error("La contraseña especificada para el archivo Key es incorrecta.", 1); + } + } + catch (Exception Ex) + { + sys_mensaje_error("Error al generar el sello del documento.", 1); + exe_err(Ex, "Gen_Sel"); + } + } + else + { + if (string.IsNullOrEmpty(ConfigKeyClave)) + { + sys_mensaje_error("No se ha configurado la clave del archivo Key.", 1); + } + if (!File.Exists(ConfigKeyRuta)) + { + sys_mensaje_error("No existe el archivo key", 1); + } + if (File.Exists(ConfigKeyRuta) && !HasWritePermissionOnDir(ConfigKeyRuta)) + { + sys_mensaje_error("No hay acceso al archivo key", 1); + } + } + return strSello; + } + #endregion cfdi33 sello + + //certificado en base64 + #region cfdi33 certificado + public string cfdi33_certificado() + { + string res = string.Empty; + try + { + if (File.Exists(ConfigCertificadoRuta)) + { + System.Security.Cryptography.X509Certificates.X509Certificate2 certEmisor = new System.Security.Cryptography.X509Certificates.X509Certificate2(); + FileStream f = new FileStream(ConfigCertificadoRuta, FileMode.Open, FileAccess.Read); + int size = (int)f.Length; + byte[] byteCertData = new byte[size]; + size = f.Read(byteCertData, 0, size); + f.Close(); + certEmisor.Import(byteCertData); + //MessageBox.Show(certEmisor.ToString()); + CFDINumCer = certEmisor.SerialNumber.Replace("3", string.Empty); + //MessageBox.Show(CFDINumCer +"\n"+ Comprobante_NoCertificado); + res = Convert.ToBase64String(certEmisor.GetRawCertData()); + + //se guarda el subject para validar rfc y vigencia del certificado. + Comprobante_CertificadoSubject = certEmisor.ToString(); + //if (Comprobante_NoCertificado != CFDINumCer) + //{ + // string strRes = MessageBox.Show("El número del certficado no coincide con el que se configuro\n¿Desea cambiarlo?", SysNombre, MessageBoxButtons.YesNo, MessageBoxIcon.Information).ToString(); + // if (strRes == "Yes") + // { + // Comprobante_NoCertificado = CFDINumCer; + // cambiar_certificado(); + // } + //} + } + else + { + sys_mensaje_error("No existe el certificado o no hay acceso.", 1); + } + } + catch (Exception Ex) + { + sys_mensaje_error("Error al guardar el certificado en el documento.", 1); + exe_err(Ex, "Gua_Cer"); + } + return res; + } + #endregion cfdi33 certificado + + //transformacion XLST para calcular cadena original + #region cfdi33 cadena original + public string cfdi33_cadena_original(bool bolRet = false) + { + sys_estatus("Generando Cadena Original..."); + string strMod = ""; + string strArc = ""; + string strUrl = ""; + + + strMod = bolRet ? "Ret" : "Com"; + strArc = bolRet ? (CFDI4 ? "Retenciones_cadenaoriginal4_0.xslt" : "retenciones.xslt") + : (CFDI4 ? "cadenaoriginal_4_0.xslt" : "cadenaoriginal_3_3.xslt"); + + strUrl = bolRet ? (CFDI4 ? "https://www.sat.gob.mx/esquemas/retencionpago/2/retencionpagov2.xslt" : "http://www.sat.gob.mx/esquemas/retencionpago/1/retenciones.xslt") : + (CFDI4 ? "http://www.sat.gob.mx/sitio_internet/cfd/4/cadenaoriginal_4_0/cadenaoriginal_4_0.xslt" : "http://www.sat.gob.mx/sitio_internet/cfd/3/cadenaoriginal_3_3/cadenaoriginal_3_3.xslt"); + + string result = string.Empty; + try + { + //descargar cadena original si no existe. + string ruta = SysDir + @"sat\" + strArc; + + if (!File.Exists(ruta)) + { + sys_mkdir(SysDir + @"sat"); + try + { + WebClient webClient = new WebClient(); + webClient.DownloadFile(strUrl, SysDir + @"sat\" + strArc); + webClient.Dispose(); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al descargar el archivo " + strArc + ".", 1); + exe_err(Ex, "Des_Cad_" + strMod); + } + } + + //generar cadena original apartir de xml formado previamente mediante trasnformacion xlst + try { + + StreamReader reader = new StreamReader(ComprobanteDBArchivo); + XPathDocument myXPathDoc = new XPathDocument(reader); + + XslCompiledTransform myXslTrans = new XslCompiledTransform(); + + //myXslTrans.Load(SysDir + @"sat\" + strArc); + myXslTrans.Load(ruta); + + + StringWriter str = new StringWriter(); + XmlTextWriter myWriter = new XmlTextWriter(str); + + myXslTrans.Transform(myXPathDoc, null, myWriter); + //se utiliza HtmlDecode para regresar los caracteres que el xml codifca a htmlescape + result = WebUtility.HtmlDecode(str.ToString()); + + } + catch (Exception ex) { + sys_mensaje_error("Error al Transformar la cadena original.", 1); + exe_err(ex, "Gen_Cad_Trasnform" + strMod); + } + + /* + if (bolRet) + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(result); + result = System.Convert.ToBase64String(plainTextBytes); + } + */ + } + catch (Exception Ex) + { + sys_mensaje_error("Error al generar la cadena original.", 1); + exe_err(Ex, "Gen_Cad_" + strMod); + } + return result; + } + #endregion + + //transformacion XLST para calcular cadena original del complemento de certificacion + #region cfdi33 cadena original complemento + public string cfdi33_cadena_original_complemento(bool bolRet = false) + { + + + string result = string.Empty; + try + { + + string strURL = bolRet ? "http://www.sat.gob.mx/sitio_internet/timbrefiscaldigital/cadenaoriginal_TFD_1_0.xslt" : "https://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/cadenaoriginal_TFD_1_1.xslt";//"http://www.sat.gob.mx/sitio_internet/cfd/timbrefiscaldigital/cadenaoriginal_TFD_1_1.xslt"; + //MessageBox.Show(strURL); + string strArc = bolRet ? "cadenaoriginal_TFD_1_0.xslt" : "cadenaoriginal_TFD_1_1.xslt"; + //descargar la cadena original si no existe. + if (!File.Exists(SysDir + @"sat\" + strArc)) + { + sys_mkdir(SysDir + @"sat"); + try + { + WebClient webClient = new WebClient(); + webClient.DownloadFile(strURL, SysDir + @"sat\" + strArc); + webClient.Dispose(); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al descargar el archivo " + strArc + ".", 1); + exe_err(Ex, "Des_Cad_Com"); + } + } + //string strDecAnt = "xmlns:tfd=\"http://www.sat.gob.mx/TimbreFiscalDigital\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd\""; + //string strDecNva = "xmlns:tfd=\"http://www.sat.gob.mx/TimbreFiscalDigital\" xsi:schemaLocation=\"http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd\""; + //string strTim = File.ReadAllText(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + ".xml"); + //strTim = strTim.Replace(strDecNva, strDecAnt); + //File.WriteAllText(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + ".xml", strTim); + + //configuracion para PAC comercio digital + if (CFDIPac == "ComDig") + { + XNamespace cfdi_ = null; + + if (bolRet) + { + cfdi_ = "http://www.sat.gob.mx/esquemas/retencionpago/2"; + } + else { + cfdi_ = "http://www.sat.gob.mx/cfd/4"; + } + XElement root = XElement.Load(ComprobanteDBArchivoTimbrado); + + XNamespace tfd = "http://www.sat.gob.mx/TimbreFiscalDigital"; + string tfd_xml = SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + ".xml"; + + //extrae el timbre fiscal del xml + IEnumerable complemento_TFD = from el in root.Elements(cfdi_ + "Complemento").Descendants(tfd + "TimbreFiscalDigital") select el; + + foreach (XElement el in complemento_TFD) + { + + Complemento_TimbreFiscalDigital_Version = el.Attribute("Version").Value; + Complemento_TimbreFiscalDigital_UUID = el.Attribute("UUID").Value; + Complemento_TimbreFiscalDigital_FechaTimbrado = el.Attribute("FechaTimbrado").Value; + Complemento_TimbreFiscalDigital_RfcProvCertif = el.Attribute("RfcProvCertif").Value; + Complemento_TimbreFiscalDigital_SelloCFD = el.Attribute("SelloCFD").Value; + Complemento_TimbreFiscalDigital_NoCertificadoSAT = el.Attribute("NoCertificadoSAT").Value; + Complemento_TimbreFiscalDigital_SelloSAT = el.Attribute("SelloSAT").Value; + //SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + ".xml" + XDocument Comprobante_TDF_XML = XDocument.Parse(el.ToString()); + try + { + //y lo guarda en carpeta temp del SO + XDocument cfdi33 = new XDocument( + Comprobante_TDF_XML + ); + cfdi33.Save(tfd_xml); + } + catch (Exception Ex) + { + exe_err(Ex, "Gua_XML_TIM_COM_DIG_2"); + } + } + //StreamReader reader = new StreamReader(tfd_xml); + + } + + StreamReader reader = new StreamReader(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + ".xml"); + XPathDocument myXPathDoc = new XPathDocument(reader); + + XslCompiledTransform myXslTrans = new XslCompiledTransform(); + myXslTrans.Load(SysDir + @"sat\" + strArc); + + StringWriter str = new StringWriter(); + XmlTextWriter myWriter = new XmlTextWriter(str); + + myXslTrans.Transform(myXPathDoc, null, myWriter); + result = WebUtility.HtmlDecode(str.ToString()); + + //sys_arc(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + ".xml"); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al generar la cadena original del complemento.", 1); + exe_err(Ex, "Gen_Cad_Com"); + } + return result; + } + #endregion + + //constructor + #region cfdi33 constructor + public void cfdi33_constructor() + { + //constructor + SysQueryEncabezado = string.Empty; + SysQueryNotariosPublicos = string.Empty; + SysQueryPago10 = string.Empty; + SysQueryPartidas = string.Empty; + SysQueryRelacionados = string.Empty; + SysEnvErr = string.Empty; + + SysErrores = string.Empty; + ComprobanteDBArchivo = string.Empty; + ComprobanteDBAplicacion = string.Empty; + ComprobanteDBTipoComprobante = string.Empty; + ComprobanteDBSysId = 0; + ComprobanteDBOperacion = string.Empty; + ComprobanteDBCmd = false; + CancelaNuevo = false; + + CFDIPet = string.Empty; + + ConfigCertificadoNumero = string.Empty; + ConfigCertificadoRuta = string.Empty; + ConfigKeyRuta = string.Empty; + ConfigKeyClave = string.Empty; + Comprobante_LugarExpedicion = 0; + Comprobante_MetodoPago = string.Empty; + Comprobante_TipoDeComprobante = string.Empty; + Comprobante_Total = 0; + Comprobante_TipoCambio = 0; + Comprobante_Moneda = string.Empty; + Comprobante_Certificado = string.Empty; + Comprobante_CertificadoSubject = string.Empty; + Comprobante_CondicionesDePago = string.Empty; + + Comprobante_SubTotal = 0; + Comprobante_NoCertificado = string.Empty; + Comprobante_FormaPago = string.Empty; + Comprobante_Sello = string.Empty; + Comprobante_Fecha = string.Empty; + Comprobante_Folio = string.Empty; + Comprobante_Serie = string.Empty; + Comprobante_Version = string.Empty; + Comprobante_CadenaOriginal = string.Empty; + Comprobante_CadenaOriginal_2 = string.Empty; + Comprobante_CadenaOriginal_3 = string.Empty; + Comprobante_Estatus = string.Empty; + + Comprobante_Retencion.Clear(); + Comprobante_Traslado.Clear(); + + Emisor_Rfc = string.Empty; + Emisor_Nombre = string.Empty; + Emisor_RegimenFiscal = string.Empty; + + Receptor_Rfc = string.Empty; + Receptor_Nombre = string.Empty; + Receptor_UsoCFDI = string.Empty; + + Comprobante_Partida.Clear(); + Comprobante_Partida_Retencion.Clear(); + Comprobante_Partida_Traslado.Clear(); + Comprobante_Partida_Retencion_Anticipo.Clear(); + Comprobante_Partida_Traslado_Anticipo.Clear(); + + //Complemento Terceros + Complemento_Partida_Terceros_Traslado.Clear(); + Complemento_Partida_Terceros_Retencion.Clear(); + Complemento_Terceros = false; + Numero_Pedimento_Terceros = string.Empty; + Fecha_Pedimento_Terceros = string.Empty; + Aduana_Terceros = string.Empty; + + Comprobante_TotalImpuestosTrasladados = 0; + Comprobante_TotalImpuestosRetenidos = 0; + + Complemento_TimbreFiscalDigital_Version = string.Empty; + Complemento_TimbreFiscalDigital_UUID = string.Empty; + Complemento_TimbreFiscalDigital_FechaTimbrado = string.Empty; + Complemento_TimbreFiscalDigital_RfcProvCertif = string.Empty; + Complemento_TimbreFiscalDigital_SelloCFD = string.Empty; + Complemento_TimbreFiscalDigital_NoCertificadoSAT = string.Empty; + Complemento_TimbreFiscalDigital_SelloSAT = string.Empty; + Complemento_TimbreFiscalDigital_CadenaOriginalSAT = string.Empty; + + //limpiar pagos + Pago10_FechaPago = string.Empty; + Pago10_FormaDePagoP = string.Empty; + Pago10_MonedaP = string.Empty; + Pago10_TipoCambioP = 0; + Pago10_Monto = 0; + Pago10_NomBancoOrdExt = string.Empty; + Pago10_CtaOrdenante = string.Empty; + Pago10_CtaBeneficiario = string.Empty; + Pago10_TipoCadPago = string.Empty; + Pago10_CadPago = string.Empty; + Pago10_CertPago = string.Empty; + Pago10_SelloPago = string.Empty; + Pago10_RfcEmisorCtaOrd = string.Empty; + Pago10_RfcEmisorCtaBen = string.Empty; + + Pago10_Partidas.Clear(); + CfdiRelacionados.Clear(); + + //limpiar notaria + ComplementoNotaria = 0; + DescInmueble_TipoInmueble = string.Empty; + DescInmueble_Calle = string.Empty; + DescInmueble_NoExterior = string.Empty; + DescInmueble_NoInterior = string.Empty; + DescInmueble_Colonia = string.Empty; + DescInmueble_Localidad = string.Empty; + DescInmueble_Referencia = string.Empty; + DescInmueble_Municipio = string.Empty; + DescInmueble_Pais = string.Empty; + DescInmueble_CodigoPostal = string.Empty; + + DatosOperacion_NumInstrumentoNotarial = string.Empty; + DatosOperacion_FechaInstNotarial = string.Empty; + DatosOperacion_MontoOperacion = 0; + DatosOperacion_Subtotal = 0; + DatosOperacion_IVA = 0; + + DatosNotario_CURP = string.Empty; + DatosNotario_NumNotaria = string.Empty; + DatosNotario_EntidadFederativa = string.Empty; + DatosNotario_Adscripcion = string.Empty; + + DatosEnajenante_CoproSocConyugalE = string.Empty; + + DatosUnEnajenante_Nombre = string.Empty; + DatosUnEnajenante_ApellidoPaterno = string.Empty; + DatosUnEnajenante_ApellidoMaterno = string.Empty; + DatosUnEnajenante_RFC = string.Empty; + DatosUnEnajenante_CURP = string.Empty; + + DatosCop.Clear(); + + DatosUnAdquiriente_Nombre = string.Empty; + DatosUnAdquiriente_ApellidoPaterno = string.Empty; + DatosUnAdquiriente_ApellidoMaterno = string.Empty; + DatosUnAdquiriente_RFC = string.Empty; + DatosUnAdquiriente_CURP = string.Empty; + DatosAdquiriente_CoproSocConyugalE = string.Empty; + + //limpiar comercio exterior + ComercioExterior_Activo = false; + ComercioExterior_Emisor_Curp = string.Empty; + ComercioExterior_Emisor_Domicilio_Calle = string.Empty; + ComercioExterior_Emisor_Domicilio_NumeroExterior = string.Empty; + ComercioExterior_Emisor_Domicilio_NumeroInterior = string.Empty; + ComercioExterior_Emisor_Domicilio_Colonia = string.Empty; + ComercioExterior_Emisor_Domicilio_Localidad = string.Empty; + ComercioExterior_Emisor_Domicilio_Referencia = string.Empty; + ComercioExterior_Emisor_Domicilio_Municipio = string.Empty; + ComercioExterior_Emisor_Domicilio_Estado = string.Empty; + ComercioExterior_Emisor_Domicilio_Pais = string.Empty; + ComercioExterior_Emisor_Domicilio_CodigoPostal = string.Empty; + ComercioExterior_Propietario_NumRegIdTrib = string.Empty; + ComercioExterior_Propietario_ResidenciaFiscal = string.Empty; + ComercioExterior_Receptor_NumRegIdTrib = string.Empty; + ComercioExterior_Receptor_Domicilio_Calle = string.Empty; + ComercioExterior_Receptor_Domicilio_NumeroExterior = string.Empty; + ComercioExterior_Receptor_Domicilio_NumeroInterior = string.Empty; + ComercioExterior_Receptor_Domicilio_Colonia = string.Empty; + ComercioExterior_Receptor_Domicilio_Localidad = string.Empty; + ComercioExterior_Receptor_Domicilio_Referencia = string.Empty; + ComercioExterior_Receptor_Domicilio_Municipio = string.Empty; + ComercioExterior_Receptor_Domicilio_Estado = string.Empty; + ComercioExterior_Receptor_Domicilio_Pais = string.Empty; + ComercioExterior_Receptor_Domicilio_CodigoPostal = string.Empty; + ComercioExterior_Destinatario_NumRegIdTrib = string.Empty; + ComercioExterior_Destinatario_Nombre = string.Empty; + ComercioExterior_Destinatario_Domicilio_Calle = string.Empty; + ComercioExterior_Destinatario_Domicilio_NumeroExterior = string.Empty; + ComercioExterior_Destinatario_Domicilio_NumeroInterior = string.Empty; + ComercioExterior_Destinatario_Domicilio_Colonia = string.Empty; + ComercioExterior_Destinatario_Domicilio_Localidad = string.Empty; + ComercioExterior_Destinatario_Domicilio_Referencia = string.Empty; + ComercioExterior_Destinatario_Domicilio_Municipio = string.Empty; + ComercioExterior_Destinatario_Domicilio_Estado = string.Empty; + ComercioExterior_Destinatario_Domicilio_Pais = string.Empty; + ComercioExterior_Destinatario_Domicilio_CodigoPostal = string.Empty; + + lisComercioExterior_Mercancias.Clear(); + + ComercioExterior_Version = string.Empty; + ComercioExterior_MotivoTraslado = string.Empty; + ComercioExterior_TipoOperacion = string.Empty; + ComercioExterior_ClaveDePedimento = string.Empty; + ComercioExterior_CertificadoOrigen = string.Empty; + ComercioExterior_NumCertificadoOrigen = string.Empty; + ComercioExterior_NumeroExportadorConfiable = string.Empty; + ComercioExterior_Incoterm = string.Empty; + ComercioExterior_Subdivision = string.Empty; + ComercioExterior_Observaciones = string.Empty; + ComercioExterior_TipoCambioUSD = 0; + ComercioExterior_TotalUSD = 0; + + //limpiar retenciones + Retenciones_Emisor_RFCEmisor = string.Empty; + Retenciones_Emisor_NomDenRazSocE = string.Empty; + Retenciones_Emisor_CURPE = string.Empty; + + Retenciones_Receptor_Nacional_RFCRecep = string.Empty; + Retenciones_Receptor_Nacional_NomDenRazSocR = string.Empty; + Retenciones_Receptor_Nacional_CURPR = string.Empty; + Retenciones_Receptor_Extranjero_NumRegIdTrib = string.Empty; + Retenciones_Receptor_Extranjero_NomDenRazSocR = string.Empty; + Retenciones_Receptor_Nacionalidad = string.Empty; + + Retenciones_Periodo_MesIni = 0; + Retenciones_Periodo_MesFin = 0; + Retenciones_Periodo_Ejerc = 0; + + Retenciones_Totales_ImpRetenidos.Clear(); + + Retenciones_Totales_MontoTotOperacion = 0; + Retenciones_Totales_MontoTotGrav = 0; + Retenciones_Totales_MontoTotExent = 0; + Retenciones_Totales_MontoTotRet = 0; + + Retenciones_Version = string.Empty; + Retenciones_CveRetenc = string.Empty; + Retenciones_DescRetenc = string.Empty; + + Arrendamientoenfideicomiso_Version = string.Empty; + Arrendamientoenfideicomiso_PagProvEfecPorFiduc = 0; + Arrendamientoenfideicomiso_RendimFideicom = 0; + Arrendamientoenfideicomiso_DeduccCorresp = 0; + Arrendamientoenfideicomiso_MontTotRet = 0; + Arrendamientoenfideicomiso_MontResFiscDistFibras = 0; + Arrendamientoenfideicomiso_MontOtrosConceptDistr = 0; + Arrendamientoenfideicomiso_DescrMontOtrosConceptDistr = string.Empty; + + Dividendos_Version = string.Empty; + Dividendos_DividOUtil_CveTipDivOUtil = string.Empty; + Dividendos_DividOUtil_MontISRAcredRetMexico = 0; + Dividendos_DividOUtil_MontISRAcredRetExtranjero = 0; + Dividendos_DividOUtil_MontRetExtDivExt = 0; + Dividendos_DividOUtil_TipoSocDistrDiv = string.Empty; + Dividendos_DividOUtil_MontISRAcredNal = 0; + Dividendos_DividOUtil_MontDivAcumNal = 0; + Dividendos_DividOUtil_MontDivAcumExt = 0; + Dividendos_Remanente_ProporcionRem = 0; + + EnajenaciondeAcciones_Version = string.Empty; + EnajenaciondeAcciones_ContratoIntermediacion = string.Empty; + EnajenaciondeAcciones_Ganancia = 0; + EnajenaciondeAcciones_Perdida = 0; + + Fideicomisonoempresarial_Version = string.Empty; + Fideicomisonoempresarial_IngresosOEntradas_IntegracIngresos_Concepto = string.Empty; + Fideicomisonoempresarial_IngresosOEntradas_MontTotEntradasPeriodo = 0; + Fideicomisonoempresarial_IngresosOEntradas_PartPropAcumDelFideicom = 0; + Fideicomisonoempresarial_IngresosOEntradas_PropDelMontTot = 0; + Fideicomisonoempresarial_DeduccOSalidas_IntegracEgresos_ConceptoS = string.Empty; + Fideicomisonoempresarial_DeduccOSalidas_MontTotEgresPeriodo = 0; + Fideicomisonoempresarial_DeduccOSalidas_PartPropDelFideicom = 0; + Fideicomisonoempresarial_DeduccOSalidas_PropDelMontTot = 0; + Fideicomisonoempresarial_RetEfectFideicomiso_MontRetRelPagFideic = 0; + Fideicomisonoempresarial_RetEfectFideicomiso_DescRetRelPagFideic = string.Empty; + + Intereses_Version = string.Empty; + Intereses_SistFinanciero = string.Empty; + Intereses_RetiroAORESRetInt = string.Empty; + Intereses_OperFinancDerivad = string.Empty; + Intereses_MontIntNominal = 0; + Intereses_MontIntReal = 0; + Intereses_Perdida = 0; + + Intereseshipotecarios_Version = string.Empty; + Intereseshipotecarios_CreditoDeInstFinanc = string.Empty; + Intereseshipotecarios_SaldoInsoluto = 0; + Intereseshipotecarios_PropDeducDelCredit = 0; + Intereseshipotecarios_MontTotIntNominalesDev = 0; + Intereseshipotecarios_MontTotIntNominalesDevYPag = 0; + Intereseshipotecarios_MontTotIntRealPagDeduc = 0; + Intereseshipotecarios_NumContrato = string.Empty; + + Operacionesconderivados_Version = string.Empty; + Operacionesconderivados_MontGanAcum = 0; + Operacionesconderivados_MontPerdDed = 0; + + Pagosaextranjeros_Version = string.Empty; + Pagosaextranjeros_NoBeneficiario_PaisDeResidParaEfecFisc = string.Empty; + Pagosaextranjeros_NoBeneficiario_ConceptoPago = 0; + Pagosaextranjeros_NoBeneficiario_DescripcionConcepto = string.Empty; + Pagosaextranjeros_Beneficiario_RFC = string.Empty; + Pagosaextranjeros_Beneficiario_CURP = string.Empty; + Pagosaextranjeros_Beneficiario_NomDenRazSocB = string.Empty; + Pagosaextranjeros_Beneficiario_ConceptoPago = 0; + Pagosaextranjeros_Beneficiario_DescripcionConcepto = string.Empty; + Pagosaextranjeros_EsBenefEfectDelCobro = string.Empty; + + Planesderetiro_Version = string.Empty; + Planesderetiro_SistemaFinanc = string.Empty; + Planesderetiro_MontTotAportAnioInmAnterior = 0; + Planesderetiro_MontIntRealesDevengAniooInmAnt = 0; + Planesderetiro_HuboRetirosAnioInmAntPer = string.Empty; + Planesderetiro_MontTotRetiradoAnioInmAntPer = 0; + Planesderetiro_MontTotExentRetiradoAnioInmAnt = 0; + Planesderetiro_MontTotExedenteAnioInmAnt = 0; + Planesderetiro_HuboRetirosAnioInmAnt = string.Empty; + Planesderetiro_MontTotRetiradoAnioInmAnt = 0; + + Premios_Version = string.Empty; + Premios_EntidadFederativa = string.Empty; + Premios_MontTotPago = 0; + Premios_MontTotPagoGrav = 0; + Premios_MontTotPagoExent = 0; + + SectorFinanciero_Version = string.Empty; + SectorFinanciero_IdFideicom = string.Empty; + SectorFinanciero_NomFideicom = string.Empty; + SectorFinanciero_DescripFideicom = string.Empty; + + //complemento INE + INE_Activo = false; + Comprobante_INE_TipoProceso = string.Empty; + Comprobante_INE_TipoComite = string.Empty; + Comprobante_INE_IdContabilidad = 0; + Partida_INE.Clear(); + + //PO + PO = string.Empty; + ES_CFDI4 = false; + + //Nomenclatura C&N + Comprobante_NomenclaturaCNE = string.Empty; + + //Carta Porte + CartaPorte = false; + TranspInternac = string.Empty; + EntradaSalidaMerc = string.Empty; + TotalDistRec = 0; + //Carta Porte - AutoTransporteFederal + PermSCT = string.Empty; + NumPermisoSCT = string.Empty; + NombreAseg = string.Empty; + NumPolizaSeguro = string.Empty; + ConfigVehicular = string.Empty; + PlacaVM = string.Empty; + AnioModeloVM = string.Empty; + SubTipoRem = string.Empty; + Placa = string.Empty; + SubTipoRem2 = string.Empty; + Placa2 = string.Empty; + + //FiguraTransporte + Figura_Transportes.Clear(); + + //Ubiciones + Partidas_Ubicacion.Clear(); + + //Mercancias + Partidas_Mercancias.Clear(); + + PartidasMercancia_CantidadTransporta.Clear(); + + + } + #endregion cfdi33 constructor + + //cadena de conexion al servidor sql + #region sql conexion + public string sql_conexion() + { + string puerto = !string.IsNullOrEmpty(SQLPor) ? ", " + SQLPor : string.Empty; + //cadena de conexion + string strcon = @"data source = " + SQLSrv + puerto + "; initial catalog = " + SQLDb + "; user id = " + SQLUsr + "; password = " + SQLPwd; + //MessageBox.Show(strcon); + return strcon; + } + #endregion sql conexion + + //ejecutar update + #region sql_exe_update + public void sql_exe_update(string str_sql_update) + { + try + { + using (SqlConnection connection = new SqlConnection(sql_conexion())) + { + sql_log("update", str_sql_update); + SqlCommand command = new SqlCommand(str_sql_update, connection); + command.CommandTimeout = 30; + command.Connection.Open(); + command.ExecuteNonQuery(); + connection.Close(); + } + } + catch (SqlException Ex) + { + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en query de actualización." + strErr, 1); + sql_err(Ex, "Act_Com", str_sql_update); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al guardar los datos.", 1); + exe_err(Ex, "Act_Com"); + } + + //destructor + SQLUpdateTbl = string.Empty; + SQLUpdateTblKey = string.Empty; + SQLUpdateTblID = 0; + SQLUpdateTblVal = string.Empty; + } + #endregion + + //generar instruccion update + #region sql update + public void sql_update() + { + //comparador string con comillas o int sin comillas + string strsqlwhe = SQLUpdateTblID > 0 ? SQLUpdateTblID.ToString() : "'" + SQLUpdateTblVal + "'"; + + //cadena con query + string str_sql_update = @" +UPDATE " + SQLUpdateTbl + " SET "; + + //for each strings + int intEle = SQLUpdate.Count; + int intCon = 0; + foreach (SQLCol col in SQLUpdate) + { + intCon++; + string str_esp = intCon == SQLUpdate.Count() ? string.Empty : ", "; + if (!string.IsNullOrEmpty(col.SQLStr)) + { + string strCom = col.SQLFun == true ? string.Empty : "'"; + str_sql_update += "[" + col.SQLNom + "] = " + strCom + col.SQLStr.Replace("'", "' + CHAR(39) + '") + strCom + str_esp; + } + if (col.SQLDob > 0) + { + str_sql_update += "[" + col.SQLNom + "] = " + col.SQLDob + str_esp; + } + } + str_sql_update += " WHERE " + "[" + SQLUpdateTblKey + "] = " + strsqlwhe; + sql_exe_update(str_sql_update); + } + #endregion sql update + + #region SQL_Update_Historico + public void SQL_Update_Historico() + { + + string strPre = string.Empty; + strPre = ComprobanteDBTipoComprobante.ToLower() == "traslado" ? "TRASLADO_" : (ComprobanteDBTipoComprobante.ToLower() == "factura_egreso" ? "EGRESO_" : strPre); + string TipoCom = string.Empty; + TipoCom = ComprobanteDBTipoComprobante.ToLower() == "traslado" ? "T" : (ComprobanteDBTipoComprobante.ToLower() == "factura_egreso" ? "E" : "I"); + + string QueryHistorico = @" + insert + into CFDI33_HistoricoUUIDs ( + CONSECUTIVO , + LINEA, + TIPOCOMPROBANTE, + CADENAORIGINAL, + CADENAORIGINALSAT, + SELLODIGITAL, + SELLODIGITALSAT, + NOCERTIFICADO, + NOCERTIFICADOSAT, + FOLIOPAC, + FECHACERTIFICACION + ) + select + F.CONSECUTIVO, + (Select isNull(max(Linea),0)+1 from CFDI33_HistoricoUUIDs His where His.CONSECUTIVO=F.CONSECUTIVO) AS Linea, + '" + TipoCom + @"' AS TIPOCOMPROBANTE, + F." + strPre + @"CADENAORIGINAL, + F." + strPre + @"CADENAORIGINALSAT, + F." + strPre + @"SELLODIGITAL, + F." + strPre + @"SELLODIGITALSAT, + F." + strPre + @"NOCERTIFICADO, + F." + strPre + @"NOCERTIFICADOSAT, + F." + strPre + @"FOLIOPAC, + F." + strPre + @"FECHACERTIFICACION + from factfactura F where consecutivo=" + ComprobanteDBSysId; + sql_exe_updateHistorico(QueryHistorico); + } + + + public void sql_exe_updateHistorico(string str_sql_update) + { + try + { + using (SqlConnection connection = new SqlConnection(sql_conexion())) + { + sql_log("Historico", str_sql_update); + SqlCommand command = new SqlCommand(str_sql_update, connection); + command.CommandTimeout = 30; + command.Connection.Open(); + command.ExecuteNonQuery(); + connection.Close(); + } + } + catch (SqlException Ex) + { + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en query de Historico." + strErr, 1); + sql_err(Ex, "INS_HISTORICO", str_sql_update); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al guardar los datos HISTORICO.", 1); + exe_err(Ex, "INS_HISTORICO"); + } + + + } + #endregion SQL_Update_Historico + + //cambiar estatus proceso + #region sys estatus + public void sys_estatus(string strEst) + { + labPro.Text = strEst; + this.Refresh(); + } + #endregion sys estatus + + //borrar archivo + #region sys arc + public void sys_arc(string strArc) + { + try + { + if (File.Exists(strArc)) + { + File.Delete(strArc); + } + } + catch (Exception Ex) + { + exe_err(Ex, "Eli_Arc"); + } + } + #endregion sys arc + + //crear directorio + #region sys mdkir + public void sys_mkdir(string strDir) + { + try + { + if (!Directory.Exists(strDir) && !string.IsNullOrEmpty(strDir)) + { + Directory.CreateDirectory(strDir); + } + } + catch (Exception Ex) + { + exe_err(Ex, "Cre_Dir"); + } + } + #endregion sys mkdir + + //partida constante anticipo + #region cfid33 cg anticipo partida constante + public void cfid33_cg_anticipo_partida_constante(int intEgr = 0) + { + //llenar nodo de concepto + string strDes = intEgr == 1 ? "Aplicación de anticipo" : "Anticipo de bien o servicio"; + Comprobante_Partida.Add(new ComprobantePartida + { + PartidaID = 1, + ClaveProdServ = "84111506", + Cantidad = 1, + ClaveUnidad = "ACT", + Descripcion = strDes, + ValorUnitario = Comprobante_SubTotal, + Importe = Comprobante_SubTotal, + Traslados = Comprobante_Partida_Traslado_Anticipo.Count > 0 ? 1 : 0, + Retenciones = Comprobante_Partida_Retencion_Anticipo.Count > 0 ? 1 : 0, + }); + Comprobante_Partida_Traslado = Comprobante_Partida_Traslado_Anticipo; + Comprobante_Partida_Retencion = Comprobante_Partida_Retencion_Anticipo; + } + #endregion cfid33 cg anticipo partida constante + + //query cancelar cfdi33 cg2 + #region cfdi33 cancelar cg2 + public void cfdi33_cancelar_cg2() + { + SysQueryEncabezado = @" +SELECT +ISNULL((SELECT TOP 1 RUTAPFX FROM Configuracion), '') AS ConfigPfxRuta, +ISNULL((SELECT TOP 1 PASWORDPFX FROM Configuracion), '') AS ConfigPfxClave, +ISNULL((SELECT TOP 1 RUTAFACTURASXML FROM Configuracion), '') AS ComprobanteDBRutaSalida, +ISNULL((SELECT TOP 1 RUTAENTRADAXML FROM Configuracion), '') AS ComprobanteDBRutaEntrada,"; + + if (CFDIPac == "ComDig") { + SysQueryEncabezado += @" +ISNULL((SELECT TOP 1 LLAVEPUBLICACER FROM Configuracion), '') AS ConfigCERRuta, +ISNULL((SELECT TOP 1 LLAVEPRIVADAKEY FROM Configuracion), '') AS ConfigKEYRuta, +"; + } + + + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + #region cg2 anticipo cancelar + SysQueryEncabezado += @" +ISNULL(cg2_ant.MOTIVOCANCELACION,'') AS Comprobante_MotivoCancelacion , +ISNULL(cg2_ant.FOLIOCANCELACION,'') AS Comprobante_Folio_Cancelacion, + +ISNULL(cg2_ant.TIPOCOMPROBANTECLAVE, '') AS TIPOC, +"; + + + SysQueryEncabezado += @" +CASE WHEN (cg2_ant.EXPEDIDORFC IS NULL OR cg2_ant.EXPEDIDORFC = '') THEN cg2_ant.RFCEMISOR ELSE cg2_ant.EXPEDIDORFC END AS Emisor_Rfc, +ISNULL(cg2_ant.RFCRECEPTOR,'') AS Receptor_Rfc, +ISNULL(cg2_ant.UUIDTimbrado, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_ant.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_ant.SERIEANTICIPOS, '') AS Comprobante_Serie, +ISNULL(cg2_ant.FOLIOANTICIPOS, '') AS Comprobante_Folio, +ISNULL(cg2_ant.TOTAL,0) AS Comprobante_Total, +ISNULL(cg2_ant.ESTATUS, '') AS Comprobante_Estatus +,ISNULL(cg2_ant.RFCPROVCERTIFICACION,'') AS PAC_RFC +FROM +Anticipos AS cg2_ant +WHERE cg2_ant.SYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "Anticipos"; + SQLUpdateTblKey = "SYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + + + + #endregion cg2 anticipo cancelar + break; + case "anticipo_egreso": + #region cg2 anticipo egreso cancelar + + SysQueryEncabezado += @" +ISNULL(cg2_antegr.MOTIVOCANCELACION,'') AS Comprobante_MotivoCancelacion , +ISNULL(cg2_antegr.FOLIOCANCELACION,'') AS Comprobante_Folio_Cancelacion, + +'E' AS TIPOC, +"; + + + SysQueryEncabezado += @" +CASE WHEN (cg2_ant.EXPEDIDORFC IS NULL OR cg2_ant.EXPEDIDORFC = '') THEN cg2_ant.RFCEMISOR ELSE cg2_ant.EXPEDIDORFC END AS Emisor_Rfc, +ISNULL(cg2_ant.RFCRECEPTOR,'') AS Receptor_Rfc, +ISNULL(cg2_antegr.UUIDTimbrado, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_antegr.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_ant.SERIEANTICIPOS, '') AS Comprobante_Serie, +ISNULL(cg2_ant.FOLIOANTICIPOS, '') AS Comprobante_Folio, +ISNULL(cg2_antegr.TOTAL,0) AS Comprobante_Total, +ISNULL(cg2_antegr.ESTATUS, '') AS Comprobante_Estatus +FROM +Anticipos_Egresos_Detalles AS cg2_antegr +INNER JOIN Anticipos AS cg2_ant ON cg2_antegr.ANTICIPOSYSID = cg2_ant.SYSID +WHERE cg2_antegr.CONSECUTIVO = " + ComprobanteDBSysId; + SQLUpdateTbl = "Anticipos_Egresos_Detalles"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = ComprobanteDBSysId; + + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + + + + #endregion cg2 anticipo egreso cancelar + break; + case "factura": + #region cg2 factura cancelar + + SysQueryEncabezado += @" +/*Cancelacion NEW*/ +ISNULL(cg2_fac.MOTIVOCANCELACION,'') AS Comprobante_MotivoCancelacion, +ISNULL(cg2_fac.FOLIOCANCELACION, '') AS Comprobante_Folio_Cancelacion, + +ISNULL(cg2_fac.TIPOCOMPROBANTECLAVE, '') AS TIPOC, +"; + + SysQueryEncabezado += @" +ISNULL(cg2_fac.EmpresaRFC, '') AS Emisor_Rfc, +ISNULL(cg2_fac.RFCCLI,'') AS Receptor_Rfc, +ISNULL(cg2_fac.UUIDTimbrado, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_fac.TOTAL_INGRESOS,0) AS Comprobante_Total, +ISNULL(cg2_fac.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_fac.SERIE, '') AS Comprobante_Serie, +ISNULL(cg2_fac.FOLIO, '') AS Comprobante_Folio, +ISNULL(cg2_fac.ESTATUSCERTELEC, '') AS Comprobante_Estatus, +ISNULL(RFCPROVCERTIFICACION, '') AS PAC_RFC +FROM +Facturas AS cg2_fac + +WHERE cg2_fac.CUENTAGASTOS = " + ComprobanteDBSysId; + SQLUpdateTbl = "Facturas"; + SQLUpdateTblKey = "CUENTAGASTOS"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUSCERTELEC", SQLStr = "CANCELADA" }); + + + + #endregion cg2 factura cancelar + break; + case "factura_egreso": + #region cg2 factura cancelar + + SysQueryEncabezado += @" +ISNULL(cg2_facegrdet.MOTIVOCANCELACION,'') AS Comprobante_MotivoCancelacion , +ISNULL(cg2_facegrdet.FOLIOCANCELACION,'') AS Comprobante_Folio_Cancelacion, + +'E' AS TIPOC, + +"; + + + SysQueryEncabezado += @" + +ISNULL(cg2_facegr.EmpresaRFC, '') AS Emisor_Rfc, +ISNULL(cg2_facegr.RFCCLI, '') AS Receptor_Rfc, +ISNULL(cg2_facegrdet.UUIDTIMBRADO, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_facegrdet.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_facegr.SERIE, '') AS Comprobante_Serie, +ISNULL(cg2_facegrdet.EGRESOSYSID, '') AS Comprobante_Folio, +ISNULL(cg2_facegrdet.TOTAL,0) AS Comprobante_Total, +ISNULL(cg2_facegrdet.ESTATUS, '') AS Comprobante_Estatus, +ISNULL(cg2_facegr.RFCPROVCERTIFICACION, '') AS PAC_RFC +FROM Facturas AS cg2_facegr +INNER JOIN Facturas_Egresos_Detalles AS cg2_facegrdet ON cg2_facegr.CUENTAGASTOS = cg2_facegrdet.CUENTAGASTOSSYSID +WHERE cg2_facegrdet.EGRESOSYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "Facturas_Egresos_Detalles"; + SQLUpdateTblKey = "EGRESOSYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADA" }); + + + + #endregion cg2 factura cancelar + break; + case "factura_egresoglobal": + #region cg2 factura EgresoG cancelar + SysQueryEncabezado += @" +ISNULL(cg2_facegr.MOTIVOCANCELACION,'') AS Comprobante_MotivoCancelacion , +ISNULL(cg2_facegr.FOLIOCANCELACION,'') AS Comprobante_Folio_Cancelacion, + +'E' AS TIPOC, +ISNULL(cg2_facegr.Emisor_Rfc, '') AS Emisor_Rfc, +ISNULL(cg2_facegr.Receptor_Rfc, '') AS Receptor_Rfc, +ISNULL(cg2_facegr.UUIDTIMBRADO, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_facegr.FECHAYHORATIMBRADO, '') AS Comprobante_Fecha, +(case when(SELECT TOP 1 formatofactura FROM Configuracion) = '5' then + isnull((SELECT TOP 1 sierienc FROM Configuracion), '') +else + '' +end) as Comprobante_Serie, +ISNULL(cg2_facegr.Comprobante_Folio, '') AS Comprobante_Folio, +ISNULL(cg2_facegr.Comprobante_Total, 0) AS Comprobante_Total, +ISNULL(cg2_facegr.Comprobante_Estatus, '') AS Comprobante_Estatus +/*,ISNULL(cg2_facegr.RFCPROVCERTIFICACION,'') AS PAC_RFC */ +FROM EgresosGlobales AS cg2_facegr +--left JOIN Egresos_Detalles_Globales AS cg2_facegrdet ON cg2_facegr.id_EgresoG = cg2_facegrdet.ID_EGRESO_GLOBAL +WHERE cg2_facegr.id_EgresoG = " + ComprobanteDBSysId; + SQLUpdateTbl = "EgresosGlobales"; + SQLUpdateTblKey = "id_EgresoG"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "Comprobante_Estatus", SQLStr = "CANCELADO" }); + + + #endregion cg2 factura EgresoG cancelar + break; + case "notacredito": + #region cg2 notacredito cancelar + SysQueryEncabezado += @" +CASE WHEN (cg2_ntc.EXPEDIDORFC IS NULL OR cg2_ntc.EXPEDIDORFC = '') THEN cg2_ntc.RFCEMISOR ELSE cg2_ntc.EXPEDIDORFC END AS Emisor_Rfc, +ISNULL(cg2_ntc.UUIDTimbrado, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_ntc.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_ntc.SERIE, '') AS Comprobante_Serie, +ISNULL(cg2_ntc.FOLIO, '') AS Comprobante_Folio, +ISNULL(cg2_ntc.CERTIFICADA, '') AS Comprobante_Estatus +FROM +NotasCredito AS cg2_ntc +WHERE cg2_ntc.NOTASYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "NotasCredito"; + SQLUpdateTblKey = "NOTASYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "CERTIFICADA", SQLStr = "CANCELADA" }); + + #endregion cg2 notacredito cancelar + break; + case "pago": + #region cg2 pago cancelar + + SysQueryEncabezado += @" + +ISNULL(cg2_pag.MOTIVOCANCELACION,'') AS Comprobante_MotivoCancelacion, +ISNULL(cg2_pag.FOLIOCANCELACION, '') AS Comprobante_Folio_Cancelacion, +ISNULL(cg2_pag.TIPOCOMPROBANTECLAVE, '') AS TIPOC, +"; + + SysQueryEncabezado += @" +CASE WHEN (cg2_pag.RFCEXPEDIDO IS NULL OR cg2_pag.RFCEXPEDIDO = '') THEN cg2_pag.RFCEMPRESA ELSE cg2_pag.RFCEXPEDIDO END AS Emisor_Rfc, +ISNULL(cg2_pag.RFCRECEPTOR,'') AS Receptor_Rfc, +ISNULL(cg2_pag.UUIDTimbrado, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_pag.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_pag.SERIE, '') AS Comprobante_Serie, +ISNULL(cg2_pag.FOLIO, '') AS Comprobante_Folio, +ISNULL(cg2_pag.IMPORTETIMBRADO, 0) AS Comprobante_Total, +ISNULL(cg2_pag.ESTATUS, '') AS Comprobante_Estatus, +ISNULL(RFCPROVCERTIFICACION, '') AS PAC_RFC +FROM +Pagos AS cg2_pag +WHERE cg2_pag.SYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "Pagos"; + SQLUpdateTblKey = "SYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + + + + #endregion cg2 pago cancelar + break; + default: + SysQueryEncabezado = string.Empty; + break; + } + } + #endregion cfdi33 cancelar cg2 + + //query cancelar cfdi33 bms + #region cfdi33 cancelar bms + public void cfdi33_cancelar_bms() + { + SysQueryEncabezado = @" +SELECT +ISNULL((SELECT TOP 1 PATHCANCELFILEPFX FROM Configuracion), '') AS ConfigPfxRuta, +ISNULL((SELECT TOP 1 PFXPWD FROM Configuracion), '') AS ConfigPfxClave, +ISNULL((SELECT TOP 1 PATHFACTURAS FROM Configuracion), '') AS ComprobanteDBRutaSalida, +ISNULL((SELECT TOP 1 PATHFACTURAS FROM Configuracion), '') AS ComprobanteDBRutaEntrada,"; + if (CFDIPac == "ComDig") + { + SysQueryEncabezado += @" +ISNULL((SELECT TOP 1 PathFileKey FROM Configuracion), '') AS ConfigKEYRuta, +ISNULL((SELECT TOP 1 PathFileCer FROM Configuracion), '') AS ConfigCERRuta, +"; + } + + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + #region bms anticipo cancelar + SysQueryEncabezado += @" + +ISNULL(COMPROBANTE_TIPODECOMPROBANTE, '') AS TIPOC, + +ISNULL(bms_ant.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_ant.FOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_ant.COMPROBANTE_FECHA, '') AS Comprobante_Fecha, +CASE WHEN bms_ant.COMPROBANTE_MONEDA = 'Pesos' THEN ISNULL(bms_ant.DEPOSITOTIMBRADO_PESOS,0) +ELSE ISNULL(bms_ant.DEPOSITOTIMBRADO_DOLARES,0) +END AS Comprobante_Total, +ISNULL(bms_ant.COMPROBANTE_SERIE, '') Comprobante_Serie, +ISNULL(bms_ant.COMPROBANTE_FOLIO, '') AS Comprobante_Folio, +ISNULL(bms_ant.ESTATUS, '') AS Comprobante_Estatus +FROM +Anticipos AS bms_ant +WHERE bms_ant.SYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "Anticipos"; + SQLUpdateTblKey = "SYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + + #endregion bms anticipo cancelar + break; + case "anticipo_egreso": + #region bms anticipo egreso cancelar + SysQueryEncabezado += @" + +'E' as TIPOC, + +ISNULL(bms_ant.EMISOR_RFC,'') AS Emisor_Rfc, +ISNULL(bms_ant.RECEPTOR_RFC,'') AS Receptor_Rfc, +ISNULL(bms_antegr.UUIDTimbrado, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_antegr.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_ant.COMPROBANTE_SERIE, '') AS Comprobante_Serie, +ISNULL(bms_ant.COMPROBANTE_FOLIO, '') AS Comprobante_Folio, +ISNULL(bms_antegr.TOTAL,0) AS Comprobante_Total, +ISNULL(bms_antegr.ESTATUS, '') AS Comprobante_Estatus +FROM +Anticipos_Egresos_Detalles AS bms_antegr +INNER JOIN Anticipos AS bms_ant ON bms_antegr.ANTICIPOSYSID = bms_ant.SYSID +WHERE bms_antegr.ANTICIPOSYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "Anticipos_Egresos_Detalles"; + SQLUpdateTblKey = "ANTICIPOSYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + + + #endregion bms anticipo egreso cancelar + break; + case "traslado": + #region bms traslado cancelar + + SysQueryEncabezado += @" +/*New Cancelacion*/ +isnull(bms_tra.Motivo_Cancelacion,'') AS Comprobante_MotivoCancelacion, +isnull(bms_tra.Folio_Cancelacion,'') AS Comprobante_Folio_Cancelacion, + + +isnull(TRASLADO_CFDI33_TIPOCOMPROBANTE, '') AS TIPOC, + + +"; + + + + SysQueryEncabezado += @" +ISNULL(bms_tra.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_tra.RECEPTOR_RFC,'') AS Receptor_Rfc, +ISNULL(bms_tra.TRASLADO_FOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_tra.TRASLADO_CFDI33_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_tra.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_tra.FACTURA, '') AS Comprobante_Folio, +0 AS Comprobante_Total, +ISNULL(bms_tra.TRASLADO_ESTATUS, '') AS Comprobante_Estatus + +FROM +FactFactura AS bms_tra +WHERE bms_tra.CONSECUTIVO = " + ComprobanteDBSysId; + SQLUpdateTbl = "FactFactura"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "TRASLADO_ESTATUS", SQLStr = "CANCELADA" }); + + + #endregion bms traslado cancelar + break; + case "factura": + #region bms factura cancelar + + SysQueryEncabezado += @" +isnull(bms_fac.Motivo_Cancelacion,'') AS Comprobante_MotivoCancelacion, +isnull(bms_fac.Folio_Cancelacion,'') AS Comprobante_Folio_Cancelacion, + + +isnull(CFDI33_TIPOCOMPROBANTE, '') AS TIPOC, +"; + + SysQueryEncabezado += @" +ISNULL(bms_fac.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_fac.RECEPTOR_RFC,'') AS Receptor_Rfc, +ISNULL(bms_fac.FOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_fac.CFDI33_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_fac.total,0) AS Comprobante_Total, +ISNULL(bms_fac.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_fac.FACTURA, '') AS Comprobante_Folio, +ISNULL(bms_fac.ESTATUS, '') AS Comprobante_Estatus + +FROM +FactFactura AS bms_fac +WHERE bms_fac.CONSECUTIVO = " + ComprobanteDBSysId; + SQLUpdateTbl = "FactFactura"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADA" }); + + + #endregion bms factura cancelar + break; + case "factura_egreso": + #region bms factura egreso cancelar 2 + + + SysQueryEncabezado += @" +isnull(bms_facegrdet.MOTIVO_CANCELACION,'') AS Comprobante_MotivoCancelacion, +isnull(bms_facegrdet.FOLIO_CANCELACION,'') AS Comprobante_Folio_Cancelacion, + +'E' AS TIPOC, + +"; + + + SysQueryEncabezado += @" +ISNULL(bms_facegr.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_facegr.RECEPTOR_RFC,'') AS Receptor_Rfc, +ISNULL(bms_facegrdet.UUIDTIMBRADO, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_facegrdet.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_facegr.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_facegrdet.EGRESOSYSID, '') AS Comprobante_Folio, +ISNULL(bms_facegrdet.TOTAL,0) AS Comprobante_Total, +ISNULL(bms_facegrdet.ESTATUS, '') AS Comprobante_Estatus +FROM factfactura AS bms_facegr +INNER JOIN Facturas_Egresos_Detalles AS bms_facegrdet ON bms_facegr.consecutivo = bms_facegrdet.SYSID_FACTURA +WHERE bms_facegrdet.EGRESOSYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "Facturas_Egresos_Detalles"; + SQLUpdateTblKey = "EGRESOSYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADA" }); + + #endregion bms factura egreso cancelar 2 + + break; + case "notacredito": + #region bms notacredito egreso cancelar + SysQueryEncabezado += @" +ISNULL(bms_ntc.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_ntc.FOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_ntc.CFDI33_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_ntc.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_ntc.NOTA, '') AS Comprobante_Folio, +ISNULL(bms_ntc.ESTATUS, '') AS Comprobante_Estatus +FROM +NotCredito AS bms_ntc +WHERE bms_ntc.CONSECUTIVO = " + ComprobanteDBSysId; + SQLUpdateTbl = "NotCredito"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = ComprobanteDBSysId; + if (ComprobanteDBOperacion.ToLower() == "cancelar") + { + SQLUpdate.Add(new SQLCol { SQLNom = "CERTIFICADA", SQLStr = "CANCELADA" }); + } + #endregion bms notacredito egreso cancelar + break; + case "pago": + #region bms pago cancelar + + SysQueryEncabezado += @" + +isnull(bms_pag.Motivo_Cancelacion,'') AS Comprobante_MotivoCancelacion, +isnull(bms_pag.Folio_Cancelacion,'') AS Comprobante_Folio_Cancelacion, + + +'P' AS TIPOC, + +"; + + + SysQueryEncabezado += @" +ISNULL(bms_pag.CFDI33_EMISORRFC, '') AS Emisor_Rfc, +ISNULL(bms_pag.CFDI33_RECEPTORRFC,'') AS Receptor_Rfc, +ISNULL(bms_pag.FOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_pag.CFDI33_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_pag.CFDI33_SERIE, '') AS Comprobante_Serie, +ISNULL(bms_pag.CFDI33_FOLIO, '') AS Comprobante_Folio, +CASE WHEN bms_pag.MONEDA = 'Pesos' THEN ISNULL(bms_pag.IMPORTE,0) +ELSE ISNULL(bms_pag.IMPORTEDOLARES,0) +END AS Comprobante_Total, +ISNULL(bms_pag.ESTADO, '') AS Comprobante_Estatus + +FROM +factpagos AS bms_pag +WHERE bms_pag.NUMERO = " + ComprobanteDBSysId; + SQLUpdateTbl = "factpagos"; + SQLUpdateTblKey = "NUMERO"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTADO", SQLStr = "CANCELADO" }); + #endregion bms pago cancelar + break; + case "retencion": + #region bms retencion cancelar + + SysQueryEncabezado += @" +/*New Cancelacion*/ +isnull(bms_ret.RET_MOTIVO_CANCELACION, '') AS Comprobante_MotivoCancelacion, +isnull(bms_ret.RET_FOLIO_CANCELACION, '') AS Comprobante_Folio_Cancelacion, + +'' as TIPOC, +"; + + + SysQueryEncabezado += @" +ISNULL(bms_ret.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_ret.RECEPTOR_RFC,'') AS Receptor_Rfc, +ISNULL(bms_ret.RETENCIONFOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_ret.RETENCION_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +'' AS Comprobante_Serie, +ISNULL(bms_ret.FACTURA, '') AS Comprobante_Folio, +ISNULL(bms_ret.RETENCION_ESTADO, '') AS Comprobante_Estatus, +ISNULL(bms_ret.total,0) AS Comprobante_Total, +ISNULL(bms_ret.RETENCION_SELLO, '') AS Comprobante_Sello +FROM +FactFactura AS bms_ret +WHERE bms_ret.CONSECUTIVO =" + ComprobanteDBSysId; + SQLUpdateTbl = "FactFactura"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "RETENCION_ESTADO", SQLStr = "CANCELADA" }); + + #endregion bms retencion cancelar + break; + default: + SysQueryEncabezado = string.Empty; + break; + } + } + #endregion cfdi33 cancelar bms + + //llenar reader para lectura de queries operaciones + #region llenar reader operaciones + public SqlDataReader sql_reader_function(string strQuery, string strOperacion, string strComando) + { + SqlDataReader sql = null; + + SqlConnection con = new SqlConnection(sql_conexion()); + try + { + sql_log(strComando, strQuery); + SqlCommand cmd = new SqlCommand(strQuery, con); + cmd.CommandTimeout = 30; + con.Open(); + sql = cmd.ExecuteReader(); + } + catch (SqlException Ex) + { + con.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de " + strOperacion + strErr, 1); + sql_err(Ex, strComando, strQuery); + } + catch (Exception Ex) + { + if (con != null) + { + con.Close(); + } + sys_mensaje_error("Error al leer los datos de " + strOperacion, 1); + exe_err(Ex, strComando); + } + return sql; + } + #endregion llenar reader operaciones + + //query recuperar cfdi33 cg2 + #region cfdi33 recuperar cg2 + public void cfdi33_recuperar_cg2() + { + string SOLO_PAGOS = ComprobanteDBTipoComprobante.ToLower() =="pago" ? " DISTINCT ":""; + SysQueryEncabezado = $@" +SELECT {SOLO_PAGOS} +ISNULL((SELECT TOP 1 RUTAFACTURASXML FROM Configuracion), '') AS ComprobanteDBRutaSalida, +ISNULL((SELECT TOP 1 RUTAENTRADAXML FROM Configuracion), '') AS ComprobanteDBRutaEntrada,"; + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + #region cg2 anticipo recuperar + if (CFDIPac == "ComDig") + { + SysQueryEncabezado += @" +ISNULL(cg2_ant.ESCFDI40, '') AS ES_CFDI4,"; + + } + SysQueryEncabezado += @" +CASE WHEN (cg2_ant.EXPEDIDORFC IS NULL OR cg2_ant.EXPEDIDORFC = '') THEN cg2_ant.RFCEMISOR ELSE cg2_ant.EXPEDIDORFC END AS Emisor_Rfc, +(SELECT ISNULL(RFC,'') FROM CLIENTES where CLAVE = cg2_ant.CLIENTE ) AS Receptor_Rfc, +ISNULL(cg2_ant.UUIDTimbrado, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_ant.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_ant.SERIEANTICIPOS, '') AS Comprobante_Serie, +ISNULL(cg2_ant.FOLIOANTICIPOS, '') AS Comprobante_Folio, +ISNULL(cg2_ant.total, 0) AS Comprobante_Total, +ISNULL(cg2_ant.ESTATUS,'') AS Comprobante_Estatus, +ISNULL(cg2_ant.SELLODIGITALEMISOR, '') AS Comprobante_Sello, + +ISNULL(cg2_ant.RFCPROVCERTIFICACION, '') AS RFC_PAC + +FROM +Anticipos AS cg2_ant +WHERE cg2_ant.SYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "Anticipos"; + SQLUpdateTblKey = "SYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion cg2 anticipo recuperar + break; + case "anticipo_egreso": + #region cg2 anticipo egreso recuperar + if (CFDIPac == "ComDig") + { + SysQueryEncabezado += @" +ISNULL(cg2_antegr.ESCFDI40, '') AS ES_CFDI4,"; + + } + SysQueryEncabezado += @" +CASE WHEN (cg2_antegr.EXPEDIDORFC IS NULL OR cg2_antegr.EXPEDIDORFC = '') THEN ISNULL(cg2_antegr.RFCEMISOR, '') ELSE ISNULL(cg2_antegr.EXPEDIDORFC,'') END AS Emisor_Rfc, +(SELECT ISNULL(RFC,'') FROM CLIENTES where CLAVE = cg2_antegr.CLIENTE ) AS Receptor_Rfc, +ISNULL(cg2_antegrdet.UUIDTIMBRADO, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_antegrdet.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_antegr.SERIEANTICIPOS, '') AS Comprobante_Serie, +ISNULL(cg2_antegr.FOLIOANTICIPOS, '') AS Comprobante_Folio, +ISNULL(cg2_antegrdet.SELLODIGITALEMISOR, '') AS Comprobante_Sello, +ISNULL(cg2_antegrdet.ESTATUS, '') AS Comprobante_Estatus, +ISNULL(cg2_antegrdet.total, 0) AS Comprobante_Total, + +ISNULL(cg2_antegrdet.RFCPROVCERTIFICACION, '') AS RFC_PAC + +FROM +Anticipos_Egresos_Detalles AS cg2_antegrdet +INNER JOIN Anticipos AS cg2_antegr ON cg2_antegrdet.ANTICIPOSYSID = cg2_antegr.SYSID +WHERE /*cg2_antegr.SYSID*/ cg2_antegrdet.CONSECUTIVO = " + ComprobanteDBSysId; + SQLUpdateTbl = "Anticipos_Egresos_Detalles"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion cg2 anticipo egreso recuperar + break; + case "factura": + #region factura recuperar + + if (CFDIPac == "ComDig") + { + SysQueryEncabezado += @" +ISNULL(cg2_fac.ESCFDI40, '') AS ES_CFDI4,"; + + } + + //clave cliente + SysQueryEncabezado += @" +ISNULL(cg2_fac.ADUANA, '-') + ISNULL(cg2_fac.PATENTE, '-') + ISNULL(cg2_fac.PEDIMENTO, '-') AS ConfigFacturaSufijo, +ISNULL((SELECT TOP 1 NOM_FACELEC FROM Configuracion), '') AS ConfigFacturaNombre, +ISNULL(cg2_fac.CLIENTE, '') AS ConfigClienteClave, +ISNULL(cg2_fac.TIPOFACTURA, '') AS ConfigFacturaTipo, +ISNULL(cg2_fac.TIPOPEDIMENTO, '') AS ConfigPedimentoTipo,"; + SysQueryEncabezado += @" +ISNULL(cg2_fac.EmpresaRFC, '') AS Emisor_Rfc, +ISNULL(cg2_fac.RFCCLI,'') AS Receptor_Rfc, +ISNULL(cg2_fac.UUIDTimbrado, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_fac.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_fac.SERIE, '') AS Comprobante_Serie, +ISNULL(cg2_fac.FOLIO, '') AS Comprobante_Folio, +ISNULL(cg2_fac.TOTAL_INGRESOS,0) AS Comprobante_Total, +ISNULL(cg2_fac.SELLODIGITAL, '') AS Comprobante_Sello, +ISNULL(cg2_fac.ESTATUSCERTELEC,'') AS Comprobante_Estatus, + + +--Inicia Nomenclrtura C&E +isnull(case when (SELECT TOP 1 formatofactura FROM Configuracion) = 5 then + case when (cg2_fac.TipoFactura = 'P') Then + case when (cg2_fac.tipopedimento = 'U') then + case when (len(cg2_fac.pedimento)=4) Then + (select top 1 NOM_FACELEC from Configuracion)+'-'+cg2_fac.cliente+'-'+Substring(cg2_fac.FECHAYHORAEMISION,9,2)+Substring(cg2_fac.FECHAYHORAEMISION,6,2)+Substring(cg2_fac.FECHAYHORAEMISION,1,4)+'-'+cg2_fac.factura+'-'+cg2_fac.Pedimento + else + (select top 1 NOM_FACELEC from Configuracion)+'-'+cg2_fac.cliente+'-'+Substring(cg2_fac.FECHAYHORAEMISION,9,2)+Substring(cg2_fac.FECHAYHORAEMISION,6,2)+Substring(cg2_fac.FECHAYHORAEMISION,1,4)+'-'+cg2_fac.factura+'-'+(select substring(Convert( VarChar(10),DateAdd(day,fechapago,'1800-12-28'),103),9,2) from pedimentos where aduana= cg2_fac.aduana and patente=cg2_fac.patente and pedimento= cg2_fac.Pedimento)+cg2_fac.aduana+cg2_fac.patente+cg2_fac.Pedimento + End + Else + '' + End + else + 'NA' + End +end,'') as [Comprobante_NomenclaturaCNE] +--Finaliza Nomenclrtura C&E + +,ISNULL(cg2_fac.RFCPROVCERTIFICACION, '') AS RFC_PAC + +FROM +Facturas AS cg2_fac +WHERE cg2_fac.CUENTAGASTOS = " + ComprobanteDBSysId; + SQLUpdateTbl = "Facturas"; + SQLUpdateTblKey = "CUENTAGASTOS"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion factura recuperar + break; + case "factura_egreso": + #region cg2 factura egreso recuperar + if (CFDIPac == "ComDig") + { + SysQueryEncabezado += @" +ISNULL(cg2_facegrdet.ESCFDI4, '') AS ES_CFDI4,"; + + } + SysQueryEncabezado += @" +ISNULL(cg2_facegr.EmpresaRFC, '') AS Emisor_Rfc, +ISNULL(cg2_facegr.RFCCLI,'') AS Receptor_Rfc, +ISNULL(cg2_facegrdet.UUIDTIMBRADO, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_facegrdet.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +(case when(SELECT TOP 1 formatofactura FROM Configuracion) = '5' then + isnull((SELECT TOP 1 sierienc FROM Configuracion), '') +else + '' +end) as Comprobante_Serie, +ISNULL(cg2_facegrdet.EGRESOSYSID, '') AS Comprobante_Folio, +ISNULL(cg2_facegrdet.TOTAL,0) AS Comprobante_Total, +ISNULL(cg2_facegrdet.SELLODIGITALEMISOR, '') AS Comprobante_Sello, +ISNULL(cg2_facegrdet.Estatus,'') AS Comprobante_Estatus + +,ISNULL(cg2_facegrdet.RFCPROVCERTIFICACION,'') AS RFC_PAC + +FROM Facturas AS cg2_facegr +INNER JOIN Facturas_Egresos_Detalles AS cg2_facegrdet ON cg2_facegr.CUENTAGASTOS = cg2_facegrdet.CUENTAGASTOSSYSID +WHERE cg2_facegrdet.EGRESOSYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "Facturas_Egresos_Detalles"; + SQLUpdateTblKey = "EGRESOSYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion cg2 factura egreso recuperar + break; + case "factura_egresoglobal": + #region cg2 factura egresoG recuperar + SysQueryEncabezado += @" +ISNULL(cg2_facegr.Emisor_Rfc, '') AS Emisor_Rfc, +ISNULL(cg2_facegr.Receptor_Rfc, '') AS Receptor_Rfc, +ISNULL(cg2_facegr.UUIDTIMBRADO, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_facegr.FECHAYHORATIMBRADO, '') AS Comprobante_Fecha, +(case when(SELECT TOP 1 formatofactura FROM Configuracion) = '5' then + isnull((SELECT TOP 1 sierienc FROM Configuracion), '') +else + '' +end) as Comprobante_Serie, +ISNULL(cg2_facegr.Comprobante_Folio, '') AS Comprobante_Folio, +ISNULL(cg2_facegr.Comprobante_Total, 0) AS Comprobante_Total, + ISNULL(cg2_facegr.SELLODIGITALEMISOR, '') AS Comprobante_Sello, +ISNULL(cg2_facegr.Comprobante_Estatus,'') AS Comprobante_Estatus + +,ISNULL(cg2_facegr.RFCPROVCERTIFICACION,'') AS RFC_PAC + +FROM EgresosGlobales AS cg2_facegr +--INNER JOIN Facturas_Egresos_Detalles AS cg2_facegrdet ON cg2_facegr.CUENTAGASTOS = cg2_facegrdet.CUENTAGASTOSSYSID +WHERE cg2_facegr.id_EgresoG =" + ComprobanteDBSysId; + SQLUpdateTbl = "EgresosGlobales"; + SQLUpdateTblKey = "id_EgresoG"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion cg2 factura egresoG recuperar + break; + case "notacredito": + #region cg2 notacredito recuperar + SysQueryEncabezado += @" +CASE WHEN (cg2_ntc.EXPEDIDORFC IS NULL OR cg2_ntc.EXPEDIDORFC = '') THEN cg2_ntc.RFCEMISOR ELSE cg2_ntc.EXPEDIDORFC END AS Emisor_Rfc, +ISNULL(cg2_ntc.UUIDTimbrado, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(cg2_ntc.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(cg2_ntc.SERIE, '') AS Comprobante_Serie, +ISNULL(cg2_ntc.FOLIO, '') AS Comprobante_Folio, +ISNULL(cg2_ntc.SELLODIGITALEMISOR, '') AS Comprobante_Sello +FROM +NotasCredito AS cg2_ntc +WHERE cg2_ntc.NOTASYSID = " + ComprobanteDBSysId; + #endregion cg2 notacredito recuperar + break; + case "pago": + #region cg2 pago recuperar + if (CFDIPac == "ComDig") + { + SysQueryEncabezado += @" +ISNULL(cg2_pag.ESCFDI40, '') AS ES_CFDI4,"; + + } + + // SysQueryEncabezado += @" + //CASE WHEN (cg2_pag.RFCEXPEDIDO IS NULL OR cg2_pag.RFCEXPEDIDO = '') THEN cg2_pag.RFCEMPRESA ELSE cg2_pag.RFCEXPEDIDO END AS Emisor_Rfc, + //ISNULL(cg2_pag.RFCRECEPTOR,'') AS Receptor_Rfc, + //ISNULL(cg2_pag.UUIDTimbrado, '') AS Complemento_TimbreFiscalDigital_UUID, + //ISNULL(cg2_pag.FECHAYHORAEMISION, '') AS Comprobante_Fecha, + //ISNULL(cg2_pag.SERIE, '') AS Comprobante_Serie, + //ISNULL(cg2_pag.FOLIO, '') AS Comprobante_Folio, + //ISNULL(cg2_pag.IMPORTETIMBRADO,0) AS Comprobante_Total, + //ISNULL(cg2_pag.ESTATUS, '') AS Comprobante_Estatus, + //ISNULL(cg2_pag.SELLODIGITALEMISOR, '') AS Comprobante_Sello + + //,ISNULL(cg2_pag.RFCPROVCERTIFICACION,'') AS RFC_PAC + + //FROM + //Pagos AS cg2_pag + //WHERE cg2_pag.SYSID = " + ComprobanteDBSysId; + + //---se agrego en base a T2024-07-090 + SysQueryEncabezado += @" + CASE WHEN (cg2_pag.RFCEXPEDIDO IS NULL OR cg2_pag.RFCEXPEDIDO = '') THEN cg2_pag.RFCEMPRESA ELSE cg2_pag.RFCEXPEDIDO END AS Emisor_Rfc, + ISNULL(cli.RFC,'') AS Receptor_Rfc, + ISNULL(cg2_pag.UUIDTimbrado, '') AS Complemento_TimbreFiscalDigital_UUID, + ISNULL(cg2_pag.FECHAYHORAEMISION, '') AS Comprobante_Fecha, + ISNULL(cg2_pag.SERIE, '') AS Comprobante_Serie, + ISNULL(cg2_pag.FOLIO, '') AS Comprobante_Folio, + ISNULL(cg2_pag.IMPORTETIMBRADO,0) AS Comprobante_Total, + ISNULL(cg2_pag.ESTATUS, '') AS Comprobante_Estatus, + ISNULL(cg2_pag.SELLODIGITALEMISOR, '') AS Comprobante_Sello + + ,ISNULL(cg2_pag.RFCPROVCERTIFICACION,'') AS RFC_PAC + + FROM Pagos AS cg2_pag + left join PagoDetalles Pdet on pdet.PAGOSYSID = cg2_pag.sysid + left join Facturas fac on fac.FACTURA=Pdet.FACTURA + left JOIN Clientes cli on cli.CLAVE=fac.CLIENTE + WHERE cg2_pag.SYSID = " + ComprobanteDBSysId; + + + SQLUpdateTbl = "Pagos"; + SQLUpdateTblKey = "SYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion cg2 pago recuperar + break; + default: + SysQueryEncabezado = string.Empty; + break; + } + } + #endregion cfdi33 recuperar cg2 + + //query recuperar cfdi33 bms + #region cfdi33 recuperar bms + public void cfdi33_recuperar_bms() + { + SysQueryEncabezado = @" +SELECT +ISNULL((SELECT TOP 1 PATHFACTURAS FROM Configuracion), '') AS ComprobanteDBRutaSalida, +ISNULL((SELECT TOP 1 PATHFACTURAS FROM Configuracion), '') AS ComprobanteDBRutaEntrada,"; + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + #region bms anticipo recuperar + SysQueryEncabezado += @" +ISNULL(bms_ant.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_ant.RECEPTOR_RFC,'') AS Receptor_Rfc, +ISNULL(bms_ant.FOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_ant.COMPROBANTE_FECHA, '') AS Comprobante_Fecha, +ISNULL(bms_ant.COMPROBANTE_SERIE, '') AS Comprobante_Serie, +ISNULL(bms_ant.COMPROBANTE_FOLIO, '') AS Comprobante_Folio, +ISNULL(bms_ant.ESTATUS, '') AS Comprobante_Estatus, +CASE WHEN bms_ant.COMPROBANTE_MONEDA = 'Pesos' THEN ISNULL(bms_ant.Comprobante_Total,0) +ELSE ISNULL(bms_ant.COMPROBANTE_TOTAL_DOLARES,0) END AS Comprobante_Total, +ISNULL(bms_ant.SELLODIGITAL, '') AS Comprobante_Sello +,ISNULL(bms_ant.CFDI33_RFCPROVCERTIFICACION,'') AS RFC_PAC + +FROM +Anticipos AS bms_ant +WHERE bms_ant.SYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "Anticipos"; + SQLUpdateTblKey = "SYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion bms anticipo recuperar + break; + case "anticipo_egreso": + #region bms anticipo egreso recuperar + SysQueryEncabezado += @" +ISNULL(bms_antegr.EMISOR_RFC,'') AS Emisor_Rfc, +ISNULL(bms_antegr.RECEPTOR_RFC,'') AS Receptor_Rfc, +ISNULL(bms_antegrdet.UUIDTIMBRADO, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_antegrdet.FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_antegr.COMPROBANTE_SERIE, '') AS Comprobante_Serie, +ISNULL(bms_antegr.COMPROBANTE_FOLIO, '') AS Comprobante_Folio, +ISNULL(bms_antegrdet.ESTATUS, '') AS Comprobante_Estatus, +ISNULL(bms_antegr.Comprobante_Total,0) AS Comprobante_Total, +ISNULL(bms_antegrdet.SELLODIGITALEMISOR, '') AS Comprobante_Sello + +,ISNULL(bms_antegr.CFDI33_RFCPROVCERTIFICACION,'') AS RFC_PAC + +FROM +Anticipos_Egresos_Detalles AS bms_antegrdet +INNER JOIN Anticipos AS bms_antegr ON bms_antegrdet.ANTICIPOSYSID = bms_antegr.SYSID +WHERE bms_antegr.SYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "Anticipos_Egresos_Detalles"; + SQLUpdateTblKey = "ANTICIPOSYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion bms anticipo egreso recuperar + break; + case "traslado": + #region bms traslado recuperar + SysQueryEncabezado += @" +ISNULL(bms_tra.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_tra.RECEPTOR_RFC,'') AS Receptor_Rfc, +ISNULL(bms_tra.TRASLADO_FOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_tra.TRASLADO_CFDI33_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_tra.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_tra.FACTURA, '') AS Comprobante_Folio, +ISNULL(bms_tra.TRASLADO_ESTATUS, '') AS Comprobante_Estatus, +CASE WHEN bms_tra.MONEDA = 'Pesos' THEN ISNULL(bms_tra.TOTAL,0) +ELSE ISNULL(bms_tra.TOTALDOLARES,0) END AS Comprobante_Total, +ISNULL(bms_tra.TRASLADO_SELLODIGITAL, '') AS Comprobante_Sello + +,ISNULL(bms_tra.TRASLADO_CFDI33_RFCPROVCERTIFICACION,'') AS RFC_PAC + +FROM +FactFactura AS bms_tra +WHERE bms_tra.CONSECUTIVO = " + ComprobanteDBSysId; + SQLUpdateTbl = "FactFactura"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion bms traslado recuperar + break; + case "factura": + #region bms factura recuperar + SysQueryEncabezado += @" +ISNULL(bms_fac.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_fac.RECEPTOR_RFC,'') AS Receptor_Rfc, +ISNULL(bms_fac.FOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_fac.CFDI33_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_fac.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_fac.FACTURA, '') AS Comprobante_Folio, +ISNULL(bms_fac.ESTATUS, '') AS Comprobante_Estatus, +CASE WHEN bms_fac.MONEDA = 'Pesos' THEN ISNULL(bms_fac.TOTAL,0) +ELSE ISNULL(bms_fac.TOTALDOLARES,0) END AS Comprobante_Total, +ISNULL(bms_fac.SELLODIGITAL, '') AS Comprobante_Sello + +,ISNULL(bms_fac.CFDI33_RFCPROVCERTIFICACION,'') AS RFC_PAC + +FROM +FactFactura AS bms_fac +WHERE bms_fac.CONSECUTIVO = " + ComprobanteDBSysId; + SQLUpdateTbl = "FactFactura"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion bms factura recuperar + break; + case "factura_egreso": + #region bms factura egreso recuperar 2 + SysQueryEncabezado += @" + ISNULL((SELECT TOP 1 PATHFACTURAS FROM Configuracion), '') AS ComprobanteDBRutaEntrada, + ISNULL(bms_facegr.EMISOR_RFC, '') AS Emisor_Rfc, + ISNULL(bms_facegr.RECEPTOR_RFC,'') AS Receptor_Rfc, + ISNULL(bms_facegrdet.TOTAL,0) AS Comprobante_Total, + ISNULL(bms_facegrdet.UUIDTIMBRADO, '') AS Complemento_TimbreFiscalDigital_UUID, + ISNULL(bms_facegrdet.FECHAYHORAEMISION, '') AS Comprobante_Fecha, + ISNULL(bms_facegr.SERIECFD, '') AS Comprobante_Serie, + ISNULL(bms_facegrdet.EGRESOSYSID, '') AS Comprobante_Folio, + ISNULL(bms_facegrdet.ESTATUS, '') AS Comprobante_Estatus, + ISNULL(bms_facegrdet.SELLOCFDTIMBRADO, '') AS Comprobante_Sello + +,ISNULL(bms_facegrdet.RFCPROVCERTIFICACION,'') AS RFC_PAC + + FROM factfactura AS bms_facegr + INNER JOIN Facturas_Egresos_Detalles AS bms_facegrdet ON bms_facegr.CONSECUTIVO = bms_facegrdet.SYSID_FACTURA + WHERE bms_facegrdet.EGRESOSYSID = " + ComprobanteDBSysId; + SQLUpdateTbl = "Facturas_Egresos_Detalles"; + SQLUpdateTblKey = "EGRESOSYSID"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion bms factura egreso recuperar 2 + break; + case "notacredito": + #region bms notacredito recuperar + SysQueryEncabezado += @" +ISNULL(bms_ntc.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_ntc.FOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_ntc.CFDI33_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_ntc.SERIECFD, '') AS Comprobante_Serie, +ISNULL(bms_ntc.NOTA, '') AS Comprobante_Folio, +ISNULL(bms_ntc.ESTATUS, '') AS Comprobante_Estatus, +ISNULL(bms_ntc.SELLODIGITAL, '') AS Comprobante_Sello +FROM +NotCredito AS bms_ntc +WHERE bms_ntc.CONSECUTIVO = " + ComprobanteDBSysId; + SQLUpdateTbl = "NotCredito"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion bms notacredito recuperar + break; + case "pago": + #region bms pago recuperar + SysQueryEncabezado += @" +ISNULL(bms_pag.CFDI33_EMISORRFC, '') AS Emisor_Rfc, +ISNULL(bms_pag.CFDI33_RECEPTORRFC,'') AS Receptor_Rfc, +ISNULL(bms_pag.FOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_pag.CFDI33_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +ISNULL(bms_pag.CFDI33_SERIE, '') AS Comprobante_Serie, +ISNULL(bms_pag.CFDI33_FOLIO, '') AS Comprobante_Folio, +CASE bms_pag.CFDI33_TIPOCOMPROBANTE When 'P' then 0 else + CASE bms_pag.moneda when 'Pesos' THEN ISNULL(bms_pag.importe,'') + ELSE ISNULL(bms_pag.importedolares,'') + END +END AS Comprobante_Total, +ISNULL(bms_pag.ESTADO, '') AS Comprobante_Estatus, +ISNULL(bms_pag.SELLODIGITAL, '') AS Comprobante_Sello + +,ISNULL(bms_pag.CFDI33_RFCPROVCERTIFICACION,'') AS RFC_PAC + +FROM +factpagos AS bms_pag +WHERE bms_pag.NUMERO = " + ComprobanteDBSysId; + SQLUpdateTbl = "factpagos"; + SQLUpdateTblKey = "NUMERO"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion bms pago recuperar + break; + case "retencion": + #region bms retencion recuperar + bolRet = true; + SysQueryEncabezado += @" +ISNULL(bms_ret.EMISOR_RFC, '') AS Emisor_Rfc, +ISNULL(bms_ret.RECEPTOR_RFC,'') AS Receptor_Rfc, +ISNULL(bms_ret.RETENCIONFOLIOPAC, '') AS Complemento_TimbreFiscalDigital_UUID, +ISNULL(bms_ret.RETENCION_FECHAYHORAEMISION, '') AS Comprobante_Fecha, +'' AS Comprobante_Serie, +ISNULL(bms_ret.FACTURA, '') AS Comprobante_Folio, +ISNULL(bms_ret.RETENCION_ESTADO, '') AS Comprobante_Estatus, + +ISNULL(bms_ret.RETENCION_SELLO, '') AS Comprobante_Sello, +ISNULL(bms_ret.RETENCION_MontoTotRet, 0) AS Comprobante_Total + +,ISNULL(bms_ret.CFDI33_RFCPROVCERTIFICACION,'') AS RFC_PAC + +FROM +FactFactura AS bms_ret +WHERE bms_ret.CONSECUTIVO = " + ComprobanteDBSysId; + SQLUpdateTbl = "FactFactura"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdateTblID = ComprobanteDBSysId; + #endregion bms retencion recuperar + break; + default: + SysQueryEncabezado = string.Empty; + break; + } + } + #endregion cfdi33 recuperar bms + + //actualizar cep cfdi33 + #region cfdi33 cep update + public void cfdi33_cep_update() + { + sys_estatus("Actualizando datos..."); + + SQLUpdate.Clear(); + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + SQLUpdateTbl = "Pagos"; + SQLUpdateTblKey = "SysID"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "FECHAPAGO", SQLStr = Pago10_FechaPago }); + //Monica llena este campo + //SQLUpdate.Add(new SQLCol { SQLNom = "IMPORTE", SQLDob = Pago10_Monto }); + SQLUpdate.Add(new SQLCol { SQLNom = "NOMBREBANCO", SQLStr = Pago10_NomBancoOrdExt }); + SQLUpdate.Add(new SQLCol { SQLNom = "CtaOrdenante", SQLStr = Pago10_CtaOrdenante }); + SQLUpdate.Add(new SQLCol { SQLNom = "CtaBeneficiario", SQLStr = Pago10_CtaBeneficiario }); + SQLUpdate.Add(new SQLCol { SQLNom = "TipoCadenaPagoTEF", SQLStr = "01" }); + SQLUpdate.Add(new SQLCol { SQLNom = "CadenaPagoTEF", SQLStr = Pago10_CadPago }); + SQLUpdate.Add(new SQLCol { SQLNom = "CertificadoPagoTEF", SQLStr = Pago10_CertPago }); + SQLUpdate.Add(new SQLCol { SQLNom = "SellodePagoTEF", SQLStr = Pago10_SelloPago }); + } + if (ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + SQLUpdateTbl = "factpagos"; + SQLUpdateTblKey = "NUMERO"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "CEP_FECHAPAGO", SQLStr = Pago10_FechaPago }); + SQLUpdate.Add(new SQLCol { SQLNom = "CEP_MONTO", SQLDob = Pago10_Monto }); + SQLUpdate.Add(new SQLCol { SQLNom = "CEP_BANCOEMISOR", SQLStr = Pago10_NomBancoOrdExt }); + SQLUpdate.Add(new SQLCol { SQLNom = "CEP_CTAORDENANTEEMISOR", SQLStr = Pago10_CtaOrdenante }); + SQLUpdate.Add(new SQLCol { SQLNom = "CEP_CTAORDENANTERECEPTOR", SQLStr = Pago10_CtaBeneficiario }); + SQLUpdate.Add(new SQLCol { SQLNom = "CEP_TIPOCADPAGO", SQLStr = "01" }); + SQLUpdate.Add(new SQLCol { SQLNom = "CEP_CADPAGO", SQLStr = Pago10_CadPago }); + SQLUpdate.Add(new SQLCol { SQLNom = "CEP_CERTIFICADOPAGO", SQLStr = Pago10_CertPago }); + SQLUpdate.Add(new SQLCol { SQLNom = "CEP_SELLOPAGO", SQLStr = Pago10_SelloPago }); + } + sql_update(); + SQLUpdateTbl = string.Empty; + SQLUpdateTblKey = string.Empty; + SQLUpdateTblID = 0; + SQLUpdate.Clear(); + sys_proceso_fin("¡Datos del CEP actualizados!", 1); + } + #endregion cfdi33 cep update + + //leer datos de comercio exterior + #region cfdi33_timbrar_comercioexterior_data + public void cfdi33_timbrar_comercioexterior_data() + { + SqlConnection con_ext = new SqlConnection(sql_conexion()); + try + { + sql_log("com_ext", SysQueryComercioExterior); + SqlCommand cmd_ext = new SqlCommand(SysQueryComercioExterior, con_ext); + cmd_ext.CommandTimeout = 30; + con_ext.Open(); + SqlDataReader rdr_ext = cmd_ext.ExecuteReader(); + if (rdr_ext != null) + { + while (rdr_ext.Read()) + { + ComercioExterior_Emisor_Curp = uni_dec(rdr_ext["ComercioExterior_Emisor_Curp"].ToString()); + ComercioExterior_Emisor_Domicilio_Calle = uni_dec(rdr_ext["ComercioExterior_Emisor_Domicilio_Calle"].ToString()); + ComercioExterior_Emisor_Domicilio_NumeroExterior = uni_dec(rdr_ext["ComercioExterior_Emisor_Domicilio_NumeroExterior"].ToString()); + ComercioExterior_Emisor_Domicilio_NumeroInterior = uni_dec(rdr_ext["ComercioExterior_Emisor_Domicilio_NumeroInterior"].ToString()); + ComercioExterior_Emisor_Domicilio_Colonia = uni_dec(rdr_ext["ComercioExterior_Emisor_Domicilio_Colonia"].ToString()); + ComercioExterior_Emisor_Domicilio_Localidad = uni_dec(rdr_ext["ComercioExterior_Emisor_Domicilio_Localidad"].ToString()); + ComercioExterior_Emisor_Domicilio_Referencia = uni_dec(rdr_ext["ComercioExterior_Emisor_Domicilio_Referencia"].ToString()); + ComercioExterior_Emisor_Domicilio_Municipio = uni_dec(rdr_ext["ComercioExterior_Emisor_Domicilio_Municipio"].ToString()); + ComercioExterior_Emisor_Domicilio_Estado = uni_dec(rdr_ext["ComercioExterior_Emisor_Domicilio_Estado"].ToString()); + ComercioExterior_Emisor_Domicilio_Pais = uni_dec(rdr_ext["ComercioExterior_Emisor_Domicilio_Pais"].ToString()); + ComercioExterior_Emisor_Domicilio_CodigoPostal = uni_dec(rdr_ext["ComercioExterior_Emisor_Domicilio_CodigoPostal"].ToString()); + ComercioExterior_Propietario_NumRegIdTrib = uni_dec(rdr_ext["ComercioExterior_Propietario_NumRegIdTrib"].ToString()); + ComercioExterior_Propietario_ResidenciaFiscal = uni_dec(rdr_ext["ComercioExterior_Propietario_ResidenciaFiscal"].ToString()); + ComercioExterior_Receptor_NumRegIdTrib = uni_dec(rdr_ext["ComercioExterior_Receptor_NumRegIdTrib"].ToString()); + ComercioExterior_Receptor_Domicilio_Calle = uni_dec(rdr_ext["ComercioExterior_Receptor_Domicilio_Calle"].ToString()); + ComercioExterior_Receptor_Domicilio_NumeroExterior = uni_dec(rdr_ext["ComercioExterior_Receptor_Domicilio_NumeroExterior"].ToString()); + ComercioExterior_Receptor_Domicilio_NumeroInterior = uni_dec(rdr_ext["ComercioExterior_Receptor_Domicilio_NumeroInterior"].ToString()); + ComercioExterior_Receptor_Domicilio_Colonia = uni_dec(rdr_ext["ComercioExterior_Receptor_Domicilio_Colonia"].ToString()); + ComercioExterior_Receptor_Domicilio_Localidad = uni_dec(rdr_ext["ComercioExterior_Receptor_Domicilio_Localidad"].ToString()); + ComercioExterior_Receptor_Domicilio_Referencia = uni_dec(rdr_ext["ComercioExterior_Receptor_Domicilio_Referencia"].ToString()); + ComercioExterior_Receptor_Domicilio_Municipio = uni_dec(rdr_ext["ComercioExterior_Receptor_Domicilio_Municipio"].ToString()); + ComercioExterior_Receptor_Domicilio_Estado = uni_dec(rdr_ext["ComercioExterior_Receptor_Domicilio_Estado"].ToString()); + ComercioExterior_Receptor_Domicilio_Pais = uni_dec(rdr_ext["ComercioExterior_Receptor_Domicilio_Pais"].ToString()); + ComercioExterior_Receptor_Domicilio_CodigoPostal = uni_dec(rdr_ext["ComercioExterior_Receptor_Domicilio_CodigoPostal"].ToString()); + ComercioExterior_Destinatario_NumRegIdTrib = uni_dec(rdr_ext["ComercioExterior_Destinatario_NumRegIdTrib"].ToString()); + ComercioExterior_Destinatario_Nombre = uni_dec(rdr_ext["ComercioExterior_Destinatario_Nombre"].ToString()); + ComercioExterior_Destinatario_Domicilio_Calle = uni_dec(rdr_ext["ComercioExterior_Destinatario_Domicilio_Calle"].ToString()); + ComercioExterior_Destinatario_Domicilio_NumeroExterior = uni_dec(rdr_ext["ComercioExterior_Destinatario_Domicilio_NumeroExterior"].ToString()); + ComercioExterior_Destinatario_Domicilio_NumeroInterior = uni_dec(rdr_ext["ComercioExterior_Destinatario_Domicilio_NumeroInterior"].ToString()); + ComercioExterior_Destinatario_Domicilio_Colonia = uni_dec(rdr_ext["ComercioExterior_Destinatario_Domicilio_Colonia"].ToString()); + ComercioExterior_Destinatario_Domicilio_Localidad = uni_dec(rdr_ext["ComercioExterior_Destinatario_Domicilio_Localidad"].ToString()); + ComercioExterior_Destinatario_Domicilio_Referencia = uni_dec(rdr_ext["ComercioExterior_Destinatario_Domicilio_Referencia"].ToString()); + ComercioExterior_Destinatario_Domicilio_Municipio = uni_dec(rdr_ext["ComercioExterior_Destinatario_Domicilio_Municipio"].ToString()); + ComercioExterior_Destinatario_Domicilio_Estado = uni_dec(rdr_ext["ComercioExterior_Destinatario_Domicilio_Estado"].ToString()); + ComercioExterior_Destinatario_Domicilio_Pais = uni_dec(rdr_ext["ComercioExterior_Destinatario_Domicilio_Pais"].ToString()); + ComercioExterior_Destinatario_Domicilio_CodigoPostal = uni_dec(rdr_ext["ComercioExterior_Destinatario_Domicilio_CodigoPostal"].ToString()); + ComercioExterior_Version = uni_dec(rdr_ext["ComercioExterior_Version"].ToString()); + ComercioExterior_MotivoTraslado = uni_dec(rdr_ext["ComercioExterior_MotivoTraslado"].ToString()); + ComercioExterior_TipoOperacion = uni_dec(rdr_ext["ComercioExterior_TipoOperacion"].ToString()); + ComercioExterior_ClaveDePedimento = uni_dec(rdr_ext["ComercioExterior_ClaveDePedimento"].ToString()); + ComercioExterior_CertificadoOrigen = uni_dec(rdr_ext["ComercioExterior_CertificadoOrigen"].ToString()); + ComercioExterior_NumCertificadoOrigen = uni_dec(rdr_ext["ComercioExterior_NumCertificadoOrigen"].ToString()); + ComercioExterior_NumeroExportadorConfiable = uni_dec(rdr_ext["ComercioExterior_NumeroExportadorConfiable"].ToString()); + ComercioExterior_Incoterm = uni_dec(rdr_ext["ComercioExterior_Incoterm"].ToString()); + ComercioExterior_Subdivision = uni_dec(rdr_ext["ComercioExterior_Subdivision"].ToString()); + ComercioExterior_Observaciones = uni_dec(rdr_ext["ComercioExterior_Observaciones"].ToString()); + double.TryParse(uni_dec(rdr_ext["ComercioExterior_TotalUSD"].ToString()), out ComercioExterior_TotalUSD); + ComercioExterior_TipoCambioUSD = Comprobante_TipoCambio; + } + } + rdr_ext.Close(); + rdr_ext.Dispose(); + con_ext.Close(); + } + catch (SqlException Ex) + { + con_ext.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de comercio exterior." + strErr, 1); + sql_err(Ex, "Com_Ext", SysQueryRelacionados); + } + catch (Exception Ex) + { + if (con_ext != null) + { + con_ext.Close(); + } + sys_mensaje_error("Error al leer los datos de comercio exterior.", 1); + exe_err(Ex, "Doc_Rel"); + } + } + #endregion cfdi33_timbrar_comercioexterior_data + + //leer los datos del encabezado + #region cfdi33_data_encabezado + public bool cfdi33_data_encabezado() + { + bool bolNoVac = false; + SqlConnection con_enc = new SqlConnection(sql_conexion()); + try + { + sql_log("Com_Enc", SysQueryEncabezado); + SqlCommand cmd_enc = new SqlCommand(SysQueryEncabezado, con_enc); + cmd_enc.CommandTimeout = 30; + con_enc.Open(); + SqlDataReader rdr_enc = cmd_enc.ExecuteReader(); + if (rdr_enc != null) + { + while (rdr_enc.Read()) + { + ConfigCertificadoRuta = uni_dec(rdr_enc["Certificado_Ruta"].ToString()); + ConfigKeyRuta = uni_dec(rdr_enc["Key_Ruta"].ToString()); + ConfigKeyClave = uni_dec(rdr_enc["Key_Clave"].ToString()); + Comprobante_NoCertificado = uni_dec(rdr_enc["Comprobante_NoCertificado"].ToString()); + Comprobante_Certificado = cfdi33_certificado(); + ComprobanteDBRutaEntrada = uni_dec(rdr_enc["ComprobanteDBRutaEntrada"].ToString()); + ComprobanteDBRutaSalida = uni_dec(rdr_enc["ComprobanteDBRutaSalida"].ToString()); + Comprobante_Version = CFDI4 ? "4.0" : "3.3"; + + if (CFDI4) { + Comprobante_Exportacion = uni_dec(rdr_enc["Exportacion"].ToString()); + //Solo para leer de CGII + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && ComprobanteDBTipoComprobante.ToLower() == "factura") + { + ES_GLOBAL = uni_dec(rdr_enc["ES_GLOBAL"].ToString()) == "1" ? true : false; + } + + Comprobante_InfoGlo_Periodicidad = uni_dec(rdr_enc["Periodicidad"].ToString()); + Comprobante_InfoGlo_Meses = uni_dec(rdr_enc["Meses"].ToString()); + Comprobante_InfoGlo_Anio = uni_dec(rdr_enc["Anio"].ToString()); + Comprobante_Receptor_DomicilioFiscal = uni_dec(rdr_enc["Receptor_DomicilioFiscal"].ToString()); + Comprobante_Receptor_RegimenFiscal = uni_dec(rdr_enc["Receptor_RegimenFiscal"].ToString()); + } + + Emisor_Rfc = uni_dec(rdr_enc["Emisor_Rfc"].ToString()); + + if (CFDIMod == "Prueba" && Emisor_Rfc != "SCT050708EB2") + { + //SysErrores = SysErrores + @"El Sistema esta en modo Pruebas y no cuenta con los privilegios para poder continuar en este modo.\par "; + } + Emisor_Nombre = uni_dec(rdr_enc["Emisor_Nombre"].ToString()); + Emisor_RegimenFiscal = uni_dec(rdr_enc["Emisor_RegimenFiscal"].ToString()); + Receptor_Rfc = uni_dec(rdr_enc["Receptor_Rfc"].ToString()); + Receptor_Nombre = uni_dec(rdr_enc["Receptor_Nombre"].ToString()); + Receptor_ResidenciaFiscal = uni_dec(rdr_enc["Receptor_ResidenciaFiscal"].ToString()); + Receptor_NumRegIdTrib = uni_dec(rdr_enc["Receptor_NumRegIdTrib"].ToString()); + Receptor_UsoCFDI = uni_dec(rdr_enc["Receptor_UsoCFDI"].ToString()); + if (Receptor_Rfc != "XEXX010101000" && ((Receptor_ResidenciaFiscal.ToLower() != "mex" && Receptor_ResidenciaFiscal.ToLower() != "mexico") && !string.IsNullOrEmpty(Receptor_ResidenciaFiscal))) + { + sys_mensaje_error("Para receptor extranjero especifique el RFC genérico XEXX010101000.", 1); + } + int.TryParse(uni_dec(rdr_enc["Comprobante_LugarExpedicion"].ToString()), out Comprobante_LugarExpedicion); + Comprobante_TipoDeComprobante = uni_dec(rdr_enc["Comprobante_TipoDeComprobante"].ToString()); + Comprobante_MetodoPago = uni_dec(rdr_enc["Comprobante_MetodoPago"].ToString()); + Comprobante_FormaPago = uni_dec(rdr_enc["Comprobante_FormaPago"].ToString()); + double.TryParse(uni_dec(rdr_enc["Comprobante_Total"].ToString()), out Comprobante_Total); + double.TryParse(uni_dec(rdr_enc["Comprobante_SubTotal"].ToString()), out Comprobante_SubTotal); + double.TryParse(uni_dec(rdr_enc["Comprobante_Descuento"].ToString()), out Comprobante_Descuento); + double.TryParse(uni_dec(rdr_enc["Comprobante_TipoCambio"].ToString()), out Comprobante_TipoCambio); + Comprobante_Moneda = uni_dec(rdr_enc["Comprobante_Moneda"].ToString()); + if (Comprobante_Moneda != "XXX") + { + Comprobante_Moneda = Comprobante_Moneda == "P" || Comprobante_Moneda == "Pesos" ? "MXN" : Comprobante_Moneda; + Comprobante_Moneda = Comprobante_Moneda == "D" || Comprobante_Moneda == "Dolares" ? "USD" : Comprobante_Moneda; + } + Comprobante_Fecha = uni_dec(rdr_enc["Comprobante_Fecha"].ToString()); + Comprobante_Fecha = uni_dec(Comprobante_Fecha.Replace(" ", "T").Trim()); + Comprobante_Fecha = sys_fix_fecha(Comprobante_Fecha); + Comprobante_Serie = uni_dec(rdr_enc["Comprobante_Serie"].ToString()); + Comprobante_Folio = uni_dec(rdr_enc["Comprobante_Folio"].ToString()); + Comprobante_Estatus = uni_dec(rdr_enc["Comprobante_Estatus"].ToString()); + //-----Agregar ISR + string strComIsr = uni_dec(rdr_enc["Comprobante_ImporteISR"].ToString()); + string strComIsrPor = uni_dec(rdr_enc["Comprobante_ImporteISRPorcentaje"].ToString()); + if (strComIsr != "NA" && strComIsrPor != "NA") + { + double douComIsr = 0; + double douComIsrPor = 0; + double.TryParse(strComIsr, out douComIsr); + double.TryParse(strComIsrPor, out douComIsrPor); + Comprobante_Retencion.Add(new Comprobante_Impuesto + { + Impuesto = "001", + TipoFactor = "Tasa", + TasaOCuota = douComIsrPor * 0.01, + Importe = douComIsr, + Base = (CFDI4 ? Comprobante_SubTotal : 0) + }); + if (ComprobanteDBTipoComprobante.ToLower() == "anticipo" || ComprobanteDBTipoComprobante.ToLower() == "anticipo_egreso") + { + Comprobante_Partida_Retencion_Anticipo.Add(new ComprobantePartida_Impuesto + { + PartidaID = 1, + Base = Comprobante_SubTotal, + Impuesto = "001", + TipoFactor = "Tasa", + TasaOCuota = douComIsrPor * 0.01, + Importe = douComIsr + }); + } + } + + //-----Agregar IVA RET + string strComIvaRet = rdr_enc["Comprobante_ImporteIVARetenido"].ToString(); + string strComIvaRetPor = rdr_enc["Comprobante_ImporteIVARetenidoPorcentaje"].ToString(); + if (strComIvaRet != "NA" && strComIvaRetPor != "NA") + { + double douComIvaRet = 0; + double douComIvaRetPor = 0; + double.TryParse(strComIvaRet, out douComIvaRet); + double.TryParse(strComIvaRetPor, out douComIvaRetPor); + Comprobante_Retencion.Add(new Comprobante_Impuesto + { + Impuesto = "002", + TipoFactor = "Tasa", + TasaOCuota = douComIvaRetPor * 0.01, + Importe = douComIvaRet, + Base = (CFDI4 ? Comprobante_SubTotal : 0) + }); + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && (ComprobanteDBTipoComprobante.ToLower() == "anticipo" || ComprobanteDBTipoComprobante.ToLower() == "anticipo_egreso")) + { + Comprobante_Partida_Retencion_Anticipo.Add(new ComprobantePartida_Impuesto + { + PartidaID = 1, + Base = Comprobante_SubTotal, + Impuesto = "002", + TipoFactor = "Tasa", + TasaOCuota = douComIvaRetPor * 0.01, + Importe = douComIvaRet + }); + } + if (ComprobanteDBAplicacion.ToLower() == "servicemanager" && (ComprobanteDBTipoComprobante.ToLower() == "anticipo" || ComprobanteDBTipoComprobante.ToLower() == "anticipo_egreso")) + { + Comprobante_Partida_Retencion_Anticipo.Add(new ComprobantePartida_Impuesto + { + PartidaID = 1, + Base = Comprobante_SubTotal, + Impuesto = "002", + TipoFactor = "Tasa", + TasaOCuota = douComIvaRetPor * 0.01, + Importe = douComIvaRet + }); + } + } + + //-----Agregar IVA--------------------------------------------------------------------------------------- + string strComIva = uni_dec(rdr_enc["Comprobante_ImporteIVA"].ToString()); + string strComIvaPor = uni_dec(rdr_enc["Comprobante_ImporteIVAPorcentaje"].ToString()); + + + if (strComIva != "NA" && strComIvaPor != "NA") + { + double douComIva = 0; + double douComIvaPor = 0; + double Base_IVA = 0; + double Sub = 0; + + double.TryParse(strComIva, out douComIva); + double.TryParse(strComIvaPor, out douComIvaPor); + + if (CFDI4 && ComprobanteDBAplicacion.ToLower() == "cuentagastos" && (ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "pago")) + { + IVA_CERO_ENC = uni_dec(rdr_enc["IVA_CERO_ENC"].ToString()) == "0" ? false : true; + if (IVA_CERO_ENC) + { + double.TryParse(uni_dec(rdr_enc["Base_IVA"].ToString()), out Base_IVA); + + Sub = Base_IVA; + } + else { + Sub = Comprobante_SubTotal - Comprobante_Descuento; + } + + } + else + { + Sub = Comprobante_SubTotal - Comprobante_Descuento; + } + Comprobante_Traslado.Add(new Comprobante_Impuesto + { + Impuesto = "002", + TipoFactor = "Tasa", + TasaOCuota = douComIvaPor * 0.01, + Importe = douComIva, + Base = Sub + + }); + if (ComprobanteDBTipoComprobante.ToLower() == "anticipo" || ComprobanteDBTipoComprobante.ToLower() == "anticipo_egreso") + { + Comprobante_Partida_Traslado_Anticipo.Add(new ComprobantePartida_Impuesto + { + PartidaID = 1, + Base = Sub, + Impuesto = "002", + TipoFactor = "Tasa", + TasaOCuota = douComIvaPor * 0.01, + Importe = douComIva + }); + } + } + //Se anexa estructura para poder agregar solo cuando haya impuesto con 0% en CGII + + + if (CFDI4 && ComprobanteDBAplicacion.ToLower() == "cuentagastos" && ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") + { + double Importe_Cero = 0.00; + double.TryParse(uni_dec(rdr_enc["Importe_Cero"].ToString()), out Importe_Cero); + IVA_CERO_ENC = true; + Comprobante_Traslado.Add(new Comprobante_Impuesto + { + + Impuesto = "002", + TipoFactor = "Tasa", + TasaOCuota = 0 * 0.01, + Importe = 0, + Base = Importe_Cero + + }); + } + + if (strComIsrPor != "NA" || strComIvaRet != "NA") + { + double douComIvaRet = 0; + double douComIsr = 0; + double.TryParse(strComIvaRet, out douComIvaRet); + double.TryParse(strComIsr, out douComIsr); + Comprobante_TotalImpuestosRetenidos = douComIvaRet + douComIsr; + } + if (strComIva != "NA") + { + double.TryParse(strComIva, out Comprobante_TotalImpuestosTrasladados); + } + + if (ComprobanteDBTipoComprobante.ToLower() == "pago") + { + Pago10_FechaPago = uni_dec(rdr_enc["Pago10_FechaPago"].ToString()).Replace(" ", "T"); + Pago10_FormaDePagoP = uni_dec(rdr_enc["Pago10_FormaDePagoP"].ToString()); + Pago10_MonedaP = uni_dec(rdr_enc["Pago10_MonedaP"].ToString()); + Pago10_MonedaP = Pago10_MonedaP.ToLower() == "p" || Pago10_MonedaP.ToLower() == "pesos" ? "MXN" : Pago10_MonedaP; + Pago10_MonedaP = Pago10_MonedaP.ToLower() == "d" || Pago10_MonedaP.ToLower() == "dolares" ? "USD" : Pago10_MonedaP; + double.TryParse(uni_dec(rdr_enc["Pago10_TipoCambioP"].ToString()), out Pago10_TipoCambioP); + double.TryParse(uni_dec(rdr_enc["Pago10_Monto"].ToString()), out Pago10_Monto); + Pago10_NomBancoOrdExt = uni_dec(rdr_enc["Pago10_NomBancoOrdExt"].ToString()); + Pago10_CtaOrdenante = uni_dec(rdr_enc["Pago10_CtaOrdenante"].ToString()); + Pago10_CtaBeneficiario = uni_dec(rdr_enc["Pago10_CtaBeneficiario"].ToString()); + Pago10_TipoCadPago = uni_dec(rdr_enc["Pago10_TipoCadPago"].ToString()); + Pago10_CadPago = uni_dec(rdr_enc["Pago10_CadPago"].ToString()); + Pago10_CertPago = uni_dec(rdr_enc["Pago10_CertPago"].ToString()); + Pago10_SelloPago = uni_dec(rdr_enc["Pago10_SelloPago"].ToString()); + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + Pago10_NumeroOperacion = uni_dec(rdr_enc["Pago10_NumeroOperacion"].ToString()); + } + + Pago10_RfcEmisorCtaOrd = uni_dec(rdr_enc["Pago10_RfcEmisorCtaOrd"].ToString()); + Pago10_RfcEmisorCtaBen = uni_dec(rdr_enc["Pago10_RfcEmisorCtaBen"].ToString()); + + + } + if (ComprobanteDBTipoComprobante.ToLower() == "anticipo_egreso") + { + Comprobante_EstatusIngreso = uni_dec(rdr_enc["Comprobante_EstatusIngreso"].ToString()); + } + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + int.TryParse(uni_dec(rdr_enc["ComplementoNotaria"].ToString()), out ComplementoNotaria); + if (ComplementoNotaria == 1) + { + DescInmueble_TipoInmueble = uni_dec(rdr_enc["DescInmueble_TipoInmueble"].ToString()); + DescInmueble_Calle = uni_dec(rdr_enc["DescInmueble_Calle"].ToString()); + DescInmueble_NoExterior = uni_dec(rdr_enc["DescInmueble_NoExterior"].ToString()); + DescInmueble_NoInterior = uni_dec(rdr_enc["DescInmueble_NoInterior"].ToString()); + DescInmueble_Colonia = uni_dec(rdr_enc["DescInmueble_Colonia"].ToString()); + DescInmueble_Localidad = uni_dec(rdr_enc["DescInmueble_Localidad"].ToString()); + DescInmueble_Referencia = uni_dec(rdr_enc["DescInmueble_Referencia"].ToString()); + DescInmueble_Municipio = uni_dec(rdr_enc["DescInmueble_Municipio"].ToString()); + DescInmueble_Estado = uni_dec(rdr_enc["DescInmueble_Estado"].ToString()); + DescInmueble_Pais = uni_dec(rdr_enc["DescInmueble_Pais"].ToString()); + DescInmueble_CodigoPostal = uni_dec(rdr_enc["DescInmueble_CodigoPostal"].ToString()); + DatosOperacion_NumInstrumentoNotarial = uni_dec(rdr_enc["DatosOperacion_NumInstrumentoNotarial"].ToString()); + DatosOperacion_FechaInstNotarial = uni_dec(rdr_enc["DatosOperacion_FechaInstNotarial"].ToString()); + double.TryParse(uni_dec(rdr_enc["DatosOperacion_MontoOperacion"].ToString()), out DatosOperacion_MontoOperacion); + double.TryParse(uni_dec(rdr_enc["DatosOperacion_Subtotal"].ToString()), out DatosOperacion_Subtotal); + double.TryParse(uni_dec(rdr_enc["DatosOperacion_IVA"].ToString()), out DatosOperacion_IVA); + DatosNotario_CURP = uni_dec(rdr_enc["DatosNotario_CURP"].ToString()); + DatosNotario_NumNotaria = uni_dec(rdr_enc["DatosNotario_NumNotaria"].ToString()); + DatosNotario_EntidadFederativa = uni_dec(rdr_enc["DatosNotario_EntidadFederativa"].ToString()); + DatosNotario_Adscripcion = uni_dec(rdr_enc["DatosNotario_Adscripcion"].ToString()); + DatosEnajenante_CoproSocConyugalE = uni_dec(rdr_enc["DatosEnajenante_CoproSocConyugalE"].ToString()); + DatosAdquiriente_CoproSocConyugalE = uni_dec(rdr_enc["DatosAdquiriente_CoproSocConyugalE"].ToString()); + } + } + if (ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") + { + Comprobante_CuentaPredial = uni_dec(rdr_enc["Comprobante_CuentaPredial"].ToString()); + Comprobante_CondicionesDePago = uni_dec(rdr_enc["Comprobante_CondicionesDePago"].ToString()); + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + ConfigClienteClave = uni_dec(rdr_enc["ConfigClienteClave"].ToString()); + ConfigFacturaNombre = uni_dec(rdr_enc["ConfigFacturaNombre"].ToString()); + ConfigFacturaSufijo = uni_dec(rdr_enc["ConfigFacturaSufijo"].ToString()); + ConfigFacturaTipo = uni_dec(rdr_enc["ConfigFacturaTipo"].ToString()); + ConfigPedimentoTipo = uni_dec(rdr_enc["ConfigPedimentoTipo"].ToString()); + } + else + { + if (ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") { + //int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber(); + //MessageBox.Show("Factura egreso bms Linea "+ lineNumber); + ReceptorClienteV2 = uni_dec(rdr_enc["ReceptorClienteV2"].ToString()); + SinRelacionV2 = uni_dec(rdr_enc["SinRelacionV2"].ToString()) == "1" ? true : false; + } + + } + ComercioExterior_Activo = uni_dec(rdr_enc["ComercioExterior_Activo"].ToString()) == "1" ? true : false; + if (ComercioExterior_Activo) + { + cfdi33_timbrar_comercioexterior_data(); + cfdi33_validar_comercioexterior(); + } + } + + //rexcom + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "bms" && Receptor_Rfc == "AEM050110CF8") + { + PO = uni_dec(rdr_enc["Comprobante_PO"].ToString()); + } + + if (ComprobanteDBTipoComprobante.ToLower() == "factura_egresoglobal") + { + //CFDI_3_2 = uni_dec(rdr_enc["CFDI_3_2"].ToString()); + } + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + Complemento_Terceros = uni_dec(rdr_enc["Complemento_Terceros"].ToString()) == "1" ? true : false; + } + + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && Complemento_Terceros && ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + Numero_Pedimento_Terceros = uni_dec(rdr_enc["Terceros_PEDIMENTO"].ToString()); + Aduana_Terceros = uni_dec(rdr_enc["Terceros_Aduana"].ToString()); + Fecha_Pedimento_Terceros = uni_dec(rdr_enc["Terceros_FechaPedimento"].ToString()); + } + + //Carta Porte-------------------------- + if ((ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "traslado") && ComprobanteDBAplicacion.ToLower() != "cuentagastos") + { + CartaPorte = uni_dec(rdr_enc["CartaPorte"].ToString()) == "1" ? true : false; + } + + + //complemento INE + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "bms") + { + + + INE_Activo = uni_dec(rdr_enc["INE_Activo"].ToString()) == "1" ? true : false; + if (INE_Activo) + { + Comprobante_INE_TipoProceso = uni_dec(rdr_enc["TipoProceso"].ToString()); + Comprobante_INE_TipoComite = uni_dec(rdr_enc["TipoComite"].ToString()); + //if string.IsNullOrEmpty(Comprobante_INE_TipoComite) + int.TryParse(uni_dec(rdr_enc["IdContabilidad"].ToString()), out Comprobante_INE_IdContabilidad); + } + } + + + bolNoVac = true; + //cfdi33_validar_licencia(Emisor_Rfc); + } + if (!bolNoVac) + { + sys_mensaje_error("No existen comprobantes con el SysID " + ComprobanteDBSysId + ".", 1); + } + } + rdr_enc.Close(); + rdr_enc.Dispose(); + con_enc.Close(); + } + catch (SqlException Ex) + { + con_enc.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta del encabezado." + strErr, 1); + sql_err(Ex, "Enc", SysQueryEncabezado); + } + catch (Exception Ex) + { + if (con_enc != null) + { + con_enc.Close(); + } + sys_mensaje_error("Error al leer los datos del encabezado.", 1); + exe_err(Ex, "Enc"); + } + return bolNoVac; + } + #endregion cfdi33_data_encabezado + + //leer los datos de las partidas (Reader) + #region cfdi33_data_partidas + public bool cfdi33_data_partidas() + { + bool bolNoVac = false; + int intParID = 0; + SqlConnection con_par = new SqlConnection(sql_conexion()); + try + { + sql_log("Com_Par", SysQueryPartidas); + SqlCommand cmd_par = new SqlCommand(SysQueryPartidas, con_par); + cmd_par.CommandTimeout = 30; + con_par.Open(); + SqlDataReader rdr_par = cmd_par.ExecuteReader(); + if (rdr_par != null) + { + while (rdr_par.Read()) + { + intParID++; + int intParTra = 0; + int intParRet = 0; + double douCantidad = 0; + double douValorUnitario = 0; + double douDescuento = 0; + double douImporte = 0; + double douBase = 0; + double.TryParse(uni_dec(rdr_par["Cantidad"].ToString()), out douCantidad); + double.TryParse(uni_dec(rdr_par["Descuento"].ToString()), out douDescuento); + double.TryParse(uni_dec(rdr_par["ValorUnitario"].ToString()), out douValorUnitario); + + double.TryParse(uni_dec(rdr_par["Importe"].ToString()), out douImporte); + + //-------AGREGAR IVA + string strParIva = uni_dec(rdr_par["PartidaIVA"].ToString()); + string strParIvaPor = uni_dec(rdr_par["PartidaIVAPorcentaje"].ToString()); + + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + _TipoConcepto = uni_dec(rdr_par["TipoConcepto"].ToString()); + } + else + { + _TipoConcepto = "I"; + } + + int IVA_CERO_ = 0; + + + //iva al cero porciento. CGII + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDI4) + { + int.TryParse(rdr_par["IVA_CERO"].ToString(), out IVA_CERO_); + } + else if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && ComprobanteDBTipoComprobante.ToLower() == "factura_egreso" && CFDI4) + { + int.TryParse(rdr_par["IVA_CERO"].ToString(), out IVA_CERO_); + } + + + intParID++; + //descuento + douBase = douImporte - douDescuento; + + + + bool esObjetoImpCero = false; + bool parCCE = false; + if (CFDISis == "bms" && ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDI4) + { + esObjetoImpCero = uni_dec(rdr_par["ObjetoImp"].ToString()) == "01" ? true : false; + parCCE = uni_dec(rdr_par["ComercioExterior_Activo"].ToString()) == "1" ? true : false; + + if (strParIva == "NA" && strParIvaPor == "NA" && esObjetoImpCero && parCCE) + { + strParIva = "0"; + strParIvaPor = "0"; + + } + } + + if (strParIva != "NA" && strParIvaPor != "NA") + { + intParTra = 1; + double douParIva = 0; + double douParIvaPor = 0; + double.TryParse(uni_dec(strParIva), out douParIva); + double.TryParse(uni_dec(strParIvaPor), out douParIvaPor); + if (_TipoConcepto != "P") + { + Comprobante_Partida_Traslado.Add(new ComprobantePartida_Impuesto + { + PartidaID = intParID, + Base = douBase, + Impuesto = "002", + TipoFactor = "Tasa", + TasaOCuota = douParIvaPor * 0.01, + Importe = douParIva, + IVA_CERO = IVA_CERO_, + objOmp= uni_dec(rdr_par["ObjetoImp"].ToString()) + }); + } + else + { + Complemento_Partida_Terceros_Traslado.Add(new ComprobantePartida_Impuesto + { + PartidaID = intParID, + Base = douBase, + Impuesto = "002", + TipoFactor = "Tasa", + TasaOCuota = douParIvaPor * 0.01, + Importe = douParIva + }); + } + } + + //-----AGREGAR ISR + string strParIsr = rdr_par["PartidaISR"].ToString().Trim(); + string strParIsrPor = rdr_par["PartidaISRPorcentaje"].ToString().Trim(); + if (strParIsr != "NA" && strParIsrPor != "NA") + { + intParRet = 1; + double douParIsr = 0; + double douParIsrPor = 0; + double.TryParse(uni_dec(strParIsr), out douParIsr); + double.TryParse(uni_dec(strParIsrPor), out douParIsrPor); + if (_TipoConcepto != "P") + { + Comprobante_Partida_Retencion.Add(new ComprobantePartida_Impuesto + { + PartidaID = intParID, + Base = douBase, + Impuesto = "001", + TipoFactor = "Tasa", + TasaOCuota = douParIsrPor * 0.01, + Importe = douParIsr + }); + } + else + { + Complemento_Partida_Terceros_Retencion.Add(new ComprobantePartida_Impuesto + { + PartidaID = intParID, + Base = douBase, + Impuesto = "001", + TipoFactor = "Tasa", + TasaOCuota = douParIsrPor * 0.01, + Importe = douParIsr + }); + } + } + + //-----AGREGAR IVA RET + string strParIvaRet = rdr_par["PartidaIVARetenido"].ToString().Trim(); + string strParIvaRetPor = rdr_par["PartidaIVARetenidoPorcentaje"].ToString().Trim(); + if (strParIvaRet != "NA" && strParIvaRetPor != "NA") + { + intParRet = 1; + double douParIvaRet = 0; + double douParIvaRetPor = 0; + double.TryParse(uni_dec(strParIvaRet), out douParIvaRet); + double.TryParse(uni_dec(strParIvaRetPor), out douParIvaRetPor); + if (_TipoConcepto != "P") + { + Comprobante_Partida_Retencion.Add(new ComprobantePartida_Impuesto + { + PartidaID = intParID, + Base = douBase, + Impuesto = "002", + TipoFactor = "Tasa", + TasaOCuota = douParIvaRetPor * 0.01, + Importe = douParIvaRet + }); + } + else + { + Complemento_Partida_Terceros_Retencion.Add(new ComprobantePartida_Impuesto + { + PartidaID = intParID, + Base = douBase, + Impuesto = "002", + TipoFactor = "Tasa", + TasaOCuota = douParIvaRetPor * 0.01, + Importe = douParIvaRet + }); + } + } + string strDes = uni_dec(rdr_par["Descripcion"].ToString()); + + partidas_IEDU Partida_IEDU = new partidas_IEDU(); + //complento iedu que depende del ComprobantePartida + if (Complemento_IEDU_Activo) + { + Partida_IEDU.Comprobante_IEDU_NombreAlumno = uni_dec(rdr_par["Comprobante_IEDU_NombreAlumno"].ToString()); + Partida_IEDU.Comprobante_IEDU_CURP = uni_dec(rdr_par["Comprobante_IEDU_CURP"].ToString()); + Partida_IEDU.Comprobante_IEDU_nivelEducativo = uni_dec(rdr_par["Comprobante_IEDU_nivelEducativo"].ToString()); + Partida_IEDU.Comprobante_IEDU_autROVE = uni_dec(rdr_par["Comprobante_IEDU_autROVE"].ToString()); + Partida_IEDU.Comprobante_IEDU_rfcPago = uni_dec(rdr_par["Comprobante_IEDU_rfcPago"].ToString()); + } + + //complemento Terceros + partidas_Terceros_Cliente Partida_Cliente_Tercero = new partidas_Terceros_Cliente(); + if (Complemento_Terceros) + { + Partida_Cliente_Tercero.Partidas_Terceros_Activo = uni_dec(rdr_par["Complemento_Terceros_Activo"].ToString()) == "1" ? true : false; + + if (Partida_Cliente_Tercero.Partidas_Terceros_Activo) + { + Partida_Cliente_Tercero.Partidas_Terceros_Activo = true; + Partida_Cliente_Tercero.Clave_Cliente_Terceros = uni_dec(rdr_par["Cliente_Terceros"].ToString()); + Partida_Cliente_Tercero.RFC = uni_dec(rdr_par["RFC_Tercero"].ToString()); + Partida_Cliente_Tercero.NOMBREFISCAL = uni_dec(rdr_par["NOMBREFISCAL_Tercero"].ToString()); + Partida_Cliente_Tercero.DIRECCION = uni_dec(rdr_par["DIRECCION_Tercero"].ToString()); + Partida_Cliente_Tercero.NUMEROEXT = uni_dec(rdr_par["NUMEROEXT_Tercero"].ToString()); + Partida_Cliente_Tercero.NOINTERIOR = uni_dec(rdr_par["NOINTERIOR_Tercero"].ToString()); + Partida_Cliente_Tercero.COLONIA = uni_dec(rdr_par["COLONIA_Tercero"].ToString()); + Partida_Cliente_Tercero.CIUDAD = uni_dec(rdr_par["CIUDAD_Tercero"].ToString()); + Partida_Cliente_Tercero.ESTADO = uni_dec(rdr_par["ESTADO_Tercero"].ToString()); + Partida_Cliente_Tercero.PAIS = uni_dec(rdr_par["PAIS_Tercero"].ToString()); + Partida_Cliente_Tercero.CP = uni_dec(rdr_par["CP_Tercero"].ToString()); + } + } + + //-----------------------------------CFDI4 + string ObjetoImp_ = ""; + string RFC_Terceros_ = ""; + string Nombre_Terceros_ = ""; + string Regimen_Terceros_ = ""; + string Domicilio_Terceros_ = ""; + if (CFDI4) { + if (ComprobanteDBTipoComprobante.ToLower() == "pago") + { + //Como el concepto de los pagos es estatico se pone por default segun documentacion tecnica SATanico + ObjetoImp_ = "01"; + RFC_Terceros_ = ""; + Nombre_Terceros_ = ""; + Regimen_Terceros_ = ""; + Domicilio_Terceros_ = ""; + } + else { + ObjetoImp_ = uni_dec(rdr_par["ObjetoImp"].ToString()); + + if (ComprobanteDBTipoComprobante.ToLower() != "factura_egreso") + { + RFC_Terceros_ = uni_dec(rdr_par["RFC_Terceros"].ToString()); + Nombre_Terceros_ = uni_dec(rdr_par["Nombre_Terceros"].ToString()); + Regimen_Terceros_ = uni_dec(rdr_par["Regimen_Terceros"].ToString()); + Domicilio_Terceros_ = uni_dec(rdr_par["Domicilio_Terceros"].ToString()); + } + else { + RFC_Terceros_ = ""; + Nombre_Terceros_ = ""; + Regimen_Terceros_ = ""; + Domicilio_Terceros_ = ""; + } + + + } + + + } + //-----------------------------------CFDI4 + + if (_TipoConcepto != "P") + { + Comprobante_Partida.Add(new ComprobantePartida + { + PartidaID = intParID, + NoIdentificacion = uni_dec(rdr_par["NoIdentificacion"].ToString()) , + ClaveProdServ = uni_dec(rdr_par["ClaveProdServ"].ToString()), + Cantidad = douCantidad, + ClaveUnidad = uni_dec(rdr_par["ClaveUnidad"].ToString()), + Unidad = uni_dec(rdr_par["Unidad"].ToString()), + Descripcion = uni_dec(rdr_par["Descripcion"].ToString()), + Descuento = douDescuento, + ValorUnitario = douValorUnitario, + Importe = douImporte, + Traslados = intParTra, + Retenciones = intParRet, + TipoConcepto = _TipoConcepto, + Complemento_IEDU = Partida_IEDU, + Comp_Terceros = Partida_Cliente_Tercero, + + ObjetoImp = ObjetoImp_, + RFC_Terceros = RFC_Terceros_, + Nombre_Terceros = Nombre_Terceros_, + Regimen_Terceros = Regimen_Terceros_, + Domicilio_Terceros = Domicilio_Terceros_, + IVA_CERO = IVA_CERO_ + + + }); + + } + else + { + Comprobante_Partida_Terceros.Add(new ComprobantePartida + { + PartidaID = intParID, + NoIdentificacion = uni_dec(rdr_par["NoIdentificacion"].ToString()), + ClaveProdServ = uni_dec(rdr_par["ClaveProdServ"].ToString()), + Cantidad = douCantidad, + ClaveUnidad = uni_dec(rdr_par["ClaveUnidad"].ToString()), + Unidad = uni_dec(rdr_par["Unidad"].ToString()), + Descripcion = uni_dec(rdr_par["Descripcion"].ToString()), + Descuento = douDescuento, + ValorUnitario = douValorUnitario, + Importe = douImporte, + Traslados = intParTra, + Retenciones = intParRet, + TipoConcepto = _TipoConcepto, + Complemento_IEDU = Partida_IEDU, + Comp_Terceros = Partida_Cliente_Tercero, + IVA_CERO = IVA_CERO_ + + }); + } + bolNoVac = true; + if (ComercioExterior_Activo) + { + bool ComercioExterior_Activo_Par = uni_dec(rdr_par["ComercioExterior_Activo"].ToString()) == "1" ? true : false; + if (ComercioExterior_Activo_Par) + { + double.TryParse(uni_dec(rdr_par["CantidadAduana"].ToString()), out double douCantidadAduana); + double.TryParse(uni_dec(rdr_par["ValorUnitarioAduana"].ToString()), out double douValorUnitarioAduana); + double.TryParse(uni_dec(rdr_par["ValorDolares"].ToString()), out double douValorDolares); + lisComercioExterior_Mercancias.Add(new ComercioExterior_Mercancias_Mercancia + { + NoIdentificacion = uni_dec(rdr_par["NoIdentificacion"].ToString()), + FraccionArancelaria = uni_dec(rdr_par["FraccionArancelaria"].ToString()), + CantidadAduana = douCantidadAduana, + UnidadAduana = uni_dec(rdr_par["UnidadAduana"].ToString()), + ValorUnitarioAduana = douValorUnitarioAduana, + ValorDolares = douValorDolares, + DescripcionesEspecificas_Marca = uni_dec(rdr_par["DescripcionesEspecificas_Marca"].ToString()), + DescripcionesEspecificas_Modelo = uni_dec(rdr_par["DescripcionesEspecificas_Modelo"].ToString()), + DescripcionesEspecificas_SubModelo = uni_dec(rdr_par["DescripcionesEspecificas_SubModelo"].ToString()), + DescripcionesEspecificas_NumeroSerie = uni_dec(rdr_par["DescripcionesEspecificas_NumeroSerie"].ToString()) + }); + } + } + + } + if (!bolNoVac) + { + //agregar coneptos a anticipo por cliente (sin pedimentos) + if (ComprobanteDBTipoComprobante.ToLower() == "anticipo" || ComprobanteDBTipoComprobante.ToLower() == "anticipo_egreso") + { + int intEgr = ComprobanteDBTipoComprobante.ToLower() == "anticipo_egreso" ? 1 : 0; + intParID = 1; + cfid33_cg_anticipo_partida_constante(intEgr); + bolNoVac = true; + } + } + } + if (!bolNoVac) + { + sys_mensaje_error("No existen partidas del comprobante con el SysID " + ComprobanteDBSysId + ".", 1); + } + rdr_par.Close(); + rdr_par.Dispose(); + con_par.Close(); + } + catch (SqlException Ex) + { + con_par.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de las partidas." + strErr, 1); + sql_err(Ex, "Par", SysQueryPartidas); + } + catch (Exception Ex) + { + if (con_par != null) + { + con_par.Close(); + } + sys_mensaje_error("Error al leer los datos de las partidas.", 1); + exe_err(Ex, "Par"); + } + return bolNoVac; + } + #endregion cfdi33_data_partidas + + + + //leer datos del INE (Reader) + #region cfdi33_data_INE + public void cfdi33_data_INE() + { + SqlConnection con_ine = new SqlConnection(sql_conexion()); + try + { + sql_log("Com_INE", SysQueryINE); + SqlCommand cmd_ine = new SqlCommand(SysQueryINE, con_ine); + cmd_ine.CommandTimeout = 30; + con_ine.Open(); + SqlDataReader rdr_ine = cmd_ine.ExecuteReader(); + if (rdr_ine != null) + { + while (rdr_ine.Read()) + { + int.TryParse(uni_dec(rdr_ine["IdContabilidad"].ToString()), out int intIdContabilidad); + + string strClaveEntidad = uni_dec(rdr_ine["ClaveEntidad"].ToString()); + string strAmbito = uni_dec(rdr_ine["AMBITO"].ToString()); + Partida_INE.Add(new partidas_INE + { + IdContabilidad = intIdContabilidad, + ClaveEntidad = strClaveEntidad, + Ambito = strAmbito + }); + + } + } + rdr_ine.Close(); + rdr_ine.Dispose(); + con_ine.Close(); + + } + catch (SqlException Ex) + { + con_ine.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de Complemento INE Partidas." + strErr, 1); + sql_err(Ex, "Com_INE", SysQueryINE); + } + catch (Exception Ex) + { + if (con_ine != null) + { + con_ine.Close(); + } + sys_mensaje_error("Error al leer los datos de Complemento INE Partidas.", 1); + exe_err(Ex, "Com_INE"); + } + } + #endregion cfdi33_data_INE + + //leer los datos de relacionados + #region cfdi33_data_relacionados + public void cfdi33_data_relacionados() + { + SqlConnection con_rel = new SqlConnection(sql_conexion()); + try + { + sql_log("Doc_Rel", SysQueryRelacionados); + SqlCommand cmd_rel = new SqlCommand(SysQueryRelacionados, con_rel); + cmd_rel.CommandTimeout = 30; + con_rel.Open(); + SqlDataReader rdr_rel = cmd_rel.ExecuteReader(); + if (rdr_rel != null) + { + //se asigna la relacion + CfdiRelacionados.Clear(); + + CfdiRelacionados_TipoRelacion = ComprobanteDBTipoComprobante.ToLower() == "factura" ? "07" : CfdiRelacionados_TipoRelacion; + CfdiRelacionados_TipoRelacion = ComprobanteDBTipoComprobante.ToLower() == "factura_egreso" ? "02" : CfdiRelacionados_TipoRelacion; + CfdiRelacionados_TipoRelacion = ComprobanteDBTipoComprobante.ToLower() == "factura_egresoglobal" && !string.IsNullOrEmpty(CfdiRelacionados_TipoRelacion) ? CfdiRelacionados_TipoRelacion : "02"; + CfdiRelacionados_TipoRelacion = ComprobanteDBTipoComprobante.ToLower() == "traslado" ? "05" : CfdiRelacionados_TipoRelacion; + CfdiRelacionados_TipoRelacion = SinRelacionV2 ? "" : CfdiRelacionados_TipoRelacion; + //cfdiRelacionados_TipoRelacion = ComprobanteDBTipoComprobante.ToLower() == "retenciones" ? + while (rdr_rel.Read()) + { + + string strUUID = uni_dec(rdr_rel["UUID"].ToString()); + //Rexcom + //string CfdiRelacionados_TipoRelacion_2=string.Empty; + //CfdiRelacionados_TipoRelacion_2 = ComprobanteDBTipoComprobante.ToLower() == "traslado" ? "05" : CfdiRelacionados_TipoRelacion_2 ; + //CfdiRelacionados_TipoRelacion_2 = ComprobanteDBTipoComprobante.ToLower() == "factura_egreso" ? "02" : CfdiRelacionados_TipoRelacion_2; + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") + { + //CfdiRelacionados_TipoRelacion_2 = uni_dec(rdr_rel["TipoRelacion"].ToString()); + CfdiRelacionados_TipoRelacion = uni_dec(rdr_rel["TipoRelacion"].ToString()); + } + + if (ComprobanteDBAplicacion.ToLower() == "servicemanager" && ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") + { + //CfdiRelacionados_TipoRelacion_2 = uni_dec(rdr_rel["TipoRelacion"].ToString()); + CfdiRelacionados_TipoRelacion = uni_dec(rdr_rel["TipoRelacion"].ToString()); + } + //apartado para CGII y documento r + if ((ComprobanteDBAplicacion.ToLower() == "cuentagastos" || ComprobanteDBAplicacion.ToLower() == "servicemanager") && ComprobanteDBTipoComprobante.ToLower() == "pago") + { + //CfdiRelacionados_TipoRelacion_2 = uni_dec(rdr_rel["TipoRelacion"].ToString()); + CfdiRelacionados_TipoRelacion = uni_dec(rdr_rel["TipoRelacion"].ToString()); + } + else if ((ComprobanteDBAplicacion.ToLower() == "cuentagastos" || ComprobanteDBAplicacion.ToLower() == "servicemanager") && ComprobanteDBTipoComprobante.ToLower() == "factura") + { + //CfdiRelacionados_TipoRelacion_2 = uni_dec(rdr_rel["TipoRelacion"].ToString()) ; + CfdiRelacionados_TipoRelacion = uni_dec(rdr_rel["TipoRelacion"].ToString()); + } + + //cfdi relacionado + if (!string.IsNullOrEmpty(strUUID)) + { + CfdiRelacionados.Add(new CfdiRelacionado + { + + UUID = strUUID//, + //CfdiRelacionados_TipoRelacion = uni_dec(rdr_rel["TipoRelacion"].ToString()) + }); + } + } + } + else + { + sys_mensaje_error("No existen partidas de Comlemento INE con el SysID " + ComprobanteDBSysId + ".", 1); + } + + rdr_rel.Close(); + rdr_rel.Dispose(); + con_rel.Close(); + } + catch (SqlException Ex) + { + con_rel.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de documentos relacionados." + strErr, 1); + sql_err(Ex, "Doc_Rel", SysQueryRelacionados); + } + catch (Exception Ex) + { + if (con_rel != null) + { + con_rel.Close(); + } + sys_mensaje_error("Error al leer los datos de los documentos relacionados.", 1); + exe_err(Ex, "Doc_Rel"); + } + } + #endregion cfdi33_data_relacionados + + //leer los datos de pagos + #region cfdi33_data_pagos + public void cfdi33_data_pagos() + { + SqlConnection con_pag = new SqlConnection(sql_conexion()); + try + { + Pago10_Partidas.Clear(); + sql_log("Pag_Enc", SysQueryPago10); + SqlCommand cmd_pag = new SqlCommand(SysQueryPago10, con_pag); + cmd_pag.CommandTimeout = 30; + con_pag.Open(); + SqlDataReader rdr_pag = cmd_pag.ExecuteReader(); + if (rdr_pag != null) + { + while (rdr_pag.Read()) + { + double douTipoCambioDR; + int intNumParcialidad; + double douImpSaldoAnt; + double douImpPagado; + double douImpSaldoInsoluto; + double equivalencia = 0; + string Objimp_ = ""; + + double RET_BASEDR = 0; + string RET_IMPUESTODR = ""; + string RET_TIPOFACTORDR = ""; + double RET_TASAOCUOTADR = 0; + double RET_IMPORTEDR = 0; + + double TRAS_BASEDR = 0; + string TRAS_IMPUESTODR = ""; + string TRAS_TIPOFACTORDR = ""; + double TRAS_TASAOCUOTADR = 0; + double TRAS_IMPORTEDR = 0; + + double RET_BASEDR_1 = 0; + string RET_IMPUESTODR_1 = ""; + string RET_TIPOFACTORDR_1 = ""; + double RET_TASAOCUOTADR_1 = 0; + double RET_IMPORTEDR_1 = 0; + + double.TryParse(uni_dec(rdr_pag["TipoCambioDR"].ToString()), out douTipoCambioDR); + int.TryParse(uni_dec(rdr_pag["NumParcialidad"].ToString()), out intNumParcialidad); + double.TryParse(uni_dec(rdr_pag["ImpSaldoAnt"].ToString()), out douImpSaldoAnt); + double.TryParse(uni_dec(rdr_pag["ImpPagado"].ToString()), out douImpPagado); + double.TryParse(uni_dec(rdr_pag["ImpSaldoInsoluto"].ToString()), out douImpSaldoInsoluto); + bool IVA_CERO_ = false; + + + double Cantidad_IVA_Cero = 0; + + //CFDI40 + //Pago10_MonedaP.ToUpper() + if (CFDI4) { + + + int countIVACERO = 0; + + double.TryParse(uni_dec(rdr_pag["EquivalenciaDR"].ToString()), out equivalencia); + Objimp_ = uni_dec(rdr_pag["ObjetoImpDR"].ToString()); + double.TryParse(uni_dec(rdr_pag["RET_BASEDR"].ToString()), out RET_BASEDR); + RET_IMPUESTODR = uni_dec(rdr_pag["RET_IMPUESTODR"].ToString()); + RET_TIPOFACTORDR = uni_dec(rdr_pag["RET_TIPOFACTORDR"].ToString()); + double.TryParse(uni_dec(rdr_pag["RET_TASAOCUOTADR"].ToString()), out RET_TASAOCUOTADR); + double.TryParse(uni_dec(rdr_pag["RET_IMPORTEDR"].ToString()), out RET_IMPORTEDR); + + double.TryParse(uni_dec(rdr_pag["TRAS_BASEDR"].ToString()), out TRAS_BASEDR); + TRAS_IMPUESTODR = uni_dec(rdr_pag["TRAS_IMPUESTODR"].ToString()); + TRAS_TIPOFACTORDR = uni_dec(rdr_pag["TRAS_TIPOFACTORDR"].ToString()); + double.TryParse(uni_dec(rdr_pag["TRAS_TASAOCUOTADR"].ToString()), out TRAS_TASAOCUOTADR); + double.TryParse(uni_dec(rdr_pag["TRAS_IMPORTEDR"].ToString()), out TRAS_IMPORTEDR); + + double.TryParse(uni_dec(rdr_pag["RET_BASEDR_1"].ToString()), out RET_BASEDR_1); + RET_IMPUESTODR_1 = uni_dec(rdr_pag["RET_IMPUESTODR_1"].ToString()); + RET_TIPOFACTORDR_1 = uni_dec(rdr_pag["RET_TIPOFACTORDR_1"].ToString()); + double.TryParse(uni_dec(rdr_pag["RET_TASAOCUOTADR_1"].ToString()), out RET_TASAOCUOTADR_1); + double.TryParse(uni_dec(rdr_pag["RET_IMPORTEDR_1"].ToString()), out RET_IMPORTEDR_1); + + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + int.TryParse(uni_dec(rdr_pag["IVA_CERO_ENC"].ToString()), out countIVACERO); + + IVA_CERO_ENC = countIVACERO > 0 ? true : false; + + double.TryParse(uni_dec(rdr_pag["Cantidad_IVA_Cero"].ToString()), out Cantidad_IVA_Cero); + + IVA_CERO_ = countIVACERO > 0 ? true : false; + } + } + string strMonDr = uni_dec(rdr_pag["MonedaDR"].ToString()); + strMonDr = strMonDr.ToLower() == "p" || strMonDr.ToLower() == "pesos" ? "MXN" : strMonDr; + strMonDr = strMonDr.ToLower() == "d" || strMonDr.ToLower() == "dolares" ? "USD" : strMonDr; + //Pago_Partida + Pago10_Partidas.Add(new Pago10_Partida + { + IdDocumento = uni_dec(rdr_pag["IdDocumento"].ToString()), + Serie = uni_dec(rdr_pag["Serie"].ToString()), + Folio = uni_dec(rdr_pag["Folio"].ToString()), + MonedaDR = strMonDr, + TipoCambioDR = douTipoCambioDR, + MetodoDePagoDR = uni_dec(rdr_pag["MetodoDePagoDR"].ToString()), + NumParcialidad = intNumParcialidad, + ImpSaldoAnt = douImpSaldoAnt, + ImpPagado = douImpPagado, + ImpSaldoInsoluto = douImpSaldoInsoluto, + ObjetoImpDR = Objimp_, + EquivalenciaDR = equivalencia, + + RET_BASEDR = RET_BASEDR, + RET_IMPUESTODR = RET_IMPUESTODR, + RET_TIPOFACTORDR = RET_TIPOFACTORDR, + RET_TASAOCUOTADR = RET_TASAOCUOTADR, + RET_IMPORTEDR = RET_IMPORTEDR, + + TRAS_BASEDR = TRAS_BASEDR, + TRAS_IMPUESTODR = TRAS_IMPUESTODR, + TRAS_TIPOFACTORDR = TRAS_TIPOFACTORDR, + TRAS_TASAOCUOTADR = TRAS_TASAOCUOTADR, + TRAS_IMPORTEDR = TRAS_IMPORTEDR, + IVA_CERO = IVA_CERO_, + IVA_CERO_CANT = Cantidad_IVA_Cero, + + RET_BASEDR_1 = RET_BASEDR_1, + RET_IMPUESTODR_1 = RET_IMPUESTODR_1, + RET_TIPOFACTORDR_1 = RET_TIPOFACTORDR_1, + RET_TASAOCUOTADR_1 = RET_TASAOCUOTADR_1, + RET_IMPORTEDR_1 = RET_IMPORTEDR_1 + + + }); + } + } + else + { + sys_mensaje_error("No existen pagos con el SysID " + ComprobanteDBSysId + ".", 1); + } + rdr_pag.Close(); + rdr_pag.Dispose(); + con_pag.Close(); + } + catch (SqlException Ex) + { + con_pag.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta del pago." + strErr, 1); + sql_err(Ex, "Pag", SysQueryPago10); + } + catch (Exception Ex) + { + if (con_pag != null) + { + con_pag.Close(); + } + sys_mensaje_error("Error al leer los datos del pago.", 1); + exe_err(Ex, "Pag"); + } + } + #endregion cfdi33_data_relacionados + + //leer los datos de notaria + #region cfdi33_data_notaria + public void cfdi33_data_notaria() + { + SqlConnection con_not = new SqlConnection(sql_conexion()); + try + { + DatosCop.Clear(); + sql_log("Com_Not", SysQueryNotariosPublicos); + SqlCommand cmd_not = new SqlCommand(SysQueryNotariosPublicos, con_not); + cmd_not.CommandTimeout = 30; + con_not.Open(); + SqlDataReader rdr_not = cmd_not.ExecuteReader(); + if (rdr_not != null) + { + while (rdr_not.Read()) + { + double douPorcentaje = 0; + double.TryParse(uni_dec(rdr_not["Porcentaje"].ToString()), out douPorcentaje); + //Notarios Publicos Partidas + DatosCop.Add(new DatosCopSC + { + Nombre = uni_dec(rdr_not["Nombre"].ToString()), + ApellidoPaterno = uni_dec(rdr_not["ApellidoPaterno"].ToString()), + ApellidoMaterno = uni_dec(rdr_not["ApellidoMaterno"].ToString()), + RFC = uni_dec(rdr_not["RFC"].ToString()), + CURP = uni_dec(rdr_not["CURP"].ToString()), + Porcentaje = douPorcentaje, + Figura = uni_dec(rdr_not["Figura"].ToString()), + Tipo = uni_dec(rdr_not["Tipo"].ToString()) + }); + } + } + else + { + sys_mensaje_error("No existen datos de notaria el SysID " + ComprobanteDBSysId + ".", 1); + } + rdr_not.Close(); + rdr_not.Dispose(); + con_not.Close(); + } + catch (SqlException Ex) + { + con_not.Close(); + string strErr = sys_sql_error(Ex); + sys_mensaje_error("Error en la consulta de notaria." + strErr, 1); + sql_err(Ex, "Com_Not", SysQueryNotariosPublicos); + } + catch (Exception Ex) + { + if (con_not != null) + { + con_not.Close(); + } + exe_err(Ex, "Com_Not"); + sys_mensaje_error("Error al leer los datos de notaria.", 1); + } + } + #endregion cfdi33_data_relacionados + + //crear log sql + #region sql_log + public void sql_log(string strNom, string strSQL) + { + if (CFDILog == "Act") + { + string strDir = SysDir + "sql_log\\"; + string strArc = "sql_" + strNom + "_" + DateTime.Today.ToString("yyyyMMdd") + "_" + DateTime.Now.ToString("HHmmss") + ".sql"; + sys_mkdir(strDir); + System.IO.File.WriteAllText(strDir + strArc, strSQL); + } + } + #endregion sql_log + + //crear log de excepcion sql + #region sql_err + public void sql_err(SqlException Ex, string strNom, string strSQL) + { + string strDir = SysDir + "sql_err\\"; + string strArc1 = "sql_" + strNom + "_" + DateTime.Today.ToString("yyyyMMdd") + "_" + DateTime.Now.ToString("HHmmss") + ".sql"; + string strArc2 = "exe_" + strNom + "_" + DateTime.Today.ToString("yyyyMMdd") + "_" + DateTime.Now.ToString("HHmmss") + ".log"; + sys_mkdir(strDir); + System.IO.File.WriteAllText(strDir + strArc1, strSQL); + System.IO.File.WriteAllText(strDir + strArc2, Ex.ToString()); + enviar_error(strDir, strArc1); + enviar_error(strDir, strArc2); + } + #endregion sql_err + + //crear log de excepcion + #region exe_err + public void exe_err(Exception Ex, string strNom) + { + string strDir = SysDir + "app_err\\"; + string strArc = "app_" + strNom + "_" + DateTime.Today.ToString("yyyyMMdd") + "_" + DateTime.Now.ToString("HHmmss") + ".log"; + sys_mkdir(strDir); + System.IO.File.WriteAllText(strDir + strArc, Ex.ToString()); + enviar_error(strDir, strArc); + } + #endregion exe_err + + //enviar error + #region enviar error + public void enviar_error(string strDir, string strArc) + { + if (string.IsNullOrEmpty(SysEnvErr)) + { + SysEnvErr = MessageBox.Show("Se presento un error.\n¿Deseá enviarlo a Aduanasoft?", SysNombre, MessageBoxButtons.YesNo, MessageBoxIcon.Information).ToString(); + } + if (SysEnvErr == "Yes") + { + try + { + string strRfc = !string.IsNullOrEmpty(CFDIRfc) ? CFDIRfc + "_" : string.Empty; + string strSis = !string.IsNullOrEmpty(CFDISis) ? CFDISis + "_" : string.Empty; + FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FTPSrv + "/Herramientas/CFDI_Beta/Err/" + strRfc + strSis + strArc); + request.Credentials = new NetworkCredential(FTPUsr, FTPPwd); + request.Method = WebRequestMethods.Ftp.UploadFile; + + using (Stream fileStream = File.OpenRead(strDir + strArc)) + using (Stream ftpStream = request.GetRequestStream()) + { + fileStream.CopyTo(ftpStream); + } + } + catch + { + + } + } + } + #endregion enviar error + + //decificar unicode + #region unicode decode + public string uni_dec(string strUni) + { + if (string.IsNullOrEmpty(strUni)) + { + return strUni; + } + strUni = Regex.Replace(strUni, @"[\u000A\u000B\u000C\u000D\u2028\u2029\u0085]+", String.Empty); + string.Concat(strUni.Normalize(NormalizationForm.FormD).Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)); + strUni = strUni.Trim(); + return strUni; + } + #endregion uni to ascii + + //validar licencia + #region validar licencia + public void cfdi33_validar_licencia(string strRFC) + { + string strCon = @"\par \b Contacte a Aduanasoft:\b0 \par Para activar su sistema. \par Tel. (656) 616 2527"; + string strErrMen = string.Empty; + int intLic = 1; + if (!string.IsNullOrEmpty(strRFC)) + { + Cliente res = Clientes_Recibir.Find(buscar => buscar.RFC == strRFC); + try + { + if (res.Activo == 0) + { + strErrMen += "El RFC " + strRFC + " no está activo.\n"; + intLic = 0; + } + if ((ComprobanteDBAplicacion.ToLower() == "cuentagastos" && res.cg2 == 0) || (ComprobanteDBAplicacion.ToLower() == "servicemanager" && res.bms == 0)) + { + strErrMen += "El RFC " + strRFC + " no tiene licencia para este sistema.\n"; + intLic = 0; + } + } + catch + { + strErrMen += "El RFC " + strRFC + " no está autorizado para timbrar."; + intLic = 0; + } + } + else + { + sys_mensaje_error("Especifique un RFC para validar licencia.", 1); + } + if (intLic == 0) + { + sys_mensaje_error(strErrMen + strCon, 1); + } + } + #endregion validar licencia + + //validar configuracion + #region cfdi33 validar configuracion + public void cfdi33_validar_configuracion() + { + + //if (Emisor_Rfc.ToString() == "CORL651115978" || Emisor_Rfc.ToString() == "ROCL940924AT9") + //{ + //string CultureName = Thread.CurrentThread.CurrentCulture.Name; + //CultureInfo ci = new CultureInfo(CultureName); + + //if (ci.NumberFormat.NumberDecimalSeparator == ",") + //{ + // //Forcing use of decimal separator for numerical values + + // ci.NumberFormat.NumberDecimalSeparator = "."; + // ci.NumberFormat.NumberGroupSeparator = ","; + + // Thread.CurrentThread.CurrentCulture = ci; + // Thread.CurrentThread.CurrentUICulture = ci; + + //} + + + + //string strDecSepPun = ci.NumberFormat.NumberDecimalSeparator.ToString(); + //SysErrores = strDecSepPun != "." ? SysErrores + @"Tiene configurado """ + strDecSepPun + @""" como separador decimal por favor configure ""."". \par " : SysErrores; + //string strDecSepMil = ci.NumberFormat.NumberGroupSeparator.ToString(); + //SysErrores = strDecSepMil != "," ? SysErrores + @"Tiene configurado """ + strDecSepMil + @""" como separador de millares por favor configure "","". \par " : SysErrores; + //SysErrores = string.IsNullOrEmpty(CFDIMod) ? SysErrores + @"Pestaña 2: No ha seleccionado un modo de ejecución en configuración.\par " : SysErrores; + //SysErrores = string.IsNullOrEmpty(CFDIPac) ? SysErrores + @"Pestaña 2: No ha seleccionado un PAC en configuración.\par " : SysErrores; + //} + //else + //{ + + string strDecSepPun = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator.ToString(); + SysErrores = strDecSepPun != "." ? SysErrores + @"Tiene configurado """ + strDecSepPun + @""" como separador decimal por favor configure ""."". \par " : SysErrores; + string strDecSepMil = CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator.ToString(); + //MessageBox.Show("strDecSepPun " + strDecSepPun); + //MessageBox.Show("strDecSepMil " + strDecSepMil); + SysErrores = strDecSepMil != "," ? SysErrores + @"Tiene configurado """ + strDecSepMil + @""" como separador de millares por favor configure "","". \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(CFDIMod) ? SysErrores + @"Pestaña 2: No ha seleccionado un modo de ejecución en configuración.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(CFDIPac) ? SysErrores + @"Pestaña 2: No ha seleccionado un PAC en configuración.\par " : SysErrores; + + //} + } + #endregion cfdi33 validar configuracion + + //validar retencion + #region cfdi33 validar retencion + public void cfdi33_validar_retencion() + { + SysErrores = !Enumerable.Range(12, 13).Contains(Retenciones_Emisor_RFCEmisor.Length) || string.IsNullOrEmpty(Retenciones_Emisor_RFCEmisor) ? SysErrores + @"El RFC del Emisor debe tener de 12 a 13 caracteres.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Retenciones_Emisor_NomDenRazSocE) ? SysErrores + @"No especificó el nombre del Emisor. \par " : SysErrores; + + SysErrores = string.IsNullOrEmpty(Retenciones_Receptor_Nacionalidad) ? SysErrores + @"No especificó la nacionalidad del Receptor. \par " : SysErrores; + if (Retenciones_Receptor_Nacionalidad.ToLower() == "nacional") + { + SysErrores = string.IsNullOrEmpty(Retenciones_Receptor_Nacional_RFCRecep) ? SysErrores + @"No especificó el RFC del Receptor. \par " : SysErrores; + SysErrores = !Enumerable.Range(12, 13).Contains(Retenciones_Emisor_RFCEmisor.Length) || string.IsNullOrEmpty(Retenciones_Emisor_RFCEmisor) ? SysErrores + @"El RFC del Receptor debe tener de 12 a 13 caracteres.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Retenciones_Receptor_Nacional_NomDenRazSocR) ? SysErrores + @"No especificó el nombre del Receptor. \par " : SysErrores; + } + if (Retenciones_Receptor_Nacionalidad.ToLower() == "extranjero") + { + SysErrores = string.IsNullOrEmpty(Retenciones_Receptor_Extranjero_NumRegIdTrib) ? SysErrores + @"No especificó el número de identificación fiscal del Receptor. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Retenciones_Receptor_Extranjero_NomDenRazSocR) ? SysErrores + @"No especificó el nombre del Receptor. \par " : SysErrores; + } + + SysErrores = !Enumerable.Range(1, 12).Contains(Retenciones_Periodo_MesIni.ToString().Length) ? SysErrores + @"No especificó un número de mes valido inicio de Retención. \par " : SysErrores; + SysErrores = !Enumerable.Range(1, 12).Contains(Retenciones_Periodo_MesFin.ToString().Length) ? SysErrores + @"No especificó un número de mes valido final de Retención. \par " : SysErrores; + SysErrores = Retenciones_Periodo_Ejerc <= 2004 ? SysErrores + @"No especificó un año valido para periodo de Retención. \par " : SysErrores; + + foreach (var atr in Retenciones_Totales_ImpRetenidos) + { + SysErrores = atr.montoRet == 0 ? SysErrores + @"No especificó el importe del impuesto retenido en el periodo o ejercicio. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.TipoPagoRet) ? SysErrores + @"No especificó si el monto de la retención es considerado pago definitivo o pago provisional. \par " : SysErrores; + } + + SysErrores = Retenciones_Totales_MontoTotOperacion == 0 ? SysErrores + @"No especificó el monto total de la Operación. \par " : SysErrores; + //probable validacion + //SysErrores = (Retenciones_Totales_MontoTotGrav + Retenciones_Totales_MontoTotExent) != Retenciones_Totales_MontoTotOperacion ? SysErrores + @"Total Exento + Total Gravable debe ser igual a Total de la Operación. \par " : SysErrores; + SysErrores = Retenciones_Totales_MontoTotRet == 0 ? SysErrores + @"No especificó el monto total a retener. \par " : SysErrores; + + + SysErrores = string.IsNullOrEmpty(Retenciones_Version) ? SysErrores + @"No especificó la versión del estándar bajo el que se encuentra expresada la retención. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Comprobante_NoCertificado) ? SysErrores + @"No especificó el número de serie del certificado de sello digital. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Comprobante_Fecha) ? SysErrores + @"No especificó la fecha y hora de expedición del documento . \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Retenciones_CveRetenc) ? SysErrores + @"No especificó la clave de la retención e información de pagos. \par " : SysErrores; + + //complementos + if (!string.IsNullOrEmpty(Arrendamientoenfideicomiso_Version)) + { + SysErrores = Arrendamientoenfideicomiso_PagProvEfecPorFiduc == 0 ? SysErrores + @"No especificó el pago efectuado por parte del fiduciario. \par " : SysErrores; + SysErrores = Arrendamientoenfideicomiso_RendimFideicom == 0 && Arrendamientoenfideicomiso_DeduccCorresp == 0 ? SysErrores + @"No especificó los rendimientos o deducciones en el periodo por el arrendamiento de bienes. \par " : SysErrores; + } + if (!string.IsNullOrEmpty(Dividendos_Version)) + { + SysErrores = string.IsNullOrEmpty(Dividendos_DividOUtil_CveTipDivOUtil) ? SysErrores + @"No especificó la clave del tipo de dividendo. \par " : SysErrores; + SysErrores = Dividendos_DividOUtil_MontISRAcredRetMexico == 0 && Dividendos_DividOUtil_MontISRAcredRetExtranjero == 0 ? SysErrores + @"No especificó el importe o retención del dividendo en territorio nacional o en territorio extranjero. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Dividendos_DividOUtil_TipoSocDistrDiv) ? SysErrores + @"No especificó si el dividendo es distribuido por sociedades nacionales o extranjeras. \par " : SysErrores; + } + if (!string.IsNullOrEmpty(EnajenaciondeAcciones_Version)) + { + SysErrores = string.IsNullOrEmpty(EnajenaciondeAcciones_ContratoIntermediacion) ? SysErrores + @"No especificó el contrato intermediación. \par " : SysErrores; + SysErrores = EnajenaciondeAcciones_Ganancia == 0 && EnajenaciondeAcciones_Perdida == 0 ? SysErrores + @"No especificó la ganancia o pérdida obtenida por la enajenación de acciones. \par " : SysErrores; + } + if (!string.IsNullOrEmpty(Fideicomisonoempresarial_Version)) + { + if (!string.IsNullOrEmpty(Fideicomisonoempresarial_IngresosOEntradas_IntegracIngresos_Concepto)) + { + SysErrores = string.IsNullOrEmpty(Fideicomisonoempresarial_IngresosOEntradas_IntegracIngresos_Concepto) ? SysErrores + @"No especificó la descripción del concepto de ingresos. \par " : SysErrores; + SysErrores = Fideicomisonoempresarial_IngresosOEntradas_MontTotEntradasPeriodo == 0 ? SysErrores + @"No especificó el importe total de los ingresos del periodo. \par " : SysErrores; + SysErrores = Fideicomisonoempresarial_IngresosOEntradas_PartPropAcumDelFideicom == 0 ? SysErrores + @"No especificó la parte proporcional de los ingresos acumulables del periodo. \par " : SysErrores; + SysErrores = Fideicomisonoempresarial_IngresosOEntradas_PropDelMontTot == 0 ? SysErrores + @"No especificó la proporción de participación del fideicomisario o fideicomitente. \par " : SysErrores; + } + if (!string.IsNullOrEmpty(Fideicomisonoempresarial_DeduccOSalidas_IntegracEgresos_ConceptoS)) + { + SysErrores = string.IsNullOrEmpty(Fideicomisonoempresarial_DeduccOSalidas_IntegracEgresos_ConceptoS) ? SysErrores + @"No especificó la descripción del concepto de egresos de los fideicomisos. \par " : SysErrores; + SysErrores = Fideicomisonoempresarial_DeduccOSalidas_MontTotEgresPeriodo == 0 ? SysErrores + @"No especificó el importe total de los egresos del periodo de fideicomiso. \par " : SysErrores; + SysErrores = Fideicomisonoempresarial_DeduccOSalidas_PartPropDelFideicom == 0 ? SysErrores + @"No especificó la parte proporcional de las deducciones autorizadas del periodo. \par " : SysErrores; + SysErrores = Fideicomisonoempresarial_DeduccOSalidas_PropDelMontTot == 0 ? SysErrores + @"No especificó a proporción de participación del fideicomisario o fideicomitente. \par " : SysErrores; + } + SysErrores = Fideicomisonoempresarial_RetEfectFideicomiso_MontRetRelPagFideic == 0 ? SysErrores + @"No especificó el monto de la retenciones con relación al fideicomiso. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Fideicomisonoempresarial_RetEfectFideicomiso_DescRetRelPagFideic) ? SysErrores + @"No especificó la descripción de las retenciones. \par " : SysErrores; + } + if (!string.IsNullOrEmpty(Intereses_Version)) + { + + SysErrores = string.IsNullOrEmpty(Intereses_SistFinanciero) ? SysErrores + @"No especificó si los intereses obtenidos provienen del sistema financiero. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Intereses_RetiroAORESRetInt) ? SysErrores + @"No especificó si los intereses obtenidos fueron retirados en el periodo o ejercicio. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Intereses_OperFinancDerivad) ? SysErrores + @"No especificó si los intereses obtenidos fueron por operaciones financieras derivadas. \par " : SysErrores; + SysErrores = Intereses_MontIntNominal == 0 ? SysErrores + @"No especificó el importe del interés Nóminal obtenido en un periodo. \par " : SysErrores; + SysErrores = Intereses_MontIntReal == 0 && Intereses_Perdida == 0 ? SysErrores + @"No especificó el monto de los intereses reales o la pérdida por los intereses obtenidos. \par " : SysErrores; + } + if (!string.IsNullOrEmpty(Intereseshipotecarios_Version)) + { + SysErrores = string.IsNullOrEmpty(Intereseshipotecarios_CreditoDeInstFinanc) ? SysErrores + @"No especificó si el crédito otorgado fue por institución financiera. \par " : SysErrores; + SysErrores = Intereseshipotecarios_SaldoInsoluto == 0 ? SysErrores + @"No especificó el saldo insoluto al 31 de diciembre del ejercicio inmediato anterior. \par " : SysErrores; + } + if (!string.IsNullOrEmpty(Operacionesconderivados_Version)) + { + SysErrores = Operacionesconderivados_MontGanAcum == 0 && Operacionesconderivados_MontPerdDed == 0 ? SysErrores + @"No especificó el monto de la ganancia acumulable o la pérdida deducible. \par " : SysErrores; + } + if (!string.IsNullOrEmpty(Pagosaextranjeros_Version)) + { + SysErrores = string.IsNullOrEmpty(Pagosaextranjeros_NoBeneficiario_PaisDeResidParaEfecFisc) ? SysErrores + @"No especificó la clave del país de residencia del extranjero. \par " : SysErrores; + SysErrores = Pagosaextranjeros_NoBeneficiario_ConceptoPago == 0 ? SysErrores + @"No especificó el tipo contribuyente sujeto a la retención. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pagosaextranjeros_NoBeneficiario_DescripcionConcepto) ? SysErrores + @"No especificó la descripción de la definición del pago. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pagosaextranjeros_Beneficiario_RFC) ? SysErrores + @"No especificó el RFC del Beneficiario. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pagosaextranjeros_Beneficiario_CURP) ? SysErrores + @"No especificó la CURP del Beneficiario. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pagosaextranjeros_Beneficiario_NomDenRazSocB) ? SysErrores + @"No especificó el Nombre del Beneficiario. \par " : SysErrores; + SysErrores = Pagosaextranjeros_Beneficiario_ConceptoPago == 0 ? SysErrores + @"No especificó el tipo de contribuyente sujeto a la retención. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pagosaextranjeros_Beneficiario_DescripcionConcepto) ? SysErrores + @"No especificó la descripción de la definición del pago. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pagosaextranjeros_EsBenefEfectDelCobro) ? SysErrores + @"No especificó si el beneficiario del pago es la misma persona. \par " : SysErrores; + } + if (!string.IsNullOrEmpty(Planesderetiro_Version)) + { + SysErrores = string.IsNullOrEmpty(Planesderetiro_SistemaFinanc) ? SysErrores + @"No especificó si los planes personales de retiro son del sistema financiero. \par " : SysErrores; + SysErrores = Planesderetiro_MontIntRealesDevengAniooInmAnt == 0 ? SysErrores + @"No especificó el monto de los intereses percibidos durante el año inmediato anterior . \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Planesderetiro_HuboRetirosAnioInmAntPer) ? SysErrores + @"No especificó si se realizaron retiros de recursos invertidos antes de cumplir con la permanencia. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Planesderetiro_HuboRetirosAnioInmAnt) ? SysErrores + @"No especificó si se realizaron retiros en el ejercicio inmediato anterior. \par " : SysErrores; + } + if (!string.IsNullOrEmpty(Premios_Version)) + { + SysErrores = string.IsNullOrEmpty(Premios_EntidadFederativa) ? SysErrores + @"No especificó la entidad federativa en la que se paga el premio obtenido. \par " : SysErrores; + SysErrores = Premios_MontTotPago == 0 ? SysErrores + @"No especificó el importe del pago realizado por la obtención de un premio. \par " : SysErrores; + SysErrores = Premios_MontTotPagoGrav == 0 && Premios_MontTotPagoExent == 0 ? SysErrores + @"No especificó el importe gravado o el exento en la obtención de un premio. \par " : SysErrores; + } + if (!string.IsNullOrEmpty(SectorFinanciero_Version)) + { + SysErrores = string.IsNullOrEmpty(SectorFinanciero_IdFideicom) ? SysErrores + @"No especificó el Identificador o Número del Fideicomiso. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(SectorFinanciero_DescripFideicom) ? SysErrores + @"No especificó el Nombre del Fideicomiso. \par " : SysErrores; + } + } + #endregion cfdi33 validar retencion + + //validar datos de comercioexterior + #region cfdi33 validar comercioexterior + public void cfdi33_validar_comercioexterior() + { + //SysErrores = string.IsNullOrEmpty(ComercioExterior_TipoOperacion) ? SysErrores + @"No ha especificado el tipo de operación.\par " : SysErrores; + + SysErrores = string.IsNullOrEmpty(ComercioExterior_Emisor_Domicilio_Calle) ? SysErrores + @"No ha especificado la calle del emisor.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ComercioExterior_Emisor_Domicilio_Estado) ? SysErrores + @"No ha especificado el estado del emisor.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ComercioExterior_Emisor_Domicilio_Pais) ? SysErrores + @"No ha especificado país del emisor.\par " : SysErrores; + + if (CFDISis.ToLower() == "bms") + { + SysErrores = string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_Calle) ? SysErrores + @"No ha especificado la calle del receptor.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_Estado) ? SysErrores + @"No ha especificado el estado del receptor.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_Pais) ? SysErrores + @"No ha especificado el país del receptor.\par " : SysErrores; + } + + if (!string.IsNullOrEmpty(ComercioExterior_Destinatario_Domicilio_Calle)) + { + //SysErrores = string.IsNullOrEmpty(ComercioExterior_Destinatario_Domicilio_Calle) ? SysErrores + @"No ha especificado la calle del destinatario.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ComercioExterior_Destinatario_Domicilio_Estado) ? SysErrores + @"No ha especificado el estado del destinatario.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ComercioExterior_Destinatario_Domicilio_Pais) ? SysErrores + @"No ha especificado el país del destinatario.\par " : SysErrores; + } + + foreach (var atr in lisComercioExterior_Mercancias) + { + SysErrores = string.IsNullOrEmpty(atr.UnidadAduana) ? SysErrores + @"No especificó la unidad aduana. \par " : SysErrores; + SysErrores = atr.ValorDolares == 0 ? SysErrores + @"No especificó el Valor en dolares. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.DescripcionesEspecificas_Marca) ? SysErrores + @"No especificó la marca. \par " : SysErrores; + } + } + #endregion cfdi33 validar comercioexterior + + //validar datos del encabezado + #region cfdi33 validar encabezado + public void cfdi33_validar_encabezado() + { + SysErrores = string.IsNullOrEmpty(Comprobante_NoCertificado) ? SysErrores + @"No ha especificado un número de certificado.\par " : SysErrores; + if (ComprobanteDBTipoComprobante.ToLower() == "traslado") + { + //SysErrores = CfdiRelacionados.Count == 0 ? SysErrores + @"No se ha timbrado el ingreso del traslado o no es carta porte.\par " : SysErrores; + } + if (ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") + { + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + SysErrores = CfdiRelacionados.Count == 0 ? SysErrores + @"No se ha timbrado el ingreso de la factura.\par " : SysErrores; + } + else { + SysErrores = CfdiRelacionados.Count == 0 && SinRelacionV2==false ? SysErrores + @"No se ha timbrado el ingreso de la factura.\par " : SysErrores; + } + + } + if (ComprobanteDBTipoComprobante.ToLower() == "factura_egresoglobal") + { + SysErrores = CfdiRelacionados.Count == 0 ? SysErrores + @"No se ha timbrado el ingreso de la factura.\par " : SysErrores; + } + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" || ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + SysErrores = string.IsNullOrEmpty(ComprobanteDBRutaEntrada) || !Directory.Exists(ComprobanteDBRutaEntrada) ? SysErrores + @"No existe o no hay acceso a la ruta de Entrada de los XML.\par " : SysErrores; + SysErrores = Directory.Exists(ComprobanteDBRutaEntrada) && !HasWritePermissionOnDir(ComprobanteDBRutaEntrada) ? SysErrores + @"No hay permisos de escritura en la ruta de Entrada de los XML.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(ComprobanteDBRutaSalida) || !Directory.Exists(ComprobanteDBRutaSalida) ? SysErrores + @"No existe o no hay acceso a la ruta de Salida de los XML.\par " : SysErrores; + SysErrores = Directory.Exists(ComprobanteDBRutaSalida) && !HasWritePermissionOnDir(ComprobanteDBRutaSalida) ? SysErrores + @"No hay permisos de escritura en la ruta de Salida de los XML.\par " : SysErrores; + } + else + { + SysErrores = string.IsNullOrEmpty(ComprobanteDBRutaSalida) || !Directory.Exists(ComprobanteDBRutaSalida) ? SysErrores + @"No existe o no hay acceso a la ruta de los Comprobantes XML.\par " : SysErrores; + SysErrores = Directory.Exists(ComprobanteDBRutaSalida) && !HasWritePermissionOnDir(ComprobanteDBRutaSalida) ? SysErrores + @"No hay permisos de escritura en la ruta de los Comprobantes XML.\par " : SysErrores; + } + SysErrores = !Enumerable.Range(12, 13).Contains(Emisor_Rfc.Length) || string.IsNullOrEmpty(Emisor_Rfc) ? SysErrores + @"El RFC del Emisor debe tener de 12 a 13 caracteres.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Emisor_Nombre) ? SysErrores + @"No especificó el Nombre del Emisor.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Emisor_RegimenFiscal) ? SysErrores + @"No especificó el Regimén Fiscal del Emisor.\par " : SysErrores; + + SysErrores = !Enumerable.Range(12, 13).Contains(Receptor_Rfc.Length) || string.IsNullOrEmpty(Receptor_Rfc) ? SysErrores + @"El RFC del Receptor debe tener de 12 a 13 caracteres.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Receptor_Nombre) ? SysErrores + @"No especificó el Nombre del Receptor.\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Receptor_UsoCFDI) ? SysErrores + @"No especificó el Uso de CFDI por parte del Receptor.\par " : SysErrores; + + SysErrores = Comprobante_LugarExpedicion == 0 ? SysErrores + @"No especificó el Código Postal de Emisión. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Comprobante_TipoDeComprobante) ? SysErrores + @"No especificó el Tipo de Comprobante. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Comprobante_MetodoPago) ? SysErrores + @"No especificó el Método de Pago. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Comprobante_FormaPago) && ComprobanteDBTipoComprobante.ToLower() != "pago" ? SysErrores + @"No se especificó la forma de Pago. \par " : SysErrores; + + SysErrores = string.IsNullOrEmpty(Comprobante_Moneda) ? SysErrores + @"No especificó la moneda del Comprobante. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Comprobante_Fecha) ? SysErrores + @"No especificó la fecha del Comprobante. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Comprobante_Folio) ? SysErrores + @"No especificó el folio del Comprobante. \par " : SysErrores; + + foreach (var atr in Comprobante_Traslado) + { + SysErrores = string.IsNullOrEmpty(atr.Impuesto) ? SysErrores + @"No especificó la Clave del Impuesto Trasladado para el Comprobante. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.TipoFactor) ? SysErrores + @"No especificó el Tipo de Factor del Impuesto Trasladado para el Comprobante. \par " : SysErrores; + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && (ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "factura_egreso")) + { + SysErrores = atr.TasaOCuota == 0 && IVA_CERO_ENC == false ? SysErrores + @"No especificó la Tasa o Cuota del Impuesto Trasladado para el Comprobante. \par " : SysErrores; + SysErrores = atr.Importe == 0 && IVA_CERO_ENC == false ? SysErrores + @"No especificó el Importe del Impuesto Trasladado para el Comprobante. \par " : SysErrores; + } + else + { + SysErrores = atr.TasaOCuota == 0 ? SysErrores + @"No especificó la Tasa o Cuota del Impuesto Trasladado para el Comprobante. \par " : SysErrores; + SysErrores = atr.Importe == 0 ? SysErrores + @"No especificó el Importe del Impuesto Trasladado para el Comprobante. \par " : SysErrores; + } + + } + foreach (var atr in Comprobante_Retencion) + { + SysErrores = string.IsNullOrEmpty(atr.Impuesto) ? SysErrores + @"No especificó la Clave del Impuesto Retenido para el Comprobante. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.TipoFactor) ? SysErrores + @"No especificó el Tipo de Factor del Impuesto Retenido para el Comprobante. \par " : SysErrores; + SysErrores = atr.TasaOCuota == 0 ? SysErrores + @"No especificó la Tasa o Cuota del Impuesto Retenido para el Comprobante. \par " : SysErrores; + SysErrores = atr.Importe == 0 ? SysErrores + @"No especificó el Importe del Impuesto Retenido para el Comprobante. \par " : SysErrores; + } + if (ComprobanteDBTipoComprobante.ToLower() == "pago") + { + SysErrores = string.IsNullOrEmpty(Pago10_FechaPago) ? SysErrores + @"No especificó la Fecha de Pago. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pago10_MonedaP) ? SysErrores + @"No especificó la Moneda de Pago. \par " : SysErrores; + SysErrores = Pago10_Monto == 0 ? SysErrores + @"No especificó el Monto de Pago. \par " : SysErrores; + //transferncia interbancaria + /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////PAGO + if(Pago10_FormaDePagoP == "03") + { + SysErrores = string.IsNullOrEmpty(Pago10_NomBancoOrdExt) ? SysErrores + @"No especificó el Nombre del Banco Ordenante. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pago10_CtaOrdenante) ? SysErrores + @"No especificó la Cuenta Ordenante. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pago10_CtaBeneficiario) ? SysErrores + @"No especificó la Cuenta Beneficiaria. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pago10_TipoCadPago) ? SysErrores + @"No especificó el Tipo de Cadena de Pago. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pago10_CadPago) ? SysErrores + @"No especificó la Cadena de Pago. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pago10_CertPago) ? SysErrores + @"No especificó el Certificado de Pago. \par " : SysErrores; + SysErrores = string.IsNullOrEmpty(Pago10_SelloPago) ? SysErrores + @"No especificó el Sello de Pago. \par " : SysErrores; + } + */ + } + //validar datos de Complemento Terceros LVL Emcabezado Facturas + if (Complemento_Terceros && ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + if (!string.IsNullOrEmpty(Numero_Pedimento_Terceros)) + { + SysErrores = string.IsNullOrEmpty(Aduana_Terceros) ? SysErrores + @"Complemento Terceros:\n No se especificó la Aduana del Pedimento, checar facutra " + Comprobante_Folio : SysErrores; + SysErrores = string.IsNullOrEmpty(Fecha_Pedimento_Terceros) ? SysErrores + @"Complement Terceros:\n No se encontró Fecha Recepción del Pedimento, checar Cat. Pedimentos " + Numero_Pedimento_Terceros : SysErrores; + } + } + try + { + //validar rfc y vigencia + if (!string.IsNullOrEmpty(Comprobante_CertificadoSubject)) + { + string busrfc = Comprobante_CertificadoSubject.Replace("2.5.4.45=", "‖"); + string busvig = Comprobante_CertificadoSubject.Replace("[Not After]", "‖"); + string[] valrfc = busrfc.Split('‖'); + string cert_rfc = valrfc[1].Substring(0, 13).Trim(); + + string[] valvig = busvig.Split('‖'); + string cert_vig = valvig[1].Substring(0, 28).Trim(); + DateTime dtHoy = DateTime.Now; + DateTime dtExp = DateTime.Now; + DateTime.TryParse(cert_vig, CultureInfo.CreateSpecificCulture("en-US"), DateTimeStyles.None, out dtExp); + + TimeSpan t = dtExp - dtHoy; + double vig = (dtExp - dtHoy).TotalDays; + if (vig <= 30 && dtExp != DateTime.MinValue) + { + string strFecExp = dtExp.Day + " de " + sys_mes_nombre(dtExp.Month) + " de " + dtExp.Year + " a las " + dtExp.Hour + ":" + dtExp.Minute + ":" + dtExp.Second; + if (dtHoy > dtExp) + { + SysErrores = SysErrores + "El certificado ha expirado \\par Venció el " + strFecExp; + } + else + { + MessageBox.Show("El certificado esta por expirar.\nVence el " + strFecExp + "\nRenuévelo antes de su vencimiento.\nPara seguir generando comprobantes fiscales.", SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + SysErrores = cert_rfc != Emisor_Rfc && !string.IsNullOrEmpty(cert_rfc) && !string.IsNullOrEmpty(Emisor_Rfc) ? SysErrores + "El certificado fue expedido para el RFC: " + cert_rfc + @". \par " : SysErrores; + } + } + catch (Exception Ex) + { + MessageBox.Show("No se pudo analizar el certificado", SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Information); + exe_err(Ex, "Ana_Cer"); + } + } + #endregion cfdi33 validar encabezado + + //validar datos de partidas + #region cfdi33 validar partidas + public void cfdi33_validar_partidas() + { + + + //valdiar complemento notaria + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComplementoNotaria == 1 && ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + SysErrores = string.IsNullOrEmpty(DescInmueble_TipoInmueble) ? SysErrores + "No especificó el tipo de inmueble \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DescInmueble_Calle) ? SysErrores + "No especificó la calle \\par " : SysErrores; + /* + SysErrores = string.IsNullOrEmpty(DescInmueble_NoExterior) ? SysErrores + "No especificó el número exterior \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DescInmueble_Colonia) ? SysErrores + "No especificó la colonia \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DescInmueble_Localidad) ? SysErrores + "No especificó la localidad \\par " : SysErrores; + */ + SysErrores = string.IsNullOrEmpty(DescInmueble_Municipio) ? SysErrores + "No especificó el municipio \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DescInmueble_Estado) ? SysErrores + "No especificó el estado \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DescInmueble_Pais) ? SysErrores + "No especificó el país \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DescInmueble_CodigoPostal) ? SysErrores + "No especificó el código postal \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DatosOperacion_NumInstrumentoNotarial) ? SysErrores + "No especificó el número de instrumento notarial \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DatosOperacion_FechaInstNotarial) ? SysErrores + "No especificó la fecha del instrumento notarial \\par " : SysErrores; + SysErrores = DatosOperacion_MontoOperacion <= 0 ? SysErrores + "No especificó el monto de la operación \\par " : SysErrores; + SysErrores = DatosOperacion_Subtotal <= 0 ? SysErrores + "No especificó el subtotal \\par " : SysErrores; + + SysErrores = DatosNotario_CURP.Length != 18 || string.IsNullOrEmpty(DatosNotario_CURP) ? SysErrores + "La CURP del notario debe tener 18 caracteres. \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DatosNotario_NumNotaria) ? SysErrores + "No especificó el tipo de inmueble \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DatosNotario_EntidadFederativa) ? SysErrores + "No especificó el tipo de inmueble \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DatosNotario_Adscripcion) ? SysErrores + "No especificó el tipo de inmueble \\par " : SysErrores; + + SysErrores = string.IsNullOrEmpty(DatosEnajenante_CoproSocConyugalE) ? SysErrores + "No especificó si el enajentante es una Sociedad \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(DatosAdquiriente_CoproSocConyugalE) ? SysErrores + "No especificó si el adquiriente es una Sociedad \\par " : SysErrores; + + foreach (var atr in DatosCop) + { + string strTip = atr.Tipo == "Enajenante" ? "enajenante" : "adquiriente"; + SysErrores = string.IsNullOrEmpty(atr.Nombre) ? SysErrores + "No especificó el nombre del " + strTip + ". \\par " : SysErrores; + SysErrores = !Enumerable.Range(12, 13).Contains(atr.RFC.Length) || string.IsNullOrEmpty(atr.RFC) ? SysErrores + "El RFC de " + strTip + " debe tener 18 caracteres. \\par " : SysErrores; + if (atr.Figura.ToLower() == "fisica") + { + //Rexcom 28 + SysErrores = atr.CURP.Length > 18 ? SysErrores + "La CURP1 del " + strTip + " debe tener 18 caracteres. \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.ApellidoPaterno) ? SysErrores + "No especificó el apellido paterno del " + strTip + ". \\par " : SysErrores; + } + if ((DatosEnajenante_CoproSocConyugalE.ToLower() == "si" && strTip == "enajenante") || (DatosAdquiriente_CoproSocConyugalE.ToLower() == "si" && strTip == "adquiriente")) + { + SysErrores = atr.Porcentaje == 0 ? SysErrores + "No especificó el procentaje del " + strTip + ". \\par " : SysErrores; + } + } + } + + //Validar CFDI GLOBAL CGII + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && ES_GLOBAL) { + + SysErrores = string.IsNullOrEmpty(Comprobante_InfoGlo_Periodicidad) ? SysErrores + $"\\par CFDI GLOBAL 4.0:'{Comprobante_InfoGlo_Periodicidad}' No se especificó Periodicidad\\par" : SysErrores; + + SysErrores = string.IsNullOrEmpty(Comprobante_InfoGlo_Meses) ? SysErrores + $"\\par CFDI GLOBAL 4.0:{Comprobante_InfoGlo_Meses} No se especificó Meses\\par" : SysErrores; + + SysErrores = string.IsNullOrEmpty(Comprobante_InfoGlo_Anio) ? SysErrores + $"\\par CFDI GLOBAL 4.0:{Comprobante_InfoGlo_Anio} No se especificó Año\\par" : SysErrores; + + SysErrores = Comprobante_Receptor_DomicilioFiscal != Comprobante_LugarExpedicion.ToString() ? SysErrores + $"\\par CFDI GLOBAL 4.0: El Domicilio fiscal Receptor{Comprobante_Receptor_DomicilioFiscal} (CP) debe ser igual al del Emisor ({Comprobante_LugarExpedicion.ToString()}) para GLOBALES \\par" : SysErrores; + + SysErrores = Comprobante_Receptor_RegimenFiscal != "616" ? SysErrores + $"\\par CFDI GLOBAL 4.0: El Regimen para CFDI GLOBAL del Recptor debe ser 616\\par" : SysErrores; + + + + SysErrores = Receptor_Rfc != "XAXX010101000" ? SysErrores + $"\\par CFDI GLOBAL 4.0: El RFC Receptor {Receptor_Rfc} debe ser 'XAXX010101000' para CFDIs GLOBALES\\par" : SysErrores; + + SysErrores = Receptor_Nombre != "PUBLICO EN GENERAL" ? SysErrores + $"\\par CFDI GLOBAL 4.0: El Nombre Receptor {Receptor_Nombre} debe ser 'PUBLICO EN GENERAL' para CFDIs GLOBALES\\par" : SysErrores; + + // + SysErrores = Receptor_UsoCFDI != "S01" ? SysErrores + $"\\par CFDI GLOBAL 4.0: El UsoCFDI Receptor {Receptor_UsoCFDI} debe ser 'S01' para CFDIs GLOBALES\\par" : SysErrores; + + // + SysErrores = Comprobante_MetodoPago != "PUE" ? SysErrores + $"\\par CFDI GLOBAL 4.0: El Método Pago {Comprobante_MetodoPago} debe ser 'PUE' para CFDIs GLOBALES\\par" : SysErrores; + + SysErrores = Comprobante_FormaPago == "99" ? SysErrores + $"\\par CFDI GLOBAL 4.0: La forma Pago {Comprobante_FormaPago} debe ser la que se recibio al momento de enajenacion de bienes o servicios excepto '99' para CFDIs GLOBALES\\par" : SysErrores; + + + } + + + //validar partidas + foreach (var atr in Pago10_Partidas) + { + SysErrores = string.IsNullOrEmpty(atr.IdDocumento) ? SysErrores + "No especificó el ID Documento para el pago. \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.MonedaDR) ? SysErrores + "No especificó la Moneda del Documento para el pago. \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.MetodoDePagoDR) ? SysErrores + "No especificó el Método de Pago para el pago. \\par " : SysErrores; + /* se puede dejar en blanco */ + SysErrores = atr.ImpSaldoAnt == 0 ? SysErrores + "No especificó el Saldo Anterior. \\par " : SysErrores; + SysErrores = atr.ImpPagado == 0 ? SysErrores + "No especificó el Importe Pagado. \\par " : SysErrores; + + if (CFDI4) { + SysErrores = string.IsNullOrEmpty(atr.ObjetoImpDR) ? SysErrores + @"No se especifico El Objeto de Impuesto.\par" : SysErrores; + if (atr.ObjetoImpDR == "02" && !IVA_CERO_ENC) + { + //IVA RETENCION + if (!string.IsNullOrEmpty(atr.RET_IMPUESTODR)) + { + + SysErrores = atr.RET_BASEDR == 0 ? SysErrores + "La base de retencion IVA no puede ser cero.\\p" : SysErrores; + SysErrores = atr.RET_IMPORTEDR == 0 ? SysErrores + "El importe de retencion IVA no puede ser cero.\\p" : SysErrores; + SysErrores = atr.RET_TASAOCUOTADR == 0 ? SysErrores + "El total de porcentaje de impuesto retencion IVA no puede ser cero.\\p" : SysErrores; + + + } + //ISR + if (!string.IsNullOrEmpty(atr.RET_IMPUESTODR_1)) + { + SysErrores = atr.RET_BASEDR_1 == 0 ? SysErrores + "La base de retencion ISR no puede ser cero.\\p" : SysErrores; + SysErrores = atr.RET_IMPORTEDR_1 == 0 ? SysErrores + "El importe de retencion ISR no puede ser cero.\\p" : SysErrores; + SysErrores = atr.RET_TASAOCUOTADR_1 == 0 ? SysErrores + "El total de porcentaje de impuesto retencion ISR no puede ser cero.\\p" : SysErrores; + } + //IVA + if (!string.IsNullOrEmpty(atr.TRAS_IMPUESTODR)) + { + SysErrores = atr.TRAS_BASEDR == 0 ? SysErrores + "La base de IVA no puede ser cero.\\p" : SysErrores; + SysErrores = atr.TRAS_IMPORTEDR == 0 ? SysErrores + "El imorte de IVA no puede ser cero.\\p" : SysErrores; + SysErrores = atr.TRAS_TASAOCUOTADR == 0 ? SysErrores + "El total de porcentaje de impuesto IVA no puede ser cero.\\p" : SysErrores; + } + } + if (Pago10_MonedaP.ToUpper() != atr.MonedaDR.ToUpper()) + { + SysErrores = atr.EquivalenciaDR == 0 ? SysErrores + @"No se especifico la equivalencia .\par" : SysErrores; + } + } + } + + foreach (var atr in Comprobante_Partida) + { + SysErrores = string.IsNullOrEmpty(atr.ClaveProdServ) ? SysErrores + $"\\parNo especificó Clave del Producto o Servicio para la Partida { atr.PartidaID }\\par " : SysErrores; + SysErrores = atr.Cantidad == 0 ? SysErrores + $"\\par No especificó Cantidad para la Partida {atr.PartidaID}\\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.ClaveUnidad) ? SysErrores + $"\\par No especificó Clave de Unidad para la Partida {atr.PartidaID}\\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.Descripcion) ? SysErrores + $"\\par No especificó Descripción para la Partida {atr.PartidaID }\\par " : SysErrores; + + //------------------------------------CFDI4 + if (CFDI4 && ComprobanteDBTipoComprobante.ToLower() == "factura") { + SysErrores = string.IsNullOrEmpty(atr.ObjetoImp) ? SysErrores + $"\\par El concepto { atr.ClaveProdServ } del campo OBJETO IMPUESTO esta vacio.\\par " : SysErrores; + if (atr.ObjetoImp == "01" || atr.ObjetoImp == "03") + { + if (atr.Comp_Terceros.Partidas_Terceros_Activo) + { + SysErrores = string.IsNullOrEmpty(atr.RFC_Terceros) ? SysErrores + $"\\par El concepto:{atr.ClaveProdServ} del campo RFC TERCERO esta vacio.\\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.Nombre_Terceros) ? SysErrores + $"\\par El concepto:{atr.ClaveProdServ} del campo NOMBRE TERCERO esta vacio.\\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.Regimen_Terceros) ? SysErrores + $"\\par El concepto:{atr.ClaveProdServ} del campo REGIMEN TERCERO esta vacio.\\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.Domicilio_Terceros) ? SysErrores + $"\\par El concepto:{atr.ClaveProdServ } del campo DOMICILIO TERCERO esta vacio.\\par " : SysErrores; + } + + } + } + //----------------------------------- + //Validar Factura Globlal CGII + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && ES_GLOBAL) + { + + //Conceptos Validar: + // NoIdentificacion + // claveUnidad = ACT + // Descripcion = Venta + // ClaveProdServ = 01010101 + // CONCEPTOS + SysErrores = string.IsNullOrEmpty(atr.NoIdentificacion) ? SysErrores + $"\\par El concepto no tiene NOIDENTIFICACION: '{atr.NoIdentificacion } ' para CFDI GLOBALES 4.0\\par " : SysErrores; + + if (string.IsNullOrEmpty(atr.ClaveProdServ)) { + SysErrores = SysErrores + $"\\par El concepto no tiene Clave Producto/Servicio SAT: '{atr.ClaveProdServ}' para CFDI GLOBALES 4.0\\par "; + } else if (atr.ClaveProdServ != "01010101") + { + SysErrores = SysErrores + $"\\par El concepto tiene Clave Producto/Servicio SAT: '{atr.ClaveProdServ}' distinto a 01010101 para CFDI GLOBALES 4.0 \\par "; + } + + SysErrores = string.IsNullOrEmpty(atr.ClaveUnidad) || atr.ClaveUnidad !="ACT" ? SysErrores + $"\\par El concepto no tiene Clave Unidad: '{atr.ClaveUnidad}' o no es igual a 'ACT' para CFDI GLOBALES 4.0 \\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr.Descripcion) || atr.Descripcion !="Venta"? SysErrores + $"\\par El concepto no tiene Descripcion: '{atr.Descripcion}' o es diferente a 'Venta' para CFDI GLOBALES 4.0\\par " : SysErrores; + + + + } + + //if (ComprobanteDBTipoComprobante.ToLower() != "traslado") + //{ + //SysErrores = atr.ValorUnitario >= 0 ? SysErrores : SysErrores + "No especificó Valor Unitario numérico para la Partida " + atr.PartidaID + @"\par "; + //} + //if (ComprobanteDBTipoComprobante.ToLower() != "traslado") + //{ + //SysErrores = atr.Importe >= 0 ? SysErrores : SysErrores + "No especificó Valor Unitario numérico para la Partida " + atr.PartidaID + @"\par "; + //} + + } + foreach (var atr_tra in Comprobante_Partida_Traslado) + { + SysErrores = atr_tra.Base == 0 ? SysErrores + "No especificó la Base del Impuesto Trasladado para la Partida " + atr_tra.PartidaID + @"\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr_tra.Impuesto) ? SysErrores + "No especificó la Clave del Impuesto Trasladado para la Partida " + atr_tra.PartidaID + @"\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr_tra.TipoFactor) ? SysErrores + "No especificó el Tipo de Factor del Impuesto Trasladado para la Partida " + atr_tra.PartidaID + @"\par " : SysErrores; + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + SysErrores = atr_tra.TasaOCuota == 0 && atr_tra.IVA_CERO == 0 ? SysErrores + "No especificó la Tasa o Cuota del Impuesto Trasladado para la Partida " + atr_tra.PartidaID + @"\par " : SysErrores; + SysErrores = atr_tra.Importe == 0 && atr_tra.IVA_CERO == 0 ? SysErrores + "No especificó el Importe del Impuesto Trasladado para la Partida " + atr_tra.PartidaID + @"\par " : SysErrores; + } + else { + // SysErrores = atr_tra.TasaOCuota == 0 ? SysErrores + "No especificó la Tasa o Cuota del Impuesto Trasladado para la Partida " + atr_tra.PartidaID + @"\par " : SysErrores; + // SysErrores = atr_tra.Importe == 0 ? SysErrores + "No especificó el Importe del Impuesto Trasladado para la Partida " + atr_tra.PartidaID + @"\par " : SysErrores; + } + + } + foreach (var atr_ret in Comprobante_Partida_Retencion) + { + SysErrores = atr_ret.Base == 0 ? SysErrores + "No especificó la Base del Impuesto Retenido para la Partida " + atr_ret.PartidaID + @"\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr_ret.Impuesto) ? SysErrores + "No especificó la Clave del Impuesto Retenido para la Partida " + atr_ret.PartidaID + @"\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(atr_ret.TipoFactor) ? SysErrores + "No especificó el Tipo de Factor del Impuesto Retenido para la Partida " + atr_ret.PartidaID + @"\par " : SysErrores; + SysErrores = atr_ret.TasaOCuota == 0 ? SysErrores + "No especificó la Tasa o Cuota del Impuesto Retenido para la Partida " + atr_ret.PartidaID + @"\par " : SysErrores; + SysErrores = atr_ret.Importe == 0 ? SysErrores + "No especificó el Importe del Impuesto Retenido para la Partida " + atr_ret.PartidaID + @"\par " : SysErrores; + } + + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && Complemento_Terceros) + { + foreach (var terceros in Comprobante_Partida_Terceros) + { + if (terceros.Comp_Terceros.Partidas_Terceros_Activo) + { + SysErrores = terceros.Cantidad == 0 ? SysErrores + "\n Complemento Terceros: \n No se encontró cantidad de Concepto P, checar conceptos P " : SysErrores; + //SysErrores = string.IsNullOrEmpty(terceros.ClaveUnidad) ? SysErrores+"\n Complemento Terceros: \n No se encontró Clave Unidad Medida, checar conceptos P" : SysErrores; + SysErrores = string.IsNullOrEmpty(terceros.Descripcion) ? SysErrores + "\n Complemento Terceros: \n No se encontro el Descripcion concepto P ,Checar Concepto P " : SysErrores; + SysErrores = string.IsNullOrEmpty(terceros.Comp_Terceros.Clave_Cliente_Terceros) ? SysErrores + "\n Complemento Terceros: \n No se encontro el Nombre CLAVE del Cliente Terceros,Checar Partida Concepto P " + terceros.Comp_Terceros.Clave_Cliente_Terceros.ToString() + @"\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(terceros.Comp_Terceros.RFC) ? SysErrores + "\n Complemento Terceros : \n No se encontró el RFC del Cliente Terceros,Checar Catálogo con clave " + terceros.Comp_Terceros.Clave_Cliente_Terceros.ToString() + @"\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(terceros.Comp_Terceros.DIRECCION) ? SysErrores + "\n Complemento Terceros : \n No se encontró el Dirección del Cliente Terceros,Checar Catálogo con clave " + terceros.Comp_Terceros.Clave_Cliente_Terceros.ToString() + @"\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(terceros.Comp_Terceros.CIUDAD) ? SysErrores + "\nComplemento Terceros : \n No se encontró el Ciudad del Cliente Terceros,Checar Catálogo con clave " + terceros.Comp_Terceros.Clave_Cliente_Terceros.ToString() + @"\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(terceros.Comp_Terceros.ESTADO) ? SysErrores + "\nComplemento Terceros : \n No se encontró el Estado del Cliente Terceros,Checar Catálogo con clave " + terceros.Comp_Terceros.Clave_Cliente_Terceros.ToString() + @"\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(terceros.Comp_Terceros.PAIS) ? SysErrores + "\nComplemento Terceros : \n No se encontró el País del Cliente Terceros,Checar Catálogo con clave " + terceros.Comp_Terceros.Clave_Cliente_Terceros.ToString() + @"\par " : SysErrores; + SysErrores = string.IsNullOrEmpty(terceros.Comp_Terceros.CP) ? SysErrores + "\nComplemento Terceros : \n No se encontró el C.P. del Cliente Terceros,Checar Catálogo con clave " + terceros.Comp_Terceros.Clave_Cliente_Terceros.ToString() + @"\par " : SysErrores; + } + } + + foreach (var Terceros_Partidas in Complemento_Partida_Terceros_Traslado) + { + if (Terceros_Partidas.PartidaID != 0) + { + SysErrores = Terceros_Partidas.TasaOCuota == 0 ? SysErrores + "\n Complemento Terceros: \n No se pudo leer Tasa o Cuota del Impuesto Traslado para la partida " + @"\par " : SysErrores; + SysErrores = Terceros_Partidas.Importe == 0 ? SysErrores + "\n Complemento Terceros: \n No se puedo leer el importe del Impuesto Traslado de la partida " + @"\par" : SysErrores; + } + } + foreach (var Terceros_Partidas_Retencion in Complemento_Partida_Terceros_Retencion) + { + if (Terceros_Partidas_Retencion.PartidaID != 0) + { + SysErrores = Terceros_Partidas_Retencion.TasaOCuota == 0 ? SysErrores + "\n Complemento Terceros: \n No se pudo leer Tasa o Cuota del Impuesto Retención para la partida " + @"\par " : SysErrores; + SysErrores = Terceros_Partidas_Retencion.Importe == 0 ? SysErrores + "\n Complemento Terceros: \n No se puedo leer el importe del Impuesto Retención de la partida " + @"\par" : SysErrores; + } + + } + } + + } + #endregion cfdi33 validar partidas + + //validar permisos en directorio + #region permisos en directorio + public bool HasWritePermissionOnDir(string path) + { + var writeAllow = false; + var writeDeny = false; + try + { + + var accessControlList = Directory.GetAccessControl(path); + if (accessControlList == null) + return false; + var accessRules = accessControlList.GetAccessRules(true, true, + typeof(System.Security.Principal.SecurityIdentifier)); + if (accessRules == null) + return false; + + foreach (FileSystemAccessRule rule in accessRules) + { + if ((FileSystemRights.Write & rule.FileSystemRights) != FileSystemRights.Write) + continue; + + if (rule.AccessControlType == AccessControlType.Allow) + writeAllow = true; + else if (rule.AccessControlType == AccessControlType.Deny) + writeDeny = true; + } + } + catch (Exception Ex) + { + exe_err(Ex, "Per_Dir"); + } + return writeAllow && !writeDeny; + } + #endregion permisos en directorio + + //directori xml y nombre de archivo + #region cfdi33 xml nombre + public void cfdi33_xml_nombre() + { + + string[] pre = Comprobante_Fecha.Replace(" ", "-").Replace("T", "-").Split('-'); + if (pre.Count() > 2) + { + string strSer = string.IsNullOrEmpty(Comprobante_Serie) ? string.Empty : Comprobante_Serie; + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + /* + //nomeclatura envio por correo cg2 + //descartado a peticion + int intMonth; + int intDay; + int.TryParse(pre[1], out intMonth); + int.TryParse(pre[1], out intDay); + sys_mkdir(ComprobanteDBRutaEntrada); + sys_mkdir(ComprobanteDBRutaEntrada + "\\" + pre[0]); + sys_mkdir(ComprobanteDBRutaEntrada + "\\" + pre[0] + "\\" + pre[1]); + string archivo = string.Empty; + if (ComprobanteDBTipoComprobante.ToLower() == "factura" ) + { + if(ConfigFacturaTipo.ToLower() == "m") + { + archivo = "\\" + pre[0] + "\\" + sys_mes_nombre(intMonth) + "\\" + intDay + "\\" + Emisor_Rfc + "_" + strSer + Comprobante_Folio; + } + else + { + ConfigFacturaSufijo = ConfigPedimentoTipo.ToLower() == "v" ? "VARIOS" : ConfigFacturaSufijo; + archivo = "\\" + pre[0] + "\\" + sys_mes_nombre(intMonth) + "\\" + intDay + "\\" + ConfigFacturaNombre + "-" + ConfigClienteClave + "-" + pre[2] + pre[1] + pre[0] + "-" + strSer + Comprobante_Folio + "-" + ConfigFacturaSufijo; + } + sys_mkdir(ComprobanteDBRutaEntrada + "\\" + pre[0] + "\\" + sys_mes_nombre(intMonth)); + sys_mkdir(ComprobanteDBRutaEntrada + "\\" + pre[0] + "\\" + sys_mes_nombre(intMonth) + "\\" + intDay); + sys_mkdir(ComprobanteDBRutaSalida + "\\" + pre[0] + "\\" + sys_mes_nombre(intMonth)); + sys_mkdir(ComprobanteDBRutaSalida + "\\" + pre[0] + "\\" + sys_mes_nombre(intMonth) + "\\" + intDay); + } + else + { + archivo = "\\" + pre[0] + "\\" + pre[1] + "\\Folio-" + strSer + Comprobante_Folio; + sys_mkdir(ComprobanteDBRutaEntrada); + sys_mkdir(ComprobanteDBRutaEntrada + "\\" + pre[0]); + sys_mkdir(ComprobanteDBRutaEntrada + "\\" + pre[0] + "\\" + pre[1]); + sys_mkdir(ComprobanteDBRutaSalida); + sys_mkdir(ComprobanteDBRutaSalida + "\\" + pre[0]); + sys_mkdir(ComprobanteDBRutaSalida + "\\" + pre[0] + "\\" + pre[1]); + } + */ + + string archivo = string.Empty; + sys_mkdir(ComprobanteDBRutaEntrada); + sys_mkdir(ComprobanteDBRutaEntrada + "\\" + ComprobanteDBTipoComprobante); + sys_mkdir(ComprobanteDBRutaEntrada + "\\" + ComprobanteDBTipoComprobante + "\\" + pre[0]); + sys_mkdir(ComprobanteDBRutaEntrada + "\\" + ComprobanteDBTipoComprobante + "\\" + pre[0] + "\\" + pre[1]); + sys_mkdir(ComprobanteDBRutaEntrada + "\\" + ComprobanteDBTipoComprobante + "\\" + pre[0] + "\\" + pre[1] + "\\" + pre[2]); + sys_mkdir(ComprobanteDBRutaSalida); + sys_mkdir(ComprobanteDBRutaSalida + "\\" + ComprobanteDBTipoComprobante); + sys_mkdir(ComprobanteDBRutaSalida + "\\" + ComprobanteDBTipoComprobante + "\\" + pre[0]); + sys_mkdir(ComprobanteDBRutaSalida + "\\" + ComprobanteDBTipoComprobante + "\\" + pre[0] + "\\" + pre[1]); + sys_mkdir(ComprobanteDBRutaSalida + "\\" + ComprobanteDBTipoComprobante + "\\" + pre[0] + "\\" + pre[1] + "\\" + pre[2]); + archivo = "\\" + ComprobanteDBTipoComprobante + "\\" + pre[0] + "\\" + pre[1] + "\\" + pre[2] + "\\" + Comprobante_Folio; + if (ComprobanteDBTipoComprobante.ToLower() == "factura") + { + archivo = archivo + ConfigFacturaNombre; + } + ComprobanteDBArchivo = ComprobanteDBRutaEntrada + archivo + ".xml"; + ComprobanteDBArchivoTimbrado = ComprobanteDBRutaSalida + archivo + ".xml"; + ComprobanteDBArchivoTimbrado = ComprobanteDBOperacion.ToLower() == "cancelar" ? ComprobanteDBArchivoTimbrado.Replace(".xml", "_cancelacion.xml") : ComprobanteDBArchivoTimbrado; + } + else + { + string strPre = string.Empty; + strPre = ComprobanteDBTipoComprobante.ToLower() == "traslado" ? "Traslado" : strPre; + strPre = ComprobanteDBTipoComprobante.ToLower() == "factura" ? "Folio" : strPre; + strPre = ComprobanteDBTipoComprobante.ToLower() == "notacredito" ? "Nota" : strPre; + strPre = ComprobanteDBTipoComprobante.ToLower() == "factura_egreso" ? "Egreso" : strPre; + strPre = ComprobanteDBTipoComprobante.ToLower() == "anticipo_egreso" ? "Egreso_Anticipo" : strPre; + strPre = string.IsNullOrEmpty(strPre) ? ComprobanteDBTipoComprobante : strPre; + sys_mkdir(ComprobanteDBRutaSalida); + //string archivo = "\\" + pre[0] + "\\" + pre[1] + "\\Folio" + Comprobante_Serie + Comprobante_Folio; + string archivo = "\\" + pre[0] + "\\" + pre[1] + "\\" + strPre + Comprobante_Folio; + sys_mkdir(ComprobanteDBRutaSalida + "\\" + pre[0]); + sys_mkdir(ComprobanteDBRutaSalida + "\\" + pre[0] + "\\" + pre[1]); + ComprobanteDBArchivo = ComprobanteDBRutaEntrada + archivo + ".xml"; + ComprobanteDBArchivoTimbrado = ComprobanteDBRutaSalida + archivo + "_t.xml"; + ComprobanteDBArchivoTimbrado = ComprobanteDBOperacion.ToLower() == "cancelar" ? ComprobanteDBArchivoTimbrado.Replace("_t.xml", "_cancelacion.xml") : ComprobanteDBArchivoTimbrado; + } + } + else + { + SysErrores = "Error la fecha de emisión debe tener el formato yyyy-mm-dd hh:mm:ss.\n"; + } + } + #endregion cfdi33 xml nombre + + //generar xml retencion + #region cfdi33 xmlret + public void cfdi33_xmlret() + { + string strDec = CFDI4 ? "n2" : "n6"; + if (string.IsNullOrEmpty(Comprobante_Sello)) + { + sys_estatus("Generando Comprobante..."); + } + //se llenan primero los complementos para poder concatenar los xmlns y el schemaLocation + XNamespace _Retenciones = CFDI4 ? "http://www.sat.gob.mx/esquemas/retencionpago/2" : "http://www.sat.gob.mx/esquemas/retencionpago/1"; + XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; + string strSchLoc = CFDI4 ? "http://www.sat.gob.mx/esquemas/retencionpago/2 http://www.sat.gob.mx/esquemas/retencionpago/2/retencionpagov2.xsd" + : "http://www.sat.gob.mx/esquemas/retencionpago/1 http://www.sat.gob.mx/esquemas/retencionpago/1/retencionpagov1.xsd"; + + XElement Retenciones = new XElement(_Retenciones + "Retenciones"); + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "retenciones", _Retenciones)); + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "xsi", xsi)); + + //complemento + #region complemento + + XElement Complemento = new XElement(_Retenciones + "Complemento"); + + //complemento Arrendamientoenfideicomiso + #region complemento Arrendamientoenfideicomiso + if (!string.IsNullOrEmpty(Arrendamientoenfideicomiso_Version)) + { + strSchLoc += " http://www.sat.gob.mx/esquemas/retencionpago/1/arrendamientoenfideicomiso http://www.sat.gob.mx/esquemas/retencionpago/1/arrendamientoenfideicomiso/arrendamientoenfideicomiso.xsd"; + XNamespace _Arrendamientoenfideicomiso = "http://www.sat.gob.mx/esquemas/retencionpago/1/arrendamientoenfideicomiso"; + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "arrendamientoenfideicomiso", _Arrendamientoenfideicomiso)); + + XElement Arrendamientoenfideicomiso = new XElement(_Arrendamientoenfideicomiso + "Arrendamientoenfideicomiso"); + Arrendamientoenfideicomiso.Add(new XAttribute("Version", Arrendamientoenfideicomiso_Version)); + Arrendamientoenfideicomiso.Add(new XAttribute("PagProvEfecPorFiduc", Arrendamientoenfideicomiso_PagProvEfecPorFiduc.ToString(strDec).Replace(",", string.Empty))); + Arrendamientoenfideicomiso.Add(new XAttribute("RendimFideicom", Arrendamientoenfideicomiso_RendimFideicom.ToString(strDec).Replace(",", string.Empty))); + Arrendamientoenfideicomiso.Add(new XAttribute("DeduccCorresp", Arrendamientoenfideicomiso_DeduccCorresp.ToString(strDec).Replace(",", string.Empty))); + if (Arrendamientoenfideicomiso_MontTotRet > 0) + { + Arrendamientoenfideicomiso.Add(new XAttribute("MontTotRet", Arrendamientoenfideicomiso_MontTotRet.ToString(strDec).Replace(",", string.Empty))); + } + if (Arrendamientoenfideicomiso_MontResFiscDistFibras > 0) + { + Arrendamientoenfideicomiso.Add(new XAttribute("MontResFiscDistFibras", 1)); + } + if (Arrendamientoenfideicomiso_MontOtrosConceptDistr > 0) + { + Arrendamientoenfideicomiso.Add(new XAttribute("MontOtrosConceptDistr", Arrendamientoenfideicomiso_MontOtrosConceptDistr.ToString(strDec).Replace(",", string.Empty))); + } + if (!string.IsNullOrEmpty(Arrendamientoenfideicomiso_DescrMontOtrosConceptDistr)) + { + Arrendamientoenfideicomiso.Add(new XAttribute("DescrMontOtrosConceptDistr", Arrendamientoenfideicomiso_DescrMontOtrosConceptDistr)); + } + + Complemento.Add(Arrendamientoenfideicomiso); + } + #endregion complemento Arrendamientoenfideicomiso + + //complemento Dividendos + #region complemento Dividendos + if (!string.IsNullOrEmpty(Dividendos_Version)) + { + strSchLoc += " http://www.sat.gob.mx/esquemas/retencionpago/1/dividendos http://www.sat.gob.mx/esquemas/retencionpago/1/dividendos/dividendos.xsd"; + XNamespace _Dividendos = "http://www.sat.gob.mx/esquemas/retencionpago/1/dividendos"; + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "dividendos", _Dividendos)); + + XElement Dividendos = new XElement(_Dividendos + "Dividendos"); + Dividendos.Add(new XAttribute("Version", Dividendos_Version)); + + XElement DividOUtil = new XElement(_Dividendos + "Remanente"); + DividOUtil.Add(new XAttribute("CveTipDivOUtil", Dividendos_DividOUtil_CveTipDivOUtil)); + DividOUtil.Add(new XAttribute("MontISRAcredRetMexico", Dividendos_DividOUtil_MontISRAcredRetMexico.ToString(strDec).Replace(",", string.Empty))); + DividOUtil.Add(new XAttribute("MontISRAcredRetExtranjero", Dividendos_DividOUtil_MontISRAcredRetExtranjero.ToString(strDec).Replace(",", string.Empty))); + if (Dividendos_DividOUtil_MontRetExtDivExt > 0) + { + DividOUtil.Add(new XAttribute("MontRetExtDivExt", Dividendos_DividOUtil_MontRetExtDivExt.ToString(strDec).Replace(",", string.Empty))); + } + DividOUtil.Add(new XAttribute("TipoSocDistrDiv", Dividendos_DividOUtil_TipoSocDistrDiv)); + if (Dividendos_DividOUtil_MontISRAcredNal > 0) + { + DividOUtil.Add(new XAttribute("MontISRAcredNal", Dividendos_DividOUtil_MontISRAcredNal.ToString(strDec).Replace(",", string.Empty))); + } + if (Dividendos_DividOUtil_MontDivAcumNal > 0) + { + DividOUtil.Add(new XAttribute("MontDivAcumNal", Dividendos_DividOUtil_MontDivAcumNal.ToString(strDec).Replace(",", string.Empty))); + } + if (Dividendos_DividOUtil_MontDivAcumExt > 0) + { + DividOUtil.Add(new XAttribute("MontDivAcumExt", Dividendos_DividOUtil_MontDivAcumExt.ToString(strDec).Replace(",", string.Empty))); + } + Dividendos.Add(DividOUtil); + + XElement Remanente = new XElement(_Dividendos + "Remanente"); + Remanente.Add(new XAttribute("ProporcionRem", Dividendos_Remanente_ProporcionRem.ToString(strDec).Replace(",", string.Empty))); + Dividendos.Add(Remanente); + + Complemento.Add(Dividendos); + } + #endregion complemento Dividendos + + //complemento EnajenaciondeAcciones + #region complemento EnajenaciondeAcciones + if (!string.IsNullOrEmpty(EnajenaciondeAcciones_Version)) + { + strSchLoc += " http://www.sat.gob.mx/esquemas/retencionpago/1/enajenaciondeacciones http://www.sat.gob.mx/esquemas/retencionpago/1/enajenaciondeacciones/enajenaciondeacciones.xsd"; + XNamespace _EnajenaciondeAcciones = "http://www.sat.gob.mx/esquemas/retencionpago/1/enajenaciondeacciones"; + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "enajenaciondeacciones", _EnajenaciondeAcciones)); + + XElement EnajenaciondeAcciones = new XElement(_EnajenaciondeAcciones + "EnajenaciondeAcciones"); + EnajenaciondeAcciones.Add(new XAttribute("Version", EnajenaciondeAcciones_Version)); + EnajenaciondeAcciones.Add(new XAttribute("ContratoIntermediacion", EnajenaciondeAcciones_ContratoIntermediacion)); + EnajenaciondeAcciones.Add(new XAttribute("Ganancia", EnajenaciondeAcciones_Ganancia.ToString(strDec).Replace(",", string.Empty))); + EnajenaciondeAcciones.Add(new XAttribute("Perdida", EnajenaciondeAcciones_Perdida.ToString(strDec).Replace(",", string.Empty))); + + Complemento.Add(EnajenaciondeAcciones); + } + #endregion complemento EnajenaciondeAcciones + + //complemento Fideicomisonoempresarial + #region complemento Fideicomisonoempresarial + if (!string.IsNullOrEmpty(Fideicomisonoempresarial_Version)) + { + strSchLoc += " http://www.sat.gob.mx/esquemas/retencionpago/1/fideicomisonoempresarial http://www.sat.gob.mx/esquemas/retencionpago/1/fideicomisonoempresarial/fideicomisonoempresarial.xsd"; + XNamespace _Fideicomisonoempresarial = "http://www.sat.gob.mx/esquemas/retencionpago/1/fideicomisonoempresarial"; + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "fideicomisonoempresarial", _Fideicomisonoempresarial)); + + XElement Fideicomisonoempresarial = new XElement(_Fideicomisonoempresarial + "Fideicomisonoempresarial"); + Fideicomisonoempresarial.Add(new XAttribute("Version", Fideicomisonoempresarial_Version)); + + XElement IngresosOEntradas = new XElement(_Fideicomisonoempresarial + "Fideicomisonoempresarial"); + IngresosOEntradas.Add(new XAttribute("MontTotEntradasPeriodo", Fideicomisonoempresarial_IngresosOEntradas_MontTotEntradasPeriodo.ToString(strDec).Replace(",", string.Empty))); + IngresosOEntradas.Add(new XAttribute("PartPropAcumDelFideicom", Fideicomisonoempresarial_IngresosOEntradas_PartPropAcumDelFideicom.ToString(strDec).Replace(",", string.Empty))); + IngresosOEntradas.Add(new XAttribute("PropDelMontTot", Fideicomisonoempresarial_IngresosOEntradas_PropDelMontTot.ToString(strDec).Replace(",", string.Empty))); + + XElement IntegracIngresos = new XElement(_Fideicomisonoempresarial + "IntegracIngresos"); + IntegracIngresos.Add(new XAttribute("Concepto", Fideicomisonoempresarial_IngresosOEntradas_IntegracIngresos_Concepto)); + IngresosOEntradas.Add(IntegracIngresos); + + Fideicomisonoempresarial.Add(IngresosOEntradas); + + XElement DeduccOSalidas = new XElement(_Fideicomisonoempresarial + "DeduccOSalidas"); + DeduccOSalidas.Add(new XAttribute("MontTotEgresPeriodo", Fideicomisonoempresarial_DeduccOSalidas_MontTotEgresPeriodo.ToString(strDec).Replace(",", string.Empty))); + DeduccOSalidas.Add(new XAttribute("PartPropDelFideicom", Fideicomisonoempresarial_DeduccOSalidas_PartPropDelFideicom.ToString(strDec).Replace(",", string.Empty))); + DeduccOSalidas.Add(new XAttribute("PropDelMontTot", Fideicomisonoempresarial_DeduccOSalidas_PropDelMontTot.ToString(strDec).Replace(",", string.Empty))); + + XElement _IntegracIngresos = new XElement(_Fideicomisonoempresarial + "IntegracIngresos"); + _IntegracIngresos.Add(new XAttribute("ConceptoS", Fideicomisonoempresarial_DeduccOSalidas_IntegracEgresos_ConceptoS)); + DeduccOSalidas.Add(_IntegracIngresos); + + Fideicomisonoempresarial.Add(DeduccOSalidas); + + Complemento.Add(Fideicomisonoempresarial); + } + #endregion complemento Fideicomisonoempresarial + + //complemento Intereses + #region complemento Intereses + if (!string.IsNullOrEmpty(Intereses_Version)) + { + strSchLoc += " http://www.sat.gob.mx/esquemas/retencionpago/1/intereses http://www.sat.gob.mx/esquemas/retencionpago/1/intereses/intereses.xsd"; + XNamespace _Intereses = "http://www.sat.gob.mx/esquemas/retencionpago/1/intereses"; + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "intereses", _Intereses)); + + XElement Intereses = new XElement(_Intereses + "Intereses"); + Intereses.Add(new XAttribute("Version", Intereses_Version)); + Intereses.Add(new XAttribute("SistFinanciero", Intereses_SistFinanciero)); + Intereses.Add(new XAttribute("RetiroAORESRetInt", Intereses_RetiroAORESRetInt)); + Intereses.Add(new XAttribute("OperFinancDerivad", Intereses_OperFinancDerivad)); + Intereses.Add(new XAttribute("MontIntNominal", Intereses_MontIntNominal.ToString(strDec).Replace(",", string.Empty))); + Intereses.Add(new XAttribute("MontIntReal", Intereses_MontIntReal.ToString(strDec).Replace(",", string.Empty))); + Intereses.Add(new XAttribute("Perdida", Intereses_Perdida.ToString(strDec).Replace(",", string.Empty))); + + Complemento.Add(Intereses); + } + #endregion complemento Intereses + + //complemento Intereseshipotecarios + #region complemento Intereseshipotecarios + if (!string.IsNullOrEmpty(Intereseshipotecarios_Version)) + { + strSchLoc += " http://www.sat.gob.mx/esquemas/retencionpago/1/intereseshipotecarios http://www.sat.gob.mx/esquemas/retencionpago/1/intereseshipotecarios/intereseshipotecarios.xsd"; + XNamespace _Intereseshipotecarios = "http://www.sat.gob.mx/esquemas/retencionpago/1/intereseshipotecarios"; + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "intereseshipotecarios", _Intereseshipotecarios)); + + XElement Intereseshipotecarios = new XElement(_Intereseshipotecarios + "Intereseshipotecarios"); + Intereseshipotecarios.Add(new XAttribute("Version", Intereseshipotecarios_Version)); + Intereseshipotecarios.Add(new XAttribute("CreditoDeInstFinanc", Intereseshipotecarios_CreditoDeInstFinanc.ToUpper())); + Intereseshipotecarios.Add(new XAttribute("SaldoInsoluto", Intereseshipotecarios_SaldoInsoluto.ToString(strDec).Replace(",", string.Empty))); + if (Intereseshipotecarios_PropDeducDelCredit < 0) + { + Intereseshipotecarios.Add(new XAttribute("PropDeducDelCredit", Intereseshipotecarios_PropDeducDelCredit.ToString(strDec).Replace(",", string.Empty))); + } + if (Intereseshipotecarios_MontTotIntNominalesDev < 0) + { + Intereseshipotecarios.Add(new XAttribute("MontTotIntNominalesDev", Intereseshipotecarios_MontTotIntNominalesDev.ToString(strDec).Replace(",", string.Empty))); + } + if (Intereseshipotecarios_MontTotIntNominalesDevYPag < 0) + { + Intereseshipotecarios.Add(new XAttribute("MontTotIntNominalesDevYPag", Intereseshipotecarios_MontTotIntNominalesDevYPag.ToString(strDec).Replace(",", string.Empty))); + } + if (Intereseshipotecarios_MontTotIntRealPagDeduc < 0) + { + Intereseshipotecarios.Add(new XAttribute("Intereseshipotecarios_MontTotIntRealPagDeduc", Intereseshipotecarios_MontTotIntRealPagDeduc.ToString(strDec).Replace(",", string.Empty))); + } + if (string.IsNullOrEmpty(Intereseshipotecarios_NumContrato)) + { + Intereseshipotecarios.Add(new XAttribute("Intereseshipotecarios_NumContrato", Intereseshipotecarios_NumContrato)); + } + Complemento.Add(Intereseshipotecarios); + } + #endregion complemento Intereseshipotecarios + + //complemento Operacionesconderivados + #region complemento Operacionesconderivados + if (!string.IsNullOrEmpty(Operacionesconderivados_Version)) + { + strSchLoc += " http://www.sat.gob.mx/esquemas/retencionpago/1/operacionesconderivados http://www.sat.gob.mx/esquemas/retencionpago/1/operacionesconderivados/operacionesconderivados.xsd"; + XNamespace _Operacionesconderivados = "http://www.sat.gob.mx/esquemas/retencionpago/1/operacionesconderivados"; + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "operacionesconderivados", _Operacionesconderivados)); + + XElement Operacionesconderivados = new XElement(_Operacionesconderivados + "Operacionesconderivados"); + Operacionesconderivados.Add(new XAttribute("Version", Operacionesconderivados_Version)); + Operacionesconderivados.Add(new XAttribute("MontGanAcum", Operacionesconderivados_MontGanAcum.ToString(strDec).Replace(",", string.Empty))); + Operacionesconderivados.Add(new XAttribute("MontPerdDed", Operacionesconderivados_MontPerdDed.ToString(strDec).Replace(",", string.Empty))); + + Complemento.Add(Operacionesconderivados); + } + #endregion complemento Operacionesconderivados + + //complemento Pagosaextranjeros + #region complemento Pagosaextranjeros + if (!string.IsNullOrEmpty(Pagosaextranjeros_Version)) + { + strSchLoc += " http://www.sat.gob.mx/esquemas/retencionpago/1/pagosaextranjeros http://www.sat.gob.mx/esquemas/retencionpago/1/pagosaextranjeros/pagosaextranjeros.xsd"; + XNamespace _Pagosaextranjeros = "http://www.sat.gob.mx/esquemas/retencionpago/1/pagosaextranjeros"; + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "pagosaextranjeros", _Pagosaextranjeros)); + + XElement Pagosaextranjeros = new XElement(_Pagosaextranjeros + "Pagosaextranjeros"); + Pagosaextranjeros.Add(new XAttribute("Version", Pagosaextranjeros_Version)); + Pagosaextranjeros.Add(new XAttribute("Pagosaextranjeros_EsBenefEfectDelCobro", Pagosaextranjeros_EsBenefEfectDelCobro)); + + XElement NoBeneficiario = new XElement(_Pagosaextranjeros + "NoBeneficiario"); + NoBeneficiario.Add(new XAttribute("PaisDeResidParaEfecFisc", Pagosaextranjeros_NoBeneficiario_PaisDeResidParaEfecFisc)); + NoBeneficiario.Add(new XAttribute("ConceptoPago", Pagosaextranjeros_NoBeneficiario_ConceptoPago)); + NoBeneficiario.Add(new XAttribute("DescripcionConcepto", Pagosaextranjeros_NoBeneficiario_DescripcionConcepto)); + Pagosaextranjeros.Add(NoBeneficiario); + + XElement Beneficiario = new XElement(_Pagosaextranjeros + "Beneficiario"); + NoBeneficiario.Add(new XAttribute("RFC", Pagosaextranjeros_Beneficiario_RFC)); + NoBeneficiario.Add(new XAttribute("CURP", Pagosaextranjeros_Beneficiario_CURP)); + NoBeneficiario.Add(new XAttribute("NomDenRazSocB", Pagosaextranjeros_Beneficiario_NomDenRazSocB)); + NoBeneficiario.Add(new XAttribute("ConceptoPago", Pagosaextranjeros_Beneficiario_ConceptoPago)); + NoBeneficiario.Add(new XAttribute("DescripcionConcepto", Pagosaextranjeros_Beneficiario_DescripcionConcepto)); + Pagosaextranjeros.Add(Beneficiario); + + Complemento.Add(Pagosaextranjeros); + } + #endregion complemento Pagosaextranjeros + + //complemento Planesderetiro + #region Planesderetiro_Version + if (!string.IsNullOrEmpty(Planesderetiro_Version)) + { + strSchLoc += " http://www.sat.gob.mx/esquemas/retencionpago/1/planesderetiro http://www.sat.gob.mx/esquemas/retencionpago/1/planesderetiro/planesderetiro.xsd"; + XNamespace _Planesderetiro = "http://www.sat.gob.mx/esquemas/retencionpago/1/premios"; + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "planesderetiro", _Planesderetiro)); + + XElement Planesderetiro = new XElement(_Planesderetiro + "Planesderetiro"); + Planesderetiro.Add(new XAttribute("Version", Planesderetiro_Version)); + Planesderetiro.Add(new XAttribute("SistemaFinanc", Planesderetiro_SistemaFinanc)); + if (Planesderetiro_MontTotAportAnioInmAnterior > 0) + { + Planesderetiro.Add(new XAttribute("MontTotAportAnioInmAnterior", Planesderetiro_MontTotAportAnioInmAnterior.ToString(strDec).Replace(",", string.Empty))); + } + Planesderetiro.Add(new XAttribute("MontIntRealesDevengAniooInmAnt", Planesderetiro_MontIntRealesDevengAniooInmAnt.ToString(strDec).Replace(",", string.Empty))); + Planesderetiro.Add(new XAttribute("HuboRetirosAnioInmAntPer", Planesderetiro_HuboRetirosAnioInmAntPer)); + if (Planesderetiro_MontTotRetiradoAnioInmAntPer > 0) + { + Planesderetiro.Add(new XAttribute("MontTotRetiradoAnioInmAntPer", Planesderetiro_MontTotRetiradoAnioInmAntPer.ToString(strDec).Replace(",", string.Empty))); + } + if (Planesderetiro_MontTotExentRetiradoAnioInmAnt > 0) + { + Planesderetiro.Add(new XAttribute("MontTotExentRetiradoAnioInmAnt", Planesderetiro_MontTotExentRetiradoAnioInmAnt.ToString(strDec).Replace(",", string.Empty))); + } + if (Planesderetiro_MontTotExentRetiradoAnioInmAnt > 0) + { + Planesderetiro.Add(new XAttribute("MontTotExedenteAnioInmAnt", Planesderetiro_MontTotExedenteAnioInmAnt.ToString(strDec).Replace(",", string.Empty))); + } + Planesderetiro.Add(new XAttribute("HuboRetirosAnioInmAnt", Planesderetiro_HuboRetirosAnioInmAnt)); + if (Planesderetiro_MontTotRetiradoAnioInmAnt > 0) + { + Planesderetiro.Add(new XAttribute("MontTotRetiradoAnioInmAnt", Planesderetiro_MontTotRetiradoAnioInmAnt.ToString(strDec).Replace(",", string.Empty))); + } + Complemento.Add(Planesderetiro); + } + #endregion Planesderetiro_Version + + //complemento Premios + #region complemento Premios + if (!string.IsNullOrEmpty(Premios_Version)) + { + strSchLoc += " http://www.sat.gob.mx/esquemas/retencionpago/1/premios http://www.sat.gob.mx/esquemas/retencionpago/1/premios/premios.xsd"; + XNamespace _Premios = "http://www.sat.gob.mx/esquemas/retencionpago/1/premios"; + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "premios", _Premios)); + + XElement Premios = new XElement(_Premios + "Premios"); + Premios.Add(new XAttribute("Version", Premios_Version)); + Premios.Add(new XAttribute("EntidadFederativa", Premios_EntidadFederativa)); + Premios.Add(new XAttribute("MontTotPago", Premios_MontTotPago.ToString(strDec).Replace(",", string.Empty))); + Premios.Add(new XAttribute("MontTotPagoGrav", Premios_MontTotPagoGrav.ToString(strDec).Replace(",", string.Empty))); + Premios.Add(new XAttribute("MontTotPagoExent", Premios_MontTotPagoExent.ToString(strDec).Replace(",", string.Empty))); + + Complemento.Add(Premios); + } + #endregion complemento Premios + + //complemento SectorFinanciero + #region complemento SectorFinanciero + if (!string.IsNullOrEmpty(SectorFinanciero_Version)) + { + strSchLoc += " http://www.sat.gob.mx/esquemas/retencionpago/1/sectorfinanciero http://www.sat.gob.mx/esquemas/retencionpago/1/sectorfinanciero/sectorfinanciero.xsd"; + XNamespace _SectorFinanciero = "http://www.sat.gob.mx/esquemas/retencionpago/1/sectorfinanciero"; + Retenciones.Add(new XAttribute(XNamespace.Xmlns + "sectorFinanciero", _SectorFinanciero)); + + XElement SectorFinanciero = new XElement(_SectorFinanciero + "SectorFinanciero"); + SectorFinanciero.Add(new XAttribute("Version", SectorFinanciero_Version)); + SectorFinanciero.Add(new XAttribute("IdFideicom", SectorFinanciero_IdFideicom)); + if (!string.IsNullOrEmpty(SectorFinanciero_NomFideicom)) + { + SectorFinanciero.Add(new XAttribute("NomFideicom", SectorFinanciero_NomFideicom)); + } + SectorFinanciero.Add(new XAttribute("DescripFideicom", SectorFinanciero_DescripFideicom)); + + Complemento.Add(SectorFinanciero); + } + #endregion complemento SectorFinanciero + + //complemento TimbreFiscalDigital + #region complemento TimbreFiscalDigital + if (!string.IsNullOrEmpty(Complemento_TimbreFiscalDigital_UUID)) + { + XNamespace schemaLocation_ = "http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/timbrefiscaldigital/TimbreFiscalDigital.xsd"; + XNamespace tfd = "http://www.sat.gob.mx/TimbreFiscalDigital"; + + XElement Complemento_TimbreFiscalDigital = new XElement(tfd + "TimbreFiscalDigital"); + Complemento_TimbreFiscalDigital.Add(new XAttribute(XNamespace.Xmlns + "tfd", tfd)); + Complemento_TimbreFiscalDigital.Add(new XAttribute(xsi + "schemaLocation", schemaLocation_)); + Complemento_TimbreFiscalDigital.Add(new XAttribute("Version", "1.0")); + Complemento_TimbreFiscalDigital.Add(new XAttribute("UUID", Complemento_TimbreFiscalDigital_UUID)); + Complemento_TimbreFiscalDigital.Add(new XAttribute("FechaTimbrado", Complemento_TimbreFiscalDigital_FechaTimbrado)); + //Complemento_TimbreFiscalDigital.Add(new XAttribute("RfcProvCertif", Complemento_TimbreFiscalDigital_RfcProvCertif)); + Complemento_TimbreFiscalDigital.Add(new XAttribute("SelloCFD", Complemento_TimbreFiscalDigital_SelloCFD)); + Complemento_TimbreFiscalDigital.Add(new XAttribute("NoCertificadoSAT", Complemento_TimbreFiscalDigital_NoCertificadoSAT)); + Complemento_TimbreFiscalDigital.Add(new XAttribute("SelloSAT", Complemento_TimbreFiscalDigital_SelloSAT)); + + Complemento.Add(Complemento_TimbreFiscalDigital); + } + #endregion complemento TimbreFiscalDigital + + #endregion complemento + + Retenciones.Add(new XAttribute(xsi + "schemaLocation", strSchLoc)); + Retenciones.Add(new XAttribute("Version", Retenciones_Version)); + if (!string.IsNullOrEmpty(Comprobante_Folio)) + { + Retenciones.Add(new XAttribute("FolioInt", Comprobante_Folio)); + } + if (!string.IsNullOrEmpty(Comprobante_Sello)) + { + Retenciones.Add(new XAttribute("Sello", Comprobante_Sello)); + } + Retenciones.Add(new XAttribute((CFDI4 ? "NoCertificado" : "NumCert"), Comprobante_NoCertificado)); + Retenciones.Add(new XAttribute((CFDI4 ? "Certificado" : "Cert"), Comprobante_Certificado)); + Comprobante_Fecha = sys_fix_fecha(Comprobante_Fecha).Replace(" ", "T") + (CFDI4 ? "" : "-06:00"); + Retenciones.Add(new XAttribute("FechaExp", Comprobante_Fecha)); + if (CFDI4) { + Retenciones.Add(new XAttribute("LugarExpRetenc", Comprobante_LugarExpedicion)); + } + Retenciones.Add(new XAttribute("CveRetenc", Retenciones_CveRetenc)); + if (!string.IsNullOrEmpty(Retenciones_DescRetenc)) + { + Retenciones.Add(new XAttribute("DescRetenc", Retenciones_DescRetenc)); + } + + //Emisor + #region Emisor + XElement Emisor = new XElement(_Retenciones + "Emisor"); + + Emisor.Add(new XAttribute((CFDI4 ? "RfcE" : "RFCEmisor"), (Retenciones_Emisor_RFCEmisor))); + if (!string.IsNullOrEmpty(Retenciones_Emisor_NomDenRazSocE)) + { + Emisor.Add(new XAttribute("NomDenRazSocE", (Retenciones_Emisor_NomDenRazSocE) )); + } + if (CFDI4) + { + Emisor.Add(new XAttribute("RegimenFiscalE", (Retenciones_Emisor_RegimenFiscal) )); + } + else { + if (!string.IsNullOrEmpty(Retenciones_Emisor_CURPE)) + { + Emisor.Add(new XAttribute("CURPE", (Retenciones_Emisor_CURPE) )); + } + } + Retenciones.Add(Emisor); + #endregion Emisor + + //Receptor + #region Receptor + XElement Receptor = new XElement(_Retenciones + "Receptor"); + string strRecNac = !string.IsNullOrEmpty(Receptor_ResidenciaFiscal) && Receptor_ResidenciaFiscal != "mex" ? "Extranjero" : "Nacional"; + Receptor.Add(new XAttribute((CFDI4 ? "NacionalidadR" : "Nacionalidad"), strRecNac)); + + XElement _Receptor = new XElement(_Retenciones + strRecNac); + if (strRecNac == "Nacional") + { + _Receptor.Add(new XAttribute((CFDI4 ? "RfcR" : "RFCRecep"), (Retenciones_Receptor_Nacional_RFCRecep) )); + + if (!string.IsNullOrEmpty(Retenciones_Receptor_Nacional_NomDenRazSocR)) + { + _Receptor.Add(new XAttribute("NomDenRazSocR", (Retenciones_Receptor_Nacional_NomDenRazSocR) )); + } + if (!string.IsNullOrEmpty(Retenciones_Receptor_Nacional_CURPR)) + { + _Receptor.Add(new XAttribute("CURPR", (Retenciones_Receptor_Nacional_CURPR) )); + } + if (CFDI4) { + _Receptor.Add(new XAttribute("DomicilioFiscalR", ( Retenciones_Receptor_DomicilioFiscalR) )); + } + } + else + { + if (!string.IsNullOrEmpty(Retenciones_Receptor_Extranjero_NumRegIdTrib)) + { + _Receptor.Add(new XAttribute("NumRegIdTrib", Retenciones_Receptor_Extranjero_NumRegIdTrib)); + } + _Receptor.Add(new XAttribute("NomDenRazSocR", (Retenciones_Receptor_Extranjero_NomDenRazSocR) )); + } + Receptor.Add(_Receptor); + Retenciones.Add(Receptor); + #endregion Receptor + + //Periodo + #region Periodo + XElement Periodo = new XElement(_Retenciones + "Periodo"); + if (CFDI4) { + string ini = Retenciones_Periodo_MesIni.ToString(); + ini = ini.Length == 1 ? "0" + ini : ini; + + string fin = Retenciones_Periodo_MesFin.ToString(); + fin = fin.Length == 1 ? "0" + fin : fin; + + Periodo.Add(new XAttribute("MesIni", ini)); + Periodo.Add(new XAttribute("MesFin", fin)); + } + else { + Periodo.Add(new XAttribute("MesIni", Retenciones_Periodo_MesIni)); + Periodo.Add(new XAttribute("MesFin", Retenciones_Periodo_MesFin)); + } + Periodo.Add(new XAttribute((CFDI4 ? "Ejercicio" : "Ejerc"), Retenciones_Periodo_Ejerc)); + Retenciones.Add(Periodo); + #endregion Periodo + + //Totales + #region Totales + XElement Totales = new XElement(_Retenciones + "Totales"); + Totales.Add(new XAttribute((CFDI4 ? "MontoTotOperacion" : "montoTotOperacion"), Retenciones_Totales_MontoTotOperacion.ToString(strDec).Replace(",", string.Empty))); + Totales.Add(new XAttribute((CFDI4 ? "MontoTotGrav" : "montoTotGrav"), Retenciones_Totales_MontoTotGrav.ToString(strDec).Replace(",", string.Empty))); + Totales.Add(new XAttribute((CFDI4 ? "MontoTotExent" : "montoTotExent"), Retenciones_Totales_MontoTotExent.ToString(strDec).Replace(",", string.Empty))); + Totales.Add(new XAttribute((CFDI4 ? "MontoTotRet" : "montoTotRet"), Retenciones_Totales_MontoTotRet.ToString(strDec).Replace(",", string.Empty))); + if (CFDI4) { + //Totales.Add(new XAttribute("UtilidadBimestral", "")); + //Totales.Add(new XAttribute("ISRCorrespondiente", "")); + } + #endregion Totales + + //ImpRetenidos + #region ImpRetenidos + XElement ImpRetenidos = new XElement(_Retenciones + "ImpRetenidos"); + foreach (var atr in Retenciones_Totales_ImpRetenidos) + { + if (atr.BaseRet > 0) + { + ImpRetenidos.Add(new XAttribute("BaseRet", atr.BaseRet.ToString(strDec).Replace(",", string.Empty))); + } + if (!string.IsNullOrEmpty(atr.Impuesto)) + { + if (CFDI4) { + ImpRetenidos.Add(new XAttribute("ImpuestoRet", "0" + atr.Impuesto)); + } + else { + ImpRetenidos.Add(new XAttribute("Impuesto", atr.Impuesto)); + } + + } + ImpRetenidos.Add(new XAttribute((CFDI4 ? "MontoRet" : "montoRet"), atr.montoRet.ToString(strDec).Replace(",", string.Empty))); + + if (!string.IsNullOrEmpty(atr.TipoPagoRet)) + { + ImpRetenidos.Add(new XAttribute("TipoPagoRet", atr.TipoPagoRet)); + } + } + Totales.Add(ImpRetenidos); + Retenciones.Add(Totales); + #endregion ImpRetenidos + + if (Complemento.HasElements) + { + Retenciones.Add(Complemento); + } + + //Guardar el comprobante + try + { + string strArc = string.IsNullOrEmpty(Comprobante_Sello) ? ComprobanteDBArchivo : ComprobanteDBArchivoTimbrado; + XDocument cfdi32 = new XDocument( + Retenciones + ); + cfdi32.Save(strArc); + //GuardarXMLtoTXT(cfdi32, _Retenciones, strArc); + if (string.IsNullOrEmpty(Comprobante_Sello)) + { + Comprobante_CadenaOriginal = cfdi33_cadena_original(true); + Comprobante_Sello = cfdi33_sello(true); + Retenciones.Add(new XAttribute("Sello", Comprobante_Sello)); + XDocument _cfdi32 = new XDocument( + Retenciones + ); + _cfdi32.Save(strArc); + //GuardarXMLtoTXT(_cfdi32, _Retenciones, ComprobanteDBArchivo); + + bool bolTim = false; + if (CFDIPac == "EdiCom") + { + bolTim = edicom_timbrado(true); + } + else + { + + string tipo2 = "XML"; + byte[] cfdi_sin_timbrar = File.ReadAllBytes(strArc); + string email = ""; + int codigo; + string errMsg; + string xml_tim; + string uuid; + int saldo; + string errEmail; + //es retencion + timbrarV5Xml(CFDIPacUrl, CFDIPacUsr, CFDIPacPwd, tipo2, cfdi_sin_timbrar, email, out codigo, out errMsg, out xml_tim, out uuid, out saldo, out errEmail); + try + { + if (!string.IsNullOrEmpty(errMsg)) + { + throw new ComDig_Exception(errMsg); + } + + XDocument Comprobante1 = XDocument.Parse(xml_tim); + try + { + XDocument cfdi33 = new XDocument( + Comprobante1 + ); + cfdi33.Save(ComprobanteDBArchivoTimbrado); + //GuardarXMLtoTXT(cfdi33, _Retenciones, ComprobanteDBArchivoTimbrado); + } + catch (Exception ex) + { + exe_err(ex, "Gua_XML_TIM_RET_COM_DIG"); + } + //calcular cadena original timbre fiscal + Complemento_TimbreFiscalDigital_CadenaOriginalSAT = cfdi33_cadena_original_complemento(true); + + //Asignar valores a consulta de update comprobante + timbre_sql(); + + //generar codigo qr + cfdi33_codigoqr(); + + //GenerarAddenda(); + sys_proceso_fin("¡Comprobante Timbrado!", 1); + + } + catch (ComDig_Exception ex) + { + sys_mensaje_error("Error en el XML de Retención, favor de revisar\n" + errMsg); + + exe_err(ex, "Gen_XML_RET_Com_DIG"); + } + + } + if (bolTim) + { + cfdi33_xmlret(); + } + } + else + { + timbre_sql(); + cfdi33_codigoqr(); + sys_proceso_fin("¡Comprobante Timbrado!", 1); + } + } + catch (Exception Ex) + { + exe_err(Ex, "Gua_XML_RET"); + } + } + #endregion cfdi33 xmlret + + //public static string GenerateCustomGuid() + //{ + // string pattern = "CCCaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"; + // string customGuid = Regex.Replace(pattern, "C{3}", RandomHexChars(3)) + // .Replace("a", RandomHexChars(1)); + + // return customGuid; + //} + + //private static string RandomHexChars(int count) + //{ + // Random random = new Random(); + // const string hexChars = "0123456789abcdefABCDEF"; + // StringBuilder result = new StringBuilder(count); + + // for (int i = 0; i < count; i++) + // { + // result.Append(hexChars[random.Next(hexChars.Length)]); + // } + + // return result.ToString(); + //} + + public static string GenerateCustomString() + { + Guid newGuid = Guid.NewGuid(); + string guidString = newGuid.ToString(); + string customGuid = "CCC" + guidString.Substring(3); + + return customGuid; + } + + + #region Complemento_CartaPorte + public XElement Complemento_CartaPorte_XML() + { + string strDec = "n2"; + XNamespace _CartaPorte = "http://www.sat.gob.mx/CartaPorte31"; + XElement Carta_Porte = new XElement(_CartaPorte + "CartaPorte"); + + Carta_Porte.Add(new XAttribute("Version", "3.1")); + + if (string.IsNullOrEmpty(Comprobante_Sello)) + { + ID_Complemento = GenerateCustomString(); + string qry = @"update CFDI33_CartaPorte set IDCCP = '"+ID_Complemento+"' where ID_FACTURA_CONSECUTIVO ="+ComprobanteDBSysId; + sql_exe_update(qry); + } + + //Generar UUID para IdCCP CCP 3.0 + Carta_Porte.Add(new XAttribute("IdCCP", ID_Complemento)); + + + Carta_Porte.Add(new XAttribute("TranspInternac", TranspInternac)); + if (TranspInternac == "Sí") + { + Carta_Porte.Add(new XAttribute("EntradaSalidaMerc", EntradaSalidaMerc)); + Carta_Porte.Add(new XAttribute("ViaEntradaSalida", ViaEntradaSalida)); + Carta_Porte.Add(new XAttribute("PaisOrigenDestino", PaisOrigenDestino)); + + } + + //RegimenAduanero CCP 3.1 + //se convierte en un nodo hijo de cartaporte + + if (!string.IsNullOrEmpty(REGIMENADUANERO)) { + /* + * + + + + + + --hermano + + */ + + XElement RegimenesAduaneros = new XElement(_CartaPorte + "RegimenesAduaneros"); + XElement RegimenAduaneroCCP = new XElement(_CartaPorte + "RegimenAduaneroCCP"); + + RegimenAduaneroCCP.Add(new XAttribute("RegimenAduanero", REGIMENADUANERO)); + RegimenesAduaneros.Add(RegimenAduaneroCCP); + Carta_Porte.Add(RegimenesAduaneros); + } + //RegistroISTMO + if (!string.IsNullOrEmpty(REGISTROISTMO) && REGISTROISTMO.ToUpper() == "SI") { + Carta_Porte.Add(new XAttribute("RegistroISTMO", REGISTROISTMO)); + + Carta_Porte.Add(new XAttribute("UbicacionPoloOrigen", UBICACIONPOLOORIGEN)); + Carta_Porte.Add(new XAttribute("UbicacionPoloOrigen", UBICACIONPOLOORIGEN)); + + + } + + + + + + if (TotalDistRec.ToString(strDec).Replace(",", string.Empty) != "0.00") + { + Carta_Porte.Add(new XAttribute("TotalDistRec", TotalDistRec.ToString(strDec).Replace(",", string.Empty))); + } + + + //-----------------------------------------------------------------------Ubicaciones + XElement Ubicaciones = new XElement(_CartaPorte + "Ubicaciones"); + foreach (var Ubi in Partidas_Ubicacion) + { + + XElement Ubicacion = new XElement(_CartaPorte + "Ubicacion"); + + //Origen + if (Ubi.Origen && !Ubi.Destino) + { + Ubicacion.Add(new XAttribute("TipoUbicacion", "Origen")); // 1 + + + if (!string.IsNullOrEmpty(Ubi.IDOrigen)) + { + Ubicacion.Add(new XAttribute("IDUbicacion", Ubi.IDOrigen)); // 2 + } + + + //XElement Origen = new XElement(_CartaPorte + "Origen"); + + + if (!string.IsNullOrEmpty(Ubi.RFCRemitente)) + { + Ubicacion.Add(new XAttribute("RFCRemitenteDestinatario", Ubi.RFCRemitente)); //3 + } + + if (!string.IsNullOrEmpty(Ubi.NombreRemitente)) + { + Ubicacion.Add(new XAttribute("NombreRemitenteDestinatario", Ubi.NombreRemitente));//4 + } + + if (!string.IsNullOrEmpty(Ubi.NumRegIdTrib_Ori)) + { + Ubicacion.Add(new XAttribute("NumRegIdTrib", Ubi.NumRegIdTrib_Ori)); // 5 + } + + if (!string.IsNullOrEmpty(Ubi.ResidenciaFiscal_Ori)) + { + Ubicacion.Add(new XAttribute("ResidenciaFiscal", Ubi.ResidenciaFiscal_Ori)); //6 + } + + + if (!(Ubi.TipoEstacion == "NA" || Ubi.TipoEstacion == "")) + { + Ubicacion.Add(new XAttribute("TipoEstacion", Ubi.TipoEstacion)); //10 + Ubicacion.Add(new XAttribute("NumEstacion", Ubi.NumEstacion_Ori)); // 7 + Ubicacion.Add(new XAttribute("NombreEstacion", Ubi.NombreEstacion_Ori)); // 8 + } + + if (!string.IsNullOrEmpty(Ubi.NavegacionTrafico_Ori)) + { + Ubicacion.Add(new XAttribute("NavegacionTrafico", Ubi.NavegacionTrafico_Ori)); //9 + } + + if (!string.IsNullOrEmpty(Ubi.FechaHoraSalida_Ori)) + { + Ubicacion.Add(new XAttribute("FechaHoraSalidaLlegada", Ubi.FechaHoraSalida_Ori.TrimEnd())); // 11 + } + if (Ubi.DistanciaRecorrida.ToString(strDec).Replace(",", string.Empty) != "0.00") //12 + { + Ubicacion.Add(new XAttribute("DistanciaRecorrida", Ubi.DistanciaRecorrida.ToString(strDec).Replace(",", string.Empty))); + } + + + + + //Ubicacion.Add(Origen); + + XElement Domicilio = new XElement(_CartaPorte + "Domicilio"); + + + if (!string.IsNullOrEmpty(Ubi.Calle)) + { + Domicilio.Add(new XAttribute("Calle", Ubi.Calle)); + + } + + if (!string.IsNullOrEmpty(Ubi.NumeroExterior)) + { + Domicilio.Add(new XAttribute("NumeroExterior", Ubi.NumeroExterior)); + } + + if (!string.IsNullOrEmpty(Ubi.NumeroInterior)) + { + Domicilio.Add(new XAttribute("NumeroInterior", Ubi.NumeroInterior)); + } + if (!string.IsNullOrEmpty(Ubi.Colonia)) + { + Domicilio.Add(new XAttribute("Colonia", Ubi.Colonia)); + } + if (!string.IsNullOrEmpty(Ubi.Localidad)) + { + Domicilio.Add(new XAttribute("Localidad", Ubi.Localidad)); + } + if (!string.IsNullOrEmpty(Ubi.Referencia)) + { + Domicilio.Add(new XAttribute("Referencia", Ubi.Referencia)); + } + if (!string.IsNullOrEmpty(Ubi.Municipio)) + { + Domicilio.Add(new XAttribute("Municipio", Ubi.Municipio)); + } + + Domicilio.Add(new XAttribute("Estado", Ubi.Estado)); + Domicilio.Add(new XAttribute("Pais", Ubi.Pais)); + Domicilio.Add(new XAttribute("CodigoPostal", Ubi.CodigoPostal)); + Ubicacion.Add(Domicilio); + } + + if (!Ubi.Origen && Ubi.Destino) + { + + Ubicacion.Add(new XAttribute("TipoUbicacion", "Destino")); // 1 + if (!string.IsNullOrEmpty(Ubi.IDDestino)) + { + Ubicacion.Add(new XAttribute("IDUbicacion", Ubi.IDDestino));// 2 + } + + //Destino + //XElement Destino = new XElement(_CartaPorte + "Destino"); + + if (!string.IsNullOrEmpty(Ubi.RFCDestinatario)) + { + Ubicacion.Add(new XAttribute("RFCRemitenteDestinatario", Ubi.RFCDestinatario)); //3 + } + + if (!string.IsNullOrEmpty(Ubi.NombreDestinatario)) + { + Ubicacion.Add(new XAttribute("NombreRemitenteDestinatario", Ubi.NombreDestinatario)); // 4 + } + + if (!string.IsNullOrEmpty(Ubi.NumRegIdTrib_Des)) + { + Ubicacion.Add(new XAttribute("NumRegIdTrib", Ubi.NumRegIdTrib_Des)); // 5 + } + + if (!string.IsNullOrEmpty(Ubi.ResidenciaFiscal_Des)) + { + Ubicacion.Add(new XAttribute("ResidenciaFiscal", Ubi.ResidenciaFiscal_Des)); // 6 + } + + + + + if (!string.IsNullOrEmpty(Ubi.NavegacionTrafico_Des)) + { + Ubicacion.Add(new XAttribute("NavegacionTrafico", Ubi.NavegacionTrafico_Des)); // 9 + } + if (!string.IsNullOrEmpty(Ubi.FechaHoraSalida_Des)) + { + Ubicacion.Add(new XAttribute("FechaHoraSalidaLlegada", Ubi.FechaHoraSalida_Des.TrimEnd())); // 10 + } + + if (!(Ubi.TipoEstacion == "NA" || Ubi.TipoEstacion == "")) + { + Ubicacion.Add(new XAttribute("TipoEstacion", Ubi.TipoEstacion)); // 11 + Ubicacion.Add(new XAttribute("NumEstacion", Ubi.NumEstacion_Des)); // 7 + Ubicacion.Add(new XAttribute("NombreEstacion", Ubi.NombreEstacion_Des)); // 8 + } + // 12 + Ubicacion.Add(new XAttribute("DistanciaRecorrida", Ubi.DistanciaRecorrida.ToString(strDec).Replace(",", string.Empty))); + //Ubicacion.Add(Destino); + XElement Domicilio = new XElement(_CartaPorte + "Domicilio"); + if (!string.IsNullOrEmpty(Ubi.Calle)) + { + Domicilio.Add(new XAttribute("Calle", Ubi.Calle)); + } + if (!string.IsNullOrEmpty(Ubi.NumeroExterior)) + { + Domicilio.Add(new XAttribute("NumeroExterior", Ubi.NumeroExterior)); + } + + if (!string.IsNullOrEmpty(Ubi.NumeroInterior)) + { + Domicilio.Add(new XAttribute("NumeroInterior", Ubi.NumeroInterior)); + } + if (!string.IsNullOrEmpty(Ubi.Colonia)) + { + Domicilio.Add(new XAttribute("Colonia", Ubi.Colonia)); + } + if (!string.IsNullOrEmpty(Ubi.Localidad)) + { + Domicilio.Add(new XAttribute("Localidad", Ubi.Localidad)); + } + if (!string.IsNullOrEmpty(Ubi.Referencia)) + { + Domicilio.Add(new XAttribute("Referencia", Ubi.Referencia)); + } + if (!string.IsNullOrEmpty(Ubi.Municipio)) + { + Domicilio.Add(new XAttribute("Municipio", Ubi.Municipio)); + } + + Domicilio.Add(new XAttribute("Estado", Ubi.Estado)); + Domicilio.Add(new XAttribute("Pais", Ubi.Pais)); + if (!string.IsNullOrEmpty(Ubi.CodigoPostal)) { + Domicilio.Add(new XAttribute("CodigoPostal", Ubi.CodigoPostal)); + } + Ubicacion.Add(Domicilio); + + }//If Ubi.Destino + + Ubicaciones.Add(Ubicacion); + }//Fin Foreach Ubicacines + Carta_Porte.Add(Ubicaciones); + + //-------------------------------------------------------------------Mercancias + XElement Mercancias = new XElement(_CartaPorte + "Mercancias"); + + int Count = 0; + int TotMerca = (from s in Partidas_Mercancias select s).Count(); + + + foreach (var Merc in Partidas_Mercancias) + { + + + + Count += 1; + + if (Count == 1) + { + + + if (Merc.PesoBrutoTotal.ToString(strDec).Replace(",", string.Empty) != "0.00") + { + Mercancias.Add(new XAttribute("PesoBrutoTotal", Merc.PesoBrutoTotal.ToString(strDec).Replace(",", string.Empty))); + } + if (!string.IsNullOrEmpty(Merc.UnidadPesoM)) + { + Mercancias.Add(new XAttribute("UnidadPeso", Merc.UnidadPesoM)); + } + + if (Merc.PesoNetoTotal.ToString(strDec).Replace(",", string.Empty) != "0.00") + { + Mercancias.Add(new XAttribute("PesoNetoTotal", Merc.PesoNetoTotal.ToString(strDec).Replace(",", string.Empty))); + } + + + if (TotMerca > 0) + { + //Mercancias.Add(new XAttribute("NumTotalMercancias", Merc.NumTotalMercancias)); + Mercancias.Add(new XAttribute("NumTotalMercancias", TotMerca)); + } + + if (string.IsNullOrEmpty(Merc.CargoPorTasacion.ToString(strDec).Replace(",", string.Empty))) + { + Mercancias.Add(new XAttribute("CargoPorTasacion", Merc.CargoPorTasacion)); + } + + // nuevo campo CCP 3.0 + if (!string.IsNullOrEmpty(LogisticaInv)) + { + Mercancias.Add(new XAttribute("LogisticaInversaRecoleccionDevolucion", LogisticaInv)); + } + + }//Fin del Count + + + + + //------------Mercancias_Mercancia + XElement Mercancia_ = new XElement(_CartaPorte + "Mercancia"); + if (!string.IsNullOrEmpty(Merc.BienesTransp)) + { + Mercancia_.Add(new XAttribute("BienesTransp", Merc.BienesTransp)); + } + if (!string.IsNullOrEmpty(Merc.ClaveSTCC)) + { + Mercancia_.Add(new XAttribute("ClaveSTCC", Merc.ClaveSTCC)); + } + + if (!string.IsNullOrEmpty(Merc.Descripcion)) + { + Mercancia_.Add(new XAttribute("Descripcion", Merc.Descripcion)); + } + + if (Merc.Cantidad.ToString(strDec).Replace(",", string.Empty) != "0.00") + { + Mercancia_.Add(new XAttribute("Cantidad", Merc.Cantidad.ToString(strDec).Replace(",", string.Empty))); + } + + if (!string.IsNullOrEmpty(Merc.ClaveUnidad)) + { + Mercancia_.Add(new XAttribute("ClaveUnidad", Merc.ClaveUnidad)); + } + + if (!string.IsNullOrEmpty(Merc.Unidad)) + { + Mercancia_.Add(new XAttribute("Unidad", Merc.Unidad)); + } + + if (!string.IsNullOrEmpty(Merc.Dimensiones)) + { + Mercancia_.Add(new XAttribute("Dimensiones", Merc.Dimensiones)); + } + + //Material Peligroso + if (!string.IsNullOrEmpty(Merc.MaterialPeligroso)) + { + string matPeli = Merc.MaterialPeligroso.ToLower().Replace("si", "Sí"); + matPeli = matPeli.Replace("no", "No"); + Mercancia_.Add(new XAttribute("MaterialPeligroso", matPeli)); + } + + if (Merc.MaterialPeligroso == "Si" || Merc.MaterialPeligroso == "Sí") + { + //Mercancia_.Add(new XAttribute("MaterialPeligroso", Merc.MaterialPeligroso)); + + + + if (!string.IsNullOrEmpty(Merc.CveMaterialPeligroso)) + { + Mercancia_.Add(new XAttribute("CveMaterialPeligroso", Merc.CveMaterialPeligroso)); + } + + if (!string.IsNullOrEmpty(Merc.Embalaje)) + { + Mercancia_.Add(new XAttribute("Embalaje", Merc.Embalaje)); + } + + if (!string.IsNullOrEmpty(Merc.DescripEmbalaje)) + { + Mercancia_.Add(new XAttribute("DescripEmbalaje", Merc.DescripEmbalaje)); + } + + }//Fin Material Peligroso + + + + if (Merc.PesoEnKg.ToString(strDec).Replace(",", string.Empty) != "0.00") + { + Mercancia_.Add(new XAttribute("PesoEnKg", Merc.PesoEnKg.ToString(strDec).Replace(",", string.Empty))); + } + + if (Merc.ValorMercancia.ToString(strDec).Replace(",", string.Empty) != "0.00") + { + Mercancia_.Add(new XAttribute("ValorMercancia", Merc.ValorMercancia)); + } + + if (!string.IsNullOrEmpty(Merc.MonedaMercancia)) + { + Mercancia_.Add(new XAttribute("Moneda", Merc.MonedaMercancia)); + } + + if (TranspInternac == "Sí") { + if (!string.IsNullOrEmpty(Merc.FraccionArancelaria)) + { + Mercancia_.Add(new XAttribute("FraccionArancelaria", Merc.FraccionArancelaria)); + } + + if (!string.IsNullOrEmpty(Merc.UUIDComercioExt) && Merc.UUIDComercioExt !="0") + { + Mercancia_.Add(new XAttribute("UUIDComercioExt", Merc.UUIDComercioExt)); + } + } + + //nuevos campos Mercancias CCP 3.0 + if (!string.IsNullOrEmpty(Merc.CPM_SECTORCOFEPRIS)) { + Mercancia_.Add(new XAttribute("SectorCOFEPRIS", Merc.CPM_SECTORCOFEPRIS)); + + } + /* + Si SectorCOFEPRIS es 01-Medicamentos, solo incluir : + “DenominacionGenericaProd”, “DenominacionDistintivaProd”, “Fabricante”, “FechaCaducidad”, + “LoteMedicamento”, “FormaFarmaceutica”, “CondicionesEspTransp” y + “RegistroSanitarioFolioAutorizacion” deben existir y contener un valor. + */ + + /* + Cuando este atributo contenga el valor “02” del catálogo catCartaPorte:c_SectorCOFEPRIS + con descripción “Precursores y químicos de uso dual”, + los atributos “NombreIngredienteActivo”, “NomQuimico”, “Fabricante”, “FechaCaducidad”, + “LoteMedicamento”,“FormaFarmaceutica” y “CondicionesEspTransp” + */ + + /* + Cuando este atributo contenga el valor “03” del catálogo catCartaPorte:c_SectorCOFEPRIS + con descripción “Psicotrópicos y estupefacientes”, + los atributos “DenominacionGenericaProd”, “DenominacionDistintivaProd”, “Fabricante”, + “FechaCaducidad”, “LoteMedicamento”, “FormaFarmaceutica”, “CondicionesEspTransp” y + “RegistroSanitarioFolioAutorizacion” deben existir y contener un valor. + */ + /* + • Cuando este atributo contenga el valor “04” del catálogo catCartaPorte:c_SectorCOFEPRIS + con descripción “Sustancias tóxicas”, los atributos “NomQuimico” y “NumCAS” + deben existir y contener un valor. + */ + + /*• Cuando este atributo contenga el valor “05” del catálogo catCartaPorte:c_SectorCOFEPRIS + * con descripción “Plaguicidas y fertilizantes”, + * los atributos “NombreIngredienteActivo”, “NumRegSanPlagCOFEPRIS”, “DatosFabricante”, + * “DatosFormulador”, “DatosMaquilador” y “UsoAutorizado” deben existir y contener un valor.*/ + if (!string.IsNullOrEmpty(Merc.CPM_NombreIngredienteActivo) && new[] { "05", "02" }.Contains(Merc.CPM_SECTORCOFEPRIS)) { + Mercancia_.Add(new XAttribute("NombreIngredienteActivo", Merc.CPM_NombreIngredienteActivo)); + } + + if (!string.IsNullOrEmpty(Merc.CPM_NomQuimico) && new[] { "04", "02" }.Contains(Merc.CPM_SECTORCOFEPRIS)) { + Mercancia_.Add(new XAttribute("NomQuimico", Merc.CPM_NomQuimico)); + } + if (!string.IsNullOrEmpty(Merc.CPM_NumCAS) && new[] { "04" }.Contains(Merc.CPM_SECTORCOFEPRIS)) + { + Mercancia_.Add(new XAttribute("NumCAS", Merc.CPM_NumCAS)); + } + + if (!string.IsNullOrEmpty(Merc.CPM_DenominacionGenericaProd) && new[] { "01", "03" }.Contains(Merc.CPM_SECTORCOFEPRIS)) { + Mercancia_.Add(new XAttribute("DenominacionGenericaProd", Merc.CPM_DenominacionGenericaProd)); + } + + if (!string.IsNullOrEmpty(Merc.CPM_DenominacionDistintivaProd) && new[] { "01", "03" }.Contains(Merc.CPM_SECTORCOFEPRIS)) { + Mercancia_.Add(new XAttribute("DenominacionDistintivaProd", Merc.CPM_DenominacionDistintivaProd)); + } + + if (!string.IsNullOrEmpty(Merc.CPM_Fabricante) && new[] { "03", "02", "01" }.Contains(Merc.CPM_SECTORCOFEPRIS)) { + Mercancia_.Add(new XAttribute("Fabricante", Merc.CPM_Fabricante)); + } + + + if (!string.IsNullOrEmpty(Merc.CPM_FechaCaducidad) && new[] { "03", "02", "01" }.Contains(Merc.CPM_SECTORCOFEPRIS)) + { + Mercancia_.Add(new XAttribute("FechaCaducidad", Merc.CPM_FechaCaducidad)); + } + + if (!string.IsNullOrEmpty(Merc.CPM_LoteMedicamento) && new[] { "03", "02", "01" }.Contains(Merc.CPM_SECTORCOFEPRIS)) + { + Mercancia_.Add(new XAttribute("LoteMedicamento", Merc.CPM_LoteMedicamento)); + } + + if (!string.IsNullOrEmpty(Merc.CPM_FormaFarmaceutica) && new[] { "03", "02", "01" }.Contains(Merc.CPM_SECTORCOFEPRIS)) + { + Mercancia_.Add(new XAttribute("FormaFarmaceutica", Merc.CPM_FormaFarmaceutica)); + } + + if (!string.IsNullOrEmpty(Merc.CPM_CondicionesEspTransp) && new[] { "03", "02", "01" }.Contains(Merc.CPM_SECTORCOFEPRIS)) + { + Mercancia_.Add(new XAttribute("CondicionesEspTransp", Merc.CPM_CondicionesEspTransp)); + } + if (!string.IsNullOrEmpty(Merc.CPM_RegistroSanitarioFolioAutorizacion) && new[] { "03", "01" }.Contains(Merc.CPM_SECTORCOFEPRIS)) + { + Mercancia_.Add(new XAttribute("RegistroSanitarioFolioAutorizacion", Merc.CPM_RegistroSanitarioFolioAutorizacion)); + } + + /*cartaporte30:CartaPorte:Mercancias:Mercancia:PermisoImportacion + * Cuando en el atributo “CartaPorte:TranspInternac” se registre “Sí”, + * el atributo “CartaPorte:EntradaSalidaMerc” contenga el valor “Entrada” + * y el atributo SectorCOFEPRIS contenga el valor “01”, “02” o “03” + * este atributo debe existir, en caso contrario se debe omitir. */ + if (TranspInternac == "Sí" && + new[] { "03", "02", "01" }.Contains(Merc.CPM_SECTORCOFEPRIS) && + EntradaSalidaMerc == "Entrada" + ) { + + if (!string.IsNullOrEmpty(Merc.CPM_PermisoImportacion)) + { + Mercancia_.Add(new XAttribute("PermisoImportacion", Merc.CPM_PermisoImportacion)); + } + } + + + /*cartaporte30:CartaPorte:Mercancias:Mercancia:FolioImpoVUCEM + * Cuando en el atributo “CartaPorte:TranspInternac” se registre “Sí”, + * el atributo “CartaPorte:EntradaSalidaMerc” contenga el valor “Entrada” + * y el atributo SectorCOFEPRIS contenga el valor “01”, “02”, “04” o “05” + * este atributo debe existir, en caso contrario se debe omitir. */ + if (TranspInternac == "Sí" && + new[] { "05", "04", "02", "01" }.Contains(Merc.CPM_SECTORCOFEPRIS) && + EntradaSalidaMerc == "Entrada" + ) + { + if (!string.IsNullOrEmpty(Merc.CPM_FolioImpoVUCEM)) + { + Mercancia_.Add(new XAttribute("FolioImpoVUCEM", Merc.CPM_FolioImpoVUCEM)); + } + } + + + /*Cartaporte30:CartaPorte:Mercancias:Mercancia:RazonSocialEmpImp + Cuando en el atributo “CartaPorte:TranspInternac” se registre “Sí”, + el atributo “CartaPorte:EntradaSalidaMerc” contenga el valor “Entrada”, + y el atributo SectorCOFEPRIS contenga el valor “04” este atributo debe existir + ,en caso contrario se debe omitir. */ + if (TranspInternac == "Sí" && + new[] { "04" }.Contains(Merc.CPM_SECTORCOFEPRIS) && + EntradaSalidaMerc == "Entrada" + ) + { + if (!string.IsNullOrEmpty(Merc.CPM_RazonSocialEmpImp)) + { + Mercancia_.Add(new XAttribute("RazonSocialEmpImp", Merc.CPM_RazonSocialEmpImp)); + } + + } + + + if (!string.IsNullOrEmpty(Merc.CPM_NumRegSanPlagCOFEPRIS) && new[] { "05" }.Contains(Merc.CPM_SECTORCOFEPRIS)) + { + Mercancia_.Add(new XAttribute("NumRegSanPlagCOFEPRIS", Merc.CPM_NumRegSanPlagCOFEPRIS)); + } + + if (!string.IsNullOrEmpty(Merc.CPM_DatosFabricante) && new[] { "05" }.Contains(Merc.CPM_SECTORCOFEPRIS)) + { + Mercancia_.Add(new XAttribute("DatosFabricante", Merc.CPM_DatosFabricante)); + } + + if (!string.IsNullOrEmpty(Merc.CPM_DatosFormulador) && new[] { "05" }.Contains(Merc.CPM_SECTORCOFEPRIS)) + { + Mercancia_.Add(new XAttribute("DatosFormulador", Merc.CPM_DatosFormulador)); + } + + if (!string.IsNullOrEmpty(Merc.CPM_DatosMaquilador) && new[] { "05" }.Contains(Merc.CPM_SECTORCOFEPRIS)) + { + Mercancia_.Add(new XAttribute("DatosMaquilador", Merc.CPM_DatosMaquilador)); + } + + if (!string.IsNullOrEmpty(Merc.CPM_UsoAutorizado) && new[] { "05" }.Contains(Merc.CPM_SECTORCOFEPRIS)) + { + Mercancia_.Add(new XAttribute("UsoAutorizado", Merc.CPM_UsoAutorizado)); + } + + /* cartaporte30:CartaPorte:Mercancias:Mercancia:TipoMateria + Cuando en el atributo “CartaPorte:TranspInternac” se registre “Sí”, + este atributo debe existir y contener un valor del catálogo catCartaPorte:c_TipoMateria, + en caso contrario se debe omitir. */ + if (TranspInternac == "Sí") + { + if (!string.IsNullOrEmpty(Merc.CPM_TipoMateria)) + { + Mercancia_.Add(new XAttribute("TipoMateria", Merc.CPM_TipoMateria)); + } + + /*cartaporte30:CartaPorte:Mercancias:Mercancia:DescripcionMateria + Cuando el atributo “TipoMateria” contenga el valor “05” con descripción “Otra”, + este atributo debe existir, en caso contrario se debe omitir. */ + if (!string.IsNullOrEmpty(Merc.CPM_TipoMateria) && Merc.CPM_TipoMateria == "05") { + if (!string.IsNullOrEmpty(Merc.CPM_DescripcionMateria)) + { + Mercancia_.Add(new XAttribute("DescripcionMateria", Merc.CPM_DescripcionMateria)); + } + } + } + + + //-------------------DocumentacionAduanera CCP3.0------------Antes como: Pedimentos Mercancia + /*cartaporte30:CartaPorte:Mercancias:Mercancia Nodo:DocumentacionAduanera + Cuando en el atributo “CartaPorte:TranspInternac” se registre el valor “Sí” + y el atributo “EntradaSalidaMerc” contenga el valor “Entrada” este nodo debe existir. + Cuando en el atributo “CartaPorte:TranspInternac” se registre el valor “Sí” + y el atributo “EntradaSalidaMerc” contenga el valor “Salida” este nodo puede existir. + En cualquier otro caso no debe existir. */ + if (TranspInternac == "Sí") { + var Pedis = (from p in Pedimentos_Mercancias + where p.ID_CP_MERANCIA_PEDIMENTO == Merc.CartaPorteMerca && p.LINEAMERCANCIA == Merc.LineaMerca + select p).Count(); + + if (Pedis > 0) + { + var query = from p in Pedimentos_Mercancias + where p.ID_CP_MERANCIA_PEDIMENTO == Merc.CartaPorteMerca && p.LINEAMERCANCIA == Merc.LineaMerca + select p; + + foreach (var Pe in query) + { + + XElement Mercancia_Ped = new XElement(_CartaPorte + "DocumentacionAduanera"); + + /*cartaporte30:CartaPorte:Mercancias:Mercancia:DocumentacionAduanera: TipoDocumento + Cuando el atributo “EntradaSalidaMerc” contenga el valor “Salida”, + este atributo debe contener una clave distinta de “01” del catálogo “catCartaPorte:c_DocumentoAduanero”. */ + Mercancia_Ped.Add(new XAttribute("TipoDocumento", Pe.TIPODOCUMENTO)); + if (Pe.TIPODOCUMENTO=="01" && EntradaSalidaMerc == "Entrada") + { + Mercancia_Ped.Add(new XAttribute("NumPedimento", Pe.PEDIMENTO)); + Mercancia_Ped.Add(new XAttribute("RFCImpo", Pe.RFCImpo)); + } + else { + Mercancia_Ped.Add(new XAttribute("IdentDocAduanero", Pe.IdentDocAduanero)); + } + + + + + Mercancia_.Add(Mercancia_Ped); + } + } + + } + + + //---------------------------------------------------Guias de indentificacion Mercncia + var Guias = (from g in Guias_Identificacion_Mercancias + where g.ID_CARTAPORTE_MERCANCIA == Merc.CartaPorteMerca && g.LINEAMERCANCIA == Merc.LineaMerca + select g).Count(); + if (Guias > 0) + { + var query = from g in Guias_Identificacion_Mercancias + where g.ID_CARTAPORTE_MERCANCIA == Merc.CartaPorteMerca && g.LINEAMERCANCIA == Merc.LineaMerca + select g; + foreach (var Gui in query) + { + XElement GuiasTrans = new XElement(_CartaPorte + "GuiasIdentificacion"); + GuiasTrans.Add(new XAttribute("NumeroGuiaIdentificacion", Gui.NUMEROGUIAIDENTIFICACION)); + GuiasTrans.Add(new XAttribute("DescripGuiaIdentificacion", Gui.DESCRIPGUIAIDENTIFICACION)); + GuiasTrans.Add(new XAttribute("PesoGuiaIdentificacion", Gui.PESOGUIAIDENTIFICACION.ToString(strDec).Replace(",", string.Empty))); + Mercancia_.Add(GuiasTrans); + + } + + } + + + + + Mercancias.Add(Mercancia_); + + //Cantidad Transporta + var CT = from s in PartidasMercancia_CantidadTransporta + where s.ID == Merc.CartaPorteMerca && s.Linea_Merca == Merc.LineaMerca + select s; //Filtra las lineas de cada Mercancia de Cantidad Transporta + + foreach (var CantTrans in CT) + { + XElement Merc_CantidadTransporta = new XElement(_CartaPorte + "CantidadTransporta"); + + + Merc_CantidadTransporta.Add(new XAttribute("Cantidad", CantTrans.Cantidad.ToString(strDec).Replace(",", string.Empty))); + Merc_CantidadTransporta.Add(new XAttribute("IDOrigen", CantTrans.IDOrigen)); + Merc_CantidadTransporta.Add(new XAttribute("IDDestino", CantTrans.IDDestino)); + Merc_CantidadTransporta.Add(new XAttribute("CvesTransporte", CantTrans.CvesTransporte)); + Mercancia_.Add(Merc_CantidadTransporta); + }//Fin foreach CantidadTransporta + + + //---------------------Auto Transporte Federal + if (Count == TotMerca) + { + XElement AutoTransp = new XElement(_CartaPorte + "Autotransporte"); + + AutoTransp.Add(new XAttribute("PermSCT", PermSCT)); + AutoTransp.Add(new XAttribute("NumPermisoSCT", NumPermisoSCT)); + //AutoTransp.Add(new XAttribute("NombreAseg", NombreAseg)); + //AutoTransp.Add(new XAttribute("NumPolizaSeguro", NumPolizaSeguro)); + + XElement IdentificacionVehicular = new XElement(_CartaPorte + "IdentificacionVehicular"); + IdentificacionVehicular.Add(new XAttribute("ConfigVehicular", ConfigVehicular)); + IdentificacionVehicular.Add(new XAttribute("PesoBrutoVehicular", CP_MCIAS_AUTOFED_IDV_PESOBRUTOVEHICULAR)); + IdentificacionVehicular.Add(new XAttribute("PlacaVM", PlacaVM)); + IdentificacionVehicular.Add(new XAttribute("AnioModeloVM", AnioModeloVM)); + AutoTransp.Add(IdentificacionVehicular); + + //Seguros + XElement Seguros = new XElement(_CartaPorte + "Seguros"); + if (!string.IsNullOrEmpty(AseguraRespCivil)) + { + Seguros.Add(new XAttribute("AseguraRespCivil", AseguraRespCivil)); + } + if (!string.IsNullOrEmpty(PolizaRespCivil)) + { + Seguros.Add(new XAttribute("PolizaRespCivil", PolizaRespCivil)); + } + if (!string.IsNullOrEmpty(AseguraMedAmbiente)) + { + Seguros.Add(new XAttribute("AseguraMedAmbiente", AseguraMedAmbiente)); + } + if (!string.IsNullOrEmpty(PolizaMedAmbiente)) + { + Seguros.Add(new XAttribute("PolizaMedAmbiente", PolizaMedAmbiente)); + } + if (!string.IsNullOrEmpty(AseguraCarga)) + { + Seguros.Add(new XAttribute("AseguraCarga", AseguraCarga)); + } + if (!string.IsNullOrEmpty(PolizaCarga)) + { + Seguros.Add(new XAttribute("PolizaCarga", PolizaCarga)); + } + + if (PrimaSeguro.ToString(strDec).Replace(",", string.Empty) != "0.00") { + Seguros.Add(new XAttribute("PrimaSeguro", PrimaSeguro)); + } + + AutoTransp.Add(Seguros); + + + XElement Remolques = null; + + if (!string.IsNullOrEmpty(SubTipoRem)) + { + Remolques = new XElement(_CartaPorte + "Remolques"); + + XElement Rem1 = new XElement(_CartaPorte + "Remolque"); + XElement Rem2 = new XElement(_CartaPorte + "Remolque"); + + if (!string.IsNullOrEmpty(SubTipoRem) && !string.IsNullOrEmpty(Placa)) + { + Rem1.Add(new XAttribute("SubTipoRem", SubTipoRem)); + Rem1.Add(new XAttribute("Placa", Placa)); + Remolques.Add(Rem1); + } + + + if (!string.IsNullOrEmpty(SubTipoRem2) && !string.IsNullOrEmpty(Placa2)) + { + Rem2.Add(new XAttribute("SubTipoRem", SubTipoRem2)); + Rem2.Add(new XAttribute("Placa", Placa2)); + Remolques.Add(Rem2); + } + + + + AutoTransp.Add(Remolques); + } + + + Mercancias.Add(AutoTransp); + + } + + + }// fin ForEach Mercancias + + ///////////////////////////-------------------FiguraTransporte + XElement FiguraTransporte = new XElement(_CartaPorte + "FiguraTransporte"); + //FiguraTransporte.Add(new XAttribute("CveTransporte", FIGURA_TRAN_CLAVETRANSPORTE)); + + + + + int Oper = Figura_Transportes.Count(n => n.TIPOFIGURA == "O"); + + int Prop = (from Propi in Figura_Transportes + where Propi.TIPOFIGURA == "P" select Propi).Count(); + + int Arren = (from Arre in Figura_Transportes + where Arre.TIPOFIGURA == "A" select Arre).Count(); + + int Notif = (from Noti in Figura_Transportes + where Noti.TIPOFIGURA == "N" + select Noti).Count(); + + + + XElement Operadores = Oper > 0 ? new XElement(_CartaPorte + "Operadores") : null; + XElement Propietario = Prop > 0 ? new XElement(_CartaPorte + "Propietario") : null; + XElement Arrendatario = Arren > 0 ? new XElement(_CartaPorte + "Arrendatario") : null; + XElement Notificado = Notif > 0 ? new XElement(_CartaPorte + "Notificado") : null; + + + foreach (var FigTrans in Figura_Transportes) + { + //Agregar nuevo nodo ... + XElement TiposFigura = new XElement(_CartaPorte + "TiposFigura"); + + XElement Domicilio = new XElement(_CartaPorte + "Domicilio"); + + //Operador + if (FigTrans.TIPOFIGURA == "O" && Oper > 0) + { + //XElement Operador = new XElement(_CartaPorte + "Operador"); + + TiposFigura.Add(new XAttribute("TipoFigura", "01")); + + if (!string.IsNullOrEmpty(FigTrans.RFCOperador)) + { + TiposFigura.Add(new XAttribute("RFCFigura", FigTrans.RFCOperador)); + } + + + if (!string.IsNullOrEmpty(FigTrans.NumLicencia)) + { + TiposFigura.Add(new XAttribute("NumLicencia", FigTrans.NumLicencia)); + } + if (!string.IsNullOrEmpty(FigTrans.NombreOperador)) + { + TiposFigura.Add(new XAttribute("NombreFigura", FigTrans.NombreOperador)); + } + + + if (!string.IsNullOrEmpty(FigTrans.NumRegIdTribOperador)) + { + TiposFigura.Add(new XAttribute("NumRegIdTribFigura", FigTrans.NumRegIdTribOperador)); + } + + if (!string.IsNullOrEmpty(FigTrans.ResidenciaFiscalOperador)) + { + TiposFigura.Add(new XAttribute("ResidenciaFiscalFigura", FigTrans.ResidenciaFiscalOperador)); + } + + //Domicilio + if (!string.IsNullOrEmpty(FigTrans.Calle)) + { + Domicilio.Add(new XAttribute("Calle", FigTrans.Calle)); + } + if (!string.IsNullOrEmpty(FigTrans.NumeroExterior)) + { + Domicilio.Add(new XAttribute("NumeroExterior", FigTrans.NumeroExterior)); + } + if (!string.IsNullOrEmpty(FigTrans.NumeroInterior)) + { + Domicilio.Add(new XAttribute("NumeroInterior", FigTrans.NumeroInterior)); + } + if (!string.IsNullOrEmpty(FigTrans.Colonia)) + { + Domicilio.Add(new XAttribute("Colonia", FigTrans.Colonia)); + } + if (!string.IsNullOrEmpty(FigTrans.Localidad)) + { + Domicilio.Add(new XAttribute("Localidad", FigTrans.Localidad)); + } + if (!string.IsNullOrEmpty(FigTrans.Referencia)) + { + Domicilio.Add(new XAttribute("Referencia", FigTrans.Referencia)); + } + if (!string.IsNullOrEmpty(FigTrans.Municipio)) + { + Domicilio.Add(new XAttribute("Municipio", FigTrans.Municipio)); + } + if (!string.IsNullOrEmpty(FigTrans.Estado)) + { + Domicilio.Add(new XAttribute("Estado", FigTrans.Estado)); + } + if (!string.IsNullOrEmpty(FigTrans.Pais)) + { + Domicilio.Add(new XAttribute("Pais", FigTrans.Pais)); + } + if (!string.IsNullOrEmpty(FigTrans.CodigoPostal)) + { + Domicilio.Add(new XAttribute("CodigoPostal", FigTrans.CodigoPostal)); + } + + TiposFigura.Add(Domicilio); + + //Operadores.Add(TiposFigura); + + FiguraTransporte.Add(TiposFigura); + } + + //Propietario + if (FigTrans.TIPOFIGURA == "P" && Prop > 0) + { + //XElement Propi = new XElement(_CartaPorte + "Propietario"); + + TiposFigura.Add(new XAttribute("TipoFigura", "02")); + + if (!string.IsNullOrEmpty(FigTrans.RFCPropietario)) + { + TiposFigura.Add(new XAttribute("RFCFigura", FigTrans.RFCPropietario)); + } + + if (!string.IsNullOrEmpty(FigTrans.NombrePropietario)) + { + TiposFigura.Add(new XAttribute("NombreFigura", FigTrans.NombrePropietario)); + } + + + if (!string.IsNullOrEmpty(FigTrans.NumRegIdTribPropietario)) + { + TiposFigura.Add(new XAttribute("NumRegIdTribFigura", FigTrans.NumRegIdTribPropietario)); + } + if (!string.IsNullOrEmpty(FigTrans.ResidenciaFiscalPropietario)) + { + TiposFigura.Add(new XAttribute("ResidenciaFiscalFigura", FigTrans.ResidenciaFiscalPropietario)); + } + + if (!string.IsNullOrEmpty(FigTrans.Calle)) + { + Domicilio.Add(new XAttribute("Calle", FigTrans.Calle)); + } + if (!string.IsNullOrEmpty(FigTrans.NumeroExterior)) + { + Domicilio.Add(new XAttribute("NumeroExterior", FigTrans.NumeroExterior)); + } + + if (!string.IsNullOrEmpty(FigTrans.NumeroInterior)) + { + Domicilio.Add(new XAttribute("NumeroInterior", FigTrans.NumeroInterior)); + } + + if (!string.IsNullOrEmpty(FigTrans.Colonia)) + { + Domicilio.Add(new XAttribute("Colonia", FigTrans.Colonia)); + } + + if (!string.IsNullOrEmpty(FigTrans.Localidad)) + { + Domicilio.Add(new XAttribute("Localidad", FigTrans.Localidad)); + } + + if (!string.IsNullOrEmpty(FigTrans.Referencia)) + { + Domicilio.Add(new XAttribute("Referencia", FigTrans.Referencia)); + } + + if (!string.IsNullOrEmpty(FigTrans.Municipio)) + { + Domicilio.Add(new XAttribute("Municipio", FigTrans.Municipio)); + } + + if (!string.IsNullOrEmpty(FigTrans.Estado)) + { + Domicilio.Add(new XAttribute("Estado", FigTrans.Estado)); + } + + if (!string.IsNullOrEmpty(FigTrans.Pais)) + { + Domicilio.Add(new XAttribute("Pais", FigTrans.Pais)); + } + + if (!string.IsNullOrEmpty(FigTrans.CodigoPostal)) + { + Domicilio.Add(new XAttribute("CodigoPostal", FigTrans.CodigoPostal)); + } + TiposFigura.Add(Domicilio); + FiguraTransporte.Add(TiposFigura); + } + + + } + + //////////////////////////--------------------Fin Figura Transporte + Carta_Porte.Add(Mercancias); + + Carta_Porte.Add(FiguraTransporte); + + + return Carta_Porte; + } + #endregion Complemento_CartaPorte + + //complemento comercio exterior xml + #region complemento comercio exterior xml + public XElement complemento_comercio_exterior_xml() + { + string strDec = "n2"; + string strDec4 = "n4"; + bool CCE20 = true; + XNamespace _ComercioExterior = CCE20 ? "http://www.sat.gob.mx/ComercioExterior20" : "http://www.sat.gob.mx/ComercioExterior11"; + XElement ComercioExterior = new XElement(_ComercioExterior + "ComercioExterior"); + + ComercioExterior.Add(new XAttribute("Version", CCE20? "2.0":"1.1")); + if (!string.IsNullOrEmpty(ComercioExterior_MotivoTraslado)) + { + ComercioExterior.Add(new XAttribute("MotivoTraslado", ComercioExterior_MotivoTraslado)); + } + + //Se eliminan campos en version 2.0 + if (!CCE20) { + ComercioExterior.Add(new XAttribute("TipoOperacion", ComercioExterior_TipoOperacion)); + + if (!string.IsNullOrEmpty(ComercioExterior_Subdivision)) + { + ComercioExterior.Add(new XAttribute("Subdivision", ComercioExterior_Subdivision)); + } + } + + if (!string.IsNullOrEmpty(ComercioExterior_ClaveDePedimento)) + { + ComercioExterior.Add(new XAttribute("ClaveDePedimento", ComercioExterior_ClaveDePedimento)); + } + if (!string.IsNullOrEmpty(ComercioExterior_CertificadoOrigen)) + { + ComercioExterior.Add(new XAttribute("CertificadoOrigen", ComercioExterior_CertificadoOrigen)); + } + if (!string.IsNullOrEmpty(ComercioExterior_NumCertificadoOrigen)) + { + ComercioExterior.Add(new XAttribute("NumCertificadoOrigen", ComercioExterior_NumCertificadoOrigen)); + } + if (!string.IsNullOrEmpty(ComercioExterior_NumeroExportadorConfiable)) + { + ComercioExterior.Add(new XAttribute("NumeroExportadorConfiable", ComercioExterior_NumeroExportadorConfiable)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Incoterm)) + { + ComercioExterior.Add(new XAttribute("Incoterm", ComercioExterior_Incoterm)); + } + + if (!string.IsNullOrEmpty(ComercioExterior_Observaciones)) + { + ComercioExterior.Add(new XAttribute("Observaciones", ComercioExterior_Observaciones)); + } + if (ComercioExterior_TipoCambioUSD > 0) + { + string strComercioExterior_TipoCambioUSD = string.Empty; + if (CFDISis == "cg2") + { + strComercioExterior_TipoCambioUSD = ComercioExterior_TipoCambioUSD == 0 ? "0" : ComercioExterior_TipoCambioUSD.ToString(strDec4).Replace(",", string.Empty); + } + else + { + strComercioExterior_TipoCambioUSD = ComercioExterior_TipoCambioUSD == 0 ? "0" : ComercioExterior_TipoCambioUSD.ToString(strDec4).Replace(",", string.Empty); + } + ComercioExterior.Add(new XAttribute("TipoCambioUSD", strComercioExterior_TipoCambioUSD)); + } + if (ComercioExterior_TotalUSD > 0) + { + string strComercioExterior_TotalUSD = ComercioExterior_TotalUSD == 0 ? "0" : ComercioExterior_TotalUSD.ToString(strDec).Replace(",", string.Empty); + ComercioExterior.Add(new XAttribute("TotalUSD", strComercioExterior_TotalUSD)); + } + + //emisor + XElement ComercioExterior_Emisor = new XElement(_ComercioExterior + "Emisor"); + if (!string.IsNullOrEmpty(ComercioExterior_Emisor_Curp)) + { + ComercioExterior_Emisor.Add(new XAttribute("Curp", (ComercioExterior_Emisor_Curp) )); + } + XElement ComercioExterior_Emisor_Domicilio = new XElement(_ComercioExterior + "Domicilio"); + ComercioExterior_Emisor_Domicilio.Add(new XAttribute("Calle", (ComercioExterior_Emisor_Domicilio_Calle) )); + if (!string.IsNullOrEmpty(ComercioExterior_Emisor_Domicilio_NumeroExterior)) + { + ComercioExterior_Emisor_Domicilio.Add(new XAttribute("NumeroExterior", (ComercioExterior_Emisor_Domicilio_NumeroExterior) )); + } + if (!string.IsNullOrEmpty(ComercioExterior_Emisor_Domicilio_NumeroInterior)) + { + ComercioExterior_Emisor_Domicilio.Add(new XAttribute("NumeroInterior", (ComercioExterior_Emisor_Domicilio_NumeroInterior) )); + } + if (!string.IsNullOrEmpty(ComercioExterior_Emisor_Domicilio_Colonia)) + { + ComercioExterior_Emisor_Domicilio.Add(new XAttribute("Colonia", (ComercioExterior_Emisor_Domicilio_Colonia) )); + } + if (!string.IsNullOrEmpty(ComercioExterior_Emisor_Domicilio_Localidad)) + { + ComercioExterior_Emisor_Domicilio.Add(new XAttribute("Localidad", (ComercioExterior_Emisor_Domicilio_Localidad) )); + } + if (!string.IsNullOrEmpty(ComercioExterior_Emisor_Domicilio_Referencia)) + { + ComercioExterior_Emisor_Domicilio.Add(new XAttribute("Referencia", (ComercioExterior_Emisor_Domicilio_Referencia) )); + } + if (!string.IsNullOrEmpty(ComercioExterior_Emisor_Domicilio_Municipio)) + { + ComercioExterior_Emisor_Domicilio.Add(new XAttribute("Municipio", (ComercioExterior_Emisor_Domicilio_Municipio) )); + } + ComercioExterior_Emisor_Domicilio.Add(new XAttribute("Estado", ComercioExterior_Emisor_Domicilio_Estado)); + ComercioExterior_Emisor_Domicilio.Add(new XAttribute("Pais", ComercioExterior_Emisor_Domicilio_Pais)); + if (!string.IsNullOrEmpty(ComercioExterior_Emisor_Domicilio_CodigoPostal)) + { + ComercioExterior_Emisor_Domicilio.Add(new XAttribute("CodigoPostal", ComercioExterior_Emisor_Domicilio_CodigoPostal)); + } + ComercioExterior_Emisor.Add(ComercioExterior_Emisor_Domicilio); + ComercioExterior.Add(ComercioExterior_Emisor); + + //propietario + if (!string.IsNullOrEmpty(ComercioExterior_Propietario_NumRegIdTrib) || !string.IsNullOrEmpty(ComercioExterior_Propietario_NumRegIdTrib)) + { + XElement ComercioExterior_Propietario = new XElement(_ComercioExterior + "Propietario"); + ComercioExterior_Propietario.Add(new XAttribute("NumRegIdTrib", ComercioExterior_Propietario_NumRegIdTrib)); + ComercioExterior_Propietario.Add(new XAttribute("ResidenciaFiscal", ComercioExterior_Propietario_ResidenciaFiscal)); + ComercioExterior.Add(ComercioExterior_Propietario); + } + + //receptor + XElement ComercioExterior_Receptor = new XElement(_ComercioExterior + "Receptor"); + if (!string.IsNullOrEmpty(ComercioExterior_Receptor_NumRegIdTrib)) + { + ComercioExterior_Receptor.Add(new XAttribute("NumRegIdTrib", ComercioExterior_Receptor_NumRegIdTrib)); + } + + bool bolRec = false; + XElement ComercioExterior_Receptor_Domicilio = new XElement(_ComercioExterior + "Domicilio"); + if (!string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_Calle)) + { + ComercioExterior_Receptor_Domicilio.Add(new XAttribute("Calle", ComercioExterior_Receptor_Domicilio_Calle)); + bolRec = true; + } + if (!string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_NumeroExterior)) + { + ComercioExterior_Receptor_Domicilio.Add(new XAttribute("NumeroExterior", ComercioExterior_Receptor_Domicilio_NumeroExterior)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_NumeroInterior)) + { + ComercioExterior_Receptor_Domicilio.Add(new XAttribute("NumeroInterior", ComercioExterior_Receptor_Domicilio_NumeroInterior)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_Colonia)) + { + ComercioExterior_Receptor_Domicilio.Add(new XAttribute("Colonia", ComercioExterior_Receptor_Domicilio_Colonia)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_Localidad)) + { + ComercioExterior_Receptor_Domicilio.Add(new XAttribute("Localidad", ComercioExterior_Receptor_Domicilio_Localidad)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_Referencia)) + { + ComercioExterior_Receptor_Domicilio.Add(new XAttribute("Referencia", ComercioExterior_Receptor_Domicilio_Referencia)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_Municipio)) + { + ComercioExterior_Receptor_Domicilio.Add(new XAttribute("Municipio", ComercioExterior_Receptor_Domicilio_Municipio)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_Estado)) + { + ComercioExterior_Receptor_Domicilio.Add(new XAttribute("Estado", ComercioExterior_Receptor_Domicilio_Estado)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_Pais)) + { + ComercioExterior_Receptor_Domicilio.Add(new XAttribute("Pais", ComercioExterior_Receptor_Domicilio_Pais)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Receptor_Domicilio_CodigoPostal)) + { + ComercioExterior_Receptor_Domicilio.Add(new XAttribute("CodigoPostal", ComercioExterior_Receptor_Domicilio_CodigoPostal)); + } + if (bolRec) + { + ComercioExterior_Receptor.Add(ComercioExterior_Receptor_Domicilio); + ComercioExterior.Add(ComercioExterior_Receptor); + } + + //destinatario + XElement ComercioExterior_Destinatario = new XElement(_ComercioExterior + "Destinatario"); + if (!string.IsNullOrEmpty(ComercioExterior_Destinatario_NumRegIdTrib)) + { + ComercioExterior_Destinatario.Add(new XAttribute("NumRegIdTrib", ComercioExterior_Destinatario_NumRegIdTrib)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Destinatario_Nombre)) + { + ComercioExterior_Destinatario.Add(new XAttribute("Nombre", ComercioExterior_Destinatario_Nombre)); + } + + //destinatario + bool bolDes = false; + bolDes = true; + XElement ComercioExterior_Destinatario_Domicilio = new XElement(_ComercioExterior + "Domicilio"); + ComercioExterior_Destinatario_Domicilio.Add(new XAttribute("Calle", ComercioExterior_Destinatario_Domicilio_Calle)); + if (!string.IsNullOrEmpty(ComercioExterior_Destinatario_Domicilio_NumeroExterior)) + { + ComercioExterior_Destinatario_Domicilio.Add(new XAttribute("NumeroExterior", ComercioExterior_Destinatario_Domicilio_NumeroExterior)); + + } + if (!string.IsNullOrEmpty(ComercioExterior_Destinatario_Domicilio_NumeroInterior)) + { + ComercioExterior_Destinatario_Domicilio.Add(new XAttribute("NumeroInterior", ComercioExterior_Destinatario_Domicilio_NumeroInterior)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Destinatario_Domicilio_Colonia)) + { + ComercioExterior_Destinatario_Domicilio.Add(new XAttribute("Colonia", ComercioExterior_Destinatario_Domicilio_Colonia)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Destinatario_Domicilio_Localidad)) + { + ComercioExterior_Destinatario_Domicilio.Add(new XAttribute("Localidad", ComercioExterior_Destinatario_Domicilio_Localidad)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Destinatario_Domicilio_Referencia)) + { + ComercioExterior_Destinatario_Domicilio.Add(new XAttribute("Referencia", ComercioExterior_Destinatario_Domicilio_Referencia)); + } + if (!string.IsNullOrEmpty(ComercioExterior_Destinatario_Domicilio_Municipio)) + { + ComercioExterior_Destinatario_Domicilio.Add(new XAttribute("Municipio", ComercioExterior_Destinatario_Domicilio_Municipio)); + } + ComercioExterior_Destinatario_Domicilio.Add(new XAttribute("Estado", ComercioExterior_Destinatario_Domicilio_Estado)); + ComercioExterior_Destinatario_Domicilio.Add(new XAttribute("Pais", ComercioExterior_Destinatario_Domicilio_Pais)); + if (!string.IsNullOrEmpty(ComercioExterior_Destinatario_Domicilio_CodigoPostal)) + { + ComercioExterior_Destinatario_Domicilio.Add(new XAttribute("CodigoPostal", ComercioExterior_Destinatario_Domicilio_CodigoPostal)); + } + if (bolDes) + { + ComercioExterior_Destinatario.Add(ComercioExterior_Destinatario_Domicilio); + ComercioExterior.Add(ComercioExterior_Destinatario); + } + + XElement ComercioExterior_Mercancias = new XElement(_ComercioExterior + "Mercancias"); + foreach (var atr in lisComercioExterior_Mercancias) + { + XElement ComercioExterior_Mercancia = new XElement(_ComercioExterior + "Mercancia"); + ComercioExterior_Mercancia.Add(new XAttribute("NoIdentificacion", atr.NoIdentificacion)); + if (!string.IsNullOrEmpty(atr.FraccionArancelaria)) + { + ComercioExterior_Mercancia.Add(new XAttribute("FraccionArancelaria", atr.FraccionArancelaria)); + } + if (atr.CantidadAduana > 0) + { + ComercioExterior_Mercancia.Add(new XAttribute("CantidadAduana", atr.CantidadAduana)); + } + ComercioExterior_Mercancia.Add(new XAttribute("UnidadAduana", atr.UnidadAduana)); + if (atr.ValorUnitarioAduana > 0) + { + string strValorUnitarioAduana = atr.ValorUnitarioAduana == 0 ? "0" : atr.ValorUnitarioAduana.ToString(strDec).Replace(",", string.Empty); + ComercioExterior_Mercancia.Add(new XAttribute("ValorUnitarioAduana", strValorUnitarioAduana)); + } + string strValorDolares = atr.ValorDolares == 0 ? "0" : atr.ValorDolares.ToString(strDec).Replace(",", string.Empty); + ComercioExterior_Mercancia.Add(new XAttribute("ValorDolares", strValorDolares)); + bool bolDesEsp = false; + XElement ComercioExterior_Mercancia_DescripcionesEspecificas = new XElement(_ComercioExterior + "DescripcionesEspecificas"); + if (!string.IsNullOrEmpty(atr.DescripcionesEspecificas_Marca)) + { + ComercioExterior_Mercancia_DescripcionesEspecificas.Add(new XAttribute("Marca", atr.DescripcionesEspecificas_Marca)); + bolDesEsp = true; + } + if (!string.IsNullOrEmpty(atr.DescripcionesEspecificas_Modelo)) + { + ComercioExterior_Mercancia_DescripcionesEspecificas.Add(new XAttribute("Modelo", atr.DescripcionesEspecificas_Modelo)); + } + if (!string.IsNullOrEmpty(atr.DescripcionesEspecificas_SubModelo)) + { + ComercioExterior_Mercancia_DescripcionesEspecificas.Add(new XAttribute("SubModelo", atr.DescripcionesEspecificas_SubModelo)); + } + if (!string.IsNullOrEmpty(atr.DescripcionesEspecificas_NumeroSerie)) + { + ComercioExterior_Mercancia_DescripcionesEspecificas.Add(new XAttribute("NumeroSerie", atr.DescripcionesEspecificas_NumeroSerie)); + } + if (bolDesEsp) + { + ComercioExterior_Mercancia.Add(ComercioExterior_Mercancia_DescripcionesEspecificas); + } + ComercioExterior_Mercancias.Add(ComercioExterior_Mercancia); + } + ComercioExterior.Add(ComercioExterior_Mercancias); + return ComercioExterior; + } + #endregion complemento comercio exterior xml + + //complemento INE XML + #region INE XML + public XElement complemento_INE_xml() + { + XNamespace _Complemento_INE = "http://www.sat.gob.mx/ine"; // es la definicion del schema, se encuentra dentro de la guia de llenado la que no tiene extencion + XElement Complemento_INE = new XElement(_Complemento_INE + "INE"); + XNamespace SL1 = "http://www.sat.gob.mx/ine"; + XNamespace SL = "http://www.sat.gob.mx/ine http://www.sat.gob.mx/sitio_internet/cfd/ine/INE11.xsd"; + + XNamespace xmlns = XNamespace.Get("http://www.sat.gob.mx/ine"); + XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance"); + XNamespace schemaLocation = XNamespace.Get("http://www.sat.gob.mx/ine http://www.sat.gob.mx/sitio_internet/cfd/ine/INE11.xsd"); + foreach (var partida in Partida_INE) + { + XElement Contabilidad = null; + XElement Entidad = new XElement(_Complemento_INE + "Entidad");// papa + + Entidad.Add(new XAttribute("ClaveEntidad", partida.ClaveEntidad)); //hijo + + if (partida.IdContabilidad > 0) + { + Contabilidad = new XElement(_Complemento_INE + "Contabilidad"); //hijo opcional + Contabilidad.Add(new XAttribute("IdContabilidad", partida.IdContabilidad)); + } + + if (!string.IsNullOrEmpty(partida.Ambito)) + { + Entidad.Add(new XAttribute("Ambito", partida.Ambito)); //hijo opcional + } + if (partida.IdContabilidad > 0) + { + Entidad.Add(Contabilidad); + } + Complemento_INE.Add(Entidad); + } + Complemento_INE.Add(new XAttribute(XNamespace.Xmlns + "ine", SL1)); + //Complemento_INE.Add(new XAttribute(XNamespace.Xmlns + "xsi", xsi)); + Complemento_INE.Add(new XAttribute(xsi + "schemaLocation", schemaLocation)); + //Complemento_INE.Add(new XAttribute(XNamespace.Xmlns + "xsi", XNamespace.Get("http://www.sat.gob.mx/ine http://www.sat.gob.mx/sitio_internet/cfd/ine/INE11.xsd"))); + + Complemento_INE.Add(new XAttribute("Version", "1.1")); + //las sobrecargas corresponden: 1) nombre del atributo del schema del XSD, 2) nombre de la variable. + Complemento_INE.Add(new XAttribute("TipoProceso", Comprobante_INE_TipoProceso)); + if (!string.IsNullOrEmpty(Comprobante_INE_TipoComite)) + { + Complemento_INE.Add(new XAttribute("TipoComite", Comprobante_INE_TipoComite)); + } + + if (Comprobante_INE_IdContabilidad > 0) + { + Complemento_INE.Add(new XAttribute("IdContabilidad", Comprobante_INE_IdContabilidad)); + } + + return Complemento_INE; + } + #endregion INE XML + + + + + + + /*** ***/ + //generar xml + #region cfdi33 xml + public void cfdi33_xml() + { + try + { + string strDec = "N2"; + string strDec4 = "N4"; + string strDec6 = "N6"; + string strDec8 = "N8"; + + string strDecTrasladosP = $"N{Count_TrasladosP.Value.ToString()}"; + string strDecTrasladosDR = $"N{Count_TrasladosDR.Value.ToString()}"; + + + + + string strDec10 = "n10"; + if (string.IsNullOrEmpty(Comprobante_CadenaOriginal)) + { + sys_estatus("Generando Comprobante..."); + } + //no se puede especificar : (dos puntos) en el nombre se tiene que hacer mediante namespace ya que esto denota una herencia en el xml + #region namespace referencias + XNamespace cfdi = "http://www.sat.gob.mx/cfd/4"; + XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; + XNamespace schemaLocation; + + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComercioExterior_Activo) + { + schemaLocation = "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/ComercioExterior20 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior20/ComercioExterior20.xsd"; + } + else if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComplementoNotaria == 1 && ComprobanteDBAplicacion == "servicemanager") + { + schemaLocation = "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/notariospublicos http://www.sat.gob.mx/sitio_internet/cfd/notariospublicos/notariospublicos.xsd"; + } + else if (ComprobanteDBTipoComprobante.ToLower() == "pago") + { + schemaLocation = "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/Pagos20 http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos20.xsd"; + } + else if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "bms" && INE_Activo) + { + schemaLocation = "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/ine http://www.sat.gob.mx/sitio_internet/cfd/ine/INE11.xsd"; + } + else if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "bms" && Complemento_IEDU_Activo) + { + schemaLocation = "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/iedu http://www.sat.gob.mx/sitio_internet/cfd/iedu/iedu.xsd"; + } + else if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "cg2" && Complemento_Terceros) + { + schemaLocation = "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/terceros http://www.sat.gob.mx/sitio_internet/cfd/terceros/terceros11.xsd"; + } + + //Schema Carta Porte + //else if (ComprobanteDBTipoComprobante.ToLower() == "traslado" && CFDISis == "bms" && CartaPorte) + else if (CFDISis == "bms" && CartaPorte && Sin_CP != "SIN_CP") + { + //schemaLocation = "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/CartaPorte30 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte30.xsd"; + schemaLocation = "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/CartaPorte31 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte31.xsd"; + } + else + { + schemaLocation = "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd"; + } + #endregion namespace referencias + + //Nodo Comprobante + #region comprobante atributos + XElement Comprobante = new XElement(cfdi + "Comprobante"); + + Comprobante.Add(new XAttribute(XNamespace.Xmlns + "xsi", xsi)); + Comprobante.Add(new XAttribute(xsi + "schemaLocation", schemaLocation)); + Comprobante.Add(new XAttribute("Version", Comprobante_Version)); + if (!string.IsNullOrEmpty(Comprobante_Serie)) + { + Comprobante.Add(new XAttribute("Serie", Comprobante_Serie)); + } + Comprobante.Add(new XAttribute("Folio", Comprobante_Folio)); + Comprobante.Add(new XAttribute("Fecha", Comprobante_Fecha)); + if (!string.IsNullOrEmpty(Comprobante_Sello)) + { + Comprobante.Add(new XAttribute("Sello", Comprobante_Sello)); + } + if (!string.IsNullOrEmpty(Comprobante_FormaPago) && ComprobanteDBTipoComprobante.ToLower() != "traslado") + { + Comprobante.Add(new XAttribute("FormaPago", Comprobante_FormaPago)); + } + Comprobante.Add(new XAttribute("NoCertificado", Comprobante_NoCertificado)); + Comprobante.Add(new XAttribute("Certificado", Comprobante_Certificado)); + if (!string.IsNullOrEmpty(Comprobante_CondicionesDePago)) + { + Comprobante.Add(new XAttribute("CondicionesDePago", Comprobante_CondicionesDePago)); + } + string strComprobante_Total = Comprobante_Total == 0 ? "0" : Comprobante_Total.ToString(strDec).Replace(",", string.Empty); + string strComprobante_SubTotal = Comprobante_SubTotal == 0 ? "0" : Comprobante_SubTotal.ToString(strDec).Replace(",", string.Empty); + Comprobante.Add(new XAttribute("SubTotal", strComprobante_SubTotal)); + if (Comprobante_Descuento > 0) + { + Comprobante.Add(new XAttribute("Descuento", Comprobante_Descuento.ToString(strDec).Replace(",", string.Empty))); + } + + //CartaPorte ternary if------------------------------------------------------------------------- + Comprobante.Add(new XAttribute("Moneda", ComprobanteDBTipoComprobante.ToLower() == "traslado" ? "XXX" : Comprobante_Moneda)); + //------------------------------------------------------------------------------------------------ + + if (Comprobante_TipoCambio > 0 && (Comprobante_Moneda.ToLower() == "usd")) + { + Comprobante.Add(new XAttribute("TipoCambio", Comprobante_TipoCambio.ToString("n4"))); + } + Comprobante.Add(new XAttribute("Total", strComprobante_Total)); + Comprobante.Add(new XAttribute("TipoDeComprobante", Comprobante_TipoDeComprobante)); + //--------CFDI40 + if (CFDI4) { Comprobante.Add(new XAttribute("Exportacion", Comprobante_Exportacion)); } + //-------------------- + if (ComprobanteDBTipoComprobante.ToLower() != "pago" && ComprobanteDBTipoComprobante.ToLower() != "traslado") + { + Comprobante.Add(new XAttribute("MetodoPago", Comprobante_MetodoPago)); + } + Comprobante.Add(new XAttribute("LugarExpedicion", Comprobante_LugarExpedicion)); + Comprobante.Add(new XAttribute(XNamespace.Xmlns + "cfdi", cfdi)); + if (ComprobanteDBTipoComprobante.ToLower() == "pago") + { + XNamespace pago10 = CFDI4 ? "http://www.sat.gob.mx/Pagos20" : "http://www.sat.gob.mx/Pagos"; + Comprobante.Add(new XAttribute(XNamespace.Xmlns + (CFDI4 ? "pago20" : "pago10"), pago10)); + } + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComplementoNotaria == 1 && ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + XNamespace notariospublicos_ = "http://www.sat.gob.mx/notariospublicos"; + Comprobante.Add(new XAttribute(XNamespace.Xmlns + "notariospublicos", notariospublicos_)); + } + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComercioExterior_Activo) + { + XNamespace comercioexterior_ = "http://www.sat.gob.mx/ComercioExterior20"; + Comprobante.Add(new XAttribute(XNamespace.Xmlns + "cce20", comercioexterior_)); + } + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "bms" && INE_Activo) + { + XNamespace INE_ = "http://www.sat.gob.mx/ine"; + Comprobante.Add(new XAttribute(XNamespace.Xmlns + "ine", INE_)); + } + XNamespace IEDU_ = null; + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "bms" && Complemento_IEDU_Activo) + { + IEDU_ = "http://www.sat.gob.mx/iedu"; + Comprobante.Add(new XAttribute(XNamespace.Xmlns + "iedu", IEDU_)); + } + XNamespace ccp10_ = null; + //if (ComprobanteDBTipoComprobante.ToLower() == "traslado" && CFDISis == "bms" && CartaPorte) + if (CFDISis == "bms" && CartaPorte && Sin_CP != "SIN_CP") + { + ccp10_ = "http://www.sat.gob.mx/CartaPorte31"; + Comprobante.Add(new XAttribute(XNamespace.Xmlns + "cartaporte31", ccp10_)); + } + #endregion comprobante atributos + + //Nodo relacionados + #region relacionado + // si no es carta porte se debe agregar CDFI relacionados + if (!CartaPorte && ComprobanteDBTipoComprobante.ToLower() != "traslado") + { + + if (!string.IsNullOrEmpty(CfdiRelacionados_TipoRelacion) && CfdiRelacionados.Count > 0) + { + XElement Cfdi_Relacionados = new XElement(cfdi + "CfdiRelacionados"); + Cfdi_Relacionados.Add(new XAttribute("TipoRelacion", CfdiRelacionados_TipoRelacion)); + foreach (var atr in CfdiRelacionados) + { + XElement Cfdi_Relacionado = new XElement(cfdi + "CfdiRelacionado"); + Cfdi_Relacionado.Add(new XAttribute("UUID", atr.UUID)); + Cfdi_Relacionados.Add(Cfdi_Relacionado); + } + Comprobante.Add(Cfdi_Relacionados); + } + } + else + { + + } + #endregion relacionado + + #region GLOBAL + + //if (!string.IsNullOrEmpty(Comprobante_InfoGlo_Periodicidad) && !string.IsNullOrEmpty(Comprobante_InfoGlo_Meses) && !string.IsNullOrEmpty(Comprobante_InfoGlo_Anio) && CFDISis!="cg2" && ComprobanteDBTipoComprobante.ToLower() == "factura") { + if (ES_GLOBAL) { + XElement cfdi_InformacionGlobal = new XElement(cfdi + "InformacionGlobal"); + cfdi_InformacionGlobal.Add(new XAttribute("Periodicidad", Comprobante_InfoGlo_Periodicidad)); + cfdi_InformacionGlobal.Add(new XAttribute("Meses", Comprobante_InfoGlo_Meses)); + cfdi_InformacionGlobal.Add(new XAttribute("Año", Comprobante_InfoGlo_Anio)); + Comprobante.Add(cfdi_InformacionGlobal); + + + } + + #endregion GLOBAL + //Nodo Emisor + #region emisor + XElement Emisor = new XElement(cfdi + "Emisor"); + Emisor.Add(new XAttribute("Rfc", (Emisor_Rfc) )); + Emisor.Add(new XAttribute("Nombre", (Emisor_Nombre) )); + Emisor.Add(new XAttribute("RegimenFiscal", Emisor_RegimenFiscal)); + Comprobante.Add(Emisor); + #endregion emisor + + //-----------------------Nodo Receptor + #region receptor + + XElement Receptor = new XElement(cfdi + "Receptor"); + Receptor.Add(new XAttribute("Rfc", (Receptor_Rfc) )); + Receptor.Add(new XAttribute("Nombre", (Receptor_Nombre))); + + + + if ((Receptor_ResidenciaFiscal.ToUpper() != "MEX" && Receptor_ResidenciaFiscal.ToUpper() != "MEXICO") && !string.IsNullOrEmpty(Receptor_ResidenciaFiscal)) + { + Receptor.Add(new XAttribute("ResidenciaFiscal", Receptor_ResidenciaFiscal)); + } + if ((Receptor_ResidenciaFiscal.ToUpper() != "MEX" && Receptor_ResidenciaFiscal.ToUpper() != "MEXICO") && !string.IsNullOrEmpty(Receptor_ResidenciaFiscal) && !string.IsNullOrEmpty(Receptor_NumRegIdTrib)) + { + Receptor.Add(new XAttribute("NumRegIdTrib", Receptor_NumRegIdTrib)); + } + + //-----CFDI40 + if (CFDI4) { + Receptor.Add(new XAttribute("DomicilioFiscalReceptor", (Comprobante_Receptor_DomicilioFiscal) )); + Receptor.Add(new XAttribute("RegimenFiscalReceptor", (Comprobante_Receptor_RegimenFiscal) )); + } + //----------- + + if (ComprobanteDBAplicacion.ToLower() != "servicemanager") + { + Receptor.Add(new XAttribute("UsoCFDI", Receptor_UsoCFDI)); + } + else { + if (CartaPorte && ComprobanteDBTipoComprobante.ToLower() == "traslado") + { + Receptor.Add(new XAttribute("UsoCFDI", "S01")); + } + else if (ComprobanteDBTipoComprobante.ToLower() == "pago") { + Receptor.Add(new XAttribute("UsoCFDI", (CFDI4 ? "CP01" : Receptor_UsoCFDI))); + } + else { + Receptor.Add(new XAttribute("UsoCFDI", Receptor_UsoCFDI)); + } + + } + + + + Comprobante.Add(Receptor); + #endregion receptor + + //Nodo Conceptos------------------------------------------------ + #region conceptos + XElement Conceptos = new XElement(cfdi + "Conceptos"); + + //cuenta las partidas de ingreso I para insertar las P en la ultima I + int c = (from P in Comprobante_Partida + //where P.PartidaID => 1 + select P.PartidaID).Max(); + int ct = (from t in Comprobante_Partida_Terceros select t.PartidaID).Count(); + int cc = (from cp in Comprobante_Partida select cp.PartidaID).Count(); + IVA_Cero_cantidad = 0; + foreach (var atr in Comprobante_Partida) + { + int intParID = atr.PartidaID; + int intParTra = atr.Traslados; + int intParRet = atr.Retenciones; + + XElement Concepto = new XElement(cfdi + "Concepto"); + if (!string.IsNullOrEmpty(atr.NoIdentificacion)) + { + Concepto.Add(new XAttribute("NoIdentificacion", atr.NoIdentificacion)); + } + //solo BMS + else if (Receptor_Rfc== "XAXX010101000" && CFDISis != "cg2") { + Concepto.Add(new XAttribute("NoIdentificacion", Comprobante_Folio)); + } + + Concepto.Add(new XAttribute("ClaveProdServ", atr.ClaveProdServ)); + Concepto.Add(new XAttribute("Cantidad", atr.Cantidad)); + Concepto.Add(new XAttribute("ClaveUnidad", atr.ClaveUnidad)); + if (!string.IsNullOrEmpty(atr.Unidad)) + { + Concepto.Add(new XAttribute("Unidad", atr.Unidad)); + } + Concepto.Add(new XAttribute("Descripcion", (atr.Descripcion) )); + //se quitan comas y si es cero tambien los puntos + string strValorUnitario = atr.ValorUnitario == 0 ? "0" : atr.ValorUnitario.ToString(strDec).Replace(",", string.Empty); + Concepto.Add(new XAttribute("ValorUnitario", strValorUnitario)); + //se quitan comas y si es cero tambien los puntos + string strImporte = atr.Importe == 0 ? "0" : atr.Importe.ToString(strDec).Replace(",", string.Empty); + Concepto.Add(new XAttribute("Importe", strImporte)); + if (atr.Descuento > 0) + { + Concepto.Add(new XAttribute("Descuento", atr.Descuento.ToString(strDec).Replace(",", string.Empty))); + } + + //=======CFDI4.0 + if (CFDI4 && !string.IsNullOrEmpty(atr.ObjetoImp)) { + Concepto.Add(new XAttribute("ObjetoImp", atr.ObjetoImp)); + } + //---------------------------------------------------------------------- + + //Complemento IEDU + #region Complemento IEDU + + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "bms" && Complemento_IEDU_Activo) + { + XElement ComplementoConcepto = new XElement(cfdi + "ComplementoConcepto"); + + XElement Complemento_IEDU = new XElement(IEDU_ + "instEducativas"); + + Complemento_IEDU.Add(new XAttribute("version", "1.0")); + if (!string.IsNullOrEmpty(atr.Complemento_IEDU.Comprobante_IEDU_NombreAlumno)) + { + Complemento_IEDU.Add(new XAttribute("nombreAlumno", atr.Complemento_IEDU.Comprobante_IEDU_NombreAlumno)); + } + if (!string.IsNullOrEmpty(atr.Complemento_IEDU.Comprobante_IEDU_CURP)) + { + Complemento_IEDU.Add(new XAttribute("CURP", atr.Complemento_IEDU.Comprobante_IEDU_CURP)); + } + if (!string.IsNullOrEmpty(atr.Complemento_IEDU.Comprobante_IEDU_nivelEducativo)) + { + Complemento_IEDU.Add(new XAttribute("nivelEducativo", atr.Complemento_IEDU.Comprobante_IEDU_nivelEducativo)); + } + if (!string.IsNullOrEmpty(atr.Complemento_IEDU.Comprobante_IEDU_autROVE)) + { + Complemento_IEDU.Add(new XAttribute("autRVOE", atr.Complemento_IEDU.Comprobante_IEDU_autROVE)); + } + if (!string.IsNullOrEmpty(atr.Complemento_IEDU.Comprobante_IEDU_rfcPago)) + { + Complemento_IEDU.Add(new XAttribute("rfcPago", atr.Complemento_IEDU.Comprobante_IEDU_rfcPago)); + } + } + #endregion Complemento IEDU + + if (CFDISis == "cg2" && atr.IVA_CERO == 1 && (ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "factura_egreso")) + { + intParTra = 1; + } + + if (intParRet == 1 || intParTra == 1) + { + + //Nodo Concepto Impuestos + XElement Concepto_Impuestos = new XElement(cfdi + "Impuestos"); + if (intParTra == 1) + { + //Nodo Concepto Traslados + XElement Concepto_Traslados = new XElement(cfdi + "Traslados"); + foreach (var atr_tra in Comprobante_Partida_Traslado) + { + int intTraParID = atr_tra.PartidaID; + if (intTraParID == intParID) + { + //Nodo Concepto Traslado en iva cero solo para CGII + + if ((ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") && CFDISis == "cg2") { + if (atr.IVA_CERO == 1) + { + IVA_Cero_cantidad += atr_tra.Base; + } + } + + + XElement Concepto_Traslado = new XElement(cfdi + "Traslado"); + + //Cuando es Excento de iva y el + if (atr_tra.Importe == 0 && CFDISis == "bms") + { + if (atr_tra.objOmp == "02") + { + Concepto_Traslado.Add(new XAttribute("Base", atr_tra.Base.ToString(strDec).Replace(",", string.Empty))); + Concepto_Traslado.Add(new XAttribute("Impuesto", atr_tra.Impuesto)); + Concepto_Traslado.Add(new XAttribute("TipoFactor", "Exento")); + iva_excento = true; + Concepto_Traslados.Add(Concepto_Traslado); + } + suma_exento += atr_tra.Base; + } + else { + Concepto_Traslado.Add(new XAttribute("Base", atr_tra.Base.ToString(strDec).Replace(",", string.Empty))); + Concepto_Traslado.Add(new XAttribute("Impuesto", atr_tra.Impuesto)); + Concepto_Traslado.Add(new XAttribute("TipoFactor", atr_tra.TipoFactor)); + Concepto_Traslado.Add(new XAttribute("TasaOCuota", atr_tra.TasaOCuota.ToString("n6").Replace(",", string.Empty))); + Concepto_Traslado.Add(new XAttribute("Importe", atr_tra.Importe.ToString(strDec).Replace(",", string.Empty))); + Concepto_Traslados.Add(Concepto_Traslado); + } + + + + } + } + Concepto_Impuestos.Add(Concepto_Traslados); + } + if (intParRet == 1) + { + //Nodo Concepto Retenidos + XElement Concepto_Retenidos = new XElement(cfdi + "Retenciones"); + foreach (var atr_ret in Comprobante_Partida_Retencion) + { + int intRerParID = atr_ret.PartidaID; + if (intRerParID == intParID) + { + //Nodo Concepto Retenido + XElement Concepto_Retenido = new XElement(cfdi + "Retencion"); + Concepto_Retenido.Add(new XAttribute("Base", atr_ret.Base.ToString(strDec).Replace(",", string.Empty))); + Concepto_Retenido.Add(new XAttribute("Impuesto", atr_ret.Impuesto)); + Concepto_Retenido.Add(new XAttribute("TipoFactor", atr_ret.TipoFactor)); + Concepto_Retenido.Add(new XAttribute("TasaOCuota", atr_ret.TasaOCuota.ToString("n6").Replace(",", string.Empty))); + Concepto_Retenido.Add(new XAttribute("Importe", atr_ret.Importe.ToString(strDec).Replace(",", string.Empty))); + Concepto_Retenidos.Add(Concepto_Retenido); + } + } + Concepto_Impuestos.Add(Concepto_Retenidos); + } + + //CFDI4 + if (CFDI4) + { + if (!string.IsNullOrEmpty(atr.RFC_Terceros) && (atr.ObjetoImp == "01" || atr.ObjetoImp == "03")) + { + //-----Nodo ACuentaTerceros + XElement ACuentaTerceros = new XElement(cfdi + "ACuentaTerceros"); + ACuentaTerceros.Add(new XAttribute("RfcACuentaTerceros", (atr.RFC_Terceros) )); + ACuentaTerceros.Add(new XAttribute("NombreACuentaTerceros", (atr.Nombre_Terceros) )); + ACuentaTerceros.Add(new XAttribute("RegimenFiscalACuentaTerceros", (atr.Regimen_Terceros) )); + ACuentaTerceros.Add(new XAttribute("DomicilioFiscalACuentaTerceros", (atr.Domicilio_Terceros) )); + Concepto.Add(ACuentaTerceros); + } + else if (atr.ObjetoImp == "02") { + //Agregar el Nodo al concepto + Concepto.Add(Concepto_Impuestos); + } + } + else //si es version 3.3 lo agrega simplemente concepto + { + //Agregar el Nodo al concepto + Concepto.Add(Concepto_Impuestos); + } + } + + //----Nodo Cuenta predial + #region Cuenta_predial + if (!string.IsNullOrEmpty(Comprobante_CuentaPredial)) + { + Comprobante_CuentaPredial = Regex.Replace(Comprobante_CuentaPredial, "[A-Za-z]", "0"); + XElement Cuenta_Predial = new XElement(cfdi + "CuentaPredial"); + Cuenta_Predial.Add(new XAttribute("Numero", Comprobante_CuentaPredial.Replace("-", string.Empty))); + Concepto.Add(Cuenta_Predial); + } + #endregion Cuenta_predial + + #region Complmento Terceros + + //if (ComprobanteDBTipoComprobante.ToLower() == "factura" && Complemento_Terceros && intParID == c) + if ((intParID == (from P in Comprobante_Partida select P.PartidaID).Max()) && ComprobanteDBTipoComprobante.ToLower() == "factura" && Complemento_Terceros) + { + XNamespace Terceros_ = null; + XNamespace schemaLocation2 = "http://www.sat.gob.mx/terceros http://www.sat.gob.mx/sitio_internet/cfd/terceros/terceros11.xsd"; + + + Terceros_ = "http://www.sat.gob.mx/terceros"; + string item_Comp_Terceros_RFC, + item_Comp_Terceros_NOMBREFISCAL, + item_Comp_Terceros_DIRECCION, + item_Comp_Terceros_NUMEROEXT, + item_Comp_Terceros_NOINTERIOR, + item_Comp_Terceros_COLONIA, + item_Comp_Terceros_CIUDAD, + item_Comp_Terceros_ESTADO, + item_Comp_Terceros_PAIS, + item_Comp_Terceros_CP; + + //foreach (var item in Comprobante_Partida_Terceros) + //{ + item_Comp_Terceros_RFC = (from RFC in Comprobante_Partida_Terceros select RFC.Comp_Terceros.RFC).First(); + item_Comp_Terceros_NOMBREFISCAL = (from NOMBREFISCAL in Comprobante_Partida_Terceros select NOMBREFISCAL.Comp_Terceros.NOMBREFISCAL).First(); + item_Comp_Terceros_DIRECCION = (from DIRECCION in Comprobante_Partida_Terceros select DIRECCION.Comp_Terceros.DIRECCION).First(); + item_Comp_Terceros_NUMEROEXT = (from NUMEROEXT in Comprobante_Partida_Terceros select NUMEROEXT.Comp_Terceros.NUMEROEXT).First(); + item_Comp_Terceros_NOINTERIOR = (from NOINTERIOR in Comprobante_Partida_Terceros select NOINTERIOR.Comp_Terceros.NOINTERIOR).First(); + item_Comp_Terceros_COLONIA = (from COLONIA in Comprobante_Partida_Terceros select COLONIA.Comp_Terceros.COLONIA).First(); + item_Comp_Terceros_CIUDAD = (from CIUDAD in Comprobante_Partida_Terceros select CIUDAD.Comp_Terceros.CIUDAD).First(); + item_Comp_Terceros_ESTADO = (from ESTADO in Comprobante_Partida_Terceros select ESTADO.Comp_Terceros.ESTADO).First(); + item_Comp_Terceros_PAIS = (from PAIS in Comprobante_Partida_Terceros select PAIS.Comp_Terceros.PAIS).First(); + item_Comp_Terceros_CP = (from CP in Comprobante_Partida_Terceros select CP.Comp_Terceros.CP).First(); + //} + XElement ComplementoConcepto = new XElement(cfdi + "ComplementoConcepto"); + XElement terceros = new XElement(Terceros_ + "PorCuentadeTerceros"); + terceros.Add(new XAttribute("version", "1.1")); + terceros.Add(new XAttribute("rfc", item_Comp_Terceros_RFC)); + terceros.Add(new XAttribute("nombre", item_Comp_Terceros_NOMBREFISCAL)); + terceros.Add(new XAttribute(XNamespace.Xmlns + "terceros", Terceros_)); + //Comprobante.Add(new XAttribute(xsi + "schemaLocation", schemaLocation)); + terceros.Add(new XAttribute(xsi + "schemaLocation", schemaLocation2)); + + XElement terceros_InformacionFiscalTercero = new XElement(Terceros_ + "InformacionFiscalTercero"); + terceros_InformacionFiscalTercero.Add(new XAttribute("calle", item_Comp_Terceros_DIRECCION)); + + if (!string.IsNullOrEmpty(item_Comp_Terceros_NUMEROEXT)) + { + terceros_InformacionFiscalTercero.Add(new XAttribute("noExterior", item_Comp_Terceros_NUMEROEXT)); + } + + if (!string.IsNullOrEmpty(item_Comp_Terceros_NOINTERIOR)) + { + terceros_InformacionFiscalTercero.Add(new XAttribute("noInterior", item_Comp_Terceros_NOINTERIOR)); + } + + if (!string.IsNullOrEmpty(item_Comp_Terceros_COLONIA)) + { + terceros_InformacionFiscalTercero.Add(new XAttribute("colonia", item_Comp_Terceros_COLONIA)); + } + + //terceros_InformacionFiscalTercero.Add(new XAttribute("localidad", "San Luisito")); + //terceros_InformacionFiscalTercero.Add(new XAttribute("referencia", "Esquina con Insurgentes")); + + terceros_InformacionFiscalTercero.Add(new XAttribute("municipio", item_Comp_Terceros_CIUDAD)); + + terceros_InformacionFiscalTercero.Add(new XAttribute("estado", item_Comp_Terceros_ESTADO)); + terceros_InformacionFiscalTercero.Add(new XAttribute("pais", item_Comp_Terceros_PAIS)); + terceros_InformacionFiscalTercero.Add(new XAttribute("codigoPostal", item_Comp_Terceros_CP)); + terceros.Add(terceros_InformacionFiscalTercero); + ///// -----------------------------terceros_InformacionFiscalTercero FIN + + + int pc = (from p in Comprobante_Partida_Terceros select p.PartidaID).Max(); + + foreach (var item in Comprobante_Partida_Terceros) + { + + int intParID_Terceros = item.PartidaID; + int intParTra_Terceros = item.Traslados; + int intParRet_Terceros = item.Retenciones; + if (item.Comp_Terceros.Partidas_Terceros_Activo) + { + + + XElement terceros_Parte = new XElement(Terceros_ + "Parte"); + terceros_Parte.Add(new XAttribute("cantidad", item.Cantidad)); + + if (!string.IsNullOrEmpty(item.ClaveUnidad)) + { + terceros_Parte.Add(new XAttribute("unidad", item.ClaveUnidad)); + } + + if (!string.IsNullOrEmpty(item.NoIdentificacion)) + { + terceros_Parte.Add(new XAttribute("noIdentificacion", item.NoIdentificacion)); + } + terceros_Parte.Add(new XAttribute("descripcion", item.Descripcion)); + + terceros_Parte.Add(new XAttribute("valorUnitario", item.ValorUnitario)); + terceros_Parte.Add(new XAttribute("importe", item.Importe)); + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + XElement Terceros_InformacionAduaneraParte = new XElement(Terceros_ + "InformacionAduanera"); + Terceros_InformacionAduaneraParte.Add(new XAttribute("numero", Numero_Pedimento_Terceros)); + Terceros_InformacionAduaneraParte.Add(new XAttribute("fecha", Fecha_Pedimento_Terceros)); + Terceros_InformacionAduaneraParte.Add(new XAttribute("aduana", Aduana_Terceros)); + terceros_Parte.Add(Terceros_InformacionAduaneraParte); + + terceros.Add(terceros_Parte); + } + + #region impuestos terceros + //if (intParRet_Terceros == 1 || intParTra_Terceros == 1) + //{ + // XElement terceros_Impuestos = new XElement(Terceros_ + "Impuestos"); + + // if (intParTra_Terceros == 1) + // { + // XElement terceros_ImpuestosTraslados = new XElement(Terceros_ + "Traslados"); + + + + // //foreach (var Atr_Terceros_Tras in Complemento_Partida_Terceros_Traslado) + // //{ + // //int IntTraParID = Atr_Terceros_Tras.PartidaID; + // //if (IntTraParID == intParID_Terceros) + // //{ + // //XElement terceros_TrasladosImpuestos = new XElement(Terceros_ + "Traslado"); + // //terceros_TrasladosImpuestos.Add(new XAttribute("impuesto", "IVA")); + // //terceros_TrasladosImpuestos.Add(new XAttribute("tasa", Atr_Terceros_Tras.TasaOCuota.ToString("n6").Replace(",", string.Empty))); + // ////terceros_TrasladosImpuestos.Add(new XAttribute("importe", Atr_Terceros_Tras.Importe.ToString(strDec).Replace(",", string.Empty))); + // //terceros_TrasladosImpuestos.Add(new XAttribute("importe", Atr_Terceros_Tras.Importe.ToString(strDec).Replace(",", string.Empty))); + // //terceros_ImpuestosTraslados.Add(terceros_TrasladosImpuestos); + // //terceros_Impuestos.Add(terceros_ImpuestosTraslados); + + // //} + // //} + // double sumatrasladosTerceros = (from imp in Complemento_Partida_Terceros_Traslado select imp.Importe).Sum(); + // XElement terceros_TrasladosImpuestos = new XElement(Terceros_ + "Traslado"); + // terceros_TrasladosImpuestos.Add(new XAttribute("impuesto", "IVA")); + // terceros_TrasladosImpuestos.Add(new XAttribute("tasa", (from toc in Complemento_Partida_Terceros_Traslado select toc.TasaOCuota).First().ToString("n6").Replace(",", string.Empty))); + // //terceros_TrasladosImpuestos.Add(new XAttribute("importe", Atr_Terceros_Tras.Importe.ToString(strDec).Replace(",", string.Empty))); + // terceros_TrasladosImpuestos.Add(new XAttribute("importe", sumatrasladosTerceros.ToString(strDec).Replace(",", string.Empty))); + // terceros_ImpuestosTraslados.Add(terceros_TrasladosImpuestos); + // terceros_Impuestos.Add(terceros_ImpuestosTraslados); + // terceros.Add(terceros_Impuestos); + + // } + // if (intParRet_Terceros == 1) + // { + // XElement terceros_ImpuestosRetenciones = new XElement(Terceros_ + "Retenciones"); + + // foreach (var atr_Terceros_Ret in Complemento_Partida_Terceros_Retencion) + // { + // int intRetParID = atr_Terceros_Ret.PartidaID; + // if (intRetParID == intParID_Terceros) + // { + // XElement terceros_RetencionImpuestos = new XElement(Terceros_ + "Retencion"); + // terceros_RetencionImpuestos.Add(new XAttribute("impuesto", "IVA")); + // terceros_RetencionImpuestos.Add(new XAttribute("importe", atr_Terceros_Ret.Importe.ToString(strDec).Replace(",", string.Empty))); + // terceros_ImpuestosRetenciones.Add(terceros_RetencionImpuestos); + // terceros_Impuestos.Add(terceros_ImpuestosRetenciones); + // terceros.Add(terceros_Impuestos); + // } + // terceros.Add(terceros_Impuestos); + // } + + // } + //} + //ComplementoConcepto.Add(terceros); + //Concepto.Add(ComplementoConcepto); + #endregion impuestos terceros + } + } + #region trasladosImpuestos terceros + if ((from ParRetTerceros in Comprobante_Partida_Terceros select ParRetTerceros.Retenciones).Count() >= 1 || (from ParRetTerceros in Comprobante_Partida_Terceros select ParRetTerceros.Traslados).Count() >= 1) + { + XElement terceros_Impuestos = new XElement(Terceros_ + "Impuestos"); + + if ((from imp in Complemento_Partida_Terceros_Traslado select imp.Importe).Sum() > 0) + { + XElement terceros_ImpuestosTraslados = new XElement(Terceros_ + "Traslados"); + + double sumatrasladosTerceros = (from imp in Complemento_Partida_Terceros_Traslado select imp.Importe).Sum(); + XElement terceros_TrasladosImpuestos = new XElement(Terceros_ + "Traslado"); + terceros_TrasladosImpuestos.Add(new XAttribute("impuesto", "IVA")); + terceros_TrasladosImpuestos.Add(new XAttribute("tasa", (from toc in Complemento_Partida_Terceros_Traslado select toc.TasaOCuota).First().ToString("n6").Replace(",", string.Empty))); + terceros_TrasladosImpuestos.Add(new XAttribute("importe", sumatrasladosTerceros.ToString(strDec).Replace(",", string.Empty))); + terceros_ImpuestosTraslados.Add(terceros_TrasladosImpuestos); + terceros_Impuestos.Add(terceros_ImpuestosTraslados); + terceros.Add(terceros_Impuestos); + } + else + { + XElement terceros_ImpuestosTraslados = new XElement(Terceros_ + "Traslados"); + + string sumatrasladosTerceros = "0.00";//(from imp in Complemento_Partida_Terceros_Traslado select imp.Importe).Sum(); + XElement terceros_TrasladosImpuestos = new XElement(Terceros_ + "Traslado"); + terceros_TrasladosImpuestos.Add(new XAttribute("impuesto", "IVA")); + terceros_TrasladosImpuestos.Add(new XAttribute("tasa", "0.00")); //(from toc in Complemento_Partida_Terceros_Traslado select toc.TasaOCuota).First().ToString("n6").Replace(",", string.Empty))); + terceros_TrasladosImpuestos.Add(new XAttribute("importe", sumatrasladosTerceros)); + terceros_ImpuestosTraslados.Add(terceros_TrasladosImpuestos); + terceros_Impuestos.Add(terceros_ImpuestosTraslados); + terceros.Add(terceros_Impuestos); + } + + if ((from impret in Complemento_Partida_Terceros_Retencion select impret.Importe).Sum() > 0) + { + XElement terceros_ImpuestosRetenciones = new XElement(Terceros_ + "Retenciones"); + double sumRetencionesTercros = (from impret in Complemento_Partida_Terceros_Retencion select impret.Importe).Sum(); + XElement terceros_RetencionImpuestos = new XElement(Terceros_ + "Retencion"); + terceros_RetencionImpuestos.Add(new XAttribute("impuesto", "IVA")); + terceros_RetencionImpuestos.Add(new XAttribute("importe", sumRetencionesTercros.ToString(strDec).Replace(",", string.Empty))); + terceros_ImpuestosRetenciones.Add(terceros_RetencionImpuestos); + terceros_Impuestos.Add(terceros_ImpuestosRetenciones); + terceros.Add(terceros_Impuestos); + + } + //else { + // XElement terceros_ImpuestosRetenciones = new XElement(Terceros_ + "Retenciones"); + // String sumRetencionesTercros = "0.00";//(from impret in Complemento_Partida_Terceros_Retencion select impret.Importe).Sum(); + + // XElement terceros_RetencionImpuestos = new XElement(Terceros_ + "Retencion"); + // terceros_RetencionImpuestos.Add(new XAttribute("impuesto", "IVA")); + // terceros_RetencionImpuestos.Add(new XAttribute("importe", sumRetencionesTercros)); + // terceros_ImpuestosRetenciones.Add(terceros_RetencionImpuestos); + // terceros_Impuestos.Add(terceros_ImpuestosRetenciones); + // terceros.Add(terceros_Impuestos); + //} + + } + #endregion trasladosImpuestos terceros + ComplementoConcepto.Add(terceros); + Concepto.Add(ComplementoConcepto); + } + #endregion Complmento Terceros + + + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "bms" && Complemento_IEDU_Activo) + { + XElement ComplementoConcepto = new XElement(cfdi + "ComplementoConcepto"); + + XElement Complemento_IEDU = new XElement(IEDU_ + "instEducativas"); + //agregar complemento iedu a concepto + if (Complemento_IEDU.LastAttribute.ToString() != "version") + { + ComplementoConcepto.Add(Complemento_IEDU); + Concepto.Add(ComplementoConcepto); + } + } + //Agregar concepto a conceptos + Conceptos.Add(Concepto); + } + Comprobante.Add(Conceptos); + #endregion conceptos + + //Nodo Impuestos-------------------------------------- + #region impuestos + if (Comprobante_TotalImpuestosTrasladados > 0 || Comprobante_TotalImpuestosRetenidos > 0 || (IVA_CERO_ENC && (ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") && CFDISis == "cg2") || (iva_excento && CFDISis=="bms" )) + { + //Impuestos + XElement Impuestos = new XElement(cfdi + "Impuestos"); + if (Comprobante_TotalImpuestosRetenidos > 0) + { + Impuestos.Add(new XAttribute("TotalImpuestosRetenidos", Comprobante_TotalImpuestosRetenidos.ToString(strDec).Replace(",", string.Empty))); + //Impuestos Traslados + XElement Impuestos_Retenidos = new XElement(cfdi + "Retenciones"); + foreach (var atr in Comprobante_Retencion) + { + XElement Impuestos_Retenido = new XElement(cfdi + "Retencion"); + Impuestos_Retenido.Add(new XAttribute("Impuesto", atr.Impuesto)); + + Impuestos_Retenido.Add(new XAttribute("Importe", atr.Importe.ToString(strDec).Replace(",", string.Empty))); + Impuestos_Retenidos.Add(Impuestos_Retenido); + } + //Agregar Nodo Traslados a Impuestos + Impuestos.Add(Impuestos_Retenidos); + } + + if (Comprobante_TotalImpuestosTrasladados > 0 || (IVA_CERO_ENC && (ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") && CFDISis == "cg2") || (iva_excento)) + { + if (Comprobante_TotalImpuestosTrasladados > 0) + { + Impuestos.Add(new XAttribute("TotalImpuestosTrasladados", Comprobante_TotalImpuestosTrasladados.ToString(strDec).Replace(",", string.Empty))); + } + else if (IVA_CERO_ENC && (ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") && CFDISis == "cg2") { + Impuestos.Add(new XAttribute("TotalImpuestosTrasladados", Comprobante_TotalImpuestosTrasladados.ToString(strDec).Replace(",", string.Empty))); + } + + + //Impuestos Traslados + XElement Impuestos_Traslados = new XElement(cfdi + "Traslados"); + + + //sginifica que debe venir con conecptos en cero, el encabezado tiene porcentaje iva 8 o 16 + int ImpuestoCeroCount = (from t in Comprobante_Traslado where t.TasaOCuota!=0.000000 select t.Base ).Count(); + + //agregar nodo de traslados iva al cero solo CGII + //if (IVA_Cero_cantidad >0 && (ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") && CFDISis == "cg2" && ImpuestoCeroCount>0) { + if (IVA_Cero_cantidad > 0 && (ComprobanteDBTipoComprobante.ToLower() == "factura" ) && CFDISis == "cg2" && ImpuestoCeroCount > 0) + { + XElement Impuesto_Cero = new XElement(cfdi + "Traslado"); + Impuesto_Cero.Add(new XAttribute("Base", IVA_Cero_cantidad.ToString(strDec).Replace(",", string.Empty))); + Impuesto_Cero.Add(new XAttribute("Impuesto", "002")); + Impuesto_Cero.Add(new XAttribute("TipoFactor", "Tasa")); + Impuesto_Cero.Add(new XAttribute("TasaOCuota", "0.000000")); + Impuesto_Cero.Add(new XAttribute("Importe", "0.00")); + Impuestos_Traslados.Add(Impuesto_Cero); + } + + //solo BMS iva exento + if (iva_excento && CFDISis=="bms") + { + XElement Impuestos_TrasladoExento = new XElement(cfdi + "Traslado"); + Impuestos_TrasladoExento.Add(new XAttribute("Base", suma_exento.ToString(strDec).Replace(",", string.Empty))); + Impuestos_TrasladoExento.Add(new XAttribute("Impuesto", "002")); + Impuestos_TrasladoExento.Add(new XAttribute("TipoFactor", "Exento")); + Impuestos_Traslados.Add(Impuestos_TrasladoExento); + } + + //comprueba que no es una factura con iva excento totalmente, si es cero + if (Comprobante_SubTotal - suma_exento != 0) + { + //traslados normales + //se estan agregando dos traslados con iva + + foreach (var atr in Comprobante_Traslado) + { + + XElement Impuestos_Traslado = new XElement(cfdi + "Traslado"); + if (CFDI4) + { + if (ComprobanteDBTipoComprobante.ToLower() == "factura_egreso" && CFDISis == "cg2" && atr.Importe == 0 && atr.Base==0) + { + continue; + } + + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "cg2") + { + Impuestos_Traslado.Add(new XAttribute("Base", atr.Base == 0 ? Comprobante_SubTotal.ToString(strDec).Replace(",", string.Empty) : atr.Base.ToString(strDec).Replace(",", string.Empty))); + } + else if (ComprobanteDBTipoComprobante.ToLower() == "factura_egreso" && CFDISis == "cg2" && atr.Importe > 0) + { + Impuestos_Traslado.Add(new XAttribute("Base", (Comprobante_SubTotal- IVA_Cero_cantidad).ToString(strDec).Replace(",", string.Empty))); + } + else + { + //se le resta el base del iva exento + Impuestos_Traslado.Add(new XAttribute("Base", (atr.Base - suma_exento).ToString(strDec).Replace(",", string.Empty))); + } + } + + Impuestos_Traslado.Add(new XAttribute("Impuesto", atr.Impuesto)); + Impuestos_Traslado.Add(new XAttribute("TipoFactor", atr.TipoFactor)); + Impuestos_Traslado.Add(new XAttribute("TasaOCuota", atr.TasaOCuota.ToString("n6").Replace(",", string.Empty))); + Impuestos_Traslado.Add(new XAttribute("Importe", atr.Importe.ToString(strDec).Replace(",", string.Empty))); + Impuestos_Traslados.Add(Impuestos_Traslado); + } + }//si no es iva excento + + + + //Agregar Nodo Traslados a Impuestos + Impuestos.Add(Impuestos_Traslados); + + } + //Agregar Nodos Impuestos a Comprobante + Comprobante.Add(Impuestos); + } + #endregion impuestos + + +/*--------------------------PAGOS----PAGOS-------OLD------------------------------------------------ */ + + //pago 10 + #region pago10 + XNamespace _pago10 = CFDI4 ? "http://www.sat.gob.mx/Pagos20" : "http://www.sat.gob.mx/Pagos"; + XElement Pagos = new XElement(_pago10 + "Pagos"); + if (ComprobanteDBTipoComprobante.ToLower() == "pago") + { + string version = CFDI4 ? "2.0" : "1.0"; + Pagos.Add(new XAttribute("Version", version)); + + XElement Pago = new XElement(_pago10 + "Pago"); + Pago.Add(new XAttribute("FechaPago", sys_fix_fecha(Pago10_FechaPago))); + Pago.Add(new XAttribute("FormaDePagoP", Pago10_FormaDePagoP)); + Pago.Add(new XAttribute("MonedaP", Pago10_MonedaP)); + + if (CFDI4) + { + /* + Si la clave es diferente de MXN(Peso Mexicano) debe existir + información en el campo TipoCambioP. +  Si la clave es MXN(Peso Mexicano), no debe existir información en el + campo TipoCambioP. + */ + + Pago.Add(new XAttribute("TipoCambioP", Pago10_MonedaP.ToUpper() == "MXN" ? "1" : Pago10_TipoCambioP.ToString(strDec4).Replace(",", string.Empty))); + //Pago.Add(new XAttribute("TipoCambioP", Pago10_TipoCambioP.ToString(strDec4).Replace(",", string.Empty))); + + } + else { + if (Pago10_MonedaP.ToUpper() != "MXN") + { + string strPago10_TipoCambioP = Pago10_TipoCambioP.ToString(strDec4).Replace(",", string.Empty); + Pago.Add(new XAttribute("TipoCambioP", strPago10_TipoCambioP)); + + } + + Pago.Add(new XAttribute("Monto", Pago10_Monto.ToString(strDec).Replace(",", string.Empty))); + } + + //si es 03 transferencia + if (Pago10_FormaDePagoP == "03") + { + if (!string.IsNullOrEmpty(Pago10_RfcEmisorCtaOrd)) + { + Pago.Add(new XAttribute("RfcEmisorCtaOrd", (Pago10_RfcEmisorCtaOrd) )); + } + + if (!string.IsNullOrEmpty(Pago10_NomBancoOrdExt)) + { + Pago.Add(new XAttribute("NomBancoOrdExt", (Pago10_NomBancoOrdExt) )); + } + + if (!string.IsNullOrEmpty(Pago10_CtaOrdenante)) + { + Pago.Add(new XAttribute("CtaOrdenante", Pago10_CtaOrdenante)); + } + + if (!string.IsNullOrEmpty(Pago10_RfcEmisorCtaBen)) + { + Pago.Add(new XAttribute("RfcEmisorCtaBen", (Pago10_RfcEmisorCtaBen) )); + } + + if (!string.IsNullOrEmpty(Pago10_CtaBeneficiario)) + { + Pago.Add(new XAttribute("CtaBeneficiario", Pago10_CtaBeneficiario)); + } + + if (!string.IsNullOrEmpty(Pago10_TipoCadPago)) + { + Pago.Add(new XAttribute("TipoCadPago", Pago10_TipoCadPago)); + } + if (!string.IsNullOrEmpty(Pago10_CadPago)) + { + Pago.Add(new XAttribute("CadPago", Pago10_CadPago)); + } + if (!string.IsNullOrEmpty(Pago10_CertPago)) + { + Pago.Add(new XAttribute("CertPago", Pago10_CertPago)); + } + if (!string.IsNullOrEmpty(Pago10_SelloPago)) + { + Pago.Add(new XAttribute("SelloPago", Pago10_SelloPago)); + } + if (!string.IsNullOrEmpty(Pago10_NumeroOperacion)) + { + Pago.Add(new XAttribute("NumOperacion", Pago10_NumeroOperacion)); + } + } + + + bool DiezYseis_16=false; + bool Ocho_8=false; + + + //--------------------Documentos relacionados----- + + foreach (var atr in Pago10_Partidas) + { + + bool sameMoneda = atr.MonedaDR.ToUpper() == Pago10_MonedaP ? true : false; + bool sameFlag = new[] { "MXN" }.Contains(Pago10_MonedaP.ToUpper()); + + //activan si se hara nodo de OCHO y DIEZYSEIS, con que una vez sea true se quedan true y no se desactivan + if (atr.TRAS_TASAOCUOTADR == 0.160000 && !DiezYseis_16 ) { + DiezYseis_16 = true; + } + if (atr.TRAS_TASAOCUOTADR == 0.080000 && !Ocho_8) { + Ocho_8 = true; + } + + + XElement DoctoRelacionado = new XElement(_pago10 + "DoctoRelacionado"); + DoctoRelacionado.Add(new XAttribute("IdDocumento", atr.IdDocumento)); + if (!string.IsNullOrEmpty(atr.Serie)) + { + DoctoRelacionado.Add(new XAttribute("Serie", atr.Serie)); + } + if (!string.IsNullOrEmpty(atr.Folio)) + { + DoctoRelacionado.Add(new XAttribute("Folio", atr.Folio)); + } + DoctoRelacionado.Add(new XAttribute("MonedaDR", atr.MonedaDR)); + if (Pago10_MonedaP.ToUpper() != atr.MonedaDR.ToUpper()) + { + if (CFDI4) + { + + } + else + { + string strTipoCambioDR = atr.TipoCambioDR.ToString("n6").Replace(",", string.Empty); + //validacion del pac :: si el pago en dolares y el documento a pagar es en pesos el tipo de cambio es uno + //strTipoCambioDR = Pago10_MonedaP == "USD" && atr.MonedaDR == "MXN" ? "1" : strTipoCambioDR; + strTipoCambioDR = Pago10_MonedaP.ToUpper() == "USD" && atr.MonedaDR.ToUpper() == "MXN" ? strTipoCambioDR : strTipoCambioDR; + DoctoRelacionado.Add(new XAttribute("TipoCambioDR", strTipoCambioDR)); + } + + } + + if (!CFDI4) + { + DoctoRelacionado.Add(new XAttribute("MetodoDePagoDR", atr.MetodoDePagoDR)); + } + + if (CFDI4) { + if (Pago10_MonedaP.ToUpper() != atr.MonedaDR.ToUpper()) + { + /*Atributo condicional para expresar el tipo de + cambio conforme con la moneda registrada en + el documento relacionado. Es requerido + cuando la moneda del documento relacionado + es distinta de la moneda de pago.Se debe + registrar el número de unidades de la moneda + señalada en el documento relacionado que + equivalen a una unidad de la moneda del pago. + Por ejemplo: El documento relacionado se + registra en USD.El pago se realiza por 100 EUR. + Este atributo se registra como 1.114700 + USD / EUR.El importe pagado equivale a 100 + EUR * 1.114700 USD / EUR = 111.47 USD*/ + + DoctoRelacionado.Add(new XAttribute("EquivalenciaDR", (atr.EquivalenciaDR.ToString(CFDIPac == "ComDig" ? strDec10 : strDec6).Replace(",", string.Empty)))); + } + else { + DoctoRelacionado.Add(new XAttribute("EquivalenciaDR", "1")); + } + + DoctoRelacionado.Add(new XAttribute("ObjetoImpDR", atr.ObjetoImpDR)); + } + + if (atr.NumParcialidad > 0) + { + DoctoRelacionado.Add(new XAttribute("NumParcialidad", atr.NumParcialidad)); + } + DoctoRelacionado.Add(new XAttribute("ImpSaldoAnt", atr.ImpSaldoAnt.ToString(strDec).Replace(",", string.Empty))); + DoctoRelacionado.Add(new XAttribute("ImpPagado", atr.ImpPagado.ToString(strDec).Replace(",", string.Empty))); + DoctoRelacionado.Add(new XAttribute("ImpSaldoInsoluto", atr.ImpSaldoInsoluto.ToString(strDec).Replace(",", string.Empty))); + + if (CFDI4 && atr.ObjetoImpDR == "02") { + XElement ImpuestosDR = new XElement(_pago10 + "ImpuestosDR"); + bool USD = false; + if (Pago10_MonedaP.ToUpper() == "USD") + { + USD = true; + } + + //retencion ISR e IVA + if (atr.RET_BASEDR != 0 || atr.RET_BASEDR_1 != 0) + { + XElement RetencionesDR = new XElement(_pago10 + "RetencionesDR"); + + //IVA RET + if (atr.RET_BASEDR != 0) { + XElement RetencionDR = new XElement(_pago10 + "RetencionDR"); + RetencionDR.Add(new XAttribute("BaseDR", atr.RET_BASEDR.ToString(ComprobanteDBAplicacion.ToLower() == "cuentagastos" ? strDec6 : (USD ? strDec6 : strDec4) ).Replace(",", string.Empty))); + RetencionDR.Add(new XAttribute("ImpuestoDR", atr.RET_IMPUESTODR)); + RetencionDR.Add(new XAttribute("TipoFactorDR", atr.RET_TIPOFACTORDR)); + RetencionDR.Add(new XAttribute("TasaOCuotaDR", atr.RET_TASAOCUOTADR.ToString(strDec6).Replace(",", string.Empty))); + RetencionDR.Add(new XAttribute("ImporteDR", atr.RET_IMPORTEDR.ToString(ComprobanteDBAplicacion.ToLower() == "cuentagastos" ? strDec6 : (USD ? strDec6 : strDec6) ).Replace(",", string.Empty))); + RetencionesDR.Add(RetencionDR); + + } + + //ISR + if (atr.RET_BASEDR_1 != 0) { + XElement RetencionDR = new XElement(_pago10 + "RetencionDR"); + RetencionDR.Add(new XAttribute("BaseDR", atr.RET_BASEDR_1.ToString(ComprobanteDBAplicacion.ToLower() == "cuentagastos" ? strDec6 : (USD ? strDec6 : strDec4) ).Replace(",", string.Empty))); + RetencionDR.Add(new XAttribute("ImpuestoDR", atr.RET_IMPUESTODR_1)); + RetencionDR.Add(new XAttribute("TipoFactorDR", atr.RET_TIPOFACTORDR_1)); + RetencionDR.Add(new XAttribute("TasaOCuotaDR", atr.RET_TASAOCUOTADR_1.ToString(strDec6).Replace(",", string.Empty))); + RetencionDR.Add(new XAttribute("ImporteDR", atr.RET_IMPORTEDR_1.ToString(ComprobanteDBAplicacion.ToLower() == "cuentagastos" ? strDec6 : (USD ? strDec6 : strDec6) ).Replace(",", string.Empty))); + RetencionesDR.Add(RetencionDR); + + } + ImpuestosDR.Add(RetencionesDR); + } + + //Traslado IVA + if (atr.TRAS_BASEDR != 0 || (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && atr.IVA_CERO)) { + + // agrega el nodo padre para iva cero y no cero + XElement TrasladosDR = new XElement(_pago10 + "TrasladosDR"); + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && atr.IVA_CERO) + { + //AGREGAR NODO IVA CERO + + XElement TrasladoDR0 = new XElement(_pago10 + "TrasladoDR"); + //CAMBIO28 + TrasladoDR0.Add(new XAttribute("BaseDR", atr.IVA_CERO_CANT.ToString(strDec).Replace(",", string.Empty))); + //TrasladoDR0.Add(new XAttribute("BaseDR", atr.IVA_CERO_CANT.ToString(strDec).Replace(",", string.Empty))); + + + + TrasladoDR0.Add(new XAttribute("ImpuestoDR", "002")); + TrasladoDR0.Add(new XAttribute("TipoFactorDR", "Tasa")); + TrasladoDR0.Add(new XAttribute("TasaOCuotaDR", "0.000000")); + TrasladoDR0.Add(new XAttribute("ImporteDR", "0.000000")); + TrasladosDR.Add(TrasladoDR0); + + //Se agrega el nodo de Traslado IVA con % no cero + if (atr.TRAS_BASEDR != 0) + { + XElement TrasladoDR = new XElement(_pago10 + "TrasladoDR"); + if (atr.MonedaDR.ToUpper() == "USD" && Pago10_MonedaP.ToUpper() == "USD") + { + //CAMBIO28 + TrasladoDR.Add(new XAttribute("BaseDR", atr.TRAS_BASEDR.ToString(strDec6).Replace(",", string.Empty))); + TrasladoDR.Add(new XAttribute("ImpuestoDR", atr.TRAS_IMPUESTODR == "" ? "002" : atr.TRAS_IMPUESTODR)); + TrasladoDR.Add(new XAttribute("TipoFactorDR", atr.TRAS_TIPOFACTORDR == "" ? "Tasa" : atr.TRAS_TIPOFACTORDR)); + TrasladoDR.Add(new XAttribute("TasaOCuotaDR", atr.TRAS_TASAOCUOTADR.ToString(strDec6).Replace(",", string.Empty))); + TrasladoDR.Add(new XAttribute("ImporteDR", atr.TRAS_IMPORTEDR.ToString(strDec6).Replace(",", string.Empty))); + } + else { + + TrasladoDR.Add(new XAttribute("BaseDR", atr.TRAS_BASEDR.ToString(strDec4).Replace(",", string.Empty))); + TrasladoDR.Add(new XAttribute("ImpuestoDR", atr.TRAS_IMPUESTODR == "" ? "002" : atr.TRAS_IMPUESTODR)); + TrasladoDR.Add(new XAttribute("TipoFactorDR", atr.TRAS_TIPOFACTORDR == "" ? "Tasa" : atr.TRAS_TIPOFACTORDR)); + TrasladoDR.Add(new XAttribute("TasaOCuotaDR", atr.TRAS_TASAOCUOTADR.ToString(strDec6).Replace(",", string.Empty))); + TrasladoDR.Add(new XAttribute("ImporteDR", atr.TRAS_IMPORTEDR.ToString(strDec4).Replace(",", string.Empty))); + } + + TrasladosDR.Add(TrasladoDR); + + } + + ImpuestosDR.Add(TrasladosDR); + } + else { + + XElement TrasladoDR = new XElement(_pago10 + "TrasladoDR"); + //TrasladoDR.Add(new XAttribute("BaseDR", atr.TRAS_BASEDR.ToString(strDec4).Replace(",", string.Empty))); + + //bool USD = false; + //if (Pago10_MonedaP.ToUpper() == "USD"){ + // USD = true; + //} + + + TrasladoDR.Add(new XAttribute("BaseDR", atr.TRAS_BASEDR.ToString(ComprobanteDBAplicacion.ToLower() == "cuentagastos" ? (USD ?strDec6: strDec6) : (USD ? strDec6 : strDec6) ).Replace(",", string.Empty))); + TrasladoDR.Add(new XAttribute("ImpuestoDR", atr.TRAS_IMPUESTODR == "" ? "002" : atr.TRAS_IMPUESTODR)); + TrasladoDR.Add(new XAttribute("TipoFactorDR", atr.TRAS_TIPOFACTORDR == "" ? "Tasa" : atr.TRAS_TIPOFACTORDR)); + TrasladoDR.Add(new XAttribute("TasaOCuotaDR", atr.TRAS_TASAOCUOTADR.ToString(strDec6).Replace(",", string.Empty))); + TrasladoDR.Add(new XAttribute("ImporteDR", atr.TRAS_IMPORTEDR.ToString(ComprobanteDBAplicacion.ToLower() == "cuentagastos" ? (USD ? strDec6 : strDec6) : (USD ? strDec6 : strDec6) ).Replace(",", string.Empty))); + TrasladosDR.Add(TrasladoDR); + ImpuestosDR.Add(TrasladosDR); + } + + + + + } + DoctoRelacionado.Add(ImpuestosDR); + } + Pago.Add(DoctoRelacionado); + } + + + //ImpuestoP =============================================== ImpuestoP + if (CFDI4) + { + XElement Totales = new XElement(_pago10 + "Totales"); + XElement ImpuestoP = new XElement(_pago10 + "ImpuestosP"); + int conta = (from ca in Pago10_Partidas select ca.IdDocumento).Count(); + int num = 0; + double RetIva_ = 0.000000; + + double RetISR_ = 0.000000; + double MXNMontoCero = 0.000000; + double IVA_ = 0.000000; + double IVA16_ = 0.000000; + double IVA8_ = 0.000000; + + double BaseIVA_ = 0.000000; + double BaseIVA16_ = 0.000000; + double BaseIVA8_ = 0.000000; + + + bool Ocho_16; + + + XElement ImpuestosP = null; + XElement RetencionesP = null; + XElement RetencionP = null; + XElement TrasladosP = null; + XElement TrasladoP = null; + + XElement TrasladosP0 = null; + XElement TrasladoP0 = null; + + + XElement TrasladoP16 = null; + XElement TrasladoP8 = null; + + + double MXNMonto = 0; + + + + //estas bool vars activan la segmentacion del nodo "TrasladoP" para cada % de iva 8 o 16 + //DiezYseis_16 + //Ocho_8 + Pago10_Partidas = Pago10_Partidas + .OrderBy(x => x.TRAS_BASEDR) + //.ThenByDescending(x => x.RET_BASEDR != 0 || x.RET_BASEDR_1 != 0) + .ToList(); + + foreach (var atr in Pago10_Partidas) + { + num++; + + double.TryParse(atr.EquivalenciaDR.ToString(CFDIPac =="ComDig"? strDec10 :strDec6), out atr.EquivalenciaDR); + + + Ocho_16 = atr.TRAS_TASAOCUOTADR == 0.160000 ? true : false; + + bool sameMoneda = atr.MonedaDR.ToUpper() == Pago10_MonedaP ? true:false; + bool sameFlag = new[] { "MXN" }.Contains(Pago10_MonedaP.ToUpper()); + + + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && atr.IVA_CERO) + { + //CAMBIO28 + //MXNMonto += Math.Truncate( atr.IVA_CERO_CANT *100)/100; + //MXNMontoCero += Math.Truncate(atr.IVA_CERO_CANT*100)/100; + MXNMonto += atr.IVA_CERO_CANT ; + MXNMontoCero += atr.IVA_CERO_CANT; + } + + if (atr.RET_IMPORTEDR_1 > 0 || atr.RET_IMPORTEDR > 0) + { + RetencionesP = new XElement(_pago10 + "RetencionesP"); + } + + // Ret IVA + if (atr.RET_IMPUESTODR == "002") + { + RetIva_ += atr.RET_IMPORTEDR; + if (num == conta) + { + if (Pago10_MonedaP == "MXN") + { + RetIva_ = atr.MonedaDR.ToUpper() == "MXN" ? RetIva_ : RetIva_ / atr.EquivalenciaDR; + } + else if (Pago10_MonedaP == "USD") + { + RetIva_ = atr.MonedaDR.ToUpper() == "MXN" ? RetIva_ / atr.EquivalenciaDR : RetIva_; + } + //RetIva_ -= RetIva_ % 0.000001; + RetencionP = new XElement(_pago10 + "RetencionP"); + + RetencionP.Add(new XAttribute("ImpuestoP", atr.RET_IMPUESTODR)); + + //no es BMS + if (ComprobanteDBAplicacion.ToLower() != "cuentagastos") + { + RetencionP.Add(new XAttribute("ImporteP", RetIva_.ToString(sameMoneda ? strDec : strDec).Replace(",", string.Empty))); + } + else + { + //RetencionP.Add(new XAttribute("ImporteP", RetIva_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec6).Replace(",", string.Empty))); + RetencionP.Add(new XAttribute("ImporteP", RetIva_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",", string.Empty))); + } + + RetencionesP.Add(RetencionP); + } + } + else { + if (ComprobanteDBAplicacion.ToLower() != "cuentagastos" && atr.RET_IMPUESTODR!="") { + if (num == conta) + { + if (Pago10_MonedaP == "MXN") + { + RetIva_ = atr.MonedaDR.ToUpper() == "MXN" ? RetIva_ : RetIva_ / atr.EquivalenciaDR; + } + else if (Pago10_MonedaP == "USD") + { + RetIva_ = atr.MonedaDR.ToUpper() == "MXN" ? RetIva_ / atr.EquivalenciaDR : RetIva_; + } + //RetIva_ -= RetIva_ % 0.000001; + RetencionP = new XElement(_pago10 + "RetencionP"); + + RetencionP.Add(new XAttribute("ImpuestoP", "002")); + + //no es BMS + if (ComprobanteDBAplicacion.ToLower() != "cuentagastos") + { + RetencionP.Add(new XAttribute("ImporteP", RetIva_.ToString(sameMoneda ? strDec : strDec6).Replace(",", string.Empty))); + } + else + { + //RetencionP.Add(new XAttribute("ImporteP", RetIva_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec6).Replace(",", string.Empty))); + RetencionP.Add(new XAttribute("ImporteP", RetIva_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",", string.Empty))); + } + + RetencionesP.Add(RetencionP); + } + } + } + //Ret ISR + if (atr.RET_IMPUESTODR_1 == "001") + { + RetISR_ += atr.RET_IMPORTEDR_1; + if (num == conta) + { + if (Pago10_MonedaP == "MXN") + { + RetISR_ = atr.MonedaDR.ToUpper() == "MXN" ? RetISR_ : RetISR_ / atr.EquivalenciaDR; + } + else if (Pago10_MonedaP == "USD") + { + RetISR_ = atr.MonedaDR.ToUpper() == "MXN" ? RetISR_ / Pago10_TipoCambioP : RetISR_; + } + RetencionP = new XElement(_pago10 + "RetencionP"); + RetencionP.Add(new XAttribute("ImpuestoP", atr.RET_IMPUESTODR_1)); + //no es BMS + if (ComprobanteDBAplicacion.ToLower() != "cuentagastos") + { + RetencionP.Add(new XAttribute("ImporteP", RetISR_.ToString(sameMoneda ? strDec : strDec).Replace(",", string.Empty))); + } + else + { + //sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") + //RetencionP.Add(new XAttribute("ImporteP", RetISR_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec6).Replace(",", string.Empty))); + RetencionP.Add(new XAttribute("ImporteP", RetISR_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",", string.Empty))); + } + + RetencionesP.Add(RetencionP); + } + } + else { + if (ComprobanteDBAplicacion.ToLower() != "cuentagastos" && atr.RET_IMPUESTODR_1 !="") { + if (num == conta) + { + if (Pago10_MonedaP == "MXN") + { + RetISR_ = atr.MonedaDR.ToUpper() == "MXN" ? RetISR_ : RetISR_ / atr.EquivalenciaDR; + } + else if (Pago10_MonedaP == "USD") + { + RetISR_ = atr.MonedaDR.ToUpper() == "MXN" ? RetISR_ / Pago10_TipoCambioP : RetISR_; + } + RetencionP = new XElement(_pago10 + "RetencionP"); + RetencionP.Add(new XAttribute("ImpuestoP", "001")); + //no es BMS + if (ComprobanteDBAplicacion.ToLower() != "cuentagastos") + { + RetencionP.Add(new XAttribute("ImporteP", RetISR_.ToString(sameMoneda ? strDec : strDec6).Replace(",", string.Empty))); + } + else + { + //sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") + //RetencionP.Add(new XAttribute("ImporteP", RetISR_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec6).Replace(",", string.Empty))); + RetencionP.Add(new XAttribute("ImporteP", RetISR_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",", string.Empty))); + } + + RetencionesP.Add(RetencionP); + } + } + } + + + //IVA Importe prepara nodos + if (atr.TRAS_IMPORTEDR > 0 || (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && atr.IVA_CERO)) + { + if (num == conta) + { + //por Default nodo PADRE "TrasladosP" + TrasladosP = new XElement(_pago10 + "TrasladosP"); + //si son los dos nodos segmento e inicializo para 16 y 8 + if (DiezYseis_16 && Ocho_8) + { + TrasladoP16 = new XElement(_pago10 + "TrasladoP"); + TrasladoP8 = new XElement(_pago10 + "TrasladoP"); + } + else + { + //mejor control de flujo de los nodos Hijo, como este es por default se removera cuando se tenga los dos nodos de 8 y 16 + TrasladoP = new XElement(_pago10 + "TrasladoP"); + } + //estos son opcionales a 0% solo CGII + //if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && atr.IVA_CERO) + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && MXNMontoCero>0) + { + TrasladosP0 = new XElement(_pago10 + "TrasladosP"); + TrasladoP0 = new XElement(_pago10 + "TrasladoP"); + } + } + } + //IVA Impuesto Hace sumatorias + //if (atr.TRAS_IMPUESTODR == "002" || (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && atr.IVA_CERO)) + if (atr.TRAS_IMPUESTODR == "002" || (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && MXNMontoCero > 0)) + { + + if (Pago10_MonedaP == "MXN") + { + if (DiezYseis_16 && Ocho_8) + { + if (DiezYseis_16 && atr.TRAS_TASAOCUOTADR ==0.160000) + { + BaseIVA16_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_BASEDR : atr.TRAS_BASEDR / atr.EquivalenciaDR; + IVA16_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_IMPORTEDR : atr.TRAS_IMPORTEDR / atr.EquivalenciaDR; + } + if (Ocho_8 && atr.TRAS_TASAOCUOTADR == 0.080000) + { + BaseIVA8_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_BASEDR : atr.TRAS_BASEDR / atr.EquivalenciaDR; + IVA8_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_IMPORTEDR : atr.TRAS_IMPORTEDR / atr.EquivalenciaDR; + } + } + else { + BaseIVA_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_BASEDR : atr.TRAS_BASEDR / atr.EquivalenciaDR; + IVA_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_IMPORTEDR : atr.TRAS_IMPORTEDR / atr.EquivalenciaDR; + } + + } + else if (Pago10_MonedaP == "USD") + { + if (DiezYseis_16 && Ocho_8) + { + if (DiezYseis_16 && atr.TRAS_TASAOCUOTADR == 0.160000) + { + BaseIVA16_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_BASEDR / atr.EquivalenciaDR : atr.TRAS_BASEDR; + IVA16_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_IMPORTEDR / atr.EquivalenciaDR : atr.TRAS_IMPORTEDR; + } + + if (Ocho_8 && atr.TRAS_TASAOCUOTADR == 0.080000) + { + + BaseIVA8_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_BASEDR / atr.EquivalenciaDR : atr.TRAS_BASEDR; + IVA8_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_IMPORTEDR / atr.EquivalenciaDR : atr.TRAS_IMPORTEDR; + + } + } + else { + BaseIVA_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_BASEDR / atr.EquivalenciaDR : atr.TRAS_BASEDR; + IVA_ += atr.MonedaDR.ToUpper() == "MXN" ? atr.TRAS_IMPORTEDR / atr.EquivalenciaDR : atr.TRAS_IMPORTEDR; + } + + } + + + + // moneda del pago cambiar strDec4 Pago10_MonedaP + if (num == conta) + { + //if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && atr.IVA_CERO) + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && MXNMontoCero>0) + + { + + TrasladoP0.Add(new XAttribute("ImpuestoP", "002")); + TrasladoP0.Add(new XAttribute("TipoFactorP", "Tasa")); + //TrasladoP0.Add(new XAttribute("BaseP", atr.IVA_CERO_CANT.ToString(Pago10_MonedaP == "USD" ? strDec4 : strDec).Replace(",", string.Empty))); + + + //CAMBIO28 + TrasladoP0.Add(new XAttribute("BaseP", MXNMontoCero.ToString(sameMoneda ? strDec : strDec).Replace(",", string.Empty))); + //TrasladoP0.Add(new XAttribute("BaseP", (Math.Truncate(MXNMontoCero * 1000000) / 1000000).ToString().Replace(",", string.Empty))); + + TrasladoP0.Add(new XAttribute("ImporteP", "0.000000")); + TrasladoP0.Add(new XAttribute("TasaOCuotaP", "0.000000")); + TrasladosP.Add(TrasladoP0); + + if (DiezYseis_16 && Ocho_8) + { + if (DiezYseis_16 ) { + TrasladoP16.Add(new XAttribute("ImpuestoP","002")); + TrasladoP16.Add(new XAttribute("TipoFactorP", "Tasa")); + + //Pago10_MonedaP == "USD" ? strDec6 : strDec + TrasladoP16.Add(new XAttribute("BaseP", BaseIVA16_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",",string.Empty))); + TrasladoP16.Add(new XAttribute("ImporteP", IVA16_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",", string.Empty))); + TrasladoP16.Add(new XAttribute("TasaOCuotaP", "0.160000")); + TrasladosP.Add(TrasladoP16); + } + + if (Ocho_8) { + TrasladoP8.Add(new XAttribute("ImpuestoP", "002")); + TrasladoP8.Add(new XAttribute("TipoFactorP", "Tasa")); + + TrasladoP8.Add(new XAttribute("BaseP", BaseIVA8_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",", string.Empty))); + TrasladoP8.Add(new XAttribute("ImporteP", IVA8_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",", string.Empty))); + + TrasladoP8.Add(new XAttribute("TasaOCuotaP", "0.080000")); + TrasladosP.Add(TrasladoP8); + } + + } + else { + if (atr.TRAS_BASEDR != 0 || BaseIVA_ !=0) + { + TrasladoP.Add(new XAttribute("ImpuestoP", atr.TRAS_IMPUESTODR == "" ? "002" : atr.TRAS_IMPUESTODR)); + TrasladoP.Add(new XAttribute("TipoFactorP", atr.TRAS_TIPOFACTORDR == "" ? "Tasa" : atr.TRAS_TIPOFACTORDR)); + + + //CAMBIO28 + //BaseIVA_ = (Math.Truncate(BaseIVA_ * 1000000) / 1000000); + //IVA_ = (Math.Truncate(IVA_ * 1000000) / 1000000); + if (Pago10_MonedaP.ToUpper() == "MXN" && atr.MonedaDR.ToUpper() == "MXN") + { + TrasladoP.Add(new XAttribute("BaseP", BaseIVA_.ToString(strDec4).Replace(",", string.Empty))); + TrasladoP.Add(new XAttribute("ImporteP", IVA_.ToString(strDec4).Replace(",", string.Empty))); + + } + else + { + TrasladoP.Add(new XAttribute("BaseP", BaseIVA_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec6 : strDec6).Replace(",", string.Empty))); + TrasladoP.Add(new XAttribute("ImporteP", IVA_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec6 : strDec6).Replace(",", string.Empty))); + + } + TrasladoP.Add(new XAttribute("TasaOCuotaP", atr.TRAS_TASAOCUOTADR.ToString(strDec6).Replace(",", string.Empty))); + TrasladosP.Add(TrasladoP); + } + } + + } + else + { + if (DiezYseis_16 && Ocho_8) + { + if (DiezYseis_16) + { + TrasladoP16.Add(new XAttribute("ImpuestoP", "002")); + TrasladoP16.Add(new XAttribute("TipoFactorP", "Tasa")); + + //atr.MonedaDR.ToUpper() == "MXN" && (Pago10_MonedaP.ToUpper() == "MXN") ? + + string base16 = BaseIVA16_.ToString(sameMoneda && (sameFlag) ? strDec : strDec).Replace(",", string.Empty); + string base16_2 = IVA16_.ToString(sameMoneda && (sameFlag) ? strDec : strDec).Replace(",", string.Empty); + + + TrasladoP16.Add(new XAttribute("BaseP", base16)); + TrasladoP16.Add(new XAttribute("ImporteP", base16_2)); + TrasladoP16.Add(new XAttribute("TasaOCuotaP", "0.160000")); + TrasladosP.Add(TrasladoP16); + } + + if (Ocho_8) + { + TrasladoP8.Add(new XAttribute("ImpuestoP", "002")); + TrasladoP8.Add(new XAttribute("TipoFactorP", "Tasa")); + + string base6 = BaseIVA8_.ToString(sameMoneda && (sameFlag) ? strDec : strDec).Replace(",", string.Empty); + string base6_2 = IVA8_.ToString(sameMoneda && (sameFlag) ? strDec : strDec).Replace(",", string.Empty); + + + + TrasladoP8.Add(new XAttribute("BaseP", base6 )); + TrasladoP8.Add(new XAttribute("ImporteP", base6_2 )); + TrasladoP8.Add(new XAttribute("TasaOCuotaP", "0.080000")); + TrasladosP.Add(TrasladoP8); + } + } + else{ + TrasladoP.Add(new XAttribute("ImpuestoP", atr.TRAS_IMPUESTODR == "" ? "002" : atr.TRAS_IMPUESTODR)); + TrasladoP.Add(new XAttribute("TipoFactorP", atr.TRAS_TIPOFACTORDR == "" ? "Tasa" : atr.TRAS_TIPOFACTORDR)); + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + + //CAMBIO28 + //TrasladoP.Add(new XAttribute("BaseP", (Math.Truncate(BaseIVA_*100000)/100000).ToString().Replace(",", string.Empty))); + //TrasladoP.Add(new XAttribute("ImporteP", (Math.Truncate(IVA_ * 100000) / 100000).ToString().Replace(",", string.Empty))); + if (Pago10_MonedaP.ToUpper() == "USD" && atr.MonedaDR.ToUpper() == "USD") + { + TrasladoP.Add(new XAttribute("BaseP", BaseIVA_.ToString(strDec6).Replace(",", string.Empty))); + TrasladoP.Add(new XAttribute("ImporteP", IVA_.ToString(strDec6).Replace(",", string.Empty))); + } + else + { + TrasladoP.Add(new XAttribute("BaseP", BaseIVA_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",", string.Empty))); + TrasladoP.Add(new XAttribute("ImporteP", IVA_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",", string.Empty))); + } + } + else { + if (Pago10_MonedaP.ToUpper() == "USD" && atr.MonedaDR.ToUpper() == "USD") + { + TrasladoP.Add(new XAttribute("BaseP", BaseIVA_.ToString(strDec6).Replace(",", string.Empty))); + TrasladoP.Add(new XAttribute("ImporteP", IVA_.ToString(strDec6).Replace(",", string.Empty))); + } + else + { + TrasladoP.Add(new XAttribute("BaseP", BaseIVA_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",", string.Empty))); + TrasladoP.Add(new XAttribute("ImporteP", IVA_.ToString(sameMoneda && (Pago10_MonedaP.ToUpper() == "MXN") ? strDec : strDec).Replace(",", string.Empty))); + } + } + + + + + TrasladoP.Add(new XAttribute("TasaOCuotaP", atr.TRAS_TASAOCUOTADR.ToString(strDec6).Replace(",", string.Empty))); + + TrasladosP.Add(TrasladoP); + } + + } + } + } + + + //Nodo totales + if (num == conta) + { + + if (DiezYseis_16 && Ocho_8) { + MXNMonto += ( (BaseIVA16_+BaseIVA8_) +(IVA16_+IVA8_) ) - (RetIva_ + RetISR_); + } + else { + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" ) + { + + MXNMonto += (BaseIVA_) + IVA_ - (RetIva_ + RetISR_); + //CAMBIO28 + //MXNMonto = Math.Ceiling(MXNMonto * 100) / 100; + if (MXNMonto == 0) { + MXNMonto += Pago10_Monto; + } + } + else + { + MXNMonto += Pago10_Monto; + } + } + + Pago.Add(new XAttribute("Monto", MXNMonto.ToString(strDec).Replace(",", string.Empty))); + + if (Pago10_MonedaP.ToUpper() == "USD") + { + if (DiezYseis_16 && Ocho_8) + { + BaseIVA_ = BaseIVA16_ + BaseIVA8_; + IVA_ = IVA16_ + IVA8_; + + string baseIVA16Cadena = BaseIVA16_.ToString("N2"); + string IVA16Cadena = IVA16_.ToString("N2"); + + BaseIVA16_ = double.Parse(baseIVA16Cadena) * Pago10_TipoCambioP; + IVA16_ = double.Parse(IVA16Cadena)* Pago10_TipoCambioP; + + string baseIVA8Cadena = BaseIVA8_.ToString("N2"); + string IVA8Cadena = IVA8_.ToString("N2"); + + BaseIVA8_ = double.Parse(baseIVA8Cadena) * Pago10_TipoCambioP; + IVA8_ = double.Parse(IVA8Cadena) * Pago10_TipoCambioP; + + + + } + else { + + //string baseIVACadena = BaseIVA_.ToString("N2"); + //string ivaCadena = IVA_.ToString("N2"); + + //BaseIVA_ = double.Parse(baseIVACadena) * Pago10_TipoCambioP; + //IVA_ = double.Parse(ivaCadena) * Pago10_TipoCambioP; + //BaseIVA_ = BaseIVA_ * atr.EquivalenciaDR; + //IVA_ = IVA_ * atr.EquivalenciaDR; + } + + //CAMBIO28 old + //string baseIVACadena = BaseIVA_.ToString("N2"); + //string ivaCadena = IVA_.ToString("N2"); + //string RetIva = RetIva_.ToString("N2"); + //string RetISR = RetISR_.ToString("N2"); + + //BaseIVA_ = double.Parse(baseIVACadena) * Pago10_TipoCambioP; + //IVA_ = double.Parse(ivaCadena) * Pago10_TipoCambioP; + //RetIva_ = double.Parse(RetIva) * Pago10_TipoCambioP; + //RetISR_ = double.Parse(RetISR) * Pago10_TipoCambioP; + + //CAMBIO28 + BaseIVA_ = BaseIVA_ * Pago10_TipoCambioP; + IVA_ = IVA_ * Pago10_TipoCambioP; + RetIva_ = RetIva_ * Pago10_TipoCambioP; + RetISR_ = RetISR_ * Pago10_TipoCambioP; + + BaseIVA_ = (Math.Truncate(BaseIVA_ * 1000000) / 1000000); + IVA_ = (Math.Truncate(IVA_ * 1000000) / 1000000); + RetIva_ = (Math.Truncate(RetIva_ * 1000000) / 100000); + RetISR_ = (Math.Truncate(RetISR_ * 100000) / 100000); + + + MXNMonto = ((BaseIVA_) + (IVA_)) - (RetIva_ + RetISR_); + if (MXNMonto==0) { + MXNMonto = Pago10_Monto * Pago10_TipoCambioP; + } + + + } + //if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && atr.IVA_CERO) + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos" && MXNMontoCero > 0) + + { + + //Totales.Add(new XAttribute("TotalTrasladosBaseIVA0", atr.IVA_CERO_CANT.ToString(strDec).Replace(",", string.Empty))); + if (Pago10_MonedaP == "USD" )//&& atr.MonedaDR =="USD") + { + string IVACero = MXNMontoCero.ToString("N2"); + + MXNMontoCero = double.Parse(IVACero) * Pago10_TipoCambioP; + //CAMBIO28 + //MXNMonto += MXNMontoCero; + + MXNMonto = Pago10_Monto * Pago10_TipoCambioP; + + + } + Totales.Add(new XAttribute("TotalTrasladosBaseIVA0", MXNMontoCero.ToString(strDec).Replace(",", string.Empty))); + Totales.Add(new XAttribute("TotalTrasladosImpuestoIVA0", "0.00")); + } + + + if (DiezYseis_16 && Ocho_8) + { + Totales.Add(new XAttribute("TotalTrasladosBaseIVA16", BaseIVA16_.ToString(strDec).Replace(",", string.Empty))); + + Totales.Add(new XAttribute("TotalTrasladosBaseIVA8", BaseIVA8_.ToString(strDec).Replace(",", string.Empty))); + + Totales.Add(new XAttribute("TotalTrasladosImpuestoIVA16" , IVA16_.ToString(strDec).Replace(",", string.Empty))); + Totales.Add(new XAttribute("TotalTrasladosImpuestoIVA8", IVA8_.ToString(strDec).Replace(",", string.Empty))); + } + else { + if (BaseIVA_ > 0) { + + //CAMBIO28 + //Totales.Add(new XAttribute(Ocho_16 ? "TotalTrasladosBaseIVA16" : "TotalTrasladosBaseIVA8", (Math.Ceiling(BaseIVA_ * 100) / 100).ToString(strDec).Replace(",", string.Empty))); + Totales.Add(new XAttribute(Ocho_16 ? "TotalTrasladosBaseIVA16" : "TotalTrasladosBaseIVA8", BaseIVA_.ToString(strDec).Replace(",", string.Empty))); + + + } + if (IVA_ > 0) + { + //CAMBIO28 + //Totales.Add(new XAttribute(Ocho_16 ? "TotalTrasladosImpuestoIVA16" : "TotalTrasladosImpuestoIVA8", (Math.Ceiling(IVA_ *100)/100).ToString(strDec).Replace(",", string.Empty))); + Totales.Add(new XAttribute(Ocho_16 ? "TotalTrasladosImpuestoIVA16" : "TotalTrasladosImpuestoIVA8", IVA_.ToString(strDec).Replace(",", string.Empty))); + } + } + + + //=============RETENCIONES + if (RetIva_ > 0) + { + Totales.Add(new XAttribute("TotalRetencionesIVA", RetIva_.ToString(strDec).Replace(",", string.Empty))); + } + if (RetISR_ > 0) + { + Totales.Add(new XAttribute("TotalRetencionesISR", RetISR_.ToString(strDec).Replace(",", string.Empty))); + } + + Totales.Add(new XAttribute("MontoTotalPagos", MXNMonto.ToString(strDec).Replace(",", string.Empty))); + + } + + } + + + Pagos.Add(Totales); + if (TrasladosP != null || RetencionesP != null) + { + ImpuestosP = new XElement(_pago10 + "ImpuestosP"); + } + if (RetencionesP != null) + { + ImpuestosP.Add(RetencionesP); + } + if (TrasladosP != null) + { + ImpuestosP.Add(TrasladosP); + } + + + Pago.Add(ImpuestosP); + } + + Pagos.Add(Pago); + + if (string.IsNullOrEmpty(Comprobante_Sello)) + { + XElement Complemento = new XElement(cfdi + "Complemento"); + Complemento.Add(Pagos); + Comprobante.Add(Complemento); + } + } + #endregion pago10 +/*------------------------PAGOS-----PAGOS OLD--END-------------------------------------------------------------------------*/ + //notarios + #region notarios + XNamespace _NotariosPublicos = "http://www.sat.gob.mx/notariospublicos"; + XElement notariospublicos = new XElement(_NotariosPublicos + "NotariosPublicos"); + + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComplementoNotaria == 1 && ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + notariospublicos.Add(new XAttribute("Version", "1.0")); + + XElement DescInmuebles = new XElement(_NotariosPublicos + "DescInmuebles"); + XElement DescInmueble = new XElement(_NotariosPublicos + "DescInmueble"); + DescInmueble.Add(new XAttribute("TipoInmueble", DescInmueble_TipoInmueble)); + DescInmueble.Add(new XAttribute("Calle", DescInmueble_Calle)); + DescInmueble.Add(new XAttribute("NoExterior", DescInmueble_NoExterior)); + if (!string.IsNullOrEmpty(DescInmueble_NoInterior)) + { + DescInmueble.Add(new XAttribute("NoInterior", DescInmueble_NoInterior)); + } + DescInmueble.Add(new XAttribute("Colonia", DescInmueble_Colonia)); + DescInmueble.Add(new XAttribute("Localidad", DescInmueble_Localidad)); + if (!string.IsNullOrEmpty(DescInmueble_Referencia)) + { + DescInmueble.Add(new XAttribute("Referencia", DescInmueble_Referencia)); + } + DescInmueble.Add(new XAttribute("Municipio", DescInmueble_Municipio)); + DescInmueble.Add(new XAttribute("Estado", DescInmueble_Estado)); + DescInmueble.Add(new XAttribute("Pais", DescInmueble_Pais)); + DescInmueble.Add(new XAttribute("CodigoPostal", DescInmueble_CodigoPostal)); + DescInmuebles.Add(DescInmueble); + notariospublicos.Add(DescInmuebles); + + XElement DatosOperacion = new XElement(_NotariosPublicos + "DatosOperacion"); + DatosOperacion.Add(new XAttribute("NumInstrumentoNotarial", DatosOperacion_NumInstrumentoNotarial)); + DatosOperacion.Add(new XAttribute("FechaInstNotarial", DatosOperacion_FechaInstNotarial)); + DatosOperacion.Add(new XAttribute("MontoOperacion", DatosOperacion_MontoOperacion)); + DatosOperacion.Add(new XAttribute("Subtotal", DatosOperacion_Subtotal)); + DatosOperacion.Add(new XAttribute("IVA", DatosOperacion_IVA)); + notariospublicos.Add(DatosOperacion); + + XElement DatosNotario = new XElement(_NotariosPublicos + "DatosNotario"); + DatosNotario.Add(new XAttribute("CURP", DatosNotario_CURP)); + DatosNotario.Add(new XAttribute("NumNotaria", DatosNotario_NumNotaria)); + DatosNotario.Add(new XAttribute("EntidadFederativa", DatosNotario_EntidadFederativa)); + DatosNotario.Add(new XAttribute("Adscripcion", DatosNotario_Adscripcion)); + notariospublicos.Add(DatosNotario); + + int intEna = 0; + int intAdq = 0; + XElement DatosEnajenante = new XElement(_NotariosPublicos + "DatosEnajenante"); + DatosEnajenante.Add(new XAttribute("CoproSocConyugalE", DatosEnajenante_CoproSocConyugalE)); + XElement DatosEnajenantesCopSC = new XElement(_NotariosPublicos + "DatosEnajenantesCopSC"); + XElement DatosAdquiriente = new XElement(_NotariosPublicos + "DatosAdquiriente"); + DatosAdquiriente.Add(new XAttribute("CoproSocConyugalE", DatosAdquiriente_CoproSocConyugalE)); + XElement DatosAdquirientesCopSC = new XElement(_NotariosPublicos + "DatosAdquirientesCopSC"); + + foreach (var atr in DatosCop) + { + if (atr.Tipo == "Enajenante") + { + if (DatosEnajenante_CoproSocConyugalE.ToLower() == "no") + { + XElement DatosUnEnajenante = new XElement(_NotariosPublicos + "DatosUnEnajenante"); + DatosUnEnajenante.Add(new XAttribute("Nombre", atr.Nombre)); + if (!string.IsNullOrEmpty(atr.ApellidoPaterno)) + { + DatosUnEnajenante.Add(new XAttribute("ApellidoPaterno", atr.ApellidoPaterno)); + } + if (!string.IsNullOrEmpty(atr.ApellidoMaterno)) + { + DatosUnEnajenante.Add(new XAttribute("ApellidoMaterno", atr.ApellidoMaterno)); + } + DatosUnEnajenante.Add(new XAttribute("RFC", atr.RFC)); + if (!string.IsNullOrEmpty(atr.CURP)) + { + DatosUnEnajenante.Add(new XAttribute("CURP", atr.CURP)); + } + DatosEnajenante.Add(DatosUnEnajenante); + intEna = 1; + } + else + { + XElement DatosEnajenanteCopSC = new XElement(_NotariosPublicos + "DatosEnajenanteCopSC"); + DatosEnajenanteCopSC.Add(new XAttribute("Nombre", atr.Nombre)); + if (!string.IsNullOrEmpty(atr.ApellidoPaterno)) + { + DatosEnajenanteCopSC.Add(new XAttribute("ApellidoPaterno", atr.ApellidoPaterno)); + } + if (!string.IsNullOrEmpty(atr.ApellidoMaterno)) + { + DatosEnajenanteCopSC.Add(new XAttribute("ApellidoMaterno", atr.ApellidoMaterno)); + } + DatosEnajenanteCopSC.Add(new XAttribute("RFC", atr.RFC)); + if (!string.IsNullOrEmpty(atr.CURP)) + { + DatosEnajenanteCopSC.Add(new XAttribute("CURP", atr.CURP)); + } + DatosEnajenanteCopSC.Add(new XAttribute("Porcentaje", atr.Porcentaje.ToString(strDec).Replace(",", string.Empty))); + DatosEnajenantesCopSC.Add(DatosEnajenanteCopSC); + } + } + if (atr.Tipo == "Adquiriente") + { + if (DatosAdquiriente_CoproSocConyugalE.ToLower() == "no") + { + XElement DatosUnAdquiriente = new XElement(_NotariosPublicos + "DatosUnAdquiriente"); + DatosUnAdquiriente.Add(new XAttribute("Nombre", atr.Nombre)); + if (!string.IsNullOrEmpty(atr.ApellidoPaterno)) + { + DatosUnAdquiriente.Add(new XAttribute("ApellidoPaterno", atr.ApellidoPaterno)); + } + if (!string.IsNullOrEmpty(atr.ApellidoMaterno)) + { + DatosUnAdquiriente.Add(new XAttribute("ApellidoMaterno", atr.ApellidoMaterno)); + } + DatosUnAdquiriente.Add(new XAttribute("RFC", atr.RFC)); + if (!string.IsNullOrEmpty(atr.CURP)) + { + DatosUnAdquiriente.Add(new XAttribute("CURP", atr.CURP)); + } + DatosAdquiriente.Add(DatosUnAdquiriente); + intAdq = 1; + } + else + { + XElement DatosAdquirienteCopSC = new XElement(_NotariosPublicos + "DatosAdquirienteCopSC"); + DatosAdquirienteCopSC.Add(new XAttribute("Nombre", atr.Nombre)); + if (!string.IsNullOrEmpty(atr.ApellidoPaterno)) + { + DatosAdquirienteCopSC.Add(new XAttribute("ApellidoPaterno", atr.ApellidoPaterno)); + } + if (!string.IsNullOrEmpty(atr.ApellidoMaterno)) + { + DatosAdquirienteCopSC.Add(new XAttribute("ApellidoMaterno", atr.ApellidoMaterno)); + } + DatosAdquirienteCopSC.Add(new XAttribute("RFC", atr.RFC)); + if (!string.IsNullOrEmpty(atr.CURP)) + { + DatosAdquirienteCopSC.Add(new XAttribute("CURP", atr.CURP)); + } + DatosAdquirienteCopSC.Add(new XAttribute("Porcentaje", atr.Porcentaje.ToString(strDec).Replace(",", string.Empty))); + DatosAdquirientesCopSC.Add(DatosAdquirienteCopSC); + } + } + } + if (intEna == 0) + { + DatosEnajenante.Add(DatosEnajenantesCopSC); + } + notariospublicos.Add(DatosEnajenante); + if (intAdq == 0) + { + DatosAdquiriente.Add(DatosAdquirientesCopSC); + } + notariospublicos.Add(DatosAdquiriente); + if (string.IsNullOrEmpty(Comprobante_Sello)) + { + XElement Complemento = new XElement(cfdi + "Complemento"); + Complemento.Add(notariospublicos); + Comprobante.Add(Complemento); + } + } + #endregion notarios + + //comercio exterior + #region comercio exterior + XElement Complemento_ComercioExterior = null; + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComercioExterior_Activo) + { + Complemento_ComercioExterior = complemento_comercio_exterior_xml(); + if (string.IsNullOrEmpty(Comprobante_Sello)) + { + XElement Complemento = new XElement(cfdi + "Complemento"); + Complemento.Add(Complemento_ComercioExterior); + Comprobante.Add(Complemento); + } + } + #endregion comercio exterior + + //Carta Porte + #region Carta Porte + + XElement Complemento_CartaPorteX = null;//new XElement(_Carta + "ccp10"); + + //if (ComprobanteDBTipoComprobante.ToLower() =="traslado" && CartaPorte) + if (CartaPorte && Sin_CP != "SIN_CP") + { + Complemento_CartaPorteX = Complemento_CartaPorte_XML(); + if (string.IsNullOrEmpty(Comprobante_Sello)) + { + XElement Complemento = new XElement(cfdi + "Complemento"); + Complemento.Add(Complemento_CartaPorteX); + Comprobante.Add(Complemento); + } + } + #endregion Carta Porte + + //Complemento INE + #region Complemento INE + XElement Complemento_INE = null; + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "bms" && INE_Activo) + { + Complemento_INE = complemento_INE_xml(); + if (string.IsNullOrEmpty(Comprobante_Sello)) + { + XElement Complemento = new XElement(cfdi + "Complemento"); + Complemento.Add(Complemento_INE); + Comprobante.Add(Complemento); + } + else { + + } + } + #endregion Complemento INE + + + //agregar datos de timbre y complementos + #region agregar timbre + if (!string.IsNullOrEmpty(Comprobante_Sello)) + { + Comprobante_Fecha = sys_fix_fecha(Comprobante_Fecha); + + //complemento + XNamespace schemaLocation_ = "http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd"; + XNamespace tfd = "http://www.sat.gob.mx/TimbreFiscalDigital"; + + XElement Complemento = new XElement(cfdi + "Complemento"); + XElement Complemento_TimbreFiscalDigital = new XElement(tfd + "TimbreFiscalDigital"); + Complemento_TimbreFiscalDigital.Add(new XAttribute(XNamespace.Xmlns + "tfd", tfd)); + Complemento_TimbreFiscalDigital.Add(new XAttribute(xsi + "schemaLocation", schemaLocation_)); + Complemento_TimbreFiscalDigital.Add(new XAttribute("Version", "1.1")); + Complemento_TimbreFiscalDigital.Add(new XAttribute("UUID", Complemento_TimbreFiscalDigital_UUID)); + Complemento_TimbreFiscalDigital.Add(new XAttribute("FechaTimbrado", Complemento_TimbreFiscalDigital_FechaTimbrado)); + Complemento_TimbreFiscalDigital.Add(new XAttribute("RfcProvCertif", Complemento_TimbreFiscalDigital_RfcProvCertif)); + Complemento_TimbreFiscalDigital.Add(new XAttribute("SelloCFD", Complemento_TimbreFiscalDigital_SelloCFD)); + Complemento_TimbreFiscalDigital.Add(new XAttribute("NoCertificadoSAT", Complemento_TimbreFiscalDigital_NoCertificadoSAT)); + Complemento_TimbreFiscalDigital.Add(new XAttribute("SelloSAT", Complemento_TimbreFiscalDigital_SelloSAT)); + + //agregar nodo pagos a complemento + if (ComprobanteDBTipoComprobante.ToLower() == "pago") + { + Complemento.Add(Pagos); + } + + //agregar nodo notariospublicos a complemento + if ((ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") && ComplementoNotaria == 1 && ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + Complemento.Add(notariospublicos); + } + + //agregar nodo comercio exterior a complemento + if ((ComprobanteDBTipoComprobante.ToLower() == "factura" || ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") && ComercioExterior_Activo) + { + Complemento.Add(Complemento_ComercioExterior); + } + + //agregar nodo ine a complemento + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && CFDISis == "bms" && INE_Activo) + { + Complemento.Add(Complemento_INE); + } + + //if (ComprobanteDBTipoComprobante.ToLower() == "traslado" && CartaPorte && CFDISis=="bms") + if (CartaPorte && CFDISis == "bms" && Sin_CP != "SIN_CP") + { + Complemento.Add(Complemento_CartaPorteX); + } + //Agregar Nodo Traslados a Complemento + Complemento.Add(Complemento_TimbreFiscalDigital); + + + + + //Agregar Complemento a Comprobante + Comprobante.Add(Complemento); + /////////////////////////////////////////////////////////// + + #region Addenda + if (Receptor_Rfc == "AEM050110CF8" && ComprobanteDBTipoComprobante.ToLower() == "factura" && ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + XElement CAddenda = new XElement(cfdi + "Addenda"); + + if (string.IsNullOrEmpty(PO)) + { + XElement orden = new XElement("Orden", ""); + CAddenda.Add(orden); + Comprobante.Add(CAddenda); + } + else + { + XElement orden = new XElement("Orden", '\u0022' + PO + '\u0022'); + CAddenda.Add(orden); + Comprobante.Add(CAddenda); + } + + } + #endregion Addenda + + + + + //Guardar el comprobante + try + { + XDocument cfdi33 = new XDocument( + Comprobante + ); + cfdi33.Save(ComprobanteDBArchivoTimbrado); + + //GuardarXMLtoTXT(cfdi33, cfdi, ComprobanteDBArchivoTimbrado); + } + catch (Exception Ex) + { + exe_err(Ex, "Gua_XML_TIM"); + } + + //calcular cadena original timbre fiscal + Complemento_TimbreFiscalDigital_CadenaOriginalSAT = cfdi33_cadena_original_complemento(); + + //Asignar valores a consulta de update comprobante + timbre_sql(); + + //generar codigo qr + cfdi33_codigoqr(); + + //GenerarAddenda(); + sys_proceso_fin("¡Comprobante Timbrado!", 1); + + } + #endregion agregar timbre + + + + //llamar a genera al timbrar y generar el xml con datos del timbre. + //generar cadena original + #region generar cadena + if (string.IsNullOrEmpty(Comprobante_CadenaOriginal) && string.IsNullOrEmpty(SysErrores)) + { + try + { + + XDocument cfdi33_1 = new XDocument( + Comprobante + ); + cfdi33_1.Save(ComprobanteDBArchivo); + + //GuardarXMLtoTXT(cfdi33_1, cfdi, ComprobanteDBArchivo); + } + catch (Exception Ex) + { + exe_err(Ex, "Gua_XML_CAD_ORI"); + } + + //Calcular cadena original formula + Comprobante_CadenaOriginal = cfdi33_cadena_original(); + + //Calcular sello + Comprobante_Sello = cfdi33_sello(); + Comprobante.Add(new XAttribute("Sello", Comprobante_Sello)); + + //guardar archivo ahora con sello + try + { + XDocument cfdi33_2 = new XDocument( + Comprobante + ); + + cfdi33_2.Save(ComprobanteDBArchivo); + //GuardarXMLtoTXT(cfdi33_2, cfdi, ComprobanteDBArchivo); + + } + catch (Exception Ex) + { + exe_err(Ex, "Gua_XML_SEL"); + } + + if (string.IsNullOrEmpty(SysErrores)) + { + bool bolTim = false; + + if (CFDIPac == "EdiCom") + { + bolTim = edicom_timbrado(); + } + else + { + //string contenido = File.ReadAllText(ComprobanteDBArchivo); + //MessageBox.Show("JAJAJAJAJA "+contenido); + + string tipo2 = "XML"; + byte[] cfdi_sin_timbrar = File.ReadAllBytes(ComprobanteDBArchivo); + string email = ""; + + int codigo; + string errMsg; + string xml_tim; + string uuid; + int saldo; + string errEmail; + //Timbrado normal + timbrarV5Xml(CFDIPacUrl, CFDIPacUsr, CFDIPacPwd, tipo2, cfdi_sin_timbrar, email, out codigo, out errMsg, out xml_tim, out uuid, out saldo, out errEmail); + + //si no hay errMsg + try { + if (!string.IsNullOrEmpty(errMsg)) + { + throw new ComDig_Exception(errMsg); + } + + XDocument Comprobante1 = XDocument.Parse(xml_tim); + + try + { + XDocument cfdi33 = new XDocument( + Comprobante1 + ); + cfdi33.Save(ComprobanteDBArchivoTimbrado); + + //GuardarXMLtoTXT(cfdi33, cfdi, ComprobanteDBArchivoTimbrado); + + } + catch (Exception Ex) + { + exe_err(Ex, "Gua_XML_TIM_COM_DIG"); + } + + //calcular cadena original timbre fiscal + Complemento_TimbreFiscalDigital_CadenaOriginalSAT = cfdi33_cadena_original_complemento(); + + //Asignar valores a consulta de update comprobante + timbre_sql(); + + //generar codigo qr + cfdi33_codigoqr(); + + //GenerarAddenda(); + sys_proceso_fin("¡Comprobante Timbrado!", 1); + + } + //si hay errMsg + catch (ComDig_Exception ex) + { + sys_mensaje_error("Error en el XML, favor de revisar\n" + errMsg); + + exe_err(ex, "Gen_XML_Com_DIG"); + } + + + } + if (bolTim) + { + + cfdi33_xml(); + } + } + } + #endregion generar cadena + } + catch (Exception Ex) + { + sys_mensaje_error("Error al generar el XML."); + exe_err(Ex, "Gen_XML"); + } + } + #endregion cfdi33 xml + + public static bool GuardarXMLtoTXT(XDocument doc, XNamespace cfdi, string NombreXML) { + bool result = false; + string xmltoTXT=""; + XElement receptor = doc.Descendants(cfdi + "Receptor").FirstOrDefault(); + if (receptor != null) { + //Acceder al atributo "Nombre" + XAttribute nombreAtt = receptor.Attribute("Nombre"); + if (nombreAtt != null) { + string valorAgregado = nombreAtt.Value; + valorAgregado = valorAgregado.Replace("'", "'"); + + nombreAtt.Value = valorAgregado; + } + } + + XElement emisor = doc.Descendants(cfdi + "Emisor").FirstOrDefault(); + if (emisor != null) { + XAttribute nombreEmiAtt = emisor.Attribute("Nombre"); + if (nombreEmiAtt!=null) { + string valorAgregado = nombreEmiAtt.Value; + valorAgregado = valorAgregado.Replace("'", "'"); + nombreEmiAtt.Value = valorAgregado; + } + } + + foreach (XElement concepto in doc.Descendants(cfdi + "Concepto")) { + XAttribute descripcionAtt = concepto.Attribute("Descripcion"); + if (descripcionAtt!=null) { + string valorDesc = descripcionAtt.Value; + valorDesc = valorDesc.Replace("'", "'"); + descripcionAtt.Value = valorDesc; + } + } + + //Guardar XML modificado como String + xmltoTXT = doc.ToString(); + xmltoTXT = xmltoTXT.Replace("&apos;", "'"); + try { + + + // Agregar la declaración XML con la codificación UTF-8 + string xmlDeclaracion = @""; + string xmlString = xmlDeclaracion + Environment.NewLine + xmltoTXT.ToString(); + + // Guardar el contenido XML en un archivo + File.WriteAllText(NombreXML, xmlString, Encoding.UTF8); + result = true; + } + catch( Exception e){ + MessageBox.Show("Error ' "+e.Message.ToString()); + result = false; + } + + return result; + + } + + public class ComDig_Exception : Exception + { + + + public ComDig_Exception() { } + + public ComDig_Exception(string message) : base(message) + { + + } + public ComDig_Exception(string message, Exception innerException) + : base(message, innerException) + { } + } + + + //guardar timbre en sql + #region timbre_sql + public void timbre_sql() + { + sys_estatus("Agregando Timbre..."); + + SQLUpdate.Clear(); + SQLUpdateTblID = ComprobanteDBSysId; + + + + + if (string.IsNullOrEmpty(Complemento_TimbreFiscalDigital_RfcProvCertif)) + { + string ComDig = CFDIMod == "Prueba" ? "SPR190613I52" : "SCD110105654"; + Complemento_TimbreFiscalDigital_RfcProvCertif = CFDIPac=="EdiCom"? "EME000602QR9" : ComDig; + } + + + //CG2 + #region + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + SQLUpdate.Add(new SQLCol { SQLNom = "NOCERTIFICADODIGITAL", SQLStr = Comprobante_NoCertificado }); + SQLUpdate.Add(new SQLCol { SQLNom = "VERSIONTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_Version }); + SQLUpdate.Add(new SQLCol { SQLNom = "UUIDTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_UUID }); + SQLUpdate.Add(new SQLCol { SQLNom = "FECHAYHORATIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_FechaTimbrado }); + SQLUpdate.Add(new SQLCol { SQLNom = "RFCPROVCERTIFICACION", SQLStr = Complemento_TimbreFiscalDigital_RfcProvCertif }); + SQLUpdate.Add(new SQLCol { SQLNom = "CADENAORIGINALSATTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_CadenaOriginalSAT }); + + if (ComprobanteDBTipoComprobante.ToLower() == "notacredito") + { + //mismo campo que sello + SQLUpdate.Add(new SQLCol { SQLNom = "SellosSat", SQLStr = Complemento_TimbreFiscalDigital_SelloSAT }); + SQLUpdate.Add(new SQLCol { SQLNom = "SelloCdfTimbrado", SQLStr = Complemento_TimbreFiscalDigital_SelloCFD }); + SQLUpdate.Add(new SQLCol { SQLNom = "NOCERTIFICADOSATIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_NoCertificadoSAT }); + } + else + { + //mismo campo que sello + SQLUpdate.Add(new SQLCol { SQLNom = "SELLOSAT", SQLStr = Complemento_TimbreFiscalDigital_SelloSAT }); + SQLUpdate.Add(new SQLCol { SQLNom = "SELLOCFDTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_SelloCFD }); + SQLUpdate.Add(new SQLCol { SQLNom = "NOCERTIFICADOSATTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_NoCertificadoSAT }); + } + if (ComprobanteDBTipoComprobante.ToLower() == "factura") + { + SQLUpdate.Add(new SQLCol { SQLNom = "CADENAORIGINAL", SQLStr = Comprobante_CadenaOriginal }); + SQLUpdate.Add(new SQLCol { SQLNom = "SELLODIGITAL", SQLStr = Comprobante_Sello }); + } + else + { + + SQLUpdate.Add(new SQLCol { SQLNom = "CADENAORIGINALEMISOR", SQLStr = Comprobante_CadenaOriginal }); + + SQLUpdate.Add(new SQLCol { SQLNom = "SELLODIGITALEMISOR", SQLStr = Comprobante_Sello }); + } + } + #endregion + + //BMS + #region + if (ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + if (ComprobanteDBTipoComprobante.ToLower() == "retencion") + { + //timbre v3.2 + SQLUpdate.Add(new SQLCol { SQLNom = "RETENCIONCO", SQLStr = Comprobante_CadenaOriginal }); + SQLUpdate.Add(new SQLCol { SQLNom = "RETENCION_Sello", SQLStr = Comprobante_Sello }); + SQLUpdate.Add(new SQLCol { SQLNom = "RETENCIONCERT", SQLStr = Comprobante_NoCertificado }); + SQLUpdate.Add(new SQLCol { SQLNom = "RETENCIONFOLIOPAC", SQLStr = Complemento_TimbreFiscalDigital_UUID }); + SQLUpdate.Add(new SQLCol { SQLNom = "RETENCION_FECHACERTIFICACION", SQLStr = Complemento_TimbreFiscalDigital_FechaTimbrado }); + SQLUpdate.Add(new SQLCol { SQLNom = "RETENCION_VERSIONTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_Version /*"1.0"*/}); + SQLUpdate.Add(new SQLCol { SQLNom = "RETENCION_SELLODIGITALSAT", SQLStr = Complemento_TimbreFiscalDigital_SelloSAT }); + SQLUpdate.Add(new SQLCol { SQLNom = "RETENCION_NOCERTIFICADOSAT", SQLStr = Complemento_TimbreFiscalDigital_NoCertificadoSAT }); + } + if (ComprobanteDBTipoComprobante.ToLower() == "anticipo_egreso" || ComprobanteDBTipoComprobante.ToLower() == "factura_egreso") + { + SQLUpdate.Add(new SQLCol { SQLNom = "NOCERTIFICADODIGITAL", SQLStr = Comprobante_NoCertificado }); + SQLUpdate.Add(new SQLCol { SQLNom = "VERSIONTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_Version }); + SQLUpdate.Add(new SQLCol { SQLNom = "UUIDTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_UUID }); + SQLUpdate.Add(new SQLCol { SQLNom = "FECHAYHORATIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_FechaTimbrado }); + SQLUpdate.Add(new SQLCol { SQLNom = "RFCPROVCERTIFICACION", SQLStr = Complemento_TimbreFiscalDigital_RfcProvCertif }); + SQLUpdate.Add(new SQLCol { SQLNom = "CADENAORIGINALSATTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_CadenaOriginalSAT }); + SQLUpdate.Add(new SQLCol { SQLNom = "SELLOCFDTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_SelloCFD }); + SQLUpdate.Add(new SQLCol { SQLNom = "NOCERTIFICADOSATTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_NoCertificadoSAT }); + SQLUpdate.Add(new SQLCol { SQLNom = "SELLODIGITALEMISOR", SQLStr = Comprobante_Sello }); + SQLUpdate.Add(new SQLCol { SQLNom = "CADENAORIGINALEMISOR", SQLStr = Comprobante_CadenaOriginal }); + SQLUpdate.Add(new SQLCol { SQLNom = "SELLOSAT", SQLStr = Complemento_TimbreFiscalDigital_SelloSAT }); + } + + else + { + string strPre = string.Empty; + strPre = ComprobanteDBTipoComprobante.ToLower() == "traslado" ? "TRASLADO_" : strPre; + strPre = ComprobanteDBTipoComprobante.ToLower() == "factura_egreso" ? "EGRESO_" : strPre; + SQLUpdate.Add(new SQLCol { SQLNom = strPre + "CADENAORIGINAL", SQLStr = Comprobante_CadenaOriginal }); + SQLUpdate.Add(new SQLCol { SQLNom = strPre + "SELLODIGITAL", SQLStr = Comprobante_Sello }); + SQLUpdate.Add(new SQLCol { SQLNom = strPre + "NOCERTIFICADO", SQLStr = Comprobante_NoCertificado }); + SQLUpdate.Add(new SQLCol { SQLNom = strPre + "FOLIOPAC", SQLStr = Complemento_TimbreFiscalDigital_UUID }); + SQLUpdate.Add(new SQLCol { SQLNom = strPre + "FECHACERTIFICACION", SQLStr = Complemento_TimbreFiscalDigital_FechaTimbrado }); + SQLUpdate.Add(new SQLCol { SQLNom = strPre + "CFDI33_RFCPROVCERTIFICACION", SQLStr = Complemento_TimbreFiscalDigital_RfcProvCertif }); + SQLUpdate.Add(new SQLCol { SQLNom = strPre + "CFDI33_VERSIONTIMBRADO", SQLStr = Complemento_TimbreFiscalDigital_Version }); + SQLUpdate.Add(new SQLCol { SQLNom = strPre + "CADENAORIGINALSAT", SQLStr = Complemento_TimbreFiscalDigital_CadenaOriginalSAT }); + SQLUpdate.Add(new SQLCol { SQLNom = strPre + "SELLODIGITALSAT", SQLStr = Complemento_TimbreFiscalDigital_SelloSAT }); + SQLUpdate.Add(new SQLCol { SQLNom = strPre + "NOCERTIFICADOSAT", SQLStr = Complemento_TimbreFiscalDigital_NoCertificadoSAT }); + } + } + #endregion + + //cuenta de gastos + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + SQLUpdateTbl = "Anticipos"; + SQLUpdateTblKey = "SYSID"; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADO" }); + break; + case "anticipo_egreso": + SQLUpdateTbl = "Anticipos_Egresos_Detalles"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "EGRESADO" }); + break; + case "factura": + SQLUpdateTbl = "Facturas"; + SQLUpdateTblKey = "CUENTAGASTOS"; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUSCERTELEC", SQLStr = "TIMBRADA" }); + break; + case "factura_egreso": + SQLUpdateTbl = "Facturas_Egresos_Detalles"; + SQLUpdateTblKey = "EGRESOSYSID"; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "EGRESADA" }); + break; + case "factura_egresoglobal": + SQLUpdateTbl = "EgresosGlobales"; + SQLUpdateTblKey = "id_EgresoG"; + SQLUpdate.Add(new SQLCol { SQLNom = "Comprobante_Estatus", SQLStr = "EGRESADA" }); + break; + case "notacredito": + SQLUpdateTbl = "NotasCredito"; + SQLUpdateTblKey = "NOTASYSID"; + SQLUpdate.Add(new SQLCol { SQLNom = "CERTIFICADA", SQLStr = "TIMBRADA" }); + break; + case "pago": + SQLUpdateTbl = "Pagos"; + SQLUpdateTblKey = "SYSID"; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADO" }); + break; + } + } + if (ComprobanteDBAplicacion.ToLower() == "servicemanager") + { + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + SQLUpdateTbl = "Anticipos"; + SQLUpdateTblKey = "SYSID"; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADO" }); + break; + case "anticipo_egreso": + SQLUpdateTbl = "Anticipos_Egresos_Detalles"; + SQLUpdateTblKey = "ANTICIPOSYSID"; + + + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "EGRESADO" }); + break; + case "traslado": + SQLUpdateTbl = "factfactura"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdate.Add(new SQLCol { SQLNom = "TRASLADO_ESTATUS", SQLStr = "TIMBRADA" }); + break; + case "factura": + SQLUpdateTbl = "factfactura"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADA" }); + break; + case "factura_egreso": + SQLUpdateTbl = "Facturas_Egresos_Detalles"; + SQLUpdateTblKey = "EGRESOSYSID"; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "EGRESADA" }); + break; + case "notacredito": + SQLUpdateTbl = "notcredito"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADA" }); + break; + case "pago": + SQLUpdateTbl = "factpagos"; + SQLUpdateTblKey = "NUMERO"; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTADO", SQLStr = "TIMBRADO" }); + break; + case "retencion": + SQLUpdateTbl = "factfactura"; + SQLUpdateTblKey = "CONSECUTIVO"; + SQLUpdate.Add(new SQLCol { SQLNom = "RETENCION_ESTADO", SQLStr = "TIMBRADO" }); + break; + } + } + + + if ( new[] { "timbrar", "retencion" }.Contains(ComprobanteDBOperacion.ToLower()) ) + { + + + + string stri = AddTimbreV2( + GeneralURL, + Complemento_TimbreFiscalDigital_UUID, + Emisor_Rfc, Complemento_TimbreFiscalDigital_RfcProvCertif, + Complemento_TimbreFiscalDigital_FechaTimbrado, + Comprobante_Folio, + Comprobante_Serie, ComprobanteDBTipoComprobante.ToLower(), + CFDIMod, + DRF_Token, + out string exception); + + + + + } + + //query actualizar + sql_update(); + } + #endregion timbre_sql + + //generar codigo qr + #region cfdi33 codigoqr + public void cfdi33_codigoqr() + { + sys_estatus("Generando QR..."); + + string strUrl = ComprobanteDBTipoComprobante.ToLower() == "retencion" ? "https://prodretencionverificacion.clouda.sat.gob.mx/" : "https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx"; + string strArchivo = string.Empty; + sys_mkdir(ComprobanteDBRutaSalida + @"\ImgBarCode"); + sys_mkdir(ComprobanteDBRutaSalida + @"\ImgBarCode\" + ComprobanteDBTipoComprobante); + strArchivo = ComprobanteDBRutaSalida + @"\ImgBarCode\" + ComprobanteDBTipoComprobante + @"\" + Comprobante_Serie + Comprobante_Folio + ".jpg"; + sys_arc(strArchivo); + try + { + string qr_url = strUrl + "?id=" + Complemento_TimbreFiscalDigital_UUID + "&re=" + Emisor_Rfc + "&rr=" + Receptor_Rfc + "&tt=" + Comprobante_Total + "&fe=" + Comprobante_Sello.Substring(Comprobante_Sello.Length - 8, 8); + var qrEncoder = new QrEncoder(ErrorCorrectionLevel.H); + var qrCode = qrEncoder.Encode(qr_url); + var renderer = new GraphicsRenderer(new FixedModuleSize(5, QuietZoneModules.Two), Brushes.Black, Brushes.White); + using (var stream = new FileStream(strArchivo, FileMode.Create)) + renderer.WriteToStream(qrCode.Matrix, ImageFormat.Jpeg, stream); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al generar el código QR."); + exe_err(Ex, "Gen_QR"); + } + } + #endregion cfdi33 codigoqr + + //error peticion + #region error peticion + public void error_peticion(string strOpe, string strRes) + { + string strDir = SysDir + "pet_err\\"; + string strArc = "pet_" + strOpe + "_" + DateTime.Today.ToString("yyyyMMdd") + "_" + DateTime.Now.ToString("HHmmss") + ".log"; + sys_mkdir(SysDir + @"pet_err"); + System.IO.File.WriteAllText(strDir + strArc, CFDIPet + "\n" + strRes); + enviar_error(strDir, strArc); + } + #endregion error peticion + + //edicom exepcion + #region edicom excepcion + public bool edicom_excepcion(WebException ex, string strMen) + { + bool bolRes = false; + try + { + bool bolExe = false; + string responseText; + string strPACCod = string.Empty; + string strPACTex = string.Empty; + var responseStream = ex.Response?.GetResponseStream(); + //MessageBox.Show(responseStream.ToString()); + if (responseStream != null) + { + using (var reader = new StreamReader(responseStream)) + { + string strXmlErr = SysTem + Comprobante_Serie + Comprobante_Folio + "_error.xml"; + responseText = reader.ReadToEnd(); + sys_arc(strXmlErr); + System.IO.File.WriteAllText(strXmlErr, responseText); + + XmlDocument xDoc = new XmlDocument(); + xDoc.Load(strXmlErr); + XmlNodeList details = xDoc.GetElementsByTagName("detail"); + XmlNodeList lista = ((XmlElement)details[0]).GetElementsByTagName("ns1:fault"); + foreach (XmlElement nodo in lista) + { + int i = 0; + XmlNodeList nCod = nodo.GetElementsByTagName("ns1:cod"); + XmlNodeList nText = nodo.GetElementsByTagName("ns1:text"); + string strErr = nText[i].InnerText; + + if (strErr == "Error al cancelar (205 - uuid no existe)" && strMen == "Cancelar" && CFDIMod == "Prueba") + { + string strAct = MessageBox.Show("Los comprobantes en modo pruebas no existen en el PAC.\nError al cancelar (205 - uuid no existe)\n¿Desea cambiar el estatus a Cancelado?", SysNombre, MessageBoxButtons.YesNo, MessageBoxIcon.Information).ToString().ToLower(); + if (strAct == "yes") + { + bolRes = true; + } + } + if (strErr == "No se ha podido obtener la clave privada del usuario para firmar la cancelación\r\nError en el formato del pfx" && strMen == "Cancelar") + { + sys_mensaje_error("La contraseña especificada para el archivo PFX es incorrecta.", 1); + } + //if (strErr== "Error al cancelar (305 - La fecha de emisión no esta dentro de la vigencia del CSD del Emisor)" && strMen == "Cancelar") + //{ + // sys_mensaje_error("Error al cancelar (305 - La fecha de emisión no esta dentro de la vigencia del CSD del Emisor)", 1); + //} + if (!bolRes) + { + SysErrores = @"\b Respuesta del PAC \b0 \par " + strErr + @"\par " + SysErrores; + sys_proceso_error("¡Error al " + strMen + "!"); + } + bolExe = true; + i++; + } + sys_arc(strXmlErr); + } + } + + if (!bolExe) + { + sys_proceso_error("El PAC no regreso un código de error"); + } + } + catch + { + //MessageBox.Show(responseStream.ToString()); + sys_proceso_error("Error al leer el código de error"); + } + return bolRes; + } + #endregion edicom excepcion + + + //edicom recuperar Status + #region edicom recuperar Status + public bool edicom_Recuperar_Status() + { + + bool bolRec = false; + + string soapResult; + //string CancelStatus; + //string IsCancelable; + //string Status; + + //CFDIPacUrl = "https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi"; + CFDIPacUrl = "https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi?wsdl"; + + XmlDocument soapEnvelopeXml = soap_Cuerpo_Recuperar_Status(); + HttpWebRequest webRequest = soap_cabeceras(CFDIPacUrl, "cfdi:getCFDiStatus"); + soap_peticion(soapEnvelopeXml, webRequest); + + if (webRequest.ContentLength > 0) + { + // begin async call to web request. + IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null); + + // varios para + asyncResult.AsyncWaitHandle.WaitOne(); + + // get the response from the completed web request. + + try + { + using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult)) + { + using (StreamReader rd = new StreamReader(webResponse.GetResponseStream())) + { + //leer resultado y crear xml + string strXmlSuc = SysTem + "R_" + Comprobante_Serie + Comprobante_Folio + "_success.xml"; + sys_arc(strXmlSuc); + soapResult = rd.ReadToEnd(); + System.IO.File.WriteAllText(strXmlSuc, soapResult); + + //leer xml + XmlDocument xDoc = new XmlDocument(); + xDoc.Load(strXmlSuc); + XmlNodeList lista = xDoc.GetElementsByTagName("getCFDiStatusReturn"); + string strTimbre64 = string.Empty; + int i = 0; + foreach (XmlElement nodo in lista) + { + XmlNodeList _cancelStatus = nodo.GetElementsByTagName("cancelStatus"); + CancelStatus = _cancelStatus[i].InnerText != string.Empty ? _cancelStatus[i].InnerText : "NA"; + + XmlNodeList _isCancelable = nodo.GetElementsByTagName("isCancelable"); + IsCancelable = _isCancelable[i].InnerText != string.Empty ? _isCancelable[i].InnerText : "NA"; + + XmlNodeList _status = nodo.GetElementsByTagName("status"); + Status = _status[i].InnerText != string.Empty ? _status[i].InnerText : "NA"; + + + SQLUpdate.Add(new SQLCol { SQLNom = "CANCELSTATUS_CFDI33", SQLStr = CancelStatus }); + SQLUpdate.Add(new SQLCol { SQLNom = "ISCANCELABLE_CFDI33", SQLStr = IsCancelable }); + //MessageBox.Show("STATUS RAW 1 : " + Status + "|"); + //MessageBox.Show("STATUS RAW IsCancelable : " + IsCancelable + "|"); + //MessageBox.Show("STATUS RAW CancelStatus : " + CancelStatus + "|"); + + if (Status.ToLower() == "vigente") + { + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 anticipo cancelar + + //SQLUpdateTbl = "Anticipos"; + //SQLUpdateTblKey = "SYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADO" }); + #endregion cg2 anticipo cancelar + } + else //BMS + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADO" }); + } + break; + case "anticipo_egreso": + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 anticipo egreso cancelar + + //SQLUpdateTbl = "Anticipos_Egresos_Detalles"; + //SQLUpdateTblKey = "ANTICIPOSYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADO" }); + + #endregion cg2 anticipo egreso cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADO" }); + } + break; + case "factura": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 factura cancelar + + //SQLUpdateTbl = "Facturas"; + //SQLUpdateTblKey = "CUENTAGASTOS"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUSCERTELEC", SQLStr = "TIMBRADA" }); + + #endregion cg2 factura cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADA" }); + } + break; + case "factura_egreso": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 factura cancelar + + //SQLUpdateTbl = "Facturas_Egresos_Detalles"; + //SQLUpdateTblKey = "EGRESOSYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADA" }); + + #endregion cg2 factura cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADA" }); + } + + break; + case "notacredito": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 notacredito cancelar + //SQLUpdateTbl = "NotasCredito"; + //SQLUpdateTblKey = "NOTASYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "CERTIFICADA", SQLStr = "TIMBRADA" }); + #endregion cg2 notacredito cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADA" }); + } + break; + case "pago": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + //SQLUpdateTbl = "Pagos"; + //SQLUpdateTblKey = "SYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "TIMBRADO" }); + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTADO", SQLStr = "TIMBRADO" }); + + } + break; + default: + SysQueryEncabezado = string.Empty; + break; + } + } + else if (Status.ToLower() == "cancelado") + { + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 anticipo cancelar + + //SQLUpdateTbl = "Anticipos"; + //SQLUpdateTblKey = "SYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + #endregion cg2 anticipo cancelar + } + else //BMS + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + } + break; + case "anticipo_egreso": + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 anticipo egreso cancelar + + //SQLUpdateTbl = "Anticipos_Egresos_Detalles"; + //SQLUpdateTblKey = "ANTICIPOSYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + + #endregion cg2 anticipo egreso cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + } + break; + case "factura": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 factura cancelar + + //SQLUpdateTbl = "Facturas"; + //SQLUpdateTblKey = "CUENTAGASTOS"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUSCERTELEC", SQLStr = "CANCELADA" }); + + #endregion cg2 factura cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADA" }); + } + break; + case "factura_egreso": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 factura cancelar + + //SQLUpdateTbl = "Facturas_Egresos_Detalles"; + //SQLUpdateTblKey = "EGRESOSYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADA" }); + + #endregion cg2 factura cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADA" }); + } + + break; + case "notacredito": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 notacredito cancelar + //SQLUpdateTbl = "NotasCredito"; + //SQLUpdateTblKey = "NOTASYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "CERTIFICADA", SQLStr = "CANCELADA" }); + #endregion cg2 notacredito cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADA" }); + } + break; + case "pago": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTADO", SQLStr = "CANCELADO" }); + + } + break; + default: + SysQueryEncabezado = string.Empty; + break; + } + } + else if (Status.ToLower() != "no encontrado" || Status.ToLower() != "cancelado" || Status.ToLower() != "vigente") + { + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 anticipo cancelar + + //SQLUpdateTbl = "Anticipos"; + //SQLUpdateTblKey = "SYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Status.ToUpper() }); + #endregion cg2 anticipo cancelar + } + else //BMS + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Status.ToUpper() }); + } + break; + case "anticipo_egreso": + + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 anticipo egreso cancelar + + //SQLUpdateTbl = "Anticipos_Egresos_Detalles"; + //SQLUpdateTblKey = "ANTICIPOSYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Status.ToUpper() }); + + #endregion cg2 anticipo egreso cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Status.ToUpper() }); + } + break; + case "factura": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 factura cancelar + + //SQLUpdateTbl = "Facturas"; + //SQLUpdateTblKey = "CUENTAGASTOS"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUSCERTELEC", SQLStr = Status.ToUpper() }); + + #endregion cg2 factura cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Status.ToUpper() }); + } + break; + case "factura_egreso": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 factura cancelar + + //SQLUpdateTbl = "Facturas_Egresos_Detalles"; + //SQLUpdateTblKey = "EGRESOSYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Status.ToUpper() }); + + #endregion cg2 factura cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Status.ToUpper() }); + } + + break; + case "notacredito": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + #region cg2 notacredito cancelar + //SQLUpdateTbl = "NotasCredito"; + //SQLUpdateTblKey = "NOTASYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "CERTIFICADA", SQLStr = Status.ToUpper() }); + #endregion cg2 notacredito cancelar + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Status.ToUpper() }); + } + break; + case "pago": + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + //SQLUpdateTbl = "Pagos"; + //SQLUpdateTblKey = "SYSID"; + //SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = Status.ToUpper() }); + } + else + { + SQLUpdate.Add(new SQLCol { SQLNom = "ESTADO", SQLStr = Status.ToUpper() }); + + } + break; + default: + SysQueryEncabezado = string.Empty; + break; + } + } + + + + + bolRec = Status.ToUpper() != "NA" ? true : false; + + + if (Status.ToLower() != "no encontrado") + { + if (Status.ToLower() == "cancelado")//&& (Comprobante_Estatus.ToLower() == "cancelado" || Comprobante_Estatus.ToLower() == "cancelada")) + { + + sql_update(); + sys_proceso_fin("!El Comprobante se encuentra cancelado!", 1); + + cfdi33_constructor(); + } + //else if (Status.ToLower() != "cancelado" )//&& (Comprobante_Estatus.ToLower() == "timbrado" || Comprobante_Estatus.ToLower() == "timbrada")) + //{ + // //MessageBox.Show("El comprobante tiene un estatus de "+ Status.ToUpper()+@"desea cambiar el estatus? "); + // if (IsCancelable.ToUpper() !="NA" && CancelStatus.ToUpper() !="NA") + // { + // string strAct = MessageBox.Show("El comprobante tiene estatus adicionales!\nCancelable:" + IsCancelable.ToUpper() + "\nEstatus de cancelación" + CancelStatus.ToUpper() + "\nEstatus: " + Status.ToLower() + " desea cambiar los nuevos estatus? ", SysNombre, MessageBoxButtons.YesNo, MessageBoxIcon.Information).ToString().ToLower(); + // if (strAct == "yes") + // { + // sys_estatus("Cambiando Estatus..."); + + // sql_update(); + // sys_proceso_fin("!Estatus adicionales ingresados correctamente !", 1); + + // //limpiar datos + // cfdi33_constructor(); + // } + // else + // { + + // sys_proceso_fin("!El Comprobante se encuentra!\nCancelable: " + IsCancelable.ToUpper() + "\nEstatus de cancelación: " + CancelStatus.ToUpper()+"\nEstatus: "+Status.ToLower(), 1); + // cfdi33_constructor(); + // } + // } + // else + // { + // sys_estatus("Cambiando Estatus..."); + // sql_update(); + // sys_proceso_fin("!El Comprobante se encuentra!\nCancelable: " + IsCancelable.ToUpper() + "\nEstatus de cancelación: " + CancelStatus.ToUpper() + "\nEstatus: " + Status.ToLower(), 1); + // cfdi33_constructor(); + // } + //} + else//else if (Status.ToLower() == "cancelado" && (Comprobante_Estatus.ToLower() == "timbrado" || Comprobante_Estatus.ToLower() == "timbrada")) + { + sys_estatus("Cambiando Estatus..."); + sql_update(); + sys_proceso_fin("!El Comprobante se encuentra!\nCancelable: " + IsCancelable.ToUpper() + "\nEstatus de cancelación: " + CancelStatus.ToUpper() + "\nEstatus: " + Status.ToUpper(), 1); + //sys_proceso_fin("!Estatus adicionales ingresados correctamente !", 1); + //limpiar datos + cfdi33_constructor(); + } + + } + else + { + if (ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + SQLUpdate.RemoveAt(2); + //imprimir lista + //foreach (SQLCol s in SQLUpdate) + //{ + //SQLUpdate.RemoveAt(2); + //MessageBox.Show(s.SQLNom + "\n" + s.SQLDob + "\n" + s.SQLStr + "\n" + s.SQLFun); + //} + + if (CancelStatus.ToLower() == "plazo vencido")//|| CancelStatus.ToLower() == "cancelable sin aceptacion") + { + sys_estatus("Cambiando Estatus..."); + switch (ComprobanteDBTipoComprobante.ToLower()) + { + case "anticipo": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + break; + case "anticipo_egreso": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + break; + case "factura": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUSCERTELEC", SQLStr = "CANCELADA" }); + break; + case "factura_egreso": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADA" }); + break; + case "notacredito": + SQLUpdate.Add(new SQLCol { SQLNom = "CERTIFICADA", SQLStr = "CANCELADA" }); + break; + case "pago": + SQLUpdate.Add(new SQLCol { SQLNom = "ESTATUS", SQLStr = "CANCELADO" }); + break; + default: + SysQueryEncabezado = string.Empty; + break; + } + sql_update(); + sys_proceso_fin("!El Comprobante se encuentra!\nCancelable: " + IsCancelable.ToUpper() + "\nEstatus de cancelación: " + CancelStatus.ToUpper() + "\nEstatus: CANCELADO", 1); + sys_proceso_fin("!Estatus adicionales ingresados correctamente !", 1); + //limpiar datos + cfdi33_constructor(); + + } + else + { + MessageBox.Show("Line: 10956\n!El Comprobante se encuentra!\nCancelable: " + IsCancelable.ToUpper() + "\nEstatus de cancelación: " + CancelStatus.ToUpper() + "\nEstatus: " + Status.ToUpper()); + sys_proceso_fin(SysErrores, 1); + cfdi33_constructor(); + } + } + + SysErrores = "El comprobante no se encuentra en la base de datos del SAT,verifique el Folio mas tarde : \n" + Comprobante_Folio; + if (!string.IsNullOrEmpty(SysErrores)) + { + //sys_proceso_error + sys_proceso_fin(SysErrores, 1); + cfdi33_constructor(); + } + + + } + + i++; + } + + sys_arc(strXmlSuc); + if (!bolRec) + { + sys_mensaje_error("Error al leer la petición de Status.", 1); + } + } + } + + if (!bolRec) + { + sys_mensaje_error("Error al leer la petición de Status.", 1); + } + } + catch (WebException ex) + { + edicom_excepcion(ex, "Status"); + } + } + return bolRec; + } + #endregion edicom recuperar Status + + //edicom soap cuerpo Recuperar Status + #region soap cuerpo Recuperar Status + private XmlDocument soap_Cuerpo_Recuperar_Status() + { + XmlDocument soapEnvelopeDocument = new XmlDocument(); + try + { + string modo; + modo = CFDIMod == "Prueba" ? "true" : "false"; + + CFDIPet = @" + + + + " + CFDIPacUsr + @" + " + CFDIPacPwd + @" + " + WebUtility.HtmlEncode(Emisor_Rfc) + @" + " + WebUtility.HtmlEncode(Receptor_Rfc) + @" + " + Complemento_TimbreFiscalDigital_UUID + @" + " + Comprobante_Total + @" + " + modo + @" + + + "; + soapEnvelopeDocument.LoadXml(CFDIPet); + } + catch (Exception Ex) + { + + sys_mensaje_error("Error al generar petición de Status.", 1); + exe_err(Ex, "Pet_Status"); + } + + return soapEnvelopeDocument; + } + #endregion soap cuerpo Recuperar Status + + //edicom cancelar Nvo + #region edicom cancelar Nvo + public bool edicom_cancelar_Nvo(bool bolRet = false) + { + bool bolCan = false; + string strFir = string.Empty; + cfdi33_xml_nombre(); + sys_estatus("Cancelando Comprobante"); + CFDIPacUrl = "https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi?wsdl"; + + CFDIPacFun = "cfdi:cancelCFDiAsync"; + CFDIPacRes = "cancelCFDiAsync"; + + XmlDocument soapEnvelopeXml = soap_cuerpo_cancelar_nvo(); + //XmlDocument soapEnvelopeXml = soap_cuerpo_cancelar(); + HttpWebRequest webRequest = soap_cabeceras(CFDIPacUrl, CFDIPacFun); + soap_peticion(soapEnvelopeXml, webRequest); + + string strResulado = string.Empty; + if (webRequest.ContentLength > 0) + { + IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null); + asyncResult.AsyncWaitHandle.WaitOne(); + + string soapResult; + try + { + WebResponse webResponse = webRequest.EndGetResponse(asyncResult); + if (webResponse != null) + { + StreamReader rd = new StreamReader(webResponse.GetResponseStream()); + if (rd != null) + { + string strResXML = SysTem + "C_" + Comprobante_Serie + Comprobante_Folio + "_response.xml"; + string strResUUID = SysTem + "C_" + Comprobante_Serie + Comprobante_Folio + "_uuids.xml"; + sys_estatus("Recibiendo Respuesta..."); + //leer resultado y crear xml + soapResult = rd.ReadToEnd(); + strResulado = soapResult; + sys_arc(strResXML); + System.IO.File.WriteAllText(strResXML, soapResult); + + //leer xml + int i = 0; + + //Variables de Nodo CancelQueryData + //string cancelStatus; + //string isCancelable; + string status; + string statusCode; + + string Status_Return; + string StatusCode_Return; + XmlDocument xDoc = new XmlDocument(); + xDoc.Load(strResXML); + XmlNodeList lista = xDoc.GetElementsByTagName(CFDIPacRes + "Return"); + foreach (XmlElement nodo in lista) + { + XmlNodeList ack = nodo.GetElementsByTagName("ack"); + + XmlNodeList cancelQUery = nodo.GetElementsByTagName("cancelQueryData"); + foreach (XmlElement CanQueryData in cancelQUery) + { + XmlNodeList CQ_canStatus = CanQueryData.GetElementsByTagName("cancelStatus"); + CancelStatus = CQ_canStatus[i].InnerText != string.Empty ? CQ_canStatus[i].InnerText : "NA"; + + + XmlNodeList CQ_isCancela = CanQueryData.GetElementsByTagName("isCancelable"); + IsCancelable = CQ_isCancela[i].InnerText != string.Empty ? CQ_isCancela[i].InnerText : "NA"; + + + XmlNodeList CQ_status = CanQueryData.GetElementsByTagName("status"); + status = CQ_status[i].InnerText != string.Empty ? CQ_status[i].InnerText : "NA"; + + XmlNodeList CQ_ststusCode = CanQueryData.GetElementsByTagName("statusCode"); + statusCode = CQ_ststusCode[i].InnerText != string.Empty ? CQ_ststusCode[i].InnerText : "NA"; + + //strSis = ComprobanteDBAplicacion.ToLower() + + SQLUpdate.Add(new SQLCol { SQLNom = "ISCANCELABLE_CFDI33", SQLStr = IsCancelable }); + SQLUpdate.Add(new SQLCol { SQLNom = "CANCELSTATUS_CFDI33", SQLStr = CancelStatus }); + + + + } + + XmlNodeList status_return = nodo.GetElementsByTagName("status"); + Status_Return = status_return[i].InnerText != string.Empty ? status_return[i].InnerText : "NA"; + + XmlNodeList statusCode_return = nodo.GetElementsByTagName("statusCode"); + StatusCode_Return = statusCode_return[i].InnerText != string.Empty ? statusCode_return[i].InnerText : "NA"; + + + + byte[] plain = Convert.FromBase64String(ack[i].InnerText); + sys_arc(strResUUID); + File.WriteAllBytes(strResUUID, plain); + strResulado = "\n" + File.ReadAllText(strResUUID); + i++; + } + sys_arc(strResXML); + string strEstatusUUID = string.Empty; + bool bolResVal = false; + int j = 0; + XmlDocument xDoc1 = new XmlDocument(); + xDoc1.Load(strResUUID); + string strRes = !bolRet ? "CancelaCFDResult" : "Acuse"; + XmlNodeList lista1 = xDoc1.GetElementsByTagName(strRes); + foreach (XmlElement nodo1 in lista1) + { + XmlNodeList UUID = nodo1.GetElementsByTagName("UUID"); + XmlNodeList EstatusUUID = nodo1.GetElementsByTagName("EstatusUUID"); + XmlNodeList Signature = nodo1.GetElementsByTagName("Signature"); + strEstatusUUID = EstatusUUID[j].InnerText.ToString(); + if (strEstatusUUID == "201" || strEstatusUUID == "1201") + { + bolCan = true; + strFir = Signature[j].InnerXml; + } + if (strEstatusUUID == "202" || strEstatusUUID == "1202") + { + bolResVal = true; + string strAct = MessageBox.Show("El comprobante ya fue cancelado.\n¿Desea cambiar el estatus a Cancelado?", SysNombre, MessageBoxButtons.YesNo, MessageBoxIcon.Information).ToString().ToLower(); + if (strAct == "yes") + { + bolCan = true; + strFir = Signature[j].InnerXml; + } + else + { + sys_proceso_error("No acepto cambiar el estatus."); + } + } + j++; + } + sys_arc(strResUUID); + if (!bolCan && !bolResVal) + { + sys_proceso_error("El código " + strEstatusUUID + " no es valido"); + error_peticion("val_can", strResulado); + } + } + else + { + sys_proceso_error("Error al leer la respuesta."); + } + } + else + { + sys_proceso_error("El PAC no genero una respuesta."); + } + } + catch (WebException ex) + { + bolCan = edicom_excepcion(ex, "Cancelar"); + } + + if (bolCan) + { + strFir = string.IsNullOrEmpty(strFir) ? "El UUID " + Complemento_TimbreFiscalDigital_UUID + " no es valido" : strFir; + sys_estatus("Cambiando Estatus..."); + + //solo SM Clientes con carta porte + if (CartaPorte && Sin_CP != "SIN_CP") + { + SQL_Update_Historico(); + } + + sql_update(); + + + + if (CFDIPac == "EdiCom" ) + { + string stri = send_timbre_cancela(GeneralURL, PAW , + Complemento_TimbreFiscalDigital_UUID, + DRF_Token, + CFDIRfc, + Complemento_TimbreFiscalDigital_RfcProvCertif, + Comprobante_Folio, Comprobante_Fecha, out string lex); + } + + sys_arc(ComprobanteDBArchivoTimbrado); + System.IO.File.WriteAllText(ComprobanteDBArchivoTimbrado, strFir); + + if (Comprobante_Total >= 5000 && ComprobanteDBAplicacion.ToLower() == "cuentagastos") + { + sys_proceso_fin("!Comprobante En espera de Respuesta!", 1); + } + else + { + sys_proceso_fin("!Comprobante Cancelado!", 1); + } + + //limpiar datos + cfdi33_constructor(); + } + } + return bolCan; + } + #endregion edicom cancelar Nvo + + //edicom cancelar + #region edicom cancelar + public bool edicom_cancelar(bool bolRet = false) + { + bool bolCan = false; + string strFir = string.Empty; + cfdi33_xml_nombre(); + sys_estatus("Cancelando Comprobante..."); + //CFDIPacUrl = "https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi"; + CFDIPacUrl = "https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi?wsdl"; + + CFDIPacFun = !bolRet ? "cfdi:cancelaCFDi" : "cfdi:cancelaCFDiRetenciones"; + CFDIPacRes = !bolRet ? "cancelaCFDi" : "cancelaCFDiRetenciones"; + + XmlDocument soapEnvelopeXml = soap_cuerpo_cancelar(); + HttpWebRequest webRequest = soap_cabeceras(CFDIPacUrl, CFDIPacFun); + soap_peticion(soapEnvelopeXml, webRequest); + + string strResulado = string.Empty; + if (webRequest.ContentLength > 0) + { + IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null); + asyncResult.AsyncWaitHandle.WaitOne(); + + string soapResult; + try + { + WebResponse webResponse = webRequest.EndGetResponse(asyncResult); + if (webResponse != null) + { + StreamReader rd = new StreamReader(webResponse.GetResponseStream()); + if (rd != null) + { + string strResXML = SysTem + "C_" + Comprobante_Serie + Comprobante_Folio + "_response.xml"; + string strResUUID = SysTem + "C_" + Comprobante_Serie + Comprobante_Folio + "_uuids.xml"; + sys_estatus("Recibiendo Respuesta..."); + //leer resultado y crear xml + soapResult = rd.ReadToEnd(); + strResulado = soapResult; + sys_arc(strResXML); + System.IO.File.WriteAllText(strResXML, soapResult); + + //leer xml + int i = 0; + XmlDocument xDoc = new XmlDocument(); + xDoc.Load(strResXML); + XmlNodeList lista = xDoc.GetElementsByTagName(CFDIPacRes + "Return"); + foreach (XmlElement nodo in lista) + { + XmlNodeList ack = nodo.GetElementsByTagName("ack"); + + byte[] plain = Convert.FromBase64String(ack[i].InnerText); + sys_arc(strResUUID); + File.WriteAllBytes(strResUUID, plain); + strResulado = "\n" + File.ReadAllText(strResUUID); + i++; + } + sys_arc(strResXML); + string strEstatusUUID = string.Empty; + bool bolResVal = false; + int j = 0; + XmlDocument xDoc1 = new XmlDocument(); + xDoc1.Load(strResUUID); + string strRes = !bolRet ? "CancelaCFDResult" : "Acuse"; + XmlNodeList lista1 = xDoc1.GetElementsByTagName(strRes); + foreach (XmlElement nodo1 in lista1) + { + XmlNodeList UUID = nodo1.GetElementsByTagName("UUID"); + XmlNodeList EstatusUUID = nodo1.GetElementsByTagName("EstatusUUID"); + XmlNodeList Signature = nodo1.GetElementsByTagName("Signature"); + strEstatusUUID = EstatusUUID[j].InnerText.ToString(); + if (strEstatusUUID == "201" || strEstatusUUID == "1201") + { + bolCan = true; + strFir = Signature[j].InnerXml; + } + if (strEstatusUUID == "202" || strEstatusUUID == "1202") + { + bolResVal = true; + string strAct = MessageBox.Show("El comprobante ya fue cancelado.\n¿Desea cambiar el estatus a Cancelado?", SysNombre, MessageBoxButtons.YesNo, MessageBoxIcon.Information).ToString().ToLower(); + if (strAct == "yes") + { + bolCan = true; + strFir = Signature[j].InnerXml; + } + else + { + sys_proceso_error("No acepto cambiar el estatus."); + } + } + j++; + } + sys_arc(strResUUID); + if (!bolCan && !bolResVal) + { + sys_proceso_error("El código " + strEstatusUUID + " no es valido"); + error_peticion("val_can", strResulado); + } + } + else + { + sys_proceso_error("Error al leer la respuesta."); + } + } + else + { + sys_proceso_error("El PAC no genero una respuesta."); + } + } + catch (WebException ex) + { + bolCan = edicom_excepcion(ex, "Cancelar"); + } + if (bolCan) + { + strFir = string.IsNullOrEmpty(strFir) ? "El UUID " + Complemento_TimbreFiscalDigital_UUID + " no es valido" : strFir; + sys_estatus("Cambiando Estatus..."); + sql_update(); + sys_arc(ComprobanteDBArchivoTimbrado); + System.IO.File.WriteAllText(ComprobanteDBArchivoTimbrado, strFir); + if (CFDISis == "cg2" && ComprobanteDBTipoComprobante.ToLower() == "factura") + { + SQLUpdateTbl = "Facturas"; + SQLUpdateTblKey = "CUENTAGASTOS"; + SQLUpdateTblID = ComprobanteDBSysId; + SQLUpdate.Add(new SQLCol { SQLNom = "CANCELACION_FechaYHoraTimbrado", SQLStr = "CONVERT(VARCHAR(19),GETDATE(),120)", SQLFun = true }); + } + sys_proceso_fin("!Comprobante Cancelado!", 1); + //limpiar datos + cfdi33_constructor(); + } + } + return bolCan; + } + #endregion edicom cancelar + + //edicom cancelar Nvo Esquema Cuerpo + #region Edicom Cancelar Nuevo Cuerpo + private XmlDocument soap_cuerpo_cancelar_nvo() + { + XmlDocument soapEnvelopDocument = new XmlDocument(); + try + { + string modo; + modo = CFDIMod == "Prueba" ? "true" : "false"; + + var bytes = File.ReadAllBytes(ConfigPfxRuta); + string base64 = Convert.ToBase64String(bytes); + CFDIPet = @" + + + <" + CFDIPacFun + @"> + " + CFDIPacUsr + @" + " + CFDIPacPwd + @" + " + WebUtility.HtmlEncode(Emisor_Rfc) + @" + " + WebUtility.HtmlEncode(Receptor_Rfc) + @" + " + Complemento_TimbreFiscalDigital_UUID + @" + " + Comprobante_Total + @" + " + base64 + @" + " + ConfigPfxClave + @" + " + Comprobante_Motivo_Cancela + @" + " + comprobante_Folio_Cancela + @" + " + modo + @" + + + "; + soapEnvelopDocument.LoadXml(CFDIPet); + } + catch (Exception Ex) + { + + sys_mensaje_error("Error al generar la petición de cancelación del Nuevo esquema.", 1); + exe_err(Ex, "Pet_Can_Nvo"); + } + return soapEnvelopDocument; + } + #endregion Edicom Cancelar Nuevo Cuerpo + + //edicom cancelar cuerpo + #region edicom cancelar cuerpo + private XmlDocument soap_cuerpo_cancelar() + { + XmlDocument soapEnvelopeDocument = new XmlDocument(); + try + { + var bytes = File.ReadAllBytes(ConfigPfxRuta); + string base64 = Convert.ToBase64String(bytes); + CFDIPet = @" + + + <" + CFDIPacFun + @"> + " + CFDIPacUsr + @" + " + CFDIPacPwd + @" + " + WebUtility.HtmlEncode(Emisor_Rfc) + @" + + " + Complemento_TimbreFiscalDigital_UUID + @" + " + base64 + @" + " + ConfigPfxClave + @" + + + "; + soapEnvelopeDocument.LoadXml(CFDIPet); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al generar la petición de cancelación.", 1); + exe_err(Ex, "Pet_Can"); + } + return soapEnvelopeDocument; + } + #endregion edicom cancelar cuerpo + + /*** ***/ + //edicom recuperar + #region edicom recuperar + public bool edicom_recuperar() + { + + bool bolRec = false; + //CFDIPacUrl = "https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi"; + CFDIPacUrl = "https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi?wsdl"; + + XmlDocument soapEnvelopeXml = soap_cuerpo_recuperar(); + HttpWebRequest webRequest = soap_cabeceras(CFDIPacUrl, "cfdi:getCfdiFromUUID"); + soap_peticion(soapEnvelopeXml, webRequest); + + if (webRequest.ContentLength > 0) + { + // begin async call to web request. + IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null); + + // varios para + asyncResult.AsyncWaitHandle.WaitOne(); + + // get the response from the completed web request. + string soapResult; + try + { + using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult)) + { + using (StreamReader rd = new StreamReader(webResponse.GetResponseStream())) + { + //leer resultado y crear xml + string strXmlSuc = SysTem + "R_" + Comprobante_Serie + Comprobante_Folio + "_success.xml"; + string strZipSuc = SysTem + "R_" + Comprobante_Serie + Comprobante_Folio + "_success.zip"; + string strTim = SysTem + Complemento_TimbreFiscalDigital_UUID + ".xml"; + sys_arc(strXmlSuc); + sys_arc(strZipSuc); + sys_arc(strTim); + soapResult = rd.ReadToEnd(); + System.IO.File.WriteAllText(strXmlSuc, soapResult); + + //leer xml + XmlDocument xDoc = new XmlDocument(); + xDoc.Load(strXmlSuc); + XmlNodeList lista = xDoc.GetElementsByTagName("getCfdiFromUUIDReturn"); + string strTimbre64 = string.Empty; + foreach (XmlElement nodo in lista) + { + byte[] plain = Convert.FromBase64String(nodo.InnerText.Trim()); + System.IO.File.WriteAllBytes(strZipSuc, plain); + } + sys_arc(strXmlSuc); + try + { + ZipFile zip = ZipFile.Read(strZipSuc); + foreach (ZipEntry e in zip) + { + if (e.FileName == Complemento_TimbreFiscalDigital_UUID + "_.xml") + { + e.Extract(SysTem, ExtractExistingFileAction.OverwriteSilently); + } + } + zip.Dispose(); + sys_arc(strZipSuc); + sys_arc(ComprobanteDBArchivoTimbrado); + + if (File.Exists(SysTem + Complemento_TimbreFiscalDigital_UUID + "_.xml")) + { + //se escribe el archivo para que no se marque como bloqueado. + string strArcTim = File.ReadAllText(SysTem + Complemento_TimbreFiscalDigital_UUID + "_.xml"); + string strArc = ComprobanteDBTipoComprobante == "pago" || ComprobanteDBTipoComprobante == "factura" ? strArcTim : strArcTim.Substring(0, strArcTim.IndexOf("")) + ""; + + sys_arc(SysTem + Complemento_TimbreFiscalDigital_UUID + "_.xml"); + File.WriteAllText(ComprobanteDBArchivoTimbrado, strArcTim); + + File.WriteAllText(ComprobanteDBArchivo, strArc); + + try + { + //leer datos del timbre + XmlDocument xdTim = new XmlDocument(); + xdTim.Load(ComprobanteDBArchivoTimbrado); + XmlNodeList elemList = xdTim.GetElementsByTagName("tfd:TimbreFiscalDigital"); + foreach (XmlNode item in elemList) + { + foreach (XmlAttribute att in item.Attributes) + { + switch (att.Name) + { + case "Version": + Complemento_TimbreFiscalDigital_Version = att.Value; + break; + case "UUID": + Complemento_TimbreFiscalDigital_UUID = att.Value; + break; + case "FechaTimbrado": + Complemento_TimbreFiscalDigital_FechaTimbrado = att.Value; + break; + case "RfcProvCertif": + Complemento_TimbreFiscalDigital_RfcProvCertif = att.Value; + break; + case "SelloCFD": + Complemento_TimbreFiscalDigital_SelloCFD = att.Value; + break; + case "NoCertificadoSAT": + Complemento_TimbreFiscalDigital_NoCertificadoSAT = att.Value; + break; + case "SelloSAT": + Complemento_TimbreFiscalDigital_SelloSAT = att.Value; + break; + } + } + } + + //crear archivo para xml con timbre + XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; + XNamespace tfd = "http://www.sat.gob.mx/TimbreFiscalDigital"; + //else if (ComprobanteDBTipoComprobante.ToLower() == "pago") + //{ + // schemaLocation = "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd http://www.sat.gob.mx/Pagos http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos10.xsd"; + //} + string schemaLocation = "http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd"; + XElement TimbreFiscalDigital = new XElement(tfd + "TimbreFiscalDigital"); + + TimbreFiscalDigital.Add(new XAttribute("FechaTimbrado", Complemento_TimbreFiscalDigital_FechaTimbrado)); + TimbreFiscalDigital.Add(new XAttribute("NoCertificadoSAT", Complemento_TimbreFiscalDigital_NoCertificadoSAT)); + TimbreFiscalDigital.Add(new XAttribute("RfcProvCertif", Complemento_TimbreFiscalDigital_RfcProvCertif)); + TimbreFiscalDigital.Add(new XAttribute("SelloCFD", Complemento_TimbreFiscalDigital_SelloCFD)); + TimbreFiscalDigital.Add(new XAttribute("SelloSAT", Complemento_TimbreFiscalDigital_SelloSAT)); + TimbreFiscalDigital.Add(new XAttribute("UUID", Complemento_TimbreFiscalDigital_UUID)); + TimbreFiscalDigital.Add(new XAttribute("Version", "1.1")); + TimbreFiscalDigital.Add(new XAttribute(XNamespace.Xmlns + "tfd", tfd)); + TimbreFiscalDigital.Add(new XAttribute(XNamespace.Xmlns + "xsi", xsi)); + TimbreFiscalDigital.Add(new XAttribute(xsi + "schemaLocation", schemaLocation)); + + File.WriteAllText(SysTem + "tfd.xml", TimbreFiscalDigital.ToString()); + + //calcular cadena sat en base a transformacion de archivo con timbre + string strXlst = bolRet ? "cadenaoriginal_TFD_1_0.xslt" : "cadenaoriginal_TFD_1_1.xslt"; + StreamReader reader = new StreamReader(SysTem + "tfd.xml"); + XPathDocument myXPathDoc = new XPathDocument(reader); + + XslCompiledTransform myXslTrans = new XslCompiledTransform(); + myXslTrans.Load(SysDir + @"sat\" + strXlst); + + StringWriter str = new StringWriter(); + XmlTextWriter myWriter = new XmlTextWriter(str); + + myXslTrans.Transform(myXPathDoc, null, myWriter); + Complemento_TimbreFiscalDigital_CadenaOriginalSAT = WebUtility.HtmlDecode(str.ToString()); + Comprobante_CadenaOriginal = cfdi33_cadena_original(); + sys_arc(SysTem + "tfd.xml"); + timbre_sql(); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al leer datos del Timbre, recuperar.", 1); + exe_err(Ex, "Lee_Xml_Tim"); + } + + if (ComprobanteDBTipoComprobante.ToLower() == "factura" && ComprobanteDBAplicacion.ToLower() == "cuentagastos" && ComprobanteDBOperacion.ToLower() == "recuperar") + { + sys_proceso_fin("!Comprobante Recuperado!", 1, "\nEn la ruta:\n" + ComprobanteDBRutaSalida + '\\' + Comprobante_NomenclaturaCNE); + } + else + { + sys_proceso_fin("!Comprobante Recuperado!", 1, "\nEn la ruta:\n" + ComprobanteDBArchivoTimbrado); + } + //limpiar datos + cfdi33_constructor(); + + bolRec = true; + } + else + { + sys_mensaje_error("Ocurrio un error al recuperar el comprobante.", 1); + } + sys_arc(strXmlSuc); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al leer el ZIP del CFDI.", 1); + exe_err(Ex, "Lee_Zip_Rec"); + } + if (!bolRec) + { + sys_mensaje_error("Error al leer la petición de recuperación.", 1); + } + } + } + if (!bolRec) + { + sys_mensaje_error("Error al leer la petición de recuperación.", 1); + } + } + catch (WebException ex) + { + edicom_excepcion(ex, "Recuperar"); + } + } + return bolRec; + } + #endregion edicom recuperar + + //edicom cuerpo Recuperar + #region soap cuerpo recuperar + + private XmlDocument soap_cuerpo_recuperar() + { + XmlDocument soapEnvelopeDocument = new XmlDocument(); + try + { + CFDIPet = @" + + + + " + CFDIPacUsr + @" + " + CFDIPacPwd + @" + " + WebUtility.HtmlEncode(Emisor_Rfc) + @" + + " + Complemento_TimbreFiscalDigital_UUID + @" + + + "; + soapEnvelopeDocument.LoadXml(CFDIPet); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al generar la petición de recuperación.", 1); + exe_err(Ex, "Pet_Rec"); + } + return soapEnvelopeDocument; + } + #endregion soap cuerpo recuperar + + /*** ***/ + //edicom contador + #region edicom contador + public void edicom_contador(string strRFC, string strNom, string strMes) + { + sys_estatus("Consultando " + strRFC + "..."); + //CFDIPacUrl = "https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi"; + CFDIPacUrl = "https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi?wsdl"; + XmlDocument soapEnvelopeXml = soap_cuerpo_contador(strRFC, strMes); + HttpWebRequest webRequest = soap_cabeceras(CFDIPacUrl, "cfdi:exportCfdi"); + soap_peticion(soapEnvelopeXml, webRequest); + + if (webRequest.ContentLength > 0) + { + // begin async call to web request. + IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null); + + // varios para + asyncResult.AsyncWaitHandle.WaitOne(); + + // get the response from the completed web request. + string soapResult; + try + { + using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult)) + { + using (StreamReader rd = new StreamReader(webResponse.GetResponseStream())) + { + //leer resultado y crear xml + soapResult = rd.ReadToEnd(); + string strXmlSuc = SysTem + "C_" + strRFC + "_success.xml"; + string strXmlZip = SysTem + "C_" + strRFC + "_success.zip"; + sys_arc(strXmlSuc); + sys_arc(strXmlZip); + System.IO.File.WriteAllText(strXmlSuc, soapResult); + + //leer xml + XmlDocument xDoc = new XmlDocument(); + xDoc.Load(strXmlSuc); + XmlNodeList lista = xDoc.GetElementsByTagName("exportCfdiReturn"); + string strTimbre64 = string.Empty; + foreach (XmlElement nodo in lista) + { + + byte[] plain = Convert.FromBase64String(nodo.InnerText.Trim()); + string strDec = Encoding.UTF8.GetString(plain); + if (strDec.ToLower().IndexOf("content-type:") < 0) + { + System.IO.File.WriteAllBytes(strXmlZip, plain); + } + } + sys_arc(strXmlSuc); + int intArc = 0; + if (File.Exists(strXmlZip)) + { + try + { + string strNeg = "style='background-color:#000;color:#fff;font-weight:bold;'"; + ZipFile zip = ZipFile.Read(strXmlZip); + intArc = zip.Count; + + if (ComprobanteDBIncUUID || ComprobanteDBIncFolio) + { + int intArcCon = 0; + string strDet = intArc > 0 ? "" + strRFC + "" + strNom + "No.Folio Fiscal SAT UUIDFecha y Hora de Timbrado" : string.Empty; + strDet = ComprobanteDBIncFolio ? strDet + "Receptor RFCSerie y Folio" : strDet + ""; + foreach (ZipEntry e in zip) + { + string strUUID = string.Empty; + string strFec = string.Empty; + string strHor = string.Empty; + DateTime dtFec = DateTime.Now.Date; + string[] nombre = e.FileName.Split(new string[] { "_" }, StringSplitOptions.None); + string strRec = "N/D"; + string strCom = "N/D"; + if (ComprobanteDBIncFolio) + { + e.Extract(SysTem, ExtractExistingFileAction.OverwriteSilently); + string strArc = File.ReadAllText(SysTem + e.FileName); + int intFol = strArc.IndexOf(@" Folio="""); + intFol = intFol <= 0 ? strArc.IndexOf(@" folio=""") : intFol; + string strFol = strArc.Substring(intFol + 8); + int intFolFin = strFol.IndexOf(@""""); + strFol = strFol.Substring(0, intFolFin); + + int intSer = strArc.IndexOf(@" Serie="""); + intSer = intSer <= 0 ? strArc.IndexOf(@" serie=""") : intSer; + string strSer = intSer > 0 ? strArc.Substring(intSer + 8) : string.Empty; + if (intSer > 0) + { + int intSerFin = strSer.IndexOf(@""""); + strSer = strSer.Substring(0, intSerFin); + } + + int intRec = strArc.IndexOf(@"Receptor Rfc="""); + intRec = intRec <= 0 ? strArc.IndexOf(@"Receptor rfc=""") : intRec; + strRec = strArc.Substring(intRec + 14); + int intRecFin = strRec.IndexOf(@""""); + strRec = strRec.Substring(0, intRecFin); + strCom = strSer + strFol; + sys_arc(SysTem + e.FileName); + } + else + { + e.Extract(SysTem, ExtractExistingFileAction.OverwriteSilently); + string strArc = File.ReadAllText(SysTem + e.FileName); + int intFol = strArc.IndexOf(@" Folio="""); + intFol = intFol <= 0 ? strArc.IndexOf(@" folio=""") : intFol; + string strFol = strArc.Substring(intFol + 8); + int intFolFin = strFol.IndexOf(@""""); + strFol = strFol.Substring(0, intFolFin); + + int intSer = strArc.IndexOf(@" Serie="""); + intSer = intSer <= 0 ? strArc.IndexOf(@" serie=""") : intSer; + string strSer = intSer > 0 ? strArc.Substring(intSer + 8) : string.Empty; + if (intSer > 0) + { + int intSerFin = strSer.IndexOf(@""""); + strSer = strSer.Substring(0, intSerFin); + } + + int intRec = strArc.IndexOf(@"Receptor Rfc="""); + intRec = intRec <= 0 ? strArc.IndexOf(@"Receptor rfc=""") : intRec; + strRec = strArc.Substring(intRec + 14); + int intRecFin = strRec.IndexOf(@""""); + strRec = strRec.Substring(0, intRecFin); + strCom = strSer + strFol; + sys_arc(SysTem + e.FileName); + } + intArcCon++; + strUUID = nombre[3]; + strFec = "20" + nombre[5].Substring(0, 6); + strHor = nombre[5].Substring(6, 6); + strFec = strFec.Insert(4, "-"); + strFec = strFec.Insert(7, "-"); + strHor = strHor.Insert(2, ":"); + strHor = strHor.Insert(5, ":"); + strDet += "" + intArcCon + "" + strUUID + "" + strFec + "" + strHor + ""; + if (ComprobanteDBIncFolio) + { + strDet += "" + strRec + "" + strCom + ""; + } + } + SysRepDet += strDet + ""; + } + zip.Dispose(); + sys_arc(strXmlZip); + } + catch (Exception Ex) + { + exe_err(Ex, "Con_Tim"); + } + } + SysRepEnc += "" + strRFC + "" + strNom + "" + intArc + ""; + } + } + } + catch (WebException ex) + { + edicom_excepcion(ex, "Consultar"); + } + } + } + #endregion edicom contador + + //edicom recuperar cuerpo + #region edicom cuerpo contador + private XmlDocument soap_cuerpo_contador(string strRFC, string strMes) + { + int.TryParse(strMes, out int intMes); + XmlDocument soapEnvelopeDocument = new XmlDocument(); + try + { + int intYear = 0; + intYear = ComprobanteDBSysId; + int intMesFin = System.DateTime.DaysInMonth(intYear, intMes); + if (intMes == 0 || intYear == 0) + { + string strErr = string.Empty; + strErr = ComprobanteDBSysId == 0 ? strErr + "• Año\n" : strErr; + strErr = string.IsNullOrEmpty(ComprobanteDBTipoComprobante) ? strErr + "• Mes\n" : strErr; + sys_mensaje_error("Por favor especifique." + strErr, 1); + } + else + { + CFDIPet = @" + + + + " + CFDIPacUsr + @" + " + CFDIPacPwd + @" + " + WebUtility.HtmlEncode(strRFC) + @" + " + ComprobanteDBSysId + "-" + strMes + @"-01T00:00:00 + " + ComprobanteDBSysId + "-" + strMes + "-" + intMesFin + @"T23:59:59 + + + "; + soapEnvelopeDocument.LoadXml(CFDIPet); + } + } + catch (Exception Ex) + { + sys_mensaje_error("Error al generar la petición de timbres.", 1); + exe_err(Ex, "Pet_Tim"); + } + return soapEnvelopeDocument; + } + #endregion soap cuerpo contador + + + #region cancelar_ComercioDigital + /*---------------------------------------comercio digital*/ + public class cte_canc + { + + public static void cancelarPorUUIDconCSD(string tipo2, string usr_ws, string pwd_ws, string rfcEmisor, + string uuid, string pve, string b64Key, string b64Cert, string emailE, string emailR, + string rfcR, string total, string tipoC, string motivo, string uuidRel, string host2, + string CFDIRfc, + out int codigo, out string mensaje, out string acuse) + { + string host = "https://" + host2 + ".comercio-digital.mx"; + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + codigo = 999; mensaje = ""; acuse = ""; + + if (motivo == "") { + codigo = 500; + mensaje = "El motivo de cancelacion no puede estar vacío."; + } + if ((motivo == "02" || motivo == "03") && !string.IsNullOrEmpty(uuidRel)) + { + codigo = 123; + mensaje = "El motivo de cancelacion es " + motivo + " y este no debe llevar uuid relacionado " + uuidRel; + } + + if (usr_ws.Length < 12 || usr_ws.Length > 13) + { + codigo = 801; + mensaje = "701 Error Usuario/Password Invalido"; + } + else if (pwd_ws == "") + { + codigo = 702; + mensaje = "802 Error usuario/password invalido"; + } + else if (tipo2 != null && (tipo2 == "cfdi" || tipo2 == "reten")) + { + + string text = "\n"; + string text2 = "USER=" + usr_ws + text + "PWDW=" + pwd_ws + text + "RFCE=" + rfcEmisor + text + "UUID=" + uuid + text + "PWDK=" + pve + text + "KEYF=" + b64Key + text + "CERT=" + b64Cert + text + "TIPO1=" + tipo2 + text + "MOTIVO=" + motivo + text + "ACUS=SI" + text; + if (uuidRel != "") + { + text2 = text2 + "UUIDREL=" + uuidRel + text; + } + if (emailE != "") + { + text2 = text2 + "EMAILE=" + emailE + text; + } + if (emailR != "") + { + text2 = text2 + "EMAILR=" + emailR + text; + } + if (rfcR != "") + { + text2 = text2 + "RFCR=" + rfcR + text; + } + if (total != "") + { + text2 = text2 + "TOTAL=" + total + text; + } + if (tipoC != "") + { + text2 = text2 + "TIPOC=" + tipoC + text; + } + if (!H5.ws2(host + "/cancela4/cancelarUuid", text2, CFDIRfc, out var codigo2, out mensaje, out acuse)) + { + codigo = Apoyo.toi(codigo2); + } + else + { + codigo = 0; + } + } + else + { + codigo = 4; + mensaje = "004 tipo no es cfdi o reten"; + } + } + + } + + public class H5 + { + public static bool ws2(string url1, string txt, string CFDIRfc, out string codigo, out string errMsg, out string acuse) + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + codigo = "999"; + errMsg = ""; + acuse = ""; + Console.WriteLine(url1); + try + { + byte[] bytes = Encoding.UTF8.GetBytes(txt); + HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url1); + httpWebRequest.Method = "POST"; + httpWebRequest.ContentType = "text/plain"; + httpWebRequest.Timeout = 60000; + httpWebRequest.ContentLength = bytes.Length; + + Stream requestStream = httpWebRequest.GetRequestStream(); + requestStream.Write(bytes, 0, bytes.Length); + requestStream.Close(); + + HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + HttpStatusCode statusCode = httpWebResponse.StatusCode; + if (statusCode != HttpStatusCode.OK) + { + codigo = "998"; + errMsg = "Error HTTP " + statusCode; + return false; + } + StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream()); + acuse = streamReader.ReadToEnd(); + streamReader.Close(); + if (httpWebResponse.GetResponseHeader("codigo") == null) + { + codigo = "991"; + } + else + { + codigo = httpWebResponse.GetResponseHeader("codigo"); + } + if (httpWebResponse.GetResponseHeader("errmsg") != null) + { + errMsg = httpWebResponse.GetResponseHeader("errmsg"); + } + if (Apoyo.toi(codigo) == 0) + { + return true; + } + return false; + } + catch (Exception ex) + { + codigo = "003"; + errMsg = "Error CANC TXM " + url1 + " err=" + ex.Message; + acuse = ""; + return false; + } + } + + public static bool wsX(string host, string usr_ws, string pwd_ws, string tipo1, byte[] xml1, string emailEmisor, string emailReceptor, string rfcR, string total, string tipoC, string CFDIRfc, out string codigo, out string errMsg, out string acuse) + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + codigo = "999"; + errMsg = ""; + acuse = ""; + string text = host + "/cancela4/cancelarXml"; + Console.WriteLine(text); + try + { + HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(text); + httpWebRequest.Method = "POST"; + httpWebRequest.ContentType = "text/plain"; + httpWebRequest.Timeout = 60000; + httpWebRequest.ContentLength = xml1.Length; + httpWebRequest.Headers.Add("usrws", usr_ws); + httpWebRequest.Headers.Add("pwdws", pwd_ws); + httpWebRequest.Headers.Add("tipo", tipo1); + if (emailEmisor != "") + { + httpWebRequest.Headers.Add("emaile", emailEmisor); + } + if (emailReceptor != "") + { + httpWebRequest.Headers.Add("emailr", emailReceptor); + } + if (rfcR != "") + { + httpWebRequest.Headers.Add("rfcr", rfcR); + } + if (total != "") + { + httpWebRequest.Headers.Add("total", total); + } + if (tipoC != "") + { + httpWebRequest.Headers.Add("tipoc", tipoC); + } + Stream requestStream = httpWebRequest.GetRequestStream(); + requestStream.Write(xml1, 0, xml1.Length); + requestStream.Close(); + HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + HttpStatusCode statusCode = httpWebResponse.StatusCode; + if (statusCode != HttpStatusCode.OK) + { + codigo = "998"; + errMsg = "Error HTTP " + statusCode; + return false; + } + StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream()); + acuse = streamReader.ReadToEnd(); + streamReader.Close(); + if (httpWebResponse.GetResponseHeader("codigo") == null) + { + codigo = "991"; + } + else + { + codigo = httpWebResponse.GetResponseHeader("codigo"); + } + if (httpWebResponse.GetResponseHeader("errmsg") != null) + { + errMsg = httpWebResponse.GetResponseHeader("errmsg"); + } + if (Apoyo.toi(codigo) == 0) + { + return true; + } + return false; + } + catch (Exception ex) + { + codigo = "003"; + errMsg = "Error CANC TXM " + text + " err=" + ex.Message; + acuse = ""; + return false; + } + } + } + #endregion cancelar_ComercioDigital + + #region formatRequestConsulta_Comercio_Digital + + private static NumberStyles style = NumberStyles.Any; + + private static CultureInfo culture = CultureInfo.InvariantCulture; + public static void formatRequestConsulta(string usr, string pass, string rfcR, string rfcE, string total, string uuid, out string codigo, out string msg, out string acuse) + { + codigo = "999"; + msg = ""; + acuse = ""; + if (usr.Length < 12 || usr.Length > 13) + { + codigo = "701"; + msg = "701 Usuario Invalido"; + } + else if (pass == "") + { + codigo = "702"; + msg = "702 Usuario Invalido"; + } + else + { + string text = "\n"; + //Genera un solo string con todos los datos, es el que se envia a la peticion. + string txt = string.Concat(new string[] + { + "USER=", + usr, + text, + "PWDW=", + pass, + text, + "RFCR=", + rfcR, + text, + "RFCE=", + rfcE, + text, + "TOTAL=", + total, + text, + "UUID=", + uuid, + text + }); + + string s; + + string host; + + host = "https://cancela.comercio-digital.mx/arws/consultaEstatus"; + if (consultarequest(host, txt, out s, out msg, out acuse)) + { + codigo = s; + } + } + } + #endregion formatRequestConsulta_Comercio_Digital + + #region check_Cliente + public class ClienteCheck + { + public string RFC { get; set; } + public string Nombre { get; set; } + public bool Activo { get; set; } + public string fecha_baja { get; set; } + } + public class ErrorCheck { + public string Error { get; set; } + public bool isError { get; set; } + } + + + public static void check_cliente(string GeneralURL, bool PRUEBAS, string rfc, string DRF_Token, string CFDIRfc, out string excep, out bool ClienteR) + { + excep = ""; + + ClienteR = false; + try + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + + //string prod = PRUEBAS ? "http://127.0.0.1:8000/getActivoRFC/" : "https://Aduanasoft.pythonanywhere.com/getActivoRFC/"; + //string url = string.Format("{1}?RFC={0}", Uri.EscapeDataString(rfc), prod); + + string url = string.Format("{1}/getActivoRFC/?RFC={0}", Uri.EscapeDataString(rfc), GeneralURL); + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.Method = "GET"; + request.ContentLength = 0; + request.ContentType = "application/json"; + request.Timeout = 60000; + request.Headers.Add("Authorization", DRF_Token); + + HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); + + StreamReader webStream = new StreamReader(webResponse.GetResponseStream()); + + var data = webStream.ReadToEnd(); + + ErrorCheck errors = JsonConvert.DeserializeObject(data); + if (errors.isError) + { + excep = errors.Error; + webStream.Close(); + return; + } + ClienteCheck ClienteClass = JsonConvert.DeserializeObject(data); + ClienteR = ClienteClass.Activo; + webStream.Close(); + } + catch (WebException ex) + { + + excep = ex.Message; + } + } + + public static void server_check(out bool bool_server, out string except, out string DRF_Token, out string GeneralURL) + { + bool_server = false; // por default primer server + GeneralURL = string.Empty; + except = string.Empty; + DRF_Token = string.Empty; // Inicializamos para asegurar que tenga un valor + + // Diccionario de servidores y sus tokens, ordenados por prioridad + Dictionary serverTokens = new Dictionary() { + { "https://Aduanasoft.pythonanywhere.com", "Token 3c347967cbb53ebb5c5ef72e867549b20614fe53"}, + { "https://asadmin.onrender.com", "Token fb3219e68a394cbb7fad2a7786728a4a6542f425"} + }; + + foreach (var serverToken in serverTokens) + { + string server = serverToken.Key; + string token = serverToken.Value; + GeneralURL = serverToken.Key; + except = string.Empty; + try + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + string url = $"{server}/getActivoRFC/?RFC=SCT050708EB2"; + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.Method = "GET"; + request.ContentType = "application/json"; + request.Timeout = 60000; // 60 segundos (ajustable) + request.Headers.Add("Authorization", token); + + using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) + using (Stream stream = response.GetResponseStream()) + using (StreamReader reader = new StreamReader(stream)) + { + string data = reader.ReadToEnd(); + // Si el status code es de error (4xx/5xx), lanzar excepción + if (response.StatusCode >= HttpStatusCode.BadRequest) + { + throw new WebException($"HTTP Error: {(int)response.StatusCode} {response.StatusCode}"); + } + // Deserializar y verificar errores + var errorCheck = JsonConvert.DeserializeObject(data); + if (errorCheck.isError) + { + except = errorCheck.Error; + continue; // Intentar con el siguiente servidor si hay error + } + + var clienteCheck = JsonConvert.DeserializeObject(data); + + // Asignar DRF_Token con el token del servidor que respondió correctamente + DRF_Token = token; + + // Si es Aduanasoft, bool_server es false, de lo contrario es true + bool_server = server != "https://Aduanasoft.pythonanywhere.com/getActivoRFC/"; + return; // Salir del método + } + } + catch (WebException ex) when (ex.Status == WebExceptionStatus.Timeout) + { + except = $"Timeout al conectar con {server}"; + continue; // Reintentar con el siguiente endpoint + } + catch (WebException ex) when (ex.Response is HttpWebResponse httpResponse) + { + except = $"Error HTTP ({(int)httpResponse.StatusCode}) desde {server}"; + continue; + } + catch (Exception ex) + { + except = $"Error inesperado en {server}: {ex.Message}"; + continue; + } + } + + // Si llegamos aquí, es porque ningún servidor respondió correctamente + // DRF_Token ya tiene un valor inicial vacío, así que no hay problema + } + + + #endregion check_Cliente + + #region add_timbre_cancela + public static string send_timbre_cancela(string GeneralURL,bool sPAW, string sUUID, string sDRF_Token, string sCFDIRfc,string sCFDIPac, string sComprobante_Folio, string sComprobante_Fecha, out string lex) { + lex = string.Empty; + + + try + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + + using (WebClient webclient = new WebClient() ) { + webclient.Headers[HttpRequestHeader.ContentType] = "application/json"; + webclient.Headers.Add("Authorization", sDRF_Token); + var jsonObj = new { UUID = sUUID, rfcc = sCFDIRfc, rfcp = sCFDIPac, folio = sComprobante_Folio, fecha = sComprobante_Fecha, modo = sPAW ? "Prueba":"Normal" }; + var jsonString = JsonConvert.SerializeObject(jsonObj); + string url = string.Format("{0}/cancela_timbre/", GeneralURL);// sPAW ? "http://127.0.0.1:8000/cancela_timbre/" : "https://Aduanasoft.pythonanywhere.com/cancela_timbre/"; + string response = webclient.UploadString(url, "POST", jsonString); + ErrorCheck error = JsonConvert.DeserializeObject(response); + if (error.isError) { + lex = error.Error; + return "error"; + } + dynamic responseSucces = JsonConvert.DeserializeObject(response); + bool good = responseSucces.success; + if (good) { + return "success"; + } + } + return "error.void"; + + } + catch (WebException ex) { + lex = ex.Message.ToString(); + return "error"; + } + + } + #endregion add_timbre_cancela + + + + #region Add_timbreV2 + public string AddTimbreV2( + string GeneralURL, + string uuid, + string rfcc, string rfcp, string fecha, string folio, + string serie, string tipo, string CFDIMod, + string AdminToken, + out string exception) + + { + exception = string.Empty; + try + { + + string uuidEncoded = Uri.EscapeDataString(uuid); + string rfccEncoded = Uri.EscapeDataString(rfcc); + string rfcpEncoded = Uri.EscapeDataString(rfcp); + //string fechaEncoded = Uri.EscapeDataString(fecha); + string folioEncoded = Uri.EscapeDataString(folio); + string serieEncoded = Uri.EscapeDataString(serie); + string tipoEncoded = Uri.EscapeDataString(tipo); + string CFDIModEncoded = Uri.EscapeDataString(CFDIMod); + + var jsondata = new { + uuid = uuid, + rfcc = rfcc, + fecha = fecha, + folio = folio, + serie = serie, + tipo = tipo, + rfcp = rfcp, + modo = CFDIMod + }; + + + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + using (WebClient webClient = new WebClient()) + { + webClient.Headers[HttpRequestHeader.ContentType] = "application/json"; + webClient.Headers.Add("Authorization", AdminToken); + + var jsonObj = JsonConvert.SerializeObject(jsondata); + + string url = string.Format("{0}/add_timbre2/", GeneralURL); //PAW ? "http://127.0.0.1:8000/add_timbre2/" : "https://Aduanasoft.pythonanywhere.com/add_timbre2/"; + string response = webClient.UploadString(url, "POST", jsonObj); + ErrorCheck errors = JsonConvert.DeserializeObject(response); + if (errors.isError) { exception = errors.Error; return string.Empty; } + + JObject ok = JsonConvert.DeserializeObject(response); + string strOK = (string)ok["data"]; + return strOK; + + } + } + catch (WebException ex) + { + exception = ex.Message.ToString(); + return ""; + } + } + #endregion Add_timbreV2 + + #region saldo2 + + public static void set_saldo(string GeneralURL,bool PRUEBAS, int saldo, string DRF_Token, string CFDIRfc, out string excep) + { + excep = ""; + try + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + string prod = string.Format("{0}/get_saldo2/", GeneralURL);//= PRUEBAS ? "http://127.0.0.1:8000/get_saldo2/" : "https://Aduanasoft.pythonanywhere.com/get_saldo2/"; + + // Incluir ambos parámetros en la URL + string url = string.Format("{0}?num={1}&cfdi_rfc={2}", prod, saldo.ToString(), CFDIRfc); + + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.ContentLength = 0; + request.ContentType = "application/json"; + request.Timeout = 60000; + request.Headers.Add("Authorization", DRF_Token); + + HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); + StreamReader webStream = new StreamReader(webResponse.GetResponseStream()); + var data = webStream.ReadToEnd(); + + // Opcional: Validar la respuesta JSON + // Si quieres verificar que la respuesta sea correcta: + // dynamic jsonResponse = JsonConvert.DeserializeObject(data); + // if (jsonResponse?.data == null) { + // throw new Exception("Respuesta del servidor incorrecta"); + // } + } + catch (WebException webEx) + { + // Capturar específicamente errores HTTP + if (webEx.Response != null) + { + using (var errorResponse = (HttpWebResponse)webEx.Response) + { + using (var reader = new StreamReader(errorResponse.GetResponseStream())) + { + string error = reader.ReadToEnd(); + excep = $"Error del servidor ({(int)errorResponse.StatusCode}): {error}"; + } + } + } + else + { + excep = webEx.Message; + } + } + catch (Exception ex) + { + excep = ex.Message; + } + } + #endregion saldo2 + + + #region consulta_saldo + public static int get_saldo(string usr, string pwd, string CFDIRfc,out int result, out string lex) { + result = 0; + lex =""; + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + try { + + string url = string.Format("https://app2.comercio-digital.mx/x3/saldo?usr={0}&pwd={1}", usr, pwd); + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.Method = "GET"; + request.ContentLength = 0; + request.ContentType = "text/plain"; + request.Timeout = 60000; + HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); + StreamReader webStream = new StreamReader(webResponse.GetResponseStream()); + var data = webStream.ReadToEnd(); + webStream.Close(); + + return Int32.Parse(data); + } + catch (Exception ex) { + + lex = ex.Message; + return result; + + } + } + #endregion consulta_saldo + + #region recuperar_Com_Dig + public static void recuperarXML(string CFDIMod, string usr_ws, string pwd_ws, string uuid, string tipoCFDI, out string codigo, out string errMsg, out string xml_tim) + { + + codigo = "999";errMsg = ""; xml_tim = ""; + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072 ; + if (pwd_ws == "") { codigo = "702"; errMsg = "702 Error usuario/password invalido"; return; } + string host = CFDIMod == "Prueba" ? "https://pruebas.comercio-digital.mx/timbre4/recuperaxml" : "https://ws.comercio-digital.mx/timbre4/recuperaxml"; + + HttpWebRequest req = null; + HttpWebResponse res = null; + HttpStatusCode sts; + try { + req = (HttpWebRequest)WebRequest.Create(host); + req.Method = "POST"; + req.ContentType = "text/plain"; + req.Timeout = 15000; + req.Headers.Add("usrws", usr_ws); + req.Headers.Add("pwdws", pwd_ws); + req.Headers.Add("tipows", "recuperaxmluuid"); + req.Headers.Add("tipo", tipoCFDI); + req.Headers.Add("uuid", uuid); + req.ContentLength = 0; + + res = (HttpWebResponse)req.GetResponse(); + sts = res.StatusCode; + if (sts != HttpStatusCode.OK) { codigo = "998"; errMsg = "998 Error HTTP " + sts.ToString(); return; } + StreamReader reader = new StreamReader(res.GetResponseStream()); + xml_tim = reader.ReadToEnd(); + reader.Close(); + if (res.GetResponseHeader("errmsg") != null) errMsg = (string)res.GetResponseHeader("errmsg"); + codigo = res.GetResponseHeader("codigo") != null && res.GetResponseHeader("codigo") =="000" ? "" : res.GetResponseHeader("codigo"); + return; + } + catch(Exception ex) + { + codigo = "833"; + errMsg = "833 Error TXM " + host + " err=" + ex.Message; + return; + } + } + #endregion recuperar_Com_Dig + + #region consultaRequest_Com_DIG + public static bool consultarequest(string url1, string txt, out string codigo, out string errMsg, out string acuse) + { + codigo = "999"; + errMsg = ""; + acuse = ""; + //Console.WriteLine(url1); + + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + bool result; + try + { + byte[] bytes = Encoding.UTF8.GetBytes(txt); + HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url1); + httpWebRequest.Method = "POST"; + httpWebRequest.ContentType = "text/plain"; + httpWebRequest.Timeout = 60000; + + httpWebRequest.ContentLength = (long)bytes.Length; + Stream requestStream = httpWebRequest.GetRequestStream(); + requestStream.Write(bytes, 0, bytes.Length); + requestStream.Close(); + HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + HttpStatusCode statusCode = httpWebResponse.StatusCode; + if (statusCode != HttpStatusCode.OK) + { + codigo = "998"; + errMsg = "Error HTTP " + statusCode.ToString(); + result = false; + } + else + { + StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream()); + acuse = streamReader.ReadToEnd(); + streamReader.Close(); + if (httpWebResponse.GetResponseHeader("codigo") == null) + { + codigo = "991"; + } + else + { + codigo = httpWebResponse.GetResponseHeader("codigo"); + } + if (httpWebResponse.GetResponseHeader("errmsg") != null) + { + errMsg = httpWebResponse.GetResponseHeader("errmsg"); + return true; + } + + else + { + result = false; + } + } + } + catch (Exception ex) + { + codigo = "003"; + errMsg = "Error CANC TXM " + url1 + " err=" + ex.Message; + acuse = ""; + result = false; + + } + return result; + } + #endregion consultaRequest_ComDIG + + #region class_maquinas_and_sent + //[Serializable] + class Maquinas_cls { + public string UserName { get; set; } + public string PC_Name {get; set;} + public bool Is64 { get; set; } + public string OSversion { get; set; } + public string local_ip { get; set; } + public string public_ip{ get; set; } + public string RFC{ get; set; } + } + + public class RegisterPC { + public string ip_address { get; set; } + public string device_os { get; set; } + public string device_name { get; set; } + public string client { get; set; } + public string token { get; set; } + public string sistema { get; set; } + public string macAddress { get; set; } + + } + + + public static bool RegisterDevice( + string GeneralURL, + bool PAW, string DRF_Token, object jsonObj, string CFDIRfc, + out string errorMessage, out ApiResponseV2 apiResponse + ) + { + // Inicializar valores de salida + errorMessage = string.Empty; + apiResponse = new ApiResponseV2(); + + // Configuración inicial + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; + //se pone "GeneralURL" para cuando este completa la migracion del server principal + string testc = "https://asadmin.onrender.com"; + string url = string.Format("{0}/sistemas/registerPC_V2/", testc); + DRF_Token = "Token fb3219e68a394cbb7fad2a7786728a4a6542f425"; //mientras se libera en 1ra + try + { + if (string.IsNullOrEmpty(DRF_Token)) { + errorMessage = "El token de autorización no puede estar vacio"; + return false; + } + if (jsonObj == null) { + errorMessage = "Los datos del dispositivo no pueden ser nulos"; + return false; + } + + var jsonString = JsonConvert.SerializeObject(jsonObj); + byte[] byteArray = Encoding.UTF8.GetBytes(jsonString); + + // 3. Configurar la solicitud HTTP + var req = (HttpWebRequest)WebRequest.Create(url); + req.Method = "POST"; + req.ContentType = "application/json"; + req.Timeout = 30000; // 30 segundos de timeout + req.ContentLength = byteArray.Length; + req.Headers.Add("Authorization", DRF_Token); + + // 4. Enviar los datos + using (var stream = req.GetRequestStream()) + { + stream.Write(byteArray, 0, byteArray.Length); + } + + // 5. Procesar la respuesta + using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) + using (StreamReader reader = new StreamReader(res.GetResponseStream())) + { + string responseData = reader.ReadToEnd(); + apiResponse = JsonConvert.DeserializeObject(responseData); + + if(!apiResponse.Success) + { + errorMessage = apiResponse.Error ?? "Error desconocido"; + return false; + } + + return true; + } + + } + catch (WebException webEx) + { + if (webEx.Response is HttpWebResponse errorResponse) + { + using (StreamReader reader = new StreamReader(errorResponse.GetResponseStream())) + { + string errorResponseData = reader.ReadToEnd(); + + try + { + apiResponse = JsonConvert.DeserializeObject(errorResponseData); + errorMessage = apiResponse.Error ?? webEx.Message; + } + catch + { + errorMessage = webEx.Message; + apiResponse.Error = webEx.Message; + apiResponse.IsError = true; + } + + } + } + else + { + errorMessage = webEx.Message; + apiResponse.Error = webEx.Message; + apiResponse.IsError = true; + + } + return false; + } + catch (Exception ex) + { + errorMessage = ex.Message; + apiResponse.Error = ex.Message; + apiResponse.IsError = true; + return false; + } + } + + + #endregion class_maquinas_and_sent + #region class_maquinas_and_sent_V2 + + #endregion class_maquinas_and_sent_V2 + + //Comercio Digital request + #region comercio_digital_request + public static void timbrarV5Xml(string host, string usr_ws, string pwd_ws, string tipo2, byte[] cfdi_sin_timbrar, string email, + out int codigo, out string errMsg, out string xml_tim, out string uuid, out int saldo, out string errEmail) + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072 ; + codigo = 999; errMsg = ""; xml_tim = ""; uuid = ""; saldo = 0; errEmail = ""; + if (usr_ws.Length < 12 || usr_ws.Length > 13) + { + codigo = 701; errMsg = "701 Error Usuario/Password Invalido"; return; + } + + if (pwd_ws == "") { codigo = 702; errMsg = "702 Error usuario/password invalido"; return; } + if (cfdi_sin_timbrar == null || cfdi_sin_timbrar.Length < 200) { codigo = 711; errMsg = "711 Contenido XML vacio"; return; } + + if (host == "") host = "pruebas.comercio-digital.mx"; + HttpWebRequest req = null; + HttpWebResponse res = null; + HttpStatusCode sts; + string url = "https://"; + if (host.Contains("comercio-digital.mx") == false) host += ".comercio-digital.mx"; + url += host + "/timbre4/timbrarV5"; + try + { + req = (HttpWebRequest)WebRequest.Create(url); + req.Method = "POST"; + req.ContentType = "text/plain"; + req.Timeout = 15000; + req.ContentLength = cfdi_sin_timbrar.Length; + + req.Headers.Add("usrws", usr_ws); + req.Headers.Add("pwdws", pwd_ws); + req.Headers.Add("tipo", tipo2); + if (email != "") + { + email = email.ToLower(); + req.Headers.Add("email", email); + } + + Stream sw = req.GetRequestStream(); + sw.Write(cfdi_sin_timbrar, 0, cfdi_sin_timbrar.Length); + sw.Close(); + res = (HttpWebResponse)req.GetResponse(); + sts = res.StatusCode; + if (sts != HttpStatusCode.OK) { codigo = 998; errMsg = "998 Error HTTP " + sts.ToString(); return; } + StreamReader reader = new StreamReader(res.GetResponseStream()); + + xml_tim = reader.ReadToEnd(); + + reader.Close(); + string cod2 = ""; + if (res.GetResponseHeader("saldo") != null) + { + cod2 = (string)res.GetResponseHeader("saldo"); + } + if (res.GetResponseHeader("uuid") != null) uuid = (string)res.GetResponseHeader("uuid"); + if (res.GetResponseHeader("errmsg") != null) errMsg = (string)res.GetResponseHeader("errmsg"); + if (res.GetResponseHeader("erremail") != null) errEmail = (string)res.GetResponseHeader("erremail"); + if (res.GetResponseHeader("erremail") == null) codigo = 991; + else + { + cod2 = (string)res.GetResponseHeader("codigo"); + + } + return; + } + catch (Exception ex) + { + codigo = 833; + errMsg = "833 Error TXM " + url + " err=" + ex.Message; + return; + } + } + #endregion comercio_digital_request + //int codigo; string errMsg; string xml_tim; string uuid; int saldo; string errEmail; + + /*** ***/ + //edicom timbrado + #region edicom timbrado + public bool edicom_timbrado(bool bolRet = false) + { + + + + bool bolRes = false; + sys_estatus("Timbrando Comprobante..."); + //CFDIPacUrl = "https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi"; + CFDIPacUrl = "https://cfdiws.sedeb2b.com/EdiwinWS/services/CFDi?wsdl"; + + if (!bolRet) + { + CFDIPacFun = CFDIMod == "Prueba" ? "cfdi:getTimbreCfdiTest" : "cfdi:getTimbreCfdi"; + + CFDIPacRes = CFDIMod == "Prueba" ? "getTimbreCfdiTest" : "getTimbreCfdi"; + + } + else + { + CFDIPacFun = CFDIMod == "Prueba" ? "cfdi:getTimbreCfdiRetencionesTest" : "cfdi:getTimbreCfdiRetenciones"; + CFDIPacRes = CFDIMod == "Prueba" ? "getTimbreCfdiRetencionesTest" : "getTimbreCfdiRetenciones"; + + } + + XmlDocument soapEnvelopeXml = soap_cuerpo_timbre(); + HttpWebRequest webRequest = soap_cabeceras(CFDIPacUrl, CFDIPacFun); + soap_peticion(soapEnvelopeXml, webRequest); + + if (webRequest.ContentLength > 0) + { + // begin async call to web request. + IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null); + + // varios para + asyncResult.AsyncWaitHandle.WaitOne(); + + // get the response from the completed web request. + string soapResult; + + try + { + using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult)) + { + + + using (StreamReader rd = new StreamReader(webResponse.GetResponseStream())) + { + + //leer resultado y crear xml + soapResult = rd.ReadToEnd(); + sys_arc(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + "_success.xml"); + File.WriteAllText(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + "_success.xml", soapResult); + + //leer xml + XmlDocument xDoc = new XmlDocument(); + xDoc.Load(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + "_success.xml"); + XmlNodeList lista = xDoc.GetElementsByTagName(CFDIPacRes + "Return"); + string strTimbre64 = string.Empty; + foreach (XmlElement nodo in lista) + { + byte[] plain = Convert.FromBase64String(nodo.InnerText.Trim()); + sys_arc(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + "_success.zip"); + File.WriteAllBytes(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + "_success.zip", plain); + } + sys_arc(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + "_success.xml"); + try + { + sys_arc(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + ".xml"); + ZipFile zip = ZipFile.Read(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + "_success.zip"); + foreach (ZipEntry e in zip) + { + if (e.FileName == "TIMBRE_XML_COMPROBANTE_3_0.xml") + { + e.Extract(SysTem, ExtractExistingFileAction.OverwriteSilently); + } + } + zip.Dispose(); + sys_arc(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + "_success.zip"); + if (File.Exists(SysTem + "TIMBRE_XML_COMPROBANTE_3_0.xml")) + { + File.Move(SysTem + "TIMBRE_XML_COMPROBANTE_3_0.xml", SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + ".xml"); + } + FileStream fsXml = new FileStream(SysTem + "T_" + Comprobante_Serie + Comprobante_Folio + ".xml", FileMode.Open); + //XmlReader xmlReader = XmlReader.Create(fsXml); + + XmlDocument doc = new XmlDocument(); + NameTable nt = new NameTable(); + XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt); + nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); + XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); + XmlReaderSettings xset = new XmlReaderSettings(); + xset.ConformanceLevel = ConformanceLevel.Fragment; + XmlReader xmlReader = XmlReader.Create(fsXml, xset, context); + if(xmlReader == null) + { + sys_mensaje_error("No hubo respuesta por parte del WebService.", 1); + return true; + } + try + { + // Lectura de todos los nodos del documento XML: + while (xmlReader.Read()) + { + // Comprueba que el elemento actual contenga atributos: + if (xmlReader.HasAttributes) + { + while (xmlReader.MoveToNextAttribute()) + { + switch (xmlReader.Name) + { + case "Version": + Complemento_TimbreFiscalDigital_Version = xmlReader.Value; + break; + case "UUID": + Complemento_TimbreFiscalDigital_UUID = xmlReader.Value; + break; + case "FechaTimbrado": + Complemento_TimbreFiscalDigital_FechaTimbrado = xmlReader.Value; + break; + case "RfcProvCertif": + Complemento_TimbreFiscalDigital_RfcProvCertif = xmlReader.Value; + break; + case "SelloCFD": + Complemento_TimbreFiscalDigital_SelloCFD = xmlReader.Value; + break; + case "NoCertificadoSAT": + Complemento_TimbreFiscalDigital_NoCertificadoSAT = xmlReader.Value; + break; + case "SelloSAT": + Complemento_TimbreFiscalDigital_SelloSAT = xmlReader.Value; + break; + + } + } + xmlReader.MoveToElement(); + } + } + fsXml.Close(); + bolRes = true; + } + catch (Exception Ex) + { + fsXml.Close(); + sys_mensaje_error("Error al leer los valores del timbre.\n"+Ex, 1); + exe_err(Ex, "Lee_Tim"); + } + } + catch (Exception Ex) + { + sys_mensaje_error("Error al leer el ZIP del timbre.", 1); + exe_err(Ex, "Lee_Zip_Tim"); + } + } + } + + if (!bolRes) + { + + sys_mensaje_error("Error al leer la petición del timbres.", 1); + } + } + catch (WebException ex) + { + edicom_excepcion(ex, "Timbrar"); + } + } + else + { + sys_mensaje_error("El PAC no dió ninguna respuesta.", 1); + } + return bolRes; + } + #endregion edicom timbrado + + //soap cabeceras + #region soap cabeceras + public HttpWebRequest soap_cabeceras(string url, string action) + { + HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); + webRequest.Headers.Add("SOAPAction", action); + + //webRequest.ContentType = "text/xml;charset=\"utf-8\""; ASI SE ESTABA HACIENDO LA PETICION SOAP CON ESCAPE DE COMILLAS + webRequest.ContentType = "text/xml;charset=utf-8"; + + webRequest.Accept = "text/xml"; + webRequest.Method = "POST"; + return webRequest; + } + #endregion soap cabeceras + + //soap cuerpo + #region soap cuerpo timbre + private XmlDocument soap_cuerpo_timbre() + { + //leer archivo + var bytes = File.ReadAllBytes(ComprobanteDBArchivo); + string base64 = Convert.ToBase64String(bytes); + + CFDIPet = @" + + + + <"+ CFDIPacFun +@"> + " + CFDIPacUsr + @" + " + CFDIPacPwd + @" + "+ base64 +@" + + +"; + XmlDocument soapEnvelopeDocument = new XmlDocument(); + soapEnvelopeDocument.LoadXml(CFDIPet); + return soapEnvelopeDocument; + } + #endregion soap cuerpo timbre + + //peticion soap + #region soap peticion + private void soap_peticion(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest) + { + try + { + + using (Stream stream = webRequest.GetRequestStream()) + { + + soapEnvelopeXml.Save(stream); + } + + } + catch (Exception Ex) + { + sys_mensaje_error("Error al enviar la petición SOAP XML.", 1); + exe_err(Ex, "Pet_XML"); + } + } + #endregion soap peticion + + //cfdi33 hilo + #region cfdi33 hilo + public void cfdi33_hilo() + { + ThreadStart funcion = new ThreadStart(cfdi33_operacion); + Thread hilo = new Thread(funcion); + hilo.Start(); + } + #endregion cfdi33 hilo + + //sys proceso error + #region sys proceso error + public void sys_proceso_error(string strMen = null) + { + strMen = string.IsNullOrEmpty(strMen) ? "¡Error al Timbrar!" : strMen; + SysErrores = string.IsNullOrEmpty(SysErrores) ? strMen : SysErrores; + SysErrores = strMen == "¡Error en configuración!" ? SysErrores + @"\b Llame la aplicación desde:\b0 \par Cuenta de Gastos o Service Manager \par Para configurar la conexión automáticamente." : SysErrores; + if (!string.IsNullOrEmpty(SysErrores)) + { + //mostrar loading + picLoad.Image = imglisAvance.Images["error"]; + btResultados.PerformClick(); + rtbResultados.Rtf = @"{\rtf1\ansi " + SysErrores + "}"; + sys_estatus(strMen); + } + SysProcesso = 0; + } + #endregion sys proceso error + + //sys proceso fin + #region sys proceso fin + public void sys_proceso_fin(string strMen, int intExi = 0, string strMenExt = "") + { + //cambiar estatus + sys_estatus(strMen); + picLoad.Image = imglisAvance.Images["qr"]; + this.Refresh(); + string strRes = MessageBox.Show(strMen + strMenExt, SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Information).ToString().ToLower(); + if (intExi == 1 && strRes == "ok") + { + if (CFDISis == "bms") + { + string strArg = string.Empty; + string strRut = Environment.CurrentDirectory + "\\"; + if(strRut != AppDomain.CurrentDomain.BaseDirectory) + { + //this.Hide(); + //if (!string.IsNullOrEmpty(ComprobanteDBPwd)) + //{ + // strArg = "BMS_AS 1"; + //} + //else + //{ + // strArg = "BMS_Cli 1"; + //} + //Process pro = new Process(); + //pro.StartInfo.FileName = SysDir + "Actualizador.exe"; + //pro.StartInfo.Arguments = strArg; + //pro.StartInfo.WorkingDirectory = strRut; + //pro.Start(); + } + } + Environment.Exit(1); + } + } + #endregion sys proceso fin + + //sys mensaje error + #region sys mensaje error + public void sys_mensaje_error(string strMen, int intErr = 0) + { + SysErrores = SysErrores + strMen.Replace("\n", "\\par ") + "\\par "; + if (intErr > 0) + { + string strErr = intErr == 2 ? "¡Error de Conexión a SQL!" : intErr == 3 ? "¡Error al validar licencia!" : intErr == 4 ? "¡Error al agregar el CEP!" : intErr == 5 ? "¡Error al actualizar Lista!" : string.Empty; + sys_proceso_error(strErr); + } + string strMsg = strMen.Replace("\\b0", string.Empty).Replace("\\b ", string.Empty).Replace("\\par ", "\n"); + MessageBox.Show(strMsg, SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + #endregion sys mensaje error + + //nombre del mes + #region sys mes nombre + public string sys_mes_nombre(int intMes) + { + string strMesNombre = string.Empty; + switch (intMes) + { + case 1: + strMesNombre = "Enero"; + break; + case 2: + strMesNombre = "Febrero"; + break; + case 3: + strMesNombre = "Marzo"; + break; + case 4: + strMesNombre = "Abril"; + break; + case 5: + strMesNombre = "Mayo"; + break; + case 6: + strMesNombre = "Junio"; + break; + case 7: + strMesNombre = "Julio"; + break; + case 8: + strMesNombre = "Agosto"; + break; + case 9: + strMesNombre = "Septiembre"; + break; + case 10: + strMesNombre = "Octubre"; + break; + case 11: + strMesNombre = "Noviembre"; + break; + case 12: + strMesNombre = "Diciembre"; + break; + } + return strMesNombre; + } + #endregion sys mes nombre + + //transformar fecha en formato cfdi + #region sys fix fecha + public string sys_fix_fecha(string fecha) + { + fecha = fecha.Replace("TT", "T0"); + if (fecha.Length > 19) + { + fecha = fecha.Substring(0, 19); + } + return fecha; + } + #endregion sys fix fecha + + //desencriptar cadena + #region sys desencriptar + public string DESDecrypt(string stringToDecrypt) + { + byte[] key; + byte[] IV; + byte[] inputByteArray; + try + { + key = Convert2ByteArray(DESKey); + IV = Convert2ByteArray(DESIV); + int len = stringToDecrypt.Length; inputByteArray = Convert.FromBase64String(stringToDecrypt); + DESCryptoServiceProvider des = new DESCryptoServiceProvider(); + MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write); + cs.Write(inputByteArray, 0, inputByteArray.Length); + cs.FlushFinalBlock(); + Encoding encoding = Encoding.UTF8; return encoding.GetString(ms.ToArray()); + } + catch (Exception Ex) + { + exe_err(Ex, "Des_Cad"); + return string.Empty; + } + } + #endregion sys desencriptar + + //encriptar cadena + #region sys encriptar + public string DESEncrypt(string stringToEncrypt) + { + byte[] key; + byte[] IV; + byte[] inputByteArray; + try + { + key = Convert2ByteArray(DESKey); + IV = Convert2ByteArray(DESIV); + inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt); + DESCryptoServiceProvider des = new DESCryptoServiceProvider(); + MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write); + cs.Write(inputByteArray, 0, inputByteArray.Length); + cs.FlushFinalBlock(); + return Convert.ToBase64String(ms.ToArray()); + } + catch (Exception Ex) + { + exe_err(Ex, "Enc_Cad"); + return string.Empty; + } + } + #endregion sys encriptar + + //crear array byte + #region sys enc/des arraybyte + static byte[] Convert2ByteArray(string strInput) + { + int intCounter; char[] arrChar; + arrChar = strInput.ToCharArray(); + byte[] arrByte = new byte[arrChar.Length]; + for (intCounter = 0; intCounter <= arrByte.Length - 1; intCounter++) + { + arrByte[intCounter] = Convert.ToByte(arrChar[intCounter]); + } + return arrByte; + } + #endregion sys enc/des arraybyte + + //sys copiar + #region sys copiar + public void sys_copiar() + { + string strTxt = rtbResultados.SelectionLength > 0 ? strTxt = rtbResultados.SelectedText : rtbResultados.Text; + Clipboard.SetText(strTxt); + } + #endregion sys copiar + + //probar y guardar configuracion del sistema + #region sys configuracion + public void sys_configuracion() + { + //mostrar loading + picLoad.Image = imglisAvance.Images["spinner"]; + sys_estatus("Probando configuración..."); + + string eje_mod = string.Empty; + string pac = string.Empty; + string ver = string.Empty; + string errores = string.Empty; + string strLog = string.Empty; + pnConfiguracion.Refresh(); + eje_mod = rbModoN.Checked ? "Normal" : eje_mod; + eje_mod = rbModoP.Checked ? "Prueba" : eje_mod; + pac = rbPACCD.Checked ? "ComDig" : pac; + pac = rbPACED.Checked ? "EdiCom" : pac; + ver = rbVerRel.Checked ? "Rel" : ver; + ver = rbVerDeb.Checked ? "Deb" : ver; + + strLog = cbLogSQL.Checked ? "Act" : string.Empty; + errores = string.IsNullOrEmpty(eje_mod) ? errores + @"Pestaña 2: Seleccione el Modo de Ejecución. \par " : errores; + errores = string.IsNullOrEmpty(pac) ? errores + @"Pestaña 2: Seleccione el PAC para Timbrar. \par " + errores : errores; + errores = string.IsNullOrEmpty(txtSQLSrv.Text) ? errores + @"Pestaña 2: Servidor. \par " : errores; + errores = string.IsNullOrEmpty(txtSQLDB.Text) ? errores + @"Pestaña 2: Base de datos. \par " : errores; + errores = string.IsNullOrEmpty(txtSQLUsr.Text) ? errores + @"Pestaña 2: Usuario. \par " : errores; + errores = string.IsNullOrEmpty(txtSQLPwd.Text) ? errores + @"Pestaña 2: Clave. \par " : errores; + if (!string.IsNullOrEmpty(errores)) + { + SysErrores = errores; + errores = errores.Replace(" \\par ", "\n"); + MessageBox.Show("Configuración incompleta por favor ingrese o seleccione:\n" + errores, SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Error); + sys_proceso_error(); + return; + } + string port = !string.IsNullOrEmpty(txtSQLPor.Text) ? ", " + txtSQLPor.Text : string.Empty; + string strcon = @"data source = " + txtSQLSrv.Text + port + "; initial catalog = " + txtSQLDB.Text + "; user id = " + txtSQLUsr.Text + "; password = " + txtSQLPwd.Text; + int con = 0; + SqlConnection myConnection = new SqlConnection(strcon); + try + { + myConnection.Open(); + con = 1; + } + catch (Exception Ex) + { + SysErrores = SysErrores + "No hay conexión al servidor SQL"; + sys_proceso_error(); + //exe_err(Ex, "Pru_Con_SQL"); + } + if (con == 1) + { + SQLSrv = txtSQLSrv.Text; + SQLDb = txtSQLDB.Text; + SQLUsr = txtSQLUsr.Text; + SQLPwd = txtSQLPwd.Text; + SQLPor = txtSQLPor.Text; + CFDIMod = eje_mod; + CFDIPac = pac; + CFDIVer = ver; + CFDILog = strLog; + cfdi33_conexion_xml(); + + string strMen = "¡Configuración guardada!"; + MessageBox.Show(strMen, SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Information); + picLoad.Image = imglisAvance.Images["qr"]; + sys_estatus(strMen); + } + } + #endregion sys configuracion + + //verificar opcion seleccionada en rb operacion ante el pac + #region sys verificar rb + public void sys_verificar_rb() + { + if (string.IsNullOrEmpty(ComprobanteDBOperacion) || ComprobanteDBOperacion.ToLower() == "timbrar") + { + ComprobanteDBOperacion = rbTimbrar.Checked ? "timbrar" : ComprobanteDBOperacion; + ComprobanteDBOperacion = rbCancelar.Checked ? "cancelar" : ComprobanteDBOperacion; + ComprobanteDBOperacion = rbRecuperar.Checked ? "recuperar" : ComprobanteDBOperacion; + ComprobanteDBOperacion = CB_Status.Checked ? "status" : ComprobanteDBOperacion; + } + if (RBCancela.Checked) + { + CancelaNuevo = true; + ComprobanteDBOperacion = RBCancela.Checked ? "cancelar_nuevo" : ComprobanteDBOperacion; + } + else + { + CancelaNuevo = false; + } + string idval = txbSysID.Text.Trim(); + if (!string.IsNullOrEmpty(idval)) + { + int.TryParse(idval, out ComprobanteDBSysId); + } + if (ComprobanteDBSysId > 0) + { + + sys_proceso_inicio(); + + } + else + { + MessageBox.Show("Por favor ingrese SysID numérico.", SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + #endregion sys verificar rb + + //sys sql error + #region sys sql error + public string sys_sql_error(SqlException sqlerr) + { + string strErr = string.Empty; + for (int i = 0; i < sqlerr.Errors.Count; i++) + { + strErr += "\n" + sqlerr.Errors[i].Message.Replace("Invalid column name ", "No existe la columna ").Replace("Invalid object name ", "La base de datos " + SQLDb + " no contiene la tabla "); + } + return strErr; + } + #endregion sys sql error + + //publicar aplicacion + #region publicar aplicacion + public void publicar_aplicacion(string strNom, string strRut, string strDir, bool bolDeb = false) + { + //el cliente de esta version de frame work es basico por eso el archivo no se sube con su nombre final + string strMod = string.Empty; + if (!bolDeb) + { + strMod = "release"; + } + else + { + strMod = "beta"; + } + string strRes = MessageBox.Show("Desea publicar una nueva versión " + strMod + " de " + strNom, SysNombre, MessageBoxButtons.YesNo).ToString(); + if (strRes != "Yes") + { + return; + } + try + { + picLoad.Image = imglisAvance.Images["spinner"]; + sys_estatus("Comprimiendo aplicación..."); + ZipFile zip = new ZipFile(); + zip.AddFile(strRut + strNom + ".exe", "."); + zip.Save(strRut + strNom + ".zip"); + } + catch(Exception Ex) + { + sys_mensaje_error("Error al comprimir la actualización.", 1); + exe_err(Ex, "Act_Zip"); + return; + } + try + { + sys_estatus("Cargando exe..."); + FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FTPSrv + strDir + strNom + "_New.exe"); + request.Credentials = new NetworkCredential(FTPUsr, FTPPwd); + request.Method = WebRequestMethods.Ftp.UploadFile; + + using (Stream fileStream = File.OpenRead(strRut + strNom + ".exe")) + using (Stream ftpStream = request.GetRequestStream()) + { + fileStream.CopyTo(ftpStream); + } + + sys_estatus("Cargando zip..."); + FtpWebRequest request0 = (FtpWebRequest)WebRequest.Create(FTPSrv + strDir + strNom + "_New.zip"); + request0.Credentials = new NetworkCredential(FTPUsr, FTPPwd); + request0.Method = WebRequestMethods.Ftp.UploadFile; + + using (Stream fileStream0 = File.OpenRead(strRut + strNom + ".zip")) + using (Stream ftpStream0 = request0.GetRequestStream()) + { + fileStream0.CopyTo(ftpStream0); + } + sys_estatus("Borrando exe actual..."); + try + { + FtpWebRequest request1 = (FtpWebRequest)WebRequest.Create(FTPSrv + strDir + strNom + ".exe"); + request1.Credentials = new NetworkCredential(FTPUsr, FTPPwd); + request1.Method = WebRequestMethods.Ftp.DeleteFile; + FtpWebResponse response1 = (FtpWebResponse)request1.GetResponse(); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al borrar la versión " + strMod + " del sistema.", 1); + exe_err(Ex, "Pub_Bor"); + } + sys_estatus("Renombrando exe..."); + try + { + FtpWebRequest request2 = (FtpWebRequest)WebRequest.Create(FTPSrv + strDir + strNom + "_New.exe"); + request2.Credentials = new NetworkCredential(FTPUsr, FTPPwd); + request2.Method = WebRequestMethods.Ftp.Rename; + request2.RenameTo = strNom + ".exe"; + FtpWebResponse response2 = (FtpWebResponse)request2.GetResponse(); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al renombrar la nueva versión " + strMod + " del sistema.", 1); + exe_err(Ex, "Pub_Ren"); + } + sys_estatus("Borrando zip actual..."); + try + { + FtpWebRequest request1 = (FtpWebRequest)WebRequest.Create(FTPSrv + strDir + strNom + ".zip"); + request1.Credentials = new NetworkCredential(FTPUsr, FTPPwd); + request1.Method = WebRequestMethods.Ftp.DeleteFile; + FtpWebResponse response1 = (FtpWebResponse)request1.GetResponse(); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al borrar la versión zip" + strMod + " del sistema.", 1); + exe_err(Ex, "Pub_Bor_Zip"); + } + sys_estatus("Renombrando zip..."); + try + { + FtpWebRequest request2 = (FtpWebRequest)WebRequest.Create(FTPSrv + strDir + strNom + "_New.zip"); + request2.Credentials = new NetworkCredential(FTPUsr, FTPPwd); + request2.Method = WebRequestMethods.Ftp.Rename; + request2.RenameTo = strNom + ".zip"; + FtpWebResponse response2 = (FtpWebResponse)request2.GetResponse(); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al renombrar la nueva versión " + strMod + " del sistema.", 1); + exe_err(Ex, "Pub_Ren_Zip"); + } + try + { + if(strNom == "CFDI") + { + string strRed = strMod == "beta" ? "_Beta" : string.Empty; + sys_arc("\\\\datasrv\\Compartido\\EDGAR\\Ejecutables\\CFDI" + strRed + "\\CFDI.exe"); + File.Copy(strRut + "CFDI.exe", "\\\\datasrv\\Compartido\\EDGAR\\Ejecutables\\CFDI" + strRed + "\\CFDI.exe"); + + } + sys_proceso_fin("Versión publicada", 0, "\nNueva versión " + strMod + " de " + strNom); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al copiar en datasrv la nueva versión " + strMod + " del sistema.", 1); + exe_err(Ex, "Pub_Loc"); + } + sys_arc(strRut + strNom + ".zip"); + } + catch (Exception Ex) + { + sys_mensaje_error("Error al publicar la versión " + strMod + " del sistema.", 1); + exe_err(Ex, "Pub_Sub"); + } + } + #endregion publicar aplicacion + + /*** botones y eventos de la forma ***/ + + //conexion a sql + #region btn conexion a sql + private void btnSQLTst_Click(object sender, EventArgs e) + { + sys_configuracion(); + } + #endregion btn conexion a sql + + //btn cg anticipo sql + #region btn cg anticipo sql + private void btnCGAntSqlCFDI_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "anticipo"; + ComprobanteDBAplicacion = "cuentagastos"; + sys_verificar_rb(); + } + #endregion btn cg anticipo sql + + //btn cg anticipo egreso sql + #region btn cg anticipo egreso sql + private void btnCGAntESqlCFDI_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "anticipo_egreso"; + ComprobanteDBAplicacion = "cuentagastos"; + sys_verificar_rb(); + } + #endregion btn cg anticipo egreso sql + + //btn cg factura sql + #region btn cg factura sql + private void btnCGFactSQL_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "factura"; + ComprobanteDBAplicacion = "cuentagastos"; + + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + #endregion btn cg factura sql + + //btn cg factura egreso sql + #region btn cg factura egreso sql + private void btnCGFacESQL_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + //ComprobanteDBTipoComprobante = "factura_egreso"; + ComprobanteDBTipoComprobante = "factura_egreso"; + ComprobanteDBAplicacion = "cuentagastos"; + + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + #endregion btn cg factura sql + + //btn cg notacredito sql + #region btn cg notacredito sql + private void btnCGNotCSQL_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "notacredito"; + ComprobanteDBAplicacion = "cuentagastos"; + + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + #endregion btn cg notacredito sql + + //btn cg pago + #region btn cg pago + private void btnCGPagoSQL_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "pago"; + ComprobanteDBAplicacion = "cuentagastos"; + + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + #endregion btn cg pago + + //btn cg cep + #region btn cg cep + private void btnCGCEP_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "pago"; + ComprobanteDBAplicacion = "cuentagastos"; + ComprobanteDBOperacion = "xml"; + + openFileDialogCEP.FileName = string.Empty; + openFileDialogCEP.Filter = "Archivos XML (.xml)|*.xml"; + openFileDialogCEP.FilterIndex = 1; + if (openFileDialogCEP.ShowDialog() == DialogResult.OK) + { + Pago10_CEPRuta = openFileDialogCEP.FileName; + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + } + #endregion btn cg cep + + //btn sm cartaporte sql + #region btn sm cartaporte sql + private void btnSMCarPSQL_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "pago"; + ComprobanteDBAplicacion = "servicemanager"; + + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + #endregion btn sm cartaporte sql + + //btn sm factura sql + #region btn sm factura sql + private void btnSMFactSQL_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "factura"; + ComprobanteDBAplicacion = "servicemanager"; + + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + #endregion btn sm factura sql + + //btn sm factura egreso sql + #region btn sm factura egreso sql + private void btnSMFacESQL_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "factura_egreso"; + ComprobanteDBAplicacion = "servicemanager"; + + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + #endregion btn sm factura egreso sql + + //btn sm notacredito sql + #region btn sm notacredito sql + private void btnSMNotCSQL_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "notacredito"; + ComprobanteDBAplicacion = "servicemanager"; + + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + #endregion btn sm notacredito sql + + //btn sm retencion sql + #region btn sm retencion sql + private void btnSMReteSQL_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "retencion"; + ComprobanteDBAplicacion = "servicemanager"; + + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + #endregion btn sm retencion sql + + //btn sm cep + #region btn sm cep + private void btnSMCEP_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "pago"; + ComprobanteDBAplicacion = "servicemanager"; + ComprobanteDBOperacion = "xml"; + + openFileDialogCEP.FileName = string.Empty; + openFileDialogCEP.Filter = "Archivos XML (.xml)|*.xml"; + openFileDialogCEP.FilterIndex = 1; + if (openFileDialogCEP.ShowDialog() == DialogResult.OK) + { + Pago10_CEPRuta = openFileDialogCEP.FileName; + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + } + #endregion btn sm cep + + //btn sm traslado sql + #region btn sm traslado sql + private void btnSMTrasSQL_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "traslado"; + ComprobanteDBAplicacion = "servicemanager"; + + //verificar configuracion e iniciar proceso + sys_verificar_rb(); + } + #endregion btn sm traslado sql + + //btn conexion a sql + #region btn conexion a sql + private void btnConSav_Click(object sender, EventArgs e) + { + sys_configuracion(); + } + #endregion btn conexion a sql + + //btn enviar clientes + #region btn lista + private void btnLis_Click(object sender, EventArgs e) + { + ComprobanteDBOperacion = "lista"; + ComprobanteDBAplicacion = "servicemanager"; + ComprobanteDBSysId = rbListaVer.Checked ? 1 : 0; + cfdi33_operacion(); + } + #endregion btn lista + + //btn enviar clientes beta + #region btn lista beta + private void btnLisBet_Click(object sender, EventArgs e) + { + ComprobanteDBOperacion = "lista_beta"; + ComprobanteDBAplicacion = "servicemanager"; + ComprobanteDBSysId = rbListaVer.Checked ? 1 : 0; + cfdi33_operacion(); + } + #endregion btn lista beta + + //btn contador timbres + #region btn contador timbres + private void btnTimbres_Click(object sender, EventArgs e) + { + ComprobanteDBOperacion = "contador"; + ComprobanteDBAplicacion = "servicemanager"; + string strErr = string.Empty; + strErr = cmCTYear.SelectedItem == null ? strErr + "• Año\n" : strErr; + strErr = cmCTMes.SelectedItem == null ? strErr + "• Mes\n" : strErr; + if (string.IsNullOrEmpty(strErr)) + { + int.TryParse(cmCTYear.SelectedItem.ToString(), out ComprobanteDBSysId); + ComprobanteDBTipoComprobante = cmCTMes.SelectedItem.ToString(); + ComprobanteDBIncUUID = chCTUid.Checked; + ComprobanteDBIncFolio = chCTFol.Checked; + if (cbCTCliente.SelectedItem != null) + { + ComprobanteDBRFC = cbCTCliente.SelectedItem.ToString(); + } + cfdi33_operacion(); + } + else + { + MessageBox.Show("Por favor seleccione:\n" + strErr, SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + #endregion btn contador timbres + + //btn enviar release + #region btn enviar release + private void btnPubRel_Click(object sender, EventArgs e) + { + string strNom = rbPubCFDI.Checked ? "CFDI" : string.Empty; + string strRut = SysDir.Replace("\\bin\\Debug\\", "\\bin\\Release\\"); + string strDir = "/Herramientas/CFDI/"; + strNom = rbPubAct.Checked ? "Actualizador" : strNom; + strRut = strNom == "Actualizador" ? strRut.Replace("CFDI", "Actualizador") : strRut; + publicar_aplicacion(strNom, strRut, strDir); + } + #endregion btn enviar reelease + + //btn enviar beta + #region btn enviar beta + private void btnPubBet_Click(object sender, EventArgs e) + { + string strNom = rbPubCFDI.Checked ? "CFDI" : string.Empty; + string strRut = SysDir.Replace("\\bin\\Release\\", "\\bin\\Debug\\"); + string strDir = "/Herramientas/CFDI_Beta/"; + strNom = rbPubAct.Checked ? "Actualizador" : strNom; + strRut = strNom == "Actualizador" ? strRut.Replace("CFDI", "Actualizador") : strRut; + publicar_aplicacion(strNom, strRut, strDir, true); + } + #endregion btn enviar beta + + //cerrar forma + #region frm cerrar + private void frmCFDI_FormClosing(object sender, FormClosingEventArgs e) + { + if (SysProcesso == 1) + { + string strSal = MessageBox.Show("¿Realmente desea salir?\n Hay procesos que no se han terminado", SysNombre, MessageBoxButtons.YesNo).ToString(); + if (strSal == "No") + { + e.Cancel = true; + } + else + { + Environment.Exit(1); + } + } + } + #endregion frm cerrar + + //cntrl + c + #region ctrl copy + private void rtbResultados_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control) + { + sys_copiar(); + } + } + #endregion ctrl copy + + //cargar forma + #region form load + private void frmCFDI_Load(object sender, EventArgs e) + { + + + cfdi33_inicio(); + } + #endregion form load + + public static bool CheckAndUpdateLastTime(int minutesToCheck = 1) + { + try + { + // Obtener último tiempo guardado (si existe) + DateTime lastChecked = Properties.Settings.Default.lastChecked; + TimeSpan elapsedTime = DateTime.Now - lastChecked; + + // Si es la primera vez (nunca se guardó) o ya pasó el tiempo requerido + if (lastChecked == default(DateTime) || elapsedTime.TotalMinutes >= minutesToCheck) + { + // Actualizar el último chequeo AHORA + Properties.Settings.Default.lastChecked = DateTime.Now; + Properties.Settings.Default.Save(); + return true; + } + + return false; // No ha pasado el tiempo suficiente + } + catch + { + // Si hay error, actualizar el registro y asumir que debe ejecutarse + Properties.Settings.Default.lastChecked = DateTime.Now; + Properties.Settings.Default.Save(); + return true; + } + } + /*** ***/ + //clic en botones + #region clic en botones + private void btPruebas_Click(object sender, EventArgs e) + { + + panels_hide(); + + tbPruebas.BackColor = Color.FromArgb(153, 163, 194); + tbPruebas.ForeColor = Color.White; + pnPruebas.Show(); + this.Refresh(); + } + + + private void btConfiguracion_Click(object sender, EventArgs e) + { + + if (this.txtResult.Text == "") + { + MessageBox.Show("Ingrese la contraseña para ver las configuraciones."); + panels_hide(); + this.txtResult.Show(); + this.txtResult.Focus(); + this.lblConfiguracion.Show(); + } + else + { + if (this.txtResult.Text == "Soluciones01") + { + btConfiguracion.BackColor = Color.FromArgb(153, 163, 194); + btConfiguracion.ForeColor = Color.White; + pnConfiguracion.Show(); + this.txtResult.Hide(); + this.lblConfiguracion.Hide(); + this.txtResult.Text = ""; + + this.Refresh(); + } + else + { + MessageBox.Show("La contraseña no es correcta"); + } + } + } + + + private void btResultados_Click(object sender, EventArgs e) + { + panels_hide(); + btResultados.BackColor = Color.FromArgb(153, 163, 194); + btResultados.ForeColor = Color.White; + rtbResultados.Show(); + this.Refresh(); + } + #endregion clic en botones + + /*** ***/ + //hover en botones + #region hover botones + private void btConfiguracion_MouseHover(object sender, EventArgs e) + { + colores_tabs("btConfiguracion", "Hov"); + btConfiguracion.BackColor = Color.FromArgb(92, 202, 229); + btConfiguracion.ForeColor = Color.Black; + } + + private void btPruebas_MouseHover(object sender, EventArgs e) + { + colores_tabs("btPruebas", "Hov"); + tbPruebas.BackColor = Color.FromArgb(92, 202, 229); + tbPruebas.ForeColor = Color.Black; + } + + private void btResultados_MouseHover(object sender, EventArgs e) + { + colores_tabs("btResultados", "Hov"); + btResultados.BackColor = Color.FromArgb(92, 202, 229); + btResultados.ForeColor = Color.Black; + } + #endregion hover botones + + /*** ***/ + //leave en botones + #region leave botones + private void btResultados_MouseLeave(object sender, EventArgs e) + { + + } + + private void btConfiguracion_MouseLeave(object sender, EventArgs e) + { + + } + + private void btPruebas_MouseLeave(object sender, EventArgs e) + { + + } + #endregion leave botones + + //btn crear pfx + #region btn crear pfx + private void btnPFX_Click(object sender, EventArgs e) + { + crear_pfx(); + } + #endregion btn crear pfx + + //btn actualiza cfdi + #region btn actualiza cfdi + private void btnActCFDI_Click(object sender, EventArgs e) + { + if(!cfdi33_update()) + { + MessageBox.Show("No existen actualizaciones", SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + #endregion btn actualiza cfdi + + //btn actualizar sistema + #region btn actualizar sistema + private void btnActualizar_Click(object sender, EventArgs e) + { + string strErr = string.Empty; + strErr = CbActualizarSistema.SelectedItem == null ? strErr + "• Sistema\n" : strErr; + strErr = tbActualizarRuta.Text == null ? strErr + "• Ruta\n" : strErr; + strErr = !File.Exists(tbActualizarRuta.Text) && tbActualizarRuta.Text != null ? strErr + "• Ruta valida\n" : strErr; + if (string.IsNullOrEmpty(strErr)) + { + Actualiza res = Actualizar.Find(buscar => buscar.Nombre == CbActualizarSistema.SelectedItem.ToString()); + if (res == null) + { + Actualizar.Add(new Actualiza { + Nombre = CbActualizarSistema.SelectedItem.ToString(), + Ruta = tbActualizarRuta.Text + }); + } + + try + { + XElement apps = new XElement("apps"); + foreach (var act in Actualizar) + { + + XElement app = new XElement("app"); + app.Add(new XAttribute("nom", act.Nombre)); + app.Add(new XAttribute("rut", act.Ruta)); + apps.Add(app); + } + sys_arc(SysDir + "act.xml"); + XDocument xml = new XDocument( + apps + ); + xml.Save(SysDir + "act.xml"); + } + catch(Exception Ex) + { + SysErrores = "Error al guardar act.xml"; + sys_proceso_error(); + exe_err(Ex, "Act_XML"); + + } + string strOpc = CbActualizarSistema.SelectedItem.ToString().ToLower(); + string strDir = "/Herramientas/CFDI/" + strOpc + "/"; + publicar_aplicacion(Path.GetFileNameWithoutExtension(tbActualizarRuta.Text), Path.GetDirectoryName(tbActualizarRuta.Text) + "/", strDir); + } + else + { + MessageBox.Show("Por favor seleccione:\n" + strErr, SysNombre, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + #endregion btn actualizar sistema + + //fd actualizar ruta + #region fd actualizar ruta + private void tbActualizarRuta_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (fdAplicacion.ShowDialog() == DialogResult.OK) + { + tbActualizarRuta.Text = fdAplicacion.FileName; + } + } + #endregion fd actualizar ruta + + //cm actualizar + #region cm actualizar + private void CbActualizarSistema_SelectedIndexChanged(object sender, EventArgs e) + { + if(CbActualizarSistema.SelectedItem != null) + { + Actualiza res = Actualizar.Find(buscar => buscar.Nombre == CbActualizarSistema.SelectedItem.ToString()); + if (res != null) + { + tbActualizarRuta.Text = res.Ruta; + } + else + { + tbActualizarRuta.Text = string.Empty; + } + } + } + #endregion cm actualizar + + //bms btn anticipo + #region bms btn anticipo + private void btnBMSAntSqlCFDI_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "anticipo"; + ComprobanteDBAplicacion = "servicemanager"; + sys_verificar_rb(); + } + #endregion bms btn anticipo + + private void btnxml_Click(object sender, EventArgs e) + { + tst_xml(); + } + public XElement Addenda() + { + XElement Orden = new XElement("ordnen"); + Orden.Add(new XAttribute("orden", "1234")); + + return Orden; + + } + public void tst_xml() + { + //try + //{ + + // if (File.Exists("C:\\Proyectos\\CFDI\\CFDI\\bin\\Debug\\Test_t.xml") == false) + // { + // //*direcciones sin xsd **/ + // //declaracion ns (name seccion) xml Universal + // //xsi x shema instance + // XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; + + // //declaracion ns (name seccion) cfdi y se incluyen los complementos + // XNamespace cfdi = "http://www.sat.gob.mx/cfd/3"; + + // //elemento padre comprobante + // XElement Comprobante = new XElement(cfdi + "Comprobante"); + + + + // //agregar atributos para la generacion de la cadena original + // Comprobante.Add(new XAttribute("Version", "3.3"));//1 + // Comprobante.Add(new XAttribute("Fecha", "2018-05-10T13:20:00"));//2 + // Comprobante.Add(new XAttribute("Folio", "44444")); + // ComprobanteDBArchivo = SysDir + "Test.xml"; + // ConfigKeyRuta = @"C:\Aduanasoft\POVE_CSD\CSD_POVE881208CB0_20170905_134139.key"; + // ConfigKeyClave = "Soluciones01"; + // ConfigCertificadoRuta = @"C:\Aduanasoft\POVE_CSD\pove881208cb0.cer"; + // ComprobanteDBRutaSalida = ComprobanteDBRutaEntrada = @"C:\Aduanasoft\Facturas"; + + // //para llamar a la funcion cfdi33_sello se necesitan asginar los valores de las variables globales:ConfigKeyRuta, ConfigKeyClave,ConfigCertificadoRuta + // if (!string.IsNullOrEmpty(Comprobante_Sello)) + // { + // //en este se le agrega al comprobante el atributo Sello + // Comprobante.Add(new XAttribute("Sello", Comprobante_Sello));//3 + // } + // Comprobante.Add(new XAttribute("NoCertificado", "00001000000407444986"));//4 + + // var bytes = File.ReadAllBytes(ConfigCertificadoRuta); + // string base64 = Convert.ToBase64String(bytes); + // Comprobante.Add(new XAttribute("Certificado", base64));//5 + // Comprobante.Add(new XAttribute("SubTotal", "1"));//6 + // Comprobante.Add(new XAttribute("Moneda", "MXN"));//7 + // Comprobante.Add(new XAttribute("Total", "1.16"));//8 + // Comprobante.Add(new XAttribute("TipoDeComprobante", "I"));//9 + // Comprobante.Add(new XAttribute("MetodoPago", "PPD")); + // Comprobante.Add(new XAttribute("LugarExpedicion", "53125"));//10 + + // //definir ns (name seccion) xml Universal en comprobante + // Comprobante.Add(new XAttribute(XNamespace.Xmlns + "xsi", xsi)); + + // //localizacion de los xsd (direcciones de los xsd), sintaxis direccion sin extencion y archivo con extencion . + // //XNamespace schemaLocation = "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd http://www.sat.gob.mx/ine http://www.sat.gob.mx/sitio_internet/cfd/ine/INE11.xsd"; + // XNamespace schemaLocation = "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"; + // Comprobante.Add(new XAttribute(xsi + "schemaLocation", schemaLocation)); + + // //atributos de nombre de seccion + // //definir ns (name seccion) cfdi en comprobante + // Comprobante.Add(new XAttribute(XNamespace.Xmlns + "cfdi", cfdi)); + + + // XElement Emisor = new XElement(cfdi + "Emisor"); + // Emisor.Add(new XAttribute("Rfc", "POVE881208CB0")); + // Emisor.Add(new XAttribute("Nombre", "Edgar Ramon POsada Valles")); + // Emisor.Add(new XAttribute("RegimenFiscal", "621")); + // Comprobante.Add(Emisor); + + + // XElement Receptor = new XElement(cfdi + "Receptor"); + // Receptor.Add(new XAttribute("Rfc", "SCO010611GVA")); + // Receptor.Add(new XAttribute("Nombre", "SWITCH CORPORATION S.A. DE C.V.")); + // Receptor.Add(new XAttribute("UsoCFDI", "P01")); + // Comprobante.Add(Receptor); + + // //partidas + // XElement conceptos = new XElement(cfdi + "Conceptos"); + + // XElement concepto = new XElement(cfdi + "Concepto"); + // concepto.Add(new XAttribute("ClaveProdServ", "25171708")); + // concepto.Add(new XAttribute("Cantidad", "1")); + // concepto.Add(new XAttribute("ClaveUnidad", "H87")); + // concepto.Add(new XAttribute("Descripcion", "*W.91.0014.00.05SHOE OE B515 WEB WITH SLOT DEBBUR20-5323-7847-1-91")); + // concepto.Add(new XAttribute("ValorUnitario", "1.00")); + // concepto.Add(new XAttribute("Importe", "1.00")); + + // XElement Impuestos = new XElement(cfdi + "Impuestos"); + // XElement Traslados = new XElement(cfdi + "Traslados"); + // XElement Traslado = new XElement(cfdi + "Traslado"); + // Traslado.Add(new XAttribute("Base", "1.00")); + // Traslado.Add(new XAttribute("Impuesto", "002")); + // Traslado.Add(new XAttribute("TipoFactor", "Tasa")); + // Traslado.Add(new XAttribute("TasaOCuota", "0.160000")); + // Traslado.Add(new XAttribute("Importe", "0.16")); + + // XElement TotalImpuestosTrasladados = new XElement(cfdi + "Impuestos"); + // TotalImpuestosTrasladados.Add(new XAttribute("TotalImpuestosTrasladados", "0.16")); + // XElement Traslados_Totales = new XElement(cfdi + "Traslados"); + // XElement Traslado_Totales = new XElement(cfdi + "Traslado"); + // Traslado_Totales.Add(new XAttribute("Impuesto", "002")); + // Traslado_Totales.Add(new XAttribute("TipoFactor", "Tasa")); + // Traslado_Totales.Add(new XAttribute("TasaOCuota", "0.160000")); + // Traslado_Totales.Add(new XAttribute("Importe", "0.16")); + + + // Traslados.Add(Traslado); + // Impuestos.Add(Traslados); + // concepto.Add(Impuestos); + + // Traslados_Totales.Add(Traslado_Totales); + // TotalImpuestosTrasladados.Add(Traslados_Totales); + + // conceptos.Add(concepto); + // Comprobante.Add(conceptos); + // Comprobante.Add(TotalImpuestosTrasladados); + + // if (string.IsNullOrEmpty(Comprobante_Sello)) + // { + // //guardar para cadena orignal + // XDocument xml_ = new XDocument( + // Comprobante + // ); + // xml_.Save(SysDir + "Test.xml"); + // Comprobante_CadenaOriginal = cfdi33_cadena_original(); + // MessageBox.Show("cadena Original " + Comprobante_CadenaOriginal); + // Comprobante_Sello = cfdi33_sello(); + // tst_xml(); + // return; + + // } + // //guardar para sello + // XDocument xml_1 = new XDocument( + // Comprobante + // ); + // xml_1.Save(SysDir + "Test.xml"); + + // if (!string.IsNullOrEmpty(Comprobante_Sello)) + // { + // //asignar valores para timbrado + // CFDIPacUsr = "SCT050708EB2"; + // CFDIPacPwd = "wwjrzykhi"; + // ComprobanteDBArchivoTimbrado = "Test_t.xml"; + // XDocument xml = new XDocument( + // Comprobante + // ); + // xml.Save(SysDir + "Test_t.xml"); + // bool timbreFiscal = edicom_timbrado(); + // if (timbreFiscal) + // { + // //cfdi33_xml(); + // //complemento + // XNamespace schemaLocation_ = "http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd"; + // XNamespace tfd = "http://www.sat.gob.mx/TimbreFiscalDigital"; + + // //elemento Coplemento + // XElement Complemento = new XElement(cfdi + "Complemento"); + + // XElement Complemento_TimbreFiscalDigital = new XElement(tfd + "TimbreFiscalDigital"); + // Complemento_TimbreFiscalDigital.Add(new XAttribute(XNamespace.Xmlns + "tfd", tfd)); + // Complemento_TimbreFiscalDigital.Add(new XAttribute(xsi + "schemaLocation", schemaLocation_)); + // Complemento_TimbreFiscalDigital.Add(new XAttribute("Version", "1.1")); + // Complemento_TimbreFiscalDigital.Add(new XAttribute("UUID", Complemento_TimbreFiscalDigital_UUID)); + // Complemento_TimbreFiscalDigital.Add(new XAttribute("FechaTimbrado", Complemento_TimbreFiscalDigital_FechaTimbrado)); + // Complemento_TimbreFiscalDigital.Add(new XAttribute("RfcProvCertif", Complemento_TimbreFiscalDigital_RfcProvCertif)); + // Complemento_TimbreFiscalDigital.Add(new XAttribute("SelloCFD", Complemento_TimbreFiscalDigital_SelloCFD)); + // Complemento_TimbreFiscalDigital.Add(new XAttribute("NoCertificadoSAT", Complemento_TimbreFiscalDigital_NoCertificadoSAT)); + // Complemento_TimbreFiscalDigital.Add(new XAttribute("SelloSAT", Complemento_TimbreFiscalDigital_SelloSAT)); + + // Complemento.Add(Complemento_TimbreFiscalDigital); + // Comprobante.Add(Complemento); + + // //Guardar el comprobante + // try + // { + // XDocument cfdi33 = new XDocument( + // Comprobante + // ); + // cfdi33.Save(SysDir + ComprobanteDBArchivoTimbrado); + // } + // catch (Exception Ex) + // { + // exe_err(Ex, "Gua_XML_TIM"); + // } + + // } + + + // MessageBox.Show("timbre "); + + // } + + // } + // else + // { + + // ComprobanteDBRutaSalida = "C:\\Proyectos\\CFDI\\CFDI\\bin\\Debug\\Cancelar_t.xml"; + // ComprobanteDBOperacion = "cancelar"; + // ComprobanteDBRutaEntrada = SysDir + ComprobanteDBArchivoTimbrado; + // ComprobanteDBTipoComprobante = "factura"; + + // Comprobante_Fecha = "2018-05-10T13:20:00"; + // MessageBox.Show(Comprobante_Fecha); + // bool cancela = edicom_cancelar(true); + // MessageBox.Show("extsite archivo"); + // } + //} + + //catch (Exception Ex) + //{ + // SysErrores = "Error al guardar act.xml"; + // sys_proceso_error(); + // exe_err(Ex, "Test_XML"); + + //} + } + + public void tst_xml_ine() + { + try + { + double douValor = 110.56856922; + + //*direcciones sin xsd **/ + //declaracion ns (name seccion) xml Universal + //xsi x shema instance + XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; + + //declaracion ns (name seccion) cfdi y se incluyen los complementos + XNamespace cfdi = "http://www.sat.gob.mx/cfd/3"; + + //declaracion ns (name seccion) ine + XNamespace INE_ = "http://www.sat.gob.mx/ine"; + + //elemento padre comprobante + XElement Comprobante = new XElement(cfdi + "Comprobante"); + + //agregar atributos para la generacion de la cadena original + Comprobante.Add(new XAttribute("Version", "3.3"));//1 + Comprobante.Add(new XAttribute("Fecha", "2018-05-10T13:20:00"));//2 + + ComprobanteDBArchivo = SysDir + "Test.xml"; + Comprobante_CadenaOriginal = cfdi33_cadena_original(); + ConfigKeyRuta = @"C:\Aduanasoft\POVE_CSD\CSD_POVE881208CB0_20170905_134139.key"; + ConfigKeyClave = "Soluciones01"; + ConfigCertificadoRuta = @"C:\Aduanasoft\POVE_CSD\pove881208cb0.cer"; + ComprobanteDBRutaSalida = ComprobanteDBRutaEntrada = @"C:\Aduanasoft\Facturas"; + //para llamar a la funcion cfdi33_sello se necesitan asginar los valores de las variables globales:ConfigKeyRuta, ConfigKeyClave,ConfigCertificadoRuta + Comprobante_Sello = cfdi33_sello(); + //en este se le agrega al comprobante el atributo Sello + Comprobante.Add(new XAttribute("sello", Comprobante_Sello));//3 + XDocument xml_s = new XDocument( + Comprobante + ); + Comprobante.Add(new XAttribute("NoCertificado", "00001000000407444986"));//4 + + var bytes = File.ReadAllBytes(ComprobanteDBArchivo); + string base64 = Convert.ToBase64String(bytes); + Comprobante.Add(new XAttribute("Certificado", base64));//5 + Comprobante.Add(new XAttribute("SubTotal", "120"));//6 + Comprobante.Add(new XAttribute("Moneda", "MXN"));//7 + Comprobante.Add(new XAttribute("Total", "250"));//8 + Comprobante.Add(new XAttribute("TipoDeComprobante", "I"));//9 + Comprobante.Add(new XAttribute("LugarExpedicion", "53125"));//10 + + //definir ns (name seccion) xml Universal en comprobante + Comprobante.Add(new XAttribute(XNamespace.Xmlns + "xsi", xsi)); + + //localizacion de los xsd (direcciones de los xsd), sintaxis direccion sin extencion y archivo con extencion . + //XNamespace schemaLocation = "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd http://www.sat.gob.mx/ine http://www.sat.gob.mx/sitio_internet/cfd/ine/INE11.xsd"; + XNamespace schemaLocation = "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"; + Comprobante.Add(new XAttribute(xsi + "schemaLocation", schemaLocation)); + + //atributos de nombre de seccion + //definir ns (name seccion) cfdi en comprobante + Comprobante.Add(new XAttribute(XNamespace.Xmlns + "cfdi", cfdi)); + + /* + + + + + + + + + + + + + + + + + + + */ + //definir ns (name seccion) Ine en comprobante + //Comprobante.Add(new XAttribute(XNamespace.Xmlns + "ine", INE_)); + + XElement Emisor = new XElement(cfdi + "Emisor"); + Emisor.Add(new XAttribute("RFC", "POVE909809809")); + Emisor.Add(new XAttribute("Nombre", "Edgar Ramon POsada Valles")); + Emisor.Add(new XAttribute("RegimenFiscal", "621")); + Comprobante.Add(Emisor); + // + + + XElement Receptor = new XElement(cfdi + "Receptor"); + Receptor.Add(new XAttribute("RFC", "SCO010611GVA")); + Receptor.Add(new XAttribute("Nombre", "SWITCH CORPORATION S.A. DE C.V.")); + Receptor.Add(new XAttribute("UsoCFDI", "P01")); + Comprobante.Add(Receptor); + // < cfdi:Receptor Rfc = "SCO010611GVA" Nombre = "SWITCH CORPORATION S.A. DE C.V." UsoCFDI = "P01" /> + + XElement concepto = new XElement(cfdi + "Concepto"); + concepto.Add(new XAttribute("ClaveProdServ", "84111506")); + concepto.Add(new XAttribute("Cantidad", "1")); + concepto.Add(new XAttribute("ClaveUnidad", "ACT")); + concepto.Add(new XAttribute("Descripcion", "Anticipo de bien o servicio")); + concepto.Add(new XAttribute("ValorUnitario", douValor.ToString("n4"))); + concepto.Add(new XAttribute("Importe", "100.00")); + + XElement Impuestos = new XElement(cfdi + "Impuestos"); + + XElement Traslados = new XElement(cfdi + "Traslados"); + + XElement Traslado = new XElement(cfdi + "Traslado"); + Traslado.Add(new XAttribute("Base", "100.00")); + Traslado.Add(new XAttribute("Impuesto", "002")); + Traslado.Add(new XAttribute("TipoFactor", "Tasa")); + Traslado.Add(new XAttribute("TasaOCuota", "0.160000")); + Traslado.Add(new XAttribute("Importe", "16.00")); + Traslados.Add(Traslado); + Impuestos.Add(Traslados); + concepto.Add(Impuestos); + Comprobante.Add(concepto); + + XElement Complemento_INE = new XElement(INE_ + "INE"); + + + XElement Contabilidad = null; + XElement Entidad = new XElement(INE_ + "Entidad");// papa + + Entidad.Add(new XAttribute("ClaveEntidad", "CHH")); //hijo + + + Contabilidad = new XElement(INE_ + "Contabilidad"); //hijo opcional + Contabilidad.Add(new XAttribute("IdContabilidad", 356789)); + + + Entidad.Add(new XAttribute("Ambito", "Local")); //hijo opcional + Entidad.Add(Contabilidad); + Complemento_INE.Add(Entidad); + + XElement Complemento = new XElement(cfdi + "Complemento"); + Complemento.Add(Complemento_INE); + //Comprobante.Add(Complemento); + + XDocument xml = new XDocument( + Comprobante + ); + xml.Save(SysDir + "Test.xml"); + + + xml_s.Save(SysDir + "Test_s.xml"); + + //asignar valores para timbrado + CFDIPacUsr = "SCT050708EB2"; + //CFDIPacPwd = "wwjrzykhi"; + CFDIPacPwd = "Soluciones28@"; + ComprobanteDBArchivoTimbrado = "Test_s.xml"; + Emisor_Rfc = "POVE881208CB0"; + edicom_timbrado(); + } + catch (Exception Ex) + { + SysErrores = "Error al guardar act.xml"; + sys_proceso_error(); + exe_err(Ex, "Test_XML"); + + } + } + + private void button1_Click(object sender, EventArgs e) + { + //constructor + cfdi33_constructor(); + + //asingacion manual de parametros + ComprobanteDBTipoComprobante = "anticipo_egreso"; + ComprobanteDBAplicacion = "servicemanager"; + sys_verificar_rb(); + } + + public void GenerarAddenda() + { + try + { + if (File.Exists( ComprobanteDBArchivoTimbrado)) + { + StreamReader reader = new StreamReader(ComprobanteDBArchivoTimbrado); + XPathDocument myPathDoc = new XPathDocument(reader); + + XslCompiledTransform myXslTrans = new XslCompiledTransform(); + myXslTrans.Load(ComprobanteDBArchivoTimbrado); + + + } + + } + catch (Exception) + { + + throw; + } + //MessageBox.Show(ComprobanteDBArchivoTimbrado); + } + + private void checkBox1_CheckedChanged(object sender, EventArgs e) + { + + } + + private void cbCTCliente_SelectedIndexChanged(object sender, EventArgs e) + { + + } + + private void txtResult_TextChanged(object sender, EventArgs e) + { + + } + } +} diff --git a/CFDI/CFDI.csproj b/CFDI/CFDI.csproj new file mode 100644 index 0000000..6c1a7d4 --- /dev/null +++ b/CFDI/CFDI.csproj @@ -0,0 +1,171 @@ + + + + + Debug + AnyCPU + {0ACB8D28-684B-4043-9756-FDBD2E4B6FEB} + WinExe + CFDI + CFDI + v4.0 + 512 + + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + ico.ico + + + + ..\packages\Costura.Fody.1.6.2\lib\portable-net+sl+win+wpa+wp\Costura.dll + False + + + False + bin\Debug\cte_cancV4.dll + False + + + ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll + + + ..\packages\QrCode.Net.0.4.0.0\lib\net40\Gma.QrCodeNet.Encoding.dll + + + ..\packages\Newtonsoft.Json.13.0.2\lib\net40\Newtonsoft.Json.dll + + + + + + + + + + + + + + + Form + + + CFDI.cs + + + + + + CFDI.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 + false + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/CFDI/CFDI.resx b/CFDI/CFDI.resx new file mode 100644 index 0000000..a8e234d --- /dev/null +++ b/CFDI/CFDI.resx @@ -0,0 +1,1799 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 161, 17 + + + 272, 17 + + + 25 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA////Af///wH///8B////AUA9PDk9OjqdQDw63UxDNvtMQjf5Pzw62T06OpVAPDwt////Af// + /wH///8B////Af///wH///8BQT4+DT06OqVdTDH/nnAg/8SFF//JiBb/yYgV/8OIJP+eeUf/V0kz/T07 + OpNFQ0IH////Af///wH///8BPz09Dz47OcuMZx//y4sL/8yLC//Miwv/zIsL/8+TJ//aqnX/2KZl/8qK + DP+AYCP/PDo6uUNBQQf///8B////ATw6OqmNaB7/z40H/8+NB//PjQf/z40H/8+NB//VnkD/3K12/9yt + dv/Slyj/zo0H/39gI/88OjqP////ATw6Oj9gTy3/0JAE/9GQBP/RkAT/0ZAE/9GQBP/RkAT/05UW/92u + cP/dr3T/3Kxp/9KTD//OjgX/VEgx+z06Oic8Ojqlp3gS/9SSAf/UkgH/1JIB/9SSAf/UkgH/1JIB/9SS + Af/YnSf/37Bv/9+xcP/cqlX/1JIC/5hvGP88OjqLQT0459KSAv/XlQD/15UA/9eVAP/XlgT/2Zwa/9qe + If/YmAz/15UA/9ylOf/hsm3/4bJt/9qeIf/Hiwb/PDo5zVJHMv/ZmAD/2ZgA/9mYAf/epjX/4rNj/+K1 + af/is2H/4a9S/+GvVP/is2P/4rVp/+KzY//anhT/2JgA/0M+N+1iWEP/3qIX/+ClI//ks1D/6L99/+W3 + Yv/ks1L/5LJP/+KtPf/irkH/4q5C/+KsOf/gpSL/36IZ/96hFP9STUbtgn955+OxQf/pvWP/68eI/+zJ + kP/ns0H/57M//+ezP//nsz//57M//+ezP//nsz//57M//+ezP//crUb/f317zX58e6XKqFn/68Bi/+7L + jf/vzJH/6btQ/+i4Q//puEL/6LU3/+i1N//otTf/6LU3/+i1N//otTf/vp9T/399fIt+fHs9mo96/+/N + kP/vzpD/786Q/+/OkP/vzpD/7cZt/+q4M//qty//6rcv/+q3L//qty//6LYw/5CGb/t/fXwn////AX59 + e6e/q4b/8c+O//HPjv/xz47/8c+O//HPjv/wynn/7Lop/+y5Jv/suSb/7Lkm/7GZVf9/fXyN////Af// + /wF/fXwNgH58yb+shf/x0Iz/8tGM//LRjP/y0Yz/8tGM/+/DR//tux//7Log/7ObUP9/fXy3gX5+B/// + /wH///8B////AX99fA1/fXyhm5J//9G5hv/vz4n/89OJ//PSif/sxVj/yqc8/5WJaf1/fXyRgX99B/// + /wH///8B////Af///wH///8B////AX99fDV/fXybg4B8246IfvmNiH73gn981X99fJN/fXwr////Af// + /wH///8B////AQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AURAPhdBPjxlPzw7oz88OtE8OjnxPDk6/zw6 + Ov09OjrrPjs6y0A9O5lBPjxVSkQ/Df///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AURAPzM/PDutPDk6+zw6Ov89Ojn/RkA4/1hJ + Nf9hTjL/YE4z/1VINf9DPjn/PDo5/zw5Ov88OjrzPzw7lURAPx////8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUVCQRM+PDufOzk6/Tw6Of9ZSjP/jWcn/7R8 + Hv/Hhxj/yIcY/8iHGP/Ihxj/yIcY/8WGGf+teB//hGMt/1BHP/88OTn/PDo69z88PH9TUE0F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFBPj41PTo64Tw5Ov9YSjP/pXQe/8qI + E//KiBP/yogT/8qIE//KiBP/yogT/8qIE//KiBP/yokX/9GXQv/Yp3H/zpU+/5dsIv9MQzb/PDo6/z06 + OsdFQ0Ib////Af///wH///8B////Af///wH///8B////Af///wH///8BQD09RTw6OvU+Ozn/hWMk/8mJ + Dv/Lig3/y4oN/8uKDf/Lig3/y4oN/8uKDf/Lig3/y4oN/86QIP/Zp2v/26t5/9uref/TmkL/y4oN/8OG + EP9wVyv/PDk6/zw6OuFBPz4l////Af///wH///8B////Af///wH///8B////AT89PTc8Ojr1QTw4/59y + Gf/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAr/2KZl/9useP/brHj/26x4/9il + Yf/NjAn/zYwI/8yLCf+HZSH/PDo6/zw6Ot9DQUEZ////Af///wH///8B////Af///wFCPz8VPDo65T47 + Of+gcxj/zo0H/86NB//OjQf/zo0H/86NB//OjQf/zo0H/86NB//OjQf/zo0H/8+QEv/crHX/3K13/9yt + d//crXf/3K13/9KWKf/OjQf/zo0H/86NB/+FYyL/PDo6/zw6OsFOSUkF////Af///wH///8B////AT07 + O6k8OTr/iGYg/8+OBv/Pjgb/z44G/8+OBv/Pjgb/z44G/8+OBv/Pjgb/z44G/8+OBv/Pjgb/0JAK/9ur + bv/crXX/3K11/9ytdf/crXX/2qll/9CQDf/Pjgb/z44G/8+OBv9rVSr/Ozk5/z07O3X///8B////Af// + /wE9Ozs9PDo6/11NL//Njgb/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/QkAX/2KJG/92udf/ernX/3q51/96udf/ernX/2aNM/9GQBf/RkAX/0ZAF/8OJCv9HQDb/PDo68z06 + Ohf///8B////ATw6Ork9Ojn/rXwR/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GR + A//RkQP/0ZED/9GRA//Skwz/3Kxl/92wc//dsHP/3bBz/92wc//dsHL/1p4x/9GRA//RkQP/0ZED/5Bq + HP88OTn/PTo6hf///wE+PDwjOzk6/V9OLv/SkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/VmBj/3q5p/9+wcf/fsHH/37Bx/9+wcf/esG3/1ZgZ/9OR + Av/TkQL/y40F/0dANv88OjrpOzs7BTw6OnU8OTr/mHAZ/9STAP/UkwD/1JMA/9STAP/UkwD/1JMA/9ST + AP/UkwD/1JMA/9STAP/UkwD/1JMA/9STAP/UkwD/1JMA/9STAP/Xmhv/3rBq/9+ycP/fsnD/37Jw/9+y + cP/drV7/1ZQE/9STAP/UkwD/eF4k/zw5Ov89OztBPDo6tz07Of/Eigj/1pQA/9aUAP/WlAD/1pQA/9aU + AP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/ZnSD/4LJs/+Gy + bv/hsm7/4bJu/+Cybv/boTD/1pQA/9aUAP+neBP/Ozo5/zw6OoM8OjrnT0Uz/9WVAf/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15YB/9iaD//boSr/3aY9/96oRf/dpj//26Eq/9iYCP/XlQD/15UA/9eW + Af/grVj/4rJs/+KybP/ismz/4rJs/9+rUv/XlQD/15UA/8aMB/8+Ozn/PDk5szw6Ov9jUSz/2JcA/9iX + AP/YlwD/2JcA/9iXAP/YlwD/2JcB/9uhIv/frlH/4bRp/+G0av/htGr/4bRq/+G0av/frVH/3qk+/96o + PP/fqkX/365S/+G0af/htGr/4bRq/+G0av/htGr/3qpH/9iXAP/YlwD/1pYB/0U/N/88OjrTPDo6/25Y + KP/ZmQD/2ZkA/9mZAP/ZmQD/2ZkA/9qaBv/grEf/47Zo/+O2af/ktmn/5LZp/+S2af/ktmn/4a1J/+Gv + Uf/ktmn/47Zp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZo/+GvUf/anAz/2ZkA/9mZAP/ZmQD/TkU0/zs5 + OeE8Ojr/b1go/9uZAP/bmQD/25kA/9uZAP/cmgP/4q9O/+S2aP/ktmj/5LZp/+S0YP/isVP/5LZl/+S3 + av/gqjj/4Kk4/9+oMv/gqjr/4atA/+GsQ//hrEL/4Ko7/9+mLf/dnxX/25kB/9uZAP/bmQD/25kA/9uZ + AP9ORTT/Ozk54VxaWv+CclL/4qks/+KrMf/jrDb/5bZW/+a5Xv/ryJH/68iS/+vJk//pwXj/5LJI/+Sx + Rv/ls0r/5rZV/+SxRv/ksUX/5LFF/+SxRf/ksUX/5LFD/+SwQv/ksD//4689/+OuO//jrTj/46w0/+Kq + L//iqSv/4Kcn/2VgV/9XVVXRfnx75YuDdf/lskP/5rJC/+i5WP/qwnf/6sN9/+zKlP/sypT/68mR/+a0 + R//mskL/5rJC/+ayQv/mskL/5rJC/+ayQv/mskL/5rJC/+ayQv/mskL/5rJC/+ayQv/mskL/5rJC/+ay + Qv/mskL/5rJC/+ayQv/brUn/gH17/358e7F+fHy1gH17/9yuRP/ntD3/68N4/+i2Rv/rxH3/7cqU/+3K + lP/sx4f/57M9/+e0Pf/ntD3/57Q9/+e0Pf/ntD3/57Q9/+e0Pf/ntD3/57Q9/+e0Pf/ntD3/57Q9/+e0 + Pf/ntD3/57Q9/+e0Pf/ntD3/57Q9/8ijUf9+fXv/f318gX58e3N/fXv/v59U/+i4Rv/sxXn/57U5/+3H + gv/vzJP/78yT/+7LkP/otkD/57U5/+e1Of/ntTn/6LY+/+e1Of/ntTn/57U5/+e1Of/ntTn/57U5/+e1 + Of/ntTn/57U5/+e1Of/ntTn/57U5/+e1Of/ntTn/qZRi/399fP9/fXw/fnx7IX99fP2Yimz/679e/+3H + fP/rv1v/782Q/+/Nkf/vzZH/782R/+3HfP/qu0z/6bhA/+u/W//rv1z/6LU1/+i1Nf/otTX/6LU1/+i1 + Nf/otTX/6LU1/+i1Nf/otTX/6LU1/+i1Nf/otTX/6LU1/+OzOf+HgXf/f3x754B8fAX///8Bfnx7t399 + e//TtXP/782Q/+/NkP/vzZD/782Q/+/NkP/vzZD/782Q/+/NkP/vzZD/782Q/+7Ief/ptzT/6bcw/+m3 + MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3MP/ptzD/u55S/399e/9/fXyD////Af// + /wF+fHs7f318/5iPgP/tzY//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+7J + ev/ruz3/67ct/+u3Lf/rty3/67ct/+u3Lf/rty3/67ct/+u3Lf/rty3/67ct/+KzNP+IgnX/f3188X57 + exX///8B////Af///wF+fHulfn17/7uohv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HO + jv/xzo7/8c6O//DNiv/sv0f/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//ruSf/o5Fh/399 + fP9/fXxx////Af///wH///8B////AX59exN/fXzjgX98/8+2if/yz47/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//HOh//tvDD/7bok/+26JP/tuiT/7bok/+26JP/tuiT/7bok/7ec + UP9/fXv/f318v4R9fQP///8B////Af///wH///8B////AX99fDV/fXzzhIB8/8+2iP/x0I3/8tCN//LQ + jf/y0I3/8tCN//LQjf/y0I3/8tCN//LQjf/y0I3/8tCN/+/HXf/sux//7Lsf/+y7H//sux//7Lsf/+y7 + IP+5nkv/f317/399fN2Bfn4X////Af///wH///8B////Af///wH///8B////AX99fEF/fXzzgX98/7yp + hP/w0Iv/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8c9//+68IP/uvB//7rwf/+68 + H//ouCT/qZVZ/399e/9/fXzfgH59If///wH///8B////Af///wH///8B////Af///wH///8B////AX99 + fDF/fXzff318/5iQf//XvYf/8tGK//PSiv/z0or/89KK//PSiv/z0or/89KK//PSiv/z0Yj/774k/++8 + HP/tux7/yKc+/46Fb/9/fXz/f318w4F/fRn///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AYB9fBF/fXybf3x8/YB9fP+ZkH//xLCE/+XIh//y0oj/9NSJ//TUif/004n/9NOJ//DQ + g//dtDH/up9J/5CHbf9/fXv/f3189X99fHmHh4cF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGAfn0vf318p399fPl/fXz/gH18/4uGff+ZkH//oJWA/5+V + f/+Wjn7/iIR8/399e/9+fXv/f3187399fI+Bf34b////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8Bg4GBE399fF9/fXyff318zX99 + fOt/fXz5f31894B+fed/fXzFf318k399fE+JiIUJ////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAP// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFfWE8HSEI/MUdCP2k/PDudQj07xT06OuU8OTn3PDk6/zw6Ov08OjrzPjs63UE9PLlAPTuPR0M/WU5I + QiFpX1MD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFdU1ADSURAKT47O4U9OjrVPTo69zw6Ov87Ojr/PDo6/zw6Ov88OTr/PDo6/zw6Ov88Ojr/PDo6/zw5 + Ov88OTn/PDo5/z06Ou8+OjrBQT08aUpEQhf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUdBQC9APTypPTo69Tw5Of87OTn/Ozk5/zw6Of9BPDn/UEU3/2NQM/9vVjD/dFku/3RZ + L/9sVDH/Xk00/0pBOP8/Ozn/PDo5/zs5Of87OTn/Ozk5/z06OuVBPj2FSkRCE////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFLRkUZPzw7lTw5Ofs7OTr/PDo6/z06Of9TRzX/el0s/6JzI/+9ghz/yIcZ/8iH + Gf/Ihxn/yIcZ/8iHGf/Ihxn/yIcZ/8eHGf+2fh7/l20m/25WL/9JQTj/PDk6/zw5Ov88OTn/PDo67UI+ + PmlQTEcJ////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AUE+Pkk9OzvbPDo6/zs5Ov9APDn/YU8x/59xIv/Aghn/yIcW/8mH + Ff/Jhxb/yYcW/8mHFf/Jhxb/yYcW/8mHFv/Jhxb/yYcW/8mHFv/Jhxb/yYka/8yRNv/El2H/j2w1/1NG + Nf89Ojn/Ozk5/zw6Ov0+PDu3Qj8+I////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFZVVUDQD09cTw6Ovc8OTr/Ozk6/1RHNP+ecR//xoYU/8uI + Ev/LiBL/y4gS/8uIEv/LiBL/y4gS/8uIEv/LiBL/y4gS/8uIEv/LiBL/yogS/8qJE//PkjH/1qJg/9qq + ef/ZqXT/zY4i/8CCFv+HYyb/RT83/zs5Of87OTn/PDo640VDQjv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUZDQwc/PDyTPDo6/zw5Of9BPTj/fV4n/8WI + EP/Lig7/y4oO/8uKDv/Lig7/y4oO/8uKDv/Lig7/y4oO/8uKDv/Lig7/y4oO/8uKDv/Lig7/zI4a/9ah + W//bq3n/26t6/9urev/aqXb/zpIl/8uKDv/Lig7/uIAU/2NQL/89Ojn/PDk5/zw6OvM/PDxX////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BT0xMBT89PJU8Ojr9PDo6/0hB + Nv+abxz/yYkL/8yLCv/Miwr/zIsK/8yKCv/Migr/zIsK/8yKCv/Migr/zIsK/8yKCv/Migr/zIsK/8yL + Cv/NjRH/16Nd/9ureP/bq3j/26t4/9ureP/bq3j/0pk5/8yKCv/Miwr/zIsK/8SGDv99Xib/QDw4/zw6 + Ov88OjrxPjw8Vf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFaWloDPjw8dzw6 + Ov87OTn/SEA2/6l4Fv/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82M + CP/NjAj/zYwI/82MCP/SmDL/26x3/9useP/brHj/26x4/9useP/brHj/2KVg/82MCf/NjAj/zYwI/82M + CP/Kign/i2cg/zw6Of87OTn/PDo680NBQTf///8B////Af///wH///8B////Af///wH///8B////Af// + /wE/PT1RPDo6+Tw5Of9JQTb/q3oV/86MB//OjAf/zowH/86MB//OjAf/zYwH/86MB//OjAf/zYwH/86M + B//OjAf/zYwH/86MB//OjAf/zYwH/82MB//WoEz/3Kx4/9yseP/crXj/3Kx4/9yseP/crXj/3Kx2/9KX + K//OjQf/zYwH/82MB//OjAf/zYwI/4llIf8/Ozn/Ozk5/zw6Ot8+PDwf////Af///wH///8B////Af// + /wH///8B////AUA+Ph88OjrhPDo6/0E9OP+ccRr/zo0H/8+NB//PjQf/z40H/86NB//PjQf/z40H/86N + B//PjQf/z40H/86NB//PjQf/z40H/86NB//PjQf/z40H/8+NB//XoUr/3K12/9ytdv/crXb/3K12/9yt + dv/crXb/3K12/9mnYP/PkA//z40H/8+NB//PjQf/z40H/8uLCf94XCb/PDo5/zw6Ov89OzutQ0JCBf// + /wH///8B////Af///wH///8B////AT07O6M8OTn/PDk6/4BhI//Ojgb/0I4F/9COBf/QjgX/0I4F/8+O + Bf/PjgX/z44F/8+OBf/PjgX/z44F/8+OBf/PjgX/z44F/8+OBf/PjgX/z44F/8+OBf/UmzP/3K10/9us + dP/brHT/26x0/9usdP/brHT/26x0/9ytdf/Wn0H/0I8H/8+OBf/QjgX/z44F/9COBf/FiAr/XE0v/zs5 + Of87OTn7Pjw8Wf///wH///8B////Af///wH///8BPz09PTs6Ov88Ojr/Wksw/8mMCP/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9CQBf/RkAX/0ZAF/9CQBf/RkAX/0ZAF/9CQBf/RkAX/0ZAF/9CQBf/RkAX/0ZAF/9CP + Bf/RkxD/3Ktp/92udP/drnX/3a50/92udP/drnX/3a50/92udP/drXD/1Zop/9CPBP/RkAX/0I8E/9CP + BP/QkAX/s4AQ/0I9OP88OTr/PDo64z88PAv///8B////Af///wE+PT0HPDo6tzs6Ov9APDj/pncV/9GQ + BP/QkAT/0ZAE/9GQBP/QkAT/0ZAE/9GQBP/RkAT/0ZAE/9GQBP/RkAT/0ZAE/9GQBP/RkAT/0ZAE/9GQ + BP/RkAT/0ZAE/9GQBP/RkAT/1p42/92vc//er3T/3q90/96vc//er3T/3q90/96vc//er3T/3Kxn/9KV + E//RkAT/0ZAE/9GQBP/QkAT/0JAE/3xfJP88Ojn/PDo6/z07O2////8B////Af///wFAPj43PDo6+Tw6 + Ov9nUyv/zo8E/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KQAv/SkQL/0pAC/9KQAv/SkQL/0pAC/9KQ + Av/SkQL/0pAC/9KQAv/SkQL/0pAC/9KQAv/SkQP/0pIH/9qnVP/dr3L/3a9y/92vcv/dr3L/3a9y/92v + cv/dr3L/3bBz/9qoVf/Skwn/0pEC/9KQAv/SkAL/0ZAD/76FC/9LQjX/Ozk5/zw6OtU/PT0N////Af// + /wE8OjqbOzk5/z88Of+oeRP/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9SVDv/cqlv/3rBx/96w + cf/fsHH/3rBx/96wcf/fsHH/3rBx/96wcf/Zo0D/05IE/9ORAv/TkQL/05EC/9KRAv9+YCP/Ozk5/zs5 + Of89OztP////AUA+PBE8OjrjPDo6/1lKMP/MjgX/05IB/9OSAf/TkgH/05IB/9OSAf/TkgH/05IB/9OS + Af/TkgH/05IB/9OSAf/TkgH/05IB/9OSAf/TkgH/05IB/9OSAf/TkgH/05IB/9OSAf/TkgH/05IB/9OS + Av/VmBP/3axe/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/esGz/2J0n/9OSAf/TkgH/05IB/9OS + Af+2gQ7/QDw5/zw6Ov87OTmn////ATs5OUU8OTn7PDk5/4ZlIP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WT + AP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WT + AP/VkwD/1ZMA/9WTAP/VkwD/1pgU/96uYv/fsnD/37Jw/9+ycP/fsnD/37Jw/9+ycP/fsnD/3q9j/9WW + CP/VkwD/1ZMA/9WTAP/PkAP/XU0u/zw5Of88OjrjRUJCDzs5OYU8Ojr/PDo6/7SBD//WlAD/1pQA/9aU + AP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aU + AP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9ibF//fr2P/4LJu/+Cyb//hsm//4LJu/+Cy + b//hsm//4LJu/9ukPP/WlAH/1pQA/9aUAP/WkwD/hmUg/zs5Of88Ojr7PTs7Oz07O7k8Ojr/SEE2/82P + Bf/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlgH/15cF/9eXB//Xlwf/15YE/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/aoCn/4bJr/+Gz + bf/hs23/4bNt/+Gzbf/hs23/4bNt/9+vX//YmAr/15UA/9eVAP/XlQD/qnsS/zw6Of88Ojr/PTs7bTw6 + OuM8OTn/XU4v/9aVAf/YlgH/15UB/9eWAf/YlgH/15YB/9eWAf/YlgH/15YB/9eVAf/XlgH/15UB/9eW + Af/YmAf/2p4c/92lOv/fq07/4K5Z/+GvX//hr1//4K1Y/96pRv/boCX/2JgF/9eVAf/YlgH/2JYB/9eW + Af/anhz/4rFp/+KybP/ismz/4rJs/+KybP/ismz/4rJs/+Kyav/ZmxX/15UB/9eVAf/YlgH/xIoJ/0E8 + OP87OTn/PDk5lzw6Ov08Ojr/c1sn/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iX + AP/YlwH/2ZwR/92oPf/gsF7/4bNq/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+CzZ//frU//3KMs/9ug + Iv/cpC//3aU0/92oP//fsF3/4LNq/+Czav/htGv/4LNq/+Czav/htGv/4LNq/+CyZP/ZmxD/2JcA/9iX + AP/YlwD/1JUC/0ZANv88Ojr/PTo6tzw6Ov88OTr/gWQh/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mY + AP/ZmAD/2ZgA/9maCP/eqDr/47Ri/+O1af/jtWn/47Vp/+O1af/jtWn/47Vp/+O1af/jtWn/4rJd/92l + Lv/grEj/47Ri/+O1aP/jtWn/47Vp/+O1af/jtWn/47Vp/+O1af/jtWn/47Vp/+O1af/jtWn/47Vp/9+p + Pv/ZmAL/2ZgA/9mYAP/ZmAD/2ZgA/1FHM/88Ojr/PDo6yzw6Ov88OTn/iWkf/9mZAP/ZmQD/2ZkA/9qZ + AP/amQD/2pkA/9qZAP/amQD/250O/+GvUv/jtmj/5LVo/+S1aP/jtWj/5LVo/+S1aP/jtWj/5LVo/+S1 + aP/jtWf/3qYv/+KxWf/ktmj/5LVo/+S1aP/ktWj/5LVo/+S1aP/ktWj/5LVo/+S1aP/ktWj/5LVo/+S2 + aP/jtGH/36k5/9qbBf/ZmQD/2ZkA/9mZAP/ZmQD/2ZkA/1lMMf87OTn/Ozk51Tw6Ov88OTr/imkf/9uZ + AP/bmQD/25kA/9uZAP/bmQD/25kA/9uZAP/dnQ7/47JW/+S2Z//ktmf/5LVn/+S1Z//ktmf/5LVn/+S1 + Z//ktmf/5LVn/+S1Z//is1z/36k3/+GvTf/gq0D/4axE/+GvTf/isFP/4rJX/+OyWf/islr/4rJZ/+Kx + Vf/irkz/4Ko9/96kJv/cnAv/25kA/9uZAP/bmQD/25kA/9uZAP/bmQD/25kA/1lMMf88Ojr/Ozk51Tw6 + Ov8+Ozz/hWcl/9ybBf/cnAf/3Z0K/96eDf/enxD/3qEV/96iGf/ktVr/5755/+e/ev/ov3z/6MB+/+jA + f//mumz/47BK/+GsOP/jr0X/5rhk/+e9dP/ktFb/4ao0/+GoL//gqC3/4Kcs/+CnLP/hpyz/4acs/+Cn + K//gpyr/4KYm/9+lIv/fox3/3qIZ/96hFf/eoBL/3p4Q/96eDf/dnQr/3ZwH/92bBf/cmwT/3JsD/1NJ + NP88Ojr/PDo6y2poZ/1vbWz/m4dd/+SvPP/ksD7/5LBA/+SxQv/ltlL/6MB0/+a4Wv/ryZL/68mU/+vJ + lP/sypT/68mU/+nCff/ls0r/5LJE/+WyRP/lskX/5LJF/+WzSP/lskX/5bJE/+SyRP/kskT/5LJE/+Sy + RP/kskT/5LJF/+SyRP/kskT/5LJE/+SyRP/kskT/5LJE/+SyRP/kskT/5LFD/+SxQf/ksED/5LA//+Sv + Pf/jrjn/4aw3/3ZwZv9pZ2b/ZGJhtX58e+N+fHv/lYlw/+WyQ//mskL/5rJC/+azRf/qw37/6cF0/+m/ + b//sypT/7MmU/+vJk//sypT/68mS/+e2Tv/mskL/5rJC/+ayQv/mskL/5rJC/+ayQv/mskL/5rJC/+ay + Qv/mskL/5rJC/+ayQv/mskL/5rJC/+ayQv/mskL/5rJC/+ayQv/mskL/5rJC/+ayQv/mskL/5rJC/+ay + Qv/mskL/5rJC/+ayQv/mskL/2axK/4J+ev9/fXz/fnx7lX99fLd/fXz/h4F3/+CwRP/ns0D/57NA/+i5 + WP/rx4j/57ZM/+rBdf/sypT/7MqU/+zKlP/sypT/68aG/+ezQP/ns0D/57NA/+ezQP/ns0D/57NA/+ez + QP/ns0D/57NA/+ezQP/ns0D/57NA/+ezQP/ns0D/57NA/+ezQP/ns0D/57NA/+ezQP/ns0D/57NA/+ez + QP/ns0D/57NA/+ezQP/ns0D/57NA/+ezQP/ns0D/yaRS/399e/9/fXz/f318a358e4N+fXv/f317/9Ko + Sv/otDz/6LQ8/+zEeP/qvmP/57Q8/+vCcP/ty5T/7cuU/+3LlP/ty5T/7MWA/+e0PP/otDz/57Q8/+e0 + PP/otDz/57Q8/+e0PP/otDz/57Q8/+e0PP/otDz/57Q8/+e0PP/otDz/57Q8/+e0PP/otDz/57Q8/+e0 + PP/otDz/57Q8/+e0PP/otDz/57Q8/+e0PP/otDz/57Q8/+e0PP/nszz/sphe/359e/9+fHv7f318O317 + ekN+fHz7f317/7KYXP/ntDr/6LhH/+7Kjf/ouEj/57Q6/+zDdP/vy5T/7suU/+7Lk//vy5T/7smM/+e1 + Pf/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0 + Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/jsjz/lolv/399 + fP9/fXzjg4CAD3x5eQ9+fHvhf317/5SIb//jsjv/679h/+7Kif/otz7/6Lc+/+7Jh//vzJL/78yS/+/M + kv/vzJL/7syR/+vAYv/otTr/6LU3/+i1OP/otTf/6Lc//+q+Xf/ntTf/6LU4/+i1OP/otTj/6LU4/+i1 + OP/otTj/6LU4/+i1OP/otTj/6LU4/+i1OP/otTj/6LU4/+i1OP/otTj/6LU4/+i1OP/otTj/6LU4/+i1 + OP/Uq0b/gn56/398fP9/fHuj////Af///wF+fHuZf318/4F+ev/Mp0n/7cZ1/+/Mjv/rwF//7cVz/+/N + kf/vzZH/782R/+/Nkf/vzZH/782R/+/Nj//sxHD/6rxR/+m5RP/qu0v/7cZ0/+3Fcv/ptTX/6bU0/+m1 + NP/ptTT/6bU0/+m1NP/ptTT/6bU0/+m1NP/ptTT/6bU0/+m1NP/ptTT/6bU0/+m1NP/ptTT/6bU0/+m1 + NP/ptTT/6bU0/+m1NP+vl13/f317/358e/9/fHtL////Af///wF/fHs1fn17+X59e/+ejmf/68d8/+/N + kf/vzZH/782R/+/Nkf/vzZH/782R/+/Nkf/vzZH/782R/+/Nkf/vzZH/782R/+/NkP/vzZH/782Q/+7K + g//quT7/6bYx/+m2Mf/ptjH/6bYx/+m2Mf/ptjH/6bYx/+m2Mf/ptjH/6bYx/+m2Mf/ptjH/6bYx/+m2 + Mf/ptjH/6bYx/+m2Mf/ptjH/6bYx/9uvPP+Jg3X/fn18/399fNOAfn0N////Af///wF8fHsFfnx7s399 + fP+Cf3r/0LaE/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/O + j//vzo//786P/+/Nj//tyHn/6ro9/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3 + L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/6+XWv9/fXv/f3x8/399fGv///8B////Af// + /wH///8Bf3t7OX58e/1/fHz/l46A/+vLj//wz5D/8M+Q//DPkP/wz5D/8M+Q//DPj//wz5D/8M+P//DP + j//wz5D/8M+P//DPj//wz5D/8M+P//DPj//wzpD/78yE/+zAT//ruC7/67gs/+u4LP/ruCz/67gs/+u4 + LP/ruCz/67gs/+u4LP/ruCz/67gs/+u4LP/ruCz/67gs/+u4LP/ruCz/2K47/4N/ef9/fXv/f3183316 + egn///8B////Af///wH///8B////AX98fJ1/fXz/fn17/7Wkhf/vzY7/8M6O//DOjv/wzo7/8M6O//DO + jv/wzo7/8M6O//DOjv/wzo7/8M6O//DOjv/wzo7/8M6O//DOjv/wzo7/8M6O//DOjf/uxmn/67ot/+u5 + J//ruSf/67kn/+u5J//ruSf/67kn/+u5J//ruSf/67kn/+u5J//ruSf/67kn/+u5J//jtS7/mItp/399 + fP9/fXz7gH18Vf///wH///8B////Af///wH///8B////AX58ex1+fXvdfn17/4SBfP/NtYn/8c+O//HP + jv/xz47/8c+O//HPjv/xz47/8c+O//HPjv/xz47/8c+O//HPjv/xz47/8c+O//HPjv/xz47/8c+O//HP + jv/xz43/7sVf/+y6KP/suSf/7Lkm/+y5Jv/suSb/7Lkm/+y5Jv/suSb/7Lkm/+y5Jv/suSb/7Lkm/+q4 + KP+vl1f/f317/399fP9/fXyngoCABf///wH///8B////Af///wH///8B////Af///wF/fXxNf3189399 + e/+KhX3/2L2K//LPjv/xz47/8s+N//HPjf/xz43/8c+N//HPjf/xz43/8c+N//HPjf/xz43/8c+N//HP + jf/xz43/8c+N//LPjf/y0I7/8c+L/+6/Pf/tuiP/7boj/+26I//suiP/7boj/+26I//suiP/7boj/+26 + I//suiP/7bok/7qeTf+Bfnr/fn17/399fNuBfn0b////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf3x8cX58e/9/fXz/ioV9/9e8iv/xz43/8dCN//LQjf/y0I3/8tCN//LQjf/y0I3/8tCN//LQ + jf/y0I3/8tCN//LQjf/y0I3/8tCN//LQjf/x0I3/8tCN//DKb//suyL/7Lsf/+y7H//sux//7Lsf/+y7 + H//sux//7Lsf/+y7H//quSH/vaBI/4B+ev9/fXz/f3188YF+fjP///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BhYCAA399fI1/fXz9f318/4qFff/Ntof/8dCM//LRjP/y0Yz/8tGM//LR + jP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LQh//uvzP/7bwf/+28 + H//tvB//7bwf/+28H//tvB//7bwf/+i5JP+zm1H/gn95/359fP9/fXzxf359T////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AX5+ewd/fX2Lfn18/X59fP+EgXz/taWD/+3O + iv/x0Yr/8dGK//HRiv/x0Yr/8dGK//HRiv/x0Yr/8dGK//HRiv/x0Yr/8dGK//LSi//y0ov/8tKL//HR + i//wxUv/77se/++8Hv/vvB7/77we/++8Hv/uvB7/4LQq/5+PYv+AfXv/f318/399fPGAfn1R////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGIg4MDf318a399 + fPV/fXz/f318/5aOf//Suof/8M+L//PSi//z0ov/89GL//PSi//z0ov/89GL//PSi//z0ov/89GL//PR + i//z0ov/89KL//PRi//xyVz/770c/++8HP/vvBz/77wc/+i4I/++oUj/ioNz/358fP9/fXz/f31834F/ + fTX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AYB/fUV/fXvXf318/399fP+Cf3z/oJWA/9K6hf/tzoj/89KJ//PTif/z04n/89OJ//PT + if/z04n/89OJ//PSif/z04n/89KJ//PSif/yyVv/770a/++8G//ltiT/wqND/5OIa/9/fXv/f317/358 + fPt/fXyxgYB+H////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGAfnwXgH59jX58e/t/fHz/f317/4F+fP+TjH7/taWC/9i/ + hv/qzIj/8tOJ//TTif/01In/89OJ//TUif/004n/9NOJ//HSif/lv1T/zKk6/6mVWP+LhHL/f317/399 + e/9/fXv/f3186YB+fWF+fHwH////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYKAfil/fXyff3188X99 + fP9/fXz/f318/399fP+Hg3z/lIx+/6OYgP+tn4H/sqKC/7Gigf+rnYH/n5R//5CKfv+EgHv/f318/359 + e/9/fXz/f318/399fOF/fXx9hIOBEf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGIhYUDg4KBI4B+fX1/fXzPf3189X99fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fO2AfXy5gYB+YYKAfxP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGHh4UFf318K4B+fWN/fXyVgX9+vYB+fd1/fXzxf317+X99 + fPd/fXzrgX9+1YB+fbOAfn2HgH59UYB/fR3///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AYBhYQNfV00tRT87Y0I+PZFEPzu3Pjo61zw5Oe08Ojr7PDk6/zw6Ov88Ojr3PDo65UA8 + OstFQD2rQDw7f09GP09sY1gX////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFpYVEJQDw8UUI/PqM/PDvrPDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/UE+PM9BPTyDSkQ/Lf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVhPSyNCPjyRPDk67Tw6Ov88Ojr/PDo6/zw6Ov88Ojr/Ozo6/zw6 + Ov88Ojr/PDk6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88OTr/PDo5/zs6Ov88Ojr/PDk6/zw6 + Ov8/PDvNRT8+ZW1mXgn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTEVDJ0I+PqU8Ojr9PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/QDw5/0dAOP9bSzb/blYx/3xdLv+FYiz/iGMq/4dkLP+CYC3/d1ow/2dSM/9SRjf/Qj04/z47 + Of88Ojn/PDo6/zw6Ov88Ojr/PDo6/zw5Of8+OzvnQj8+b2dWTgn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFmXVgNPzw7jzw5Ovk7OTr/PDo6/zw6 + Ov88Ojr/PDo5/0lBOP9nUzH/kGko/655If/EhRv/yIca/8iHGv/Ihxr/yIca/8iHGv/Ihxr/yIca/8iH + Gv/Ihxr/yIca/72BHv+jcyP/f18s/1tLNP9APDr/PDo6/zw5Ov88OTr/PDo5/zs5Ov89OzrdR0JCUf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFFQkFFPzw74Tw6 + Ov88Ojr/PDo6/zw6Ov8+Ozn/WUo0/5JpJ/+7gBv/yIcX/8mHF//Jhxf/yYcX/8mHF//Jhxf/yYcX/8mH + F//Jhxf/yYcX/8mHF//Jhxf/yYcX/8mHF//Jhxf/yYgX/8mHF//Fhhn/sH8w/4JpUP9IQTn/PDo5/zw6 + Ov88Ojr/Ozo5/zw6Ov9BPTyrU1BNFf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AW5u + XAVAPj2JPDk6/Tw6Ov88Ojr/PDo6/z07Of9iTzH/onMg/8mIFf/JiBX/yYgV/8mIFf/JiBX/yYgV/8mI + Ff/JiBX/yYgV/8mIFf/JiBX/yYgV/8mIFf/JiBX/yYgV/8mIFf/JiBX/yYgV/8mIFf/Mjyn/055V/9mq + ef/WpGb/wYQb/4llKP9NQzb/PDk5/zw6Ov88Ojr/PDo6/zw6OuVEQUA/////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlVVRE+PDy7PDk6/zw6Ov88OTr/Ozk6/05ENv+abiL/x4cT/8uJEv/LiBL/y4gS/8uI + Ev/LiBL/y4gS/8uIEv/LiBL/y4gS/8uIEv/LiBL/y4gS/8uIEv/LiBL/y4gS/8uIEv/LiBH/yogS/82O + Iv/UnlP/2ql1/9ure//bq3r/1qNi/8uKFP/LiBH/vIAX/3lcK/8/PDn/PDo6/zw6Ov88Ojr/PDo5+0VD + Qmn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AUpFRRs9OzvVPDo6/zw6Ov88OTn/Pzs5/3VaK//BhhP/yooP/8uK + D//Lig//y4oP/8uKD//Lig//y4oP/8uKD//Lig//y4oP/8uKD//Lig//y4oP/8uKD//Lig//y4oP/8uK + D//Lig//y4wT/9ObRf/aqnj/26t6/9urev/bq3r/26t6/9imaf/LjBL/y4oP/8uKD//Liw//qnga/1ZJ + NP88Ojr/PDo6/zw6Ov88OTr/Pjs7h////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU1KSBs9OzvbPDo6/zw6Ov87Ojr/RD44/5Zt + H//JiQz/zIoM/8yKDP/Migz/zIoM/8yKDP/Migz/zIoM/8yKDP/Migz/zIoM/8yKDP/Migz/zIoM/8yK + DP/Migz/zIoM/8yKDP/Ligz/zIsO/9WfUv/bq3j/26t5/9uref/bq3n/26t5/9uref/bqnb/zY4X/8yK + DP/Migz/zIsM/8yKDP+/gxH/b1cs/zw5Ov88Ojr/PDo6/zw6Ov9BPz6P////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AU9MTBM9OzvXPDo6/zw6 + Ov88Ojr/TkQ1/657Ff/Miwn/zYsJ/82LCf/Niwn/zYsJ/82LCf/Niwn/zYsJ/82LCf/Niwn/zYsJ/82L + Cf/Niwn/zYsJ/82LCf/Niwn/zYsJ/82LCf/Niwn/zYsJ/9OaO//arHj/26x4/9useP/brHj/26x4/9us + eP/brHj/26x4/9KYNv/Miwn/zYsJ/82LCf/Niwn/zIwJ/8uKCv+EYyT/QDw4/zw6Ov88Ojr/PDo6/z07 + O4H///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVpa + Wgc9OzvBPDo6/zw6Ov87OTn/UUYz/7N+Ev/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82M + CP/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/86ODf/Zp2j/26x4/9us + eP/brHj/26x4/9useP/brHj/26x4/9useP/Ypl//zY0K/82MCP/NjAj/zYwI/82MCP/NjAj/y4sJ/45p + IP89Ojr/PDk6/zw6Ov88Ojr/Q0FBYf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE+PDyVPDo6/zw6Ov88Ojn/TUQ1/7iBEf/OjQj/zo0I/86NCP/OjQj/zo0I/86N + CP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86N + CP/Qkxz/3Kt0/92teP/drXj/3a14/92teP/drXj/3a14/92teP/drXj/3ax2/9KXLf/OjQj/zo0I/86N + CP/OjQj/zo0I/86NCP/NjQj/jGgh/z87Of88Ojr/PDo6/zw6Ovc/PT01////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFCPz9TPDo6/zw6Ov88Ojr/R0A2/616Ff/PjQf/zo0H/86N + B//OjQf/zo0H/86NB//OjQf/zo0H/86NB//OjQf/zo0H/86NB//OjQf/zo0H/86NB//OjQf/zo0H/86N + B//OjQf/zo0H/86NB//OjQf/0ZQe/9usc//crXf/3K13/9ytd//crXf/3K13/9ytd//crXf/3K13/9yt + d//Zp2L/zo8N/86NB//OjQf/zo0H/86NB//OjQf/zo0H/8yLCf9/YCb/PDo6/zw6Ov88Ojr/PDo63U5J + SQ3///8B////Af///wH///8B////Af///wH///8B////Af///wFEQUEVPDo66zw6Ov88Ojr/Pjs5/5xy + Gv/PjQf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+O + B//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/9GTF//bq27/3K11/9ytdf/crXX/3K11/9yt + df/crXX/3K11/9ytdf/crXX/3K11/9WePv/Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/zIwI/2VS + Lf88Ojr/PDo6/zw6Ov8+PDyZ////Af///wH///8B////Af///wH///8B////Af///wH///8BPjw8oTw6 + Ov88Ojr/PDk6/3hdJ//PjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CP + Bf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QkAj/2ahf/9yt + df/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9ytdf/brG//0pYg/9CPBf/QjwX/0I8F/9CP + Bf/QjwX/0I8F/9CPBf+8hA7/T0U0/zw5Ov87OTn/PDo6/UE/Pzv///8B////Af///wH///8B////Af// + /wH///8BQD4+Nzw6Ov08Ojr/PDo6/1ZJMv/EiQr/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0JAF/9WcNf/drnX/3a51/92udf/drnX/3a51/92udf/drnX/3a51/92udf/drnX/3a51/9up + YP/Rkg7/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/z5AF/55zGf8+Ozn/PDo6/zw6Ov89OjrLVlZWA/// + /wH///8B////Af///wH///8B////ATw6Ors8Ojr/PDo6/z06Of+kdhf/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/Rkgv/3Ktk/96vdf/fr3X/3691/9+vdf/fr3X/3691/9+v + df/fr3X/3691/9+vdf/fr3X/2qRM/9GRBv/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9CQBf/QkAX/aVQs/zw5 + Ov88Ojr/PDo6/zw6OlX///8B////Af///wH///8B////AT08PDk8Ojr/PDo6/zw5Ov9lUi3/0JAD/9GR + A//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GR + A//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9SaJv/cr2//3bBz/92w + c//dsHP/3bBz/92wc//dsHP/3bBz/92wc//dsHP/3bBz/92vcf/WnzP/0ZED/9GRA//RkQP/0ZED/9GR + A//RkQP/0JED/7SAEP9DPjj/PDo6/zw6Ov89OzvR////Af///wH///8B////Af///wE+PDyrPDo6/zw6 + Ov9APDn/rXwS/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KR + A//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KR + A//SkgT/2KE//96wc//esHP/3rBz/96wc//esHP/3rBz/96wc//esHP/3rBz/96wc//esHP/3a9t/9WZ + H//SkQP/0pED/9KRA//SkQP/0pED/9KRA//RkAP/dlsn/zw5Of88Ojr/PDo6/0A+PkX///8B////Af// + /wFHREQZPDo6+Ts5Ov88Ojr/ZFEt/8+QBP/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9OSBv/bp0//37Bx/9+wcf/fsHH/37Bx/9+wcf/fsHH/37Bx/9+w + cf/fsHH/37Bx/9+wcf/drWL/1JUN/9OSAv/TkQL/05EC/9ORAv/TkQL/05EC/7WAD/9APDj/PDo6/zw6 + Ov89Ozur////Af///wH///8BPDs6cTw6Ov88Ojr/PTo5/6B0F//TkgL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkgL/1JQK/9upUv/fsXD/37Fx/9+x + cf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/3rFw/9unTv/Ukwb/05IC/9ORAv/TkQL/05EC/9OR + Av/TkgL/Y1Et/zw6Ov88Ojr/PDk59zs7OxH///8B////ATw6OsU8Ojr/PDo6/0lBNv/LjwX/1JMB/9ST + Af/UkwH/1JMB/9STAf/UkwH/1JMB/9STAf/UkwH/1JMB/9STAf/UkwH/1JMB/9STAf/UkwH/1JMB/9ST + Af/UkwH/1JMB/9STAf/UkwH/1JMB/9STAf/UkwH/1JMB/9STAf/UkwH/1JMB/9STAf/UkwH/1JMB/9ST + Af/VlQn/3atZ/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXD/2aAx/9ST + Af/UkwH/1JMB/9STAf/UkwH/1JMB/5tyGf88Ojr/PDo6/zw6Ov87OTld////ATk5ORM8Ojr7PDo6/zw5 + Ov92XCf/1ZMA/9WTAP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WT + AP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WTAP/VkwD/1ZMA/9WT + AP/VkwD/1ZMA/9WTAP/VkwD/1ZMB/9WWC//dq1f/37Jv/9+yb//fsm//37Jv/9+yb//fsm//37Jv/9+y + b//fsm//37Jv/96xaf/WmA//1ZMA/9WTAP/VkwD/1ZMA/9WTAP/Fiwf/R0A3/zw5Ov88Ojr/Pjw8p/// + /wE8OjpRPDo6/zw6Ov88Ojr/oXYX/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aU + AP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aU + AP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/1pQA/9aUAP/WlAD/2JgO/9+uX//hsm//4bJv/+Gy + b//hsm//4bJv/+Gyb//hsm//4bJv/+Gyb//gsm//3KdG/9aUAf/WlAD/1pQA/9aUAP/WlAD/1JIB/2VS + LP88Ojr/PDo6/zw6Ouf///8BPDs7iTw6Ov88Ojr/Qz44/8SKCf/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/YmhL/4LBk/+Gzbv/hs27/4bNu/+Gzbv/hs27/4bNu/+Gzbv/hs27/4LNu/+CxaP/YmhP/15UA/9eV + AP/XlQD/15UA/9eVAP+MaR//Ozo5/zw6Ov88Ojr/SUdHIz48O7k8Ojr/PDo6/1dKMf/QkQT/2JUA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlgH/2JgJ/9mcFf/anR3/2p4f/9mdGv/ZmQ3/15UB/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15YB/92oQv/is2z/4rNs/+KzbP/is2z/4rNs/+KzbP/is2z/4rNs/+Kz + bP/is2z/3KIw/9eVAP/XlQD/15UA/9eVAP/XlQD/qnwT/z47Of88Ojr/PDo6/zw6OlM8OjrhPDo6/zw6 + Ov9sVyr/15YB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iW + Af/YlgH/2JYB/9iWAf/YlwL/2ZsR/9uiKv/eqUn/4bBg/+Kyav/ismv/4rJr/+Kya//ismv/4rJq/+Gx + Yv/eqUT/2p4d/9iXA//YlgH/2JYB/9iWAf/YlgH/15YB/9iXAv/eqUb/4rJs/+KybP/ismz/4rJs/+Ky + bP/ismz/4rJs/+KybP/ismz/4rJs/92nQP/YlgH/2JYB/9iWAf/YlgH/2JYB/8GJCv9DPjf/PDo6/zw6 + Ov88OTl5PDo6/Tw6Ov88Ojr/gmQi/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iX + AP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iYBP/boib/3qxN/+CyZf/htGv/4bRr/+G0a//htGv/4bRr/+G0 + a//htGv/4bRr/+G0a//gtGv/4bRq/+CuVP/bnxz/2ZoJ/9qdGP/boB//3KEj/9yjLP/eqkf/4LNn/+G0 + a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0av/cpjf/2JcA/9iXAP/YlwD/2JcA/9iX + AP/RkwT/SEE1/zw6Ov88Ojr/Pjs7mTw6Ov88Ojr/Ozo6/5NuG//ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mY + AP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZlwD/2ZkE/9yjKP/hsVv/4rVp/+K1av/itWr/4rVq/+K1 + av/itWr/4rVq/+K1av/itWr/4rVq/+K1av/itGn/361O/9yhI//epjP/4rBX/+K0Zv/itGj/4rVp/+K1 + av/itWr/4rVq/+K1av/itWr/4rVq/+K1av/itWr/4rVq/+K1av/itWr/4rVq/+K1av/hs2T/250V/9mY + AP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/1NIM/88Ojr/PDo6/zw6OrE8Ojr/PDo6/zw5Ov+edRf/2ZgA/9mY + AP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/25wO/+CtSv/jtmj/5LZp/+O2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmj/4KtA/92iIP/islv/5LZp/+S2 + af/jtmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/jtWj/3qUu/9mZAf/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP9eTy//PDo6/zw6Ov87OjrBPDo6/zw6 + Ov88OTr/pXoX/9qaAP/amgD/2poA/9qaAP/amgD/2poA/9qaAP/amgD/2poA/9qaAP/amgD/3KAZ/+Ky + Xf/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/4rNg/92i + HP/js2D/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S1Zv/isVT/3aIf/9qaAf/ZmgD/2poA/9qaAP/amgD/2poA/9qaAP/ZmgD/ZFIu/zw6 + Ov88Ojr/Ozk5yTw6Ov88Ojr/PDo6/6V5Fv/bmQD/25kA/9uZAP/bmQD/25kA/9uZAP/bmQD/25kA/9uZ + AP/bmQD/3qAY/+O0X//jtmj/5LZo/+S2aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2 + aP/ktmj/47Zn/+CtR//grED/47Vj/+KxVv/isFP/4rJZ/+O0YP/ktmb/5LZo/+O2Z//ktmf/5LZo/+O2 + Z//ktmj/5LZn/+S1Zf/js1z/4q9N/9+pOP/doRz/25sD/9uZAP/bmQD/25kA/9uZAP/bmQD/25kA/9uZ + AP/bmQD/25oA/2RSLf88Ojr/PDo6/zs5Ock8Ojr/PDo6/zs5Ov+gdhf/3JkA/9uZAP/cmQD/3JkA/9yZ + AP/cmQD/3JkA/9uZAP/cmQH/3Z4N/+OzWf/lt2j/5bdo/+W3aP/lt2n/5bdp/+W3av/luGr/5bZl/+Ow + Tv/hrDz/4q1C/+S0W//muWv/5rlu/+W5bf/gqC//36cr/96hGP/dnhH/3Z4O/92eDv/dnxD/3Z8S/96g + Fv/eoRv/3qIe/96iH//eoh7/3qEa/92gFP/dnQ3/3JwJ/9ybBP/cmgH/25kA/9yaAP/cmQD/3JkA/9yZ + AP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yaAP9fTy//PDo6/zw6Ov88OjrBPjw8/0JAQP9GRET/nXkq/96g + Ev/fohb/36Mb/+ClIf/hpiX/4agp/+GqL//irTn/4as0/+e7aP/qxoz/68eO/+rHjv/ryJD/68iR/+vJ + kv/ryJP/6sOA/+W0Uv/ksUf/5LFH/+SxSP/ksUn/5rZZ/+e8a//muWH/5LFI/+SxR//ksEf/5LFH/+Sw + R//ksEf/5LBH/+SwR//ksEX/5LBF/+SwQ//kr0L/469B/+OuPv/jrjz/4606/+KtOP/irDb/4qsz/+Kq + Mf/hqS7/4acq/+GnJf/hpSL/4KQd/9+iGf/foRX/3qAR/96eDf/engr/Wk85/z89Pf88Ojr/PDo6r3h2 + dft6eHf/fHl4/6uUYf/lskT/5bJE/+WyRP/lskT/5bJE/+SyRf/pwHP/6sN9/+a1Tv/ryJD/7MqU/+zK + lP/sypT/7MqU/+zKlP/sypT/6sSC/+W0S//lskT/5bJE/+WyRP/lskT/5bJE/+WyRP/lskT/5bJE/+Wy + RP/lskT/5bJE/+WyRP/lskT/5bJE/+WyRP/lskT/5bJE/+WyRP/lskT/5bJE/+WyRP/lskT/5bJE/+Wy + RP/lskT/5bJE/+WyRP/lskT/5bJE/+WyRP/lskT/5bJE/+WyRP/lskT/5bJE/+WyQ//ksUL/4a9D/4N9 + cv94dnX/dXNz/3Bvbpl9fHvff318/359e/+fjmv/5bJD/+ayQ//mskP/5rJD/+azQ//nuVr/7MmS/+nA + cf/ou2H/7MqU/+zKlP/sypT/7MqU/+zKlP/sypT/7MmS/+e4WP/mskL/5rJD/+ayQ//mskP/5rJD/+ay + Q//mskP/5rJD/+ayQ//mskP/5rJD/+ayQ//mskP/5rJD/+ayQ//mskP/5rJD/+ayQ//mskP/5rJD/+ay + Q//mskP/5rJD/+ayQ//mskP/5rJD/+ayQ//mskP/5rJD/+ayQ//mskP/5rJD/+ayQ//mskP/5rJD/+ay + Q//mskP/5rJD/9arTP+Ef3n/f318/399fP9+fHt5fnx8t399fP9/fXz/kody/+KwRP/ns0H/57NB/+ez + Qf/ns0H/6sSB/+vIjv/ntkv/6b5r/+zKlP/sypT/7MqU/+zKlP/sypT/7MqU/+vHif/ms0L/57NB/+ez + Qf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ez + Qf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ez + Qf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/JpFP/gH17/399fP9/fXz/fnx8UX98fId/fXz/f318/4R/ + ef/arUb/57M+/+ezPv/nsz7/6blU/+zJk//pvF//57M+/+m/af/sypT/7MqU/+zKlP/sypT/7MqU/+zK + lP/rw3z/57M+/+ezPv/nsz7/57M+/+ezPv/nsz7/57M+/+ezPv/nsz7/57M+/+ezPv/nsz7/57M+/+ez + Pv/nsz7/57M+/+ezPv/nsz7/57M+/+ezPv/nsz7/57M+/+ezPv/nsz7/57M+/+ezPv/nsz7/57M+/+ez + Pv/nsz7/57M+/+ezPv/nsz7/57M+/+ezPv/nsz7/57M+/+ezPv/nsz7/tZle/359fP9/fXz/f318/4SC + gCF+fHxPf318/399fP9/fXz/xqJS/+i0PP/otDz/6LQ8/+zEdv/sxoL/6LU//+e1O//rv2P/7suU/+7L + lP/uy5T/7suU/+7LlP/uy5T/7MR6/+i0PP/otDz/6LQ8/+i0PP/otDz/6LQ8/+i0PP/otDz/6LQ8/+i0 + PP/otDz/6LQ8/+i0PP/otDz/6LQ8/+i0PP/otDz/6LQ8/+i0PP/otDz/6LQ8/+i0PP/otDz/6LQ8/+i0 + PP/otDz/6LQ8/+i0PP/otDz/6LQ8/+i0PP/otDz/6LQ8/+i0PP/otDz/6LQ8/+i0PP/otDz/5rM9/52N + a/9/fXv/f318/398fOX///8BdHR0EX99fPt/fXz/f318/6eSZP/ntDr/57Q6/+i4R//uyo7/68Fp/+e0 + Ov/ntDr/68Bn/+/MlP/vzJT/78yU/+/MlP/vzJT/78uU/+3Ih//ntTv/57Q6/+e0Ov/ntDr/57Q6/+e0 + Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0 + Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0 + Ov/ntDr/57Q6/9yvQv+GgXj/f318/399fP9/fX2j////Af///wF+fHvBf318/399e/+Jg3b/5LM8/+i1 + OP/rv2D/78yU/+q9WP/otTj/6LU5/+zFeP/vzJP/78yT/+/Mk//vzJP/78yT/+/Mk//uzJH/6bxT/+e1 + OP/ntTj/6LU5/+i1Of/otTn/6LU4/+i1OP/puk3/6LU4/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1 + Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1 + Of/otTn/6LU5/+i1Of/otTn/6LU5/+e1OP/DolP/f317/399fP9/fXz/f317Wf///wH///8Bfnx7bX99 + fP9/fXz/gH17/8SiT//otTj/7cd8/+/Nkf/pu1H/6LU3/+m7TP/uy43/78yR/+/Nkf/vzZH/782R/+/N + kf/vzZH/782R/+3Khv/qukz/6LU3/+i1N//otTf/6LU3/+i1N//qvFD/7ciA/+i1Nv/otTf/6LU3/+i1 + N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1 + N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//ntTf/m4xr/399fP9/fXz/f3x894B8 + fA3///8B////AYB9fRV/fXz5f318/399fP+djmn/6LY3/+/Mjf/wzpH/7sh8/+zBYf/uy4j/8M6S//DO + kv/wzpL/8M6S//DOkv/wzpL/8M6S//DOkv/wzpL/78yN/+3Fb//rvlX/6rtJ/+q7Sv/rwF3/7suH/+/K + hv/ptjX/6bY0/+m2NP/ptjT/6bY0/+m2NP/ptjT/6bY0/+m2NP/ptjT/6bY0/+m2NP/ptjT/6bY0/+m2 + NP/ptjT/6bY0/+m2NP/ptjT/6bY0/+m2NP/ptjT/6bY0/+m2NP/ptjT/6bY0/+m2NP/ptjT/1qxC/4N/ + ef9/fXz/f318/399e6f///8B////Af///wH///8Bf3x7p399fP9/fXz/gX56/9GqSP/vzZH/782R//DN + kf/vzZL/782S/+/Nkf/vzZH/782R/+/Nkf/vzZH/782R/+/Nkf/vzZH/782R/+/Nkf/vzZL/782R/+/N + kP/vzZH/782R/+/Okf/vzI3/67xH/+m2Mf/ptjH/6bYx/+m2Mf/ptjH/6bYx/+m2Mf/ptjH/6bYx/+m2 + Mf/ptjH/6bYx/+m2Mf/ptjH/6bYx/+m2Mf/ptjH/6bYx/+m2Mf/ptjH/6bYx/+m2Mf/ptjH/6bYx/+m2 + Mf/ptjH/6bYy/6iUYf9/fXv/f318/399fP+Afn1B////Af///wH///8B////AX18ezV/fXz/f318/359 + e/+fj2n/7syM/+/OkP/vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/O + j//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//782Q/+7KgP/quj3/6bcv/+q3L//qty//6rcv/+q3 + L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3 + L//qty//6rcv/+q3L//qty//6rcv/9euPv+FgHj/f318/399fP9/fXzL////Af///wH///8B////Af// + /wH///8Bfnx7t399fP9/fXz/gX58/8+2if/vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/O + j//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//7suE/+y9 + Sf/rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3 + L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+q3L/+hkGT/f318/399fP9/fXz/f3x8T/// + /wH///8B////Af///wH///8B////AX97ezF/fXz9f318/399fP+UjID/58mP//DPkP/wz5D/8M+Q//DP + kP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DP + kP/wz5D/8M+Q//DPkP/vzoz/7sVk/+u7Nf/ruCz/67gs/+u4LP/ruCz/67gs/+u4LP/ruCz/67gs/+u4 + LP/ruCz/67gs/+u4LP/ruCz/67gs/+u4LP/ruCz/67gs/+u4LP/ruCz/67gs/+u5LP/Jpkb/gH57/399 + fP9/fXz/f318x////wH///8B////Af///wH///8B////Af///wH///8Bf3x8m399fP9/fXz/f317/7Ch + hf/vzo7/8M6O//DOjv/wzo7/8M6O//DOjv/wzo7/8M6O//DOjv/wzo7/8M6O//DOjv/wzo7/8M6O//DO + jv/wzo7/8M6O//DOjv/wzo7/8M6O//DOjv/wzo7/8M6O//DOjv/vy3//6708/+u5KP/ruSf/67kn/+u5 + J//ruSf/67kn/+u5J//ruSf/67kn/+u5J//ruSf/67kn/+u5J//ruSf/67kn/+u5J//ruSf/67kn/+u5 + J//eszL/joVx/399fP9/fXz/f318/YB9fTX///8B////Af///wH///8B////Af///wH///8B////AX9/ + exF+fXvnf318/359e/+Afnz/zLWJ//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HO + jv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O/+/M + gv/svDX/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5 + J//suSf/7Lkn/+y5J//quCj/oI9j/399fP9/fXz/f318/4B9fZH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bfn17S399fP9/fXz/f318/4qFff/Zv4v/8s+O//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8Mpy/+y7K//suib/7bom/+26Jv/tuib/7bom/+26Jv/tuib/7bom/+26 + Jv/tuib/7bom/+26Jv/tuib/7bom/+26Jv/ruSf/tZtU/399e/9+fXv/f318/399fNeEfX0L////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wF/fXyNf318/399fP9/fXv/joh+/+LE + jP/yz47/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LPjf/vwk7/7boj/+27I//tuyP/7bsj/+27 + I//tuyP/7bsj/+27I//tuyP/7bsj/+27I//tuyP/7bsj/+27I//tuiP/vaBL/4F+ev9/fXz/f318/399 + fPWCfn4v////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BgICABX98 + fLt/fXz/f318/399fP+TjH//4cOL//LPjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8M2A/+y8 + I//sux//7Lsf/+y7H//sux//7Lsf/+y7H//sux//7Lsf/+y7H//sux//7Lsf/+y7H//ruiD/waJG/4J+ + ev9/fXz/f318/399fP2Bfn5Z////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGFgIAPf318z399fP9/fXz/f318/46Ifv/awIr/8dCM//LRjP/y0Yz/8tGM//LR + jP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LR + jP/y0Yz/8tGM//HQjP/vw0b/7bwg/+28IP/tvCD/7bwg/+28IP/tvCD/7bwg/+28IP/tvCD/7bwg/+28 + IP/ruyL/uJ5O/4J+ef9+fXz/f318/399fP+Afn13////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AYJ/fxd/fXzVf318/399fP9/fXv/iYV9/8y2 + h//x0Iv/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LS + i//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0Yv/8Mpo/+28H//uvB//7rwf/+68H//uvB//7rwf/+68 + H//uvB//7rwf/+28H//muCX/q5ZZ/4B9e/9/fXz/f318/399fP+Afn2F////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BhYKCFX99 + fM1/fXz/f318/399fP+Afnz/saKD/+nLiv/y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LS + i//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8dGL//HPfP/vvSX/77se/++8 + Hv/vvB7/77we/++8Hv/vvB7/77we/+68Hf/VrjT/lIlr/399e/9/fXz/f318/399fP+Bf317////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGIg4MNf318s399fP9/fXz/f318/399fP+TjH//0bmI//PRjP/00oz/9NKM//TS + jP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//PS + jP/z0IX/78As/++9Hf/vvR3/770d/++9Hf/vvB3/770d/+i5JP+0m1H/hoB3/399fP9/fXz/f318/399 + e/eBf31f////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AYCAgAOAf31/f318/X99fP9/fXz/f318/39+ + e/+glYD/1ryG//DQif/z0on/89KJ//PSif/z0on/89KJ//PSif/z0on/89KJ//PSif/z0on/89KJ//PS + if/z0on/89KJ//PSif/z0on/89GG//DALv/vvBv/77wb/++8G//vvBv/5rcj/8ChRf+LhHL/f317/399 + e/9/fXz/f318/399fN+Af343////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYB9 + fD1/fXzbf318/399fP9/fXz/f318/4KAfP+dlH//yrSF/+/Qif/004n/9NSJ//TUif/01In/9NSJ//TU + if/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//PSgv/xwCn/8L4a//C9Gv/htSn/t51N/46G + b/9/fXv/f318/399fP9/fXz/f318/358e6GHh4cR////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bj4iICYB+fYN/fHz3f318/399fP9/fXv/f318/399e/+Ggn3/p5uB/8q1 + hf/hxYf/7c+I//PTif/01In/9NSJ//TUif/01In/9NSJ//TTif/01In/9NOJ//HSif/oyHn/2LE2/7qf + S/+ZjGf/gH17/399fP9/fXz/f318/399fP9/fXz/gH5914GBgEX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BhIKAH399fJl/fXz5f318/399 + fP9/fXz/f318/399fP9/fXz/hIB8/5GKfv+elID/rZ+B/7mog//ArYT/xLCE/8Ovg/++rIP/taSD/6eb + gP+YkH//i4Z8/4F9e/9/fXz/fn17/399fP9/fXz/f318/399fP9/fXzfgH59ZZWVlQX///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BhoODG4B/foV/fXznf318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/4B/fcGCgH5ZiIiIBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bj4+PBYKAgEeAfn2Zfn174X99fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fPt/fXzDgH19eYmI + hSX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGEhIEjgX9+WYB+fYeCgH+tgX9+zYB+feN/fXzxf3189399fPV/fXztgH5924KAf8GCgH+hgH59dYOB + gEWIhIQN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AXhnZw9xYFM7YVFEYVNHO4FHPzqhPjs7vTw5OdE8OjrlPTo69Tw6 + Ovs8Ojr/PDo6/zw6Ov88Ojr9PDo69zw6Ouc8OjrVPTs6wUQ/PKlPRTqHXlBBaWxgUUOAaV4X////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AYBhYQlrY1Y9WlFJd0xEPq9APDrfPDo6/zw6 + Ov88Ojr/PDo6/zw5Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw5Ov89Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDk6/zw6Ov8/PDrpSUI8u1hORIFrYVZJcXFhEf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BamNUI1VO + S29KREC3QD079zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov8/PDr7SEM9w1FLR31pX1Qx////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFpYVEhRkA+dz47O8s8Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/z06 + Of8+OjvbQj89hWNTSC////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AYCAVgdaUUhXPzs7uTw5Ov08Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PTk6/z06Ov89Ojr/PDo6/z06Os1VTEVreGdnD/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AXJk + ZBNVTEh7Pzw75zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov87Ojr/PDo7/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDk6/zw6Ov88Ojv/PDo6/zw6Ov88Ojv/PTo6/zw6 + Ov88Ojr/PTo6/zw6Ov88Ojr/PDo6/z06Ov88Ojr/PDk6/zw6Ov88Ojr/PTo5/zs6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov89OjrzT0ZCkW1mXiH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AXVpXhdPSEaNPjw79Tw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov89OTn/PDo6/zw6Ov87Ojr/PDo6/zw5Ov87Ojr/PDo6/z07 + Ov9BPTr/SEE7/01EO/9PRTf/UUQ2/09FN/9NRTv/SUI7/0I+O/8+Ozv/PDo6/zs6Ov88Ojr/PDo6/zw6 + Ov87Ojn/PDo6/zw6Ov89Ojr/PDo5/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88OTn/PTo6/UtFQqVmX1gn////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AXFhYRFIQkCHPjs78zw6 + O/89OTr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PTs6/0I9 + Of9GQDj/TEM3/1pLNv9xWDT/hmQw/5huLP+qdyf/t34k/72AIv/Agx//v4Me/8GCH//Bgx//wYMf/8CD + IP/Agh//voEh/7d+JP+seCj/nHAs/4plLv91WjL/Xk03/01DOP9HQDj/Qz45/z47Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDk6/z07O/tCPz+dZ1ZOH/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVZWVgNIQz9pPTo66Tw5Ov88OTr/Ozo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov8+PDr/SkI4/1tMNf9tVjL/h2Qt/6FzJ/+7gCH/x4cc/8iIG//Jhxv/yIcb/8iH + G//Ihxv/yIcb/8iHG//Ihxv/yIcb/8iHG//Ihxv/yIcb/8iHG//Ihxv/yYgb/8iHG//Ihxv/yIcb/8iH + G//Ihxv/voIg/6Z1Jv+NZyv/clgx/1tMNP9NRDj/QDw6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PTk6/z06Ov88Ojn/PDk6/zs6Ov88Ojr3RUFAg4Braw3///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFmXVg1QD080Tw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/z06Ov88Ojr/PDo6/z06Of9IQTn/ZFEz/39gLf+Ybif/tH4h/8WG + G//IiBn/yIgZ/8iIGf/IiBn/yIgZ/8iIGf/IiBn/yIgZ/8iIGf/IiBn/yIgZ/8iIGf/IiBn/yIgZ/8iI + Gf/IiBn/yIgZ/8iIGf/IiBn/yIgZ/8iIGf/IiBn/yIgZ/8iIGf/IiBn/yIgZ/8iIGf/IiBr/tn4g/55x + Jv+FYyv/a1Qy/0xEOf89Ojv/PDo6/zw6O/88Ojr/PDk6/zs6O/88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/Pzs75VlTUFH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFnZ2cLTUhGjT06Ov08Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/z06 + Ov9RRjj/fF4v/6R0JP+3fx7/xYYZ/8mJGP/KiBj/yokY/8mIGP/JiBj/yYgY/8mIGP/JiBj/yYgY/8mI + GP/JiBj/yYgY/8mIGP/JiBj/yYgY/8mIGP/JiBj/yYgY/8mIGP/JiBj/yYgY/8mIGP/JiBj/yYgY/8mI + GP/JiBj/yYgY/8mIGP/JiBj/yYgY/8mJGP/JiRn/yogY/8eHGv+7gR3/pnYj/4RjLf9ZSzn/QDw8/zw6 + Ov88Ojr/PDk6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zs6Ov88Ojv/PDo6/0dCP61nZ10Z////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BVlFRM0A9PNk8Ojr/PTo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PTs6/0M+Of9bTDX/kmsp/7d+Hf/EhRn/yYcX/8mHFv/JiBb/yYgW/8mH + Fv/Khxb/yYcW/8mHFv/Jhxb/yYcW/8mHFv/Jhxb/yYcW/8mHFv/Jhxb/yYcW/8mHFv/Jhxb/yYcW/8mH + Fv/Jhxb/yYcW/8mHFv/Jhxb/yYcW/8mHFv/Jhxb/yYcW/8mHFv/Jhxb/yYcW/8mHFv/JiBf/yYcW/8mH + Fv/Jhxf/yYgW/8qJGf/LjCP/zZdN/8mdb/+mg13/ZVM6/0M+Of8/Ozn/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo5/zw6Ov88Ojr/Ozk5/0A8O+tTUE1R////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUhE + RHc9OTr7PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zs6Ov88Ojr/PTs6/0lCOP9lUTL/nHEl/8aG + GP/KiBb/yYgW/8mIFv/JiBb/yYgW/8mIFv/JiBb/yYgW/8mIFv/JiBb/yYgW/8mIFv/JiBb/yYgW/8mI + Fv/JiBb/yYgW/8mIFv/JiBb/yYgW/8mIFv/JiBb/yYgW/8mIFv/JiBb/yYgW/8mIFv/JiBb/yYgW/8mI + Fv/JiBb/yYgW/8mIFv/JiBb/yYgW/8mIFv/JiBb/yYgW/8qKG//Njyr/0ZlI/9incv/Zq3z/2at9/9Oe + Vv/JiR3/pnUk/3BXMP9ORDj/Pjs6/zw6Ov88OTr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov9CPz2ZcnJWCf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AW5uXA9CQD6xPDo6/zw6O/88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov89Ojr/Ozk6/0Q/Of9rVTH/l20k/8CDGP/KiRT/yokU/8uJFP/KiRT/yokU/8qJFP/KiRT/yokU/8qJ + FP/KiRT/yokU/8qJFP/KiRT/yokU/8qJFP/KiRT/yokU/8qJFP/KiRT/yokU/8qJFP/KiRT/yokU/8qJ + FP/KiRT/yokU/8qJFP/KiRT/yokU/8qJFP/KiRT/yokU/8qJFP/KiRT/yokU/8qJFP/KiRT/y4kV/8qJ + Ff/OkSz/0ptK/9elav/Zq3r/2qt8/9mrfP/aq3z/0pxM/8uKGf/KiRX/xIUX/6N0Iv9zWS7/SEA5/zw5 + Ov88OTn/PDo7/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov8+OzvPZl5eIf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFhWlopPjs82T05 + Ov89Ojr/PTo7/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/z06Ov9XSTf/lWwl/7uAGf/LiRT/y4kT/8uJ + FP/LiBP/zIgU/8uJFP/LiBP/y4gT/8uIE//LiBP/y4gT/8uIE//LiBP/y4gT/8uIE//LiBP/y4gT/8uI + E//LiBP/y4gT/8uIE//LiBP/y4gT/8uIE//LiBP/y4gT/8uIE//LiBP/y4gT/8uIE//LiBP/y4gT/8uI + E//LiBP/y4gT/8uIE//LiBP/y4gT/8uJFP/OjiT/05tJ/9ilaP/aq3j/26t7/9ure//cq3v/2qx6/9us + e//Sm0j/y4oX/8uJE//LiBP/y4kT/8GDGP+ZbiT/Y1Az/z88Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov89OzntW1dURf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BWVVVQTw6Ou88Ojr/PDo6/zw6Ov88Ojr/PTo6/z05Ov88OTr/Ozo6/zw5 + Ov9GQDn/fF4s/7V9Gv/JiRL/zIoQ/8yJEf/MiRH/zIkR/8yJEf/MiRH/zIkR/8yJEf/MiRH/zIkR/8yJ + Ef/MiRH/zIkR/8yJEf/MiRH/zIkR/8yJEf/MiRH/zIkR/8yJEf/MiRH/zIkR/8yJEf/MiRH/zIkR/8yJ + Ef/MiRH/zIkR/8yJEf/MiRH/zIkR/8yJEf/MiRH/zYkR/8uJEf/LihD/y4kQ/8qJEv/Mjhz/05pH/9il + av/aq3f/26t7/9ure//bq3v/26t7/9ure//bq3v/26t7/9ObSv/MixX/zIoR/8yJEP/MiRH/zIkR/8qI + Ev+6gBj/iWYn/0pDN/89Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov89Ozv7TUpKZf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUxJR108Ojr5PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov87Ojr/PDo6/zw5Ov9APTr/Yk8y/6Z4Hv/JihH/yosP/8qLEP/Liw//y4sP/8uL + D//Liw//y4sP/8uLD//Liw//y4sP/8uLD//Liw//y4sP/8uLD//Liw//y4sP/8uLD//Liw//y4sP/8uL + D//Liw//y4sP/8uLD//Liw//y4sP/8uLD//Liw//y4sP/8uLD//Liw//y4sP/8uLD//Liw//y4sP/8uL + D//LjA//y4oP/8uLD//Njhj/0Zg6/9mocP/bq3v/26t7/9use//brHv/26t7/9ure//bq3v/26t7/9ur + e//bq3v/1Z9S/8yOFf/Liw//zIsP/8uLD//Liw//y4sP/8uLD//Liw//tn8Z/2hTMP9FPzj/PDo7/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88OTr/QD4+h////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFKRUVpPDo6/Tw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/z05Of88Ojr/SkI3/3hd + K/+9ghb/y4sP/8uLD//Liw//zIoP/8uLD//Lig//y4oP/8uKD//Lig//y4oP/8uKD//Lig//y4oP/8uK + D//Lig//y4oP/8uKD//Lig//y4oP/8uKD//Lig//y4oP/8uKD//Lig//y4oP/8uKD//Lig//y4oP/8uK + D//Lig//y4oP/8uKD//Lig//y4oP/8uKD//Lig//y4oP/8uKD//Liw//zpAh/9WeUP/bqnX/26t7/9us + ev/brHr/3Kx6/9usev/bq3r/26t6/9urev/bq3r/26t6/9urev/Xo2D/zI4X/8uLD//Lig//y4oP/8uK + D//Lig//y4sP/8uLD//Miw7/wIUT/4dlJ/9RRjb/PTs6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov89Ojr/Pz09lYCAgAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BR0NDcTw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88OTr/PTo6/1VINf+TayL/w4YQ/8yLDf/Miw3/zIoN/8yLDf/Mig3/zIsN/8yK + Df/Mig3/zIoN/8yKDf/Mig3/zIoN/8yKDf/Mig3/zIoN/8yKDf/Mig3/zIoN/8yKDf/Mig3/zIoN/8yK + Df/Mig3/zIoN/8yKDf/Mig3/zIoN/8yKDf/Mig3/zIoN/8yKDf/Mig3/zIoN/8yKDf/Mig3/zIoN/8yK + Df/Lig3/zIoN/86QIf/Woln/26p2/9yref/cq3n/3Kt5/9yref/cq3n/3Kt5/9yref/cq3n/3Kt5/9yr + ef/cq3n/3Kt5/9qocP/Ojxr/y4oN/8yKDf/Mig3/zIoN/8yKDf/Miw3/zIsN/8yKDf/Mig3/xocQ/6Bz + Hv9fTjL/Pjs6/zw5Ov89Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/RkNBn4CAgAP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AU1KSG08Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/Ozo6/z47Ov9cTTP/qXga/8eJ + Df/Miwv/zIsL/8yLC//Miwv/zIsL/8yLC//Miwv/zIsL/8yLC//Miwv/zIsL/8yLC//Miwv/zIsL/8yL + C//Miwv/zIsL/8yLC//Miwv/zIsL/8yLC//Miwv/zIsL/8yLC//Miwv/zIsL/8yLC//Miwv/zIsL/8yL + C//Miwv/zIsL/8yLC//Miwv/zIsL/8yLC//Miwz/y4sM/8yLDP/NjRT/16Ja/9urd//brHn/26x5/9us + ef/brHn/26x5/9usef/brHn/26x5/9usef/brHn/26x5/9usef/brHn/26x4/9CVLP/Miwv/zIsL/8yL + C//Miwv/zIsL/8yLC//Miwv/zIsL/8yLDP/Miwz/y4oN/7Z/Ff9pVDH/PDo6/zw5Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/RkNDm////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFISEZhPDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov9BPTj/a1Uv/8GFEP/Miwr/zIsK/82LCv/Niwr/zYsK/82LCv/Niwr/zYsK/82L + Cv/Niwr/zYsK/82LCv/Niwr/zYsK/82LCv/Niwr/zYsK/82LCv/Niwr/zYsK/82LCv/Niwr/zYsK/82L + Cv/Niwr/zYsK/82LCv/Niwr/zYsK/82LCv/Niwr/zYsK/82LCv/Niwr/zYsK/82LCv/Niwr/zYsK/8yL + Cv/Oiwr/zYwN/9WgS//brXj/26x5/9usef/brHn/26x5/9usef/brHn/26x5/9usef/brHn/26x5/9us + ef/brHn/26x5/9usef/brHj/1Z9P/82LCv/Miwr/zYsK/82LCv/Niwr/zYsK/82LCv/Niwr/zYsK/82M + Cv/MjAr/zYsL/8aIDv99Xyn/RT84/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/Pz09kf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BT0xMSzw6Ov08Ojr/PDo6/zw6O/88Ojr/PDo6/zw6Ov88Ojr/Rj84/3hcKv/Chg//zYwJ/86M + Cf/NjAn/zYwJ/82MCf/NjAn/zYwJ/82MCf/NjAn/zYwJ/82MCf/NjAn/zYwJ/82MCf/NjAn/zYwJ/82M + Cf/NjAn/zYwJ/82MCf/NjAn/zYwJ/82MCf/NjAn/zYwJ/82MCf/NjAn/zYwJ/82MCf/NjAn/zYwJ/82M + Cf/NjAn/zYwJ/82MCf/NjAn/zYwJ/82MCf/NjAn/zowJ/82MCf/RlCX/2qpw/9utd//arXj/26x4/9us + eP/brHj/26x4/9useP/brHj/26x4/9useP/brHj/26x4/9useP/brHj/26x4/9utef/ZqW3/zo8U/82L + Cf/NjAn/zYwJ/82MCf/NjAn/zYwJ/82MCf/NjAn/zYwJ/82MCf/OjAn/zowJ/8SHDf+LZyP/TEM2/zw6 + Of88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/Pz8/d////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVRPTzE8OjrzPDo6/zw6Ov88Ojr/PDo6/zs6 + Of88OTr/PDk5/0dAN/+AYSf/v4UP/8yNCP/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82M + CP/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82M + CP/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82M + CP/OjAj/zY0L/9agTv/brHf/26x4/9useP/brHj/26x4/9useP/brHj/26x4/9useP/brHj/26x4/9us + eP/brHj/26x4/9useP/brHj/2614/9usdf/Tmjf/zYwI/82MCP/NjAj/zYwI/82MCP/NjAj/zYwI/82M + CP/NjAj/zYwI/82MCP/NjAj/zYwI/8WHDf+SayD/SkI3/zs5Ov88Ojr/PDk6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/SkhIV////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFaWloXOzo65Tw6Ov88Ojr/PDo6/zw6Ov88Ojr/Ozo6/zw6Ov9DPTj/gGIm/8KHDf/NjQj/zY0I/86N + CP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86N + CP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86N + CP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/Pkhv/2KZj/9ytef/crXn/3K15/9yt + ef/crXn/3K15/9ytef/crXn/3K15/9ytef/crXn/3K15/9ytef/crXn/3K15/9ytef/brXn/3K14/9il + W//PkBL/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/8iK + DP+Xbx//Qj06/zw6Ov88OTr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov89Ozv3WVVVNf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BQUFBBT49PcE8Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/QDw5/4JjKP/JjAv/z44I/86NCP/Ojgj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86N + CP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86N + CP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86N + CP/OjQj/zo4I/9KYLf/bqm3/3a15/92tef/drXn/3a15/92tef/drXn/3a15/92tef/drXn/3a15/92t + ef/drXn/3a15/92tef/drXn/3a15/96uef/ernn/3Ktx/9SaN//OjQn/zo0I/86NCP/OjQj/zo0I/86N + CP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo4I/8yMCv+VbSD/SEE4/zs5Ov89Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov89OzvhWlpaFf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFEQkKNPDo6/zw6Ov88Ojr/PDo6/z06Ov88Ojn/PDo6/0E+Of94XSn/yYsL/86NCP/OjQj/zo0I/86N + CP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86N + CP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86N + CP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQf/05o2/9yrcv/drXj/3a14/92t + eP/drXj/3a14/92teP/drXj/3a14/92teP/drXj/3a14/92teP/drXj/3a14/92teP/drXj/3a14/92t + eP/drXj/2aVb/9CSGf/Ojgj/zo4I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86NCP/OjQj/zo0I/86N + CP/OjQj/zo0I/8eJC/+OaSL/SUE3/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov89Ozu7AQEBA/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BTktLSTw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw5 + Of9APDn/clks/76FD//PjQf/z40H/86MB//OjAf/zowH/86MB//OjAf/zowH/86MB//OjAf/zowH/86M + B//OjAf/zowH/86MB//OjAf/zowH/86MB//OjAf/zowH/86MB//OjAf/zowH/86MB//OjAf/zowH/86M + B//OjAf/zowH/86MB//OjAf/zowH/86MB//OjAf/zowH/86MB//OjAf/zowH/86MB//OjAf/zowH/86M + B//OjAf/zowH/86NB//Umzf/26tx/9ytd//crXf/3K13/9ytd//crXf/3K13/9ytd//crXf/3K13/9yt + d//crXf/3K13/9ytd//crXf/3K13/9ytd//crXf/3K13/9ytd//bq3L/1Js6/8+OC//OjQf/zowH/86M + B//OjAf/zowH/86MB//OjAf/zowH/86MB//OjAf/zowH/86MB//OjAf/zowH/8SHDf+DYyb/RD44/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov9BPz95////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVpa + Whc8OjrpPDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PTs5/2RSL/+2fxL/zo4J/8+OB//Pjgf/z44I/8+O + CP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+O + CP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+O + CP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+OCP/Pjgj/z44H/9SbNv/brHD/3a53/92u + d//drnf/3a53/92ud//drnf/3a53/92ud//drnf/3a53/92ud//drnf/3a53/92ud//drnf/3a53/92u + d//drnf/3a53/92ud//aqGX/0JMb/86OCP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+OCP/Pjgj/z44I/8+O + CP/Pjgj/z44I/8+OCP/Pjgj/z44I/8GGDv90Wiz/PTs6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + OvtOSUk1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BPjw8rzw6Ov88Ojr/PDo6/z06O/88Ojr/Ozo6/z05 + Ov9TRzT/r3wV/86NCP/Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+O + B//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+O + B//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+O + B//Pjgf/z44H/8+OB//Qjwf/1Jov/9uqa//crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9yt + df/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/92udf/Yo07/zo8I/8+O + B//Pjwf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Pjgf/z44H/8+OB//Qjwf/0I4H/8KH + Df9ZSzT/PDo6/z06O/88Ojr/PDo6/zw6Ov88Ojr/PDo6/z47O9dKSkoH////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AURB + QVU8Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/RD84/6J2Gv/Pjwf/0I4H/9COB//Qjgf/0I4H/9CO + B//Qjgf/0I4H/9COB//Qjgf/0I4H/9COB//Qjgf/0I4H/9COB//Qjgf/0I4H/9COB//Qjgf/0I4H/9CO + B//Qjgf/0I4H/9COB//Qjgf/0I4H/9COB//Qjgf/0I4H/9COB//Qjgf/0I4H/9COB//Qjgf/0I4H/9CO + B//Qjgf/0I4H/9COB//Qjgf/0I4H/9COB//Qjgf/0I4H/9COB//Qjgf/0I4H/9COB//TlSD/2qlk/9yt + df/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9yt + df/crXX/3K11/9ytdf/crXX/3K51/92udP/Umi7/z48I/9COB//Qjwf/0I4H/9COB//Qjgf/0I4H/9CO + B//Qjgf/0I4H/9COB//Qjgf/0I4H/9COB//Qjwb/0I4H/7B+FP9SRzX/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/0NBQYX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFhYWERPTs75zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDk6/0A8 + Ov9/YSf/z48H/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CP + Bv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CP + Bv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CP + Bv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9GSD//Zplj/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9yt + df/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crnX/3a52/9qo + YP/RlR3/0I8H/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0I8G/9CPBv/Qjwb/0Y8G/9GP + Bv/Qjwb/y40I/5RtH/9JQTf/PDo6/zw6Ov88Ojr/PDo6/zs5Of88Ojr/PDo6+1ZRUS3///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AUNB + QY88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88OTr/ZlMu/72ED//QjwX/0I8F/9CPBf/QjwX/0I8F/9CP + Bf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CP + Bf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CP + Bf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QkAX/0I8G/9Wg + QP/crXL/3K51/92udf/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9yt + df/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K1y/9iiS//SkhH/0I8G/9CPBf/QjwX/0I8F/9CP + Bf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/QjwX/0I8F/9CPBf/Rjwb/w4gM/3ddKf9APTn/PDk6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PTw8v////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFWVlYnPDo6+zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo5/1BF + Nv+kdhn/z48G/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9CQBf/QkAX/0ZUa/9yrbf/crnX/3K51/9ytdf/crXX/3K11/9yt + df/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9ytdf/crXX/3K11/9yt + df/crXX/3Kxv/9WdNf/QkQj/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9CQBf/PkAb/tIES/1dKMv88Ojr/PTo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/RkNDU/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATw5 + ObM8Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov9EPjn/iWci/86PB//RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bv/QkAX/2KNI/96vdv/fsHX/3q91/96vdf/er3X/3q91/96vdf/er3X/3q91/96vdf/er3X/3q91/96v + df/er3X/3q91/96vdf/er3X/3q91/96vdf/er3X/3q91/96vdf/esHT/3a1q/9WZJv/RkAb/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0JEG/9CQBf/RkAb/nnQc/0U/ + OP88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88OjrdVlZWB////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFHR0c3PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PTo6/2NQ + L/+9hQ7/0ZEF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAb/0pAF/9GRBf/Ulxr/3a1q/9+wdf/fr3X/3691/9+v + df/fr3X/3691/9+vdf/fr3X/3691/9+vdf/fr3X/3691/9+vdf/fr3X/3691/9+vdf/fr3X/3691/9+v + df/fr3X/3691/9+wdf/gsHX/3ape/9OVFf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/QkQX/0ZEF/9GRBf/Njwf/blgs/zw6Ov88OTr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov89Ojpn////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////ATw5 + Obs8Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov9CPTn/n3Qc/9GRBf/RkAb/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf/RkAX/0ZAF/9GRCf/XoD7/3a9z/96vdf/fr3X/3691/9+vdf/fr3X/3691/9+vdf/fr3X/3691/9+v + df/fr3X/3691/9+vdf/fr3X/3691/9+vdf/fr3X/3691/9+vdf/fr3X/3691/9+vdf/fr3X/2aNJ/9KT + C//RkQX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQBf/RkAX/0ZAF/9GQ + Bf+xfhT/SkM3/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6OuNKSkoH////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFBQUE5PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDk5/2RT + L//Mjgb/0pED/9GRBP/RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GR + A//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GR + A//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GR + A//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZIE/9OWF//aqVj/3bBz/92w + c//dsHP/3bBz/92wc//dsHP/3bBz/92wc//dsHP/3bBz/92wc//dsHP/3bBz/92wc//dsHP/3bBz/92w + c//dsHP/3bBz/92wc//dsHP/3bBz/92wc//drm3/1qA3/9GSBf/RkQP/0ZED/9GRA//RkQP/0ZED/9GR + A//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZID/8uOB/+BYyX/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/0hGRmn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AT07 + O608Ojr/PDo6/zw6Ov88Ojr/PDo6/zw5Ov9GPjn/r34T/9GRA//RkgP/0ZED/9GRA//RkQP/0ZED/9GR + A//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GR + A//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GR + A//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GR + A//RkQP/0ZED/9GRA//RkgP/0ZED/9WbJv/crGT/3bBz/92wc//dsHP/3bBz/92wc//dsHP/3bBz/92w + c//dsHP/3bBz/92wc//dsHP/3bBz/92wc//dsHP/3bBz/92wc//dsHP/3bBz/92wc//dsHP/3bBz/96x + dP/crWb/1p0t/9GSBv/RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GRA//RkQP/0ZED/9GR + A//QkQP/0pEE/7WBEP9aTDL/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDk52wEBAQP///8B////Af// + /wH///8B////Af///wH///8B////Af///wFRUVEjPDo6/Tw6Ov88Ojr/PDo6/zw6Ov88Ojr/PTo6/3Zc + Kv/IjQf/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KR + A//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KR + A//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KR + A//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9KSA//SkgP/0pMH/9ig + OP/dr27/3rBz/92wc//dsHP/3bBz/92wc//dsHP/3bBz/92wc//dsHP/3bBz/92wc//dsHP/3bBz/92w + c//dsHP/3bBz/92wc//dsHP/3bBz/92wc//dsHP/3rFz/96xc//bqlz/1Zkd/9GRBP/SkgP/0pID/9KR + A//SkQP/0pED/9KRA//SkQP/0pED/9KRA//SkQP/0pED/9GRA//SkQP/zY8F/4lnIf9CPTn/PDk5/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/SkZGUf///wH///8B////Af///wH///8B////Af///wH///8B////AUJA + QI88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov9MQzb/pngW/9KRA//TkQP/05ED/9ORA//TkQP/05ED/9OR + A//TkQP/05ED/9ORA//TkQP/05ED/9ORA//TkQP/05ED/9ORA//TkQP/05ED/9ORA//TkQP/05ED/9OR + A//TkQP/05ED/9ORA//TkQP/05ED/9ORA//TkQP/05ED/9ORA//TkQP/05ED/9ORA//TkQP/05ED/9OR + A//TkQP/05ED/9ORA//TkQP/05ED/9ORA//TkQP/05ED/9ORA//TkQP/05ED/9ORA//TkQP/05ED/9OR + A//TkQP/05ED/9ORA//TkQP/0pEE/9OSA//TkQT/1JMN/9mlSf/gsHP/3rBz/9+wc//fsHP/37Bz/9+w + c//fsHP/37Bz/9+wc//fsHP/37Bz/9+wc//fsHP/37Bz/9+wc//fsHP/37Bz/9+wc//fsHP/37Bz/9+w + c//fsHT/3rFz/9+wcv/bp1H/05QN/9ORBP/SkQP/05ED/9ORA//TkQP/05ED/9ORA//TkQP/05ED/9OR + A//TkQP/05EE/9SRA//UkQP/tYAR/1lLMv88Ojr/PDk6/zw6Ov88Ojr/PDo6/zw6Ov88Ozu/////Af// + /wH///8B////Af///wH///8B////Af///wFKSkoHPDo66zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/3BZ + Kv/Fign/05ID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SS + A//UkgP/1JID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SS + A//UkgP/1JID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SS + A//UkgP/1JID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SSA//TkgP/1JID/9SS + A//UkgP/1JYR/9yqWf/fsHL/37By/9+wcv/fsHL/37By/9+wcv/fsHL/37By/9+wcv/fsHL/37By/9+w + cv/fsHL/37By/9+wcv/fsHL/37By/9+wcv/fsHL/37By/9+xc//fsHP/37Fy/96wcP/aoj//1JID/9OS + A//UkgP/1JID/9SSA//UkgP/1JID/9SSA//UkgP/1JID/9SSA//TkgP/1JID/9SSA//QkAX/fmEm/0A8 + Of88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov9PT08l////Af///wH///8B////Af///wH///8B////AUdE + RFk8Ojr/PDo6/zw6Ov87OTr/PDo6/zw6Ov9JQjf/m3Ia/9KSAv/TkgL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkgP/1ZkZ/92rWv/fsnD/37Fx/9+y + cf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+x + cf/fsXH/37Fx/9+xcf/fsXH/37Jw/96wav/Xniv/1JIF/9OSAv/TkgL/05IC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv+1gRH/TEM2/zs6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/z07 + O4n///8B////Af///wH///8B////Af///wH///8BOzo6tTw6Ov88Ojr/PDo6/zw6Ov88Ojr/PTo6/2NR + L//DiAv/05IC/9OSA//TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9OR + Av/TkQL/1JED/9KSAf/UkgT/15of/9yrW//esXD/37Fw/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+x + cf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Jw/92t + X//Xmh7/1JMD/9OSAv/TkgP/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9ORAv/TkQL/05EC/9KS + A/9vWCz/PDk6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDk54wEBAQP///8B////Af///wH///8B////AVZW + SBM8Ojr5PDo6/zw6Ov88Ojr/PDo6/z06Ov9BPDn/iGci/9OSA//TkwL/1JMC/9SSAv/UkgL/1JIC/9SS + Av/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/1JIC/9SS + Av/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/1JIC/9SS + Av/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/1JIC/9SS + Av/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/05MC/9STA//UlAT/15wi/96s + Xv/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+x + cf/fsXH/37Fx/9+xcf/fsXH/37Fx/96ycf/fsXH/37Fv/9ynTf/VlxH/1JMC/9STAv/UkgL/1JIC/9SS + Av/UkgL/1JIC/9SSAv/UkgL/1JIC/9SSAv/UkgL/1JMC/6d5Fv89Ozr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PT09Pf///wH///8B////Af///wH///8BQD09Yzw6Ov88Ojr/PDo6/zw6Ov88Ojr/PTk6/0lB + N/+2gxH/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9ST + Av/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9ST + Av/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9ST + Av/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9ST + Av/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UlAP/2Jwg/96vZ//fsnH/37Fy/+Cxcf/fsXH/37Fx/9+x + cf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+xcf/fsXH/37Fx/9+x + cf/fsXH/37Bs/9qiOP/VlAf/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9STAv/UkwL/1JMC/9ST + Av/UkwL/yIwI/1JINf88Ojr/PDo7/zw6Ov88Ojr/PDo6/zw6Ov87OTmT////Af///wH///8B////Af// + /wE8OTmxPDo6/zw6Ov88Ojr/PDo6/z06Ov88Ojr/Y1Iv/9GSA//UlAH/1JQB/9SUAf/UlAH/1JQB/9SU + Af/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SU + Af/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SU + Af/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SU + Af/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9ST + Af/UlAL/2Z4l/9+vZ//fsnH/4LJx/+Cycv/gsnL/4LJy/+Cycv/gsnL/4LJy/+Cycv/gsnL/4LJy/+Cy + cv/gsnL/4LJy/+Cycv/gsnL/4LJy/+Cycv/gsnL/4LJy/+Cycv/gsnL/37Bp/9icHv/UlAH/1JQB/9SU + Af/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/UlAH/1JQB/9SUAf/RkgP/gmMl/z06Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6OuH///8B////Af///wH///8BLCwsBzw6OvM8Ojr/PDo6/zw6Ov88Ojr/PDo6/z05 + Of+YcR7/1ZQB/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WU + AP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WU + AP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WU + AP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WU + AP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQB/9WUAf/UlAP/2J4m/96vYv/fsm7/4LNw/+Cz + cP/gs3D/4LNw/+CzcP/gs3D/4LNw/+CzcP/gs3D/4LNw/+CzcP/gs3D/4LNw/+CzcP/gs3D/4LNw/+Cz + cP/gs3D/4LNw/+CzcP/fs3D/3a1Z/9WWCP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WUAP/VlAD/1ZQA/9WU + AP/VlAD/1ZQA/9SUAP+sfRL/RD85/z06Ov89OTr/PDo6/zw6Ov88Ojr/PDo6/0pERCv///8B////Af// + /wE7OztDPDo6/zw6Ov88Ojr/PDo6/zw6Ov89OTr/RD86/8CIDP/WkwH/1pMA/9aTAP/WkwD/1pMA/9aT + AP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aT + AP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aT + AP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aT + AP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aT + AP/XkwH/1pMB/9WTAf/WlQX/2aAs/9+uY//fsm//37Jv/9+yb//fsm//37Jv/9+yb//fsm//37Jv/9+y + b//fsm//37Jv/9+yb//fsm//37Jv/9+yb//fsm//37Jv/9+yb//fsm//37Jv/9+yb//esm3/2qIz/9aU + Av/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WlAH/1ZQB/7+HC/9gUDD/PDo6/zw5 + Ov88Ojr/PDo6/zw6Ov88Ojr/REJCc////wH///8B////ATw6OoM8Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov9gUDH/z48E/9aTAf/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aT + AP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aT + AP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aT + AP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aT + AP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9aTAP/WkwD/1pMA/9WUAv/WlQb/2qEu/9+y + av/gsnD/4LJv/+Cyb//gsm//4LJv/+Cyb//gsm//4LJv/+Cyb//gsm//4LJv/+Cyb//gsm//4LJv/+Cy + b//gsm//4LJv/+Cyb//gsm//37Jv/+CycP/erFv/2JoW/9aTAf/WlAD/1pMA/9aTAP/WkwD/1pMA/9aT + AP/WkwD/1pMA/9aTAP/WkwD/zY4F/31hJf88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov89PDyz////Af// + /wH///8BPDo6vzw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo7/4VnJP/TkwP/2JUA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15YB/9iVAf/YlwX/3KM1/+Gzbv/itG//4rNv/+Kzb//is2//4rNv/+Kz + b//is2//4rNv/+Kzb//is2//4rNv/+Kzb//is2//4rNv/+Kzb//is2//4rNv/+Kzb//is27/4rRv/+Gy + a//cpTz/15YE/9aVAf/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/WlAH/mHEa/0M+ + Of88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw5Oe3///8B////ATQ0NAU8Ojr1PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov9BPTr/qnsV/9aWAf/XlgD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/YlQD/15YA/9eW + Af/XlwX/3KU3/+Gyav/hs2//4bNv/+Gzb//hs2//4bNv/+Gzb//hs2//4bNv/+Gzb//hs2//4bNv/+Gz + b//hs2//4bNv/+Gzb//hs2//4bNv/+G0b//gs2//4bNv/9+uW//ZnBr/15YB/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP+xfxL/Vkk0/zs6Of88Ojr/PDo6/zw6Ov88Ojr/PDo6/1BQ + UCv///8BSEhILzw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/1NINf+5gw7/15UB/9eWAf/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eWAf/YlgH/15YA/9eVAf/XlQD/15YA/9eV + AP/XlQD/15YA/9eVAf/XlQH/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eWAf/YmQ7/3qpL/+Gzbf/hs27/4bNu/+Gz + bv/hs27/4bNu/+Gzbv/hs27/4bNu/+Gzbv/hs27/4bNu/+Gzbv/hs27/4bNu/+Gzbv/hs27/4bNu/+Gz + bv/hs27/4bJr/9uiMP/YlgP/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/8SL + Cv9lUi3/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/R0REX////wFHRERdPDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/aVUt/8SKCv/WlgD/2JUB/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eW + AP/XlgH/15YB/9iWAf/XlgH/15YA/9iVAf/XlQD/15UB/9eWAf/XlgH/15YB/9eVAf/YlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/15UA/9eV + AP/XlQD/1pUB/9eWAv/boiz/4LFk/+GzbP/hs2z/4bNs/+GzbP/hs2z/4bNs/+GzbP/hs2z/4bNs/+Gz + bP/hs2z/4bNs/+GzbP/hs2z/4bNs/+GzbP/hs2z/4bNs/+GzbP/hs2z/3alI/9mYC//XlQD/15UA/9eV + AP/XlQD/15UA/9eVAP/XlQD/15UA/9eVAP/XlQD/0pME/3VdJ/8+Ozr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov89PDyN////AUJAPos8Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov98YSX/zpEG/9iWAf/ZlwH/2JYB/9iW + Af/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iW + Af/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iW + Af/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JcB/9iXAv/YmQv/2p0Z/9uhJv/cozD/3aU4/9yn + PP/dp0D/3aY9/92mOf/coi//258j/9qbE//XlwX/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iW + Af/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlwH/2JYB/9qeHf/hr13/47Nt/+Oz + bf/js23/47Nt/+Ozbf/js23/47Nt/+Ozbf/js23/47Nt/+Ozbf/js23/47Nt/+Ozbf/js23/47Nt/+Oz + bf/js23/47Nt/+Ozbf/gr1z/2psS/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iW + Af/YlwH/imoh/0M9OP88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw5Obv///8BPTo6szw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/Pjw6/5BsHv/WlQP/2JcB/9iXAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iW + Af/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iW + Af/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlwH/2JcB/9eXAf/XlwH/2JcC/9mZB//Zmg3/2p0a/92k + M//fqkr/4rBe/+KyaP/jsmn/47Jq/+Oyav/jsmv/47Jr/+Oya//jsmv/47Jr/+Oyav/jsmr/47Jp/+Kx + ZP/grE3/3aQu/9qcFf/ZmQn/2JYC/9eXAf/YlwH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iX + Af/XlwH/2JYB/9iXAf/ZlgH/258f/+GvXf/jsmz/47Js/+OybP/jsmz/47Js/+OybP/jsmz/47Js/+Oy + bP/jsmz/47Js/+OybP/jsmz/47Js/+OybP/jsmz/47Js/+OybP/jsmz/47Ns/+KyaP/anBf/2JYB/9iW + Af/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iXAf+hdhf/SUE2/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDk54////wE8OjrVPDo6/zw6Ov88Ojr/PDo6/zw6Ov9HQTj/nnUZ/9iWAf/YlwH/2JcB/9iW + Af/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iW + Af/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JcB/9iX + Af/YlwH/2ZkI/9qdGP/boin/3qlA/9+vV//is2z/4rNs/+KzbP/is2z/4rNs/+KzbP/is2z/4rNs/+Kz + bP/is2z/4rNs/+KzbP/is2z/4rNs/+KzbP/is2z/4bRs/+KzbP/itGv/4LFj/96qSP/boST/2ZoM/9iX + Af/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2ZcB/9iXAf/YlwH/2ZcB/9mZBv/dpjj/4bJn/+Kz + bP/is2z/4rNs/+KzbP/is2z/4rNs/+KzbP/is2z/4rNs/+KzbP/is2z/4rNs/+KzbP/is2z/4rNs/+Kz + bP/is2z/4rNs/+KzbP/is2z/4bJq/9qdGf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iWAf/YlgH/2JYB/9iW + Af/YlgH/2JcB/7WCEf9ORDT/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr9SkpKBzw6OvU8Ojr/PDo6/zw6 + Ov88Ojr/PDo6/1BHNP+rfRT/2JgB/9mXAf/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iX + AP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iX + AP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YmAL/2ZsO/9yiKP/eqUH/4K9Y/+GzZ//htGv/4bRr/+G0 + a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0 + a//htGv/4bRr/+G1a//htWv/4rRr/+GzY//eqT//2pwR/9iXAP/YmAD/2ZcB/9mXAf/ZmAD/2ZgA/9mY + AP/ZlwH/2ZgE/9mbDP/boB3/3ac6/+CxXv/htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0 + a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0av/gsmX/2Z0V/9iX + AP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwH/xIwL/1NHMv88Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov9NTU0lPDo6/zw6Ov88Ojr/PDo6/zw6Ov89Ojr/WEsy/7aDEf/YlwD/2JcA/9iX + AP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iX + AP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iXAf/YlwD/2ZcB/9iXAP/ZlwH/2ZsP/92n + OP/frlP/4LJi/+G0av/htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0 + a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+C0a//htGv/4bRr/+G0aP/grVL/3aUx/9ue + Gf/Zmgn/2ZoJ/9ufG//coyr/3aY1/96oPP/eqkH/36pE/9+rSf/frU//365U/+CwXf/hs2j/4bRr/+G0 + a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0 + a//htGv/4bRr/+G0a//htGv/4bRr/9+uVv/ZnA//2JcA/9iXAP/YlwD/2JcA/9iXAP/YlwD/2JcA/9iX + AP/YlwD/2JcA/9iXAP/RlAX/WEsx/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/0VBQUU8Ojr/PDo6/zw6 + Ov88Ojr/PDo6/zs6Ov9hUC7/wIkL/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mY + AP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mY + AP/ZlwD/2ZgB/9mYAf/ZmQT/2p0S/92oOv/hsmD/4bRo/+G1av/htWv/4bRr/+G0a//htGv/4bRr/+G0 + a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0 + a//htGv/4LRq/+GyYv/fq0X/26Ab/9qcDf/cnxf/3qc2/+CvUv/hsmH/4bNl/+GzZv/hs2f/4bRp/+G0 + af/htGr/4bVq/+G0av/htWv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0 + a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGv/4bRr/+G0a//htGn/3qc4/9qZ + Bv/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgB/9iZAP9jUzD/PDo6/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/Pjs7WTw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/2ZULP/Ijgn/2ZgA/9mY + AP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mY + AP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAf/ZmAH/250Q/96mMv/islv/5LZq/+W2 + af/ktmr/5LZq/+W1af/ktmr/5LZq/+S2av/ktmr/5LZq/+S2av/ktmr/5LZq/+S2av/ktmr/5LZq/+S2 + av/ktmr/5LZq/+S2av/ktmr/5LZq/+S2av/ktmr/5LZq/+S1Zv/hrlH/3KEe/9ubCv/doSL/4KxG/+S0 + Zf/ltmr/5bZq/+S2av/ktmr/5LZq/+S2av/ktmr/5LZq/+O2av/ktmr/5LZp/+S2av/ktmr/5LZq/+S2 + av/ktmr/5LZq/+S2av/ktmr/5LZq/+S2av/ktmr/5LZq/+S2av/ktmr/5LZq/+S2av/ktmr/5LZq/+S2 + av/ktmr/5LZq/+S2av/ktmr/5LZp/+GwVf/bnxj/2ZgB/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mY + AP/ZmAD/2ZgA/9mYAP/ZmAD/2pgA/3JbKv88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88OjptPDo6/zw6 + Ov88Ojr/PDo6/z06Ov88Ojr/a1cr/82SB//ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mY + AP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mY + AP/ZmAD/2ZoD/9yhHv/hrkv/47Zn/+O2af/ktmn/5LZp/+O3af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktWX/4KxD/9ydEP/bnhP/4Ko//+KzYP/ktmn/5bdp/+S2af/ktmn/47Zp/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+W2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/js2D/3aQq/9qa + BP/ZmAH/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mYAP/ZmAD/2ZgA/9mZAP/ZmAH/fGEm/zw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6On88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw5Ov9vWSn/0pUE/9qZ + AP/amQD/2pkA/9qZAP/amQD/2pkA/9qZAP/amQD/2pkA/9qZAP/amQD/2pkA/9qZAP/amQD/2pkA/9qZ + AP/amQD/2pkA/9qZAP/amQD/2pkA/9qZAP/ZmQD/2ZkA/9ubB//fpjD/4rFZ/+S2aP/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZo/+GuSv/cnhH/254R/+KvT//jtmf/5Ldp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S3 + af/lt2n/5bZp/+S2av/ktmr/47Vk/96kKv/amgb/2pkA/9qZAP/amQD/2pkA/9qZAP/amQD/2pkA/9qZ + AP/amQD/2pkA/9qZAP/amQD/2pkA/9qZAP+FZyT/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/Ozo6iTw6 + Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/3JcKv/XmAX/2poA/9qaAP/amgD/2poA/9qaAP/amgD/2poA/9qa + AP/amgD/2poA/9qaAP/amgD/2poA/9qaAP/amgD/2poA/9qaAP/amgD/2poA/9qaAP/amgD/2poA/9qa + Af/bnQz/36o//+S1ZP/kt2n/5LZp/+S3av/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5bZp/+O2 + af/js1//3aMg/9yeDv/hrkz/5LZo/+O2av/ltmn/5LZq/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5Ldp/+W2av/jt2n/5LVn/+KwVf/eoh//2ZsD/9ua + AP/amgH/2poB/9qaAP/amgD/2poA/9qaAP/amgD/2poA/9qaAP/amgD/2poA/9qaAP/amgD/2psB/4tr + I/88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov87OTmPPDo6/zw6Ov88Ojr/PDo6/zw5Ov88Ojr/dFwq/9eZ + Bf/amgD/2poA/9qaAP/amgD/2poA/9qaAP/amgD/2poA/9qaAP/amgD/2poA/9qaAP/amgD/2poA/9qa + AP/amgD/2poA/9qaAP/amgD/2poA/9qaAP/amgD/3J0O/+KvTP/ktmn/47Zo/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ltmn/5LZp/+GvT//bnQr/4Ko7/+O1Zf/ltmn/5LZp/+S2 + af/ktmj/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2af/ktmn/5LZp/+S2 + af/ktWj/47Rg/+KwUf/fqDD/25wK/9qaAf/amgH/2poA/9qbAP/ZmgH/2poA/9qaAP/amgD/2poA/9qa + AP/amgD/2poA/9qaAP/amgD/2poA/9qaAf/ZmgD/jWwh/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zs6 + OpU8Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6O/9zXCj/2JgE/9uaAP/bmgD/25oA/9uaAP/bmgD/25oA/9ua + AP/bmgD/25oA/9uaAP/bmgD/25oA/9uaAP/bmgD/25oA/9uaAP/bmgD/25oA/9uaAP/bmgH/3JoB/92f + Ev/irkf/5LZo/+O2aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2 + aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2 + Z//jtmf/36g2/92hGf/jslf/47Zo/+S2Z//ktmj/5LZo/+O2aP/ktmf/5Ldn/+S2aP/ktmj/5LZo/+S2 + aP/jtmj/5LZo/+S2aP/jtmj/47Zn/+S2Z//kt2f/5LZo/+S2aP/ktmj/47Zn/+S2aP/ktmj/5LZo/+S2 + Z//ktmf/5LZo/+S2aP/ktmf/5LZo/+O3Zv/jtF//4bBR/+CrQP/epSn/3Z0N/9ubAf/bmgD/25oA/9ua + AP/bmgD/25oA/9uaAP/bmgD/25oA/9uaAP/bmgD/25oA/9uaAP/bmgD/25oA/9uaAP/bmgD/25oA/9ua + AP+ObCD/PDo6/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6lTw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/3Nb + Kv/YlwX/3JkA/9yZAP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZ + AP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yaAf/dnQ3/4q1D/+S2Zf/kt2j/5LZo/+S2aP/ktmj/5LZo/+S2 + aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2 + aP/ktmj/5LZo/+S2aP/ktmj/5LZo/+S2aP/ktmj/47do/+S3Zv/dohz/36cs/+S2Zf/ktmf/47NY/+Gv + Sf/hq0D/4as9/+GrQf/hrkj/4bBP/+OyVv/jtF3/5bZj/+S2Z//ktmj/5bdo/+S3aP/kt2j/5bZo/+S2 + aP/ktmj/5LZo/+S2aP/kt2j/5Ldo/+S2aP/lt2j/5Ldo/+S1Z//ktGD/47JW/+GvS//hqj3/4KYs/96j + H//dnxT/3JsH/9yaAf/cmgH/25oA/9yZAP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZ + AP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZAP/cmgD/3JoB/4xrIv88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov87OTmPPDo6/zw6Ov88Ojr/PDo6/zw6Ov88OTr/cFko/9WWBP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZ + AP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZAP/cmQD/3ZwH/+Cp + Nf/ltWL/5bdm/+W2Zv/lt2X/5bZm/+W2Zv/ltmb/5bZm/+W2Zv/ltmb/5bZm/+W2Zv/ltmb/5bZm/+W2 + Zv/ltmb/5bZm/+W2Zf/ltmX/5bZl/+W2Zf/ltmX/5bZl/+W2Zf/ltmb/5bZm/+W2Zv/ltmb/5bZm/+W2 + Zv/kt2b/5LNZ/9ydCf/gqDT/4q5F/96jIf/dng//3JwK/92bCP/dnAf/3ZwI/9ydCv/dnQz/3Z4O/9yf + EP/dnxL/3aAW/96hHP/fpCH/36Uo/+CnLP/hpy7/4Kgx/+CoNP/gqDT/4Kg0/9+oMf/gpy3/36Yq/96l + Jf/eoh7/3qAW/92fEf/dng//3ZwK/92cB//cmwP/3ZkB/9yaAf/bmgD/25oA/9yaAP/cmgH/3JkA/9yZ + AP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZAP/cmQD/3JkA/9yZAP/cmQD/3JkA/9ya + AP/cmgH/iGgl/zw6Ov88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ooc8Ojr/PDo6/zw6Ov88Ojr/PDk6/zs5 + Ov9rVyr/0JQH/9yaAf/cmQD/3JkB/9uaAf/cmgH/3JoB/9yZAP/cmgH/3JkA/9yaAP/cmgD/3JoA/9ya + Af/cmQH/25oB/9yaAv/cmwL/3JoD/9ycBf/fpyn/5bZk/+W4af/muGr/5rhq/+a4av/muGv/5rlr/+a5 + bP/muWz/5rlt/+a5bf/muW3/5blu/+a5bv/lum//5bpu/+W5a//ltl//4q5F/+CnKv/doxf/3aER/96j + GP/gpib/4q5B/+W2Yf/mu2//6L10/+e9dv/nvXf/5712/+e8cv/irT//3qMb/9+kHf/eohn/36IZ/96i + Gf/eoRr/3qEY/92hFf/eoRX/3aAT/96gEf/eoBH/3p8R/96fEP/enhH/3p8O/96eDv/eng3/3p0N/92e + Df/dnQz/3Z0L/9yeDP/cngz/3ZwK/96cCf/dnAn/3J0I/92cB//cnAf/3ZwG/92bBv/cnAX/3JsD/9yb + BP/cmgL/3JsC/9yaAf/cmQD/3JoB/9yaAP/cmQD/3JkA/9yaAP/cmgH/3JoA/9yaAf/cmQD/3JkA/9yZ + AP/dmQD/3JkB/9yZAP/cmQH/3JoA/9yaAf/cmgD/3JoA/9yaAf99YiX/PDo6/zw6Ov88Ojr/PDo6/zw6 + Ov88Ojr/PDo6fTw6Ov88Ojr/PDo6/zw6Ov88Ojr/Ozo6/2dVLf/LkAn/3ZoA/9ybAf/dmwL/3JsE/92d + Bv/dnQj/3p8L/96fDf/fnw//36AS/9+hE//fohX/3qIX/+CjGf/fpBr/4KUe/9+lIP/gpiP/4asw/+i9 + cP/pwoP/6sOE/+rEhv/qxIf/6sWI/+nFif/qxov/68aM/+vGjv/rx4//68iQ/+vIkf/ryJH/68eS/+zJ + lP/qxYj/57xr/+W0Uf/jsEn/5bFJ/+OxSf/lsEn/47FJ/+OxSf/lsUn/5LJN/+a5Yf/pv3X/6sKB/+rE + hf/pw4H/57xr/+SyTv/ksUn/5LJJ/+SwSf/ksEn/5LFI/+OxSP/ksUn/47BJ/+OwSP/jsEn/5LFI/+Sw + Sf/ksEn/5LBJ/+SwSP/ksEX/5LBF/+SwRP/ksET/469D/+OvQP/jrz7/464+/+OtPf/irTr/4qw4/+Ks + N//irDP/4qoy/+KqMf/hqS3/4aks/+CoKv/gpyb/4acl/+CmIv/gpSD/4KQe/+CjG//foxr/36IY/9+h + Fv/foRT/36AS/9+gEP/fnw7/354M/96eCv/dnQf/3ZwF/92cBP/dmwL/3ZoB/9yaAP/dmgD/3ZoB/92a + AP/dmwH/3JoB/3NdK/88Ojr/PDo6/zw6Ov88Ojr/PDo6/zw6Ov87OTlrPjw8/0JAQP9GRET/S0lJ/09N + Tf9TUVH/eGhI/8uZKv/hpiP/4acn/+KpKf/iqSz/4qkv/+KqMf/jrDX/4603/+StOf/krjz/5K49/+Sv + QP/ksEH/5bRO/+a5YP/ltEz/5LJG/+SxR//ovW3/7MqV/+zKlv/rypb/7MqW/+zKlv/sypX/7MqV/+zK + lf/typX/7MqV/+zKlf/sypX/7MqV/+zKlf/syZb/68WG/+e5Xv/lsUf/5bJG/+SyRv/lskf/5bFG/+Wy + Rv/lskf/5bJH/+WyR//lskf/5LFG/+WySv/ltVH/5rZW/+a0Uv/lskn/5bJG/+WyRv/msUf/5bFG/+Wx + Rv/lsUf/5bFG/+WyRv/lsUb/5bJH/+WxRv/lsUb/5bFG/+WxRv/lsUb/5bFG/+WxRv/lsUb/5bFH/+Wy + R//lsUb/5bFG/+WxRv/lsUb/5bJG/+WxR//lskb/5bFG/+WyRv/lskb/5bJG/+WxRv/lskf/5bFG/+Wx + Rv/lsUf/5bFG/+SxR//lskb/5bFF/+WxRP/ksUL/5K9A/+SuPv/krzz/5K45/+OtOP/jrTb/46sz/+Kr + Mf/iqS//4qkt/+KpKv/iqCf/4ack/+CmIf/hpB3/4KMZ/+CjFv/foRL/cmI9/0dFRf9EQkL/QD4+/z07 + O/89Ozv/PDo6/z88PFdxb27/cnBv/3Rycf92dHP/eHV0/3l4dv+Og23/zqVP/+WxQ//lskX/5bJF/+Wy + Rf/lskX/5bJF/+WyRf/lskX/5bJF/+azRv/lsUX/5bJF/+a1Tv/pwnv/6saM/+i8Z//ms0X/5rRN/+vG + if/sypX/7MqV/+zKlf/sypX/7MqV/+zKlf/sypX/7MqV/+zKlf/sypX/7MqV/+zKlf/sypX/68mV/+rG + h//nuV3/5bJG/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+Wy + Rf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+Wy + Rf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+Wy + Rf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+Wy + Rf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskX/5bJF/+WyRf/lskP/5bFC/+Wx + Qf/ksD//5LA+/+GuP/+MgGn/dHJx/3NxcP9xb27/b21t/2poaP9lY2L/YmJiQ399fPN/fXz/f318/399 + fP9/fXz/gH18/4yEdv/HpFX/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5rNE/+Sz + Q//ltEn/6cFy/+zLkv/typP/6cBw/+azRP/nu2P/7MmR/+zKlP/sypT/7MqU/+zKlP/sypT/7MqU/+zK + lP/sypT/7MqU/+zKlP/sypT/7MqU/+zKlP/rx43/6Lti/+azRf/ls0T/5bNE/+WzRP/ls0T/5bNE/+Wz + RP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+Wz + RP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+Wz + RP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+Wz + RP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+Wz + RP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ls0T/5bNE/+WzRP/ms0P/2a1M/46FdP9/fXz/f318/399 + fP9/fXz/f318/358e/+EhIQjfXx70X99fP9/fXz/f318/399fP9+fXv/h4F5/8CgWf/ls0P/5bND/+Wz + Q//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//mtET/5bNE/+i7X//syIz/68uU/+zJkP/ovGP/5bNE/+nB + d//typT/7MqU/+zKlP/sypT/7MqU/+zKlP/sypT/7MqU/+zKlP/sypT/7MqU/+zKlP/sypT/7MqT/+rC + eP/mtEn/5bRD/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+Wz + Q//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+Wz + Q//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+Wz + Q//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+Wz + Q//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+WzQ//ls0P/5bND/+Wz + Q//ls0P/5bND/+WzQ//Op1L/jIN2/399fP9/fXz/f318/399fP9/fXz/f318/WdnZwV8e3mxf318/399 + fP9/fXz/f318/399fP+Bfnz/t5te/+WyRf/nskL/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+ez + Qv/ntEv/68N7/+zKlP/typT/6saH/+e1TP/ntUr/68WA/+zLlP/sypT/7MqU/+zKlP/sypT/7MqU/+zK + lP/sypT/7MqU/+zKlP/sypT/7MqU/+zKlP/syI//57pc/+azQ//nskL/57JD/+eyQ//nskP/57JD/+ey + Q//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+ey + Q//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+ey + Q//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+ey + Q//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+ey + Q//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/57JD/+eyQ//nskP/5rJC/8KhWf+IgXj/f318/399 + fP9/fXz/f318/399fP9/fXzh////AX17e4d/fXz/f318/399fP9/fXz/f318/399fP+slGT/4bBG/+az + Qf/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NB/+i6Xf/syZH/7MqU/+3Klf/pvWX/57NC/+i3 + UP/rxoP/7MqV/+zKlP/sypT/7MqU/+zKlP/sypT/7MqU/+zKlP/sypT/7MqU/+zKlP/sypX/7MqU/+vH + iP/ntUb/57NC/+izQv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ez + Qv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ez + Qv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ez + Qv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ez + Qv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ezQv/ns0L/57NC/+ez + Qv/ns0L/57NC/+ezQv/ns0L/tpph/4SAev9/fXz/f318/399fP9/fXz/f318/398fLf///8Bgn9/WX99 + fP9/fXz/f318/399fP9/fXz/f318/56ObP/brUn/6LNC/+e0Qf/ns0H/57NB/+ezQf/ns0H/57NB/+ez + Qf/otEL/68aD/+zKlf/sypT/6sR9/+e1Rv/ns0L/6LhT/+vGhv/sypX/7MqU/+zKlP/sypT/7MqU/+zK + lP/sypT/7MqU/+zKlP/sypT/7MqU/+zKlf/sypT/68F2/+azQv/ntEH/57NB/+ezQf/ns0H/57NB/+ez + Qf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ez + Qf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ez + Qf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ez + Qf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ez + Qf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+ezQf/ns0H/57NB/+SzRP+mkmj/gX18/399 + fP9/fXz/f318/399fP9/fXz/fnx8if///wGDfn4rf318/399fP9/fXz/f318/399fP9/fXz/j4V1/9Op + TP/ntT//57M//+e0P//ntD//57Q//+e0P//ntED/57Q//+q6WP/sypX/7cqU/+zHhv/ouVL/57Q//+e0 + P//ouFD/68aF/+zLlf/sypT/7MqU/+zKlP/sypT/7MqU/+zKlP/sypT/7MqU/+zKlP/sypT/7MqU/+zK + lf/qvmf/57Q//+ezP//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0 + P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0 + P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0 + P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0 + P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0P//ntD//57Q//+e0 + P//ntD//57Q//+e0P//ntD//2q1J/5uMbv9/fXz/f318/399fP9/fXz/f318/399fP+Cgn9b////AVZW + VgN/fXzxf318/399fP9/fXz/f318/399fP+Df3r/yKRS/+i0Pv/osz7/6LM+/+izPv/osz7/6LQ+/+iz + Pv/otEH/68N5/+3KlP/syY//6r5k/+i0Qv/osz7/6LM+/+m4Tf/rxoT/7MqV/+zKlP/sypT/7MqU/+zK + lP/sypT/7MqU/+zKlP/sypT/7MqU/+zKlP/sypX/7cqU/+m8YP/osz7/6LM+/+izPv/osz7/6LM+/+iz + Pv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+iz + Pv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+iz + Pv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+iz + Pv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+iz + Pv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/osz7/6LM+/+izPv/Op1D/kYd0/35+ + fP9/fXz/f318/399fP9/fXz/f318/4uEhCX///8B////AX59fLl/fXz/f318/399fP9/fXz/f318/399 + fP+1ml7/5rM+/+i0Pf/otD3/6LQ9/+i0Pf/otDz/6LU8/+q6Uv/tyYr/7cuU/+vFff/ot0n/6LQ9/+i1 + Pf/ntT3/6bdI/+3Ggf/ty5T/7cuU/+3LlP/ty5T/7cuU/+3LlP/ty5T/7cuU/+3LlP/ty5T/7cuU/+3L + lP/ty5X/6rxe/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0 + Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0 + Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0 + Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0 + Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/+i0 + Pf/otD3/6LQ9/+i0Pf/otD3/6LQ9/8GgV/+GgXr/f317/399fP9/fXz/f318/399fP9/fXzp////Af// + /wH///8Bfnx8f399fP9/fXz/f318/399fP9/fXz/f318/5yMbf/jsj//6bU7/+i1O//otTv/6LU7/+i1 + O//otT3/68Ft/+/Mkv/vy5D/68Bn/+i1PP/otjv/57U6/+i1O//puEb/7seA//DMlP/vzJT/78yU/+/M + lP/vzJT/78yU/+/MlP/vzJT/78yU/+/MlP/vzJT/78yU/+/MlP/rv2L/6LU7/+i1O//otTv/6LU7/+i1 + O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1 + O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1 + O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1 + O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1 + O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//iskD/rpdi/4B+ + e/9/fXv/f318/399fP9/fXz/f318/398fK////8B////Af///wF4eHg9f318/399fP9/fXz/f318/399 + fP9/fXz/hH97/9quRP/otTr/6LU7/+i1O//otTv/6LU7/+m5S//tx4H/78yV/+7Ki//pu1L/6LU7/+i1 + O//otTv/6LU7/+m4Sf/ux4L/78yU/+/MlP/vzJT/78yU/+/MlP/vzJT/78yU/+/MlP/vzJT/78yU/+/M + lP/vy5X/8MyU/+vDcv/otTv/6bU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1 + O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1 + O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1 + O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1 + O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1O//otTv/6LU7/+i1 + O//otTv/6LU7/+i1O//otTv/57U7/9iuRv+YjHD/f318/4B9fP9/fXz/f318/399fP9/fXz/g4CAbf// + /wH///8B////AUFBQQV/fXzvf318/399fP9/fXz/f318/399fP9/fXz/v59W/+e1Of/ntDr/57Q6/+e0 + Ov/mtTr/6r5d/+7Lj//wzJX/7siF/+i3Q//ntDr/57Q6/+e0Ov/ntDr/6bpO/+7Ihv/vzJT/78yU/+/M + lP/vzJT/78yU/+/MlP/vzJT/78yU/+/MlP/vzJT/78yU/+/MlP/vzJT/7ciE/+e2Pv/ntDr/57Q6/+e0 + Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0 + Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0 + Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0 + Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0 + Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Ov/ntDr/57Q6/+e0Of/mtDr/y6dO/4WB + ev9/fX3/f318/399fP9/fXz/f318/399fP+EhIQj////Af///wH///8B////AX98fKt/fXz/f318/399 + fP9/fXz/f357/39+fP+fjmv/57U6/+i1Of/otTn/6LU5/+i3QP/tw3H/8MyU/+/Mlf/txn3/57Y7/+i1 + Of/otTn/6LU5/+i1Of/rvlr/7sqM/+/Llf/vzJT/78yU/+/MlP/vzJT/78yU/+/MlP/vzJT/78yU/+/M + lP/vzJT/78yU/+/MlP/uy47/6bxW/+i2Ov/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1 + Of/otTn/6LU5/+i1Of/otTn/6LU5/+i2Ov/otTr/6LY5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1 + Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1 + Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1 + Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1Of/otTn/6LU5/+i1 + Of/otTn/6LU5/+i1Of/otTn/57Y5/+W0O/+ymWH/f318/399e/9/fXz/f318/399fP9/fXz/f3182/// + /wH///8B////Af///wH///8Be3h4W399fP9/fXz/f318/399fP9/fXz/f317/4mDdv/Yrkb/6bY5/+i2 + OP/otjj/6bpJ/+7Ih//vzJP/782U/+zDcP/otjn/6LY4/+m2Of/otjj/6Lc8/+vCav/vzZL/8MyT/+/N + k//vzZP/782T/+/Nk//vzZP/782T/+/Nk//vzZP/782T/+/Nk//vzZP/782T/+/Nkv/txnr/6bhC/+i2 + Of/ntjj/6LY5/+e2OP/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY4/+i2OP/otjn/7MJq/+q8 + Vv/otjj/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2 + Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2 + Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2 + Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/otjn/6LY5/+i2Of/ntjj/47M9/5KI + df9/fXz/f318/399fP9/fXz/f318/399fP9/fXuL////Af///wH///8B////Af///wF3d3cNf3189399 + fP9/fXz/f318/4B9fP9/fXz/hH96/7WZXP/ntTj/6bU4/+i1OP/qv1z/782R/+/Nkv/vzJL/6sBl/+i1 + N//otjf/6LU3/+i2N//qu0z/7smC/+/Mkf/uzJL/782R/+/Nkf/vzZH/782R/+/Nkf/vzZH/782R/+/N + kf/vzZH/782R/+/Nkf/vzZH/782R/+7Mj//sw23/6bhA/+m1N//otTf/6bQ3/+i1N//otTf/6LU3/+i1 + N//otTf/6LU3/+i1N//otTf/6bU3/+q9Uv/uyor/68Rx/+i1Nv/otTf/6LU3/+i1N//otTf/6LU3/+i1 + N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1 + N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1 + N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1 + N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//Kpk//gH18/399fP9/fXz/f318/399fP9/fXz/f318/4B8 + fDX///8B////Af///wH///8B////Af///wF+fHuvf318/399fP9/fXz/f358/399fP9/fnv/moxs/92v + P//ptTf/6LY5/+zFcv/vzZH/782S/+/Okf/sxHD/6bY4/+i1N//otTf/6LhA/+zEcP/vzZH/782R//DN + kv/vzZH/782R/+/Nkf/vzZH/782R/+/Nkf/vzZH/782R/+/Nkf/vzZH/782R/+/Nkf/vzZH/782R/+7M + jf/txG//6bpK/+i2OP/otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+m1N//puUP/7MZ3/+/M + kP/txnj/6LY3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1 + N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1 + N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1 + N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/6LU3/+i1N//otTf/5rU6/6OR + aP+AfXz/f318/399fP9/fXz/f318/399fP9/fHzd////Af///wH///8B////Af///wH///8B////AYB9 + fVF/fXz/f318/399fP9/fXz/f318/399fP+Kg3f/xKNP/+m2Nf/qtzn/7smD//DOkf/wzpL/8M6R/+7K + hf/rvVL/6bg8/+q7SP/txW//782P//DOkv/wzpL/8M6S//DOkv/wzpL/8M6S//DOkv/wzpL/8M6S//DO + kv/wzpL/8M6S//DOkv/wzpL/8M6S//DOkv/wzpL/8M6S//DNkf/tyH7/7MFi/+u7Sf/qtzr/6bY1/+m2 + Nf/ptjT/6bY0/+m2Nf/ptjb/6rtI/+3FcP/uzY7/8M6R/+7Hev/ptzf/6bY1/+m2Nf/ptjX/6bY1/+m2 + Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2 + Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2 + Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2 + Nf/ptjX/6bY1/+m2Nf/ptjX/6bY1/+m2Nf/WrUb/i4R1/4B9fP9/fXz/f318/399fP9/fXz/f318/399 + e4H///8B////Af///wH///8B////Af///wH///8BgICABX99fOd/fXz/f318/399fP9/fXz/f318/4B+ + fP+plGL/4rM5/+u4OP/uzI3/8M6T//DOkv/xzpL/8M6R/+/LiP/vyX//8MqE/+/Oj//wzpP/8M6S//DO + kv/wzpL/8M6S//DOkv/wzpL/8M6S//DOkv/wzpL/8M6S//DOkv/wzpL/8M6S//DOkv/wzpL/8M6S//DO + kv/wzpL/8M6S//DOk//vzo7/78qE/+7Ie//txWz/7MFh/+zAW//swVz/7MJl/+7GdP/uy4T/8M2P//DP + kv/wzpL/7sh8/+q4OP/qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2 + M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2 + M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2 + M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6bY0/7OZ + XP+Df3r/fn17/399fP9/fXz/f318/399fP9/fXz9gICAH////wH///8B////Af///wH///8B////Af// + /wH///8Bf317h399fP9/fXz/f318/399fP9/fXz/f318/4qEdf/Mp0j/6rk7//DOkf/vzpL/8M6S//DO + kv/xzpP/8c6S//DOk//xzpL/8M+T//DOkv/wzpL/8M6S//DOkv/wzpL/8M6S//DOkv/wzpL/8M6S//DO + kv/wzpL/8M6S//DOkv/wzpL/8M6S//DOkv/wzpL/8M6S//DOkv/wzpL/786S//HOk//wzpP/8c6S//DO + kf/wzZH/8M2R//HNkf/wzpH/8M6S//DOkv/wzpL/8M6R//HOkv/vy4P/67xI/+q2M//qtjP/6rYz/+q2 + M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2 + M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2 + M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2M//qtjP/6rYz/+q2 + M//qtjP/6rYz/+q2M//qtjP/6rYz/+q3Mv/VrET/lIlv/359e/9/fXz/f318/399fP9/fXz/f318/398 + fLf///8B////Af///wH///8B////Af///wH///8B////Af///wGFfHwdf318+399fP9/fXz/f318/399 + fP9/fXz/f318/6qVYf/ltj7/782Q/+/Nkf/vzZH/782R/+/NkP/wzZL/782R/+/Nkv/vzZH/8M2S/+/N + kf/vzZH/782R/+/Nkf/vzZH/782R/+/Nkf/vzZH/782R/+/Nkf/vzZH/782R/+/Nkf/vzZH/782R/+/N + kf/vzZH/782R/+/Nkf/wzZL/782R/+/Nkf/vzZL/782R/+/Nkf/vzZD/782R/+/Nkv/vzZL/782Q/+/O + kf/vzpH/8M2R/+/Njv/txWv/6rk5/+m3MP/puDD/6bcw/+m3MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3 + MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3 + MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3 + MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+m3MP/ptzD/6bcw/+q3MP/quDD/5rYz/7eb + WP+DgHr/gH18/399fP9/fXz/f318/399fP9/fXz/hISASf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wF+fXujf318/399fP9/fXz/f318/399fP9+fXv/iIN3/9GsSf/uzI3/782R/+/O + kf/vzpD/786Q/+/OkP/vzpD/786Q/+/OkP/vzpD/786Q/+/OkP/vzpD/786Q/+/OkP/vzpD/786Q/+/O + kP/vzpD/786Q/+/OkP/vzpD/786Q/+/OkP/vzpD/786Q/+/OkP/vzpD/786Q/+/OkP/vzpD/786Q/+/O + kP/vzpD/786Q/+/OkP/vzpD/786Q/+/OkP/vzpD/786Q/+/OkP/vzZH/8M2R/+/Miv/swmH/6rk1/+q4 + MP/puC//6rgw/+q4MP/quDD/6rgw/+q4MP/quDD/6rgw/+q4MP/quDD/6rgw/+q4MP/quDD/6rgw/+q4 + MP/quDD/6rgw/+q4MP/quDD/6rgw/+q4MP/quDD/6rgw/+q4MP/quDD/6rgw/+q4MP/quDD/6rgw/+q4 + MP/quDD/6rgw/+q4MP/quDD/6rgw/+q4MP/quDD/6rgw/+q4MP/quDD/6rgw/+q4MP/quDD/6rgw/+q4 + MP/quDD/6rgw/+q4MP/quDD/67gw/+q4MP/XrkD/lopu/399fP9/fXz/f318/399fP9/fXz/f318/4B9 + fdP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AXt7ezF/fXz/f318/399 + fP9/fXz/f318/39+fP9/fXz/pJNp/+3Khf/vzpD/786Q/+/Oj//vzo//786P/+/Oj//vzo//786P/+/O + j//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/O + j//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/O + j//vzo//786P//DOj//vzpD/786Q/+7MiP/swmH/6rgx/+m3L//qty//6rcv/+q3L//qty//6rcv/+q3 + L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3 + L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3 + L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//6rcv/+q3L//qty//5rYy/7ec + WP+Cf3v/f318/399fP9/fXz/f318/399fP9/fXz/goJ/X////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AX59e69/fXz/f318/399fP9/fXz/f318/4B9fP+FgXz/zbaI//DO + kP/vzpD/786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/O + j//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/O + j//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//786P/+/Oj//vzo//7s6P/+/OkP/vzo//8M6Q/+/N + jP/sxGb/6rk4/+u3MP/rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3 + L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3 + L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3 + L//rty//67cv/+u3L//rty//67cv/+u3L//YrT7/i4R3/39+fP9/fXz/f318/399fP9/fXz/f318/398 + fNuAgIAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BgHt7L399 + fP1/fXz/f318/399fP9/fXz/f318/4B9fP+ckYH/48WO/+/PkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DP + kP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DP + kP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DP + kP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wzpD/78+Q//DOjv/vyHT/7b5I/+u4Mv/ruC7/67gv/+y3 + L//ruC//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3 + L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3 + L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67cv/+u3L//rty//67gv/+y4L//ruC7/6LYy/6WS + Y/9/fnv/f318/399fP9/fXz/f318/399fP9/fXz/f3x8Xf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bfnt7p399fP9/fXz/f318/399fP9/fXz/f318/4WC + ff+6qIf/7MyR//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DP + kP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DP + kP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DP + kP/wz5H/8M+R//DPkP/vy4D/7cNc/+y7N//suS3/67kt/+y4Lf/suC3/7Lgt/+y4Lf/suC3/7Lgt/+y4 + Lf/suC3/7Lgt/+y4Lf/suC3/7Lgt/+y4Lf/suC3/7Lgt/+y4Lf/suC3/7Lgt/+y4Lf/suC3/7Lgt/+y4 + Lf/suC3/7Lgt/+y4Lf/suC3/7Lgt/+y4Lf/suC3/7Lgt/+y4Lf/suC3/7Lgt/+y4Lf/suC3/7Lgt/+y4 + Lf/suC3/7Lgt/+y4Lf/ruS3/67kt/+u5Lf/Ipkn/hYB5/399fP9/fnz/f318/399fP9/fXz/f318/399 + fNVWVlYD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGFfHwff3189399fP9/fXz/f318/399fP9/fXz/f319/5OLgP/Uu43/786Q//DPkP/wz5D/8M+Q//DP + kP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DP + kP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DP + kP/wz5D/8M+Q//DPkP/wz5D/8M+Q//DPkP/wz5D/8M+R//HPkf/w0JD/8M+R//DPkf/wzov/78hz/+zA + S//rui//67kr/+u5K//ruSv/67kr/+u5K//ruSv/67kr/+u5K//ruSv/67kr/+u5K//ruSv/67kr/+u5 + K//ruSv/67kr/+u5K//ruSv/67kr/+u5K//ruSv/67kr/+u5K//ruSv/67kr/+u5K//ruSv/67kr/+u5 + K//ruSv/67kr/+u5K//ruSv/67kr/+u5K//ruSv/67kr/+u5K//ruSv/67kr/+u5K//ruSz/2rA6/5qM + av9/fXz/f357/399fP9/fXz/f318/399fP9/fXz/gn9/R////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAfX2Df318/399fP9/fXz/f318/399 + fP9/fnz/gH57/6WZhP/kx47/8M+Q//DPj//wz4//8M+P//DPj//wz4//8M+P//DPj//wz4//8M+P//DP + j//wz4//8M+P//DPj//wz4//8M+P//DPj//wz4//8M+P//DPj//wz4//8M+P//DPj//wz4//8M+P//DP + j//wz4//8M+P//DPj//wz4//8M+P//DPj//wz4//8M+P//DPj//wz4//8M+P//DPj//wz4//8M+P//DP + j//wz4//8M+P//DPj//wz4//8M+P//DPj//wz47/78yF/+7EXf/ruzH/6rop/+q6Kf/quin/67ko/+u5 + KP/ruSj/67ko/+u5KP/ruSj/67ko/+u5KP/ruSj/67ko/+u5KP/ruSj/67ko/+u5KP/ruSj/67ko/+u5 + KP/ruSj/67ko/+u5KP/ruSj/67ko/+u5KP/ruSj/67ko/+u5KP/ruSj/67ko/+u5KP/ruSj/67ko/+u5 + KP/ruSj/67ko/+u5KP/ruSj/67ko/+W3L/+wmVn/g396/399fP9/fXz/f318/399fP9/fXz/f318/398 + fLP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AYCAgAt/fHzdf318/399fP9/fXz/f318/399fP9+fnz/gH59/7emhv/uzY7/8c6O//HO + jv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HO + jv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HO + jv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HO + jv/xzo//78+N/+7GZv/suzL/7Lko/+y5KP/suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5 + J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5 + J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//puSr/wqNK/4iC + d/9/fXz/f318/399fP9/fXz/f318/399fP9/fXz1i4SEI////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AX9/e0V/fXz/f318/399 + fP9/fXz/f317/359fP9/fXv/hYJ9/9C4iv/wzo//8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HO + jv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HO + jv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HO + jv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo7/8c6O//HOjv/xzo//8M6O/+3FYv/sui7/7Lko/+y5 + J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5 + J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5J//suSf/7Lkn/+y5 + J//suSf/7Lkn/+y5J//suSf/7Lkn/9OsPf+SiG//f318/399fP9/fXz/f318/399fP9/fXz/f318/4OA + gHX///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AX59e59/fXz/f318/399fP9/fXz/f318/399fP+AfXz/mJCB/9vA + jP/yz4//8s+P//LPjv/yz47/8s+P//LPj//yz4//8s+P//LPj//yz4//8s+P//LPj//yz4//8s+P//LP + j//yz4//8s+P//LPj//yz4//8s+P//LPj//yz4//8s+P//LPj//yz4//8s+P//LPj//yz4//8s+P//LP + j//yz4//8s+P//LPj//yz4//8s+P//LPj//yz4//8s+P//LPj//yz4//8s+P//LPj//yz4//8s+P//LP + j//yz4//8s+P//LPj//y0I//8M6K/+7DVv/suin/7bon/+26KP/tuij/7boo/+26J//tuif/7bon/+26 + J//tuif/7bon/+26J//tuif/7bon/+26J//tuif/7bon/+26J//tuif/7bon/+26J//tuif/7bon/+26 + J//tuif/7bon/+26J//tuif/7bon/+26J//tuif/7bon/+26J//tuif/7Lon/+y6J//lti7/nY5n/4B9 + fP9/fXz/f318/399fP9/fXz/f318/399fP+AfX3LgICABf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BeHh4D399 + e99/fXz/f318/399fP9/fXz/f318/359fP+Cf3z/ppqD/+XGjf/y0I7/89CP//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I//8c2A/+7B + Rv/tuif/7boo/+y7KP/tuif/7bon/+26J//tuif/7bon/+26J//tuif/7bon/+26J//tuif/7bon/+26 + J//tuif/7bon/+26J//tuif/7bon/+26J//tuif/7bon/+26J//tuif/7bon/+26J//tuif/7bon/+26 + J//tuif/7bon/+26J//tuif/6rgr/7CYWf+Cfnv/f358/399fP9/fXz/f318/399fP9/fXz/f3189YR9 + fSn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BgICAPX99fP1/fXz/f318/399fP9/fXz/gH18/4B9 + e/+Bf33/q56E/+XIjf/y0I7/8s+P//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/x0I//8Mp0/+2+OP/suyX/7Lom/+y7Jf/tuib/7bom/+26 + Jv/tuib/7bom/+26Jv/tuib/7bom/+26Jv/tuib/7bom/+26Jv/tuib/7bom/+26Jv/tuib/7bom/+26 + Jv/tuib/7bom/+26Jv/tuib/7bom/+26Jv/tuib/7bom/+26Jv/tuib/7bom/+e3K/+1nFT/hYB5/399 + e/9/fXz/fn17/399fP9/fXz/f318/399fP+Cf39p////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BgH5+f399fP9/fXz/f318/399fP9/fXz/gH18/4B9e/+DgH3/tKOF/+vMjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/yz4z/78VZ/+67KP/uuiT/7rsk/+27JP/tuyT/7bsk/+27JP/tuyT/7bsk/+27JP/tuyT/7bsk/+27 + JP/tuyT/7bsk/+27JP/tuyT/7bsk/+27JP/tuyT/7bsk/+27JP/tuyT/7bsk/+27JP/tuyT/7bsk/+27 + JP/tuyT/7bsk/+27JP/ouCj/vaBM/4qDdP9/fX3/f318/399fP9/fXz/f318/399fP9/fXz/gX5+rf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAgIADgH59s399fP9/fXz/f318/399 + fP9/fXz/f318/399fP+FgX3/vamH/+7Njv/yz4//8tCP//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/xzIH/7r83/+67I//tuyP/7bsi/+27 + Iv/tuyL/7bsi/+27Iv/tuyL/7bsi/+27Iv/tuyL/7bsi/+27Iv/tuyL/7bsi/+27Iv/tuyL/7bsi/+27 + Iv/tuyL/7bsi/+27Iv/tuyL/7bsi/+27Iv/tuyL/7bsi/+27Iv/uuyP/7Lok/8OjSP+NhXL/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fNmTgIAP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGAgIARf3x82399fP9/fXz/f318/399fP9/fXz/f358/4B9fP+JhX7/v6uH/+/N + jf/y0I7/8s+O//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//HQjv/vx2D/7Lsg/+28IP/suyD/7Lsg/+y7IP/suyD/7Lsg/+y7IP/suyD/7Lsg/+y7 + IP/suyD/7Lsg/+y7IP/suyD/7Lsg/+y7IP/suyD/7Lsg/+y7IP/suyD/7Lsg/+y7IP/suyD/7Lsg/+y7 + IP/suyD/7Lsg/+y7IP/MqED/i4R0/399fP9/fnv/gH58/399fP9/fXz/f318/399fP9/fXzxioSEKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGEfX0lf3186399 + fP9/fXz/f318/399fP9/fXz/fn18/39+fP+HhH3/uqeG/+rKjf/yz4//8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQ + jv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8tCO//LQjv/y0I7/8dCO//LOh//tvi//7Lsf/+y7 + H//sux//7Lsf/+y7H//sux//7Lsf/+y7H//sux//7Lsf/+y7H//sux//7Lsf/+y7H//sux//7Lsf/+y7 + H//sux//7Lsf/+y7H//sux//7Lsf/+y7H//sux//7Lsf/+y7H//ouSP/xKRF/4qEdP9/fX3/gH17/4B9 + ff9/fXz/f318/399fP9/fXz/f318+4aCgkf///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGFgIA9f3189399fP9/fXz/f318/399fP9/fXz/f318/399 + fP+FgX3/tKSE/+fJjP/y0Y7/8tCN//HQjf/y0Y3/8tGN//LRjf/y0Y3/8tGN//LRjf/y0Y3/8tGN//LR + jf/y0Y3/8tGN//LRjf/y0Y3/8tGN//LRjf/y0Y3/8tGN//LRjf/y0Y3/8tGN//LRjf/y0Y3/8tGN//LR + jf/y0Y3/8tGN//LRjf/y0Y3/8tGN//LRjf/y0Y3/8tGN//LRjf/y0Y3/8tGN//LRjf/y0Y3/8tGN//LR + jf/y0Y3/8tGN//LRjf/y0I3/8dGL//DGWP/tvCD/7rwg/+68IP/uvCD/7rwg/+68IP/uvCD/7rwg/+68 + IP/uvCD/7rwg/+68IP/uvCD/7rwg/+68IP/uvCD/7rwg/+68IP/uvCD/7rwg/+68IP/uvCD/7rwg/+28 + IP/uvCH/5rgn/72hS/+LhHP/f318/39+fP9/fXz/f318/399fP9/fXz/f318/399fP+DgIBl////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGFgoJPf318+399fP9/fXz/f318/399fP9/fXz/f318/398e/+DgHz/rZ+E/+THi//y0Yz/8tGN//LR + jP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LR + jP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LR + jP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjP/y0Yz/8tGM//LRjf/y0Y3/8c11/+6+ + K//tvCD/7bwg/+28IP/tvCD/7bwg/+28IP/tvCD/7bwg/+28IP/tvCD/7bwg/+28IP/tvCD/7bwg/+28 + IP/tvCD/7bwg/+28IP/tvCD/7bwg/+28IP/tvCD/7bwg/+a4KP+0nFL/ioN0/399fP9/fXv/fn18/399 + fP9/fXz/f318/399fP9/fXz/gIB+e////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGCf39Zf318/X99fP9/fXz/f318/399 + fP9/fXz/gH17/4B9fP+Cf3z/pZmD/93Bi//z0oz/89KM//PSjP/z0oz/89KM//PSjP/z0oz/89KM//PS + jP/z0oz/89KM//PSjP/z0oz/89KM//PSjP/z0oz/89KM//PSjP/z0oz/89KM//PSjP/z0oz/89KM//PS + jP/z0oz/89KM//PSjP/z0oz/89KM//PSjP/z0oz/89KM//PSjP/z0oz/89KM//PSjP/z0oz/89KM//PS + jP/z0oz/89KM//PSjP/z0oz/89KM//PSjP/yz4H/78NC/+28IP/tvCD/7bwg/+28IP/tvCD/7bwg/+28 + IP/tvCD/7bwg/+28IP/tvCD/7bwg/+28IP/tvCD/7bwg/+28IP/tvCD/7bwg/+28IP/tvCD/7bwg/+28 + IP/ktiv/qpZb/4WAeP9/fXz/f318/4B9fP9/fXz/f318/399fP9/fXz/f318/4GAfof///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wF/f3xff318/X99fP9/fXz/f318/399fP9/fXz/f318/399fP+Bf3z/lY5//863 + h//uzov/8tGM//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LS + i//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LS + i//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0Yz/8tKL//HR + iP/wx1f/7rwf/++8H//vvB//77wf/++8H//vvB//77wf/++8H//vvB//77wf/++8H//vvB//77wf/++8 + H//vvB//77wf/++8H//vvCD/7r0f/++8H//suyH/1a42/52OZv+Cf3r/f318/4B9fP9/fXz/f318/399 + fP9/fXz/f318/399fP+CgICN////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGFgoJVf318+X99 + fP9/fXz/f318/399fP9/fXz/f318/4B9fP9/fXv/hoJ9/7enhP/myYr/8dKL//LSi//y0ov/8tKL//LS + i//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LS + i//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LS + i//y0ov/8tKL//LSi//y0ov/8tKL//LRi//x0ov/8tKL//HLaP/vvij/77we/++7Hv/vvB//77wf/++8 + H//vvB//77wf/++8H//vvB//77wf/++8H//vvB//77wf/++8H//vvB//77we/++8Hv/vvB7/5LYo/8Ci + Sf+OhnH/f357/399fP9/fXz/f318/399fP9/fXz/f318/399fP+Afn3/goB/gf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGEhIRJf3188399fP9/fXz/f318/399fP9/fXz/gH58/39+ + fP9/fnz/gH99/6eagv/UvIj/7s+L//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LS + i//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LS + i//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tKL//LSi//y0ov/8tGM//LS + jP/y0ov/8s1z/+/AMv/wvB7/77we/++8Hv/vvB7/77we/++8Hv/vvB7/77we/++8Hv/vvB7/77we/++8 + Hv/vvB7/77we/++8Hv/vvB3/7rwe/9mxMf+qllr/hYF4/399fP9/fXz/f358/399fP9/fXz/f318/399 + fP9/fXz/f318/YSCf2////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGIg4Mxf3185X99fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/gX58/5GKf/+5qIX/6MqL//TS + jf/00oz/9NKM//TSjP/00o3/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TS + jP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TS + jP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/89KM//TSjP/zz3z/8MI5/+++Hf/vvR3/770d/++9 + Hf/vvR3/770d/++9Hf/vvR3/770e//C9Hf/vvR3/770d/++9Hv/vvR3/770d/+i5JP/Co0b/mYtp/4F+ + e/9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fPWEhIBR////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGFhYUdf318zX99fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/4SBfP+Wj4D/0rqJ//DPjP/00oz/9NOM//TSjP/00oz/9NKM//TS + jP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TS + jP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TSjP/00oz/9NKM//TS + jP/00oz/9NKM//PQgv/xxD//770e//C+Hv/vvR3/770d/++9Hf/vvR3/770d/++9Hf/wvR3/77we/++9 + Hf/vvR3/770d/+68IP/Vrzb/oZFj/4aBd/+AfXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXvjiIODNf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wGAgIAJgYB+nX99fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/fn18/399 + fP+DgHz/pZmB/9K6h//qyor/89GK//PSiv/z0or/89KK//PSiv/z0or/89KK//PSiv/z0or/89KK//PS + iv/z0or/89KK//PSiv/z0or/89KK//PSiv/z0or/89KK//PSiv/z0or/89KK//PSiv/z0or/89KK//PS + iv/z0or/89KK//PSiv/z0or/89KK//PSiv/z0or/89KK//PSiv/z0or/89CD//HEQf/vvRz/8Lwc/++8 + HP/vvBz/77wc/++8HP/vvBz/77wc/++8G//wvRv/77wb/+m4Iv/XrzL/rplX/4J/ev9/fXz/f317/4B+ + e/9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/gH9+wYaGhhf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BhISCY399 + fPV/fXz/f318/399fP9/fXz/f318/399fP+AfXz/f318/35+e/9/fXz/ioV+/6uegf/QuIb/6suJ//PS + if/z0on/89KJ//PSif/z0on/9NKJ//PSif/z0on/9NKJ//PSif/z0on/89KJ//PSif/z0on/89KJ//PS + if/z0on/89KJ//PSif/z0on/89KJ//PSif/z0on/89KJ//PSif/z0on/89KJ//PSif/z0on/89KJ//PS + if/z0on/89KJ//PSif/z0IL/8cNA//C8G//wvBv/8Lwb//C8G//wvBv/8Lwb//C8G//wvBv/8Lwb/+u5 + If/Rqzj/splT/4+GcP+Afnv/fn18/39+fP9/fXz/gH18/399fP9/fXz/f318/399fP9/fXz/f318/YWD + gYWAgIAF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bi4SEJX99e8t/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/42Ifv+nm4H/yLOF/+nKif/z04n/9dOK//TUif/01Ir/9NSJ//TU + iv/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TU + if/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TRf//yxD3/774a//C+ + Gv/wvhr/8L4a/++9G//xvRv/8b0b/+m6I//Nqjv/q5ZY/5CHcP+Bfnv/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399e+GHh4c/////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZ2dnBYB+fHt/fXz3f318/399fP9/fXz/f318/399fP9/fXz/f318/4B9fP9/fnv/gH18/4B+ + fP+IhH3/lo5//7mog//jx4j/89SK//TUiv/104r/9NSJ//XUiv/01In/9NSJ//TUif/01In/9NSJ//TU + if/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TU + if/01In/9NSJ//TUif/01In/89B4//LDNv/xvhr/8b4a//G/G//yvhn/8b4a/+W4Jv+/o0r/nI5m/4qE + cv+Bfnr/f318/399e/9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP1+fHyVgICAD/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AY+IiCWBfn67f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXv/f318/399fP+AfXv/f317/4OAff+ZkYD/vqyE/9vB + h//oy4n/7tCJ//PTif/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TU + if/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TUif/01In/9NSJ//TUif/0zWz/8cEr/+28 + Hv/muSX/27Iu/8WkRP+gkWL/g4B6/399fP9/fn3/f317/399fP9/fXz/gH18/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP+Af37ViYmJPf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wGHh4RTf3x83X99fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP+AfXz/hIJ9/56Ugf+2pYP/ybOF/9a9h//ixof/7M6J//LT + iv/01In/9dSK//TUif/01In/9NSK//TUif/01Ir/9NSJ//TUif/01In/9NSK//TUif/004n/9NSK//TU + iv/104r/9dSJ//PUiv/sz4n/48eI/9e5af/LqkL/uZ9N/5+RY/+Jg3b/gH18/39+e/9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXzth4WFb4CAgAX///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wGAgIAJhYOAc4B+fel/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/fn58/399fP+EgHz/joh+/52TgP+pnIH/tKSD/8CthP/KtYX/1b2G/9zCiP/jx4j/6MuJ/+3N + if/vz4n/79CJ/+7Pif/szoj/6cyI/+XIiP/fw4j/1r2H/8y2hf/Cr4T/t6eD/6qegv+elID/kYp6/4WB + eP+AfXz/gH18/39+fP9/fXz/fn17/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz1gYB+iZWVlRP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BjIyMC399fXV/fXznf318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/4B9fP+AfXz/f318/399fP9/fXv/f318/399 + fP+Bfnz/hYF9/4mFff+OiH7/kYt+/5SNf/+Wjn//mJB//5qQf/+bkX//mpB//5iQf/+Xj3//lY1//5OL + f/+PiH7/ioV9/4aCff+Cf3z/gH18/39+fP+AfXz/gHx8/399fP9/fnz/f318/399fP9/fXv/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXzzgX5+j4uLixn///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AZOTkweGg4NjgH9+1X99fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP+Afn3lhYOAe4iI + iBH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BjIyMQYOBgKV+fHv3f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP2BgH63jYqKU5qamgX///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AY+PjxOIhoZjgH59t399 + fPt/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/4B9fceHhYNzlpaOHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bj4+PE4ODgFl+fXuff3185399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXzxfn17rYOA + gGWOjo4d////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Bh4eHJ4ODgGODgYCbgX99y4B+ffd/fXz/f318/399fP9/fXz/gH59/399 + fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399fP9/fXz/f318/399 + fP+Afn37gX9+1YOBgKWFg4Bti4aGM1ZWVgP///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BVlZWA5GRiieOi4tNioiIbYeFhY2Eg4Gpg4GAvYF/fdGAfn3hf3185399fO1/fXzxf3187X99 + fOeAfn3hgH1904KAf8GEg4Gth4aElYuJh3WNjYpVk46OL5OTkwf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/CFDI/FodyWeavers.xml b/CFDI/FodyWeavers.xml new file mode 100644 index 0000000..530f870 --- /dev/null +++ b/CFDI/FodyWeavers.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/CFDI/Program.cs b/CFDI/Program.cs new file mode 100644 index 0000000..77ea813 --- /dev/null +++ b/CFDI/Program.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace CFDI +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new frmCFDI()); + } + } +} diff --git a/CFDI/Properties/AssemblyInfo.cs b/CFDI/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..752aa33 --- /dev/null +++ b/CFDI/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Aduanasoft Comprobantes Fiscales CFDI 3.3")] +[assembly: AssemblyDescription("Generador de Comprobantes Fiscales CFDI Versión 3.3")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Aduanasoft, S.A. de C.V.")] +[assembly: AssemblyProduct("Aduanasoft Comprobantes Fiscales CFDI 3.3")] +[assembly: AssemblyCopyright("Copyright © 2018 Aduanasoft, S.A. de C.V. Derechos Reservados MMXVIII")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0acb8d28-684b-4043-9756-fdbd2e4b6feb")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("30.1.0.0")] +[assembly: AssemblyFileVersion("30.1.0.0")] diff --git a/CFDI/Properties/Resources.Designer.cs b/CFDI/Properties/Resources.Designer.cs new file mode 100644 index 0000000..df2459d --- /dev/null +++ b/CFDI/Properties/Resources.Designer.cs @@ -0,0 +1,163 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CFDI.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CFDI.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap _background_1427x739px { + get { + object obj = ResourceManager.GetObject("_background 1427x739px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap _fondo_transparente_871x655px { + get { + object obj = ResourceManager.GetObject("_fondo transparente 871x655px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap _icono_error_140x140px { + get { + object obj = ResourceManager.GetObject("_icono error 140x140px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap _icono_timbrado_140x140px { + get { + object obj = ResourceManager.GetObject("_icono timbrado 140x140px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap _logo_491x408px { + get { + object obj = ResourceManager.GetObject("_logo 491x408px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap _recuadro_notificaciones_491x319px { + get { + object obj = ResourceManager.GetObject("_recuadro notificaciones 491x319px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap excel { + get { + object obj = ResourceManager.GetObject("excel", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SAT_logo { + get { + object obj = ResourceManager.GetObject("SAT-logo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap save { + get { + object obj = ResourceManager.GetObject("save", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap spinner { + get { + object obj = ResourceManager.GetObject("spinner", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/CFDI/Properties/Resources.resx b/CFDI/Properties/Resources.resx new file mode 100644 index 0000000..9d0c207 --- /dev/null +++ b/CFDI/Properties/Resources.resx @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\_background 1427x739px.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\_fondo transparente 871x655px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\_icono error 140x140px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\_icono timbrado 140x140px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\_logo 491x408px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\_recuadro notificaciones 491x319px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\SAT-logo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\spinner.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/CFDI/Properties/Settings.Designer.cs b/CFDI/Properties/Settings.Designer.cs new file mode 100644 index 0000000..a82a513 --- /dev/null +++ b/CFDI/Properties/Settings.Designer.cs @@ -0,0 +1,61 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CFDI.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string DeviceToken { + get { + return ((string)(this["DeviceToken"])); + } + set { + this["DeviceToken"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string DeviceTokenProd { + get { + return ((string)(this["DeviceTokenProd"])); + } + set { + this["DeviceTokenProd"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::System.DateTime lastChecked { + get { + return ((global::System.DateTime)(this["lastChecked"])); + } + set { + this["lastChecked"] = value; + } + } + } +} diff --git a/CFDI/Properties/Settings.settings b/CFDI/Properties/Settings.settings new file mode 100644 index 0000000..4878aa6 --- /dev/null +++ b/CFDI/Properties/Settings.settings @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CFDI/Resources/SAT-logo.png b/CFDI/Resources/SAT-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..41e0f98fb0d9875ad66724ad53d9cd42766d0f61 GIT binary patch literal 9795 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 literal 0 HcmV?d00001 diff --git a/CFDI/Resources/_icono timbrado 140x140px.png b/CFDI/Resources/_icono timbrado 140x140px.png new file mode 100644 index 0000000000000000000000000000000000000000..fd84d6048a869bf2b576a8e6756edadb7c9e61e6 GIT binary patch literal 5553 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 literal 0 HcmV?d00001 diff --git a/CFDI/Resources/_logo 491x408px.png b/CFDI/Resources/_logo 491x408px.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc11ee2fe658f0d2f50403e2995cf7c0c67f952 GIT binary patch literal 55828 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

*{Xj;F&yr@s+>u`55H-);Y?Z95CpOZ+mC*X1XA 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 literal 0 HcmV?d00001 diff --git a/CFDI/Resources/_recuadro notificaciones 491x319px.png b/CFDI/Resources/_recuadro notificaciones 491x319px.png new file mode 100644 index 0000000000000000000000000000000000000000..d2dccb9970848b52e8cd0cb75bd75ab436710108 GIT binary patch literal 5698 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 F{tGVSV&4D& literal 0 HcmV?d00001 diff --git a/CFDI/Resources/save.png b/CFDI/Resources/save.png new file mode 100644 index 0000000000000000000000000000000000000000..52662b105fb5914c3ad50302127ae130fec3a14d GIT binary patch literal 7076 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
    CC3Yux<4v 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 literal 0 HcmV?d00001 diff --git a/CFDI/app.config b/CFDI/app.config new file mode 100644 index 0000000..f404485 --- /dev/null +++ b/CFDI/app.config @@ -0,0 +1,21 @@ + + + + +
    + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CFDI/ico.ico b/CFDI/ico.ico new file mode 100644 index 0000000000000000000000000000000000000000..06e4271d6576a99b0e31b6d8ec778d2d88c11b90 GIT binary patch literal 99678 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
    y!MLHfai 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 MftM}tpKF2t2T*FnUjP6A literal 0 HcmV?d00001 diff --git a/CFDI/opensslkey.cs b/CFDI/opensslkey.cs new file mode 100644 index 0000000..514a8eb --- /dev/null +++ b/CFDI/opensslkey.cs @@ -0,0 +1,516 @@ +//********************************************************************************** +// +//OpenSSLKey +// .NET 2.0 OpenSSL Public & Private Key Parser +// +// Copyright (C) 2008 JavaScience Consulting +// +//*********************************************************************************** +// +// opensslkey.cs +// +// Reads and parses: +// (1) OpenSSL PEM or DER public keys +// (2) OpenSSL PEM or DER traditional SSLeay private keys (encrypted and unencrypted) +// (3) PKCS #8 PEM or DER encoded private keys (encrypted and unencrypted) +// Keys in PEM format must have headers/footers . +// Encrypted Private Key in SSLEay format not supported in DER +// Removes header/footer lines. +// For traditional SSLEAY PEM private keys, checks for encrypted format and +// uses PBE to extract 3DES key. +// For SSLEAY format, only supports encryption format: DES-EDE3-CBC +// For PKCS #8, only supports PKCS#5 v2.0 3des. +// Parses private and public key components and returns .NET RSA object. +// Creates dummy unsigned certificate linked to private keypair and +// optionally exports to pkcs #12 +// +// See also: +// http://www.openssl.org/docs/crypto/pem.html#PEM_ENCRYPTION_FORMAT +//************************************************************************************** + + +using System; +using System.IO; +using System.Security.Cryptography; +using System.Runtime.InteropServices; +using System.Security; + +namespace JavaScience +{ + public class Win32 + { + + [DllImport("crypt32.dll", SetLastError = true)] + public static extern IntPtr CertCreateSelfSignCertificate( + IntPtr hProv, + ref CERT_NAME_BLOB pSubjectIssuerBlob, + uint dwFlagsm, + ref CRYPT_KEY_PROV_INFO pKeyProvInfo, + IntPtr pSignatureAlgorithm, + IntPtr pStartTime, + IntPtr pEndTime, + IntPtr other); + + [DllImport("crypt32.dll", SetLastError = true)] + public static extern bool CertStrToName( + uint dwCertEncodingType, + String pszX500, + uint dwStrType, + IntPtr pvReserved, + [In, Out] byte[] pbEncoded, + ref uint pcbEncoded, + IntPtr other); + + [DllImport("crypt32.dll", SetLastError = true)] + public static extern bool CertFreeCertificateContext( + IntPtr hCertStore); + + } + + [StructLayout(LayoutKind.Sequential)] + public struct CRYPT_KEY_PROV_INFO + { + [MarshalAs(UnmanagedType.LPWStr)] + public String pwszContainerName; + [MarshalAs(UnmanagedType.LPWStr)] + public String pwszProvName; + public uint dwProvType; + public uint dwFlags; + public uint cProvParam; + public IntPtr rgProvParam; + public uint dwKeySpec; + } + + [StructLayout(LayoutKind.Sequential)] + public struct CERT_NAME_BLOB + { + public int cbData; + public IntPtr pbData; + } + + public class opensslkey + { + + const String pemprivheader = "-----BEGIN RSA PRIVATE KEY-----"; + const String pemprivfooter = "-----END RSA PRIVATE KEY-----"; + const String pempubheader = "-----BEGIN PUBLIC KEY-----"; + const String pempubfooter = "-----END PUBLIC KEY-----"; + const String pemp8header = "-----BEGIN PRIVATE KEY-----"; + const String pemp8footer = "-----END PRIVATE KEY-----"; + const String pemp8encheader = "-----BEGIN ENCRYPTED PRIVATE KEY-----"; + const String pemp8encfooter = "-----END ENCRYPTED PRIVATE KEY-----"; + + public static RSACryptoServiceProvider DecodePrivateKeyInfo(byte[] pkcs8) + { + // encoded OID sequence for PKCS #1 rsaEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1" + // this byte[] includes the sequence byte and terminal encoded null + byte[] SeqOID = { 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 }; + byte[] seq = new byte[15]; + // --------- Set up stream to read the asn.1 encoded SubjectPublicKeyInfo blob ------ + MemoryStream mem = new MemoryStream(pkcs8); + int lenstream = (int)mem.Length; + BinaryReader binr = new BinaryReader(mem); //wrap Memory Stream with BinaryReader for easy reading + byte bt = 0; + ushort twobytes = 0; + + try + { + + twobytes = binr.ReadUInt16(); + if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81) + binr.ReadByte(); //advance 1 byte + else if (twobytes == 0x8230) + binr.ReadInt16(); //advance 2 bytes + else + return null; + + + bt = binr.ReadByte(); + if (bt != 0x02) + return null; + + twobytes = binr.ReadUInt16(); + + if (twobytes != 0x0001) + return null; + + seq = binr.ReadBytes(15); //read the Sequence OID + if (!CompareBytearrays(seq, SeqOID)) //make sure Sequence for OID is correct + return null; + + bt = binr.ReadByte(); + if (bt != 0x04) //expect an Octet string + return null; + + bt = binr.ReadByte(); //read next byte, or next 2 bytes is 0x81 or 0x82; otherwise bt is the byte count + if (bt == 0x81) + binr.ReadByte(); + else + if (bt == 0x82) + binr.ReadUInt16(); + //------ at this stage, the remaining sequence should be the RSA private key + + byte[] rsaprivkey = binr.ReadBytes((int)(lenstream - mem.Position)); + RSACryptoServiceProvider rsacsp = DecodeRSAPrivateKey(rsaprivkey); + return rsacsp; + } + + catch (Exception) + { + return null; + } + + finally { binr.Close(); } + + } + + public static RSACryptoServiceProvider DecodeEncryptedPrivateKeyInfo(byte[] encpkcs8, SecureString securePassword) + { + // encoded OID sequence for PKCS #1 rsaEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1" + // this byte[] includes the sequence byte and terminal encoded null + byte[] OIDpkcs5PBES2 = { 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0D }; + byte[] OIDpkcs5PBKDF2 = { 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x05, 0x0C }; + byte[] OIDdesEDE3CBC = { 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x03, 0x07 }; + byte[] seqdes = new byte[10]; + byte[] seq = new byte[11]; + byte[] salt; + byte[] IV; + byte[] encryptedpkcs8; + byte[] pkcs8; + + int saltsize, ivsize, encblobsize; + int iterations; + + // --------- Set up stream to read the asn.1 encoded SubjectPublicKeyInfo blob ------ + MemoryStream mem = new MemoryStream(encpkcs8); + int lenstream = (int)mem.Length; + BinaryReader binr = new BinaryReader(mem); //wrap Memory Stream with BinaryReader for easy reading + byte bt = 0; + ushort twobytes = 0; + + try + { + + twobytes = binr.ReadUInt16(); + if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81) + binr.ReadByte(); //advance 1 byte + else if (twobytes == 0x8230) + binr.ReadInt16(); //advance 2 bytes + else + return null; + + twobytes = binr.ReadUInt16(); //inner sequence + if (twobytes == 0x8130) + binr.ReadByte(); + else if (twobytes == 0x8230) + binr.ReadInt16(); + + + seq = binr.ReadBytes(11); //read the Sequence OID + if (!CompareBytearrays(seq, OIDpkcs5PBES2)) //is it a OIDpkcs5PBES2 ? + return null; + + twobytes = binr.ReadUInt16(); //inner sequence for pswd salt + if (twobytes == 0x8130) + binr.ReadByte(); + else if (twobytes == 0x8230) + binr.ReadInt16(); + + twobytes = binr.ReadUInt16(); //inner sequence for pswd salt + if (twobytes == 0x8130) + binr.ReadByte(); + else if (twobytes == 0x8230) + binr.ReadInt16(); + + seq = binr.ReadBytes(11); //read the Sequence OID + if (!CompareBytearrays(seq, OIDpkcs5PBKDF2)) //is it a OIDpkcs5PBKDF2 ? + return null; + + twobytes = binr.ReadUInt16(); + if (twobytes == 0x8130) + binr.ReadByte(); + else if (twobytes == 0x8230) + binr.ReadInt16(); + + bt = binr.ReadByte(); + if (bt != 0x04) //expect octet string for salt + return null; + saltsize = binr.ReadByte(); + salt = binr.ReadBytes(saltsize); + + bt = binr.ReadByte(); + if (bt != 0x02) //expect an integer for PBKF2 interation count + return null; + + int itbytes = binr.ReadByte(); //PBKD2 iterations should fit in 2 bytes. + if (itbytes == 1) + iterations = binr.ReadByte(); + else if (itbytes == 2) + iterations = 256 * binr.ReadByte() + binr.ReadByte(); + else + return null; + + twobytes = binr.ReadUInt16(); + if (twobytes == 0x8130) + binr.ReadByte(); + else if (twobytes == 0x8230) + binr.ReadInt16(); + + + seqdes = binr.ReadBytes(10); //read the Sequence OID + if (!CompareBytearrays(seqdes, OIDdesEDE3CBC)) //is it a OIDdes-EDE3-CBC ? + return null; + + bt = binr.ReadByte(); + if (bt != 0x04) //expect octet string for IV + return null; + ivsize = binr.ReadByte(); // IV byte size should fit in one byte (24 expected for 3DES) + IV = binr.ReadBytes(ivsize); + + bt = binr.ReadByte(); + if (bt != 0x04) // expect octet string for encrypted PKCS8 data + return null; + + + bt = binr.ReadByte(); + + if (bt == 0x81) + encblobsize = binr.ReadByte(); // data size in next byte + else if (bt == 0x82) + encblobsize = 256 * binr.ReadByte() + binr.ReadByte(); + else + encblobsize = bt; // we already have the data size + + + encryptedpkcs8 = binr.ReadBytes(encblobsize); + + + SecureString secpswd = securePassword; + pkcs8 = DecryptPBDK2(encryptedpkcs8, salt, IV, secpswd, iterations); + if (pkcs8 == null) // probably a bad pswd entered. + return null; + + //----- With a decrypted pkcs #8 PrivateKeyInfo blob, decode it to an RSA --- + RSACryptoServiceProvider rsa = DecodePrivateKeyInfo(pkcs8); + return rsa; + } + + catch (Exception) + { + return null; + } + + finally { binr.Close(); } + + + } + + public static byte[] DecryptPBDK2(byte[] edata, byte[] salt, byte[] IV, SecureString secpswd, int iterations) + { + CryptoStream decrypt = null; + + IntPtr unmanagedPswd = IntPtr.Zero; + byte[] psbytes = new byte[secpswd.Length]; + unmanagedPswd = Marshal.SecureStringToGlobalAllocAnsi(secpswd); + Marshal.Copy(unmanagedPswd, psbytes, 0, psbytes.Length); + Marshal.ZeroFreeGlobalAllocAnsi(unmanagedPswd); + + try + { + Rfc2898DeriveBytes kd = new Rfc2898DeriveBytes(psbytes, salt, iterations); + TripleDES decAlg = TripleDES.Create(); + decAlg.Key = kd.GetBytes(24); + decAlg.IV = IV; + MemoryStream memstr = new MemoryStream(); + decrypt = new CryptoStream(memstr, decAlg.CreateDecryptor(), CryptoStreamMode.Write); + decrypt.Write(edata, 0, edata.Length); + decrypt.Flush(); + decrypt.Close(); // this is REQUIRED. + byte[] cleartext = memstr.ToArray(); + return cleartext; + } + catch (Exception e) + { + Console.WriteLine("Problem decrypting: {0}", e.Message); + return null; + } + } + + public static RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey) + { + byte[] MODULUS, E, D, P, Q, DP, DQ, IQ; + + // --------- Set up stream to decode the asn.1 encoded RSA private key ------ + MemoryStream mem = new MemoryStream(privkey); + BinaryReader binr = new BinaryReader(mem); //wrap Memory Stream with BinaryReader for easy reading + byte bt = 0; + ushort twobytes = 0; + int elems = 0; + try + { + twobytes = binr.ReadUInt16(); + if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81) + binr.ReadByte(); //advance 1 byte + else if (twobytes == 0x8230) + binr.ReadInt16(); //advance 2 bytes + else + return null; + + twobytes = binr.ReadUInt16(); + if (twobytes != 0x0102) //version number + return null; + bt = binr.ReadByte(); + if (bt != 0x00) + return null; + + + //------ all private key components are Integer sequences ---- + elems = GetIntegerSize(binr); + MODULUS = binr.ReadBytes(elems); + + elems = GetIntegerSize(binr); + E = binr.ReadBytes(elems); + + elems = GetIntegerSize(binr); + D = binr.ReadBytes(elems); + + elems = GetIntegerSize(binr); + P = binr.ReadBytes(elems); + + elems = GetIntegerSize(binr); + Q = binr.ReadBytes(elems); + + elems = GetIntegerSize(binr); + DP = binr.ReadBytes(elems); + + elems = GetIntegerSize(binr); + DQ = binr.ReadBytes(elems); + + elems = GetIntegerSize(binr); + IQ = binr.ReadBytes(elems); + + // ------- create RSACryptoServiceProvider instance and initialize with public key ----- + RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); + RSAParameters RSAparams = new RSAParameters(); + RSAparams.Modulus = MODULUS; + RSAparams.Exponent = E; + RSAparams.D = D; + RSAparams.P = P; + RSAparams.Q = Q; + RSAparams.DP = DP; + RSAparams.DQ = DQ; + RSAparams.InverseQ = IQ; + RSA.ImportParameters(RSAparams); + return RSA; + } + catch (Exception) + { + return null; + } + finally { binr.Close(); } + } + + private static int GetIntegerSize(BinaryReader binr) + { + byte bt = 0; + byte lowbyte = 0x00; + byte highbyte = 0x00; + int count = 0; + bt = binr.ReadByte(); + if (bt != 0x02) //expect integer + return 0; + bt = binr.ReadByte(); + + if (bt == 0x81) + count = binr.ReadByte(); // data size in next byte + else + if (bt == 0x82) + { + highbyte = binr.ReadByte(); // data size in next 2 bytes + lowbyte = binr.ReadByte(); + byte[] modint = { lowbyte, highbyte, 0x00, 0x00 }; + count = BitConverter.ToInt32(modint, 0); + } + else + { + count = bt; // we already have the data size + } + + + + while (binr.ReadByte() == 0x00) + { //remove high order zeros in data + count -= 1; + } + binr.BaseStream.Seek(-1, SeekOrigin.Current); //last ReadByte wasn't a removed zero, so back up a byte + return count; + } + + private static SecureString GetSecPswd(String prompt) + { + SecureString password = new SecureString(); + + Console.ForegroundColor = ConsoleColor.Gray; + Console.Write(prompt); + Console.ForegroundColor = ConsoleColor.Magenta; + + while (true) + { + ConsoleKeyInfo cki = Console.ReadKey(true); + if (cki.Key == ConsoleKey.Enter) + { + Console.ForegroundColor = ConsoleColor.Gray; + Console.WriteLine(); + return password; + } + else if (cki.Key == ConsoleKey.Backspace) + { + // remove the last asterisk from the screen... + if (password.Length > 0) + { + Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop); + Console.Write(" "); + Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop); + password.RemoveAt(password.Length - 1); + } + } + else if (cki.Key == ConsoleKey.Escape) + { + Console.ForegroundColor = ConsoleColor.Gray; + Console.WriteLine(); + return password; + } + else if (Char.IsLetterOrDigit(cki.KeyChar) || Char.IsSymbol(cki.KeyChar)) + { + if (password.Length < 20) + { + password.AppendChar(cki.KeyChar); + Console.Write("*"); + } + else + { + Console.Beep(); + } + } + else + { + Console.Beep(); + } + } + } + + private static bool CompareBytearrays(byte[] a, byte[] b) + { + if (a.Length != b.Length) + return false; + int i = 0; + foreach (byte c in a) + { + if (c != b[i]) + return false; + i++; + } + return true; + } + } +} diff --git a/CFDI/packages.config b/CFDI/packages.config new file mode 100644 index 0000000..a22bde4 --- /dev/null +++ b/CFDI/packages.config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file