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__) @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, } from modules.invoicing.services import InvoiceService 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)