from itertools import groupby
from datetime import datetime, timedelta
from odoo import api, fields, models, _
from odoo.exceptions import UserError, ValidationError
from odoo.tools import float_is_zero, float_compare, DEFAULT_SERVER_DATETIME_FORMAT
from odoo.tools.misc import formatLang
import odoo.addons.decimal_precision as dp
class AgendaSchedule(models.Model):
_name = 'time.track'
_inherit = 'mail.thread'
name = fields.Char(string='Agenda Name')
active = fields.Boolean(default=True, help="The active field allows you to hide the category without removing it.")
create_uid = fields.Many2one('res.users', 'Owner', index=True, readonly=True, track_visibility='onchange',
default=lambda self: self.env.user)
create_date = fields.Date(string="Created Date", copy=False, readonly=True, store=True, default=fields.Datetime.now)
task_line_ids = fields.One2many('agenda.line.items', 'agenda_id', string="Task Schedule")
time_scheduled = fields.Float(string='Total Scheduled Time', copy=False, store=True, readonly=True,
compute='_compute_total_agenda')
time_actual = fields.Float(string='Total Scheduled Time', copy=False, store=True, readonly=True,
compute='_compute_total_agenda')
total_deviation = fields.Float(string='Total Scheduled Time', copy=False, store=True, readonly=True,
compute='_compute_total_agenda')
@api.depends('task_line_ids.time_total', 'task_line_ids.time_took', 'task_line_ids.time_deviate')
def _compute_total_agenda(self):
for rec in self:
time_scheduled = time_actual = total_deviation = 0.0
for line in rec.task_line_ids:
time_scheduled += line.time_total
time_actual += line.time_took
total_deviation += line.time_deviate
rec.time_scheduled = time_scheduled
rec.time_actual = time_actual
rec.total_deviation = total_deviation
class AgendaLine(models.Model):
_name = 'agenda.line.items'
agenda_id = fields.Many2one('time.track')
agenda_num = fields.Char('Sl.No.')
name = fields.Char(string='Agenda Name')
start_time = fields.Datetime(string="Time Start", default=fields.Datetime.now)
stop_time = fields.Datetime(string="Time Stop", default=fields.Datetime.now)
time_total = fields.Float(string='Time Required', compute='_compute_worked_hours', store=True)
check_in = fields.Boolean(string='Check In', default=0)
check_out = fields.Boolean(string='Check Out', default=0)
log_in = fields.Datetime(string="Login Time")
log_out = fields.Datetime(string="Logout Time")
time_took = fields.Float(string='Time Taken', compute='_compute_actual_worked_hours', store=True)
time_deviate = fields.Float(string='Deviation', compute='compute_deviation', store=True)
status = fields.Selection([
('open','Open'),
('closed','Closed')
], string='Current Status', default='open')
task_remarks = fields.Char(string='Remarks')
@api.depends('start_time', 'stop_time')
def _compute_worked_hours(self):
for rec in self:
if rec.stop_time:
delta = datetime.strptime(rec.stop_time, DEFAULT_SERVER_DATETIME_FORMAT) - datetime.strptime(
rec.start_time, DEFAULT_SERVER_DATETIME_FORMAT)
rec.time_total = delta.total_seconds() / 3600.0
@api.depends('time_total', 'time_took')
def compute_deviation(self):
for rec in self:
if rec.time_took:
deviate = (rec.time_took - rec.time_total)
rec.time_deviate = deviate
@api.onchange('check_in')
def get_login_time(self):
if self.check_in:
if self.check_in == 1:
self.log_in = datetime.today()
else:
self.log_in = False
@api.onchange('check_out')
def get_logout_time(self):
if self.check_out:
if self.check_out == 1:
self.log_out = datetime.today()
else:
self.log_out = False
@api.depends('log_in', 'log_out')
def _compute_actual_worked_hours(self):
for rec in self:
if rec.log_out:
data = datetime.strptime(rec.log_out, DEFAULT_SERVER_DATETIME_FORMAT) - datetime.strptime(
rec.log_in, DEFAULT_SERVER_DATETIME_FORMAT)
rec.time_took = data.total_seconds() / 3600.0
@api.model
def create(self, values):
values['agenda_num'] = self.env['ir.sequence'].get('agenda.line.items') or ' '
if values.get('check_in') == 1:
values['log_in'] = datetime.today()
if values.get('check_out') == 1:
values['log_out'] = datetime.today()
res = super(AgendaLine, self).create(values)
return res
@api.model
def write(self, values):
values['agenda_num'] = self.env['ir.sequence'].get('agenda.line.items') or ' '
if values.get('check_in') == 1:
values['log_in'] = datetime.today()
if values.get('check_out') == 1:
values['log_out'] = datetime.today()
res = super(AgendaLine, self).write(values)
return res