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

@ -1,13 +1,13 @@
<?xml version="1.0" ?>
<odoo><data>
<record id="mail_channel_view_form_" model="ir.ui.view">
<field name="name">mail.channel.view.form.inherit.hr</field>
<field name="model">mail.channel</field>
<field name="inherit_id" ref="mail.mail_channel_view_form"/>
<record id="discuss_channel_view_form" model="ir.ui.view">
<field name="name">discuss.channel.view.form.inherit.hr</field>
<field name="model">discuss.channel</field>
<field name="inherit_id" ref="mail.discuss_channel_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='group_ids']" position="after">
<field name="subscription_department_ids" widget="many2many_tags"
attrs="{'invisible': [('channel_type', '!=', 'channel')]}"
invisible="channel_type != 'channel'"
string="Auto Subscribe Departments"/>
</xpath>
</field>

View file

@ -0,0 +1,84 @@
<?xml version="1.0"?>
<odoo>
<record id="hr_contract_template_form_view" model="ir.ui.view">
<field name="name">hr.contract.template.form</field>
<field name="model">hr.version</field>
<field name="arch" type="xml">
<form string="Contract Template">
<sheet>
<div class="oe_title pe-0 w-100 mw-100" name="title">
<h1 class="d-flex flex-row justify-content-between">
<field name="name" class="text-truncate" placeholder="Template Name" required="1"/>
</h1>
</div>
<group name="top_info">
<group name="top_info_left">
<field name="job_id" groups="hr.group_hr_manager"/>
<field name="department_id" groups="hr.group_hr_manager"/>
</group>
<group name="top_info_right">
<field name="hr_responsible_id" widget="many2one_avatar_user" groups="hr.group_hr_user"/>
</group>
</group>
<notebook>
<page string="Salary Information" name="information" class="o_hr_contract_salary_information" groups="hr.group_hr_manager">
<field name="currency_id" invisible="1"/> <!-- for monetary fields -->
<group name="salary_info">
<group name="contract" string="Contract Overview" groups="hr.group_hr_user">
<label for="wage"/>
<div class="o_row" name="wage">
<field name="wage" class="o_hr_narrow_field"/>
<div name="wage_period_label">/ month</div>
</div>
<field name="contract_type_id" string="Contract Type" placeholder="Contract Type"/>
<field name="structure_type_id" string="Pay Category" placeholder="Employee will be excluded from Pay Runs"
domain="['|', ('country_id', '=', False), ('country_id', '=', company_country_id)]"/>
<separator name="schedule" string="Schedule"/>
<field name="resource_calendar_id" help="The default working hours are set in configuration."/>
</group>
</group>
</page>
</notebook>
</sheet>
<chatter groups="hr.group_hr_manager"/>
</form>
</field>
</record>
<record id="hr_contract_template_list_view" model="ir.ui.view">
<field name="name">hr.contract.template.list</field>
<field name="model">hr.version</field>
<field name="arch" type="xml">
<list string="Contract Templates" default_order='name'>
<field name="name"/>
<field name="job_id"/>
<field name="department_id" optional="show"/>
<field name="currency_id" column_invisible="1"/>
<field name="wage" widget="monetary" optional="show"/>
<field name="contract_type_id" optional="show"/>
<field name="structure_type_id" optional="show"/>
<field name="resource_calendar_id" optional="show"/>
<field name="company_id" groups="base.group_multi_company" readonly="1" optional="hidden"/>
<field name="create_uid" optional="hidden"/>
<field name="create_date" optional="hidden"/>
</list>
</field>
</record>
<record id="action_hr_contract_templates" model="ir.actions.act_window">
<field name="name">Contract Templates</field>
<field name="res_model">hr.version</field>
<field name="view_mode">list,form</field>
<field name="domain">[('employee_id', '=', False)]</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'sequence': 1, 'view_id': ref('hr_contract_template_list_view')}),
(0, 0, {'view_mode': 'form', 'sequence': 2, 'view_id': ref('hr_contract_template_form_view')})]"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No Template found</p><p>
Let's create one
</p>
</field>
</record>
</odoo>

View file

@ -4,10 +4,12 @@
<record id="hr_contract_type_view_tree" model="ir.ui.view">
<field name="model">hr.contract.type</field>
<field name="arch" type="xml">
<tree string="Contract Types" editable="bottom">
<list string="Contract Types" editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
</tree>
<field name="code" column_invisible="1"/>
<field name="country_id" optional="hide"/>
</list>
</field>
</record>
@ -17,7 +19,9 @@
<form>
<group>
<group>
<field name="name" />
<field name="name"/>
<field name="code" invisible="1"/>
<field name="country_id"/>
</group>
</group>
</form>
@ -27,7 +31,7 @@
<record id="hr_contract_type_action" model="ir.actions.act_window">
<field name="name">Employment Types</field>
<field name="res_model">hr.contract.type</field>
<field name="view_mode">tree</field>
<field name="view_mode">list</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new employment type

View file

@ -8,43 +8,53 @@
<form string="department">
<field name="company_id" invisible="1"/>
<sheet>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" type="action" name="%(hr.act_employee_from_department)d" icon="fa-users">
<div class="oe_button_box" name="button_box" invisible="not id">
<button class="oe_stat_button" name="action_employee_from_department" type="object" icon="fa-users">
<field string="Employees" name="total_employee" widget="statinfo"/>
</button>
<button class="oe_stat_button" type="object" name="action_plan_from_department" icon="fa-list-ul">
<field string="Plans" name="plans_count" widget="statinfo"/>
</button>
</div>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<field name="active" invisible="1"/>
<group col="4">
<field name="name"/>
<field name="manager_id"/>
<field name="parent_id"/>
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<div class="oe_title">
<h1>
<field name="name"/>
</h1>
</div>
<group col="12">
<group colspan="7">
<field name="name" invisible="1"/> <!-- Remove in master -->
<field name="manager_id" widget="many2one_avatar_employee"/>
<field name="parent_id"/>
<field name="child_ids" invisible="1"/>
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company" placeholder="Visible to all"/>
<field name="color" widget="color_picker" string="Color"/>
</group>
<group colspan="5" invisible="not id or id and not child_ids and not parent_id">
<widget name="hr_department_chart" class="mb-3"/>
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" groups="base.group_user"/>
<field name="message_ids"/>
</div>
<chatter/>
</form>
</field>
</record>
<record id="view_department_tree" model="ir.ui.view">
<field name="name">hr.department.tree</field>
<field name="name">hr.department.list</field>
<field name="model">hr.department</field>
<field name="arch" type="xml">
<tree string="Companies" sample="1">
<field name="display_name"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="company_id" invisible="1"/>
<field name="manager_id"/>
<list string="Companies" multi_edit="1">
<field name="company_id" column_invisible="True"/>
<field name="name"/>
<field name="company_id" groups="base.group_multi_company" readonly="1"/>
<field name="manager_id" widget="many2one_avatar_employee"/>
<field name="total_employee" string="Employees"/>
<field name="parent_id"/>
</tree>
<field name="color" widget="color_picker" string="Color"/>
</list>
</field>
</record>
@ -55,7 +65,7 @@
<search string="Departments">
<field name="name" string="Department"/>
<field name="manager_id" />
<filter string="Unread Messages" name="message_needaction" domain="[('message_needaction','=',True)]"/>
<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)]"/>
</search>
@ -66,54 +76,59 @@
<field name="name">hr.department.kanban</field>
<field name="model">hr.department</field>
<field name="arch" type="xml">
<kanban class="oe_background_grey o_kanban_dashboard o_hr_department_kanban o_kanban_small_column" sample="1">
<field name="name"/>
<field name="company_id"/>
<field name="manager_id"/>
<field name="color"/>
<field name="total_employee"/>
<kanban highlight_color="color" class="o_hr_department_kanban o_kanban_small_column" can_open="0" sample="1">
<field name="active"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''}">
<div t-attf-class="o_kanban_card_header">
<div class="o_kanban_card_header_title">
<div class="o_primary"><a type="edit"><field name="name"/></a></div>
<div class="o_secondary" groups="base.group_multi_company">
<small>
<i class="fa fa-building-o" role="img" aria-label="Company" title="Company"/> <field name="company_id"/>
</small>
<t t-name="menu" t-if="!selection_mode">
<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">
<a name="action_employee_from_department" type="object">Employees</a>
</div>
<div role="menuitem">
<a name="action_open_view_child_departments" type="object">Child departments</a>
</div>
</div>
<div class="o_kanban_manage_button_section" t-if="!selection_mode">
<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 o_kanban_manage_reports">
<h5 role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</h5>
</div>
</div>
<div class="container o_kanban_card_content" t-if="!selection_mode">
<div class="row o_kanban_card_upper_content">
<div class="col-6 o_kanban_primary_left">
<button class="btn btn-primary" name="%(act_employee_from_department)d" type="action">
<t t-out="record.total_employee.raw_value"/> Employees
</button>
</div>
<div class="col-6 o_kanban_primary_right">
</div>
<div class="o_kanban_card_manage_settings row" groups="hr.group_hr_user">
<div t-if="widget.editable" role="menuitem" aria-haspopup="true" class="col-6">
<field name="color" widget="kanban_color_picker"/>
</div>
<div class="o_kanban_card_lower_content"
style="justify-content: end">
<!-- placeholder for bottom content -->
<div class="col-6">
<a t-if="widget.editable" role="menuitem" class="dropdown-item" type="open">Configuration</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>
</div>
</div>
<div class="o_kanban_card_manage_pane dropdown-menu" role="menu">
<div class="o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_manage_reports">
<div class="o_kanban_card_manage_title ps-4 pb-1">
<span class="fw-bolder">Reporting</span>
</div>
</div>
</div>
<a t-if="widget.editable" role="menuitem" class="dropdown-item" type="edit">Configuration</a>
<ul t-if="widget.editable" class="oe_kanban_colorpicker" data-field="color" role="menu"/>
</div>
</t>
<t t-name="card">
<a type="open"><field name="name" class="fw-bold fs-4 d-bolck ms-2"/></a>
<field name="manager_id" widget="many2one_avatar_employee" options="{'display_avatar_name': True}" readonly="1" class="text-muted ms-2"/>
<div class="small mt-1 ms-2" groups="base.group_multi_company">
<i class="fa fa-building-o" role="img" aria-label="Company" title="Company"/> <field name="company_id"/>
</div>
<div class="row g-0 mt-3 mb-2 ms-2" t-if="!selection_mode">
<div class="col-6">
<button class="btn btn-primary" name="action_employee_from_department" type="object">
<field name="total_employee"/> Employees
</button>
</div>
<div name="kanban_primary_right" class="col-6">
<!-- placeholder for xpaths -->
</div>
</div>
<div name="kanban_card_lower_content" class="mt-auto" t-if="!selection_mode">
<!-- placeholder for bottom content -->
</div>
</t>
</templates>
@ -121,35 +136,73 @@
</field>
</record>
<record id="hr_department_kanban_action" model="ir.actions.act_window">
<field name="name">Departments</field>
<field name="res_model">hr.department</field>
<field name="view_mode">kanban,tree,form</field>
<field name="search_view_id" ref="view_department_filter"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new department
</p><p>
Odoo's department structure is used to manage all documents
related to employees by departments: expenses, timesheets,
time off, recruitments, etc.
</p>
</field>
</record>
<record id="hr_department_tree_action" model="ir.actions.act_window">
<field name="name">Departments</field>
<field name="res_model">hr.department</field>
<field name="view_mode">tree,form,kanban</field>
<field name="view_mode">list,form,kanban</field>
<field name="search_view_id" ref="view_department_filter"/>
<field name="domain">[("has_read_access", "=", True)]</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new department
</p><p>
Structure Employees per department and have an overview of e.g.
expenses, timesheets, time off, recruitment, etc.
</p>
</field>
</record>
<record id="hr_department_tree_view_tree_action" model="ir.actions.act_window.view">
<field name="sequence" eval="10"/>
<field name="view_mode">list</field>
<field name="act_window_id" ref="hr.hr_department_tree_action"/>
</record>
<record id="hr_department_form_view_tree_action" model="ir.actions.act_window.view">
<field name="sequence" eval="15"/>
<field name="view_mode">form</field>
<field name="act_window_id" ref="hr.hr_department_tree_action"/>
</record>
<record id="hr_department_kanban_view_tree_action" model="ir.actions.act_window.view">
<field name="sequence" eval="20"/>
<field name="view_mode">kanban</field>
<field name="act_window_id" ref="hr.hr_department_tree_action"/>
</record>
<record id="hr_department_kanban_action" model="ir.actions.act_window">
<field name="name">Departments</field>
<field name="res_model">hr.department</field>
<field name="view_mode">kanban,list,form</field>
<field name="path">departments</field>
<field name="domain">[("has_read_access", "=", True)]</field>
<field name="search_view_id" ref="view_department_filter"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new department
</p><p>
Odoo's department structure is used to manage all documents
related to employees by departments: expenses, timesheets,
leaves, recruitments, etc.
Structure Employees per department and have an overview of e.g.
expenses, timesheets, time off, recruitment, etc.
</p>
</field>
</record>
<record id="hr_department_kanban_view_kanban_action" model="ir.actions.act_window.view">
<field name="sequence" eval="10"/>
<field name="view_mode">kanban</field>
<field name="act_window_id" ref="hr.hr_department_kanban_action"/>
</record>
<record id="hr_department_tree_view_kanban_action" model="ir.actions.act_window.view">
<field name="sequence" eval="15"/>
<field name="view_mode">list</field>
<field name="act_window_id" ref="hr.hr_department_kanban_action"/>
</record>
<record id="hr_department_form_view_kanban_action" model="ir.actions.act_window.view">
<field name="sequence" eval="20"/>
<field name="view_mode">form</field>
<field name="act_window_id" ref="hr.hr_department_kanban_action"/>
</record>
</data>
</odoo>

View file

@ -4,10 +4,11 @@
<record id="hr_departure_reason_view_list" model="ir.ui.view">
<field name="model">hr.departure.reason</field>
<field name="arch" type="xml">
<tree editable="bottom">
<list editable="bottom">
<field name="sequence" widget="handle" />
<field name="name" />
</tree>
<field name="country_code" optional="hide"/>
</list>
</field>
</record>
@ -17,8 +18,9 @@
<form>
<group>
<group>
<field name="sequence" />
<field name="name" />
<field name="sequence"/>
<field name="name"/>
<field name="country_code"/>
</group>
</group>
</form>
@ -28,7 +30,7 @@
<record id="hr_departure_reason_action" model="ir.actions.act_window">
<field name="name">Departure Reasons</field>
<field name="res_model">hr.departure.reason</field>
<field name="view_mode">tree</field>
<field name="view_mode">list</field>
</record>
</data>
</odoo>

View file

@ -1,37 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_employee_category_form" model="ir.ui.view">
<field name="name">hr.employee.category.form</field>
<field name="model">hr.employee.category</field>
<field name="arch" type="xml">
<form string="Employee Tags">
<sheet>
<group>
<field name="name"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_employee_category_form" model="ir.ui.view">
<field name="name">hr.employee.category.form</field>
<field name="model">hr.employee.category</field>
<field name="arch" type="xml">
<form string="Employee Tags">
<sheet>
<group>
<field name="name"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_employee_category_list" model="ir.ui.view">
<field name="name">hr.employee.category.list</field>
<field name="model">hr.employee.category</field>
<field eval="8" name="priority"/>
<field name="arch" type="xml">
<list string="Employees Tags" editable="bottom">
<field name="name"/>
</list>
</field>
</record>
<record id="view_employee_category_list" model="ir.ui.view">
<field name="name">hr.employee.category.list</field>
<field name="model">hr.employee.category</field>
<field eval="8" name="priority"/>
<field name="arch" type="xml">
<tree string="Employees Tags" editable="bottom">
<field name="name"/>
</tree>
</field>
</record>
<record id="open_view_categ_form" model="ir.actions.act_window">
<field name="name">Employee Tags</field>
<field name="res_model">hr.employee.category</field>
<field name="view_mode">tree,form</field>
</record>
</data>
<record id="open_view_categ_form" model="ir.actions.act_window">
<field name="name">Employee Tags</field>
<field name="res_model">hr.employee.category</field>
<field name="view_mode">list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No Tags found ! Let's create one
</p>
<p>
Use tags to categorize your Employees.
</p>
</field>
</record>
</odoo>

View file

@ -8,24 +8,26 @@
<field name="arch" type="xml">
<search string="Employees">
<field name="name" string="Employees" filter_domain="['|',('work_email','ilike',self),('name','ilike',self)]"/>
<field name="job_title" string="Job Title"/>
<field name="department_id" string="Department"/>
<field name="parent_id" string="Manager"/>
<field name="company_id" string="Company"/>
<searchpanel view_types="kanban,list,graph,pivot,hierarchy">
<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>
<field name="parent_id" string="Manager" domain="[('company_id', 'in', allowed_company_ids)]"/>
<field name="job_title"/>
<field name="job_id" invisible="1"/>
<separator/>
<filter name="my_team" string="My Team" domain="[('parent_id.user_id', '=', uid)]"/>
<filter name="my_department" string="My Department" domain="[('member_of_department', '=', True)]"/>
<separator/>
<filter name="newly_hired" string="Newly Hired" domain="[('newly_hired', '=', True)]"/>
<separator/>
<filter name="archived" string="Archived" domain="[('active', '=', False)]"/>
<group expand="0" string="Group By">
<group>
<filter name="group_manager" string="Manager" domain="[]" context="{'group_by':'parent_id'}"/>
<filter name="group_department" string="Department" domain="[]" context="{'group_by':'department_id'}"/>
<filter name="group_job" string="Job" domain="[]" context="{'group_by':'job_id'}"/>
<filter name="group_company" string="Company" domain="[]" context="{'group_by':'company_id'}"/>
</group>
<searchpanel>
<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>
</search>
</field>
</record>
@ -34,65 +36,69 @@
<field name="name">hr.employee.public.form</field>
<field name="model">hr.employee.public</field>
<field name="arch" type="xml">
<form string="Employee" create="0" write="0" js_class="hr_employee_form" class="o_employee_form">
<field name="image_128" invisible="1" />
<form string="Employee" create="0" write="0" js_class="hr_employee_form">
<header/>
<sheet>
<field name="user_id" invisible="1"/>
<field name="user_partner_id" invisible="1"/>
<field name="active" invisible="1"/>
<div class="oe_button_box" name="button_box">
<!-- Used by other modules-->
</div>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<field name="avatar_1920" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"avatar_128"}'/>
<div class="oe_title">
<label for="name" string="Employee Name"/>
<h1 class="d-flex flex-row">
<span class="me-2">
<widget name="hr_employee_chat" invisible="not context.get('chat_icon')"/>
</span>
<field name="name" placeholder="e.g. John Doe" required="True"
style="font-size: min(4vw, 2.6rem);"/>
</h1>
<h2>
<field name="job_title" placeholder="Job Title" />
</h2>
<div class="d-flex flex-column flex-sm-row align-items-center">
<div class="o_employee_avatar ms-2 p-0 h-100">
<field name="image_1920" widget='image' class="m-0" options='{"size": [128,158], "zoom": true, "preview_image":"avatar_128"}'/>
<field name="show_hr_icon_display" invisible="1" />
</div>
<group>
<group>
<field name="mobile_phone" widget="phone"/>
<field name="work_phone" widget="phone"/>
<field name="work_email" widget="email"/>
</group>
<group>
<field name="department_id" context="{'open_employees_kanban': 1}"/>
<field name="job_id"/>
<field name="employee_type"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="parent_id"/>
<field name="coach_id"/>
</group>
</group>
<div class="col-12 col-sm-6 col-md-7 col-lg-8 px-4 o_employee_form_header_info">
<div class="oe_title mw-100 ps-0 pe-sm-2">
<h1 class="d-flex flex-row align-items-center">
<field name="name" placeholder="Employee's Name"
required="True" style="font-size: min(4vw, 2.6rem);"/>
</h1>
<p class="d-flex align-items-baseline mb-0">
<i class="fa fa-envelope fa-fw me-1 text-primary" title="Work Email"/>
<field name="work_email" widget="email" placeholder="e.g. johndoe@example.com" string="Work Email"/>
</p>
<p class="d-flex align-items-baseline mb-0">
<i class="fa fa-phone fa-fw me-1 text-primary" title="Work Phone"/>
<field name="work_phone" widget="phone" placeholder="Work Phone" string="Work Phone"/>
</p>
<p class="d-flex align-items-baseline mb-0">
<i class="fa fa-mobile fa-fw me-1 text-primary" title="Work Mobile"/>
<field name="mobile_phone" widget="phone" placeholder="Work Mobile" string="Work Mobile"/>
</p>
</div>
</div>
<div class="align-self-start w-auto end-0 mt-2 d-flex align-items-center justify-content-end gap-2 o_presence_status_pill_wrapper">
<div invisible="not user_id">
<widget name="hr_employee_chat" invisible="not context.get('chat_icon')"/>
</div>
<field name="hr_icon_display" invisible="not show_hr_icon_display or not id or not active" widget="hr_presence_status"/>
</div>
</div>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<notebook>
<page name="public" string="Work Information">
<div id="o_work_employee_container" class="d-lg-flex"> <!-- These two div are used to position org_chart -->
<div id="o_work_employee_main" class="flex-grow-1">
<page name="work_information" string="Work">
<div id="o_work_employee_container" class="row"> <!-- These two div are used to position org_chart -->
<div id="o_work_employee_main" class="col-lg-7 d-flex flex-column">
<group string="work">
<field name="company_id" groups="base.group_multi_company"/>
<field name="department_id"/>
<field name="job_title" string="Job Title"/>
<field name="job_id" string="Job Position" context="{'default_no_of_recruitment': 0, 'default_is_favorite': False}" placeholder="e.g. Sales Manager" invisible="1"/>
<field name="parent_id" widget="many2one_avatar_employee"/>
</group>
<group string="Location" name="location">
<field name="address_id"
context="{'show_address': 1}"
options='{"always_reload": True, "highlight_first_line": True}'/>
options='{"highlight_first_line": True}'/>
<field name="work_location_id"/>
</group>
<group name="managers" string="Approvers" invisible="1">
<!-- overridden in other modules -->
</group>
<group string="Schedule" groups="base.group_no_one">
<field name="resource_calendar_id"/>
</group>
</div>
<div id="o_employee_org_chart" class="col-lg-5"></div>
</div>
</page>
<page name="resume" string="Resume">
<!-- overridden in other modules -->
</page>
</notebook>
</sheet>
</form>
@ -100,19 +106,19 @@
</record>
<record id="hr_employee_public_view_tree" model="ir.ui.view">
<field name="name">hr.employee.tree</field>
<field name="name">hr.employee.list</field>
<field name="model">hr.employee.public</field>
<field name="arch" type="xml">
<tree string="Employees" sample="1">
<list string="Employees" sample="1" expand="context.get('expand', False)">
<field name="name"/>
<field name="work_phone" class="o_force_ltr"/>
<field name="work_email"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="department_id"/>
<field name="job_title"/>
<field name="parent_id"/>
<field name="coach_id" invisible="1"/>
</tree>
<field name="job_id" options="{'no_open': True}"/>
<field name="parent_id" widget="many2one_avatar_employee"/>
<field name="coach_id" widget="many2one_avatar_employee" optional="show"/>
</list>
</field>
</record>
@ -121,77 +127,46 @@
<field name="model">hr.employee.public</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<kanban class="o_hr_employee_kanban" js_class="hr_employee_kanban" sample="1">
<field name="id"/>
<field name="hr_presence_state"/>
<field name="user_id"/>
<field name="user_partner_id"/>
<field name="last_activity"/>
<field name="hr_icon_display"/>
<kanban class="o_hr_employee_kanban" sample="1">
<field name="show_hr_icon_display"/>
<field name="image_128" />
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click o_kanban_record_has_image_fill o_hr_kanban_record">
<field name="image_1024" class="o_kanban_image_fill_left d-block" preview_image="image_128"
widget="background_image" options="{'zoom': true, 'zoom_delay': 1000}"/>
<div class="oe_kanban_details">
<div class="o_kanban_record_top">
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title">
<t t-if="record.show_hr_icon_display.raw_value">
<div class="float-end"
t-if="record.hr_icon_display.raw_value == 'presence_present'">
<!-- Employee is present/connected and it is normal according to his work schedule -->
<span class="fa fa-circle text-success" role="img" aria-label="Present"
title="Present" name="presence_present">
</span>
</div>
<div class="float-end"
t-if="record.hr_icon_display.raw_value == 'presence_absent'">
<!-- Employee is absent and it is normal according to his work schedule -->
<span class="fa fa-circle-o text-muted" role="img" aria-label="Absent"
title="Absent" name="presence_absent">
</span>
</div>
<div class="float-end"
t-if="record.hr_icon_display.raw_value == 'presence_absent_active'">
<!-- Employee is connected but according to his work schedule, he should not work for now -->
<span class="fa fa-circle-o text-success" role="img"
aria-label="Present but not active"
title="Present but not active" name="presence_absent_active">
</span>
</div>
<!-- Employee is not here but according to his work schedule, he should be connected -->
<div class="float-end"
t-if="record.hr_icon_display.raw_value == 'presence_to_define'">
<span class="fa fa-circle text-warning" role="img"
aria-label="To define" title="To define"
name="presence_to_define">
</span>
</div>
</t>
<field name="name"/>
</strong>
<span t-if="record.job_title.raw_value" class="o_kanban_record_subtitle"><field name="job_title"/></span>
<t t-name="card" class="flex-row">
<aside class="o_kanban_aside_full">
<t t-if="!record.image_1024.raw_value">
<field name="avatar_128" class="d-block position-relative"
widget="background_image" options="{'zoom': true, 'zoom_delay': 1000}"/>
</t>
<t t-else="">
<field name="image_1024" class="d-block position-relative" preview_image="image_128"
widget="background_image" options="{'zoom': true, 'zoom_delay': 1000}"/>
</t>
</aside>
<main class="ms-2">
<div>
<div t-if="record.show_hr_icon_display.raw_value" class="float-end">
<field name="hr_icon_display" class=" align-items-center" widget="hr_presence_status" />
</div>
<field class="fw-bolder" name="name" placeholder="Employee's Name"/>
</div>
<ul>
<li id="last_login"/>
<li t-if="record.work_email.raw_value"><field name="work_email" /></li>
<li t-if="record.work_phone.raw_value" class="o_force_ltr"><field name="work_phone" /></li>
</ul>
<div class="oe_kanban_content position-absolute start-0 bottom-0 end-0 me-2">
<div class="o_kanban_record_bottom">
<div class="oe_kanban_bottom_left"/>
<div class="oe_kanban_bottom_right">
<widget name="hr_employee_chat"/>
</div>
<field t-if="record.job_title.raw_value" name="job_title"/>
<field t-elif="record.job_id.raw_value" name="job_id"/>
<div t-if="record.work_email.raw_value" class="text-truncate">
<i class="fa fa-fw me-2 fa-envelope text-primary" title="Email"/>
<field name="work_email"/>
</div>
<div t-if="record.work_phone.raw_value">
<i class="fa fa-fw me-2 fa-phone text-primary" title="Phone"/>
<field name="work_phone"/>
</div>
<div class="d-flex">
<div invisible="birthday_public_display_string == 'hidden'">
<i class="fa fa-fw me-2 fa-birthday-cake text-primary" title="Birthday"/>
<field name="birthday_public_display_string"/>
</div>
<field name="user_id" widget="many2one_avatar_user" readonly="1" class="ms-auto"/>
</div>
</div>
</div>
</main>
</t>
</templates>
</kanban>
@ -201,21 +176,128 @@
<record id="hr_employee_public_action" model="ir.actions.act_window">
<field name="name">Employees</field>
<field name="res_model">hr.employee.public</field>
<field name="view_mode">kanban,tree,form</field>
<field name="domain">[]</field>
<field name="view_mode">kanban,list,form</field>
<field name="domain">[('company_id', 'in', allowed_company_ids)]</field>
<field name="context">{'chat_icon': True}</field>
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="hr_employee_public_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
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>
<div>
<div class="o_nocontent_help">
<div>
<p class="text-center fs-1">
Ready to start your experience?
</p>
<hr class="my-4"/>
</div>
<div>
<div class="container">
<div class="row text-center">
<div class="col-12 col-sm-4">
<p class="fs-2 mb-0">Hiring</p>
</div>
<div class="col-12 col-sm-4">
<p class="fs-2 mb-0">Experience</p>
</div>
<div class="col-12 col-sm-4">
<p class="fs-2 mb-0">Development</p>
</div>
</div>
</div>
<div class="container mt-4 d-none d-md-block">
<div class="row text-center">
<div class="col-md-4 d-flex flex-column align-items-center gap-4 mb-4">
<div class="d-flex flex-column align-items-center">
<img src="/hr_recruitment/static/description/icon.png" width="60"/>
<small>Hiring</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/sign/static/description/icon.png" width="60"/>
<small>Sign</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/hr_referral/static/description/icon.png" width="60"/>
<small>Referral</small>
</div>
</div>
<div class="col-md-4 d-flex flex-wrap justify-content-center gap-4 mb-4">
<div class="d-flex flex-column align-items-center">
<img src="/ai/static/description/icon.png" width="60"/>
<small>AI</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/hr_payroll/static/description/icon.png" width="60"/>
<small>Payroll</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/planning/static/description/icon.png" width="60"/>
<small>Planning</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/hr_holidays/static/description/icon.png" width="60"/>
<small>Leaves</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/fleet/static/description/icon.png" width="60"/>
<small>Fleet</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/lunch/static/description/icon.png" width="60"/>
<small>Lunch</small>
</div>
</div>
<div class="col-md-4 d-flex flex-wrap justify-content-center gap-4 mb-4">
<div class="d-flex flex-column align-items-center">
<img src="/hr_appraisal/static/description/icon.png" width="60"/>
<small>Performance</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/hr_skills/static/description/icon.png" width="60"/>
<small>Talent</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/website_slides/static/description/icon.png" width="60"/>
<small>eLearning</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/event/static/description/icon.png" width="60"/>
<small>Trainings</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/documents/static/description/icon.png" width="60"/>
<small>Documents</small>
</div>
<div class="d-flex flex-column align-items-center">
<img src="/board/static/description/icon.png" width="60"/>
<small>Dashboard</small>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</field>
</record>
<record id="act_hr_employee_public_kanban_view" model="ir.actions.act_window.view">
<field name="sequence" eval="10"/>
<field name="view_mode">kanban</field>
<field name="act_window_id" ref="hr.hr_employee_public_action"/>
</record>
<record id="act_hr_employee_public_tree_view" model="ir.actions.act_window.view">
<field name="sequence" eval="15"/>
<field name="view_mode">list</field>
<field name="act_window_id" ref="hr.hr_employee_public_action"/>
</record>
<record id="act_hr_employee_public_form_view" model="ir.actions.act_window.view">
<field name="sequence" eval="20"/>
<field name="view_mode">form</field>
<field name="act_window_id" ref="hr.hr_employee_public_action"/>
</record>
</data>
</odoo>

File diff suppressed because it is too large Load diff

View file

@ -7,60 +7,57 @@
<field name="model">hr.job</field>
<field name="arch" type="xml">
<form string="Job">
<header/> <!-- inherited in other module -->
<field name="active" invisible="1"/>
<field name="company_id" invisible="1"/>
<sheet>
<div class="oe_button_box" name="button_box"/>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" placeholder="e.g. Sales Manager"/></h1>
<h1>
<field name="name" options="{'line_breaks': False}" widget="text" placeholder="e.g. Sales Manager"/>
</h1>
</div>
<notebook>
<page string="Recruitment" name="recruitment_page">
<page string="Details" name="recruitment_page" invisible="1" groups="hr.group_hr_user">
<group>
<group name="recruitment">
<field name="company_id" options="{'no_create': True}" invisible="1" groups="base.group_multi_company"/>
<field name="department_id"/>
<field name="contract_type_id"/>
<group name="hiring_process" string="Hiring Process">
<field name="user_id" widget="many2one_avatar_user"/>
</group>
<group name="recruitment2">
<label for="no_of_recruitment"/>
<group name="job_posting" string="Job Posting">
<label name="no_of_recruitment_label" for="no_of_recruitment"/>
<div class="o_row" name="recruitment_target">
<field name="no_of_recruitment" class="o_hr_narrow_field"/>
<span>new Employees</span>
<span>new employees</span>
</div>
</group>
<group name="job" string="Job">
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company" placeholder="Visible to all"/>
<field name="department_id"/>
</group>
<group name="contract" string="Contract">
<field name="contract_type_id"/>
</group>
</group>
</page>
<page string="Job Summary" name="job_description_page">
<field name="description" options="{'collaborative': true}"/>
<page string="Summary" name="job_description_page" invisible="1" groups="hr.group_hr_user">
<field name="description" options="{'collaborative': true}" placeholder="e.g. Summarize the position in one or two lines..."/>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" options="{'open_attachments': True}"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<record id="view_hr_job_tree" model="ir.ui.view">
<field name="name">hr.job.tree</field>
<field name="name">hr.job.list</field>
<field name="model">hr.job</field>
<field name="arch" type="xml">
<tree string="Job" sample="1">
<list string="Job" sample="1">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="department_id"/>
<field name="no_of_recruitment"/>
<field name="no_of_employee" optional="hide"/>
<field name="expected_employees" optional="hide"/>
<field name="no_of_hired_employee" optional="hide"/>
<field name="message_needaction" invisible="1"/>
<field name="company_id" groups="base.group_multi_company" optional="hide"/>
<field name="company_id" invisible="1"/>
</tree>
<field name="no_of_employee" optional="hide" string="Number of Employees"/>
</list>
</field>
</record>
@ -70,18 +67,12 @@
<field name="arch" type="xml">
<kanban class="o_kanban_mobile" sample="1">
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click">
<div>
<strong><field name="name"/></strong>
</div>
<div>
<span><field name="department_id"/>&amp;nbsp;</span>
</div>
<div t-if="!selection_mode">
<span>Vacancies : <field name="expected_employees"/></span>
</div>
</div>
<t t-name="card">
<field class="fw-bold" name="name"/>
<field name="department_id"/>
<span t-if="!selection_mode" groups="hr.group_hr_user">
Vacancies: <field name="expected_employees"/>
</span>
</t>
</templates>
</kanban>
@ -96,10 +87,10 @@
<field name="name" string="Job Position"/>
<field name="department_id" operator="child_of"/>
<separator/>
<filter name="message_needaction" string="Unread Messages" domain="[('message_needaction', '=', True)]"/>
<filter name="message_needaction" string="Unread Messages" domain="[('message_needaction', '=', True)]" groups="mail.group_mail_notification_type_inbox"/>
<separator/>
<filter name="archived" string="Archived" domain="[('active', '=', False)]"/>
<group expand="0" string="Group By">
<group>
<filter string="Department" name="department" domain="[]" context="{'group_by': 'department_id'}"/>
<filter string="Company" name="company" domain="[]" context="{'group_by': 'company_id'}" groups="base.group_multi_company"/>
<filter string="Employment Type" name="employment_type" domain="[]" context="{'group_by': 'contract_type_id'}"/>
@ -108,18 +99,27 @@
</field>
</record>
<record id="action_create_job_position" 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.view_hr_job_form"/>
<field name="target">current</field>
</record>
<record id="action_hr_job" model="ir.actions.act_window">
<field name="name">Job Positions</field>
<field name="res_model">hr.job</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_job_filter"/>
<field name="context">{"search_default_Current":1}</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>
<p class="o_view_nocontent_smiling_face">
Ready to recruit more efficiently?
</p>
<a name="%(hr.action_create_job_position)d" class="btn btn-link" type="action">
Let's create a job position
</a>
</field>
</record>

View file

@ -1,127 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="hr_plan_view_search" model="ir.ui.view">
<field name="name">hr.plan.view.search</field>
<field name="model">hr.plan</field>
<field name="arch" type="xml">
<search string="Plan">
<field name="name"/>
<field name="department_id"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
</search>
</field>
</record>
<record id="hr_plan_view_tree" model="ir.ui.view">
<field name="name">hr.plan.view.tree</field>
<field name="model">hr.plan</field>
<field name="arch" type="xml">
<tree string="Planning">
<field name="name"/>
<field name="steps_count"/>
<field name="department_id" optional="show"/>
<field name="company_id" groups="base.group_multi_company" optional="hide"/>
<field name="company_id" invisible="1"/>
</tree>
</field>
</record>
<record id="hr_plan_view_form" model="ir.ui.view">
<field name="name">hr.plan.view.form</field>
<field name="model">hr.plan</field>
<field name="arch" type="xml">
<form string="Planning">
<field name="company_id" invisible="1"/>
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<div class="oe_title">
<label for="name" string="Plan Name"/>
<h1>
<field name="name" placeholder="e.g. Onboarding"/>
</h1>
</div>
<group>
<field name="department_id"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="active" invisible="1"/>
</group>
<notebook>
<page string="Activities To Generate">
<field name="plan_activity_type_ids" nolabel="1">
<tree>
<field name="company_id" invisible="1"/>
<field name="activity_type_id"/>
<field name="summary"/>
<field name="responsible"/>
<field name="responsible_id" attrs="{'readonly': [('responsible', '!=', 'other')]}" optional="hide"/>
<field name="company_id" groups="base.group_multi_company" optional="hide"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="hr_plan_activity_type_view_tree" model="ir.ui.view">
<field name="name">hr.plan.activity.type.view.tree</field>
<field name="model">hr.plan.activity.type</field>
<field name="arch" type="xml">
<tree string="Activities">
<field name="activity_type_id"/>
<field name="summary"/>
<field name="responsible"/>
<field name="company_id" groups="base.group_multi_company"/>
</tree>
</field>
</record>
<record id="hr_plan_activity_type_view_form" model="ir.ui.view">
<field name="name">hr.plan.activity.type.view.form</field>
<field name="model">hr.plan.activity.type</field>
<field name="arch" type="xml">
<form string="Activity">
<field name="company_id" invisible="1"/>
<sheet>
<group>
<field name="activity_type_id"/>
<field name="summary"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="responsible"/>
<field name="responsible_id" attrs="{'invisible': [('responsible', '!=', 'other')]}"/>
<field name="note"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="hr_plan_action" model="ir.actions.act_window">
<field name="name">Plans</field>
<field name="res_model">hr.plan</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="hr_plan_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add a new plan
</p>
</field>
</record>
<record id="hr_plan_activity_type_action" model="ir.actions.act_window">
<field name="name">Plan Activities</field>
<field name="res_model">hr.plan.activity.type</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add a new plan activity
</p>
</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="hr_employee_plan_activity_summary">
<div class="d-flex flex-column flex-grow">
<t t-foreach="activity_ids" t-as="activity">
<span><i t-attf-class="fa #{activity.icon}"/> <t t-esc="activity.summary"/> (<t t-if="activity.user_id" t-esc="activity.user_id.name"/>)</span>
<span><i class="fa fa-clock-o"/> <span t-field="activity.date_deadline"/></span>
</t>
</div>
</template>
</odoo>

View file

@ -0,0 +1,119 @@
<?xml version="1.0"?>
<odoo>
<record id="hr_version_list_view" model="ir.ui.view">
<field name="name">hr.version.list</field>
<field name="model">hr.version</field>
<field name="arch" type="xml">
<list string="Records" multi_edit="1" default_order='date_version DESC' create="0" action="action_open_version" type="object" class="o_hr_version_list_view">
<field name="date_version" readonly="False" string="Effective Date"/>
<field name="contract_date_start" string="Start"/>
<field name="contract_date_end" string="End"/>
<field name="employee_id" optional="show"/>
<field name="additional_note" string="Note" optional="show"/>
<field name="currency_id" column_invisible="1"/>
<field name="wage" widget="monetary" optional="hide"/>
<field name="contract_type_id" optional="show"/>
<field name="structure_type_id" optional="hide"/>
<field name="job_id" optional="show"/>
<field name="department_id" optional="show"/>
<field name="hr_responsible_id" optional="hide"/>
<field name="resource_calendar_id" optional="show"/>
<field name="company_id" groups="base.group_multi_company" readonly="1" optional="hide"/>
<field name="create_uid" optional="hide"/>
<field name="create_date" optional="hide"/>
<field name="last_modified_uid" optional="hide" readonly="1"/>
<field name="last_modified_date" optional="hide" readonly="1"/>
</list>
</field>
</record>
<record id="hr_version_graph_view" model="ir.ui.view">
<field name="name">hr.version.graph</field>
<field name="model">hr.version</field>
<field name="arch" type="xml">
<graph string="Employee Records" type="bar" sample="1">
<field name="date_version" type="row"/>
<field name="wage" widget="monetary" type="measure"/>
</graph>
</field>
</record>
<record id="hr_version_pivot_view" model="ir.ui.view">
<field name="name">hr.version.pivot</field>
<field name="model">hr.version</field>
<field name="arch" type="xml">
<pivot string="Employee Records" sample="1">
<field name="date_version" type="row"/>
<field name="wage" widget="monetary"/>
</pivot>
</field>
</record>
<record id="hr_version_search_view" model="ir.ui.view">
<field name="name">hr.version.search</field>
<field name="model">hr.version</field>
<field name="arch" type="xml">
<search>
<field name="employee_id"/>
<field name="job_id"/>
<field name="department_id" operator="child_of"/>
<field name="resource_calendar_id"/>
<filter string="Running Contract" name="running_contract"
domain="[
'&amp;',
'|',
('contract_date_start', '=', False),
('contract_date_start', '&lt;', 'today'),
'|',
('contract_date_end', '=', False),
('contract_date_end', '>=', 'today')
]"/>
<filter string="Expired Contracts" name="expired_contracts"
domain="[
('contract_date_end', '!=', False),
('contract_date_end', '&lt;', 'today')
]"/>
<filter string="Future Contracts" name="future_contracts"
domain="[
('contract_date_start', '!=', False),
('contract_date_start', '>', 'today'),
]"/>
<separator />
<filter string="Contract Start Date" name="contract_date_start" date="contract_date_start" groups="hr.group_hr_manager"/>
<filter string="Contract End Date" name="contract_date_end" date="contract_date_end" groups="hr.group_hr_manager"/>
<separator />
<filter string="Archived" name="archived" domain="[('active', '=', False)]"/>
<filter invisible="1" string="Late Activities" name="activities_overdue"
domain="[('my_activity_date_deadline', '&lt;', context_today().strftime('%Y-%m-%d'))]"
help="Show all records whose next activity date is past"/>
<filter invisible="1" string="Today Activities" name="activities_today"
domain="[('my_activity_date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter invisible="1" string="Future Activities" name="activities_upcoming_all"
domain="[('my_activity_date_deadline', '&gt;', context_today().strftime('%Y-%m-%d'))]"/>
<filter string="Employee" name="group_by_employee" domain="[]" context="{'group_by': 'employee_id'}"/>
<separator />
<filter string="Job Position" name="group_by_job" domain="[]" context="{'group_by': 'job_id'}"/>
<filter string="Department" name="group_by_department" domain="[]" context="{'group_by': 'department_id'}"/>
<separator />
<filter string="Working Schedule" name="group_by_resource_calendar_id" domain="[]" context="{'group_by': 'resource_calendar_id'}"/>
<filter string="Salary Structure Type" name="group_by_structure_type_id" domain="[]" context="{'group_by': 'structure_type_id'}"/>
</search>
</field>
</record>
<record id="action_hr_version" model="ir.actions.act_window">
<field name="name">Employee Records</field>
<field name="path">versions</field>
<field name="res_model">hr.version</field>
<field name="view_mode">list,graph,pivot</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'list', 'view_id': ref('hr.hr_version_list_view')}),
(0, 0, {'view_mode': 'kanban'}),
(0, 0, {'view_mode': 'pivot'})
]"/>
<field name="domain">[('employee_id', '!=', False)]</field>
<field name="search_view_id" ref="hr.hr_version_search_view"/>
</record>
</odoo>

View file

@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<menuitem
id="menu_hr_root"
name="Employees"
groups="group_hr_manager,group_hr_user,base.group_user"
web_icon="hr,static/description/icon.svg"
web_icon="hr,static/description/icon.png"
sequence="185"/>
<menuitem
@ -18,17 +17,11 @@
<menuitem
id="menu_hr_employee_payroll"
name="Employees"
action="open_view_employee_list_my"
parent="menu_hr_root"
groups="group_hr_user"
sequence="3"/>
<menuitem
id="menu_hr_employee_user"
name="Employees"
action="open_view_employee_list_my"
parent="menu_hr_employee_payroll"
sequence="1"/>
<menuitem
id="menu_hr_employee"
name="Directory"
@ -40,55 +33,53 @@
id="hr_menu_hr_reports"
name="Reporting"
parent="menu_hr_root"
groups="group_hr_user"
sequence="95"/>
<menuitem
id="menu_hr_reporting_timesheet"
name="Reporting"
parent="menu_hr_root"
groups="group_hr_manager,group_hr_user"
sequence="99"/>
id="menu_hr_department_kanban"
action="hr_department_kanban_action"
parent="menu_hr_root"
groups="base.group_user"/>
<menuitem
id="menu_human_resources_configuration"
name="Configuration"
parent="menu_hr_root"
groups="hr.group_hr_user"
groups="group_hr_manager"
sequence="100"/>
<menuitem
id="menu_config_employee"
name="Employee"
parent="menu_human_resources_configuration"
groups="group_hr_user"
sequence="10"/>
<menuitem
id="menu_hr_department_tree"
action="hr_department_tree_action"
id="menu_config_plan_plan"
name="Onboarding / Offboarding"
action="mail_activity_plan_action"
parent="menu_config_employee"
sequence="4"
groups="group_hr_user"/>
<menuitem
id="menu_hr_department_kanban"
action="hr_department_kanban_action"
parent="menu_hr_root"
groups="group_hr_user"/>
sequence="1"/>
<menuitem
id="menu_hr_work_location_tree"
action="hr_work_location_action"
parent="menu_config_employee"
sequence="5"
groups="group_hr_user"/>
sequence="5"/>
<menuitem
id="menu_resource_calendar_view"
action="resource.action_resource_calendar_form"
parent="menu_config_employee"
name="Working Schedules"
sequence="6"/>
<menuitem
id="menu_hr_departure_reason_tree"
action="hr_departure_reason_action"
parent="menu_config_employee"
sequence="5"
groups="group_hr_user"/>
sequence="7"/>
<menuitem
id="menu_view_employee_category_form"
@ -102,7 +93,6 @@
id="menu_config_recruitment"
name="Recruitment"
parent="menu_human_resources_configuration"
groups="group_hr_user"
sequence="20"/>
<menuitem
@ -111,27 +101,21 @@
parent="menu_config_recruitment"
sequence="1"/>
<menuitem
id="menu_hr_employee_contract_templates"
name="Contract Templates"
action="action_hr_contract_templates"
parent="menu_config_recruitment"
sequence="2"
groups="hr.group_hr_manager"/>
<menuitem
id="menu_view_hr_contract_type"
action="hr_contract_type_action"
parent="menu_config_recruitment"
sequence="2"
groups="group_hr_user"/>
<menuitem
id="menu_config_plan"
name="Activity Planning"
parent="menu_human_resources_configuration"
groups="group_hr_user"
sequence="100"/>
<menuitem
id="menu_config_plan_plan"
name="On/Offboarding Plans"
action="hr_plan_action"
parent="menu_config_plan"
sequence="3"
groups="group_hr_user"
sequence="100"/>
active="0"/>
</data>
</odoo>

View file

@ -2,46 +2,45 @@
<odoo>
<data>
<record id="hr_work_location_tree_view" model="ir.ui.view">
<field name="name">hr.work.location.view.tree</field>
<field name="name">hr.work.location.view.list</field>
<field name="model">hr.work.location</field>
<field name="arch" type="xml">
<tree string="Work Location">
<field name="active" invisible="1" />
<list string="Work Location">
<field name="active" column_invisible="True" />
<field name="name" />
<field name="address_id" />
<field class="o_homework_icon_types d-flex flex-wrap" name="location_type"
widget="hr_homeworking_radio_image" options="{'horizontal': true}"/>
<field name="company_id" groups="base.group_multi_company" />
<field name="company_id" invisible="1"/>
</tree>
</list>
</field>
</record>
<record id="hr_work_location_form_view" model="ir.ui.view">
<field name="name">hr.work.location.view.form</field>
<field name="model">hr.work.location</field>
<field name="arch" type="xml">
<form string="Work Location">
<field name="company_id" invisible="1"/>
<sheet>
<group>
<group>
<field name="active" invisible="1" />
<field name="name" />
<field name="address_id" />
<field name="location_number"/>
<field class="o_homework_icon_types d-flex flex-wrap" name="location_type"
widget="hr_homeworking_radio_image" options="{'horizontal': true}"/>
</group>
<group>
<field name="company_id" groups="base.group_multi_company" />
<field name="company_id" groups="!base.group_multi_company" invisible="1" />
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="hr_work_location_action" model="ir.actions.act_window">
<field name="name">Work Locations</field>
<field name="res_model">hr.work.location</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new work location

View file

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="mail_activity_plan_template_view_form" model="ir.ui.view">
<field name="name">mail.activity.plan.template.view.form.inherit.hr</field>
<field name="model">mail.activity.plan.template</field>
<field name="inherit_id" ref="mail.mail_activity_plan_template_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='responsible_type']" position="replace">
<field name="responsible_type"
invisible="res_model != 'hr.employee'"/>
<field name="responsible_type" widget="filterable_selection"
options="{'whitelisted_values': ['on_demand', 'other']}"
invisible="res_model == 'hr.employee'"/>
</xpath>
</field>
</record>
<record id="mail_activity_plan_view_form" model="ir.ui.view">
<field name="name">mail.activity.plan.view.form.inherit.hr</field>
<field name="model">mail.activity.plan</field>
<field name="inherit_id" ref="mail.mail_activity_plan_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='template_ids']/list/field[@name='responsible_type']" position="replace">
<!-- We can hide selection options specific to employee because employee plan templates are never
edited in the list view, so that there are not present for other model that are edited in the
list view. -->
<field name="responsible_type" widget="filterable_selection"
options="{'whitelisted_values': ['on_demand', 'other']}"/>
</xpath>
<xpath expr="//group[@name='group_plan_fields']/group[@name='company_id']" position="before">
<field name="department_assignable" invisible="1"/>
<group invisible="not department_assignable">
<field name="department_id" placeholder="Available for all Departments"/>
</group>
</xpath>
</field>
</record>
<record id="mail_activity_plan_view_form_hr_employee" model="ir.ui.view">
<field name="name">mail.activity.plan.view.form.hr.employee</field>
<field name="mode">primary</field>
<field name="model">mail.activity.plan</field>
<field name="priority">32</field>
<field name="inherit_id" ref="mail.mail_activity_plan_view_form_fixed_model"/>
<field name="arch" type="xml">
<xpath expr="//list" position="attributes">
<attribute name="editable"/>
</xpath>
</field>
</record>
<record id="mail_activity_plan_view_tree" model="ir.ui.view">
<field name="name">mail.activity.plan.view.list.inherit.hr</field>
<field name="model">mail.activity.plan</field>
<field name="inherit_id" ref="mail.mail_activity_plan_view_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='steps_count']" position="before">
<field name="department_id" optional="show"
column_invisible="context.get('default_res_model') != 'hr.employee'"/>
</xpath>
</field>
</record>
<record id="mail_activity_plan_action" model="ir.actions.act_window">
<field name="name">Employee 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.employee'}</field>
<field name="domain">[('res_model', '=', 'hr.employee'), '|', ('company_id', 'in', allowed_company_ids), ('company_id', '=', False)]</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create an Activity Plan
</p>
<p>
Activity plans are used to assign a list of activities in just a few clicks
(e.g. "Onboarding", "Offboarding", ...)
</p>
</field>
</record>
<record id="mail_activity_plan_action_employee_view_tree" model="ir.actions.act_window.view">
<field name="sequence">1</field>
<field name="view_mode">list</field>
<field name="view_id" ref="mail.mail_activity_plan_view_tree"/>
<field name="act_window_id" ref="hr.mail_activity_plan_action"/>
</record>
<!-- Force the hr view which do the activity template edition in a popup. -->
<record id="mail_activity_plan_action_employee_view_form" model="ir.actions.act_window.view">
<field name="sequence">2</field>
<field name="view_mode">form</field>
<field name="view_id" ref="hr.mail_activity_plan_view_form_hr_employee"/>
<field name="act_window_id" ref="hr.mail_activity_plan_action"/>
</record>
<!-- This id is referenced in chatter message as a link to launch the plan -->
<record id="plan_wizard_action" model="ir.actions.act_window">
<field name="name">Launch Plan</field>
<field name="res_model">mail.activity.schedule</field>
<field name="view_mode">form</field>
<field name="context">{'plan_mode': True}</field>
<field name="target">new</field>
</record>
</data>
</odoo>

View file

@ -6,113 +6,82 @@
<field name="priority" eval="70"/>
<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="Employees" string="Employees" data-key="hr" groups="hr.group_hr_manager">
<h2>Employees</h2>
<div class="row mt16 o_settings_container" name="employees_setting_container">
<div class="col-12 col-lg-6 o_setting_box" id="presence_control_setting" title="Presence of employees">
<div class="o_setting_right_pane">
<span class="o_form_label">Presence Control</span>
<div class="content-group" name="hr_presence_options">
<div class="d-flex">
<field name="module_hr_attendance" class="ml16"/>
<label for="module_hr_attendance" class="o_light_label"/>
</div>
<div class="d-flex">
<field name="hr_presence_control_login" class="ml16"/>
<label for="hr_presence_control_login" class="o_light_label"/>
</div>
<xpath expr="//form" position="inside">
<app data-string="Employees" string="Employees" name="hr" groups="hr.group_hr_manager">
<block title="Employees" name="employees_setting_container">
<setting id="presence_control_setting" title="Presence of employees" string="Presence Display">
<div class="content-group" name="hr_presence_options">
<div class="d-flex">
<field name="module_hr_attendance" class="ml16"/>
<label for="module_hr_attendance" class="o_light_label"/>
</div>
<div class="d-flex">
<field name="hr_presence_control_login" class="ml16"/>
<label for="hr_presence_control_login" class="o_light_label"/>
</div>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box"
id="presence_reporting_setting"
title="Advanced presence of employees">
<div class="o_setting_left_pane">
<field name="module_hr_presence"/>
</setting>
<setting id="presence_reporting_setting" help="Presence reporting screen, email and IP address control." title="Advanced presence of employees">
<field name="module_hr_presence"/>
<div class="d-flex mt-1" invisible="not module_hr_presence">
<field name="hr_presence_control_email" class="ml16"/>
<label for="hr_presence_control_email" class="o_light_label"/>
</div>
<div class="o_setting_right_pane">
<label for="module_hr_presence"/>
<div class="text-muted" name="hr_presence_options_advanced">
Presence reporting screen, email and IP address control.
</div>
<div class="d-flex mt-1" attrs="{'invisible': [('module_hr_presence', '=', False)]}">
<field name="hr_presence_control_email" class="ml16"/>
<label for="hr_presence_control_email" class="o_light_label"/>
</div>
<div class="d-flex ml32" attrs="{'invisible': ['|', ('module_hr_presence', '=', False), ('hr_presence_control_email', '=', False)]}">
<span class="flex-shrink-0 ml8 me-2">Minimum number of emails to send</span>
<field name="hr_presence_control_email_amount" class="ms-2 oe_inline"/>
</div>
<div class="d-flex" attrs="{'invisible': [('module_hr_presence', '=', False)]}">
<field name="hr_presence_control_ip" class="ml16"/>
<label for="hr_presence_control_ip" class="o_light_label"/>
</div>
<div class="d-flex ml32" attrs="{'invisible': ['|', ('module_hr_presence', '=', False), ('hr_presence_control_ip', '=', False)]}">
<span class="flex-shrink-0 ml8 me-2">IP Addresses (comma-separated)</span>
<field name="hr_presence_control_ip_list" class="ms-2 oe_inline"/>
</div>
<div class="d-flex" invisible="not module_hr_presence">
<field name="hr_presence_control_ip" class="ml16"/>
<label for="hr_presence_control_ip" class="o_light_label"/>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box" id="enrich_employee_setting">
<div class="o_setting_left_pane">
<field name="module_hr_skills"/>
</setting>
<setting id="presence_reporting_setting"
help="Define the minimum number of sent emails to be displayed as Present."
title="Advanced presence of employees" string="Presence Condition"
invisible="not module_hr_presence or not hr_presence_control_email">
<div class="d-flex">
<span class="flex-shrink-0 ml8 me-2">Sent Emails</span>
<field name="hr_presence_control_email_amount" class="ms-2 oe_inline"/>
</div>
<div class="o_setting_right_pane">
<label for="module_hr_skills"/>
<div class="text-muted">
Enrich employee profiles with skills and resumes
</div>
</setting>
<setting id="presence_reporting_setting"
help="Define the allowed IP to be displayed as Present. In case of multiple addresses, separate them by a coma."
title="Advanced presence of employees" string="Presence Condition"
invisible="not module_hr_presence or not hr_presence_control_ip">
<div class="d-flex">
<span class="flex-shrink-0 ml8 me-2">IP Addresses</span>
<field name="hr_presence_control_ip_list" class="ms-2 oe_inline"/>
</div>
</div>
</div>
<h2>Work Organization</h2>
<div class="row mt16 o_settings_container" name="work_organization_setting_container">
<div class="col-12 col-lg-6 o_setting_box" id="default_company_schedule_setting">
<div class="o_setting_right_pane">
<label for="resource_calendar_id"/>
<span class="fa fa-lg fa-building-o" title="Values set here are company-specific." role="img" aria-label="Values set here are company-specific." groups="base.group_multi_company"/>
<div class="row">
<div class="text-muted col-lg-8">
Set default company schedule to manage your employees working time
</div>
</div>
<div class="content-group">
<div class="mt16">
<field name="resource_calendar_id" required="1"
class="o_light_label"
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]"
context="{'default_company_id': company_id}"/>
</div>
</div>
</div>
</div>
</div>
<h2>Employee Update Rights</h2>
<div class="row mt16 o_settings_container" name="employee_rights_setting_container">
<div class="col-12 col-lg-6 o_setting_box" title="Allow employees to update their own data.">
<div class="o_setting_left_pane">
<field name="hr_employee_self_edit"/>
</div>
<div class="o_setting_right_pane">
<label for="hr_employee_self_edit"/>
<div class="text-muted">
Allow employees to update their own data
</div>
</div>
</div>
</div>
</div>
</setting>
<setting invisible="not module_hr_presence or not (hr_presence_control_ip or hr_presence_control_email) or (hr_presence_control_ip and hr_presence_control_email)"
help="This setting block is utilized to manage the frontend design."/>
<setting help="Enrich employee profiles with skills and resumes" id="enrich_employee_setting">
<field name="module_hr_skills"/>
</setting>
</block>
<block title="Work Organization" name="work_organization_setting_container">
<setting company_dependent="1" help="Set default company schedule to manage your employees working time" id="default_company_schedule_setting">
<field name="resource_calendar_id" required="1" class="o_light_label"
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]"
context="{'default_company_id': company_id}"/>
</setting>
</block>
<block title="Contract" id="contract_work_permit_expiration_notify">
<setting string="Contract Expiration Notice Period" id="contract_notice_period"
title="Number of days prior to the contract end date that a contract expiration warning is triggered.">
<field name="contract_expiration_notice_period" class="w-25"/><span>Days</span>
</setting>
<setting string="Work Permit Expiration Notice Period" id="work_permit_notice_period"
title="Number of days prior to the work permit expiration date that a warning is triggered.">
<field name="work_permit_expiration_notice_period" class="w-25"/><span>Days</span>
</setting>
</block>
</app>
</xpath>
</field>
</record>
<record id="hr_config_settings_action" 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', 'bin_size': False}</field>
</record>

View file

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_partner_bank_form_inherit_hr" model="ir.ui.view">
<field name="name">res.partner.bank.form.inherit.hr</field>
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base.view_partner_bank_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='allow_out_payment']" position="after">
<field name="employee_has_multiple_bank_accounts" invisible="1"/>
<label string="Salary Allocation" for="employee_salary_amount"
invisible="not employee_has_multiple_bank_accounts" groups="hr.group_hr_user"/>
<div class="d-flex" invisible="not employee_has_multiple_bank_accounts" groups="hr.group_hr_user">
<span><field name="employee_salary_amount" style="max-width: 200px;"/></span>
<span invisible="not employee_salary_amount_is_percentage">%</span>
<field name="currency_id" invisible="employee_salary_amount_is_percentage" readonly="True"/>
</div>
<field name="employee_id" invisible="not employee_id" groups="hr.group_hr_user" widget="many2many_avatar_employee"/>
</xpath>
<xpath expr="//page" position="before">
<page string="Bank Information" invisible="not bank_id">
<group>
<field name="bank_name" string="Bank Name"/>
<field name="bank_bic"/>
</group>
<group>
<group name="address_details">
<label for="bank_street" string="Bank Address"/>
<div class="o_address_format">
<field name="bank_street" placeholder="Street..." class="o_address_street"/>
<field name="bank_street2" placeholder="Street 2..." class="o_address_street"/>
<field name="bank_city" placeholder="City" class="o_address_city"/>
<field name="bank_state" placeholder="State" class="o_address_state"
options='{"no_open": True}'
/>
<field name="bank_zip" placeholder="ZIP" class="o_address_zip"/>
<field name="bank_country" placeholder="Country" class="o_address_country"
options='{"no_open": True, "no_create": True}'
/>
</div>
</group>
<group name="communication_details">
<field name="bank_phone" class="o_force_ltr"/>
<field name="bank_email" widget="email"/>
</group>
</group>
</page>
</xpath>
</field>
</record>
</odoo>

View file

@ -6,13 +6,25 @@
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button name="action_open_employees" type="object" class="oe_stat_button" icon="fa-id-card-o" groups="hr.group_hr_user" attrs="{'invisible': [('employees_count', '=', 0)]}">
<button name="action_open_employees" type="object" class="oe_stat_button" icon="fa-id-card-o" groups="hr.group_hr_user" invisible="employees_count == 0">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value"><field name="employees_count"/></span>
<span class="o_stat_text">Employee(s)</span>
<span class="o_stat_text">Employee</span>
</div>
</button>
</div>
</field>
</record>
<record id="res_partner_view_search" model="ir.ui.view">
<field name="name">res.partner.search.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_res_partner_filter"/>
<field name="arch" type="xml">
<xpath expr="//filter[@name='inactive']" position="before">
<filter name="employees" string="Employees" domain="[('employee', '=', True)]"/>
<separator/>
</xpath>
</field>
</record>
</odoo>

View file

@ -3,23 +3,18 @@
<data>
<!-- Inherit the preference view to remove title, image and footer -->
<!-- This view is meant to be included in the employee profile view -->
<!-- This view is meant to be included in the employee preferences view -->
<!-- It ensures that if the 'normal' Preferences view is changed, it's
also reflected in the employee's profile -->
also reflected in the employee's preferences -->
<record id="res_users_view_form_simple_modif" model="ir.ui.view">
<field name="name">res.users.preferences.form.simplified.inherit</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form_simple_modif"/>
<field name="mode">primary</field>
<field name="arch" type="xml">
<footer position="attributes">
<attribute name="invisible">1</attribute>
</footer>
<h1 position="replace"/>
<xpath expr="//field[@name='image_1920']" position="replace"/>
<xpath expr="//field[@name='company_id']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<form position="attributes">
<attribute name="string">Preferences</attribute>
</form>
</field>
</record>
@ -35,12 +30,12 @@
<field name="is_system" invisible="1"/>
</field>
<xpath expr="//button[@name='%(base.action_view_base_language_install)d']" position="attributes">
<attribute name="attrs">{'invisible': [('is_system', '=', False)]}</attribute>
<attribute name="invisible">not is_system</attribute>
</xpath>
</field>
</record>
<record id="res_users_view_form_profile" model="ir.ui.view">
<record id="res_users_view_form_preferences" model="ir.ui.view">
<field name="name">res.users.preferences.form.inherit</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="res_users_view_form_simple_modif"/>
@ -48,154 +43,64 @@
<form position="attributes">
<attribute name="create">false</attribute>
<attribute name="delete">false</attribute>
<attribute name="js_class">hr_employee_profile_form</attribute>
<attribute name="js_class">hr_user_preferences_form</attribute>
</form>
<notebook position="replace">
<field name="hr_presence_state" invisible="1"/>
<header>
</header>
<sheet>$0</sheet>
</notebook>
<notebook position="before">
<div class="oe_button_box" name="button_box">
<button
id="hr_presence_button"
class="oe_stat_button"
disabled="1"
invisible="context.get('from_my_profile', False)"
attrs="{'invisible': [('hr_presence_state', '=', 'absent')]}">
<div role="img" class="fa fa-fw fa-circle text-success o_button_icon" attrs="{'invisible': [('hr_presence_state', '!=', 'present')]}" aria-label="Available" title="Available"/>
<div role="img" class="fa fa-fw fa-circle text-warning o_button_icon" attrs="{'invisible': [('hr_presence_state', '!=', 'to_define')]}" aria-label="Away" title="Away"/>
<div role="img" class="fa fa-fw fa-circle text-danger o_button_icon" attrs="{'invisible': [('hr_presence_state', '!=', 'absent')]}" aria-label="Not available" title="Not available"/>
<div class="o_stat_info" attrs="{'invisible': [('hr_presence_state', '=', 'present')]}">
<span class="o_stat_text">
Not Connected
</span>
</div>
<div class="o_stat_info" attrs="{'invisible': [('hr_presence_state', '!=', 'present')]}">
<span class="o_stat_value" attrs="{'invisible': [('last_activity_time', '=', False)]}">
<field name="last_activity_time"/>
</span>
<span class="o_stat_value" attrs="{'invisible': [('last_activity_time', '!=', False)]}">
<field name="last_activity"/>
</span>
<span class="o_stat_text">Connected Since</span>
</div>
</button>
</div>
<field name="avatar_128" invisible="1"/>
<field name="image_1920" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"avatar_128"}'/>
<div class="oe_title">
<h1>
<field name="name" placeholder="Employee's Name" required="True" readonly="context.get('from_my_profile', False)"/>
</h1>
</div>
<div class="row">
<h2 class="col-lg-6 ps-lg-0">
<field name="job_title" class="w-100" placeholder="Job Position" attrs="{'readonly': [('can_edit', '=', False)]}"/>
</h2>
</div>
<group>
<xpath expr="//field[@name='name']" position="attributes">
<attribute name="placeholder">Employee's Name</attribute>
<attribute name="required">1</attribute>
</xpath>
<!-- Must be replaced by work_email when the user has an employee_id. -->
<xpath expr="//h5[@name='h5_email']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<!-- Must be replaced by work_phone when the user has an employee_id. -->
<xpath expr="//h5[@name='h5_phone']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//div[hasclass('oe_title')]" position="inside">
<h5 class="d-flex align-items-baseline mb-0">
<i class="fa fa-envelope fa-fw me-1 text-primary" title="Work Email"/>
<field name="work_email" widget="email" placeholder="Work Email" string="Work Email" class="w-75"/>
</h5>
<h5 class="d-flex align-items-baseline mb-0">
<i class="fa fa-phone fa-fw me-1 text-primary" title="Work Phone"/>
<field name="work_phone" widget="phone" placeholder="Work Phone" string="Work Phone" class="w-75"/>
</h5>
<h5 class="d-flex align-items-baseline mb-0">
<i class="fa fa-mobile fa-fw me-1 text-primary" title="Work Mobile"/>
<field name="mobile_phone" widget="phone" placeholder="Work Mobile" string="Work Mobile" class="w-75"/>
</h5>
</xpath>
<xpath expr="//group[@name='other_preferences']" position="inside">
<field name="pin" string="Attendance PIN"/>
</xpath>
<xpath expr="//group[@name='other_calendar_preferences']" position="inside">
<field name="work_location_id" string="Main Work Location" options="{'no_create': True}"/>
</xpath>
<xpath expr="//page[@name='calendar']" position="after">
<page name="private_information" string="Private">
<group>
<field name="can_edit" invisible="1"/>
<field name="mobile_phone" widget="phone" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="work_phone" widget="phone" attrs="{'readonly': [('can_edit', '=', False)]}"/>
</group>
<group>
<field name="work_email" widget="email" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="work_location_id" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="company_id" invisible="1"/>
</group>
<group>
<field name="employee_parent_id" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="coach_id" attrs="{'readonly': [('can_edit', '=', False)]}"/>
</group>
</group>
</notebook>
<notebook position="inside">
<page name="public" string="Work Information">
<div id="o_work_employee_container" class="d-lg-flex"> <!-- These two div are used to position org_chart -->
<div id="o_work_employee_main" class="flex-grow-1">
<group string="Location">
<field name="department_id" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="address_id"
context="{'show_address': 1}"
options='{"always_reload": True, "highlight_first_line": True}'
attrs="{'readonly': [('can_edit', '=', False)]}"/>
</group>
<group name="managers" string="Approvers" class="hide-group-if-empty">
<!-- overridden in other modules -->
</group>
</div>
</div>
</page>
<page name="personal_information" string="Private Information">
<group>
<group string="Contact Information">
<group string="Private Information">
<field name="employee_ids" invisible="1"/>
<field name="address_home_id" invisible="1"/>
<label for="private_street" string="Private Address"/>
<div class="o_address_format">
<field name="private_street" placeholder="Street..." class="o_address_street"/>
<field name="private_street2" placeholder="Street 2..." class="o_address_street"/>
<field name="private_city" placeholder="City" class="o_address_city"/>
<field name="private_state_id" class="o_address_state" placeholder="State" options="{'no_open': True, 'no_quick_create': True}" context="{'default_country_id': private_country_id}"/>
<field name="private_state_id" class="o_address_state" placeholder="State" options="{'no_open': True, 'no_create': True}" context="{'default_country_id': private_country_id}"/>
<field name="private_zip" placeholder="ZIP" class="o_address_zip"/>
<field name="private_country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'/>
</div>
<field name="private_email" string="Email" attrs="{'readonly': [('can_edit', '=', False)], 'invisible': [('address_home_id', '=', False)]}"/>
<field name="employee_phone" string="Phone" class="o_force_ltr" attrs="{'readonly': [('can_edit', '=', False)], 'invisible': [('address_home_id', '=', False)]}"/>
<field name="private_lang" string="Language" attrs="{'readonly': [('can_edit', '=', False)], 'invisible': [('address_home_id', '=', False)]}"/>
<field name="employee_bank_account_id" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="km_home_work" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="private_email" string="Private Email"/>
<field name="private_phone" string="Private Phone" class="o_force_ltr"/>
</group>
<group string="Citizenship">
<field name="employee_country_id" options='{"no_open": True, "no_create": True}' attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="identification_id" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="passport_id" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="gender" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="birthday" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="place_of_birth" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="country_of_birth" attrs="{'readonly': [('can_edit', '=', False)]}"/>
</group>
<group string="Marital Status">
<field name="marital" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="spouse_complete_name" attrs="{'invisible': [('marital', 'not in', ['married', 'cohabitant'])], 'readonly': [('can_edit', '=', False)]}"/>
<field name="spouse_birthdate" attrs="{'invisible': [('marital', 'not in', ['married', 'cohabitant'])], 'readonly': [('can_edit', '=', False)]}"/>
</group>
<group string="Education">
<field name="certificate" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="study_field" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="study_school" attrs="{'readonly': [('can_edit', '=', False)]}"/>
</group>
<group string="Dependant">
<field name="children" attrs="{'readonly': [('can_edit', '=', False)]}"/>
</group>
<group string="Emergency">
<field name="emergency_contact" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="emergency_phone" widget="phone" attrs="{'readonly': [('can_edit', '=', False)]}"/>
</group>
<group string="Work Permit" name="has_work_permit">
<field name="visa_no" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="permit_no" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="visa_expire" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<group string="Emergency Contact">
<field name="emergency_contact" string="Contact Name" placeholder="e.g. John Doe"/>
<field name="emergency_phone" string="Contact Phone" widget="phone"/>
</group>
</group>
</page>
<page name="hr_settings" string="HR Settings">
<group>
<group string='Status' name="active_group">
<field name="employee_type" attrs="{'readonly': [('can_edit', '=', False)]}"/>
</group>
<group string="Attendance" name="identification_group">
<field name="pin" attrs="{'readonly': [('can_edit', '=', False)]}"/>
<field name="barcode" attrs="{'readonly': [('can_edit', '=', False)]}"/>
</group>
</group>
</page>
</notebook>
</xpath>
</field>
</record>
@ -204,9 +109,22 @@
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_simple_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='mobile']" position="after">
<xpath expr="//sheet" position="inside">
<div class="oe_button_box" name="button_box">
<button name="action_open_employees"
class="oe_stat_button"
icon="fa-users"
invisible="employee_count == 0"
context="{'active_test': False}"
type="object">
<field name="employee_count" widget="statinfo" string="Employee"/>
</button>
</div>
</xpath>
<xpath expr="//group[@name='access_groups']" position="inside">
<field name="create_employee_id" force_save="1" invisible="1"/>
<field name="create_employee" force_save="1" string="Create Employee" invisible="not context.get('allow_create_employee', True)" attrs="{'invisible': [('create_employee_id', '>', 0)]}"/>
<field name="create_employee" force_save="1" string="Create Employee" invisible="1" groups="hr.group_hr_user"/>
<!-- It is required to stay create_employee field defined here to make it true because store value is false -->
</xpath>
</field>
</record>
@ -230,15 +148,8 @@
<field name="name">Change my Preferences</field>
<field name="res_model">res.users</field>
<field name="view_mode">form</field>
<field name="context">{'from_my_profile': True}</field>
<field name="view_id" ref="hr.res_users_view_form_profile"/>
</record>
<record id="hr_employee_action_from_user" model="ir.actions.act_window">
<field name="name">Employees</field>
<field name="res_model">hr.employee</field>
<field name="view_mode">kanban,tree,form</field>
<field name="domain">[('user_id', '=', active_id)]</field>
<field name="target">new</field>
<field name="view_id" ref="hr.res_users_view_form_preferences"/>
</record>
<record id="res_users_view_form" model="ir.ui.view">
@ -253,18 +164,74 @@
<field name="employee_id" invisible="1"/>
<button string="Create employee"
type="object" name="action_create_employee"
attrs="{'invisible': ['|', '|', ('id', '=', False), ('share', '=', True), ('employee_id', '!=', False)]}"/>
invisible="not id or share or employee_id"
groups="hr.group_hr_user"/>
<!-- share is not correctly recomputed because it depends on fields of reified view => invisible before saving (id=False) -->
</xpath>
<xpath expr="//div[@name='button_box']" position="inside">
<button name="%(hr_employee_action_from_user)d"
<button name="action_open_employees"
class="oe_stat_button"
icon="fa-users"
attrs="{'invisible': [('employee_count', '=', 0)]}"
invisible="employee_count == 0"
context="{'active_test': False}"
type="action">
<field name="employee_count" widget="statinfo" string="Employee(s)"/>
type="object">
<field name="employee_count" widget="statinfo" string="Employee"/>
</button>
<button name="action_related_contact"
class="oe_stat_button"
icon="fa-address-card-o"
type="object"
help="Related Contact">
<div class="o_stat_info">
<span class="o_stat_text">Contact</span>
</div>
</button>
</xpath>
<!--increase image size to accommodate the additional login field-->
<field name="image_1920" widget="contact_image" position="attributes">
<attribute name="invisible">employee_id and work_email != login</attribute>
</field>
<field name="image_1920" widget="contact_image" position="after">
<field name="image_1920" class="o_contact_image_large" invisible="not employee_id or work_email == login"
widget="contact_image" options="{'preview_image': 'avatar_128', 'img_class': 'rounded-4'}"/>
</field>
<!-- Must be replaced by work_email when the user has an employee_id. -->
<xpath expr="//h5[@name='h5_email']" position="attributes">
<attribute name="invisible">employee_id</attribute>
</xpath>
<!-- Must be replaced by work_phone when the user has an employee_id. -->
<xpath expr="//h5[@name='h5_phone']" position="attributes">
<attribute name="invisible">employee_id</attribute>
</xpath>
<xpath expr="//div[hasclass('oe_title')]" position="inside">
<h5 class="d-flex flex-wrap align-items-baseline mb-0" invisible="not employee_id">
<div class="w-100">
<i class="fa fa-fw fa-envelope me-1 text-primary" title="Login / Email" invisible="login != work_email"/>
<i class="fa fa-fw fa-key me-1 text-primary" title="Login" invisible="login == work_email"/>
<field name="login" placeholder="Login" class="w-75"/><br/>
</div>
<i class="fa fa-envelope fa-fw me-1 text-primary" title="Work Email" invisible="login == work_email"/>
<field name="email_domain_placeholder" invisible="1" />
<field name="work_email" widget="email" string="Work Email" class="w-75" options="{'placeholder_field': 'email_domain_placeholder'}" invisible="login == work_email"/>
</h5>
<h5 class="d-flex align-items-baseline mb-0" invisible="not employee_id">
<i class="fa fa-phone fa-fw me-1 text-primary" title="Work Phone"/>
<field name="work_phone" widget="phone" placeholder="Work Phone" string="Work Phone" class="w-75"/>
</h5>
<h5 class="d-flex align-items-baseline mb-0" invisible="not employee_id">
<i class="fa fa-mobile fa-fw me-1 text-primary" title="Work Mobile"/>
<field name="mobile_phone" widget="phone" placeholder="Work Mobile" string="Work Mobile" class="w-75"/>
</h5>
</xpath>
<xpath expr="//group[@name='other_preferences']" position="inside">
<field name="pin" string="Attendance PIN" invisible="not employee_id"/>
</xpath>
<xpath expr="//group[@name='other_calendar_preferences']" position="inside">
<field name="work_location_id" string="Main Work Location" invisible="not employee_id or share"/>
</xpath>
<xpath expr="//page[@name='calendar']" position="attributes">
<attribute name="groups">hr.group_hr_user</attribute>
</xpath>
</field>
</record>