/* Options:
Date: 2025-04-30 21:45:26
SwiftVersion: 5.0
Version: 8.30
Tip: To override a DTO option, remove "//" prefix before updating
BaseUrl: https://initiation-api.sirva.com

//BaseClass: 
//AddModelExtensions: True
//AddServiceStackTypes: True
IncludeTypes: TransfereeInitiationRequest.*
//ExcludeTypes: 
//ExcludeGenericBaseTypes: False
//AddResponseStatus: False
//AddImplicitVersion: 
//AddDescriptionAsComments: True
//InitializeCollections: True
//TreatTypesAsStrings: 
//DefaultImports: Foundation,ServiceStack
*/

import Foundation
import ServiceStack

// @Route("/Initiation/Transferee", "POST")
public class TransfereeInitiationRequest : IReturn, IRequireClientScoped, IPost, Codable
{
    public typealias Return = TransfereeInitiationResponse

    /**
    * Transferee initiation info needed for creation.
    */
    // @ApiMember(Description="Transferee initiation info needed for creation.", IsRequired=true, ParameterType="body")
    public var initiationInfo:TransfereeInitiation

    required public init(){}
}

public class TransfereeInitiationResponse : Codable
{
    public var responseStatus:ResponseStatus

    required public init(){}
}

public class TransfereeInitiation : Codable
{
    /**
    * Client ID
    */
    // @ApiMember(Description="Client ID")
    public var clientId:String

    /**
    * External ID. This must be unique to the intiation's parent client
    */
    // @ApiMember(Description="External ID. This must be unique to the intiation's parent client", IsRequired=true)
    public var externalId:String

    /**
    * Transferee first name
    */
    // @ApiMember(Description="Transferee first name", IsRequired=true)
    public var firstName:String

    /**
    * Transferee last name
    */
    // @ApiMember(Description="Transferee last name", IsRequired=true)
    public var lastName:String

    /**
    * Assignment type
    */
    // @ApiMember(Description="Assignment type")
    public var assignmentType:String

    /**
    * Is this transferee pre-decision
    */
    // @ApiMember(Description="Is this transferee pre-decision")
    public var preDecision:Bool?

    /**
    * Is this transferee a VIP
    */
    // @ApiMember(Description="Is this transferee a VIP")
    public var vip:Bool?

    /**
    * Custom fields
    */
    // @ApiMember(Description="Custom fields")
    public var customFields:[CustomField] = []

    /**
    * Employee ID
    */
    // @ApiMember(Description="Employee ID")
    public var employeeId:String

    /**
    * Start date
    */
    // @ApiMember(Description="Start date")
    public var startDate:Date?

    /**
    * End date
    */
    // @ApiMember(Description="End date")
    public var endDate:Date?

    /**
    * Origin work location
    */
    // @ApiMember(Description="Origin work location", IsRequired=true)
    public var originWorkLocation:Location

    /**
    * Origin home address
    */
    // @ApiMember(Description="Origin home address", IsRequired=true)
    public var originHomeAddress:Address

    /**
    * Destination work location
    */
    // @ApiMember(Description="Destination work location", IsRequired=true)
    public var destinationWorkLocation:Location

    /**
    * Repat
    */
    // @ApiMember(Description="Repat")
    public var repat:String

    /**
    * Repat From City
    */
    // @ApiMember(Description="Repat From City")
    public var repatFromCity:String

    /**
    * Repat From State code
    */
    // @ApiMember(Description="Repat From State code")
    public var repatFromStateCode:String

    /**
    * Repat From Country Code
    */
    // @ApiMember(Description="Repat From Country Code")
    public var repatFromCountryCode:String

    /**
    * Repat To City
    */
    // @ApiMember(Description="Repat To City")
    public var repatToCity:String

    /**
    * Repat To State Code
    */
    // @ApiMember(Description="Repat To State Code")
    public var repatToStateCode:String

    /**
    * Repat To Country Code
    */
    // @ApiMember(Description="Repat To Country Code")
    public var repatToCountryCode:String

    /**
    * Transferee citizenship country
    */
    // @ApiMember(Description="Transferee citizenship country")
    public var citizenshipCountry:String

    /**
    * Transferee dual citizenship country
    */
    // @ApiMember(Description="Transferee dual citizenship country")
    public var dualCitizenshipCountry:String

    /**
    * Policy
    */
    // @ApiMember(Description="Policy", IsRequired=true)
    public var policy:String

    /**
    * Job title
    */
    // @ApiMember(Description="Job title")
    public var jobTitle:String

    /**
    * Marital status
    */
    // @ApiMember(Description="Marital status", Name="MaritalStatus")
    public var maritalStatus:MaritalStatus?

    /**
    * Pay grade
    */
    // @ApiMember(Description="Pay grade")
    public var payGrade:String

    /**
    * Assignment family size
    */
    // @ApiMember(Description="Assignment family size")
    public var assignmentFamilySize:Int?

    /**
    * Home owner status
    */
    // @ApiMember(Description="Home owner status", Name="HomeOwnerStatus")
    public var homeOwnerStatus:HomeOwnerStatus?

    /**
    * Line of business
    */
    // @ApiMember(Description="Line of business", IsRequired=true)
    public var lineOfBusiness:String

    /**
    * HostCurrency
    */
    // @ApiMember(Description="HostCurrency")
    public var hostCurrency:String

    /**
    * ServiceLevel
    */
    // @ApiMember(Description="ServiceLevel")
    public var serviceLevel:String

    /**
    * CompanyCodePrimary
    */
    // @ApiMember(Description="CompanyCodePrimary")
    public var companyCodePrimary:String

    /**
    * CompanyCodeSecondary
    */
    // @ApiMember(Description="CompanyCodeSecondary")
    public var companyCodeSecondary:String

    /**
    * CostCenterPrimary
    */
    // @ApiMember(Description="CostCenterPrimary")
    public var costCenterPrimary:String

    /**
    * CostCenterSecondary
    */
    // @ApiMember(Description="CostCenterSecondary")
    public var costCenterSecondary:String

    /**
    * CostCenterTertiary
    */
    // @ApiMember(Description="CostCenterTertiary")
    public var costCenterTertiary:String

    /**
    * Is the assignment confidential
    */
    // @ApiMember(Description="Is the assignment confidential")
    public var confidential:Bool?

    /**
    * Special Instructions
    */
    // @ApiMember(Description="Special Instructions")
    public var specialInstructions:String

    /**
    * Destination entity legal name
    */
    // @ApiMember(Description="Destination entity legal name")
    public var destinationEntityLegalName:String

    /**
    * Transferee mobile phone number
    */
    // @ApiMember(Description="Transferee mobile phone number", IsRequired=true)
    public var mobilePhoneNumber:String

    /**
    * Transferee work phone number
    */
    // @ApiMember(Description="Transferee work phone number")
    public var workPhoneNumber:String

    /**
    * Transferee home phone number
    */
    // @ApiMember(Description="Transferee home phone number")
    public var homePhoneNumber:String

    /**
    * Transferee primary email
    */
    // @ApiMember(Description="Transferee primary email", IsRequired=true)
    public var primaryEmail:String

    /**
    * Transferee secondary email
    */
    // @ApiMember(Description="Transferee secondary email")
    public var secondaryEmail:String

    /**
    * HR Contact First Name
    */
    // @ApiMember(Description="HR Contact First Name")
    public var hrContactFirstName:String

    /**
    * HR Contact Last Name
    */
    // @ApiMember(Description="HR Contact Last Name")
    public var hrContactLastName:String

    /**
    * HR contact full name
    */
    // @ApiMember(Description="HR contact full name")
    public var hrContactFullName:String

    /**
    * Transferee annual salary
    */
    // @ApiMember(Description="Transferee annual salary")
    public var annualSalary:String

    /**
    * Transferee spouse/partner
    */
    // @ApiMember(Description="Transferee spouse/partner")
    public var spousePartner:SpousePartner

    /**
    * Transferee dependents
    */
    // @ApiMember(Description="Transferee dependents")
    public var dependents:[Dependent] = []

    /**
    * Assignment Services
    */
    // @ApiMember(Description="Assignment Services")
    public var services:[Service] = []

    /**
    * Relocation Status
    */
    // @ApiMember(Description="Relocation Status")
    public var relocationStatus:String

    /**
    * Cancel
    */
    // @ApiMember(Description="Cancel")
    public var cancel:String

    required public init(){}
}

public protocol IRequireClientScoped
{
}

public class CustomField : Codable
{
    /**
    * Custom field name
    */
    // @ApiMember(Description="Custom field name", IsRequired=true)
    public var fieldName:String

    /**
    * Custom field value
    */
    // @ApiMember(Description="Custom field value")
    public var fieldValue:String

    required public init(){}
}

public class Location : Codable
{
    public var title:String
    public var city:String
    public var stateCode:String
    public var countryCode:String

    required public init(){}
}

public class Address : Location
{
    public var line1:String
    public var line2:String
    public var line3:String
    public var postalCode:String

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case line1
        case line2
        case line3
        case postalCode
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        line1 = try container.decodeIfPresent(String.self, forKey: .line1)
        line2 = try container.decodeIfPresent(String.self, forKey: .line2)
        line3 = try container.decodeIfPresent(String.self, forKey: .line3)
        postalCode = try container.decodeIfPresent(String.self, forKey: .postalCode)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if line1 != nil { try container.encode(line1, forKey: .line1) }
        if line2 != nil { try container.encode(line2, forKey: .line2) }
        if line3 != nil { try container.encode(line3, forKey: .line3) }
        if postalCode != nil { try container.encode(postalCode, forKey: .postalCode) }
    }
}

public enum MaritalStatus : String, Codable
{
    case Single
    case Married
    case DomesticPartner
    case Divorcee
    case Defacto
    case Other
    case Separated
    case Interdependent
    case Widowed
    case Divorced
}

public enum HomeOwnerStatus : String, Codable
{
    case Homeowner
    case Renter
}

public class SpousePartner : Codable
{
    public var firstName:String
    public var lastName:String
    public var birthDate:Date?

    required public init(){}
}

public class Dependent : Codable
{
    public var firstName:String
    public var lastName:String
    public var birthDate:Date?
    // @ApiMember(IsRequired=true, Name="RelationshipToAssignee")
    public var relationshipToAssignee:DependentAssigneeRelationship?

    required public init(){}
}

public enum DependentAssigneeRelationship : String, Codable
{
    case Child
    case Other
}

public class ServiceData : Codable
{
    /**
    * Service data field name
    */
    // @ApiMember(Description="Service data field name", IsRequired=true)
    public var fieldName:String

    /**
    * Service data field value
    */
    // @ApiMember(Description="Service data field value", IsRequired=true)
    public var fieldValue:String

    required public init(){}
}