"""Contract term condition marshmallow schemas.""" from decimal import Decimal from abacus_common_logic.marshalling.custom_fields import ma from marshmallow import ValidationError, validate, validates_schema from abacus_contract.constants import error class ConditionsSchema(ma.Schema): """Schema for contract term's nested conditions.""" countries = ma.List(ma.String()) stores = ma.List(ma.String()) transaction_types = ma.List(ma.String()) class ContractTermConditionSchema(ma.Schema): """Contract term condition fields.""" contract_term_condition_id = ma.IntegerId(required=True) contract_term_condition_name = ma.String(required=False) contract_term_id = ma.IntegerId(required=True) conditions = ma.Nested(ConditionsSchema) priority = ma.NonNegativeInteger(required=True) term_rate = ma.Decimal(required=True, as_string=True) commission = ma.Decimal(required=True, as_string=True) class ContractTermConditionVerboseSchema(ContractTermConditionSchema): """Contract Term Condition schema with created and last_modified info.""" created_at = ma.FormattedDateTime() created_by = ma.String() last_modified = ma.FormattedDateTime() last_modified_by = ma.String() class ContractTermConditionPutSchema(ma.Schema): """Contract term condition put schema.""" contract_term_condition_id = ma.IntegerId(required=True) conditions = ma.Nested(ConditionsSchema) priority = ma.NonNegativeInteger() term_rate = ma.Decimal(as_string=True, validate=validate.Range(min=0.0, max=100.0)) commission = ma.Decimal(as_string=True, validate=validate.Range(min=0.0, max=100.0)) contract_term_condition_name = ma.String(required=False) @validates_schema def check_term_rate_and_commission(self, data, **kwargs): """Validate term_rate and commission.""" term_rate = data.get('term_rate') commission = data.get('commission') if (commission is not None and term_rate is not None) and ( (Decimal(commission) + Decimal(term_rate)) != Decimal(100) ): raise ValidationError(error.ERROR_INVALID_TERM_RATE_AND_COMMISSION_TOTAL) class ContractTermConditionPostSchema(ma.Schema): """Contract term condition post schema.""" conditions = ma.Nested(ConditionsSchema) priority = ma.NonNegativeInteger(required=True) term_rate = ma.Decimal(as_string=True, validate=validate.Range(min=0.0, max=100.0)) commission = ma.Decimal(as_string=True, validate=validate.Range(min=0.0, max=100.0)) contract_term_condition_name = ma.String(required=False) @validates_schema def check_term_rate_and_commission(self, data, **kwargs): """Validate term_rate and commission.""" term_rate = data.get('term_rate') commission = data.get('commission') if commission is None and term_rate is None: raise ValidationError(error.ERROR_MISSING_TERM_RATE_AND_COMMISSION) if (commission is not None and term_rate is not None) and ( (Decimal(commission) + Decimal(term_rate)) != Decimal(100) ): raise ValidationError(error.ERROR_INVALID_TERM_RATE_AND_COMMISSION_TOTAL)