Cancel Invoices
¿Qué problema se intenta resolver?
Al ejecutar la acción pĺanificada Invoices pending to cancel no cancela de manera correcta las facturas, ya que en algún punto por alguna factura que esté mal todas las demás tampoco las cancela. Ejemplo tenemos 30 facturas para cancelar, ejecutamos la acción y la factura número 39 tiene algún problema, las 29 restantes no se cancelan.
Fundamentos y/o Información adicional
(Incluye la información adicional que fundamente la necesidad de esta nueva característica)
Propuesta
-
En el archivo /models/account_invoice.py después de la línea 363 se intentaría agregar un try y una excepción utilizando una función llamada savepoint, donde se intentaría guardar un punto de retorno para que cuando una factura llegue a fallar no se pierda el trabajo realizado sobre las demás
-
La primer variable continue que está en el siguiente ejemplo tendría que ser reemplazada por algún mensaje o un message_post, ya que al ejecutarse la función lo más seguro es que no arroje nada, por lo cual es un problema de ergonomía porque a la vista del usuario no se está haciendo nada para esas facturas
for account_invoice in self:
try:
with self.env.cr.savepoint():
status_cancelacion = account_invoice.consult_cfdi_cancellation_status()
if status_cancelacion is None:
continue
elif status_cancelacion is False:
self.undo_waiting_state()
else:
try:
account_invoice.action_cancel()
except Exception as e:
_logger.info(e)
continue
- En el Exception tenemos que considerar que errores vamos a tomar en este caso cachamos todos, ya que no hay un error en específico
for account_invoice in self:
try:
with self.env.cr.savepoint():
status_cancelacion = account_invoice.consult_cfdi_cancellation_status()
if status_cancelacion is None:
continue
elif status_cancelacion is False:
self.undo_waiting_state()
else:
try:
account_invoice.action_cancel()
except Exception as e:
_logger.info(e)
continue
except Exception as e:
- La siguiente parte del Exception es que vamos a mostrarle al usuario y en donde lo mostraremos, por lo tanto, podemos usar el chatter que tiene el objeto para guardar el mensaje de error cómo en el siguiente ejemplo.
for account_invoice in self:
try:
with self.env.cr.savepoint():
status_cancelacion = account_invoice.consult_cfdi_cancellation_status()
if status_cancelacion is None:
continue
elif status_cancelacion is False:
self.undo_waiting_state()
else:
try:
account_invoice.action_cancel()
except Exception as e:
_logger.info(e)
continue
except Exception as e:
account_invoice.message_post(
body=_(
"The invoice %s could not be canceled"
"due to the following error %s."
) % (account_invoice.name, e)
)