Added file

This commit is contained in:
projectsodoo 2021-01-19 10:13:33 +05:30
parent 105261a6bb
commit 4f2601e9fb
4 changed files with 194 additions and 2 deletions

View File

@ -25,7 +25,7 @@
# always loaded
'data': [
'security/ir.model.access.csv',
#'security/cor_custom_security.xml',
'security/cor_custom_security.xml',
'views/crm_view.xml',
'views/sale_views.xml',
'views/project_view.xml',

View File

@ -0,0 +1,122 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from odoo.exceptions import UserError, AccessError, ValidationError
from dateutil.relativedelta import relativedelta
#class Project(models.Model):
#_inherit = 'project.project'
#project_cons_hrs = fields.One2many('project.consultant.hrs', 'project_id', 'Project Hours')
class ProjectConsultantHrs(models.Model):
_name = 'project.consultant.hrs'
_description = 'Project Consultant Hours'
_order = 'employee_id, end_date desc'
project_id = fields.Many2one('project.project', string="Project", required=True)
employee_id = fields.Many2one('hr.employee', string="Consultant", required=True)
start_date = fields.Date('Start Date', required=True)
end_date = fields.Date('End Date', required=True)
percentage = fields.Float("Percentage (%)")
budgeted_hours = fields.Float("Budgeted Hours", compute='_compute_budgeted_hours', store=True)
actual_hours = fields.Float("Actual Hours", compute='_compute_actual_hours', store=True)
#hours_type = fields.Selection([('Budgeted Hours', 'Budgeted Hours'), ('Actual Hours', 'Actual Hours')], default="Budgeted Hours", string="Type")
@api.constrains('start_date', 'end_date')
def _check_dates(self):
for rec in self:
if rec.end_date < rec.start_date:
raise ValidationError(_('Start date must be earlier than end date.'))
@api.constrains('employee_id', 'percentage')
def _check_percent(self):
for val in self:
if val.employee_id and val.percentage:
rec = self.search([('employee_id','=',val.employee_id.id),('project_id','=',val.project_id.id)])
per = [r.percentage for r in rec]
if sum(per) > 100:
raise ValidationError(_('Consultant total percentage should not be greater than 100'))
if (val.percentage <= 0.0 or val.percentage > 100.0):
raise ValidationError(_('Percentage must be between 1 and 100.'))
@api.constrains('start_date', 'end_date')
def _check_date(self):
for val in self:
#if 'project_id' in self.env.context:
if not self.project_id.date_start or not self.project_id.date:
raise UserError(_('Project start date and end date should not be blank'))
if self.project_id.date_start and self.start_date:
if not (self.project_id.date_start <= self.start_date <= self.project_id.date):
raise ValidationError("Start date should be between project start date and End Date")
if self.end_date:
if not (self.project_id.date_start <= self.end_date <= self.project_id.date):
raise ValidationError("End date should be between project start date and End Date")
domain = [
('start_date', '<=', val.end_date),
('end_date', '>=', val.start_date),
('project_id', '=', val.project_id.id),
('employee_id', '=', val.employee_id.id),
('id', '!=', val.id)
]
res = self.search_count(domain)
if res > 0:
raise ValidationError(_('Same Consultant can not have 2 same date that overlaps on same day!'))
@api.depends('project_id', 'employee_id', 'project_id.sale_line_employee_ids', 'percentage')
def _compute_budgeted_hours(self):
for val in self:
if val.project_id and val.employee_id and val.percentage > 0:
budgeted = 0
for emp in val.project_id.sale_line_employee_ids:
if emp.employee_id.id == val.employee_id.id:
budgeted = emp.budgeted_qty
val.budgeted_hours = (budgeted * val.percentage / 100)
else:
val.budgeted_hours = 0
@api.depends('project_id', 'start_date', 'end_date', 'project_id.timesheet_ids')
def _compute_actual_hours(self):
Timesheet = self.env['account.analytic.line']
for val in self:
if val.project_id and val.employee_id and val.start_date and val.end_date:
domain = [
('project_id','=',val.project_id.id),
('employee_id', '=', val.employee_id.id),
('date', '>=', val.start_date),
('date', '<=', val.end_date)
]
timesheets = Timesheet.search(domain)
val.actual_hours = sum(timesheet.unit_amount for timesheet in timesheets)
else:
val.actual_hours = 0
@api.onchange('start_date')
def onchange_start_date(self):
if self.start_date:
self.end_date = self.start_date + relativedelta(days=6)
@api.onchange('employee_id')
def onchange_employee_id(self):
res = {}
emp_ids = [emp.employee_id.id for emp in self.project_id.sale_line_employee_ids]
res['domain'] = {'employee_id': [('id', 'in', emp_ids)]}
if 'project_id' in self.env.context:
#if not self.env.context['project_id']:
#raise UserError(_('Please save record before add a line'))
if not emp_ids:
raise UserError(_('Please add consultant at Invoicing tab before add a line'))
res['domain'] = {'employee_id': [('id','in',emp_ids)]}
return res
"""@api.onchange('employee_id', 'percentage')
def onchange_employee_id(self):
if self.employee_id and self.percentage > 0:
cons = [emp.budgeted_qty if emp.employee_id.id == self.employee_id.id else 0 for emp in self.project_id.sale_line_employee_ids]
budgeted = cons and cons[0] or 0
if budgeted > 0:
#record.employee_per = 100 - record.manager_per
self.budgeted_hours = (budgeted * self.percentage / 100)
else:
self.budgeted_hours = 0"""

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Note using code overriding menu in code (not working) so these below features will add using ODOO UI -->
<!--<record id="group_show_hr_discuss_group" model="res.groups">
<field name="name">Show Discuss Menu</field>
<field name="comment">Show Discuss Menu related user group</field>
</record>
<record id="group_show_hr_contact_group" model="res.groups">
<field name="name">Show Contact Menu</field>
<field name="comment">Show Contact Menu related user group</field>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
</record>
<record id="group_show_hr_menu_group" model="res.groups">
<field name="name">Show HR Menu</field>
<field name="comment">Show HR Menu related user group</field>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
</record>-->
<function name="write" model="ir.model.data">
<function name="search" model="ir.model.data">
<value eval="[('module','=','hr_timesheet'),('name','=','timesheet_line_rule_user')]"/>
</function>
<value eval="{'noupdate': False}" />
</function>
<record id="hr_timesheet.timesheet_line_rule_user" model="ir.rule">
<field name="name">account.analytic.line.timesheet.user</field>
<field name="model_id" ref="analytic.model_account_analytic_line"/>
<field name="domain_force">[
('user_id', '=', user.id),
('project_id', '!=', False),
'|', '|','|',
('project_id.privacy_visibility', '!=', 'followers'),
('project_id.allowed_internal_user_ids', 'in', user.ids),
('task_id.allowed_user_ids', 'in', user.ids),
('project_id.sale_line_employee_ids.employee_id.user_id', 'in', user.ids),
]</field>
<field name="groups" eval="[(4, ref('hr_timesheet.group_hr_timesheet_user'))]"/>
</record>
<function name="write" model="ir.model.data">
<function name="search" model="ir.model.data">
<value eval="[('module','=','hr_timesheet'),('name','=','timesheet_line_rule_approver')]"/>
</function>
<value eval="{'noupdate': False}" />
</function>
<record id="hr_timesheet.timesheet_line_rule_approver" model="ir.rule">
<field name="name">account.analytic.line.timesheet.approver</field>
<field name="model_id" ref="analytic.model_account_analytic_line" />
<field name="domain_force">[
('project_id', '!=', False),
'|','|',
('project_id.privacy_visibility', '!=', 'followers'),
('project_id.allowed_internal_user_ids', 'in', user.ids),
('project_id.sale_line_employee_ids.employee_id.user_id', 'in', user.ids),
]</field>
<field name="groups" eval="[(4, ref('hr_timesheet.group_hr_timesheet_approver'))]" />
</record>
</odoo>

View File

@ -3,4 +3,4 @@
from . import project_create_sale_order
from . import crm_opportunity_to_quotation
from . import project_multi_budget_assign
from . import project_multi_budget_assign