import datetime from typing import List, Literal from enum import Enum from pydantic import BaseModel, Field from ..core.models import CrudDocument, RichtextSingleline, RichtextMultiline, DictionaryEntry class ContractStatus(str, Enum): new = 'new' signed = 'signed' in_effect = 'in_effect' executed = 'executed' class ContractDraftStatus(str, Enum): draft = 'draft' created = 'created' class Party(BaseModel): entity_id: str = Field( foreignKey={ "reference": { "resource": "entity", "schema": "Entity", } } ) part: str representative_id: str = Field( foreignKey={ "reference": { "resource": "entity", "schema": "Entity", } }, default="" ) class ProvisionGenuine(BaseModel): type: Literal['genuine'] = 'genuine' title: str = RichtextSingleline(props={"parametrized": True}) body: str = RichtextMultiline(props={"parametrized": True}) class ContractProvisionTemplateReference(BaseModel): type: Literal['template'] = 'template' provision_template_id: str = Field( foreignKey={ "reference": { "resource": "template/provision", "schema": "ProvisionTemplate", "displayedFields": ['title', 'body'] }, }, props={"parametrized": True} ) class DraftProvision(BaseModel): provision: ContractProvisionTemplateReference | ProvisionGenuine = Field(..., discriminator='type') class ContractDraft(CrudDocument): name: str title: str parties: List[Party] provisions: List[DraftProvision] variables: List[DictionaryEntry] = Field( default=[], format="dictionary", ) status: ContractDraftStatus = Field(default=ContractDraftStatus.draft) location: str = "" date: datetime.date = datetime.date(1970, 1, 1)