107 lines
3.7 KiB
Python
107 lines
3.7 KiB
Python
# The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
from trytond.model import ModelSQL, ModelView, fields, Unique
|
|
from trytond.pool import PoolMeta, Pool
|
|
from trytond.transaction import Transaction
|
|
from trytond.cache import Cache
|
|
|
|
__all__ = ['Team']
|
|
|
|
|
|
class TeamWorkCenter(ModelSQL, ModelView):
|
|
"""Team - Work Center"""
|
|
__name__ = 'company.employee.team-work.center'
|
|
_table = 'company_employee_work_center_rel'
|
|
|
|
team = fields.Many2One('company.employee.team', 'Team', required=True, select=True, ondelete='RESTRICT')
|
|
work_center = fields.Many2One('production.work.center', 'Work center', required=True)
|
|
date = fields.Date('Date', required=True, select=True)
|
|
|
|
@classmethod
|
|
def __setup__(cls):
|
|
super(TeamWorkCenter, cls).__setup__()
|
|
t = cls.__table__()
|
|
cls._sql_constraints = [
|
|
('employee_team_work_center_uniq',
|
|
Unique(t, t.team, t.date),
|
|
'A team can only work at a work center in a day.'),
|
|
]
|
|
cls._order.insert(0, ('date', 'DESC'))
|
|
|
|
@staticmethod
|
|
def default_date():
|
|
Date = Pool().get('ir.date')
|
|
return Date.today()
|
|
|
|
@classmethod
|
|
def delete(cls, team_work_centers):
|
|
Team = Pool().get('company.employee.team')
|
|
super(TeamWorkCenter, cls).delete(team_work_centers)
|
|
Team._work_centers_cache.clear()
|
|
|
|
@classmethod
|
|
def create(cls, vlist):
|
|
Team = Pool().get('company.employee.team')
|
|
team_work_centers = super(TeamWorkCenter, cls).create(vlist)
|
|
Team._work_centers_cache.clear()
|
|
return team_work_centers
|
|
|
|
@classmethod
|
|
def write(cls, *args):
|
|
Team = Pool().get('company.employee.team')
|
|
super(TeamWorkCenter, cls).write(*args)
|
|
Team._work_centers_cache.clear()
|
|
|
|
|
|
class Team:
|
|
__metaclass__ = PoolMeta
|
|
__name__ = 'company.employee.team'
|
|
|
|
work_centers = fields.One2Many('company.employee.team-work.center', 'team', 'Work centers')
|
|
_work_centers_cache = Cache('company_employee_team.work_centers')
|
|
work_center = fields.Function(
|
|
fields.Many2One('production.work.center', 'Work center'),
|
|
'get_work_center')
|
|
|
|
def get_work_center(self, name=None):
|
|
ctx_date = Transaction().context.get('date', None)
|
|
work_center = self.compute_work_center(ctx_date)
|
|
return work_center.id if work_center else None
|
|
|
|
def get_work_centers(self):
|
|
# Get from cache employee work centers or fetch them from the db
|
|
work_centers = self._work_centers_cache.get(self.id)
|
|
if work_centers is None:
|
|
pool = Pool()
|
|
TeamWorkCenter = pool.get('company.employee.team-work.center')
|
|
team_work_centers = TeamWorkCenter.search([
|
|
('team', '=', self.id), ],
|
|
order=[('date', 'ASC')])
|
|
|
|
work_centers = []
|
|
for team_work_center in team_work_centers:
|
|
work_centers.append(
|
|
(team_work_center.date, team_work_center.work_center))
|
|
self._work_centers_cache.set(self.id, work_centers)
|
|
return work_centers
|
|
|
|
def compute_work_center(self, date=None):
|
|
""""Return the work center for the given date"""
|
|
|
|
pool = Pool()
|
|
Date = pool.get('ir.date')
|
|
|
|
employee_work_centers = self.get_work_centers()
|
|
|
|
if date is None:
|
|
date = Date.today()
|
|
# search the work center for the given date
|
|
if employee_work_centers and date >= employee_work_centers[0][0]:
|
|
work_center = None
|
|
for edate, ework_center in employee_work_centers:
|
|
if date >= edate:
|
|
work_center = ework_center
|
|
else:
|
|
break
|
|
return work_center or None
|