diff --git a/cor_custom/models/analytic.py b/cor_custom/models/analytic.py index dc79a27..458a670 100755 --- a/cor_custom/models/analytic.py +++ b/cor_custom/models/analytic.py @@ -133,38 +133,46 @@ class AccountAnalyticLine(models.Model): res = super(AccountAnalyticLine, self).export_data(fields) for index, val in enumerate(res['datas']): #print("task_id", fields_name) - if fields_name.get('date') and fields_name.get('date') >= 0: + #if fields_name.get('date') and fields_name.get('date') >= 0: + if fields_name.get('date') is not None: tdateindex = fields_name.get('date') tdate = res['datas'][index][tdateindex] if tdate: res['datas'][index][tdateindex] = datetime.strftime(tdate, "%d/%m/%Y") - if fields_name.get('start_datetime') and fields_name.get('start_datetime') >= 0: + #if fields_name.get('start_datetime') and fields_name.get('start_datetime') >= 0: + if fields_name.get('start_datetime') is not None: start_datetime_index = fields_name.get('start_datetime') start_datetime = res['datas'][index][start_datetime_index] if start_datetime: res['datas'][index][start_datetime_index] = datetime.strftime(start_datetime, "%d/%m/%Y %H:%M") - if fields_name.get('end_datetime') and fields_name.get('end_datetime') >= 0: + if fields_name.get('end_datetime') is not None: end_datetime_index = fields_name.get('end_datetime') end_datetime= res['datas'][index][end_datetime_index] if end_datetime: res['datas'][index][end_datetime_index] = datetime.strftime(end_datetime, "%d/%m/%Y %H:%M") - if fields_name.get('task_id') and fields_name.get('task_id') >= 0: + if fields_name.get('task_id') is not None: taskindex = fields_name.get('task_id') ttask = res['datas'][index][taskindex] if type(ttask) == bool: res['datas'][index][taskindex] = '' - if fields_name.get('start_time') and fields_name.get('start_time') >= 0: + if fields_name.get('start_time') is not None: starttimeindex = fields_name.get('start_time') starttime = float(res['datas'][index][starttimeindex]) if starttime: start_time = tools.format_duration(starttime) res['datas'][index][starttimeindex] = start_time - if fields_name.get('end_time') and fields_name.get('end_time') >= 0: + if fields_name.get('end_time') is not None: endtimeindex = fields_name.get('end_time') endtime = float(res['datas'][index][endtimeindex]) if endtime: end_time = tools.format_duration(endtime) res['datas'][index][endtimeindex] = end_time + if fields_name.get('unit_amount') is not None: + durationindex = fields_name.get('unit_amount') + duration = res['datas'][index][durationindex] and float(res['datas'][index][durationindex]) + if duration: + duration_time = tools.format_duration(duration) + res['datas'][index][durationindex] = duration_time return res @api.model diff --git a/project_report/__manifest__.py b/project_report/__manifest__.py index 549e4b3..8cae31e 100755 --- a/project_report/__manifest__.py +++ b/project_report/__manifest__.py @@ -20,6 +20,7 @@ 'report/project_budget_hrs_analysis_views.xml', 'report/project_budget_amt_analysis_views.xml', 'report/project_timeline_report_views.xml', + 'report/project_timesheet_report_views.xml', ], 'qweb': [ "static/src/xml/base.xml", diff --git a/project_report/report/__init__.py b/project_report/report/__init__.py index 643d4d2..d635724 100755 --- a/project_report/report/__init__.py +++ b/project_report/report/__init__.py @@ -4,3 +4,4 @@ from . import project_budget_hrs_analysis from . import project_budget_amt_analysis from . import project_timeline_report +from . import project_timesheet_report diff --git a/project_report/report/project_budget_amt_analysis_views.xml b/project_report/report/project_budget_amt_analysis_views.xml index 885ccf3..5ea81f6 100755 --- a/project_report/report/project_budget_amt_analysis_views.xml +++ b/project_report/report/project_budget_amt_analysis_views.xml @@ -59,6 +59,7 @@ + @@ -78,7 +79,7 @@ project.budget.amt.report graph,tree,pivot - {'search_default_group_by_project': 1,'search_default_group_by_amount_type': 1, 'default_res_model': 'project.budget.amt.report'} + {'search_default_group_by_project': 1,'search_default_group_by_amount_type': 1, 'default_res_model': 'project.budget.amt.report', 'search_default_notfixed':1} --> - + @@ -58,6 +58,7 @@ + @@ -78,7 +79,7 @@ project.budget.hrs.report graph,tree,pivot - {'search_default_group_by_project': 1,'search_default_sdate': 1,'search_default_edate': 1,'search_default_group_by_hours_type': 1, 'default_res_model': 'project.budget.hrs.report'} + {'search_default_group_by_project': 1,'search_default_sdate': 1,'search_default_edate': 1,'search_default_group_by_hours_type': 1, 'default_res_model': 'project.budget.hrs.report','search_default_notfixed':1} + @@ -77,7 +78,7 @@ project.timeline.report graph,tree,pivot - {'search_default_group_by_project': 1,'search_default_sdate': 1,'search_default_edate': 1,'search_default_group_by_timeline_type': 1, 'default_res_model':'project.timeline.report'} + {'search_default_group_by_project': 1, 'search_default_group_by_timeline_type': 1, 'search_default_notfixed':1, 'search_default_sdate': 1,'search_default_edate': 1, 'default_res_model':'project.timeline.report'} + + + + + project.timesheet.report.tree + project.timesheet.report + + + + + + + + + + + + + + + + + project.timesheet.report.search + project.timesheet.report + + + + + + + + + + + + + + + + + + Timesheets Report + project.timesheet.report + tree + + {} + + + + + diff --git a/project_report/security/ir.model.access.csv b/project_report/security/ir.model.access.csv index f653d5a..d29c722 100755 --- a/project_report/security/ir.model.access.csv +++ b/project_report/security/ir.model.access.csv @@ -6,4 +6,6 @@ access_project_budget_hrs_report_user,project.budget.hrs.report.user,model_proje access_project_budget_amt_report_user,project.budget.amt.report.user,model_project_budget_amt_report,project.group_project_user,1,0,0,0 access_project_create_expense_user,access_project_create_expense_project_user,model_project_create_expense,project.group_project_user,1,0,0,0 access_project_timeline_report_manager,project.timeline.report,model_project_timeline_report,project.group_project_manager,1,1,1,1 -access_project_timeline_report_user,project.timeline.report,model_project_timeline_report,project.group_project_user,1,0,0,0 \ No newline at end of file +access_project_timeline_report_user,project.timeline.report,model_project_timeline_report,project.group_project_user,1,0,0,0 +access_project_timesheet_report_manager,project.timesheet.report,model_project_timesheet_report,project.group_project_manager,1,1,1,1 +access_project_timesheet_report_user,project.timesheet.report,model_project_timesheet_report,project.group_project_user,1,0,0,0 \ No newline at end of file diff --git a/project_report/static/src/js/graph_renderer.js b/project_report/static/src/js/graph_renderer.js index b363d65..4cec265 100755 --- a/project_report/static/src/js/graph_renderer.js +++ b/project_report/static/src/js/graph_renderer.js @@ -145,7 +145,14 @@ var MAX_LEGEND_LENGTH = 25 * (1 + config.device.size_class); _getDatasetLabel: function (dataPt) { if (_.contains(['bar', 'horizontalBar', 'line'], this.state.mode)) { // ([origin] + second to last groupBys) or measure - var datasetLabel = dataPt.labels.slice(1).join("/"); + //console.log("dataPt.labels", dataPt.labels, dataPt.labels.length, typeof dataPt.labels, self.resModel, this.resModel); + if ((dataPt.labels.length > 2) && (this.resModel == 'project.timeline.report' || this.resModel == 'project.budget.hrs.report')) { + var datasetLabel = dataPt.labels.slice(0).join("/"); + } + else { + var datasetLabel = dataPt.labels.slice(1).join("/"); + } + //var datasetLabel = dataPt.labels.slice(0).join("/"); if (this.state.origins.length > 1) { datasetLabel = this.state.origins[dataPt.originIndex] + (datasetLabel ? ('/' + datasetLabel) : ''); @@ -221,7 +228,8 @@ var MAX_LEGEND_LENGTH = 25 * (1 + config.device.size_class); } */ } var label_res = dataset.label; - if ((self.resModel == 'project.budget.hrs.report') || (self.resModel == 'project.timeline.report')) { + //if ((self.resModel == 'project.budget.hrs.report') || (self.resModel == 'project.timeline.report')) { + if (self.resModel == 'project.timeline.report') { var measure_value = self.fields[self.state.measure].string.split(" ").splice(-1); label_res = label_res.replace("Actual", "Actual " + measure_value).replace("Budgeted", "Budgeted " + measure_value); } @@ -292,7 +300,13 @@ var MAX_LEGEND_LENGTH = 25 * (1 + config.device.size_class); if (this.state.mode === 'bar') { label = this._relabelling(label, dataset.originIndex); if (this.state.processedGroupBy.length > 1 || this.state.origins.length > 1) { - label = label + "/" + dataset.label; + if (this.resModel == 'project.timeline.report' || this.resModel == 'project.budget.hrs.report') + { + label = dataset.label; + } + else{ + label = label + "/" + dataset.label; + } } value = this._formatValue(item.yLabel); boxColor = dataset.backgroundColor; @@ -303,7 +317,13 @@ var MAX_LEGEND_LENGTH = 25 * (1 + config.device.size_class); } else if (this.state.mode === 'horizontalBar') { label = this._relabelling(label, dataset.originIndex); if (this.state.processedGroupBy.length > 1 || this.state.origins.length > 1) { - label = label + "/" + dataset.label; + if (this.resModel == 'project.timeline.report' || this.resModel == 'project.budget.hrs.report') + { + label = dataset.label; + } + else{ + label = label + "/" + dataset.label; + } } value = this._formatValue(item.xLabel); boxColor = dataset.backgroundColor; @@ -585,7 +605,27 @@ var MAX_LEGEND_LENGTH = 25 * (1 + config.device.size_class); var data = this._prepareData(dataPoints); // this.title = 'Time Line'; - if ((self.resModel == 'project.budget.hrs.report') || (self.resModel == 'project.timeline.report')) { + if (self.resModel == 'project.budget.hrs.report') { + var groupedData = _.groupBy(data.datasets, x => x.label.replace('Actual Hours', '').replace('Budgeted Hours', '').split("/")[0]); + _.map(groupedData, (y) => { + if (y.length > 1) { + var zipped_1 = _.zip.apply(null, [y[0].data, y[1].data]); + var maxA = zipped_1.map((a) => { + if ((!!a[0] && !!a[1]) && a[0] > a[1]) { + return 'red'; + } else if ((!!a[0] && !!a[1]) && a[0] < a[1]) { + return self._getColor(0); + } + else { + return self._getColor(0); + } + }); + y[0].backgroundColor = maxA; + y[1].backgroundColor = self._getColor(1); + } + }); + } + if (self.resModel == 'project.timeline.report') { var groupedData = _.groupBy(data.datasets, x => x.label.replace('Actual', '').replace('Budgeted', '').split("/")[0]); //var groupedData = _.groupBy(data.datasets, x => x.label.replace('Actual Hours', '').replace('Budgeted Hours', '')); _.map(groupedData, (y) => { @@ -665,7 +705,14 @@ var MAX_LEGEND_LENGTH = 25 * (1 + config.device.size_class); /* if (self.state.stacked && dataset.label.includes("Actual")) { dataset.stack = 1; }*/ - if ((self.resModel == 'project.budget.hrs.report') || (self.resModel == 'project.timeline.report')) { + if (self.resModel == 'project.budget.hrs.report') { + if (dataset.label.indexOf("Actual Hours") === -1 && dataset.label.toLowerCase().indexOf("Budgeted Hours") === -1) { + //if (dataset.label.indexOf("Actual") === -1 && dataset.label.toLowerCase().indexOf("Budgeted") === -1) { + var color = self._getColor(index); + dataset.backgroundColor = color; + } + } + else if (self.resModel == 'project.timeline.report') { //if (dataset.label.indexOf("Actual Hours") === -1 && dataset.label.toLowerCase().indexOf("Budgeted Hours") === -1) { if (dataset.label.indexOf("Actual") === -1 && dataset.label.toLowerCase().indexOf("Budgeted") === -1) { var color = self._getColor(index); @@ -724,7 +771,30 @@ var MAX_LEGEND_LENGTH = 25 * (1 + config.device.size_class); //console.log("datappppppppppp", dataPoints); - if ((self.resModel == 'project.budget.hrs.report') || (self.resModel == 'project.timeline.report')) { + if (self.resModel == 'project.budget.hrs.report') { + var groupedData = _.groupBy(data.datasets, x => x.label.replace('Actual Hours', '').replace('Budgeted Hours', '').split("/")[0]); + //var groupedData = _.groupBy(data.datasets, x => x.label.replace('Actual', '').replace('Budgeted', '').split("/")[0]); + _.map(groupedData, (y) => { + if (y.length > 1) { + var zipped_1 = _.zip.apply(null, [y[0].data, y[1].data]); + var maxA = zipped_1.map((a) => { + if ((!!a[0] && !!a[1]) && a[0] > a[1]) { + return 'red'; + } else if ((!!a[0] && !!a[1]) && a[0] < a[1]) { + return self._getColor(0); + } + else { + return self._getColor(0); + } + }); + y[0].backgroundColor = maxA; + y[1].backgroundColor = self._getColor(1); + //var zipped_2 = _.zip.apply(null, [y[1].data, y[0].data]); + } + }); + } + + if (self.resModel == 'project.timeline.report') { //var groupedData = _.groupBy(data.datasets, x => x.label.replace('Actual Hours', '').replace('Budgeted Hours', '').split("/")[0]); var groupedData = _.groupBy(data.datasets, x => x.label.replace('Actual', '').replace('Budgeted', '').split("/")[0]); _.map(groupedData, (y) => { @@ -742,7 +812,7 @@ var MAX_LEGEND_LENGTH = 25 * (1 + config.device.size_class); }); y[0].backgroundColor = maxA; y[1].backgroundColor = self._getColor(1); - var zipped_2 = _.zip.apply(null, [y[1].data, y[0].data]); + //var zipped_2 = _.zip.apply(null, [y[1].data, y[0].data]); } }); } @@ -797,7 +867,13 @@ var MAX_LEGEND_LENGTH = 25 * (1 + config.device.size_class); /*if (self.state.stacked && dataset.label.includes("Actual")) { dataset.stack = 1; }*/ - if ((self.resModel == 'project.budget.hrs.report') || (self.resModel == 'project.timeline.report')) { + if (self.resModel == 'project.budget.hrs.report') { + if (dataset.label.indexOf("Actual Hours") === -1 && dataset.label.toLowerCase().indexOf("Budgeted Hours") === -1) { + var color = self._getColor(index); + dataset.backgroundColor = color; + } + } + else if (self.resModel == 'project.timeline.report') { if (dataset.label.indexOf("Actual") === -1 && dataset.label.toLowerCase().indexOf("Budgeted") === -1) { var color = self._getColor(index); dataset.backgroundColor = color;