/* Options:
Date: 2025-04-30 20:57:20
Version: 8.51
Tip: To override a DTO option, remove "//" prefix before updating
BaseUrl: https://blazor-gallery.servicestack.net

//Package: 
//AddServiceStackTypes: True
//AddResponseStatus: False
//AddImplicitVersion: 
//AddDescriptionAsComments: True
IncludeTypes: QueryPhoneScreens.*
//ExcludeTypes: 
//InitializeCollections: False
//TreatTypesAsStrings: 
//DefaultImports: java.math.*,java.util.*,java.io.InputStream,net.servicestack.client.*,com.google.gson.annotations.*,com.google.gson.reflect.*
*/

import java.math.*
import java.util.*
import java.io.InputStream
import net.servicestack.client.*
import com.google.gson.annotations.*
import com.google.gson.reflect.*


@ValidateRequest(Validator="IsAuthenticated")
open class QueryPhoneScreens : QueryDb<PhoneScreen>(), IReturn<QueryResponse<PhoneScreen>>
{
    open var id:Int? = null
    open var jobApplicationId:Int? = null
    companion object { private val responseType = object : TypeToken<QueryResponse<PhoneScreen>>(){}.type }
    override fun getResponseType(): Any? = QueryPhoneScreens.responseType
}

@DataContract
open class QueryResponse<T>
{
    @DataMember(Order=1)
    open var offset:Int? = null

    @DataMember(Order=2)
    open var total:Int? = null

    @DataMember(Order=3)
    open var results:ArrayList<PhoneScreen>? = null

    @DataMember(Order=4)
    open var meta:HashMap<String,String>? = null

    @DataMember(Order=5)
    open var responseStatus:ResponseStatus? = null
}

open class QueryDb<T> : QueryBase()
{
}

open class JobApplicationAttachment
{
    open var id:Int? = null
    @References(Type=JobApplication::class)
    open var jobApplicationId:Int? = null

    open var fileName:String? = null
    open var filePath:String? = null
    open var contentType:String? = null
    open var contentLength:Long? = null
}

open class AppUser
{
    open var id:String? = null
    open var firstName:String? = null
    open var lastName:String? = null
    open var displayName:String? = null
    open var profileUrl:String? = null
}

enum class EmploymentType
{
    FullTime,
    PartTime,
    Casual,
    Contract,
}

open class Contact
{
    open var id:Int? = null
    @Computed()
    open var displayName:String? = null

    open var profileUrl:String? = null
    open var firstName:String? = null
    open var lastName:String? = null
    open var salaryExpectation:Int? = null
    open var jobType:String? = null
    open var availabilityWeeks:Int? = null
    open var preferredWorkType:EmploymentType? = null
    open var preferredLocation:String? = null
    open var email:String? = null
    open var phone:String? = null
    open var skills:ArrayList<String>? = null
    open var about:String? = null
    open var applications:ArrayList<JobApplication> = ArrayList<JobApplication>()
}

open class Job : AuditBase()
{
    open var id:Int? = null
    open var title:String? = null
    open var employmentType:EmploymentType? = null
    open var company:String? = null
    open var location:String? = null
    open var salaryRangeLower:Int? = null
    open var salaryRangeUpper:Int? = null
    open var description:String? = null
    open var applications:ArrayList<JobApplication> = ArrayList<JobApplication>()
    open var closing:Date? = null
}

enum class JobApplicationStatus
{
    Applied,
    PhoneScreening,
    PhoneScreeningCompleted,
    Interview,
    InterviewCompleted,
    Offer,
    Disqualified,
}

open class JobApplication
{
    open var id:Int? = null
    @References(Type=Job::class)
    open var jobId:Int? = null

    @References(Type=Contact::class)
    open var contactId:Int? = null

    open var position:Job? = null
    open var applicant:Contact? = null
    open var comments:ArrayList<JobApplicationComment> = ArrayList<JobApplicationComment>()
    open var appliedDate:Date? = null
    open var applicationStatus:JobApplicationStatus? = null
    open var attachments:ArrayList<JobApplicationAttachment> = ArrayList<JobApplicationAttachment>()
    open var events:ArrayList<JobApplicationEvent> = ArrayList<JobApplicationEvent>()
    open var phoneScreen:PhoneScreen? = null
    open var interview:Interview? = null
    open var jobOffer:JobOffer? = null
}

open class PhoneScreen : AuditBase()
{
    open var id:Int? = null
    @References(Type=AppUser::class)
    open var appUserId:String? = null

    open var appUser:AppUser? = null
    @References(Type=JobApplication::class)
    open var jobApplicationId:Int? = null

    open var applicationStatus:JobApplicationStatus? = null
    open var notes:String? = null
}

open class Interview : AuditBase()
{
    open var id:Int? = null
    open var bookingTime:Date? = null
    @References(Type=JobApplication::class)
    open var jobApplicationId:Int? = null

    @References(Type=AppUser::class)
    open var appUserId:String? = null

    open var appUser:AppUser? = null
    open var applicationStatus:JobApplicationStatus? = null
    open var notes:String? = null
}

open class JobOffer : AuditBase()
{
    open var id:Int? = null
    open var salaryOffer:Int? = null
    open var currency:String? = null
    @References(Type=JobApplication::class)
    open var jobApplicationId:Int? = null

    @References(Type=AppUser::class)
    open var appUserId:String? = null

    open var appUser:AppUser? = null
    open var notes:String? = null
}

open class JobApplicationEvent : AuditBase()
{
    open var id:Int? = null
    @References(Type=JobApplication::class)
    open var jobApplicationId:Int? = null

    @References(Type=AppUser::class)
    open var appUserId:String? = null

    open var appUser:AppUser? = null
    open var description:String? = null
    open var status:JobApplicationStatus? = null
    open var eventDate:Date? = null
}

open class JobApplicationComment : AuditBase()
{
    open var id:Int? = null
    @References(Type=AppUser::class)
    open var appUserId:String? = null

    open var appUser:AppUser? = null
    @References(Type=JobApplication::class)
    open var jobApplicationId:Int? = null

    open var comment:String? = null
}

@DataContract
open class AuditBase
{
    @DataMember(Order=1)
    open var createdDate:Date? = null

    @DataMember(Order=2)
    @Required()
    open var createdBy:String? = null

    @DataMember(Order=3)
    open var modifiedDate:Date? = null

    @DataMember(Order=4)
    @Required()
    open var modifiedBy:String? = null

    @DataMember(Order=5)
    open var deletedDate:Date? = null

    @DataMember(Order=6)
    open var deletedBy:String? = null
}

@DataContract
open class QueryBase
{
    @DataMember(Order=1)
    open var skip:Int? = null

    @DataMember(Order=2)
    open var take:Int? = null

    @DataMember(Order=3)
    open var orderBy:String? = null

    @DataMember(Order=4)
    open var orderByDesc:String? = null

    @DataMember(Order=5)
    open var include:String? = null

    @DataMember(Order=6)
    open var fields:String? = null

    @DataMember(Order=7)
    open var meta:HashMap<String,String>? = null
}