"""Contract Mechanical Deduction marshmallow schemas.""" from abacus_common_logic.marshalling.custom_fields import ma from marshmallow import ValidationError, validate, validates_schema from abacus_contract.constants.constants import ( MECHANICAL_DEDUCTION_ADMIN_TYPES, MECHANICAL_DEDUCTION_TERRITORIES, 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) ) class MechadminResponseSchema(ma.Schema): """Schema for the `get_mechadmin_for_account` response.""" mechadmin_physical = ma.Boolean(required=True) mechadmin_digital = ma.Boolean(required=True)