19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:31:00 +01:00
parent a1137a1456
commit e1d89e11e3
2789 changed files with 1093187 additions and 605897 deletions

View file

@ -0,0 +1,40 @@
<?xml version="1.0"?>
<odoo>
<data>
<record id="hr_applicant_category_view_form" model="ir.ui.view">
<field name="name">hr.applicant.category.form</field>
<field name="model">hr.applicant.category</field>
<field name="arch" type="xml">
<form string="Tags">
<sheet>
<group>
<field name="name"/>
<field name="color"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="hr_applicant_category_view_tree" model="ir.ui.view">
<field name="name">hr.applicant.category.list</field>
<field name="model">hr.applicant.category</field>
<field name="arch" type="xml">
<list string="Tags" editable="bottom">
<field name="name"/>
<field name="color" widget="color_picker" />
</list>
</field>
</record>
<record id="hr_applicant_category_action" model="ir.actions.act_window">
<field name="name">Tags</field>
<field name="res_model">hr.applicant.category</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add a new tag
</p>
</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,46 @@
<?xml version="1.0"?>
<odoo>
<data>
<record id="hr_applicant_refuse_reason_view_form" model="ir.ui.view">
<field name="name">Applicant refuse reason form</field>
<field name="model">hr.applicant.refuse.reason</field>
<field name="arch" type="xml">
<form string="Refuse Reason">
<sheet>
<widget name="web_ribbon" text="Archived" bg_color="text-bg-danger" invisible="active"/>
<div class="oe_title">
<div class="oe_edit_only">
<label for="name"/>
</div>
<h1>
<field name="name"/>
</h1>
<field name="active" invisible="1"/>
</div>
<group>
<field name="template_id" context="{'default_model': 'hr.applicant'}"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="hr_applicant_refuse_reason_view_tree" model="ir.ui.view">
<field name="name">Applicant refuse reason list</field>
<field name="model">hr.applicant.refuse.reason</field>
<field name="arch" type="xml">
<list string="Refuse Reason" editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="template_id" context="{'default_model': 'hr.applicant'}"/>
</list>
</field>
</record>
<record id="hr_applicant_refuse_reason_action" model="ir.actions.act_window">
<field name="name">Refuse Reasons</field>
<field name="res_model">hr.applicant.refuse.reason</field>
<field name="view_mode">list,form</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,743 @@
<?xml version="1.0"?>
<odoo>
<record model="ir.ui.view" id="crm_case_tree_view_job">
<field name="name">Applicants</field>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
<list string="Applicants" class="o_search_matching_applicant" multi_edit="1" sample="1" decoration-danger="application_status == 'refused'" default_order="stage_id">
<header>
<button
name="action_job_add_applicants"
string="Create Applications"
invisible="context.get('default_job_id') or context.get('no_create_application_button')"
type="object"
/>
<button
name="action_talent_pool_add_applicants"
type="object"
class="btn-primary"
string="Add Applicants "
display="always"
invisible="not context.get('default_talent_pool_ids')"
groups="hr_recruitment.group_hr_recruitment_user"
/>
<button type="object"
name="archive_applicant"
string="Refuse" class="btn btn-secondary"
/>
</header>
<field name="message_needaction" column_invisible="True"/>
<field name="last_stage_id" column_invisible="True"/>
<field name="date_last_stage_update" column_invisible="True"/>
<field name="partner_name" string="Name" readonly="1" optional="show"/>
<field name="create_date" readonly="1" optional="show" options="{'show_time': False}"/>
<field name="email_from" readonly="1" optional="hide"/>
<field name="partner_phone" widget="phone" readonly="1" optional="hide"/>
<field name="job_id" optional="show" column_invisible="context.get('default_talent_pool_ids')"/>
<field name="stage_id" widget="badge_rotting" optional="show" column_invisible="context.get('default_talent_pool_ids')" options="{'no_open': True}"/>
<field name="priority" widget="priority" nolabel="1" optional="show"/>
<field name="categ_ids" widget="many2many_tags" options="{'color_field': 'color'}" optional="show"/>
<field name="user_id" widget="many2one_avatar_user" optional="show"/>
<field name="is_rotting" column_invisible="True"/>
<field name="rotting_days" column_invisible="True"/>
<field name="type_id" column_invisible="True"/>
<field name="application_status" optional="hide" invisible="application_status == 'ongoing'"/>
<field name="refuse_reason_id" optional='hide'/>
<field name="activity_ids" widget="list_activity" optional="hide"/>
<field name="activity_date_deadline" optional="hide"/>
<field name="interviewer_ids" widget="many2many_avatar_user" optional="hide"/>
<field name="medium_id" optional="hide"/>
<field name="source_id" readonly="1" optional="hide"/>
<field name="salary_expected" optional="hide"/>
<field name="salary_proposed" optional="hide"/>
<field name="availability" optional="hide"/>
<field name="department_id" readonly="1" column_invisible="context.get('invisible_department', True)" optional="hide"/>
<field name="company_id" column_invisible="True"/>
<field name="company_id" groups="base.group_multi_company" readonly="1" optional="hide"/>
</list>
</field>
</record>
<record id="hr_applicant_view_tree_activity" model="ir.ui.view">
<field name="name">hr.applicant.view.list.activity</field>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
<list string="Next Activities" decoration-danger="activity_date_deadline &lt; current_date" default_order="activity_date_deadline">
<field name="partner_id"/>
<field name="activity_date_deadline"/>
<field name="activity_type_id"/>
<field name="activity_summary"/>
<field name="stage_id"/>
<field name="activity_exception_decoration" widget="activity_exception"/>
</list>
</field>
</record>
<record model="ir.ui.view" id="hr_applicant_view_form">
<field name="name">Jobs - Recruitment Form</field>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
<form string="Jobs - Recruitment Form" class="o_applicant_form">
<field name="company_id" invisible="1"/>
<field name="application_status" invisible="1"/>
<field name="employee_id" invisible="1"/>
<field name="meeting_ids" invisible="1"/>
<field name="refuse_reason_id" invisible="1"/>
<field name="email_normalized" invisible="1"/>
<field name="partner_phone_sanitized" invisible="1"/>
<field name="emp_is_active" invisible="1"/>
<field name="is_rotting" invisible="1"/>
<field name="rotting_days" invisible="1"/>
<header>
<button string="Create Employee" name="create_employee_from_applicant" type="object" data-hotkey="q" groups="hr.group_hr_user"
class="o_create_employee" invisible="employee_id or not active or not date_closed"/>
<button string="Refuse" name="archive_applicant" type="object" invisible="not active or is_pool_applicant" data-hotkey="d"/>
<button string="Restore" name="action_unarchive" type="object" invisible="active" data-hotkey="x"/>
<field name="stage_id" widget="rotting_statusbar_duration" options="{'clickable': '1'}" invisible="(not active and not employee_id) or is_pool_applicant"/>
<button string="Create Applications" name="action_job_add_applicants" type="object" invisible="not is_pool_applicant"/>
<button string="Add to Pool" name="action_talent_pool_add_applicants" type="object" invisible="is_pool_applicant or is_applicant_in_pool"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_open_employee"
type="object"
class="oe_stat_button"
icon="fa-id-card-o"
groups="hr.group_hr_user"
invisible="not (employee_id or emp_is_active)">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value"><field name="employee_name" readonly="1"/></span>
<span class="o_stat_text">Employee</span>
</div>
</button>
<button name="action_open_applications"
class="oe_stat_button"
icon="fa-pencil"
type="object"
context="{'active_test': False}"
invisible="not application_count or (application_count &lt;= 1 and not is_pool_applicant)">
<field name="application_count" widget="statinfo" string="Applications"/>
</button>
<button name="action_create_meeting" class="oe_stat_button" icon="fa-calendar" type="object" invisible="not id">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text"><field name="meeting_display_text" /></span>
<span class="o_stat_value"><field name="meeting_display_date" readonly="1"/></span>
</div>
</button>
<button
name="action_talent_pool_stat_button"
class="oe_stat_button"
icon="fa-users"
type="object"
invisible="not id or is_pool_applicant or not is_applicant_in_pool"
groups="hr_recruitment.group_hr_recruitment_user">
<field name="talent_pool_count" widget="statinfo" string="Talent Pools"/>
</button>
</div>
<!-- Job pipe ribbons -->
<widget name="web_ribbon" title="Refused" bg_color="text-bg-danger" invisible="application_status != 'refused'"/>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-secondary" invisible="application_status != 'archived'"/>
<widget name="web_ribbon" title="Hired" invisible="application_status != 'hired'" />
<field name="active" invisible="1"/>
<field name="legend_normal" invisible="1"/>
<field name="legend_blocked" invisible="1"/>
<field name="legend_waiting" invisible="1"/>
<field name="legend_done" invisible="1"/>
<field name="kanban_state" widget="hr_applicant_state_selection" invisible="application_status == 'refused' or application_status == 'archived' or is_pool_applicant" class="o_field_state_selection"/>
<div class="oe_title pe-0">
<label for="partner_name" class="oe_edit_only" string="Applicant" invisible="is_pool_applicant"/>
<label for="partner_name" class="oe_edit_only" string="Talent" invisible="not is_pool_applicant"/>
<h1 class="d-flex justify-content-between align-items-center me-4">
<field name="partner_name" options="{'line_breaks': False}" context="{'default_company_id': company_id}" required="1"/>
</h1>
</div>
<group>
<group>
<field name="partner_name" invisible="1"/>
<field name="partner_id" invisible="1" />
<field name="refuse_reason_id" invisible="active"/>
<field name="email_from" placeholder="e.g. john.doe@example.com" widget="email"/>
<field name="partner_phone" widget="phone"/>
<field name="linkedin_profile" placeholder="e.g. https://www.linkedin.com/in/..." widget="url"/>
</group>
<group>
<field name="priority" widget="priority"/>
<field name="job_id" invisible="is_pool_applicant" placeholder="Spontaneous application"/>
<field name="talent_pool_ids" widget="many2many_tags" options="{'color_field': 'color'}" invisible="not is_pool_applicant"/>
<field name="user_id" widget="many2one_avatar_user" placeholder="Unassigned"/>
<field name="interviewer_ids" options="{'no_create': True}" widget="many2many_avatar_user" invisible="is_pool_applicant" placeholder="Who can access applicants" />
<field name="date_closed" invisible="not date_closed" />
<field name="categ_ids" placeholder="e.g. Trainee" widget="many2many_tags" options="{'color_field': 'color', 'no_create_edit': True}"/>
</group>
</group>
<field name="applicant_properties" columns="2"/>
<notebook>
<page string="Note" name="application_note">
<field name="applicant_notes" type="html" options="{'collaborative': true, 'resizable': false}" placeholder="Add private notes about this applicant..."/>
</page>
<page string="Details" name="application_details">
<group>
<group string="Applicant">
<field name="type_id" placeholder="e.g. Masters"/>
<field name="availability" placeholder="Directly"/>
</group>
<group string="Job">
<field name="department_id"/>
<field name="company_id" groups="base.group_multi_company" options='{"no_open":True}' placeholder="Visible to all"/>
</group>
</group>
<group>
<group string="Salary Package" name="recruitment_contract" groups="hr_recruitment.group_hr_recruitment_user">
<label for="salary_expected"/>
<div class="o_row">
<field name="salary_expected" placeholder="Expected"/>
<span invisible="not salary_expected_extra"> + </span>
<field name="salary_expected_extra" placeholder="Other benefits"/>
</div>
<label for="salary_proposed"/>
<div class="o_row">
<field name="salary_proposed"/>
<span invisible="not salary_proposed_extra"> + </span>
<field name="salary_proposed_extra" placeholder="Other benefits"/>
</div>
</group>
<group string="Sourcing">
<field name="source_id" placeholder="Select where the applicant comes from"/>
<field name="medium_id" placeholder="Select the way applicant found the offer"/>
<field name="campaign_id" placeholder="Select the campaign the applicant was part of"/>
</group>
</group>
</page>
</notebook>
</sheet>
<div class="o_attachment_preview" groups="hr_recruitment.group_applicant_cv_display"/>
<chatter open_attachments="True" reload_on_attachment="True"/>
</form>
</field>
</record>
<record id="hr_applicant_view_form_interviewer" model="ir.ui.view">
<field name="model">hr.applicant</field>
<field name="inherit_id" ref="hr_applicant_view_form"/>
<field name="priority">50</field>
<field name="mode">primary</field>
<field name="arch" type="xml">
<xpath expr="//form" position="attributes">
<attribute name="js_class">hr_recruitment_interviewer</attribute>
<attribute name="class">o_applicant_form</attribute>
</xpath>
<xpath expr="//group[@name='recruitment_contract']" position="replace"/>
</field>
</record>
<record model="ir.ui.view" id="crm_case_pivot_view_job">
<field name="name">Jobs - Recruitment</field>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
<pivot string="Job Applications" sample="1">
<field name="job_id" type="row"/>
<field name="stage_id" type="col"/>
<field name="color" invisible="1"/>
</pivot>
</field>
</record>
<record model="ir.ui.view" id="crm_case_graph_view_job">
<field name="name">Jobs - Recruitment Graph</field>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
<graph string="Cases By Stage and Estimates" sample="1">
<field name="stage_id"/>
</graph>
</field>
</record>
<record id="hr_applicant_view_search_bis" model="ir.ui.view">
<field name="name">hr.applicant.view.search</field>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
<search string="Search Applicants">
<field string="Applicant" name="partner_name"
filter_domain="['|', ('partner_name', 'ilike', self), ('email_from', 'ilike', self)]"/>
<field string="Email" name="email_from" filter_domain="[('email_from', 'ilike', self)]"/>
<field name="job_id"/>
<field name="department_id" operator="child_of"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="user_id"/>
<field name="stage_id" domain="[]"/>
<field name="categ_ids"/>
<field name="refuse_reason_id"/>
<field name="application_status"/>
<field name="date_closed"/>
<field name="activity_user_id" string="Activities of"/>
<field name="activity_type_id" string="Activity type"/>
<field name="attachment_ids" filter_domain="[('attachment_ids', 'any', [('index_content', 'ilike', self), ('res_model', '=', 'hr.applicant')])]" string="Resume's content"/>
<filter string="My Applications" name="my_applications" domain="[('user_id', '=', uid)]"/>
<filter string="Unassigned" name="unassigned" domain="[('user_id', '=', False)]"/>
<separator/>
<filter string="Applicants" name="applicants" domain="[('talent_pool_ids', '=', False)]"/>
<filter string="Talents" name="talents" domain="[('talent_pool_ids', '!=', False)]"/>
<separator/>
<filter string="In Progress" name="ongoing" domain="[('date_closed', '=', False), ('active', '=', True), ('refuse_reason_id', '=', False)]"/>
<filter string="Hired" name="hired" domain="[('date_closed', '!=', False)]"/>
<separator/>
<filter string="Ready for Next Stage" name="done" domain="[('kanban_state', '=', 'done')]"/>
<filter string="Waiting" name="waiting" domain="[('kanban_state', '=', 'waiting')]"/>
<filter string="Blocked" name="blocked" domain="[('kanban_state', '=', 'blocked')]"/>
<filter string="Rotting" name="filter_rotting" domain="[('is_rotting', '=', True)]"/>
<separator/>
<filter string="Directly Available" name="applicant_availability" domain="['|',('availability', '&lt;=', 'today'),('availability','=', False)]"/>
<separator/>
<filter string="Creation Date" name="filter_create" date="create_date"/>
<filter string="Last Stage Update" name="filter_date_last_stage_update" date="date_last_stage_update"/>
<separator/>
<filter string="Unread Messages" name="message_needaction" domain="[('message_needaction', '=', True)]" groups="mail.group_mail_notification_type_inbox"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active', '=', False), ('refuse_reason_id', '=', False)]"/>
<filter string="Refused" name="refused" domain="[('active', '=', False), ('refuse_reason_id', '!=', False)]"/>
<separator/>
<filter invisible="1" string="My Activities" name="filter_activities_my"
domain="[('activity_user_id', '=', uid)]"/>
<separator invisible="1"/>
<filter invisible="1" string="Late Activities" name="activities_overdue"
domain="[('my_activity_date_deadline', '&lt;', 'today')]"
help="Show all records whose next activity date is past"/>
<filter invisible="1" string="Today Activities" name="activities_today"
domain="[('my_activity_date_deadline', '=', 'today')]"/>
<filter invisible="1" string="Future Activities" name="activities_upcoming_all"
domain="[('my_activity_date_deadline', '&gt;', 'today')]"/>
<separator/>
<filter invisible="1" string="Running Applicants" name="running_applicant_activities"
domain="[('stage_id.hired_stage', '=', False)]"/>
<separator/>
<group>
<filter string="Job" name="job" domain="[]" context="{'group_by': 'job_id'}"/>
<filter string="Stage" name="stage" domain="[]" context="{'group_by': 'stage_id'}"/>
<filter string="Responsible" name="responsible" domain="[]" context="{'group_by': 'user_id'}"/>
<filter string="Talent Pool" name="talent_pool" domain="[]" context="{'group_by': 'talent_pool_ids'}"/>
<filter string="Creation Date" name="creation_date" context="{'group_by': 'create_date'}"/>
<filter string="Hiring Date" name="hired_date" context="{'group_by': 'date_closed'}"/>
<filter string="Last Stage Update" name="last_stage_update" context="{'group_by': 'date_last_stage_update'}"/>
<filter string="Refuse Reason" name="refuse_reason_id" domain="[]" context="{'group_by': 'refuse_reason_id'}"/>
<filter string="Company" name="company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Properties" name="group_by_applicant_properties" context="{'group_by': 'applicant_properties'}"/>
</group>
</search>
</field>
</record>
<record model="ir.ui.view" id="hr_applicant_calendar_view">
<field name="name">Hr Applicants Calendar</field>
<field name="model">hr.applicant</field>
<field name="priority" eval="2"/>
<field name="arch" type="xml">
<calendar
string="Applicants"
mode="month"
date_start="activity_date_deadline"
color="user_id"
event_limit="5"
hide_time="true"
quick_create="0"
>
<field name="partner_name"/>
<field name="job_id"/>
<field name="priority" widget="priority"/>
<field name="user_id" filters="1" invisible="1"/>
<field name="activity_summary"/>
</calendar>
</field>
</record>
<record id="quick_create_applicant_form" model="ir.ui.view">
<field name="name">hr.applicant.form.quick_create</field>
<field name="model">hr.applicant</field>
<field name="priority">1000</field>
<field name="arch" type="xml">
<form>
<group>
<field name="partner_name" options="{'no_create_edit': True}" placeholder="e.g. John Doe"/>
<field name="job_id" options="{'no_open': True}"/>
<field name="company_id" invisible="1"/>
</group>
</form>
</field>
</record>
<!-- Hr Applicant Kanban View -->
<record model="ir.ui.view" id="hr_kanban_view_applicant">
<field name="name">Hr Applicants kanban</field>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
<kanban highlight_color="color" default_group_by="stage_id" class="o_kanban_applicant o_search_matching_applicant" quick_create_view="hr_recruitment.quick_create_applicant_form" sample="1"
js_class="rotting_kanban">
<header>
<button
name="action_talent_pool_add_applicants"
type="object"
class="btn-primary"
string="Add Applicants "
display="always"
invisible="not context.get('default_talent_pool_ids')"
groups="hr_recruitment.group_hr_recruitment_user"
/>
</header>
<field name="stage_id" options='{"group_by_tooltip": {"requirements": "Requirements"}}'/>
<field name="legend_normal"/>
<field name="legend_blocked"/>
<field name="legend_waiting"/>
<field name="legend_done"/>
<field name="date_closed"/>
<field name="color"/>
<field name="user_id"/>
<field name="active"/>
<field name="application_status" />
<field name="company_id" invisible="1"/> <!-- We need to keep this field as it is used in the domain of user_id in the model -->
<progressbar field="kanban_state" colors='{"done": "success", "waiting": "warning", "blocked": "danger"}'/>
<templates>
<t t-name="menu">
<a role="menuitem" name="action_create_meeting" type="object" class="dropdown-item">Schedule Interview</a>
<a role="menuitem" name="archive_applicant" type="object" class="dropdown-item">Refuse</a>
<a t-if="record.active.raw_value" role="menuitem" type="archive" class="dropdown-item">Archive</a>
<a t-if="!record.active.raw_value" role="menuitem" type="unarchive" class="dropdown-item">Unarchive</a>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<a role="menuitem" name="action_talent_pool_add_applicants" type="object" class="dropdown-item"
invisible="is_pool_applicant or is_applicant_in_pool">Add to Pool</a>
</t>
<t t-name="card">
<widget name="web_ribbon" title="Hired" bg_color="text-bg-success" invisible="not date_closed"/>
<widget name="web_ribbon" title="Refused" bg_color="text-bg-danger" invisible="application_status != 'refused'"/>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-secondary" invisible="application_status != 'archived'"/>
<field t-if="record.partner_name.raw_value" class="fw-bold fs-5" name="partner_name"/>
<field name="job_id" invisible="context.get('search_default_job_id', False) or is_pool_applicant"/>
<field name="categ_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
<field name="applicant_properties" widget="properties"/>
<footer>
<field name="priority" widget="priority"/>
<field class="ms-1 align-items-center" name="activity_ids" widget="kanban_activity"/>
<field name="is_rotting" invisible="1"/>
<field name="rotting_days" class="d-flex" widget="rotting"/>
<div class="d-flex ms-auto align-items-center">
<a name="action_open_attachments" type="object">
<i class='fa fa-paperclip' role="img" aria-label="Documents"/>
<field name="attachment_number"/>
</a>
<field name="kanban_state" class="mx-1" widget="hr_applicant_state_selection"/>
<field name="user_id" widget="many2one_avatar_user"/>
</div>
</footer>
</t>
</templates>
</kanban>
</field>
</record>
<record id="hr_applicant_view_activity" model="ir.ui.view">
<field name="name">hr.applicant.activity</field>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
<activity string="Applicants">
<templates>
<div t-name="activity-box" class="o_hr_applicant_view_activity">
<field name="user_id" widget="many2one_avatar_user"/>
<div class="flex-grow-1 ms-1">
<field name="partner_name" muted="1" display="full" class="o_text_block"/>
</div>
</div>
</templates>
</activity>
</field>
</record>
<record model="ir.actions.act_window" id="action_hr_job_applications">
<field name="name">Applications</field>
<field name="res_model">hr.applicant</field>
<field name="view_mode">kanban,list,form,graph,calendar,pivot,activity</field>
<field name="search_view_id" ref="hr_applicant_view_search_bis"/>
<field name="context">{
'search_default_job_id': [active_id],
'search_default_applicants': 1,
'default_job_id': active_id,
'dialog_size':'medium',
'allow_search_matching_applicants': 1
}</field>
<field name="help" type="html">
<p class="o_view_nocontent_empty_folder">
No applications yet
</p><p>
Odoo helps you track applicants in the recruitment
process and follow up all operations: meetings, interviews, etc.
</p><p>
Applicants and their attached résumé are created automatically when an email is sent.
If you install the document management modules, all resumes are indexed automatically,
so that you can easily search through their content.
</p>
</field>
</record>
<record id="hr_kanban_view_applicant_talent_pool" model="ir.ui.view">
<field name="model">hr.applicant</field>
<field name="inherit_id" ref="hr_recruitment.hr_kanban_view_applicant"/>
<field name="mode">primary</field>
<field name="arch" type="xml">
<xpath expr="//kanban" position="attributes">
<attribute name="default_group_by"></attribute>
</xpath>
</field>
</record>
<record id="action_hr_talent_pool_applications" model="ir.actions.act_window">
<field name="name">Talents</field>
<field name="res_model">hr.applicant</field>
<field name="domain">[
('talent_pool_ids', '=', active_ids),
]</field>
<field name="view_mode">list,kanban,form,graph,calendar,pivot,activity</field>
<field name="view_ids" eval="[
(5, 0, 0),
(0, 0, {'view_mode': 'list'}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('hr_kanban_view_applicant_talent_pool')})]"/>
<field name="context">{'default_talent_pool_ids': active_ids}</field>
<field name="help" type="html">
<p class="o_view_nocontent_empty_folder">
No Talents in the pool yet
</p>
<p>
Try adding some to the pool
</p>
</field>
</record>
<record model="ir.actions.act_window" id="action_hr_applicant_new">
<field name="res_model">hr.applicant</field>
<field name="view_mode">form</field>
<field name="context">{'default_job_id': active_id}</field>
</record>
<!-- Job Opportunities (menu) -->
<record model="ir.actions.act_window" id="crm_case_categ0_act_job">
<field name="name">Applications</field>
<field name="res_model">hr.applicant</field>
<field name="path">recruitment-applications</field>
<field name="view_mode">kanban,list,form,pivot,graph,calendar,activity</field>
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="hr_applicant_view_search_bis"/>
<field name="context">{'search_default_applicants': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_empty_folder">
No applications yet
</p><p>
Odoo helps you track applicants in the recruitment
process and follow up all operations: meetings, interviews, etc.
</p><p>
Applicants and their attached résumé are created automatically when an email is sent.
If you install the document management modules, all resumes are indexed automatically,
so that you can easily search through their content.
</p>
</field>
</record>
<record id="hr_applicant_action_from_department" model="ir.actions.act_window">
<field name="name">New Applications</field>
<field name="res_model">hr.applicant</field>
<field name="view_mode">list,kanban,form,graph,calendar,pivot</field>
<field name="context">{
'search_default_department_id': active_id,
'default_department_id': active_id,
'invisible_department': False}
</field>
<field name="domain">[('stage_id.sequence','&lt;=','1')]</field>
</record>
<record model="ir.actions.act_window.view" id="action_hr_sec_kanban_view_act_job">
<field name="sequence" eval="1"/>
<field name="view_mode">kanban</field>
<field name="view_id" ref="hr_kanban_view_applicant"/>
<field name="act_window_id" ref="crm_case_categ0_act_job"/>
</record>
<record model="ir.actions.act_window.view" id="action_hr_sec_tree_view_act_job">
<field name="sequence" eval="0"/>
<field name="view_mode">list</field>
<field name="view_id" ref="crm_case_tree_view_job"/>
<field name="act_window_id" ref="crm_case_categ0_act_job"/>
</record>
<record model="ir.actions.act_window.view" id="action_hr_sec_form_view_act_job">
<field name="sequence" eval="2"/>
<field name="view_mode">form</field>
<field name="view_id" ref="hr_applicant_view_form"/>
<field name="act_window_id" ref="crm_case_categ0_act_job"/>
</record>
<record id="hr_applicant_action_view_pivot" model="ir.actions.act_window.view">
<field name="sequence" eval="3"/>
<field name="view_mode">pivot</field>
<field name="view_id" ref="crm_case_pivot_view_job"/>
<field name="act_window_id" ref="crm_case_categ0_act_job"/>
</record>
<record id="action_hr_sec_graph_view_act_job" model="ir.actions.act_window.view">
<field name="sequence" eval="4"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="crm_case_graph_view_job"/>
<field name="act_window_id" ref="crm_case_categ0_act_job"/>
</record>
<record id="hr_applicant_view_pivot" model="ir.ui.view">
<field name="name">hr.applicant.pivot</field>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
<pivot string="Recruitment Analysis" sample="1">
<field name="stage_id" type="row"/>
<field name="job_id" type="col"/>
<field name="partner_name"/>
</pivot>
</field>
</record>
<record id="hr_applicant_view_graph" model="ir.ui.view">
<field name="name">hr.applicant.graph</field>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
<graph string="Recruitment Analysis" sample="1">
<field name="stage_id"/>
<field name="job_id"/>
</graph>
</field>
</record>
<record id="hr_applicant_view_search" model="ir.ui.view">
<field name="name">hr.applicant.search</field>
<field name="model">hr.applicant</field>
<field name="priority">32</field>
<field name="arch" type="xml">
<search string="Recruitment Analysis">
<field name="job_id"/>
<field name="department_id" operator="child_of"/>
<field name="user_id"/>
<filter string="Creation Date" name="year" date="create_date" default_period="year"/>
<separator/>
<filter string="Unassigned" name="unassigned" domain="[('user_id', '=', False)]"/>
<separator/>
<filter string="New" name="new" domain="[('stage_id.sequence', '=', 1)]"/>
<separator/>
<filter string="Ongoing" name="ongoing" domain="[('active', '=', True)]"/>
<filter string="Refused" name="refused" domain="[('active', '=', False)]"/>
<separator/>
<filter string="Archived" name="archived" domain="[('active', '=', False)]"/>
<separator/>
<group>
<field name="priority"/>
<field name="stage_id"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="create_date"/>
<field name="date_closed"/>
</group>
<group>
<filter string="Responsible" name='User' context="{'group_by':'user_id'}"/>
<filter string="Company" name="company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Jobs" name="job" context="{'group_by':'job_id'}"/>
<filter string="Department" name="department" context="{'group_by':'department_id'}"/>
<filter string="Tags" name="group_by_categ_ids" context="{'group_by':'categ_ids'}"/>
<filter string="Stage" name="stage" context="{'group_by':'stage_id'}" />
<separator/>
<filter string="Creation Date" name="creation_month" context="{'group_by':'create_date:month'}" help="Creation Date"/>
</group>
</search>
</field>
</record>
<record id="hr_applicant_action_analysis" model="ir.actions.act_window">
<field name="name">Recruitment Analysis</field>
<field name="res_model">hr.applicant</field>
<field name="view_mode">graph,pivot</field>
<field name="search_view_id" ref="hr_applicant_view_search"/>
<field name="view_ids" eval="[
(5, 0, 0),
(0, 0, {'view_mode': 'graph', 'view_id': ref('hr_applicant_view_graph')}),
(0, 0, {'view_mode': 'pivot', 'view_id': ref('hr_applicant_view_pivot')})]"/>
<field name="context">{'search_default_creation_month': 1, 'search_default_job': 2}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No data yet!
</p>
</field>
</record>
<record id="action_hr_recruitment_report_filtered_department" model="ir.actions.act_window">
<field name="name">Recruitment Analysis</field>
<field name="res_model">hr.applicant</field>
<field name="view_mode">graph,pivot</field>
<field name="search_view_id" ref="hr_applicant_view_search"/>
<field name="context">{
'search_default_department_id': [active_id],
'default_department_id': active_id}
</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No data yet!
</p>
</field>
</record>
<record id="action_hr_recruitment_report_filtered_job" model="ir.actions.act_window">
<field name="name">Recruitment Analysis</field>
<field name="res_model">hr.applicant</field>
<field name="view_mode">graph,pivot</field>
<field name="search_view_id" ref="hr_applicant_view_search"/>
<field name="context">{
'search_default_creation_month': 1,
'search_default_job_id': [active_id],
'default_job_id': active_id}
</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No data yet!
</p>
</field>
</record>
<record id="action_applicant_send_mail" model="ir.actions.server">
<field name="name">Send Email</field>
<field name="model_id" ref="hr_recruitment.model_hr_applicant"/>
<field name="sequence">1</field>
<field name="binding_model_id" ref="hr_recruitment.model_hr_applicant"/>
<field name="binding_view_types">list,kanban</field>
<field name="state">code</field>
<field name="code">action = records.action_send_email()</field>
</record>
<!-- Custom reports (aka filters) -->
<record id="hr_applicant_filter_recruiter" model="ir.filters">
<field name="name">By Recruiter</field>
<field name="model_id">hr.applicant</field>
<field name="user_ids" eval="False"/>
<field name="action_id" ref="hr_applicant_action_analysis"/>
<field name="context">{'group_by': ['create_date:month', 'user_id']}</field>
</record>
<record id="hr_applicant_filter_job" model="ir.filters">
<field name="name">By Job</field>
<field name="model_id">hr.applicant</field>
<field name="user_ids" eval="False"/>
<field name="action_id" ref="hr_applicant_action_analysis"/>
<field name="context">{'group_by': ['create_date:month', 'job_id']}</field>
</record>
<record id="hr_applicant_filter_department" model="ir.filters">
<field name="name">By Department</field>
<field name="model_id">hr.applicant</field>
<field name="user_ids" eval="False"/>
<field name="action_id" ref="hr_applicant_action_analysis"/>
<field name="context">{'group_by': ['create_date:month', 'department_id']}</field>
</record>
<record id="mail_followers_edit_action_from_hr_recruitment" model="ir.actions.act_window">
<field name="name">Add/Remove Followers</field>
<field name="res_model">mail.followers.edit</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="context">{'default_res_model': 'hr.applicant', 'default_res_ids': active_ids}</field>
<field name="binding_model_id" ref="hr_recruitment.model_hr_applicant"/>
<field name="binding_view_types">list,kanban</field>
</record>
</odoo>

View file

@ -6,31 +6,21 @@
<field name="inherit_id" ref="hr.hr_department_view_kanban"/>
<field name="arch" type="xml">
<data>
<xpath expr="//templates" position="before">
<t groups="hr_recruitment.group_hr_recruitment_user">
<field name="new_applicant_count"/>
<field name="new_hired_employee"/>
<field name="expected_employee"/>
</t>
</xpath>
<xpath expr="//div[hasclass('o_kanban_primary_right')]" position="inside">
<t groups="hr_recruitment.group_hr_recruitment_user">
<div t-if="record.new_applicant_count.raw_value > 0" class="row ml16">
<div class="col">
<a name="%(hr_applicant_action_from_department)d" type="action">
<field name="new_applicant_count"/> New Applicants
</a>
</div>
</div>
</t>
<xpath expr="//div[@name='kanban_primary_right']" position="inside">
<div t-if="record.new_applicant_count.raw_value > 0" class="row g-0 ml32" groups="hr_recruitment.group_hr_recruitment_user">
<a name="%(hr_applicant_action_from_department)d" class="col" type="action">
<field name="new_applicant_count"/> New Applicants
</a>
</div>
</xpath>
<xpath expr="//div[hasclass('o_kanban_manage_reports')]" position="inside">
<a role="menuitem" class="dropdown-item" name="%(action_hr_recruitment_report_filtered_department)d"
type="action" groups="hr_recruitment.group_hr_recruitment_user">
Recruitments
</a>
<div role="menuitem">
<a class="dropdown-item" name="%(action_hr_recruitment_report_filtered_department)d"
type="action" groups="hr_recruitment.group_hr_recruitment_interviewer">
Recruitment
</a>
</div>
</xpath>
</data>
</field>
@ -39,9 +29,6 @@
<record id="action_hr_department" model="ir.actions.act_window">
<field name="name">Departments</field>
<field name="res_model">hr.department</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
</record>
<menuitem id="menu_hr_department" name="Departments"
parent="menu_hr_recruitment_config_employees" action="action_hr_department"/>
</odoo>

View file

@ -11,116 +11,207 @@
<field name="name">hr.job.kanban</field>
<field name="model">hr.job</field>
<field name="arch" type="xml">
<kanban class="oe_background_grey o_kanban_dashboard o_hr_recruitment_kanban" on_create="hr_recruitment.create_job_simple" sample="1" limit="40" action="%(action_hr_job_applications)d" type="action">
<kanban highlight_color="color"
class="o_hr_recruitment_kanban"
on_create="hr_recruitment.create_job_simple"
sample="1"
limit="40"
action="%(action_hr_job_applications)d"
type="action"
js_class="recruitment_kanban_view"
>
<field name="active"/>
<field name="name"/>
<field name="alias_name"/>
<field name="alias_domain"/>
<field name="is_favorite"/>
<field name="department_id"/>
<field name="no_of_recruitment"/>
<field name="color"/>
<field name="new_application_count"/>
<field name="no_of_hired_employee"/>
<field name="manager_id"/>
<field name="user_id"/>
<field name="application_count"/>
<field name="alias_email"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''}">
<div class="o_kanban_card_header">
<div class="o_kanban_card_header_title">
<field name="is_favorite" widget="boolean_favorite" nolabel="1"/>
<div class="o_primary ps-3">
<span class="o_text_overflow"><t t-esc="record.name.value"/></span>
<t t-name="menu" groups="hr_recruitment.group_hr_recruitment_user">
<div class="container">
<div class="row">
<div class="col-6">
<h5 role="menuitem" class="o_kanban_card_manage_title">
<span>View</span>
</h5>
<div role="menuitem" name="menu_view_applications">
<a name="%(action_hr_job_applications)d" type="action">Applications</a>
</div>
<div class="ps-3 text-muted">
<field name="user_id" />
<div role="menuitem">
<a name="action_open_activities" type="object">Activities</a>
</div>
<div class="ps-3 o_secondary" groups="base.group_multi_company">
<small><i class="fa fa-building-o" role="img" aria-label="Company" title="Company"></i> <field name="company_id"/></small>
</div>
<div t-if="record.alias_name.value and record.alias_domain.value" class="ps-3 o_secondary o_job_alias">
<small><i class="fa fa-envelope-o" role="img" aria-label="Alias" title="Alias"></i> <field name="alias_id"/></small>
<div role="menuitem" name="menu_view_job_posts">
<a name="%(action_hr_job_sources)d" type="action" context="{'default_job_id': id}">Trackers</a>
</div>
</div>
<div class="o_kanban_manage_button_section" groups="hr_recruitment.group_hr_recruitment_user">
<a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
<div class="col-6">
<h5 role="menuitem" class="o_kanban_card_manage_title">
<span>New</span>
</h5>
<div role="menuitem" name="menu_new_applications">
<a name="%(hr_recruitment.action_hr_applicant_new)d" type="action">Application</a>
</div>
</div>
<div class="col-6">
<h5 role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</h5>
<div role="menuitem" name="kanban_job_reporting">
<a name="%(hr_recruitment.action_hr_recruitment_report_filtered_job)d" type="action">Analysis</a>
</div>
</div>
</div>
<div class="container o_recruitment_job_container o_kanban_card_content mt-0 mt-sm-3">
<div class="row">
<div class="col-7">
<button class="btn btn-primary" name="%(action_hr_job_applications)d" type="action">
<field name="new_application_count"/> New Applications
</button>
<div class="o_kanban_card_manage_settings row">
<div class="col-6" role="menuitem" aria-haspopup="true">
<field name="color" widget="kanban_color_picker"/>
</div>
<div class="col-6" role="menuitem">
<a class="dropdown-item" t-if="widget.editable" name="edit_job" type="open">Configuration</a>
<a class="dropdown-item" t-if="record.active.raw_value" type="archive" >Archive</a>
<a class="dropdown-item" t-if="!record.active.raw_value" name="action_unarchive" type="object">Unarchive</a>
</div>
</div>
</div>
</t>
<t t-name="card">
<div class="o_hr_recruitment_kanban_card_large_screen">
<main>
<div class="d-flex flex-row align-content-center ms-2">
<div class="col-3 d-flex flex-column align-self-center o_kanban_card_header">
<div class="d-flex flex-row justify-content-between">
<div class="d-flex fw-bold fs-3 o_kanban_card_header_title">
<field name="is_favorite" widget="boolean_favorite" nolabel="1"/>
<field class="fs-3" name="name"/>
</div>
<div t-if="record.alias_email.value" class="d-flex flex-wrap">
<field name="alias_id"
groups="hr_recruitment.group_hr_recruitment_interviewer"/>
</div>
</div>
<div class="d-flex flex-row"
groups="hr_recruitment.group_hr_recruitment_interviewer,hr.group_hr_user">
<div class="col">
<div groups="!base.group_multi_company">
<field name="user_id" widget="many2one_avatar_user"
options="{'display_avatar_name': True}"/>
</div>
<div groups="base.group_multi_company">
<t t-if="record.company_id.raw_value != 0">
<div class="d-flex flex-row align-items-center">
<field name="user_id" widget="many2one_avatar_user"
options="{'display_avatar_name': False}"/>
<field class="ms-1" name="company_id"/>
</div>
</t>
<t t-else="">
<field name="user_id" widget="many2one_avatar_user"
options="{'display_avatar_name': True}"/>
</t>
</div>
</div>
</div>
</div>
<ul class="col-5 o_job_activities">
<li>
<a name="edit_job" type="edit" t-attf-class="{{ record.no_of_recruitment.raw_value > 0 ? 'to-recruit' : 'text-secondary' }}" groups="!hr_recruitment.group_hr_recruitment_interviewer">
<field name="no_of_recruitment"/> To Recruit
</a>
<span t-attf-class="{{ record.no_of_recruitment.raw_value > 0 ? 'to-recruit' : 'text-secondary' }}" groups="hr_recruitment.group_hr_recruitment_interviewer">
<field name="no_of_recruitment"/> To Recruit
<div class="col align-content-center">
<div class="d-flex justify-content-center">
<field name="no_of_recruitment" class="number"/>
<div class="number_description fs-4 lh-1">
to<br/>recruit
</div>
</div>
</div>
<div class="col align-content-center"
groups="hr_recruitment.group_hr_recruitment_interviewer">
<div class="d-flex justify-content-center">
<field name="new_application_count" class="number"/>
<div class="number_description text-body-secondary fs-4 lh-1">
new<br/>applications
</div>
</div>
</div>
<div class="col align-content-center"
groups="hr_recruitment.group_hr_recruitment_interviewer">
<div class="d-flex justify-content-center">
<field name="open_application_count" class="number"/>
<div class=" number_description text-body-secondary fs-4 lh-1">
in<br/>progress
</div>
</div>
</div>
<div class="col align-content-center"
groups="hr_recruitment.group_hr_recruitment_interviewer">
<div class="d-flex flex-row justify-content-center mt-1">
<div class="position-relative">
<button name="action_open_activities" type="object" class="ps-1 pe-1 pt-0 pb-0">
<i class="fa fa-2x fa-clock-o" role="img" aria-label="Activities"></i>
<span class="activity_badge position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger text-light">
<field name="activity_count"/>
</span>
</button>
</div>
</div>
</div>
<div class="col align-content-center me-5">
<div class="d-flex justify-content-center">
<div name="large_screen_job_page_div" class="me-2" invisible="1">
<button class="btn btn-primary" name="%(action_hr_job_applications)d" type="action">
Job Page
</button>
</div>
<button class="btn btn-secondary" type="open">
Configure
</button>
</div>
</div>
</div>
</main>
</div>
<div class="o_hr_recruitment_kanban_card_mobile_screen">
<main>
<div class="d-flex flex-column gap-1 mb-1">
<div class="mb-2">
<div class="d-flex fw-bold fs-3">
<field name="is_favorite" widget="boolean_favorite" nolabel="1"/>
<field name="name"/>
</div>
<div t-if="record.alias_email.value" class="d-flex flex-wrap">
<field name="alias_id"
groups="hr_recruitment.group_hr_recruitment_interviewer"/>
</div>
</div>
<div class="d-flex flex-row"
groups="hr_recruitment.group_hr_recruitment_interviewer">
<div class="col-1 align-content-end me-1">
<div class="d-flex flex-row justify-content-center">
<field name="user_id" widget="many2one_avatar_user"
options="{'display_avatar_name': False}"/>
</div>
</div>
<div class="col align-content-end">
<div groups="base.group_multi_company">
<t t-if="record.company_id.raw_value != 0">
<field name="company_id"/>
</t>
<t t-else="">
<field name="user_id"/>
</t>
</div>
<div groups="!base.group_multi_company">
<field name="user_id"/>
</div>
</div>
</div>
<div class="d-flex flex-row"
groups="hr_recruitment.group_hr_recruitment_interviewer">
<div class="col-1 align-content-end me-1">
<div class="d-flex flex-row justify-content-center">
<i class="fa fa-user fa-2x" title="new_applications_icon"/>
</div>
</div>
<div class="col align-content-end">
<span>
<field name="application_count"/>
<span > new applications</span>
</span>
</li>
<li t-if="record.application_count.raw_value > 0">
<field name="application_count"/> Applications
</li>
<li class="text-warning" t-if="record.activities_today.raw_value > 0">
<a name="action_open_today_activities" type="object" class="text-warning"><field name="activities_today"/> Activities Today</a>
</li>
<li t-if="record.activities_overdue.raw_value > 0">
<a name="action_open_late_activities" type="object" class="text-danger"><field name="activities_overdue"/> Late Activities</a>
</li>
</ul>
</div>
<div name="kanban_boxes" class="row flex-nowrap" groups="hr_recruitment.group_hr_recruitment_user"></div>
</div>
<div class="container o_recruitment_job_container o_kanban_card_manage_pane dropdown-menu" role="menu">
<div class="row">
<div class="col-6 o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>View</span>
</div>
<div role="menuitem" name="menu_view_applications">
<a name="%(action_hr_job_applications)d" type="action">Applications</a>
</div>
<div role="menuitem">
<a name="action_open_activities" type="object">Activities</a>
</div>
<div role="menuitem">
<a name="%(action_hr_job_sources)d" type="action" context="{'default_job_id': active_id}">Trackers</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>New</span>
</div>
<div role="menuitem" name="menu_new_applications">
<a name="%(hr_recruitment.action_hr_applicant_new)d" type="action">Application</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div role="menuitem" name="o_kanban_job_reporting">
<a name="%(hr_recruitment.action_hr_recruitment_report_filtered_job)d" type="action">Analysis</a>
</div>
</div>
</div>
<div class="o_kanban_card_manage_settings row">
<div class="col-6" role="menuitem" aria-haspopup="true">
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
</div>
<div class="col-6" role="menuitem">
<a class="dropdown-item" t-if="widget.editable" name="edit_job" type="edit">Configuration</a>
<a class="dropdown-item" t-if="record.active.raw_value" name="toggle_active" type="object">Archive</a>
<a class="dropdown-item" t-if="!record.active.raw_value" name="toggle_active" type="object">Unarchive</a>
</div>
</div>
</div>
</main>
</div>
</t>
</templates>
@ -128,14 +219,176 @@
</field>
</record>
<record id="view_job_filter_recruitment" model="ir.ui.view">
<field name="name">Job</field>
<field name="model">hr.job</field>
<field name="inherit_id" ref="hr.view_job_filter"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='department_id']" position="after">
<filter string="My Favorites" name="my_favorite_jobs" domain="[('favorite_user_ids', 'in', uid)]"/>
<separator/>
</xpath>
</field>
</record>
<record id="hr_job_simple_form" model="ir.ui.view">
<field name="name">hr.job.simple.form</field>
<field name="model">hr.job</field>
<field name="priority">200</field>
<field name="arch" type="xml">
<form string="Create a Job Position" class="o_hr_job_simple_form" >
<group>
<field name="name" class="o_job_name oe_inline" placeholder="e.g. Sales Manager"/>
<label for="alias_name" string="Application email"
help="Define a specific contact address for this job position. If you keep it empty, the default email address will be used which is in human resources settings"/>
<div name="alias_def">
<field name="alias_id" class="oe_read_only" string="Email Alias" required="0"
groups="hr_recruitment.group_hr_recruitment_interviewer"/>
<div class="oe_edit_only" name="edit_alias">
<field name="alias_name" class="oe_inline o_job_alias" placeholder="e.g. sales-manager"/>@
<field name="alias_domain_id" class="oe_inline" placeholder="e.g. mycompany.com"
options="{'no_create': True, 'no_open': True}"/>
</div>
<div class="text-muted">Incoming emails create applications automatically. Use it for direct applications or when posting job offers on LinkedIn, Monster, etc.</div>
</div>
</group>
<footer>
<button string="Create" name="%(action_hr_job_applications)d" type="action" class="btn-primary o_create_job" data-hotkey="q"/>
<button string="Discard" class="btn-secondary" special="cancel" data-hotkey="x"/>
</footer>
</form>
</field>
</record>
<record id="create_job_simple" model="ir.actions.act_window">
<field name="name">Create a Job Position</field>
<field name="res_model">hr.job</field>
<field name="view_mode">form</field>
<field name="view_id" ref="hr_job_simple_form"/>
<field name="target">new</field>
<field name="context">{'dialog_size' : 'medium'}</field>
</record>
<record id="hr_job_survey" model="ir.ui.view">
<field name="name">hr.job.form1</field>
<field name="model">hr.job</field>
<field name="inherit_id" ref="hr.view_hr_job_form"/>
<field name="arch" type="xml">
<xpath expr="//h1" position="attributes">
<attribute name="class" add="d-flex align-items-center" separator=" "/>
</xpath>
<xpath expr="//field[@name='name']" position="before">
<field name="is_favorite" widget="boolean_favorite" class="hr_recruitment_is_favorite_job" nolabel="1"/>
</xpath>
<xpath expr="//form" position="attributes">
<attribute name="js_class">recruitment_form_view</attribute>
</xpath>
<page name="recruitment_page" position="attributes">
<attribute name="invisible">0</attribute>
<attribute name="groups">hr_recruitment.group_hr_recruitment_interviewer,hr.group_hr_user</attribute>
</page>
<page name="job_description_page" position="attributes">
<attribute name="invisible">0</attribute>
<attribute name="groups">hr_recruitment.group_hr_recruitment_interviewer,hr.group_hr_user</attribute>
</page>
<group name="hiring_process" position="inside">
<field name="interviewer_ids" widget="many2many_tags_avatar"
options="{'no_create': True, 'no_create_edit': True}"
groups="hr_recruitment.group_hr_recruitment_interviewer"/>
<label for="alias_name"
string="Email Alias"
help="Define a specific contact address for this job position. If you keep it empty, the default email address will be used which is in human resources settings"
/>
<div class="o_wrap_label d-flex flex-row gap-1 align-items-baseline">
<field name="alias_name" placeholder="e.g. jobs"/>
<span>@</span>
<field name="alias_domain_id" placeholder="e.g. domain.com" options="{'no_create': True, 'no_open': True}"/>
</div>
</group>
<group name="job_posting" position="inside">
<field name="expected_degree" groups="hr_recruitment.group_hr_recruitment_interviewer"/>
</group>
<group name="job" position="inside">
<label for="address_id"/>
<div class="o_row">
<span invisible="address_id" class="oe_read_only">Remote</span>
<field name="address_id" context="{'show_address': 1}" placeholder="Remote"/>
</div>
</group>
<xpath expr="//group" position="after">
<field name="job_properties" columns="2" groups="hr_recruitment.group_hr_recruitment_interviewer"/>
</xpath>
<div name="button_box" position="inside">
<button class="oe_stat_button"
groups="hr_recruitment.group_hr_recruitment_interviewer"
icon="fa-pencil"
name="%(action_hr_job_applications)d"
context="{'default_user_id': user_id, 'active_test': False}"
type="action">
<field name="all_application_count" widget="statinfo" string="Applications"/>
</button>
<button class="oe_stat_button"
groups="hr_recruitment.group_hr_recruitment_interviewer"
icon="fa-file-text-o"
name="action_open_attachments"
type="object"
invisible="documents_count == 0">
<field name="documents_count" widget="statinfo" string="Documents"/>
</button>
<button name="action_open_employees"
groups="hr_recruitment.group_hr_recruitment_interviewer"
class="oe_stat_button"
icon="fa-users"
invisible="not employee_count"
type="object">
<field name="employee_count" widget="statinfo" string="Employees"/>
</button>
</div>
<xpath expr="//page[@name='job_description_page']" position="after">
<page string="Trackers" name="trackers_page" groups="hr.group_hr_user">
<field name="job_source_ids" groups="hr_recruitment.group_hr_recruitment_interviewer"/>
</page>
</xpath>
<xpath expr="//sheet" position="after">
<chatter open_attachments="True"
groups="hr_recruitment.group_hr_recruitment_interviewer,hr.group_hr_user"/>
</xpath>
</field>
</record>
<!-- hr related job position menu action -->
<record model="ir.actions.act_window" id="action_hr_job_config">
<field name="name">Job Positions</field>
<field name="res_model">hr.job</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('hr.view_hr_job_tree')}),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('hr.hr_job_view_kanban')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('hr.view_hr_job_form')})]"/>
<field name="context">{'search_default_in_recruitment': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Ready to recruit more efficiently?
</p>
<p>
<a name="%(hr.action_create_job_position)d" class="btn btn-link" type="action">
Let's create a job position
</a>
</p>
</field>
</record>
<record id="hr_job_search_view" model="ir.ui.view">
<field name="name">hr.job.search</field>
<field name="model">hr.job</field>
<field name="inherit_id" ref="hr.view_job_filter" />
<field name="inherit_id" ref="hr_recruitment.view_job_filter_recruitment" />
<field name="priority">20</field>
<field name="arch" type="xml">
<xpath expr="//filter[@name='my_favorite_jobs']" position="after">
<searchpanel>
<searchpanel class="w-auto">
<field name="company_id" groups="base.group_multi_company" icon="fa-building" enable_counters="1"/>
<field name="department_id" icon="fa-users" enable_counters="1"/>
</searchpanel>
@ -148,39 +401,51 @@
<field name="model">hr.job</field>
<field name="inherit_id" ref="hr.view_hr_job_tree"/>
<field name="arch" type="xml">
<field name="department_id" position="after">
<field name="application_count" string="Applications"/>
<field name="name" position="after">
<field name="department_id"/>
<field name="open_application_count" string="Open Applications" groups="hr_recruitment.group_hr_recruitment_interviewer"/>
<field name="no_of_recruitment"/>
</field>
<field name="no_of_recruitment" position="after">
<field name="alias_name" invisible="1"/>
<field name="alias_id" attrs="{'invisible': [('alias_name', '=', False)]}" optional="hide"/>
<field name="user_id" widget="many2one_avatar_user" optional="hide"/>
<field name="no_of_employee" position="after">
<field name="expected_employees" optional="hide"
groups="hr_recruitment.group_hr_recruitment_interviewer,hr.group_hr_user"/>
<field name="no_of_hired_employee" optional="hide"
groups="hr_recruitment.group_hr_recruitment_interviewer"/>
<field name="message_needaction" column_invisible="True"/>
<field name="company_id" groups="base.group_multi_company" optional="hide"/>
<field name="company_id" column_invisible="True"/>
<field name="alias_name" column_invisible="True"/>
<field name="alias_id" invisible="not alias_name" optional="hide"
groups="hr_recruitment.group_hr_recruitment_interviewer"/>
<field name="user_id" widget="many2one_avatar_user" optional="hide"
groups="hr_recruitment.group_hr_recruitment_interviewer,hr.group_hr_user"/>
</field>
<list position="attributes">
<attribute name="js_class">recruitment_list_view</attribute>
</list>
</field>
</record>
<!-- hr related job position menu action -->
<record id="action_load_demo_data" model="ir.actions.server">
<field name="name">Load demo data</field>
<field name="model_id" ref="hr_recruitment.model_hr_job"/>
<field name="state">code</field>
<field name="code">action = model._action_load_recruitment_scenario()</field>
</record>
<record model="ir.actions.act_window" id="action_hr_job">
<field name="name">Job Positions</field>
<field name="path">recruitment</field>
<field name="res_model">hr.job</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_mode">kanban,list,form</field>
<field name="view_id" ref="hr_recruitment.view_hr_job_kanban"/>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'kanban', 'view_id': ref('hr_recruitment.view_hr_job_kanban')}),
(0, 0, {'view_mode': 'tree', 'view_id': ref('hr_recruitment.hr_job_view_tree_inherit')}),
(0, 0, {'view_mode': 'list', 'view_id': ref('hr_recruitment.hr_job_view_tree_inherit')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('hr.view_hr_job_form')})]"/>
<field name="context">{}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Ready to recruit more efficiently?
</p><p>
Let's create a job position.
</p>
</field>
</record>
<menuitem name="By Job Positions" parent="menu_crm_case_categ0_act_job"
id="menu_hr_job_position" action="action_hr_job"
sequence="1" groups="hr_recruitment.group_hr_recruitment_user" />
<!-- Job Positions filtered for interviewers -->
<record model="ir.actions.act_window" id="action_hr_job_interviewer">
@ -195,7 +460,56 @@
('extended_interviewer_ids', 'in', uid),
]</field>
</record>
<menuitem name="By Job Positions" parent="menu_crm_case_categ0_act_job"
id="menu_hr_job_position_interviewer" action="action_hr_job_interviewer"
sequence="1" groups="hr_recruitment.group_hr_recruitment_interviewer" />
<record id="hr_job_platform_form" model="ir.ui.view">
<field name="name">hr.job.platform.form</field>
<field name="model">hr.job.platform</field>
<field name="arch" type="xml">
<form>
<sheet>
<group col="2">
<group>
<field name="name" placeholder="e.g. Linkedin"/>
<field name="regex" placeholder="e.g. ^New application:.*from (.*)"/>
</group>
<group>
<field name="email" placeholder="e.g. jobs-listings@linkedin.com"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="hr_job_platform_tree" model="ir.ui.view">
<field name="name">hr.job.platform.list</field>
<field name="model">hr.job.platform</field>
<field name="arch" type="xml">
<list>
<field name="name"/>
<field name="email"/>
<field name="regex"/>
</list>
</field>
</record>
<record model="ir.actions.act_window" id="action_hr_job_platforms">
<field name="name">Emails</field>
<field name="res_model">hr.job.platform</field>
<field name="view_mode">list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_empty_folder">
No rules have been defined.
</p>
<p>
Create a new rule to process emails from specific job boards.
</p>
<p>
Define a regex: Extract the applicant's name from the email's subject or body.
</p>
<p>
Without a regex: The applicant's name will be the email's subject.
</p>
</field>
</record>
</odoo>

View file

@ -0,0 +1,38 @@
<?xml version="1.0"?>
<odoo>
<data>
<record model="ir.ui.view" id="hr_recruitment_degree_tree">
<field name="name">hr.recruitment.degree.list</field>
<field name="model">hr.recruitment.degree</field>
<field name="arch" type="xml">
<list string="Degree" editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="score" widget="percentage"/>
</list>
</field>
</record>
<record model="ir.ui.view" id="hr_recruitment_degree_form">
<field name="name">hr.recruitment.degree.form</field>
<field name="model">hr.recruitment.degree</field>
<field name="arch" type="xml">
<form string="Degree">
<sheet>
<group>
<field name="name"/>
<field name="score"/>
<field name="sequence" groups="base.group_no_one"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="hr_recruitment_degree_action" model="ir.actions.act_window">
<field name="name">Degrees</field>
<field name="res_model">hr.recruitment.degree</field>
<field name="view_id" ref="hr_recruitment_degree_tree"/>
</record>
</data>
</odoo>

View file

@ -0,0 +1,44 @@
<?xml version="1.0"?>
<odoo>
<data>
<record model="ir.ui.view" id="hr_recruitment_source_tree">
<field name="name">hr.recruitment.source.list</field>
<field name="model">hr.recruitment.source</field>
<field name="arch" type="xml">
<list string="Sources of Applicants" editable="top" sample="1">
<field name="has_domain" column_invisible="True"/>
<field name="campaign_id" optional="show"/>
<field name="source_id" placeholder="e.g. LinkedIn" decoration-bf="1" readonly="id" optional="show"/>
<field name="medium_id" optional="show"/>
<field name="email" widget="RecruitmentCopyClipboardChar" invisible="not has_domain" options="{'content_generation_function_name': 'create_and_get_alias', 'displayed_value': 'Email'}"/>
</list>
</field>
</record>
<record id="hr_recruitment_source_view_search" model="ir.ui.view">
<field name="name">hr.recruitment.source.view.search</field>
<field name="model">hr.recruitment.source</field>
<field name="arch" type="xml">
<search string="Search Source">
<field name="source_id"/>
<field name="job_id"/>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_hr_job_sources">
<field name="name">Trackers</field>
<field name="res_model">hr.recruitment.source</field>
<field name="view_mode">list</field>
<field name="search_view_id" ref="hr_recruitment_source_view_search"/>
<field name="context">{'search_default_job_id': [active_id], 'default_job_id': active_id}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Want to analyse where applications come from ?
</p><p>
Use emails and links trackers
</p>
</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,116 @@
<?xml version="1.0"?>
<odoo>
<data>
<record id="hr_job_stage_act" model="ir.actions.act_window">
<field name="name">Recruitment / Applicants Stages</field>
<field name="res_model">hr.recruitment.stage</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add a new stage in the recruitment process
</p><p>
Define here your stages of the recruitment process, for example:
qualification call, first interview, second interview, refused,
hired.
</p>
</field>
</record>
<record model="ir.ui.view" id="hr_recruitment_stage_tree">
<field name="name">hr.recruitment.stage.list</field>
<field name="model">hr.recruitment.stage</field>
<field name="arch" type="xml">
<list string="Stages">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="rotting_threshold_days" optional="hide"/>
<field name="fold"/>
<field name="hired_stage"/>
</list>
</field>
</record>
<record id="view_hr_recruitment_stage_kanban" model="ir.ui.view">
<field name="name">hr.recruitment.stage.kanban</field>
<field name="model">hr.recruitment.stage</field>
<field name="arch" type="xml">
<kanban>
<templates>
<t t-name="card">
<field class="fw-bolder" name="name"/>
<div class="d-flex">
Folded in Recruitment Pipe:
<field name="fold" class="ms-1" widget="boolean"/>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record model="ir.ui.view" id="hr_recruitment_stage_form">
<field name="name">hr.recruitment.stage.form</field>
<field name="model">hr.recruitment.stage</field>
<field name="arch" type="xml">
<form string="Stage">
<sheet>
<group name="stage_definition" string="Stage Definition">
<group>
<field name="name"/>
<field name="sequence" groups="base.group_no_one"/>
<field name="template_id" domain= "[('model_id.model', '=', 'hr.applicant')]" options="{'no_quick_create': True}"/>
</group>
<group name="stage_details">
<field name="fold"/>
<field name="hired_stage"/>
<field name="is_warning_visible" invisible="1"/>
<span invisible="not is_warning_visible">
<span
class="fa fa-exclamation-triangle text-danger ps-3">
</span>
<span class="text-danger">
All applications will lose their hired date and hired status.
</span>
</span>
<field name="job_ids" widget="many2many_tags"/>
<field name="rotting_threshold_days" invisible="hired_stage"/>
</group>
</group>
<group name="tooltips" string="Tooltips">
<p class="text-muted" colspan="2">
You can define here the labels that will be displayed for the kanban state instead
of the default labels.
</p>
<label for="legend_normal" string=" " class="o_status"/>
<field name="legend_normal" nolabel="1"/>
<label for="legend_blocked" string=" " class="o_status o_status_red"/>
<field name="legend_blocked" nolabel="1"/>
<label for="legend_waiting" string=" " class="o_status o_status_orange"/>
<field name="legend_waiting" nolabel="1"/>
<label for="legend_done" string=" " class="o_status o_status_green"/>
<field name="legend_done" nolabel="1"/>
</group>
<separator string="Requirements"/>
<field name="requirements" placeholder="You can define the requirements here. They will be displayed when you hover over the stage title."/>
</sheet>
</form>
</field>
</record>
<record id="hr_recruitment_stage_act" model="ir.actions.act_window">
<field name="name">Stages</field>
<field name="res_model">hr.recruitment.stage</field>
<field name="view_mode">list,kanban,form</field>
<field name="view_id" ref="hr_recruitment_stage_tree"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add a new stage in the recruitment process
</p><p>
Don't forget to specify the department if your recruitment process
is different according to the job position.
</p>
</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,103 @@
<?xml version="1.0"?>
<odoo>
<record id="hr_talent_pool_view_form" model="ir.ui.view">
<field name="name">hr.talent.pool.view.form</field>
<field name="model">hr.talent.pool</field>
<field name="arch" type="xml">
<form string="talent pool">
<sheet>
<group>
<group>
<field name="name" placeholder="e.g Reserve, Developers, Sales"/>
<field name="pool_manager"/>
<field name="categ_ids" widget="many2many_tags" placeholder="e.g French-speaking, Immediately Available, Own a car"/>
</group>
<group>
<field name="color" widget="color_picker"/>
<field name="company_id"/>
</group>
<label for="description" class="opacity-100 fw-bold text-900"/>
<field name="description" string="Description" placeholder="Describe the talent pool and common traits among talent pool applicants"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="hr_talent_pool_view_list" model="ir.ui.view">
<field name="name">hr.talent.pool.view.list</field>
<field name="model">hr.talent.pool</field>
<field name="arch" type="xml">
<list string="talent pool" multi_edit="1" sample="1">
<field name="name"/>
<field name="pool_manager"/>
<field name="no_of_talents"/>
<field name="categ_ids" widget="many2many_tags"/>
<field name="company_id"/>
</list>
</field>
</record>
<record id="hr_talent_pool_view_kanban" model="ir.ui.view">
<field name="name">hr.talent.pool.view.kanban</field>
<field name="model">hr.talent.pool</field>
<field name="arch" type="xml">
<kanban
highlight_color="color"
action="%(action_hr_talent_pool_applications)d"
type="action"
limit="40"
multi_edit="1"
sample="1"
>
<field name="name"/>
<field name="pool_manager"/>
<field name="company_id"/>
<templates>
<t t-name="menu">
<a role="menuitem" type="action" name="%(action_hr_talent_pool_applications)d"
class="dropdown-item">
Talents</a>
<field name="color" widget="kanban_color_picker"/>
<a class="dropdown-item" t-if="widget.editable" name="edit_talent_pool"
type="open">Configuration</a>
<a role="menuitem" type="archive" class="dropdown-item">
Archive</a>
</t>
<t t-name="card">
<div class="row">
<div class="col">
<div class="d-flex flex-column">
<field name="name" class="fw-bold"/>
<field name="pool_manager"/>
<field name="company_id"/>
</div>
</div>
<div class="col d-flex justify-content-end align-items-end mb-1">
<button class="btn btn-primary" name="action_talent_pool_add_talents" type="object">
New Talent
</button>
</div>
</div>
<footer class="justify-content-end">
<field name="no_of_talents"/>
<span>Talents</span>
</footer>
</t>
</templates>
</kanban>
</field>
</record>
<record id="action_hr_talent_pool" model="ir.actions.act_window">
<field name="name">Talent Pool</field>
<field name="path">talent-pool</field>
<field name="res_model">hr.talent.pool</field>
<field name="view_mode">kanban,list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_empty_folder">
No talent pools yet
</p>
</field>
</record>
</odoo>

View file

@ -0,0 +1,41 @@
<?xml version="1.0"?>
<odoo>
<data>
<!-- Resume and Letters -->
<record id="ir_attachment_view_search_inherit_hr_recruitment" model="ir.ui.view">
<field name="name">ir.attachment.search.inherit.recruitment</field>
<field name="model">ir.attachment</field>
<field name="mode">primary</field>
<field name="inherit_id" ref="base.view_attachment_search"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='create_date']" position="after">
<field name="index_content" string="Content"/>
</xpath>
<xpath expr="//filter[@name='my_documents_filter']" position="attributes">
<attribute name='invisible'>1</attribute>
</xpath>
<xpath expr="//filter[@name='url_filter']" position="attributes">
<attribute name='invisible'>1</attribute>
</xpath>
<xpath expr="//filter[@name='binary_filter']" position="attributes">
<attribute name='invisible'>1</attribute>
</xpath>
</field>
</record>
<record id="ir_attachment_hr_recruitment_list_view" model="ir.ui.view">
<field name="model">ir.attachment</field>
<field name="mode">primary</field>
<field name="arch" type="xml">
<list>
<field name="name" column_invisible="True"/>
<field name="res_id" column_invisible="True"/>
<field name="res_model" column_invisible="True"/>
<field name="datas" widget="binary" filename="name" string="File"/>
<field name="res_name" widget="applicant_char" string="Applicant" invisible="res_model != 'hr.applicant'"/>
<field name="create_date"/>
</list>
</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="mail_activity_plan_action_config_hr_applicant" model="ir.actions.act_window">
<field name="name">Recruitment Plans</field>
<field name="res_model">mail.activity.plan</field>
<field name="view_mode">list,kanban,form</field>
<field name="search_view_id" ref="mail.mail_activity_plan_view_search"/>
<field name="context">{'default_res_model': 'hr.applicant'}</field>
<field name="domain">[('res_model', '=', 'hr.applicant')]</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a Recruitment Activity Plan
</p>
<p>
Activity plans are used to assign a list of activities in just a few clicks
(e.g. "Language Test", "Prepare Offer", ...)
</p>
</field>
</record>
</data>
</odoo>

View file

@ -4,7 +4,7 @@
<record id="mail_activity_type_action_config_hr_applicant" model="ir.actions.act_window">
<field name="name">Activity Types</field>
<field name="res_model">mail.activity.type</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,kanban,form</field>
<field name="domain">['|', ('res_model', '=', False), ('res_model', '=', 'hr.applicant')]</field>
<field name="context">{'default_res_model': 'hr.applicant'}</field>
<field name="help" type="html">
@ -16,7 +16,4 @@
</p>
</field>
</record>
<menuitem id="hr_recruitment_menu_config_activity_type"
action="mail_activity_type_action_config_hr_applicant"
parent="menu_hr_recruitment_config_activities"/>
</odoo>

View file

@ -0,0 +1,196 @@
<?xml version="1.0"?>
<odoo>
<menuitem
name="Recruitment"
id="menu_hr_recruitment_root"
web_icon="hr_recruitment,static/description/icon.png"
groups="hr_recruitment.group_hr_recruitment_user,hr_recruitment.group_hr_recruitment_interviewer"
sequence="210"/>
<menuitem
name="Applications"
parent="menu_hr_recruitment_root"
id="menu_crm_case_categ0_act_job"
sequence="2"/>
<menuitem
name="By Job Positions"
id="menu_hr_job_position"
parent="menu_crm_case_categ0_act_job"
action="action_hr_job"
sequence="1"
groups="hr_recruitment.group_hr_recruitment_user"/>
<menuitem
name="By Job Positions"
id="menu_hr_job_position_interviewer"
parent="menu_crm_case_categ0_act_job"
action="action_hr_job_interviewer"
sequence="1"
groups="hr_recruitment.group_hr_recruitment_interviewer"/>
<menuitem
name="By Talent Pools"
parent="menu_crm_case_categ0_act_job"
id="menu_hr_talent_pools"
action="action_hr_talent_pool"
sequence="2"/>
<menuitem
name="All Applications"
parent="menu_crm_case_categ0_act_job"
id="menu_crm_case_categ_all_app"
action="crm_case_categ0_act_job"
sequence="3"/>
<menuitem
name="Reporting"
id="report_hr_recruitment"
parent="menu_hr_recruitment_root"
groups="group_hr_recruitment_user"
sequence="99"/>
<menuitem
name="Recruitment Analysis"
id="hr_applicant_report_menu"
parent="report_hr_recruitment"
sequence="50"
action="hr_applicant_action_analysis"/>
<menuitem
id="menu_hr_recruitment_configuration"
name="Configuration"
parent="menu_hr_recruitment_root"
groups="group_hr_recruitment_user"
sequence="100"/>
<menuitem
id="menu_hr_recruitment_global_settings"
name="Settings"
parent="menu_hr_recruitment_configuration"
sequence="0"
action="action_hr_recruitment_configuration"
groups="base.group_system"/>
<menuitem
id="menu_hr_recruitment_config_jobs"
name="Job Positions"
parent="menu_hr_recruitment_configuration"
sequence="10"/>
<menuitem
id="menu_hr_recruitment_stage"
name="Stages"
parent="menu_hr_recruitment_config_jobs"
action="hr_recruitment_stage_act"
groups="base.group_no_one"
sequence="1"/>
<menuitem
id="menu_hr_recruitment_contract_type"
action="hr.hr_contract_type_action"
parent="menu_hr_recruitment_config_jobs"
sequence="2"
groups="hr.group_hr_user"/>
<menuitem
id="menu_hr_recruitment_utm"
parent="menu_hr_recruitment_configuration"
name="UTMs"
groups="base.group_no_one"
sequence="15"/>
<menuitem
id="menu_hr_recruitment_utm_sources"
parent="menu_hr_recruitment_utm"
name="Sources"
action="utm.utm_source_action"
groups="base.group_no_one"
sequence="15"/>
<menuitem
id="menu_hr_recruitment_utm_mediums"
parent="menu_hr_recruitment_utm"
name="Mediums"
action="utm.utm_medium_action"
groups="base.group_no_one"
sequence="15"/>
<menuitem
id="menu_hr_recruitment_config_applications"
name="Applications"
parent="menu_hr_recruitment_configuration"
sequence="20"/>
<menuitem
id="menu_hr_recruitment_degree"
name="Degrees"
parent="menu_hr_recruitment_config_applications"
action="hr_recruitment_degree_action"
sequence="1"
/>
<menuitem
id="menu_hr_applicant_refuse_reason"
action="hr_applicant_refuse_reason_action"
parent="menu_hr_recruitment_config_applications"
sequence="10"/>
<menuitem
id="hr_applicant_category_menu"
parent="menu_hr_recruitment_config_applications"
action="hr_applicant_category_action"
sequence="20"
/>
<menuitem
id="menu_hr_recruitment_config_employees"
name="Employees"
parent="menu_hr_recruitment_configuration"
sequence="30"/>
<menuitem
name="Departments"
id="menu_hr_department"
parent="menu_hr_recruitment_config_employees"
action="action_hr_department"/>
<menuitem
id="menu_hr_recruitment_config_activities"
name="Activities"
parent="menu_hr_recruitment_configuration"
sequence="40"/>
<menuitem
id="hr_recruitment_menu_config_activity_type"
action="mail_activity_type_action_config_hr_applicant"
parent="menu_hr_recruitment_config_activities"
sequence="10"/>
<menuitem
name="Activity Plans"
id="hr_recruitment_menu_config_activity_plan"
parent="menu_hr_recruitment_config_activities"
action="mail_activity_plan_action_config_hr_applicant"
groups="hr_recruitment.group_hr_recruitment_manager"
sequence="20"/>
<menuitem
name="Job Boards"
id="menu_hr_job_boards"
parent="menu_hr_recruitment_configuration"
sequence="50"/>
<menuitem
name="Emails"
id="menu_hr_recruitment_emails"
parent="menu_hr_job_boards"
action="action_hr_job_platforms"
sequence="50"/>
<record id="hr.menu_view_hr_contract_type" model="ir.ui.menu">
<field name="active" eval="True"/>
</record>
</odoo>

View file

@ -7,90 +7,35 @@
<field name="priority" eval="75"/>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('settings')]" position="inside">
<div class="app_settings_block" data-string="Recruitment" string="Recruitment" data-key="hr_recruitment" groups="hr_recruitment.group_hr_recruitment_manager">
<h2>Job Posting</h2>
<div class="row mt16 o_settings_container" name="online_posting_setting_container">
<div class="col-12 col-lg-6 o_setting_box" id="publish_available_jobs_setting">
<div class="o_setting_left_pane">
<field name="module_website_hr_recruitment"/>
</div>
<div class="o_setting_right_pane">
<label for="module_website_hr_recruitment" string="Online Posting"/>
<div class="text-muted">
Publish available jobs on your website
</div>
</div>
</div>
</div>
<h2>Recruitment Process</h2>
<div class="row mt16 o_settings_container" name="recruitment_process_div">
<div class="col-12 col-lg-6 o_setting_box"
id="interview_forms_setting"
title="Use interview forms tailored to each job position during the recruitment process. Select the form to use in the job position detail form. This relies on the Survey app.">
<div class="o_setting_left_pane">
<field name="module_hr_recruitment_survey"/>
</div>
<div class="o_setting_right_pane">
<label for="module_hr_recruitment_survey" string="Send Interview Survey"/>
<div class="text-muted">
Send an Interview Survey to the applicant during
the recruitment process
</div>
<div class="content-group" id="interview_forms"/>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" id="sms">
<div class="o_setting_right_pane" id="sms_settings">
<div class="o_form_label">
Send SMS
<a href="https://www.odoo.com/documentation/16.0/applications/marketing/sms_marketing/pricing/pricing_and_faq.html" title="Documentation" class="ms-1 o_doc_link" target="_blank"></a>
</div>
<div class="text-muted">
Send texts to your contacts
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" id="display_cv">
<div class="o_setting_left_pane">
<field name="group_applicant_cv_display"/>
</div>
<div class="o_setting_right_pane">
<label for="group_applicant_cv_display" string="CV Display"/>
<div class="text-muted">
Display CV on application form
</div>
</div>
</div>
<div class="col-xs-12 col-md-6 o_setting_box" title="Use OCR to fill data from a picture of the CV or the file itself">
<div class="o_setting_left_pane">
<field name="module_hr_recruitment_extract" widget="upgrade_boolean"/>
</div>
<div class="o_setting_right_pane" id="recruitment_extract_settings">
<label string="CV Digitization (OCR)" for="module_hr_recruitment_extract"/>
<span class="fa fa-lg fa-building-o" title="Values set here are company-specific."/>
<div class="text-muted">
Digitize your CV to extract name and email automatically.
</div>
</div>
</div>
</div>
</div>
<xpath expr="//form" position="inside">
<app data-string="Recruitment" string="Recruitment" name="hr_recruitment" groups="hr_recruitment.group_hr_recruitment_manager">
<block title="Job Posting" name="online_posting_setting_container">
<setting id="publish_available_jobs_setting" string="Online Posting" help="Publish job offers on your website">
<field name="module_website_hr_recruitment"/>
</setting>
</block>
<block title="Process" name="recruitment_process_div">
<setting id="interview_forms_setting" string="Send Interview Survey" help="Send an Interview Survey to the applicant during the recruitment process" title="Use interview forms tailored to each job position during the recruitment process. Select the form to use in the job position detail form. This relies on the Survey app.">
<field name="module_hr_recruitment_survey"/>
</setting>
</block>
<block title="In-App Purchases" name="recruitment_in_app_purchases">
<setting id="sms" string="Send SMS" documentation="/applications/marketing/sms_marketing/pricing/pricing_and_faq.html" help="Send texts to your contacts">
</setting>
<setting id="recruitment_extract_settings" string="Résumé Digitization (OCR)" company_dependent="1" help="Digitize your résumé to extract name and email automatically." title="Use OCR to fill data from a picture of the Résumr or the file itself">
<field name="module_hr_recruitment_extract" widget="upgrade_boolean"/>
</setting>
</block>
</app>
</xpath>
</field>
</record>
<record id="action_hr_recruitment_configuration" model="ir.actions.act_window">
<field name="name">Settings</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.config.settings</field>
<field name="view_mode">form</field>
<field name="target">inline</field>
<field name="context">{'module' : 'hr_recruitment', 'bin_size': False}</field>
</record>
<menuitem id="menu_hr_recruitment_global_settings" name="Settings"
parent="menu_hr_recruitment_configuration" sequence="0" action="action_hr_recruitment_configuration"
groups="base.group_system"/>
</data>
</odoo>