"""Pydantic Model For Statement Attachment.""" from datetime import datetime from pydantic import BaseModel from pydantic import ConfigDict from pydantic import field_validator from moneyhub.constants.constants import NumberFormat from moneyhub.constants.constants import RevenueVariant from moneyhub.constants.constants import StatementAttachmentFailureReason from moneyhub.constants.constants import StatementAttachmentFileType from moneyhub.constants.constants import StatementAttachmentStatus from moneyhub.constants.constants import StatementAttachmentType class StatementAttachmentFiltersSchema(BaseModel): """Statement attachment filters.""" transaction_type_group_ids: list[int] | None = None transaction_type_ids: list[int] | None = None exclude_transaction_type_group_ids: list[int] | None = None exclude_transaction_type_ids: list[int] | None = None variant: RevenueVariant | None = None @field_validator( 'transaction_type_group_ids', 'transaction_type_ids', 'exclude_transaction_type_group_ids', 'exclude_transaction_type_ids', mode='before') @classmethod def enforce_unique_ids(cls, values: list) -> list: """Enforce unique ids for each filter. Args: values (list): values to be filtered Returns: list: a list of de-duplicated values """ if values is None: return None return list(dict.fromkeys(values)) class StatementAttachmentDetailSchema(BaseModel): """Statement attachment detail response.""" account_id: int subaccount_id: int | None = None contract_id: int | None = None displayed_file_name: str | None = None file_location: str | None = None file_type: StatementAttachmentFileType number_format: NumberFormat invoice_number: str | None = None statement_attachment_id: int statement_attachment_status: StatementAttachmentStatus statement_attachment_type: StatementAttachmentType failure_reason: StatementAttachmentFailureReason | None = None statement_period_id: int statement_period_ids: str | None = None created_at: datetime created_by: str model_config = ConfigDict(from_attributes=True) class StatementAttachmentInvoiceDetailSchema(StatementAttachmentDetailSchema): """Statement invoice detail response.""" account_name: str model_config = ConfigDict(from_attributes=True) class StatementAttachmentLegacyReportSchema(StatementAttachmentDetailSchema): """Statement invoice detail response.""" filters: StatementAttachmentFiltersSchema | None = None model_config = ConfigDict(from_attributes=True) class StatementAttachmentPutSchema(BaseModel): """Statement attachment PUT request body.""" file_location: str | None = None statement_attachment_status: StatementAttachmentStatus | None = None failure_reason: StatementAttachmentFailureReason | None = None class InternalAttachmentPostSchema(BaseModel): """Statement attachment POST request body.""" file_type: StatementAttachmentFileType file_location: str upload_date: datetime contract_id: int | None = None class StatementAttachmentRegenerateSchema(BaseModel): """Payload for regenerating statement attachments.""" account_id: int | None = None statement_attachment_type: StatementAttachmentType | None = None