Recruitment

hr_recruitment
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/hr_recruitment
VERSION
VERSION 1.1
CATEGORY
CATEGORYHuman Resources/Recruitment
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Xavier Morel, Joren Van Onder, Nicolas Lempereur, Yannick Tivisse, Pierre Masereel, Julien Castiaux, Julien Mougenot, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, William Braeckman, Ahmad Khanalizadeh, Didier (did), Abdelouahab (abla), Mathieu Walravens, Dossogne Bertrand, luvi, Renaud Thiry, alsh-odoo, Louis Wicket (wil), Victor Piryns (pivi), Yash Vaishnav, Mahamadasif Ansari, Dylan Kiss (dyki), Xavier Bol (xbo), omra-odoo, Andrzej(pian), sesn-odoo, ravb-odoo, Mélanie, Youssef Bashandy, reka-odoo, Nathaniel (naja), Julien Carion (juca), adsh-odoo, mega, Tanguy Quéguineur, asno-odoo, rmun-odoo, Shaan Thakkar (THSH), Mathieu Coutant, Yassin Abdelkarim, guce, yagp-odoo, rame-odoo, Abdelrahman Mahmoud (amah), ahta, sben-odoo, David Van Droogenbroeck (DROD), elhayyany, Michaël Mattiello, nikj-odoo, Pierre Pulinckx, bona-odoo, Krzysztof Magusiak (krma), utma-odoo, Maeva De Keyser (MDEK), pajo, bhna-odoo, akha, Bertrand Dossogne, MAGREMENT, thha-odoo, agbr-odoo, ksar-odoo, Quentin Colla (qucol), dhka-odoo, Einar Andersen (eian), assh-odoo, Elliot ELCO, saurabh, Abdelouahab Laaroussi (abla), lebm-odoo, flotchet, chpa-odoo, Amr Yasser (amry), Faruk Avcı, 3amo-magdy, Ziri, SurryaT10, Sara Briki
WEBSITE
WEBSITEhttps://www.odoo.com/app/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:44
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - digest
    - mail
    - bus
    - web_tour
    - html_editor
    - portal
    - http_routing
    - auth_signup
    - resource
    - phone_validation
    - resource_mail
    - calendar
    - utm
    - attachment_indexation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (48)
XML IDNameModelTypeStatus
applicant_get_refuse_reason_view_form applicant.get.refuse.reason.form applicant.get.refuse.reason form New
applicant_hired_template applicant_hired_template ir.ui.view qweb New
applicant_send_mail_view_form applicant.send.mail form New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_pivot_view_job Jobs - Recruitment hr.applicant pivot New
crm_case_tree_view_job Applicants hr.applicant list New
digest_digest_view_form digest.digest.view.form.inherit.hr.recruitment digest.digest xpath Inherits digest.digest_digest_view_form
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_applicant_category_view_form hr.applicant.category.form hr.applicant.category form New
hr_applicant_category_view_tree hr.applicant.category.list hr.applicant.category list New
hr_applicant_refuse_reason_view_form Applicant refuse reason form hr.applicant.refuse.reason form New
hr_applicant_refuse_reason_view_tree Applicant refuse reason list hr.applicant.refuse.reason list New
hr_applicant_view_activity hr.applicant.activity hr.applicant activity New
hr_applicant_view_form Jobs - Recruitment Form hr.applicant form New
hr_applicant_view_form_interviewer hr.applicant xpath Inherits hr_applicant_view_form
hr_applicant_view_graph hr.applicant.graph hr.applicant graph New
hr_applicant_view_pivot hr.applicant.pivot hr.applicant pivot New
hr_applicant_view_search hr.applicant.search hr.applicant search New
hr_applicant_view_search_bis hr.applicant.view.search hr.applicant search New
hr_applicant_view_tree_activity hr.applicant.view.list.activity hr.applicant list New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_job_platform_form hr.job.platform.form hr.job.platform form New
hr_job_platform_tree hr.job.platform.list hr.job.platform list New
hr_job_search_view hr.job.search hr.job xpath Inherits hr_recruitment.view_job_filter_recruitment
hr_job_simple_form hr.job.simple.form hr.job form New
hr_job_survey hr.job.form1 hr.job xpath Inherits hr.view_hr_job_form
hr_job_view_tree_inherit hr.job field Inherits hr.view_hr_job_tree
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_kanban_view_applicant_talent_pool hr.applicant xpath Inherits hr_recruitment.hr_kanban_view_applicant
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.list hr.recruitment.degree list New
hr_recruitment_source_tree hr.recruitment.source.list hr.recruitment.source list New
hr_recruitment_source_view_search hr.recruitment.source.view.search hr.recruitment.source search New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.list hr.recruitment.stage list New
hr_talent_pool_view_form hr.talent.pool.view.form hr.talent.pool form New
hr_talent_pool_view_kanban hr.talent.pool.view.kanban hr.talent.pool kanban New
hr_talent_pool_view_list hr.talent.pool.view.list hr.talent.pool list New
ir_attachment_hr_recruitment_list_view ir.attachment list New
ir_attachment_view_search_inherit_hr_recruitment ir.attachment.search.inherit.recruitment ir.attachment xpath Inherits base.view_attachment_search
job_add_applicants_view_form job.add.applicants.view.form job.add.applicants form New
mail_notification_light_without_background mail_notification_light_without_background ir.ui.view qweb Inherits mail.mail_notification_light
quick_create_applicant_form hr.applicant.form.quick_create hr.applicant form New
res_config_settings_view_form res.config.settings.view.form.inherit.hr.recruitment res.config.settings xpath Inherits base.res_config_settings_view_form
talent_pool_add_applicants_view_form talent.pool.add.applicants.view.form talent.pool.add.applicants form New
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_stage_kanban hr.recruitment.stage.kanban hr.recruitment.stage kanban New
view_job_filter_recruitment Job hr.job xpath Inherits hr.view_job_filter
Models touched (27)

New fields (11)
  • applicant_ids Many2many → hr.applicant
    args: 'hr.applicant'
  • applicant_without_email Text
    compute='_compute_applicant_without_email' string='Applicant(s) not having email'
  • attachment_ids Many2many → ir.attachment
    bypass_search_access=True compute='_compute_from_template_id' readonly=False store=True string='Attachments' args: 'ir.attachment'
  • duplicate_applicant_ids Many2many → hr.applicant
    compute='_compute_duplicate_applicant_ids' readonly=False relation='applicant_get_refuse_reason_duplicate_applicants_rel' store=True string='Duplicate Applications' args: 'hr.applicant'
  • duplicate_applicant_ids_domain Binary
    compute='_compute_duplicate_applicant_ids_domain'
  • duplicates Boolean
    string='Refuse Duplicate Applications'
  • duplicates_count Integer
    compute='_compute_duplicate_applicant_ids_domain' args: 'Duplicates Count'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    default=_default_refuse_reason_id required=True args: 'hr.applicant.refuse.reason', 'Refuse Reason'
  • scheduled_date Char
    compute='_compute_from_template_id' help='send emails after that date. This date is considered as being in UTC timezone.' readonly=False store=True args: 'Scheduled Date'
  • send_mail Boolean
    compute='_compute_send_mail' precompute=True readonly=False store=True args: 'Send Email'
  • template_id Many2one → mail.template
    compute='_compute_template_id' domain="[('model', '=', 'hr.applicant')]" precompute=True readonly=False store=True string='Email Template' args: 'mail.template'
Public methods (1)
  • action_refuse_reason_apply(self)

New fields (3)
  • applicant_ids Many2many → hr.applicant
    context={'active_test': False} required=True string='Applications' args: 'hr.applicant'
  • attachment_ids Many2many → ir.attachment
    bypass_search_access=True readonly=False store=True string='Attachments' args: 'ir.attachment'
  • author_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner', 'Author'
Public methods (1)
  • action_send(self)

New fields (1)
  • applicant_id Many2one → hr.applicant
    index='btree_not_null' ondelete='set null' string='Applicant' args: 'hr.applicant'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model

New fields (2)
  • kpi_hr_recruitment_new_colleagues Boolean
    args: 'New Employees'
  • kpi_hr_recruitment_new_colleagues_value Integer
    compute='_compute_kpi_hr_recruitment_new_colleagues_value'
Public methods (0)

No public methods.

New fields (61)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the case without removing it.' index=True args: 'Active'
  • applicant_notes Html
  • applicant_properties Properties
    copy=True definition='job_id.applicant_properties_definition' args: 'Properties'
  • application_count Integer
    compute='_compute_application_count' help='Applications with the same email or phone or mobile'
  • application_status Selection
    compute='_compute_application_status' search='_search_application_status' args: [('ongoing', 'Ongoing'), ('hired', 'Hired'), ('refused', 'Refused'), ('archived', 'Archived')]
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.applicant')] string='Attachments' args: 'ir.attachment', 'res_id'
  • attachment_number Integer
    compute='_get_attachment_number' string='Number of Attachments'
  • availability Date
    help='The date at which the applicant will be available to start working' tracking=True args: 'Availability'
  • campaign_id Many2one
    ondelete='set null'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    compute='_compute_company' readonly=False store=True tracking=True args: 'res.company', 'Company'
  • create_date Datetime
    readonly=True args: 'Applied on'
  • date_closed Datetime
    compute='_compute_date_closed' copy=False readonly=False store=True tracking=True args: 'Hire Date'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True args: 'Last Stage Update'
  • date_open Datetime
    readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day' compute_sudo=True string='Days to Close'
  • day_open Float
    compute='_compute_day' compute_sudo=True string='Days to Open'
  • delay_close Float
    aggregator='avg' compute='_compute_delay' help='Number of days to close' readonly=True store=True string='Delay to Close'
  • department_id Many2one → hr.department
    compute='_compute_department' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=False store=True tracking=True args: 'hr.department', 'Department'
  • email_from Char
    compute='_compute_partner_phone_email' copy=True index='trigram' inverse='_inverse_partner_email' size=128 store=True string='Email'
  • email_normalized Char
    index='trigram'
  • emp_is_active Boolean
    related='employee_id.active' string='Employee Active'
  • employee_id Many2one → hr.employee
    copy=False help='Employee linked to the applicant.' index='btree_not_null' string='Employee' args: 'hr.employee'
  • employee_name Char
    readonly=False related='employee_id.name' string='Employee Name' tracking=False
  • interviewer_ids Many2many → res.users
    copy=False domain="[('share', '=', False), ('company_ids', 'in', company_id)]" index=True string='Interviewers' tracking=True args: 'res.users', 'hr_applicant_res_users_interviewers_rel'
  • is_applicant_in_pool Boolean
    compute='_compute_is_applicant_in_pool' search='_search_is_applicant_in_pool'
  • is_pool_applicant Boolean
    compute='_compute_is_pool'
  • job_id Many2one → hr.job
    copy=False domain="company_id and [('company_id', '=', company_id)] or []" index=True tracking=True args: 'hr.job', 'Job Position'
  • kanban_state Selection
    copy=False default='normal' required=True string='Kanban State' args: [('normal', 'In Progress'), ('done', 'Ready for Next Stage'), ('waiting', 'Waiting'), ('blocked', 'Blocked')]
  • last_stage_id Many2one → hr.recruitment.stage
    help='Stage of the applicant before being in the current stage. Used for lost cases analysis.' args: 'hr.recruitment.stage', 'Last Stage'
  • legend_blocked Char
    related='stage_id.legend_blocked' string='Kanban Blocked'
  • legend_done Char
    related='stage_id.legend_done' string='Kanban Valid'
  • legend_normal Char
    related='stage_id.legend_normal' string='Kanban Ongoing'
  • legend_waiting Char
    related='stage_id.legend_waiting' string='Kanban Waiting'
  • linkedin_profile Char
    index='btree_not_null' args: 'LinkedIn Profile'
  • medium_id Many2one
    help='This displays how the applicant has reached out, e.g. via Email, LinkedIn, Website, etc.' ondelete='set null'
  • meeting_display_date Date
    compute='_compute_meeting_display'
  • meeting_display_text Char
    compute='_compute_meeting_display'
  • meeting_ids One2many → calendar.event
    args: 'calendar.event', 'applicant_id', 'Meetings'
  • partner_id Many2one → res.partner
    copy=False index='btree_not_null' args: 'res.partner', 'Contact'
  • partner_name Char
    args: "Applicant's Name"
  • partner_phone Char
    compute='_compute_partner_phone_email' copy=True index='btree_not_null' inverse='_inverse_partner_email' size=32 store=True string='Phone'
  • partner_phone_sanitized Char
    compute='_compute_partner_phone_sanitized' index='btree_not_null' store=True string='Sanitized Phone Number'
  • pool_applicant_id Many2one → hr.applicant
    index='btree_not_null' args: 'hr.applicant'
  • priority Selection
    default='0' args: AVAILABLE_PRIORITIES, 'Evaluation'
  • probability Float
    args: 'Probability'
  • refuse_date Datetime
    args: 'Refuse Date'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    string='Refuse Reason' tracking=True args: 'hr.applicant.refuse.reason'
  • salary_expected Float
    aggregator='avg' groups='hr_recruitment.group_hr_recruitment_user' help='Salary Expected by Applicant' tracking=True args: 'Expected'
  • salary_expected_extra Char
    groups='hr_recruitment.group_hr_recruitment_user' help='Salary Expected by Applicant, extra advantages' tracking=True args: 'Expected Salary Extra'
  • salary_proposed Float
    aggregator='avg' groups='hr_recruitment.group_hr_recruitment_user' help='Salary Proposed by the Organisation' tracking=True args: 'Proposed'
  • salary_proposed_extra Char
    groups='hr_recruitment.group_hr_recruitment_user' help='Salary Proposed by the Organisation, extra advantages' tracking=True args: 'Proposed Salary Extra'
  • sequence Integer
    default=10 index=True string='Sequence'
  • source_id Many2one
    ondelete='set null'
  • stage_id Many2one → hr.recruitment.stage
    compute='_compute_stage' copy=False domain="['|', ('job_ids', '=', False), ('job_ids', '=', job_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True tracking=True args: 'hr.recruitment.stage', 'Stage'
  • talent_pool_count Integer
    compute='_compute_talent_pool_count'
  • talent_pool_ids Many2many → hr.talent.pool
    comodel_name='hr.talent.pool' string='Talent Pools'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_email Char
    readonly=True related='user_id.email' string='User Email'
  • user_id Many2one → res.users
    compute='_compute_user' domain="[('share', '=', False), ('company_ids', 'in', company_id)]" readonly=False store=True tracking=True args: 'res.users', 'Recruiter'
Public methods (21)
  • action_archive(self)
  • action_create_meeting(self)
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • action_job_add_applicants(self)
  • action_open_applications(self)
  • action_open_attachments(self)
  • action_open_employee(self)
  • action_send_email(self)
  • action_talent_pool_add_applicants(self)
  • action_talent_pool_stat_button(self)
  • action_unarchive(self)
  • archive_applicant(self)
  • copy(self, default=None)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_employee_from_applicant(self)
    Create an employee from applicant
  • get_empty_list_help(self, help_message)
    @api.model
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model
  • link_applicant_to_talent(self)
  • message_new(self, msg_dict, custom_values=None)
    @api.model
  • reset_applicant(self)
    Reinsert the applicant into the recruitment pipe in the first stage
  • write(self, vals)

New fields (2)
  • color Integer
    default=_get_default_color string='Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (4)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Description'
  • sequence Integer
    copy=False default=10
  • template_id Many2one → mail.template
    domain="[('model', '=', 'hr.applicant')]" string='Email Template' args: 'mail.template'
Public methods (0)

No public methods.

New fields (3)
  • expected_employee Integer
    compute='_compute_recruitment_stats' string='Expected Employee'
  • new_applicant_count Integer
    compute='_compute_new_applicant_count' compute_sudo=True string='New Applicant'
  • new_hired_employee Integer
    compute='_compute_recruitment_stats' string='New Hired Employee'
Public methods (0)

No public methods.

New fields (1)
  • applicant_ids One2many → hr.applicant
    groups='hr.group_hr_user' args: 'hr.applicant', 'employee_id', 'Applicants'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (29)
  • activity_count Integer
    compute='_compute_activities' groups='hr_recruitment.group_hr_recruitment_interviewer'
  • address_id Many2one → res.partner
    default=_default_address_id domain=<expr> help="Select the location where the applicant will work. Addresses listed here are defined on the company's contact information." tracking=True args: 'res.partner', 'Job Location'
  • alias_id Many2one
    groups='hr_recruitment.group_hr_recruitment_interviewer' help='Email alias for this job position. New emails will automatically create new applicants for this job position.'
  • all_application_count Integer
    compute='_compute_all_application_count' groups='hr_recruitment.group_hr_recruitment_interviewer' string='All Application Count'
  • applicant_hired Integer
    compute='_compute_applicant_hired' groups='hr_recruitment.group_hr_recruitment_interviewer' string='Applicants Hired'
  • applicant_properties_definition PropertiesDefinition
    groups='hr_recruitment.group_hr_recruitment_interviewer' args: 'Applicant Properties'
  • application_count Integer
    compute='_compute_application_count' groups='hr_recruitment.group_hr_recruitment_interviewer' string='Application Count'
  • application_ids One2many → hr.applicant
    groups='hr_recruitment.group_hr_recruitment_interviewer' args: 'hr.applicant', 'job_id', 'Job Applications'
  • color Integer
    args: 'Color Index'
  • document_ids One2many → ir.attachment
    compute='_compute_document_ids' groups='hr_recruitment.group_hr_recruitment_interviewer' readonly=True string='Documents' args: 'ir.attachment'
  • documents_count Integer
    compute='_compute_document_ids' groups='hr_recruitment.group_hr_recruitment_interviewer' string='Document Count'
  • employee_count Integer
    compute='_compute_employee_count'
  • expected_degree Many2one → hr.recruitment.degree
    groups='hr_recruitment.group_hr_recruitment_interviewer' args: 'hr.recruitment.degree'
  • expected_employees Integer
    groups='hr_recruitment.group_hr_recruitment_interviewer,hr.group_hr_user'
  • extended_interviewer_ids Many2many → res.users
    compute='_compute_extended_interviewer_ids' groups='hr_recruitment.group_hr_recruitment_interviewer' store=True args: 'res.users', 'hr_job_extended_interviewer_res_users'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids args: 'res.users', 'job_favorite_user_rel', 'job_id', 'user_id'
  • industry_id Many2one → res.partner.industry
    groups='hr_recruitment.group_hr_recruitment_interviewer' tracking=True args: 'res.partner.industry', 'Industry'
  • interviewer_ids Many2many → res.users
    domain="[('share', '=', False), ('company_ids', '=?', company_id)]" groups='hr_recruitment.group_hr_recruitment_interviewer' help="The Interviewers set on the job position can see all Applicants in it. They have access to the information, the attachments, the meeting management and they can refuse him. You don't need to have Recruitment rights to be set as an interviewer." string='Interviewers' args: 'res.users'
  • is_favorite Boolean
    compute='_compute_is_favorite' inverse='_inverse_is_favorite'
  • job_properties Properties
    definition='company_id.job_properties_definition' groups='hr_recruitment.group_hr_recruitment_interviewer' args: 'Properties'
  • job_source_ids One2many → hr.recruitment.source
    groups='hr_recruitment.group_hr_recruitment_interviewer' args: 'hr.recruitment.source', 'job_id'
  • manager_id Many2one → hr.employee
    groups='hr_recruitment.group_hr_recruitment_interviewer,hr.group_hr_user' readonly=True related='department_id.manager_id' store=True string='Department Manager' args: 'hr.employee'
  • new_application_count Integer
    compute='_compute_new_application_count' groups='hr_recruitment.group_hr_recruitment_interviewer' help='Number of applications that are new in the flow (typically at first step of the flow)' string='New Application'
  • no_of_employee Integer
    groups='hr_recruitment.group_hr_recruitment_interviewer,hr.group_hr_user'
  • no_of_hired_employee Integer
    compute='_compute_no_of_hired_employee' copy=False groups='hr_recruitment.group_hr_recruitment_interviewer' help='Number of hired employees for this job position during recruitment phase.' store=True string='Hired'
  • old_application_count Integer
    compute='_compute_old_application_count' groups='hr_recruitment.group_hr_recruitment_interviewer' string='Old Application'
  • open_application_count Integer
    compute='_compute_open_application_count' groups='hr_recruitment.group_hr_recruitment_interviewer' help='Number of applications that are still ongoing (not hired or refused)' string='Open Application Count'
  • requirements Text
    groups='hr_recruitment.group_hr_recruitment_interviewer,hr.group_hr_user'
  • user_id Many2one
    groups='hr_recruitment.group_hr_recruitment_interviewer,hr.group_hr_user'
Public methods (5)
  • action_open_activities(self)
  • action_open_attachments(self)
  • action_open_employees(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (3)
  • email Char
    help="Applications received from this Email won't be linked to a contact.There will be no email address set on the Applicant either." required=True
  • name Char
    required=True
  • regex Char
    help="The regex facilitates to extract information from the subject or body of the received email to autopopulate the Applicant's name field"
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (3)
  • name Char
    required=True translate=True args: 'Degree Name'
  • score Float
    default=0 required=True args: 'Score'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (6)
  • alias_id Many2one → mail.alias
    ondelete='restrict' args: 'mail.alias', 'Alias ID'
  • campaign_id Many2one → utm.campaign
    args: 'utm.campaign'
  • email Char
    readonly=True related='alias_id.display_name' string='Email'
  • has_domain Char
    compute='_compute_has_domain'
  • job_id Many2one → hr.job
    index=True ondelete='cascade' args: 'hr.job', 'Job'
  • medium_id Many2one → utm.medium
    default=<expr> args: 'utm.medium'
Public methods (3)
  • create_alias(self)
  • create_and_get_alias(self)
  • unlink(self)
    Cascade delete aliases to avoid useless / badly configured aliases.

New fields (13)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Kanban'
  • hired_stage Boolean
    help='If checked, this stage is used to determine the hire date of an applicant' args: 'Hired Stage'
  • is_warning_visible Boolean
    compute='_compute_is_warning_visible'
  • job_ids Many2many → hr.job
    help='Specific jobs that use this stage. Other jobs will not use this stage.' string='Job Specific' args: 'hr.job'
  • legend_blocked Char
    default=<expr> required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> required=True translate=True args: 'Grey Kanban Label'
  • legend_waiting Char
    default=<expr> required=True translate=True args: 'Orange Kanban Label'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    args: 'Requirements'
  • rotting_threshold_days Integer
    default=0 help='Day count before applicants in this stage become stale. Set to 0 to disable. Changing this parameter will not affect the rotting status/date of resources last updated before this change.' args: 'Days to rot'
  • sequence Integer
    default=10 args: 'Sequence'
  • template_id Many2one → mail.template
    help='If set, a message is posted on the applicant using the template when the applicant is set to the stage.' args: 'mail.template', 'Email Template'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (9)
  • active Boolean
    default=True
  • categ_ids Many2many → hr.applicant.category
    comodel_name='hr.applicant.category' readonly=False store=True string='Tags'
  • color Integer
    default=_get_default_color string='Color'
  • company_id Many2one → res.company
    default=<expr> string='Company' tracking=True args: 'res.company'
  • description Html
    string='Talent Pool Description'
  • name Char
    required=True string='Title' translate=True
  • no_of_talents Integer
    compute='_compute_talent_count' help='The number of talents in this talent pool.' string='# Talents'
  • pool_manager Many2one → res.users
    default=<expr> domain="[('share', '=', False), ('company_ids', 'in', company_id)]" readonly=False store=True tracking=True args: 'res.users', 'Pool Manager'
  • talent_ids Many2many → hr.applicant
    comodel_name='hr.applicant' groups='base.group_user' string='Talent'
Public methods (1)
  • action_talent_pool_add_talents(self)

New fields (0)

No new fields.

Public methods (1)
  • init(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • applicant_ids Many2many → hr.applicant
    required=True string='Applications' args: 'hr.applicant'
  • job_ids Many2many → hr.job
    required=True string='Job Positions' args: 'hr.job'
Public methods (1)
  • action_add_applicants_to_job(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • job_properties_definition PropertiesDefinition
    args: 'Job Properties'
Public methods (0)

No public methods.

New fields (3)
  • module_hr_recruitment_extract Boolean
    string='Send CV to OCR to fill applications'
  • module_hr_recruitment_survey Boolean
    string='Interview Forms'
  • module_website_hr_recruitment Boolean
    string='Online Posting'
Public methods (0)

No public methods.

New fields (1)
  • applicant_ids One2many → hr.applicant
    string='Applicants' args: 'hr.applicant', 'partner_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • applicant_ids Many2many → hr.applicant
    domain=['|', ('talent_pool_ids', '!=', False), ('is_applicant_in_pool', '=', False)] required=True string='Applicants' args: 'hr.applicant'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • talent_pool_ids Many2many → hr.talent.pool
    string='Talent Pool' args: 'hr.talent.pool'
Public methods (1)
  • action_add_applicants_to_pool(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/hr_recruitment
VERSION
VERSION 1.1
CATEGORY
CATEGORYHuman Resources/Recruitment
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Xavier ALT, Christophe Simonis, Joren Van Onder, Nicolas Lempereur, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Damien Bouvy, Yannick Tivisse, Odoo Online, Pierre Masereel, Jorge Pinna Puissant, Julien Mougenot, Prakash Prajapati, Tiffany Chang (tic), Gorash, Ahmad Khanalizadeh, sofiagvaladze, Louis Baudoux, Abdelouahab (abla), Dossogne Bertrand, Renaud Thiry, Vincent Larcin, Thomas Lefebvre (thle), Louis Wicket (wil), Victor Piryns (pivi), Yash Vaishnav, Mahamadasif Ansari, amdi-odoo, Pierre-Yves Dufays, Dylan Kiss (dyki), Jinane Maksoud, Antoine (ande), Xavier Bol (xbo), Noe Antoine, omra-odoo, Andrzej(pian), sesn-odoo, ravb-odoo, Mélanie, Youssef Bashandy, lase@odoo.com, Maryam Kia, Flotchet, jugj-odoo, Nathaniel (naja), vava-odoo, mega, Tanguy Quéguineur, sami odoo, Louis (wil), asno-odoo, mano-odoo, rmun-odoo, Shaan Thakkar (THSH), Mathieu Coutant, Elisabeth Dickinson, Kacper Gasior, Abdelrahman Mahmoud (amah), Sina Chaichi Maleki (cmsi), Pierre Pulinckx (PIPU), ahta, sben-odoo, jepbarasgarov, David Van Droogenbroeck (DROD), nikj-odoo, Pierre Pulinckx (pipu), laro-odoo, Pierre Pulinckx, Bastien PIERRE, bona-odoo, Thomas Josse (THJO), Mahdi Alijani (malj), defl, agbr-odoo, Einar Andersen (eian), Arthur Pierrot (arpi), saurabh, cmsi-odoo, floctchet, karygauss03
WEBSITE
WEBSITEhttps://www.odoo.com/app/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 17:42:44
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - digest
    - mail
    - bus
    - web_tour
    - html_editor
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - phone_validation
    - resource_mail
    - calendar
    - utm
    - attachment_indexation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (48)
XML IDNameModelTypeStatus
applicant_get_refuse_reason_view_form applicant.get.refuse.reason.form applicant.get.refuse.reason form New
applicant_send_mail_view_form applicant.send.mail form New
candidate_hired_template candidate_hired_template ir.ui.view qweb New
candidate_send_mail_view_form candidate.send.mail form New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_pivot_view_job Jobs - Recruitment hr.applicant pivot New
crm_case_tree_view_job Applicants hr.applicant list New
digest_digest_view_form digest.digest.view.form.inherit.hr.recruitment digest.digest xpath Inherits digest.digest_digest_view_form
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_applicant_category_view_form hr.applicant.category.form hr.applicant.category form New
hr_applicant_category_view_tree hr.applicant.category.list hr.applicant.category list New
hr_applicant_refuse_reason_view_form Applicant refuse reason form hr.applicant.refuse.reason form New
hr_applicant_refuse_reason_view_tree Applicant refuse reason list hr.applicant.refuse.reason list New
hr_applicant_view_activity hr.applicant.activity hr.applicant activity New
hr_applicant_view_form Jobs - Recruitment Form hr.applicant form New
hr_applicant_view_form_interviewer hr.applicant xpath Inherits hr_applicant_view_form
hr_applicant_view_graph hr.applicant.graph hr.applicant graph New
hr_applicant_view_pivot hr.applicant.pivot hr.applicant pivot New
hr_applicant_view_search hr.applicant.search hr.applicant search New
hr_applicant_view_search_bis hr.applicant.view.search hr.applicant search New
hr_applicant_view_tree_activity hr.applicant.view.list.activity hr.applicant list New
hr_candidate_view_calendar hr.candidate.view.calendar hr.candidate calendar New
hr_candidate_view_form hr.candidate.view.form hr.candidate form New
hr_candidate_view_kanban hr.candidate.view.kanban hr.candidate kanban New
hr_candidate_view_search hr.candidate.view.search hr.candidate search New
hr_candidate_view_tree hr.candidate.view.list hr.candidate list New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_job_platform_form hr.job.platform.form hr.job.platform form New
hr_job_platform_tree hr.job.platform.list hr.job.platform list New
hr_job_search_view hr.job.search hr.job xpath Inherits hr_recruitment.view_job_filter_recruitment
hr_job_simple_form hr.job.simple.form hr.job form New
hr_job_survey hr.job.form1 hr.job xpath Inherits hr.view_hr_job_form
hr_job_view_tree_inherit hr.job field Inherits hr.view_hr_job_tree
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.list hr.recruitment.degree list New
hr_recruitment_source_tree hr.recruitment.source.list hr.recruitment.source list New
hr_recruitment_source_view_search hr.recruitment.source.view.search hr.recruitment.source search New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.list hr.recruitment.stage list New
ir_attachment_hr_recruitment_list_view ir.attachment list New
ir_attachment_view_search_inherit_hr_recruitment ir.attachment.search.inherit.recruitment ir.attachment xpath Inherits base.view_attachment_search
mail_notification_light_without_background mail_notification_light_without_background ir.ui.view qweb Inherits mail.mail_notification_light
quick_create_applicant_form hr.applicant.form.quick_create hr.applicant form New
res_config_settings_view_form res.config.settings.view.form.inherit.hr.recruitment res.config.settings xpath Inherits base.res_config_settings_view_form
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_stage_kanban hr.recruitment.stage.kanban hr.recruitment.stage kanban New
view_job_filter_recruitment Job hr.job xpath Inherits hr.view_job_filter
Models touched (24)

New fields (9)
  • applicant_emails Text
    compute='_compute_applicant_emails'
  • applicant_ids Many2many → hr.applicant
    args: 'hr.applicant'
  • applicant_without_email Text
    compute='_compute_applicant_without_email' string='Applicant(s) not having email'
  • duplicates Boolean
    args: 'Duplicates'
  • duplicates_count Integer
    compute='_compute_duplicates_count' args: 'Duplicates Count'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    required=True args: 'hr.applicant.refuse.reason', 'Refuse Reason'
  • send_mail Boolean
    compute='_compute_send_mail' readonly=False store=True args: 'Send Email'
  • single_applicant_email Char
    compute='_compute_single_applicant_email' inverse='_inverse_single_applicant_email'
  • template_id Many2one → mail.template
    compute='_compute_send_mail' context={'active_test': True} domain="[('model', '=', 'hr.applicant')]" readonly=False store=True string='Email Template' args: 'mail.template'
Public methods (1)
  • action_refuse_reason_apply(self)

New fields (3)
  • applicant_ids Many2many → hr.applicant
    context={'active_test': False} required=True string='Applications' args: 'hr.applicant'
  • attachment_ids Many2many → ir.attachment
    readonly=False store=True string='Attachments' args: 'ir.attachment'
  • author_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner', 'Author'
Public methods (1)
  • action_send(self)

New fields (2)
  • applicant_id Many2one → hr.applicant
    index='btree_not_null' ondelete='set null' string='Applicant' args: 'hr.applicant'
  • candidate_id Many2one → hr.candidate
    compute='_compute_candidate_id' index='btree_not_null' ondelete='set null' readonly=False store=True string='Candidate' args: 'hr.candidate'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model

New fields (3)
  • attachment_ids Many2many → ir.attachment
    readonly=False store=True string='Attachments' args: 'ir.attachment'
  • author_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner', 'Author'
  • candidate_ids Many2many → hr.candidate
    required=True string='Candidates' args: 'hr.candidate'
Public methods (1)
  • action_send(self)

New fields (2)
  • kpi_hr_recruitment_new_colleagues Boolean
    args: 'New Employees'
  • kpi_hr_recruitment_new_colleagues_value Integer
    compute='_compute_kpi_hr_recruitment_new_colleagues_value'
Public methods (0)

No public methods.

New fields (55)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the case without removing it.' index=True args: 'Active'
  • applicant_notes Html
  • applicant_properties Properties
    copy=True definition='job_id.applicant_properties_definition' args: 'Properties'
  • application_status Selection
    compute='_compute_application_status' search='_search_application_status' args: [('ongoing', 'Ongoing'), ('hired', 'Hired'), ('refused', 'Refused'), ('archived', 'Archived')]
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.applicant')] string='Attachments' args: 'ir.attachment', 'res_id'
  • attachment_number Integer
    compute='_get_attachment_number' string='Number of Attachments'
  • availability Date
    readonly=False related='candidate_id.availability'
  • campaign_id Many2one
    ondelete='set null'
  • candidate_id Many2one → hr.candidate
    index=True required=True args: 'hr.candidate'
  • categ_ids Many2many → hr.applicant.category
    compute='_compute_categ_ids' readonly=False store=True string='Tags' args: 'hr.applicant.category'
  • color Integer
    related='candidate_id.color'
  • company_id Many2one → res.company
    compute='_compute_company' readonly=False store=True tracking=True args: 'res.company', 'Company'
  • create_date Datetime
    readonly=True args: 'Applied on'
  • date_closed Datetime
    compute='_compute_date_closed' copy=False readonly=False store=True tracking=True args: 'Hire Date'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True args: 'Last Stage Update'
  • date_open Datetime
    readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day' compute_sudo=True string='Days to Close'
  • day_open Float
    compute='_compute_day' compute_sudo=True string='Days to Open'
  • delay_close Float
    aggregator='avg' compute='_compute_delay' help='Number of days to close' readonly=True store=True string='Delay to Close'
  • department_id Many2one → hr.department
    compute='_compute_department' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=False store=True tracking=True args: 'hr.department', 'Department'
  • email_from Char
    readonly=False related='candidate_id.email_from'
  • email_normalized Char
    related='candidate_id.email_normalized'
  • emp_is_active Boolean
    related='candidate_id.emp_is_active'
  • employee_id Many2one
    readonly=False related='candidate_id.employee_id'
  • employee_name Char
    related='candidate_id.employee_name'
  • interviewer_ids Many2many → res.users
    copy=False domain="[('share', '=', False), ('company_ids', 'in', company_id)]" index=True string='Interviewers' tracking=True args: 'res.users', 'hr_applicant_res_users_interviewers_rel'
  • job_id Many2one → hr.job
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True tracking=True args: 'hr.job', 'Job Position'
  • kanban_state Selection
    copy=False default='normal' required=True string='Kanban State' args: [('normal', 'Grey'), ('done', 'Green'), ('blocked', 'Red')]
  • last_stage_id Many2one → hr.recruitment.stage
    help='Stage of the applicant before being in the current stage. Used for lost cases analysis.' args: 'hr.recruitment.stage', 'Last Stage'
  • legend_blocked Char
    related='stage_id.legend_blocked' string='Kanban Blocked'
  • legend_done Char
    related='stage_id.legend_done' string='Kanban Valid'
  • legend_normal Char
    related='stage_id.legend_normal' string='Kanban Ongoing'
  • linkedin_profile Char
    readonly=False related='candidate_id.linkedin_profile'
  • medium_id Many2one
    help='This displays how the applicant has reached out, e.g. via Email, LinkedIn, Website, etc.' ondelete='set null'
  • meeting_display_date Date
    compute='_compute_meeting_display'
  • meeting_display_text Char
    compute='_compute_meeting_display'
  • meeting_ids One2many → calendar.event
    args: 'calendar.event', 'applicant_id', 'Meetings'
  • other_applications_count Integer
    compute='_compute_other_applications_count' compute_sudo=True
  • partner_id Many2one
    related='candidate_id.partner_id'
  • partner_name Char
    compute='_compute_partner_name' compute_sudo=True inverse='_inverse_name' search='_search_partner_name'
  • partner_phone Char
    readonly=False related='candidate_id.partner_phone'
  • partner_phone_sanitized Char
    related='candidate_id.partner_phone_sanitized'
  • priority Selection
    default='0' args: AVAILABLE_PRIORITIES, 'Evaluation'
  • probability Float
    args: 'Probability'
  • refuse_date Datetime
    args: 'Refuse Date'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    string='Refuse Reason' tracking=True args: 'hr.applicant.refuse.reason'
  • salary_expected Float
    aggregator='avg' groups='hr_recruitment.group_hr_recruitment_user' help='Salary Expected by Applicant' tracking=True args: 'Expected'
  • salary_expected_extra Char
    groups='hr_recruitment.group_hr_recruitment_user' help='Salary Expected by Applicant, extra advantages' tracking=True args: 'Expected Salary Extra'
  • salary_proposed Float
    aggregator='avg' groups='hr_recruitment.group_hr_recruitment_user' help='Salary Proposed by the Organisation' tracking=True args: 'Proposed'
  • salary_proposed_extra Char
    groups='hr_recruitment.group_hr_recruitment_user' help='Salary Proposed by the Organisation, extra advantages' tracking=True args: 'Proposed Salary Extra'
  • source_id Many2one
    ondelete='set null'
  • stage_id Many2one → hr.recruitment.stage
    compute='_compute_stage' copy=False domain="['|', ('job_ids', '=', False), ('job_ids', '=', job_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True tracking=True args: 'hr.recruitment.stage', 'Stage'
  • type_id Many2one
    readonly=False related='candidate_id.type_id'
  • user_email Char
    readonly=True related='user_id.email' string='User Email'
  • user_id Many2one → res.users
    compute='_compute_user' domain="[('share', '=', False), ('company_ids', 'in', company_id)]" readonly=False store=True tracking=True args: 'res.users', 'Recruiter'
Public methods (15)
  • action_create_meeting(self)
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • action_open_attachments(self)
  • action_open_employee(self)
  • action_open_other_applications(self)
  • action_send_email(self)
  • archive_applicant(self)
  • create(self, vals_list)
    @api.model_create_multi
  • create_employee_from_applicant(self)
  • get_empty_list_help(self, help_message)
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model
  • init(self)
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • reset_applicant(self)
    Reinsert the applicant into the recruitment pipe in the first stage
  • toggle_active(self)
  • write(self, vals)

New fields (2)
  • color Integer
    default=_get_default_color string='Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (4)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Description'
  • sequence Integer
    copy=False default=10
  • template_id Many2one → mail.template
    domain="[('model', '=', 'hr.applicant')]" string='Email Template' args: 'mail.template'
Public methods (0)

No public methods.

New fields (30)
  • accepted_applications_count Integer
    compute='_compute_applications_count' string='# Accepted Offers'
  • active Boolean
    default=True index=True args: 'Active'
  • applicant_ids One2many → hr.applicant
    args: 'hr.applicant', 'candidate_id'
  • application_count Integer
    compute='_compute_application_count'
  • applications_count Integer
    compute='_compute_applications_count' string='# Offers'
  • attachment_count Integer
    compute='_compute_attachment_count' string='Number of Attachments'
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.candidate')] string='Attachments' args: 'ir.attachment', 'res_id'
  • availability Date
    help='The date at which the applicant will be available to start working' tracking=True args: 'Availability'
  • candidate_properties Properties
    copy=True definition='company_id.candidate_properties_definition' args: 'Properties'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company', 'Company'
  • email_from Char
    compute='_compute_partner_phone_email' index='trigram' inverse='_inverse_partner_email' size=128 store=True string='Email'
  • email_normalized Char
    index='trigram'
  • emp_is_active Boolean
    related='employee_id.active' string='Employee Active'
  • employee_id Many2one → hr.employee
    copy=False help='Employee linked to the candidate.' string='Employee' args: 'hr.employee'
  • employee_name Char
    readonly=False related='employee_id.name' string='Employee Name' tracking=False
  • linkedin_profile Char
    args: 'LinkedIn Profile'
  • meeting_display_date Date
    compute='_compute_meeting_display'
  • meeting_display_text Char
    compute='_compute_meeting_display'
  • meeting_ids One2many → calendar.event
    args: 'calendar.event', 'candidate_id', 'Meetings'
  • partner_id Many2one → res.partner
    copy=False index='btree_not_null' args: 'res.partner', 'Contact'
  • partner_name Char
    args: "Candidates's Name"
  • partner_phone Char
    compute='_compute_partner_phone_email' index='btree_not_null' inverse='_inverse_partner_email' size=32 store=True string='Phone'
  • partner_phone_sanitized Char
    compute='_compute_partner_phone_sanitized' index='btree_not_null' store=True string='Sanitized Phone Number'
  • priority Selection
    compute='_compute_priority' store=True string='Evaluation' args: AVAILABLE_PRIORITIES
  • refused_applications_count Integer
    compute='_compute_applications_count' string='# Refused Offers'
  • similar_candidates_count Integer
    compute='_compute_similar_candidates_count' help='Candidates with the same email or phone or mobile'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_id Many2one → res.users
    default=<expr> domain="[('share', '=', False), ('company_ids', 'in', company_id)]" string='Candidate Manager' tracking=True args: 'res.users'
Public methods (9)
  • action_create_meeting(self)
    This opens Meeting's calendar view to schedule meeting on current candidate @return: Dictionary value for created Meeting view
  • action_open_applications(self)
  • action_open_attachments(self)
  • action_open_employee(self)
  • action_open_similar_candidates(self)
  • action_send_email(self)
  • create_employee_from_candidate(self)
  • init(self)
  • write(self, vals)

New fields (3)
  • expected_employee Integer
    compute='_compute_recruitment_stats' string='Expected Employee'
  • new_applicant_count Integer
    compute='_compute_new_applicant_count' compute_sudo=True string='New Applicant'
  • new_hired_employee Integer
    compute='_compute_recruitment_stats' string='New Hired Employee'
Public methods (0)

No public methods.

New fields (1)
  • candidate_id One2many → hr.candidate
    groups='hr.group_hr_user' args: 'hr.candidate', 'employee_id', 'Candidate'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (26)
  • activities_overdue Integer
    compute='_compute_activities'
  • activities_today Integer
    compute='_compute_activities'
  • address_id Many2one → res.partner
    default=_default_address_id domain=<expr> help="Select the location where the applicant will work. Addresses listed here are defined on the company's contact information." args: 'res.partner', 'Job Location'
  • alias_id Many2one
    help='Email alias for this job position. New emails will automatically create new applicants for this job position.'
  • all_application_count Integer
    compute='_compute_all_application_count' string='All Application Count'
  • allowed_user_ids Many2many → res.users
    compute='_compute_allowed_user_ids' readonly=True args: 'res.users'
  • applicant_hired Integer
    compute='_compute_applicant_hired' string='Applicants Hired'
  • applicant_properties_definition PropertiesDefinition
    args: 'Applicant Properties'
  • application_count Integer
    compute='_compute_application_count' string='Application Count'
  • application_ids One2many → hr.applicant
    args: 'hr.applicant', 'job_id', 'Job Applications'
  • color Integer
    args: 'Color Index'
  • date_from Date
    help='Is set, update candidates availability once hired for that specific mission.'
  • date_to Date
  • document_ids One2many → ir.attachment
    compute='_compute_document_ids' readonly=True string='Documents' args: 'ir.attachment'
  • documents_count Integer
    compute='_compute_document_ids' string='Document Count'
  • extended_interviewer_ids Many2many → res.users
    compute='_compute_extended_interviewer_ids' store=True args: 'res.users', 'hr_job_extended_interviewer_res_users'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids args: 'res.users', 'job_favorite_user_rel', 'job_id', 'user_id'
  • industry_id Many2one → res.partner.industry
    args: 'res.partner.industry', 'Industry'
  • interviewer_ids Many2many → res.users
    domain="[('id', 'in', allowed_user_ids)]" help="The Interviewers set on the job position can see all Applicants in it. They have access to the information, the attachments, the meeting management and they can refuse him. You don't need to have Recruitment rights to be set as an interviewer." string='Interviewers' args: 'res.users'
  • is_favorite Boolean
    compute='_compute_is_favorite' inverse='_inverse_is_favorite'
  • job_properties Properties
    definition='company_id.job_properties_definition' args: 'Properties'
  • manager_id Many2one → hr.employee
    readonly=True related='department_id.manager_id' store=True string='Department Manager' args: 'hr.employee'
  • new_application_count Integer
    compute='_compute_new_application_count' help='Number of applications that are new in the flow (typically at first step of the flow)' string='New Application'
  • no_of_hired_employee Integer
    compute='_compute_no_of_hired_employee' copy=False help='Number of hired employees for this job position during recruitment phase.' store=True string='Hired'
  • old_application_count Integer
    compute='_compute_old_application_count' string='Old Application'
  • user_id Many2one → res.users
    default=<expr> domain="[('share', '=', False), ('id', 'in', allowed_user_ids)]" help="The Recruiter will be the default value for all Applicants Recruiter's field in this job position. The Recruiter is automatically added to all meetings with the Applicant." tracking=True args: 'res.users', 'Recruiter'
Public methods (8)
  • action_open_activities(self)
  • action_open_attachments(self)
  • action_open_late_activities(self)
  • action_open_today_activities(self)
  • close_dialog(self)
  • create(self, vals_list)
    @api.model_create_multi
  • edit_dialog(self)
  • write(self, vals)

New fields (3)
  • email Char
    help="Applications received from this Email won't be linked to a contact.There will be no email address set on the Applicant either." required=True
  • name Char
    required=True
  • regex Char
    help="The regex facilitates to extract information from the subject or body of the received email to autopopulate the Applicant's name field"
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (2)
  • name Char
    required=True translate=True args: 'Degree Name'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (5)
  • alias_id Many2one → mail.alias
    ondelete='restrict' args: 'mail.alias', 'Alias ID'
  • email Char
    readonly=True related='alias_id.display_name' string='Email'
  • has_domain Char
    compute='_compute_has_domain'
  • job_id Many2one → hr.job
    ondelete='cascade' args: 'hr.job', 'Job'
  • medium_id Many2one → utm.medium
    default=<expr> args: 'utm.medium'
Public methods (2)
  • create_alias(self)
  • unlink(self)
    Cascade delete aliases to avoid useless / badly configured aliases.

New fields (11)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Kanban'
  • hired_stage Boolean
    help='If checked, this stage is used to determine the hire date of an applicant' args: 'Hired Stage'
  • is_warning_visible Boolean
    compute='_compute_is_warning_visible'
  • job_ids Many2many → hr.job
    help='Specific jobs that use this stage. Other jobs will not use this stage.' string='Job Specific' args: 'hr.job'
  • legend_blocked Char
    default=<expr> required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> required=True translate=True args: 'Grey Kanban Label'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    args: 'Requirements'
  • sequence Integer
    default=10 args: 'Sequence'
  • template_id Many2one → mail.template
    help='If set, a message is posted on the applicant using the template when the applicant is set to the stage.' args: 'mail.template', 'Email Template'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • candidate_properties_definition PropertiesDefinition
    args: 'Candidate Properties'
  • job_properties_definition PropertiesDefinition
    args: 'Job Properties'
Public methods (0)

No public methods.

New fields (4)
  • group_applicant_cv_display Boolean
    implied_group='hr_recruitment.group_applicant_cv_display'
  • module_hr_recruitment_extract Boolean
    string='Send CV to OCR to fill applications'
  • module_hr_recruitment_survey Boolean
    string='Interview Forms'
  • module_website_hr_recruitment Boolean
    string='Online Posting'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/hr_recruitment
VERSION
VERSION 1.1
CATEGORY
CATEGORYHuman Resources/Recruitment
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Xavier ALT, Christophe Simonis, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Damien Bouvy, Yannick Tivisse, Odoo Online, Pierre Masereel, Adrien Dieudonne, Jorge Pinna Puissant, Alexandre Kühn, Victor Feyens, Joseph Caburnay, Julien Mougenot, Samuel Degueldre, Alvaro Fuentes, std-odoo, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, abd-msyukyu-odoo, Kevin Baptiste, sofiagvaladze, Florian Damhaut, MerlinGuillaume, Louis Baudoux, Dossogne Bertrand, niyasraphy, Thomas Lefebvre (thle), alsh-odoo, Louis Wicket (wil), Victor Piryns (pivi), Yash Vaishnav, miad-odoo, Pierre-Yves Dufays, Jurgen (jugj), pash-odoo, Dylan Kiss (dyki), Bruno Boi, Antoine (ande), FrancoisGe, Michael (mcm), prye-odoo, Adrien Schoffeniels, Brieuc-brd, Andrzej(pian), dasz, Mélanie, Youssef Bashandy, lase@odoo.com, Flotchet, jugj-odoo, Julien Carion (juca), utag-odoo, Louis (wil), Mathieu Coutant, Elisabeth Dickinson, Kacper Gasior, Abdelrahman Mahmoud (amah), jepbarasgarov, nikj-odoo, Pierre Pulinckx (pipu), Bastien PIERRE, agbr-odoo, Quentin Colla (qucol)
WEBSITE
WEBSITEhttps://www.odoo.com/app/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 13:18:28
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - phone_validation
    - mail
    - bus
    - web_tour
    - resource
    - calendar
    - onboarding
    - utm
    - attachment_indexation
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (41)
XML IDNameModelTypeStatus
applicant_get_refuse_reason_view_form applicant.get.refuse.reason.form applicant.get.refuse.reason form New
applicant_hired_template applicant_hired_template ir.ui.view qweb New
applicant_send_mail_view_form applicant.send.mail form New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_pivot_view_job Jobs - Recruitment hr.applicant pivot New
crm_case_tree_view_job Applicants hr.applicant tree New
digest_digest_view_form digest.digest.view.form.inherit.hr.recruitment digest.digest xpath Inherits digest.digest_digest_view_form
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_applicant_category_view_form hr.applicant.category.form hr.applicant.category form New
hr_applicant_category_view_tree hr.applicant.category.tree hr.applicant.category tree New
hr_applicant_refuse_reason_view_form Applicant refuse reason form hr.applicant.refuse.reason form New
hr_applicant_refuse_reason_view_tree Applicant refuse reason tree hr.applicant.refuse.reason tree New
hr_applicant_view_activity hr.applicant.activity hr.applicant activity New
hr_applicant_view_form Jobs - Recruitment Form hr.applicant form New
hr_applicant_view_form_interviewer hr.applicant xpath Inherits hr_applicant_view_form
hr_applicant_view_graph hr.applicant.graph hr.applicant graph New
hr_applicant_view_pivot hr.applicant.pivot hr.applicant pivot New
hr_applicant_view_search hr.applicant.search hr.applicant search New
hr_applicant_view_search_bis hr.applicant.view.search hr.applicant search New
hr_applicant_view_tree_activity hr.applicant.view.tree.activity hr.applicant tree New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_job_search_view hr.job.search hr.job xpath Inherits hr_recruitment.view_job_filter_recruitment
hr_job_simple_form hr.job.simple.form hr.job form New
hr_job_survey hr.job.form1 hr.job div Inherits hr.view_hr_job_form
hr_job_view_tree_inherit hr.job field Inherits hr.view_hr_job_tree
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_kanban hr.recruitment.source.kanban hr.recruitment.source kanban New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_source_view_search hr.recruitment.source.view.search hr.recruitment.source search New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
ir_attachment_hr_recruitment_list_view ir.attachment tree New
ir_attachment_view_search_inherit_hr_recruitment ir.attachment.search.inherit.recruitment ir.attachment xpath Inherits base.view_attachment_search
mail_notification_light_without_background mail_notification_light_without_background ir.ui.view qweb Inherits mail.mail_notification_light
quick_create_applicant_form hr.applicant.form.quick_create hr.applicant form New
res_config_settings_view_form res.config.settings.view.form.inherit.hr.recruitment res.config.settings xpath Inherits base.res_config_settings_view_form
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_stage_kanban hr.recruitment.stage.kanban hr.recruitment.stage kanban New
view_job_filter_recruitment Job hr.job xpath Inherits hr.view_job_filter
Models touched (18)

New fields (6)
  • applicant_emails Text
    compute='_compute_applicant_emails'
  • applicant_ids Many2many → hr.applicant
    args: 'hr.applicant'
  • applicant_without_email Text
    compute='_compute_applicant_without_email' string='Applicant(s) not having email'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    required=True args: 'hr.applicant.refuse.reason', 'Refuse Reason'
  • send_mail Boolean
    compute='_compute_send_mail' readonly=False store=True args: 'Send Email'
  • template_id Many2one → mail.template
    compute='_compute_send_mail' domain="[('model', '=', 'hr.applicant')]" readonly=False store=True string='Email Template' args: 'mail.template'
Public methods (1)
  • action_refuse_reason_apply(self)

New fields (2)
  • applicant_ids Many2many → hr.applicant
    context={'active_test': False} required=True string='Applications' args: 'hr.applicant'
  • author_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner', 'Author'
Public methods (1)
  • action_send(self)

New fields (1)
  • applicant_id Many2one → hr.applicant
    index='btree_not_null' ondelete='set null' string='Applicant' args: 'hr.applicant'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model

New fields (2)
  • kpi_hr_recruitment_new_colleagues Boolean
    args: 'New Employees'
  • kpi_hr_recruitment_new_colleagues_value Integer
    compute='_compute_kpi_hr_recruitment_new_colleagues_value'
Public methods (0)

No public methods.

New fields (56)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the case without removing it.' index=True args: 'Active'
  • applicant_properties Properties
    copy=True definition='job_id.applicant_properties_definition' args: 'Properties'
  • application_count Integer
    compute='_compute_application_count' help='Applications with the same email or phone or mobile'
  • application_status Selection
    compute='_compute_application_status' args: [('ongoing', 'Ongoing'), ('hired', 'Hired'), ('refused', 'Refused'), ('archived', 'Archived')]
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.applicant')] string='Attachments' args: 'ir.attachment', 'res_id'
  • attachment_number Integer
    compute='_get_attachment_number' string='Number of Attachments'
  • availability Date
    help='The date at which the applicant will be available to start working' tracking=True args: 'Availability'
  • campaign_id Many2one
    ondelete='set null'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    compute='_compute_company' readonly=False store=True tracking=True args: 'res.company', 'Company'
  • create_date Datetime
    readonly=True args: 'Applied on'
  • date_closed Datetime
    compute='_compute_date_closed' copy=False readonly=False store=True tracking=True args: 'Hire Date'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True args: 'Last Stage Update'
  • date_open Datetime
    readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day' compute_sudo=True string='Days to Close'
  • day_open Float
    compute='_compute_day' compute_sudo=True string='Days to Open'
  • delay_close Float
    compute='_compute_delay' group_operator='avg' help='Number of days to close' readonly=True store=True string='Delay to Close'
  • department_id Many2one → hr.department
    compute='_compute_department' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=False store=True tracking=True args: 'hr.department', 'Department'
  • description Html
    args: 'Description'
  • email_from Char
    compute='_compute_partner_phone_email' index='trigram' inverse='_inverse_partner_email' size=128 store=True args: 'Email'
  • email_normalized Char
    index='trigram'
  • emp_id Many2one → hr.employee
    copy=False help='Employee linked to the applicant.' string='Employee' args: 'hr.employee'
  • emp_is_active Boolean
    related='emp_id.active' string='Employee Active'
  • employee_name Char
    readonly=False related='emp_id.name' string='Employee Name' tracking=False
  • interviewer_ids Many2many → res.users
    copy=False domain="[('share', '=', False), ('company_ids', 'in', company_id)]" index=True string='Interviewers' tracking=True args: 'res.users', 'hr_applicant_res_users_interviewers_rel'
  • job_id Many2one → hr.job
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True tracking=True args: 'hr.job', 'Applied Job'
  • kanban_state Selection
    copy=False default='normal' required=True string='Kanban State' args: [('normal', 'Grey'), ('done', 'Green'), ('blocked', 'Red')]
  • last_stage_id Many2one → hr.recruitment.stage
    help='Stage of the applicant before being in the current stage. Used for lost cases analysis.' args: 'hr.recruitment.stage', 'Last Stage'
  • legend_blocked Char
    related='stage_id.legend_blocked' string='Kanban Blocked'
  • legend_done Char
    related='stage_id.legend_done' string='Kanban Valid'
  • legend_normal Char
    related='stage_id.legend_normal' string='Kanban Ongoing'
  • linkedin_profile Char
    args: 'LinkedIn Profile'
  • medium_id Many2one
    ondelete='set null'
  • meeting_display_date Date
    compute='_compute_meeting_display'
  • meeting_display_text Char
    compute='_compute_meeting_display'
  • meeting_ids One2many → calendar.event
    args: 'calendar.event', 'applicant_id', 'Meetings'
  • name Char
    help='Email subject for applications sent via email' index='trigram' required=True args: 'Subject / Application'
  • partner_id Many2one → res.partner
    copy=False index='btree_not_null' args: 'res.partner', 'Contact'
  • partner_mobile Char
    compute='_compute_partner_phone_email' index='btree_not_null' inverse='_inverse_partner_email' readonly=False size=32 store=True args: 'Mobile'
  • partner_mobile_sanitized Char
    compute='_compute_partner_mobile_sanitized' index='btree_not_null' store=True string='Sanitized Mobile Number'
  • partner_name Char
    args: "Applicant's Name"
  • partner_phone Char
    compute='_compute_partner_phone_email' index='btree_not_null' inverse='_inverse_partner_email' readonly=False size=32 store=True args: 'Phone'
  • partner_phone_sanitized Char
    compute='_compute_partner_phone_sanitized' index='btree_not_null' store=True string='Sanitized Phone Number'
  • priority Selection
    default='0' args: AVAILABLE_PRIORITIES, 'Evaluation'
  • probability Float
    args: 'Probability'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    string='Refuse Reason' tracking=True args: 'hr.applicant.refuse.reason'
  • salary_expected Float
    group_operator='avg' groups='hr_recruitment.group_hr_recruitment_user' help='Salary Expected by Applicant' tracking=True args: 'Expected Salary'
  • salary_expected_extra Char
    groups='hr_recruitment.group_hr_recruitment_user' help='Salary Expected by Applicant, extra advantages' tracking=True args: 'Expected Salary Extra'
  • salary_proposed Float
    group_operator='avg' groups='hr_recruitment.group_hr_recruitment_user' help='Salary Proposed by the Organisation' tracking=True args: 'Proposed Salary'
  • salary_proposed_extra Char
    groups='hr_recruitment.group_hr_recruitment_user' help='Salary Proposed by the Organisation, extra advantages' tracking=True args: 'Proposed Salary Extra'
  • source_id Many2one
    ondelete='set null'
  • stage_id Many2one → hr.recruitment.stage
    compute='_compute_stage' copy=False domain="['|', ('job_ids', '=', False), ('job_ids', '=', job_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True tracking=True args: 'hr.recruitment.stage', 'Stage'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_email Char
    readonly=True related='user_id.email' string='User Email'
  • user_id Many2one → res.users
    compute='_compute_user' domain="[('share', '=', False), ('company_ids', 'in', company_id)]" readonly=False store=True tracking=True args: 'res.users', 'Recruiter'
Public methods (15)
  • action_applications_email(self)
  • action_makeMeeting(self)
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • action_open_attachments(self)
  • action_open_employee(self)
  • action_send_email(self)
  • archive_applicant(self)
  • create(self, vals_list)
    @api.model_create_multi
  • create_employee_from_applicant(self)
    Create an employee from applicant
  • get_empty_list_help(self, help_message)
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model
  • init(self)
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • reset_applicant(self)
    Reinsert the applicant into the recruitment pipe in the first stage
  • toggle_active(self)
  • write(self, vals)

New fields (2)
  • color Integer
    default=_get_default_color string='Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (4)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Description'
  • sequence Integer
    copy=False default=10
  • template_id Many2one → mail.template
    domain="[('model', '=', 'hr.applicant')]" string='Email Template' args: 'mail.template'
Public methods (0)

No public methods.

New fields (3)
  • expected_employee Integer
    compute='_compute_recruitment_stats' string='Expected Employee'
  • new_applicant_count Integer
    compute='_compute_new_applicant_count' compute_sudo=True string='New Applicant'
  • new_hired_employee Integer
    compute='_compute_recruitment_stats' string='New Hired Employee'
Public methods (0)

No public methods.

New fields (1)
  • applicant_id One2many → hr.applicant
    args: 'hr.applicant', 'emp_id', 'Applicant'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (21)
  • activities_overdue Integer
    compute='_compute_activities'
  • activities_today Integer
    compute='_compute_activities'
  • address_id Many2one → res.partner
    default=_default_address_id domain=<expr> help="Select the location where the applicant will work. Addresses listed here are defined on the company's contact information." args: 'res.partner', 'Job Location'
  • alias_id Many2one
    help='Email alias for this job position. New emails will automatically create new applicants for this job position.'
  • all_application_count Integer
    compute='_compute_all_application_count' string='All Application Count'
  • allowed_user_ids Many2many → res.users
    compute='_compute_allowed_user_ids' readonly=True args: 'res.users'
  • applicant_hired Integer
    compute='_compute_applicant_hired' string='Applicants Hired'
  • applicant_properties_definition PropertiesDefinition
    args: 'Applicant Properties'
  • application_count Integer
    compute='_compute_application_count' string='Application Count'
  • application_ids One2many → hr.applicant
    args: 'hr.applicant', 'job_id', 'Job Applications'
  • color Integer
    args: 'Color Index'
  • document_ids One2many → ir.attachment
    compute='_compute_document_ids' readonly=True string='Documents' args: 'ir.attachment'
  • documents_count Integer
    compute='_compute_document_ids' string='Document Count'
  • extended_interviewer_ids Many2many → res.users
    compute='_compute_extended_interviewer_ids' store=True args: 'res.users', 'hr_job_extended_interviewer_res_users'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids args: 'res.users', 'job_favorite_user_rel', 'job_id', 'user_id'
  • interviewer_ids Many2many → res.users
    domain="[('id', 'in', allowed_user_ids)]" help="The Interviewers set on the job position can see all Applicants in it. They have access to the information, the attachments, the meeting management and they can refuse him. You don't need to have Recruitment rights to be set as an interviewer." string='Interviewers' args: 'res.users'
  • is_favorite Boolean
    compute='_compute_is_favorite' inverse='_inverse_is_favorite'
  • manager_id Many2one → hr.employee
    readonly=True related='department_id.manager_id' store=True string='Department Manager' args: 'hr.employee'
  • new_application_count Integer
    compute='_compute_new_application_count' help='Number of applications that are new in the flow (typically at first step of the flow)' string='New Application'
  • old_application_count Integer
    compute='_compute_old_application_count' string='Old Application'
  • user_id Many2one → res.users
    domain="[('id', 'in', allowed_user_ids)]" help="The Recruiter will be the default value for all Applicants Recruiter's field in this job position. The Recruiter is automatically added to all meetings with the Applicant." tracking=True args: 'res.users', 'Recruiter'
Public methods (8)
  • action_open_activities(self)
  • action_open_attachments(self)
  • action_open_late_activities(self)
  • action_open_today_activities(self)
  • close_dialog(self)
  • create(self, vals_list)
    @api.model_create_multi
  • edit_dialog(self)
  • write(self, vals)

New fields (2)
  • name Char
    required=True translate=True args: 'Degree Name'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (5)
  • alias_id Many2one → mail.alias
    ondelete='restrict' args: 'mail.alias', 'Alias ID'
  • email Char
    readonly=True related='alias_id.display_name' string='Email'
  • has_domain Char
    compute='_compute_has_domain'
  • job_id Many2one → hr.job
    ondelete='cascade' args: 'hr.job', 'Job'
  • medium_id Many2one → utm.medium
    default=<expr> args: 'utm.medium'
Public methods (2)
  • create_alias(self)
  • unlink(self)
    Cascade delete aliases to avoid useless / badly configured aliases.

New fields (11)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Kanban'
  • hired_stage Boolean
    help='If checked, this stage is used to determine the hire date of an applicant' args: 'Hired Stage'
  • is_warning_visible Boolean
    compute='_compute_is_warning_visible'
  • job_ids Many2many → hr.job
    help='Specific jobs that uses this stage. Other jobs will not use this stage.' string='Job Specific' args: 'hr.job'
  • legend_blocked Char
    default=<expr> required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> required=True translate=True args: 'Grey Kanban Label'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    args: 'Requirements'
  • sequence Integer
    default=10 args: 'Sequence'
  • template_id Many2one → mail.template
    help='If set, a message is posted on the applicant using the template when the applicant is set to the stage.' args: 'mail.template', 'Email Template'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • group_applicant_cv_display Boolean
    implied_group='hr_recruitment.group_applicant_cv_display'
  • module_hr_recruitment_extract Boolean
    string='Send CV to OCR to fill applications'
  • module_hr_recruitment_survey Boolean
    string='Interview Forms'
  • module_website_hr_recruitment Boolean
    string='Online Posting'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/hr_recruitment
VERSION
VERSION 1.1
CATEGORY
CATEGORYHuman Resources/Recruitment
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Joren Van Onder, Géry Debongnie, Aaron Bohy, Yannick Tivisse, Romain Derie, Aurélien Warnon, David Tran, Romeo Fragomeli, Victor Feyens, alt-odoo, Julien Mougenot, Samuel Degueldre, Alvaro Fuentes, std-odoo, Nasreddin Boulif (bon), Prakash Prajapati, Pierre Paridans, William Braeckman, Kevin Baptiste, Philippe Wauthy, sofiagvaladze, Adrien Minet, Antoine Vandevenne (anv), Jinjiu Liu, Dossogne Bertrand, niyasraphy, Thomas Lefebvre (thle), Louis Wicket (wil), Jurgen (jugj), Michael (mcm), prye-odoo, Leonardo Pavan Rocha, stefanorigano (SRI), MAHAMADASIF ANSARI, ravb-odoo, Ethan Vincent, aath-odoo, asno-odoo, Kacper Gasior, Rob Coekaerts, Abdelrahman Mahmoud (amah), Aman Patel
WEBSITE
WEBSITEhttps://www.odoo.com/app/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:51
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
    - utm
    - attachment_indexation
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (41)
XML IDNameModelTypeStatus
applicant_get_refuse_reason_view_form applicant.get.refuse.reason.form applicant.get.refuse.reason form New
applicant_hired_template applicant_hired_template ir.ui.view qweb New
applicant_send_mail_view_form applicant.send.mail form New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_pivot_view_job Jobs - Recruitment hr.applicant pivot New
crm_case_tree_view_job Applicants hr.applicant tree New
digest_digest_view_form digest.digest.view.form.inherit.hr.recruitment digest.digest xpath Inherits digest.digest_digest_view_form
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_applicant_category_view_form hr.applicant.category.form hr.applicant.category form New
hr_applicant_category_view_tree hr.applicant.category.tree hr.applicant.category tree New
hr_applicant_refuse_reason_view_form Applicant refuse reason form hr.applicant.refuse.reason form New
hr_applicant_refuse_reason_view_tree Applicant refuse reason tree hr.applicant.refuse.reason tree New
hr_applicant_view_activity hr.applicant.activity hr.applicant activity New
hr_applicant_view_form Jobs - Recruitment Form hr.applicant form New
hr_applicant_view_form_interviewer hr.applicant xpath Inherits hr_applicant_view_form
hr_applicant_view_graph hr.applicant.graph hr.applicant graph New
hr_applicant_view_pivot hr.applicant.pivot hr.applicant pivot New
hr_applicant_view_search hr.applicant.search hr.applicant search New
hr_applicant_view_search_bis hr.applicant.view.search hr.applicant search New
hr_applicant_view_tree_activity hr.applicant.view.tree.activity hr.applicant tree New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_job_search_view hr.job.search hr.job xpath Inherits hr.view_job_filter
hr_job_simple_form hr.job.simple.form hr.job form New
hr_job_survey hr.job.form1 hr.job div Inherits hr.view_hr_job_form
hr_job_view_tree_inherit hr.job field Inherits hr.view_hr_job_tree
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_kanban hr.recruitment.source.kanban hr.recruitment.source kanban New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_source_view_search hr.recruitment.source.view.search hr.recruitment.source search New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
ir_attachment_hr_recruitment_list_view ir.attachment tree New
ir_attachment_view_search_inherit_hr_recruitment ir.attachment.search.inherit.recruitment ir.attachment xpath Inherits base.view_attachment_search
quick_create_applicant_form hr.applicant.form.quick_create hr.applicant form New
res_config_settings_view_form res.config.settings.view.form.inherit.hr.recruitment res.config.settings xpath Inherits base.res_config_settings_view_form
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_stage_kanban hr.recruitment.stage.kanban hr.recruitment.stage kanban New
view_job_filter_recruitment Job hr.job xpath Inherits hr.view_job_filter
Models touched (18)

New fields (5)
  • applicant_ids Many2many → hr.applicant
    args: 'hr.applicant'
  • applicant_without_email Text
    compute='_compute_applicant_without_email' string='Applicant(s) not having email'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    required=True args: 'hr.applicant.refuse.reason', 'Refuse Reason'
  • send_mail Boolean
    compute='_compute_send_mail' readonly=False store=True args: 'Send Email'
  • template_id Many2one → mail.template
    compute='_compute_send_mail' domain="[('model', '=', 'hr.applicant')]" readonly=False store=True string='Email Template' args: 'mail.template'
Public methods (1)
  • action_refuse_reason_apply(self)

New fields (2)
  • applicant_ids Many2many → hr.applicant
    required=True string='Applications' args: 'hr.applicant'
  • author_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner', 'Author'
Public methods (1)
  • action_send(self)

New fields (1)
  • applicant_id Many2one → hr.applicant
    index='btree_not_null' ondelete='set null' string='Applicant' args: 'hr.applicant'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • kpi_hr_recruitment_new_colleagues Boolean
    args: 'New Employees'
  • kpi_hr_recruitment_new_colleagues_value Integer
    compute='_compute_kpi_hr_recruitment_new_colleagues_value'
Public methods (0)

No public methods.

New fields (51)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the case without removing it.' args: 'Active'
  • application_count Integer
    compute='_compute_application_count' help='Applications with the same email or phone or mobile'
  • application_status Selection
    compute='_compute_application_status' args: [('ongoing', 'Ongoing'), ('hired', 'Hired'), ('refused', 'Refused')]
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.applicant')] string='Attachments' args: 'ir.attachment', 'res_id'
  • attachment_number Integer
    compute='_get_attachment_number' string='Number of Attachments'
  • availability Date
    help='The date at which the applicant will be available to start working' tracking=True args: 'Availability'
  • campaign_id Many2one
    ondelete='set null'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    compute='_compute_company' readonly=False store=True tracking=True args: 'res.company', 'Company'
  • create_date Datetime
    readonly=True args: 'Creation Date'
  • date_closed Datetime
    compute='_compute_date_closed' copy=False readonly=False store=True tracking=True args: 'Hire Date'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True args: 'Last Stage Update'
  • date_open Datetime
    readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day' compute_sudo=True string='Days to Close'
  • day_open Float
    compute='_compute_day' compute_sudo=True string='Days to Open'
  • delay_close Float
    compute='_compute_day' group_operator='avg' help='Number of days to close' readonly=True store=True string='Delay to Close'
  • department_id Many2one → hr.department
    compute='_compute_department' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=False store=True tracking=True args: 'hr.department', 'Department'
  • description Html
    args: 'Description'
  • email_from Char
    compute='_compute_partner_phone_email' inverse='_inverse_partner_email' size=128 store=True args: 'Email'
  • emp_id Many2one → hr.employee
    copy=False help='Employee linked to the applicant.' string='Employee' args: 'hr.employee'
  • employee_name Char
    readonly=False related='emp_id.name' string='Employee Name' tracking=False
  • interviewer_ids Many2many → res.users
    copy=False domain="[('share', '=', False), ('company_ids', 'in', company_id)]" index=True string='Interviewers' tracking=True args: 'res.users', 'hr_applicant_res_users_interviewers_rel'
  • job_id Many2one → hr.job
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True tracking=True args: 'hr.job', 'Applied Job'
  • kanban_state Selection
    copy=False default='normal' required=True string='Kanban State' args: [('normal', 'Grey'), ('done', 'Green'), ('blocked', 'Red')]
  • last_stage_id Many2one → hr.recruitment.stage
    help='Stage of the applicant before being in the current stage. Used for lost cases analysis.' args: 'hr.recruitment.stage', 'Last Stage'
  • legend_blocked Char
    related='stage_id.legend_blocked' string='Kanban Blocked'
  • legend_done Char
    related='stage_id.legend_done' string='Kanban Valid'
  • legend_normal Char
    related='stage_id.legend_normal' string='Kanban Ongoing'
  • linkedin_profile Char
    args: 'LinkedIn Profile'
  • medium_id Many2one
    ondelete='set null'
  • meeting_display_date Date
    compute='_compute_meeting_display'
  • meeting_display_text Char
    compute='_compute_meeting_display'
  • meeting_ids One2many → calendar.event
    args: 'calendar.event', 'applicant_id', 'Meetings'
  • name Char
    help='Email subject for applications sent via email' index='trigram' required=True args: 'Subject / Application'
  • partner_id Many2one → res.partner
    copy=False args: 'res.partner', 'Contact'
  • partner_mobile Char
    compute='_compute_partner_phone_email' inverse='_inverse_partner_mobile' size=32 store=True args: 'Mobile'
  • partner_name Char
    args: "Applicant's Name"
  • partner_phone Char
    compute='_compute_partner_phone_email' inverse='_inverse_partner_phone' size=32 store=True args: 'Phone'
  • priority Selection
    default='0' args: AVAILABLE_PRIORITIES, 'Evaluation'
  • probability Float
    args: 'Probability'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    string='Refuse Reason' tracking=True args: 'hr.applicant.refuse.reason'
  • salary_expected Float
    group_operator='avg' groups='hr_recruitment.group_hr_recruitment_user' help='Salary Expected by Applicant' tracking=True args: 'Expected Salary'
  • salary_expected_extra Char
    groups='hr_recruitment.group_hr_recruitment_user' help='Salary Expected by Applicant, extra advantages' tracking=True args: 'Expected Salary Extra'
  • salary_proposed Float
    group_operator='avg' groups='hr_recruitment.group_hr_recruitment_user' help='Salary Proposed by the Organisation' tracking=True args: 'Proposed Salary'
  • salary_proposed_extra Char
    groups='hr_recruitment.group_hr_recruitment_user' help='Salary Proposed by the Organisation, extra advantages' tracking=True args: 'Proposed Salary Extra'
  • source_id Many2one
    ondelete='set null'
  • stage_id Many2one → hr.recruitment.stage
    compute='_compute_stage' copy=False domain="['|', ('job_ids', '=', False), ('job_ids', '=', job_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True tracking=True args: 'hr.recruitment.stage', 'Stage'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_email Char
    readonly=True related='user_id.email' string='User Email'
  • user_id Many2one → res.users
    compute='_compute_user' domain="[('share', '=', False), ('company_ids', 'in', company_id)]" readonly=False store=True tracking=True args: 'res.users', 'Recruiter'
Public methods (15)
  • action_applications_email(self)
  • action_makeMeeting(self)
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • action_open_attachments(self)
  • action_open_employee(self)
  • action_send_email(self)
  • archive_applicant(self)
  • create(self, vals_list)
    @api.model_create_multi
  • create_employee_from_applicant(self)
    Create an employee from applicant
  • get_empty_list_help(self, help)
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • name_get(self)
  • reset_applicant(self)
    Reinsert the applicant into the recruitment pipe in the first stage
  • toggle_active(self)
  • write(self, vals)

New fields (2)
  • color Integer
    default=_get_default_color string='Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Description'
  • template_id Many2one → mail.template
    domain="[('model', '=', 'hr.applicant')]" string='Email Template' args: 'mail.template'
Public methods (0)

No public methods.

New fields (3)
  • expected_employee Integer
    compute='_compute_recruitment_stats' string='Expected Employee'
  • new_applicant_count Integer
    compute='_compute_new_applicant_count' compute_sudo=True string='New Applicant'
  • new_hired_employee Integer
    compute='_compute_recruitment_stats' string='New Hired Employee'
Public methods (0)

No public methods.

New fields (2)
  • applicant_id One2many → hr.applicant
    args: 'hr.applicant', 'emp_id', 'Applicant'
  • newly_hired_employee Boolean
    compute='_compute_newly_hired_employee' search='_search_newly_hired_employee' args: 'Newly hired employee'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (20)
  • activities_overdue Integer
    compute='_compute_activities'
  • activities_today Integer
    compute='_compute_activities'
  • address_id Many2one → res.partner
    default=_default_address_id domain=<expr> help='Address where employees are working' args: 'res.partner', 'Job Location'
  • alias_id Many2one → mail.alias
    help='Email alias for this job position. New emails will automatically create new applicants for this job position.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • all_application_count Integer
    compute='_compute_all_application_count' string='All Application Count'
  • applicant_hired Integer
    compute='_compute_applicant_hired' string='Applicants Hired'
  • application_count Integer
    compute='_compute_application_count' string='Application Count'
  • application_ids One2many → hr.applicant
    args: 'hr.applicant', 'job_id', 'Job Applications'
  • color Integer
    args: 'Color Index'
  • document_ids One2many → ir.attachment
    compute='_compute_document_ids' readonly=True string='Documents' args: 'ir.attachment'
  • documents_count Integer
    compute='_compute_document_ids' string='Document Count'
  • extended_interviewer_ids Many2many → res.users
    compute='_compute_extended_interviewer_ids' store=True args: 'res.users', 'hr_job_extended_interviewer_res_users'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids args: 'res.users', 'job_favorite_user_rel', 'job_id', 'user_id'
  • hr_responsible_id Many2one → res.users
    help="Person responsible of validating the employee's contracts." tracking=True args: 'res.users', 'HR Responsible'
  • interviewer_ids Many2many → res.users
    domain="[('share', '=', False), ('company_ids', 'in', company_id)]" help="The Interviewers set on the job position can see all Applicants in it. They have access to the information, the attachments, the meeting management and they can refuse him. You don't need to have Recruitment rights to be set as an interviewer." string='Interviewers' args: 'res.users'
  • is_favorite Boolean
    compute='_compute_is_favorite' inverse='_inverse_is_favorite'
  • manager_id Many2one → hr.employee
    readonly=True related='department_id.manager_id' store=True string='Department Manager' args: 'hr.employee'
  • new_application_count Integer
    compute='_compute_new_application_count' help='Number of applications that are new in the flow (typically at first step of the flow)' string='New Application'
  • old_application_count Integer
    compute='_compute_old_application_count' string='Old Application'
  • user_id Many2one → res.users
    domain="[('share', '=', False), ('company_ids', 'in', company_id)]" help="The Recruiter will be the default value for all Applicants Recruiter's field in this job position. The Recruiter is automatically added to all meetings with the Applicant." tracking=True args: 'res.users', 'Recruiter'
Public methods (8)
  • action_open_activities(self)
  • action_open_attachments(self)
  • action_open_late_activities(self)
  • action_open_today_activities(self)
  • close_dialog(self)
  • create(self, vals_list)
    @api.model_create_multi
  • edit_dialog(self)
  • write(self, vals)

New fields (2)
  • name Char
    required=True translate=True args: 'Degree Name'
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (5)
  • alias_id Many2one → mail.alias
    args: 'mail.alias', 'Alias ID'
  • email Char
    readonly=True related='alias_id.display_name' string='Email'
  • has_domain Char
    compute='_compute_has_domain'
  • job_id Many2one → hr.job
    ondelete='cascade' args: 'hr.job', 'Job'
  • medium_id Many2one → utm.medium
    default=<expr> args: 'utm.medium'
Public methods (1)
  • create_alias(self)

New fields (11)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Kanban'
  • hired_stage Boolean
    help='If checked, this stage is used to determine the hire date of an applicant' args: 'Hired Stage'
  • is_warning_visible Boolean
    compute='_compute_is_warning_visible'
  • job_ids Many2many → hr.job
    help='Specific jobs that uses this stage. Other jobs will not use this stage.' string='Job Specific' args: 'hr.job'
  • legend_blocked Char
    default=<expr> required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> required=True translate=True args: 'Grey Kanban Label'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    args: 'Requirements'
  • sequence Integer
    default=10 args: 'Sequence'
  • template_id Many2one → mail.template
    help='If set, a message is posted on the applicant using the template when the applicant is set to the stage.' args: 'mail.template', 'Email Template'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • group_applicant_cv_display Boolean
    implied_group='hr_recruitment.group_applicant_cv_display'
  • module_hr_recruitment_extract Boolean
    string='Send CV to OCR to fill applications'
  • module_hr_recruitment_survey Boolean
    string='Interview Forms'
  • module_website_hr_recruitment Boolean
    string='Online Posting'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/hr_recruitment
VERSION
VERSION 1.1
CATEGORY
CATEGORYHuman Resources/Recruitment
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Thibault Francois, GitHub, Barad Mahendra, Yannick Tivisse, Xavier-Do, Andrea Grazioso (agr-odoo), Julien Mougenot, Adrien Widart, Ivan Yelizariev, Nasreddin Boulif (bon), Tiffany Chang (tic), Nathan Marotte (nama), IEL, Mathieu Duckerts-Antoine, William Braeckman, Kevin Baptiste, jdoutreloux, sofiagvaladze, yhu-odoo, Didier (did), Adrien Minet, Nicolas Bayet, Jinjiu Liu, dht-odoo, João Marques, Thomas Lefebvre (thle), Louis Wicket (wil), Munaf Khan, Pierre Collinet (pic), Nguyễn Đại Dương, Leonardo Pavan Rocha, Baffour Kusi Frimpong
WEBSITE
WEBSITEhttps://www.odoo.com/app/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:28
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
    - fetchmail
    - utm
    - attachment_indexation
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (37)
XML IDNameModelTypeStatus
applicant_get_refuse_reason_view_form applicant.get.refuse.reason.form applicant.get.refuse.reason form New
applicant_hired_template applicant_hired_template ir.ui.view qweb New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_pivot_view_job Jobs - Recruitment hr.applicant pivot New
crm_case_tree_view_job Applicants hr.applicant tree New
digest_digest_view_form digest.digest.view.form.inherit.hr.recruitment digest.digest xpath Inherits digest.digest_digest_view_form
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_applicant_category_view_form hr.applicant.category.form hr.applicant.category form New
hr_applicant_category_view_tree hr.applicant.category.tree hr.applicant.category tree New
hr_applicant_refuse_reason_view_form Applicant refuse reason form hr.applicant.refuse.reason form New
hr_applicant_refuse_reason_view_tree Applicant refuse reason tree hr.applicant.refuse.reason tree New
hr_applicant_view_activity hr.applicant.activity hr.applicant activity New
hr_applicant_view_form Jobs - Recruitment Form hr.applicant form New
hr_applicant_view_graph hr.applicant.graph hr.applicant graph New
hr_applicant_view_pivot hr.applicant.pivot hr.applicant pivot New
hr_applicant_view_search hr.applicant.search hr.applicant search New
hr_applicant_view_search_bis hr.applicant.view.search hr.applicant search New
hr_applicant_view_tree_activity hr.applicant.view.tree.activity hr.applicant tree New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_job_search_view hr.job.search hr.job xpath Inherits hr.view_job_filter
hr_job_simple_form hr.job.simple.form hr.job form New
hr_job_survey hr.job.form1 hr.job xpath Inherits hr.view_hr_job_form
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_kanban hr.recruitment.source.kanban hr.recruitment.source kanban New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_source_view_search hr.recruitment.source.view.search hr.recruitment.source search New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
ir_attachment_view_search_inherit_hr_recruitment ir.attachment.search.inherit.recruitment ir.attachment xpath Inherits base.view_attachment_search
quick_create_applicant_form hr.applicant.form.quick_create hr.applicant form New
res_config_settings_view_form res.config.settings.view.form.inherit.hr.recruitment res.config.settings xpath Inherits base.res_config_settings_view_form
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_stage_kanban hr.recruitment.stage.kanban hr.recruitment.stage kanban New
view_job_filter_recruitment Job hr.job xpath Inherits hr.view_job_filter
Models touched (13)

New fields (5)
  • applicant_ids Many2many → hr.applicant
    args: 'hr.applicant'
  • applicant_without_email Text
    compute='_compute_applicant_without_email' string='Applicant(s) not having email'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    args: 'hr.applicant.refuse.reason', 'Refuse Reason'
  • send_mail Boolean
    compute='_compute_send_mail' readonly=False store=True args: 'Send Email'
  • template_id Many2one → mail.template
    compute='_compute_send_mail' domain="[('model', '=', 'hr.applicant')]" readonly=False store=True string='Email Template' args: 'mail.template'
Public methods (1)
  • action_refuse_reason_apply(self)

New fields (1)
  • applicant_id Many2one → hr.applicant
    index=True ondelete='set null' string='Applicant' args: 'hr.applicant'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • kpi_hr_recruitment_new_colleagues Boolean
    args: 'Employees'
  • kpi_hr_recruitment_new_colleagues_value Integer
    compute='_compute_kpi_hr_recruitment_new_colleagues_value'
Public methods (0)

No public methods.

New fields (45)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the case without removing it.' args: 'Active'
  • application_count Integer
    compute='_compute_application_count' help='Applications with the same email'
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.applicant')] string='Attachments' args: 'ir.attachment', 'res_id'
  • attachment_number Integer
    compute='_get_attachment_number' string='Number of Attachments'
  • availability Date
    help='The date at which the applicant will be available to start working' tracking=True args: 'Availability'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    compute='_compute_company' readonly=False store=True tracking=True args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date_closed Datetime
    compute='_compute_date_closed' copy=False index=True readonly=False store=True tracking=True args: 'Hire Date'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True args: 'Last Stage Update'
  • date_open Datetime
    index=True readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day' compute_sudo=True string='Days to Close'
  • day_open Float
    compute='_compute_day' compute_sudo=True string='Days to Open'
  • delay_close Float
    compute='_compute_day' group_operator='avg' help='Number of days to close' readonly=True store=True string='Delay to Close'
  • department_id Many2one → hr.department
    compute='_compute_department' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=False store=True tracking=True args: 'hr.department', 'Department'
  • description Html
    args: 'Description'
  • email_from Char
    compute='_compute_partner_phone_email' help='Applicant email' inverse='_inverse_partner_email' size=128 store=True args: 'Email'
  • emp_id Many2one → hr.employee
    copy=False help='Employee linked to the applicant.' string='Employee' args: 'hr.employee'
  • employee_name Char
    readonly=False related='emp_id.name' string='Employee Name' tracking=False
  • job_id Many2one → hr.job
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True tracking=True args: 'hr.job', 'Applied Job'
  • kanban_state Selection
    copy=False default='normal' required=True string='Kanban State' args: [('normal', 'Grey'), ('done', 'Green'), ('blocked', 'Red')]
  • last_stage_id Many2one → hr.recruitment.stage
    help='Stage of the applicant before being in the current stage. Used for lost cases analysis.' args: 'hr.recruitment.stage', 'Last Stage'
  • legend_blocked Char
    related='stage_id.legend_blocked' string='Kanban Blocked'
  • legend_done Char
    related='stage_id.legend_done' string='Kanban Valid'
  • legend_normal Char
    related='stage_id.legend_normal' string='Kanban Ongoing'
  • meeting_display_date Date
    compute='_compute_meeting_display'
  • meeting_display_text Char
    compute='_compute_meeting_display'
  • meeting_ids One2many → calendar.event
    args: 'calendar.event', 'applicant_id', 'Meetings'
  • name Char
    help='Email subject for applications sent via email' required=True args: 'Subject / Application Name'
  • partner_id Many2one → res.partner
    copy=False args: 'res.partner', 'Contact'
  • partner_mobile Char
    compute='_compute_partner_phone_email' inverse='_inverse_partner_mobile' size=32 store=True args: 'Mobile'
  • partner_name Char
    args: "Applicant's Name"
  • partner_phone Char
    compute='_compute_partner_phone_email' inverse='_inverse_partner_phone' size=32 store=True args: 'Phone'
  • priority Selection
    default='0' args: AVAILABLE_PRIORITIES, 'Appreciation'
  • probability Float
    args: 'Probability'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    string='Refuse Reason' tracking=True args: 'hr.applicant.refuse.reason'
  • salary_expected Float
    group_operator='avg' help='Salary Expected by Applicant' tracking=True args: 'Expected Salary'
  • salary_expected_extra Char
    help='Salary Expected by Applicant, extra advantages' tracking=True args: 'Expected Salary Extra'
  • salary_proposed Float
    group_operator='avg' help='Salary Proposed by the Organisation' tracking=True args: 'Proposed Salary'
  • salary_proposed_extra Char
    help='Salary Proposed by the Organisation, extra advantages' tracking=True args: 'Proposed Salary Extra'
  • stage_id Many2one → hr.recruitment.stage
    compute='_compute_stage' copy=False domain="['|', ('job_ids', '=', False), ('job_ids', '=', job_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True tracking=True args: 'hr.recruitment.stage', 'Stage'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_email Char
    readonly=True related='user_id.email' string='User Email'
  • user_id Many2one → res.users
    compute='_compute_user' readonly=False store=True tracking=True args: 'res.users', 'Recruiter'
Public methods (11)
  • action_applications_email(self)
  • action_get_attachment_tree_view(self)
  • action_makeMeeting(self)
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • archive_applicant(self)
  • create(self, vals)
    @api.model
  • create_employee_from_applicant(self)
    Create an hr.employee from the hr.applicants
  • get_empty_list_help(self, help)
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • reset_applicant(self)
    Reinsert the applicant into the recruitment pipe in the first stage
  • toggle_active(self)
  • write(self, vals)

New fields (2)
  • color Integer
    default=_get_default_color string='Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (3)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Description'
  • template_id Many2one → mail.template
    domain="[('model', '=', 'hr.applicant')]" string='Email Template' args: 'mail.template'
Public methods (0)

No public methods.

New fields (3)
  • expected_employee Integer
    compute='_compute_recruitment_stats' string='Expected Employee'
  • new_applicant_count Integer
    compute='_compute_new_applicant_count' string='New Applicant'
  • new_hired_employee Integer
    compute='_compute_recruitment_stats' string='New Hired Employee'
Public methods (0)

No public methods.

New fields (2)
  • applicant_id One2many → hr.applicant
    args: 'hr.applicant', 'emp_id', 'Applicant'
  • newly_hired_employee Boolean
    compute='_compute_newly_hired_employee' search='_search_newly_hired_employee' args: 'Newly hired employee'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (16)
  • address_id Many2one → res.partner
    default=_default_address_id domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Address where employees are working' args: 'res.partner', 'Job Location'
  • alias_id Many2one → mail.alias
    help='Email alias for this job position. New emails will automatically create new applicants for this job position.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • all_application_count Integer
    compute='_compute_all_application_count' string='All Application Count'
  • application_count Integer
    compute='_compute_application_count' string='Application Count'
  • application_ids One2many → hr.applicant
    args: 'hr.applicant', 'job_id', 'Job Applications'
  • color Integer
    args: 'Color Index'
  • document_ids One2many → ir.attachment
    compute='_compute_document_ids' string='Documents' args: 'ir.attachment'
  • documents_count Integer
    compute='_compute_document_ids' string='Document Count'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids args: 'res.users', 'job_favorite_user_rel', 'job_id', 'user_id'
  • hr_responsible_id Many2one → res.users
    help="Person responsible of validating the employee's contracts." tracking=True args: 'res.users', 'HR Responsible'
  • is_favorite Boolean
    compute='_compute_is_favorite' inverse='_inverse_is_favorite'
  • manager_id Many2one → hr.employee
    readonly=True related='department_id.manager_id' store=True string='Department Manager' args: 'hr.employee'
  • new_application_count Integer
    compute='_compute_new_application_count' help='Number of applications that are new in the flow (typically at first step of the flow)' string='New Application'
  • no_of_hired_employee Integer
    compute='_compute_no_of_hired_employee' store=True
  • old_application_count Integer
    compute='_compute_old_application_count' string='Old Application'
  • user_id Many2one → res.users
    tracking=True args: 'res.users', 'Recruiter'
Public methods (5)
  • action_get_attachment_tree_view(self)
  • close_dialog(self)
  • create(self, vals)
    @api.model
  • edit_dialog(self)
  • write(self, vals)

New fields (2)
  • name Char
    required=True translate=True args: 'Degree Name'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of degrees.' args: 'Sequence'
Public methods (0)

No public methods.

New fields (4)
  • alias_id Many2one → mail.alias
    args: 'mail.alias', 'Alias ID'
  • email Char
    readonly=True related='alias_id.display_name' string='Email'
  • job_id Many2one → hr.job
    ondelete='cascade' args: 'hr.job', 'Job'
  • source_id Many2one → utm.source
    ondelete='cascade' required=True args: 'utm.source', 'Source'
Public methods (1)
  • create_alias(self)

New fields (11)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Kanban'
  • hired_stage Boolean
    help='If checked, this stage is used to determine the hire date of an applicant' args: 'Hired Stage'
  • is_warning_visible Boolean
    compute='_compute_is_warning_visible'
  • job_ids Many2many → hr.job
    help='Specific jobs that uses this stage. Other jobs will not use this stage.' string='Job Specific' args: 'hr.job'
  • legend_blocked Char
    default=<expr> required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> required=True translate=True args: 'Grey Kanban Label'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    args: 'Requirements'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of stages.' args: 'Sequence'
  • template_id Many2one → mail.template
    help='If set, a message is posted on the applicant using the template when the applicant is set to the stage.' args: 'mail.template', 'Email Template'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • module_hr_recruitment_survey Boolean
    string='Interview Forms'
  • module_website_hr_recruitment Boolean
    string='Online Posting'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/hr_recruitment
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources/Recruitment
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, Aaron Bohy, GitHub, Barad Mahendra, Yannick Tivisse, Adrien Dieudonne, Julien Castiaux, Xavier-Do, Victor Feyens, Andrea Grazioso (agr-odoo), Sébastien Theys, fw-bot, Adrien Widart, Nathan Marotte (nama), IEL, Mathieu Duckerts-Antoine, jbm-odoo, William Braeckman, Kevin Baptiste, Arnaud Baes, yhu-odoo, Didier (did), Jinjiu Liu, João Marques, Francois (fge), Louis Wicket (wil)
WEBSITE
WEBSITEhttps://www.odoo.com/page/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
    - fetchmail
    - utm
    - attachment_indexation
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (38)
XML IDNameModelTypeStatus
applicant_get_refuse_reason_view_form applicant.get.refuse.reason.form applicant.get.refuse.reason form New
applicant_hired_template applicant_hired_template ir.ui.view qweb New
assets_backend hr_recruitment assets ir.ui.view qweb Inherits web.assets_backend
assets_tests HR Recruitment Assets Tests ir.ui.view qweb Inherits web.assets_tests
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_pivot_view_job Jobs - Recruitment hr.applicant pivot New
crm_case_tree_view_job Applicants hr.applicant tree New
digest_digest_view_form digest.digest.view.form.inherit.hr.recruitment digest.digest xpath Inherits digest.digest_digest_view_form
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_applicant_category_view_form hr.applicant.category.form hr.applicant.category form New
hr_applicant_category_view_tree hr.applicant.category.tree hr.applicant.category tree New
hr_applicant_refuse_reason_view_form Applicant refuse reason form hr.applicant.refuse.reason form New
hr_applicant_refuse_reason_view_tree Applicant refuse reason tree hr.applicant.refuse.reason tree New
hr_applicant_view_activity hr.applicant.activity hr.applicant activity New
hr_applicant_view_form Jobs - Recruitment Form hr.applicant form New
hr_applicant_view_graph hr.applicant.graph hr.applicant graph New
hr_applicant_view_pivot hr.applicant.pivot hr.applicant pivot New
hr_applicant_view_search hr.applicant.search hr.applicant search New
hr_applicant_view_search_bis hr.applicant.view.search hr.applicant search New
hr_applicant_view_tree_activity hr.applicant.view.tree.activity hr.applicant tree New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_job_search_view hr.job.search hr.job xpath Inherits hr.view_job_filter
hr_job_simple_form hr.job.simple.form hr.job form New
hr_job_survey hr.job.form1 hr.job xpath Inherits hr.view_hr_job_form
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_source_view_search hr.recruitment.source.view.search hr.recruitment.source search New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
ir_attachment_view_search_inherit_hr_recruitment ir.attachment.search.inherit.recruitment ir.attachment xpath Inherits base.view_attachment_search
quick_create_applicant_form hr.applicant.form.quick_create hr.applicant form New
res_config_settings_view_form res.config.settings.view.form.inherit.hr.recruitment res.config.settings xpath Inherits base.res_config_settings_view_form
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_stage_kanban hr.recruitment.stage.kanban hr.recruitment.stage kanban New
view_job_filter_recruitment Job hr.job xpath Inherits hr.view_job_filter
Models touched (13)

New fields (2)
  • applicant_ids Many2many → hr.applicant
    args: 'hr.applicant'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    args: 'hr.applicant.refuse.reason', 'Refuse Reason'
Public methods (1)
  • action_refuse_reason_apply(self)

New fields (1)
  • applicant_id Many2one → hr.applicant
    index=True ondelete='set null' string='Applicant' args: 'hr.applicant'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • kpi_hr_recruitment_new_colleagues Boolean
    args: 'Employees'
  • kpi_hr_recruitment_new_colleagues_value Integer
    compute='_compute_kpi_hr_recruitment_new_colleagues_value'
Public methods (0)

No public methods.

New fields (43)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the case without removing it.' args: 'Active'
  • application_count Integer
    compute='_compute_application_count' help='Applications with the same email'
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.applicant')] string='Attachments' args: 'ir.attachment', 'res_id'
  • attachment_number Integer
    compute='_get_attachment_number' string='Number of Attachments'
  • availability Date
    help='The date at which the applicant will be available to start working' tracking=True args: 'Availability'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    compute='_compute_company' readonly=False store=True tracking=True args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date_closed Datetime
    compute='_compute_date_closed' index=True store=True args: 'Closed'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True args: 'Last Stage Update'
  • date_open Datetime
    index=True readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day' compute_sudo=True string='Days to Close'
  • day_open Float
    compute='_compute_day' compute_sudo=True string='Days to Open'
  • delay_close Float
    compute='_compute_day' group_operator='avg' help='Number of days to close' readonly=True store=True string='Delay to Close'
  • department_id Many2one → hr.department
    compute='_compute_department' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=False store=True tracking=True args: 'hr.department', 'Department'
  • description Text
    args: 'Description'
  • email_from Char
    compute='_compute_partner_phone_email' help='Applicant email' inverse='_inverse_partner_email' size=128 store=True args: 'Email'
  • emp_id Many2one → hr.employee
    copy=False help='Employee linked to the applicant.' string='Employee' args: 'hr.employee'
  • employee_name Char
    readonly=False related='emp_id.name' string='Employee Name' tracking=False
  • job_id Many2one → hr.job
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True tracking=True args: 'hr.job', 'Applied Job'
  • kanban_state Selection
    copy=False default='normal' required=True string='Kanban State' args: [('normal', 'Grey'), ('done', 'Green'), ('blocked', 'Red')]
  • last_stage_id Many2one → hr.recruitment.stage
    help='Stage of the applicant before being in the current stage. Used for lost cases analysis.' args: 'hr.recruitment.stage', 'Last Stage'
  • legend_blocked Char
    related='stage_id.legend_blocked' string='Kanban Blocked'
  • legend_done Char
    related='stage_id.legend_done' string='Kanban Valid'
  • legend_normal Char
    related='stage_id.legend_normal' string='Kanban Ongoing'
  • meeting_count Integer
    compute='_compute_meeting_count' help='Meeting Count'
  • name Char
    help='Email subject for applications sent via email' required=True args: 'Subject / Application Name'
  • partner_id Many2one → res.partner
    copy=False args: 'res.partner', 'Contact'
  • partner_mobile Char
    compute='_compute_partner_phone_email' inverse='_inverse_partner_mobile' size=32 store=True args: 'Mobile'
  • partner_name Char
    args: "Applicant's Name"
  • partner_phone Char
    compute='_compute_partner_phone_email' inverse='_inverse_partner_phone' size=32 store=True args: 'Phone'
  • priority Selection
    default='0' args: AVAILABLE_PRIORITIES, 'Appreciation'
  • probability Float
    args: 'Probability'
  • refuse_reason_id Many2one → hr.applicant.refuse.reason
    string='Refuse Reason' tracking=True args: 'hr.applicant.refuse.reason'
  • salary_expected Float
    group_operator='avg' help='Salary Expected by Applicant' tracking=True args: 'Expected Salary'
  • salary_expected_extra Char
    help='Salary Expected by Applicant, extra advantages' tracking=True args: 'Expected Salary Extra'
  • salary_proposed Float
    group_operator='avg' help='Salary Proposed by the Organisation' tracking=True args: 'Proposed Salary'
  • salary_proposed_extra Char
    help='Salary Proposed by the Organisation, extra advantages' tracking=True args: 'Proposed Salary Extra'
  • stage_id Many2one → hr.recruitment.stage
    compute='_compute_stage' copy=False domain="['|', ('job_ids', '=', False), ('job_ids', '=', job_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True tracking=True args: 'hr.recruitment.stage', 'Stage'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_email Char
    readonly=True related='user_id.email' string='User Email'
  • user_id Many2one → res.users
    compute='_compute_user' readonly=False store=True tracking=True args: 'res.users', 'Recruiter'
Public methods (11)
  • action_applications_email(self)
  • action_get_attachment_tree_view(self)
  • action_makeMeeting(self)
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • archive_applicant(self)
  • create(self, vals)
    @api.model
  • create_employee_from_applicant(self)
    Create an hr.employee from the hr.applicants
  • get_empty_list_help(self, help)
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • reset_applicant(self)
    Reinsert the applicant into the recruitment pipe in the first stage
  • toggle_active(self)
  • write(self, vals)

New fields (2)
  • color Integer
    default=_get_default_color string='Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (2)
  • active Boolean
    default=True args: 'Active'
  • name Char
    required=True translate=True args: 'Description'
Public methods (0)

No public methods.

New fields (3)
  • expected_employee Integer
    compute='_compute_recruitment_stats' string='Expected Employee'
  • new_applicant_count Integer
    compute='_compute_new_applicant_count' string='New Applicant'
  • new_hired_employee Integer
    compute='_compute_recruitment_stats' string='New Hired Employee'
Public methods (0)

No public methods.

New fields (2)
  • applicant_id One2many → hr.applicant
    args: 'hr.applicant', 'emp_id', 'Applicant'
  • newly_hired_employee Boolean
    compute='_compute_newly_hired_employee' search='_search_newly_hired_employee' args: 'Newly hired employee'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (14)
  • address_id Many2one → res.partner
    default=_default_address_id domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Address where employees are working' args: 'res.partner', 'Job Location'
  • alias_id Many2one → mail.alias
    help='Email alias for this job position. New emails will automatically create new applicants for this job position.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • all_application_count Integer
    compute='_compute_all_application_count' string='All Application Count'
  • application_count Integer
    compute='_compute_application_count' string='Application Count'
  • application_ids One2many → hr.applicant
    args: 'hr.applicant', 'job_id', 'Applications'
  • color Integer
    args: 'Color Index'
  • document_ids One2many → ir.attachment
    compute='_compute_document_ids' string='Documents' args: 'ir.attachment'
  • documents_count Integer
    compute='_compute_document_ids' string='Document Count'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids args: 'res.users', 'job_favorite_user_rel', 'job_id', 'user_id'
  • hr_responsible_id Many2one → res.users
    help="Person responsible of validating the employee's contracts." tracking=True args: 'res.users', 'HR Responsible'
  • is_favorite Boolean
    compute='_compute_is_favorite' inverse='_inverse_is_favorite'
  • manager_id Many2one → hr.employee
    readonly=True related='department_id.manager_id' store=True string='Department Manager' args: 'hr.employee'
  • new_application_count Integer
    compute='_compute_new_application_count' help='Number of applications that are new in the flow (typically at first step of the flow)' string='New Application'
  • user_id Many2one → res.users
    tracking=True args: 'res.users', 'Recruiter'
Public methods (4)
  • action_get_attachment_tree_view(self)
  • close_dialog(self)
  • create(self, vals)
    @api.model
  • edit_dialog(self)

New fields (2)
  • name Char
    required=True translate=True args: 'Degree Name'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of degrees.' args: 'Sequence'
Public methods (0)

No public methods.

New fields (4)
  • alias_id Many2one → mail.alias
    args: 'mail.alias', 'Alias ID'
  • email Char
    readonly=True related='alias_id.display_name' string='Email'
  • job_id Many2one → hr.job
    ondelete='cascade' args: 'hr.job', 'Job'
  • source_id Many2one → utm.source
    ondelete='cascade' required=True args: 'utm.source', 'Source'
Public methods (1)
  • create_alias(self)

New fields (9)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Kanban'
  • job_ids Many2many → hr.job
    help='Specific jobs that uses this stage. Other jobs will not use this stage.' string='Job Specific' args: 'hr.job'
  • legend_blocked Char
    default=<expr> required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> required=True translate=True args: 'Grey Kanban Label'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    args: 'Requirements'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of stages.' args: 'Sequence'
  • template_id Many2one → mail.template
    help='If set, a message is posted on the applicant using the template when the applicant is set to the stage.' args: 'mail.template', 'Email Template'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • module_hr_recruitment_survey Boolean
    string='Interview Forms'
  • module_website_hr_recruitment Boolean
    string='Online Posting'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/hr_recruitment
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources/Recruitment
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Thibault Francois, Jeremy Kersten, GitHub, Yannick Tivisse, Martin Geubelle, Odoo Online, Nicolas Seinlet, Jigar Patel, Adrien Dieudonne, RomainLibert, Jorge Pinna Puissant, Alexandre Kühn, Adrian Torres, Xavier-Do, Andrea Grazioso (agr-odoo), Sébastien Theys, IEL, Thanh Dodeur, ThanhDodeurOdoo, Pierre Paridans, jbm-odoo, William Braeckman, Kevin Baptiste, qmo-odoo, Jinjiu Liu, Federico (fega)
WEBSITE
WEBSITEhttps://www.odoo.com/page/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - mail_bot
    - calendar
    - fetchmail
    - utm
    - attachment_indexation
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (34)
XML IDNameModelTypeStatus
applicant_hired_template applicant_hired_template ir.ui.view qweb New
assets_backend hr_recruitment assets ir.ui.view qweb Inherits web.assets_backend
assets_tests HR Recruitment Assets Tests ir.ui.view qweb Inherits web.assets_tests
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_pivot_view_job Jobs - Recruitment hr.applicant pivot New
crm_case_tree_view_job Applicants hr.applicant tree New
digest_digest_view_form digest.digest.view.form.inherit.hr.recruitment digest.digest xpath Inherits digest.digest_digest_view_form
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_applicant_category_view_form hr.applicant.category.form hr.applicant.category form New
hr_applicant_category_view_tree hr.applicant.category.tree hr.applicant.category tree New
hr_applicant_view_activity hr.applicant.activity hr.applicant activity New
hr_applicant_view_form Jobs - Recruitment Form hr.applicant form New
hr_applicant_view_graph hr.applicant.graph hr.applicant graph New
hr_applicant_view_pivot hr.applicant.pivot hr.applicant pivot New
hr_applicant_view_search hr.applicant.search hr.applicant search New
hr_applicant_view_search_bis hr.applicant.view.search hr.applicant search New
hr_applicant_view_tree_activity hr.applicant.view.tree.activity hr.applicant tree New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_job_search_view hr.job.search hr.job xpath Inherits hr.view_job_filter
hr_job_simple_form hr.job.simple.form hr.job form New
hr_job_survey hr.job.form1 hr.job xpath Inherits hr.view_hr_job_form
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
ir_attachment_view_search_inherit_hr_recruitment ir.attachment.search.inherit.recruitment ir.attachment xpath Inherits base.view_attachment_search
quick_create_applicant_form hr.applicant.form.quick_create hr.applicant form New
res_config_settings_view_form res.config.settings.view.form.inherit.hr.recruitment res.config.settings xpath Inherits base.res_config_settings_view_form
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_stage_kanban hr.recruitment.stage.kanban hr.recruitment.stage kanban New
view_job_filter_recruitment Job hr.job xpath Inherits hr.view_job_filter
Models touched (11)

New fields (1)
  • applicant_id Many2one → hr.applicant
    string='Applicant' args: 'hr.applicant'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • kpi_hr_recruitment_new_colleagues Boolean
    args: 'Employees'
  • kpi_hr_recruitment_new_colleagues_value Integer
    compute='_compute_kpi_hr_recruitment_new_colleagues_value'
Public methods (1)
  • compute_kpis_actions(self, company, user)

New fields (42)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the case without removing it.' args: 'Active'
  • application_count Integer
    compute='_compute_application_count' help='Applications with the same email'
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.applicant')] string='Attachments' args: 'ir.attachment', 'res_id'
  • attachment_number Integer
    compute='_get_attachment_number' string='Number of Attachments'
  • availability Date
    help='The date at which the applicant will be available to start working' args: 'Availability'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=_default_company_id args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date_closed Datetime
    index=True readonly=True args: 'Closed'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True args: 'Last Stage Update'
  • date_open Datetime
    index=True readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day' compute_sudo=True string='Days to Close'
  • day_open Float
    compute='_compute_day' compute_sudo=True string='Days to Open'
  • delay_close Float
    compute='_compute_day' group_operator='avg' help='Number of days to close' readonly=True store=True string='Delay to Close'
  • department_id Many2one → hr.department
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'hr.department', 'Department'
  • description Text
    args: 'Description'
  • email_from Char
    help='Applicant email' size=128 args: 'Email'
  • emp_id Many2one → hr.employee
    copy=False help='Employee linked to the applicant.' string='Employee' args: 'hr.employee'
  • employee_name Char
    readonly=False related='emp_id.name' string='Employee Name' tracking=False
  • job_id Many2one → hr.job
    domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" index=True args: 'hr.job', 'Applied Job'
  • kanban_state Selection
    copy=False default='normal' required=True string='Kanban State' args: [('normal', 'Grey'), ('done', 'Green'), ('blocked', 'Red')]
  • last_stage_id Many2one → hr.recruitment.stage
    help='Stage of the applicant before being in the current stage. Used for lost cases analysis.' args: 'hr.recruitment.stage', 'Last Stage'
  • legend_blocked Char
    readonly=False related='stage_id.legend_blocked' string='Kanban Blocked'
  • legend_done Char
    readonly=False related='stage_id.legend_done' string='Kanban Valid'
  • legend_normal Char
    readonly=False related='stage_id.legend_normal' string='Kanban Ongoing'
  • meeting_count Integer
    compute='_compute_meeting_count' help='Meeting Count'
  • name Char
    required=True args: 'Subject / Application Name'
  • partner_id Many2one → res.partner
    copy=False args: 'res.partner', 'Contact'
  • partner_mobile Char
    size=32 args: 'Mobile'
  • partner_name Char
    args: "Applicant's Name"
  • partner_phone Char
    size=32 args: 'Phone'
  • priority Selection
    default='0' args: AVAILABLE_PRIORITIES, 'Appreciation'
  • probability Float
    args: 'Probability'
  • salary_expected Float
    group_operator='avg' help='Salary Expected by Applicant' args: 'Expected Salary'
  • salary_expected_extra Char
    help='Salary Expected by Applicant, extra advantages' args: 'Expected Salary Extra'
  • salary_proposed Float
    group_operator='avg' help='Salary Proposed by the Organisation' args: 'Proposed Salary'
  • salary_proposed_extra Char
    help='Salary Proposed by the Organisation, extra advantages' args: 'Proposed Salary Extra'
  • stage_id Many2one → hr.recruitment.stage
    copy=False default=_default_stage_id domain="['|', ('job_ids', '=', False), ('job_ids', '=', job_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' tracking=True args: 'hr.recruitment.stage', 'Stage'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_email Char
    readonly=True related='user_id.email' string='User Email' type='char'
  • user_id Many2one → res.users
    default=<expr> tracking=True args: 'res.users', 'Responsible'
Public methods (16)
  • action_applications_email(self)
  • action_get_attachment_tree_view(self)
  • action_makeMeeting(self)
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • archive_applicant(self)
  • create(self, vals)
    @api.model
  • create_employee_from_applicant(self)
    Create an hr.employee from the hr.applicants
  • get_empty_list_help(self, help)
    @api.model
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • onchange_email_from(self)
    @api.onchange('email_from')
  • onchange_job_id(self)
    @api.onchange('job_id')
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_partner_mobile(self)
    @api.onchange('partner_mobile')
  • onchange_partner_phone(self)
    @api.onchange('partner_phone')
  • onchange_stage_id(self)
    @api.onchange('stage_id')
  • reset_applicant(self)
    Reinsert the applicant into the recruitment pipe in the first stage
  • write(self, vals)

New fields (2)
  • color Integer
    default=10 string='Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (3)
  • expected_employee Integer
    compute='_compute_recruitment_stats' string='Expected Employee'
  • new_applicant_count Integer
    compute='_compute_new_applicant_count' string='New Applicant'
  • new_hired_employee Integer
    compute='_compute_recruitment_stats' string='New Hired Employee'
Public methods (0)

No public methods.

New fields (1)
  • newly_hired_employee Boolean
    compute='_compute_newly_hired_employee' search='_search_newly_hired_employee' args: 'Newly hired employee'
Public methods (0)

No public methods.

New fields (13)
  • address_id Many2one → res.partner
    default=_default_address_id domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Address where employees are working' args: 'res.partner', 'Job Location'
  • alias_id Many2one → mail.alias
    help='Email alias for this job position. New emails will automatically create new applicants for this job position.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • application_count Integer
    compute='_compute_application_count' string='Application Count'
  • application_ids One2many → hr.applicant
    args: 'hr.applicant', 'job_id', 'Applications'
  • color Integer
    args: 'Color Index'
  • document_ids One2many → ir.attachment
    compute='_compute_document_ids' string='Documents' args: 'ir.attachment'
  • documents_count Integer
    compute='_compute_document_ids' string='Document Count'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids args: 'res.users', 'job_favorite_user_rel', 'job_id', 'user_id'
  • hr_responsible_id Many2one → res.users
    help="Person responsible of validating the employee's contracts." tracking=True args: 'res.users', 'HR Responsible'
  • is_favorite Boolean
    compute='_compute_is_favorite' inverse='_inverse_is_favorite'
  • manager_id Many2one → hr.employee
    readonly=True related='department_id.manager_id' store=True string='Department Manager' args: 'hr.employee'
  • new_application_count Integer
    compute='_compute_new_application_count' help='Number of applications that are new in the flow (typically at first step of the flow)' string='New Application'
  • user_id Many2one → res.users
    tracking=True args: 'res.users', 'Responsible'
Public methods (7)
  • action_get_attachment_tree_view(self)
  • close_dialog(self)
  • create(self, vals)
    @api.model
  • edit_dialog(self)
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • search_panel_select_range(self, field_name)
    @api.model

New fields (2)
  • name Char
    required=True translate=True args: 'Degree Name'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of degrees.' args: 'Sequence'
Public methods (0)

No public methods.

New fields (4)
  • alias_id Many2one → mail.alias
    args: 'mail.alias', 'Alias ID'
  • email Char
    readonly=True related='alias_id.display_name' string='Email'
  • job_id Many2one → hr.job
    args: 'hr.job', 'Job ID'
  • source_id Many2one → utm.source
    ondelete='cascade' required=True args: 'utm.source', 'Source'
Public methods (1)
  • create_alias(self)

New fields (9)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Kanban'
  • job_ids Many2many → hr.job
    help='Specific jobs that uses this stage. Other jobs will not use this stage.' string='Job Specific' args: 'hr.job'
  • legend_blocked Char
    default=<expr> required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> required=True translate=True args: 'Grey Kanban Label'
  • name Char
    required=True translate=True args: 'Stage Name'
  • requirements Text
    args: 'Requirements'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of stages.' args: 'Sequence'
  • template_id Many2one → mail.template
    help='If set, a message is posted on the applicant using the template when the applicant is set to the stage.' args: 'mail.template', 'Email Template'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • module_hr_recruitment_survey Boolean
    string='Interview Forms'
  • module_website_hr_recruitment Boolean
    string='Online Posting'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/hr_recruitment
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Nicolas Lempereur, Géry Debongnie, Aaron Bohy, GitHub, Lucas Perais (lpe), Yannick Tivisse, Alexandre Kühn, qsm-odoo, Martin Geubelle, Adrien Dieudonne, RomainLibert, Christophe Monniez, Alexandre Kühn, fda-odoo, Adrian Torres, XavierDo, Xavier-Do, Kinjal Mehta, William Braeckman
WEBSITE
WEBSITEhttps://www.odoo.com/page/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
    - fetchmail
    - utm
    - document
    - digest
    - portal
    - http_routing
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (29)
XML IDNameModelTypeStatus
assets_backend hr_recruitment assets ir.ui.view qweb Inherits web.assets_backend
crm_case_form_view_job Jobs - Recruitment Form hr.applicant form New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_pivot_view_job Jobs - Recruitment hr.applicant pivot New
crm_case_tree_view_job Applicants hr.applicant tree New
digest_digest_view_form digest.digest.view.form.inherit.hr.recruitment digest.digest xpath Inherits digest.digest_digest_view_form
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_applicant_category_view_form hr.applicant.category.form hr.applicant.category form New
hr_applicant_view_graph hr.applicant.graph hr.applicant graph New
hr_applicant_view_pivot hr.applicant.pivot hr.applicant pivot New
hr_applicant_view_search hr.applicant.search hr.applicant search New
hr_applicant_view_tree_activity hr.applicant.view.tree.activity hr.applicant tree New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_job_simple_form hr.job.simple.form hr.job form New
hr_job_survey hr.job.form1 hr.job xpath Inherits hr.view_hr_job_form
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
ir_attachment_view_search_inherit_hr_recruitment ir.attachment.search.inherit.recruitment ir.attachment xpath Inherits base.view_attachment_search
quick_create_applicant_form hr.applicant.form.quick_create hr.applicant form New
res_config_settings_view_form res.config.settings.view.form.inherit.hr.recruitment res.config.settings xpath Inherits base.res_config_settings_view_form
view_crm_case_jobs_filter hr.applicant.view.search hr.applicant search New
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_stage_kanban hr.recruitment.stage.kanban hr.recruitment.stage kanban New
view_job_filter_recruitment Job hr.job field Inherits hr.view_job_filter
Models touched (11)

New fields (1)
  • applicant_id Many2one → hr.applicant
    string='Applicant' args: 'hr.applicant'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • kpi_hr_recruitment_new_colleagues Boolean
    args: 'Employees'
  • kpi_hr_recruitment_new_colleagues_value Integer
    compute='_compute_kpi_hr_recruitment_new_colleagues_value'
Public methods (1)
  • compute_kpis_actions(self, company, user)

New fields (42)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the case without removing it.' args: 'Active'
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.applicant')] string='Attachments' args: 'ir.attachment', 'res_id'
  • attachment_number Integer
    compute='_get_attachment_number' string='Number of Attachments'
  • availability Date
    help='The date at which the applicant will be available to start working' args: 'Availability'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=_default_company_id args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date_closed Datetime
    index=True readonly=True args: 'Closed'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True args: 'Last Stage Update'
  • date_open Datetime
    index=True readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day' string='Days to Close'
  • day_open Float
    compute='_compute_day' string='Days to Open'
  • delay_close Float
    compute='_compute_day' group_operator='avg' help='Number of days to close' readonly=True store=True string='Delay to Close'
  • department_id Many2one → hr.department
    args: 'hr.department', 'Department'
  • description Text
    args: 'Description'
  • email_cc Text
    help='These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma' size=252 args: 'Watchers Emails'
  • email_from Char
    help='These people will receive email.' size=128 args: 'Email'
  • emp_id Many2one → hr.employee
    help='Employee linked to the applicant.' string='Employee' track_visibility='onchange' args: 'hr.employee'
  • employee_name Char
    readonly=False related='emp_id.name' string='Employee Name'
  • job_id Many2one → hr.job
    args: 'hr.job', 'Applied Job'
  • kanban_state Selection
    copy=False default='normal' required=True string='Kanban State' args: [('normal', 'Grey'), ('done', 'Green'), ('blocked', 'Red')]
  • last_stage_id Many2one → hr.recruitment.stage
    help='Stage of the applicant before being in the current stage. Used for lost cases analysis.' args: 'hr.recruitment.stage', 'Last Stage'
  • legend_blocked Char
    readonly=False related='stage_id.legend_blocked' string='Kanban Blocked'
  • legend_done Char
    readonly=False related='stage_id.legend_done' string='Kanban Valid'
  • legend_normal Char
    readonly=False related='stage_id.legend_normal' string='Kanban Ongoing'
  • name Char
    required=True args: 'Subject / Application Name'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Contact'
  • partner_mobile Char
    size=32 args: 'Mobile'
  • partner_name Char
    args: "Applicant's Name"
  • partner_phone Char
    size=32 args: 'Phone'
  • priority Selection
    default='0' args: AVAILABLE_PRIORITIES, 'Appreciation'
  • probability Float
    args: 'Probability'
  • reference Char
    args: 'Referred By'
  • salary_expected Float
    group_operator='avg' help='Salary Expected by Applicant' args: 'Expected Salary'
  • salary_expected_extra Char
    help='Salary Expected by Applicant, extra advantages' args: 'Expected Salary Extra'
  • salary_proposed Float
    group_operator='avg' help='Salary Proposed by the Organisation' args: 'Proposed Salary'
  • salary_proposed_extra Char
    help='Salary Proposed by the Organisation, extra advantages' args: 'Proposed Salary Extra'
  • stage_id Many2one → hr.recruitment.stage
    copy=False default=_default_stage_id domain="['|', ('job_id', '=', False), ('job_id', '=', job_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' track_visibility='onchange' args: 'hr.recruitment.stage', 'Stage'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_email Char
    readonly=True related='user_id.email' string='User Email' type='char'
  • user_id Many2one → res.users
    default=<expr> track_visibility='onchange' args: 'res.users', 'Responsible'
Public methods (14)
  • action_get_attachment_tree_view(self)
    @api.multi
  • action_get_created_employee(self)
    @api.multi
  • action_makeMeeting(self)
    @api.multi
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • archive_applicant(self)
    @api.multi
  • create(self, vals)
    @api.model
  • create_employee_from_applicant(self)
    @api.multi
    Create an hr.employee from the hr.applicants
  • get_empty_list_help(self, help)
    @api.model
  • message_get_suggested_recipients(self)
    @api.multi
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • onchange_job_id(self)
    @api.onchange('job_id')
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_stage_id(self)
    @api.onchange('stage_id')
  • reset_applicant(self)
    @api.multi
    Reinsert the applicant into the recruitment pipe in the first stage
  • write(self, vals)
    @api.multi

New fields (2)
  • color Integer
    default=10 string='Color Index'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (3)
  • expected_employee Integer
    compute='_compute_recruitment_stats' string='Expected Employee'
  • new_applicant_count Integer
    compute='_compute_new_applicant_count' string='New Applicant'
  • new_hired_employee Integer
    compute='_compute_recruitment_stats' string='New Hired Employee'
Public methods (0)

No public methods.

New fields (1)
  • newly_hired_employee Boolean
    compute='_compute_newly_hired_employee' search='_search_newly_hired_employee' args: 'Newly hired employee'
Public methods (0)

No public methods.

New fields (10)
  • address_id Many2one → res.partner
    default=_default_address_id help='Address where employees are working' args: 'res.partner', 'Job Location'
  • alias_id Many2one → mail.alias
    help='Email alias for this job position. New emails will automatically create new applicants for this job position.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • application_count Integer
    compute='_compute_application_count' string='Application Count'
  • application_ids One2many → hr.applicant
    args: 'hr.applicant', 'job_id', 'Applications'
  • color Integer
    args: 'Color Index'
  • document_ids One2many → ir.attachment
    compute='_compute_document_ids' string='Documents' args: 'ir.attachment'
  • documents_count Integer
    compute='_compute_document_ids' string='Document Count'
  • hr_responsible_id Many2one → res.users
    help="Person responsible of validating the employee's contracts." track_visibility='onchange' args: 'res.users', 'HR Responsible'
  • manager_id Many2one → hr.employee
    readonly=True related='department_id.manager_id' store=True string='Department Manager' args: 'hr.employee'
  • user_id Many2one → res.users
    track_visibility='onchange' args: 'res.users', 'Recruitment Responsible'
Public methods (6)
  • action_get_attachment_tree_view(self)
    @api.multi
  • close_dialog(self)
    @api.multi
  • create(self, vals)
    @api.model
  • edit_dialog(self)
    @api.multi
  • get_alias_model_name(self, vals)
  • get_alias_values(self)

New fields (2)
  • name Char
    required=True translate=True args: 'Degree'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of degrees.' args: 'Sequence'
Public methods (0)

No public methods.

New fields (4)
  • alias_id Many2one → mail.alias
    args: 'mail.alias', 'Alias ID'
  • email Char
    readonly=True related='alias_id.display_name' string='Email'
  • job_id Many2one → hr.job
    args: 'hr.job', 'Job ID'
  • source_id Many2one → utm.source
    ondelete='cascade' required=True args: 'utm.source', 'Source'
Public methods (1)
  • create_alias(self)
    @api.multi

New fields (9)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Recruitment Pipe'
  • job_id Many2one → hr.job
    help='Specific job that uses this stage. Other jobs will not use this stage.' ondelete='cascade' string='Job Specific' args: 'hr.job'
  • legend_blocked Char
    default=<expr> required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> required=True translate=True args: 'Grey Kanban Label'
  • name Char
    required=True translate=True args: 'Stage name'
  • requirements Text
    args: 'Requirements'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of stages.' args: 'Sequence'
  • template_id Many2one → mail.template
    help='If set, a message is posted on the applicant using the template when the applicant is set to the stage.' args: 'mail.template', 'Automated Email'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • module_hr_recruitment_survey Boolean
    string='Interview Forms'
  • module_website_hr_recruitment Boolean
    string='Online Posting'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/hr_recruitment
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Nicolas Lempereur, Jérome Maes, Richard Mathot, Aaron Bohy, GitHub, Lucas Perais (lpe), Olivier Colson, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Adrien Dieudonne, Christophe Monniez
WEBSITE
WEBSITEhttps://www.odoo.com/page/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - hr
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
    - fetchmail
    - utm
    - document
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (27)
XML IDNameModelTypeStatus
assets_backend hr_recruitment assets ir.ui.view qweb Inherits web.assets_backend
crm_case_form_view_job Jobs - Recruitment Form hr.applicant form New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_pivot_view_job Jobs - Recruitment hr.applicant pivot New
crm_case_tree_view_job Applicants hr.applicant tree New
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_applicant_category_view_form hr.applicant.category.form hr.applicant.category form New
hr_applicant_view_graph hr.applicant.graph hr.applicant graph New
hr_applicant_view_pivot hr.applicant.pivot hr.applicant pivot New
hr_applicant_view_search hr.applicant.search hr.applicant search New
hr_applicant_view_tree_activity hr.applicant.view.tree.activity hr.applicant tree New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_job_simple_form hr.job.simple.form hr.job form New
hr_job_survey hr.job.form1 hr.job xpath Inherits hr.view_hr_job_form
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
ir_attachment_view_search_inherit_hr_recruitment ir.attachment.search.inherit.recruitment ir.attachment xpath Inherits base.view_attachment_search
res_config_settings_view_form res.config.settings.view.form.inherit.hr.recruitment res.config.settings xpath Inherits base.res_config_settings_view_form
view_crm_case_jobs_filter hr.applicant.view.search hr.applicant search New
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_stage_kanban hr.recruitment.stage.kanban hr.recruitment.stage kanban New
view_job_filter_recruitment Job hr.job field Inherits hr.view_job_filter
Models touched (10)

New fields (1)
  • applicant_id Many2one → hr.applicant
    string='Applicant' args: 'hr.applicant'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (39)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the case without removing it.' args: 'Active'
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.applicant')] string='Attachments' args: 'ir.attachment', 'res_id'
  • attachment_number Integer
    compute='_get_attachment_number' string='Number of Attachments'
  • availability Date
    help='The date at which the applicant will be available to start working' args: 'Availability'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=_default_company_id args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date_closed Datetime
    index=True readonly=True args: 'Closed'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True args: 'Last Stage Update'
  • date_open Datetime
    index=True readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day' string='Days to Close'
  • day_open Float
    compute='_compute_day' string='Days to Open'
  • delay_close Float
    compute='_compute_day' group_operator='avg' help='Number of days to close' readonly=True store=True string='Delay to Close'
  • department_id Many2one → hr.department
    args: 'hr.department', 'Department'
  • description Text
    args: 'Description'
  • email_cc Text
    help='These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma' size=252 args: 'Watchers Emails'
  • email_from Char
    help='These people will receive email.' size=128 args: 'Email'
  • emp_id Many2one → hr.employee
    help='Employee linked to the applicant.' string='Employee' track_visibility='onchange' args: 'hr.employee'
  • employee_name Char
    related='emp_id.name' string='Employee Name'
  • job_id Many2one → hr.job
    args: 'hr.job', 'Applied Job'
  • last_stage_id Many2one → hr.recruitment.stage
    help='Stage of the applicant before being in the current stage. Used for lost cases analysis.' args: 'hr.recruitment.stage', 'Last Stage'
  • name Char
    required=True args: 'Subject / Application Name'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Contact'
  • partner_mobile Char
    size=32 args: 'Mobile'
  • partner_name Char
    args: "Applicant's Name"
  • partner_phone Char
    size=32 args: 'Phone'
  • priority Selection
    default='0' args: AVAILABLE_PRIORITIES, 'Appreciation'
  • probability Float
    args: 'Probability'
  • reference Char
    args: 'Referred By'
  • salary_expected Float
    group_operator='avg' help='Salary Expected by Applicant' args: 'Expected Salary'
  • salary_expected_extra Char
    help='Salary Expected by Applicant, extra advantages' args: 'Expected Salary Extra'
  • salary_proposed Float
    group_operator='avg' help='Salary Proposed by the Organisation' args: 'Proposed Salary'
  • salary_proposed_extra Char
    help='Salary Proposed by the Organisation, extra advantages' args: 'Proposed Salary Extra'
  • stage_id Many2one → hr.recruitment.stage
    copy=False default=_default_stage_id domain="['|', ('job_id', '=', False), ('job_id', '=', job_id)]" group_expand='_read_group_stage_ids' index=True track_visibility='onchange' args: 'hr.recruitment.stage', 'Stage'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_email Char
    readonly=True related='user_id.email' string='User Email' type='char'
  • user_id Many2one → res.users
    default=<expr> track_visibility='onchange' args: 'res.users', 'Responsible'
  • write_date Datetime
    readonly=True args: 'Update Date'
Public methods (15)
  • action_get_attachment_tree_view(self)
    @api.multi
  • action_get_created_employee(self)
    @api.multi
  • action_makeMeeting(self)
    @api.multi
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • archive_applicant(self)
    @api.multi
  • create(self, vals)
    @api.model
  • create_employee_from_applicant(self)
    @api.multi
    Create an hr.employee from the hr.applicants
  • get_empty_list_help(self, help)
    @api.model
  • message_get_reply_to(self, ids, default=None)
    @api.model
    Override to get the reply_to of the parent project.
  • message_get_suggested_recipients(self)
    @api.multi
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • onchange_job_id(self)
    @api.onchange('job_id')
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_stage_id(self)
    @api.onchange('stage_id')
  • reset_applicant(self)
    @api.multi
    Reinsert the applicant into the recruitment pipe in the first stage
  • write(self, vals)
    @api.multi

New fields (2)
  • color Integer
    default=10 string='Color Index'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (3)
  • expected_employee Integer
    compute='_compute_recruitment_stats' string='Expected Employee'
  • new_applicant_count Integer
    compute='_compute_new_applicant_count' string='New Applicant'
  • new_hired_employee Integer
    compute='_compute_recruitment_stats' string='New Hired Employee'
Public methods (0)

No public methods.

New fields (1)
  • newly_hired_employee Boolean
    compute='_compute_newly_hired_employee' search='_search_newly_hired_employee' args: 'Newly hired employee'
Public methods (0)

No public methods.

New fields (10)
  • address_id Many2one → res.partner
    default=_default_address_id help='Address where employees are working' args: 'res.partner', 'Job Location'
  • alias_id Many2one → mail.alias
    help='Email alias for this job position. New emails will automatically create new applicants for this job position.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • application_count Integer
    compute='_compute_application_count' string='Applications'
  • application_ids One2many → hr.applicant
    args: 'hr.applicant', 'job_id', 'Applications'
  • color Integer
    args: 'Color Index'
  • document_ids One2many → ir.attachment
    compute='_compute_document_ids' string='Applications' args: 'ir.attachment'
  • documents_count Integer
    compute='_compute_document_ids' string='Documents'
  • hr_responsible_id Many2one → res.users
    help="Person responsible of validating the employee's contracts." track_visibility='onchange' args: 'res.users', 'HR Responsible'
  • manager_id Many2one → hr.employee
    readonly=True related='department_id.manager_id' store=True string='Department Manager' args: 'hr.employee'
  • user_id Many2one → res.users
    track_visibility='onchange' args: 'res.users', 'Recruitment Responsible'
Public methods (6)
  • action_get_attachment_tree_view(self)
    @api.multi
  • close_dialog(self)
    @api.multi
  • create(self, vals)
    @api.model
  • edit_dialog(self)
    @api.multi
  • get_alias_model_name(self, vals)
  • get_alias_values(self)

New fields (2)
  • name Char
    required=True translate=True args: 'Degree'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of degrees.' args: 'Sequence'
Public methods (0)

No public methods.

New fields (4)
  • alias_id Many2one → mail.alias
    args: 'mail.alias', 'Alias ID'
  • email Char
    readonly=True related='alias_id.display_name' string='Email'
  • job_id Many2one → hr.job
    args: 'hr.job', 'Job ID'
  • source_id Many2one → utm.source
    ondelete='cascade' required=True args: 'utm.source', 'Source'
Public methods (1)
  • create_alias(self)
    @api.multi

New fields (6)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Recruitment Pipe'
  • job_id Many2one → hr.job
    help='Specific job that uses this stage. Other jobs will not use this stage.' ondelete='cascade' string='Job Specific' args: 'hr.job'
  • name Char
    required=True translate=True args: 'Stage name'
  • requirements Text
    args: 'Requirements'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of stages.' args: 'Sequence'
  • template_id Many2one → mail.template
    help='If set, a message is posted on the applicant using the template when the applicant is set to the stage.' args: 'mail.template', 'Automated Email'
Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (2)
  • module_hr_recruitment_survey Boolean
    string='Interview Forms'
  • module_website_hr_recruitment Boolean
    string='Online Posting'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/hr_recruitment
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Joren Van Onder, Nicolas Martinelli, Jérome Maes, Julien Legros, qdp-odoo, Aaron Bohy, GitHub, Lucas Perais (lpe), Yannick Tivisse, qsm-odoo, Christophe Monniez
WEBSITE
WEBSITEhttps://www.odoo.com/page/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - decimal_precision
    - base
    - hr
    - base_setup
    - web_kanban
    - web
    - mail
    - bus
    - web_tour
    - resource
    - calendar
    - base_action_rule
    - web_calendar
    - fetchmail
    - web_kanban_gauge
    - utm
    - document
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage job positions and the recruitment process
================================================

This application allows you to easily keep track of jobs, vacancies, applications, interviews...

It is integrated with the mail gateway to automatically fetch email sent to <jobs@yourcompany.com> in the list of applications. It's also integrated with the document management system to store and search in the CV base and find the candidate that you are looking for. Similarly, it may integrated with the survey module to allow you to define interviews for different jobs.		
You can define the different phases of interviews and easily rate the applicant from the kanban view.

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
assets_backend hr_recruitment assets ir.ui.view qweb Inherits web.assets_backend
crm_case_form_view_job Jobs - Recruitment Form hr.applicant form New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_pivot_view_job Jobs - Recruitment hr.applicant pivot New
crm_case_tree_view_job Applicants hr.applicant tree New
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_applicant_category_view_form hr.applicant.category.form hr.applicant.category form New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_job_simple_form hr.job.simple.form hr.job form New
hr_job_survey hr.job.form1 hr.job group Inherits hr.view_hr_job_form
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
ir_attachment_view_search_inherit_hr_recruitment ir.attachment.search.inherit.recruitment ir.attachment xpath Inherits base.view_attachment_search
view_crm_case_jobs_filter Jobs - Recruitment Search hr.applicant search New
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_configuration Configure Recruitment hr.recruitment.config.settings form New
view_hr_recruitment_report_graph hr.recruitment.report.graph hr.recruitment.report graph New
view_hr_recruitment_report_pivot hr.recruitment.report.pivot hr.recruitment.report pivot New
view_hr_recruitment_report_search hr.recruitment.report.search hr.recruitment.report search New
view_job_filter_recruitment Job hr.job field Inherits hr.view_job_filter
Models touched (10)

New fields (40)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the case without removing it.' args: 'Active'
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.applicant')] string='Attachments' args: 'ir.attachment', 'res_id'
  • attachment_number Integer
    compute='_get_attachment_number' string='Number of Attachments'
  • availability Date
    help='The date at which the applicant will be available to start working' args: 'Availability'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=_default_company_id args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date_action Date
    args: 'Next Action Date'
  • date_closed Datetime
    index=True readonly=True args: 'Closed'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True args: 'Last Stage Update'
  • date_open Datetime
    index=True readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day' string='Days to Close'
  • day_open Float
    compute='_compute_day' string='Days to Open'
  • department_id Many2one → hr.department
    args: 'hr.department', 'Department'
  • description Text
    args: 'Description'
  • email_cc Text
    help='These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma' size=252 args: 'Watchers Emails'
  • email_from Char
    help='These people will receive email.' size=128 args: 'Email'
  • emp_id Many2one → hr.employee
    help='Employee linked to the applicant.' string='Employee' track_visibility='onchange' args: 'hr.employee'
  • employee_name Char
    related='emp_id.name' string='Employee Name'
  • job_id Many2one → hr.job
    args: 'hr.job', 'Applied Job'
  • last_stage_id Many2one → hr.recruitment.stage
    help='Stage of the applicant before being in the current stage. Used for lost cases analysis.' args: 'hr.recruitment.stage', 'Last Stage'
  • name Char
    required=True args: 'Subject / Application Name'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Contact'
  • partner_mobile Char
    size=32 args: 'Mobile'
  • partner_name Char
    args: "Applicant's Name"
  • partner_phone Char
    size=32 args: 'Phone'
  • priority Selection
    default='0' args: AVAILABLE_PRIORITIES, 'Appreciation'
  • probability Float
    args: 'Probability'
  • reference Char
    args: 'Referred By'
  • salary_expected Float
    help='Salary Expected by Applicant' args: 'Expected Salary'
  • salary_expected_extra Char
    help='Salary Expected by Applicant, extra advantages' args: 'Expected Salary Extra'
  • salary_proposed Float
    help='Salary Proposed by the Organisation' args: 'Proposed Salary'
  • salary_proposed_extra Char
    help='Salary Proposed by the Organisation, extra advantages' args: 'Proposed Salary Extra'
  • stage_id Many2one → hr.recruitment.stage
    copy=False default=_default_stage_id domain="['|', ('job_id', '=', False), ('job_id', '=', job_id)]" group_expand='_read_group_stage_ids' index=True track_visibility='onchange' args: 'hr.recruitment.stage', 'Stage'
  • title_action Char
    size=64 args: 'Next Action'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_email Char
    readonly=True related='user_id.email' string='User Email' type='char'
  • user_id Many2one → res.users
    default=<expr> track_visibility='onchange' args: 'res.users', 'Responsible'
  • write_date Datetime
    readonly=True args: 'Update Date'
Public methods (15)
  • action_get_attachment_tree_view(self)
    @api.multi
  • action_get_created_employee(self)
    @api.multi
  • action_makeMeeting(self)
    @api.multi
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • archive_applicant(self)
    @api.multi
  • create(self, vals)
    @api.model
  • create_employee_from_applicant(self)
    @api.multi
    Create an hr.employee from the hr.applicants
  • get_empty_list_help(self, help)
    @api.model
  • message_get_reply_to(self, ids, default=None)
    @api.model
    Override to get the reply_to of the parent project.
  • message_get_suggested_recipients(self)
    @api.multi
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • onchange_job_id(self)
    @api.onchange('job_id')
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_stage_id(self)
    @api.onchange('stage_id')
  • reset_applicant(self)
    @api.multi
    Reinsert the applicant into the recruitment pipe in the first stage
  • write(self, vals)
    @api.multi

New fields (2)
  • color Integer
    string='Color Index'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (3)
  • expected_employee Integer
    compute='_compute_recruitment_stats' string='Expected Employee'
  • new_applicant_count Integer
    compute='_compute_new_applicant_count' string='New Applicant'
  • new_hired_employee Integer
    compute='_compute_recruitment_stats' string='New Hired Employee'
Public methods (0)

No public methods.

New fields (1)
  • newly_hired_employee Boolean
    compute='_compute_newly_hired_employee' search='_search_newly_hired_employee' args: 'Newly hired employee'
Public methods (0)

No public methods.

New fields (9)
  • address_id Many2one → res.partner
    default=_default_address_id help='Address where employees are working' args: 'res.partner', 'Job Location'
  • alias_id Many2one → mail.alias
    help='Email alias for this job position. New emails will automatically create new applicants for this job position.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • application_count Integer
    compute='_compute_application_count' string='Applications'
  • application_ids One2many → hr.applicant
    args: 'hr.applicant', 'job_id', 'Applications'
  • color Integer
    args: 'Color Index'
  • document_ids One2many → ir.attachment
    compute='_compute_document_ids' string='Applications' args: 'ir.attachment'
  • documents_count Integer
    compute='_compute_document_ids' string='Documents'
  • manager_id Many2one → hr.employee
    readonly=True related='department_id.manager_id' store=True string='Department Manager' args: 'hr.employee'
  • user_id Many2one → res.users
    track_visibility='onchange' args: 'res.users', 'Recruitment Responsible'
Public methods (6)
  • action_get_attachment_tree_view(self)
    @api.multi
  • action_set_no_of_recruitment(self, value)
    @api.multi
  • close_dialog(self)
    @api.multi
  • create(self, vals)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)

New fields (1)
  • module_hr_recruitment_survey Selection
    selection=[(0, 'Do not use interview forms'), (1, 'Use interview forms during the recruitment process')] string='Interview Form'
Public methods (0)

No public methods.

New fields (2)
  • name Char
    required=True translate=True args: 'Degree'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of degrees.' args: 'Sequence'
Public methods (0)

No public methods.

New fields (20)
  • active Boolean
    args: 'Active'
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • date_closed Date
    readonly=True args: 'Closed'
  • date_create Datetime
    readonly=True args: 'Create Date'
  • date_last_stage_update Datetime
    readonly=True args: 'Last Stage Update'
  • delay_close Float
    digits=(16, 2) group_operator='avg' help='Number of Days to close the project issue' readonly=True args: 'Avg. Delay to Close'
  • department_id Many2one → hr.department
    readonly=True args: 'hr.department', 'Department'
  • job_id Many2one → hr.job
    readonly=True args: 'hr.job', 'Applied Job'
  • last_stage_id Many2one → hr.recruitment.stage
    args: 'hr.recruitment.stage', 'Last Stage'
  • medium_id Many2one → utm.medium
    help='This is the method of delivery. Ex: Postcard, Email, or Banner Ad' readonly=True args: 'utm.medium', 'Medium'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner'
  • priority Selection
    args: hr_recruitment.AVAILABLE_PRIORITIES, 'Appreciation'
  • salary_exp Float
    digits=0 args: 'Salary Expected'
  • salary_exp_avg Float
    digits=0 group_operator='avg' args: 'Avg. Expected Salary'
  • salary_prop Float
    digits=0 args: 'Salary Proposed'
  • salary_prop_avg Float
    digits=0 group_operator='avg' args: 'Avg. Proposed Salary'
  • source_id Many2one → utm.source
    help='This is the source of the link Ex: Search Engine, another domain, or name of email list' readonly=True args: 'utm.source', 'Source'
  • stage_id Many2one → hr.recruitment.stage
    args: 'hr.recruitment.stage', 'Stage'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'User'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (4)
  • alias_id Many2one → mail.alias
    args: 'mail.alias', 'Alias ID'
  • email Char
    readonly=True related='alias_id.display_name' string='Email'
  • job_id Many2one → hr.job
    args: 'hr.job', 'Job ID'
  • source_id Many2one → utm.source
    ondelete='cascade' required=True args: 'utm.source', 'Source'
Public methods (1)
  • create_alias(self)
    @api.multi

New fields (6)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Recruitment Pipe'
  • job_id Many2one → hr.job
    help='Specific job that uses this stage. Other jobs will not use this stage.' ondelete='cascade' string='Job Specific' args: 'hr.job'
  • name Char
    required=True translate=True args: 'Stage name'
  • requirements Text
    args: 'Requirements'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of stages.' args: 'Sequence'
  • template_id Many2one → mail.template
    help='If set, a message is posted on the applicant using the template when the applicant is set to the stage.' args: 'mail.template', 'Use template'
Public methods (1)
  • default_get(self, fields)
    @api.model
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/hr_recruitment
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, David Monjoie, Cedric Snauwaert, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Richard Mathot, qdp-odoo, Géry Debongnie, Jeremy Kersten, Damien Bouvy, Julien De Coster, Yannick Tivisse, qsm-odoo, Martin Geubelle
WEBSITE
WEBSITEhttps://www.odoo.com/page/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - decimal_precision
    - base
    - hr
    - base_setup
    - web_kanban
    - web
    - mail
    - bus
    - resource
    - web_tip
    - survey
    - website
    - web_editor
    - web_planner
    - marketing
    - calendar
    - base_action_rule
    - web_calendar
    - fetchmail
    - web_kanban_gauge
    - utm
    - document
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage job positions and the recruitment process
================================================

This application allows you to easily keep track of jobs, vacancies, applications, interviews...

It is integrated with the mail gateway to automatically fetch email sent to <jobs@yourcompany.com> in the list of applications. It's also integrated with the document management system to store and search in the CV base and find the candidate that you are looking for. Similarly, it is integrated with the survey module to allow you to define interviews for different jobs.
You can define the different phases of interviews and easily rate the applicant from the kanban view.

Code Analysis

Views touched (22)
XML IDNameModelTypeStatus
assets_backend hr_recruitment assets ir.ui.view qweb Inherits web.assets_backend
crm_case_form_view_job Jobs - Recruitment Form hr.applicant form New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_pivot_view_job Jobs - Recruitment hr.applicant pivot New
crm_case_tree_view_job Applicants hr.applicant tree New
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_department_view_kanban hr.department.kanban.inherit hr.department data Inherits hr.hr_department_view_kanban
hr_employee_view_search hr.employee.search.inherit hr.employee xpath Inherits hr.view_employee_filter
hr_job_survey hr.job.form1 hr.job group Inherits hr.view_hr_job_form
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
view_crm_case_jobs_filter Jobs - Recruitment Search hr.applicant search New
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_configuration Configure Recruitment hr.recruitment.config.settings form New
view_hr_recruitment_report_graph hr.recruitment.report.graph hr.recruitment.report graph New
view_hr_recruitment_report_pivot hr.recruitment.report.pivot hr.recruitment.report pivot New
view_hr_recruitment_report_search hr.recruitment.report.search hr.recruitment.report search New
view_job_filter_recruitment Job hr.job field Inherits hr.view_job_filter
Models touched (10)

New fields (42)
  • active Boolean
    default=True help='If the active field is set to false, it will allow you to hide the case without removing it.' args: 'Active'
  • attachment_ids One2many → ir.attachment
    domain=[('res_model', '=', 'hr.applicant')] string='Attachments' args: 'ir.attachment', 'res_id'
  • attachment_number Integer
    compute='_get_attachment_number' string='Number of Attachments'
  • availability Date
    help='The date at which the applicant will be available to start working' args: 'Availability'
  • categ_ids Many2many → hr.applicant.category
    string='Tags' args: 'hr.applicant.category'
  • color Integer
    default=0 args: 'Color Index'
  • company_id Many2one → res.company
    default=_default_company_id args: 'res.company', 'Company'
  • create_date Datetime
    index=True readonly=True args: 'Creation Date'
  • date_action Date
    args: 'Next Action Date'
  • date_closed Datetime
    index=True readonly=True args: 'Closed'
  • date_last_stage_update Datetime
    default=fields.Datetime.now index=True args: 'Last Stage Update'
  • date_open Datetime
    index=True readonly=True args: 'Assigned'
  • day_close Float
    compute='_compute_day' string='Days to Close'
  • day_open Float
    compute='_compute_day' string='Days to Open'
  • department_id Many2one → hr.department
    args: 'hr.department', 'Department'
  • description Text
    args: 'Description'
  • email_cc Text
    help='These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma' size=252 args: 'Watchers Emails'
  • email_from Char
    help='These people will receive email.' size=128 args: 'Email'
  • emp_id Many2one → hr.employee
    help='Employee linked to the applicant.' string='Employee' track_visibility='onchange' args: 'hr.employee'
  • employee_name Char
    related='emp_id.name' string='Employee Name'
  • job_id Many2one → hr.job
    args: 'hr.job', 'Applied Job'
  • last_stage_id Many2one → hr.recruitment.stage
    help='Stage of the applicant before being in the current stage. Used for lost cases analysis.' args: 'hr.recruitment.stage', 'Last Stage'
  • name Char
    required=True args: 'Subject / Application Name'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'Contact'
  • partner_mobile Char
    size=32 args: 'Mobile'
  • partner_name Char
    args: "Applicant's Name"
  • partner_phone Char
    size=32 args: 'Phone'
  • priority Selection
    default='0' args: AVAILABLE_PRIORITIES, 'Appreciation'
  • probability Float
    args: 'Probability'
  • reference Char
    args: 'Referred By'
  • response_id Many2one → survey.user_input
    oldname='response' ondelete='set null' args: 'survey.user_input', 'Response'
  • salary_expected Float
    help='Salary Expected by Applicant' args: 'Expected Salary'
  • salary_expected_extra Char
    help='Salary Expected by Applicant, extra advantages' args: 'Expected Salary Extra'
  • salary_proposed Float
    help='Salary Proposed by the Organisation' args: 'Proposed Salary'
  • salary_proposed_extra Char
    help='Salary Proposed by the Organisation, extra advantages' args: 'Proposed Salary Extra'
  • stage_id Many2one → hr.recruitment.stage
    copy=False default=_default_stage_id domain="[('job_ids', '=', job_id)]" index=True track_visibility='onchange' args: 'hr.recruitment.stage', 'Stage'
  • survey Many2one → survey.survey
    related='job_id.survey_id' string='Survey' args: 'survey.survey'
  • title_action Char
    size=64 args: 'Next Action'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_email Char
    readonly=True related='user_id.email' string='User Email' type='char'
  • user_id Many2one → res.users
    default=<expr> track_visibility='onchange' args: 'res.users', 'Responsible'
  • write_date Datetime
    readonly=True args: 'Update Date'
Public methods (17)
  • action_get_attachment_tree_view(self)
    @api.multi
  • action_get_created_employee(self)
    @api.multi
  • action_makeMeeting(self)
    @api.multi
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • action_print_survey(self)
    @api.multi
    If response is available then print this response otherwise print survey form (print template of the survey)
  • action_start_survey(self)
    @api.multi
  • archive_applicant(self)
    @api.multi
  • create(self, vals)
    @api.model
  • create_employee_from_applicant(self)
    @api.multi
    Create an hr.employee from the hr.applicants
  • get_empty_list_help(self, help)
    @api.model
  • message_get_reply_to(self, ids, default=None)
    @api.model
    Override to get the reply_to of the parent project.
  • message_get_suggested_recipients(self)
    @api.multi
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • onchange_job_id(self)
    @api.onchange('job_id')
  • onchange_partner_id(self)
    @api.onchange('partner_id')
  • onchange_stage_id(self)
    @api.onchange('stage_id')
  • reset_applicant(self)
    @api.multi
    Reinsert the applicant into the recruitment pipe in the first stage
  • write(self, vals)
    @api.multi

New fields (1)
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (3)
  • expected_employee Integer
    compute='_compute_recruitment_stats' string='Expected Employee'
  • new_applicant_count Integer
    compute='_compute_new_applicant_count' string='New Applicant'
  • new_hired_employee Integer
    compute='_compute_recruitment_stats' string='New Hired Employee'
Public methods (0)

No public methods.

New fields (1)
  • newly_hired_employee Boolean
    compute='_compute_newly_hired_employee' search='_search_newly_hired_employee' args: 'Newly hired employee'
Public methods (0)

No public methods.

New fields (11)
  • address_id Many2one → res.partner
    default=_default_address_id help='Address where employees are working' args: 'res.partner', 'Job Location'
  • alias_id Many2one → mail.alias
    help='Email alias for this job position. New emails will automatically create new applicants for this job position.' ondelete='restrict' required=True args: 'mail.alias', 'Alias'
  • application_count Integer
    compute='_compute_application_count' string='Applications'
  • application_ids One2many → hr.applicant
    args: 'hr.applicant', 'job_id', 'Applications'
  • color Integer
    args: 'Color Index'
  • document_ids One2many → ir.attachment
    compute='_compute_document_ids' string='Applications' args: 'ir.attachment'
  • documents_count Integer
    compute='_compute_document_ids' string='Documents'
  • manager_id Many2one → hr.employee
    readonly=True related='department_id.manager_id' store=True string='Department Manager' args: 'hr.employee'
  • stage_ids Many2many → hr.recruitment.stage
    default=[(0, 0, {'name': _('New')})] args: 'hr.recruitment.stage', 'job_stage_rel', 'job_id', 'stage_id', 'Job Stages'
  • survey_id Many2one → survey.survey
    help='Choose an interview form for this job position and you will be able to print/answer this interview from all applicants who apply for this job' args: 'survey.survey', 'Interview Form'
  • user_id Many2one → res.users
    track_visibility='onchange' args: 'res.users', 'Recruitment Responsible'
Public methods (5)
  • action_get_attachment_tree_view(self)
    @api.multi
  • action_print_survey(self)
    @api.multi
  • action_set_no_of_recruitment(self, value)
    @api.multi
  • create(self, vals)
    @api.model
  • unlink(self)
    @api.multi

New fields (1)
  • module_document Selection
    help="Manage your CV's and motivation letter related to all applicants.\n-This installs the module document_ftp. This will install the knowledge management module in order to allow you to search using specific keywords through the content of all documents (PDF, .DOCx...)" selection=[(0, 'Do not manage CVs and motivation letter'), (1, 'Allow the automatic indexation of resumes')] string='Resumes'
Public methods (0)

No public methods.

New fields (2)
  • name Char
    required=True translate=True args: 'Degree'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of degrees.' args: 'Sequence'
Public methods (0)

No public methods.

New fields (19)
  • company_id Many2one → res.company
    readonly=True args: 'res.company', 'Company'
  • date_closed Date
    readonly=True args: 'Closed'
  • date_create Datetime
    readonly=True args: 'Create Date'
  • date_last_stage_update Datetime
    readonly=True args: 'Last Stage Update'
  • delay_close Float
    digits=(16, 2) group_operator='avg' help='Number of Days to close the project issue' readonly=True args: 'Avg. Delay to Close'
  • department_id Many2one → hr.department
    readonly=True args: 'hr.department', 'Department'
  • job_id Many2one → hr.job
    readonly=True args: 'hr.job', 'Applied Job'
  • last_stage_id Many2one → hr.recruitment.stage
    args: 'hr.recruitment.stage', 'Last Stage'
  • medium_id Many2one → utm.medium
    help='This is the method of delivery. Ex: Postcard, Email, or Banner Ad' readonly=True args: 'utm.medium', 'Medium'
  • partner_id Many2one → res.partner
    readonly=True args: 'res.partner', 'Partner'
  • priority Selection
    args: hr_recruitment.AVAILABLE_PRIORITIES, 'Appreciation'
  • salary_exp Float
    digits=0 args: 'Salary Expected'
  • salary_exp_avg Float
    digits=0 group_operator='avg' args: 'Avg. Expected Salary'
  • salary_prop Float
    digits=0 args: 'Salary Proposed'
  • salary_prop_avg Float
    digits=0 group_operator='avg' args: 'Avg. Proposed Salary'
  • source_id Many2one → utm.source
    help='This is the source of the link Ex: Search Engine, another domain, or name of email list' readonly=True args: 'utm.source', 'Source'
  • stage_id Many2one → hr.recruitment.stage
    args: 'hr.recruitment.stage', 'Stage'
  • type_id Many2one → hr.recruitment.degree
    args: 'hr.recruitment.degree', 'Degree'
  • user_id Many2one → res.users
    readonly=True args: 'res.users', 'User'
Public methods (1)
  • init(self, cr)

New fields (4)
  • alias_id Many2one → mail.alias
    args: 'mail.alias', 'Alias ID'
  • email Char
    readonly=True related='alias_id.display_name' string='Email'
  • job_id Many2one → hr.job
    args: 'hr.job', 'Job ID'
  • source_id Many2one → utm.source
    ondelete='cascade' required=True args: 'utm.source', 'Source'
Public methods (1)
  • create_alias(self)
    @api.multi

New fields (6)
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' args: 'Folded in Recruitment Pipe'
  • job_ids Many2many → hr.job
    default=<expr> string='Job Stages' args: 'hr.job', 'job_stage_rel', 'stage_id', 'job_id'
  • name Char
    required=True translate=True args: 'Stage name'
  • requirements Text
    args: 'Requirements'
  • sequence Integer
    default=1 help='Gives the sequence order when displaying a list of stages.' args: 'Sequence'
  • template_id Many2one → mail.template
    help='If set, a message is posted on the applicant using the template when the applicant is set to the stage.' args: 'mail.template', 'Use template'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/8.0/hr_recruitment
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Atul Patel (OpenERP), Odoo Translation Bot, Turkesh Patel (Open ERP), Christophe Matthieu, DBR (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Purnendu Singh (OpenERP), Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Vo Minh Thu, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Denis Ledoux, Fabien Meghazi, ggh-openerp, Christophe Simonis, Xavier Morel, Cedric Snauwaert, Vishmita, Chirag Dodiya (OpenERP Trainee), Dharti Ratani (Open ERP), Amit Bhavsar (Open ERP), Paramjit Singh Sahota, Jagdish Panchal, Nimesh Contractor (OpenERP), Richard Mathot, Géry Debongnie, Darshan Kalola (OpenERP Trainee), jke-openerp, Aaron Bohy, bth-openerp, Vishmita Jadeja (openerp), Bharat R. Devnani (OpenERP), Richard Mathot (OpenERP), ged-odoo, Mahendra Barad (OpenERP), ima-openerp, Gery Debongnie, Randhir Mayatra rma-openerp, sgo@tinyerp.com, Darshan Kalola (OpenERP), Darshan Kalola, Jitendra Prajapati (OpenERP), Sunil Sharma (OpenERP Trainee), Yogesh Parekh (OpenERP), Chirag Dodiya (OpenERP), Sunil Sharma (OpenERP), Jignesh Rathod (OpenERP), Barad Mahendra
WEBSITE
WEBSITEhttps://www.odoo.com/page/recruitment
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:39
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - decimal_precision
    - base
    - hr
    - base_setup
    - web_kanban
    - web
    - mail
    - resource
    - board
    - survey
    - email_template
    - website
    - share
    - marketing
    - calendar
    - base_action_rule
    - web_calendar
    - fetchmail
    - web_kanban_gauge
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage job positions and the recruitment process
================================================

This application allows you to easily keep track of jobs, vacancies, applications, interviews...

It is integrated with the mail gateway to automatically fetch email sent to <jobs@yourcompany.com> in the list of applications. It's also integrated with the document management system to store and search in the CV base and find the candidate that you are looking for. Similarly, it is integrated with the survey module to allow you to define interviews for different jobs.
You can define the different phases of interviews and easily rate the applicant from the kanban view.

Code Analysis

Views touched (20)
XML IDNameModelTypeStatus
assets_backend hr_recruitment assets ir.ui.view qweb Inherits web.assets_backend
crm_case_form_view_job Jobs - Recruitment Form hr.applicant form New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_tree_view_job Applicants hr.applicant tree New
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_job_survey hr.job.form1 hr.job group Inherits hr.view_hr_job_form
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_form hr.recruitment.source.form hr.recruitment.source form New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
view_crm_case_jobs_filter Jobs - Recruitment Search hr.applicant search New
view_hr_apll_config_settings hr settings for recruitment hr.config.settings div Inherits hr.view_human_resources_configuration
view_hr_job_kanban hr.job.kanban hr.job kanban New
view_hr_recruitment_partner_create hr.recruitment.partner.create.form hr.recruitment.partner.create form New
view_hr_recruitment_report_graph hr.recruitment.report.graph hr.recruitment.report graph New
view_hr_recruitment_report_search hr.recruitment.report.search hr.recruitment.report search New
view_job_filter_recruitment Job hr.job field Inherits hr.view_job_filter
Models touched (3)

New fields (0)

No new fields.

Public methods (16)
  • action_get_attachment_tree_view(self, cr, uid, ids, context=None)
  • action_makeMeeting(self, cr, uid, ids, context=None)
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • action_print_survey(self, cr, uid, ids, context=None)
    If response is available then print this response otherwise print survey form (print template of the survey)
  • action_start_survey(self, cr, uid, ids, context=None)
  • create(self, cr, uid, vals, context=None)
  • create_employee_from_applicant(self, cr, uid, ids, context=None)
    Create an hr.employee from the hr.applicants
  • get_empty_list_help(self, cr, uid, help, context=None)
  • message_get_reply_to(self, cr, uid, ids, context=None)
    Override to get the reply_to of the parent project.
  • message_get_suggested_recipients(self, cr, uid, ids, context=None)
  • message_new(self, cr, uid, msg, custom_values=None, context=None)
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • onchange_department_id(self, cr, uid, ids, department_id=False, stage_id=False, context=None)
  • onchange_job(self, cr, uid, ids, job_id=False, context=None)
  • onchange_partner_id(self, cr, uid, ids, partner_id, context=None)
  • onchange_stage_id(self, cr, uid, ids, stage_id, context=None)
  • stage_find(self, cr, uid, cases, section_id, domain=[], order='sequence', context=None)
    Override of the base.stage method Parameter of the stage search taken from the lead: - department_id: if set, stages must belong to this section or be a default case
  • write(self, cr, uid, ids, vals, context=None)

New fields (0)

No new fields.

Public methods (2)
  • get_default_alias_prefix(self, cr, uid, ids, context=None)
  • set_default_alias_prefix(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (1)
  • init(self, cr)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/7.0/hr_recruitment
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Twinkle Christian (OpenERP), Cecile Tonglet, Rucha (Open ERP), Atul Patel (OpenERP), Jalpesh Patel (OpenERP), Randhir Mayatra (OpenERP), Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Numerigraphe - Lionel Sausin, Christophe Matthieu, Pinakin Nayi (OpenERP), Antonin Bourguignon, pankita shah (Open ERP), ajay javiya (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Bhumika (OpenERP), Purnendu Singh (OpenERP), Saurang Suthar (OpenERP), Fabien Pinckaers, Antony Lesuisse, Bharat Devnani (OpenERP), Meera Trambadia (OpenERP), Olivier Dony, Rajesh Prajapati (OpenERP), Twinkle (OpenERP), Divyesh Makwana (Open ERP), Tejas Tank, Thibault Delavallée, Vo Minh Thu, Josse Colpaert, pso (OpenERP), Sbh (Openerp), Amit Patel (OpenERP), Launchpad Translations on behalf of openerp, vta vta@openerp.com, Quentin (OpenERP), Kuldeep Joshi (OpenERP), Nimesh (Open ERP), Denis Ledoux, ara@tinyerp.com, Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, Sanjay Gohel (Open ERP), Fabien Meghazi, niv-openerp, Jiten (OpenERP), Khushboo Bhatt (Open ERP), Roberto López López (OpenERP), Cedric Snauwaert, Amit Patel, Frédéric van der Essen, Gilles Major, Vijaykumar Baladaniya, Jigar Amin, Ashvin Rathod (OpenERP), RGA(OpenERP)
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:43:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_status
    - base
    - decimal_precision
    - hr
    - base_setup
    - web_kanban
    - web
    - mail
    - resource
    - process
    - board
    - survey
    - base_calendar
    - base_action_rule
    - fetchmail
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manage job positions and the recruitment process
================================================

This application allows you to easily keep track of jobs, vacancies, applications, interviews...

It is integrated with the mail gateway to automatically fetch email sent to <jobs@yourcompany.com> in the list of applications. It's also integrated with the document management system to store and search in the CV base and find the candidate that you are looking for. Similarly, it is integrated with the survey module to allow you to define interviews for different jobs.
You can define the different phases of interviews and easily rate the applicant from the kanban view.

Code Analysis

Views touched (21)
XML IDNameModelTypeStatus
board_hr_applicants_status_form board.hr.applicants.status.form board.board xpath Inherits hr.board_hr_form
crm_case_form_view_job Jobs - Recruitment Form hr.applicant form New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_tree_view_job Applicants hr.applicant tree New
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_job_survey hr.job.form1 hr.job field Inherits hr.view_hr_job_form
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_form hr.recruitment.source.form hr.recruitment.source form New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
view_applicants_status_tree applicants.status.tree hr.applicant tree New
view_crm_case_jobs_filter Jobs - Recruitment Search hr.applicant search New
view_hr_apll_config_settings hr settings for recruitment hr.config.settings div Inherits hr.view_human_resources_configuration
view_hr_recruitment_hired_employee hr.recruitment.hired2employee.form hired.employee form New
view_hr_recruitment_partner_create hr.recruitment.partner.create.form hr.recruitment.partner.create form New
view_hr_recruitment_report_graph hr.recruitment.report.graph hr.recruitment.report graph New
view_hr_recruitment_report_search hr.recruitment.report.search hr.recruitment.report search New
view_hr_recruitment_report_tree hr.recruitment.report.tree hr.recruitment.report tree New
Models touched (1)

New fields (0)

No new fields.

Public methods (18)
  • action_makeMeeting(self, cr, uid, ids, context=None)
    This opens Meeting's calendar view to schedule meeting on current applicant @return: Dictionary value for created Meeting view
  • action_print_survey(self, cr, uid, ids, context=None)
    If response is available then print this response otherwise print survey form(print template of the survey). @param self: The object pointer @param cr: the current row, from the database cursor, @param uid: the current user’s ID for security checks, @param ids: List of Survey IDs @param context: A standard dictionary for contextual values @return: Dictionary value for print survey form.
  • case_cancel(self, cr, uid, ids, context=None)
    Overrides cancel for crm_case for setting probability
  • case_close(self, cr, uid, ids, context=None)
  • case_close_with_emp(self, cr, uid, ids, context=None)
  • case_open(self, cr, uid, ids, context=None)
    open Request of the applicant for the hr_recruitment
  • case_pending(self, cr, uid, ids, context=None)
    Marks case as pending
  • case_reset(self, cr, uid, ids, context=None)
    Resets case as draft
  • create(self, cr, uid, vals, context=None)
  • message_get_suggested_recipients(self, cr, uid, ids, context=None)
  • message_new(self, cr, uid, msg, custom_values=None, context=None)
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • onchange_department_id(self, cr, uid, ids, department_id=False, context=None)
  • onchange_job(self, cr, uid, ids, job, context=None)
  • onchange_partner_id(self, cr, uid, ids, partner_id, context=None)
  • set_high_priority(self, cr, uid, ids, *args)
    Set applicant priority to high
  • set_normal_priority(self, cr, uid, ids, *args)
    Set applicant priority to normal
  • set_priority(self, cr, uid, ids, priority, *args)
    Set applicant priority
  • stage_find(self, cr, uid, cases, section_id, domain=[], order='sequence', context=None)
    Override of the base.stage method Parameter of the stage search taken from the lead: - department_id: if set, stages must belong to this section or be a default case
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/6.1/hr_recruitment
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Rucha (Open ERP), Stephane Wirtel, DBR (OpenERP), Harry (OpenERP), Fabien Pinckaers, Antony Lesuisse, Meera Trambadia (OpenERP), Olivier Dony, Vo Minh Thu, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, vro, Fabien Meghazi, niv-openerp, Christophe Simonis, Ujjvala Collins (OpenERP), Xavier Morel, Jigar Amin, Amit (OpenERP), Minh Tran, Thibault Francois, Carlos Vásquez, ksa (Open ERP), Husen Daudi, Els Van Vossel, Israel Fermin Montilla, Rifakat Haradwala (Open ERP), mayur maheshwari (Open ERP), Hardik Ansodariy (OpenERP), ssu, rch-openerp, Bharat (OpenERP), ARA (OpenERP), aag (OpenERP), Yogesh (OpenERP), ron@tinyerp.com, mtr, fp, Mustufa Rangwala, Tejas (OpenERP), Anup (OpenERP), Atik Agewan (OpenERP)
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:41:35
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - decimal_precision
    - base
    - hr
    - base_setup
    - mail
    - base_tools
    - resource
    - process
    - board
    - survey
    - crm
    - base_action_rule
    - base_calendar
    - fetchmail
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Manages job positions and the recruitment process.
==================================================

It's integrated with the survey module to allow you to define interview for different jobs.

This module is integrated with the mail gateway to automatically tracks email
sent to jobs@YOURCOMPANY.com. It's also integrated with the document management
system to store and search in your CV base.
    

Code Analysis

Views touched (21)
XML IDNameModelTypeStatus
board_hr_applicants_status_form board.hr.applicants.status.form board.board xpath Inherits hr.board_hr_manager_form
crm_case_form_view_job Jobs - Recruitment Form hr.applicant form New
crm_case_graph_view_job Jobs - Recruitment Graph hr.applicant graph New
crm_case_tree_view_job Applicants hr.applicant tree New
hr_applicant_calendar_view Hr Applicants Calendar hr.applicant calendar New
hr_job_survey hr.job.form1 hr.job field Inherits hr.view_hr_job_form
hr_kanban_view_applicant Hr Applicants kanban hr.applicant kanban New
hr_recruitment_degree_form hr.recruitment.degree.form hr.recruitment.degree form New
hr_recruitment_degree_tree hr.recruitment.degree.tree hr.recruitment.degree tree New
hr_recruitment_source_form hr.recruitment.source.form hr.recruitment.source form New
hr_recruitment_source_tree hr.recruitment.source.tree hr.recruitment.source tree New
hr_recruitment_stage_form hr.recruitment.stage.form hr.recruitment.stage form New
hr_recruitment_stage_tree hr.recruitment.stage.tree hr.recruitment.stage tree New
view_applicants_status_tree applicants.status.tree hr.applicant tree New
view_crm_case_jobs_filter Jobs - Recruitment Search hr.applicant search New
view_hr_recruitment_hired_employee hr.recruitment.hired2employee.form hired.employee form New
view_hr_recruitment_partner_create hr.recruitment.partner.create.form hr.recruitment.partner.create form New
view_hr_recruitment_phonecall hr.recruitment.job2phonecall.form hr.recruitment.job2phonecall form New
view_hr_recruitment_report_graph hr.recruitment.report.graph hr.recruitment.report graph New
view_hr_recruitment_report_search hr.recruitment.report.search hr.recruitment.report search New
view_hr_recruitment_report_tree hr.recruitment.report.tree hr.recruitment.report tree New
Models touched (0)

No models found for this module.