diff --git a/App_Code/ClsAcumuladores.vb b/App_Code/ClsAcumuladores.vb index c9886a914..4b4ab26fd 100644 --- a/App_Code/ClsAcumuladores.vb +++ b/App_Code/ClsAcumuladores.vb @@ -893,14 +893,15 @@ Public Class ClsAcumuladores End Try Return Retorno End Function - Public Function UpdateEnvioPolizaVirutal(CvePolizaVirtual As Integer, Envio As Boolean, FechaEnvio As DateTime, CodigoUnico As String) As Boolean + Public Function UpdateEnvioPolizaVirtual(CvePolizaVirtual As Integer, Envio As Boolean, FechaEnvio As DateTime, CodigoUnico As String, RespuestaEnvio As String) As Boolean Dim Retorno As Boolean = False SqlDataAdapter("PA_Vta_PolizaVirtualEnvioUpdate") With SqlAdapter.SelectCommand.Parameters .Add("@CvePolizaVirtual", SqlDbType.Int).Value = CvePolizaVirtual .Add("@Envio", SqlDbType.TinyInt).Value = Envio .Add("@FechaEnvio", SqlDbType.DateTime).Value = FechaEnvio - .Add("@CodigoUnico", SqlDbType.VarChar).Value = CodigoUnico + .Add("@CodigoUnico", SqlDbType.VarChar).Value = CodigoUnico + .Add("@RespuestaEnvio", SqlDbType.VarChar).Value = RespuestaEnvio End With Try SqlAdapter.Fill(Data) diff --git a/App_Code/ClsGenerales.vb b/App_Code/ClsGenerales.vb index 6c2279434..4b95212e9 100644 --- a/App_Code/ClsGenerales.vb +++ b/App_Code/ClsGenerales.vb @@ -3613,11 +3613,13 @@ Public Class ClsGenerales #Region " P O L I Z A V I R T U A L " - Public Function ModelosAutosGet(CveEmpresa As Integer) As Boolean + Public Function ModelosAutosGet(Estatus As Integer, CveEmpresa As Integer) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_Gral_ModelosAutosGet") - With SqlAdapter.SelectCommand.Parameters + With SqlAdapter.SelectCommand.Parameters + .Add("@Estatus", SqlDbType.Int).Value = Estatus .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + End With Try SqlAdapter.Fill(Data) diff --git a/App_Code/Modelos.vb b/App_Code/Modelos.vb index 7bc5842be..92d95b07b 100644 --- a/App_Code/Modelos.vb +++ b/App_Code/Modelos.vb @@ -1564,8 +1564,8 @@ Namespace Modelos End If If DtPolizasVirtuales IsNot Nothing Then - If DtPolizasVirtuales.Select($"CvePS={Row("CvePS").ToString.ToEntero}").Length > 0 Then - Dim RowPoliza As DataRow = DtPolizasVirtuales.Select($"CvePS={Row("CvePS").ToString.ToEntero}")(0) + If DtPolizasVirtuales.Select($"Consec = {Row("Consec").ToString()} AND CvePS={Row("CvePS").ToString.ToEntero}").Length > 0 Then + Dim RowPoliza As DataRow = DtPolizasVirtuales.Select($"Consec = {Row("Consec").ToString()} AND CvePS={Row("CvePS").ToString.ToEntero}")(0) RowPoliza("CveVentaDetalle") = ObjVentas.CveVentaDetalle End If End If @@ -1625,7 +1625,7 @@ Namespace Modelos 'POLIZA VIRTUAL If factura.DtPolizasVirtuales IsNot Nothing AndAlso factura.DtPolizasVirtuales.Rows.Count > 0 Then - If Not GuardarPolizasVirtuales(ObjVentas.IniciaTransacSQL(), ObjFactura:=factura) Then + If Not GuardarPolizasVirtuales(ObjAcum, ObjFactura:=factura) Then ErrorList.Add("Ocurrió un error al actualizar el distribuidor.") End If End If @@ -2225,13 +2225,11 @@ Namespace Modelos Return CveMovimiento End Function - Private Function GuardarPolizasVirtuales(SqlTransaccion As SqlClient.SqlTransaction, ObjFactura As Modelos.Factura) As Boolean + Private Function GuardarPolizasVirtuales(ByRef ObjAcum As ClsAcumuladores, ObjFactura As Modelos.Factura) As Boolean Dim Resultado As Boolean = True If UsuarioActual.Empresa.Funcionalidad(531).ToEntero > 0 AndAlso ObjFactura.TipoDocto.Contiene("Rem") Then - Dim ObjAcum As New ClsAcumuladores(SqlTransaccion) - For Each drow As DataRow In ObjFactura.DtPolizasVirtuales.Rows If ObjAcum.AddPolizaVirtual(ObjFactura.CveVenta, drow("CveVentaDetalle").ToString().ToEntero(), drow("CvePS").ToString.ToEntero, drow("Cantidad").ToString.ToDecimal, drow("PU").ToString.ToDecimal, drow("Descuento").ToString.ToDecimal, drow("Total").ToString.ToDecimal, drow("TipoServicio").ToString.ToEntero, drow("TipoPoliza").ToString.ToEntero, drow("CveModeloAuto").ToString.ToEntero, drow("AnioVehiculo").ToString.ToEntero, CBool(drow("TieneUsado").ToString), diff --git a/App_Code/Timbrado.vb b/App_Code/Timbrado.vb index 7b36fe3bc..4a327d03f 100644 --- a/App_Code/Timbrado.vb +++ b/App_Code/Timbrado.vb @@ -730,7 +730,7 @@ Public Class Timbrado Dim Contrato As String = "72330711-cac6-4106-8051-cbcda1aef495" - Dim Respuesta As String = EnviarInformacionCancelacionPADESOAP("https://timbrado.pade.mx/servicio/Timbrado3.3?wsdl", UsuarioServicio, ClaveServicio, Contrato, EmisorRFC, RFCReceptor, certBase64, llaveBase64, Clave, FolioFiscal, Total, TimbraProduccion) + Dim Respuesta As String = EnviarInformacionCancelacionPADESOAP("https://timbrado.pade.mx/servicio/Timbrado4.0?wsdl", UsuarioServicio, ClaveServicio, Contrato, EmisorRFC, RFCReceptor, certBase64, llaveBase64, Clave, FolioFiscal, Total, TimbraProduccion, MotivoCancelacion:=CodigoSATMotivoCancelacion, FolioSustitucion:=FolioSustitucion) If Not String.IsNullOrEmpty(Respuesta) Then Dim result As PADEServicioCancelacionResp = Nothing @@ -761,12 +761,16 @@ Public Class Timbrado Else CancelacionMensaje = result.mensaje End If - + Else + CancelacionMensaje = result.mensaje End If + Else + Retorno.Verificado = False End If Else - + Retorno.Verificado = False End If + End Select 'valida que si se halla cancelado @@ -824,7 +828,8 @@ Public Class Timbrado End Class Private Function EnviarInformacionCancelacionPADESOAP(ByVal url As String, UsuarioServicio As String, PassServicio As String, contrato As String, rfcEmisor As String, rfcReceptor As String, - certBase64 As String, keyBase64 As String, keyPass As String, arregloUUID As String, Total As Decimal, TimbraProduccion As Boolean) As String + certBase64 As String, keyBase64 As String, keyPass As String, arregloUUID As String, Total As Decimal, TimbraProduccion As Boolean, + Optional MotivoCancelacion As String = "", Optional FolioSustitucion As String = "") As String Dim retorno = "" Try @@ -834,6 +839,9 @@ Public Class Timbrado request.Accept = "text/xml" request.Method = "POST" + 'OPCIONES DE CANCELACION + ''UUID|RFC_Receptor|RFC_Emisor|Total|Motivo|FolioFiscalSustituye + Dim XMLString As String = $" @@ -841,7 +849,7 @@ Public Class Timbrado {UsuarioServicio} {PassServicio} {rfcEmisor} - {arregloUUID}|{rfcReceptor}|{rfcEmisor}|{Total} + {arregloUUID}|{rfcReceptor}|{rfcEmisor}|{Total}|{MotivoCancelacion}|{FolioSustitucion} {certBase64} {keyBase64} {keyPass} @@ -1050,7 +1058,12 @@ Public Class Timbrado Retorno = If(Ret = "", True, False) Case 3 - Retorno = TimbrarFacturaProFact(UsuarioActual, Ventas) + If UsuarioActual.Empresa.Funcionalidad(350) = "1" Then + Retorno = TimbrarFacturaProFactV40(UsuarioActual, Ventas) + Else + Retorno = TimbrarFacturaProFact(UsuarioActual, Ventas) + End If + 'Retorno = TimbrarFacturaProFact(UsuarioActual, Ventas, TmpDTConceptos, TmpDTImpuestos, TmpDTComplementos, Ruta, LstFordASN, FordGSDBM, ObjV) Case 4 If UsuarioActual.Empresa.Funcionalidad(350) = "1" Then @@ -2832,7 +2845,7 @@ Public Class Timbrado ObjCFDITimbre.Comprobante.Fecha.ToString("yyyy-MM-ddTHH:mm:ss"), ObjCFDITimbre.Comprobante.FormadePago, ObjCFDITimbre.Comprobante.CondicionesdePago, - ObjCFDITimbre.Comprobante.Subtotal, + ObjCFDITimbre.Comprobante.SubTotal, ObjCFDITimbre.Comprobante.Descuentos, ObjCFDITimbre.Comprobante.Moneda, ObjCFDITimbre.Comprobante.TipoCambio.ToString, @@ -3385,6 +3398,1338 @@ Public Class Timbrado #Region "T i m b r a d o v. 4. 0" + Public Function TimbrarFacturaProFactv40(Ventas As Modelos.Factura, UsuarioActual As Usuario) As String + Dim sw As New Diagnostics.Stopwatch + Dim swTiempo As New StringBuilder + Dim swmili As Long = 0 + sw.Start() + + Dim Retorno As String = "" + Dim ObjCFDITimbre As CFDITimbre = Ventas.Timbre + ' 'Sucursal matriz de la empresa + Dim ArchivoLLave As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoKey}" + Dim ArchivoCertificado As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoCer}" + Dim UsuarioServicio As String = UsuarioActual.Empresa.RFC + Dim ClaveServicio As String = UsuarioActual.Empresa.RFC.ToLower + Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey + Dim EmisorRFC As String = UsuarioActual.Empresa.RFC + Dim UrlServicio As String = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" ' Produccion + Dim RutaArchivo As String = $"{UsuarioActual.Empresa.Ruta}XML\{Ventas.TipoDocto}\" + Dim NombreArchivoXML As String = $"{ObjCFDITimbre.Comprobante.SerieFolio}" + Dim SubTotal As Decimal = 0 + Dim AmbienteProductivo As Boolean = True + 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" + End If + + +#Region "Valida" + If Not File.Exists(ArchivoCertificado) Then + Alert("El archivo de certificado no existe", TipoMensaje.MsgError) + Return "" + End If + If Not File.Exists(ArchivoLLave) Then + Alert("El archivo de llave privada no existe", TipoMensaje.MsgError) + Return "" + End If + If UsuarioActual.Empresa.ContraseñaKey = "" Then + Alert("La clave no puede ser vacía", TipoMensaje.MsgError) + Return "" + End If +#End Region + +#Region "Variables" + Dim llaveByte As Byte(), certByte As Byte() + Dim llaveBase64 As String, certBase64 As String + + Dim complemento As String = "" + Dim complementoConcepto As String = "" + '//Inicializamos el conector el parámetro indica el ambiente en el que se utilizará + '//Fasle = Ambiente de pruebas + '//True = Ambiente de producción + Dim cfdi As New Profact.TimbraCFDI40.Conector(AmbienteProductivo) + Dim comprobante As New Profact.TimbraCFDI40.Comprobante() + + If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 Then + cfdi.EstableceCredenciales("mvpNUXmQfK8=") + Else + cfdi.EstableceCredenciales($"vSGxMFWnNRy/nDoowxqrqw==|Sia123654") + End If + +#End Region + +#Region "Verifica" + Try + llaveByte = System.IO.File.ReadAllBytes(ArchivoLLave) + llaveBase64 = Convert.ToBase64String(llaveByte) + Catch ex As Exception + Alert($"Error al leer la llave privada: {ex.Message}", TipoMensaje.MsgError) + Return "" + End Try + + + Try + certByte = System.IO.File.ReadAllBytes(ArchivoCertificado) + certBase64 = Convert.ToBase64String(certByte) + Catch ex As Exception + Alert($"Error al leer el certificado: {ex.Message}", TipoMensaje.MsgError) + Return "" + + End Try + sw.Stop() + swTiempo.AppendFormat("Verificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() +#End Region + + +#Region "Comprobante" + + + If ObjCFDITimbre.Comprobante.Serie <> "" Then comprobante.Serie = ObjCFDITimbre.Comprobante.Serie + comprobante.Folio = ObjCFDITimbre.Comprobante.Folio + comprobante.Version = "4.0" + comprobante.Fecha = ObjCFDITimbre.Comprobante.Fecha + 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) + If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E", "N") Then + If ObjCFDITimbre.Comprobante.Descuentos > 0 Then + comprobante.DescuentoSpecified = True + comprobante.Descuento = ObjCFDITimbre.Comprobante.Descuentos.RoundSQL(NumDecimalesImporte) + End If + End If + comprobante.Moneda = ObjCFDITimbre.Comprobante.Moneda + comprobante.TipoCambio = ObjCFDITimbre.Comprobante.TipoCambio.ToDecimal + comprobante.TipoCambioSpecified = If(ObjCFDITimbre.Comprobante.Moneda <> "XXX", True, False) + comprobante.Total = ObjCFDITimbre.Comprobante.Total.RoundSQL(NumDecimalesImporte) + comprobante.TipoDeComprobante = ObjCFDITimbre.Comprobante.TipoComprobante + comprobante.FormaPagoSpecified = If(ObjCFDITimbre.Comprobante.FormadePago <> "", True, False) + comprobante.MetodoPago = ObjCFDITimbre.Comprobante.MetodoPago + comprobante.MetodoPagoSpecified = If(ObjCFDITimbre.Comprobante.MetodoPago <> "", True, False) + comprobante.LugarExpedicion = ObjCFDITimbre.Comprobante.LugarExpedicion + + If ObjCFDITimbre.CFDIRelacionados.TipoRelacion <> "" Then + Dim CfdiRelacionados As New Profact.TimbraCFDI40.ComprobanteCfdiRelacionados + CfdiRelacionados.CfdiRelacionado = New Profact.TimbraCFDI40.ComprobanteCfdiRelacionadosCfdiRelacionado(ObjCFDITimbre.CFDIRelacionados.UUID.Count - 1) {} + Dim i As Integer = 0 + For Each uid As String In ObjCFDITimbre.CFDIRelacionados.UUID + CfdiRelacionados.CfdiRelacionado(i) = New Profact.TimbraCFDI40.ComprobanteCfdiRelacionadosCfdiRelacionado With {.UUID = uid} + i += 1 + Next + CfdiRelacionados.TipoRelacion = ObjCFDITimbre.CFDIRelacionados.TipoRelacion + comprobante.CfdiRelacionados = New Profact.TimbraCFDI40.ComprobanteCfdiRelacionados() {CfdiRelacionados} + End If + +#Region "Emisor" + comprobante.Emisor = New Profact.TimbraCFDI40.ComprobanteEmisor() + comprobante.Emisor.Rfc = EmisorRFC + comprobante.Emisor.Nombre = UsuarioActual.Empresa.Empresa + comprobante.Emisor.RegimenFiscal = UsuarioActual.Empresa.CodigoRegimenFiscal + +#End Region + +#Region "Receptor" + comprobante.Receptor = New Profact.TimbraCFDI40.ComprobanteReceptor() + comprobante.Receptor.Rfc = ObjCFDITimbre.Receptor.RFC + comprobante.Receptor.Nombre = ObjCFDITimbre.Receptor.Nombre + comprobante.Receptor.UsoCFDI = ObjCFDITimbre.Receptor.UsoCFDI + comprobante.Receptor.RegimenFiscalReceptor = ObjCFDITimbre.Receptor.RegimenFiscalReceptor +#End Region + +#End Region + +#Region "Conceptos" + + 'Nodo conceptos, se agregan los PS + comprobante.Conceptos = New Profact.TimbraCFDI40.ComprobanteConcepto(ObjCFDITimbre.Conceptos.Count - 1) {} + + If ObjCFDITimbre.Conceptos IsNot Nothing AndAlso ObjCFDITimbre.Conceptos.Count > 0 Then + Dim i As Integer = 0 + Dim j As Integer = 0 + Dim k As Integer = 0 + For Each concep As CFDIConceptos In ObjCFDITimbre.Conceptos + comprobante.Conceptos(i) = New Profact.TimbraCFDI40.ComprobanteConcepto() + comprobante.Conceptos(i).Cantidad = concep.Cantidad + + If concep.Unidad <> "" Then comprobante.Conceptos(i).Unidad = concep.Unidad + comprobante.Conceptos(i).ClaveUnidad = concep.ClaveUnidad + comprobante.Conceptos(i).Descripcion = concep.Descripcion + comprobante.Conceptos(i).ValorUnitario = concep.ValorUnitario + comprobante.Conceptos(i).Importe = concep.Importe.RoundSQL(NumDecimalesImporte) + comprobante.Conceptos(i).ClaveProdServ = concep.ClaveProdServ + + If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then + If concep.Descuento > 0 Then + comprobante.Conceptos(i).Descuento = concep.Descuento + comprobante.Conceptos(i).DescuentoSpecified = True + End If + End If + + If concep.Noidentificacion <> "" Then comprobante.Conceptos(i).NoIdentificacion = concep.Noidentificacion + If concep.CuentaPredial <> "" Then comprobante.Conceptos(i).CuentaPredial = New Profact.TimbraCFDI40.ComprobanteConceptoCuentaPredial() {New Profact.TimbraCFDI40.ComprobanteConceptoCuentaPredial() With {.Numero = concep.CuentaPredial}} + If concep.NumeroPedimento <> "" Then + comprobante.Conceptos(i).InformacionAduanera = New Profact.TimbraCFDI40.ComprobanteConceptoInformacionAduanera(1) {} 'solo un codigo por el momento + comprobante.Conceptos(i).InformacionAduanera(0) = New Profact.TimbraCFDI40.ComprobanteConceptoInformacionAduanera() With {.NumeroPedimento = concep.NumeroPedimento} + End If + + j = 0 + k = 0 + 'SI NO ES FACTURA EN 0 AGREGA LOS IMPUESTOS + If Not ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("P", "N") AndAlso (Ventas.Total <> 0 OrElse (ObjCFDITimbre.TotalImpuestosRetenidos > 0 OrElse ObjCFDITimbre.TotalImpuestosTrasladados > 0)) Then + + If concep.Impuestos.Count > 0 Then + + comprobante.Conceptos(i).Impuestos = New Profact.TimbraCFDI40.ComprobanteConceptoImpuestos() + comprobante.Conceptos(i).Impuestos.Traslados = New Profact.TimbraCFDI40.ComprobanteConceptoImpuestosTraslado(concep.Impuestos.FindAll(Function(p As CFDIConceptosImpuestos) p.TrasladooRetencion = "T").Count - 1) {} + If concep.Impuestos.FindAll(Function(p As CFDIConceptosImpuestos) p.TrasladooRetencion <> "T").Count > 0 Then + comprobante.Conceptos(i).Impuestos.Retenciones = New Profact.TimbraCFDI40.ComprobanteConceptoImpuestosRetencion(concep.Impuestos.FindAll(Function(p As CFDIConceptosImpuestos) p.TrasladooRetencion <> "T").Count - 1) {} + End If + + For Each imp As CFDIConceptosImpuestos In concep.Impuestos + If imp.TrasladooRetencion = "T" Then + comprobante.Conceptos(i).Impuestos.Traslados(j) = New Profact.TimbraCFDI40.ComprobanteConceptoImpuestosTraslado() + comprobante.Conceptos(i).Impuestos.Traslados(j).Base = imp.Base + comprobante.Conceptos(i).Impuestos.Traslados(j).Impuesto = imp.Impuesto + comprobante.Conceptos(i).Impuestos.Traslados(j).TipoFactor = imp.TipoFactor + comprobante.Conceptos(i).Impuestos.Traslados(j).Importe = imp.Importe.RoundSQL(NumDecimalesImporte) + comprobante.Conceptos(i).Impuestos.Traslados(j).ImporteSpecified = True + comprobante.Conceptos(i).Impuestos.Traslados(j).TasaOCuota = imp.TasaOCuota.FormatoNumero(6) + comprobante.Conceptos(i).Impuestos.Traslados(j).TasaOCuotaSpecified = True + j += 1 + Else + comprobante.Conceptos(i).Impuestos.Retenciones(k) = New Profact.TimbraCFDI40.ComprobanteConceptoImpuestosRetencion() + comprobante.Conceptos(i).Impuestos.Retenciones(k).Base = imp.Base + comprobante.Conceptos(i).Impuestos.Retenciones(k).Impuesto = imp.Impuesto + comprobante.Conceptos(i).Impuestos.Retenciones(k).TipoFactor = imp.TipoFactor + comprobante.Conceptos(i).Impuestos.Retenciones(k).Importe = imp.Importe.RoundSQL(NumDecimalesImporte) + comprobante.Conceptos(i).Impuestos.Retenciones(k).TasaOCuota = imp.TasaOCuota.ToString.ToDecimal + k += 1 + End If + Next + + End If + + End If + i += 1 + Next + End If + +#End Region + + + Dim LXmlComplementos As New List(Of XmlElement)() + Dim TieneComplemento As Boolean = False + + If ObjCFDITimbre.Comprobante.TipoComprobante.Contiene("I", "E") Then + +#Region " Impuestos" + 'SI NO ES FACTURA EN 0 AGREGA LOS IMPUESTOS + If Ventas.Total <> 0 OrElse (ObjCFDITimbre.TotalImpuestosRetenidos > 0 OrElse ObjCFDITimbre.TotalImpuestosTrasladados > 0) Then + comprobante.Impuestos = New Profact.TimbraCFDI40.ComprobanteImpuestos() + comprobante.Impuestos.Traslados = New Profact.TimbraCFDI40.ComprobanteImpuestosTraslado(ObjCFDITimbre.Traslados.Count - 1) {} + + Dim y As Integer = 0 + + For Each Tras In ObjCFDITimbre.Traslados + comprobante.Impuestos.Traslados(y) = New Profact.TimbraCFDI40.ComprobanteImpuestosTraslado() + comprobante.Impuestos.Traslados(y).Impuesto = Tras.Impuesto + comprobante.Impuestos.Traslados(y).TipoFactor = Tras.TipoFactor + comprobante.Impuestos.Traslados(y).TasaOCuota = Tras.TasaOCuota.FormatoNumero(6) + comprobante.Impuestos.Traslados(y).Importe = Tras.Importe + y += 1 + Next + + comprobante.Impuestos.TotalImpuestosTrasladados = ObjCFDITimbre.TotalImpuestosTrasladados + comprobante.Impuestos.TotalImpuestosTrasladadosSpecified = True + + If ObjCFDITimbre.TotalImpuestosRetenidos > 0 Then + comprobante.Impuestos.Retenciones = New Profact.TimbraCFDI40.ComprobanteImpuestosRetencion(ObjCFDITimbre.Retenciones.Count - 1) {} + + Dim w As Integer = 0 + + For Each Ret In ObjCFDITimbre.Retenciones + comprobante.Impuestos.Retenciones(w) = New Profact.TimbraCFDI40.ComprobanteImpuestosRetencion() + comprobante.Impuestos.Retenciones(w).Impuesto = Ret.Impuesto + comprobante.Impuestos.Retenciones(w).Importe = Ret.Importe.ToDecimal + w += 1 + Next + + comprobante.Impuestos.TotalImpuestosRetenidos = ObjCFDITimbre.TotalImpuestosRetenidos + comprobante.Impuestos.TotalImpuestosRetenidosSpecified = True + End If + End If + +#End Region + + +#Region " Impuestos Locales" + + + If ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe) > 0 Then + Dim Imp = New Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocales() + Imp.version = "1.0" + Imp.TotaldeRetenciones = ObjCFDITimbre.RetencionesLocales.Sum(Function(x) x.Importe).FormatoNumero().ToDecimal + Imp.TotaldeTraslados = 0 + Imp.RetencionesLocales = New Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocalesRetencionesLocales(ObjCFDITimbre.RetencionesLocales.Count - 1) {} + Dim i As Integer = 0 + For Each ret As CFDIRetencionesLocales In ObjCFDITimbre.RetencionesLocales + If ret.Importe > 0 Then + Imp.RetencionesLocales(i) = New Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocalesRetencionesLocales() + Imp.RetencionesLocales(i).ImpLocRetenido = ret.ImpuestoLocalRetenido + Imp.RetencionesLocales(i).TasadeRetencion = ret.TasaRetencion.FormatoNumero().ToDecimal + Imp.RetencionesLocales(i).Importe = ret.Importe.FormatoNumero().ToDecimal + i += 1 + End If + Next + + Dim nsImpLocal As New System.Xml.Serialization.XmlSerializerNamespaces() + nsImpLocal.Add("implocal", "http://www.sat.gob.mx/implocal") + Dim xmlImpLocal As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(Imp, GetType(Profact.TimbraCFDI.Complementos.ImpuestoLocal.ImpuestosLocales), nsImpLocal) + Dim docImpLocal As New XmlDocument() + docImpLocal.LoadXml(xmlImpLocal) + LXmlComplementos.Add(docImpLocal.DocumentElement) + comprobante.ImpLocalSpecified = True + TieneComplemento = True + End If + + + + +#End Region +#Region " Comercio Exterior" + + If Ventas.Cliente.AplicaComercioExterior And ObjCFDITimbre.Complementos.ComercioExterior11.AplicaComercioExteriorSubProyecto Then + If ObjCFDITimbre.Complementos.ComercioExterior11 IsNot Nothing Then + + 'DATOS GENERALES + Dim ComExt = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExterior() + ComExt.Version = "1.1" + ComExt.MotivoTrasladoSpecified = True + ComExt.MotivoTraslado = ObjCFDITimbre.Complementos.ComercioExterior11.MotivoTraslado + ComExt.TipoOperacion = ObjCFDITimbre.Complementos.ComercioExterior11.TipoOperacion + ComExt.ClaveDePedimentoSpecified = True + ComExt.ClaveDePedimento = ObjCFDITimbre.Complementos.ComercioExterior11.ClavedePedimento + ComExt.CertificadoOrigenSpecified = True + ComExt.CertificadoOrigen = ObjCFDITimbre.Complementos.ComercioExterior11.CertificadoOrigen.ToEntero + If ObjCFDITimbre.Complementos.ComercioExterior11.NumCertificadoOrigen <> "" Then + ComExt.NumCertificadoOrigen = ObjCFDITimbre.Complementos.ComercioExterior11.NumCertificadoOrigen + End If + If ObjCFDITimbre.Complementos.ComercioExterior11.NumeroExportadorConfiable <> "" Then + ComExt.NumeroExportadorConfiable = ObjCFDITimbre.Complementos.ComercioExterior11.NumeroExportadorConfiable + End If + ComExt.IncotermSpecified = True + ComExt.Incoterm = ObjCFDITimbre.Complementos.ComercioExterior11.Incoterm + ComExt.SubdivisionSpecified = True + ComExt.Subdivision = ObjCFDITimbre.Complementos.ComercioExterior11.Subdivision.ToEntero + If ObjCFDITimbre.Complementos.ComercioExterior11.Observaciones <> "" Then + ComExt.Observaciones = ObjCFDITimbre.Complementos.ComercioExterior11.Observaciones + End If + ComExt.TipoCambioUSDSpecified = True + ComExt.TipoCambioUSD = ObjCFDITimbre.Complementos.ComercioExterior11.TipoCambioUSD + ComExt.TotalUSDSpecified = True + ComExt.TotalUSD = ObjCFDITimbre.Complementos.ComercioExterior11.TotalUSD + + 'EMISOR + ComExt.Emisor = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorEmisor() + If EmisorRFC.Length < 12 Then + ComExt.Emisor.Curp = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CURP + End If + ComExt.Emisor.Domicilio = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorEmisorDomicilio + ComExt.Emisor.Domicilio.Calle = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Calle + ComExt.Emisor.Domicilio.CodigoPostal = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.CP + ComExt.Emisor.Domicilio.ColoniaSpecified = True + ComExt.Emisor.Domicilio.Colonia = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Colonia + ComExt.Emisor.Domicilio.Estado = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Estado + If ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Localidad <> "" Then + ComExt.Emisor.Domicilio.LocalidadSpecified = False + ComExt.Emisor.Domicilio.Localidad = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Localidad + End If + ComExt.Emisor.Domicilio.MunicipioSpecified = True + ComExt.Emisor.Domicilio.Municipio = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Municipio + ComExt.Emisor.Domicilio.NumeroExterior = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.NumeroExterior + ComExt.Emisor.Domicilio.NumeroInterior = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.NumeroInterior + ComExt.Emisor.Domicilio.Pais = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Pais + If ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Referencia <> "" Then + ComExt.Emisor.Domicilio.Referencia = ObjCFDITimbre.Complementos.ComercioExterior11.Emisor.Referencia + End If + + 'RECEPTOR + ComExt.Receptor = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorReceptor + If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumRegIdTrib <> "" Then + ComExt.Receptor.NumRegIdTrib = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumRegIdTrib + End If + ComExt.Receptor.Domicilio = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorReceptorDomicilio + ComExt.Receptor.Domicilio.Calle = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Calle + ComExt.Receptor.Domicilio.CodigoPostal = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.CP + If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Colonia <> "" Then + ComExt.Receptor.Domicilio.Colonia = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Colonia + End If + ComExt.Receptor.Domicilio.Estado = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Estado + If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Localidad <> "" Then + ComExt.Receptor.Domicilio.Localidad = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Localidad + End If + If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Municipio <> "" Then + ComExt.Receptor.Domicilio.Municipio = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Municipio + End If + If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroExterior <> "" Then + ComExt.Receptor.Domicilio.NumeroExterior = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroExterior + End If + If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroInterior <> "" Then + ComExt.Receptor.Domicilio.NumeroInterior = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.NumeroInterior + End If + ComExt.Receptor.Domicilio.Pais = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Pais + If ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Referencia <> "" Then + ComExt.Receptor.Domicilio.Referencia = ObjCFDITimbre.Complementos.ComercioExterior11.Receptor.Referencia + End If + + 'DESTINATARIO + ComExt.Destinatario = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatario(0) {} + ComExt.Destinatario(0) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatario() + ComExt.Destinatario(0).Nombre = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Nombre + If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumRegIdTrib <> "" Then + ComExt.Destinatario(0).NumRegIdTrib = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumRegIdTrib + End If + ComExt.Destinatario(0).Domicilio = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatarioDomicilio(0) {} + ComExt.Destinatario(0).Domicilio(0) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorDestinatarioDomicilio() + ComExt.Destinatario(0).Domicilio(0).Calle = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Calle + ComExt.Destinatario(0).Domicilio(0).CodigoPostal = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.CP + If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Colonia <> "" Then + ComExt.Destinatario(0).Domicilio(0).Colonia = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Colonia + End If + ComExt.Destinatario(0).Domicilio(0).Estado = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Estado + If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Localidad <> "" Then + ComExt.Destinatario(0).Domicilio(0).Localidad = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Localidad + End If + If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Municipio <> "" Then + ComExt.Destinatario(0).Domicilio(0).Municipio = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Municipio + End If + If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroExterior <> "" Then + ComExt.Destinatario(0).Domicilio(0).NumeroExterior = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroExterior + End If + If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroInterior <> "" Then + ComExt.Destinatario(0).Domicilio(0).NumeroInterior = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.NumeroInterior + End If + ComExt.Destinatario(0).Domicilio(0).Pais = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Pais + If ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Referencia <> "" Then + ComExt.Destinatario(0).Domicilio(0).Referencia = ObjCFDITimbre.Complementos.ComercioExterior11.Destinatario.Referencia + End If + + 'MERCANCIAS + If ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias IsNot Nothing AndAlso ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias.Count > 0 Then + ComExt.Mercancias = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercancia(ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias.Count - 1) {} + Dim i As Integer + For Each concep As CFDIComercioExterior11Mercancias In ObjCFDITimbre.Complementos.ComercioExterior11.Mercancias + ComExt.Mercancias(i) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercancia() + ComExt.Mercancias(i).NoIdentificacion = concep.NoIdentificacion + ComExt.Mercancias(i).FraccionArancelariaSpecified = True + ComExt.Mercancias(i).FraccionArancelaria = concep.FraccionArancelaria + ComExt.Mercancias(i).CantidadAduanaSpecified = True + ComExt.Mercancias(i).CantidadAduana = concep.CantidadAduana + ComExt.Mercancias(i).UnidadAduanaSpecified = True + ComExt.Mercancias(i).UnidadAduana = concep.UnidadAduana + ComExt.Mercancias(i).ValorUnitarioAduanaSpecified = True + ComExt.Mercancias(i).ValorUnitarioAduana = concep.ValorUnitarioAduana + ComExt.Mercancias(i).ValorDolares = concep.ValorDolares + If concep.DescripcionesEspecificas.Marca <> "" Then + ComExt.Mercancias(i).DescripcionesEspecificas = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercanciaDescripcionesEspecificas(0) {} + ComExt.Mercancias(i).DescripcionesEspecificas(0) = New Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExteriorMercanciaDescripcionesEspecificas() + If concep.DescripcionesEspecificas.Marca <> "" Then + ComExt.Mercancias(i).DescripcionesEspecificas(0).Marca = concep.DescripcionesEspecificas.Marca + End If + If concep.DescripcionesEspecificas.Modelo <> "" Then + ComExt.Mercancias(i).DescripcionesEspecificas(0).Modelo = concep.DescripcionesEspecificas.Modelo + End If + If concep.DescripcionesEspecificas.SubModelo <> "" Then + ComExt.Mercancias(i).DescripcionesEspecificas(0).SubModelo = concep.DescripcionesEspecificas.SubModelo + End If + If concep.DescripcionesEspecificas.NumeroSerie <> "" Then + ComExt.Mercancias(i).DescripcionesEspecificas(0).NumeroSerie = concep.DescripcionesEspecificas.NumeroSerie + End If + End If + i += 1 + Next + End If + Dim nsComer As New System.Xml.Serialization.XmlSerializerNamespaces() + nsComer.Add("cce11", "http://www.sat.gob.mx/ComercioExterior11") + Dim xmlComer As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(ComExt, GetType(Profact.TimbraCFDI33.Complementos.ComercioExterior11.ComercioExterior), nsComer) + Dim docComer As New XmlDocument() + docComer.LoadXml(xmlComer) + LXmlComplementos.Add(docComer.DocumentElement) + comprobante.ComercioExterior11Specified = True + TieneComplemento = True + End If + End If + +#End Region + + End If + +#Region " Complemento Pago" + + If ObjCFDITimbre.Comprobante.TipoComprobante = "P" Then + Dim ComPag = New Profact.TimbraCFDI40.Complementos.Pagos20.Pagos() + + ComPag.Pago = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPago(0) {} + ComPag.Pago(0) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPago() + ComPag.Pago(0).FechaPago = ObjCFDITimbre.ComplementoPagos.FechaPago.ToString("yyyy-MM-ddTHH:mm:ss").ToDate() + ComPag.Pago(0).FormaDePagoP = ObjCFDITimbre.ComplementoPagos.FormaDePagoP + ComPag.Pago(0).MonedaP = ObjCFDITimbre.ComplementoPagos.MonedaP + ComPag.Pago(0).TipoCambioPSpecified = If(ObjCFDITimbre.ComplementoPagos.MonedaP = "MXN", False, True) + ComPag.Pago(0).TipoCambioP = ObjCFDITimbre.ComplementoPagos.TipoCambioP.ToDecimal + ComPag.Pago(0).Monto = ObjCFDITimbre.ComplementoPagos.Monto.ToDecimal + If ObjCFDITimbre.ComplementoPagos.NumOperacion <> "" Then + ComPag.Pago(0).NumOperacion = ObjCFDITimbre.ComplementoPagos.NumOperacion + End If + If ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaOrd <> "" Then + ComPag.Pago(0).RfcEmisorCtaOrd = ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaOrd + End If + If ObjCFDITimbre.ComplementoPagos.NomBancoOrdExt <> "" Then + ComPag.Pago(0).NomBancoOrdExt = ObjCFDITimbre.ComplementoPagos.NomBancoOrdExt + End If + If ObjCFDITimbre.ComplementoPagos.CtaOrdenante <> "" Then + ComPag.Pago(0).CtaOrdenante = ObjCFDITimbre.ComplementoPagos.CtaOrdenante + End If + If ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaBen <> "" Then + ComPag.Pago(0).RfcEmisorCtaBen = ObjCFDITimbre.ComplementoPagos.RfcEmisorCtaBen + End If + If ObjCFDITimbre.ComplementoPagos.CtaBeneficiario <> "" Then + ComPag.Pago(0).CtaBeneficiario = ObjCFDITimbre.ComplementoPagos.CtaBeneficiario + End If + If ObjCFDITimbre.ComplementoPagos.TipoCadPago <> "" Then + ComPag.Pago(0).TipoCadPagoSpecified = True + ComPag.Pago(0).TipoCadPago = ObjCFDITimbre.ComplementoPagos.TipoCadPago + End If + + If ObjCFDITimbre.ComplementoPagos.CertPago <> "" Then + ComPag.Pago(0).CertPago = System.Text.Encoding.Default.GetBytes(ObjCFDITimbre.ComplementoPagos.CertPago) + 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) + End If + + If ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count > 0 Then + ComPag.Pago(0).DoctoRelacionado = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoDoctoRelacionado(ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados.Count - 1) {} + Dim i As Integer + For Each doc As CFDIComplementoPagosDocsRelacionados In ObjCFDITimbre.ComplementoPagos.DocumentosRelacionados + ComPag.Pago(0).DoctoRelacionado(i) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoDoctoRelacionado() + ComPag.Pago(0).DoctoRelacionado(i).IdDocumento = doc.IdDocumento + If Not String.IsNullOrEmpty(doc.Serie) Then + ComPag.Pago(0).DoctoRelacionado(i).Serie = doc.Serie + End If + ComPag.Pago(0).DoctoRelacionado(i).Folio = doc.Folio + ComPag.Pago(0).DoctoRelacionado(i).MonedaDR = doc.MonedaDR + 'ComPag.Pago(0).DoctoRelacionado(i).TipoCambioDRSpecifiedP = If(doc.TipoCambioDR = 0, False, True) + 'ComPag.Pago(0).DoctoRelacionado(i).TipoCambioDR = doc.TipoCambioDR + 'ComPag.Pago(0).DoctoRelacionado(i).MetodoDePagoDR = doc.MetodoDePagoDR + ComPag.Pago(0).DoctoRelacionado(i).NumParcialidad = doc.NumParcialidad.ToString + + 'ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoAntSpecified = True + ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoAnt = doc.ImpSaldoAnt.ToDecimal + + ComPag.Pago(0).DoctoRelacionado(i).ImpPagadoSpecified = True + ComPag.Pago(0).DoctoRelacionado(i).ImpPagado = doc.ImpPagado.ToDecimal + + 'ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsolutoSpecified = True + ComPag.Pago(0).DoctoRelacionado(i).ImpSaldoInsoluto = doc.ImpSaldoInsoluto.ToDecimal + i += 1 + Next + + 'Estos impuestos aplicarían para anticipos + If ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos > 0 OrElse ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados > 0 Then + ComPag.Pago(0).ImpuestosP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosP(0) {} + ComPag.Pago(0).ImpuestosP(0) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosP() + 'ComPag.Pago(0).ImpuestosP(0).TotalImpuestosRetenidosSpecifiedP = True + 'ComPag.Pago(0).ImpuestosP(0).TotalImpuestosRetenidos = ObjCFDITimbre.ComplementoPagos.TotalImpuestosRetenidos.ToDecimal + 'ComPag.Pago(0).ImpuestosP(0).TotalImpuestosTrasladadosSpecified = True + 'ComPag.Pago(0).ImpuestosP(0).TotalImpuestosTrasladados = ObjCFDITimbre.ComplementoPagos.TotalImpuestosTrasladados.ToDecimal + + If (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "R").Count > 0 Then + Dim x As Integer + ComPag.Pago(0).ImpuestosP(0).RetencionesP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPRetencionP((ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "R").Count - 1) {} + For Each Ret As CFDIConceptosImpuestos In (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "R") + ComPag.Pago(0).ImpuestosP(0).RetencionesP(x) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPRetencionP() + ComPag.Pago(0).ImpuestosP(0).RetencionesP(x).ImpuestoP = Ret.Impuesto + ComPag.Pago(0).ImpuestosP(0).RetencionesP(x).ImporteP = Ret.Importe + x += 1 + Next + End If + If (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(x) x.TrasladooRetencion = "T").Count > 0 Then + Dim x As Integer + ComPag.Pago(0).ImpuestosP(0).TrasladosP = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPTrasladoP((ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "T").Count - 1) {} + For Each Tra As CFDIConceptosImpuestos In (ObjCFDITimbre.ComplementoPagos.Impuestos).Where(Function(w) w.TrasladooRetencion = "T") + ComPag.Pago(0).ImpuestosP(0).TrasladosP(x) = New Profact.TimbraCFDI40.Complementos.Pagos20.PagosPagoImpuestosPTrasladoP() + ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).ImpuestoP = Tra.Impuesto + ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).TipoFactorP = Tra.TipoFactor + ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).TasaOCuotaP = Tra.TasaOCuota + ComPag.Pago(0).ImpuestosP(0).TrasladosP(x).ImporteP = Tra.Importe + x += 1 + Next + End If + + End If + + + Dim nsComp As New System.Xml.Serialization.XmlSerializerNamespaces() + nsComp.Add("pago20", "http://www.sat.gob.mx/Pagos") + Dim xmlComp As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(ComPag, GetType(Profact.TimbraCFDI33.Complementos.Pagos10.Pagos), nsComp) + Dim docComp As New XmlDocument() + docComp.LoadXml(xmlComp) + 'comprobante.PagosSpecified = True + LXmlComplementos.Add(docComp.DocumentElement) + TieneComplemento = True + End If + + End If +#End Region + + +#Region " 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 + + ''DATOS GENERALES + Dim Carta As CFDICartaPorte = ObjCFDITimbre.Complementos.CartaPorte + Dim ComCartaPorte = New ProfactCartaPorte.CartaPorte() + ComCartaPorte.TranspInternac = CType([Enum].Parse(GetType(ProfactCartaPorte.CartaPorteTranspInternac), Carta.TranspInternac), ProfactCartaPorte.CartaPorteTranspInternac) + ComCartaPorte.EntradaSalidaMercSpecified = False + ComCartaPorte.ViaEntradaSalidaSpecified = False + ComCartaPorte.TotalDistRecSpecified = False + + 'UBICACIONES + If Carta.Ubicaciones IsNot Nothing AndAlso Carta.Ubicaciones.Count > 0 Then + + Dim i As Integer = 0 + ComCartaPorte.Ubicaciones = New ProfactCartaPorte.CartaPorteUbicacion(Carta.Ubicaciones.Count - 1) {} + For Each ubica As CFDICartaPorteUbicacion In Carta.Ubicaciones + 'origen + + ComCartaPorte.Ubicaciones(i) = New ProfactCartaPorte.CartaPorteUbicacion + ComCartaPorte.Ubicaciones(i).TipoUbicacion = CType([Enum].Parse(GetType(ProfactCartaPorte.CartaPorteUbicacionTipoUbicacion), ubica.TipoUbicacion), ProfactCartaPorte.CartaPorteUbicacionTipoUbicacion) + ComCartaPorte.Ubicaciones(i).TipoEstacionSpecified = False + ComCartaPorte.Ubicaciones(i).IDUbicacion = ubica.IDUbicacion + ComCartaPorte.Ubicaciones(i).RFCRemitenteDestinatario = ubica.RFCRemitenteDestinatario + ComCartaPorte.Ubicaciones(i).NombreRemitenteDestinatario = ubica.NombreRemitenteDestinatario + ComCartaPorte.Ubicaciones(i).NumRegIdTrib = ubica.NumRegIdTrib + 'ComCartaPorte.Ubicaciones(i).ResidenciaFiscal = ubica.ResidenciaFiscal + 'ComCartaPorte.Ubicaciones(i).NumEstacion = ubica.NumEstacion + 'ComCartaPorte.Ubicaciones(i).NavegacionTrafico = ubica.NavegacionTrafico + ComCartaPorte.Ubicaciones(i).FechaHoraSalidaLlegada = ubica.FechaHoraSalidaLlegada.ToDate + ComCartaPorte.Ubicaciones(i).DistanciaRecorrida = ubica.DistanciaRecorrida + + ComCartaPorte.Ubicaciones(i).Domicilio = New ProfactCartaPorte.CartaPorteUbicacionDomicilio With {.Calle = ubica.Domicilio.Calle, + .NumeroExterior = ubica.Domicilio.NumeroExterior, + .NumeroInterior = ubica.Domicilio.NumeroInterior, + .Colonia = ubica.Domicilio.Colonia, + .Localidad = ubica.Domicilio.Localidad, + .Referencia = ubica.Domicilio.Referencia, + .Municipio = ubica.Domicilio.Municipio, + .Estado = ubica.Domicilio.Estado, + .CodigoPostal = ubica.Domicilio.CP, + .Pais = CType([Enum].Parse(GetType(ProfactCartaPorte.c_Pais), ubica.Domicilio.Pais), ProfactCartaPorte.c_Pais)} + + Next + + End If + + 'MERCANCIAS + If Carta.Mercancias IsNot Nothing Then + ComCartaPorte.Mercancias = New ProfactCartaPorte.CartaPorteMercancias + ComCartaPorte.Mercancias.PesoBrutoTotal = Carta.Mercancias.PesoBrutoTotal.ToDecimal + ComCartaPorte.Mercancias.PesoNetoTotal = Carta.Mercancias.PesoNetoTotal.ToDecimal + ComCartaPorte.Mercancias.NumTotalMercancias = Carta.Mercancias.NumTotalMercancias + ComCartaPorte.Mercancias.CargoPorTasacion = Carta.Mercancias.CargoporTasacion.ToDecimal + ' ComCartaPorte.Mercancias.UnidadPeso = Carta.Mercancias.UnidadPeso + + If Carta.Mercancias IsNot Nothing AndAlso Carta.Mercancias.Mercancias.Count > 0 Then + Dim i As Integer = 0 + ComCartaPorte.Mercancias.Mercancia = New ProfactCartaPorte.CartaPorteMercanciasMercancia(Carta.Mercancias.Mercancias.Count - 1) {} + For Each concep As CFDICartaPorteMercancia In Carta.Mercancias.Mercancias + ComCartaPorte.Mercancias.Mercancia(i) = New ProfactCartaPorte.CartaPorteMercanciasMercancia + + If concep.BienesTransp <> "" Then + ComCartaPorte.Mercancias.Mercancia(i).BienesTransp = CType([Enum].Parse(GetType(ProfactCartaPorte.c_ClaveProdServCP), "Item" & concep.BienesTransp), ProfactCartaPorte.c_ClaveProdServCP) + End If + + ComCartaPorte.Mercancias.Mercancia(i).Descripcion = concep.Descripción + ComCartaPorte.Mercancias.Mercancia(i).Cantidad = concep.Cantidad + ComCartaPorte.Mercancias.Mercancia(i).Unidad = concep.Unidad + ComCartaPorte.Mercancias.Mercancia(i).Dimensiones = concep.Dimensiones + If concep.ClaveMaterialPeligroso <> "" Then + ComCartaPorte.Mercancias.Mercancia(i).MaterialPeligrosoSpecified = True + ComCartaPorte.Mercancias.Mercancia(i).CveMaterialPeligrosoSpecified = True + 'si lleva material pelgroso, debe llevar embalaje + ComCartaPorte.Mercancias.Mercancia(i).EmbalajeSpecified = True + ComCartaPorte.Mercancias.Mercancia(i).Embalaje = CType([Enum].Parse(GetType(ProfactCartaPorte.c_TipoEmbalaje), "Item" & concep.Embalaje), ProfactCartaPorte.c_TipoEmbalaje) + + End If + + ComCartaPorte.Mercancias.Mercancia(i).DescripEmbalaje = concep.DescripEmbalaje + ComCartaPorte.Mercancias.Mercancia(i).PesoEnKg = concep.PesoenKg + ComCartaPorte.Mercancias.Mercancia(i).ValorMercanciaSpecified = False + ComCartaPorte.Mercancias.Mercancia(i).MonedaSpecified = False + ComCartaPorte.Mercancias.Mercancia(i).FraccionArancelariaSpecified = False + ComCartaPorte.Mercancias.Mercancia(i).UUIDComercioExt = concep.UUIDComercioExt + + Dim j As Integer = 0 + ComCartaPorte.Mercancias.Mercancia(i).CantidadTransporta = New ProfactCartaPorte.CartaPorteMercanciasMercanciaCantidadTransporta(Carta.Mercancias.Mercancias.Count - 1) {} + For Each transp In concep.MercanciasCantidadTransporta + ComCartaPorte.Mercancias.Mercancia(i).CantidadTransporta(j) = New ProfactCartaPorte.CartaPorteMercanciasMercanciaCantidadTransporta + ComCartaPorte.Mercancias.Mercancia(i).CantidadTransporta(j).Cantidad = transp.Cantidad + ComCartaPorte.Mercancias.Mercancia(i).CantidadTransporta(j).IDOrigen = transp.IDOrigen + ComCartaPorte.Mercancias.Mercancia(i).CantidadTransporta(j).IDDestino = transp.IDDestino + 'ComCartaPorte.Mercancias.Mercancia(i).CantidadTransporta(1).CvesTransporte = transp.CvesTransportes + Next + + i += 1 + 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 + + ' + If Carta.FiguraTransporte IsNot Nothing Then + + If Carta.FiguraTransporte.AutoTransporte IsNot Nothing Then + + + 'ComCartaPorte.FiguraTransporte(1). = ProfactCartaPorte.c_CveTransporte.Item02 + ComCartaPorte.Mercancias.Autotransporte = New ProfactCartaPorte.CartaPorteMercanciasAutotransporte + If Carta.FiguraTransporte.AutoTransporte.PermisoSCT <> "" Then + ComCartaPorte.Mercancias.Autotransporte.PermSCT = CType([Enum].Parse(GetType(ProfactCartaPorte.c_TipoPermiso), Carta.FiguraTransporte.AutoTransporte.PermisoSCT), ProfactCartaPorte.c_TipoPermiso) + End If + ComCartaPorte.Mercancias.Autotransporte.NumPermisoSCT = Carta.FiguraTransporte.AutoTransporte.NumPermisoSCT + 'pendiente RMF + 'ComCartaPorte.Mercancias.AutotransporteFederal.NombreAseg = Carta.FiguraTransporte.AutoTransporte.NombreAseg + 'ComCartaPorte.Mercancias.AutotransporteFederal.NumPolizaSeguro = Carta.FiguraTransporte.AutoTransporte.NumPolizaSeguro + + Dim ConfigVehicular As New ProfactCartaPorte.CartaPorteMercanciasAutotransporteIdentificacionVehicular + ConfigVehicular.ConfigVehicular = CType([Enum].Parse(GetType(ProfactCartaPorte.c_ConfigAutotransporte), Carta.FiguraTransporte.AutoTransporte.Vehiculo.ConfigVehicular), ProfactCartaPorte.c_ConfigAutotransporte) + ConfigVehicular.AnioModeloVM = Carta.FiguraTransporte.AutoTransporte.Vehiculo.AnioModeloVM + ConfigVehicular.PlacaVM = Carta.FiguraTransporte.AutoTransporte.Vehiculo.PlacaVM + + ComCartaPorte.Mercancias.Autotransporte.IdentificacionVehicular = ConfigVehicular + + Dim ConfigVehicularSeguros As New ProfactCartaPorte.CartaPorteMercanciasAutotransporteSeguros + ConfigVehicularSeguros.AseguraRespCivil = Carta.FiguraTransporte.AutoTransporte.NombreSeguroResponsabilidadCivil + ConfigVehicularSeguros.PolizaRespCivil = Carta.FiguraTransporte.AutoTransporte.PolizaSeguroResponsabilidadCivil + ConfigVehicularSeguros.AseguraMedAmbiente = Carta.FiguraTransporte.AutoTransporte.NombreSeguroMedioAmbiente + ConfigVehicularSeguros.PolizaMedAmbiente = Carta.FiguraTransporte.AutoTransporte.PolizaSeguroMedioAmbiente + ConfigVehicularSeguros.AseguraCarga = Carta.FiguraTransporte.AutoTransporte.NombreSeguroCarga + ConfigVehicularSeguros.PolizaCarga = Carta.FiguraTransporte.AutoTransporte.PolizaSeguroCarga + + If Carta.FiguraTransporte.AutoTransporte.PrimaSeguro > 0 Then + ConfigVehicularSeguros.PrimaSeguro = Carta.FiguraTransporte.AutoTransporte.PrimaSeguro + ConfigVehicularSeguros.PrimaSeguroSpecified = True + End If + + If Carta.FiguraTransporte.AutoTransporte.Remolques IsNot Nothing AndAlso Carta.FiguraTransporte.AutoTransporte.Remolques.Count > 0 Then + Dim i As Integer = 0 + ComCartaPorte.Mercancias.Autotransporte.Remolques = New ProfactCartaPorte.CartaPorteMercanciasAutotransporteRemolque(Carta.FiguraTransporte.AutoTransporte.Remolques.Count - 1) {} + For Each concep As CFDICartaPorteRemolque In Carta.FiguraTransporte.AutoTransporte.Remolques + ComCartaPorte.Mercancias.Autotransporte.Remolques(i) = New ProfactCartaPorte.CartaPorteMercanciasAutotransporteRemolque + ComCartaPorte.Mercancias.Autotransporte.Remolques(i).SubTipoRem = CType([Enum].Parse(GetType(ProfactCartaPorte.c_SubTipoRem), concep.SubTipoRemolque), ProfactCartaPorte.c_SubTipoRem) + ComCartaPorte.Mercancias.Autotransporte.Remolques(i).Placa = concep.Placa + i += 1 + Next + ' + End If + End If + + If Carta.FiguraTransporte.Operadores IsNot Nothing AndAlso Carta.FiguraTransporte.Operadores.Count > 0 Then + Dim i As Integer = 0 + ComCartaPorte.FiguraTransporte = New ProfactCartaPorte.CartaPorteTiposFigura(Carta.FiguraTransporte.Operadores.Count - 1) {} + For Each concep As CFDICartaPorteOperador In Carta.FiguraTransporte.Operadores + + ComCartaPorte.FiguraTransporte(i) = New ProfactCartaPorte.CartaPorteTiposFigura + ComCartaPorte.FiguraTransporte(i).RFCFigura = concep.RFCFigura + ComCartaPorte.FiguraTransporte(i).NumLicencia = concep.NumLicencia + ComCartaPorte.FiguraTransporte(i).NombreFigura = concep.NombreFigura + ComCartaPorte.FiguraTransporte(i).NumRegIdTribFigura = concep.NumRegidTribFigura + 'OComCartaPorte.FiguraTransporte.Operadores(i)(0) = concep.ResidenciaFiscalOperador 'falta + + ComCartaPorte.FiguraTransporte(i).Domicilio = New ProfactCartaPorte.CartaPorteTiposFiguraDomicilio() + ComCartaPorte.FiguraTransporte(i).Domicilio.Calle = concep.Domicilio.Calle + ComCartaPorte.FiguraTransporte(i).Domicilio.CodigoPostal = concep.Domicilio.CP + ComCartaPorte.FiguraTransporte(i).Domicilio.Colonia = concep.Domicilio.Colonia + ComCartaPorte.FiguraTransporte(i).Domicilio.Estado = concep.Domicilio.Estado + ComCartaPorte.FiguraTransporte(i).Domicilio.Localidad = concep.Domicilio.Localidad + ComCartaPorte.FiguraTransporte(i).Domicilio.Municipio = concep.Domicilio.Municipio + ComCartaPorte.FiguraTransporte(i).Domicilio.NumeroExterior = concep.Domicilio.NumeroExterior + ComCartaPorte.FiguraTransporte(i).Domicilio.Pais = ProfactCartaPorte.c_Pais.MEX + + i += 1 + Next + End If + + End If + + Dim nsComp As New System.Xml.Serialization.XmlSerializerNamespaces() + nsComp.Add("CartaPorte", "http://www.sat.gob.mx/CartaPorte") + Dim xmlComp As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(ComCartaPorte, GetType(ProfactCartaPorte.CartaPorte), nsComp) + Dim docComp As New XmlDocument() + docComp.LoadXml(xmlComp) + 'comprobante.CartaPorteSpecified = True + LXmlComplementos.Add(docComp.DocumentElement) + TieneComplemento = True + + End If + +#End Region + + +#Region " Nomina12" + If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then + Dim Nom = New Profact.TimbraCFDI33.Complementos.Nomina12.Nomina() + 'cfdi.Esquema.AgregarEsquema("http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd") + Nom.Version = ObjCFDITimbre.Nomina.Version + Nom.TipoNomina = ObjCFDITimbre.Nomina.TipoNomina + Nom.FechaPago = ObjCFDITimbre.Nomina.FechaPago + Nom.FechaInicialPago = ObjCFDITimbre.Nomina.FechaInicio.ToDate + Nom.FechaFinalPago = ObjCFDITimbre.Nomina.FechaFin.ToDate + Nom.NumDiasPagados = ObjCFDITimbre.Nomina.NumDiasPagados.ToString + Nom.TotalPercepcionesSpecified = True + Nom.TotalPercepciones = ObjCFDITimbre.Nomina.TotalPercepciones.ToDecimal + Nom.TotalDeduccionesSpecified = True + Nom.TotalDeducciones = ObjCFDITimbre.Nomina.TotalDeducciones.ToDecimal + Nom.TotalOtrosPagosSpecified = True + Nom.TotalOtrosPagos = ObjCFDITimbre.Nomina.TotalOtrosPagos.ToDecimal + + Nom.Emisor = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaEmisor + Nom.Emisor.Curp = ObjCFDITimbre.Emisor.CURP + Nom.Emisor.RegistroPatronal = ObjCFDITimbre.Emisor.RegistroPatronal + Nom.Emisor.RfcPatronOrigen = ObjCFDITimbre.Emisor.RFC + + If UsuarioActual.Empresa.UsaAC Then Nom.Emisor.EntidadSNCF.OrigenRecurso = "IF" : Nom.Emisor.EntidadSNCF.MontoRecursoPropio = 90 + + If ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0 Then + Dim TotalIndemnizacion As String = If(ObjCFDITimbre.Nomina.TotalIndemnizacion > 0, ObjCFDITimbre.Nomina.TotalIndemnizacion.ToString, "") + Dim TotalJubilacion As String = If(ObjCFDITimbre.Nomina.TotalJubilacion > 0, ObjCFDITimbre.Nomina.TotalJubilacion.ToString, "") + Nom.Percepciones = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepciones + Nom.Percepciones.TotalSueldosSpecified = True + Nom.Percepciones.TotalSueldos = ObjCFDITimbre.Nomina.TotalSueldos.ToDecimal + Nom.Percepciones.TotalSeparacionIndemnizacionSpecified = True + Nom.Percepciones.TotalSeparacionIndemnizacion = TotalIndemnizacion.ToDecimal + Nom.Percepciones.TotalJubilacionPensionRetiroSpecified = True + Nom.Percepciones.TotalJubilacionPensionRetiro = TotalJubilacion.ToDecimal + Nom.Percepciones.TotalGravado = ObjCFDITimbre.Nomina.TotalPercepcionesGravado.ToDecimal + Nom.Percepciones.TotalExento = ObjCFDITimbre.Nomina.TotalPercepcionesExento.ToDecimal + Nom.Percepciones.Percepcion = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcion(ObjCFDITimbre.Nomina.Percepciones.Count - 1) {} + Dim i As Integer = 0 + For Each percep As CFDINominaPercepciones In ObjCFDITimbre.Nomina.Percepciones + Nom.Percepciones.Percepcion(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcion() + Nom.Percepciones.Percepcion(i).TipoPercepcion = percep.TipoPercepcion + Nom.Percepciones.Percepcion(i).Clave = percep.Clave + Nom.Percepciones.Percepcion(i).Concepto = percep.Concepto + Nom.Percepciones.Percepcion(i).ImporteGravado = Math.Round(percep.ImporteGravado, 2).ToString.ToDecimal + Nom.Percepciones.Percepcion(i).ImporteExento = Math.Round(percep.ImporteExento, 2).ToString.ToDecimal + + If ObjCFDITimbre.Nomina.HorasExtras IsNot Nothing AndAlso ObjCFDITimbre.Nomina.HorasExtras.Count > 0 Then + Nom.Percepciones.Percepcion(i).HorasExtra = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcionHorasExtra(ObjCFDITimbre.Nomina.HorasExtras.Count - 1) {} + Dim x As Integer = 0 + For Each HoraExtra As CFDINominaHorasExtras In ObjCFDITimbre.Nomina.HorasExtras + Nom.Percepciones.Percepcion(i).HorasExtra(x) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaPercepcionesPercepcionHorasExtra() + Nom.Percepciones.Percepcion(i).HorasExtra(x).Dias = HoraExtra.Dias.ToEntero + Nom.Percepciones.Percepcion(i).HorasExtra(x).TipoHoras = HoraExtra.TipoHoras + Nom.Percepciones.Percepcion(i).HorasExtra(x).HorasExtra = HoraExtra.HorasExtra.ToEntero + Nom.Percepciones.Percepcion(i).HorasExtra(x).ImportePagado = HoraExtra.ImportePagado.ToDecimal + x += 1 + Next + End If + + i += 1 + Next + End If + 'cfdi.agregarNominaReceptorSubContratacion12("AAD990814BP6", "50") + 'cfdi.agregarNominaPercepcionesPercepcionAccionesOTitulos12("100", "200"); + 'cfdi.agregarNominaPercepcionesSeparacionIndemnizacion12("100", "10", "1000", "100", "50"); + 'cfdi.agregarNominaPercepcionesJubilacionPensionRetiro12("50", "100", "10", "100", "0"); + + + + If ObjCFDITimbre.Nomina.Incapacidades IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Incapacidades.Count > 0 Then + Nom.Incapacidades = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaIncapacidad(ObjCFDITimbre.Nomina.Incapacidades.Count - 1) {} + Dim i As Integer = 0 + For Each Incap As CFDINominaIncapacidades In ObjCFDITimbre.Nomina.Incapacidades + Nom.Incapacidades(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaIncapacidad() + Nom.Incapacidades(i).DiasIncapacidad = Incap.DiasIncapacidad.ToEntero + Nom.Incapacidades(i).TipoIncapacidad = Incap.TipoIncapacidad + Nom.Incapacidades(i).ImporteMonetarioSpecified = True + Nom.Incapacidades(i).ImporteMonetario = Incap.Importe.ToDecimal + i += 1 + Next + End If + + If ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0 Then + Nom.Deducciones = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaDeducciones() + Nom.Deducciones.TotalOtrasDeduccionesSpecified = True + Nom.Deducciones.TotalOtrasDeducciones = Math.Round(ObjCFDITimbre.Nomina.TotalDeduccionesOtras, 2) + Nom.Deducciones.TotalImpuestosRetenidosSpecified = True + Nom.Deducciones.TotalImpuestosRetenidos = Math.Round(ObjCFDITimbre.Nomina.TotalDeduccionesImpuestosRetenidos, 2) + Nom.Deducciones.Deduccion = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaDeduccionesDeduccion(ObjCFDITimbre.Nomina.Deducciones.Count - 1) {} + Dim i As Integer = 0 + For Each deduc As CFDINominaDeducciones In ObjCFDITimbre.Nomina.Deducciones + Nom.Deducciones.Deduccion(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaDeduccionesDeduccion() + Nom.Deducciones.Deduccion(i).TipoDeduccion = deduc.TipoDeduccion + Nom.Deducciones.Deduccion(i).Clave = deduc.Clave + Nom.Deducciones.Deduccion(i).Concepto = deduc.Concepto + Nom.Deducciones.Deduccion(i).Importe = Math.Round(deduc.Importe, 2) + i += 1 + Next + End If + + If ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing Then + ' cfdi.agregarNominaOtrosPagosOtroPago12("002", "002", "Subsidio", "10.00"); + ' cfdi.agregarNominaOtrosPagosOtroPagoSubsidioAlEmpleo12("10.00"); + If ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing AndAlso ObjCFDITimbre.Nomina.OtrosPagos.Count > 0 Then + Nom.OtrosPagos = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaOtroPago(ObjCFDITimbre.Nomina.OtrosPagos.Count - 1) {} + Dim i As Integer = 0 + For Each otpag As CFDINominaOtrosPagos In ObjCFDITimbre.Nomina.OtrosPagos + Nom.OtrosPagos(i) = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaOtroPago() + Nom.OtrosPagos(i).TipoOtroPago = otpag.TipoOtroPago + Nom.OtrosPagos(i).Clave = otpag.Clave + Nom.OtrosPagos(i).Concepto = otpag.Concepto + Nom.OtrosPagos(i).Importe = otpag.Importe + If otpag.TipoOtroPago = "002" Then + Nom.OtrosPagos(i).SubsidioAlEmpleo = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaOtroPagoSubsidioAlEmpleo() + Nom.OtrosPagos(i).SubsidioAlEmpleo.SubsidioCausado = otpag.Importe + End If + i += 1 + Next + End If + End If + + +#Region "Receptor" + Nom.Receptor = New Profact.TimbraCFDI33.Complementos.Nomina12.NominaReceptor() + Nom.Receptor.Curp = ObjCFDITimbre.Nomina.Receptor.CURP + Nom.Receptor.NumSeguridadSocial = ObjCFDITimbre.Nomina.Receptor.NSS + Nom.Receptor.FechaInicioRelLaboralSpecified = True + Nom.Receptor.FechaInicioRelLaboral = ObjCFDITimbre.Nomina.Receptor.FechaInicioContrato.ToDate + Nom.Receptor.Antigüedad = ObjCFDITimbre.Nomina.Receptor.Antiguedad + Nom.Receptor.TipoContrato = ObjCFDITimbre.Nomina.Receptor.TipoContrato + 'Nom.Receptor.Sindicalizado = New Profact.TimbraCFDI40.Complementos.Nomina12.NominaReceptorSindicalizado() + 'Nom.Receptor.Sindicalizado = ObjCFDITimbre.Nomina.Receptor.Sindicalizado + Nom.Receptor.TipoJornadaSpecified = True + Nom.Receptor.TipoJornada = ObjCFDITimbre.Nomina.Receptor.CodigoTipoJornada + Nom.Receptor.TipoRegimen = ObjCFDITimbre.Nomina.Receptor.CodigoRegimenContratacion + Nom.Receptor.NumEmpleado = ObjCFDITimbre.Nomina.Receptor.CodigoEmpleado + Nom.Receptor.Departamento = ObjCFDITimbre.Nomina.Receptor.Departamento + Nom.Receptor.Puesto = ObjCFDITimbre.Nomina.Receptor.Puesto + Nom.Receptor.RiesgoPuestoSpecified = True + Nom.Receptor.RiesgoPuesto = ObjCFDITimbre.Nomina.Receptor.CodigoRiesgoPuesto + Nom.Receptor.PeriodicidadPago = ObjCFDITimbre.Nomina.Receptor.TipoPeriodo + Nom.Receptor.BancoSpecified = True + Nom.Receptor.Banco = ObjCFDITimbre.Nomina.Receptor.CodigoBanco + Nom.Receptor.CuentaBancaria = ObjCFDITimbre.Nomina.Receptor.NumeroCuenta + Nom.Receptor.SalarioBaseCotAporSpecified = True + Nom.Receptor.SalarioBaseCotApor = ObjCFDITimbre.Nomina.Receptor.SBC.ToDecimal + Nom.Receptor.SalarioDiarioIntegradoSpecified = True + Nom.Receptor.SalarioDiarioIntegrado = ObjCFDITimbre.Nomina.Receptor.SDI.ToDecimal + Nom.Receptor.ClaveEntFed = ObjCFDITimbre.Nomina.Receptor.CodigoEntidadFederativa + + Dim nsNom As New System.Xml.Serialization.XmlSerializerNamespaces() + nsNom.Add("nomina12", "http://www.sat.gob.mx/nomina12") + Dim xmlNom As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(Nom, GetType(Profact.TimbraCFDI33.Complementos.Nomina12.Nomina), nsNom) + Dim docNom As New XmlDocument() + docNom.LoadXml(xmlNom) + LXmlComplementos.Add(docNom.DocumentElement) + TieneComplemento = True + + + End If +#End Region + +#End Region + + '#Region "Detallista" + ' If Ventas.Cliente.AplicaDetallista Then + ' Dim detallista As Profact.TimbraCFDI40.Complementos.Detallista.detallista = New Profact.TimbraCFDI40.Complementos.Detallista.detallista + ' detallista.type = "SimpleInvoiceType" + ' detallista.contentVersion = "1.3.1" + ' detallista.documentStructureVersion = "AMC8.1" + ' detallista.documentStatus = Profact.TimbraCFDI40.Complementos.Detallista.detallistaDocumentStatus.ORIGINAL + + ' detallista.DeliveryNote = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaDeliveryNote + ' detallista.DeliveryNote.referenceIdentification = New String((1)) {} + ' detallista.DeliveryNote.referenceIdentification(0) = "1" + ' detallista.DeliveryNote.ReferenceDate = New DateTime + ' detallista.DeliveryNote.ReferenceDate = comprobante.Fecha + ' detallista.DeliveryNote.ReferenceDateSpecified = True + + ' detallista.requestForPaymentIdentification = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaRequestForPaymentIdentification + ' detallista.requestForPaymentIdentification.entityType = Profact.TimbraCFDI40.Complementos.Detallista.detallistaRequestForPaymentIdentificationEntityType.INVOICE + + ' detallista.specialInstruction = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaSpecialInstruction((1)) {} + ' detallista.specialInstruction(0) = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaSpecialInstruction + ' detallista.specialInstruction(0).code = Profact.TimbraCFDI40.Complementos.Detallista.detallistaSpecialInstructionCode.ZZZ + ' Dim TotalTexto = New String() {Ventas.TotalTC.ToString.ToDouble.Texto2Letras.ToUpper()} + ' Dim propertyInfo = detallista.specialInstruction(0).GetType().GetProperty("text") + ' propertyInfo.SetValue(detallista.specialInstruction(0), Convert.ChangeType(TotalTexto, propertyInfo.PropertyType), Nothing) + + ' detallista.orderIdentification = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaOrderIdentification + ' detallista.orderIdentification.referenceIdentification = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaOrderIdentificationReferenceIdentification((1)) {} + ' detallista.orderIdentification.referenceIdentification(0) = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaOrderIdentificationReferenceIdentification + ' detallista.orderIdentification.referenceIdentification(0).type = Profact.TimbraCFDI40.Complementos.Detallista.detallistaOrderIdentificationReferenceIdentificationType.ON + ' detallista.orderIdentification.referenceIdentification(0).Value = Ventas.Det_OrdenCompra + ' detallista.orderIdentification.ReferenceDateSpecified = True + ' detallista.orderIdentification.ReferenceDate = Ventas.Det_FechaOrdenCompra.ToDate() + + ' detallista.AdditionalInformation = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaReferenceIdentification((1)) {} + ' detallista.AdditionalInformation(0) = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaReferenceIdentification + ' detallista.AdditionalInformation(0).type = Profact.TimbraCFDI40.Complementos.Detallista.detallistaReferenceIdentificationType.ATZ + ' detallista.AdditionalInformation(0).Value = Ventas.Det_ContraRecibo + + ' detallista.DeliveryNote = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaDeliveryNote + ' detallista.DeliveryNote.ReferenceDate = Ventas.Det_FechaOrdenCompra.ToDate + ' detallista.DeliveryNote.referenceIdentification = New String((1)) {} + ' detallista.DeliveryNote.referenceIdentification(0) = Ventas.Det_ContraRecibo + + ' detallista.buyer = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaBuyer + ' detallista.buyer.gln = Ventas.Cliente.Detallista_GLNComprador + ' detallista.buyer.contactInformation = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaBuyerContactInformation + ' detallista.buyer.contactInformation.personOrDepartmentName = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaBuyerContactInformationPersonOrDepartmentName + ' detallista.buyer.contactInformation.personOrDepartmentName.text = Ventas.Cliente.Detallista_Departamento + + ' detallista.seller = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaSeller + ' detallista.seller.gln = Ventas.Cliente.Detallista_GLNVendedor + ' detallista.seller.alternatePartyIdentification = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaSellerAlternatePartyIdentification + ' detallista.seller.alternatePartyIdentification.type = Profact.TimbraCFDI40.Complementos.Detallista.detallistaSellerAlternatePartyIdentificationType.SELLER_ASSIGNED_IDENTIFIER_FOR_A_PARTY + ' detallista.seller.alternatePartyIdentification.Value = Ventas.Cliente.Detallista_NumProveedor + + ' 'detallista.shipTo = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaShipTo + ' 'detallista.shipTo.gln = "0000000000000" + ' 'detallista.shipTo.nameAndAddress = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaShipToNameAndAddress + ' 'detallista.shipTo.nameAndAddress.name = New String((1)) {} + ' 'detallista.shipTo.nameAndAddress.name(0) = Ventas.Cliente.Direccion + ' 'detallista.shipTo.nameAndAddress.streetAddressOne = New String((1)) {} + ' 'detallista.shipTo.nameAndAddress.streetAddressOne(0) = Ventas.Cliente.NoInt + ' 'detallista.shipTo.nameAndAddress.city = New String((1)) {} + ' 'detallista.shipTo.nameAndAddress.city(0) = Ventas.Cliente.Ciudad + ' 'detallista.shipTo.nameAndAddress.postalCode = New String((1)) {} + ' 'detallista.shipTo.nameAndAddress.postalCode(0) = Ventas.Cliente.CP + + ' detallista.paymentTerms = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaPaymentTerms + ' detallista.paymentTerms.netPayment = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaPaymentTermsNetPayment + ' detallista.paymentTerms.netPayment.paymentTimePeriod = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaPaymentTermsNetPaymentPaymentTimePeriod + ' detallista.paymentTerms.netPayment.paymentTimePeriod.timePeriodDue = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaPaymentTermsNetPaymentPaymentTimePeriodTimePeriodDue + ' detallista.paymentTerms.netPayment.paymentTimePeriod.timePeriodDue.timePeriod = Profact.TimbraCFDI40.Complementos.Detallista.detallistaPaymentTermsNetPaymentPaymentTimePeriodTimePeriodDueTimePeriod.DAYS + ' detallista.paymentTerms.netPayment.paymentTimePeriod.timePeriodDue.value = "0" + + ' detallista.paymentTerms.discountPayment = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaPaymentTermsDiscountPayment + ' detallista.paymentTerms.discountPayment.percentage = If(Ventas.DescuentoTC > 0 AndAlso Ventas.SubTotalTC > 0, (Ventas.DescuentoTC * 100) / Ventas.SubTotalTC, 0).ToString().FormatoNumero() + + ' detallista.currency = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaCurrency((1)) {} + ' detallista.currency(0) = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaCurrency + ' detallista.currency(0).currencyISOCode = If(Ventas.CveMoneda = 1, Profact.TimbraCFDI40.Complementos.Detallista.detallistaCurrencyCurrencyISOCode.MXN, Profact.TimbraCFDI40.Complementos.Detallista.detallistaCurrencyCurrencyISOCode.USD) + ' detallista.currency(0).currencyFunction = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaCurrencyCurrencyFunction((1)) {} + ' detallista.currency(0).currencyFunction(0) = Profact.TimbraCFDI40.Complementos.Detallista.detallistaCurrencyCurrencyFunction.BILLING_CURRENCY + ' detallista.currency(0).rateOfChangeSpecified = True + ' detallista.currency(0).rateOfChange = 1 + + ' detallista.allowanceCharge = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaAllowanceCharge(1) {} + ' detallista.allowanceCharge(0) = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaAllowanceCharge + ' detallista.allowanceCharge(0).monetaryAmountOrPercentage = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaAllowanceChargeMonetaryAmountOrPercentage + ' detallista.allowanceCharge(0).monetaryAmountOrPercentage.rate = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaAllowanceChargeMonetaryAmountOrPercentageRate + ' detallista.allowanceCharge(0).monetaryAmountOrPercentage.rate.base = Profact.TimbraCFDI40.Complementos.Detallista.detallistaAllowanceChargeMonetaryAmountOrPercentageRateBase.INVOICE_VALUE + ' detallista.allowanceCharge(0).monetaryAmountOrPercentage.rate.percentage = If(Ventas.DescuentoTC > 0 AndAlso Ventas.SubTotalTC > 0, (Ventas.DescuentoTC * 100) / Ventas.SubTotalTC, 0) + + ' Dim articuloCounter As Integer = 0 + ' For Each concepto As Profact.TimbraCFDI40.ComprobanteConcepto In comprobante.Conceptos + ' articuloCounter = (articuloCounter + 1) + ' Next + ' detallista.lineItem = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItem((articuloCounter)) {} + ' Dim counter As Integer = 0 + ' For Each concepto As Profact.TimbraCFDI40.ComprobanteConcepto In comprobante.Conceptos + ' detallista.lineItem(counter) = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItem + ' detallista.lineItem(counter).type = "SimpleInvoiceLineItemType" + ' detallista.lineItem(counter).number = (counter + 1).ToString + ' detallista.lineItem(counter).tradeItemIdentification = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemTradeItemIdentification + ' detallista.lineItem(counter).tradeItemIdentification.gtin = comprobante.Conceptos(counter).NoIdentificacion + ' detallista.lineItem(counter).alternateTradeItemIdentification = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentification(1) {} + ' detallista.lineItem(counter).alternateTradeItemIdentification(0) = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentification + ' detallista.lineItem(counter).alternateTradeItemIdentification(0).type = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentificationType + ' detallista.lineItem(counter).alternateTradeItemIdentification(0).type = Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemAlternateTradeItemIdentificationType.BUYER_ASSIGNED + ' detallista.lineItem(counter).tradeItemDescriptionInformation = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemTradeItemDescriptionInformation + ' If (comprobante.Conceptos(counter).Descripcion.Length > 34) Then + ' detallista.lineItem(counter).tradeItemDescriptionInformation.longText = comprobante.Conceptos(counter).Descripcion.Substring(0, 34) + ' Else + ' detallista.lineItem(counter).tradeItemDescriptionInformation.longText = comprobante.Conceptos(counter).Descripcion + ' End If + ' detallista.lineItem(counter).invoicedQuantity = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemInvoicedQuantity + ' detallista.lineItem(counter).invoicedQuantity.unitOfMeasure = comprobante.Conceptos(counter).Unidad + ' detallista.lineItem(counter).invoicedQuantity.Text = New String((1)) {} + ' detallista.lineItem(counter).invoicedQuantity.Text(0) = comprobante.Conceptos(counter).Cantidad.ToString + + ' detallista.lineItem(counter).aditionalQuantity = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemAditionalQuantity(1) {} + ' detallista.lineItem(counter).aditionalQuantity(0) = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemAditionalQuantity + ' detallista.lineItem(counter).aditionalQuantity(0).QuantityType = Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemAditionalQuantityQuantityType.NUM_CONSUMER_UNITS + ' detallista.lineItem(counter).aditionalQuantity(0).Text = New String((1)) {} + ' detallista.lineItem(counter).aditionalQuantity(0).Text(0) = "1" + + ' detallista.lineItem(counter).grossPrice = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemGrossPrice + ' detallista.lineItem(counter).grossPrice.Amount = comprobante.Conceptos(counter).ValorUnitario + + ' detallista.lineItem(counter).netPrice = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemNetPrice + ' detallista.lineItem(counter).netPrice.Amount = comprobante.Conceptos(counter).ValorUnitario + + ' detallista.lineItem(counter).AdditionalInformation = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemAdditionalInformation + ' detallista.lineItem(counter).AdditionalInformation.referenceIdentification = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemAdditionalInformationReferenceIdentification + ' detallista.lineItem(counter).AdditionalInformation.referenceIdentification.type = Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemAdditionalInformationReferenceIdentificationType.ON + ' detallista.lineItem(counter).AdditionalInformation.referenceIdentification.Value = "1587" + ' 'Impuestos + ' Dim tasa As Decimal = 0 + ' Dim importeImp As Decimal = 0 + ' Try + ' If (Not (comprobante.Impuestos.Traslados) Is Nothing) Then + ' For Each traslado As Profact.TimbraCFDI40.ComprobanteImpuestosTraslado In comprobante.Impuestos.Traslados + ' tasa = Decimal.Parse(traslado.TasaOCuota) + ' importeImp = (comprobante.Conceptos(counter).Importe * (tasa / 100)) + ' Next + ' End If + + ' Catch ex As System.Exception + + ' End Try + + ' detallista.lineItem(counter).tradeItemTaxInformation = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemTradeItemTaxInformation(1) {} + ' detallista.lineItem(counter).tradeItemTaxInformation(0) = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemTradeItemTaxInformation + ' detallista.lineItem(counter).tradeItemTaxInformation(0).taxTypeDescription = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemTradeItemTaxInformationTaxTypeDescription + ' detallista.lineItem(counter).tradeItemTaxInformation(0).taxTypeDescription = Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemTradeItemTaxInformationTaxTypeDescription.VAT + ' detallista.lineItem(counter).tradeItemTaxInformation(0).tradeItemTaxAmount = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemTradeItemTaxInformationTradeItemTaxAmount + ' detallista.lineItem(counter).tradeItemTaxInformation(0).tradeItemTaxAmount.taxPercentage = tasa + ' detallista.lineItem(counter).tradeItemTaxInformation(0).tradeItemTaxAmount.taxAmount = importeImp + + ' detallista.lineItem(counter).totalLineAmount = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemTotalLineAmount + ' detallista.lineItem(counter).totalLineAmount.grossAmount = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemTotalLineAmountGrossAmount + ' detallista.lineItem(counter).totalLineAmount.grossAmount.Amount = comprobante.Conceptos(counter).Importe + ' detallista.lineItem(counter).totalLineAmount.netAmount = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaLineItemTotalLineAmountNetAmount + ' detallista.lineItem(counter).totalLineAmount.netAmount.Amount = comprobante.Conceptos(counter).Importe + ' counter = (counter + 1) + ' Next + ' detallista.totalAmount = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaTotalAmount + ' detallista.totalAmount.Amount = comprobante.SubTotal + + ' detallista.TotalAllowanceCharge = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaTotalAllowanceCharge(1) {} + ' detallista.TotalAllowanceCharge(0) = New Profact.TimbraCFDI40.Complementos.Detallista.detallistaTotalAllowanceCharge + ' detallista.TotalAllowanceCharge(0).allowanceOrChargeType = Profact.TimbraCFDI40.Complementos.Detallista.detallistaTotalAllowanceChargeAllowanceOrChargeType.ALLOWANCE + ' detallista.TotalAllowanceCharge(0).Amount = Ventas.DescuentoTC + + ' Dim nombres As System.Xml.Serialization.XmlSerializerNamespaces = New System.Xml.Serialization.XmlSerializerNamespaces + ' nombres.Add("detallista", "http://www.sat.gob.mx/detallista") + ' Dim xmlDetallista As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(detallista, GetType(Profact.TimbraCFDI40.Complementos.Detallista.detallista), nombres) + + ' Dim docDetallista As XmlDocument = New XmlDocument + ' docDetallista.LoadXml(xmlDetallista) + ' comprobante.DetallistaSpecified = True + ' LXmlComplementos.Add(docDetallista.DocumentElement) + + ' TieneComplemento = True + ' End If + '#End Region + + If TieneComplemento Then + comprobante.Complemento = New Profact.TimbraCFDI40.ComprobanteComplemento + comprobante.Complemento.Any = LXmlComplementos.ToArray() + End If + + sw.Stop() + swTiempo.AppendFormat("Armado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() + +#Region "Genera XML" + ' Try + ' cfdi.GenerarXMLBase64(llaveBase64, Clave) + ' cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML) + ' Catch ex As Exception + + ' End Try + '//Timbramos el CFDI por medio del conector y guardamos resultado + Dim resultadoTimbre As Profact.TimbraCFDI.ResultadoTimbre + +#End Region + + sw.Stop() + swTiempo.AppendFormat("Genera: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() + +#Region "Timbra" + resultadoTimbre = cfdi.TimbraCFDI(comprobante) +#End Region + + sw.Stop() + swTiempo.AppendFormat("Timbrado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() + + 'Verifica el error + If resultadoTimbre.Exitoso Then + + 'Dim FechaCertificacion As DateTime + Dim FolioFiscal As String + + UUID = resultadoTimbre.FolioUUID + FolioFiscal = resultadoTimbre.FolioUUID + If FolioFiscal <> "" Then + resultadoTimbre.GuardaXml(RutaArchivo, NombreArchivoXML) + + + If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then + + 'Actualiza Estatus Factura + If Ventas.CveVenta > 0 Then + + + Dim ObjVentas As New ClsVentas() + If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", Now, Ventas.CveVenta, CvePAC:=UsuarioActual.Empresa.CvePAC, RFCReceptor:=ObjCFDITimbre.Receptor.RFC) Then + Retorno = "" + Else + Retorno = "Error" + End If + ObjVentas.Dispose() + + + ''Actualiza Cliente (NumeroCuenta) + 'If Not UsuarioActual.CveEmpresa.Contiene(72, 80) Then + ' Dim Hilo2 As New System.Threading.Thread(Sub() ActualizaCliente(UsuarioActual.CveUsuario, Ventas.Cliente.NumCtaPago, Ventas.CveMetodoPago, Ventas.CveCliente)) + ' Hilo2.Start() + 'End If + + End If + End If + + If Not IO.Directory.Exists($"{UsuarioActual.Empresa.Ruta}CBB\") Then IO.Directory.CreateDirectory($"{UsuarioActual.Empresa.Ruta}CBB\") + + Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\" + Dim NombreCBB As String = $"{ObjCFDITimbre.Comprobante.SerieFolio}.jpg" + resultadoTimbre.GuardaCodigoBidimensional(RutaCBB, NombreCBB) + + 'Genero la addenda Ford + If Ventas.Cliente IsNot Nothing AndAlso Ventas.Cliente.Ford_GSDB <> "" Then + + Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio)) + + Dim FolioFactura As String = "" + If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura + GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB) + + End If + + If ObjCFDITimbre.Comprobante.TipoComprobante = "T" Then + Dim ObjInv As New ClsInventarios() + If ObjInv.UpdateMovimientoTimbrado(Ventas.Inv_CveMovimiento, 1, FolioFiscal, MinFecha) Then + Retorno = "" + Else + Retorno = "Error" + End If + ObjInv.Dispose() + End If + + 'Pendiente. Ruta guardar archivos + sw.Stop() + swTiempo.AppendFormat("Actualizado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() + + Retorno = "" + Else + Retorno = "No se pudo timbrar ante el SAT. UUID no generado." + End If + + + Else + + If String.IsNullOrEmpty(resultadoTimbre.Detalle) Then + 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" + Else + Retorno = Resultados(0)("Value").ToString() + MensajeErrorCFDI = Resultados(0)("Value").ToString() + End If + Else + Retorno = resultadoTimbre.Detalle + MensajeErrorCFDI = resultadoTimbre.Detalle + + If Retorno = "[]" Then + Retorno = resultadoTimbre.Descripcion + End If + If MensajeErrorCFDI = "[]" Then + Retorno = resultadoTimbre.Descripcion + End If + + End If + Else + Retorno = resultadoTimbre.Detalle + MensajeErrorCFDI = resultadoTimbre.Detalle + End If + + End If + + 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 @@ -3941,7 +5286,7 @@ Public Class Timbrado #Region "Genera XML" Dim ArchivoGenerado As Boolean = False Try - cfdi.GenerarXMLB64(llaveBase64, Clave) + cfdi.GenerarXmlB64(llaveBase64, Clave) ArchivoGenerado = True Catch ex As Exception Retorno = cfdi.Mensaje @@ -4073,6 +5418,739 @@ Public Class Timbrado End If End If +#End Region + GuardaLogTimbrado(swTiempo.ToString, CvePACEspecial) + Return Retorno + End Function + + Public Function TimbrarFacturaPADEv40(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() + + + '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 + sw.Start() + + Dim msgErrorGeneracion As String = If(String.IsNullOrEmpty(cfdi.Mensaje), "", cfdi.Mensaje) + +#Region "Timbra" + If ArchivoGenerado Then + + Dim Respuesta As String = "" + + If String.IsNullOrEmpty(msgErrorGeneracion) Then + Dim TokenAuth As String = $"{UsuarioServicio}:{ClaveServicio}".ToBase64Encode() + + Dim payload As New JObject( + New JProperty("contrato", "72330711-cac6-4106-8051-cbcda1aef495"), + New JProperty("certBase64", certBase64), + New JProperty("keyBase64", llaveBase64), + New JProperty("keyPass", Clave), + New JProperty("xmlBase64", cfdi.Xml.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) + End If + + ' Aumentamos el timeout de la operación + If Not String.IsNullOrEmpty(Respuesta) Then + + Dim result As PADEServicioTimbradoResp = Nothing + Dim serializer As XmlSerializer = New XmlSerializer(GetType(PADEServicioTimbradoResp)) + + Try + Using reader As TextReader = New StringReader(Respuesta) + result = CType(serializer.Deserialize(reader), PADEServicioTimbradoResp) + End Using + Catch ex As Exception + OnError("Ocurrió un error al obtener los resultados", ex) + End Try + + sw.Stop() + swTiempo.AppendFormat("Timbrado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() + + If result IsNot Nothing Then + If result.timbradoOk Then + Dim FolioFiscal As String = result.UUID + 'GUARDA EL XML RETORNADO POR EL PAC + 'cfdi.EscribirXML(result.xmlBase64.ToBase64Decode(), RutaArchivo, NombreArchivoXML) + + sw.Stop() + swTiempo.AppendFormat("Guardado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() + + If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then + + 'Actualiza Estatus Factura + If Ventas.CveVenta > 0 Then + + Using ObjVentas As New ClsVentas() + + If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", ObjCFDITimbre.Comprobante.Fecha, Ventas.CveVenta, CvePAC:=CvePACEspecial, RFCReceptor:=ObjCFDITimbre.Receptor.RFC) Then + Retorno = "" + Else + Retorno = "Error" + End If + End Using + + 'Genero la addenda Ford + If Ventas.Cliente.Ford_GSDB <> "" Then + + 'Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio)) + + 'Dim FolioFactura As String = "" + 'If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura + 'GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB) + + End If + + End If + + If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then + Using ObjNomina2 As New ClsNominas() + + If ObjNomina2.UpdateEstatusNomNominas(3, CvePACEspecial, FolioFiscal, ObjCFDITimbre.Comprobante.Fecha, ObjCFDITimbre.Comprobante.Fecha, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) Then + Retorno = "" + Else + Retorno = "Error" + End If + End Using + End If + + If ObjCFDITimbre.Comprobante.TipoComprobante = "T" Then + Using ObjInv As New ClsInventarios() + If ObjInv.UpdateMovimientoTimbrado(Ventas.Inv_CveMovimiento, 1, FolioFiscal, MinFecha) Then + Retorno = "" + Else + Retorno = "Error" + End If + End Using + End If + End If + + If Not IO.Directory.Exists($"{UsuarioActual.Empresa.Ruta}CBB\") Then IO.Directory.CreateDirectory($"{UsuarioActual.Empresa.Ruta}CBB\") + + Try + Dim RutaCBB As String = $"{UsuarioActual.Empresa.Ruta}CBB\{ObjCFDITimbre.Comprobante.SerieFolio}.jpg" + Dim CBB As New ClbNegBICFDv3_2.ClsNegCBBGenerar() + CBB.GenerarCBB(UsuarioActual.Empresa.RFC, ObjCFDITimbre.Receptor.RFC, ObjCFDITimbre.Comprobante.Total, FolioFiscal, RutaCBB) + CBB = Nothing + Catch ex As Exception + OnError("Ocurrió un error al generar el QR", ex) + End Try + Retorno = "" + sw.Stop() + swTiempo.AppendFormat("Actualizado: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() + Else + If String.IsNullOrEmpty(result.mensaje) Then + Retorno = Respuesta + msgErrorGeneracion + MensajeErrorCFDI = "" + Else + Retorno = result.mensaje + MensajeErrorCFDI = result.codigo + 'If cfdi.Xml <> "" Then cfdi.EscribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML) + End If + End If + Else + If String.IsNullOrEmpty(Respuesta) Then + Retorno = "Ocurrió un error al obtener la respuesta" + MensajeErrorCFDI = "" + Else + Retorno = Respuesta + MensajeErrorCFDI = "" + End If + End If + Else + If String.IsNullOrEmpty(msgErrorGeneracion) Then + Retorno = "Ocurrió un error al obtener la respuesta" + MensajeErrorCFDI = "" + Else + Retorno = msgErrorGeneracion + MensajeErrorCFDI = "" + End If + End If + Else + If String.IsNullOrEmpty(msgErrorGeneracion) Then + Retorno = "Ocurrió un error al generar el xml" + MensajeErrorCFDI = "" + Else + Retorno = msgErrorGeneracion + MensajeErrorCFDI = "" + End If + End If + #End Region GuardaLogTimbrado(swTiempo.ToString, CvePACEspecial) Return Retorno @@ -5476,6 +7554,12 @@ Public Class Timbrado Dim Ret As String = TimbrarFacturaProFactv33(Ventas, UsuarioActual) Return If(Ret = "", True, False) + End Function + Private Function TimbrarFacturaProFactV40(UsuarioActual As Usuario, Optional Ventas As Modelos.Factura = Nothing, Optional TmpDTConceptos As DataTable = Nothing, Optional TmpDTImpuestos As DataTable = Nothing, Optional TmpDTComplementos As DataTable = Nothing, Optional Ruta As String = "", Optional LstFordASN As ListBox = Nothing, Optional FordGSDBM As String = "", Optional ObjV As ClsVentas = Nothing) As Boolean + + Dim Ret As String = TimbrarFacturaProFactv40(Ventas, UsuarioActual) + Return If(Ret = "", True, False) + End Function Private Sub GeneraAddenda7Eleven(Archivo As String, TmpDTConceptos As DataTable, TmpDT7Eleven As DataTable) Dim cfdi As String = "" diff --git a/Bancos/PopIECompras.aspx.vb b/Bancos/PopIECompras.aspx.vb index 66ef491bf..3b4d46051 100644 --- a/Bancos/PopIECompras.aspx.vb +++ b/Bancos/PopIECompras.aspx.vb @@ -635,8 +635,8 @@ Partial Class Bancos_PopIECompras CveMonedaFiltros = dr("CveMoneda").ToString.ToEntero SerieFolio = dr("SerieFolio").ToString TipoCambioOriginal = dr("TipoCambioOriginal").ToString.ToDecimal - NombreProveedor = GlobalDTCompProveedores(UsuarioActual.CveEmpresa).FiltroPrimeroValor("RazonSocial", String.Format("CveProveedor = {0}", CveProveedor)) - + NombreProveedor = dr("RazonSocial").ToString 'GlobalDTCompProveedores(UsuarioActual.CveEmpresa).FiltroPrimeroValor("RazonSocial", String.Format("CveProveedor = {0}", CveProveedor)) + CveSubProyecto = dr("CveSubProyecto").ToString.ToEntero LtlTitulo.Text = "Cuentas por Pagar" @@ -1908,7 +1908,11 @@ Partial Class Bancos_PopIECompras ElseIf MovimientoPagar.ConceptoRetISR = 2 Then funcionalidad = 317 ConceptoContable = 243 + ElseIf MovimientoPagar.ConceptoRetISR = 3 Then + funcionalidad = 348 + ConceptoContable = 327 End If + If CveMoneda = 1 AndAlso CveMonedaCompra = 1 Then ImporteMovimiento = MovimientoPagar.RetISR * PorcentajePago ImporteMX = ImporteMovimiento @@ -1951,6 +1955,9 @@ Partial Class Bancos_PopIECompras ElseIf MovimientoPagar.ConceptoRetISR = 2 Then funcionalidad = 318 ConceptoContable = 244 + ElseIf MovimientoPagar.ConceptoRetISR = 3 Then + funcionalidad = 348 + ConceptoContable = 328 End If If CveMoneda = 1 AndAlso CveMonedaCompra = 1 Then ImporteMovimiento = MovimientoPagar.RetISR * PorcentajePago diff --git a/Bancos/ProveedoresAbonar.aspx.vb b/Bancos/ProveedoresAbonar.aspx.vb index dc8dcf979..dc2e3754d 100644 --- a/Bancos/ProveedoresAbonar.aspx.vb +++ b/Bancos/ProveedoresAbonar.aspx.vb @@ -1172,6 +1172,9 @@ Partial Class Bancos_ProveedoresAbonar ElseIf gvr.DataKey("CveRetISRConcepto").ToEntero = 2 Then funcionalidad = 317 ConceptoContable = 243 + ElseIf gvr.DataKey("CveRetISRConcepto").ToEntero = 3 Then + funcionalidad = 348 + ConceptoContable = 328 End If If CveMoneda = 1 AndAlso gvr.DataKey("CveMoneda").ToEntero = 1 Then @@ -1214,6 +1217,9 @@ Partial Class Bancos_ProveedoresAbonar ElseIf gvr.DataKey("CveRetISRConcepto").ToEntero = 2 Then funcionalidad = 318 ConceptoContable = 244 + ElseIf gvr.DataKey("CveRetISRConcepto").ToEntero = 3 Then + funcionalidad = 348 + ConceptoContable = 328 End If If CveMoneda = 1 AndAlso gvr.DataKey("CveMoneda").ToEntero = 1 Then @@ -1229,8 +1235,8 @@ Partial Class Bancos_ProveedoresAbonar ImporteMovimiento = (gvr.DataKey("RetISR").ToDecimal * PorcentajePago) importeMX = ImporteMovimiento * If(FuncionalidadFluctuacionImpuestos, TipoCambioPago, tipoCambioCompra) End If - ImporteMovimiento = Math.Round(ImporteMovimiento, 2, MidpointRounding.AwayFromZero) - importeMX = Math.Round(importeMX, 2, MidpointRounding.AwayFromZero) + ImporteMovimiento = ImporteMovimiento.RoundSQL + importeMX = importeMX.RoundSQL TipoCambioGeneral = TipoCambioPago If TipoCambioPago > 1 Then ConceptoMovimiento += $" TC:{TipoCambioPago} ${ImporteMovimiento.FormatoNumero(2)}" @@ -1272,8 +1278,8 @@ Partial Class Bancos_ProveedoresAbonar ImporteMovimiento = gvr.DataKey("IVA").ToDecimal importeMX = ImporteMovimiento * tipoCambioCompra End If - ImporteMovimiento = Math.Round(ImporteMovimiento, 2, MidpointRounding.AwayFromZero) - importeMX = Math.Round(importeMX, 2) + ImporteMovimiento = ImporteMovimiento.RoundSQL + importeMX = importeMX.RoundSQL If tipoCambioCompra > 1 Then ConceptoMovimiento += $" TC:{tipoCambioCompra} ${ImporteMovimiento.FormatoNumero(2)}" Else diff --git a/Contabilidad/RegPrePolizaS.aspx b/Contabilidad/RegPrePolizaS.aspx index da6e5c217..6c509ab63 100644 --- a/Contabilidad/RegPrePolizaS.aspx +++ b/Contabilidad/RegPrePolizaS.aspx @@ -573,7 +573,7 @@
- + @@ -581,8 +581,7 @@
-
- +
diff --git a/CxC/RepCxCDetalle.aspx.vb b/CxC/RepCxCDetalle.aspx.vb index c166a273a..976ec6d4f 100644 --- a/CxC/RepCxCDetalle.aspx.vb +++ b/CxC/RepCxCDetalle.aspx.vb @@ -360,8 +360,9 @@ Partial Class RepCxCDetalle DdlGrupo.SelectedValueExist(CveAgrupador) 'Carga Vendedor - DdlVendedor.DataSource = GlobalDTVendedores(UsuarioActual.CveEmpresa) - DdlVendedor.DataBind() + DdlVendedor.DataSource = GlobalDTVendedores(UsuarioActual.CveEmpresa, VendedorTipo:=-1).FiltraParametros("VendedorTipo in (1,4)") + DdlVendedor.DataBind() + DdlVendedor.SelectedValueExist(CveVendedor) If UsuarioActual.CveVendedor > 0 AndAlso Not UsuarioActual.TienePermisoProceso(263) Then DdlVendedor.SelectedValueExist(UsuarioActual.CveVendedor.ToString()) DdlVendedor.Attributes.Add("disabled", "disabled") diff --git a/Inventarios/EntregaAlmacenRuta.aspx.cs b/Inventarios/EntregaAlmacenRuta.aspx.cs index 8cb0d13db..5d62f7b4b 100644 --- a/Inventarios/EntregaAlmacenRuta.aspx.cs +++ b/Inventarios/EntregaAlmacenRuta.aspx.cs @@ -176,7 +176,7 @@ public partial class Inventarios_EntregaAlmacenRuta : ClsPaginas } else { - SBError.AppendLine($"Factura {row.DataKey("SerieFolio")} error al agregar entrega alamcen. "); + SBError.AppendLine($"Factura {row.DataKey("SerieFolio")} error al agregar entrega almacen. "); TieneError = true; break; } @@ -205,6 +205,7 @@ public partial class Inventarios_EntregaAlmacenRuta : ClsPaginas StringBuilder MensajeAlert = new StringBuilder(); //recorrer para timbrar MensajeAlert.Append(" Entregas creadas correctamente

"); + bool huboerror = false; foreach (int cvetimbre in ListaTimbres) { @@ -216,9 +217,7 @@ public partial class Inventarios_EntregaAlmacenRuta : ClsPaginas MensajeAlert.AppendFormat("XML    ", ModExtensiones.Encripta(String.Format("OP=DesXmlTra&CveTimbre={0}&EXT={1}&FOLIO={2}&TIPODOCTO={3}", cvetimbre, "XML", ObjTimbres.ObjFactura.SerieFolio, ObjTimbres.ObjFactura.TipoDocto))); MensajeAlert.AppendFormat("PDF   ", ModExtensiones.Encripta(String.Format("OP=CARPOTIMBRE&CVETIMBRE={0}", cvetimbre))); MensajeAlert.Append("
"); - - Alert(MensajeAlert.ToString(), ModExtensiones.TipoMensaje.MsgInformacion); - CargaDatos(); + DdlChofer.SelectedValueExist("-1"); DdlUnidadCamion.SelectedValueExist("-1"); ChkEmitirCartaPorte.Checked = false; @@ -228,9 +227,12 @@ public partial class Inventarios_EntregaAlmacenRuta : ClsPaginas } else { + huboerror = true; MensajeAlert.AppendFormat("
  • {0}
", ObjTimbres.MsgError); } - } + } + Alert(MensajeAlert.ToString(), ModExtensiones.TipoMensaje.MsgInformacion); + CargaDatos(); UpDatos.Update(); } else diff --git a/Inventarios/RecepcionUsados.aspx.vb b/Inventarios/RecepcionUsados.aspx.vb index a0f2533fa..69f7d02cf 100644 --- a/Inventarios/RecepcionUsados.aspx.vb +++ b/Inventarios/RecepcionUsados.aspx.vb @@ -762,6 +762,10 @@ Partial Class Inventarios_RecepcionUsados ObjRemisionNC = Nothing End If + If TmpDTAjustes IsNot Nothing Then + TmpDTAjustes.Rows.Clear() + End If + CveRemisionRecibida = -1 EsDistribuidor = False DdlClientes.SelectedValueExist("-1") diff --git a/Inventarios/RepAnomalias.aspx.vb b/Inventarios/RepAnomalias.aspx.vb index 6f779193e..5a2fa61f2 100644 --- a/Inventarios/RepAnomalias.aspx.vb +++ b/Inventarios/RepAnomalias.aspx.vb @@ -107,12 +107,12 @@ Partial Class Inventarios_RepAnomalias GvF.Columns(3).Visible = True 'proveedor GvS.Columns(3).Visible = True 'proveedor GvC.Columns(3).Visible = True 'proveedor - GvF.Columns(16).Visible = UsuarioActual.Procesos(201) 'costo - GvS.Columns(16).Visible = UsuarioActual.Procesos(201) 'costo - GvC.Columns(16).Visible = UsuarioActual.Procesos(201) 'costo + GvF.Columns(17).Visible = UsuarioActual.Procesos(201) 'costo + GvS.Columns(17).Visible = UsuarioActual.Procesos(201) 'costo + GvC.Columns(17).Visible = UsuarioActual.Procesos(201) 'costo GvGrupos.Columns(1).Visible = True 'clasificación GvGrupos.Columns(2).Visible = True 'proveedor - GvGrupos.Columns(15).Visible = UsuarioActual.Procesos(201) 'costo + GvGrupos.Columns(17).Visible = UsuarioActual.Procesos(201) 'costo End If If Inventario.GetInventarioFisico(CveInventarioFisico, UsuarioActual.CveEmpresa, -1, -1, UsuarioActual.CveUsuario) Then diff --git a/Inventarios/RepEntradasSalidas.aspx b/Inventarios/RepEntradasSalidas.aspx index 5fe457b7e..043217bfd 100644 --- a/Inventarios/RepEntradasSalidas.aspx +++ b/Inventarios/RepEntradasSalidas.aspx @@ -236,7 +236,7 @@
- + @@ -261,7 +261,7 @@ - + diff --git a/Inventarios/RepEntradasSalidas.aspx.vb b/Inventarios/RepEntradasSalidas.aspx.vb index ac06dd2ab..eb036e9c3 100644 --- a/Inventarios/RepEntradasSalidas.aspx.vb +++ b/Inventarios/RepEntradasSalidas.aspx.vb @@ -108,7 +108,7 @@ Partial Class Inventarios_ReporteEntradasSalidas GvM.Columns(15).Visible = TienePermisoImportes If UsuarioActual.Empresa.Funcionalidad(531) = "1" Then - GvM.Columns(10).Visible = TienePermisoImportes + GvM.Columns(10).Visible = True End If End Sub @@ -309,7 +309,7 @@ Partial Class Inventarios_ReporteEntradasSalidas Else e.Row.Cells(9).BackColor = Drawing.Color.LightGray - e.Row.Cells(13).BackColor = Drawing.Color.LightGray + e.Row.Cells(14).BackColor = Drawing.Color.LightGray 'e.Row.FCLabel("lbSaldoI").Text = If(e.Row.DBCampo("SaldoIniCant").ToString().ToEntero = 0, "-", e.Row.DBCampo("SaldoIniCant").ToDouble.ToString("N2")) 'e.Row.FCLabel("lbEntradasCant").Text = If(e.Row.DBCampo("EntradaCant").ToString().ToEntero = 0, "-", e.Row.DBCampo("EntradaCant").ToDouble.ToString("N2")) diff --git a/Inventarios/RepEntregaAlmacenRuta.aspx.cs b/Inventarios/RepEntregaAlmacenRuta.aspx.cs index 563bbfe86..4128e72cc 100644 --- a/Inventarios/RepEntregaAlmacenRuta.aspx.cs +++ b/Inventarios/RepEntregaAlmacenRuta.aspx.cs @@ -527,7 +527,9 @@ public partial class General_RepEntregaAlmacenRuta : ClsPaginas } else { - if( ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscalCancelar, 0, RFCReceptor, RFCEmisor, CvePACCancelacion,CveSATMotivoCancelacion: 3)) { + ModExtensiones.RespuestaCancelacionSAT Resp = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscalCancelar, 0, RFCReceptor, RFCEmisor, CvePACCancelacion, CveSATMotivoCancelacion: 3); + + if (Resp.Verificado) { if (ObjGenerales.CancelarTimbreTimbrado(CveTimbre, DateTime.Now, CvePACCancelacion, ObjCancelacion.CancelacionAcuse, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa)) { diff --git a/Ventas/Clientes.aspx.vb b/Ventas/Clientes.aspx.vb index a0207adfd..f999d2e09 100644 --- a/Ventas/Clientes.aspx.vb +++ b/Ventas/Clientes.aspx.vb @@ -1449,26 +1449,26 @@ Partial Class Clientes ' CargaGridRetenciones() ' CargaDocs() CargaCombos() - CargaDocumentacionCliente() - 'CargaMetodosPago33() - 'CargaFormaPago33() - 'CargaComboCFDI() - 'CargarPagosNoBancarios() - - - + CargaDocumentacionCliente() + 'CargaMetodosPago33() + 'CargaFormaPago33() + 'CargaComboCFDI() + 'CargarPagosNoBancarios() + + + If UsuarioActual.Empresa.Funcionalidad(531) = "1" Then LnkPorcentajeMarcas.Visible = True - LnkPorcentajePrecios.Visible = True - - If UsuarioActual.TienePermisoProceso(279) Then - TrPreciosPP.Visible = True - TrAgregarPMarca.Visible = True - - BtnGuardarPorcentajesMarca.Visible = True - BtnGuardarPorcentajes.Visible = True - End If - + LnkPorcentajePrecios.Visible = True + + If UsuarioActual.TienePermisoProceso(279) Then + TrPreciosPP.Visible = True + TrAgregarPMarca.Visible = True + + BtnGuardarPorcentajesMarca.Visible = True + BtnGuardarPorcentajes.Visible = True + End If + End If @@ -8972,27 +8972,27 @@ Partial Class Clientes CargaDTPorcentajePrecios(DTPorcentajePrecios.FiltraParametros("Estatus <> 'D' ")) - End Sub - Protected Sub GvM_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GvM.RowDataBound - If e.Row.RowType = DataControlRowType.DataRow Then - - If UsuarioActual.TienePermisoProceso(279) Then - e.Row.FCLinkButton("imgE").Visible = True - e.Row.FCLinkButton("lnkRemove").Visible = True - End If - - End If - End Sub - - Protected Sub GvP_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GvP.RowDataBound - If e.Row.RowType = DataControlRowType.DataRow Then - - If UsuarioActual.TienePermisoProceso(279) Then - e.Row.FCLinkButton("imgE").Visible = True - e.Row.FCLinkButton("lnkRemove").Visible = True - End If - - End If + End Sub + Protected Sub GvM_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GvM.RowDataBound + If e.Row.RowType = DataControlRowType.DataRow AndAlso Not (e.Row.RowState = DataControlRowState.Edit OrElse e.Row.RowState = 5) Then + + If UsuarioActual.TienePermisoProceso(279) Then + e.Row.FCLinkButton("imgE").Visible = True + e.Row.FCLinkButton("lnkRemove").Visible = True + End If + + End If + End Sub + + Protected Sub GvP_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GvP.RowDataBound + If e.Row.RowType = DataControlRowType.DataRow AndAlso Not (e.Row.RowState = DataControlRowState.Edit OrElse e.Row.RowState = 5) Then + + If UsuarioActual.TienePermisoProceso(279) Then + e.Row.FCLinkButton("imgE").Visible = True + e.Row.FCLinkButton("lnkRemove").Visible = True + End If + + End If End Sub Protected Sub GvM_RowEditing(sender As Object, e As GridViewEditEventArgs) Handles GvM.RowEditing GvM.EditIndex = e.NewEditIndex @@ -10466,7 +10466,7 @@ Partial Class Clientes Alert("Los cambios se guardaron satisfactoriamente.") End Using - End Sub - + End Sub + End Class diff --git a/Ventas/PV.aspx b/Ventas/PV.aspx index 0b3fd9d00..654463864 100644 --- a/Ventas/PV.aspx +++ b/Ventas/PV.aspx @@ -2872,7 +2872,7 @@
- +
@@ -3281,7 +3281,19 @@ //VALIDA SOLO SI SE SELECCIONO UN USADO var cveUsado = ToDouble($get("C_DdlRecepcionUsados").value); if (cveUsado > 0) { - args.IsValid = (ToDouble(args.Value) > 0); + var anio = ToDouble(args.Value); + if (anio > 0) { + var valido = true; + if (anio < 1900) { + valido = false; + } + if (anio.toString().length != 4) { + valido = false; + } + args.IsValid = valido; + } else { + args.IsValid = false; + } } else { args.IsValid = true; } diff --git a/Ventas/PV.aspx.vb b/Ventas/PV.aspx.vb index ed0629450..a818111b8 100644 --- a/Ventas/PV.aspx.vb +++ b/Ventas/PV.aspx.vb @@ -3430,27 +3430,27 @@ Partial Class PV If Retorno IsNot Nothing AndAlso Retorno.CveVenta > 0 Then - If ObjFactura.TipoDocto = "Rem" Then - If ObjAcum.GetPolizasVirtuales(Retorno.CveVenta) Then - Dim DtPoliza As DataTable = ObjAcum.DtResultados.Copy() + 'If ObjFactura.TipoDocto = "Rem" Then + ' If ObjAcum.GetPolizasVirtuales(Retorno.CveVenta) Then + ' Dim DtPoliza As DataTable = ObjAcum.DtResultados.Copy() - For Each Row As DataRow In ObjFactura.DtPolizasVirtuales.Rows - Dim CvePolizaVirtual As Integer = DtPoliza.FiltroPrimeroValor("CvePolizaVirtual", $"CveVentaDetalle={Row("CveVentaDetalle")}").ToEntero() + ' For Each Row As DataRow In ObjFactura.DtPolizasVirtuales.Rows + ' Dim CvePolizaVirtual As Integer = DtPoliza.FiltroPrimeroValor("CvePolizaVirtual", $"CveVentaDetalle={Row("CveVentaDetalle")}").ToEntero() - If Not ObjAcum.UpdatePolizaVirtual(CvePolizaVirtual, Row("CveMarcaUsado").ToString().ToEntero(), Row("FechaUsado").ToString().ToDateTime()) Then - SbAlert.Append("Error al guardar la póliza virtual") - TieneError = True - Exit For - End If - Next + ' If Not ObjAcum.UpdatePolizaVirtual(CvePolizaVirtual, Row("CveMarcaUsado").ToString().ToEntero(), Row("FechaUsado").ToString().ToDateTime()) Then + ' SbAlert.Append("Error al guardar la póliza virtual") + ' TieneError = True + ' Exit For + ' End If + ' Next - DtPoliza.Dispose() - Else - SbAlert.Append("Error al obtener la póliza virtual") - TieneError = True - End If + ' DtPoliza.Dispose() + ' Else + ' SbAlert.Append("Error al obtener la póliza virtual") + ' TieneError = True + ' End If - End If + 'End If If ObjAcum.GetGarantiasDetalle(Retorno.CveVenta) Then Dim RowGarantia As DataRow = ObjAcum.DtResultados.FiltroPrimero("") @@ -4790,6 +4790,9 @@ Partial Class PV DdlRecepcionUsados.SelectedValueExist("-1") DivRecepcionUsados.Visible = False + DdlMarca.SelectedValueExist("-1") + TxtFechaVigencia.Text = Now.ToString("dd/MM/yyyy") + LimpiaAjuste() UPPDescuento.Update() @@ -5295,7 +5298,7 @@ Partial Class PV divagregrarotrops.Visible = False Ajuste() - AddPolizaVirtual(DdlPS.SelectedValue.ToEntero()) + 'AddPolizaVirtual(DdlPS.SelectedValue.ToEntero()) 'BUSCA EN TMPDT LOS DATOS DE USADOS If TmpDT.Rows.Count > 0 AndAlso TmpDTRecepcionUsados IsNot Nothing AndAlso TmpDTRecepcionUsados.Rows.Count > 0 Then @@ -5334,11 +5337,29 @@ 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 TxtAnioVehiculo.Text.ToDecimal() < 1900 Then + Alert("El campo año debe ser mayor a 1900.", TipoMensaje.MsgAdvertencia) + Exit Sub + 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 + End If + End If End If + + If AgregarPS() Then If ChkAjuste.Checked Then GuardaAjuste() - AddPolizaVirtual(DdlPS.SelectedValue.ToEntero()) CalculaTotalesVenta() If ChkAgregar.Checked = True And Modalidad = "A" Then @@ -5404,17 +5425,19 @@ Partial Class PV CveProyecto, Proyecto, DdlSubProyectoDatos.SelectedValue.ToEntero, DdlSubProyectoDatos.SelectedItem.Text, Serie:="", TiempoEntrega:="", CuentaPredial:="", RegeneraIEPS:=ClienteDesglosaIEPS, CveVentaDetalle:=CveVentaDetalle, EsCargo:=EsCargo) + Dim ListaPSCargo As List(Of MConceptoUsado) = Nothing If CveVentaDetalle <= 0 AndAlso Not EsCargo Then - Dim ListaPSCargo = CalculaUsados(Consec) - If ListaPSCargo.Count > 0 Then - CalculaRecepcionUsados(CvePS, ListaPSCargo, Cantidad, Consec) - End If + ListaPSCargo = CalculaUsados(Consec) ElseIf CveVentaDetalle > 0 AndAlso Not EsCargo Then EliminarUsados() - Dim ListaPSCargo = CalculaUsados(Consec, LimpiarUsados:=False) - If ListaPSCargo.Count > 0 Then - CalculaRecepcionUsados(CvePS, ListaPSCargo, Cantidad, Consec) - End If + ListaPSCargo = CalculaUsados(Consec, LimpiarUsados:=False) + End If + + If ListaPSCargo IsNot Nothing AndAlso ListaPSCargo.Count > 0 Then + CalculaRecepcionUsados(CvePS, ListaPSCargo, Cantidad, Consec) + For Each Usado As MConceptoUsado In ListaPSCargo + AddPolizaVirtual(DdlPS.SelectedValue.ToEntero(), Usado.Consecutivo) + Next End If Return True @@ -7386,6 +7409,7 @@ Partial Class PV #Region "P O L I Z A - V I R T U A L" Private Sub CreaDTmpDTPolizaVirtual() TmpDTPolizaVirtual = New DataTable + TmpDTPolizaVirtual.Columns.Add("Consec", GetType(Integer)) TmpDTPolizaVirtual.Columns.Add("CvePS", GetType(Integer)) TmpDTPolizaVirtual.Columns.Add("Cantidad", GetType(Decimal)) TmpDTPolizaVirtual.Columns.Add("PU", GetType(Decimal)) @@ -7402,14 +7426,14 @@ Partial Class PV TmpDTPolizaVirtual.Columns.Add("CveBCIUsado", GetType(Integer)) TmpDTPolizaVirtual.Columns.Add("CveMarcaUsado", GetType(Integer)) End Sub - Private Function AddPolizaVirtual(CvePS As Integer) As Boolean + Private Function AddPolizaVirtual(CvePS As Integer, Consec As Integer) As Boolean Dim Retorno As Boolean = True If Modalidad = "U" Then If TmpDTPolizaVirtual.Rows.Count > 0 Then Dim Elimino As Boolean = False For Each RowPoliza As DataRow In TmpDTPolizaVirtual.Rows - If RowPoliza("CvePS").ToString().ToEntero() = CvePS Then + If RowPoliza("Consec").ToString().ToEntero() = Consec AndAlso RowPoliza("CvePS").ToString().ToEntero() = CvePS Then RowPoliza.Delete() Elimino = True Exit For @@ -7475,6 +7499,8 @@ Partial Class PV End If Dim Row As DataRow = TmpDTPolizaVirtual.NewRow() + + Row("Consec") = Consec Row("CvePS") = CvePS Row("Cantidad") = Cantidad Row("PU") = PU @@ -7524,7 +7550,7 @@ Partial Class PV EmitirImprimirNew() End Sub - Private Sub CalculaRecepcionUsados(CvePS As Integer, ListaPSCargo As List(Of Integer), CantidadUsado As Decimal, ConsecPSPadre As Integer) + Private Sub CalculaRecepcionUsados(CvePS As Integer, ListaPSCargo As List(Of MConceptoUsado), CantidadUsado As Decimal, ConsecPSPadre As Integer) If Modalidad = "U" Then If TmpDTRecepcionUsados.Rows.Count > 0 Then @@ -7600,8 +7626,8 @@ Partial Class PV End If Dim StrCargos As New StringBuilder - For Each CvePSCargo As Integer In ListaPSCargo - StrCargos.AppendFormat(" {0},", CvePSCargo) + For Each Usado As MConceptoUsado In ListaPSCargo + StrCargos.AppendFormat(" {0},", Usado.CvePS) Next StrCargos.Remove(StrCargos.Length - 1, 1) @@ -7718,12 +7744,16 @@ Partial Class PV CalculaTotalesVenta() End Sub - Private Function CalculaUsados(Consec As Integer, Optional LimpiarUsados As Boolean = True) As List(Of Integer) + Public Class MConceptoUsado + Public Property Consecutivo As Integer + Public Property CvePS As Integer + End Class + Private Function CalculaUsados(Consec As Integer, Optional LimpiarUsados As Boolean = True) As List(Of MConceptoUsado) If Modalidad = "U" AndAlso LimpiarUsados Then EliminarUsados(Consec) End If - Dim ListaPScargo As New List(Of Integer) + Dim ListaPScargo As New List(Of MConceptoUsado) Dim DTTamanios As DataTable = GlobalDTAcumTamaños() Dim DTCvePSCostos = DTTamanios.FiltraParametros("", "", {"CvePSCargo"}) @@ -7828,7 +7858,7 @@ Partial Class PV drowPsTamaños("PS").ToString, "", drowPsTamaños("PU").ToString.ToDecimal, 0, -1, "", drowPsTamaños("CveSubProyecto").ToString.ToEntero, drowPsTamaños("SubProyecto").ToString, EsCargo:=True, ConsecPSPadre:=drowPsTamaños("ConsecPSPadre").ToString.ToEntero, EliminarDB:=CBool(drowPsTamaños("EliminarDB").ToString())) If Consec > 0 Then - ListaPScargo.Add(drowPsTamaños("CvePS").ToString.ToEntero) + ListaPScargo.Add(New MConceptoUsado() With {.Consecutivo = Consec, .CvePS = drowPsTamaños("CvePS").ToString.ToEntero}) End If End If Next diff --git a/Ventas/Ventas.aspx.vb b/Ventas/Ventas.aspx.vb index 0059f9a58..909f471b5 100644 --- a/Ventas/Ventas.aspx.vb +++ b/Ventas/Ventas.aspx.vb @@ -4985,6 +4985,11 @@ Partial Class Ventas End If End If + 'NO DEBE IMPRIMIR PDF DE COTIZACION + If UsuarioActual.Empresa.Funcionalidad(531) = "1" AndAlso DbRowVenta("TipoDocto").ToString() = "Cot" Then + HplDownPDF.Visible = False + End If + If DbRowVenta("SeTimbro").ToString() = "Si" Then TrEmitir.Visible = False End If @@ -7504,6 +7509,13 @@ Partial Class Ventas e.Row.FCLinkButton("imgE").Visible = False e.Row.FCLinkButton("imgD").Visible = False End If + + 'EN BDH NO DEBE PODER EDITAR LOS PS + If UsuarioActual.Empresa.Funcionalidad(531) = "1" Then + e.Row.FCLinkButton("imgE").Visible = False + e.Row.FCLinkButton("imgD").Visible = False + End If + End If 'CANTIDAD FACTURADA @@ -8164,6 +8176,12 @@ Partial Class Ventas Exit Sub End If + 'VENDEDOR OBLIGATORIO + If DdlVendedor.SelectedValue.ToEntero() <= 0 AndAlso UsuarioActual.Empresa.Funcionalidad(531) = "1" AndAlso DdlTipoComprobante.SelectedValue = "Ing" Then + Alert("Debe seleccionar un vendedor.", TipoMensaje.MsgAdvertencia) + Exit Sub + End If + 'SI TIENE ANTICIPOS Y ESTA AMORTIZADO AL 100% EL DOCUMENTO (SALDO = 0) | NO VALIDA PU DEL CONCEPTO If Not (LblAmortizacion.Text.ToDouble > 0 And TxtTotal.Text.ToDouble <= 0) Then If Not DdlTipoComprobante.SelectedValue.Contiene("Ped", "Ant", "DPe") Then @@ -8543,6 +8561,11 @@ Partial Class Ventas HplDownPDF.NavigateUrl = String.Format("/Compras/PopUpVerFactura.aspx?P={0}", Encripta(String.Format("OP=VTA&CVEVENTA={0}&PAG=1&GUARDAR=1", CveVenta))) End If + 'NO DEBE IMPRIMIR PDF DE COTIZACION + If UsuarioActual.Empresa.Funcionalidad(531) = "1" AndAlso DdlTipoComprobante.SelectedValue = "Cot" Then + HplDownPDF.Visible = False + End If + UpnTools.Update() End Sub @@ -9272,17 +9295,21 @@ Partial Class Ventas If DdlTipoComprobante.SelectedValue = "Cot" Then If Not CveEmpresaCRM > 0 Then - If CveVenta > 0 Then MensajeAlert = New StringBuilder - Dim ArchivoCotizacion As New System.IO.FileInfo(String.Format("{0}Formatos/Cotizacion.rdlc", UsuarioActual.Empresa.Ruta)) - If Opcion = "Cot" And UsuarioActual.Empresa.Funcionalidad(558) = "1" Then - MensajeAlert.AppendFormat("Facturar

", CveVenta) - End If + 'EN EMPRESA DE ACUMULADORES NO DESCARGAR EL PDF + If UsuarioActual.Empresa.Funcionalidad(531) <> "1" Then + If CveVenta > 0 Then MensajeAlert = New StringBuilder + Dim ArchivoCotizacion As New System.IO.FileInfo(String.Format("{0}Formatos/Cotizacion.rdlc", UsuarioActual.Empresa.Ruta)) - If ArchivoCotizacion.Exists Then - MensajeAlert.AppendFormat("
", Encripta(String.Format("OP=VTA&CVEVENTA={0}&PAG=0", CveVenta))) - Else - MensajeAlert.Append("Ocurrió un error al generar el PDF. Por favor vuelva a entrar a la factura para imprimir el PDF. ") + If Opcion = "Cot" And UsuarioActual.Empresa.Funcionalidad(558) = "1" Then + MensajeAlert.AppendFormat("Facturar

", CveVenta) + End If + + If ArchivoCotizacion.Exists Then + MensajeAlert.AppendFormat("
", Encripta(String.Format("OP=VTA&CVEVENTA={0}&PAG=0", CveVenta))) + Else + MensajeAlert.Append("Ocurrió un error al generar el PDF. Por favor vuelva a entrar a la factura para imprimir el PDF. ") + End If End If GeneraPDFCotizacion(ChkEnviarFactura.Checked) ' MANDA CORREO @@ -17235,7 +17262,7 @@ Partial Class Ventas DdlVendedorSucursal.SelectedValue = Nothing If UsuarioActual.Empresa.Funcionalidad(302) = "1" AndAlso DdlSubProyectoDatos.SelectedValue.ToEntero() > 0 Then - DdlVendedor.DataSource = GlobalDTVendedores(UsuarioActual.CveEmpresa).FiltraParametros(String.Format("(CveSubProyecto IS NULL OR CveSubProyecto = {0})", DdlSubProyectoDatos.SelectedValue)).FiltraParametros("VendedorTipo = 1") + DdlVendedor.DataSource = GlobalDTVendedores(UsuarioActual.CveEmpresa, VendedorTipo:=-1).FiltraParametros(String.Format("VendedorTipo IN (1,4) AND (CveSubProyecto IS NULL OR CveSubProyecto = {0})", DdlSubProyectoDatos.SelectedValue)) Else DdlVendedor.DataSource = GlobalDTVendedores(UsuarioActual.CveEmpresa).FiltraParametros("VendedorTipo = 1") End If @@ -17281,11 +17308,11 @@ Partial Class Ventas End If If CveVendedorActual > 0 Then - Dim VendedorActual As String = GlobalDTVendedores(UsuarioActual.CveEmpresa).FiltroPrimeroValor("Vendedor", $"CveVendedor = {CveVendedorActual}") + Dim VendedorActual As String = GlobalDTVendedores(UsuarioActual.CveEmpresa, VendedorTipo:=-1).FiltroPrimeroValor("Vendedor", $"CveVendedor = {CveVendedorActual}") 'SI NO ENCUENTRA BUSCA EN LOS VENDEDORES DEL PV - If String.IsNullOrEmpty(VendedorActual) Then - VendedorActual = GlobalDTVendedores(UsuarioActual.CveEmpresa, VendedorTipo:=4).FiltroPrimeroValor("Vendedor", String.Format("CveVendedor = {0}", CveVendedorActual)) - End If + 'If String.IsNullOrEmpty(VendedorActual) Then + ' VendedorActual = GlobalDTVendedores(UsuarioActual.CveEmpresa, VendedorTipo:=4).FiltroPrimeroValor("Vendedor", String.Format("CveVendedor = {0}", CveVendedorActual)) + 'End If If String.IsNullOrEmpty(VendedorActual) Then DdlVendedor.SelectedValueExist(CveVendedorActual) @@ -17294,17 +17321,10 @@ Partial Class Ventas End If End If - If UsuarioActual.CveEmpresa = 140 Then - If Not UsuarioActual.TienePermisoProceso(161) Then - DdlVendedor.Enabled = False - End If - Else - If DdlVendedor.SelectedValue.ToEntero() > 0 AndAlso Not UsuarioActual.TienePermisoProceso(161) Then - DdlVendedor.Enabled = False - End If + If DdlVendedor.SelectedValue.ToEntero() > 0 AndAlso Not UsuarioActual.TienePermisoProceso(161) Then + DdlVendedor.Enabled = False End If - 'multiples vendedores visible If UsuarioActual.TienePermisoProceso(153) Then DdlVendedor.Enabled = True diff --git a/asmx/WSGPSApp.asmx b/asmx/WSGPSApp.asmx index 3249864b7..1d97ac264 100644 --- a/asmx/WSGPSApp.asmx +++ b/asmx/WSGPSApp.asmx @@ -134,7 +134,12 @@ Public Class WSGPSApp Clientes.Add(New WsClientePortalGPS With {.CveCliente = Row("CveCliente").ToString.ToEntero, .Cliente = Row("Cliente").ToString}) Next If UsuarioActual.CveCliente <= 0 AndAlso Clientes.Any() Then - UsuarioRetorno.CveCliente = Clientes.FirstOrDefault().CveCliente + UsuarioRetorno.CveCliente = Clientes.FirstOrDefault().CveCliente + If UsuarioRetorno.CveCliente > 0 Then + If UsuarioActual.Empresa.Funcionalidad(704).Contiene(UsuarioRetorno.CveCliente.ToString()) Then + UsuarioRetorno.RastreoSoloInicio = True + End If + End If End If End If End If @@ -196,7 +201,15 @@ Public Class WSGPSApp Clientes.Add(New WsClientePortalGPS With {.CveCliente = Row("CveCliente").ToString.ToEntero, .Cliente = Row("Cliente").ToString}) Next If UsuarioActual.CveCliente <= 0 AndAlso Clientes.Any() Then - UsuarioRetorno.CveCliente = Clientes.FirstOrDefault().CveCliente + UsuarioRetorno.CveCliente = Clientes.FirstOrDefault().CveCliente + If UsuarioActual.CveCliente <= 0 AndAlso Clientes.Any() Then + UsuarioRetorno.CveCliente = Clientes.FirstOrDefault().CveCliente + If UsuarioRetorno.CveCliente > 0 Then + If UsuarioActual.Empresa.Funcionalidad(704).Contiene(UsuarioRetorno.CveCliente.ToString()) Then + UsuarioRetorno.RastreoSoloInicio = True + End If + End If + End If End If End If End If @@ -1126,7 +1139,8 @@ Namespace ADGPSModels Public Property Contrasenia As String Public Property TienePermisoOC As Boolean - Public Property TienePermisoPS As Boolean + Public Property TienePermisoPS As Boolean + Public Property RastreoSoloInicio As Boolean = False End Class