<menuitem name="Recruitment"
id="menu_hr_recruitment_recruitment"
parent="hr.menu_hr_configuration"
- sequence="40"/>
+ groups="base.group_hr_manager"
+ sequence="2"/>
<act_window
id="act_hr_applicant_to_meeting"
</record>
- <!-- Jobs -->
+ <!-- Applicants -->
<record model="ir.ui.view" id="crm_case_tree_view_job">
<field name="name">Applicants</field>
<field name="model">hr.applicant</field>
<field name="name">Jobs - Recruitment Form</field>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
- <form string="Jobs - Recruitment Form" version="7.0">
+ <form string="Jobs - Recruitment Form">
<header>
<field name="stage_id" widget="statusbar" clickable="True"/>
</header>
<sheet>
<div class="oe_right oe_button_box">
- <button name="action_makeMeeting" type="object"
- string="Schedule Meeting" help="Schedule interview with this applicant"/>
- <button name="action_start_survey" type="object"
- string="Start Interview" help="Answer related job question"
+ <button name="action_makeMeeting" class="oe_stat_button" icon="fa-calendar" type="object"
+ help="Schedule interview with this applicant">
+ <div>Schedule<br/>Meeting</div>
+ </button>
+ <button name="action_start_survey"
+ class="oe_stat_button"
+ icon="fa-user"
+ type="object"
+ help="Answer related job question"
context="{'survey_id': survey}"
- attrs="{'invisible':[('survey','=',False)]}"/>
- <button name="action_print_survey" type="object"
- string="Print Interview" help="Print interview report"
- attrs="{'invisible':[('survey','=',False)]}"/>
- <button name="action_get_attachment_tree_view" string="Documents" type="object"/>
+ attrs="{'invisible':[('survey','=',False)]}">
+ <div>Start<br/>Interview</div>
+ </button>
+ <button name="action_print_survey"
+ class="oe_stat_button"
+ icon="fa-print"
+ type="object"
+ help="Print interview report"
+ attrs="{'invisible':[('survey','=',False)]}">
+ <div>Print<br/>Interview</div>
+ </button>
+ <button name="action_get_attachment_tree_view"
+ class="oe_stat_button"
+ icon="fa-book"
+ type="object">
+ <field name="attachment_number" widget="statinfo" string="Documents"/>
+ </button>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<label for="partner_name" class="oe_edit_only"/>
<h2 style="display: inline-block;">
<field name="partner_name" class="oe_inline"/>
+ <button string="Create Employee" name="create_employee_from_applicant" type="object"
+ class="oe_link oe_inline" style="margin-left: 8px;"
+ attrs="{'invisible': [('emp_id', '!=', False)]}"/>
</h2>
- <button string="Create Employee" name="create_employee_from_applicant" type="object"
- class="oe_link oe_inline" style="margin-left: 8px;"
- attrs="{'invisible': [('emp_id', '!=', False)]}"/>
</div>
<group>
<group>
<field name="date_action"/>
<field name="title_action" class="oe_inline" placeholder="e.g. Call for interview"/>
</div>
- <field name="priority"/>
+ <field name="priority" widget="priority"/>
<field name="source_id"/>
<field name="reference"/>
</group>
<field name="arch" type="xml">
<search string="Search Applicants">
<field name="partner_name" filter_domain="['|','|',('name','ilike',self),('partner_name','ilike',self),('email_from','ilike',self)]" string="Subject / Applicant"/>
- <filter string="Unassigned" domain="[('user_id', '=', False)]"/>
<filter string="My" domain="[('user_id', '=', uid)]"/>
- <separator/>
- <filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ <filter string="Unassigned" domain="[('user_id', '=', False)]"/>
<separator/>
<filter string="Next Actions" context="{'invisible_next_action':False, 'invisible_next_date':False}"
domain="[('date_action','<>',False)]" help="Filter and view on next actions and date"/>
-
+ <separator/>
+ <filter string="New Mail" name="message_unread" domain="[('message_unread','=',True)]"/>
<field name="job_id"/>
<field name="department_id"/>
<field name="user_id"/>
<separator/>
<field name="categ_ids"/>
<separator/>
- <group expand="0" string="Group By...">
+ <group expand="0" string="Group By">
<filter string="Responsible" domain="[]" context="{'group_by':'user_id'}"/>
- <filter string="Department" domain="[]" context="{'group_by':'department_id'}"/>
<filter string="Job" domain="[]" context="{'group_by':'job_id'}"/>
<filter string="Degree" domain="[]" context="{'group_by':'type_id'}"/>
- <filter string="Availability" domain="[]" context="{'group_by':'availability'}"/>
- <filter string="Appreciation" domain="[]" context="{'group_by':'priority'}"/>
- <filter string="Last Stage" help="Match this group by with a specific stage filter in order to analyse the recruitment process" context="{'group_by':'last_stage_id'}"/>
<filter string="Stage" domain="[]" context="{'group_by':'stage_id'}"/>
- <filter string="Source" domain="[]" context="{'group_by':'source_id'}"/>
- <filter string="Creation Month" domain="[]" context="{'group_by':'create_date'}"/>
+ <filter string="Creation Date" context="{'group_by':'create_date'}"/>
<filter string="Last Stage Update" context="{'group_by':'date_last_stage_update'}"/>
</group>
</search>
<field name="model">hr.applicant</field>
<field name="arch" type="xml">
<kanban default_group_by="stage_id">
- <field name="stage_id"/>
+ <field name="stage_id" options='{"group_by_tooltip": {"description": "Description", "legend_priority": "Use of stars"}}'/>
<field name="color"/>
<field name="priority"/>
<field name="survey"/>
</ul>
</t>
<t t-name="kanban-box">
- <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click oe_semantic_html_override">
+ <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click oe_applicant_kanaban oe_semantic_html_override">
<div class="oe_dropdown_toggle oe_dropdown_kanban">
<span class="oe_e">i</span>
<ul class="oe_dropdown_menu">
<li><a name="action_makeMeeting" type="object">Schedule Interview</a></li>
<li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
</ul>
-
</div>
<div class="oe_kanban_content" tooltip="kanban-tooltip">
- <div>
<t t-if="record.partner_name.raw_value"><b><field name="partner_name"/></b><br/></t>
<i><field name="name"/></i><br/>
<field name="job_id"/><br/>
<t t-if="record.partner_mobile.raw_value">Mobile: <field name="partner_mobile"/><br/></t>
- </div>
- <div style="padding-left: 0.5em">
<t t-if="record.date_action.raw_value and record.date_action.raw_value lt (new Date())" t-set="red">oe_kanban_text_red</t>
<span t-attf-class="#{red || ''}"><field name="date_action"/></span>
<t t-if="record.date_action.raw_value"> : </t>
<field name="title_action"/>
+ <field name="categ_ids" class="oe_margin_top_4"/>
+ <div class="oe_kanban_bottom_right">
+ <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
+ <div class="pull-left" groups="base.group_user">
+ <field name="priority" widget="priority"/>
+ </div>
</div>
- <div style="width:240px"><field name="categ_ids"/></div>
- <div class="oe_kanban_right">
- <t t-set="priority" t-value="record.priority.raw_value || 5"/>
- <a type="object" name="set_priority" args="['3']" t-if="priority gt 3">
- <img src="/web/static/src/img/icons/star-off.png" width="16" height="16" title="Good"/>
- </a>
- <a type="object" name="set_priority" args="['5']" t-if="priority lte 3">
- <img t-attf-src="/web/static/src/img/icons/star-#{priority lte 3 ? 'on' : 'off'}.png" width="16" height="16" title="Good"/>
- </a>
- <a type="object" name="set_priority" args="['2']">
- <img t-attf-src="/web/static/src/img/icons/star-#{priority lte 2 ? 'on' : 'off'}.png" width="16" height="16" title="Very Good"/>
- </a>
- <a type="object" name="set_priority" args="['1']">
- <img t-attf-src="/web/static/src/img/icons/star-#{priority == 1 ? 'on' : 'off'}.png" width="16" height="16" title="Excellent"/>
- </a>
- <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar"/>
-
- </div>
- <div class="oe_kanban_footer_left" style="margin-top:5px;">
+ <div class="oe_kanban_footer_left oe_margin_top_4">
<t t-raw="record.message_summary.raw_value"/>
- <a t-if="record.attachment_number" name="action_get_attachment_tree_view" type="object" style="margin-right: 10px"> <field name="attachment_number"/> Documents</a>
+ <a t-if="record.attachment_number" name="action_get_attachment_tree_view" type="object"> <field name="attachment_number"/> Documents</a>
</div>
-
</div>
<div class="oe_clear"></div>
</div>
</field>
</record>
- <!-- HR Job -->
+ <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,tree,form,graph,calendar</field>
+ <field name="context">{'search_default_job_id': [active_id], 'default_job_id': active_id, 'empty_list_help_model': 'hr.job'}</field>
+ <field name="help" type="html">
+ <p>
+ Odoo helps you track applicants in the recruitment
+ process and follow up all operations: meetings, interviews, etc.
+ </p><p>
+ Applicants and their attached CV 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>
+
+ <!-- Jobs -->
+ <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">
+ <field name="department_id" positon="after">
+ <separator/>
+ <filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
+ </field>
+ </field>
+ </record>
+
+ <!-- Action for the stat button of the no_employee -->
+ <record model="ir.actions.act_window" id="action_hr_job_no_employee">
+ <field name="name">Employees</field>
+ <field name="res_model">hr.employee</field>
+ <field name="view_mode">kanban,tree,form</field>
+ <field name="context">{'search_default_job_id': active_id}</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click to add a new employee.
+ </p><p>
+ With just a quick glance on the Odoo employee screen, you
+ can easily find all the information you need for each person;
+ contact data, job position, availability, etc.
+ </p>
+ </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">
- <group name="job_data" position="inside">
+ <group name="employee_data" position="inside">
+ <label for="survey_id" groups="base.group_user"/>
+ <div groups="base.group_user">
+ <field name="survey_id" class="oe_inline" domain="[('res_model','=','hr_recruitment')]"/>
+ <button string="Print Interview" name="action_print_survey" type="object" attrs="{'invisible':[('survey_id','=',False)]}" class="oe_inline oe_link"/>
+ </div>
<label for="address_id"/>
<div>
<field name="address_id" context="{'show_address': 1}"/>
<span class="oe_grey">(empty = remote work)</span>
</div>
</group>
- <field name="expected_employees" position="after">
- <label for="survey_id" groups="base.group_user"/>
- <div groups="base.group_user">
- <field name="survey_id" class="oe_inline" domain="[('res_model','=','hr.recruitment')]"/>
- <button class="oe_inline"
- string="Print Interview Form"
- name="action_print_survey" type="object"
- attrs="{'invisible':[('survey_id','=',False)]}"/>
- </div>
- </field>
- <xpath expr="//group[@name='job_data']" position="after">
- <group name="group_alias"
- attrs="{'invisible': [('alias_domain', '=', False)]}">
- <label for="alias_name" string="Email Alias"/>
- <div name="alias_def">
+ <xpath expr="//field[@name='department_id']" position="after">
+ <label for="alias_name" string="Specific Email Address" attrs="{'invisible': [('alias_domain', '=', False)]}" 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" attrs="{'invisible': [('alias_domain', '=', False)]}">
<field name="alias_id" class="oe_read_only oe_inline"
string="Email Alias" required="0"/>
<div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;" >
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
</div>
</div>
- <field name="alias_contact" class="oe_inline" string="Accept Emails From"/>
- </group>
+ </xpath>
+ <xpath expr="//field[@name='department_id']" position="after">
+ <field name="user_id" class="oe_inline"/>
+ </xpath>
+ <xpath expr="//div[@name='buttons']" position="inside">
+ <div class="oe_button_box" >
+ <button class="oe_stat_button"
+ icon="fa-file-o"
+ name="%(action_hr_job_applications)d"
+ context="{'default_user_id': user_id}"
+ type="action">
+ <field name="application_count" widget="statinfo" string="Applications"/>
+ </button>
+ <button class="oe_stat_button"
+ icon="fa-users"
+ name="%(action_hr_job_no_employee)d"
+ type="action">
+ <field name="no_of_employee" widget="statinfo" string="Employees"/>
+ </button>
+ <button class="oe_stat_button"
+ icon="fa-book"
+ name="action_get_attachment_tree_view"
+ type="object">
+ <field name="documents_count" widget="statinfo" string="Documents"/>
+ </button>
+ </div>
</xpath>
</field>
</record>
+ <record id="view_hr_job_kanban" model="ir.ui.view">
+ <field name="name">hr.job.kanban</field>
+ <field name="model">hr.job</field>
+ <field name="arch" type="xml">
+ <kanban class="oe_background_grey">
+ <field name="name"/>
+ <field name="alias_name"/>
+ <field name="alias_domain"/>
+ <field name="department_id"/>
+ <field name="no_of_recruitment"/>
+ <field name="color"/>
+ <field name="application_ids"/>
+ <field name="document_ids"/>
+ <field name="no_of_hired_employee"/>
+ <field name="manager_id"/>
+ <field name="survey_id"/>
+ <field name="state"/>
+ <field name="user_id"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_job oe_kanban_card oe_kanban_global_click">
+ <div class="oe_dropdown_toggle oe_dropdown_kanban oe_custom">
+ <span class="oe_e">i</span>
+ <ul class="oe_dropdown_menu">
+ <t t-if="widget.view.is_action_enabled('edit')">
+ <li><a type="edit">Edit Job Position</a></li>
+ </t>
+ <t t-if="widget.view.is_action_enabled('delete')">
+ <li><a type="delete">Delete</a></li>
+ </t>
+ <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+ </ul>
+ </div>
+ <div class="oe_kanban_content">
+ <t t-if="record.user_id.raw_value">
+ <img t-att-src="kanban_image('res.users', 'image_medium', record.user_id.raw_value[0])" t-att-title="record.user_id.value" class="oe_kanban_avatar oe_job_avatar pull-right"/>
+ </t>
+ <t t-if="record.user_id.raw_value === false">
+ <img t-att-src='_s + "/base/static/src/img/avatar.png"' class="oe_kanban_avatar oe_job_avatar pull-right"/>
+ </t>
+ <div class="oe_job_detail">
+ <div class="text-center oe_job_font oe_kanban_ellipsis">
+ <strong><field name="name"/></strong>
+ </div>
+ <div class="text-center oe_job_font oe_kanban_ellipsis">
+ <strong><field name="department_id"/>
+ <span t-if="record.manager_id.value" class="oe_manager_name">
+ (<t t-esc="record.manager_id.value"/>)
+ </span></strong>
+ </div>
+ <div class="text-center oe_job_alias oe_kanban_ellipsis" t-if="record.alias_name.value and record.alias_domain.value and record.state.raw_value == 'recruit'">
+ <small><i class="fa fa-envelope-o"></i> <field name="alias_id"/></small>
+ </div>
+
+ </div>
+ <t t-if="record.state.raw_value == 'recruit'">
+ <div class="col-md-6 oe_applications">
+ <div class="oe_applications oe_job_font">
+ <a name="%(action_hr_job_applications)d" type="action">
+ <span><t t-esc="record.application_ids.raw_value.length"/> Applications</span>
+ </a>
+ <br/>
+ <a t-if="record.document_ids.raw_value.length gt 0" name="action_get_attachment_tree_view" type="object">
+ <span t-if="record.document_ids.raw_value.length gt 1"><t t-esc="record.document_ids.raw_value.length"/> Documents</span>
+ <span t-if="record.document_ids.raw_value.length lt 2"><t t-esc="record.document_ids.raw_value.length"/> Document</span>
+ </a>
+ </div>
+ </div>
+ <div class="col-md-5">
+ <div class="oe_job_justgage">
+ <field state="recruit" name="no_of_hired_employee" widget="gauge"
+ style="margin-top:7px; width:160px; height: 120px;"
+ options="{
+ 'max_field': 'no_of_recruitment',
+ 'label': 'Hired Employees',
+ 'on_change': 'action_set_no_of_recruitment',
+ 'on_click_label': 'employee(s) to recruit',
+ 'force_set': False,
+ 'gauge_value_field': 'no_of_recruitment',
+ }">
+ Hired Employees
+ </field>
+ </div>
+ </div>
+ </t>
+ <t t-if="record.state.raw_value == 'open'">
+ <div class="oe_start_recruitment">
+ <p><b>click here</b>, To start the recruitment</p>
+ <img src="/hr_recruitment/static/src/img/down1.png"/>
+ </div>
+ </t>
+ <div class="oe_launch_recruitment">
+ <a t-if="record.state.raw_value == 'open'" data-name="job_recruitment" data-type="object" class="oe_kanban_action">Launch Recruitment</a>
+ <a t-if="record.state.raw_value == 'recruit'" data-name="job_open" data-type="object" class="oe_kanban_action">Recruitment Done</a>
+ <a t-if="record.survey_id.raw_value"> | </a>
+ <a t-if="record.survey_id.raw_value" data-name="action_print_survey" data-type="object" class="oe_kanban_action">Print Interview</a>
+ </div>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+
+ <!-- hr related job position menu action -->
+ <record model="ir.actions.act_window" id="action_hr_job">
+ <field name="name">Job Positions</field>
+ <field name="res_model">hr.job</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">kanban,tree,form</field>
+ <field name="context">{'search_default_in_recruitment': 1}</field>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click here to create a new job. You can remove the "In Recruitment" filter to display all the job positions.
+ </p>
+ <p>
+ Define job position profile and manage recruitment in a context of a particular job: print interview survey, define number of expected new employees, and manage its recruitment pipe
+ </p>
+ </field>
+ </record>
+
<!-- Stage Tree View -->
<record model="ir.ui.view" id="hr_recruitment_stage_tree">
<field name="name">hr.recruitment.stage.tree</field>
<field name="name">hr.recruitment.stage.form</field>
<field name="model">hr.recruitment.stage</field>
<field name="arch" type="xml">
- <form string="Stage" version="7.0">
- <sheet>
+ <form string="Stage">
<group string="Stage Definition">
<group>
<field name="name"/>
<field name="department_id"/>
+ <field name="sequence"/>
+ <field name="template_id" domain= "[('model_id.model', '=', 'hr.applicant')]"/>
</group>
<group>
- <field name="sequence"/>
<field name="fold"/>
- <field name="template_id" domain= "[('model_id.model', '=', 'hr.applicant')]"/>
+ <field name="legend_priority"/>
</group>
</group>
<separator string="Requirements"/>
<field name="requirements"/>
- </sheet>
</form>
</field>
</record>
<field name="name">hr.recruitment.degree.form</field>
<field name="model">hr.recruitment.degree</field>
<field name="arch" type="xml">
- <form string="Degree" version="7.0">
- <sheet>
+ <form string="Degree">
<group>
<field name="name"/>
<field name="sequence" groups="base.group_no_one"/>
</group>
- </sheet>
</form>
</field>
</record>
<field name="name">hr.recruitment.source.form</field>
<field name="model">hr.recruitment.source</field>
<field name="arch" type="xml">
- <form string="Sources of Applicants" version="7.0">
- <sheet>
+ <form string="Sources of Applicants">
<group>
<field name="name"/>
</group>
- </sheet>
</form>
</field>
</record>