"""Contract Mechanical Deduction marshmallow schemas.""" from abacus_common_logic.marshalling.custom_fields import ma from marshmallow import validate from marshmallow import validates_schema from marshmallow import ValidationError from abacus_contract.constants.constants import MECHANICAL_DEDUCTION_ADMIN_TYPES from abacus_contract.constants.constants import MECHANICAL_DEDUCTION_TERRITORIES from abacus_contract.constants.constants import MECHANICAL_DEDUCTION_TYPES from abacus_contract.constants.error import ERROR_MECHANICAL_TYPE_CAN_NOT_BE_EMPTY class BaseContractMechanicalDeductionSchema(ma.Schema): """Shared contract_mechanical_deduction fields.""" admin_fee = ma.Decimal( as_string=True, allow_none=True, validate=[validate.Range(min=0, max=100)] ) admin_type = ma.Enum(options=MECHANICAL_DEDUCTION_ADMIN_TYPES, required=True) mechanical_type = ma.List( ma.Enum( options=MECHANICAL_DEDUCTION_TYPES, required=True ), allow_none=False, required=True ) territory = ma.Enum(options=MECHANICAL_DEDUCTION_TERRITORIES, required=True) class ContractMechanicalDeductionDetailSchema(BaseContractMechanicalDeductionSchema): """Schema for contract_mechanical_deduction details.""" contract_id = ma.IntegerId(required=True) contract_mechanical_deduction_id = ma.IntegerId(required=True) class ContractMechanicalDeductionPostSchema(BaseContractMechanicalDeductionSchema): """Schema for contract_mechanical_deduction POST request.""" @validates_schema def validate_mechanical_type_field(self, data, **kwargs): """Validate mechanical_type field.""" mechanical_type = data.get('mechanical_type') if (len(mechanical_type) == 0): raise ValidationError( ERROR_MECHANICAL_TYPE_CAN_NOT_BE_EMPTY ) class ContractMechanicalDeductionPutSchema(ma.Schema): """Schema for contract_mechanical_deduction PUT request.""" admin_fee = ma.Decimal( as_string=True, allow_none=True, validate=[validate.Range(min=0, max=100)] ) admin_type = ma.Enum(options=MECHANICAL_DEDUCTION_ADMIN_TYPES) mechanical_type = ma.List( ma.Enum( options=MECHANICAL_DEDUCTION_TYPES, required=True ) ) @validates_schema def validate_mechanical_type_field(self, data, **kwargs): """Validate mechanical_type field.""" mechanical_type = data.get('mechanical_type') if (mechanical_type is not None and len(mechanical_type) == 0): raise ValidationError( ERROR_MECHANICAL_TYPE_CAN_NOT_BE_EMPTY ) class ContractWorldWideMechanicalDeductionPostSchema(ma.Schema): """Schema for worldwide contract_mechanical_deduction POST request.""" admin_fee = ma.Decimal( as_string=True, allow_none=True, validate=[validate.Range(min=0, max=100)] ) admin_type = ma.Enum(options=MECHANICAL_DEDUCTION_ADMIN_TYPES) mechanical_type = ma.List( ma.Enum( options=MECHANICAL_DEDUCTION_TYPES, required=True ), allow_none=False, required=True ) @validates_schema def validate_mechanical_type_field(self, data, **kwargs): """Validate mechanical_type field.""" mechanical_type = data.get('mechanical_type') if (mechanical_type is not None and len(mechanical_type) == 0): raise ValidationError( ERROR_MECHANICAL_TYPE_CAN_NOT_BE_EMPTY ) class ActiveContractsByDateSchema(ma.Schema): """Schema for active contracts with mechanical deductions by date.""" account_id = ma.NonNegativeInteger(required=True) contract_id = ma.NonNegativeInteger(required=True) term_type = ma.NonemptyString(required=True) attachments = ma.List(ma.String()) mechanical_type = ma.List( ma.Enum( options=MECHANICAL_DEDUCTION_TYPES, required=True ) )