diff --git a/App_Code/ClsVentas.vb b/App_Code/ClsVentas.vb index e46b7ac2a..6a393bec7 100644 --- a/App_Code/ClsVentas.vb +++ b/App_Code/ClsVentas.vb @@ -1445,7 +1445,7 @@ Public Class ClsVentas CveVendedor As String, CveUsuario As Integer, CveEstatus As String, IVA As String, CveEmpresa As Integer, Gpo As Integer, Optional TipoDocto As String = "-1", Optional CveProyecto As Integer = -1, Optional CveSubProyecto As String = "-1", Optional TipoCambio As Integer = 1, Optional TCEspecifico As Decimal = -1, Optional CveUsuarioConsulta As Integer = -1, Optional CveClienteClasificacion As Integer = -1, Optional CveCondicionesPago As Integer = -1, Optional TipoCliente As Integer = -1, Optional ModalidadContable As Boolean = False, - Optional EsDistribuidor As Integer = -1) As Boolean + Optional EsDistribuidor As Integer = -1, Optional CveTipoRelacion As Integer = -1) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_Vta_VentasGetRep") @@ -1474,6 +1474,7 @@ Public Class ClsVentas .Add("@TipoCliente", SqlDbType.Int).Value = TipoCliente .Add("@EsDistribuidor", SqlDbType.Int).Value = EsDistribuidor .Add("@ModalidadContable", SqlDbType.Bit).Value = ModalidadContable + .Add("@CveTipoRelacion", SqlDbType.Int).Value = CveTipoRelacion End With Try @@ -1580,7 +1581,7 @@ Public Class ClsVentas CveSubProyectoEjecucion As Integer, CveEmpresa As Integer, FechaIEjec As Date, FechaFEjec As Date, Optional CveProyecto As Integer = -1, Optional CveSubProyecto As String = "-1", Optional TipoCambio As Integer = 1, Optional TCEspecifico As Decimal = -1, Optional CveMoneda As Integer = -1, Optional CveUsuarioConsulta As Integer = -1, Optional CveClienteClasificacion As Integer = -1, Optional CveCondicionesPago As Integer = -1, Optional TipoCliente As Integer = -1, Optional ModalidadContable As Boolean = False, - Optional EsDistribuidor As Integer = -1) As Boolean + Optional EsDistribuidor As Integer = -1, Optional CveTipoRelacion As Integer = -1) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_Vta_VentasGetRepDetalle") @@ -1614,6 +1615,7 @@ Public Class ClsVentas .Add("@TipoCliente", SqlDbType.Int).Value = TipoCliente .Add("@EsDistribuidor", SqlDbType.Int).Value = EsDistribuidor .Add("@ModalidadContable", SqlDbType.Bit).Value = ModalidadContable + .Add("@CveTipoRelacion", SqlDbType.Int).Value = CveTipoRelacion End With Try diff --git a/App_Code/Timbrado.vb b/App_Code/Timbrado.vb index 253e76353..60a04e2e9 100644 --- a/App_Code/Timbrado.vb +++ b/App_Code/Timbrado.vb @@ -10,6 +10,7 @@ Imports System.Data Imports System.Xml.Serialization Imports System.Net Imports ProfactCartaPorte = Profact.TimbraCFDI33.Complementos.CartaPorte20 +Imports System.Reflection Public Class Timbrado @@ -1228,10 +1229,17 @@ Public Class Timbrado Case 5 + If UsuarioActual.Empresa.Funcionalidad(350) = "1" Then + Dim Ret As String = TimbrarFacturaPADEv40(Ventas, UsuarioActual, CvePACEspecial) + If Ret <> "" Then MensajeErrorCFDI = Ret + Retorno = If(Ret = "", True, False) + Else + Dim Ret As String = TimbrarFacturaPADEv33(Ventas, UsuarioActual, CvePACEspecial) + If Ret <> "" Then MensajeErrorCFDI = Ret + Retorno = If(Ret = "", True, False) + End If + - Dim Ret As String = TimbrarFacturaPADEv33(Ventas, UsuarioActual, CvePACEspecial) - If Ret <> "" Then MensajeErrorCFDI = Ret - Retorno = If(Ret = "", True, False) End Select @@ -3559,36 +3567,30 @@ Public Class Timbrado ' 'Sucursal matriz de la empresa Dim ArchivoLLave As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoKey}" Dim ArchivoCertificado As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoCer}" - Dim UsuarioServicio As String = UsuarioActual.Empresa.RFC - Dim ClaveServicio As String = UsuarioActual.Empresa.RFC.ToLower + Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey Dim EmisorRFC As String = UsuarioActual.Empresa.RFC - Dim UrlServicio As String = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" ' Produccion + Dim EmisorNombre As String = UsuarioActual.Empresa.Empresa + Dim RutaArchivo As String = $"{UsuarioActual.Empresa.Ruta}XML\{Ventas.TipoDocto}\" Dim NombreArchivoXML As String = $"{ObjCFDITimbre.Comprobante.SerieFolio}" + Dim SubTotal As Decimal = 0 Dim AmbienteProductivo As Boolean = True Dim NumDecimalesImporte As Integer = 2 + If Not Directory.Exists(RutaArchivo) Then Directory.CreateDirectory(RutaArchivo) If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then AmbienteProductivo = False - UsuarioServicio = "fgomez" - ClaveServicio = "12121212" Clave = "12345678a" - - 'EmisorRFC = "AAA010101AAA" - 'ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.key" - 'ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_AAA010101AAA.cer" - - EmisorRFC = "ZUÑ920208KL4" - ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_ZUÑ920208KL4.key" - ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\CSD01_ZUÑ920208KL4.cer" - - UrlServicio = "https://pruebas.timbracfdi33.mx/Timbrado.asmx" + EmisorRFC = "IIA040805DZ4" + EmisorNombre = "INDISTRIA ILUMINADORA DE ALMACENES SA DE CV" + ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\publicKey.key" + ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\publicCer.cer" + UsuarioActual.Empresa.CodigoRegimenFiscal = "601" End If - #Region "Valida" If Not File.Exists(ArchivoCertificado) Then Alert("El archivo de certificado no existe", TipoMensaje.MsgError) @@ -3675,6 +3677,7 @@ Public Class Timbrado comprobante.MetodoPago = ObjCFDITimbre.Comprobante.MetodoPago comprobante.MetodoPagoSpecified = If(ObjCFDITimbre.Comprobante.MetodoPago <> "", True, False) comprobante.LugarExpedicion = ObjCFDITimbre.Comprobante.LugarExpedicion + comprobante.Exportacion = ObjCFDITimbre.Comprobante.Exportacion If ObjCFDITimbre.CFDIRelacionados.TipoRelacion <> "" Then Dim CfdiRelacionados As New Profact.TimbraCFDI40.ComprobanteCfdiRelacionados @@ -3691,7 +3694,7 @@ Public Class Timbrado #Region "Emisor" comprobante.Emisor = New Profact.TimbraCFDI40.ComprobanteEmisor() comprobante.Emisor.Rfc = EmisorRFC - comprobante.Emisor.Nombre = UsuarioActual.Empresa.Empresa + comprobante.Emisor.Nombre = EmisorNombre comprobante.Emisor.RegimenFiscal = UsuarioActual.Empresa.CodigoRegimenFiscal #End Region @@ -3702,6 +3705,7 @@ Public Class Timbrado comprobante.Receptor.Nombre = ObjCFDITimbre.Receptor.Nombre comprobante.Receptor.UsoCFDI = ObjCFDITimbre.Receptor.UsoCFDI comprobante.Receptor.RegimenFiscalReceptor = ObjCFDITimbre.Receptor.RegimenFiscalReceptor + comprobante.Receptor.DomicilioFiscalReceptor = ObjCFDITimbre.Receptor.DomicilioFiscalReceptor #End Region #End Region @@ -3722,9 +3726,10 @@ Public Class Timbrado If concep.Unidad <> "" Then comprobante.Conceptos(i).Unidad = concep.Unidad comprobante.Conceptos(i).ClaveUnidad = concep.ClaveUnidad comprobante.Conceptos(i).Descripcion = concep.Descripcion - comprobante.Conceptos(i).ValorUnitario = concep.ValorUnitario + comprobante.Conceptos(i).ValorUnitario = concep.ValorUnitario.RoundSQL(6) comprobante.Conceptos(i).Importe = concep.Importe.RoundSQL(NumDecimalesImporte) comprobante.Conceptos(i).ClaveProdServ = concep.ClaveProdServ + comprobante.Conceptos(i).ObjetoImp = concep.ObjetoImpuesto If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then If concep.Descuento > 0 Then @@ -3800,6 +3805,7 @@ Public Class Timbrado For Each Tras In ObjCFDITimbre.Traslados comprobante.Impuestos.Traslados(y) = New Profact.TimbraCFDI40.ComprobanteImpuestosTraslado() + comprobante.Impuestos.Traslados(y).Base = Tras.Base comprobante.Impuestos.Traslados(y).Impuesto = Tras.Impuesto comprobante.Impuestos.Traslados(y).TipoFactor = Tras.TipoFactor comprobante.Impuestos.Traslados(y).TasaOCuota = Tras.TasaOCuota.FormatoNumero(6) @@ -4069,13 +4075,13 @@ Public Class Timbrado End If If ObjCFDITimbre.ComplementoPagos.CertPago <> "" Then - ComPag.Pago(0).CertPago = System.Text.Encoding.Default.GetBytes(ObjCFDITimbre.ComplementoPagos.CertPago) + ComPag.Pago(0).CertPago = System.Text.Encoding.Default.GetBytes(ObjCFDITimbre.ComplementoPagos.CertPago).ToString() End If If ObjCFDITimbre.ComplementoPagos.CadPago <> "" Then ComPag.Pago(0).CadPago = ObjCFDITimbre.ComplementoPagos.CadPago End If If ObjCFDITimbre.ComplementoPagos.SelloPago <> "" Then - ComPag.Pago(0).SelloPago = System.Text.Encoding.Default.GetBytes(ObjCFDITimbre.ComplementoPagos.SelloPago) + ComPag.Pago(0).SelloPago = System.Text.Encoding.Default.GetBytes(ObjCFDITimbre.ComplementoPagos.SelloPago).ToString() End If If ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count > 0 Then @@ -4785,7 +4791,7 @@ Public Class Timbrado ' End Try '//Timbramos el CFDI por medio del conector y guardamos resultado - Dim resultadoTimbre As Profact.TimbraCFDI.ResultadoTimbre + Dim resultadoTimbre As Profact.TimbraCFDI.ResultadoTimbre = Nothing #End Region @@ -4880,29 +4886,38 @@ Public Class Timbrado Else - If String.IsNullOrEmpty(resultadoTimbre.Detalle) Then - Dim Resultados = Newtonsoft.Json.Linq.JArray.Parse(resultadoTimbre.Detalle) + If Not String.IsNullOrEmpty(resultadoTimbre.Detalle) Then + Try + Dim Resultados = Newtonsoft.Json.Linq.JArray.Parse(resultadoTimbre.Detalle) - If Resultados.Count > 0 Then - If resultadoTimbre.Descripcion.Contains("RFC del receptor no existe") Then - Retorno = $"El RFC { Resultados(0)("Value").ToString() } no existe en las bases de datos publicadas por el SAT, corrobore este dato con su cliente" - MensajeErrorCFDI = $"El RFC { Resultados(0)("Value").ToString() } no existe en las bases de datos publicadas por el SAT, corrobore este dato con su cliente" + If Resultados.Count > 0 Then + If resultadoTimbre.Descripcion.Contains("RFC del receptor no existe") Then + Retorno = $"El RFC { Resultados(0)("Value").ToString() } no existe en las bases de datos publicadas por el SAT, corrobore este dato con su cliente" + MensajeErrorCFDI = $"El RFC { Resultados(0)("Value").ToString() } no existe en las bases de datos publicadas por el SAT, corrobore este dato con su cliente" + Else + Dim sbMsg As New StringBuilder + For Each msg In Resultados + sbMsg.AppendFormat("{0}.
", msg("Value")) + Next + Retorno = sbMsg.ToString() + MensajeErrorCFDI = Retorno + End If Else - Retorno = Resultados(0)("Value").ToString() - MensajeErrorCFDI = Resultados(0)("Value").ToString() - End If - Else - Retorno = resultadoTimbre.Detalle - MensajeErrorCFDI = resultadoTimbre.Detalle + Retorno = resultadoTimbre.Detalle + MensajeErrorCFDI = resultadoTimbre.Detalle - If Retorno = "[]" Then - Retorno = resultadoTimbre.Descripcion + If Retorno = "[]" Then + Retorno = resultadoTimbre.Descripcion + End If + If MensajeErrorCFDI = "[]" Then + Retorno = resultadoTimbre.Descripcion + End If + End If - If MensajeErrorCFDI = "[]" Then - Retorno = resultadoTimbre.Descripcion - End If + Catch ex As Exception + Retorno = ex.ToString() + End Try - End If Else Retorno = resultadoTimbre.Detalle MensajeErrorCFDI = resultadoTimbre.Detalle @@ -4913,107 +4928,17 @@ Public Class Timbrado GuardaLogTimbrado(swTiempo.ToString, UsuarioActual.Empresa.CvePAC) Return Retorno End Function - Public Function TimbrarFacturaGoCFDIv40(Ventas As Modelos.Factura, UsuarioActual As Usuario, Optional CvePACEspecial As Integer = -1) As String - If CvePACEspecial = -1 Then - CvePACEspecial = UsuarioActual.Empresa.CvePAC - End If - Dim sw As New Diagnostics.Stopwatch - Dim swmili As Long = 0 - Dim swTiempo As New StringBuilder - sw.Start() + + Private Function GenerarXMLGoCFDIv40(ByRef cfdi As GoFac.Cfdi4, EmisorRFC As String, ArchivoCertificado As String, llaveBase64 As String, Clave As String, Ventas As Modelos.Factura, UsuarioActual As Usuario, Optional CvePACEspecial As Integer = -1) As String Dim Retorno As String = "" - Dim ObjCFDITimbre As CFDITimbre = Ventas.Timbre - - Dim ArchivoLLave As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoKey) - Dim ArchivoCertificado As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoCer) - Dim UsuarioServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC, "rene.molina@adsistemas.mx") - Dim ClaveServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC.ToLower, "rene2018") - Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey - Dim EmisorRFC As String = UsuarioActual.Empresa.RFC - Dim UrlServicio As String = "" ' Produccion - Dim RutaArchivo As String = String.Format("{0}XML\{1}\", UsuarioActual.Empresa.Ruta, Ventas.TipoDocto) - Dim NombreArchivoXML As String = ObjCFDITimbre.Comprobante.SerieFolio - Dim SubTotal As Decimal = 0 - Dim TimbraProduccion As Boolean = True - If Not Directory.Exists(RutaArchivo) Then Directory.CreateDirectory(RutaArchivo) - - UrlServicio = "https://cfdi.gofac.com.mx/timbrado.asmx?WSDL" - - If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then - - EmisorRFC = "EKU9003173C9" - UsuarioActual.Empresa.Empresa = "ESCUELA KEMPER URGATE SA DE CV" - ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\EKU9003173C9.key" - ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\EKU9003173C9.cer" - - Clave = "12345678a" - TimbraProduccion = False - UsuarioServicio = "UserTest" - ClaveServicio = "1234567890" - - End If - -#Region "Valida" - If Not File.Exists(ArchivoCertificado) Then - Alert("El archivo de certificado no existe", TipoMensaje.MsgError) - Return "El archivo de certificado no existe" - End If - If Not File.Exists(ArchivoLLave) Then - Alert("El archivo de llave privada no existe", TipoMensaje.MsgError) - Return "El archivo de llave privada no existe" - End If - If UsuarioActual.Empresa.ContraseñaKey = "" Then - Alert("La clave no puede ser vacía", TipoMensaje.MsgError) - Return "La clave no puede ser vacía" - End If -#End Region - -#Region "Variables" - Dim llaveByte As Byte(), certByte As Byte() - Dim llaveBase64 As String, certBase64 As String - Dim cfdi As New GoFac.Cfdi4 - Dim complemento As String = "" - Dim complementoConcepto As String = "" - -#End Region - -#Region "Verifica" - Try - llaveByte = System.IO.File.ReadAllBytes(ArchivoLLave) - llaveBase64 = Convert.ToBase64String(llaveByte) - Catch ex As Exception - Alert($"Error al leer la llave privada: {ex.Message}", TipoMensaje.MsgError) - Return "Error al leer la llave privada" - End Try - - - Try - certByte = System.IO.File.ReadAllBytes(ArchivoCertificado) - certBase64 = Convert.ToBase64String(certByte) - Catch ex As Exception - Alert($"Error al leer el certificado: {ex.Message}", TipoMensaje.MsgError) - Return "Error al leer el certificado" - - End Try -#End Region - - - sw.Stop() - swTiempo.AppendFormat("Verificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() - + MensajeErrorCFDI = "" 'cfdi.QuitarCerosDecimalDerecha = True ' no limita a 2 decimales, el atributo, de cantidad y precio unitario #Region "Certificado" cfdi.CertArchivo(ArchivoCertificado) #End Region - - sw.Stop() - swTiempo.AppendFormat("Certificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() + Dim ObjCFDITimbre As CFDITimbre = Ventas.Timbre #Region "Comprobante" @@ -5464,15 +5389,14 @@ Public Class Timbrado End If #End Region - sw.Stop() - swTiempo.AppendFormat("Armado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() #Region "Genera XML" Dim ArchivoGenerado As Boolean = False Try cfdi.GenerarXmlB64(llaveBase64, Clave) ArchivoGenerado = True + If ArchivoGenerado Then + Retorno = "" + End If Catch ex As Exception Retorno = cfdi.Mensaje If Retorno = "" OrElse IsNothing(Retorno) Then @@ -5481,14 +5405,115 @@ Public Class Timbrado MensajeErrorCFDI = Retorno End Try + If Not String.IsNullOrEmpty(MensajeErrorCFDI) Then + Retorno = MensajeErrorCFDI + End If + #End Region + + Return Retorno + End Function + + Public Function TimbrarFacturaGoCFDIv40(Ventas As Modelos.Factura, UsuarioActual As Usuario, Optional CvePACEspecial As Integer = -1) As String + If CvePACEspecial = -1 Then + CvePACEspecial = UsuarioActual.Empresa.CvePAC + End If + Dim sw As New Diagnostics.Stopwatch + Dim swmili As Long = 0 + Dim swTiempo As New StringBuilder + sw.Start() + Dim Retorno As String = "" + Dim ObjCFDITimbre As CFDITimbre = Ventas.Timbre + + Dim ArchivoLLave As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoKey) + Dim ArchivoCertificado As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoCer) + Dim UsuarioServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC, "rene.molina@adsistemas.mx") + Dim ClaveServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC.ToLower, "rene2018") + Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey + Dim EmisorRFC As String = UsuarioActual.Empresa.RFC + Dim UrlServicio As String = "" ' Produccion + Dim RutaArchivo As String = String.Format("{0}XML\{1}\", UsuarioActual.Empresa.Ruta, Ventas.TipoDocto) + Dim NombreArchivoXML As String = ObjCFDITimbre.Comprobante.SerieFolio + Dim SubTotal As Decimal = 0 + Dim TimbraProduccion As Boolean = True + If Not Directory.Exists(RutaArchivo) Then Directory.CreateDirectory(RutaArchivo) + + UrlServicio = "https://cfdi.gofac.com.mx/timbrado.asmx?WSDL" + + If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then + + EmisorRFC = "EKU9003173C9" + UsuarioActual.Empresa.Empresa = "ESCUELA KEMPER URGATE SA DE CV" + ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\EKU9003173C9.key" + ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\EKU9003173C9.cer" + + Clave = "12345678a" + TimbraProduccion = False + UsuarioServicio = "UserTest" + ClaveServicio = "1234567890" + + End If + +#Region "Valida" + If Not File.Exists(ArchivoCertificado) Then + Alert("El archivo de certificado no existe", TipoMensaje.MsgError) + Return "El archivo de certificado no existe" + End If + If Not File.Exists(ArchivoLLave) Then + Alert("El archivo de llave privada no existe", TipoMensaje.MsgError) + Return "El archivo de llave privada no existe" + End If + If UsuarioActual.Empresa.ContraseñaKey = "" Then + Alert("La clave no puede ser vacía", TipoMensaje.MsgError) + Return "La clave no puede ser vacía" + End If +#End Region + +#Region "Variables" + Dim llaveByte As Byte(), certByte As Byte() + Dim llaveBase64 As String, certBase64 As String + Dim cfdi As New GoFac.Cfdi4 + Dim complemento As String = "" + Dim complementoConcepto As String = "" + +#End Region + +#Region "Verifica" + Try + llaveByte = System.IO.File.ReadAllBytes(ArchivoLLave) + llaveBase64 = Convert.ToBase64String(llaveByte) + Catch ex As Exception + Alert($"Error al leer la llave privada: {ex.Message}", TipoMensaje.MsgError) + Return "Error al leer la llave privada" + End Try + + + Try + certByte = System.IO.File.ReadAllBytes(ArchivoCertificado) + certBase64 = Convert.ToBase64String(certByte) + Catch ex As Exception + Alert($"Error al leer el certificado: {ex.Message}", TipoMensaje.MsgError) + Return "Error al leer el certificado" + + End Try +#End Region + + + sw.Stop() + swTiempo.AppendFormat("Verificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() + + + Dim RespGeneracionXML As String = GenerarXMLGoCFDIv40(cfdi, EmisorRFC, ArchivoCertificado, llaveBase64, Clave, Ventas, UsuarioActual, CvePACEspecial) + sw.Stop() swTiempo.AppendFormat("Genera: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) swmili = sw.ElapsedMilliseconds sw.Start() #Region "Timbra" - If ArchivoGenerado Then + If RespGeneracionXML = "" Then cfdi.TimbrarCfdi(UsuarioServicio, ClaveServicio, TimbraProduccion) @@ -5622,18 +5647,19 @@ Public Class Timbrado Dim ArchivoLLave As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoKey) Dim ArchivoCertificado As String = String.Format("{0}Certificados\{1}", UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.ArchivoCer) - Dim UsuarioServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC, "rene.molina@adsistemas.mx") - Dim ClaveServicio As String = If(CvePACEspecial = 2, UsuarioActual.Empresa.RFC.ToLower, "rene2018") + + Dim UsuarioServicio As String = "rene.molina@adssistemas.mx" + Dim ClaveServicio As String = "Facturacion2021#" + Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey Dim EmisorRFC As String = UsuarioActual.Empresa.RFC - Dim UrlServicio As String = "" ' Produccion + Dim RutaArchivo As String = String.Format("{0}XML\{1}\", UsuarioActual.Empresa.Ruta, Ventas.TipoDocto) Dim NombreArchivoXML As String = ObjCFDITimbre.Comprobante.SerieFolio Dim SubTotal As Decimal = 0 Dim TimbraProduccion As Boolean = True If Not Directory.Exists(RutaArchivo) Then Directory.CreateDirectory(RutaArchivo) - UrlServicio = "https://cfdi.gofac.com.mx/timbrado.asmx?WSDL" If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then @@ -5644,9 +5670,6 @@ Public Class Timbrado Clave = "12345678a" TimbraProduccion = False - UsuarioServicio = "UserTest" - ClaveServicio = "1234567890" - End If #Region "Valida" @@ -5699,483 +5722,8 @@ Public Class Timbrado swmili = sw.ElapsedMilliseconds sw.Start() + Dim RespGeneracionXML As String = GenerarXMLGoCFDIv40(cfdi, EmisorRFC, ArchivoCertificado, llaveBase64, Clave, Ventas, UsuarioActual, CvePACEspecial) - 'cfdi.QuitarCerosDecimalDerecha = True ' no limita a 2 decimales, el atributo, de cantidad y precio unitario -#Region "Certificado" - cfdi.CertArchivo(ArchivoCertificado) -#End Region - - - sw.Stop() - swTiempo.AppendFormat("Certificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() - -#Region "Comprobante" - - cfdi.Comprobante( - ObjCFDITimbre.Comprobante.Serie, - ObjCFDITimbre.Comprobante.Folio, - ObjCFDITimbre.Comprobante.Fecha.ToString("yyyy-MM-ddTHH:mm:ss"), - ObjCFDITimbre.Comprobante.FormadePago, - ObjCFDITimbre.Comprobante.CondicionesdePago, - ObjCFDITimbre.Comprobante.SubTotal, - ObjCFDITimbre.Comprobante.Descuentos, - ObjCFDITimbre.Comprobante.Moneda, - ObjCFDITimbre.Comprobante.TipoCambio.ToString, - ObjCFDITimbre.Comprobante.Total, - ObjCFDITimbre.Comprobante.TipoComprobante, - ObjCFDITimbre.Comprobante.Exportacion, - ObjCFDITimbre.Comprobante.MetodoPago, - ObjCFDITimbre.Comprobante.LugarExpedicion, - ObjCFDITimbre.Comprobante.Confirmacion) - - If ObjCFDITimbre.CFDIRelacionados.TipoRelacion <> "" Then - cfdi.CfdiRelacionados(ObjCFDITimbre.CFDIRelacionados.TipoRelacion) - For Each uid As String In ObjCFDITimbre.CFDIRelacionados.UUID - cfdi.CfdiRelacionado(uid) - Next - End If -#Region "Emisor" - ' cfdi.agregarCfdiRelacionados() - cfdi.Emisor(EmisorRFC, UsuarioActual.Empresa.Empresa, UsuarioActual.Empresa.CodigoRegimenFiscal, "") - -#End Region - -#Region "Receptor" - - cfdi.Receptor(ObjCFDITimbre.Receptor.RFC, ObjCFDITimbre.Receptor.Nombre, ObjCFDITimbre.Receptor.DomicilioFiscalReceptor, ObjCFDITimbre.Receptor.ResidenciaFiscal, ObjCFDITimbre.Receptor.NumeroRegistroTributario, ObjCFDITimbre.Receptor.RegimenFiscalReceptor, ObjCFDITimbre.Receptor.UsoCFDI) - -#End Region - -#End Region - -#Region "Conceptos" - - 'Nodo conceptos, se agregan los PS - - If ObjCFDITimbre.Conceptos IsNot Nothing AndAlso ObjCFDITimbre.Conceptos.Count > 0 Then - For Each concep As CFDIConceptos In ObjCFDITimbre.Conceptos - cfdi.Concepto(concep.ClaveProdServ, concep.Noidentificacion, concep.Cantidad, concep.ClaveUnidad, concep.Unidad, concep.Descripcion, concep.ValorUnitario, concep.Importe, concep.Descuento, concep.ObjetoImpuesto) - For Each imp As CFDIConceptosImpuestos In concep.Impuestos - If imp.TrasladooRetencion = "T" Then - cfdi.ConceptoTraslado(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe) - Else - cfdi.ConceptoRetencion(imp.Base, imp.Impuesto, imp.TipoFactor, imp.TasaOCuota, imp.Importe) - End If - Next - If concep.CuentaPredial <> "" Then cfdi.CuentaPredial(concep.CuentaPredial) - If concep.NumeroPedimento <> "" Then cfdi.InformacionAduanera(concep.NumeroPedimento) - Next - End If - -#End Region - - If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E") Then - -#Region "Impuestos" - 'SI NO ES FACTURA EN 0 AGREGA LOS IMPUESTOS - If Ventas.Total <> 0 OrElse (ObjCFDITimbre.TotalImpuestosRetenidos > 0 OrElse ObjCFDITimbre.TotalImpuestosTrasladados > 0) Then - cfdi.Impuestos(ObjCFDITimbre.TotalImpuestosRetenidos, ObjCFDITimbre.TotalImpuestosTrasladados) - End If -#End Region -#Region " Traslados y Retenciones" - - - If ObjCFDITimbre.Retenciones.Sum(Function(x) x.Importe) > 0 Then - ''se acumulan los importes - For Each Ret In ObjCFDITimbre.Retenciones - cfdi.Retencion(Ret.Impuesto, Ret.Importe) - Next - End If - - ''se acumulan los importes - For Each Tras In ObjCFDITimbre.Traslados - cfdi.Traslado(Tras.Base, Tras.Impuesto, Tras.TipoFactor, Tras.TasaOCuota, Tras.Importe) - Next -#End Region - -#Region "Impuestos Locales" - - If ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe) > 0 OrElse ObjCFDITimbre.TrasladosLocales.Sum(Function(x) x.Importe) > 0 Then - - cfdi.ImpuestosLocales(ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe), ObjCFDITimbre.TrasladosLocales.Sum(Function(x) x.Importe)) - - For Each ret As CFDIRetencionesLocales In ObjCFDITimbre.RetencionesLocales - If ret.Importe > 0 Then - cfdi.RetencionLocal(ret.ImpuestoLocalRetenido, ret.TasaRetencion, ret.Importe) - End If - Next - - For Each ret As CFDITrasladosLocales In ObjCFDITimbre.TrasladosLocales - If ret.Importe > 0 Then - cfdi.TrasladoLocal(ret.ImpuestoLocalTraslado, ret.TasaTraslado, ret.Importe) - End If - Next - End If - - 'If Ventas.CveComplementoTimbrado > 0 Then - - ' Select Case Ventas.CveComplementoTimbrado - ' Case 5 'INE Proceso Ordinario Directivo Estatal" - ' cfdi.Ine11("Ordinario", "Directivo Estatal", "0") - - ' cfdi.IneEntidad(Ventas.ComplementoINE.INEEntidad, "") - ' cfdi.IneContabilidad(Ventas.ComplementoINE.INEIdContabilidad) - ' Case 6 'INE Proceso Ordinario Ejecutivo Estatal" - ' cfdi.Ine11("Ordinario", "Ejecutivo Estatal", "0") - - ' cfdi.IneEntidad(Ventas.ComplementoINE.INEEntidad, "") - ' cfdi.IneContabilidad(Ventas.ComplementoINE.INEIdContabilidad) - ' Case 7 'INE Proceso Ordinario Ejecutivo Nacional" - - ' cfdi.Ine11("Ordinario", "Ejecutivo Nacional", Ventas.ComplementoINE.INEIdContabilidad.ToString) - ' Case 8 'INE PreCampaña - ' cfdi.Ine11(Ventas.ComplementoINE.INETipoProceso, "", "0") - - ' cfdi.IneEntidad(Ventas.ComplementoINE.INEEntidad, Ventas.ComplementoINE.INETipoComite) - ' cfdi.IneContabilidad(Ventas.ComplementoINE.INEIdContabilidad) - ' End Select - - 'End If - - - -#End Region - - -#Region "Comercio Exterior" - - 'If Ventas.Cliente.AplicaComercioExterior And ObjCFDITimbre.Complementos.ComercioExterior11.AplicaComercioExteriorSubProyecto Then - ' If ObjCFDITimbre.Complementos.ComercioExterior11 IsNot Nothing Then - - ' 'DATOS GENERALES - ' cfdi.ComercioExterior11(ObjCFDITimbre.Complementos.ComercioExterior11.MotivoTraslado, - ' ObjCFDITimbre.Complementos.ComercioExterior11.TipoOperacion, - ' ObjCFDITimbre.Complementos.ComercioExterior11.ClavedePedimento, - ' ObjCFDITimbre.Complementos.ComercioExterior11.CertificadoOrigen, - ' ObjCFDITimbre.Complementos.ComercioExterior11.NumCertificadoOrigen, - ' ObjCFDITimbre.Complementos.ComercioExterior11.NumeroExportadorConfiable, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Incoterm, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Subdivision, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Observaciones, - ' ObjCFDITimbre.Complementos.ComercioExterior11.TipoCambioUSD, - ' ObjCFDITimbre.Complementos.ComercioExterior11.TotalUSD) - ' 'EMISOR - ' cfdi.ComercioExterior11Emisor(If(EmisorRFC.Length >= 12, "", ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CURP)) - ' cfdi.ComercioExterior11Domicilio(ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Calle, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.NumeroExterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.NumeroInterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Colonia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Localidad, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Referencia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Municipio, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Estado, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Pais, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CP) - ' 'RECEPTOR - ' cfdi.ComercioExterior11Receptor(ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumRegIdTrib) - ' cfdi.ComercioExterior11DomicilioReceptor(ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Calle, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroExterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroInterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Colonia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Localidad, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Referencia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Municipio, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Estado, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Pais, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.CP) - ' cfdi.ComercioExterior11Destinatario(ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumRegIdTrib, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Nombre, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Calle, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroExterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroInterior, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Colonia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Localidad, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Referencia, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Municipio, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Estado, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Pais, - ' ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.CP) - ' 'MERCANCIAS - ' If ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias IsNot Nothing AndAlso ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias.Count > 0 Then - ' For Each concep As CFDIComercioExterior11Mercancias In ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias - ' cfdi.ComercioExterior11Mercancia(concep.NoIdentificacion, concep.FraccionArancelaria, concep.CantidadAduana, concep.UnidadAduana, concep.ValorUnitarioAduana, concep.ValorDolares) - ' If concep.DescripcionesEspecificas.Marca <> "" Then - ' cfdi.ComercioExterior11MercanciaDescripcionesEspeciales(concep.DescripcionesEspecificas.Marca, - ' concep.DescripcionesEspecificas.Modelo, - ' concep.DescripcionesEspecificas.SubModelo, - ' concep.DescripcionesEspecificas.NumeroSerie) - ' End If - ' Next - - ' End If - - - ' End If - 'End If - -#End Region - - - End If - - - -#Region "C O M P L E M E N T O C A R T A P O R T E" - - - If ObjCFDITimbre.Complementos.CartaPorte IsNot Nothing Then - - Dim Carta As CFDICartaPorte = ObjCFDITimbre.Complementos.CartaPorte - - ''DATOS GENERALES - cfdi.CartaPorte(Carta.TranspInternac, Carta.EntradaSalidaMercancia, "", Carta.ViaEntradaSalida, Carta.TotalDistanciaRecorrida) - - 'UBICACIONES - If Carta.Ubicaciones IsNot Nothing AndAlso Carta.Ubicaciones.Count > 0 Then - For Each ubica As CFDICartaPorteUbicacion In Carta.Ubicaciones - 'origen - cfdi.CartaPorteUbicacion(ubica.TipoUbicacion, ubica.IDUbicacion, ubica.RFCRemitenteDestinatario, ubica.NombreRemitenteDestinatario, ubica.NumRegIdTrib, ubica.ResidenciaFiscal, ubica.NumEstacion, ubica.NombreEstacion, ubica.NavegacionTrafico, ubica.FechaHoraSalidaLlegada, ubica.TipoEstacion, ubica.DistanciaRecorrida) - 'cfdi.CartaPorteOrigen(ubica.Origen.IDOrigen, ubica.Origen.RFCRemitente, ubica.Origen.NombreRemitente, ubica.NumRegIdTrib, ubica.Origen.ResidenciaFiscal, ubica.Origen.NumEstacion, ubica.Origen.NombreEstacion, ubica.Origen.NavegacionTrafico, ubica.Origen.FechaHoraSalida) - cfdi.CartaPorteDomicilio(ubica.Domicilio.Calle, ubica.Domicilio.NumeroExterior, ubica.Domicilio.NumeroInterior, ubica.Domicilio.Colonia, ubica.Domicilio.Localidad, ubica.Domicilio.Referencia, ubica.Domicilio.Municipio, ubica.Domicilio.Estado, ubica.Domicilio.Pais, ubica.Domicilio.CP) - Next - - End If - - 'MERCANCIAS - If Carta.Mercancias IsNot Nothing Then - cfdi.CartaPorteMercancias(Carta.Mercancias.PesoBrutoTotal, Carta.Mercancias.UnidadPeso, Carta.Mercancias.PesoNetoTotal, Carta.Mercancias.NumTotalMercancias, Carta.Mercancias.CargoporTasacion) - If Carta.Mercancias IsNot Nothing AndAlso Carta.Mercancias.Mercancias.Count > 0 Then - For Each concep As CFDICartaPorteMercancia In Carta.Mercancias.Mercancias - cfdi.CartaPorteMercancia(concep.BienesTransp, concep.ClaveSTCC, concep.Descripción, concep.Cantidad, concep.ClaveUnidad, concep.Unidad, concep.Dimensiones, concep.MaterialPeligroso, concep.ClaveMaterialPeligroso, If(concep.ClaveMaterialPeligroso <> "", concep.Embalaje, ""), If(concep.ClaveMaterialPeligroso <> "", concep.DescripEmbalaje, ""), concep.PesoenKg, concep.ValorMercancia, concep.Moneda, concep.FraccionArrancelaria, concep.UUIDComercioExt) - For Each transp In concep.MercanciasCantidadTransporta - cfdi.CartaPorteCantidadTransporta(transp.Cantidad, transp.IDOrigen, transp.IDDestino, transp.CvesTransportes) - Next - Next - End If - End If - ' - If Carta.FiguraTransporte IsNot Nothing Then - - If Carta.FiguraTransporte.AutoTransporte IsNot Nothing Then - - cfdi.CartaPorteAutotransporte(Carta.FiguraTransporte.AutoTransporte.PermisoSCT, Carta.FiguraTransporte.AutoTransporte.NumPermisoSCT) - - cfdi.CartaPorteIdentificacionVehicular(Carta.FiguraTransporte.AutoTransporte.Vehiculo.ConfigVehicular, Carta.FiguraTransporte.AutoTransporte.Vehiculo.PlacaVM, Carta.FiguraTransporte.AutoTransporte.Vehiculo.AnioModeloVM) - - cfdi.CartaPorteSeguros(Carta.FiguraTransporte.AutoTransporte.NombreSeguroResponsabilidadCivil, Carta.FiguraTransporte.AutoTransporte.PolizaSeguroResponsabilidadCivil, - Carta.FiguraTransporte.AutoTransporte.NombreSeguroMedioAmbiente, Carta.FiguraTransporte.AutoTransporte.PolizaSeguroMedioAmbiente, - Carta.FiguraTransporte.AutoTransporte.NombreSeguroCarga, Carta.FiguraTransporte.AutoTransporte.PolizaSeguroCarga, - Carta.FiguraTransporte.AutoTransporte.PrimaSeguro) - - If Carta.FiguraTransporte.AutoTransporte.Remolques IsNot Nothing AndAlso Carta.FiguraTransporte.AutoTransporte.Remolques.Count > 0 Then - For Each concep As CFDICartaPorteRemolque In Carta.FiguraTransporte.AutoTransporte.Remolques - cfdi.CartaPorteRemolque(concep.SubTipoRemolque, concep.Placa) - Next - - End If - End If - - If Carta.FiguraTransporte.Operadores IsNot Nothing AndAlso Carta.FiguraTransporte.Operadores.Count > 0 Then - For Each concep As CFDICartaPorteOperador In Carta.FiguraTransporte.Operadores - cfdi.CartaPorteTiposFigura(concep.TipoFigura, concep.RFCFigura, concep.NumLicencia, concep.NombreFigura, concep.NumRegidTribFigura, If(concep.ResidenciaFiscalFigura <> "MEX", concep.ResidenciaFiscalFigura, "")) - If concep.TipoFigura.Contiene("02", "03") Then ' “02”- Propietario o “03” -Arrendador - cfdi.CartaPortePartesTransporte("PT01") - cfdi.CartaPortePartesTransporteDomicilio(concep.Domicilio.Calle, concep.Domicilio.NumeroExterior, concep.Domicilio.NumeroInterior, concep.Domicilio.Colonia, concep.Domicilio.Localidad, concep.Domicilio.Referencia, concep.Domicilio.Municipio, concep.Domicilio.Estado, concep.Domicilio.Pais, concep.Domicilio.CP) - End If - Next - End If - - End If - - End If - - -#End Region - - -#Region "Complemento Pago" - - If ObjCFDITimbre.Comprobante.TipoComprobante = "P" Then - - cfdi.Pago(ObjCFDITimbre.ComplementoPagos.FechaPago.ToString("yyyy-MM-ddTHH:mm:ss"), - ObjCFDITimbre.ComplementoPagos.FormaDePagoP, - ObjCFDITimbre.ComplementoPagos.MonedaP, - ObjCFDITimbre.ComplementoPagos.TipoCambioP, - ObjCFDITimbre.ComplementoPagos.Monto, - ObjCFDITimbre.ComplementoPagos.NumOperacion, - ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaOrd, - ObjCFDITimbre.ComplementoPagos.NomBancoOrdExt, - ObjCFDITimbre.ComplementoPagos.CtaOrdenante, - ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaBen, - ObjCFDITimbre.ComplementoPagos.CtaBeneficiario, - ObjCFDITimbre.ComplementoPagos.TipoCadPago, - ObjCFDITimbre.ComplementoPagos.CertPago, - ObjCFDITimbre.ComplementoPagos.CadPago, - ObjCFDITimbre.ComplementoPagos.SelloPago) - - - If ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count > 0 Then - - - For Each doc As CFDIComplementoPagosDocsRelacionados In ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados - cfdi.PagoDoctoRelacionado(doc.IdDocumento, - doc.Serie, - doc.Folio, - doc.MonedaDR, - doc.TipoCambioDR, - doc.MetodoDePagoDR, - doc.NumParcialidad, - doc.ImpSaldoAnt, - doc.ImpPagado, - doc.ImpSaldoInsoluto) - - Next - - 'Estos impuestos aplicarían para anticipos - If ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos > 0 OrElse ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados > 0 Then - - cfdi.PagoImpuestos(ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos, ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados) - If (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "R").Count > 0 Then - For Each Ret As CFDIConceptosImpuestos In (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "R") - cfdi.PagoRetencion(Ret.Impuesto, Ret.Importe) - Next - End If - If (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "T").Count > 0 Then - For Each Tra As CFDIConceptosImpuestos In (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "T") - cfdi.PagoTraslado(Tra.Impuesto, Tra.TipoFactor, Tra.TasaOCuota, Tra.Importe) - Next - End If - - End If - - - - End If - - End If -#End Region - - - -#Region "Nomina12" - If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then - - 'cfdi.Esquema.AgregarEsquema("http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd") - cfdi.Nomina12(ObjCFDITimbre.Nomina.TipoNomina, ObjCFDITimbre.Nomina.FechaPago.ToString("yyyy-MM-dd"), ObjCFDITimbre.Nomina.FechaInicio.ToDate().ToString("yyyy-MM-dd"), ObjCFDITimbre.Nomina.FechaFin.ToDate().ToString("yyyy-MM-dd"), ObjCFDITimbre.Nomina.NumDiasPagados, If(ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0, ObjCFDITimbre.Nomina.TotalPercepciones, 0), If(ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0, ObjCFDITimbre.Nomina.TotalDeducciones, 0), If(ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing AndAlso ObjCFDITimbre.Nomina.OtrosPagos.Count > 0, ObjCFDITimbre.Nomina.TotalOtrosPagos, 0)) - - cfdi.Nomina12Emisor(ObjCFDITimbre.Emisor.CURP, If(ObjCFDITimbre.Nomina.Receptor.TipoContrato.Contiene("09", "10", "99"), "", ObjCFDITimbre.Emisor.RegistroPatronal), ObjCFDITimbre.Emisor.RFC) - - If UsuarioActual.Empresa.UsaAC Then cfdi.Nomina12EntidadSNCF("IF", 90) - - -#Region "Receptor" - - cfdi.Nomina12Receptor(ObjCFDITimbre.Nomina.Receptor.CURP, - ObjCFDITimbre.Nomina.Receptor.NSS, - ObjCFDITimbre.Nomina.Receptor.FechaInicioContrato.ToDate().ToString("yyyy-MM-dd"), - ObjCFDITimbre.Nomina.Receptor.Antiguedad, - ObjCFDITimbre.Nomina.Receptor.TipoContrato, - ObjCFDITimbre.Nomina.Receptor.Sindicalizado, - ObjCFDITimbre.Nomina.Receptor.CodigoTipoJornada, - ObjCFDITimbre.Nomina.Receptor.CodigoRegimenContratacion, - ObjCFDITimbre.Nomina.Receptor.CodigoEmpleado, - ObjCFDITimbre.Nomina.Receptor.Departamento, - ObjCFDITimbre.Nomina.Receptor.Puesto, - ObjCFDITimbre.Nomina.Receptor.CodigoRiesgoPuesto, - If(ObjCFDITimbre.Nomina.TipoNomina = "E", "99", ObjCFDITimbre.Nomina.Receptor.TipoPeriodo), - ObjCFDITimbre.Nomina.Receptor.CodigoBanco, - ObjCFDITimbre.Nomina.Receptor.NumeroCuenta, - ObjCFDITimbre.Nomina.Receptor.SBC, - ObjCFDITimbre.Nomina.Receptor.SDI, - ObjCFDITimbre.Nomina.Receptor.CodigoEntidadFederativa) - 'cfdi.Nomina12SubContratacion("", "0") - 'cfdi.agregarNominaPercepcionesPercepcionAccionesOTitulos12("100", "200"); - 'cfdi.agregarNominaPercepcionesSeparacionIndemnizacion12("100", "10", "1000", "100", "50"); - 'cfdi.agregarNominaPercepcionesJubilacionPensionRetiro12("50", "100", "10", "100", "0"); - - - End If -#End Region - If ObjCFDITimbre.Nomina IsNot Nothing Then - 'If cfdi.Nomina12SeparacionIndemnizacion Then - If ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0 Then - cfdi.Nomina12Percepciones(ObjCFDITimbre.Nomina.TotalSueldos, ObjCFDITimbre.Nomina.TotalIndemnizacion, ObjCFDITimbre.Nomina.TotalJubilacion, ObjCFDITimbre.Nomina.TotalPercepcionesGravado, ObjCFDITimbre.Nomina.TotalPercepcionesExento) - For Each percep As CFDINominaPercepciones In ObjCFDITimbre.Nomina.Percepciones - cfdi.Nomina12Percepcion(percep.TipoPercepcion, percep.Clave, percep.Concepto, Math.Round(percep.ImporteGravado, 2), Math.Round(percep.ImporteExento, 2)) - If percep.TipoPercepcion.ToEntero() = 19 Then - - If ObjCFDITimbre.Nomina.HorasExtras IsNot Nothing AndAlso ObjCFDITimbre.Nomina.HorasExtras.Count > 0 Then - For Each HoraExtra As CFDINominaHorasExtras In ObjCFDITimbre.Nomina.HorasExtras - cfdi.Nomina12HorasExtra(HoraExtra.Dias.ToEntero, HoraExtra.TipoHoras, HoraExtra.HorasExtra, HoraExtra.ImportePagado) - Next - End If - End If - Next - End If - - If ObjCFDITimbre.IStimbreFiniquito Then - 'ObjCFDITimbre.Nomina. - Dim UltimoSueldoOrdinario As Double = ObjCFDITimbre.Nomina.UltimoSueldoOrdinario.ToString().ToDouble() - Dim TotalIndemnizacion As Double = ObjCFDITimbre.Nomina.TotalIndemnizacion - Dim t1 As Double = If(UltimoSueldoOrdinario < TotalIndemnizacion, UltimoSueldoOrdinario, TotalIndemnizacion) - Dim t2 As Double = If(UltimoSueldoOrdinario < TotalIndemnizacion, TotalIndemnizacion, UltimoSueldoOrdinario) - cfdi.Nomina12SeparacionIndemnizacion(TotalIndemnizacion, ObjCFDITimbre.Nomina.Antiguedad, UltimoSueldoOrdinario, t1, t2 - t1) - - End If - 'deducciones al final - If ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0 Then - cfdi.Nomina12Deducciones(ObjCFDITimbre.Nomina.TotalDeduccionesOtras, Math.Round(ObjCFDITimbre.Nomina.TotalDeduccionesImpuestosRetenidos, 2)) - For Each deduc As CFDINominaDeducciones In ObjCFDITimbre.Nomina.Deducciones - cfdi.Nomina12Deduccion(deduc.TipoDeduccion, deduc.Clave, deduc.Concepto, Math.Round(deduc.Importe, 2)) - Next - End If - If ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing Then - ' cfdi.agregarNominaOtrosPagosOtroPago12("002", "002", "Subsidio", "10.00"); - ' cfdi.agregarNominaOtrosPagosOtroPagoSubsidioAlEmpleo12("10.00"); - If ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing AndAlso ObjCFDITimbre.Nomina.OtrosPagos.Count > 0 Then - For Each otpag As CFDINominaOtrosPagos In ObjCFDITimbre.Nomina.OtrosPagos - cfdi.Nomina12OtroPago(otpag.TipoOtroPago, otpag.Clave, otpag.Concepto, otpag.Importe) - If otpag.TipoOtroPago = "002" Then - cfdi.Nomina12SubsidioAlEmpleo(otpag.Subsidiocausado) - End If - - If otpag.TipoOtroPago = "004" AndAlso otpag.Importe > 0 Then - If otpag.ejercicio > 0 Then - cfdi.CompensacionSaldosAFavor(otpag.SaldoAFavor, otpag.ejercicio, otpag.RemanenteSalFav) 'otpag.SaldoAFavor - End If - End If - - Next - End If - End If - If ObjCFDITimbre.Nomina.Incapacidades IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Incapacidades.Count > 0 Then - For Each Incap As CFDINominaIncapacidades In ObjCFDITimbre.Nomina.Incapacidades - cfdi.Nomina12Incapacidad(Incap.DiasIncapacidad.ToEntero, Incap.TipoIncapacidad, Incap.Importe) - Next - End If - End If -#End Region - - sw.Stop() - swTiempo.AppendFormat("Armado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) - swmili = sw.ElapsedMilliseconds - sw.Start() -#Region "Genera XML" - Dim ArchivoGenerado As Boolean = False - Try - cfdi.GenerarXmlB64(llaveBase64, Clave) - ArchivoGenerado = True - Catch ex As Exception - Retorno = cfdi.Mensaje - If Retorno = "" OrElse IsNothing(Retorno) Then - Retorno = $"llaveBase64 ={llaveBase64}
Clave ={Clave}
{ex.ToString()}" - End If - MensajeErrorCFDI = Retorno - End Try - -#End Region sw.Stop() swTiempo.AppendFormat("Genera: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) swmili = sw.ElapsedMilliseconds @@ -6184,7 +5732,18 @@ Public Class Timbrado Dim msgErrorGeneracion As String = If(String.IsNullOrEmpty(cfdi.Mensaje), "", cfdi.Mensaje) #Region "Timbra" - If ArchivoGenerado Then + If RespGeneracionXML = "" Then + 'OBTENER EL XML DE LA VARIABLE PRIVADA "_xml" YA QUE NO ES ACCESIBLE POR MEDIO DE LA PROPIEDAD "XML" ANTES DE TIMBRAR + Dim valorXML = "" + Try + + Dim tipo = GetType(GoFac.Cfdi4) + Dim info = tipo.GetField("_xml", BindingFlags.NonPublic Or BindingFlags.Instance) + valorXML = info?.GetValue(cfdi).ToString() + Catch ex As Exception + valorXML = "" + OnError("Ocurrió un error al generar el xml", ex) + End Try Dim Respuesta As String = "" @@ -6196,12 +5755,11 @@ Public Class Timbrado New JProperty("certBase64", certBase64), New JProperty("keyBase64", llaveBase64), New JProperty("keyPass", Clave), - New JProperty("xmlBase64", cfdi.Xml.ToBase64Encode()), + New JProperty("xmlBase64", valorXML.ToString().ToBase64Encode()), New JProperty("prueba", (Not TimbraProduccion).ToString().ToLower), New JProperty("opciones", New String(0) {""}) ) - 'Respuesta = EnviarInformacionPADE("https://timbrado.pade.mx/servicio/rest/timbrado/timbrarConCSD", payload.ToString(), TokenAuth) - Respuesta = EnviarInformacionPADE("https://timbrado.pade.mx/servicio/rest/timbrado/timbrarConCSD", payload.ToString(), TokenAuth) + Respuesta = EnviarInformacionPADE("https://timbrado.pade.mx/servicio/rest/timbrado40/timbrarConCSD", payload.ToString(), TokenAuth) End If ' Aumentamos el timeout de la operación @@ -6227,7 +5785,13 @@ Public Class Timbrado If result.timbradoOk Then Dim FolioFiscal As String = result.UUID 'GUARDA EL XML RETORNADO POR EL PAC - 'cfdi.EscribirXML(result.xmlBase64.ToBase64Decode(), RutaArchivo, NombreArchivoXML) + Try + Dim xdoc As New XmlDocument() + xdoc.LoadXml(result.xmlBase64.ToBase64Decode()) + xdoc.Save(RutaArchivo & NombreArchivoXML & ".xml") + Catch ex As Exception + OnError("Ocurrió un error al guardar el xml", ex) + End Try sw.Stop() swTiempo.AppendFormat("Guardado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) @@ -6342,7 +5906,6 @@ Public Class Timbrado End Function #End Region - Public Class PADEServicioTimbradoResp @@ -6498,7 +6061,7 @@ Public Class Timbrado comprobante.FormaPago = ObjCFDITimbre.Comprobante.FormadePago If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E", "N") Then comprobante.CondicionesDePago = ObjCFDITimbre.Comprobante.CondicionesdePago - comprobante.SubTotal = ObjCFDITimbre.Comprobante.Subtotal.RoundSQL(NumDecimalesImporte) + comprobante.SubTotal = ObjCFDITimbre.Comprobante.SubTotal.RoundSQL(NumDecimalesImporte) If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E", "N") Then If ObjCFDITimbre.Comprobante.Descuentos > 0 Then comprobante.DescuentoSpecified = True diff --git a/Bancos/IE.aspx.vb b/Bancos/IE.aspx.vb index b6d2a0315..8be4b0926 100644 --- a/Bancos/IE.aspx.vb +++ b/Bancos/IE.aspx.vb @@ -4624,8 +4624,8 @@ Partial Class Bancos_IE End If Else - Dim Resp As RespuestaCancelacionSAT = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscalCancelar, 0, RFCReceptorCancelar, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) - If Resp.Verificado Then + Dim respCancelacion = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscalCancelar, 0, RFCReceptorCancelar, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) + If respCancelacion.Verificado Then If Banc.UpdateComplementoPago(CveComplementoPagoCancelar, "-1", -1, UsuarioActual.CveEmpresa, 2, CvePACCancelacion, FechaCancelacion:=ObjCancelacion.CancelacionFecha, SelloCancelacion:=ObjCancelacion.CancelacionAcuse, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) Then CargaComplementosPago() @@ -6695,9 +6695,9 @@ Partial Class Bancos_IE End If Else - Dim Resp As RespuestaCancelacionSAT = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscalCancelar, 0, RFCReceptorCancelar, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) - If Resp.Verificado Then + Dim resp = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscalCancelar, 0, RFCReceptorCancelar, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) + If resp.Verificado Then If ObjBanco.UpdateComplementoPago(CveComplementoPagoCancelar, "-1", -1, UsuarioActual.CveEmpresa, 2, CvePACCancelacion, FechaCancelacion:=ObjCancelacion.CancelacionFecha, SelloCancelacion:=ObjCancelacion.CancelacionAcuse, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) Then diff --git a/Bancos/RepComplementoPago.aspx.vb b/Bancos/RepComplementoPago.aspx.vb index 001edbfc8..d02dcc978 100644 --- a/Bancos/RepComplementoPago.aspx.vb +++ b/Bancos/RepComplementoPago.aspx.vb @@ -596,8 +596,8 @@ Partial Class Bancos_RepComplementoPago End If Else - - If ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, Can_FolioFiscalCancelar, 0, Can_RFCReceptorCancelar, UsuarioActual.Empresa.RFC, Can_CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) Then + Dim resp = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, Can_FolioFiscalCancelar, 0, Can_RFCReceptorCancelar, UsuarioActual.Empresa.RFC, Can_CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) + If resp.Verificado Then If ObjBanco.UpdateComplementoPago(Can_CveComplementoPagoCancelar, "-1", -1, UsuarioActual.CveEmpresa, 2, Can_CvePACCancelacion, FechaCancelacion:=ObjCancelacion.CancelacionFecha, SelloCancelacion:=ObjCancelacion.CancelacionAcuse, CveSATMotivoCancelacion:=CveSATMotivoCancelacion) Then Alert("El complemento se cancelo correctamente.") diff --git a/Bin/Profact.TimbraCFDI.dll b/Bin/Profact.TimbraCFDI.dll index 5bf77d18a..b1c756dcf 100644 Binary files a/Bin/Profact.TimbraCFDI.dll and b/Bin/Profact.TimbraCFDI.dll differ diff --git a/GPS/Trayectos.aspx b/GPS/Trayectos.aspx index b7e70ad7d..bf619391a 100644 --- a/GPS/Trayectos.aspx +++ b/GPS/Trayectos.aspx @@ -88,8 +88,11 @@
  • - - + + + + +
  • @@ -146,7 +149,7 @@
    - +
    diff --git a/GPS/Trayectos.aspx.vb b/GPS/Trayectos.aspx.vb index 611d4da95..6b851af94 100644 --- a/GPS/Trayectos.aspx.vb +++ b/GPS/Trayectos.aspx.vb @@ -37,9 +37,18 @@ Partial Class GPS_Trayectos Set(value As DataTable) ViewState("DtPosiciones") = value End Set - End Property + End Property + Private Property DtTrayectos As DataTable + Get + Return CType(ViewState("DtTrayectos"), DataTable) + End Get + Set(value As DataTable) + ViewState("DtTrayectos") = value + End Set + End Property + #End Region - + Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load If Not Page.IsPostBack Then DirectCast(Master.FindControl("TSM"), ScriptManager).EnablePageMethods = True @@ -52,7 +61,6 @@ Partial Class GPS_Trayectos CargaDispositivos() CargaGeoReferencias() CargaEstatus() - CargaDdlTrayectos() CargaTrayectos() End Sub @@ -98,28 +106,32 @@ Partial Class GPS_Trayectos Dim CveEstatus As Integer = -1 If ChkActivas.Checked AndAlso DdlEstatusTrayecto.SelectedValue.ToEntero() <= 0 Then - CveEstatus = -2 + CveEstatus = -2 Else CveEstatus = DdlEstatusTrayecto.SelectedValue.ToEntero() End If Dim ObjGPS As New ClsGPS If ObjGPS.GetTrayectos(-1, DdlDispositivoFiltro.SelectedValue.ToEntero(), UsuarioActual.CveCliente, CveEstatus, FechaI, FechaF) Then - GvBarra.DataSource = ObjGPS.DtResultados + DtTrayectos = ObjGPS.DtResultados.Copy() End If ObjGPS.Dispose() + + GvBarra.DataSource = DtTrayectos GvBarra.DataBind() UPGV.Update() End Sub - Public Sub CargaDdlTrayectos() - Dim ObjGPS As New ClsGPS - If ObjGPS.GetTrayectos(-1, -1, UsuarioActual.CveCliente) Then - DdlTrayecto.DataSource = ObjGPS.DtResultados.FiltraParametros("EsFin = True") - End If - ObjGPS.Dispose() + Public Sub CargaDdlTrayectos() + 'Dim ObjGPS As New ClsGPS + 'If ObjGPS.GetTrayectos(-1, -1, UsuarioActual.CveCliente) Then + ' DdlTrayecto.DataSource = ObjGPS.DtResultados.FiltraParametros("EsFin = True") + 'End If + 'ObjGPS.Dispose() + + DdlTrayecto.DataSource = DtTrayectos DdlTrayecto.DataBind() - UpAgregar.Update() + UpDdlTrayecto.Update() End Sub Public Sub CargaEstatus() Dim ObjGPS As New ClsGPS @@ -469,5 +481,9 @@ Partial Class GPS_Trayectos TimmerRefresh.Enabled = ChkTimmer.Checked UPGV.Update() - End Sub + End Sub + Protected Sub LnkAddE_Click(sender As Object, e As EventArgs) + CargaDdlTrayectos() + RegistraScript("$('#DivCrearApatir').modal({backdrop: 'static', keyboard: false});") + End Sub End Class diff --git a/Inventarios/RepTraspasoEmitido.aspx.cs b/Inventarios/RepTraspasoEmitido.aspx.cs index c670c1054..fbb396b49 100644 --- a/Inventarios/RepTraspasoEmitido.aspx.cs +++ b/Inventarios/RepTraspasoEmitido.aspx.cs @@ -62,7 +62,8 @@ public partial class Inventarios_RepTraspasoEmitido : ClsPaginas int CveEstatusTimbrado = 0; string FolioFiscal = Gvr.DataKey("FolioFiscal").ToString(),SelloCancelacion =""; int CveMovimiento = Gvr.DataKey("CveMovimiento").ToEntero(); - if (ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscal, 0, UsuarioActual.Empresa.RFC, UsuarioActual.Empresa.RFC, 4,false)) + var resp = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscal, 0, UsuarioActual.Empresa.RFC, UsuarioActual.Empresa.RFC, 4, false); + if (resp.Verificado) { CancelacionFecha = ObjCancelacion.CancelacionFecha; SelloCancelacion = ObjCancelacion.CancelacionAcuse; diff --git a/Ventas/Clientes.aspx.vb b/Ventas/Clientes.aspx.vb index f999d2e09..495e49793 100644 --- a/Ventas/Clientes.aspx.vb +++ b/Ventas/Clientes.aspx.vb @@ -2064,20 +2064,25 @@ Partial Class Clientes DdlSucursalFormaPago33.DataSource = GlobalDTVtaFormaPago DdlSucursalFormaPago33.DataBind() End Sub - Private Sub CargaComboCFDI() + Private Sub CargaComboCFDI() + Dim RegimenFiscalCliente = DdlRegimenFiscal.SelectedValue.ToString() + If UsuarioActual.Empresa.Funcionalidad(350) <> "1" Then + RegimenFiscalCliente = "-1" + End If + DdlUsoCFDI.Items.Clear() - DdlUsoCFDI.DataSource = GlobalDTSATUsosCFDI(UsuarioActual.Empresa.EsPersonaFisica) + DdlUsoCFDI.DataSource = GlobalDTSATUsosCFDI(UsuarioActual.Empresa.EsPersonaFisica, RegimenFiscalReceptor:=RegimenFiscalCliente) DdlUsoCFDI.DataBind() DdlUsoCFDI.Items.Insert(0, New ListItem("Seleccione", "-1")) DdlSucursalUsoCFDI.Items.Clear() - DdlSucursalUsoCFDI.DataSource = GlobalDTSATUsosCFDI(UsuarioActual.Empresa.EsPersonaFisica) + DdlSucursalUsoCFDI.DataSource = GlobalDTSATUsosCFDI(UsuarioActual.Empresa.EsPersonaFisica, RegimenFiscalReceptor:=RegimenFiscalCliente) DdlSucursalUsoCFDI.DataBind() - End Sub + End Sub #End Region - + #Region "V E R M Á S" - + Protected Sub BtnVerMasVentas_Click(sender As Object, e As EventArgs) If BtnVerMasVentas.Text = "Ver Más" Then CargaHistorial(-1) diff --git a/Ventas/PV.aspx.vb b/Ventas/PV.aspx.vb index 280686c3a..e7065a8a7 100644 --- a/Ventas/PV.aspx.vb +++ b/Ventas/PV.aspx.vb @@ -758,6 +758,15 @@ Partial Class PV End Set End Property + Private Property CantidadAntesEdicion As Decimal + Get + Return If(IsNothing(ViewState("CantidadAntesEdicion")), "0", ViewState("CantidadAntesEdicion").ToString()).ToDecimal() + End Get + Set(value As Decimal) + ViewState("CantidadAntesEdicion") = value + End Set + End Property + #End Region #Region "PROPIEDADES CONTRATOS" @@ -1071,6 +1080,7 @@ Partial Class PV ViewState("ClienteRetIVA") = 0 ViewState("ClienteRetISR") = 0 ViewState("EnviarCorreoCliente") = False + Me.CantidadAntesEdicion = 0 HdnPorcentajeDescuentoMaximo.Value = If(UsuarioActual.DescuentoAutorizado > 0, UsuarioActual.DescuentoAutorizado, 15).ToString() CveVentaDetalle = -1 EstablecioFolio = False @@ -5125,7 +5135,15 @@ Partial Class PV If DdlTipoComprobante.SelectedValue <> "Cot" Then 'VALIDA EXISTENCIA If UsuarioActual.CveEmpresa.Contiene({1, 72, 80, 119, 140}) Then - If Existencia - TmpDT.SUM("Cantidad", $"CvePS = {CvePS}") < TxtCantidad.Text.ToDouble Then + Dim CantidadAgregada As Decimal = TmpDT.SUMD("Cantidad", $"CvePS = {CvePS}") + + If Modalidad = "U" Then + CantidadAgregada = CantidadAgregada - CantidadAntesEdicion + TxtCantidad.Text.ToDecimal() + Else + CantidadAgregada = CantidadAgregada + TxtCantidad.Text.ToDecimal() + End If + + If Existencia < CantidadAgregada Then Alert("No cuenta con la cantidad suficiente en inventario. Cuenta con " + Existencia.FormatoNumero(2) + ".", TipoMensaje.MsgAdvertencia) Return False End If @@ -5229,6 +5247,7 @@ Partial Class PV End Sub Private Sub CargaAgregar() Modalidad = "A" + CantidadAntesEdicion = 0 LnkAgregarPS.Text = "Agregar" CargaBCI() LimpiaAgregar() @@ -5268,6 +5287,7 @@ Partial Class PV End If DdlPSIndexChange(DdlPS.SelectedValue.ToEntero, DdlPS) DdlUnidadMedida.SelectedValueExist(GvRow.DataKey("CveUM")) + CantidadAntesEdicion = GvRow.DataKey("Cantidad").ToDecimal() TxtCantidad.Text = GvRow.DataKey("Cantidad") 'Dim TotalCargos As Decimal = 0 @@ -5324,6 +5344,9 @@ Partial Class PV RegistraScript("$('#DivAddVenta').modal({backdrop: 'static', keyboard: false});", "EdicionVenta") End Sub Protected Sub LnkAgregarPS_Click(sender As Object, e As EventArgs) + + Dim DrPS As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=DdlPS.SelectedValue.ToEntero).FiltroPrimero("") + If ChkAjuste.Checked Then Dim FolioGarantia As MFolioGarantiaMensaje = ValidaFolioGarantia(DdlPSAjuste.SelectedValue.ToEntero(), DdlFolioGarantia.SelectedValue.ToEntero()) @@ -5337,25 +5360,34 @@ Partial Class PV Exit Sub End If - If String.IsNullOrEmpty(TxtAnioVehiculo.Text.Trim()) Then - Alert("El campo año esta vacío.", TipoMensaje.MsgAdvertencia) - Exit Sub - End If + If DrPS IsNot Nothing Then + 'SOLO DEBE AGREGAR POLIZA VIRTUAL SI ES ACUMULADOR + If DrPS("CveClasificacion").ToString().ToEntero().Contiene(20520, 20522, 20513, 20511, 20521, 20512, 20514, 20229) Then + If String.IsNullOrEmpty(TxtAnioVehiculo.Text.Trim()) Then + Alert("El campo año esta vacío.", TipoMensaje.MsgAdvertencia) + Exit Sub + End If - If TxtAnioVehiculo.Text.ToDecimal() < 1900 Then - Alert("El campo año debe ser mayor a 1900.", TipoMensaje.MsgAdvertencia) - Exit Sub + If TxtAnioVehiculo.Text.ToDecimal() < 1900 Then + Alert("El campo año debe ser mayor a 1900.", TipoMensaje.MsgAdvertencia) + Exit Sub + End If + End If End If - Else - If Not String.IsNullOrEmpty(TxtAnioVehiculo.Text.Trim()) Then - If TxtAnioVehiculo.Text.ToDecimal() < 1900 Then - Alert("El año del vehiculo del vehículo no tiene el formato correcto.", TipoMensaje.MsgAdvertencia) - Exit Sub + If DrPS IsNot Nothing Then + 'SOLO DEBE AGREGAR POLIZA VIRTUAL SI ES ACUMULADOR + If DrPS("CveClasificacion").ToString().ToEntero().Contiene(20520, 20522, 20513, 20511, 20521, 20512, 20514, 20229) Then + If Not String.IsNullOrEmpty(TxtAnioVehiculo.Text.Trim()) Then + If TxtAnioVehiculo.Text.ToDecimal() < 1900 Then + Alert("El año del vehiculo del vehículo no tiene el formato correcto.", TipoMensaje.MsgAdvertencia) + Exit Sub + End If + End If End If End If - End If + End If If AgregarPS() Then diff --git a/Ventas/RepVentaDetalle.aspx b/Ventas/RepVentaDetalle.aspx index 4e87ac242..093dde449 100644 --- a/Ventas/RepVentaDetalle.aspx +++ b/Ventas/RepVentaDetalle.aspx @@ -308,6 +308,11 @@
    + +
    + + +
    diff --git a/Ventas/RepVentaDetalle.aspx.vb b/Ventas/RepVentaDetalle.aspx.vb index 7a8b22dc2..4ccbcd9c5 100644 --- a/Ventas/RepVentaDetalle.aspx.vb +++ b/Ventas/RepVentaDetalle.aspx.vb @@ -125,7 +125,7 @@ Partial Class RepVentaDetalle Private Sub InicializaValores() - Dim Grupo, CveCliente, CveSucursal, CveSubProyectoEjecucion, CveVendedor, CveUsuario, CveEstatusFactura, CveCorte, IVA, TipoDocto, CveClienteClasificacion, CveCondicionesPago As String + Dim Grupo, CveCliente, CveSucursal, CveSubProyectoEjecucion, CveVendedor, CveUsuario, CveEstatusFactura, CveCorte, IVA, TipoDocto, CveClienteClasificacion, CveCondicionesPago, CveTipoRelacion As String Dim Anio, Mes, AnioMes, Fecha, FechaI, FechaF As String Dim AnioEjec, MesEjec, AnioMesEjec, FechaEjec, FechaIEjec, FechaFEjec As String 'Dim CveSubProyecto As Integer @@ -162,6 +162,8 @@ Partial Class RepVentaDetalle CveMoneda = If(Request("CveMoneda") IsNot Nothing, Request("CveMoneda").ToString.ToEntero, -1).ToString.ToEntero TipoCliente = If(Request("TipoCliente") IsNot Nothing, Request("TipoCliente").ToString.ToEntero, -1).ToString.ToEntero + CveTipoRelacion = If(Request("CveTipoRelacion") IsNot Nothing, Request("CveTipoRelacion").ToString, "-1").ToString + DdlTipoCliente.SelectedValueExist(TipoCliente) 'LISTBOXS @@ -184,6 +186,8 @@ Partial Class RepVentaDetalle DdlVendedor.SelectedValuesIfExistM(CveVendedor) DdlClienteClasificacion.SelectedValueExist(CveClienteClasificacion) + DdlTipoRelacion.SelectedValueExist(CveTipoRelacion) + CargaClientes() DdlClientes.SelectedValue = CveCliente DdlUsuario.SelectedValueExist(CveUsuario) @@ -389,7 +393,12 @@ Partial Class RepVentaDetalle 'Carga Clasificacion Cliente DdlClienteClasificacion.DataSource = GlobalDTClienteClasificaciones(UsuarioActual.CveEmpresa) DdlClienteClasificacion.DataBind() - DdlClienteClasificacion.Items.Insert(0, New ListItem("Todos", "-1")) + DdlClienteClasificacion.Items.Insert(0, New ListItem("Todos", "-1")) + + + DdlTipoRelacion.DataSource = GlobalDTVtaTiposRelacion + DdlTipoRelacion.DataBind() + DdlTipoRelacion.Items.Insert(0, New ListItem("Todos", "-1")) CargaGrupo() CargaTipoCentroCosto() @@ -490,7 +499,7 @@ Partial Class RepVentaDetalle IVA, Vendedores, DdlUsuario.SelectedValue.ToEntero, Estatus, FechaI, FechaF, CveCorte.ToEntero, TipoComprobante, DdlSubProyectoEjecucion.SelectedValue.ToEntero, UsuarioActual.CveEmpresa, FechaIEjec, FechaFEjec, CveProyecto, Sucursales, TipoCambio, TCEspecifico, CveMoneda, CveUsuarioConsulta:=UsuarioActual.CveUsuario, CveClienteClasificacion:=DdlClienteClasificacion.SelectedValue.ToEntero, - CveCondicionesPago:=CveCondicionesPago, TipoCliente:=DdlTipoCliente.SelectedValue.ToEntero, ModalidadContable:=Not ChkLecturaAdmin.Checked) Then + CveCondicionesPago:=CveCondicionesPago, TipoCliente:=DdlTipoCliente.SelectedValue.ToEntero, ModalidadContable:=Not ChkLecturaAdmin.Checked, CveTipoRelacion:=DdlTipoRelacion.SelectedValue.ToEntero()) Then DtVentas = AddRows(ObjVentas.DtResultados) ImgImprimir.Enabled = True GvDatos.DataSource = AddRows(ObjVentas.DtResultados) diff --git a/Ventas/RepVentas.aspx b/Ventas/RepVentas.aspx index a4bbed3be..459cf763a 100644 --- a/Ventas/RepVentas.aspx +++ b/Ventas/RepVentas.aspx @@ -299,7 +299,7 @@ -
    +
    @@ -312,6 +312,11 @@
    + +
    + + +
    @@ -520,7 +525,7 @@