diff --git a/project_subtask/README.rst b/project_subtask/README.rst new file mode 100644 index 000000000..ece64b201 --- /dev/null +++ b/project_subtask/README.rst @@ -0,0 +1,19 @@ +Sub-Task Implementation & Reports v9 +==================================== +Implementation & Reports of Sub-Task in Project Module. + +Features +======== + +* User can decide whether the project need sub task feature or not. +* Sub-task Lines Under Task Form. +* Sub-task Kanban View +* Sub-Task Count in Task Kanban View. +* Sub-Task Dynamic Analysis Under Report. +* Deadline Validation for Sub-Task. +* Stage Validation for Sub-Task. + +Credits +======= +Developer: Nilmar Shereef @ cybrosys, shereef@cybrosys.in +Developer: Jesni Banu @ cybrosys, jesni@cybrosys.in diff --git a/project_subtask/__init__.py b/project_subtask/__init__.py new file mode 100644 index 000000000..a3bb49889 --- /dev/null +++ b/project_subtask/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2016-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +import models + diff --git a/project_subtask/__openerp__.py b/project_subtask/__openerp__.py new file mode 100644 index 000000000..541c74931 --- /dev/null +++ b/project_subtask/__openerp__.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2016-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +{ + 'name': 'Sub Tasks in Project', + 'version': '9.0.1.0.0', + 'summary': """Implementation & Reports of Sub-Task in Project Module""", + 'description': 'This module helps you to create sub task under a task', + 'category': 'Project Management', + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'website': "http://www.cybrosys.com", + 'depends': ['base', 'project'], + 'data': [ + 'views/project_view.xml', + 'views/task_view.xml', + 'views/sub_task.xml', + 'views/sub_task_report.xml', + 'views/sub_task_type_view.xml' + ], + 'images': ['static/description/project_banner.jpg'], + 'license': 'LGPL-3', + 'demo': [], + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/project_subtask/models/__init__.py b/project_subtask/models/__init__.py new file mode 100644 index 000000000..cfa5a7c3f --- /dev/null +++ b/project_subtask/models/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2016-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +import project +import sub_task_report diff --git a/project_subtask/models/project.py b/project_subtask/models/project.py new file mode 100644 index 000000000..71c156cb2 --- /dev/null +++ b/project_subtask/models/project.py @@ -0,0 +1,238 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2016-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +from openerp import models, api, fields, _ +from openerp.exceptions import Warning, ValidationError + + +class ProjectMaster(models.Model): + _inherit = 'project.project' + + use_sub_task = fields.Boolean(string="SubTasks", default=True) + label_sub_tasks = fields.Char(default='SubTasks') + + +class SubTaskMaster(models.Model): + _name = 'project.sub_task' + + @api.constrains('date_deadline', 'task_ref') + def date_deadline_validation(self): + if self.date_deadline > self.task_ref.date_deadline: + raise ValidationError(_("Your main task will dead at this date")) + + name = fields.Char(string="Name", requires=True) + priority = fields.Selection([('0', 'Normal'), ('1', 'High')], 'Priority', select=True, default='0') + assigned_user = fields.Many2one('res.users', string="Assigned Person", required=1) + task_ref = fields.Many2one('project.task', string='Task', required=1, domain=['|', '|', ('project_id.use_sub_task', '=', True), + ('stage_id.done_state', '=', False), + ('stage_id.cancel_state', '=', False)]) + stage_id = fields.Many2one('project.sub_task.type', string='Stage', select=True, + domain="[('task_ids', '=', task_ref)]", copy=False) + project_id = fields.Many2one('project.project', related='task_ref.project_id', string='Project') + notes = fields.Html(string='Notes') + planned_hours = fields.Float(string='Initially Planned Hours', + help='Estimated time to do the Subtask, usually set by the project manager when the ' + 'task is in draft state.') + partner_id = fields.Many2one('res.partner', string='Customer', related='task_ref.partner_id', readonly=1) + color = fields.Integer(string='Color Index') + attachment_ids = fields.One2many('ir.attachment', 'res_id', domain=lambda self: [('res_model', '=', self._name)], + auto_join=True, string='Attachments') + displayed_image_id = fields.Many2one('ir.attachment', + domain="[('res_model', '=', 'project.sub_task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]", + string='Displayed Image') + + tag_ids = fields.Many2one('project.sub_task.tags', string='Tags') + write_date = fields.Datetime(string='Last Modification Date', readonly=True, select=True) + date_start = fields.Datetime(string='Starting Date', readonly=True, select=True) + date_deadline = fields.Date(string='Deadline') + active = fields.Boolean(string='Active', default=True) + description = fields.Html(String='Description') + sequence = fields.Integer(string='Sequence', select=True, default=10, + help="Gives the sequence order when displaying a list of sub tasks.") + company_id = fields.Many2one('res.company', string='Company') + date_last_stage_update = fields.Datetime(string='Last Stage Update', select=True, copy=False, readonly=True) + date_assign = fields.Datetime(string='Assigning Date', select=True, copy=False, readonly=True) + + def stage_find(self, cr, uid, cases, section_id, domain=[], order='sequence', context=None): + if isinstance(cases, (int, long)): + cases = self.browse(cr, uid, cases, context=context) + section_ids = [] + if section_id: + section_ids.append(section_id) + for task in cases: + if task.project_id: + section_ids.append(task.project_id.id) + search_domain = [] + if section_ids: + search_domain = [('|')] * (len(section_ids) - 1) + for section_id in section_ids: + search_domain.append(('project_ids', '=', section_id)) + search_domain += list(domain) + stage_ids = self.pool.get('project.sub_task.type').search(cr, uid, search_domain, order=order, context=context) + if stage_ids: + return stage_ids[0] + return False + + def _get_default_stage_id(self, cr, uid, context=None): + """ Gives default stage_id """ + if context is None: + context = {} + return self.stage_find(cr, uid, [], context.get('default_project_id'), [('fold', '=', False)], context=context) + + _defaults = { + 'stage_id': _get_default_stage_id, + 'date_last_stage_update': fields.Datetime.now(), + 'date_start': fields.Datetime.now(), + } + + +class TaskMaster(models.Model): + _inherit = 'project.task' + + sub_task_lines = fields.One2many('project.sub_task', 'task_ref', string='Sub Tasks') + date_deadline = fields.Date('Deadline', select=True, copy=False, required=1) + use_sub_task = fields.Boolean(string="SubTasks", related='project_id.use_sub_task') + subtask_count = fields.Integer(string='Count', compute='sub_task_found') + + @api.depends('sub_task_lines') + def sub_task_found(self): + for each in self: + each.subtask_count = len(each.sub_task_lines) + + @api.constrains('stage_id') + def restrict(self): + obj = self.env['project.sub_task.type'].search([('cancel_state', '=', True)]) + if self.stage_id.cancel_state: + for each in self.sub_task_lines: + each.write({'stage_id': obj.id}) + if self.stage_id.done_state: + for each in self.sub_task_lines: + if not each.stage_id.done_state: + raise ValidationError(_("You can't move it to final stage. Some child tasks are not completed yet.!")) + + def _check_child_task(self, cr, uid, ids, context=None): + if context == None: + context = {} + tasks = self.browse(cr, uid, ids, context=context) + for task in tasks: + if task.sub_task_lines: + for child in task.sub_task_lines: + if child.stage_id and not child.stage_id.fold: + raise Warning("Sub task still open.\nPlease cancel or complete child task first.") + else: + child.unlink() + return True + + def unlink(self, cr, uid, ids, context=None): + if context is None: + context = {} + self._check_child_task(cr, uid, ids, context=context) + res = super(TaskMaster, self).unlink(cr, uid, ids, context) + return res + + def write(self, cr, uid, ids, vals, context=None): + if vals.get('alias_model'): + model_ids = self.pool.get('ir.model').search(cr, uid, + [('model', '=', vals.get('alias_model', 'project.sub_task'))]) + vals.update(alias_model_id=model_ids[0]) + res = super(TaskMaster, self).write(cr, uid, ids, vals, context=context) + if 'active' in vals: + projects = self.browse(cr, uid, ids, context) + tasks = projects.with_context(active_test=False).mapped('sub_task_lines') + tasks.write({'active': vals['active']}) + return res + + +class ProjectTaskType(models.Model): + _inherit = 'project.task.type' + + done_state = fields.Boolean(string='Final Stage', + help='This stage is Final Stage.') + cancel_state = fields.Boolean(string='Cancel Stage', + help='This stage is Cancel Stage.') + + @api.onchange('done_state', 'cancel_state') + def set_done(self): + obj = self.env['project.task.type'].search([]) + if self.done_state is True: + for each in obj: + if each.id != self.id: + each.write({'done_state': False}) + if self.cancel_state is True: + for each in obj: + if each.id != self.id: + each.write({'cancel_state': False}) + + +class ProjectSubTaskType(models.Model): + _name = 'project.sub_task.type' + _description = 'Sub Task Stage' + _order = 'sequence' + + name = fields.Char(string='Stage Name', required=True, translate=True) + description = fields.Text(string='Description', translate=True) + sequence = fields.Integer(string='Sequence') + task_ids = fields.Many2many('project.task', string="Task Ids") + legend_priority = fields.Char(string='Priority Management Explanation', translate=True, + help='Explanation text to help users using the star and priority mechanism on stages ' + 'or issues that are in this stage.') + legend_blocked = fields.Char(string='Kanban Blocked Explanation', translate=True, + help='Override the default value displayed for the blocked state for kanban selection,' + 'when the task or issue is in that stage.') + legend_done = fields.Char(string='Kanban Valid Explanation', translate=True, + help='Override the default value displayed for the done state for kanban selection, when ' + 'the task or issue is in that stage.') + legend_normal = fields.Char(string='Kanban Ongoing Explanation', translate=True, + help='Override the default value displayed for the normal state for kanban selection, ' + 'when the task or issue is in that stage.') + fold = fields.Boolean(string='Folded in Tasks Pipeline', + help='This stage is folded in the kanban view when ' + 'there are no records in that stage to display.') + done_state = fields.Boolean(string='Final Stage', + help='This stage is Final Stage.') + cancel_state = fields.Boolean(string='Cancel Stage', + help='This stage is Cancel Stage.') + + @api.onchange('done_state', 'cancel_state') + def set_done(self): + obj = self.env['project.task.type'].search([]) + if self.done_state is True: + for each in obj: + if each.id != self.id: + each.write({'done_state': False}) + if self.cancel_state is True: + for each in obj: + if each.id != self.id: + each.write({'cancel_state': False}) + + def _get_default_task_ids(self, cr, uid, ctx=None): + if ctx is None: + ctx = {} + default_task_ids = ctx.get('default_task_ids') + return [default_task_ids] if default_task_ids else None + + _defaults = { + 'sequence': 1, + 'task_ids': _get_default_task_ids, + } + _order = 'sequence' + diff --git a/project_subtask/models/sub_task_report.py b/project_subtask/models/sub_task_report.py new file mode 100644 index 000000000..947cf517d --- /dev/null +++ b/project_subtask/models/sub_task_report.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2016-TODAY Cybrosys Technologies(). +# Author: Nilmar Shereef() +# you can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################## +from openerp.osv import fields, osv +from openerp import tools + + +class ProjectSubtaskHistory(osv.osv): + _name = "report.project.subtask.user" + _description = "Sub Tasks by user and project" + _auto = False + _columns = { + 'name': fields.char(string='Sub Task', readonly=True), + 'user_id': fields.many2one('res.users', string='Assigned To', readonly=True), + 'date_start': fields.datetime(string='Assignation Date', readonly=True), + 'no_of_days': fields.integer(string='# of Days', size=128, readonly=True), + 'date_deadline': fields.date(string='Deadline', readonly=True), + 'date_last_stage_update': fields.datetime(string='Last Stage Update', readonly=True), + 'task_id': fields.many2one('project.task', string='Task', readonly=True), + 'closing_days': fields.float(string='Days to Close', digits=(16, 2), readonly=True, group_operator="avg", + help="Number of Days to close the task"), + 'opening_days': fields.float(string='Days to Assign', digits=(16, 2), readonly=True, group_operator="avg", + help="Number of Days to Open the task"), + 'delay_endings_days': fields.float(string='Over passed Deadline', digits=(16, 2), readonly=True), + 'nbr': fields.integer(string='# of Tasks', readonly=True), # TDE FIXME master: rename into nbr_tasks + 'priority': fields.selection([('0', 'Low'), ('1', 'Normal'), ('2', 'High')], + string='Priority', size=1, readonly=True), + 'company_id': fields.many2one('res.company', string='Company', readonly=True), + 'stage_id': fields.many2one('project.sub_task.type', string='Stage'), + } + _order = 'name desc' + + def _select(self): + select_str = """ + SELECT + (select 1 ) AS nbr, + t.id as id, + t.date_start as date_start, + t.date_deadline as date_deadline, + abs((extract('epoch' from (t.write_date-t.date_start)))/(3600*24)) as no_of_days, + t.task_ref as task_id, + t.assigned_user as user_id, + t.date_last_stage_update as date_last_stage_update, + t.priority, + t.name as name, + t.company_id, + t.stage_id as stage_id, + (extract('epoch' from (t.write_date-t.create_date)))/(3600*24) as closing_days, + (extract('epoch' from (t.date_start-t.create_date)))/(3600*24) as opening_days, + (extract('epoch' from (t.date_deadline-(now() at time zone 'UTC'))))/(3600*24) as delay_endings_days + """ + return select_str + + def _group_by(self): + group_by_str = """ + GROUP BY + t.id, + create_date, + write_date, + date_start, + date_deadline, + date_last_stage_update, + t.assigned_user, + t.priority, + name, + t.company_id, + stage_id + """ + return group_by_str + + def init(self, cr): + tools.sql.drop_view_if_exists(cr, 'report_project_subtask_user') + cr.execute(""" + CREATE view report_project_subtask_user as + %s + FROM project_sub_task t + WHERE t.active = 'true' + %s + """% (self._select(), self._group_by())) \ No newline at end of file diff --git a/project_subtask/static/description/11.png b/project_subtask/static/description/11.png new file mode 100644 index 000000000..ea699db4e Binary files /dev/null and b/project_subtask/static/description/11.png differ diff --git a/project_subtask/static/description/Icon.png b/project_subtask/static/description/Icon.png new file mode 100644 index 000000000..8675cac48 Binary files /dev/null and b/project_subtask/static/description/Icon.png differ diff --git a/project_subtask/static/description/banner.jpg b/project_subtask/static/description/banner.jpg new file mode 100644 index 000000000..f2b224110 Binary files /dev/null and b/project_subtask/static/description/banner.jpg differ diff --git a/project_subtask/static/description/count.png b/project_subtask/static/description/count.png new file mode 100644 index 000000000..b65446c53 Binary files /dev/null and b/project_subtask/static/description/count.png differ diff --git a/project_subtask/static/description/index.html b/project_subtask/static/description/index.html new file mode 100644 index 000000000..bfa1548c3 --- /dev/null +++ b/project_subtask/static/description/index.html @@ -0,0 +1,164 @@ +
+
+

Sub Tasks in Project

+

This Module Enables Sub-task feature in Project Module.

+

Author : Cybrosys Techno Solutions , www.cybrosys.com

+
+
+

Features:

+
+ Sub-task Feature for Project.
+ Sub-Task Lists Under Task.
+ Sub-Task Count in Task Kanban View.
+ Sub-Task Stages in Configuration.
+ Sub-Task Analysis Under Report.
+ Deadline Validation for Sub-Task.
+ Stage Validation for Sub-Task.
+
+
+
+ +
+
+
+

Overview

+

+ Currently Odoo has no sub-task feature in project. This module brings "SUB-TASK" forms and its configuration for projects with configured stages. + User can also analyse the sub tasks under the project reporting menu dynamically. +

+
+
+
+ +
+
+

Sub Task Configuration

+
+

+

Project -> Configuration -> Sub Task Stages

+

+

+
+
+ +
+ ☛ Please tick marked fields to identify your final stage and cancel stage. +
+
+
+
+ +
+
+
+
+ +
+ ☛ If you want to create sub tasks for your project please select the option Sub Tasks. +
+
+
+
+ +
+
+

Sub Task Creation

+
+

+

You can create sub tasks via 2 ways.

+

+

+
+
+ +
+ ☛ Create sub tasks directly from Menu 'Sub Task'. +
+
+
+ +
+
+
+ +
+ ☛ Create sub tasks from task itself +
+
+ +
+
+

Sub-Task Count in Task Kanban View

+
+ +
+ ☛ You can see the count of sub task on each task's kanaban view +
+
+ +
+
+

Sub-Task Analysis

+
+ +
+
+
+ +
+
+

Stage Validation for Sub-Task

+
+ +
+ ☛ You cant move your task into final stage until all sub tasks are reach in final stage +
+
+ +
+
+

Automatically Cancel/kill the sub-task by moving parent task to 'cancel'

+
+ +
+ ☛ When you move your task into cancel stage then all sub tasks also will go to cancel stage +
+
+ +
+
+

Deadline Validation for Sub-Task

+
+ +
+
+
+ +
+

Need Any Help?

+ +
+ + + diff --git a/project_subtask/static/description/sub_task.png b/project_subtask/static/description/sub_task.png new file mode 100644 index 000000000..dab509ac2 Binary files /dev/null and b/project_subtask/static/description/sub_task.png differ diff --git a/project_subtask/static/description/task.png b/project_subtask/static/description/task.png new file mode 100644 index 000000000..e949cb5d3 Binary files /dev/null and b/project_subtask/static/description/task.png differ diff --git a/project_subtask/static/description/task2.png b/project_subtask/static/description/task2.png new file mode 100644 index 000000000..fcaddbf1d Binary files /dev/null and b/project_subtask/static/description/task2.png differ diff --git a/project_subtask/static/description/task3.png b/project_subtask/static/description/task3.png new file mode 100644 index 000000000..a03c36619 Binary files /dev/null and b/project_subtask/static/description/task3.png differ diff --git a/project_subtask/static/description/task4.png b/project_subtask/static/description/task4.png new file mode 100644 index 000000000..e01caa197 Binary files /dev/null and b/project_subtask/static/description/task4.png differ diff --git a/project_subtask/static/description/task5.png b/project_subtask/static/description/task5.png new file mode 100644 index 000000000..c1ea44868 Binary files /dev/null and b/project_subtask/static/description/task5.png differ diff --git a/project_subtask/static/description/task6.png b/project_subtask/static/description/task6.png new file mode 100644 index 000000000..eaea0251b Binary files /dev/null and b/project_subtask/static/description/task6.png differ diff --git a/project_subtask/views/project_view.xml b/project_subtask/views/project_view.xml new file mode 100644 index 000000000..c6fb46681 --- /dev/null +++ b/project_subtask/views/project_view.xml @@ -0,0 +1,20 @@ + + + + + Project Form + project.project + + + +
+ +
+
+
+
+
+
\ No newline at end of file diff --git a/project_subtask/views/sub_task.xml b/project_subtask/views/sub_task.xml new file mode 100644 index 000000000..1a9cd88a9 --- /dev/null +++ b/project_subtask/views/sub_task.xml @@ -0,0 +1,131 @@ + + + + + Sub Task form + project.sub_task + +
+
+ +
+ +
+ +
+
+

+ + +

+
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + project.sub_task.tree + project.sub_task + + + + + + + + + + + project.sub_task.kanban + project.sub_task + + + + + + + + + + + +
+
+
+
+
+ oe_kanban_text_red + +
+ +
+ +
+ +
+
+
+
+
+ + + + + + + + Sub Task Details + ir.actions.act_window + project.sub_task + form + kanban,tree,form + +

+ Click to add new Sub Task. +

+
+
+ + + \ No newline at end of file diff --git a/project_subtask/views/sub_task_report.xml b/project_subtask/views/sub_task_report.xml new file mode 100644 index 000000000..4e519eb03 --- /dev/null +++ b/project_subtask/views/sub_task_report.xml @@ -0,0 +1,26 @@ + + + + + report.project.task.user.pivot1 + report.project.subtask.user + + + + + + + + + Sub Tasks Analysis + report.project.subtask.user + form + pivot + {'group_by_no_leaf':1,'group_by':[]} + This report allows you to analyse the performance of your projects and users. You can analyse the quantities of tasks, the hours spent compared to the planned hours, the average number of days to open or close a task, etc. + + + + + + \ No newline at end of file diff --git a/project_subtask/views/sub_task_type_view.xml b/project_subtask/views/sub_task_type_view.xml new file mode 100644 index 000000000..95104578d --- /dev/null +++ b/project_subtask/views/sub_task_type_view.xml @@ -0,0 +1,84 @@ + + + + + project.sub_task.type.form + project.sub_task.type + +
+ + + + + + + + + + + + + + + +

+ At each stage employees can block or make task/issue ready for next stage. + You can define here labels that will be displayed for the state instead + of the default labels. +

+
+ +
+
+
+ + + project.sub_task.type.tree + project.sub_task.type + + + + + + + + + + + + Stages + project.sub_task.type + form + + +

+ Click to add a stage in the task pipeline. +

+ Define the steps that will be used in the project from the + creation of the task, up to the closing of the task or issue. + You will use these stages in order to track the progress in + solving a task or an issue. +

+
+
+ + +
+
\ No newline at end of file diff --git a/project_subtask/views/task_view.xml b/project_subtask/views/task_view.xml new file mode 100644 index 000000000..c08d2fe7c --- /dev/null +++ b/project_subtask/views/task_view.xml @@ -0,0 +1,61 @@ + + + + + Task Form + project.task + + + + + + + + + + + + + + + + + + + + {'invisible':[('active','=',False)]} + + + + + + project.task.kanban.inherit1 + project.task + + + + + + + +
+ +
+
+
+
+ + + Task Type Form + project.task.type + + + + + + + + +
+
\ No newline at end of file