[MIG] hr_contract : migrate the code to new api
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
|
||||
{
|
||||
'name': 'Employee Contracts',
|
||||
'version': '1.0',
|
||||
@@ -21,9 +20,9 @@ You can assign several contracts per employee.
|
||||
'depends': ['base_action_rule', 'hr'],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'views/hr_contract_views.xml',
|
||||
'data/hr_contract_data.xml',
|
||||
'views/base_action_rule_views.xml',
|
||||
'views/hr_contract_views.xml',
|
||||
],
|
||||
'demo': [],
|
||||
'test': ['test/test_hr_contract.yml'],
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
|
||||
<!-- Contract Types -->
|
||||
@@ -109,4 +109,4 @@
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
</odoo>
|
||||
|
||||
@@ -1,36 +1,27 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from openerp.addons.base_action_rule.base_action_rule import get_datetime
|
||||
from openerp.osv import fields, osv
|
||||
from odoo import api, fields, models
|
||||
from odoo.fields import Datetime
|
||||
|
||||
|
||||
class base_action_rule(osv.Model):
|
||||
class BaseActionRule(models.Model):
|
||||
""" Add resource and calendar for time-based conditions """
|
||||
_name = 'base.action.rule'
|
||||
_inherit = ['base.action.rule']
|
||||
|
||||
_columns = {
|
||||
'trg_date_resource_field_id': fields.many2one(
|
||||
'ir.model.fields', 'Use employee work schedule',
|
||||
help='Use the user\'s working schedule.',
|
||||
),
|
||||
}
|
||||
_inherit = 'base.action.rule'
|
||||
|
||||
def _check_delay(self, cr, uid, action, record, record_dt, context=None):
|
||||
trg_date_resource_field_id = fields.Many2one('ir.model.fields', string='Use employee work schedule', help='Use the user\'s working schedule.')
|
||||
|
||||
@api.model
|
||||
def _check_delay(self, action, record, record_dt):
|
||||
""" Override the check of delay to try to use a user-related calendar.
|
||||
If no calendar is found, fallback on the default behavior. """
|
||||
If no calendar is found, fallback on the default behavior.
|
||||
"""
|
||||
if action.trg_date_calendar_id and action.trg_date_range_type == 'day' and action.trg_date_resource_field_id:
|
||||
user = record[action.trg_date_resource_field_id.name]
|
||||
if user.employee_ids and user.employee_ids[0].contract_id \
|
||||
and user.employee_ids[0].contract_id.working_hours:
|
||||
if user.employee_ids and user.employee_ids[0].contract_id and user.employee_ids[0].contract_id.working_hours:
|
||||
calendar = user.employee_ids[0].contract_id.working_hours
|
||||
start_dt = get_datetime(record_dt)
|
||||
start_dt = Datetime.from_string(record_dt)
|
||||
resource_id = user.employee_ids[0].resource_id.id
|
||||
action_dt = self.pool['resource.calendar'].schedule_days_get_date(
|
||||
cr, uid, calendar.id, action.trg_date_range,
|
||||
day_date=start_dt, compute_leaves=True, resource_id=resource_id,
|
||||
context=context
|
||||
)
|
||||
return action_dt
|
||||
return super(base_action_rule, self)._check_delay(cr, uid, action, record, record_dt, context=context)
|
||||
return calendar.schedule_days_get_date(action.trg_date_range, day_date=start_dt, compute_leaves=True, resource_id=resource_id)
|
||||
return super(BaseActionRule, self)._check_delay(action, record, record_dt)
|
||||
|
||||
@@ -1,130 +1,101 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import time
|
||||
from odoo import api, fields, models, _
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
from openerp import SUPERUSER_ID
|
||||
from openerp.osv import fields, osv
|
||||
|
||||
class hr_employee(osv.osv):
|
||||
_name = "hr.employee"
|
||||
_description = "Employee"
|
||||
class Employee(models.Model):
|
||||
|
||||
_inherit = "hr.employee"
|
||||
|
||||
def _get_latest_contract(self, cr, uid, ids, field_name, args, context=None):
|
||||
res = {}
|
||||
obj_contract = self.pool.get('hr.contract')
|
||||
for emp in self.browse(cr, uid, ids, context=context):
|
||||
contract_ids = obj_contract.search(cr, uid, [('employee_id', '=', emp.id)], order='date_start', context=context)
|
||||
if contract_ids:
|
||||
res[emp.id] = contract_ids[-1:][0]
|
||||
else:
|
||||
res[emp.id] = False
|
||||
return res
|
||||
manager = fields.Boolean(string='Is a Manager')
|
||||
medic_exam = fields.Date(string='Medical Examination Date')
|
||||
place_of_birth = fields.Char('Place of Birth')
|
||||
children = fields.Integer(string='Number of Children')
|
||||
vehicle = fields.Char(string='Company Vehicle')
|
||||
vehicle_distance = fields.Integer(string='Home-Work Dist.', help="In kilometers")
|
||||
contract_ids = fields.One2many('hr.contract', 'employee_id', string='Contracts')
|
||||
contract_id = fields.Many2one('hr.contract', compute='_compute_contract_id', string='Current Contract', help='Latest contract of the employee')
|
||||
contracts_count = fields.Integer(compute='_compute_contracts_count', string='Contracts')
|
||||
|
||||
def _contracts_count(self, cr, uid, ids, field_name, arg, context=None):
|
||||
Contract = self.pool['hr.contract']
|
||||
return {
|
||||
employee_id: Contract.search_count(cr, SUPERUSER_ID, [('employee_id', '=', employee_id)], context=context)
|
||||
for employee_id in ids
|
||||
}
|
||||
def _compute_contract_id(self):
|
||||
""" get the lastest contract """
|
||||
Contract = self.env['hr.contract']
|
||||
for employee in self:
|
||||
employee.contract_id = Contract.search([('employee_id', '=', employee.id)], order='date_start', limit=1)
|
||||
|
||||
_columns = {
|
||||
'manager': fields.boolean('Is a Manager'),
|
||||
'medic_exam': fields.date('Medical Examination Date'),
|
||||
'place_of_birth': fields.char('Place of Birth'),
|
||||
'children': fields.integer('Number of Children'),
|
||||
'vehicle': fields.char('Company Vehicle'),
|
||||
'vehicle_distance': fields.integer('Home-Work Dist.', help="In kilometers"),
|
||||
'contract_ids': fields.one2many('hr.contract', 'employee_id', 'Contracts'),
|
||||
'contract_id': fields.function(_get_latest_contract, string='Current Contract', type='many2one', relation="hr.contract", help='Latest contract of the employee'),
|
||||
'contracts_count': fields.function(_contracts_count, type='integer', string='Contracts'),
|
||||
}
|
||||
def _compute_contracts_count(self):
|
||||
# read_group as sudo, since contract count is displayed on form view
|
||||
contract_data = self.env['hr.contract'].sudo().read_group([('employee_id', 'in', self.ids)], ['employee_id'], ['employee_id'])
|
||||
result = dict((data['employee_id'][0], data['employee_id_count']) for data in contract_data)
|
||||
for employee in self:
|
||||
employee.contracts_count = result.get(employee.id, 0)
|
||||
|
||||
|
||||
class hr_contract_type(osv.osv):
|
||||
class ContractType(models.Model):
|
||||
|
||||
_name = 'hr.contract.type'
|
||||
_description = 'Contract Type'
|
||||
_order = 'sequence, id'
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Contract Type', required=True),
|
||||
'sequence': fields.integer('Sequence', help="Gives the sequence when displaying a list of Contract."),
|
||||
}
|
||||
defaults = {
|
||||
'sequence': 10
|
||||
}
|
||||
name = fields.Char(string='Contract Type', required=True)
|
||||
sequence = fields.Integer(help="Gives the sequence when displaying a list of Contract.", default=10)
|
||||
|
||||
|
||||
class hr_contract(osv.osv):
|
||||
class Contract(models.Model):
|
||||
|
||||
_name = 'hr.contract'
|
||||
_description = 'Contract'
|
||||
_inherit = ['mail.thread', 'ir.needaction_mixin']
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Contract Reference', required=True),
|
||||
'employee_id': fields.many2one('hr.employee', "Employee", required=True),
|
||||
'department_id': fields.many2one('hr.department', string="Department"),
|
||||
'type_id': fields.many2one('hr.contract.type', "Contract Type", required=True),
|
||||
'job_id': fields.many2one('hr.job', 'Job Title'),
|
||||
'date_start': fields.date('Start Date', required=True),
|
||||
'date_end': fields.date('End Date'),
|
||||
'trial_date_start': fields.date('Trial Start Date'),
|
||||
'trial_date_end': fields.date('Trial End Date'),
|
||||
'working_hours': fields.many2one('resource.calendar', 'Working Schedule'),
|
||||
'wage': fields.float('Wage', digits=(16, 2), required=True, help="Basic Salary of the employee"),
|
||||
'advantages': fields.text('Advantages'),
|
||||
'notes': fields.text('Notes'),
|
||||
'permit_no': fields.char('Work Permit No', required=False, readonly=False),
|
||||
'visa_no': fields.char('Visa No', required=False, readonly=False),
|
||||
'visa_expire': fields.date('Visa Expire Date'),
|
||||
'state': fields.selection(
|
||||
[('draft', 'New'), ('open', 'Running'), ('pending', 'To Renew'), ('close', 'Expired')],
|
||||
string='Status', track_visibility='onchange',
|
||||
help='Status of the contract'),
|
||||
}
|
||||
name = fields.Char('Contract Reference', required=True)
|
||||
employee_id = fields.Many2one('hr.employee', string='Employee', required=True)
|
||||
department_id = fields.Many2one('hr.department', string="Department")
|
||||
type_id = fields.Many2one('hr.contract.type', string="Contract Type", required=True, default=lambda self: self.env['hr.contract.type'].search([], limit=1))
|
||||
job_id = fields.Many2one('hr.job', string='Job Title')
|
||||
date_start = fields.Date('Start Date', required=True, default=fields.Date.today)
|
||||
date_end = fields.Date('End Date')
|
||||
trial_date_start = fields.Date('Trial Start Date')
|
||||
trial_date_end = fields.Date('Trial End Date')
|
||||
working_hours = fields.Many2one('resource.calendar', string='Working Schedule')
|
||||
wage = fields.Float('Wage', digits=(16, 2), required=True, help="Basic Salary of the employee")
|
||||
advantages = fields.Text('Advantages')
|
||||
notes = fields.Text('Notes')
|
||||
permit_no = fields.Char('Work Permit No')
|
||||
visa_no = fields.Char('Visa No')
|
||||
visa_expire = fields.Date('Visa Expire Date')
|
||||
state = fields.Selection([
|
||||
('draft', 'New'),
|
||||
('open', 'Running'),
|
||||
('pending', 'To Renew'),
|
||||
('close', 'Expired'),
|
||||
], string='Status', track_visibility='onchange', help='Status of the contract', default='draft')
|
||||
|
||||
def _get_type(self, cr, uid, context=None):
|
||||
type_ids = self.pool.get('hr.contract.type').search(cr, uid, [], limit=1)
|
||||
return type_ids and type_ids[0] or False
|
||||
@api.onchange('employee_id')
|
||||
def _onchange_employee_id(self):
|
||||
if self.employee_id:
|
||||
self.job_id = self.employee_id.job_id
|
||||
self.department_id = self.employee_id.department_id
|
||||
|
||||
_defaults = {
|
||||
'date_start': lambda *a: time.strftime("%Y-%m-%d"),
|
||||
'type_id': _get_type,
|
||||
'state': 'draft',
|
||||
}
|
||||
@api.constrains('date_start', 'date_end')
|
||||
def _check_dates(self):
|
||||
if self.filtered(lambda c: c.date_end and c.date_start > c.date_end):
|
||||
raise ValidationError(_('Contract start date must be less than contract end date.'))
|
||||
|
||||
def onchange_employee_id(self, cr, uid, ids, employee_id, context=None):
|
||||
if not employee_id:
|
||||
return {'value': {'job_id': False, 'department_id': False}}
|
||||
emp_obj = self.pool.get('hr.employee').browse(cr, uid, employee_id, context=context)
|
||||
job_id = dept_id = False
|
||||
if emp_obj.job_id:
|
||||
job_id = emp_obj.job_id.id
|
||||
if emp_obj.department_id:
|
||||
dept_id = emp_obj.department_id.id
|
||||
return {'value': {'job_id': job_id, 'department_id': dept_id}}
|
||||
@api.multi
|
||||
def set_as_pending(self):
|
||||
return self.write({'state': 'pending'})
|
||||
|
||||
def _check_dates(self, cr, uid, ids, context=None):
|
||||
for contract in self.read(cr, uid, ids, ['date_start', 'date_end'], context=context):
|
||||
if contract['date_start'] and contract['date_end'] and contract['date_start'] > contract['date_end']:
|
||||
return False
|
||||
return True
|
||||
@api.multi
|
||||
def set_as_close(self):
|
||||
return self.write({'state': 'close'})
|
||||
|
||||
_constraints = [
|
||||
(_check_dates, 'Error! Contract start-date must be less than contract end-date.', ['date_start', 'date_end'])
|
||||
]
|
||||
|
||||
def set_as_pending(self, cr, uid, ids, context=None):
|
||||
return self.write(cr, uid, ids, {'state': 'pending'}, context=context)
|
||||
|
||||
def set_as_close(self, cr, uid, ids, context=None):
|
||||
return self.write(cr, uid, ids, {'state': 'close'}, context=context)
|
||||
|
||||
def _track_subtype(self, cr, uid, ids, init_values, context=None):
|
||||
record = self.browse(cr, uid, ids[0], context=context)
|
||||
if 'state' in init_values and record.state == 'pending':
|
||||
@api.multi
|
||||
def _track_subtype(self, init_values):
|
||||
self.ensure_one()
|
||||
if 'state' in init_values and self.state == 'pending':
|
||||
return 'hr_contract.mt_contract_pending'
|
||||
elif 'state' in init_values and record.state == 'close':
|
||||
elif 'state' in init_values and self.state == 'close':
|
||||
return 'hr_contract.mt_contract_close'
|
||||
return super(hr_contract, self)._track_subtype(cr, uid, ids, init_values, context=context)
|
||||
return super(Contract, self)._track_subtype(init_values)
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<odoo>
|
||||
<record model="ir.ui.view" id="view_base_action_rule_form_resource">
|
||||
<field name="name">base.action.rule.form</field>
|
||||
<field name="model">base.action.rule</field>
|
||||
@@ -14,6 +12,4 @@
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
</odoo>
|
||||
|
||||
@@ -1,33 +1,29 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
|
||||
<!-- Contracts Button on Employee Form -->
|
||||
<odoo>
|
||||
|
||||
<record id="act_hr_employee_2_hr_contract" model="ir.actions.act_window">
|
||||
<field name="name">Contracts</field>
|
||||
<field name="res_model">hr.contract</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="name">Contracts</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="context">{'search_default_employee_id': [active_id], 'default_employee_id': active_id}</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="hr_hr_employee_view_form2" model="ir.ui.view">
|
||||
<field name="name">hr.hr.employee.view.form2</field>
|
||||
<field name="model">hr.employee</field>
|
||||
<field name="inherit_id" ref="hr.view_employee_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<data>
|
||||
<div name="button_box" position="inside">
|
||||
<button name="%(act_hr_employee_2_hr_contract)d"
|
||||
class="oe_stat_button"
|
||||
icon="fa-book"
|
||||
<xpath expr="//div[@name='button_box']" position="inside">
|
||||
<button name="%(act_hr_employee_2_hr_contract)d"
|
||||
class="oe_stat_button"
|
||||
icon="fabook"
|
||||
type="action"
|
||||
groups="base.group_hr_manager">
|
||||
<field name="contracts_count" widget="statinfo" string="Contracts"/>
|
||||
</button>
|
||||
</div>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='coach_id']" position="after">
|
||||
<field name="manager" groups="base.group_no_one"/>
|
||||
</xpath>
|
||||
@@ -38,21 +34,21 @@
|
||||
<field name="vehicle_distance"/>
|
||||
</group>
|
||||
</xpath>
|
||||
<field name="marital" position="after">
|
||||
<xpath expr="//field[@name='marital']" position="after">
|
||||
<field name="children"/>
|
||||
</field>
|
||||
<field name="birthday" position="after">
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='birthday']" position="after">
|
||||
<field name="place_of_birth"/>
|
||||
</field>
|
||||
<field name="bank_account_id" position="replace">
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='bank_account_id']" position="replace">
|
||||
<field name="bank_account_id" context="{'display_partner':True}"/>
|
||||
</field>
|
||||
</xpath>
|
||||
</data>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="hr_contract_view_search" model="ir.ui.view">
|
||||
<field name="name">hr.contract.view.search</field>
|
||||
<field name="name">hr.contract.search</field>
|
||||
<field name="model">hr.contract</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search Contract">
|
||||
@@ -67,7 +63,7 @@
|
||||
<separator />
|
||||
<filter string="Current Employee" name="current_employee" domain="[('employee_id.active','=',True)]"/>
|
||||
<separator/>
|
||||
<filter string="Unread Messages" name="message_needaction" domain="[('message_needaction','=',True)]"/>
|
||||
<filter string="Important Messages" name="message_needaction" domain="[('message_needaction','=',True)]"/>
|
||||
<group expand="0" string="Group By">
|
||||
<filter string="Employee" domain="[]" context="{'group_by':'employee_id'}"/>
|
||||
<filter string="Job" domain="[]" context="{'group_by':'job_id'}"/>
|
||||
@@ -78,7 +74,7 @@
|
||||
</record>
|
||||
|
||||
<record id="hr_contract_view_form" model="ir.ui.view">
|
||||
<field name="name">hr.contract.view.form</field>
|
||||
<field name="name">hr.contract.form</field>
|
||||
<field name="model">hr.contract</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Current Contract">
|
||||
@@ -94,7 +90,7 @@
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="employee_id" on_change="onchange_employee_id(employee_id)"/>
|
||||
<field name="employee_id"/>
|
||||
<field name="job_id"/>
|
||||
</group>
|
||||
<group>
|
||||
@@ -142,7 +138,7 @@
|
||||
</record>
|
||||
|
||||
<record id="hr_contract_view_tree" model="ir.ui.view">
|
||||
<field name="name">hr.contract.view.tree</field>
|
||||
<field name="name">hr.contract.tree</field>
|
||||
<field name="model">hr.contract</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Contracts" decoration-bf="message_needaction == True">
|
||||
@@ -167,10 +163,15 @@
|
||||
<field name="domain">[]</field>
|
||||
<field name="context">{'search_default_current':1}</field>
|
||||
<field name="search_view_id" ref="hr_contract_view_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click here to create new contracts.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="hr_contract_type_view_form" model="ir.ui.view">
|
||||
<field name="name">hr.contract.type.view.form</field>
|
||||
<field name="name">hr.contract.type.form</field>
|
||||
<field name="model">hr.contract.type</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Contract Type">
|
||||
@@ -181,23 +182,24 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="hr_contract_type_view_tree" model="ir.ui.view">
|
||||
<field name="name">hr.contract.type.view.tree</field>
|
||||
<record id="hr_contract_type_view_tree" model="ir.ui.view">
|
||||
<field name="name">hr.contract.type.tree</field>
|
||||
<field name="model">hr.contract.type</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Contract Type">
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field colspan="4" name="name"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="hr_contract_type_view_search" model="ir.ui.view">
|
||||
<field name="name">hr.contract.type.view.search</field>
|
||||
<field name="name">hr.contract.type.search</field>
|
||||
<field name="model">hr.contract.type</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search Contract Type">
|
||||
<field name="name" string="Contract Type"/>
|
||||
<field name="sequence" widget="handle" string="Sequence"/>
|
||||
<field name="sequence" string="Sequence"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
@@ -210,8 +212,19 @@
|
||||
<field name="search_view_id" ref="hr_contract_type_view_search"/>
|
||||
</record>
|
||||
|
||||
<menuitem action="action_hr_contract_type" id="hr_menu_contract_type" parent="hr.menu_human_resources_configuration" sequence="3" groups="base.group_no_one"/>
|
||||
<menuitem action="action_hr_contract" id="hr_menu_contract" parent="hr.menu_hr_root" name="Contracts" sequence="4" groups="base.group_hr_manager"/>
|
||||
<menuitem
|
||||
id="hr_menu_contract_type"
|
||||
action="action_hr_contract_type"
|
||||
parent="hr.menu_human_resources_configuration"
|
||||
sequence="3"
|
||||
groups="base.group_no_one"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
<menuitem
|
||||
id="hr_menu_contract"
|
||||
name="Contracts"
|
||||
action="action_hr_contract"
|
||||
parent="hr.menu_hr_root"
|
||||
sequence="4"
|
||||
groups="base.group_hr_manager"/>
|
||||
|
||||
</odoo>
|
||||
|
||||
Reference in New Issue
Block a user