summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobot Odoo <xmo+roboto@odoo.com>2019-05-31 15:36:39 +0200
committerGitHub <noreply@github.com>2019-05-31 15:36:39 +0200
commit9b13494777ef60a757f0ea8ef0dff427ab0f495d (patch)
tree78ce58ef00ddf4a7da5b1f02b325e1d4dee1063d
parent1e77f2fde81f898305149d2ec8c3499afe14a02c (diff)
parenteaa28efdf7f6a153a9812bdcfed0b52b8f1bc63b (diff)
[MERGE] hr*: Miscellaneous usability improvements
1. hr_holidays: Clean manager form refs Purpose: Ease modification/addition of views and actions (in particular when inheriting actions in hr_holidays_gantt) Specification: Use `form_view_ref` in the action context instead of the form xml id in all views. + Add tree view from "Time Off / My Team" 2. hr_contract: Remove social secretariat field Social secretariat is a Belgian concept. It does not make sense to have this in the standard contract app. Will be reintroduced in l10n_be_hr_payroll (or internal) if really needed. Move `job_id` in the right group to easily add fields on the right with view inheritance. 3. hr_holidays: Display leaves in calendar Purpose: When a leave is created and approved, it can also create a meeting in the calendar. In the leave type configuration a particular meeting type can be chosen. The purpose is to simplify this. Specification: Remove the choice of meeting type. The choice should be: Display Leaves in calendar: Yes/No (checkox) 4. hr: Direclty create user's employee 5. hr_holidays_gantt: Improve gantt views 6. hr_contract_salary: Make applicant's certificate required Purpose: Currently, on the salary configurator frontend, the certificate is a radio button, with a default value selected. Some applicants don't change the default value, even if it is not their certificate. Applicant should always explicitely set their certificate. Specification: Make the certificate a required field without a default value. To reuse the existing validation logic of the salary JS, the input is now a `select` instead of a `radio`. 7. hr_payroll: Sort payslips by date Currently, payslips and payslip batches are sorted by creation date, oldest first. It's better to sort them according to their dates, more recent firsts. 8. hr_holidays_gantt: Rename Leave into Time Off 9. hr_payroll: Adapt view inheritance social secretariat field The field `reported_to_secretariat` of `hr.contract` has been removed in Community: #4284 This commit adapts view inheritance after this change. 10. hr_payroll: Move schedule_pay from contract to structure Schedule pay depends on the salary structure, not the contract. e.g. for the same contract, the regular pay is every month, but the 13th month is every year. Hence the field is moved to `hr.payroll.structure` and made a related field on `hr.contract`. Note: the field schedule_pay is currently unused. It could probably be removed completly remove on the contract. 11. hr_payroll: Add stat button on structure type 12. hr_payroll: Merge hr_payroll_gantt into hr_payroll Since hr_payroll is now an enterprise module, an additional module is no longer needed to add gantt views. After this commit, `hr_payroll_gantt` module is deleted and everything is moved to `hr_payroll`. 13. hr_payroll: Improve payroll menus Employees - Employees -Contracts Work Entries - Work Entries - Conficts Payslips - To Pay (show only draft payslips) - All Payslips (newest first) - Batches (newest first) Reporting - Payroll - Meal Voucher (l10n_be_hr_payroll) Configuration - Settings - Work Entries * Work Entry Types - Salary * Structure Types * Structures * Rules * Other Input Type (debug mode) 14. hr_payroll: Rename demo data The renamed demo structure is the main structure. It should have a general name instead of a name linked to a particular employee. 15. l10n_be_hr_payroll: Set default 38h calendar for BE Set the default calendar of Belgian companies to 38 hours/week TaskID: 1972536 closes odoo/odoo#33233 Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
-rw-r--r--addons/hr/models/res_users.py25
-rw-r--r--addons/hr/views/res_users.xml30
-rw-r--r--addons/hr_contract/models/hr_contract.py2
-rw-r--r--addons/hr_contract/views/hr_contract_views.xml5
-rw-r--r--addons/hr_holidays/models/hr_leave.py4
-rw-r--r--addons/hr_holidays/models/hr_leave_type.py4
-rw-r--r--addons/hr_holidays/views/hr_leave_type_views.xml4
-rw-r--r--addons/hr_holidays/views/hr_leave_views.xml27
8 files changed, 48 insertions, 53 deletions
diff --git a/addons/hr/models/res_users.py b/addons/hr/models/res_users.py
index e966a491894..65561a52480 100644
--- a/addons/hr/models/res_users.py
+++ b/addons/hr/models/res_users.py
@@ -51,16 +51,12 @@ class User(models.Model):
certificate = fields.Selection(related='employee_id.certificate', readonly=False, related_sudo=False)
study_field = fields.Char(related='employee_id.study_field', readonly=False, related_sudo=False)
study_school = fields.Char(related='employee_id.study_school', readonly=False, related_sudo=False)
- employee_warning = fields.Char("Missing employee warning", compute='_compute_employee_warning')
+ employee_count = fields.Integer(compute='_compute_employee_count')
- @api.depends('groups_id', 'employee_ids', 'active')
- def _compute_employee_warning(self):
- """ Fill warning only for active internal user (employee) not linked to hr.employee """
+ @api.depends('employee_ids')
+ def _compute_employee_count(self):
for user in self:
- if not user.employee_ids and not user.share and user.active:
- user.employee_warning = _("Don't forget to create the linked employee.")
- else:
- user.employee_warning = False
+ user.employee_count = len(user.employee_ids)
def __init__(self, pool, cr):
""" Override of __init__ to add access rights.
@@ -183,12 +179,7 @@ class User(models.Model):
@api.multi
def action_create_employee(self):
self.ensure_one()
- form_view = self.env.ref('hr.view_employee_form')
- return {
- 'name': _('Create Employee'),
- 'type': 'ir.actions.act_window',
- 'res_model': 'hr.employee',
- 'views': [(form_view.id, 'form')],
- 'target': 'new',
- 'context': {'default_user_id': self.id}
- }
+ self.env['hr.employee'].create(dict(
+ user_id=self.id,
+ **self.env['hr.employee']._sync_user(self)
+ ))
diff --git a/addons/hr/views/res_users.xml b/addons/hr/views/res_users.xml
index 675d495869b..d544fa568d0 100644
--- a/addons/hr/views/res_users.xml
+++ b/addons/hr/views/res_users.xml
@@ -165,16 +165,36 @@
<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_type">form</field>
+ <field name="view_mode">kanban,tree,form</field>
+ <field name="domain">[('user_id', '=', active_id)]</field>
+ </record>
+
<record id="res_users_view_form" model="ir.ui.view">
<field name="name">res.users.form.inherit</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form"/>
<field name="arch" type="xml">
- <xpath expr="//field[@name='image']" position="before">
- <div groups="hr.group_hr_user" class="alert alert-danger text-center" role="alert" attrs="{'invisible': [('employee_warning', '=', False)]}">
- <a class="close" data-dismiss="alert" href="#">x</a>
- <field name="employee_warning" nolabel="1" class="oe_inline"/> <button class="oe_inline oe_link p-0" type="object" name="action_create_employee">Click here to create it.</button>.
- </div>
+
+ <xpath expr="//header" position="inside">
+ <field name="share" invisible="1"/>
+ <field name="employee_ids" invisible="1"/>
+ <button string="Create employee"
+ type="object" name="action_create_employee"
+ attrs="{'invisible': ['|', '|', ('id', '=', False), ('share', '=', True), ('employee_count', '>', 0)]}"/>
+ <!-- share is not correclty 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"
+ class="oe_stat_button"
+ icon="fa-users"
+ attrs="{'invisible': [('employee_count', '=', 0)]}"
+ type="action">
+ <field name="employee_count" widget="statinfo" string="Employee(s)"/>
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/hr_contract/models/hr_contract.py b/addons/hr_contract/models/hr_contract.py
index 97df03d45a2..366624ab8f4 100644
--- a/addons/hr_contract/models/hr_contract.py
+++ b/addons/hr_contract/models/hr_contract.py
@@ -45,8 +45,6 @@ class Contract(models.Model):
permit_no = fields.Char('Work Permit No', related="employee_id.permit_no", readonly=False)
visa_no = fields.Char('Visa No', related="employee_id.visa_no", readonly=False)
visa_expire = fields.Date('Visa Expire Date', related="employee_id.visa_expire", readonly=False)
- reported_to_secretariat = fields.Boolean('Social Secretariat',
- help='Green this button when the contract information has been transfered to the social secretariat.')
hr_responsible_id = fields.Many2one('res.users', 'HR Responsible', tracking=True,
help='Person responsible for validating the employee\'s contracts.')
diff --git a/addons/hr_contract/views/hr_contract_views.xml b/addons/hr_contract/views/hr_contract_views.xml
index 2a58aa89861..86f4f2593da 100644
--- a/addons/hr_contract/views/hr_contract_views.xml
+++ b/addons/hr_contract/views/hr_contract_views.xml
@@ -75,8 +75,6 @@
<separator />
<filter string="Current Employee" name="current_employee" domain="[('employee_id.active','=',True)]"/>
<separator/>
- <filter string="To Report to Social Secretariat" name="to_report" domain="[('reported_to_secretariat', '=', False)]"/>
- <separator/>
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
<separator/>
<filter string="Important Messages" name="message_needaction" domain="[('message_needaction','=',True)]"/>
@@ -113,10 +111,9 @@
<group>
<field name="employee_id"/>
<field name="department_id"/>
- <field name="job_id"/>
</group>
<group>
- <field name="reported_to_secretariat" widget="toggle_button" options='{"active": "Reported to the social secretariat", "inactive": "To report to the social secretariat"}'/>
+ <field name="job_id"/>
</group>
</group>
<notebook>
diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py
index 5789bee8aba..add502f82fb 100644
--- a/addons/hr_holidays/models/hr_leave.py
+++ b/addons/hr_holidays/models/hr_leave.py
@@ -603,7 +603,7 @@ class HolidaysRequest(models.Model):
by creating a calendar event and a resource time off. """
holidays = self.filtered(lambda request: request.holiday_type == 'employee')
holidays._create_resource_leave()
- for holiday in holidays:
+ for holiday in holidays.filtered(lambda l: l.holiday_status_id.create_calendar_meeting):
meeting_values = holiday._prepare_holidays_meeting_values()
meeting = self.env['calendar.event'].with_context(no_mail_to_attendees=True).create(meeting_values)
holiday.write({'meeting_id': meeting.id})
@@ -614,8 +614,6 @@ class HolidaysRequest(models.Model):
calendar = self.employee_id.resource_calendar_id or self.env.company.resource_calendar_id
meeting_values = {
'name': self.display_name,
- 'categ_ids': [(6, 0, [
- self.holiday_status_id.categ_id.id])] if self.holiday_status_id.categ_id else [],
'duration': self.number_of_days * (calendar.hours_per_day or HOURS_PER_DAY),
'description': self.notes,
'user_id': self.user_id.id,
diff --git a/addons/hr_holidays/models/hr_leave_type.py b/addons/hr_holidays/models/hr_leave_type.py
index 1fb529ff390..577c159d671 100644
--- a/addons/hr_holidays/models/hr_leave_type.py
+++ b/addons/hr_holidays/models/hr_leave_type.py
@@ -26,9 +26,7 @@ class HolidaysType(models.Model):
code = fields.Char('Code')
sequence = fields.Integer(default=100,
help='The type with the smallest sequence is the default value in time off request')
- categ_id = fields.Many2one(
- 'calendar.event.type', string='Meeting Type',
- help='Once a time off is validated, Odoo will create a corresponding meeting of this type in the calendar.')
+ create_calendar_meeting = fields.Boolean(string="Display Time Off in Calendar", default=True)
color_name = fields.Selection([
('red', 'Red'),
('blue', 'Blue'),
diff --git a/addons/hr_holidays/views/hr_leave_type_views.xml b/addons/hr_holidays/views/hr_leave_type_views.xml
index 1c0b02abd1b..8406c7561e1 100644
--- a/addons/hr_holidays/views/hr_leave_type_views.xml
+++ b/addons/hr_holidays/views/hr_leave_type_views.xml
@@ -8,7 +8,7 @@
<search string="Search Time Off Type">
<field name="name" string="Time Off Types"/>
<field name="code"/>
- <field name="categ_id"/>
+ <field name="create_calendar_meeting"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
</search>
@@ -70,7 +70,7 @@
</group>
</group>
<group name="calendar" string="Calendar" groups="base.group_no_one">
- <field name="categ_id"/>
+ <field name="create_calendar_meeting"/>
<field name="color_name"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
diff --git a/addons/hr_holidays/views/hr_leave_views.xml b/addons/hr_holidays/views/hr_leave_views.xml
index 1c083ba8b10..1208b7f4ab6 100644
--- a/addons/hr_holidays/views/hr_leave_views.xml
+++ b/addons/hr_holidays/views/hr_leave_views.xml
@@ -368,7 +368,7 @@
<field name="name">hr.leave.view.calendar</field>
<field name="model">hr.leave</field>
<field name="arch" type="xml">
- <calendar string="Time Off Request" event_open_popup="true" readonly_form_view_id="%(hr_holidays.hr_leave_view_form_manager)d" form_view_id="%(hr_holidays.hr_leave_view_form_manager)d" date_start="date_from" date_stop="date_to" mode="month" quick_add="False" color="employee_id">
+ <calendar string="Time Off Request" event_open_popup="true" date_start="date_from" date_stop="date_to" mode="month" quick_add="False" color="employee_id">
<field name="display_name"/>
</calendar>
</field>
@@ -440,11 +440,16 @@
<field name="name">All Time Off</field>
<field name="res_model">hr.leave</field>
<field name="view_type">form</field>
- <field name="view_mode">calendar</field>
- <field name="context">{'search_default_year': 1, 'search_default_group_employee': 1, 'search_default_managed_people': 1, 'search_default_managed_people': 1, 'search_default_my_team_leaves': 1}</field>
+ <field name="view_mode">calendar,tree</field>
+ <field name="context">{
+ 'search_default_year': 1,
+ 'search_default_group_employee': 1,
+ 'search_default_managed_people': 1,
+ 'search_default_my_team_leaves': 1,
+ 'form_view_ref': 'hr_holidays.hr_leave_view_form_manager',
+ }</field>
<field name="domain">[('holiday_type','=','employee'), ('state', '!=', 'refuse')]</field>
<field name="search_view_id" ref="view_hr_holidays_filter"/>
- <field name="view_id" ref="hr_leave_view_calendar"/>
</record>
<menuitem
@@ -594,7 +599,7 @@
<field name="res_model">hr.leave</field>
<field name="binding_model_id" ref="hr.model_hr_employee"/>
<field name="view_mode">tree,kanban,form,calendar,activity</field>
- <field name="context">{}</field>
+ <field name="context">{'form_view_ref': 'hr_holidays.hr_leave_view_form_manager'}</field>
<field name="domain">[]</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
@@ -602,18 +607,6 @@
</p>
</field>
</record>
- <record id="hr_leave_action_all_tree_form" model="ir.actions.act_window.view">
- <field name="sequence">2</field>
- <field name="view_mode">tree</field>
- <field name="act_window_id" ref="hr_leave_action_all"/>
- <field name="view_id" ref="hr_leave_view_tree"/>
- </record>
- <record id="hr_leave_action_all_view_form" model="ir.actions.act_window.view">
- <field name="sequence">10</field>
- <field name="view_mode">form</field>
- <field name="act_window_id" ref="hr_leave_action_all"/>
- <field name="view_id" ref="hr_leave_view_form_manager"/>
- </record>
<record id="hr_leave_action_action_approve_department" model="ir.actions.act_window">
<field name="name">Department Time Off</field>