"""StatementPeriodAdjustmentBatchCriteria Marshmallow schema.""" from abacus_common_logic.marshalling.custom_fields import ma from marshmallow import ValidationError, validate, validates_schema from royalties.constants.constants import PAYMENT_SCHEDULES from royalties.constants.error import ( ERROR_INVALID_CRITERIA_DUPLICATE_PAYMENT_ENTITIES, ERROR_INVALID_CRITERIA_DUPLICATE_PAYMENT_SCHEDULES, ERROR_MUST_CONTAIN_AT_LEAST_ONE_VALUE, ) class StatementPeriodAdjustmentBatchCriteriaJsonSchema(ma.Schema): """Schema for statement_period_adjustment_batch_criteria json.""" reference_payment_entities = ma.List( ma.NonNegativeInteger(), required=True, validate=validate.Length( min=1, error=ERROR_MUST_CONTAIN_AT_LEAST_ONE_VALUE.format( 'reference_payment_entities' ), ), ) payment_schedules = ma.List( ma.Enum(options=PAYMENT_SCHEDULES), required=True, validate=validate.Length( min=1, error=ERROR_MUST_CONTAIN_AT_LEAST_ONE_VALUE.format('payment_schedules'), ), ) @validates_schema def validate_fields(self, data, **kwargs): """Validate duplicate values.""" reference_payment_entities = data.get('reference_payment_entities') payment_schedules = data.get('payment_schedules') if reference_payment_entities and len(set(reference_payment_entities)) != len( reference_payment_entities ): raise ValidationError(ERROR_INVALID_CRITERIA_DUPLICATE_PAYMENT_ENTITIES) if payment_schedules and len(set(payment_schedules)) != len(payment_schedules): raise ValidationError(ERROR_INVALID_CRITERIA_DUPLICATE_PAYMENT_SCHEDULES) class StatementPeriodAdjustmentBatchCriteriaBaseSchema(ma.Schema): """Base schema for statement_period_adjustment_batch_criteria.""" batch_criteria = ma.Nested( StatementPeriodAdjustmentBatchCriteriaJsonSchema, required=True ) statement_period_adjustment_file_id = ma.NonNegativeInteger(required=True) class StatementPeriodAdjustmentBatchCriteriaDetailSchema( StatementPeriodAdjustmentBatchCriteriaBaseSchema ): """Schema for statement_period_adjustment_batch_criteria detail.""" statement_period_adjustment_batch_criteria_id = ma.NonNegativeInteger(required=True) class StatementPeriodAdjustmentBatchCriteriaPostSchema( StatementPeriodAdjustmentBatchCriteriaBaseSchema ): """Schema for statement_period_adjustment_batch_criteria POST request.""" pass class StatementPeriodAdjustmentFileAndBatchCriteriaPostSchema(ma.Schema): """Post schema for statement period adjustment file and batch criteria.""" batch_criteria = ma.Nested( StatementPeriodAdjustmentBatchCriteriaJsonSchema, required=True ) file_name = ma.NonemptyString(required=True)