from typing import Type, List from sqlalchemy import and_ from sqlalchemy.orm import foreign from db import db from enum import Enum from models.mixins.searchable import SearchableMixin class PRSPurchaseOrderStatus(Enum): FAILED = 0 UNAPPROVED = 1 REJECTED = 2 RESUBMITTED = 3 REMOVED = 4 RETURNED = 5 APPROVED = 6 PROCESSED = 7 PAYABLE = 8 PARTIALLY_PAID = 9 PAID = 10 PENDING = 11 UNKNOWN = 12 TO_BE_APPROVED = 13 INVOICED = 14 IN_MODIFICATION = 15 INVOICING_STARTED = 16 CLOSED = 17 SENT = 18 @staticmethod def statuses_map(): return { "Payable": PRSPurchaseOrderStatus.PAYABLE, "Partially Paid": PRSPurchaseOrderStatus.PARTIALLY_PAID, "Paid": PRSPurchaseOrderStatus.PAID, "Processed": PRSPurchaseOrderStatus.PROCESSED, "Rejected": PRSPurchaseOrderStatus.REJECTED, "Failed": PRSPurchaseOrderStatus.FAILED, "Returned": PRSPurchaseOrderStatus.RETURNED, "Pending": PRSPurchaseOrderStatus.PENDING, "Approved": PRSPurchaseOrderStatus.APPROVED, "Unapproved": PRSPurchaseOrderStatus.UNAPPROVED, "Resubmitted": PRSPurchaseOrderStatus.RESUBMITTED, "Removed": PRSPurchaseOrderStatus.REMOVED, "To be approved": PRSPurchaseOrderStatus.TO_BE_APPROVED, "Invoiced": PRSPurchaseOrderStatus.INVOICED, "In Modification": PRSPurchaseOrderStatus.IN_MODIFICATION, "Invoicing Started": PRSPurchaseOrderStatus.INVOICING_STARTED, "Closed": PRSPurchaseOrderStatus.CLOSED, "Sent": PRSPurchaseOrderStatus.SENT, } @staticmethod def map_from_str(status: str): statuses_map = PRSPurchaseOrderStatus.statuses_map() return statuses_map.get(status, PRSPurchaseOrderStatus.UNKNOWN) @staticmethod def status_name(status: int): statuses_map = PRSPurchaseOrderStatus.statuses_map() for name, status_id in statuses_map.items(): if status_id.value == status: return name return "Unknown" class PRSPurchaseOrder(SearchableMixin, db.Model): """PRSPurchaseOrder model""" __tablename__ = "PRSPurchaseOrder" __searchable__ = { "name": {"type": "text", "analyzer": "autocomplete", "search_analyzer": "standard"}, "po_number": {"type": "text"}, } id = db.Column(db.BigInteger, primary_key=True) name = db.Column(db.String, nullable=False) po_number = db.Column(db.String, nullable=False) po_line_item = db.Column(db.Integer, nullable=True, server_default="0") total_amount = db.Column(db.Numeric(12, 2), nullable=False) paid_amount = db.Column(db.Numeric(12, 2), nullable=False) total_amount_currency = db.Column(db.String, nullable=False, server_default="USD") paid_amount_currency = db.Column(db.String, nullable=False, server_default="USD") created_date = db.Column(db.Date, nullable=False) last_modified_date = db.Column(db.Date, nullable=False) is_blanked = db.Column(db.Boolean, nullable=False, server_default="FALSE") is_deleted = db.Column(db.Boolean, nullable=False, server_default="FALSE") description = db.Column(db.String, nullable=True) status = db.Column(db.Integer, nullable=False) parent_po_number = db.Column(db.String, nullable=True) project_id = db.Column(db.BigInteger, db.ForeignKey("Project.id", ondelete="CASCADE"), nullable=False) group_id = db.Column(db.BigInteger, db.ForeignKey("PRSBudgetGroup.id", ondelete="CASCADE"), nullable=False) category_id = db.Column(db.BigInteger, db.ForeignKey("PRSBudgetCategory.id", ondelete="CASCADE"), nullable=False) provider_id = db.Column(db.Integer, db.ForeignKey("CampaignProvider.id", ondelete="CASCADE"), nullable=False) is_under_uncommited_blanket = db.Column(db.Boolean, nullable=False) project = db.relationship("Project", foreign_keys=[project_id]) prs_budget_group = db.relationship("PRSBudgetGroup", foreign_keys=[group_id]) prs_budget_category = db.relationship("PRSBudgetCategory", foreign_keys=[category_id]) campaigns = db.relationship("Campaign") moments = db.relationship("ArtistMoment") provider = db.relationship("CampaignProvider", foreign_keys=[provider_id]) child_purchase_orders: List["PRSPurchaseOrder"] = db.relationship( "PRSPurchaseOrder", primaryjoin=and_(po_number == foreign(parent_po_number), project_id == foreign(project_id)), viewonly=True, ) __table_args__ = ( db.UniqueConstraint( "po_number", "po_line_item", "project_id", "group_id", "category_id", name="uq_PRSPurchaseOrder_po_number_project_id", ), ) @classmethod def es_query(cls: Type[db.Model]): return cls.query