86 lines
3.3 KiB
Python
86 lines
3.3 KiB
Python
import uuid
|
|
from celery import shared_task
|
|
from datetime import date, timedelta
|
|
from infrastructure.paperless_client import PaperlessGateway
|
|
from core.utils import format_currency, parse_iso_date
|
|
from django.contrib.auth import get_user_model
|
|
import logging
|
|
from decimal import Decimal
|
|
from modules.crm.models import Client
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class InvoiceService:
|
|
@staticmethod
|
|
def create_full_invoice(*args, **kwargs):
|
|
from modules.invoicing.services import InvoiceService as _InvoiceService
|
|
return _InvoiceService.create_full_invoice(*args, **kwargs)
|
|
|
|
@shared_task(bind=True, max_retries=3)
|
|
def process_paperless_document_task(self, document_id):
|
|
"""
|
|
Celery zadatak koji povezuje infrastrukturu i poslovnu logiku.
|
|
"""
|
|
gateway = PaperlessGateway() # rename so we don't overwrite 'client'
|
|
|
|
try:
|
|
User = get_user_model()
|
|
# 1. Dohvat iz infrastrukture
|
|
raw_data = gateway.get_document_metadata(document_id)
|
|
raw_created = parse_iso_date(raw_data.get("created"))
|
|
correspondent_name = raw_data.get("correspondent")
|
|
|
|
# pokušaj dohvatiti crm klijenta
|
|
try:
|
|
crm_client = Client.objects.get(name=correspondent_name)
|
|
except Client.DoesNotExist:
|
|
logger.error(f"Klijent {correspondent_name} nije pronađen!")
|
|
# Kreiramo fallback klijenta ali popunimo UNIQUE polja jedinstvenim vrijednostima
|
|
unique_email = f"client+{uuid.uuid4()}@example.test"
|
|
unique_tax_id = str(uuid.uuid4())
|
|
crm_client, created = Client.objects.get_or_create(
|
|
name=correspondent_name,
|
|
defaults={
|
|
"email": unique_email,
|
|
"tax_id": unique_tax_id,
|
|
}
|
|
)
|
|
if created:
|
|
logger.info(f"Fallback klijent kreiran za '{correspondent_name}' (id={crm_client.id}).")
|
|
|
|
# 2. Transformacija i čišćenje podataka
|
|
total_raw = raw_data.get("total_amount", "0")
|
|
try:
|
|
amount_decimal = Decimal(str(total_raw))
|
|
except Exception:
|
|
amount_decimal = Decimal("0")
|
|
|
|
processed_data = {
|
|
"client": crm_client,
|
|
"invoice_number": raw_data.get("invoice_number") or raw_data.get("correspondent"),
|
|
"due_date": (raw_created or date.today()) + timedelta(days=30),
|
|
"amount": amount_decimal,
|
|
"created_at": raw_created,
|
|
}
|
|
|
|
lookup_field = User.USERNAME_FIELD
|
|
system_user = User.objects.filter(**{lookup_field: "bot@erp.hr"}).first()
|
|
|
|
if not system_user:
|
|
system_user = User(**{lookup_field: "bot@erp.hr"})
|
|
system_user.email = "bot@erp.hr"
|
|
system_user.first_name = "Paperless"
|
|
system_user.last_name = "Bot"
|
|
system_user.set_unusable_password()
|
|
system_user.save()
|
|
|
|
# Pozovi servis uvijek nakon što garantujemo da system_user postoji
|
|
InvoiceService.create_full_invoice(user=system_user, **processed_data)
|
|
|
|
logger.info(f"Dokument {document_id} uspješno obrađen.")
|
|
|
|
except Exception as exc:
|
|
logger.error(f"Greška pri obradi dokumenta {document_id}: {exc}")
|
|
# Automatski retry ako padne
|
|
raise self.retry(exc=exc, countdown=60) |