31 lines
1.2 KiB
Python
31 lines
1.2 KiB
Python
from celery import shared_task
|
|
from django.utils import timezone
|
|
|
|
from apps.integrations.odoo.services import OdooInvoiceService
|
|
from apps.invoicing.models import Invoice
|
|
|
|
|
|
@shared_task(bind=True, max_retries=5, default_retry_delay=60)
|
|
def sync_invoice_to_odoo(self, invoice_id):
|
|
"""Synchronize an invoice to Odoo with automatic retry (idempotent)."""
|
|
try:
|
|
invoice = Invoice.objects.get(pk=invoice_id)
|
|
except Invoice.DoesNotExist:
|
|
return
|
|
if invoice.sync_state == Invoice.SyncState.SYNCHRONIZED:
|
|
return # already synchronized; retries must be idempotent
|
|
|
|
invoice.sync_state = Invoice.SyncState.PROCESSING
|
|
invoice.save(update_fields=["sync_state"])
|
|
try:
|
|
result = OdooInvoiceService().sync_invoice(invoice)
|
|
invoice.odoo_invoice_id = result.get("id", "")
|
|
invoice.sync_state = Invoice.SyncState.SYNCHRONIZED
|
|
invoice.synced_at = timezone.now()
|
|
invoice.save(update_fields=["odoo_invoice_id", "sync_state", "synced_at"])
|
|
except Exception as exc:
|
|
invoice.sync_state = Invoice.SyncState.RETRYING
|
|
invoice.last_error = str(exc)
|
|
invoice.save(update_fields=["sync_state", "last_error"])
|
|
raise self.retry(exc=exc)
|