"""Schemas for LedgerAccountContract.""" from abacus_common_logic.marshalling.custom_fields import ma from marshmallow import ValidationError, validates_schema from ledger.constants.constants import DEFAULT_PAGE_LIMIT, DEFAULT_PAGE_OFFSET from ledger.constants.error import ( ERROR_LEDGER_INVALID_CONTRACT_IDS, ERROR_LEDGER_INVALID_STATEMENT_PERIOD_IDS, ) class LedgerAccountContractPayableBalanceSchema(ma.Schema): """Schema for LedgerAccountContract payable balance.""" account_id = ma.IntegerId(required=True) currency_code = ma.NonemptyString(required=True) payable_balance = ma.Decimal(required=True, as_string=True) class LedgerAccountContractCurrentBalanceSchema(ma.Schema): """GET response of current balance.""" ledger_account_contract_id = ma.IntegerId(required=True) account_id = ma.IntegerId(required=True) contract_id = ma.IntegerId(required=True) current_balance = ma.Decimal(as_string=True) currency_code = ma.NonemptyString() class LedgerAccountContractFilterSchema(ma.Schema): """Schema for LedgerAccountContract filter.""" contract_ids = ma.NonemptyString(allow_none=True) event_names = ma.NonemptyString(allow_none=True) limit = ma.NonNegativeInteger(missing=DEFAULT_PAGE_LIMIT) offset = ma.NonNegativeInteger(missing=DEFAULT_PAGE_OFFSET) statement_period_ids = ma.NonemptyString(allow_none=True) @validates_schema def validate_ids(self, data, **kwargs): """Validate statement_period and contract ids.""" statement_period_ids = data.get('statement_period_ids') contract_ids = data.get('contract_ids') if statement_period_ids is not None: isValid = all( [period_id.isdigit() for period_id in statement_period_ids.split(',')] ) if not isValid: raise ValidationError(ERROR_LEDGER_INVALID_STATEMENT_PERIOD_IDS) if contract_ids is not None: isValid = all( [contract_id.isdigit() for contract_id in contract_ids.split(',')] ) if not isValid: raise ValidationError(ERROR_LEDGER_INVALID_CONTRACT_IDS) class LedgerAccountContractListSchema(ma.Schema): """Schema for LedgerAccountContract list.""" ledger_account_contract_id = ma.IntegerId() account_id = ma.NonNegativeInteger() accounting_period_id = ma.NonNegativeInteger(allow_none=True) amount = ma.Decimal(as_string=True) contract_id = ma.NonNegativeInteger(allow_none=True) currency_code = ma.NonemptyString() date = ma.FormattedDate() ending_balance = ma.Decimal(as_string=True) opening_balance = ma.Decimal(as_string=True) statement_period_id = ma.NonNegativeInteger() transaction_type = ma.NonemptyString()