// 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"
)

// UpdateCoreHRPreHire 更新待入职对象指定字段的值
//
// doc: https://open.larkoffice.com/document/uAjLw4CM/ukTMukTMukTM/corehr-v2/pre_hire/patch
func (r *CoreHRService) UpdateCoreHRPreHire(ctx context.Context, request *UpdateCoreHRPreHireReq, options ...MethodOptionFunc) (*UpdateCoreHRPreHireResp, *Response, error) {
	if r.cli.mock.mockCoreHRUpdateCoreHRPreHire != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] CoreHR#UpdateCoreHRPreHire mock enable")
		return r.cli.mock.mockCoreHRUpdateCoreHRPreHire(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "CoreHR",
		API:                   "UpdateCoreHRPreHire",
		Method:                "PATCH",
		URL:                   r.cli.openBaseURL + "/open-apis/corehr/v2/pre_hires/:pre_hire_id",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
	}
	resp := new(updateCoreHRPreHireResp)

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

// MockCoreHRUpdateCoreHRPreHire mock CoreHRUpdateCoreHRPreHire method
func (r *Mock) MockCoreHRUpdateCoreHRPreHire(f func(ctx context.Context, request *UpdateCoreHRPreHireReq, options ...MethodOptionFunc) (*UpdateCoreHRPreHireResp, *Response, error)) {
	r.mockCoreHRUpdateCoreHRPreHire = f
}

// UnMockCoreHRUpdateCoreHRPreHire un-mock CoreHRUpdateCoreHRPreHire method
func (r *Mock) UnMockCoreHRUpdateCoreHRPreHire() {
	r.mockCoreHRUpdateCoreHRPreHire = nil
}

// UpdateCoreHRPreHireReq ...
type UpdateCoreHRPreHireReq struct {
	PreHireID            string                                 `path:"pre_hire_id" json:"-"`             // 待入职ID, 示例值: "7345005664477775411"
	BasicInfoUpdate      *UpdateCoreHRPreHireReqBasicInfoUpdate `json:"basic_info_update,omitempty"`      // 更新个人（person）信息
	OfferInfoUpdate      *UpdateCoreHRPreHireReqOfferInfoUpdate `json:"offer_info_update,omitempty"`      // 更新待入职（prehire）信息
	StandardUpdateFields []string                               `json:"standard_update_fields,omitempty"` // 指定需要更新的系统字段, 只支持最多下钻一层, 格式如下: basic_info_update字段: basic_info_update.names（对name整体进行覆盖更新）；basic_info_update.emails（对邮箱整体进行更新）, offer_info_update字段: offer_info_update.onboarding_method, 注意, 如果指定了要更新的系统字段但是没有在结构体中传对应的值, 那么就会清空该字段的值, 示例值: ["basic_info_update.names"]
	CustomUpdateFields   []string                               `json:"custom_update_fields,omitempty"`   // 指定需要更新的PreHire对象上的自定义字段, 格式如下: custom_field1__c, 注意, 如果指定了要更新的自定义字段但是没有在结构体中传对应的值, 那么就会清空该字段的值, 示例值: ["custom_field1__c"]
}

// UpdateCoreHRPreHireReqBasicInfoUpdate ...
type UpdateCoreHRPreHireReqBasicInfoUpdate struct {
	Names  []*UpdateCoreHRPreHireReqBasicInfoUpdateName  `json:"names,omitempty"`  // 姓名, 该值是一个list, 会全量更新。即使只更新 list 中的某一个元素, 也需要把其它元素都完整传值, 否则将丢失数据。
	Phones []*UpdateCoreHRPreHireReqBasicInfoUpdatePhone `json:"phones,omitempty"` // 电话, 该值是一个list, 会全量更新。即使只更新 list 中的某一个元素, 也需要把其它元素都完整传值, 否则将丢失数据。
	Emails []*UpdateCoreHRPreHireReqBasicInfoUpdateEmail `json:"emails,omitempty"` // 邮箱, 该值是一个list, 会全量更新。即使只更新 list 中的某一个元素, 也需要把其它元素都完整传值, 否则将丢失数据。
}

// UpdateCoreHRPreHireReqBasicInfoUpdateEmail ...
type UpdateCoreHRPreHireReqBasicInfoUpdateEmail struct {
	Email      string `json:"email,omitempty"`       // 邮箱地址, 示例值: "1234567@bytedance.com"
	IsPrimary  bool   `json:"is_primary,omitempty"`  // 是否为主要邮箱, 若有多个邮箱, 只能有一个邮箱的「is_primary」为true, 示例值: true
	IsPublic   bool   `json:"is_public,omitempty"`   // 是否为公开邮箱, 示例值: true
	EmailUsage string `json:"email_usage,omitempty"` // 邮箱用途, 枚举值可通过文档[枚举常量介绍](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/corehr-v1/feishu-people-enum-constant)获得, 示例值: "work"
}

// UpdateCoreHRPreHireReqBasicInfoUpdateName ...
type UpdateCoreHRPreHireReqBasicInfoUpdateName struct {
	FullName          *string `json:"full_name,omitempty"`           // 全名, 示例值: "李一一"
	FirstName         *string `json:"first_name,omitempty"`          // 名, 示例值: "一"
	MiddleName        *string `json:"middle_name,omitempty"`         // 中间名, 示例值: "一"
	NamePrimary       *string `json:"name_primary,omitempty"`        // 姓, 示例值: "李"
	LocalFirstName    *string `json:"local_first_name,omitempty"`    // 名 - 本地文字, 示例值: "一"
	LocalMiddleName   *string `json:"local_middle_name,omitempty"`   // 本地中间名, 示例值: "一"
	LocalPrimary      *string `json:"local_primary,omitempty"`       // 姓 - 本地文字, 示例值: "李"
	CustomLocalName   *string `json:"custom_local_name,omitempty"`   // 自定义姓名（本地文字）, 示例值: "李一一"
	CustomWesternName *string `json:"custom_western_name,omitempty"` // 自定义姓名（西方文字）, 示例值: "YiyiLi"
	CountryRegion     string  `json:"country_region,omitempty"`      // 国家/地区, 示例值: "6862995757234914824"
	NameType          string  `json:"name_type,omitempty"`           // 姓名类型, 枚举值如下: legal_name: 法定姓名, preferred_name: 常用名, former_name: 曾用名, additional_name: 别名, 示例值: "legal_name"
}

// UpdateCoreHRPreHireReqBasicInfoUpdatePhone ...
type UpdateCoreHRPreHireReqBasicInfoUpdatePhone struct {
	InternationalAreaCode string `json:"international_area_code,omitempty"` // 国家区号, 枚举值, 示例值: "86_china"
	PhoneNumber           string `json:"phone_number,omitempty"`            // 电话号码, 示例值: "010-12345678"
	DeviceType            string `json:"device_type,omitempty"`             // 设备类型, 枚举值, mobile_phone: 手机, landline: 座机, fax: 传真, 示例值: "mobile_phone"
	PhoneUsage            string `json:"phone_usage,omitempty"`             // 电话用途, 枚举值, work: 工作, home: 家庭, emergency_contact: 紧急联系人, company: 公司, 示例值: "work"
	IsPrimary             bool   `json:"is_primary,omitempty"`              // 主要电话, 若有多个电话, 只能有一个电话的「is_primary」为true, 示例值: true
	IsPublic              bool   `json:"is_public,omitempty"`               // 公开电话, 示例值: true
}

// UpdateCoreHRPreHireReqOfferInfoUpdate ...
type UpdateCoreHRPreHireReqOfferInfoUpdate struct {
	OnboardingDate       *string                                                `json:"onboarding_date,omitempty"`        // 入职日期, 示例值: "2022-10-08"
	AtsApplicationID     *string                                                `json:"ats_application_id,omitempty"`     // 招聘应用ID, 示例值: "7140946969586010375"
	OnboardingLocationID *string                                                `json:"onboarding_location_id,omitempty"` // 入职地点ID, 详细信息可通过[批量查询地点](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/corehr-v1/location/list)获得, 示例值: "6977976687350924832"
	OnboardingAddressID  *string                                                `json:"onboarding_address_id,omitempty"`  // 入职地址ID, 详细信息可通过[批量查询地址]接口获得, 示例值: "6977976687350924832"
	OfficeLocationID     *string                                                `json:"office_location_id,omitempty"`     // 办公地点ID, 详细信息可通过[批量查询地点](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/corehr-v1/location/list)获得, 示例值: "6977976687350924833"
	OfficeAddressID      *string                                                `json:"office_address_id,omitempty"`      // 办公地址ID, 详细信息可通过[批量查询地址]接口获得, 示例值: "6977976687350924832"
	EmploymentType       *string                                                `json:"employment_type,omitempty"`        // 雇佣类型, [枚举常量介绍](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/corehr-v1/feishu-people-enum-constant)获得, employee(员工), contingent_worker(临时工), 示例值: "employee"
	OnboardingMethod     *string                                                `json:"onboarding_method,omitempty"`      // 入职方式, 通过[枚举常量介绍](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/corehr-v1/feishu-people-enum-constant)获得, onsite(现场入职), remote(远程入职), 示例值: "onsite"
	WorkEmails           []*UpdateCoreHRPreHireReqOfferInfoUpdateWorkEmail      `json:"work_emails,omitempty"`            // 工作邮箱, 该值是一个list, 会全量更新。即使只更新 list 中的某一个元素, 也需要把其它元素都完整传值, 否则将丢失数据。
	CostCenterRates      []*UpdateCoreHRPreHireReqOfferInfoUpdateCostCenterRate `json:"cost_center_rates,omitempty"`      // 成本中心分摊信息, 只支持商业化租户
	CustomFields         []*UpdateCoreHRPreHireReqOfferInfoUpdateCustomField    `json:"custom_fields,omitempty"`          // 自定义字段
}

// UpdateCoreHRPreHireReqOfferInfoUpdateCostCenterRate ...
type UpdateCoreHRPreHireReqOfferInfoUpdateCostCenterRate struct {
	CostCenterID *string `json:"cost_center_id,omitempty"` // 成本中心 ID, 可以通过[查询单个成本中心信息]获取对应的成本中心信息, 示例值: "6950635856373745165"
	Rate         *int64  `json:"rate,omitempty"`           // 分摊比例, 示例值: 100
}

// UpdateCoreHRPreHireReqOfferInfoUpdateCustomField ...
type UpdateCoreHRPreHireReqOfferInfoUpdateCustomField struct {
	FieldName string `json:"field_name,omitempty"` // 字段名, 示例值: "name"
	Value     string `json:"value,omitempty"`      // 字段值, 该值是一个 string list 经转义后的字符串, 具体参考请求体示例, 示例值: "[\"Sandy\"]"
}

// UpdateCoreHRPreHireReqOfferInfoUpdateWorkEmail ...
type UpdateCoreHRPreHireReqOfferInfoUpdateWorkEmail struct {
	Email      string `json:"email,omitempty"`       // 邮箱地址, 示例值: "1234567@bytedance.com"
	IsPrimary  bool   `json:"is_primary,omitempty"`  // 是否为主要邮箱, 若有多个邮箱, 只能有一个邮箱的「is_primary」为true, 示例值: true
	IsPublic   bool   `json:"is_public,omitempty"`   // 是否为公开邮箱, 示例值: true
	EmailUsage string `json:"email_usage,omitempty"` // 邮箱用途, 枚举值可通过[枚举常量介绍](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/corehr-v1/feishu-people-enum-constant)获得, 示例值: "work"
}

// UpdateCoreHRPreHireResp ...
type UpdateCoreHRPreHireResp struct {
	PreHireID string `json:"pre_hire_id,omitempty"` // 待入职ID
}

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