Buscar en este blog

jueves, 5 de julio de 2018

(VirtualXML) Todo lo que necesitas saber sobre el Complemento de Pagos 1.0 (parte 2 de 4)

En esta segunda entrega de nuestra serie de 4 artículos, hablaremos sobre las funciones que incluye VirtualXML para el llenado del Recibo Electrónico de pago (REP) también conocido como CFDI con Complemento de Pagos, o Factura de recepción de pagos.

VirtualXML provee de 3 funciones que te permitirán llenar un REP de una manera muy sencilla, rápida y sin errores.

Llenar correctamente un REP no es nada complicado, lo complicado es obtener la información para llenar con los datos correctos nuestro CDFI de recepción de pagos, pero eso será tema de nuestra próxima entrega.

El SAT tiene publicada en su página una Guía de Llenado para el REP, donde además de indicarte como debes llenar un REP correctamente, encontrarás información sobre casos especiales de emisión de REPs como el caso de anticipos, factoraje, etc.

Para este artículo nosotros seguiremos la guía de llenado, pero mostrándote con pseudocódigo las funciones que tienes que utilizar para llenar tu REP.

Si quieres un ejemplo funcional "en vivo y a todo color" para un lenguaje de programación en específico, puedes descargarte cualquiera de los ejemplos que tenemos publicados en la página web de VirtualPAC y VirtualXML ya que en todos los ejemplos que hemos publicado, incluimos uno para el llenado del REP.

Empecemos:

Como su nombre oficial lo indica, un REP ó CFDI con COMPLEMENTO de pagos 1.0, atención a la palabra "COMPLEMENTO", indica que el recibo como tal es una parte de un CFDI común y corriente, no es un CFDI por sí mismo, como en el caso de las retenciones.

Cabe mencionar que todas las funciones de las que hablaremos en este artículo las podrás encontrar documentadas en la Página de Documentación de VirtualXML.

Al ser un "COMPLEMENTO" asumimos que va contenido dentro de un CFDI, así pues hemos de crear el CFDI como si de cualquier tipo de documento se tratara, es decir con la función:

hXml := VirtualXML_New("3.3")

La cual nos devuelve un "handler" en memoria donde se va a ir construyendo el XML que posteriormente se firmará, sellará y timbrará.

Luego necesitamos indicar nuestras credenciales de acceso al servicio de VirtualPAC:

VirtualXML_SetVirtualPacInfo(hXml,"demo_cibertec","demo")

Y ahora la información general del CFDI, es decir la información del nodo <cfdi:Comprobante>:

VirtualXML_SetComprobanteInfo_cfdi33(hXml,;    //handle del documento
                                     "PAGO",;  //serie
                                     "1",;     //folio
                                     "2018-06-01T15:23:11",;//fecha y hora
                                     "",;      //forma de pago (no debe existir de acuerdo a la guia de llenado)
                                     "",;      //condiciones de pago (no debe existir de acuerdo a la guia de llenado)
                                     "0",;     //subtotal(de acuerdo a la guia tiene que llenarse con un 0, sin decimales)
                                     "",;      //descuento (no debe existir de acuerdo a la guia de llenado)
                                     "XXX",;   //moneda (debe ser XXX de acuerdo a la guia de llenado)
                                     "",;      //tipo de cambio (no debe existir de acuerdo a la guia de llenado)
                                     "0",;     //total (de acuerdo a la guia tiene que llenarse con un 0 sin decimales)
                                     "P",;     //Tipo de comprobante: "P"ago
                                     "",;      //metodo de pago (no debe existir de acuerdo a la guia de llenado)
                                     "53050",; //lugar de emision
                                     "")       //confirmacion (ya no es necesaria)

Comentemos algunos aspectos interesantes de la llamada a esta función.

Como se puede observar, tiene que llevar un número de serie y folio, nosotros recomendamos que los pagos se manejen con su propia serie y folios correspondientes para así llevar un mejor control de los documentos que son de pago, recuerda que estos documentos no tienen carácter de ingreso o egreso fiscal y solo son de tipo informativo.

La fecha se refiere al día y la hora en la cual SE ELABORA EL REP, no es el día en el que el REP se depositó en la cuenta bancaria, sino el día (y la hora, si desconoces la hora deberás poner las 12:00:00) en la que estás elaborando el REP, aunque estas fechas pueden coincidir, sobre todo si elaboras el REP el mismo día en que te hacen el pago, decides hacer tu REP hasta el límite que marca la ley, es decir al décimo día natural del mes siguiente, la fecha del REP deberá ser la del día de elaboración

El tipo de comprobante deberá llevar el valor "P" (en mayúscula), para indicar que es un CFDI de PAGO.

Así mismo deberá de llevar el código postal de el lugar de emisión como un CFDI común y corriente.

La guía de llenado del REP establece que los siguientes valores no deben existir:
  • Forma de pago (se definirá en los documentos relacionados del REP)
  • Condiciones de pago
  • Descuento (es un documento sin totales, no lleva descuentos)
  • Tipo de cambio (se utiliza la moneda XXX que no tiene tipo de cambio)
  • Método de pago 
  • Confirmación 
También en la guía se señala que los valores numéricos correspondientes al Subtotal y al Total deben de ir expresados con un "0", sin decimales, ya que la moneda con la clave "XXX" indica cero decimales en el catálogo de monedas publicado por el SAT.

Trataremos en la cuarta entrega la sección documentos relacionados, para no confundirnos con otros "documentos relacionados" que también vienen dentro del complemento.

Las dos siguientes secciones son la información del emisor y el receptor respectivamente y utilizaremos las funciones:

VirtualXML_SetEmisorInfo_cfdi33(hXml,;                     // handle del documento
                             "AAA010101AAA",;              // RFC del emisor del REP
                             "Empresa de prueba SA de CV",;// Nombre o razón social del emisor (opcional)
                             "601";                        // Clave del regimen fiscal del emisor
)

VirtualXML_SetReceptorInfo_cfdi33(hXml,;                                //handle del documento
                                  "CTE940531F58",;                      // RFC del receptor del REP
                                  "Cibernetica y Tecnología SA de CV",; //Nombre o razon social del receptor (opcional)
                                  "",;                                  // Numero de identificación tributaria del receptor (solo en caso de ser extranjero)
                                  "",;                                  // Clave del país de residencia del receptor (solo en caso de ser extranjero)
                                  "P01"                                 // Uso del CFDI.

)

Para el caso del EMISOR, los datos son los mismos que en un CFDI normal.

Para el caso del RECEPTOR también, y hay que señalar que el atributo "uso del CFDI", SIEMPRE debe de llevar la clave "P01" (por definir).

Hay que considerar que si vendemos productos al extranjero, y recibimos pagos de nuestros clientes extranjeros que se depositen en cuentas nacionales, TAMBIÉN es obligatorio emitir el Recibo Electrónico de Pago, indicando para esto el RFC genérico para extranjeros "XEXX010101000" y usar los atributos para número de identificación tributaria (el equivalente del RFC en el extranjero) y la clave del país de residencia del cliente, a continuación un ejemplo de como quedaría la llamada a esta función para clientes extranjeros:

VirtualXML_SetReceptorInfo_cfdi33(hXml,;                          // handle del documento
                                  "XEXX010101000",;               // RFC del receptor del REP
                                  "Mitsubishi Corp. Japan Ltd.",; // Nombre o razon social del receptor (opcional)
                                  "B4882097",;                    // Numero de identificación tributaria del receptor (solo en caso de ser extranjero)
                                  "JPN",;                         // Clave del país de residencia del receptor (solo en caso de ser extranjero)
                                  "P01"                           // Uso del CFDI.
)


La siguiente sección es la de conceptos, que solo lleva uno, y siempre es el mismo, sin importar cuantos pagos vayas a registrar o cuantas facturas pagues, un REP solo lleva un concepto que es:

VirtualXML_AddConcepto_cfdi33(hXml,;       // handle del documento
                              "84111506",; //clave del producto o servicio
                              "",;         // clave interna del producto o servicio
                              "1",;        // cantidad
                              "ACT",;      // clave de la unidad
                              "",;         // clave interna de la unidad
                              "Pago",;     // descripción
                              "0",;        // Precio unitario
                              "0",;        // Importe
                              "";          // Descuento
)


Para el concepto de un REP la clave del producto es 84111506 (Servicios de facturación), la cantidad siempre es 1, la clave de la unidad siempre es ACT (Actividad), la descripción del producto es "Pago" la "P" con mayúscula el resto con minúscula.

No se deben indicar claves de uso interno, descuento y el precio e importe deben ir con un valor de "0" SIN DECIMALES, ya que la moneda del documento es XXX y esta clave de moneda indica que no debe llevar decimales.

Nuestro REP ya no lleva ningún otro nodo o atributo mas, no hay cuentas prediales, números de pedimentos, complementos concepto, ni tampoco existen los nodos para impuestos ni a nivel concepto ni a nivel documento.

Hasta aquí el llenado es el de un CFDI normal, pasemos ahora a analizar como debemos llenar el COMPLEMENTO de recepción de pagos 1.0.

En el capítulo anterior comentamos que el complemento estaba dividido en 2 partes:
  1. Información sobre el pago
  2. Información sobre las facturas pagadas
Para implementar las partes de este complemento, VirtualXML incluye tres funciones que nos van a permitir incluir el complemento REP en tu CFDI de una manera muy simple:

La primer función es:


Esta función recibe como parámetro el handle del documento que estamos generado y lo único que hace es crear el nodo <pagos10:Pago></pagos10:Pago> dentro de nuestro CFDI, es importante mencionar que ANTES de empezar a registrar pagos y facturas pagadas, hay que hacer una llamada (una sola) a esta función.

Hablemos un poco ahora de los pagos como tales.

Los pagos se pueden dividir en 2 grandes familias dependiendo de la manera en que nos los pagan, es importante conocer a que familia pertenece cada pago para poder tener a la mano la información necesaria para poder llenar correctamente el complemento de pagos. Independientemente de a que familia pertenezca el pago, la función VirtualXML_SetPagos10() se utiliza indistintamente.

La primer familia de pagos son los pagos NO BANCARIZADOS, estos pagos se caracterizan porque no hay intervención de una entidad bancaria al momento de realizarlos, ¿ cuales son estos pagos ?, pues los pagos en efectivo, los pagos por aplicación de una nota de crédito, los pagos por compensación o por "dación", etc.

El pago NO BANCARIZADO es el pago mas fácil de registrar ya que no requiere información de alguna entidad bancaria, este es un ejemplo de la llamada a la función VirtualXML_Pagos10SetPago() para un pago en efectivo:

VirtualXML_Pagos10SetPago(hXml,       //handle del documento
                          "2017-05-31T12:00:00",; //fecha y hora de recepción del pago
                          "01",;      // Clave del método de pago
                          "MXN",;     // Clave de la moneda del pago
                          "",;        // Tipo de cambio de la moneda si es distinta de MXN
                          "1160.00",; // Monto del pago
"","","","","","","","","","")

Este pago requiere de datos básicos:
  • La fecha y hora en que se recibió el pago, no la fecha en la cual se deposito en el banco (si es que se deposita) y como la hora la desconocemos, pondremos las 12 del medio día (12:00:00)
  • Clave SAT del método de pago de acuerdo al catálogo, esta es la razón por la cual no debemos incluir ni forma de pago ni método de pago en la función VirtualXML_SetComprobanteInfo_cfdi33(), como podemos tener mas de un pago dentro del mismo REP cada pago puede llevar distinto método, por lo tanto es inútil poner un solo método de pago cuando probablemente tengas mas de uno en los pagos.
  • Moneda y tipo de cambio: recordar que nos pueden pagar en otra moneda distinta de pesos mexicanos, aun en efectivo.
  • Importe total del pago, este monto se aplicará mas adelante a una o mas facturas pendientes de pago.
Nota que además de los datos anteriores hay un montón de parámetros vacíos, estos corresponden a los datos que se deben de llenar cuando el pago pertenece a la segunda familia de pagos:

Los pagos BANCARIZADOS.

Este tipo de pagos son aquellos que se realizan por medio de instrumentos bancarios, como por ejemplo, cheques, tarjetas de crédito o débito, transferencias de fondos o SPEIs (no es lo mismo una transferencia que un SPEI, lo veremos en la proxima entrega), cuando tenemos este tipo de pagos, será necesario incluir mas información que cuando el pago es NO BANCARIZADO.

A continuación un ejemplo de un pago recibido con cheque:

VirtualXML_Pagos10SetPago(hXml,                   //handle del documento
                          "2017-05-31T12:00:00",; //fecha y hora de recepción del pago
                          "02",;                  // Clave del método de pago
                          "MXN",;                 // Clave de la moneda del pago
                          "",;                    // Tipo de cambio de la moneda si es distinta de MXN
                          "1160.00",;             // Monto del pago
                          "652",;                 // Numero de operación
                          "BSM970519DU8",;        // RFC del banco del cual salen los fondos o RFC generico extranjero en caso de ser Banco extranjero
                          "",;                     // Nombre del banco en caso de ser banco extranjero
                          "002180065145757870",;   //Clabe interbancaria de la cuenta de donde salen los fondos
                          "CFA950629CAA",;         // RFC del banco en el cual se depositan los fondos
                          "002180065145895321",;   // Clabe Interbancaria de la cuenta donde se depositan los fondos
                          "",;                     // Tipo de cadena de pago cuando se trate de SPEI
                          "",;                     // Certificado del CEP cuando se trate de SPEI
                          "",;                     // Cadena del CEP cuando se trate de SPEI
                          "";                      // Sello del CEP cuando se trate de SPEI
)

Los datos que requerimos para llenar un pago BANCARIZADO en un principio son iguales a los del pago NO BANCARIZADO:
  • Fecha y hora de la recepción del pago, es la fecha en que nos entregaron el cheque y como no tenemos manera de saber la hora pondremos las 12 del medio dia (12:00:00), utilizaremos esta hora siempre que no sepamos la hora en que recibimos un pago.
  •  Método de Pago,  En este caso he indicado la clave 02 que es "Cheque nominativo".
  • Moneda y Tipo de cambio. Si el pago lo recibimos en pesos, debemos indicar la clave de la moneda y si es difierente de MXN, el tipo de cambio de la moneda. Esto plantea un dilema muy interesante, porque ¿ que pasa si emites la factura en pesos y te la pagan en dólares o viceversa ?, este problema lo analizaremos y resolveremos en la cuarta entrega de esta serie.
  • Monto del pago, es decir, la cantidad que nos pagaron, esta cantidad será aplicada posteriormente dentro del mismo complemento a una o mas facturas y siempre deberá ser mayor a la suma de todas las facturas que se registran para pago.
A partir de este punto, todos los demás parámetros hacen referencia a un pago BACARIZADO, si el pago hubiera sido en efectivo, por compensación o por un método NO BANCARIZADO, como en el ejemplo anterior, el resto de los parámetros los podríamos haber indicado vacíos, sin embargo, el pago con cheque es un pago BANCARIZADO y nos obliga a llenar los datos correspondientes con información bancaria.

Tengo que señalar, llegados a este punto, que hasta el momento de escribir este artículo, la descripción del complemento publicada por el SAT indica que TODOS LOS DATOS BANCARIOS SON OPCIONALES, es decir, no importa que el pago sea BANCARIZADO o NO BANCARIZADO, todos los datos de los bancos que revisaremos a continuación SON OPCIONALES, desconozco si para cuando entre en vigor la obligatoriedad del uso del REP serán obligatorios o condicionales, pero mientras son peras o son manzanas, revisemos los:
  • Número de operación: Se refiere a un numero que el banco asigna a la operación, como puede ser el número de cheque, el número de autorización de la tarjeta, un número de control dado por el propio banco, y en el caso específico de los SPEIs (que analizaremos a profundidad en la tercera entrega) una cosa llamada "clave de rastreo" que veremos de que se trata en el próximo artículo.
  • RFC de los bancos que intervienen en pago, tanto del banco de donde salen los fondos y del banco donde se depositan los fondos, es decir, si te pagan con un cheque de HSBC y lo depositas en BBVA Bancomer, necesitaras los RFCs de ambos bancos, la nueva versión de nuestro producto CiberCAT ha sido equipado con un catálogo de bancos que contiene esta y otra valiosa información para el llenado del complemento.
  • Número de cuenta de donde salen los fondos y número de cuenta a donde se depositan, nosotros aconsejamos utilizar siempre la CLABE (CLAve Bancaria Estandarizada) ya que la descripción del atributo en el XSD indica que debe tener por lo menos 9 dígitos de longitud y un máximo de 18, muchos bancos manejan menos de 9 dígitos en sus número de cuenta, por lo que el uso de la CLABE, que siempre es de 18 dígitos nos va a evitar muchos errores en el llenado de este parámetro.
¿ Que pasa si nos pagan con una transferencia o cheque de un banco extranjero ?,  ¿ que hago con el RFC y el número de cuenta del banco extranjero ?, es muy sencillo: para el RFC utilizarás el RFC genérico para extranjeros (XEXX010101000) y en el número de cuenta deberás de cuidar que tenga por lo menos 9 digitos, en el caso del banco extranjero es requisito indicar EL NOMBRE del banco y existe un parámetro para ello.

A continuación otro ejemplo de llenado pero pagado con una transferencia de un banco extranjero.

VirtualXML_Pagos10SetPago(hXml,                   //handle del documento
                          "2017-05-31T12:00:00",; //fecha y hora de recepción del pago
                          "03",;                  // Clave del método de pago
                          "EUR",;                 // Clave de la moneda del pago
                          "23.75",;               // Tipo de cambio de la moneda si es distinta de MXN
                          "1000.00",;             // Monto del pago
                          "0054652",;             // Numero de operación
                          "XEXX010101000";,       //  RFC generico extranjero
                          "Credit Agricole Banque, Fr, S.A.",; // Nombre del banco en caso de ser banco extranjero
                          "0021845757870",;       //Numero de cuenta del banco extranjero
                          "CFA950629CAA",;        // RFC del banco en el cual se depositan los fondos
                          "002180065145895321",;  // Clabe Interbancaria de la cuenta donde se depositan los fondos
                          "",;                    // Tipo de cadena de pago cuando se trate de SPEI
                          "",;                    // Certificado del CEP cuando se trate de SPEI
                          "",;                    // Cadena del CEP cuando se trate de SPEI
                          "";                     // Sello del CEP cuando se trate de SPEI
)

Finalmente hablemos de los 4 últimos parámetros de la función que se utilizarán unicamente cuando te hayan realizado un pago por medio de SPEI (Sistema de Pagos Electrónicos Interbancarios), (vas a desear que nunca te paguen por SPEI).

Debemos de notar que dentro del mundo de las transferencias de fondos, estas pueden estar categorizadas en 3 clases:
  1. Transferencias de fondos entre cuentas DEL MISMO BANCO
  2. Transferencias de fondos entre distintos bancos 
  3. Transferencias de fondos realizadas por el sistema SPEI (Sistema de Pagos Electrónicos Interbancarios)
La siguiente información para el llenado de los 4 últimos parámetros de la función VirtualXML_Pagos10SetPago() solo aplica cuando el pago se ha recibido por SPEI, no aplica si el pago se hizo entre cuentas del mismo banco o bien mediante una transferencia.

¿ Que diferencia hay entre una transferencia y un SPEI ?, la diferencia básica consiste en que una transferencia tiene aplicación al siguiente día hábil a las 12 del medio día, tal como sucede con un cheque depositado salvo buen cobro, mientras que el SPEI tiene aplicación el mismo día hábil unos pocos minutos después de haber hecho la operación.

En la próxima entrega hablaremos a profundidad del pago por SPEIs, pero a manera de introducción, tenemos que saber que toda la información necesaria para llenar estos 4 parámetros proviene de una cosa llamada CEP (Comprobante Electrónico de Pago).

Un CEP, es un archivo XML que contiene información sobre el SPEI realizado, esta información sera OBLIGATORIA, siempre y cuando utilices el parámetro Tipo Cadena de Pago, y ese tendrás que usarlo cuando registres un pago hecho con un SPEI (no deberás usarlo con una transferencia entre cuentas del mismo banco ni con transferencias de banco a banco).

Los CEPs están resguardados por el Banco de México (Banxico) por 45 días hábiles y los deberás obtener desde la página web de Banxico para poder completar los datos que te pide el pago por SPEI, no te preocupes, hablaremos a profundidad del tema en la tercera entrega y haremos algunos ejemplos adicionales, así que de momento, no nos pongamos nerviosos, si quieres ir avanzando en el tema mientras publico la tercera parte, te recomiendo que visites nuestro nuevo CANAL DE YouTube.

A continuación te muestro un ejemplo del registro de pago, cuando este proviene de un SPEI:

VirtualXML_Pagos10SetPago(hXml, //handle del documento
                          "2017-05-31T12:00:00",; //fecha y hora de recepción del pago
                          "02",; // Clave del método de pago
                          "MXN",; // Clave de la moneda del pago
                          "",; // Tipo de cambio de la moneda si es distinta de MXN
                          "1160.00",; // Monto del pago
                          "652",; // Numero de operación
                          "BSM970519DU8",; // RFC del banco del cual salen los fondos o RFC generico extranjero en caso de ser Banco extranjero
                          "",; // Nombre del banco en caso de ser banco extranjero
                          "002180065145757870",; //Clabe interbancaria de la cuenta de donde salen los fondos
                          "CFA950629CAA",; // RFC del banco en el cual se depositan los fondos
                          "002180065145895321",; // Clabe Interbancaria de la cuenta donde se depositan los fondos
                          "01",; // Tipo de cadena de pago cuando se trate de SPEI
                                   "MIIF+TCCA+GgAwIBAgIUMzAwMDEwMDAwMDAzMDAwMjM3MDgwDQYJKoZIhvcNAQELBQAwggFmMSAwHgYDVQQDDBdBLkMuIDIgZGUgcHJ1ZWJhcyg0MDk2KTEvMC0GA1UECgwmU2VydmljaW8gZGUgQWRtaW5pc3RyYWNpw7NuIFRyaWJ1dGFyaWExODA2BgNVBAsML0FkbWluaXN0cmFjacOzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5mb3JtYWNpw7NuMSkwJwYJKoZIhvcNAQkBFhphc2lzbmV0QHBydWViYXMuc2F0LmdvYi5teDEmMCQGA1UECQwdQXYuIEhpZGFsZ28gNzcsIENvbC4gR3VlcnJlcm8xDjAMBgNVBBEMBTA2MzAwMQswCQYDVQQGEwJNWDEZMBcGA1UECAwQRGlzdHJpdG8gRmVkZXJhbDESMBAGA1UEBwwJQ295b2Fjw6FuMRUwEwYDVQQtEwxTQVQ5NzA3MDFOTjMxITAfBgkqhkiG9w0BCQIMElJlc3BvbnNhYmxlOiBBQ0RNQTAeFw0xNzA1MTgwMzU0NTZaFw0yMTA1MTgwMzU0NTZaMIHlMSkwJwYDVQQDEyBBQ0NFTSBTRVJWSUNJT1MgRU1QUkVTQVJJQUxFUyBTQzEpMCcGA1UEKRMgQUNDRU0gU0VSVklDSU9TIEVNUFJFU0FSSUFMRVMgU0MxKTAnBgNVBAoTIEFDQ0VNIFNFUlZJQ0lPUyBFTVBSRVNBUklBTEVTIFNDMSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBIRUdUNzYxMDAzNFMyMR4wHAYDVQQFExUgLyBIRUdUNzYxMDAzTURGUk5OMDkxGzAZBgNVBAsUEkNTRDAxX0FBQTAxMDEwMUFBQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJdUcsHIEIgwivvAantGnYVIO3+7yTdD1tkKopbL+tKSjRFo1ErPdGJxP3gxT5O+ACIDQXN+HS9uMWDYnaURalSIF9COFCdh/OH2Pn+UmkN4culr2DanKztVIO8idXM6c9aHn5hOo7hDxXMC3uOuGV3FS4ObkxTV+9NsvOAV2lMe27SHrSB0DhuLurUbZwXm+/r4dtz3b2uLgBc+Diy95PG+MIu7oNKM89aBNGcjTJw+9k+WzJiPd3ZpQgIedYBD+8QWxlYCgxhnta3k9ylgXKYXCYk0k0qauvBJ1jSRVf5BjjIUbOstaQp59nkgHh45c9gnwJRV618NW0fMeDzuKR0CAwEAAaMdMBswDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBsAwDQYJKoZIhvcNAQELBQADggIBABKj0DCNL1lh44y+OcWFrT2icnKF7WySOVihx0oR+HPrWKBMXxo9KtrodnB1tgIx8f+Xjqyphhbw+juDSeDrb99PhC4+E6JeXOkdQcJt50Kyodl9URpCVWNWjUb3F/ypa8oTcff/eMftQZT7MQ1Lqht+xm3QhVoxTIASce0jjsnBTGD2JQ4uT3oCem8bmoMXV/fk9aJ3v0+ZIL42MpY4POGUa/iTaawklKRAL1Xj9IdIR06RK68RS6xrGk6jwbDTEKxJpmZ3SPLtlsmPUTO1kraTPIo9FCmU/zZkWGpd8ZEAAFw+ZfI+bdXBfvdDwaM2iMGTQZTTEgU5KKTIvkAnHo9O45SqSJwqV9NLfPAxCo5eRR2OGibd9jhHe81zUsp5GdE1mZiSqJU82H3cu6BiE+D3YbZeZnjrNSxBgKTIf8w+KNYPM4aWnuUMl0mLgtOxTUXi9MKnUccq3GZLA7bx7Zn211yPRqEjSAqybUMVIOho6aqzkfc3WLZ6LnGU+hyHuZUfPwbnClb7oFFz1PlvGOpNDsUb0qP42QCGBiTUseGugAzqOP6EYpVPC73gFourmdBQgfayaEvi3xjNanFkPlW1XEYNrYJB4yNjphFrvWwTY86vL2o8gZN0Utmc5fnoBTfM9r2zVKmEi6FUeJ1iaDaVNv47te9iS1ai4V4vBY8r",;                              
                                // Certificado del CEP cuando se trate de SPEI

"||1|01062018|01062018|131112|40002|BANORTE/IXE|CONSULTORES SA DE CV|40|072180000104200612|VCO980224GM7|BANAMEX|CIBERNETICA Y TECNOLOGIA SA DE CV|40|002180065145757870|CTE940531F58|7415 Consultores|0.00|16762.00|00001000000401205824||",; //Cadena del CEP cuando se trate de SPEI

"KoyfUALQnMJpCHqnY+VA+EmvhzwU8Is4bG5IZdpueeQRBeidJjejQ5VJ0DA21q7b4w4J9QPzYSwnSFO6A6qZxEs68gwPCm4Mm7ztfqCWwbYICLTapLvh2h9WifyadPNsOIJmkmLJtNojTQ90BS67jZf4RanW+ETF+c1tIfFMZ9dakptVZN/wUe3EfujeTuxilsuCPlr+mYiuPZLa/++DIhJCYevIY8s+4UquQhFgVYu/OUg8UYS9TGL/hrf4JPyZUjr4Y6SQ2gprsfpjVUbAYhTC6Jgt7OqQRs3WZTLUThPfSCxo7cqH71O7kOI5Nw638GVwbdS2hrld7WFr0v//4w==",; // Sello del CEP cuando se trate de SPEI
)

En este ejemplo te presento los datos que deben llevar los últimos 4 parámetros del pago. Te recuerdo que estos 4 parámetros solo son obligatorios cuando el pago se realice por medio de un SPEI.

De estos 4 parámetros, 3 se obtienen del CEP, que como comentamos anteriormente es un archivo en formato XML que deberemos obtener desde la página web de Banxico, estos datos son:
  • Tipo de cadena de pago, es una clave para identificar el tipo de pago, el catálogo del SAT solo muestra un valor que es 01, y que indica que el pago se hizo por medio de SPEI.
  • El siguiente parámetro es el CERTIFICADO expresado como texto en Base64 que se utilizó para timbrar el CEP, esa información viene en el XML del CEP, te enseñaremos como obtener la cadena en Base64 en la proxima entrega.
  • El tercer parámetro es el una CADENA ORIGINAL correspondiente al CEP y se encuentra en el mismo XML donde viene el certificado.
  • El último parámetro es un Sello digital que arrojó la certificación del CEP en el SAT y que también viene dentro del mismo archivo del CEP.
Hablaremos con mas profundidad de este tema en la próxima entrega.

Pasemos ahora al tema de las facturas que ampara el pago.

VirtualXML incluye la función:


Que nos pemitirá registrar tantas facturas como queramos aplicar a un mismo pago.

La función debe de utilizarse DESPUÉS de la función VirtualXML_Pagos10SetPago() y se repetirá tantas veces como facturas deseemos aplicar a un pago.

Es muy importante recordar que la suma de los montos pagados de cada factura NO DEBE REBASAR el importe del monto establecido con la función VirtualXML_Pagos10SetPago().

Ejemplo del uso:

 VirtualXML_Pagos10AddPagoDoctoRelacionado(hXml,
                                           "D8E18C2F-2859-4927-A0F0-EA3E93642DDC",;// UUID de la factura a la cual aplicamos el pago
                                           "A",;       // Serie de la factura
                                           "400",;     // folio de la factura
                                           "MXN",;     // moneda en la cual fue emitida la factura
                                           "",;        // tipo de cambio
                                           "PPD",;     // forma de pago
                                           "1",;       // numero de parcialidad
                                           "2900.00",; // saldo anterior de la factura
                                           "2900.00",; // importe del apgo
                                           "0.00";     // saldo pendiente de la factura.
)

Los parámetros que necesitaremos para esta función son:
  • UUID, Serie y Folio de la factura como identificadores del documento
  • Moneda y tipo de cambio al cual fue expedida la factura en su momento
  • Forma de pago del documento original que debe ser PPD (Pago en parcialidades o diferido) pero si es PUE tampoco pasa nada (de momento).
  • Número de parcialidad pagada
  • Saldo anterior de la factura
  • Importe del pago
  • Saldo pendiente de la factura.
Los 4 últimos parámetros son importantes de revisar ya que para usar correctamente el complemento de pagos hay que llevar un control individual de cada pago aplicado a cada factura emitida.

Me podrás decir....

- Pero eso ya lo hago yo en mi modulo de cuentas por cobrar, llevo un estado de cuenta de lo que me deben mis clientes.

Eso es válido y está muy bien, sin embargo ahora, el estado de cuenta no debe ser por cliente sino por factura, ya que deberemos registrar cada uno de los pagos que sean aplicados a dicha factura, el importe del saldo pendiente de pago, y por otro lado aplicar el pago correspondiente y hacer un calculo del saldo pendiente, mismos datos que deberemos almacenar y utilizar en otro pagos posteriores.

En el ejemplo anterior, teníamos una factura de $2,900.00 pesos, hemos recibido un pago de $2,900.00 pesos, por lo tanto, el valor de la parcialidad es 1, el saldo anterior es de $2,900.00, el pago es de $ 2,900.00 y por lo tanto el saldo insoluto de la factura es de 0.00, es decir, se ha liquidado en su totalidad.

¿ Que pasa cuando el pago se tiene que aplicar sobre mas de una factura distinta ?

Pues muy sencillo, he aqui el ejemplo:

// Creamos el pago
VirtualXML_Pagos10SetPago(hXml,"2017-05-15T12:00:00","01","MXN","","5800.00","","","","","","","","","","")

// Ahora aplicamos el pago a 3 facturas distintas:
     VirtualXML_Pagos10AddPagoDoctoRelacionado(hXml,"D8E18C2F-2859-4927-A0F0-EA3E93642DDC","A","400","MXN","","PPD","1","2900.00","2900.00","0.00")
     VirtualXML_Pagos10AddPagoDoctoRelacionado(hXml,"BE1D4B47-E167-47A3-8049-70D4D43BCBE8","A","340","MXN","","PPD","2","1450.00","1450.00","0.00")
     VirtualXML_Pagos10AddPagoDoctoRelacionado(hXml,"FF93C8BE-AF7B-4FC5-8854-6DAE18CFB5B4","A","434","MXN","","PPD","1","2900.00","1450.00","1450.00")

Primero ejecuto la función VirtualXML_Pagos10SetPago() para establecer que he recibido un pago de $5,800.00, este pago se aplicará a 3 facturas, por lo tanto llamare 3 veces a la función VirtualXML_Pagos10AddPagoDoctoRelacionado(), indicando en cada llamada a que factura y cuanto aplico del pago.

En la primer llamada tenemos una factura de $2,900.00 que queda pagada en su totalidad, es una factura que originalmente era por $2,900.00, y se va a liquidar totalmente, por lo tanto es una sola parcialidad y el saldo insoluto de dicha factura queda en 0.00, nuestro pago total fue de $5,800.00 menos $2,900.00 de este pago, nos quedan $2,900.00 para aplicar.

La segunda factura trae un saldo anterior de $1,450.00, y se le aplicará su segundo pago, por un importe similar para que la factura quede totalmente saldada. Nos quedaban $2,900.00 menos  $1,450.00 de este pago, aun tenemos $1,450.00 pendientes de aplicar.

Finalmente tenemos una tercer factura de $2,900.00, pero solo nos quedan $1,450.00, así que vamos a aplicar este primer pago de $1,450.00 a la factura, y dejaremos un saldo insoluto de $1,450.00 mismos que se cubrirán con otro pago.

Como podrás apreciar es muy simple aplicar los pagos a las facturas, pero es MUY IMPORTANTE llevar un control de saldos adecuado para que los números coincidan perfectamente.

Para cerrar este artículo tenemos que mencionar algo importante: Un REP puede contener mas de un pago dentro del mismo CFDI.

Para lograr esto, deberás llamar a la funcion VirtualXML_Pagos10SetPago() seguido de la(s) llamada(s) a la función VirtualXML_Pagos10AddPagoDoctoRelacionado() tantas veces como pagos quieras registar en un solo documento.

Debes de tomar en cuenta que los pagos deben ser DEL MISMO RECEPTOR, no puedes mezclar pagos de distintos clientes un solo REP.

El concentrar todos los pagos de un cliente en un solo REP no depende unilateralmente de tí, deberás concertarlo con tu cliente para ver si quiere un solo REP mensual por todos sus pagos o bien un REP individual por cada pago, en nuestra experiencia en los meses que lleva operando la emisión de REPs la mayoría de los clientes prefieren un REP por cada pago para llevar un mejor control de sus facturas.

Concluimos este artículo con un ejemplo completo de CFDI de recepción de pagos que incluye 2 pagos en el mismo documento:

hXml := VirtualXMl_New("3.3")

VirtualXML_SetVirtualPacInfo(hXml,"demo_cibertec","demo")

VirtualXML_SetComprobanteInfo_cfdi33(hXml,"PAGO","1","%cb_date","","","0","","XXX","","0","P","","53050","")

VirtualXML_SetEmisorInfo_cfdi33(hXml,"AAA010101AAA","Empresa de prueba SA de CV","601")

VirtualXML_SetReceptorInfo_cfdi33(hXml,"CTE940531F58","Cibernetica y Tecnología SA de CV","","","P01")

VirtualXML_AddConcepto_cfdi33(hXml, "84111506", "", "1", "ACT", "", "Pago", "0", "0", "")

VirtualXML_SetPagos10(hXml)

VirtualXML_Pagos10SetPago(hXml,"2017-05-31T12:00:00","02","MXN","","1160.00","652","BSM970519DU8","","002180065145757870","CFA950629CAA","002180065145895321","","","","")
 VirtualXML_Pagos10AddPagoDoctoRelacionado(hXml,"FF93C8BE-AF7B-4FC5-8854-6DAE18CFB5B4","A","434","MXN","","PPD","1","1160.00","1160.00","0.00")

   VirtualXML_Pagos10SetPago(hXml,"2017-05-15T12:00:00","01","MXN","","5800.00","","","","","","","","","","")
     VirtualXML_Pagos10AddPagoDoctoRelacionado(hXml,"D8E18C2F-2859-4927-A0F0-EA3E93642DDC","A","400","MXN","","PPD","1","2900.00","2900.00","0.00")
     VirtualXML_Pagos10AddPagoDoctoRelacionado(hXml,"BE1D4B47-E167-47A3-8049-70D4D43BCBE8","A","340","MXN","","PPD","2","1450.00","1450.00","0.00")
     VirtualXML_Pagos10AddPagoDoctoRelacionado(hXml,"FF93C8BE-
AF7B-4FC5-8854-6DAE18CFB5B4","A","434","MXN","","PPD","1","2900.00","1450.00","1450.00")

   nResultado := VirtualXML_ProcesaDocumento(hXml,"AAA010101AAA.cer","AAA010101AAA.key","12345678a","ejemplo33conpagos.xml")

En la página de VirtualXML en la sección de descargas de los ejemplos de uso de VirtualXML, podrás descargar ejemplos en varios lenguajes de programación sobre el uso  de las funciones para el complemento de pagos 1.0.

En la próxima entrega trataremos un tema complicado e interesante: SPEIs y su aplicación al complemento de pago 1.0, si quieres ir adelantando algo en este tema VISITA NUESTRO CANAL DE YOUTUBE

miércoles, 27 de junio de 2018

(VirtualXML) Todo lo que necesitas saber sobre el complemento de pagos 1.0 (parte 1 de 4)

Estamos a dos meses de la entrada "oficial"  de la obligación de emisión del Complemento de Recepción de Pagos 1.0, lo cual será exactamente el día 1 de Septiembre de 2018.

Este complemento, tiene varios nombres: "Factura de recepción de pagos", "CFDI con complemento de pagos 1.0" pero para efectos prácticos de nuestros artículos lo llamaremos "Recibo Electrónico de Pago" o REP por sus iniciales, y será sin duda el complemento mas utilizado para CFDI dejando atrás por mucho al complemento de Nómina 1.2.

En esta serie de 4 artículos iremos desglosando las partes mas importantes del complemento de pagos, incluyendo cosas muy interesantes como manejo de anticipos, manejo de factoraje, pagos parciales, facturas emitidas en moneda extranjera y pagadas en pesos, etc.

En esta primera entrega analizaremos las generalidades del complemento de pagos, en la segunda entrega veremos las funciones que VirtualXML tiene para el llenado del complemento de pagos, la tercera entrega tratará un tema muy interesante: los pagos por transferencia electrónica SPEI y sus implicaciones dentro del complemento de pagos, (que por cierto son bastantes, interesantes y complejas) así como las funciones que "complementan" el complemento y finalmente en la cuarta entrega, tendremos las dudas mas frecuentes y explicaremos casos especiales como anticipos, factoraje, moneda extranjera, cancelación y sustitución de REPs, etc.

Es un largo camino, laborioso y delicado, por algo el SAT dió primero 3 meses y luego 5 meses mas para la implementación de este nuevo tipo de CFDI.

Aun estás a tiempo de empezar y supongo que ya llevas algo adelantado, si no, puedes empezar ya mismo con la implementación de REPs, a fin de no tener problemas para llegar a tiempo a la fecha límite que es el 1 de Septiembre de 2018.

Comencemos con este análisis.

¿ Que es el Complemento de pagos 1.0 o Recibo Electrónico de Pago (REP) ?

Como su nombre lo indica, el REP es un recibo que da fe de que haz recibido un pago por un CFDI de Ingreso (factura, recibo de honorarios o arrendamiento) emitida previamente.

El REP es un documento INFORMATIVO, no tiene naturaleza de ingreso como una factura o recibo de honorarios o arrendamiento, ni de egreso como una nota de crédito o un recibo de nómina, sino que se utilizará para que un receptor de CFDI compruebe que ha pagado una factura y el emisor compruebe que ha recibido un pago total o parcial de dicha factura.

El REP surge porque algunos emisores arbitrariamente cancelaban comprobantes emitidos después de recibir el pago a fin de reducir ingresos y pagar menos impuestos, mientras que en otros casos ocurría lo contrario: los receptores hacían deducibles facturas que nunca pagaban.

Como cita textualmente la página del SAT del complemento de Pagos de Recepción de pagos, este complemento cumple las siguientes funciones:
  • Evita cancelaciones indebidas de facturas.
  • Evita falsas duplicidades de ingresos en facturación de parcialidades.​
  • Sabrás si una factura ha sido o no pagada.
A fin de evitar lo primero, el SAT a partir del 1 de Septiembre implementará un nuevo mecanismo de cancelación de facturas como ya lo hemos explicado en otro articulo de este blog.

La facturación de anticipos y pagos parciales también derivaba en duplicidad de ingresos, de ahí que la naturaleza de REP sea unicamente informativa, ahora ya no será necesario expedir un CFDI de ingreso por un pago parcial, sino que estos pagos parciales se reportarán por medio de REPs.

Finalmente, tanto emisor como receptor se verán beneficiados del uso del REP ya que tendrán un control exacto de forma en que una factura es pagada, y evitarán posibles fraudes y malos manejos en la emisión de facturas.

¿ Quienes deben de usarlo ?

Todos los contribuyentes, personas física y morales QUE NO RECIBAN EL PAGO DE UN CFDI DE INGRESO AL MOMENTO DE SU EMISIÓN O BIEN NO HAYAN RECIBIDO EL PAGO POR ANTICIPADO.

Esto quiere decir que si una empresa me pide emitir una factura o un recibo de honorarios para "meterlo a revisión" y en una fecha posterior me realiza el pago (1 día después, 2, 3, 7, 15,30, 60 o 90 días posteriores), estoy obligado a la emisión de un REP en cuanto el receptor me haga el pago, sea por el medio que fuere (efectivo, cheque, tarjeta, transferencia, etc).

También aplica para pagos parciales; si no recibo el pago total en el momento de la emisión y cuando me hacen el pago y ESTE PAGO NO CUBRE EL IMPORTE TOTAL DEL CFDI DE INGRESO EMITIDO, estoy obligado a emitir tantos REPs como  pagos reciba hasta cubrir el importe total del CFDI emitido.

Esto nos obliga a re programar muchas rutinas de nuestros programas o bien generar módulos nuevos que nos permitan llevar un estado de cuenta POR FACTURA para poder registrar los REPsque vayan a cubrir el importe de dicha factura.

Hemos dotado a VirtualXML de un conjunto de funciones para generar los REPs de manera similar a como haces un CFDI común y corriente mismas que te facilitarán enormemente la creación del complemento las cuales analizaremos en la próxima entrega de esta serie.

¿ Puedo omitir la emisión de un REP ?

Si puedes omitir la emisión de un REP siempre y cuando NO FACTURES lo que estas vendiendo sino hasta el momento en que te lo paguen, puedes emitir remisiones para dar salida de inventario a las mercancias en caso de que vendas productos y emitir la factura cuando el cliente te haga el pago de la remisión correspondiente.

Nosotros aconsejamos el uso de remisiones cuando tengamos la certeza de que el cliente realizará un pago por el importe total del adeudo, pero si de pagos parciales se trata, entonces emitir el CFDI de Ingreso con sus respectivos REPs será de gran ayuda tanto para para la administración del negocio como para el pago de impuestos. 

¿ Cuando debo emitir el REP ?

El SAT en su Guia de Llenado del Complemento de Recepción de Pagos establece que los REPs deben de emitirse A MAS TARDAR el día 10 del mes siguiente a la recepción del pago, esto quiere decir que yo puedo emitir todos los REPs del mes de Enero a mas tardar el 10 de Febrero, los de Febrero el 10 de Marzo y así sucesivamente.

Obviamente esto no solo depende de nosotros, nuestros clientes pueden realizar un pago y solicitar de inmediato su REP y es tu deber emitirlo a la brevedad, para ello deberás contar con todos los datos necesarios para emitir el REP correspondiente, mismos que analizaremos mas adelante.

¿ Que pasa si no emito el REP ?


La guía de llenado del SAT con letras pequeñitas en la página 5 establece que:

Cuando el contribuyente reciba el pago de la contraprestación y no emita CFDI con Complemento para recepción de pagos a mas tardar el décimo día natural del mes inmediato siguiente al que corresponda o lo emita posteriormente, podra incurrir en la infracción contenida en el artículo 83 fracción VII y generar una multa en términos del articulo .4 fracción IV del código fiscal de la federación.

Esto suena grave.... ¿ a que se refiere ?

Tomado del código fiscal de la federación:

Artículo 83. Son infracciones relacionadas con la obligación de llevar contabilidad, siempre que sean descubiertas en el ejercicio de las facultades de comprobación o de las facultades previstas en el artículo 22 de este Código, las siguientes:

VII. No expedir, no entregar o no poner a disposición de los clientes los comprobantes fiscales digitales por Internet de sus actividades o expedirlos sin que cumplan los requisitos señalados en este Código, en su Reglamento o en las reglas de carácter general que al efecto emita el Servicio de Administración Tributaria, así como no atender el requerimiento previsto en el quinto párrafo del artículo 29 de este Código, para proporcionar el archivo electrónico del comprobante fiscal digital por Internet.


Artículo 84. A quien cometa las infracciones relacionadas con la obligación de llevar contabilidad a que se refiere el Artículo 83, se impondrán las siguientes sanciones para personas físicas:

a) De $12,070.00 a $69,000.00. En caso de reincidencia, las autoridades fiscales podrán, adicionalmente, clausurar preventivamente por un plazo de tres a quince días; para determinar dicho plazo, se tomará en consideración lo previsto por el artículo 75 de este Código.


b) De $1,210.00 a $2,410.00 tratándose de contribuyentes que tributen conforme al Título IV, Capítulo II, Sección II de la Ley del Impuesto sobre la Renta. En caso de reincidencia, adicionalmente las autoridades fiscales podrán aplicar la clausura preventiva a que se refiere el inciso anterior.


c) De $12,070.00 a $69,000.00 tratándose de contribuyentes que cuenten con la autorización para recibir donativos deducibles a que se refieren los artículos 79, 82, 83 y 84 de la Ley del Impuesto sobre la Renta y 31 y 114 del Reglamento de dicha Ley, según corresponda. En caso de reincidencia, además se revocará la autorización para recibir donativos deducibles.


Las multas pueden ser bastante fuertes, así que pocas tonterías con lo de emitir o no emitir REPs en tiempo y forma.

¿ Que datos se deben poner en un REP ?

Un REP es simplemente un complemento que se agrega a un CFDI, es similar al complemento de nómina, ya que ademós de la información del CFDI normal, deberá llevar la información relativa al pago.

Dentro de la sección del CFDI deberemos indicar básicamente los mismos datos que si hiciéramos un CFDI normal, con algunas variaciones y atributos que no deben existir:

Para el nodo Comprobante:

  • Version del CFDI (3.3)
  • Numero de serie y folio del REP (se recomienda manejar una serie y folios por separado independiente de las series y folios de facturas y notas de crédito)
  • Fecha de emisión del REP (Que no necesariamente es la fecha en que se recibió el pago)
  • Sello, Número de Certificado y Certificado (agregados por VirtualXML de manera automática).
  • Código Postal del lugar de expedición.
  • No deben existir los atributos: Condiciones de Pago, Descuento, Tipo de Cambio y Método de Pago
  • Los valores de los atributos SubTotal y Total deben de ir con un valor de: 0.00
  • La moneda debe expresarse como "XXX", es decir sin definir, ya que estos valores junto con los totales del CFDI se expresarán dentro del complemento.
Para el nodo documentos relacionados:

Este nodo merece mención especial ya que en este nodo NO VAN LOS UUIDs DE LAS FACTURAS QUE SE ESTAN PAGANDO, hago hincapié en esto porque el REP tiene su propio nodo de documentos relacionados y muchos usuarios confunden este nodo que pertenece a <cfdi:Comprobante> mientras que el nodo que se utiliza para el REP pertenece a <cfdi:Complemento>.

Este nodo se utilizará UNICAMENTE cuando se vaya a sustituir un REP por otros. Los valores que tendremos que poner son:
  • Tipo de relación que SIEMPRE deberá ser "04" (sustitución de documento, es la única que se admite)
  • Lista de UUIDs de REPs que se están sustituyendo.
Este nodo no siempre va a existir, unicamente cuando reportemos una sustitución de un Recibo Electrónico de Pago por otro.

Para el nodo emisor:
  • RFC del emisor y opcionalmente el nombre o razón social
  • Régimen fiscal del emisor 
Para el nodo receptor:
  • RFC del receptor del documento, en caso de ser extranjero deberemos indicar el RFC genérico para extranjeros XEXX010101000 (esto es muy importe como veremos en el siguiente punto). Se puede indicar opcionalmente el nombre
  • Residencia Fiscal: Si pusiste el RFC genérico para extranjero, deberás indicar de que país es el receptor así como su numero de identificación tributaria (el equivalente del RFC en el pais del cliente)
  • Para el Uso del CFDI deberemos indicar SIEMPRE el valor P01 = Por definir.
Para el nodo conceptos:

Un REP solo lleva un único concepto, nuevamente insisto, los CFDIs pagados no se relacionan en el nodo Conceptos.

Los datos del único concepto del REP son:
  • Clave del producto o servicio que siempre va a ser 84111506 (servicios de facturación)
  • No debe existir numero de identificación, unidad ni descuento
  • Cantidad siempre sera 1
  • Clave de la unidad siempre sera ACT
  •  Descripción deberá llevar el valor "Pago" (con P mayuscula y el resto de la palabra en minúscula, no vale PAGO, pago, pAgo, u otras combinaciones).
  • Valor unitario e importe deben llevar el valor de 0.00
  • No deben existir los nodos Impuestos, Información aduanera, Cuenta Predial, Parte o cualquier complemento concepto

Pasemos ahora a lo que nos importa del complemento de pagos, los datos que debe llevar el REP.

Estos datos se colocarán como un complemento, en la próxima entrega veremos que funciones se utilizan para llenarlo correctamente, en esta entrega nos limitaremos a ver que datos son los que tenemos que tener a mano.

Un complemento de pago está compuesto de 2 partes:
  1. Los datos del pago
  2. Las facturas que son cubiertas con dicho pago. Que también se les conoce como "documentos relacionados", favor de NO CONFUNDIR estos documentos relacionados con el nodo del mismo nombre del nodo <cfdi:Comprobante>.
Un aspecto interesante es que se puede incluir mas de un complemento de pago dentro del mismo REP, es decir, si un cliente me realizó 5 pagos en el mes, yo puedo meter los 5 pagos dentro de un solo REP y consumir un solo timbre, sin embargo, por experiencia sabemos que los clientes prefieren un comprobante por cada pago, para así llevar un mejor control de los mismos.

Analicemos ahora que información deberemos de proporcionar en cada sección del complemento de pago:

Datos del pago:
  • Fecha: aquí pondremos la fecha en que recibimos el pago del CFDI, en el caso del pago con cheque, efectivo o tarjeta, no es la fecha en la que el banco nos ingresa los fondos en la cuenta como en el caso de tarjeta o cheque, ni la fecha en que depositamos el efectivo, es la fecha EN LA QUE RECIBIMOS EL PAGO, por ejemplo recibo un pago en efectivo el sábado, pero lo deposito el lunes, la fecha de pago es la fecha del sábado, no del lunes, en el caso de las transferencias no tenemos problema, tenemos la fecha en que recibimos el SPEI.
  •  Forma de pago, donde deberemos especificar como se realizó el pago de acuerdo al catálogo de formas de pago publicado por el SAT, hay que tomar en cuenta que existen 2 tipos de formas de pagos: Bancarizados y no Bancarizados, esto será importante para los siguientes atributos.
  • Moneda: Es la moneda en la que se recibió el pago, pesos, dolares, euros, puede ser que tu factura la hayas emitido en dólares pero te la paguen en pesos o viceversa, esto de los pagos en distintas monedas lo discutiremos mas a fondo en la cuarta entrega de esta serie.
  • Tipo de cambio, si la moneda es distinta de MXN.
  • Monto: Es el importe del pago y debemos tomar en cuenta que al momento de detallar las facturas que se pagan, el importe de dichas facturas debe ser MENOR O IGUAL al monto indicado en este atributo, esto puede ser complicado si emites una factura en dólares y te la pagan en pesos, trataremos ese asunto en la cuarta entrega.
  •  Numero de operación: Este valor solo sera necesario si la forma de pago es Bancarizada, y puede referirse al número de cheque, al número de autorización de la tarjeta de crédito, o bien en el caso del SPEI a una cosa que se llama "clave de rastreo" de la cual hablaremos en la tercera entrega de la serie, en general este valor puede ser cualquier numero que el banco asigne como identificador de la operación. Este valor no aplica para las formas de pago no bancarizadas.
  • Si el pago es bancarizado, entonces tendremos 2 datos adicionales: RFC del banco de donde salen los fondos y RFC del banco donde se ingresan los fondos, este dato es un poco extraño, pero por eso creamos una nueva versión de nuestro programa CiberCAT que contiene un nuevo catálogo que incluye el RFC de todas las entidades bancarias y de crédito así como una cosa llamada "Clave Banxico" que sabrás para que sirve en la tercera entrega de esta serie.
  • Igualmente, para los pagos bancarizados, tenemos que indicar también la cuenta desde donde salen los fondos y la cuenta en donde se depositan los fondos, para ello sugerimos utilizar la CLABE (CLAve Bancaria Estandarizada) de las cuenta ya que el schema de este atributo indica que debe tener por lo menos una longitud mínima de 9 dígitos y no todos los bancos tienen la misma longitud en el número de cuenta, por ejemplo  Banamex tiene 7, por lo que hay que rellenar con ceros o bien, usar la CLABE que siempre tiene 18 digitos fijos, sin importar el tipo de cuenta o banco que sea.
Ahora viene la parte complicada, que es cuando nos pagan con un SPEI, hasta el momento de escribir este artículo toda la información que voy a comentar a continuación esta indicada como OPCIONAL en el complemento de pagos, desconozco si a partir del 1 de Septiembre será obligatoria.

En esta entrega comentaré a grandes rasgos de que trata esta información a reserva de entrar en detalle en la tercera entrega.
  • Tipo de Cadena de pago, solo existe una, cuyo valor es 01 y que indica que se recibió un pago por medio de un SPEI, si este atributo se utiliza, FORZOSAMENTE debes completar los siguientes atributos
  • Certificado de pago, es un archivo .CER que hay que incluir en el complemento
  • Cadena de Pago, es una cadena original que viene en el CEP (Comprobante Electronico de Pago) que se obtiene del Banco de México (Banxico)
  • Sello de Pago, también viene en el CEP y también se obtiene de Banxico.
Estos valores representan un verdadero dolor de cabeza, porque hay que realizar un proceso bastante engorroso para obtenerlos, hablaremos de ello en la tercera entrega de la serie.
Para finalizar hablaremos de el segundo componente del complemento de pagos que son las facturas que se pagan con el REP y que también se les conoce como "documentos relacionados", que como indique anteriormente, no debe confundirse con los otros documentos relacionados, los del nodo <cfdi:Comprobante>.

Cada pago puede amparar la liquidación parcial o total de una o mas facturas, y en esta sección es donde pondremos la información de las facturas que se pagan y se repetirá tantas veces como facturas amparen el pago recibido.

Los datos que deberemos indicar son:
  • UUID del documento que estamos pagando.
  • Serie y folio del mismo
  • Tipo de cambio y Moneda utilizada para representar los importes de los documentos, esto es muy importante cuando la factura se pague en una moneda distinta a la cual se emitió, trataremos esto con mas profundidad en la cuarta entrega de la serie
  • Método de pago del documento que se paga, que tiene que ser PPD 
  • Número de parcialidad, este valor es importante, porque una factura puede ser cubierta en 1 o en "n" pagos, en este atributo vamos a registrar el número de pago que se está realizando, si la factura se liquida en su totalidad con el pago entonces tendrá el valor de 1, si es el segundo, tercero u otro pago, pondremos el numero del valor correspondiente.
  • Importe del saldo anterior. Si la factura no fue cubierta en su totalidad con un pago previo, aqui tendremos que indicar cuanto queda pendiente por liquidar de la factura
  • Importe del pago, donde deberemos de indicar cuanto estamos abonando a la factura, recordemos que un solo pago puede amparar el pago total o parcial de varias facturas.
  • Importe del saldo insoluto: si el importe del pago no alcanza para cubrir el importe de la factura, entonces deberemos indicar el saldo pendiente de cubrir de la factura, este valor se convertirá en el Importe del saldo anterior en el próximo comprobante de pago que aplique a la factura que esta siendo pagada.
 Esto es a grandes rasgos el marco teórico del REP o CFDI con complemento de pagos 1.0, en las próximas entregas hablaremos con mas profundidad de la parte técnica y de otros aspectos a tomar en cuenta para que puedas cumplir con tu obligación de emitir REPs perfectamente.

En la próxima entrega trataremos las funciones que tiene VirtualXML para la generación de REPs y te invito a que nos plantees tus dudas aquí abajo, en los comentarios de estos artículos, mismas dudas que trataremos de resolver en la cuarta entrega de esta serie.

jueves, 19 de abril de 2018

(VirtualXML y VXMLTools) Los M@LD1T0$ validadores de CFDI 3.3

La validación de documentos XML de CFDI por medio de programas validadores externos siempre ha sido un tema que en lo personal me choca bastante.

Un CFDI lleva medidas de seguridad muy avanzadas (en algún otro artículo explicaré la complejidad de los sellos digitales), por lo que es complicado falsificar, modificar o cambiar algo dentro un XML sin que se afecte su integridad, sin embargo, bajo la desconfianza vive la seguridad y por eso muchas empresas, con la mejor intención por parte de sus departamentos de contabilidad contratan o desarrollan servicios de "validación" de CFDI.

¿ Usar estos validadores garantiza algo ?

Pues no lo tengo yo muy claro, bueno si, garantiza un ingreso económico a la empresa que desarrolló el validador, porque desde mi punto de vista, un validador de CFDI 3.3 es tan útil como una heladería en el polo norte.

Tanto el SAT desde su página de generación de factura, como los PACs que certifican los documentos han pasado un montón de auditorías, revisiones, validaciones, etc, a fin de que los documentos por ellos emitidos cuenten con los mas estrictos mecanismos de seguridad que garanticen que un XML de CFDI es infalsificable.

Comentando esto con un cliente, me cuenta su inquietud....

¿ Y que pasa si el emisor genera un CFDI, firma, sella y timbra el XML correctamente ante el PAC y una vez que el XML tiene el timbre fiscal digital, el emisor lo altera, cambia importes, totales, etc. e incluso me genera un PDF sobre los datos falseados y no sobre los datos originales o que pasa si el emisor canceló el CFDI y me lo entrega cancelado ?

Existen 3 formas de validar un CFDI sin recurrir necesariamente a un validador y que garantizan que no te den gato por liebre con tu Comprobante Fiscal, veamos cuales son:

1) El CBB (QRCode o Código de Barras Bidimensional) que viene impreso en el PDF.

Todo el mundo lo ve, el SAT lo exige impreso, pero la mayoría de las personas no saben para que sirve.

El CBB impreso en el PDF te permite validar que tu documento se encuentre registrado en los controles del SAT.

Es muy fácil utilizarlo, simplemente descarga una APP en tu teléfono que lea códigos de barras, hay muchas gratuitas, mi favorita es I-NIGMA, que la encuentras para Android y para IOs y no tiene costo.

Estos "scanners" de código de barras utilizan la cámara de tu teléfono celular para leer e interpretar el contenido del CBB, en el caso del CBB de un CFDI, la información contenida es una liga a la página de internet del SAT donde puedes validar si un documento está registrado en los controles del SAT.

La información del contenido del CBB está documentada en el Anexo 20 del CFF y esta compuesto de:


Como verás, dentro de los datos necesarios debes de incluir el total del comprobante, por lo tanto, el CBB te permite validar que tu documento haya sido emitido con el total correcto y con los RFCs correctos tanto de emisor como de receptor.

Algunos lectores de código de barras bidimensiones, como el I-NIGMA te permiten además abrir la URL desde el navegador del teléfono para que puedas validar en línea que tu documento se encuentra en los registros del SAT, solo tienes que proporcionar el CAPTCHA de la página para validar el documento:


Si el documento se encuentra debidamente registrado en los controles del SAT, te aparecerá la pantalla correspondiente, ahí podrás validar que el total del documento sea correcto, así como que el documento se encuentre vigente y no cancelado:

 
El uso del CBB no garantiza realmente que el documento recibido sea válido por muchas razones, la primera consiste en que el CBB se puede generar externamente, incluso desde muchas páginas de internet, por otro lado, el código de barras viene en el documento impreso, no en el XML, con lo cual no se tiene una constancia real de que el XML que se recibió sea correcto, lo único que sabemos, si la validación fue correcta, es que el documento está en los registros del SAT y en que estado se encuentra, lo cual no nos sirve de mucho  

2) Descargar del SAT el documento original:

Una segunda manera de validar que nuestro emisor nos haya entregado un XML válido y correcto es descargar desde la página del SAT TODOS los XMLs que el SAT tenga registrados y compararlos con los que nuestro emisor nos entregó.

Aunque la forma correcta de hacerlo es manualmente y uno por uno desde el portal del SAT, muchos nos las hemos ingeniado para hacer las descargas masivas desde el portal del SAT.

En nuestro caso desarrollamos VXMLTools que les permite descargar a nuestros emisores VirtualPAC todos sus XMLs, tanto emitidos como recibidos, desde el portal del SAT de una manera automatizada y ordenarlos dentro de su disco duro.



VXMLTools te permite descargar tanto XMLs emitidos por tí como recibidos, ordenarlos por año y mes en tu disco duro y generar los PDFs a partir de los XMLs, así como generar informes en Excel para poder analizar tus XMLs descargados.

VXMLTools merece mención a aparte por lo que dedicaré un artículo por separado para explicar todas sus características. El producto se encuentra en fase de pruebas beta, por lo que te invito a probarlo, puedes DESCARGAR VXMTOOLS DESDE AQUI, su uso es gratuito para nuestros emisores VirtualPAC, solo requieres la clave CIEC que el emisor utiliza para entrar al portal del SAT y que el emisor tenga por lo menos un saldo de 50 timbres disponibles. El uso de VXMLTools NO CONSUME TIMBRES, pero para garantizar que el producto lo usen nuestros clientes gratuitamente pedimos que tengan un pequeño saldo disponible. Si quieres usar la herramienta con cualquier emisor que no timbre con VirtualPAC, simplemente dalo de alta en tu lista de emisores, asignale 50 timbres y está listo para descargar sus CFDIs con VXMLTools.

La versión que descargas en estemomento es una beta final, pero el 1 de Mayo salimos con la versión final de VXMLTools así como una versión para programador, la cual te permitirá integrar VXMLTools en tus programas para descargar tus XMLs desde la página del SAT, desde una linea de comandos como un EXE externo.

Descargando los XMLs desde el portal del SAT tendrás la seguridad de que tus XMLs son los correctos.

3) Usar las funciones de VirtualXML para validar tu documento.

Finalmente y si las 2 opciones anteriores no te son suficientes para validar tu documento, te ofrecemos el validador "de la casa".

Dentro de la última versión de VirtualXML (Marzo 2018), incluímos 2 funciones muy prácticas que te permiten "validar" si tus CFDI son válidos.

La primer función es:

 VirtualXML_ConsultaEstadoCFDI(RFCEmisor, RFCReceptor, Total, UUID, OutLog)

Esta función realiza EXACTAMENTE la misma validación que si leyeras el código de barras bidimensional de un PDF, se conecta al servcio de validación del SAT, y revisa si el XML que indicaste en el parametro UUID exista en los registros del SAT.

El resultado de la función se almacena en un archivo de texto que indique en el parámetro OutLog.

La documentación completa de la función la encuentras HACIENDO CLICK AQUI.

La segunda función es la joya de la corona:

VirtualXML_ValidaCFDITimbrado(Xml, OutLog, csdPAC, CheckSAT)

Esta función realiza la misma validación que el SAT solicita a los PACs que realicen antes de emitir el timbre fiscal digital y es la misma validación que realizaba el validador de forma y sintaxis que el SAT tenía para la versión 3.2, solo que esta función opera para CFDI 3.3, tanto para comprobantes de Ingreso, Egreso, Nomina y Pago y con cualquier complemento.

La función basa su operación en la validación de los sellos digitales, dichos sellos digitales se generan a partir de la famosísima "cadena original", esta función genera la cadena original a partir del XML, genera el digesto usando el algoritmo SHA-256  y luego "desencripta" el sello digital del documento usando el certificado incluido en el XML, el resultado de la desencriptación debe ser un digesto igual al que la función generó.

Adicionalmente, también puede validar que el sello digital del timbre fiscal sea válido, esto lo hace usando el archivo .CER que el SAT le proporcionó al PAC como CSD para sellar los timbres fiscales, si no cuentas con él, puedes descargarlo desde la página del SAT, indica el nombre del archivo .CER en el parámetr csdPAC.

Y finalmente, esta función además incluye una llamada interna a la función VirtualXML_ConsultaEstadoCFDI(), lo cual te permite además de validar los sellos del XML, validar si el XML se encuentra dado de alta en los registros del SAT, basta con poner un valor "1" en el parámetro CheckSAT.

Esta función devuelve los resultados de la validación en un archivo de texto cuyo nombre lo indicas en el parámetro OutLog.

La documentación completa de la función la encuentras HACIENDO CLICK AQUI.

Estas funciones las pueden utilizar los emisores de VirtualPAC sin costo, y lo hacen validando el RFC RECEPTOR, que debe estar dado de alta como usuario de VirtualPAC y contar con lo menos con 50 timbres disponibles.

Conclusión:

Para efectos prácticos, un validador de CFDI solo debería de validar que los sellos del comprobante sean válidos, ya que el resto de los valores validables ya han sido revisados por el PAC.

El SAT no autoriza, reconoce o certifica ningún servicio de validación de XMLs, la única validación de facturas electrónicas con fundamente legal y reconocimento fiscal es la que realizan los PACs (Artículo 29, fracciones IV y VI del CFF).

Así que no debe existir pretexto de los receptores para no recibir un CFDI porque "no pasó en mi validador", el CFDI esta timbrado y se encuentra en los registros del SAT es totalmente válido.

jueves, 8 de febrero de 2018

(VirtualXML) ¿ Qué pasa con la mercancía exenta y los impuestos ?

Una de las dudas que mas me preguntan sobre el nuevo CFDI 3.3, es como manejar el tema de los productos que no generan impuestos.

Analicemos un poco el trasfondo de estos productos para poder aclararnos mas sobre este tema.

En México existen 2 tipos de productos que no generan impuestos:
  • Los productos EXENTOS de impuestos
  • Los productos con impuestos tasa 0%

Esta es una pregunta que me hacen muy frecuentemente .... ¿ que diferencia hay entre un producto que esta exento de impuestos y un producto de tasa 0% de impuesto ?

No soy contador ni fiscalista (Dios me ampare), pero hasta donde tengo entendido, corrijanme los que sepan, la diferencia consiste en que los productos que están EXENTOS, son productos de primera necesidad como son agua (no embotellada), frutas, verduras, carnes, etc. donde el productor  no paga impuestos al consumo por sus insumos (entiendase IVA), y tampoco cobra  estos impuestos por la venta de los mismos.

En el caso de los productos con tasa 0%, son productos de primera necesidad, como medicamentos, alimentos procesados de la canasta básica, libros, etc. donde el fabricante SI PAGA IMPUESTOS AL CONSUMO (IVA) por sus insumos, maquinaria, transporte, etc, pero por fabricar productos de primera necesidad NO COBRA impuestos al consumo, como es de esperarse, estas empresas SIEMPRE tienen saldo a favor de IVA en sus declaraciones anuales (Bimbo, Del Valle, Bayer, Pfizer, etc.).

Una vez entendido porque hay productos exentos de impuestos y otros con tasa 0%, podemos proceder a enteder como expresar estos impuestos dentro de un CFDI 3.3.

Como bien sabemos, en el CFDI 3.3 cada concepto debe llevar su desgloce de impuestos, asi pues, cuando nosotros ponemos un concepto en un comprobante CFDI 3.3, deberemos expresar el monto de sus impuestos de la siguiente forma:

<cfdi:Concepto ClaveProdServ="32121704" 
                NoIdentificacion="MO 278557" 
                Cantidad="1" 
                ClaveUnidad="H87" 
                Unidad="PZA" 
                Descripcion="INTERRUPTOR MOELLER"     
                ValorUnitario="123.26" 
                Importe="123.26">
   <cfdi:Impuestos>
      <cfdi:Traslados>
         <cfdi:Traslado Base="123.26" 
                        Impuesto="002" 
                        TipoFactor="Tasa" 
                        TasaOCuota="0.160000" 
                        Importe="19.72" />
      </cfdi:Traslados>
   </cfdi:Impuestos>
</cfdi:Concepto>

Observamos que cada concepto tiene su nodo de impuestos, y dentro de estos, en este caso Traslados, tenemos una Base, una clave para el Impuesto, un Tipo de Factor, una Tasa o Cuota y un Importe.

También recordemos que después de todos los conceptos viene un nodo de impuestos, donde se resumen los importes de los impuestos de todos los conceptos y que es algo similar a esto:

<cfdi:Impuestos TotalImpuestosTrasladados="19.72">
   <cfdi:Traslados>
      <cfdi:Traslado Impuesto="002" 
                     TipoFactor="Tasa" 
                     TasaOCuota="0.160000" 
                     Importe="19.72"/>
      </cfdi:Traslados>
</cfdi:Impuestos>

¿ Que pasa cuando el producto que quiero facturar está exento o tiene tasa 0% ?

Son dos casos que tenemos que tratar de manera diferente porque se manejan de manera distinta.

Primer caso: Producto con Tasa 0%:

Retomemos el ejemplo anterior para un producto que este grabado con Tasa 0%:

<cfdi:Concepto ClaveProdServ="32121704" 
                NoIdentificacion="ASPBY"
                Cantidad="2" 
                ClaveUnidad="H87" 
                Unidad="PZA" 
                Descripcion="Aspirina Bayer 150 Mg"     
                ValorUnitario="50.00" 
                Importe="100.00">
   <cfdi:Impuestos>
      <cfdi:Traslados>
         <cfdi:Traslado Base="100.00" 
                        Impuesto="002" 
                        TipoFactor="Tasa" 
                        TasaOCuota="0.00000" 
                        Importe="0.00" />
      </cfdi:Traslados>
   </cfdi:Impuestos>
</cfdi:Concepto>
En este caso estamos tratando con un producto grabado con tasa 0%, observa por favor que el nodo <cfdi:Impuestos> existe con todos sus datos: Base, Clave del Impuesto, Tipo de Factor, Tasa o Cuota e Importe, y observa además que la tasa o cuota es 0.00000 y por lo tanto el importe es 0.00.

¿ Si el producto no causa impuestos estoy obligado a poner que causa 0.00 de impuesto ?, pues va a ser que SI, el cálculo para los productos que causen impuesto tasa 0% SIEMPRE DEBE DE INCARSE, aunque su importe sea 0.00 esto para indicar que estoy facturando uno o varios productos que causan Tasa 0%.

Supongamos que solo he facturado un producto y este producto tiene tasa 0%, ¿ Que pasa entonces con el resumen de impuestos ?, pues aunque parezca ridículo, la sección de impuestos del CFDI debe de ir especificando los impuestos correspondientes:

<cfdi:Impuestos TotalImpuestosTrasladados="0.00">
   <cfdi:Traslados>
      <cfdi:Traslado Impuesto="002" 
                     TipoFactor="Tasa" 
                     TasaOCuota="0.000000" 
                     Importe="0.00"/>
      </cfdi:Traslados>
</cfdi:Impuestos>
¿ Tengo que poner una sección de impuestos donde sus valores van en 0 ?, la respuesta es: SI.

En este ejemplo asumimos que solo facturamos un producto con Tasa 0%, pero ¿ que pasa si en nuestra factura van otros productos que causan el IVA normal del 16% ?.

No pasa absolutamente nada, simplemente se expresan los impuestos de los productos que causen el 16% Y ADEMAS se incluye el nodo de los impuestos que causen tasa 0%:

<cfdi:Impuestos TotalImpuestosTrasladados="19.72">
   <cfdi:Traslados>
      <cfdi:Traslado Impuesto="002" 
                     TipoFactor="Tasa" 
                     TasaOCuota="0.160000" 
                     Importe="19.72"/>
      </cfdi:Traslados>
      <cfdi:Traslado Impuesto="002" 
                     TipoFactor="Tasa" 
                     TasaOCuota="0.000000" 
                     Importe="0.00"/>
      </cfdi:Traslados>
</cfdi:Impuestos>
El proceso de validación va a checar que exista el nodo con valor 0.00 si facturaste algun producto con tasa 0%, si no lo pusiste, te va a rechazar el documento.

¿ Para que sirve esto ?, bueno, es simplemente para informar al SAT que estas facturando prductos que tienen impuesto Tasa 0% aunque en realidad estos no alteren los totales del comprobante.

Segundo caso: Productos EXENTOS de impuesto.

Para este segundo caso la cosa es mas sencilla aún, veamos como tenemos que expresar un producto exento de impuesto en el nodo <cfdi:Concepto>:

<cfdi:Concepto ClaveProdServ="32121704" 
                NoIdentificacion="JTSLD"
                Cantidad="1" 
                ClaveUnidad="H87" 
                Unidad="KILO" 
                Descripcion="Jitomate Saladet"     
                ValorUnitario="50.00" 
                Importe="50.00">
   <cfdi:Impuestos>
      <cfdi:Traslados>
         <cfdi:Traslado Base="50.00" 
                        Impuesto="002" 
                        TipoFactor="Exento"/>
      </cfdi:Traslados>
   </cfdi:Impuestos>
</cfdi:Concepto>
Observa como dentro del nodo impuestos tenemos la Base, la Clave del Impuesto, pero en el Tipo de Factor tenemos el tercer valor posible además de "Tasa" y "Cuota" que es "Exento", cuando la palabra Exento aparece en el atirbuto TipoFactor, NO DEBEN APARECER LOS ATRIBUTOS TasaOCuota NI Importe.

Esto tiene su razón de ser: el producto esta Exento de impuesto, por lo tanto no tiene una Tasa o Cuota (no es 0.00, es exento), y al no tener una Tasa o Cuota tampoco se le puede calcular Importe, esto es MUY IMPORTANTE a tomar en cuenta ya que si solo estoy facturando productos EXENTOS de impuesto entones el nodo <cfdi:Impuestos> donde va el resumen de impuestos NO DEBE EXISTIR., no es aque vaya con importes 0.00, es que simplemente la factura no lleva impuestos y por lo tanto el nodo que resume los impuestos no tiene que ir en el CFDI.

Ahora bien, si dentro de tu factura, además de productos exentos, estás facturando productos Tasa 0% o Tasa 16% SI DEBE DE EXISTIR EL NODO <cfdi:impuestos> donde tendrás que expresar el total de impuestos trasladados para los productos que llevan tasa 16, y desglosar los calculos de los impuestos como se hace en una factura normal.

Es algo enrredoso y complicado el tema de este tipo de productos, pero seguramente con este artículo te aclararás en la forma correcta de manejar los productos Exentos de impuestos y con Tasa 0%.

viernes, 2 de febrero de 2018

(VirtualXML) El problema de los descuentos con importe $0.00

No cabe duda que desde que estamos en CFDI 3.3 nos hemos vuelto mucho mas ordenados en hacer las cosas, seamos sinceros, los modelos de facturación electrónica anteriores al 3.3 te permitían hacer lo que te diera la gana donde te diera la gana, y aun así funcionaba.

El modelo 3.3 es, desde mi punto de vista, mucho mejor al ser mas restrictivo, de una manera u otra nos ayuda a tener orden y disciplina al momento de hacer un CFDI.

Traemos arrastrando muchos vicios de los modelos anteriores y uno de ellos es el que nos ocupa en esta ocasión: la manía de poner 0.00 cuando no tenemos un valor para un atributo que tenga que llevar un importe monetario, otro vicio que tienen algunos usuarios es NO PONER LOS DECIMALES, cuando hay que expresar un importe "123." o "123" no son valores válidos cuando estamos hablando de importes, ya que por eso el SAT publicó un catálogo de monedas con el numero de decimales que deben llevar..... sigan las instrucciones por favor.

Pues bien, lamento informarles que ya no es válido ni fácil utilizar valores 0.00 en CFDI 3.3, ya que la idea es que estos valores no existan, así como tampoco los valores negativos.

Si leiste mi artículo: Como facturar artículos con importe cero (0.00), entonces te darás cuenta de que meter importes con el valor de 0.00 se complica en CFDI 3.3

Hay un valor en específico en el que muchos de nuestros usuarios tienen la costumbre de llenar con un valor de 0.00 y es el  atributo DESCUENTO en la sección de <cfdi:Comprobante>  (Funcion VirtualXML_SetComprobanteInfo_cfdi33()), o bien poner 0.00 en el descuento de un concepto.

Si tu pones un valor de 0.00 en el atributo descuento del CFDI lo mas seguro es que cuando intentes timbrar obtengas un error : "El TipoDeComprobante no es I,E o N, y un concepto incluye el campo descuento."

¿ A que se refiere este error ?

Es muy importante tomar el cuenta que el PAC realiza una revisión casi policiaca del comprobante CFDI antes de timbrarlo ( para que luego venga un estúpido validador externo a decir que el CFDI esta mal, pero bueno eso lo trataré en otro artículo); dentro de esta revisión, el proceso de validación verifica si existe un atributo "descuento" en el nodo <cfdi:Comprobante>, si existe, entonces la validación asume que por lo menos un concepto va a tener también atributo descuento, la validaciónn VA A REVISAR LA SUMA DE LOS DESCUENTOS, no importa si le pusiste 0.00, la validación va a buscar mas descuentos en los conceptos y si no los encuentra va a reportar el error antes mencionado.

Lo mismo pasa si omites el atributo descuento en <cfdi:Comprobante> pero lo pones en el concepto con importe 0.00, la validación encuentra un valor de descuento en un concepto, pero no lo encuentra en nodo <cfdi:Comprobante> y en ese momento reporta el error.

¿ Como lo soluciono ?

Pues como diría mi abuela.... o todos coludos, o todos rabones, si tu factura no tiene descuentos NO PONGAS LOS ATRIBUTOS DESCUENTO, ni en <cfdi:Comprobante> ni en los nodos concepto (todos coludos), o bien, si los quieres poner con valor 0.00 entonces asegurate que pongas el atributo descuento = "0.00" tanto en el nodo <cfdi:Comprobante> y que tus conceptos también tengan el atributo descuento="0,00" (todos rabones).

Espero que este artículo te sirva para solucionar cualquier complicación con el tema de los descuentos con valor 0.00