"""Contract Advance marshmallow schemas.""" from abacus_common_logic.marshalling.custom_fields import ma from marshmallow import validate from abacus_contract.constants.constants import ADVANCE_STATUSES from abacus_contract.constants.constants import MILESTONES class ContractAdvanceSchema(ma.Schema): """Contract Advance details.""" contract_advance_id = ma.IntegerId(required=True) contract_id = ma.IntegerId(required=True) advance_description = ma.NonemptyString(required=True) amount = ma.Decimal(as_string=True, required=True) vat_amount = ma.Decimal( as_string=True, required=False, allow_none=True, validate=validate.Range(min=0, min_inclusive=True) ) withholding_tax_amount = ma.Decimal( as_string=True, required=False, allow_none=True, validate=validate.Range(max=0, max_inclusive=True) ) amount_after_withholding_and_vat = ma.Decimal( as_string=True, required=False, allow_none=True, validate=validate.Range(min=0, min_inclusive=True) ) us_source_income_rate = ma.Decimal( as_string=True, required=False, allow_none=True, validate=validate.Range( min=0, min_inclusive=True, max=100, max_inclusive=True ) ) currency_code = ma.NonemptyString(required=True) milestone = ma.Enum(options=MILESTONES, required=True) milestone_description = ma.NonemptyString(required=True) milestone_date = ma.FormattedDate(allow_none=True) advance_status = ma.Enum(options=ADVANCE_STATUSES, required=True) note = ma.NonemptyString() reference_payment_type_id = ma.NonNegativeInteger( required=False, allow_none=True ) created_at = ma.FormattedDate(required=True) created_by = ma.NonemptyString(required=True) class ContractAdvancePostSchema(ma.Schema): """Schema for contract advance POST request.""" advance_description = ma.NonemptyString(required=True) amount = ma.Decimal(as_string=True, required=True) vat_amount = ma.Decimal( as_string=True, required=False, allow_none=True, validate=validate.Range(min=0, min_inclusive=True) ) withholding_tax_amount = ma.Decimal( as_string=True, required=False, allow_none=True, validate=validate.Range(max=0, max_inclusive=True) ) us_source_income_rate = ma.Decimal( as_string=True, required=False, allow_none=True, validate=validate.Range( min=0, min_inclusive=True, max=100, max_inclusive=True ) ) currency_code = ma.NonemptyString(required=True) milestone = ma.Enum(options=MILESTONES, required=True) milestone_description = ma.NonemptyString(required=True) milestone_date = ma.FormattedDate(allow_none=True) advance_status = ma.Enum( options=ADVANCE_STATUSES, required=False, default=ADVANCE_STATUSES.NOT_QUALIFIED ) note = ma.String(allow_none=True, required=False) reference_payment_type_id = ma.NonNegativeInteger( required=False, allow_none=True ) class ContractAdvancePutSchema(ma.Schema): """Schema for contract advance PUT request.""" advance_description = ma.NonemptyString(required=False) amount = ma.Decimal(as_string=True, required=False) vat_amount = ma.Decimal( as_string=True, required=False, allow_none=True, validate=validate.Range(min=0, min_inclusive=True) ) withholding_tax_amount = ma.Decimal( as_string=True, required=False, allow_none=True, validate=validate.Range(max=0, max_inclusive=True) ) us_source_income_rate = ma.Decimal( as_string=True, required=False, allow_none=True, validate=validate.Range( min=0, min_inclusive=True, max=100, max_inclusive=True ) ) currency_code = ma.NonemptyString(required=False) milestone = ma.Enum(options=MILESTONES, required=False) milestone_description = ma.NonemptyString(required=False) milestone_date = ma.FormattedDate(allow_none=True) advance_status = ma.Enum( options=ADVANCE_STATUSES, required=False ) note = ma.String(allow_none=True, required=False) reference_payment_type_id = ma.NonNegativeInteger( required=False, allow_none=True ) class ContractAdvancePaidSchema(ContractAdvanceSchema): """Schema for Paid Contract Advance.""" date_paid = ma.FormattedDate(required=True) statement_period_id = ma.IntegerId(required=True) advance_amount_payee_currency = ma.Decimal(as_string=True, required=True) advance_payee_currency_code = ma.NonemptyString(required=True)