[IMP] project*: adaptation due to the new Sale module

Major changes:
- New start and expiration dates
- Remove field Contract Status
- Simplified because use of sale_timesheet

Reason: complete rewrite of the Sale module.

Responsible: fp, dbo, nim
This commit is contained in:
Nicolas Martinelli
2015-08-27 18:15:24 +02:00
parent 6e38729449
commit 908f416573
15 changed files with 16 additions and 339 deletions
+6 -17
View File
@@ -163,6 +163,7 @@ class project(osv.osv):
'task_ids': fields.one2many('project.task', 'project_id',
domain=[('stage_id.fold', '=', False)]),
'color': fields.integer('Color Index'),
'user_id': fields.many2one('res.users', 'Project Manager'),
'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="restrict", required=True,
help="Internal email associated with this project. Incoming emails are automatically synchronized "
"with Tasks (or optionally Issues if the Issue Tracker module is installed)."),
@@ -185,7 +186,9 @@ class project(osv.osv):
'Status', required=True, copy=False),
'doc_count': fields.function(
_get_attached_docs, string="Number of documents attached", type='integer'
)
),
'date_start': fields.date('Start Date'),
'date': fields.date('Expiration Date', select=True, track_visibility='onchange'),
}
def _get_type_common(self, cr, uid, context):
@@ -201,6 +204,7 @@ class project(osv.osv):
'label_tasks': 'Tasks',
'state': 'open',
'sequence': 10,
'user_id': lambda self,cr,uid,ctx: uid,
'type_ids': _get_type_common,
'alias_model': 'project.task',
'privacy_visibility': 'employees',
@@ -257,7 +261,6 @@ class project(osv.osv):
data_obj = self.pool.get('ir.model.data')
result = []
for proj in self.browse(cr, uid, ids, context=context):
parent_id = context.get('parent_id', False)
context.update({'analytic_project_copy': True})
new_date_start = time.strftime('%Y-%m-%d')
new_date_end = False
@@ -270,15 +273,9 @@ class project(osv.osv):
'name':_("%s (copy)") % (proj.name),
'state':'open',
'date_start':new_date_start,
'date':new_date_end,
'parent_id':parent_id}, context=context)
'date':new_date_end}, context=context)
result.append(new_id)
child_ids = self.search(cr, uid, [('parent_id','=', proj.analytic_account_id.id)], context=context)
parent_id = self.read(cr, uid, new_id, ['analytic_account_id'])['analytic_account_id'][0]
if child_ids:
self.duplicate_template(cr, uid, child_ids, context={'parent_id': parent_id})
if result and len(result):
res_id = result[0]
form_view_id = data_obj._get_id(cr, uid, 'project', 'edit_project')
@@ -308,9 +305,6 @@ class project(osv.osv):
tasks_id = [x[0] for x in cr.fetchall()]
if tasks_id:
task_obj.write(cr, uid, tasks_id, {'active': value}, context=context)
child_ids = self.search(cr, uid, [('parent_id','=', proj.analytic_account_id.id)])
if child_ids:
self.setActive(cr, uid, child_ids, value, context=None)
return True
def create(self, cr, uid, vals, context=None):
@@ -322,9 +316,6 @@ class project(osv.osv):
alias_parent_model_name=self._name,
mail_create_nosubscribe=True)
if vals.get('type', False) not in ('template', 'contract'):
vals['type'] = 'contract'
ir_values = self.pool.get('ir.values').get_default(cr, uid, 'project.config.settings', 'generate_project_alias')
if ir_values:
vals['alias_name'] = vals.get('alias_name') or vals.get('name')
@@ -870,8 +861,6 @@ class account_analytic_account(osv.osv):
for account in self.browse(cr, uid, ids, context=context):
if not vals.get('name'):
vals_for_project['name'] = account.name
if not vals.get('type'):
vals_for_project['type'] = account.type
self.project_create(cr, uid, account.id, vals_for_project, context=context)
return super(account_analytic_account, self).write(cr, uid, ids, vals, context=context)
+1 -2
View File
@@ -7,7 +7,6 @@
<field name="name"/>
<field name="use_tasks"/>
<field name="user_id"/>
<field name="date"/>
<field name="color"/>
<field name="task_count"/>
<field name="label_tasks"/>
@@ -68,4 +67,4 @@
</kanban>
</field>
</record>
</odoo>
</odoo>
-9
View File
@@ -18,14 +18,6 @@
<field name="object">project.task</field>
</record>
<!-- Resource: project.project -->
<record id="all_projects_account" model="account.analytic.account">
<field name="name">Projects</field>
<field name="code">PP001</field>
<field name="type">view</field>
</record>
<function id="parent_project_default_set" model="ir.values" name="set" eval="('default',False,'parent_id', [('project.project', False)], all_projects_account, True, False, False, False, True)"/>
<!-- alias domain: project.config.settings -->
<function id="default_alias_domain_project" model="ir.values" name="set_default" eval="('project.config.settings', 'generate_project_alias', 1)"/>
@@ -109,7 +101,6 @@
<data noupdate="1">
<record id="project_project_data" model="project.project">
<field name="name">Discover Odoo</field>
<field name="parent_id" ref="all_projects_account"/>
<field name="privacy_visibility">followers</field>
<field name="user_id" ref="base.user_root"/>
<field name="alias_model">project.task</field>
-7
View File
@@ -49,14 +49,11 @@
<record id="project_project_1" model="project.project">
<field name="date_start" eval="time.strftime('%Y-%m-01 10:00:00')"/>
<field name="state">open</field>
<field name="type">normal</field>
<field name="name">Website for Sales &amp; WMS</field>
<field name="color">3</field>
<field name="partner_id" ref="portal.partner_demo_portal"/>
<field name="parent_id" ref="all_projects_account"/>
<field name="privacy_visibility">portal</field>
<field name="user_id" ref="base.user_demo"/>
<field name="description">Implement new website for Sale and Warehouse Management for a customer.</field>
<field name="alias_model">project.task</field>
<field name="type_ids" eval="[(4, ref('project_stage_0')) ,(4,ref('project_stage_1'))]"/>
<field name="message_follower_ids" eval="[
@@ -67,7 +64,6 @@
<record id="project_project_2" model="project.project">
<field name="name">Research &amp; Development</field>
<field name="parent_id" ref="all_projects_account"/>
<field name="privacy_visibility">followers</field>
<field name="user_id" ref="base.user_demo"/>
<field name="alias_model">project.task</field>
@@ -75,7 +71,6 @@
<record id="project_project_3" model="project.project">
<field name="sequence">10</field>
<field name="parent_id" ref="all_projects_account"/>
<field name="name">E-Learning Integration</field>
<field name="label_tasks">Trainings</field>
<field name="user_id" ref="base.user_demo"/>
@@ -85,7 +80,6 @@
<record id="project_project_4" model="project.project">
<field name="sequence">20</field>
<field name="parent_id" ref="all_projects_account"/>
<field name="name">Website Design Templates</field>
<field name="label_tasks">Designs</field>
<field name="user_id" ref="base.user_root"/>
@@ -96,7 +90,6 @@
<record id="project_project_5" model="project.project">
<field name="sequence">2</field>
<field name="parent_id" ref="all_projects_account"/>
<field name="partner_id" ref="base.res_partner_4"/>
<field name="name">Data Import/Export Plugin</field>
<field name="label_tasks">Databases</field>
+2 -14
View File
@@ -77,7 +77,7 @@
<form string="Project">
<header>
<button name="set_template" string="Set as Template" type="object" states="open" groups="base.group_user"/>
<button string="New Project Based on Template" name="duplicate_template" type="object" states="template" context="{'parent_id':parent_id}" class="oe_highlight" groups="base.group_user"/>
<button string="New Project Based on Template" name="duplicate_template" type="object" states="template" class="oe_highlight" groups="base.group_user"/>
<button name="reset_project" string="Reset as Project" type="object" states="template" class="oe_highlight" groups="base.group_user"/>
<field name="state" widget="statusbar" clickable="True"/>
</header>
@@ -116,21 +116,12 @@
</group>
<group name="misc">
<group string="Time Scheduling" groups="project.group_time_work_estimation_tasks">
<field name="date_start" string="Start Date"
readonly="1"/>
<field name="date" string="End Date"
readonly="1"/>
<field name="resource_calendar_id"/>
</group>
<group string="Configuration" groups="base.group_no_one">
<field name="sequence" groups="base.group_no_one"/>
<field name="active" attrs="{'invisible':[('state','in',['open', 'pending', 'template'])]}"/>
<field name="currency_id" groups="base.group_multi_currency" required="1"/>
<field name="parent_id" string="Parent"
help="Append this project to another one using analytic accounts hierarchy"
domain="[('id','!=',analytic_account_id)]"
context="{'current_model': 'project.project'}"
groups="project.group_time_work_estimation_tasks"/>
</group>
</group>
</page>
@@ -179,7 +170,6 @@
<group expand="0" string="Group By">
<filter string="Manager" name="Manager" context="{'group_by':'user_id'}"/>
<filter string="Contact" name="Partner" context="{'group_by':'partner_id'}"/>
<filter string="Parent" name="Parent" help="Parent" context="{'group_by':'parent_id'}"/>
</group>
</search>
</field>
@@ -190,14 +180,12 @@
<field name="model">project.project</field>
<field name="field_parent">child_ids</field>
<field name="arch" type="xml">
<tree decoration-bf="message_needaction==True" decoration-danger="date and (date&lt;current_date) and (state == 'open')" decoration-info="state in ('draft','pending')" decoration-muted="state in ('close','cancelled')" string="Projects">
<tree decoration-bf="message_needaction==True" decoration-info="state in ('draft','pending')" decoration-muted="state in ('close','cancelled')" string="Projects">
<field name="sequence" widget="handle"/>
<field name="message_needaction" invisible="1"/>
<field name="date" invisible="1"/>
<field name="name" string="Project Name"/>
<field name="user_id" string="Project Manager"/>
<field name="partner_id" string="Contact"/>
<field name="parent_id" string="Parent" invisible="1"/>
<field name="state"/>
</tree>
</field>
@@ -4,8 +4,6 @@ access_project_project_manager,project.project,model_project_project,project.gro
access_account_analytic_account_user,account.analytic.account,analytic.model_account_analytic_account,project.group_project_user,1,0,0,0
access_account_analytic_account_manager,account.analytic.account,analytic.model_account_analytic_account,project.group_project_manager,1,1,1,1
access_account_analytic_account_portal,account_analytic_account,analytic.model_account_analytic_account,base.group_portal,1,0,0,0
access_account_analytic_journal_project_manager,account.analytic.journal.project.manager,analytic.model_account_analytic_journal,project.group_project_manager,1,1,1,1
access_account_analytic_journal_project_user,account.analytic.journal.project.user,analytic.model_account_analytic_journal,project.group_project_user,1,1,1,0
access_project_task_type_user,project.task.type.user,model_project_task_type,base.group_user,1,0,0,0
access_project_task_type_project_user,project.task.type.project.user,model_project_task_type,project.group_project_user,1,0,0,0
access_project_task_type_manager,project.task.type manager,model_project_task_type,project.group_project_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
4 access_account_analytic_account_user account.analytic.account analytic.model_account_analytic_account project.group_project_user 1 0 0 0
5 access_account_analytic_account_manager account.analytic.account analytic.model_account_analytic_account project.group_project_manager 1 1 1 1
6 access_account_analytic_account_portal account_analytic_account analytic.model_account_analytic_account base.group_portal 1 0 0 0
access_account_analytic_journal_project_manager account.analytic.journal.project.manager analytic.model_account_analytic_journal project.group_project_manager 1 1 1 1
access_account_analytic_journal_project_user account.analytic.journal.project.user analytic.model_account_analytic_journal project.group_project_user 1 1 1 0
7 access_project_task_type_user project.task.type.user model_project_task_type base.group_user 1 0 0 0
8 access_project_task_type_project_user project.task.type.project.user model_project_task_type project.group_project_user 1 0 0 0
9 access_project_task_type_manager project.task.type manager model_project_task_type project.group_project_manager 1 1 1 1
@@ -26,7 +26,6 @@ class project_issue(osv.osv):
}),
'timesheet_ids': fields.one2many('account.analytic.line', 'issue_id', 'Timesheets'),
'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'),
'contract_state': fields.related('analytic_account_id', 'state', string='Contract Status', type='selection', selection=analytic.ANALYTIC_ACCOUNT_STATE),
}
def on_change_project(self, cr, uid, ids, project_id, context=None):
@@ -42,7 +41,6 @@ class project_issue(osv.osv):
account = project.analytic_account_id
if account:
result['value']['analytic_account_id'] = account.id
result['value']['contract_state'] = account.state
return result
@@ -14,13 +14,9 @@
</field>
<field name="active" position="after">
<field name="analytic_account_id"
domain="[('parent_id','!=',False),('partner_id', '=', partner_id),('type', '!=', 'view')]"
domain="[('parent_id','!=',False),('partner_id', '=', partner_id)]"
on_change='on_change_account_id(analytic_account_id)'/>
</field>
<xpath expr='//div[@name="project"]' position='after'>
<field name="contract_state" widget="label_selection" attrs="{'invisible': ['|', ('partner_id', '=', False), ('analytic_account_id', '=', False)]}"
options="{'classes': {'template': 'default', 'draft': 'info', 'open': 'success', 'pending': 'warning', 'close': 'danger', 'cancelled': 'warning'}}" readonly="1"/>
</xpath>
<xpath expr="//notebook/page[@name='extra_info']" position="before">
<page string="Timesheets" groups="project.group_tasks_work_on_tasks,project.group_time_work_estimation_tasks">
<field name="timesheet_ids" colspan="4" nolabel="1" context="{'default_user_id' : uid, 'default_account_id' : analytic_account_id, 'default_is_timesheet':1}"
@@ -30,13 +26,7 @@
<field name="user_id" required="1"/>
<field name="name"/>
<field name="account_id" invisible="0" domain="[('partner_id', '=', parent.partner_id)]" on_change="on_change_account_id(account_id, user_id, is_timesheet, context)" options="{'no_open': True, 'no_create': True}" groups="analytic.group_analytic_accounting"/>
<field name="unit_amount" string="Duration" on_change="on_change_unit_amount(product_id, unit_amount, False, product_uom_id,journal_id, context)" widget="float_time"/>
<field name="to_invoice" invisible="1"/>
<field name="product_uom_id" invisible="1" on_change="on_change_unit_amount(product_id, unit_amount, False, product_uom_id,journal_id, context)"/>
<field name="journal_id" invisible="1"/>
<field name="amount" invisible="1"/>
<field name="general_account_id" invisible="1"/>
<field name="product_id" invisible="1"/>
<field name="unit_amount" string="Duration" widget="float_time"/>
<field name="is_timesheet" invisible="1"/>
</tree>
</field>
@@ -4,10 +4,6 @@ access_account_analytic_line_project_user,account_analytic_line user,hr_timeshee
access_account_analytic_line_project_manager,account_analytic_line manager,hr_timesheet_sheet.model_account_analytic_line,project.group_project_manager,1,0,0,0
access_hr_timesheet_sheet_sheet_project_manager,hr_timesheet_sheet.sheet manager,hr_timesheet_sheet.model_hr_timesheet_sheet_sheet,project.group_project_manager,1,0,0,0
access_account_analytic_line_project_manager,account.analytic.line.timesheet.project.manager,account.model_account_analytic_line,project.group_project_manager,1,1,1,1
access_account_analytic_journal_project_manager,account.analytic.journal.project.manager,analytic.model_account_analytic_journal,project.group_project_manager,1,1,1,1
access_hr_timesheet_invoice_factor_project_manager,hr_timesheet_invoice.factor.project.manager,hr_timesheet_invoice.model_hr_timesheet_invoice_factor,project.group_project_manager,1,1,1,1
access_account_invoice_project_manager,account.invoice.project.manager,account.model_account_invoice,project.group_project_manager,1,1,1,1
access_analytic_account_line_project_user,analytic_account_line_timesheet user,analytic.model_account_analytic_line,project.group_project_user,1,1,1,0
access_account_analytic_journal_project_user,account.analytic.journal.project.user,analytic.model_account_analytic_journal,project.group_project_user,1,1,1,0
access_hr_timesheet_invoice_factor_project_user,hr_timesheet_invoice.factor.project.user,hr_timesheet_invoice.model_hr_timesheet_invoice_factor,project.group_project_user,1,1,1,0
access_account_invoice_project_user,account.invoice.project.user,account.model_account_invoice,project.group_project_user,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
4 access_account_analytic_line_project_manager account_analytic_line manager hr_timesheet_sheet.model_account_analytic_line project.group_project_manager 1 0 0 0
5 access_hr_timesheet_sheet_sheet_project_manager hr_timesheet_sheet.sheet manager hr_timesheet_sheet.model_hr_timesheet_sheet_sheet project.group_project_manager 1 0 0 0
6 access_account_analytic_line_project_manager account.analytic.line.timesheet.project.manager account.model_account_analytic_line project.group_project_manager 1 1 1 1
access_account_analytic_journal_project_manager account.analytic.journal.project.manager analytic.model_account_analytic_journal project.group_project_manager 1 1 1 1
access_hr_timesheet_invoice_factor_project_manager hr_timesheet_invoice.factor.project.manager hr_timesheet_invoice.model_hr_timesheet_invoice_factor project.group_project_manager 1 1 1 1
7 access_account_invoice_project_manager account.invoice.project.manager account.model_account_invoice project.group_project_manager 1 1 1 1
8 access_analytic_account_line_project_user analytic_account_line_timesheet user analytic.model_account_analytic_line project.group_project_user 1 1 1 0
access_account_analytic_journal_project_user account.analytic.journal.project.user analytic.model_account_analytic_journal project.group_project_user 1 1 1 0
access_hr_timesheet_invoice_factor_project_user hr_timesheet_invoice.factor.project.user hr_timesheet_invoice.model_hr_timesheet_invoice_factor project.group_project_user 1 1 1 0
9 access_account_invoice_project_user account.invoice.project.user account.model_account_invoice project.group_project_user 1 1 1 0
+1 -2
View File
@@ -15,13 +15,12 @@ with the effect of creating, editing and deleting either ways.
""",
'website': 'https://www.odoo.com/page/project-management',
'images': ['images/invoice_task_work.jpeg', 'images/my_timesheet.jpeg', 'images/working_hour.jpeg'],
'depends': ['resource', 'project', 'sale_contract'],
'depends': ['resource', 'project', 'sale_timesheet'],
'data': [
'security/ir.model.access.csv',
'security/project_timesheet_security.xml',
'report/project_report_view.xml',
'project_timesheet_view.xml',
'project_dashboard.xml',
'res_config_view.xml',
],
'demo': ['project_timesheet_demo.xml'],
@@ -1,30 +0,0 @@
<odoo>
<record id="action_project_analytic_account" model="ir.actions.act_window">
<field name="name">Analytic Account</field>
<field name="res_model">account.analytic.account</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="domain">[]</field>
<field name="context">{}</field>
</record>
<!--Project Inherit Kanban view-->
<record id="view_project_kanban_inherit" model="ir.ui.view">
<field name="name">project.project.kanban.inherit</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.view_project_kanban"/>
<field name="arch" type="xml">
<data>
<field name="use_tasks" position="after">
<field name="total_hours"/>
</field>
<xpath expr="//div[contains(@class, 'o_project_kanban_boxes')]" position="inside">
<a t-if="record.total_hours.value and record.total_hours.value &gt; 0" class="o_project_kanban_box" name="open_timesheets" type="object">
<span class="o_value"><t t-raw="record.total_hours.value"/></span>
<span class="o_label">Hours</span>
</a>
</xpath>
</data>
</field>
</record>
</odoo>
@@ -13,111 +13,6 @@ from openerp.exceptions import UserError
class project_project(osv.osv):
_inherit = 'project.project'
def _get_project_and_children(self, cr, uid, ids, context=None):
""" retrieve all children projects of project ids;
return a dictionary mapping each project to its parent project (or None)
"""
res = dict.fromkeys(ids, None)
while ids:
cr.execute("""
SELECT project.id, parent.id
FROM project_project project, project_project parent, account_analytic_account account
WHERE project.analytic_account_id = account.id
AND parent.analytic_account_id = account.parent_id
AND parent.id IN %s
""", (tuple(ids),))
dic = dict(cr.fetchall())
res.update(dic)
ids = dic.keys()
return res
def _progress_rate(self, cr, uid, ids, names, arg, context=None):
child_parent = self._get_project_and_children(cr, uid, ids, context)
# compute planned_hours, total_hours, effective_hours specific to each project
cr.execute("""
SELECT project_id, COALESCE(SUM(planned_hours), 0.0),
COALESCE(SUM(total_hours), 0.0), COALESCE(SUM(effective_hours), 0.0)
FROM project_task
LEFT JOIN project_task_type ON project_task.stage_id = project_task_type.id
WHERE project_task.project_id IN %s AND project_task_type.fold = False
GROUP BY project_id
""", (tuple(child_parent.keys()),))
# aggregate results into res
res = dict([(id, {'planned_hours': 0.0, 'total_hours': 0.0, 'effective_hours': 0.0}) for id in ids])
for id, planned, total, effective in cr.fetchall():
# add the values specific to id to all parent projects of id in the result
while id:
if id in ids:
res[id]['planned_hours'] += planned
res[id]['total_hours'] += total
res[id]['effective_hours'] += effective
id = child_parent[id]
# compute progress rates
for id in ids:
if res[id]['total_hours']:
res[id]['progress_rate'] = round(100.0 * res[id]['effective_hours'] / res[id]['total_hours'], 2)
else:
res[id]['progress_rate'] = 0.0
return res
def _get_projects_from_tasks(self, cr, uid, task_ids, context=None):
tasks = self.pool.get('project.task').browse(cr, uid, task_ids, context=context)
project_ids = [task.project_id.id for task in tasks if task.project_id]
return self.pool.get('project.project')._get_project_and_parents(cr, uid, project_ids, context)
def _get_project_and_parents(self, cr, uid, ids, context=None):
""" return the project ids and all their parent projects """
res = set(ids)
while ids:
cr.execute("""
SELECT DISTINCT parent.id
FROM project_project project, project_project parent, account_analytic_account account
WHERE project.analytic_account_id = account.id
AND parent.analytic_account_id = account.parent_id
AND project.id IN %s
""", (tuple(ids),))
ids = [t[0] for t in cr.fetchall()]
res.update(ids)
return list(res)
def onchange_partner_id(self, cr, uid, ids, part=False, context=None):
res = super(project_project, self).onchange_partner_id(cr, uid, ids, part, context)
if part and res and ('value' in res):
# set Invoice Task Work to 100%
data_obj = self.pool.get('ir.model.data')
data_id = data_obj._get_id(cr, uid, 'hr_timesheet_invoice', 'timesheet_invoice_factor1')
if data_id:
factor_id = data_obj.browse(cr, uid, data_id).res_id
res['value'].update({'to_invoice': factor_id})
return res
_columns = {
'planned_hours': fields.function(_progress_rate, multi="progress", string='Planned Time', help="Sum of planned hours of all tasks related to this project and its child projects.",
store = {
'project.project': (_get_project_and_parents, ['tasks', 'parent_id', 'child_ids'], 10),
'project.task': (_get_projects_from_tasks, ['planned_hours', 'remaining_hours', 'timesheet_ids', 'stage_id'], 20),
}),
'effective_hours': fields.function(_progress_rate, multi="progress", string='Time Spent', help="Sum of spent hours of all tasks related to this project and its child projects.",
store = {
'project.project': (_get_project_and_parents, ['tasks', 'parent_id', 'child_ids'], 10),
'project.task': (_get_projects_from_tasks, ['planned_hours', 'remaining_hours', 'timesheet_ids', 'stage_id'], 20),
}),
'total_hours': fields.function(_progress_rate, multi="progress", string='Total Time', help="Sum of total hours of all tasks related to this project and its child projects.",
store = {
'project.project': (_get_project_and_parents, ['tasks', 'parent_id', 'child_ids'], 10),
'project.task': (_get_projects_from_tasks, ['planned_hours', 'remaining_hours', 'timesheet_ids', 'stage_id'], 20),
}),
'progress_rate': fields.function(_progress_rate, multi="progress", string='Progress', type='float', group_operator="avg", help="Percent of tasks closed according to the total of tasks todo.",
store = {
'project.project': (_get_project_and_parents, ['tasks', 'parent_id', 'child_ids'], 10),
'project.task': (_get_projects_from_tasks, ['planned_hours', 'remaining_hours', 'timesheet_ids', 'stage_id'], 20),
}),
}
_defaults = {
'invoice_on_timesheets': True,
}
def open_timesheets(self, cr, uid, ids, context=None):
""" open Timesheets view """
mod_obj = self.pool.get('ir.model.data')
@@ -130,12 +25,6 @@ class project_project(osv.osv):
'default_is_timesheet':True
}
help = _("""<p class="oe_view_nocontent_create">Record your timesheets for the project '%s'.</p>""") % (project.name,)
try:
if project.to_invoice and project.partner_id:
help+= _("""<p>Timesheets on this project may be invoiced to %s, according to the terms defined in the contract.</p>""" ) % (project.partner_id.name,)
except:
# if the user do not have access rights on the partner
pass
res = mod_obj.get_object_reference(cr, uid, 'hr_timesheet', 'act_hr_timesheet_line_evry1_all_form')
id = res and res[1] or False
@@ -213,7 +102,6 @@ class task(osv.osv):
'timesheet_ids': fields.one2many('account.analytic.line', 'task_id', 'Timesheets'),
'analytic_account_id': fields.related('project_id', 'analytic_account_id',
type='many2one', relation='account.analytic.account', string='Analytic Account', store=True),
'contract_state': fields.related('project_id', 'analytic_account_id', 'state', relation="account.analytic.account", string='Contract Status', type='selection', selection=analytic.ANALYTIC_ACCOUNT_STATE),
}
_defaults = {
@@ -233,7 +121,6 @@ class task(osv.osv):
if 'value' not in result:
result['value'] = {}
project = self.pool['project.project'].browse(cr, uid, project_id, context=context)
result['value']['contract_state'] = project.analytic_account_id.state
return result
@@ -2,20 +2,11 @@
<openerp>
<data noupdate="1">
<!-- Example employee -->
<record id="hr.employee_qdp" model="hr.employee">
<field name="product_id" ref="product.product_product_2"/>
<field name="journal_id" ref="hr_timesheet.analytic_journal"/>
</record>
<record id="hr.employee_al" model="hr.employee">
<field name="journal_id" ref="hr_timesheet.analytic_journal"/>
</record>
<record id="hr.employee_phu" model="hr.employee">
<field name="name">Lisa Jongejans</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="category_ids" eval="[(6, 0, [ref('hr.employee_category_4')])]"/>
<field name="journal_id" ref="hr_timesheet.analytic_journal"/>
<field name="work_location">Building 1, Second Floor</field>
<field name="work_phone">+3282623500</field>
<field name="image" type="base64" file="project_timesheet/static/img/employee_phu-image.jpg"/>
@@ -25,20 +16,16 @@
<field name="name">Martin Lawrence</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="category_ids" eval="[(6, 0, [ref('hr.employee_category_4')])]"/>
<field name="product_id" ref="product.product_product_2"/>
<field name="journal_id" ref="hr_timesheet.analytic_journal"/>
</record>
<record id="hr.employee_jth" model="hr.employee">
<field name="name">Jimmy Kosikin</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="category_ids" eval="[(6, 0, [ref('hr.employee_category_4')])]"/>
<field name="journal_id" ref="hr_timesheet.analytic_journal"/>
</record>
<record id="hr.employee7" model="hr.employee">
<field name="name">Alice Englert</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="category_ids" eval="[(6, 0, [ref('hr.employee_category_4')])]"/>
<field name="journal_id" ref="hr_timesheet.analytic_journal"/>
<field name="work_location">Building 1, Second Floor</field>
<field name="work_phone">+3282823500</field>
<field name="work_email">alice@openerp.com</field>
@@ -48,7 +35,6 @@
</record>
<record id="hr.employee_fp" model="hr.employee">
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="journal_id" ref="hr_timesheet.analytic_journal"/>
</record>
</data>
@@ -2,62 +2,14 @@
<openerp>
<data>
<record id="view_project_tree_inherited" model="ir.ui.view">
<field name="name">project.project.tree.inherited</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.view_project"/>
<field name="arch" type="xml">
<field name="partner_id" position="after">
<field name="planned_hours" widget="float_time" groups="project.group_time_work_estimation_tasks"/>
<field name="total_hours" widget="float_time"/>
<field name="effective_hours" widget="float_time" groups="project.group_time_work_estimation_tasks"/>
<field name="progress_rate" widget="progressbar"/>
</field>
</field>
</record>
<record id="project_invoice_form" model="ir.ui.view">
<field name="name">Inherit project form : Invoicing Data</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.edit_project"/>
<field name="arch" type="xml">
<xpath expr='//div[@name="options_active"]' position="attributes">
<attribute name="invisible">0</attribute>
</xpath>
<xpath expr='//div[@name="options_active"]' position='inside'>
<field name="invoice_on_timesheets" class="oe_inline"/>
<label for="invoice_on_timesheets"/>
</xpath>
<xpath expr='//group[@name="group_alias"]' position='before'>
<p attrs="{'invisible': [('analytic_account_id','=',False)]}">
To invoice or setup invoicing and renewal options, go to the related contract:
<field name="analytic_account_id" readonly="1" required="0" class="oe_inline" nolabel="1"/>.
</p>
</xpath>
<field name="privacy_visibility" position="after">
<field name="planned_hours" widget="float_time"
groups="project.group_time_work_estimation_tasks"/>
<field name="effective_hours" widget="float_time"
groups="project.group_time_work_estimation_tasks"/>
</field>
<div name="button_box" position="inside">
<button class="oe_stat_button" name="open_timesheets" type="object" attrs="{'invisible':[('invoice_on_timesheets','=',False)]}"
icon="fa-calendar" string="Timesheets"/>
<button class="oe_stat_button" name="open_timesheets" type="object" icon="fa-calendar" string="Timesheets"/>
</div>
<xpath expr='//field[@name="partner_id"]' position='after'>
<field name="pricelist_id" invisible="1"/>
</xpath>
</field>
</record>
<record id="project_invoice_search" model="ir.ui.view">
<field name="name">Inherit project search view : Invoicing Data</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.view_project_project_filter"/>
<field name="arch" type="xml">
<xpath expr='//filter[@name="Template"]' position='after'>
<filter string="Billable" domain="[('to_invoice','!=', False)]"/>
</xpath>
</field>
</record>
@@ -98,45 +50,6 @@
</field>
</record>
<!-- Menus -->
<record id="action_project_timesheet_bill_task" model="ir.actions.act_window">
<field name="name">Invoice Tasks</field>
<field name="res_model">account.analytic.line</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,pivot</field>
<field name="domain">[]</field>
<field name="context">{'search_default_to_invoice': 1}</field>
<field name="view_id" ref="view_account_analytic_line_tree_inherit_account_id"/>
<field name="help" type="html">
<p>
You will find here timesheets and purchases you did for contracts that can be reinvoiced to the customer.
If you want to record new jobs to invoice, you should use the timesheet menu instead.
</p>
</field>
</record>
<!--
Time Tracking menu in project Management
-->
<record id="action_account_analytic_overdue" model="ir.actions.act_window">
<field name="name">Customer Projects</field>
<field name="res_model">account.analytic.account</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,graph</field>
<field name="context">{}</field>
<field name="domain">[('type','=','normal')]</field>
<field name="search_view_id" ref="sale_contract.view_account_analytic_account_overdue_search"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a customer contract.
</p><p>
You will find here the contracts related to your customer
projects in order to track the invoicing progress.
</p>
</field>
</record>
<record model="ir.ui.view" id="view_task_form2_inherited">
<field name="name">project.task.form.inherited</field>
<field name="model">project.task</field>
@@ -145,10 +58,6 @@
<field name="project_id" position="attributes">
<attribute name="on_change">onchange_project(project_id)</attribute>
</field>
<xpath expr='//field[@name="project_id"]' position='after'>
<field name="contract_state" widget="label_selection" attrs="{'invisible': ['|', ('project_id', '=', False), ('partner_id', '=', False)]}"
options="{'classes': {'template': 'default', 'draft': 'info', 'open': 'success', 'pending': 'warning', 'close': 'danger', 'cancelled': 'warning'}}" readonly="1"/>
</xpath>
<field name="tag_ids" position="after">
<field name="analytic_account_id" invisible="1"/>
<field name="progress" widget="progressbar"
@@ -161,14 +70,8 @@
<field name="date"/>
<field name="user_id" required="1"/>
<field name="name"/>
<field name="account_id" on_change="on_change_account_id(account_id, user_id, unit_amount, is_timesheet, context)"/>
<field name="unit_amount" string="Duration" on_change="on_change_unit_amount(product_id, unit_amount, False, product_uom_id,journal_id, context)" sum="Total time" widget="float_time"/>
<field name="to_invoice"/>
<field name="product_uom_id" on_change="on_change_unit_amount(product_id, unit_amount, False, product_uom_id,journal_id, context)" invisible="1"/>
<field name="journal_id" invisible="1"/>
<field name="amount" sum="Total cost" invisible="1"/>
<field name="general_account_id" invisible="1"/>
<field name="product_id" on_change="on_change_unit_amount(product_id, unit_amount, False, product_uom_id,journal_id, context)" domain="[('type','=','service')]" invisible="1"/>
<field name="account_id"/>
<field name="unit_amount" string="Duration" sum="Total time" widget="float_time"/>
<field name="is_timesheet" invisible="1"/>
</tree>
</field>
@@ -12,7 +12,6 @@
-
!record {model: product.product, id: product_product_hrmanger0}:
categ_id: product.product_category_5
mes_type: fixed
name: HR Manager
standard_price: 1.0
type: service
@@ -21,13 +20,6 @@
volume: 0.0
warranty: 0.0
weight: 0.0
-
Create an analytic journal for employees timesheet
-
!record {model: account.analytic.journal, id: account_analytic_journal_hrtimesheet0}:
company_id: base.main_company
name: HR Timesheet
type: general
-
Create a financial account
-
@@ -41,8 +33,6 @@
!record {model: hr.employee, id: hr_employee_hrmanager0}:
name: HR Manager
user_id: res_users_hrmanager0
product_id: product_product_hrmanger0
journal_id: account_analytic_journal_hrtimesheet0
-
Create a project 'Timesheet Management'
-
@@ -69,5 +59,5 @@
name: Get work calendar of all employees
user_id: res_users_hrmanager0
account_id: analytic.analytic_administratif
journal_id: account_analytic_journal_hrtimesheet0
general_account_id: financial_account0
product_id: product_product_hrmanger0