// Code generated by lark_sdk_gen. DO NOT EDIT.
/**
 * Copyright 2022 chyroc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package lark

import (
	"context"
)

// CreateHireOffer 创建 Offer 时, 需传入本文档中标注为必传的参数, 其余参数是否必传参考「获取 Offer 申请表模板信息」的参数定义。
//
// doc: https://open.feishu.cn/document/ukTMukTMukTM/uMzM1YjLzMTN24yMzUjN/hire-v1/offer/create
// new doc: https://open.feishu.cn/document/server-docs/hire-v1/candidate-management/delivery-process-management/offer/create
func (r *HireService) CreateHireOffer(ctx context.Context, request *CreateHireOfferReq, options ...MethodOptionFunc) (*CreateHireOfferResp, *Response, error) {
	if r.cli.mock.mockHireCreateHireOffer != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] Hire#CreateHireOffer mock enable")
		return r.cli.mock.mockHireCreateHireOffer(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "Hire",
		API:                   "CreateHireOffer",
		Method:                "POST",
		URL:                   r.cli.openBaseURL + "/open-apis/hire/v1/offers",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
	}
	resp := new(createHireOfferResp)

	response, err := r.cli.RawRequest(ctx, req, resp)
	return resp.Data, response, err
}

// MockHireCreateHireOffer mock HireCreateHireOffer method
func (r *Mock) MockHireCreateHireOffer(f func(ctx context.Context, request *CreateHireOfferReq, options ...MethodOptionFunc) (*CreateHireOfferResp, *Response, error)) {
	r.mockHireCreateHireOffer = f
}

// UnMockHireCreateHireOffer un-mock HireCreateHireOffer method
func (r *Mock) UnMockHireCreateHireOffer() {
	r.mockHireCreateHireOffer = nil
}

// CreateHireOfferReq ...
type CreateHireOfferReq struct {
	UserIDType         *IDType                             `query:"user_id_type" json:"-"`          // 用户 ID 类型, 示例值: open_id, 可选值有: open_id: 标识一个用户在某个应用中的身份。同一个用户在不同应用中的 Open ID 不同。[了解更多: 如何获取 Open ID](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-openid), union_id: 标识一个用户在某个应用开发商下的身份。同一用户在同一开发商下的应用中的 Union ID 是相同的, 在不同开发商下的应用中的 Union ID 是不同的。通过 Union ID, 应用开发商可以把同个用户在多个应用中的身份关联起来。[了解更多: 如何获取 Union ID？](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-union-id), user_id: 标识一个用户在某个租户内的身份。同一个用户在租户 A 和租户 B 内的 User ID 是不同的。在同一个租户内, 一个用户的 User ID 在所有应用（包括商店应用）中都保持一致。User ID 主要用于在不同的应用间打通用户数据。[了解更多: 如何获取 User ID？](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-user-id), people_admin_id: 以people_admin_id来识别用户, 默认值: `open_id`, 当值为 `user_id`, 字段权限要求: 获取用户 user ID
	DepartmentIDType   *DepartmentIDType                   `query:"department_id_type" json:"-"`    // 此次调用中使用的部门 ID 的类型, 示例值: department_id, 可选值有: open_department_id: 以 open_department_id 来标识部门, department_id: 以 department_id 来标识部门, 默认值: `open_department_id`
	JobLevelIDType     *IDType                             `query:"job_level_id_type" json:"-"`     // 此次调用中使用的「职级 ID」的类型, 示例值: 6942778198054125570, 可选值有: people_admin_job_level_id: 「人力系统管理后台」适用的职级 ID。人力系统管理后台逐步下线中, 建议不继续使用此 ID。, job_level_id: 「飞书管理后台」适用的职级 ID, 通过[「获取租户职级列表」](https://open.feishu.cn/document/server-docs/contact-v3/job_level/list)接口获取, 默认值: `people_admin_job_level_id`
	JobFamilyIDType    *IDType                             `query:"job_family_id_type" json:"-"`    // 此次调用中使用的「序列 ID」的类型, 示例值: 6942778198054125571, 可选值有: people_admin_job_category_id: 「人力系统管理后台」适用的序列 ID。人力系统管理后台逐步下线中, 建议不继续使用此 ID。, job_family_id: 「飞书管理后台」适用的序列 ID, 通过[「获取租户序列列表」](https://open.feishu.cn/document/server-docs/contact-v3/job_family/list)接口获取, 默认值: `people_admin_job_category_id`
	EmployeeTypeIDType *IDType                             `query:"employee_type_id_type" json:"-"` // 此次调用中使用的「人员类型 ID」的类型, 示例值: 1, 可选值有: people_admin_employee_type_id: 「人力系统管理后台」适用的人员类型 ID。人力系统管理后台逐步下线中, 建议不继续使用此 ID。, employee_type_enum_id: 「飞书管理后台」适用的人员类型 ID, 通过[「查询人员类型」](https://open.feishu.cn/document/server-docs/contact-v3/employee_type_enum/list)接口获取, 默认值: `people_admin_employee_type_id`
	ApplicationID      string                              `json:"application_id,omitempty"`        // 投递 ID, 示例值: "7013552389293279532"
	SchemaID           string                              `json:"schema_id,omitempty"`             // Offer 申请表模板 ID, 用于描述申请表单结构的元数据定义, 即对申请表内容的描述。用户每一次更改 Offer 申请表模板信息, 都会生成新的 schema_id, 创建 Offer 时应传入最新的 schema_id, 可先从职位设置中拿到offer申请表ID, 再从「获取Offer申请表模板信息」接口中获取最新的模板ID, 示例值: "7013318077945596204"
	OfferType          *int64                              `json:"offer_type,omitempty"`            // Offer 类型, 示例值: 1, 可选值有: 1: 正式 Offer, 2: 实习 Offer
	BasicInfo          *CreateHireOfferReqBasicInfo        `json:"basic_info,omitempty"`            // Offer 基本信息
	SalaryInfo         *CreateHireOfferReqSalaryInfo       `json:"salary_info,omitempty"`           // Offer 薪资信息
	CustomizedInfoList []*CreateHireOfferReqCustomizedInfo `json:"customized_info_list,omitempty"`  // 自定义信息
}

// CreateHireOfferReqBasicInfo ...
type CreateHireOfferReqBasicInfo struct {
	DepartmentID          string                                     `json:"department_id,omitempty"`          // 部门 ID, 示例值: "od-6b394871807047c7023ebfc1ff37cd3a"
	LeaderUserID          string                                     `json:"leader_user_id,omitempty"`         // 直属上级 ID, 示例值: "ou_ce613028fe74745421f5dc320bb9c709"
	EmploymentJobID       *string                                    `json:"employment_job_id,omitempty"`      // 职务 ID, 示例值: "123"
	EmployeeTypeID        *string                                    `json:"employee_type_id,omitempty"`       // 人员类型 ID, 示例值: "2"
	JobFamilyID           *string                                    `json:"job_family_id,omitempty"`          // 职位序列 ID, 示例值: "6807407987381831949"
	JobLevelID            *string                                    `json:"job_level_id,omitempty"`           // 职位级别 ID, 示例值: "6807407987381881101"
	ProbationMonth        *int64                                     `json:"probation_month,omitempty"`        // 试用期, 示例值: 3
	ContractYear          *int64                                     `json:"contract_year,omitempty"`          // 合同期(年), 推荐使用「contract_period」, 如果Offer申请表中「合同期(年)」字段已停用, 则不可使用该字段, 示例值: 3
	ContractPeriod        *CreateHireOfferReqBasicInfoContractPeriod `json:"contract_period,omitempty"`        // 合同期（年/月）
	ExpectedOnboardDate   *string                                    `json:"expected_onboard_date,omitempty"`  // 预计入职日期, 示例值: "{\"date\":\"2022-04-07\"}"
	OnboardAddressID      *string                                    `json:"onboard_address_id,omitempty"`     // 入职地点 ID, 示例值: "6897079709306259719"
	WorkAddressID         *string                                    `json:"work_address_id,omitempty"`        // 办公地点 ID, 示例值: "6897079709306259719"
	OwnerUserID           string                                     `json:"owner_user_id,omitempty"`          // Offer负责人 ID, 示例值: "ou_ce613028fe74745421f5dc320bb9c709"
	RecommendedWords      *string                                    `json:"recommended_words,omitempty"`      // Offer 推荐语, 示例值: "十分优秀, 推荐入职"
	JobRequirementID      *string                                    `json:"job_requirement_id,omitempty"`     // 招聘需求 ID, 示例值: "2342352224"
	JobProcessTypeID      *int64                                     `json:"job_process_type_id,omitempty"`    // 招聘流程类型 ID, 示例值: 2
	AttachmentIDList      []string                                   `json:"attachment_id_list,omitempty"`     // 附件ID列表, 示例值: ["6792436415209817600"]
	AttachmentDescription *string                                    `json:"attachment_description,omitempty"` // 附件描述, 示例值: "张三的简历"
	OperatorUserID        string                                     `json:"operator_user_id,omitempty"`       // Offer操作人 ID, 示例值: "ou_ce613028fe74745421f5dc320bb9c709"
}

// CreateHireOfferReqBasicInfoContractPeriod ...
type CreateHireOfferReqBasicInfoContractPeriod struct {
	PeriodType int64 `json:"period_type,omitempty"` // 合同周期类型, 示例值: 1, 可选值有: 1: 月, 2: 年
	Period     int64 `json:"period,omitempty"`      // 合同时长, 示例值: 3, 取值范围: `0` ～ `100`
}

// CreateHireOfferReqCustomizedInfo ...
type CreateHireOfferReqCustomizedInfo struct {
	ID    *string `json:"id,omitempty"`    // 自定义字段 ID, 示例值: "6972464088568269100"
	Value *string `json:"value,omitempty"` // 自定义字段信息, 以字符串形式传入, 如: 1. 单选: "1", 2. 多选: "[\"1\", \"2\"]", 3. 日期: "{"date":"2022-01-01"}", 4. 年份选择: "{"date":"2022"}", 5. 月份选择: "{"date":"2022-01"}", 6. 单行文本: "xxx ", 7. 多行文本: "xxx ", 8. 数字: "123", 9. 金额: "123.1", 示例值: "1"
}

// CreateHireOfferReqSalaryInfo ...
type CreateHireOfferReqSalaryInfo struct {
	Currency                  string  `json:"currency,omitempty"`                    // 币种, 示例值: "CNY"
	BasicSalary               *string `json:"basic_salary,omitempty"`                // 基本工资, 当启用 Offer 申请表中的「薪资信息」模块时, 「基本工资」字段为必传项, 示例值: "1000000"
	ProbationSalaryPercentage *string `json:"probation_salary_percentage,omitempty"` // 试用期百分比, 示例值: "0.8"
	AwardSalaryMultiple       *string `json:"award_salary_multiple,omitempty"`       // 年终奖月数, 示例值: "3"
	OptionShares              *string `json:"option_shares,omitempty"`               // 期权股数, 示例值: "30"
	QuarterlyBonus            *string `json:"quarterly_bonus,omitempty"`             // 季度奖金额, 示例值: "3000"
	HalfYearBonus             *string `json:"half_year_bonus,omitempty"`             // 半年奖金额, 示例值: "10000"
}

// CreateHireOfferResp ...
type CreateHireOfferResp struct {
	OfferID            string                               `json:"offer_id,omitempty"`             // Offer ID
	ApplicationID      string                               `json:"application_id,omitempty"`       // 投递 ID
	SchemaID           string                               `json:"schema_id,omitempty"`            // Offer 申请表模板 ID, 用于描述申请表单结构的元数据定义, 即对申请表内容的描述。用户每一次更改 Offer 申请表模板信息, 都会生成新的 schema_id, 创建 Offer 时应传入最新的 schema_id, 可从「获取Offer申请表模板信息」接口中获取
	OfferType          int64                                `json:"offer_type,omitempty"`           // Offer 类型, 可选值有: 1: 正式 Offer, 2: 实习 Offer
	BasicInfo          *CreateHireOfferRespBasicInfo        `json:"basic_info,omitempty"`           // Offer 基本信息
	SalaryInfo         *CreateHireOfferRespSalaryInfo       `json:"salary_info,omitempty"`          // Offer 薪资信息
	CustomizedInfoList []*CreateHireOfferRespCustomizedInfo `json:"customized_info_list,omitempty"` // 自定义信息
}

// CreateHireOfferRespBasicInfo ...
type CreateHireOfferRespBasicInfo struct {
	DepartmentID          string                                      `json:"department_id,omitempty"`          // 部门 ID
	LeaderUserID          string                                      `json:"leader_user_id,omitempty"`         // 直属上级 ID
	EmploymentJobID       string                                      `json:"employment_job_id,omitempty"`      // 职务 ID
	EmployeeTypeID        string                                      `json:"employee_type_id,omitempty"`       // 人员类型 ID
	JobFamilyID           string                                      `json:"job_family_id,omitempty"`          // 职位序列 ID
	JobLevelID            string                                      `json:"job_level_id,omitempty"`           // 职位级别 ID
	ProbationMonth        int64                                       `json:"probation_month,omitempty"`        // 试用期
	ContractYear          int64                                       `json:"contract_year,omitempty"`          // 合同期(年), 推荐使用「contract_period」, 如果Offer申请表中「合同期(年)」字段已停用, 则不可使用该字段
	ContractPeriod        *CreateHireOfferRespBasicInfoContractPeriod `json:"contract_period,omitempty"`        // 合同期（年/月）
	ExpectedOnboardDate   string                                      `json:"expected_onboard_date,omitempty"`  // 预计入职日期
	OnboardAddressID      string                                      `json:"onboard_address_id,omitempty"`     // 入职地点 ID
	WorkAddressID         string                                      `json:"work_address_id,omitempty"`        // 办公地点 ID
	OwnerUserID           string                                      `json:"owner_user_id,omitempty"`          // Offer负责人 ID
	RecommendedWords      string                                      `json:"recommended_words,omitempty"`      // Offer 推荐语
	JobRequirementID      string                                      `json:"job_requirement_id,omitempty"`     // 招聘需求 ID
	JobProcessTypeID      int64                                       `json:"job_process_type_id,omitempty"`    // 招聘流程类型 ID
	AttachmentIDList      []string                                    `json:"attachment_id_list,omitempty"`     // 附件ID列表
	AttachmentDescription string                                      `json:"attachment_description,omitempty"` // 附件描述
	OperatorUserID        string                                      `json:"operator_user_id,omitempty"`       // Offer操作人 ID
}

// CreateHireOfferRespBasicInfoContractPeriod ...
type CreateHireOfferRespBasicInfoContractPeriod struct {
	PeriodType int64 `json:"period_type,omitempty"` // 合同周期类型, 可选值有: 1: 月, 2: 年
	Period     int64 `json:"period,omitempty"`      // 合同时长
}

// CreateHireOfferRespCustomizedInfo ...
type CreateHireOfferRespCustomizedInfo struct {
	ID    string `json:"id,omitempty"`    // 自定义字段 ID
	Value string `json:"value,omitempty"` // 自定义字段信息, 以字符串形式传入, 如: 1. 单选: "1", 2. 多选: "[\"1\", \"2\"]", 3. 日期: "{"date":"2022-01-01"}", 4. 年份选择: "{"date":"2022"}", 5. 月份选择: "{"date":"2022-01"}", 6. 单行文本: "xxx ", 7. 多行文本: "xxx ", 8. 数字: "123", 9. 金额: "123.1"
}

// CreateHireOfferRespSalaryInfo ...
type CreateHireOfferRespSalaryInfo struct {
	Currency                  string `json:"currency,omitempty"`                    // 币种
	BasicSalary               string `json:"basic_salary,omitempty"`                // 基本工资, 当启用 Offer 申请表中的「薪资信息」模块时, 「基本工资」字段为必传项
	ProbationSalaryPercentage string `json:"probation_salary_percentage,omitempty"` // 试用期百分比
	AwardSalaryMultiple       string `json:"award_salary_multiple,omitempty"`       // 年终奖月数
	OptionShares              string `json:"option_shares,omitempty"`               // 期权股数
	QuarterlyBonus            string `json:"quarterly_bonus,omitempty"`             // 季度奖金额
	HalfYearBonus             string `json:"half_year_bonus,omitempty"`             // 半年奖金额
}

// createHireOfferResp ...
type createHireOfferResp struct {
	Code  int64                `json:"code,omitempty"` // 错误码, 非 0 表示失败
	Msg   string               `json:"msg,omitempty"`  // 错误描述
	Data  *CreateHireOfferResp `json:"data,omitempty"`
	Error *ErrorDetail         `json:"error,omitempty"`
}
