"""CSV column definitions and requirements.""" from enum import Enum class CsvColumn(str, Enum): """CSV file column headers. Values are the exact header strings expected in the input CSV. Used as pydantic aliases in ContractRow and for header validation. """ ACCOUNT_ID = 'Account ID' CONTRACT_NAME = 'Contract Name' CONTRACT_TYPE = 'Contract Type' SIGNING_ENTITY = 'Signing Entity' RUN_CONTROLLER = 'Run Controller' EXECUTION_DATE = 'Execution Date' IS_EXCLUDED = 'Is Excluded From Accounting Run' IS_PRIMARY = 'Is Primary Contract' CURRENT_PERIOD_START = 'Current Period Start Date' RENEWAL_RULES = 'Renewal Rules' TERMINATION_INTERVAL = 'Termination Notice Period (Interval)' TERMINATION_TYPE = 'Termination Notice Period (Type)' RENEW_AFTER_INTERVAL = 'Renew After (Interval)' RENEW_AFTER_TYPE = 'Renew After (Type)' CURRENT_PERIOD_END = 'Current Period End Date' COLLECTION_INTERVAL = 'Collection Period (Interval)' COLLECTION_TYPE = 'Collection Period (Type)' class ResultColumn(str, Enum): """Output CSV column headers added to success/failure CSVs.""" CONTRACT_ID = 'Contract ID' STATUS = 'Status' REASON = 'Reason' DRY_RUN_CONTRACT_ID = 'DRY_RUN' class ProcessingStatus(str, Enum): """Status of a contract creation attempt.""" SUCCESS = 'success' DRY_RUN = 'dry_run' ERROR = 'error' class ResultStatus(str, Enum): """Status values written to the output CSV Status column.""" ERROR = 'ERROR' SKIPPED = 'SKIPPED' class SkipReason(str, Enum): """Reasons a row may be skipped during processing.""" ALREADY_PROCESSED = 'Already processed' DUPLICATE_IN_INPUT = 'Duplicate in input file' INVALID_DATA = 'Invalid data or missing required fields' class MissingFieldPolicy(str, Enum): """Policy for handling missing optional fields during build.""" DEFAULT = 'default' # Apply business defaults (today's date, 30-day term, etc.) SKIP = 'skip' # Skip the row entirely REQUIRED_COLUMNS: frozenset[CsvColumn] = frozenset( { CsvColumn.ACCOUNT_ID, CsvColumn.CONTRACT_NAME, CsvColumn.CONTRACT_TYPE, } )