"""Project Transfer Term Marshmallow schemas.""" from abacus_common_logic.marshalling.custom_fields import ma from marshmallow import validate from royalties.models.project_transfer_term import TERM_TYPES class ConditionsSchema(ma.Schema): """Schema for a project transfer term condition's nested conditions JSON.""" countries = ma.List(ma.String()) stores = ma.List(ma.String()) transaction_types = ma.List(ma.String()) class AttachmentRelationsSchema(ma.Schema): """Schema for the attachment_relations JSON column. Mirrors the contract_term.attachments_relations payload — label scoping plus optional product/contributor relations. """ label_ids = ma.List(ma.String()) upcs = ma.List(ma.String()) contributors = ma.List(ma.String()) class ProjectTransferTermConditionDetailSchema(ma.Schema): """Response shape for a single condition row.""" project_transfer_term_condition_id = ma.NonNegativeInteger(required=True) project_transfer_term_id = ma.NonNegativeInteger(required=True) name = ma.String(allow_none=True) priority = ma.Integer(required=True) term_rate = ma.Decimal(required=True, as_string=True) commission = ma.Decimal(required=True, as_string=True) conditions = ma.Nested(ConditionsSchema) destination_contract_term_condition_id = ma.Integer(allow_none=True) created_by = ma.String(allow_none=True) created_at = ma.DateTime() class ProjectTransferTermDetailSchema(ma.Schema): """Response shape for a single project transfer term.""" project_transfer_term_id = ma.NonNegativeInteger(required=True) job_id = ma.NonNegativeInteger(required=True) contract_id = ma.NonNegativeInteger(required=True) destination_contract_term_id = ma.Integer(allow_none=True) name = ma.String(allow_none=True) term_type = ma.String(required=True, validate=validate.OneOf(TERM_TYPES)) attachments = ma.Raw(allow_none=True) attachment_relations = ma.Nested(AttachmentRelationsSchema, allow_none=True) created_by = ma.String(allow_none=True) created_at = ma.DateTime() conditions = ma.List( ma.Nested(ProjectTransferTermConditionDetailSchema), load_default=[], ) class ProjectTransferTermConditionInputSchema(ma.Schema): """Request body item: a single condition under a term.""" name = ma.String(allow_none=True) priority = ma.Integer(required=True) term_rate = ma.Decimal(required=True, as_string=True) commission = ma.Decimal(load_default='0.00', as_string=True) conditions = ma.Nested(ConditionsSchema) class ProjectTransferTermInputSchema(ma.Schema): """Request body item: one term plus its conditions.""" contract_id = ma.NonNegativeInteger(required=True) name = ma.String(allow_none=True) term_type = ma.String(required=True, validate=validate.OneOf(TERM_TYPES)) attachments = ma.Raw(allow_none=True) attachment_relations = ma.Nested(AttachmentRelationsSchema, allow_none=True) conditions = ma.List( ma.Nested(ProjectTransferTermConditionInputSchema), required=True, ) class ProjectTransferTermPatchSchema(ma.Schema): """Request body for PATCH /transfer-job//terms/.""" destination_contract_term_id = ma.Integer(required=True)