diff --git a/App_Code/ClsGenerales.vb b/App_Code/ClsGenerales.vb
index 72acf9130..8a780eaf9 100644
--- a/App_Code/ClsGenerales.vb
+++ b/App_Code/ClsGenerales.vb
@@ -3749,7 +3749,7 @@ Public Class ClsGenerales
End Function
Public Function UpdateTimbreTimbrado(CveTimbre As Integer, FolioFiscal As String, Fecha As DateTime, CveUsuario As Integer, CveEmpresa As Integer,
- CvePAC As Integer) As Boolean
+ CvePAC As Integer, CFDIVersion As String) As Boolean
Dim Retorno As Boolean = False
DataAdapter("PA_Gral_TimbreTimbrado")
@@ -3759,6 +3759,7 @@ Public Class ClsGenerales
.Add("@FolioFiscal", SqlDbType.VarChar).Value = FolioFiscal
.Add("@Fecha", SqlDbType.DateTime).Value = Fecha
.Add("@CvePAC", SqlDbType.Int).Value = CvePAC
+ .Add("@CDFIVersion", SqlDbType.VarChar).Value = CFDIVersion
.Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario
.Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa
End With
diff --git a/App_Code/Timbrado.vb b/App_Code/Timbrado.vb
index 68f338ac6..d09c9bc2b 100644
--- a/App_Code/Timbrado.vb
+++ b/App_Code/Timbrado.vb
@@ -2832,7 +2832,7 @@ Public Class Timbrado
Case "T"
Dim objGrales As New ClsGenerales
- If objGrales.UpdateTimbreTimbrado(Ventas.CveTimbre, FolioFiscal, ObjCFDITimbre.Comprobante.Fecha, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, UsuarioActual.Empresa.CvePAC) Then
+ If objGrales.UpdateTimbreTimbrado(Ventas.CveTimbre, FolioFiscal, ObjCFDITimbre.Comprobante.Fecha, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, UsuarioActual.Empresa.CvePAC, "3.3") Then
Retorno = ""
Else
Retorno = "Error"
@@ -5658,7 +5658,7 @@ Public Class Timbrado
Case "T"
Dim objGrales As New ClsGenerales
- If objGrales.UpdateTimbreTimbrado(Ventas.CveTimbre, FolioFiscal, ObjCFDITimbre.Comprobante.Fecha, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, UsuarioActual.Empresa.CvePAC) Then
+ If objGrales.UpdateTimbreTimbrado(Ventas.CveTimbre, FolioFiscal, ObjCFDITimbre.Comprobante.Fecha, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, UsuarioActual.Empresa.CvePAC, "4.0") Then
Retorno = ""
Else
Retorno = "Error"
diff --git a/App_Code/Timbres.vb b/App_Code/Timbres.vb
index 23070a859..e4d974461 100644
--- a/App_Code/Timbres.vb
+++ b/App_Code/Timbres.vb
@@ -41,8 +41,10 @@ Public Class Timbres
Private Sub CreaObjetosTraslados(TipoDocto As String, CveTimbre As Integer)
- ObjFactura = New Modelos.Factura
+ ObjFactura = New Modelos.Factura
ObjFactura.Version = "3.3"
+ If UsuarioActual.Empresa.Funcionalidad(350) = "1" Then ObjFactura.Version = "4.0"
+
ObjFactura.CveUsuario = UsuarioActual.CveUsuario
ObjFactura.CveEmpresa = UsuarioActual.CveEmpresa
ObjFactura.UsuarioActual = UsuarioActual
@@ -84,8 +86,10 @@ Public Class Timbres
Timbre.Comprobante.SubTotal = Obj.SubTotal
Timbre.Comprobante.Descuentos = Obj.Descuento
Timbre.Comprobante.Moneda = "XXX"
- Timbre.Comprobante.TipoCambio = "" ' CONDICIÓN SI LA MONEDA ES 'XXX'
- Timbre.Receptor.UsoCFDI = "P01"
+ Timbre.Comprobante.TipoCambio = "" ' CONDICIÓN SI LA MONEDA ES 'XXX'
+
+ Timbre.Receptor.UsoCFDI = "S01"
+ If ObjFactura.Version = "3.3" Then Timbre.Receptor.UsoCFDI = "P01"
Dim totSubTotal As Decimal = Obj.SubTotal
Dim totIVA As Decimal = Obj.IVA
@@ -124,7 +128,7 @@ Public Class Timbres
Timbre.Receptor.RFC = drT("EmpresaRFC").ToString
Timbre.Receptor.Nombre = drT("EmpresaNombre").ToString
- Timbre.Receptor.DomicilioFiscalReceptor = drT("DirDesCP").ToString
+ Timbre.Receptor.DomicilioFiscalReceptor = drT("DomicilioFiscalReceptor").ToString
Timbre.Receptor.RegimenFiscalReceptor = drT("CodigoRegimenFiscalReceptor").ToString
CveMovimiento = drT("CveMovimientoAlmacen").ToString.ToEntero
@@ -216,8 +220,8 @@ Public Class Timbres
End If
Dim Ubica As New CFDICartaPorteUbicacion
- Ubica.TipoEstacion = ""
- Ubica = New CFDICartaPorteUbicacion With {.TipoUbicacion = "Origen", .IDUbicacion = "OR000001", .RFCRemitenteDestinatario = drT("RemitenteRFC").ToString,
+ Ubica.TipoEstacion = ""
+ Ubica = New CFDICartaPorteUbicacion With {.TipoUbicacion = "Origen", .IDUbicacion = "OR000001", .RFCRemitenteDestinatario = drT("RemitenteRFC").ToString,
.FechaHoraSalidaLlegada = FechaSalida.ToString("yyyy-MM-ddTHH:mm:ss"),' "2021-08-23T11:13:01",
.NombreRemitenteDestinatario = drT("RemitenteNombre").ToString,
.Domicilio = DomOrigen}
@@ -230,9 +234,9 @@ Public Class Timbres
.NumRegIdTrib = NumRegIdTrib}
CartaPorte.Ubicaciones.Add(Ubica)
- CartaPorte.FiguraTransporte.ClaveTransporte = "01"
+ CartaPorte.FiguraTransporte.ClaveTransporte = "01"
- Dim DomicilioOperador As New CFDICartaPorteDomicilio With {.Calle = drT("FiguraDomicilio").ToString,
+ Dim DomicilioOperador As New CFDICartaPorteDomicilio With {.Calle = drT("FiguraDomicilio").ToString,
.NumeroExterior = drT("FiguraNumeroExterior").ToString,
.NumeroInterior = drT("FiguraNumeroInterior").ToString,
.Colonia = drT("FiguraClaveSATColonia").ToString,
@@ -242,7 +246,7 @@ Public Class Timbres
- CartaPorte.FiguraTransporte.Operadores.Add(New CFDICartaPorteOperador With {
+ CartaPorte.FiguraTransporte.Operadores.Add(New CFDICartaPorteOperador With {
.RFCFigura = drT("FiguraRFC").ToString,
.NombreFigura = drT("FiguraChofer").ToString,
.NumLicencia = drT("FiguraLicencia").ToString,
@@ -251,8 +255,8 @@ Public Class Timbres
.Domicilio = DomicilioOperador})
- 'concepto único
- Dim concepto As New CFDIConceptos With {.Cantidad = 1,
+ 'concepto único
+ Dim concepto As New CFDIConceptos With {.Cantidad = 1,
.Descripcion = "Traslado",
.ValorUnitario = 0,
.Importe = 0,
@@ -261,22 +265,23 @@ Public Class Timbres
.ClaveUnidad = "E48",
.ClaveProdServ = "78101802",
.Noidentificacion = "",
- .CuentaPredial = ""}
+ .CuentaPredial = "",
+ .ObjetoImpuesto = "01"}
- Timbre.Conceptos.Add(concepto)
+ Timbre.Conceptos.Add(concepto)
- For Each drr As DataRow In Obj.DtDetalle.Rows
+ For Each drr As DataRow In Obj.DtDetalle.Rows
- If drr("PS").ToString.Length = 1 Then
- tPS = drr("Obs").ToString
+ If drr("PS").ToString.Length = 1 Then
+ tPS = drr("Obs").ToString
+ Else
+ If drr("PS").ToString.Length = 0 Then
+ tPS = ""
Else
- If drr("PS").ToString.Length = 0 Then
- tPS = ""
- Else
- tPS = String.Format("{0} {1}", drr("PS"), drr("Obs"))
- End If
+ tPS = String.Format("{0} {1}", drr("PS"), drr("Obs"))
End If
- Dim conceptoCarta As New CFDICartaPorteMercancia With {
+ End If
+ Dim conceptoCarta As New CFDICartaPorteMercancia With {
.BienesTransp = drr("SATClaveProdServ").ToString,
.ClaveSTCC = "", 'para metodo ferroviario
.Cantidad = drr("Cantidad").ToString.ToDecimal,
@@ -290,29 +295,29 @@ Public Class Timbres
.Embalaje = drr("ClaveEmbalaje").ToString,
.DescripEmbalaje = drr("Embalaje").ToString,
.ValorMercancia = drr("PU").ToString.ToDecimal,
- .Moneda = "MXN", 'temporal
+ .Moneda = IIf(drr("PU").ToString.ToDecimal > 0, "MXN", ""), 'temporal
.FraccionArrancelaria = "",
.UUIDComercioExt = ""
}
- Dim DetalleMercancia As New CFDICartaPorteMercanciaDetalleMercancia With {.PesoNeto = drr("PesoKg").ToString.ToDecimal * drr("Cantidad").ToString.ToDecimal, .NumPiezas = drr("Cantidad").ToString.ToDecimal}
- conceptoCarta.DetalleMercancia = DetalleMercancia
+ Dim DetalleMercancia As New CFDICartaPorteMercanciaDetalleMercancia With {.PesoNeto = drr("PesoKg").ToString.ToDecimal * drr("Cantidad").ToString.ToDecimal, .NumPiezas = drr("Cantidad").ToString.ToDecimal}
+ conceptoCarta.DetalleMercancia = DetalleMercancia
- Dim MercanciaTransporta As New CFDICartaPorteMercanciaTransporta With {.Cantidad = drr("Cantidad").ToString.ToDecimal, .IDOrigen = "OR000001", .IDDestino = "DE000001"}
- conceptoCarta.MercanciasCantidadTransporta.Add(MercanciaTransporta)
+ Dim MercanciaTransporta As New CFDICartaPorteMercanciaTransporta With {.Cantidad = drr("Cantidad").ToString.ToDecimal, .IDOrigen = "OR000001", .IDDestino = "DE000001"}
+ conceptoCarta.MercanciasCantidadTransporta.Add(MercanciaTransporta)
- totSubTotal = totSubTotal - concepto.Importe
- CartaPorte.Mercancias.Mercancias.Add(conceptoCarta)
+ totSubTotal = totSubTotal - concepto.Importe
+ CartaPorte.Mercancias.Mercancias.Add(conceptoCarta)
- i += 1
- Next
- Timbre.Complementos.CartaPorte = CartaPorte
+ i += 1
+ Next
+ Timbre.Complementos.CartaPorte = CartaPorte
- Else
- '' T R A S L A D O S
+ Else
+ '' T R A S L A D O S
- 'DETALLES
- If Obj.DtDetalle IsNot Nothing Then
+ 'DETALLES
+ If Obj.DtDetalle IsNot Nothing Then
For Each drr As DataRow In Obj.DtDetalle.Rows
If drr("PS").ToString.Length = 1 Then
diff --git a/Bin/GoCfdi.dll b/Bin/GoCfdi.dll
index c94459330..ef9ad67ca 100644
Binary files a/Bin/GoCfdi.dll and b/Bin/GoCfdi.dll differ
diff --git a/Compras/PopUpVerFactura.aspx.vb b/Compras/PopUpVerFactura.aspx.vb
index 887f721e6..7d4e9f6fd 100644
--- a/Compras/PopUpVerFactura.aspx.vb
+++ b/Compras/PopUpVerFactura.aspx.vb
@@ -1692,12 +1692,17 @@ Partial Class PopUpVerFactura
Dim ImagenCBB As New System.IO.FileInfo(RutaCBB)
Dim nodo As XmlNode = XMLDoc.DocumentElement
+ Dim Version = ValorXML(nodo, "version")
Dim Prefijo As String = If(XMLDoc.DocumentElement.Prefix = "", "cfd", XMLDoc.DocumentElement.Prefix)
Dim cfdVer As String = "http://www.sat.gob.mx/cfd/3"
Dim namespaces As New XmlNamespaceManager(XMLDoc.NameTable)
+ If Version = "3.3" Then
+ cfdVer = "http://www.sat.gob.mx/cfd/3"
+ Else ' se considera que es la version 4.0
+ cfdVer = "http://www.sat.gob.mx/cfd/4"
+ End If
- If Prefijo.ToLower <> "cfdi" Then cfdVer = "http://www.sat.gob.mx/cfd/2"
namespaces.AddNamespace(Prefijo, cfdVer)
namespaces.AddNamespace("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital")
namespaces.AddNamespace("implocal", "http://www.sat.gob.mx/implocal")
@@ -1737,7 +1742,6 @@ Partial Class PopUpVerFactura
Next
End If
-
Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces)
Dim nodeCartaPorte As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:CartaPorte", "cartaporte20"), namespaces)
diff --git a/Ventas/Clientes.aspx.vb b/Ventas/Clientes.aspx.vb
index eac0461d1..b8584eae2 100644
--- a/Ventas/Clientes.aspx.vb
+++ b/Ventas/Clientes.aspx.vb
@@ -1268,8 +1268,6 @@ Partial Class Clientes
CargaCombosComercioExterior()
-
-
End Sub
Private Sub CargaSubProyectoss()
@@ -2480,18 +2478,37 @@ Partial Class Clientes
End If
- 'CargaSucursal()
- 'If UsuarioActual.TienePermisoProceso(170) AndAlso TxtCodigo.Text.Trim = "" Then
- ' Alert("Es necesario ingresar un Código", TipoMensaje.MsgAdvertencia)
- ' Exit Sub
- 'End If
+ If UsuarioActual.Empresa.Funcionalidad(350).Contiene("1", "2") Then
- 'Dim rowcodigo As DataTable = GlobalDTCliente.FiltraParametros(String.Format("Codigo='{0}' AND CveEmpresa={1} ", TxtCodigo.Text.Trim, UsuarioActual.CveEmpresa))
- 'If (Not IsNothing(rowcodigo)) AndAlso (rowcodigo.Rows.Count > 0) AndAlso (rowcodigo.Rows(0)("CveCliente").ToString().Toentero() <> CveCliente) Then
- ' Alert(String.Format("ya existe un Cliente Con este Codigo '{0}'", TxtCodigo.Text.Trim), TipoMensaje.MsgAdvertencia)
- ' Exit Sub
- 'End If
- Dim ObjClientes As New ClsClientes()
+ If TxtRFC.Text.ToUpper.Contiene("XAXX010101000", "XEXX010101000") AndAlso DdlRegimenFiscal.SelectedValue <> "11" Then
+
+ Alert("El Regimen fiscal del cliente debe ser '616 - Sin obligaciones fiscales' cuando se utiliza el RFC genérico.", TipoMensaje.MsgAdvertencia)
+ Exit Sub
+
+ End If
+
+ If TxtRFC.Text.ToUpper.Contiene("XAXX010101000", "XEXX010101000") AndAlso DdlUsoCFDI.SelectedValue <> "23" Then
+
+ Alert("El Regimen fiscal del cliente debe ser 'S01 - Sin efectos fiscales' cuando se utiliza el RFC genérico.", TipoMensaje.MsgAdvertencia)
+ Exit Sub
+
+ End If
+
+
+ End If
+
+ 'CargaSucursal()
+ 'If UsuarioActual.TienePermisoProceso(170) AndAlso TxtCodigo.Text.Trim = "" Then
+ ' Alert("Es necesario ingresar un Código", TipoMensaje.MsgAdvertencia)
+ ' Exit Sub
+ 'End If
+
+ 'Dim rowcodigo As DataTable = GlobalDTCliente.FiltraParametros(String.Format("Codigo='{0}' AND CveEmpresa={1} ", TxtCodigo.Text.Trim, UsuarioActual.CveEmpresa))
+ 'If (Not IsNothing(rowcodigo)) AndAlso (rowcodigo.Rows.Count > 0) AndAlso (rowcodigo.Rows(0)("CveCliente").ToString().Toentero() <> CveCliente) Then
+ ' Alert(String.Format("ya existe un Cliente Con este Codigo '{0}'", TxtCodigo.Text.Trim), TipoMensaje.MsgAdvertencia)
+ ' Exit Sub
+ 'End If
+ Dim ObjClientes As New ClsClientes()
Dim objDoc As New ClsEdocumentacion(ObjClientes.IniciaTransacSQL())
Dim MsgCuentaContable As String = ""
Dim ErrorProceso As Boolean = False