// Copyright 2019 Google LLC.
//
// 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.
//

syntax = "proto3";

package google.cloud.talent.v4beta1;

import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "google/cloud/talent/v4beta1/common.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";
import "google/type/date.proto";
import "google/type/postal_address.proto";

option go_package = "google.golang.org/genproto/googleapis/cloud/talent/v4beta1;talent";
option java_multiple_files = true;
option java_outer_classname = "ProfileResourceProto";
option java_package = "com.google.cloud.talent.v4beta1";
option objc_class_prefix = "CTS";

// Cloud Profile Discovery API definition

// A resource that represents the profile for a job candidate (also referred to
// as a "single-source profile").
message Profile {
  // Required during profile update.
  //
  // Resource name assigned to a profile by the API.
  //
  // The format is
  // "projects/{project_id}/tenants/{tenant_id}/profiles/{profile_id}",
  // for example, "projects/foo/tenants/bar/profiles/baz".
  string name = 1;

  // Profile's id in client system, if available. This value is unique for each
  // profile inside a tenant. An error is thrown if another profile with the
  // same external_id is created.
  //
  // The maximum number of bytes allowed is 100.
  string external_id = 2;

  // The source description indicating where the profile is acquired.
  //
  // For example, if a candidate profile is acquired from a resume, the user can
  // input "resume" here to indicate the source.
  //
  // The maximum number of bytes allowed is 100.
  string source = 3;

  // The URI set by clients that links to this profile's client-side copy.
  //
  // The maximum number of bytes allowed is 4000.
  string uri = 4;

  // The cluster id of the profile to associate with other profile(s) for the
  // same candidate.
  //
  // This field should be generated by the customer. If a value is not provided,
  // a random UUID is assigned to this field of the profile.
  //
  // This is used to link multiple profiles to the same candidate. For example,
  // a client has a candidate with two profiles, where one was created recently
  // and the other one was created 5 years ago. These two profiles may be very
  // different. The clients can create the first profile and get a generated
  // [group_id][google.cloud.talent.v4beta1.Profile.group_id], and assign it
  // when the second profile is created, indicating these two profiles are
  // referring to the same candidate.
  string group_id = 5;

  // Indicates the hirable status of the candidate.
  google.protobuf.BoolValue is_hirable = 6;

  // The timestamp when the profile was first created at this source.
  google.protobuf.Timestamp create_time = 7;

  // The timestamp when the profile was last updated at this source.
  google.protobuf.Timestamp update_time = 8;

  // The timestamp when the profile was last updated as a result of a direct or
  // indirect action by a candidate.
  //
  // These actions include:
  //
  // * Direct actions such as the candidate submitting a new resume as part of a
  // job application to the agency, using a self-service tool such as a website
  // to update their profile, and so on.
  // * Indirect actions by the candidate such as uploading a resume to a job
  // board that is collected by the agency through a feed, providing a resume to
  // a recruiter who then uploads it into the ATS, and so on.
  // * Updates made to the candidate's profile by the recruiter as a result of
  // interacting with the candidate (for example adding a skill or work
  // preference, and so on). Changes to
  // [recruiting_notes][google.cloud.talent.v4beta1.Profile.recruiting_notes]
  // are specifically excluded from this action type.
  //
  // Note:
  // [candidate_update_time][google.cloud.talent.v4beta1.Profile.candidate_update_time]
  // must be greater than or equal to
  // [resume_update_time][google.cloud.talent.v4beta1.Profile.resume_update_time]
  // or an error is thrown.
  google.protobuf.Timestamp candidate_update_time = 67;

  // The timestamp when the candidate's resume was added or updated on the
  // candidate's profile. Whether that resume was directly uploaded by a
  // candidate, pulled from a 3rd party job board feed, added by a recruiter,
  // and so on.
  //
  // If this field is updated, it's expected that
  // [resume][google.cloud.talent.v4beta1.Profile.resume] is provided in the
  // create or update calls.
  google.protobuf.Timestamp resume_update_time = 68;

  // The resume representing this profile.
  Resume resume = 53;

  // The names of the candidate this profile references.
  //
  // Currently only one person name is supported.
  repeated PersonName person_names = 11;

  // The candidate's postal addresses. It's highly recommended to
  // input this information as accurately as possible to help improve search
  // quality. Here are some recommendations:
  //
  // * Provide [Address.usage][google.cloud.talent.v4beta1.Address.usage] if
  // possible, especially if the address is PERSONAL. During a search only
  // personal addresses are considered. If there is no such address, all
  // addresses with unspecified usage are assumed to be personal.
  // * Provide [Address.current][google.cloud.talent.v4beta1.Address.current]
  // for the current address if possible. During a search, only current
  // addresses are considered. If there is no such address, all addresses are
  // assumed to be current.
  //
  // When displaying a candidate's addresses, it is sometimes desirable to limit
  // the number of addresses shown. In these cases we recommend that you display
  // the addresses in the following order of priority:
  // 1. [Address.usage][google.cloud.talent.v4beta1.Address.usage] is PERSONAL
  // and [Address.current][google.cloud.talent.v4beta1.Address.current] is true.
  // 2. [Address.usage][google.cloud.talent.v4beta1.Address.usage] is PERSONAL
  // and [Address.current][google.cloud.talent.v4beta1.Address.current] is false
  // or not set.
  // 3. [Address.usage][google.cloud.talent.v4beta1.Address.usage] is
  // CONTACT_INFO_USAGE_UNSPECIFIED and
  // [Address.current][google.cloud.talent.v4beta1.Address.current] is true.
  // 4. [Address.usage][google.cloud.talent.v4beta1.Address.usage] is
  // CONTACT_INFO_USAGE_UNSPECIFIED and
  // [Address.current][google.cloud.talent.v4beta1.Address.current] is false or
  // not set.
  repeated Address addresses = 12;

  // The candidate's email addresses.
  repeated Email email_addresses = 13;

  // The candidate's phone number(s).
  repeated Phone phone_numbers = 14;

  // The candidate's personal URIs.
  repeated PersonalUri personal_uris = 15;

  // Available contact information besides
  // [addresses][google.cloud.talent.v4beta1.Profile.addresses],
  // [email_addresses][google.cloud.talent.v4beta1.Profile.email_addresses],
  // [phone_numbers][google.cloud.talent.v4beta1.Profile.phone_numbers] and
  // [personal_uris][google.cloud.talent.v4beta1.Profile.personal_uris]. For
  // example, Hang-out, Skype.
  repeated AdditionalContactInfo additional_contact_info = 16;

  // The employment history records of the candidate. It's highly recommended
  // to input this information as accurately as possible to help improve search
  // quality. Here are some recommendations:
  //
  // * Specify the start and end dates of the employment records.
  // * List different employment types separately, no matter how minor the
  // change is.
  // For example, only job title is changed from "software engineer" to "senior
  // software engineer".
  // * Provide
  // [EmploymentRecord.is_current][google.cloud.talent.v4beta1.EmploymentRecord.is_current]
  // for the current employment if possible. If not, it's inferred from user
  // inputs.
  //
  // The limitation for max number of employment records is 100.
  repeated EmploymentRecord employment_records = 17;

  // The education history record of the candidate. It's highly recommended to
  // input this information as accurately as possible to help improve search
  // quality. Here are some recommendations:
  //
  // * Specify the start and end dates of the education records.
  // * List each education type separately, no matter how minor the change is.
  // For example, the profile contains the education experience from the same
  // school but different degrees.
  // * Provide
  // [EducationRecord.is_current][google.cloud.talent.v4beta1.EducationRecord.is_current]
  // for the current education if possible. If not, it's inferred from user
  // inputs.
  //
  // The limitation for max number of education records is 100.
  repeated EducationRecord education_records = 18;

  // The skill set of the candidate. It's highly recommended to provide as
  // much information as possible to help improve the search quality.
  //
  // The limitation for max number of skills is 500.
  repeated Skill skills = 19;

  // The individual or collaborative activities which the candidate has
  // participated in, for example, open-source projects, class assignments that
  // aren't listed in
  // [employment_records][google.cloud.talent.v4beta1.Profile.employment_records].
  //
  // The limitation for max number of activities is 50.
  repeated Activity activities = 20;

  // The publications published by the candidate.
  //
  // The limitation for max number of publications is 50.
  repeated Publication publications = 21;

  // The patents acquired by the candidate.
  repeated Patent patents = 22;

  // The certifications acquired by the candidate.
  repeated Certification certifications = 23;

  // Output only. The resource names of the candidate's applications.
  repeated string applications = 47 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The resource names of the candidate's assignments.
  repeated string assignments = 48 [(google.api.field_behavior) = OUTPUT_ONLY];

  // A map of fields to hold both filterable and non-filterable custom profile
  // attributes that aren't covered by the provided structured fields. See
  // [CustomAttribute][google.cloud.talent.v4beta1.CustomAttribute] for more
  // details.
  //
  // At most 100 filterable and at most 100 unfilterable keys are supported. If
  // limit is exceeded, an error is thrown. Custom attributes are `unfilterable`
  // by default. These are filterable when the `filterable` flag is set to
  // `true`.
  //
  // Numeric custom attributes: each key can only map to one numeric value,
  // otherwise an error is thrown. Client can also filter on numeric custom
  // attributes using '>', '<' or '=' operators.
  //
  // String custom attributes: each key can map up to 50 string values. For
  // filterable string value, each value has a byte size of no more than 256B.
  // For unfilterable string values, the maximum byte size of a single key is
  // 64B. An error is thrown for any request exceeding the limit.
  // The maximum total byte size is 10KB.
  map<string, CustomAttribute> custom_attributes = 26;

  // Output only. Indicates if a summarized profile was created as part of the
  // profile creation API call. This flag does not indicate whether a profile is
  // searchable or not.
  bool processed = 27 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Keyword snippet shows how the search result is related to a
  // search query.  This is only returned in
  // [SearchProfilesResponse][google.cloud.talent.v4beta1.SearchProfilesResponse].
  string keyword_snippet = 28 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Candidate's availability signals.
  repeated AvailabilitySignal availability_signals = 70
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Derived locations of the profile, resolved from
  // [Profile.addresses][google.cloud.talent.v4beta1.Profile.addresses].
  //
  // [derived_addresses][google.cloud.talent.v4beta1.Profile.derived_addresses]
  // are exactly matched to
  // [Profile.addresses][google.cloud.talent.v4beta1.Profile.addresses] in the
  // same order.
  repeated Location derived_addresses = 64
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Candidate availability signal.
message AvailabilitySignal {
  // Type of signal.
  AvailabilitySignalType type = 1;

  // Timestamp of when the given availability activity last happened.
  google.protobuf.Timestamp last_update_time = 2;

  // Indicates if the
  // [last_update_time][google.cloud.talent.v4beta1.AvailabilitySignal.last_update_time]
  // is within
  // [AvailabilityFilter.range][google.cloud.talent.v4beta1.AvailabilityFilter.range].
  //
  // Returned only in a search response when there is an
  // [AvailabilityFilter][google.cloud.talent.v4beta1.AvailabilityFilter] in
  // [ProfileQuery.availability_filters][google.cloud.talent.v4beta1.ProfileQuery.availability_filters]
  // where
  // [signal_type][google.cloud.talent.v4beta1.AvailabilityFilter.signal_type]
  // matches [type][google.cloud.talent.v4beta1.AvailabilitySignal.type].
  google.protobuf.BoolValue filter_satisfied = 3;
}

// Resource that represents a resume.
message Resume {
  // The format of a structured resume.
  enum ResumeType {
    // Default value.
    RESUME_TYPE_UNSPECIFIED = 0;

    // The profile contents in HR-XML format.
    // See https://schemas.liquid-technologies.com/hr-xml/2007-04-15/ for more
    // information about Human Resources XML.
    HRXML = 1;

    // Resume type not specified.
    OTHER_RESUME_TYPE = 2;
  }

  // Users can create a profile with only this field field, if
  // [resume_type][google.cloud.talent.v4beta1.Resume.resume_type] is
  // [HRXML][google.cloud.talent.v4beta1.Resume.ResumeType.HRXML]. For example,
  // the API parses this field and creates a profile with all structured fields
  // populated.
  // [EmploymentRecord][google.cloud.talent.v4beta1.EmploymentRecord],
  // [EducationRecord][google.cloud.talent.v4beta1.EducationRecord], and so on.
  // An error is thrown if this field cannot be parsed.
  //
  // Note that the use of the functionality offered by this field to extract
  // data from resumes is an Alpha feature and as such is not covered by any
  // SLA.
  string structured_resume = 1;

  // The format of
  // [structured_resume][google.cloud.talent.v4beta1.Resume.structured_resume].
  ResumeType resume_type = 2;
}

// Resource that represents the name of a person.
message PersonName {
  // Resource that represents a person's structured name.
  message PersonStructuredName {
    // Given/first name.
    //
    // It's derived from
    // [formatted_name][google.cloud.talent.v4beta1.PersonName.formatted_name]
    // if not provided.
    //
    // Number of characters allowed is 100.
    string given_name = 1;

    // Preferred given/first name or nickname.
    //
    // Number of characters allowed is 100.
    string preferred_name = 6;

    // Middle initial.
    //
    // It's derived from
    // [formatted_name][google.cloud.talent.v4beta1.PersonName.formatted_name]
    // if not provided.
    //
    // Number of characters allowed is 20.
    string middle_initial = 2;

    // Family/last name.
    //
    // It's derived from
    // [formatted_name][google.cloud.talent.v4beta1.PersonName.formatted_name]
    // if not provided.
    //
    // Number of characters allowed is 100.
    string family_name = 3;

    // Suffixes.
    //
    // Number of characters allowed is 20.
    repeated string suffixes = 4;

    // Prefixes.
    //
    // Number of characters allowed is 20.
    repeated string prefixes = 5;
  }

  // The name of a person. It can be one of
  // [formatted_name][google.cloud.talent.v4beta1.PersonName.formatted_name] or
  // [structured_name][google.cloud.talent.v4beta1.PersonName.structured_name].
  oneof person_name {
    // A string represents a person's full name. For example, "Dr. John Smith".
    //
    // Number of characters allowed is 100.
    string formatted_name = 1;

    // A person's name in a structured way (last name, first name, suffix, and
    // so on.)
    PersonStructuredName structured_name = 2;
  }

  // Preferred name for the person. This field is ignored if
  // [structured_name][google.cloud.talent.v4beta1.PersonName.structured_name]
  // is provided.
  //
  // Number of characters allowed is 100.
  string preferred_name = 3;
}

// Resource that represents a address.
message Address {
  // The usage of the address. For example, SCHOOL, WORK, PERSONAL.
  ContactInfoUsage usage = 1;

  // The address of a person. It can be one of
  // [unstructured_address][google.cloud.talent.v4beta1.Address.unstructured_address]
  // or
  // [structured_address][google.cloud.talent.v4beta1.Address.structured_address].
  oneof address {
    // Unstructured address.
    //
    // For example, "1600 Amphitheatre Pkwy, Mountain View, CA 94043",
    // "Sunnyvale, California".
    //
    // Number of characters allowed is 100.
    string unstructured_address = 2;

    // Structured address that contains street address, city, state, country,
    // and so on.
    google.type.PostalAddress structured_address = 3;
  }

  // Indicates if it's the person's current address.
  google.protobuf.BoolValue current = 4;
}

// Resource that represents a person's email address.
message Email {
  // The usage of the email address. For example, SCHOOL, WORK, PERSONAL.
  ContactInfoUsage usage = 1;

  // Email address.
  //
  // Number of characters allowed is 4,000.
  string email_address = 2;
}

// Resource that represents a person's telephone number.
message Phone {
  // Enum that represents the type of the telephone.
  enum PhoneType {
    // Default value.
    PHONE_TYPE_UNSPECIFIED = 0;

    // A landline.
    LANDLINE = 1;

    // A mobile.
    MOBILE = 2;

    // A fax.
    FAX = 3;

    // A pager.
    PAGER = 4;

    // A TTY (test telephone) or TDD (telecommunication device for the deaf).
    TTY_OR_TDD = 5;

    // A voicemail.
    VOICEMAIL = 6;

    // A virtual telephone number is a number that can be routed to another
    // number and managed by the user via Web, SMS, IVR, and so on.  It is
    // associated with a particular person, and may be routed to either a MOBILE
    // or LANDLINE number. The [phone
    // usage][google.cloud.talent.v4beta1.ContactInfoUsage] should be set to
    // PERSONAL for these phone types. Some more information can be found here:
    // https://en.wikipedia.org/wiki/Personal_Numbers
    VIRTUAL = 7;

    // Voice over IP numbers. This includes TSoIP (Telephony Service over IP).
    VOIP = 8;

    // In some regions (e.g. the USA), it is impossible to distinguish between
    // fixed-line and mobile numbers by looking at the phone number itself.
    MOBILE_OR_LANDLINE = 9;
  }

  // The usage of the phone. For example, SCHOOL, WORK, PERSONAL.
  ContactInfoUsage usage = 1;

  // The phone type. For example, LANDLINE, MOBILE, FAX.
  PhoneType type = 2;

  // Phone number.
  //
  // Any phone formats are supported and only exact matches are performed on
  // searches. For example, if a phone number in profile is provided in the
  // format of "(xxx)xxx-xxxx", in profile searches the same phone format
  // has to be provided.
  //
  // Number of characters allowed is 20.
  string number = 3;

  // When this number is available. Any descriptive string is expected.
  //
  // Number of characters allowed is 100.
  string when_available = 4;
}

// Resource that represents a valid URI for a personal use.
message PersonalUri {
  // The personal URI.
  //
  // Number of characters allowed is 4,000.
  string uri = 1;
}

// Resource that represents contact information other than phone, email,
// URI and addresses.
message AdditionalContactInfo {
  // The usage of this contact method. For example, SCHOOL, WORK, PERSONAL.
  ContactInfoUsage usage = 1;

  // The name of the contact method.
  //
  // For example, "hangout", "skype".
  //
  // Number of characters allowed is 100.
  string name = 2;

  // The contact id.
  //
  // Number of characters allowed is 100.
  string contact_id = 3;
}

// Resource that represents an employment record of a candidate.
message EmploymentRecord {
  // Start date of the employment.
  google.type.Date start_date = 1;

  // End date of the employment.
  google.type.Date end_date = 2;

  // The name of the employer company/organization.
  //
  // For example, "Google", "Alphabet", and so on.
  //
  // Number of characters allowed is 250.
  string employer_name = 3;

  // The division name of the employment.
  //
  // For example, division, department, client, and so on.
  //
  // Number of characters allowed is 100.
  string division_name = 4;

  // The physical address of the employer.
  Address address = 5;

  // The job title of the employment.
  //
  // For example, "Software Engineer", "Data Scientist", and so on.
  //
  // Number of characters allowed is 250.
  string job_title = 6;

  // The description of job content.
  //
  // Number of characters allowed is 100,000.
  string job_description = 7;

  // If the jobs is a supervisor position.
  google.protobuf.BoolValue is_supervisor = 8;

  // If this employment is self-employed.
  google.protobuf.BoolValue is_self_employed = 9;

  // If this employment is current.
  google.protobuf.BoolValue is_current = 10;

  // Output only. The job title snippet shows how the
  // [job_title][google.cloud.talent.v4beta1.EmploymentRecord.job_title] is
  // related to a search query. It's empty if the
  // [job_title][google.cloud.talent.v4beta1.EmploymentRecord.job_title] isn't
  // related to the search query.
  string job_title_snippet = 11 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The job description snippet shows how the
  // [job_description][google.cloud.talent.v4beta1.EmploymentRecord.job_description]
  // is related to a search query. It's empty if the
  // [job_description][google.cloud.talent.v4beta1.EmploymentRecord.job_description]
  // isn't related to the search query.
  string job_description_snippet = 12
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The employer name snippet shows how the
  // [employer_name][google.cloud.talent.v4beta1.EmploymentRecord.employer_name]
  // is related to a search query. It's empty if the
  // [employer_name][google.cloud.talent.v4beta1.EmploymentRecord.employer_name]
  // isn't related to the search query.
  string employer_name_snippet = 13 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Resource that represents an education record of a candidate.
message EducationRecord {
  // The start date of the education.
  google.type.Date start_date = 1;

  // The end date of the education.
  google.type.Date end_date = 2;

  // The expected graduation date if currently pursuing a degree.
  google.type.Date expected_graduation_date = 3;

  // The name of the school or institution.
  //
  // For example, "Stanford University", "UC Berkeley", and so on.
  //
  // Number of characters allowed is 250.
  string school_name = 4;

  // The physical address of the education institution.
  Address address = 5;

  // The degree information. It can be one of
  // [degree_description][google.cloud.talent.v4beta1.EducationRecord.degree_description]
  // or
  // [structured_degree][google.cloud.talent.v4beta1.EducationRecord.structured_degree].
  oneof degree {
    // The full description of the degree.
    //
    // For example, "Master of Science in Computer Science", "B.S in Math".
    //
    // Number of characters allowed is 100.
    string degree_description = 6;

    // The structured notation of the degree.
    Degree structured_degree = 7;
  }

  // The description of the education.
  //
  // Number of characters allowed is 100,000.
  string description = 8;

  // If this education is current.
  google.protobuf.BoolValue is_current = 9;

  // Output only. The school name snippet shows how the
  // [school_name][google.cloud.talent.v4beta1.EducationRecord.school_name] is
  // related to a search query in search result. It's empty if the
  // [school_name][google.cloud.talent.v4beta1.EducationRecord.school_name]
  // isn't related to the search query.
  string school_name_snippet = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The job description snippet shows how the
  // [Degree][google.cloud.talent.v4beta1.Degree] is related to a search query
  // in search result. It's empty if the
  // [Degree][google.cloud.talent.v4beta1.Degree] isn't related to the search
  // query.
  string degree_snippet = 11 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Resource that represents a degree pursuing or acquired by a candidate.
message Degree {
  // ISCED degree type.
  DegreeType degree_type = 1;

  // Full Degree name.
  //
  // For example, "B.S.", "Master of Arts", and so on.
  //
  // Number of characters allowed is 100.
  string degree_name = 2;

  // Fields of study for the degree.
  //
  // For example, "Computer science", "engineering".
  //
  // Number of characters allowed is 100.
  repeated string fields_of_study = 3;
}

// Resource that represents an individual or collaborative activity participated
// in by a candidate, for example, an open-source project, a class assignment,
// and so on.
message Activity {
  // Activity display name.
  //
  // Number of characters allowed is 100.
  string display_name = 1;

  // Activity description.
  //
  // Number of characters allowed is 100,000.
  string description = 2;

  // Activity URI.
  //
  // Number of characters allowed is 4,000.
  string uri = 3;

  // The first creation date of the activity.
  google.type.Date create_date = 4;

  // The last update date of the activity.
  google.type.Date update_date = 5;

  // A list of team members involved in this activity.
  //
  // Number of characters allowed is 100.
  //
  // The limitation for max number of team members is 50.
  repeated string team_members = 6;

  // A list of skills used in this activity.
  //
  // The limitation for max number of skills used is 50.
  repeated Skill skills_used = 7;

  // Output only. Activity name snippet shows how the
  // [display_name][google.cloud.talent.v4beta1.Activity.display_name] is
  // related to a search query. It's empty if the
  // [display_name][google.cloud.talent.v4beta1.Activity.display_name] isn't
  // related to the search query.
  string activity_name_snippet = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Activity description snippet shows how the
  // [description][google.cloud.talent.v4beta1.Activity.description] is related
  // to a search query. It's empty if the
  // [description][google.cloud.talent.v4beta1.Activity.description] isn't
  // related to the search query.
  string activity_description_snippet = 9
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Skill used snippet shows how the corresponding
  // [skills_used][google.cloud.talent.v4beta1.Activity.skills_used] are related
  // to a search query. It's empty if the corresponding
  // [skills_used][google.cloud.talent.v4beta1.Activity.skills_used] are not
  // related to the search query.
  repeated string skills_used_snippet = 10
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Resource that represents a publication resource of a candidate.
message Publication {
  // A list of author names.
  //
  // Number of characters allowed is 100.
  repeated string authors = 1;

  // The title of the publication.
  //
  // Number of characters allowed is 100.
  string title = 2;

  // The description of the publication.
  //
  // Number of characters allowed is 100,000.
  string description = 3;

  // The journal name of the publication.
  //
  // Number of characters allowed is 100.
  string journal = 4;

  // Volume number.
  //
  // Number of characters allowed is 100.
  string volume = 5;

  // The publisher of the journal.
  //
  // Number of characters allowed is 100.
  string publisher = 6;

  // The publication date.
  google.type.Date publication_date = 7;

  // The publication type.
  //
  // Number of characters allowed is 100.
  string publication_type = 8;

  // ISBN number.
  //
  // Number of characters allowed is 100.
  string isbn = 9;
}

// Resource that represents the patent acquired by a candidate.
message Patent {
  // Name of the patent.
  //
  // Number of characters allowed is 100.
  string display_name = 1;

  // A list of inventors' names.
  //
  // Number of characters allowed for each is 100.
  repeated string inventors = 2;

  // The status of the patent.
  //
  // Number of characters allowed is 100.
  string patent_status = 3;

  // The date the last time the status of the patent was checked.
  google.type.Date patent_status_date = 4;

  // The date that the patent was filed.
  google.type.Date patent_filing_date = 5;

  // The name of the patent office.
  //
  // Number of characters allowed is 100.
  string patent_office = 6;

  // The number of the patent.
  //
  // Number of characters allowed is 100.
  string patent_number = 7;

  // The description of the patent.
  //
  // Number of characters allowed is 100,000.
  string patent_description = 8;

  // The skills used in this patent.
  repeated Skill skills_used = 9;
}
