dodil/erp-brick-ar

DODIL ERP brick: accounts receivable

src/brick_ar/domain/events.py

"""Domain events: facts the aggregates record as they decide (the use case may publish them; tests read them)."""
from dataclasses import dataclass
from decimal import Decimal
from typing import Optional


@dataclass(frozen=True)
class Event:
    by: str = ""


@dataclass(frozen=True)
class InvoiceRaised(Event):
    invoice_id: str = ""
    source_kind: str = ""
    source_id: str = ""


@dataclass(frozen=True)
class InvoiceIssued(Event):
    invoice_id: str = ""
    invoice_no: str = ""
    total: Decimal = Decimal(0)


@dataclass(frozen=True)
class InvoiceCancelled(Event):
    invoice_id: str = ""


@dataclass(frozen=True)
class InvoiceVoided(Event):
    invoice_id: str = ""
    reason: str = ""


@dataclass(frozen=True)
class InvoiceSent(Event):
    invoice_id: str = ""
    address: str = ""


@dataclass(frozen=True)
class FindingDecided(Event):
    invoice_id: str = ""
    step: str = ""
    decision: str = ""


@dataclass(frozen=True)
class CreditNoteApproved(Event):
    credit_id: str = ""
    credit_no: str = ""
    invoice_id: Optional[str] = None
    total: Decimal = Decimal(0)


@dataclass(frozen=True)
class WriteoffApproved(Event):
    writeoff_id: str = ""
    invoice_id: str = ""
    amount: Decimal = Decimal(0)


@dataclass(frozen=True)
class ScheduleStopped(Event):
    schedule_id: str = ""
    reason: str = ""


@dataclass(frozen=True)
class ScheduleFinished(Event):
    schedule_id: str = ""


@dataclass(frozen=True)
class RunSigned(Event):
    run_id: str = ""