Quiero agradecer a nuestro PAC principal DFacturE, por la información y las gráficas que nos ha facilitado para escribir este artículo.
Antes de empezar, revisemos como estamos realizando el proceso de cancelación actualmente, y lo hacemos según el siguiente diagrama:
Bajo el esquema actual un CFDI solo puede tener 2 estados: CANCELADO y VIGENTE; si un CFDI esta VIGENTE luego entonces es CANCELABLE y podemos proceder con una CANCELACION DIRECTA.
Sin embargo, el nuevo esquema de cancelación es un poco mas complejo como veremos mas adelante, pero antes de continuar, debemos saber CUANDO SI se pueden cancelar facturas sin necesidad de "autorización" por parte del receptor, sin importar el monto que ampare dicho comprobante.
Estos son los casos en los que se pueden cancelar los CFDI sin necesidad de una autorización por parte del receptor, ni del proceso de cancelación a través del Buzón Tributario:
- Comprobantes de cualquier tipo (I, E, N, P, T) y cualquier monto y que no hayan pasado mas de 72 horas desde su emisión.
- Comprobantes de Nomina, Egreso, Traslado, Pago y Retención, sin limite de monto ni tiempo.
- El comprobante emitido para contribuyente del Sector Primario.
- El comprobante emitido para contribuyente del Regimen de Incorporación Fiscal (RIF).
- El comprobante fue emitido por un integrante del Sistema Financiero (bancos)
- El comprobante de Ingreso con importe menor a $5,000.00 ANTES DE IMPUESTOS
- El comprobante de Ingreso emitido a través del portal "Mis Cuentas" de la página del SAT.
- El comprobante de Ingreso emitido al publico en general (Rfc generico: XAXX010101000)
- El comprobante de ingreso emitido al un cliente extranjero (Rfc genérico extranjero: XEXX010101000)
Si el CFDI no se encuentra en los supuestos anteriores, o bien ya pasaron mas de 72 horas desde su emisión, para cancelarlos será necesario tomar en cuenta el nuevo esquema de cancelaciones, que gráficamente se presenta así:
Similarmente a como estabamos acostumbrados, el CFDI puede tener 2 estados: CANCELADO y VIGENTE, en el caso de los CFDIs vigentes, en el nuevo esquema de cancelaciones, estos pueden presentar 2 estados: CANCELABLE y NO CANCELABLE.
Para poder considerar un documento como CANCELABLE, este deberá ser de Ingreso, estar vigente, Y NO TENER DOCUMENTOS RELACIONADOS, esto último es muy importante, ya que si existen documentos relacionados al documento que se desea cancelar, el CFDI será NO CANCELABLE, para convertirlo en un CFDI CANCELABLE será necesario cancelar primero los documentos relacionados y posteriormente cancelar el documento original, SE VALIDARA LA EXISTENCIA DE DOCUMENTOS RELACIONADOS AL MOMENTO DE INTENTAR CANCELAR.
Si un documento es CANCELABLE, puede presentar 3 estados:
NO REQUIERE ACEPTACION, en este caso podemos proceder a cancelarlo directamente como lo habíamos venido haciendo hasta el dia de hoy, es decir mediante la función VirtualXML_CancelaUUID().
Un CFDI CON ACEPTACION requerirá realizar una solicitud de cancelación del mismo por 2 vías:
- Buzón tributario del contribuyente en el portal del SAT
- A través de los servicios de un PAC.
Una vez hecha la solicitud por cualquiera de los dos medios mencionados anteriormente, esta será enviada al SAT y el comprobante quedará en el estado de "OPERANDO", que es algo así como el limbo de los comprobantes fiscales, durante el plazo que indica el SAT para aceptar o cancelar el documento que es de 72 horas contadas a partir de la fecha de solicitud de la cancelación.
El estado del CFDI se podrá verificar desde código usando la función VirtualXML_ConsultaEstadoCFDI(), la cual ahora devolverá 3 posibles valores: VIGENTE, CANCELADO y OPERANDO.
Si el receptor ACEPTA la cancelación antes de 72 horas, el documento quedará automáticamente cancelado en los registros del SAT, y deberás utilizar la función de ConsultaEstadoCFDI() para saber si ya pasó del estado de OPERANDO al estado de CANCELADO.
Si después de las 72 horas el receptor explicitamente NO RECHAZA la solicitud de cancelación, el documento quedará cancelado en los registros del SAT y no habrá necesidad de hacer ningún otro procedimiento adicional, a este proceso se le llama "aceptación FICTA o aceptación por plazo vencido", esto minimiza en impacto que nuestros usuarios pudieran tener en sus sistemas, sin embargo, es su responsabilidad el estar revisando constantemente el estado del CFDI hasta que transcurran las 72 horas de plazo.
En caso de que el receptor RECHACE la cancelación del documento y el emisor vuelva a solicitarla, nuevamente tendrá el plazo de 72 horas para manifestarse al respecto, pero en este segundo intento de cancelación, si no hay respuesta por parte del receptor NO SE CANCELARA EL DOCUMENTO, a esto se le llama "rechazo FICTO".
En el caso de que existan documentos relacionados a un CFDI que se quiera cancelar, se deberá seguir el orden inverso para ir cancelado los documentos relacionados ANTES de cancelar el CFDI que los referencie.
Debemos de tener en cuenta que nuestros emisores estan en los dos lados, tanto necesitan cancelar CFDIs como autorizar la cancelación de CFDIs, por ello VirtualXml incluirá 5 funciones para realizar el proceso de cancelación, de momento estos son los PROTOTIPOS de las funciones, aun nos falta pulirlas, ver su lista de parámetros, probarlas e incluirlas en la DLL, NO SON FUNCIONALES NI ESTAN INCLUIDAS EN VIRTUALXML, así que por favor, no pidan documentación, parámetros ni área de pruebas hasta que les informemos que ya están implementadas y que ya hemos liberado una nueva versión de la DLL.
Serán 5 funciones para cancelación, divididas en 2 categorías:
Funciones para cancelar CFDI emitidos:
VirtualXML_ConsultaStatusCFDI() : esta función se utiliza para obtener el estado del CFDI antes de intentar cancelarlo y devolverá los siguientes valores:
- Codigo: 201 Mensaje: Comprobante obtenido satisfactoriamente, Cancelable: Cancelable SIN aceptacion
- Codigo: 211 Mensaje: Comprogante obtenido satisfactoriamente, Cancelable: Cancelable CON aceptacion
- Codigo: 602 Mensaje: Comprobante no encontrado, Cancelable: No
aplica
- Codigo: 215 Mensaje: El UUID no cumple con la estructura
válida, Cancelable: No aplica
- Codigo: 201 Mensaje: UUID Correctamente cancelado
- Codigo: 211 Mensaje: UUID Cancelable con aceptacion
- Codigo: 221 Mensaje: El UUID enviado no tiene un formato valido
- Codigo: 205 Mensaje: El comprobante aun no se encuentra
reportado en el SAT
- Codigo:2000 Mensaje: Se encontraron CFDIs relacionados y un texto con la estructura "padre, UUID,RFCMISOR,RFCRECEPTOR", seguido del texto "hijo,UUID,RFCEMISOR,RFCRECEPTOR"
- Codigo:2001 Mensaje: No existen CFDI relacionados
Funciones para consultar las peticiones recibidas de emisores:
VirtualXML_ConsultaPeticionesPendientes(): Esta función se utiliza para obtener una lista de los UUID que estan pendientes de Autorizar/Rechazar solicitados por nuestros emisores, devuelve los sigientes valroes:
- Codigo: 1001 Mensaje: Una lista con los UUIDS pendientes de Autorizar/Rechazar, uno por renglon
- Codigo: 1101 Mensaje: No hay UUIDs pendientes de cancelar.
- Codigo: 1000, Mensaje: "UUID, Aceptado ó Rechazado" dependiendo si se autorizo o se rechazo la autorización
- Codigo: 1001, Mensaje: "UUID, Rechazado,No existen peticiones de cancelacion en espera"
En los proximos días publicaremos mas información sobre estas funciones a fin de que puedan implementarlas en sus sistemas.
El SAT ha publicado un video donde podrán conocer mas a detalle aspectos relacionados con el nuevo esquema de cancelación:
Una pregunta, supongo que una vez hecha la solicitud de cancelación, si el cliente acepta, queda también Cancelado el documento en SAT,sólo tengo que asegurarme de preguntar a través de la función VirtualXML_ConsultaEstadoCFDI() para poder informar a mi sistema el estatus del CFDI. Es correcto?
ResponderEliminarLa función VirtualXML_ConsultaEstadoCFDI(), según la documentación actual, indica: si existe , si no existe, si esta cancelado o si el servicio no esta disponible. Va a existir un estatus diferente para los que están en estatus de 'OPERANDO'?
Gracias
Se podrá utilizar el executable VirtualXML.exe con un script para la función de la cancelación?
ResponderEliminarVamos a crear una linea de comandos especial para realizar cancelaciones pero primero tenemos que meter las funciones en la DLL.
Eliminar