76 lines
2.6 KiB
Python
76 lines
2.6 KiB
Python
from odoo import models, _
|
|
import requests
|
|
import json
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class AccountMove(models.Model):
|
|
_inherit = "account.move"
|
|
|
|
def _send_payment_status_webhook(self):
|
|
"""Send webhook notification when payment status changes"""
|
|
for record in self:
|
|
states = {
|
|
"not_paid": "PENDING",
|
|
"paid": "PAID",
|
|
"cancel": "CANCELED",
|
|
}
|
|
if not record.ref or len(record.ref) == 0:
|
|
_logger.warning(
|
|
f"Skipping webhook for invoice with empty reference (ID: {record.id})"
|
|
)
|
|
continue
|
|
if not record.payment_state or len(record.payment_state) == 0:
|
|
_logger.warning(
|
|
f"Skipping webhook for invoice {record.ref} with empty payment state"
|
|
)
|
|
continue
|
|
if not record.payment_state in states.keys():
|
|
_logger.warning(
|
|
f"Skipping webhook for invoice {record.ref} with unsupported payment state {record.payment_state}"
|
|
)
|
|
continue
|
|
|
|
data = {
|
|
"invoiceId": record.ref,
|
|
"status": states.get(record.payment_state, "UNKNOWN"),
|
|
}
|
|
|
|
webhook_url = (
|
|
self.env["ir.config_parameter"]
|
|
.sudo()
|
|
.get_param("account.api.invoice.state.webhook")
|
|
)
|
|
|
|
try:
|
|
headers = {"Content-Type": "application/json"}
|
|
|
|
response = requests.post(
|
|
webhook_url, data=json.dumps(data), headers=headers, timeout=30
|
|
)
|
|
|
|
if response.status_code == 200:
|
|
_logger.info(
|
|
f"Notificación de pago enviada exitosamente para factura {record.ref}"
|
|
)
|
|
else:
|
|
_logger.warning(
|
|
f"Error al enviar notificación de pago para factura {record.ref}. Status code: {response.status_code}"
|
|
)
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
_logger.error(
|
|
f"Error al enviar notificación de pago para factura {record.ref}: {str(e)}"
|
|
)
|
|
except Exception as e:
|
|
_logger.error(
|
|
f"Error inesperado al procesar notificación de pago para factura {record.ref}: {str(e)}"
|
|
)
|
|
|
|
def _compute_payment_state(self):
|
|
super()._compute_payment_state()
|
|
for record in self:
|
|
record._send_payment_status_webhook()
|