""" Options:
Date: 2025-04-07 19:07:44
Version: 6.10
Tip: To override a DTO option, remove "#" prefix before updating
BaseUrl: https://staging-api.billiecart.com.au

#GlobalNamespace: 
#AddServiceStackTypes: True
#AddResponseStatus: False
#AddImplicitVersion: 
#AddDescriptionAsComments: True
IncludeTypes: UpdateAdjustmentRequest.*
#ExcludeTypes: 
#DefaultImports: datetime,decimal,marshmallow.fields:*,servicestack:*,typing:*,dataclasses:dataclass/field,dataclasses_json:dataclass_json/LetterCase/Undefined/config,enum:Enum/IntEnum
#DataClass: 
#DataClassJson: 
"""

import datetime
import decimal
from marshmallow.fields import *
from servicestack import *
from typing import *
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json, LetterCase, Undefined, config
from enum import Enum, IntEnum


class ITenantedRequest:
    organisation_id: Optional[str] = None


TResponse = TypeVar('TResponse')


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class PutPatchOperationUnTenanted(Generic[TResponse], IReturn[TResponse], IPatch, IPut):
    @staticmethod
    def response_type(): return TResponse


TResponse = TypeVar('TResponse')


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class PutPatchOperationTenanted(Generic[TResponse], PutPatchOperationUnTenanted[TResponse], ITenantedRequest):
    organisation_id: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class BudgetBreakdown:
    lease_amount: Optional[Decimal] = None
    administration_fee: Optional[Decimal] = None
    fuel: Optional[Decimal] = None
    servicing: Optional[Decimal] = None
    tyres: Optional[Decimal] = None
    insurance: Optional[Decimal] = None
    car_wash: Optional[Decimal] = None
    registration: Optional[Decimal] = None
    road_side_assistance: Optional[Decimal] = None
    anything_extra: Optional[Decimal] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Employment:
    payroll_cycle: Optional[str] = None
    first_pay_date: datetime.datetime = datetime.datetime(1, 1, 1)
    employer_id: Optional[str] = None
    employer_name: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Vehicle:
    make: Optional[str] = None
    model: Optional[str] = None
    colour: Optional[str] = None
    body_shape: Optional[str] = None
    license_plate: Optional[str] = None
    transmission: Optional[str] = None
    manufacture_year: int = 0


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class BankAccount:
    bsb_number: Optional[str] = None
    account_number: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class LeaseDetails:
    term: Optional[int] = None
    start_date: Optional[datetime.datetime] = None
    amount_financed: Optional[Decimal] = None
    payment_amount: Optional[Decimal] = None
    finance_provider: Optional[str] = None
    residual_value: Optional[Decimal] = None
    yearly_kms_travelled: Optional[int] = None
    fringe_benefit_tax_value: Optional[Decimal] = None
    fringe_benefit_tax_method: Optional[str] = None
    fringe_benefit_tax_business_use: int = 0
    fringe_benefit_tax_start_date: datetime.datetime = datetime.datetime(1, 1, 1)
    pre_tax_deduction: Optional[Decimal] = None
    post_tax_deduction: Optional[Decimal] = None
    gst_on_post_tax_deduction: Optional[Decimal] = None
    luxury_vehicle_charge: Optional[Decimal] = None
    on_road_cost: Decimal = decimal.Decimal(0)
    registration_due_date: datetime.datetime = datetime.datetime(1, 1, 1)
    insurance_due_date: datetime.datetime = datetime.datetime(1, 1, 1)
    lease_provider_bank_account: Optional[BankAccount] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class BudgetBalances:
    lease_amount: Decimal = decimal.Decimal(0)
    administration_fee: Decimal = decimal.Decimal(0)
    fuel: Decimal = decimal.Decimal(0)
    servicing: Decimal = decimal.Decimal(0)
    tyres: Decimal = decimal.Decimal(0)
    insurance: Decimal = decimal.Decimal(0)
    car_wash: Decimal = decimal.Decimal(0)
    registration: Decimal = decimal.Decimal(0)
    road_side_assistance: Decimal = decimal.Decimal(0)
    anything_extra: Decimal = decimal.Decimal(0)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class SalarySacrificeBreakdown:
    lease_amount: Optional[Decimal] = None
    administration_fee: Optional[Decimal] = None
    fuel: Optional[Decimal] = None
    servicing: Optional[Decimal] = None
    tyres: Optional[Decimal] = None
    insurance: Optional[Decimal] = None
    car_wash: Optional[Decimal] = None
    registration: Optional[Decimal] = None
    road_side_assistance: Optional[Decimal] = None
    anything_extra: Optional[Decimal] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class SalarySacrifice:
    payment_date: datetime.datetime = datetime.datetime(1, 1, 1)
    salary_sacrifice_breakdown: Optional[SalarySacrificeBreakdown] = None
    pre_tax_deduction: Decimal = decimal.Decimal(0)
    post_tax_deduction: Decimal = decimal.Decimal(0)
    contribution_id: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ForecastedSalarySacrifice:
    payment_date: datetime.datetime = datetime.datetime(1, 1, 1)
    amount: Decimal = decimal.Decimal(0)
    matched: Optional[SalarySacrifice] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Expense:
    budget_category: Optional[str] = None
    amount: Decimal = decimal.Decimal(0)
    gst: Decimal = decimal.Decimal(0)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ForecastedOutgoingPayment:
    scheduled: datetime.datetime = datetime.datetime(1, 1, 1)
    amount: Decimal = decimal.Decimal(0)
    budget_category: Optional[str] = None
    matched: Optional[Expense] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Adjustment(IIdentifiableResource):
    budget_category: Optional[str] = None
    amount: Decimal = decimal.Decimal(0)
    gst: Decimal = decimal.Decimal(0)
    description: Optional[str] = None
    received: datetime.datetime = datetime.datetime(1, 1, 1)
    id: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Transaction:
    received: datetime.datetime = datetime.datetime(1, 1, 1)
    budget_category: Optional[str] = None
    amount: Decimal = decimal.Decimal(0)
    gst: Decimal = decimal.Decimal(0)
    description: Optional[str] = None
    type: Optional[str] = None
    id: Optional[str] = None
    payment_id: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class SalaryPackage(IIdentifiableResource):
    customer_id: Optional[str] = None
    customer_first_name: Optional[str] = None
    customer_last_name: Optional[str] = None
    status: Optional[str] = None
    notes: Optional[str] = None
    budget_breakdown: Optional[BudgetBreakdown] = None
    employment: Optional[Employment] = None
    vehicle: Optional[Vehicle] = None
    lease_details: Optional[LeaseDetails] = None
    budget_balances: Optional[BudgetBalances] = None
    current_balance: Decimal = decimal.Decimal(0)
    forecasted_salary_sacrifices: Optional[List[ForecastedSalarySacrifice]] = None
    forecasted_outgoing_payments: Optional[List[ForecastedOutgoingPayment]] = None
    adjustments: Optional[List[Adjustment]] = None
    transactions: Optional[List[Transaction]] = None
    id: Optional[str] = None


class IIdentifiableResource:
    id: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class UpdateAdjustmentResponse:
    response_status: Optional[ResponseStatus] = None
    salary_package: Optional[SalaryPackage] = None


# @Route("/packages/{SalaryPackageId}/adjustments/{Id}", "PUT,PATCH")
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class UpdateAdjustmentRequest(PutPatchOperationTenanted[UpdateAdjustmentResponse], IReturn[UpdateAdjustmentResponse]):
    salary_package_id: Optional[str] = None
    id: Optional[str] = None
    amount: Decimal = decimal.Decimal(0)
    gst: Decimal = decimal.Decimal(0)
    budget_category: Optional[str] = None
    description: Optional[str] = None
    received: datetime.datetime = datetime.datetime(1, 1, 1)