# generated by datamodel-codegen:
#   filename:  swagger.json
#   timestamp: 2026-01-15T22:15:18+00:00

from __future__ import annotations

from datetime import date
from enum import StrEnum
from typing import Annotated, Any
from uuid import UUID

from pydantic import AwareDatetime, BaseModel, ConfigDict, Field


class AbsenceImportItem(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    absenceId: Annotated[int | None, Field(description="Internal ID of the absence.")] = None
    userId: Annotated[int | None, Field(description="ID of the user whose absences are imported")] = None
    startDate: Annotated[date | None, Field(description="Start of the absence.", examples=["2025-01-01"])] = None
    endDate: Annotated[date | None, Field(description="End of the absence.", examples=["2025-01-01"])] = None
    subject: Annotated[str | None, Field(description="Informal text displayed in the UI")] = None
    absenceCode: Annotated[str | None, Field(description="Technical identifier")] = None
    employeeID: Annotated[str | None, Field(description="Customer-specific user ID")] = None
    delete: Annotated[
        bool | None,
        Field(
            description="Flag indicating whether the absence should be deleted. If false, absence is created. Default is false."
        ),
    ] = False


class AbsenceOutputItem(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    absenceId: Annotated[int | None, Field(description="Internal ID of the absence.")] = None
    userId: Annotated[int | None, Field(description="ID of the user whose absences are imported")] = None
    startDate: Annotated[date | None, Field(description="Start of the absence.", examples=["2025-01-01"])] = None
    endDate: Annotated[date | None, Field(description="End of the absence.", examples=["2025-01-01"])] = None
    subject: Annotated[str | None, Field(description="Informal text displayed in the UI")] = None
    absenceCode: Annotated[str | None, Field(description="Technical identifier")] = None
    employeeID: Annotated[str | None, Field(description="Customer-specific user ID")] = None


class AbsenceOutputResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    absences: Annotated[list[AbsenceOutputItem] | None, Field(description="The list of absences.")] = None


class BookingAccountingType(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    bookingAccountingTypeID: int | None = None
    bookingAccountingTypeName: str | None = None
    position: int | None = None


class BookingType(StrEnum):
    Reservation = "Reservation"
    SoftBooked = "SoftBooked"
    Confirmed = "Confirmed"
    Rejected = "Rejected"


class BookingTypeNullableOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: BookingType | None = None


class BooleanNullableOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: bool | None = None


class BooleanOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: bool | None = None


class BusinessUnit(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    businessUnitID: Annotated[int | None, Field(description="Internal ID of the business unit.")] = None
    businessUnitName: Annotated[str | None, Field(description="Name of the business unit.")] = None
    position: Annotated[int | None, Field(description="Position of the business unit.")] = None


class CompanyCompleteOutput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    companyID: Annotated[int | None, Field(description="The internal ID of the company.")] = None
    companyName: Annotated[str | None, Field(description="The name of the company.")] = None
    registeredName: Annotated[str | None, Field(description="The registered name of the company.")] = None
    alias: Annotated[str | None, Field(description="The alias of the company.")] = None
    companyCode: Annotated[str | None, Field(description="External identifier of the company.")] = None
    website: Annotated[str | None, Field(description="The website of the company.")] = None
    industryID: Annotated[int | None, Field(description="The internal ID of the industry of the company.")] = None
    industryName: Annotated[str | None, Field(description="The name of the industry of the company.")] = None
    isCustomer: Annotated[bool | None, Field(description="Indicates whether the company is a customer.")] = None


class CompanyCreateInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    name: Annotated[str | None, Field(description="Name of the company.")] = None


class CompanyOutput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    companyID: Annotated[int, Field(description="decídalo internal id of the company.")]
    companyCode: Annotated[
        str | None, Field(description="External id of the company.", max_length=100, min_length=0)
    ] = None


class CompanyReference(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    companyID: Annotated[int, Field(description="decídalo id of the company.", examples=[2])]
    companyName: Annotated[
        str,
        Field(
            description="Display name of the company.",
            examples=["Innovative Technologies Inc."],
            max_length=250,
            min_length=0,
        ),
    ]
    companyCode: Annotated[
        str | None,
        Field(
            description="Optional external identifier for the company, e.g. from an external system.",
            examples=["IT-12345"],
            max_length=100,
            min_length=0,
        ),
    ] = None


class CompanyReferenceInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    companyID: Annotated[int | None, Field(description="decídalo id of the company.", examples=[2])] = None
    companyName: Annotated[str | None, Field(description="Display name of the company.", max_length=250)] = None
    companyCode: Annotated[
        str | None,
        Field(
            description="Optional external identifier for the company, e.g. from an external system.", max_length=100
        ),
    ] = None


class CustomPropertyDataFormat(StrEnum):
    Number = "Number"
    String = "String"
    Boolean = "Boolean"


class CustomPropertyDataType(StrEnum):
    Integer = "Integer"
    Float = "Float"
    String = "String"
    Boolean = "Boolean"
    Date = "Date"
    Html = "Html"
    DateTime = "DateTime"
    ValueList = "ValueList"


class CustomPropertyOption(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    value: Annotated[
        int | None,
        Field(description="The identifier for the option. \r\nSend this value as the custom property value."),
    ] = None
    label: Annotated[str | None, Field(description="A corresponding label for the option.")] = None


class DailyPlanningItem(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    calendarDate: Annotated[
        date | None, Field(description="The day of the planned entry as a pure date", examples=["2025-01-01"])
    ] = None
    minutes: Annotated[int | None, Field(description="The planned time in minutes.")] = None


class DateOnlyNullableOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: date | None = None


class DateTimeNullableOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: AwareDatetime | None = None


class DecimalNullableOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: float | None = None


class DeliveryModel(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    deliveryModelID: int | None = None
    deliveryModelName: str | None = None
    position: int | None = None


class ExceptionType(StrEnum):
    Unknown = "Unknown"
    Validation = "Validation"


class HttpStatusCode(StrEnum):
    Continue = "Continue"
    SwitchingProtocols = "SwitchingProtocols"
    Processing = "Processing"
    EarlyHints = "EarlyHints"
    OK = "OK"
    Created = "Created"
    Accepted = "Accepted"
    NonAuthoritativeInformation = "NonAuthoritativeInformation"
    NoContent = "NoContent"
    ResetContent = "ResetContent"
    PartialContent = "PartialContent"
    MultiStatus = "MultiStatus"
    AlreadyReported = "AlreadyReported"
    IMUsed = "IMUsed"
    MultipleChoices = "MultipleChoices"
    MovedPermanently = "MovedPermanently"
    Found = "Found"
    SeeOther = "SeeOther"
    NotModified = "NotModified"
    UseProxy = "UseProxy"
    Unused = "Unused"
    TemporaryRedirect = "TemporaryRedirect"
    PermanentRedirect = "PermanentRedirect"
    BadRequest = "BadRequest"
    Unauthorized = "Unauthorized"
    PaymentRequired = "PaymentRequired"
    Forbidden = "Forbidden"
    NotFound = "NotFound"
    MethodNotAllowed = "MethodNotAllowed"
    NotAcceptable = "NotAcceptable"
    ProxyAuthenticationRequired = "ProxyAuthenticationRequired"
    RequestTimeout = "RequestTimeout"
    Conflict = "Conflict"
    Gone = "Gone"
    LengthRequired = "LengthRequired"
    PreconditionFailed = "PreconditionFailed"
    RequestEntityTooLarge = "RequestEntityTooLarge"
    RequestUriTooLong = "RequestUriTooLong"
    UnsupportedMediaType = "UnsupportedMediaType"
    RequestedRangeNotSatisfiable = "RequestedRangeNotSatisfiable"
    ExpectationFailed = "ExpectationFailed"
    MisdirectedRequest = "MisdirectedRequest"
    UnprocessableEntity = "UnprocessableEntity"
    Locked = "Locked"
    FailedDependency = "FailedDependency"
    UpgradeRequired = "UpgradeRequired"
    PreconditionRequired = "PreconditionRequired"
    TooManyRequests = "TooManyRequests"
    RequestHeaderFieldsTooLarge = "RequestHeaderFieldsTooLarge"
    UnavailableForLegalReasons = "UnavailableForLegalReasons"
    InternalServerError = "InternalServerError"
    NotImplemented = "NotImplemented"
    BadGateway = "BadGateway"
    ServiceUnavailable = "ServiceUnavailable"
    GatewayTimeout = "GatewayTimeout"
    HttpVersionNotSupported = "HttpVersionNotSupported"
    VariantAlsoNegotiates = "VariantAlsoNegotiates"
    InsufficientStorage = "InsufficientStorage"
    LoopDetected = "LoopDetected"
    NotExtended = "NotExtended"
    NetworkAuthenticationRequired = "NetworkAuthenticationRequired"


class ImportAbsencesCommand(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    absences: list[AbsenceImportItem] | None = None


class ImportBatchStatusType(StrEnum):
    Pending = "Pending"
    Processing = "Processing"
    Completed = "Completed"
    Failed = "Failed"


class ImportCompanyCommand(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    companyID: int | None = None
    companyName: str | None = None
    registeredName: str | None = None
    alias: str | None = None
    companyCode: str | None = None
    website: str | None = None
    industryID: int | None = None
    industryName: str | None = None
    isCustomer: bool | None = None


class ImportItemStatusType(StrEnum):
    Pending = "Pending"
    Created = "Created"
    Updated = "Updated"
    Deleted = "Deleted"
    NotModified = "NotModified"
    Failed = "Failed"
    Deactivated = "Deactivated"
    UpdateInProcess = "UpdateInProcess"


class ImportRoleResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    roleID: int | None = None
    errorMessage: str | None = None
    success: bool | None = None


class IndustryOutput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    industryID: Annotated[int, Field(description="decídalo internal id of the industry.")]
    industryName: Annotated[str | None, Field(description="Display name of the industry.")] = None


class Int16NullableOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: int | None = None


class Int32NullableOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: int | None = None


class KeywordInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    value: Annotated[
        str,
        Field(
            description="The keyword value case-insensitive.\r\nMust not cointain any whitespace.",
            max_length=255,
            min_length=0,
        ),
    ]


class PracticeArea(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    practiceAreaID: Annotated[int | None, Field(description="The unique internal identifier of the practice area.")] = (
        None
    )
    practiceAreaName: Annotated[str | None, Field(description="The name of the practice area.")] = None
    position: Annotated[
        int | None, Field(description="The position of the practice area in the list of practice areas.")
    ] = None


class ProjectCompanyReferenceInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    companyID: Annotated[int | None, Field(description="References a company by the decídalo id.")] = None
    companyCode: Annotated[
        str | None,
        Field(
            description="References a company by the external id.\r\nIf CompanyID is set, then this field is ignored.",
            max_length=100,
        ),
    ] = None
    companyData: Annotated[
        CompanyCreateInput | None,
        Field(
            description="Instead of specifying a reference, a new company can be included.\r\nIf the company data is included, then the reference fields are ignored."
        ),
    ] = None


class ProjectIndustryReferenceInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    industryID: Annotated[int | None, Field(description="decídalo id of the industry.")] = None
    industryName: Annotated[
        str | None, Field(description="Name of the industry.\r\nActs as identifier, if IndustryID is not provided.")
    ] = None


class ProjectIndustryReferenceInputOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: Annotated[
        ProjectIndustryReferenceInput | None, Field(description="Data to reference or create an industry.")
    ] = None


class ProjectReferenceIdentity(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    projectID: Annotated[int, Field(description="The decídalo id of the project.")]
    projectCode: Annotated[
        str | None, Field(description="Optional external identifier of the project.", max_length=100, min_length=0)
    ] = None


class ProjectReferenceIdentityInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    projectID: Annotated[int | None, Field(description="decídalo internal id of the project.")] = None
    projectCode: Annotated[
        str | None,
        Field(
            description="External identifier of the project.\r\nThis value will also be set/updated on the project if provided.",
            max_length=100,
        ),
    ] = None


class ProjectReferenceImportResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    projectID: Annotated[
        int | None, Field(description="The id of the project.\r\nMight be null, if project creation failed.")
    ] = None
    projectCode: Annotated[
        str | None,
        Field(
            description="The external identifier of the project.\r\nMight be null, if project creation failed.",
            max_length=100,
            min_length=0,
        ),
    ] = None
    errorMessage: Annotated[str | None, Field(description="The errormessage, if the import failed.")] = None
    success: Annotated[
        bool | None,
        Field(
            description="A flag to indicate, whether the import was successful.\r\nIf not successful, then the ErrorMessage contains more information."
        ),
    ] = None


class ProjectStatusOutput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    projectStatusID: Annotated[int, Field(description="The decídalo id of the project status.")]
    projectStatusName: Annotated[
        str, Field(description="A string representation of the status.", max_length=50, min_length=0)
    ]


class ReferenceStatusOutput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    referenceStatusID: Annotated[int, Field(description="The decídalo id of the status.")]
    referenceStatusName: Annotated[
        str, Field(description="A string representation of the status.", max_length=50, min_length=0)
    ]
    allowReferencing: Annotated[
        bool,
        Field(
            description="Flag to indicate, whether this status would allow users to add this project to their profiles."
        ),
    ]


class RejectionReasonType(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    rejectionReasonID: int | None = None
    rejectionReasonName: str | None = None
    position: int | None = None


class ResourceRequestIdentifier(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    requestID: Annotated[int, Field(description="decídalo id of the resource request.", examples=[1])]


class ResourceRequestIdentifierInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    requestID: Annotated[int | None, Field(description="decídalo id of the resource request.", examples=[1])] = None


class ResourceRequestPropertiesInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    title: Annotated[str | None, Field(description="Display title for the resource request.", max_length=250)] = None
    description: Annotated[str | None, Field(description="Html formatted description text.")] = None
    role: Annotated[str | None, Field(description="Official title of the requested role.", max_length=100)] = None
    source: Annotated[str | None, Field(description="Data source where the need originated.", max_length=255)] = None
    requestedCandidateCount: Annotated[
        int | None,
        Field(
            description="Number of profiles that should be returned for the request.\r\nIf no values is specified, new resource requests are created with default '1'.",
            examples=[3],
        ),
    ] = None
    tenderDate: Annotated[
        date | None, Field(description="Deadline for fulfulling the request.", examples=["2025-01-01"])
    ] = None
    startDate: Annotated[
        AwareDatetime | None, Field(description="First day of the time period when the resource is needed.")
    ] = None
    endDate: Annotated[
        AwareDatetime | None, Field(description="Last day of the time period when the resource is needed.")
    ] = None
    contact: Annotated[
        str | None, Field(description="Notes about the contact person who needs the resource.", max_length=255)
    ] = None


class ResourceRequestPropertiesOutput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    title: Annotated[
        str | None,
        Field(
            description="Display title for the resource request.",
            examples=["Agile project manager"],
            max_length=250,
            min_length=0,
        ),
    ] = None
    description: Annotated[
        str | None,
        Field(
            description="Html formatted description text.",
            examples=[
                "<html><head></head><body><p dir='ltr'><span style='white-space: pre-wrap;'>Bedarfsbeschreibung.</span></p></body></html>"
            ],
        ),
    ] = None
    role: Annotated[
        str | None,
        Field(
            description="Official title of the requested role.",
            examples=["Project manager"],
            max_length=100,
            min_length=0,
        ),
    ] = None
    source: Annotated[
        str | None,
        Field(
            description="Data source where the need originated.",
            examples=["https://portal.jobs.com"],
            max_length=255,
            min_length=0,
        ),
    ] = None
    requestedCandidateCount: Annotated[
        int, Field(description="Number of profiles that should be returned for the request.", examples=[3])
    ]
    tenderDate: Annotated[
        date | None, Field(description="Deadline for fulfulling the request.", examples=["2023-10-01"])
    ] = None
    startDate: Annotated[
        AwareDatetime | None,
        Field(description="First day of the time period when the resource is needed.", examples=["2023-10-01"]),
    ] = None
    endDate: Annotated[
        AwareDatetime | None,
        Field(description="Last day of the time period when the resource is needed.", examples=["2023-12-31"]),
    ] = None
    contact: Annotated[
        str | None,
        Field(description="Notes about the contact person who needs the resource.", max_length=255, min_length=0),
    ] = None


class ResourceRequestStatus(StrEnum):
    Open = "Open"
    Done = "Done"
    Withdrawn = "Withdrawn"


class ResourceRequestStatusNullableOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: ResourceRequestStatus | None = None


class RoleIdentityInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    roleID: Annotated[int | None, Field(description="The internal ID of the role.")] = None
    roleCode: Annotated[str | None, Field(description="The external identifier of the role.", max_length=100)] = None


class SingleNullableOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: float | None = None


class StringObjectDictionaryOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: dict[str, Any] | None = None


class StringObjectIDictionaryOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: dict[str, Any] | None = None


class StringOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: str | None = None


class TeamImportAcceptedResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    batchID: Annotated[UUID | None, Field(description="Generated ID for the accepted batch.")] = None


class TeamInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    teamID: Annotated[
        int | None,
        Field(description="Unique internal identifier of the team.\r\nEither TeamID or TeamCode has to be provided."),
    ] = None
    teamCode: Annotated[
        str | None,
        Field(
            description="External identifier for the team.\r\nEither TeamID or TeamCode has to be provided.",
            max_length=100,
        ),
    ] = None
    teamName: Annotated[str | None, Field(description="Display name of the team.", max_length=255)] = None
    managerUserID: Annotated[int | None, Field(description="Internal identifier of the user who manages the team.")] = (
        None
    )
    managerEmployeeID: Annotated[
        str | None, Field(description="External identifier of the user who manages the team.", max_length=100)
    ] = None
    parentTeamID: Annotated[int | None, Field(description="Internal identifier of the parent team.")] = None
    parentTeamCode: Annotated[
        str | None, Field(description="External identifier of the parent team.", max_length=100)
    ] = None
    delete: Annotated[bool | None, Field(description="Flag to indicate, whether this team should be deleted.")] = False


class TeamOverview(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    teamID: Annotated[int | None, Field(description="ID of the team.")] = None
    teamCode: Annotated[str | None, Field(description="Code of the team.")] = None
    teamName: Annotated[str | None, Field(description="Name of the team.")] = None
    managerUserID: Annotated[int | None, Field(description="UserID of the teams manager.")] = None
    managerEmployeeID: Annotated[str | None, Field(description="EmployeeID of the teams manager.")] = None
    parentTeamID: Annotated[int | None, Field(description="ID of the parent team.")] = None
    parentTeamCode: Annotated[str | None, Field(description="Code of the parent team.")] = None
    creationDate: Annotated[AwareDatetime | None, Field(description="Date when the team was created.")] = None


class TextFieldInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    value: Annotated[str | None, Field(description="String value of the text field.")] = None


class TextFieldInputOptionalField(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    isProvided: bool | None = None
    value: Annotated[TextFieldInput | None, Field(description="Text input field.")] = None


class UserIdentityInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userID: Annotated[int | None, Field(description="Internal ID of the user.")] = None
    employeeID: Annotated[
        str | None, Field(description="An external UserID not provided by decidalo (client's internal EmployeeID).")
    ] = None


class UserIdentityResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userID: int | None = None
    employeeID: str | None = None


class UserImportAcceptedResponse(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    batchID: Annotated[UUID | None, Field(description="Generated ID for the accepted batch.")] = None


class UserInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userID: Annotated[int | None, Field(description="The unique internal identifier of the user.")] = None
    email: Annotated[str | None, Field(description="The email address of the user.", max_length=254)] = None
    employeeID: Annotated[
        str | None, Field(description="The employee ID of the user, acts as external identifier.", max_length=100)
    ] = None
    displayName: Annotated[str | None, Field(description="The display name of the user.", max_length=100)] = None
    location: Annotated[str | None, Field(description="The location of the user.", max_length=100)] = None
    yearOfBirth: Annotated[int | None, Field(description="The year of birth of the user.")] = None
    highestEducation: Annotated[
        str | None, Field(description="The highest education level of the user.", max_length=200)
    ] = None
    nationality: Annotated[str | None, Field(description="The nationality of the user.", max_length=100)] = None
    countryCode: Annotated[
        str | None, Field(description="The two-letter code of the user's country.", max_length=2)
    ] = None
    officePhoneNumber: Annotated[
        str | None, Field(description="The office phone number of the user.", max_length=100)
    ] = None
    mobilePhoneNumber: Annotated[
        str | None, Field(description="The mobile phone number of the user.", max_length=100)
    ] = None
    employeeTypeID: Annotated[int | None, Field(description="The internal id of the employee type.")] = None
    employeeTypeName: Annotated[
        str | None, Field(description="The name of the employee type, acting as external identifier.", max_length=50)
    ] = None
    authorizationRoleID: Annotated[int | None, Field(description="The authorization role ID of the user.")] = None
    authorizationRoleName: Annotated[
        str | None, Field(description="The authorization role name of the user.", max_length=50)
    ] = None
    teamID: Annotated[int | None, Field(description="The team ID of the user.")] = None
    teamCode: Annotated[str | None, Field(description="The team code of the user.", max_length=50)] = None
    serviceCategoryName: Annotated[
        str | None, Field(description="The service category name of the user.", max_length=100)
    ] = None
    jobTitle: Annotated[str | None, Field(description="Job title of user", max_length=100)] = None
    costCenter: Annotated[
        str | None, Field(description="The cost center of the user. Used for accounting purposes.", max_length=100)
    ] = None
    includeInResourceManagement: Annotated[
        bool | None,
        Field(
            description="Flag to indicate, whether this user should be included in the resource management.\r\n(In the create case, the default value is true. In the case of an update, the default value is the user's current value.)"
        ),
    ] = None
    standardWeeklyHours: Annotated[int | None, Field(description="The standard weekly working hours of the user.")] = (
        None
    )
    entryDate: Annotated[
        date | None,
        Field(description="First day, when the user officially joins the company.", examples=["2025-01-01"]),
    ] = None
    exitDate: Annotated[
        date | None,
        Field(description="Last day, when the user officially leaves the company.", examples=["2025-01-01"]),
    ] = None
    businessUnitID: Annotated[int | None, Field(description="The internal ID of the business unit.")] = None
    businessUnitName: Annotated[str | None, Field(description="The name of the business unit.", max_length=50)] = None
    practiceAreaID: Annotated[
        int | None, Field(description="Internal decídalo ID of the practice area of the user")
    ] = None
    practiceAreaName: Annotated[
        str | None, Field(description="The English name of the practice area of the user", max_length=50)
    ] = None
    companyName: Annotated[
        str | None,
        Field(description="The name of the company, where the user works.\r\nActs as an identifier.", max_length=250),
    ] = None
    delete: Annotated[
        bool | None, Field(description="Flag to indicate, whether this user should be deleted.\r\n(Default: false)")
    ] = False
    deactivate: Annotated[
        bool | None,
        Field(
            description="Flag to indicate, whether this user should be deactivated.\r\nSending false will reactivate the user."
        ),
    ] = None
    hasLogin: Annotated[
        bool | None,
        Field(
            description="Flag to indicate, whether this user should have a login.\r\nnull: No change or don't create for new users.\r\nfalse: Remove login for existing users."
        ),
    ] = None
    deliveryModel: Annotated[
        str | None,
        Field(description="The delivery model of the user.\r\nE.g. Offshore, Onshore or Nearshore", max_length=100),
    ] = None
    customProperties: Annotated[
        dict[str, Any] | None,
        Field(
            description="Custom fields of the user. \r\nValues can be any primitive type like string, int, bool or DateTime (formatted as string)."
        ),
    ] = None
    holidayListCode: Annotated[
        str | None,
        Field(
            description="The combination of Country and subdivision codes separated by a hyphen which determine the usual list of Holidays of the User.\r\nThe part preceeding the hyphen is the country code according to the ISO 3166-2 standard and the part succeeding it is the code of the region according to ISO 3166-2 standard.\r\nExample: DE-NI corresponds to the list of holidays in the region NiederSachsen of Germany.\r\nThe first part that is DE is the ISO 3166-1 alpha-2 standard nomenclature for Germany.\r\nThe second part that is NI denotes the ISO 3166-2 standard nomenclature for NiederSachsen.\r\nNote that the ISO 3166-2 nomenclature for certain regions maybe numeric. For example: AT-6 denotes holidays in Steiermark in Austria.\r\nAlso one can have a code without any subdivision Code. For example: DE which would then represent the list of holidays in Germany. \r\nDE being the ISO 3166-1 alpha-2 standard nomenclature for germany."
        ),
    ] = None
    legalEntityID: Annotated[
        int | None, Field(description="This is the technical Id of the legal entity corressponding to the User.")
    ] = None
    legalEntityName: Annotated[
        str | None, Field(description="This is the name corresponding to the legal entity of the user.", max_length=50)
    ] = None
    serviceLineID: Annotated[
        int | None, Field(description="This is the technical Id of the service line corressponding to the user.")
    ] = None
    serviceLineName: Annotated[
        str | None, Field(description="This is the name corressponding to the service line of the user.", max_length=50)
    ] = None


class UserOverview(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userID: Annotated[int, Field(description="The unique internal identifier of the user.")]
    email: Annotated[str, Field(description="The email address of the user.", max_length=254, min_length=0)]
    employeeID: Annotated[
        str | None,
        Field(description="The employee ID of the user, acts as external identifier.", max_length=100, min_length=0),
    ] = None
    displayName: Annotated[str, Field(description="The display name of the user.", max_length=100, min_length=0)]
    location: Annotated[str | None, Field(description="The location of the user.", max_length=100, min_length=0)] = None
    yearOfBirth: Annotated[int | None, Field(description="The year of birth of the user.")] = None
    highestEducation: Annotated[
        str | None, Field(description="The highest education level of the user.", max_length=200, min_length=0)
    ] = None
    nationality: Annotated[
        str | None, Field(description="The nationality of the user.", max_length=100, min_length=0)
    ] = None
    countryCode: Annotated[
        str | None, Field(description="The two-letter code of the user's country.", max_length=2, min_length=0)
    ] = None
    officePhoneNumber: Annotated[
        str | None, Field(description="The office phone number of the user.", max_length=100, min_length=0)
    ] = None
    mobilePhoneNumber: Annotated[
        str | None, Field(description="The mobile phone number of the user.", max_length=100, min_length=0)
    ] = None
    employeeTypeID: Annotated[int, Field(description="The internal id of the employee type.")]
    employeeTypeName: Annotated[
        str,
        Field(description="The name of the employee type, acting as external identifier.", max_length=50, min_length=0),
    ]
    authorizationRoleID: Annotated[int | None, Field(description="The authorization role ID of the user.")] = None
    authorizationRoleName: Annotated[
        str | None, Field(description="The authorization role name of the user.", max_length=50, min_length=0)
    ] = None
    teamID: Annotated[int | None, Field(description="The team ID of the user.")] = None
    teamCode: Annotated[str | None, Field(description="The team code of the user.", max_length=50, min_length=0)] = None
    serviceCategoryName: Annotated[
        str | None, Field(description="The service category name of the user.", max_length=100, min_length=0)
    ] = None
    creationDate: Annotated[AwareDatetime, Field(description="Date when user was created.")]
    lastEditDate: Annotated[AwareDatetime, Field(description="Date when user was last edited.")]
    jobTitle: Annotated[str | None, Field(description="Job title of user", max_length=100, min_length=0)] = None
    costCenter: Annotated[
        str | None, Field(description="The cost center of the user.", max_length=100, min_length=0)
    ] = None
    includeInResourceManagement: Annotated[
        bool, Field(description="Flag to indicate, whether this is included in the resource management.")
    ]
    entryDate: Annotated[date | None, Field(description="First day, when the user officially joins the company.")] = (
        None
    )
    exitDate: Annotated[date | None, Field(description="Last day, when the user officially leaves the company.")] = None
    businessUnitID: Annotated[int | None, Field(description="The internal ID of the business unit.")] = None
    businessUnitName: Annotated[
        str | None, Field(description="The name of the business unit.", max_length=50, min_length=0)
    ] = None
    practiceAreaID: Annotated[
        int | None, Field(description="Internal decídalo ID of the practice area of the user")
    ] = None
    practiceAreaName: Annotated[
        str | None, Field(description="The English name of the practice area of the user", max_length=50, min_length=0)
    ] = None
    companyName: Annotated[
        str | None,
        Field(
            description="The name of the company, where the user works.\r\nActs as an identifier.",
            max_length=250,
            min_length=0,
        ),
    ] = None
    hasLogin: Annotated[bool, Field(description="Flag to indicate, whether this user has a login.")]
    customProperties: Annotated[
        dict[str, Any] | None,
        Field(
            description="Custom fields of the user. Values can be any primitive type like string, int, bool or DateTime (formatted as string)."
        ),
    ] = None
    deliveryModelName: Annotated[
        str | None, Field(description="The delivery model of the User. Ex: Offshore,Onshore, Nearshore etc.")
    ] = None
    standardWeeklyHours: Annotated[int | None, Field(description="The standard weekly hours of the user.")] = None
    holidayListCode: Annotated[
        str | None,
        Field(
            description="The combination of the country and region codes which tell us which holidays are applicable for the user."
        ),
    ] = None
    holidayListId: Annotated[
        int | None, Field(description="The technical internal Id corresponding to the list of Holidays of the user.")
    ] = None
    deactivationDate: Annotated[
        AwareDatetime | None,
        Field(description="Timestamp of the soft delete. If null, the user is active, otherwise it is deactivated."),
    ] = None
    legalEntityID: Annotated[
        int | None, Field(description="The technical internal Id corresponding to the legal entity of the user.")
    ] = None
    legalEntityName: Annotated[
        str | None, Field(description="It is the name of the legal entity corresponding to the user.")
    ] = None
    serviceLineID: Annotated[
        int | None, Field(description="The technical Id corresponding to the service line of the user.")
    ] = None
    serviceLineName: Annotated[
        str | None, Field(description="The name of the service line corresponding to the user.")
    ] = None


class UserReferenceInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userID: Annotated[int | None, Field(description="References the user by the decídalo id.")] = None
    employeeID: Annotated[
        str | None,
        Field(
            description="References the user by the external id.\r\nGets ignored, if UserID is set.",
            max_length=500,
            min_length=0,
        ),
    ] = None


class UserReferenceOutput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userID: Annotated[int | None, Field(description="References the user by the decídalo id.")] = None
    employeeID: Annotated[
        str | None, Field(description="References the user by the external id.", max_length=500, min_length=0)
    ] = None


class ValidationErrorElement(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    errorCode: str | None = None
    reason: str | None = None
    propertyName: str | None = None
    attemptedValue: Any | None = None


class ValidationErrorResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    title: str | None = None
    status: HttpStatusCode | None = None
    details: str | None = None
    exceptionType: ExceptionType | None = None
    errors: list[ValidationErrorElement] | None = None


class WeekDaysInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    monday: Annotated[
        bool | None,
        Field(
            description="Flag to indicate whether Monday should be a working day.\r\nIf not provided in the create case, the default is true."
        ),
    ] = None
    tuesday: Annotated[
        bool | None,
        Field(
            description="Flag to indicate whether Tuesday should be a working day.\r\nIf not provided in the create case, the default is true."
        ),
    ] = None
    wednesday: Annotated[
        bool | None,
        Field(
            description="Flag to indicate whether Wednesday should be a working day.\r\nIf not provided in the create case, the default is true."
        ),
    ] = None
    thursday: Annotated[
        bool | None,
        Field(
            description="Flag to indicate whether Thursday should be a working day.\r\nIf not provided in the create case, the default is true."
        ),
    ] = None
    friday: Annotated[
        bool | None,
        Field(
            description="Flag to indicate whether Friday should be a working day.\r\nIf not provided in the create case, the default is true."
        ),
    ] = None
    saturday: Annotated[
        bool | None,
        Field(
            description="Flag to indicate whether Saturday should be a working day.\r\nIf not provided in the create case, the default is false."
        ),
    ] = None
    sunday: Annotated[
        bool | None,
        Field(
            description="Flag to indicate whether Sunday should be a working day.\r\nIf not provided in the create case, the default is false."
        ),
    ] = None


class WeekDaysResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    monday: bool | None = None
    tuesday: bool | None = None
    wednesday: bool | None = None
    thursday: bool | None = None
    friday: bool | None = None
    saturday: bool | None = None
    sunday: bool | None = None


class WorkingProfileInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userWorkingTimePatternID: Annotated[int | None, Field(description="Internal ID of the UserWorkingTimePattern.")] = (
        None
    )
    userWorkingTimePatternCode: Annotated[
        str | None,
        Field(
            description="External identifier for the UserWorkingTimePattern.\r\nWill be set and updated if provided."
        ),
    ] = None
    startDate: Annotated[
        date | None,
        Field(
            description="The Start date of the working time pattern.\r\nThe corresponding end date is automatically set to one day before the next start date of all UserWorkingTimePatterns.",
            examples=["2025-01-01"],
        ),
    ] = None
    hoursPerWeek: Annotated[
        float | None, Field(description="The working hours per week.\r\nThis field is mandatory in the create case.")
    ] = None
    hoursPerDay: Annotated[
        float | None, Field(description="The working hours per day.\r\nThis field is mandatory in the create case.")
    ] = None
    maxHoursPerDay: Annotated[float | None, Field(description="The maximum working hours per day.")] = None
    weekDays: Annotated[
        WeekDaysInput | None,
        Field(
            description="Defines the days on which the user works.\r\nIf this is not provided in the create case, then the default is Monday to Friday."
        ),
    ] = None


class WorkingProfileResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userWorkingTimePatternID: int | None = None
    userWorkingTimePatternCode: str | None = None
    startDate: Annotated[date | None, Field(examples=["2025-01-01"])] = None
    hoursPerWeek: float | None = None
    hoursPerDay: float | None = None
    maxHoursPerDay: float | None = None
    weekDays: WeekDaysResult | None = None


class BookingInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    bookingID: Annotated[
        int | None,
        Field(
            description="The unique internal identifier of the booking. Either this or the bookingCode must be provided."
        ),
    ] = None
    bookingCode: Annotated[
        str | None,
        Field(
            description="Unique external identifier for a booking entry. Either this or the bookingID must be provided."
        ),
    ] = None
    absenceCode: Annotated[
        str | None,
        Field(
            deprecated=True, description="An AbsenceCode that can be used to identify bookings across different apps."
        ),
    ] = None
    employeeID: Annotated[str | None, Field(description="The external id of the booked Candidate.")] = None
    userID: Annotated[int | None, Field(description="The decídalo internal user id.")] = None
    startDate: Annotated[AwareDatetime | None, Field(description="Start date of the booking")] = None
    endDate: Annotated[AwareDatetime | None, Field(description="End date of the booking")] = None
    capacity: Annotated[float | None, Field(description="booked Capacity")] = None
    subject: Annotated[str, Field(description="The name of the booking", max_length=254)]
    companyID: Annotated[int | None, Field(description="The internal ID of the company linked to the booking.")] = None
    companyCode: Annotated[
        str | None, Field(description="The external code to identify the company.", max_length=100)
    ] = None
    deleted: Annotated[
        bool | None, Field(description="Flag to indicate, whether this booking should be deleted.\r\n(Default: false)")
    ] = False
    dailyPlanning: Annotated[
        list[DailyPlanningItem] | None,
        Field(
            description="An optional list of daily planning entries.\r\nEntries with a planned time will be added if missing or will overwrite existing planning data.\r\nEntries with zero planned time will be removed.\r\nAny planning days that are *not* provided will be left unchanged."
        ),
    ] = None
    projectId: Annotated[
        int | None,
        Field(
            description='In case the "internal" project Id is known, it can be used to link the booking to a project.'
        ),
    ] = None
    projectCode: Annotated[
        str | None,
        Field(
            description="Unique identifier for a project. Can be used to link the booking to a project.", max_length=100
        ),
    ] = None
    bookingType: BookingType | None = None
    bookingAccountingType: Annotated[
        str | None, Field(description="The booking accounting type of the booking.", max_length=50)
    ] = None
    bookingAccountingTypeID: Annotated[
        int | None, Field(description="The booking accounting type id of the booking.")
    ] = None
    bookingRejectionReason: Annotated[
        str | None, Field(description="Rejection reason name of the booking.", max_length=50)
    ] = None
    bookingRejectionReasonID: Annotated[int | None, Field(description="Rejection reason id of the booking.")] = None
    recordedTime: Annotated[int | None, Field(description="Recorded time in minutes.")] = None
    customProperties: Annotated[dict[str, Any] | None, Field(description="List of custom properties.")] = None


class BookingItemOutput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    bookingID: Annotated[int | None, Field(description="The internal id of the booking")] = None
    bookingCode: Annotated[str | None, Field(description="The external ID of a booking")] = None
    employeeID: Annotated[str | None, Field(description="External ID of the booked user")] = None
    userID: Annotated[int | None, Field(description="Internal ID of a booked user")] = None
    startDate: Annotated[date | None, Field(description="Start date of the booking")] = None
    endDate: Annotated[date | None, Field(description="End date of the booking")] = None
    capacity: Annotated[
        float | None,
        Field(
            description="The capacity of the booking. A number between 1.0 and 0. Representing how much of the users time is planned for the booking."
        ),
    ] = None
    subject: Annotated[str | None, Field(description="Subject of the booking", max_length=254, min_length=0)] = None
    companyID: Annotated[
        int | None, Field(description="Internal identifier of the company linked to this booking.")
    ] = None
    companyCode: Annotated[
        str | None, Field(description="External identifier of the company linked to this booking.")
    ] = None
    projectID: Annotated[int | None, Field(description="Internal identifier of the project linked to the booking.")] = (
        None
    )
    projectCode: Annotated[
        str | None, Field(description="External identifier of the project linked to the booking.")
    ] = None
    bookingType: Annotated[BookingType | None, Field(description="The type of the booking.")] = None
    bookingAccountingType: Annotated[str | None, Field(description="The accounting type of the booking.")] = None
    bookingAccountingTypeID: Annotated[int | None, Field(description="The accounting type id of the booking.")] = None
    bookingRejectionReason: Annotated[str | None, Field(description="The rejection reason of the booking.")] = None
    bookingRejectionReasonID: Annotated[int | None, Field(description="The rejection reason id of the booking.")] = None
    recordedTime: Annotated[
        int | None, Field(description="The amount of time recorded on this booking in minutes.")
    ] = None
    customProperties: Annotated[dict[str, Any] | None, Field(description="The custom properties")] = None
    dailyPlanning: Annotated[
        list[DailyPlanningItem] | None, Field(description="Daily planned time for the booking.")
    ] = None
    creationDate: Annotated[AwareDatetime | None, Field(description="Creation timestamp of the booking.")] = None
    lastUpdate: Annotated[AwareDatetime | None, Field(description="The last update timestamp of the booking.")] = None


class CustomProperty(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    propertyName: Annotated[
        str | None,
        Field(
            description="The identifier of the custom property.\r\nSend this as a key for the custom property value."
        ),
    ] = None
    dataType: Annotated[
        CustomPropertyDataType | None,
        Field(description="Describes which content is allowed as value for the custom property."),
    ] = None
    dataFormat: Annotated[
        CustomPropertyDataFormat | None,
        Field(description="Describes the format in which the custom property value is expected in JSON."),
    ] = None
    isRequired: Annotated[
        bool | None,
        Field(
            description="Indicates whether the custom property is required to be set when creating or updating an entity."
        ),
    ] = None
    maxLength: Annotated[
        int | None, Field(description="Specifies the maximum length if the custom property is a string.")
    ] = None
    options: Annotated[
        list[CustomPropertyOption] | None,
        Field(
            description="If the custom property is of type ValueList, then this contains the list of available options.\r\nNull, if it is not a ValueList."
        ),
    ] = None
    defaultOptionValue: Annotated[
        int | None,
        Field(
            description="Specifies which of the select options is flagged as the default option.\r\nCan be null, if there is no default."
        ),
    ] = None


class GetImportUserWorkingProfileResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userIdentity: UserIdentityResult | None = None
    workingTimePatterns: list[WorkingProfileResult] | None = None


class ImportBatchStatus(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    status: ImportBatchStatusType
    errorMessage: str | None = None


class ImportItemStatus(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    status: ImportItemStatusType | None = None
    errorMessage: str | None = None


class ImportResourceRequestCommandResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    requestID: int | None = None
    status: ImportItemStatus | None = None


class ImportWorkingProfileResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userWorkingTimePatternID: Annotated[int | None, Field(description="Internal ID of the UserWorkingTimePattern.")] = (
        None
    )
    userWorkingTimePatternCode: Annotated[
        str | None, Field(description="External identifier of the UserWorkingTimePattern.")
    ] = None
    status: Annotated[ImportItemStatus | None, Field(description="The status of the import.")] = None


class ProjectReferencePropertiesInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    name: Annotated[
        TextFieldInput | None,
        Field(
            description="Name of the project.\r\nIf not set, it won't be changed.\r\nRequired to create new projects."
        ),
    ] = None
    description: Annotated[
        TextFieldInput | None, Field(description="Description of the project.\r\nIf not set, it won't be changed.")
    ] = None
    notes: Annotated[
        TextFieldInput | None, Field(description="Notes of the project.\r\nIf not set, it won't be changed.")
    ] = None
    startDate: Annotated[
        date | None,
        Field(description="First day of the project.\r\nIf not set, it won't be changed.", examples=["2025-01-01"]),
    ] = None
    endDate: Annotated[
        date | None,
        Field(description="Last day of the project.\r\nIf not set, it won't be changed.", examples=["2025-01-01"]),
    ] = None
    contactPerson: Annotated[
        str | None, Field(description="Contact person of the project.\r\nIf not set, it won't be changed.")
    ] = None
    projectVolume: Annotated[
        float | None,
        Field(
            description="The money volume of the project.\r\nIf not set, it won't be changed.\r\nIf set, then the currency must be set as well."
        ),
    ] = None
    projectVolumeCurrency: Annotated[
        str | None,
        Field(
            description="The currency of the money volume of the project.\r\nThe three letter currency code (like 'USD' or 'EUR').\r\nIf not set, it will use the client's default value.",
            max_length=3,
        ),
    ] = None
    isCentralProject: Annotated[
        bool | None,
        Field(
            description="Flag to indicate whether this project is a central project.\r\nIf no value is provided, this flag is set to true in the create case."
        ),
    ] = None
    displayCustomerDataOnCv: Annotated[
        bool | None,
        Field(
            description="Flag to indicate whether the customer data should be displayed on a CV.\r\nIf no value is provided, this flag is set to true in the create case."
        ),
    ] = None
    referenceStatus: Annotated[
        TextFieldInput | None,
        Field(
            description="Status of the projectreference.\r\nValues like 'Internal' or 'External'.\r\nIf not set, it won't be changed."
        ),
    ] = None
    projectStatus: Annotated[
        TextFieldInput | None,
        Field(
            description="Status of the project.\r\nValues like 'Unconfirmed', 'Planned', 'Active' or 'Completed'.\r\nIf not set, it won't be changed."
        ),
    ] = None
    projectManager: Annotated[
        UserReferenceInput | None,
        Field(
            description="The primary project manager for the project.\r\nIf not provided, the current primary project manager is not changed.\r\nTo remove the primary project manager, set UserID to null."
        ),
    ] = None
    resourceManager: Annotated[
        UserReferenceInput | None,
        Field(
            description="The primary resource manager for the project.\r\nIf not provided, the current primary resource manager is not changed.\r\nTo remove the primary resource manager, set UserID to null."
        ),
    ] = None
    salesResponsible: Annotated[
        UserReferenceInput | None,
        Field(
            description="The primary sales responsible for the project.\r\nIf not provided, the current primary sales responsible is not changed.\r\nTo remove the primary sales responsible, set UserID to null."
        ),
    ] = None
    projectAssistant: Annotated[
        UserReferenceInput | None,
        Field(
            description="The primary project assistant for the project.\r\nIf not provided, the current primary project assistant is not changed.\r\nTo remove the primary project assistant, set UserID to null."
        ),
    ] = None
    countryCode: Annotated[
        str | None,
        Field(
            description="The two-letter code representing the country of the project.\r\nFor example 'DE' or 'GB'.\r\nIf not set, it won't be changed.",
            max_length=2,
        ),
    ] = None
    location: Annotated[
        str | None,
        Field(description="The location of the project.\r\nIf not set, it won't be changed.", max_length=100),
    ] = None
    deliveryModel: Annotated[
        TextFieldInput | None,
        Field(
            description="Delivery model of the project.\r\nValues like 'Onshore' or 'Offshore'.\r\nIf not set, it won't be changed."
        ),
    ] = None
    businessUnit: Annotated[
        TextFieldInput | None,
        Field(
            description="Business unit of the project.\r\nValues like 'Sales' or 'Consulting'.\r\nIf not set, it won't be changed."
        ),
    ] = None
    practiceArea: Annotated[
        TextFieldInput | None,
        Field(
            description="Practice area of the project.\r\nValues like 'Project Management' or 'IT Security'.\r\nIf not set, it won't be changed."
        ),
    ] = None
    customProperties: Annotated[
        dict[str, Any] | None,
        Field(
            description="Custom fields of the project. \r\nValues can be any primitive type like string, int, bool or DateTime (formatted as string)."
        ),
    ] = None


class ProjectReferencePropertiesOutput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    name: Annotated[TextFieldInput, Field(description="Name of the project.")]
    description: Annotated[TextFieldInput | None, Field(description="Description text of the project.")] = None
    notes: Annotated[TextFieldInput | None, Field(description="Notes field of the project.")] = None
    startDate: Annotated[date | None, Field(description="First day of the project.\r\nFormatted as yyyy-MM-dd.")] = None
    endDate: Annotated[date | None, Field(description="Last day of the project.\r\nFormatted as yyyy-MM-dd.")] = None
    contactPerson: Annotated[str | None, Field(description="Name of the contact person for this project.")] = None
    projectVolume: Annotated[
        float | None,
        Field(
            description="Money volume of the project.\r\nThe currency of this amount is specified in ProjectVolumeCurrency."
        ),
    ] = None
    projectVolumeCurrency: Annotated[
        str | None,
        Field(
            description="Currency of the project volume as three letter iso codes,\r\ne.g. 'USD' or 'EUR'.",
            max_length=3,
            min_length=0,
        ),
    ] = None
    isCentralProject: Annotated[
        bool | None, Field(description="Indicates whether the project is a central project.")
    ] = None
    displayCustomerDataOnCv: Annotated[
        bool | None, Field(description="Indicates whether the customer data should be displayed on a CV.")
    ] = None
    referenceStatus: Annotated[
        TextFieldInput | None, Field(description='Status of the project reference.\r\nE.g. "Internal" or "External".')
    ] = None
    projectStatus: Annotated[
        TextFieldInput | None, Field(description='Status of the project.\r\nE.g. "Active", "Completed", etc.')
    ] = None
    projectManager: Annotated[
        UserReferenceOutput | None, Field(description="The primary project manager of the project.")
    ] = None
    resourceManager: Annotated[
        UserReferenceOutput | None,
        Field(description="The primary resource manager responsible for resource allocation and management."),
    ] = None
    salesResponsible: Annotated[
        UserReferenceOutput | None,
        Field(description="The primary sales responsible person who handled the project sale."),
    ] = None
    projectAssistant: Annotated[
        UserReferenceOutput | None, Field(description="The primary project assistant of the project.")
    ] = None
    countryCode: Annotated[
        str | None, Field(description="The two-letter code representing the country of the project.", max_length=2)
    ] = None
    location: Annotated[str | None, Field(description="The location of the project.", max_length=100)] = None
    deliveryModel: Annotated[
        TextFieldInput | None,
        Field(description="Delivery model of the project.\r\nValues like 'Onshore' or 'Offshore'."),
    ] = None
    businessUnit: Annotated[
        TextFieldInput | None,
        Field(description="Business unit of the project.\r\nValues like 'Sales' or 'Consulting'."),
    ] = None
    practiceArea: Annotated[
        TextFieldInput | None,
        Field(description="Practice area of the project.\r\nValues like 'Project Management' or 'IT Security'."),
    ] = None
    customProperties: Annotated[
        dict[str, Any] | None,
        Field(
            description="Custom fields of the project. \r\nValues can be any primitive type like string, int, bool or DateTime (formatted as string)."
        ),
    ] = None


class ResourceRequestInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    identifier: Annotated[
        ResourceRequestIdentifierInput | None,
        Field(
            description="Id of the resource request.\r\nIf no Id is provided then a new resource request will be created."
        ),
    ] = None
    status: ResourceRequestStatus | None = None
    properties: Annotated[
        ResourceRequestPropertiesInput | None,
        Field(
            description="Fields of the resource request that can be set by the user.\r\nIf no values are provided, the existing values will be kept."
        ),
    ] = None
    company: Annotated[
        CompanyReferenceInput | None,
        Field(
            description="The company for which the resource request is made.\r\nIf not supplied, the company will not be changed.\r\nTo remove the company from the resource request, set an empty object.\r\nIf the company does not exist, it will be created with the provided values."
        ),
    ] = None
    industry: Annotated[
        ProjectIndustryReferenceInput | None,
        Field(
            description="Target industry for the resource request, if any.\r\nIf not supplied, the industry will not be changed.\r\nTo remove the industry from the resource request, set an empty object.\r\nIf the industry does not exist, it will be created with the provided values."
        ),
    ] = None
    assignedResourceManager: Annotated[
        UserReferenceInput | None,
        Field(
            description="Assigned user that is responsible for the resource request.\r\nIf not supplied, the assigned resource manager will not be changed.\r\nTo remove the assigned resource manager from the resource request, set an empty object.\r\nIf the user does not exist, it will result in an error."
        ),
    ] = None
    delete: Annotated[
        bool | None,
        Field(description="Flag to indicate, whether the resource request should be deleted.\r\nDefault: false."),
    ] = None
    project: Annotated[
        ProjectReferenceIdentityInput | None,
        Field(
            description="The existing project that we wish to link to the resource request.\r\nIt is irrelevant whether the resource request exists or not but at the moment we support only the linking of\r\nalready existing projects. \r\nThe link is established by creating a dummy booking which is connected \r\non one end with the project and on the other end with the resource request\r\nIf the project code or project id does not exist, nothing is going to be linked."
        ),
    ] = None


class ResourceRequestOutput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    identifier: Annotated[ResourceRequestIdentifier, Field(description="Id of the resource request.")]
    status: Annotated[ResourceRequestStatus, Field(description="Current processing status of the resource request.")]
    properties: Annotated[
        ResourceRequestPropertiesOutput,
        Field(description="Fields of the resource request that can be set by the user."),
    ]
    lastEditDate: Annotated[AwareDatetime, Field(description="Timestamp of the last change ot the resource request.")]
    company: Annotated[
        CompanyReference | None, Field(description="The company for which the resource request is made.")
    ] = None
    industry: Annotated[
        IndustryOutput | None, Field(description="Target industry for the resource request, if any.")
    ] = None
    assignedResourceManager: Annotated[
        UserReferenceOutput | None, Field(description="Assigned user that is responsible for the resource request.")
    ] = None
    project: Annotated[
        ProjectReferenceIdentity | None, Field(description="The project that is linked to the resource request.")
    ] = None


class RoleCertificateInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    certificateID: Annotated[int | None, Field(description="Internal ID of the certificate.")] = None
    certificateName: TextFieldInput | None = None


class RolePropertiesInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    roleName: TextFieldInput | None = None
    roleDescription: TextFieldInput | None = None
    roleCode: Annotated[str | None, Field(description="External identifier of the role.", max_length=100)] = None


class RoleSkillInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    skillID: Annotated[int | None, Field(description="Internal ID of the skill.")] = None
    skillName: TextFieldInput | None = None
    skillLevel: Annotated[
        int | None,
        Field(
            description="The skill level of the skill for the role.\r\nWhen the value 'null' is provided or no value at all, then 'Any level' is set."
        ),
    ] = None


class TeamBatchInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    teams: Annotated[list[TeamInput], Field(description="List of teams to import.")]
    callback: Annotated[
        str | None,
        Field(
            description="Web hook endpoint to notify about the completion of the import.", max_length=2000, min_length=0
        ),
    ] = None


class UserBatchImportMetadata(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    batchID: UUID | None = None
    creationDate: AwareDatetime | None = None
    startDate: AwareDatetime | None = None
    endDate: AwareDatetime | None = None
    status: ImportBatchStatus | None = None


class UserBatchInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    users: Annotated[list[UserInput], Field(description="List of users to import.")]
    callback: Annotated[
        str | None,
        Field(
            description="Web hook endpoint to notify about the completion of the import.", max_length=2000, min_length=0
        ),
    ] = None


class UserImportBatchResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    batchID: Annotated[UUID, Field(description="Identifier of the batch.")]
    status: Annotated[ImportBatchStatus, Field(description="The current status of the import.")]


class UserWorkingProfileInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userIdentity: Annotated[UserIdentityInput | None, Field(description="Defines a user.")] = None
    workingTimePatterns: Annotated[
        list[WorkingProfileInput] | None, Field(description="Defines multiple WorkingTimePatterns from a user.")
    ] = None


class AbsenceImportResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    absenceId: Annotated[int | None, Field(description="Internal ID of the absence.")] = None
    userId: Annotated[int | None, Field(description="ID of the user whose absences are imported")] = None
    startDate: Annotated[date | None, Field(description="Start of the absence.", examples=["2025-01-01"])] = None
    endDate: Annotated[date | None, Field(description="End of the absence.", examples=["2025-01-01"])] = None
    subject: Annotated[str | None, Field(description="Informal text displayed in the UI")] = None
    absenceCode: Annotated[str | None, Field(description="Technical identifier")] = None
    employeeID: Annotated[str | None, Field(description="Customer-specific user ID")] = None
    importStatus: Annotated[ImportItemStatus | None, Field(description="Describes the result of the import.")] = None


class BatchImportMetadata(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    batchID: UUID | None = None
    creationDate: AwareDatetime | None = None
    startDate: AwareDatetime | None = None
    endDate: AwareDatetime | None = None
    status: ImportBatchStatus | None = None


class BookingBatchInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    elements: Annotated[list[BookingInput], Field(description="List of users to import.")]


class BookingImportResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    bookingID: Annotated[int | None, Field(description="The internal ID of the booking.")] = None
    employeeID: Annotated[str | None, Field(description="The external id of the booked Candidate.")] = None
    userID: Annotated[int | None, Field(description="ID of the booked Candidate.")] = None
    companyID: Annotated[int | None, Field(description="ID of the Company.")] = None
    importStatus: Annotated[
        ImportItemStatus | None,
        Field(
            description="The result status for the import item.\r\nIndicates, whether the booking was created or updated."
        ),
    ] = None
    customProperties: Annotated[dict[str, Any] | None, Field(description="The Custom properties.")] = None


class ImportCompanyResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    companyID: int | None = None
    status: ImportItemStatus | None = None


class ImportUserWorkingProfileResult(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    userID: Annotated[int | None, Field(description="The ID of the user.")] = None
    userWorkingTimePatternResults: Annotated[
        list[ImportWorkingProfileResult] | None, Field(description="The result for each UserWorkingTimePattern.")
    ] = None
    status: Annotated[ImportItemStatus | None, Field(description="The status of the import.")] = None


class ProjectReferenceInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    identifier: Annotated[
        ProjectReferenceIdentityInput,
        Field(description="The identifier of the project.\r\nHas to be specified in some form."),
    ]
    properties: Annotated[
        ProjectReferencePropertiesInput | None,
        Field(
            description="Properties of the project.\r\nIf not set, the properties won't be changed.\r\nThe create case requires some properties."
        ),
    ] = None
    company: Annotated[
        ProjectCompanyReferenceInput | None,
        Field(
            description='Reference to the company, that is the customer of the project.\r\nIf not set, the company won\'t be changed.\r\nTo remove the company from the project, set an empty object "{}".'
        ),
    ] = None
    industry: ProjectIndustryReferenceInput | None = None
    keywords: Annotated[
        list[KeywordInput] | None,
        Field(
            description="Full list of keywords for the project.\r\nKeywords not in the list will be removed. An empty list will remove all keywords.\r\nIf the field is not provided, the keywords won't be changed."
        ),
    ] = None
    creator: Annotated[
        UserReferenceInput | None,
        Field(
            description="The user, that is to be set as the creator of the project.\r\nOnly used in the create case."
        ),
    ] = None
    delete: Annotated[
        bool | None, Field(description="Flag to indicate, whether the project should be deleted. (Default: false)")
    ] = False


class ProjectReferenceOutput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    identifier: Annotated[ProjectReferenceIdentity, Field(description="The identifier of the project.")]
    properties: Annotated[ProjectReferencePropertiesOutput, Field(description="The properties of the project.")]
    company: Annotated[CompanyOutput | None, Field(description="The customer of the project.")] = None
    industry: Annotated[IndustryOutput | None, Field(description="The industry in which the project takes place.")] = (
        None
    )
    keywords: Annotated[list[KeywordInput], Field(description="List of keywords of the projects.")]


class RoleImportInput(BaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    identifier: Annotated[
        RoleIdentityInput | None,
        Field(description="Identifier of the role.\r\nIf not provided, then a new Role will be created."),
    ] = None
    properties: Annotated[RolePropertiesInput | None, Field(description="Defines the properties of the role.")] = None
    roleCertificates: Annotated[
        list[RoleCertificateInput] | None, Field(description="Defines the certificates associated with the role.")
    ] = None
    roleSkills: Annotated[
        list[RoleSkillInput] | None, Field(description="Defines the skills associated with the role.")
    ] = None
