Cancelación de facturas CFDI 4.0
-
Crear la rama feat_cancel_move que dependa de la rama feat_odoo_15
-
En el archivo
l10n_mx_facturae/models/account_move.py
en el objeto account.move Crear un campo boleano llamado is_cancelable -
En la vista de formulario de la factura debe existir el campo is_cancelable, este deberá estar oculto y ubicado en el header donde se encuentran todos los botones de la factura
-
Crear un botón llamado Cancelar CFDI que mande a llamar una función l10n_mx_action_cancel
-
Agregar botón a la vista de formulario de la factura, este estará ubicado en el header de la vista donde están los demás botones de la vista
-
Este botón debe visualizarse cuando el campo state sea igual a "posted" y el campo cfdi_state sea igual a "done"
-
La función l10n_mx_action_cancel debe poner en true el campo boleano is_cancelable y ejecutar un ciclo validando que hay facturas con folio fiscal y que no estén en borrador o cancelado cómo aquí https://gitlab.openpyme.mx/l10n_mx/l10n_mx_facturae/-/blob/master/l10n_mx_facturae/models/account_invoice.py#L321
-
Dentro del for se debe mandar un mensaje al chatter "Solicitud de cancelación enviada" posteriormente mandar a consultar el estado de la factura
cancelacion = invoice.cancel_cfdi()[0]
- Posteriormente agregar las siguientes condiciones
if cancelacion:
# CFDI cancelled (cancelacion == True) must cancel invoice too
invoice.button_draft()
invoice.button_cancel()
elif cancelacion is None:
# CFDI set to approval (cancelacion == None) must set invoice
# to waiting too
invoice.write({"state": "waiting"})
elif cancelacion is False:
# CFDI cancel denied (cancelacion == False) must get back invoice
# to open state
self.undo_waiting_state()