"""Statement Period Adjustment File Marshmallow schema.""" from abacus_common_logic.marshalling.custom_fields import ma from marshmallow import ValidationError, validates_schema from royalties.constants.constants import ( ADJUSTMENT_FILE_SORT_OPTIONS, DEFAULT_PAGE_LIMIT, DEFAULT_PAGE_OFFSET, SORT_ORDER_OPTIONS, STATEMENT_PERIOD_ADJUSTMENT_FILE_BATCH_TYPES, VALID_ADJUSTMENT_FILE_STATUSES, ) class StatementPeriodAdjustmentFilePostSchema(ma.Schema): """Statement Period Adjustment File Post schema.""" batch_type = ma.Enum(options=STATEMENT_PERIOD_ADJUSTMENT_FILE_BATCH_TYPES) file_name = ma.NonemptyString(required=True) valid_file_location = ma.NonemptyString(required=False) invalid_file_location = ma.String(required=False) valid_row_count = ma.NonNegativeInteger(required=False) invalid_row_count = ma.NonNegativeInteger(required=False) total_file_amount_multicurrency = ma.Decimal(required=False, as_string=True) total_rounded_amount_multicurrency = ma.Decimal(required=False, as_string=True) md5sum = ma.String(required=False) error_type = ma.String(required=False) source_file_upload_id = ma.NonNegativeInteger(required=False, allow_none=True) created_by = ma.String(required=False, allow_none=True) class StatementPeriodAdjustmentFileDetailSchema( StatementPeriodAdjustmentFilePostSchema ): """Statement Period Adjustment File Detail schema.""" class Meta: """Meta class for StatementPeriodAdjustmentFileDetailSchema.""" title = 'StatementPeriodAdjustmentFile Detail' statement_period_adjustment_file_id = ma.IntegerId() statement_period_id = ma.IntegerId(required=True) class StatementPeriodAdjustmentFilePutSchema(StatementPeriodAdjustmentFilePostSchema): """Statement Period Adjustment File Put schema.""" class StatementPeriodAdjustmentFileListSchema(ma.Schema): """Statement Period Adjustment File List schema.""" batch_type = ma.Enum(options=STATEMENT_PERIOD_ADJUSTMENT_FILE_BATCH_TYPES) status = ma.NonemptyString(required=True) valid_row_count = ma.NonNegativeInteger(required=False) statement_period_id = ma.IntegerId(required=True) statement_period_adjustment_file_id = ma.NonNegativeInteger(required=True) file_name = ma.NonemptyString(required=True) total_rounded_amount_multicurrency = ma.Decimal(required=False, as_string=True) created_at = ma.FormattedDate(required=True) created_by = ma.NonemptyString(required=True) date_approved = ma.FormattedDate() approved_by = ma.String() date_applied = ma.FormattedDate() applied_by = ma.String() class StatementPeriodAdjustmentFileFilterSchema(ma.Schema): """Statement Period Adjustment File List filter schema.""" created_by = ma.NonemptyString(allow_none=True) file_name = ma.NonemptyString(allow_none=True) statement_period_adjustment_file_id = ma.NonNegativeInteger(allow_none=True) statement_period_id = ma.NonNegativeInteger(allow_none=True) status = ma.NonemptyString(allow_none=True) limit = ma.NonNegativeInteger(missing=DEFAULT_PAGE_LIMIT) offset = ma.NonNegativeInteger(missing=DEFAULT_PAGE_OFFSET) sort_by = ma.Enum( options=ADJUSTMENT_FILE_SORT_OPTIONS, missing=ADJUSTMENT_FILE_SORT_OPTIONS.STATEMENT_PERIOD_ADJUSTMENT_FILE_ID, ) sort_order = ma.Enum(options=SORT_ORDER_OPTIONS, missing=SORT_ORDER_OPTIONS.DESC) @validates_schema def validate_adjustment_file_status(self, data, **kwargs): """Validate the status of adjustment file.""" status = data.get('status') if status: selected_statuses = set(map(str.strip, status.split(','))) invalid_statuses = list( selected_statuses - set(VALID_ADJUSTMENT_FILE_STATUSES) ) if invalid_statuses: raise ValidationError( 'Must be ' + ', '.join(VALID_ADJUSTMENT_FILE_STATUSES) ) class StatementPeriodAdjustmentFileUserListSchema(ma.Schema): """Statement Period Adjustment File User List schema.""" created_by = ma.NonemptyString(required=True) class AdjustmentToValidateSchema(ma.Schema): """Schema for a manual adjustment to validate.""" account_id = ma.NonemptyString(required=True) contract_id = ma.NonemptyString(required=True) upc = ma.NonemptyString(allow_none=True) amount = ma.Decimal(required=True, as_string=True) currency = ma.NonemptyString(required=True) activity_month = ma.NonemptyString(required=True) activity_year = ma.NonemptyString(required=True) statement_month = ma.NonemptyString(required=True) statement_year = ma.NonemptyString(required=True) adjustment_type = ma.NonemptyString(required=True) client_facing_comments = ma.NonemptyString(required=True) distribution_type = ma.NonemptyString(allow_none=True) class ValidateAdjustmentsPostSchema(ma.Schema): """Schema for the POST endpoint to validate adjustments.""" statement_period_id = ma.IntegerId(required=True) adjustments = ma.Nested(AdjustmentToValidateSchema, required=True, many=True) class ValidateAdjustmentsResponseSchema(ma.Schema): """Schema for the response from the validate adjustments endpoint.""" errors = ma.Dict() class AutoGenerationInProgressOrErrorSchema(ma.Schema): """Schema for the auto-generated in progress/error adjustment files.""" batch_type = ma.Enum(options=STATEMENT_PERIOD_ADJUSTMENT_FILE_BATCH_TYPES) status = ma.NonemptyString(required=True) statement_period_id = ma.IntegerId(required=True) statement_period_adjustment_file_id = ma.NonNegativeInteger(required=True)