From 35277fd0b17d8edc85dd3e85fe49ce7daceb1454 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 28 Sep 2012 14:45:38 +0200 Subject: [PATCH 01/30] Added first setup bzr revid: nicolas.vanhoren@openerp.com-20120928124538-mwndrk3n5i7tjl7a --- addons/hr_timesheet_sheet/__openerp__.py | 3 +++ .../hr_timesheet_sheet/hr_timesheet_sheet_view.xml | 5 +++++ .../hr_timesheet_sheet/static/src/css/timesheet.css | 0 .../hr_timesheet_sheet/static/src/js/timesheet.js | 13 +++++++++++++ .../hr_timesheet_sheet/static/src/xml/timesheet.xml | 9 +++++++++ 5 files changed, 30 insertions(+) create mode 100644 addons/hr_timesheet_sheet/static/src/css/timesheet.css create mode 100644 addons/hr_timesheet_sheet/static/src/js/timesheet.js create mode 100644 addons/hr_timesheet_sheet/static/src/xml/timesheet.xml diff --git a/addons/hr_timesheet_sheet/__openerp__.py b/addons/hr_timesheet_sheet/__openerp__.py index fbe4bc85503..f02365c7645 100644 --- a/addons/hr_timesheet_sheet/__openerp__.py +++ b/addons/hr_timesheet_sheet/__openerp__.py @@ -66,5 +66,8 @@ The validation can be configured in the company: 'auto_install': False, 'certificate': '0073297700829', 'application': True, + 'js': ['static/src/js/timesheet.js',], + 'css': ['static/src/css/timesheet.css',], + 'qweb': ['static/src/xml/timesheet.xml',], } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml index 6c92e28564e..86362752844 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml @@ -71,6 +71,11 @@ + + + This is a test. + +
diff --git a/addons/hr_timesheet_sheet/static/src/css/timesheet.css b/addons/hr_timesheet_sheet/static/src/css/timesheet.css new file mode 100644 index 00000000000..e69de29bb2d diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js new file mode 100644 index 00000000000..243d8b1b30c --- /dev/null +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -0,0 +1,13 @@ + +openerp.hr_timesheet_sheet = function(instance) { + var QWeb = instance.web.qweb; + var _t = instance.web._t; + + instance.hr_timesheet_sheet.WeeklyTimesheet = instance.web.form.FormWidget.extend({ + template: "hr_timesheet_sheet.WeeklyTimesheet", + + }); + + instance.web.form.custom_widgets.add('weekly_timesheet', 'instance.hr_timesheet_sheet.WeeklyTimesheet'); + +}; diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml new file mode 100644 index 00000000000..2f4063aed01 --- /dev/null +++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml @@ -0,0 +1,9 @@ + + + + +
+ Yoh! +
+
+
\ No newline at end of file From 27ce5af1867ac3a8cbd3332a85e757a36749f9e8 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 28 Sep 2012 16:34:03 +0200 Subject: [PATCH 02/30] Synchronize with the o2m bzr revid: nicolas.vanhoren@openerp.com-20120928143403-feje9sa10bqeo56r --- .../static/src/js/timesheet.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 243d8b1b30c..2f7f6a030c5 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -5,7 +5,37 @@ openerp.hr_timesheet_sheet = function(instance) { instance.hr_timesheet_sheet.WeeklyTimesheet = instance.web.form.FormWidget.extend({ template: "hr_timesheet_sheet.WeeklyTimesheet", + init: function() { + this._super.apply(this, arguments); + this.set({sheets: []}); + this.field_manager.on("field_changed:timesheet_ids", this, this.query_sheets); + this.on("change:sheets", this, this.update_sheets); + this.res_o2m_drop = new instance.web.DropMisordered(); + }, + query_sheets: function() { + var self = this; + if (self.updating) + return; + var commands = this.field_manager.get_field_value("timesheet_ids"); + this.res_o2m_drop.add(new instance.web.Model(this.view.model).call("resolve_2many_commands", ["timesheet_ids", commands, []])) + .then(function(result) { + self.querying = true; + self.set({sheets: result}); + self.querying = false; + }); + }, + update_sheets: function() { + var self = this; + if (self.querying) + return; + self.updating = true; + self.field_manager.set_values({timesheet_ids: self.get("sheets")}).then(function() { + self.updating = false; + }); + }, + start: function() { + }, }); instance.web.form.custom_widgets.add('weekly_timesheet', 'instance.hr_timesheet_sheet.WeeklyTimesheet'); From 8ed3be8a1b9a217a4da49a937abd3d6f4d5f7f3e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 28 Sep 2012 17:08:15 +0200 Subject: [PATCH 03/30] wip bzr revid: nicolas.vanhoren@openerp.com-20120928150815-1lm5bezg4uhj0stk --- .../static/src/js/timesheet.js | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 2f7f6a030c5..f16386fd6c3 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -7,8 +7,18 @@ openerp.hr_timesheet_sheet = function(instance) { template: "hr_timesheet_sheet.WeeklyTimesheet", init: function() { this._super.apply(this, arguments); - this.set({sheets: []}); + this.set({ + sheets: [], + date_to: false, + date_from: false, + }); this.field_manager.on("field_changed:timesheet_ids", this, this.query_sheets); + this.field_manager.on("field_changed:date_from", this, function() { + this.set({"date_from": instance.web.str_to_date(this.field_manager.get_field_value("date_from"))}); + }); + this.field_manager.on("field_changed:date_to", this, function() { + this.set({"date_to": instance.web.str_to_date(this.field_manager.get_field_value("date_to"))}); + }); this.on("change:sheets", this, this.update_sheets); this.res_o2m_drop = new instance.web.DropMisordered(); }, @@ -34,7 +44,24 @@ openerp.hr_timesheet_sheet = function(instance) { }); }, start: function() { - + this.on("change:sheets", this, this.render); + this.on("change:date_to", this, this.render); + this.on("change:date_from", this, this.render); + this.render(); + }, + render: function() { + var self = this; + if (self.setting) + return; + // don't render anything until we have date_to and date_from + if (!self.get("date_to") || !self.get("date_from")) + return; + // group by account + var accounts = _.groupBy(this.get("sheets"), function(el) { return !!el.account_id ? el.account_id[0] : false }); + // group by days + accounts = _.map(accounts, function(el) { + //var tmp = _.groupBy(el + }); }, }); From ec78cf2ca545cf607d85f28cbbca781091111419 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 28 Sep 2012 18:38:11 +0200 Subject: [PATCH 04/30] bunch of stuff to handle things bzr revid: nicolas.vanhoren@openerp.com-20120928163811-u1p5wabdfk5b3jqu --- .../static/src/js/timesheet.js | 46 ++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index f16386fd6c3..5fc90b513af 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -4,7 +4,6 @@ openerp.hr_timesheet_sheet = function(instance) { var _t = instance.web._t; instance.hr_timesheet_sheet.WeeklyTimesheet = instance.web.form.FormWidget.extend({ - template: "hr_timesheet_sheet.WeeklyTimesheet", init: function() { this._super.apply(this, arguments); this.set({ @@ -21,6 +20,7 @@ openerp.hr_timesheet_sheet = function(instance) { }); this.on("change:sheets", this, this.update_sheets); this.res_o2m_drop = new instance.web.DropMisordered(); + this.description_line = _t("No description"); }, query_sheets: function() { var self = this; @@ -56,12 +56,46 @@ openerp.hr_timesheet_sheet = function(instance) { // don't render anything until we have date_to and date_from if (!self.get("date_to") || !self.get("date_from")) return; + // calculating dates + self.dates = []; + var start = self.get("date_from"); + var end = self.get("date_to"); + while (start <= end) { + self.dates.push(start); + start = start.clone().addDays(1); + } // group by account - var accounts = _.groupBy(this.get("sheets"), function(el) { return !!el.account_id ? el.account_id[0] : false }); - // group by days - accounts = _.map(accounts, function(el) { - //var tmp = _.groupBy(el - }); + self.accounts = _(this.get("sheets")).chain().map(function(el) { + // much simpler to use only the id in all cases + if (typeof(el.account_id) === "object") + el.account_id = el.account_id[0]; + }).groupBy("account_id") + .map(function(lines, account_id) { + // group by days + account_id = account_id === "false" ? false : Number(account_id); + var index = _.groupBy(lines, "date"); + var days = _.map(self.dates, function(date) { + var day = {day: date, lines: index[instance.web.date_to_str(date)] || []}; + var to_add = _.find(day.lines, function(line) { return line.name === self.description_line }); + if (to_add) { + day.lines = _.without(to_add); + day.lines.unshift(to_add); + } else { + day.lines.unshift({ + name: self.description_line, + unit_amount: 0, + date: instance.web.date_to_str(date), + account_id: k === "false" ? false : Number(account_id), + }); + } + }); + return {account: account_id, days: days}; + }).sortBy(function(account) { + return account.account; + }).value(); + + debugger; + //TODO: handle the account_id name_get problem ! }, }); From ac84e4800a4ebcc012cd8012f2b52491a6032333 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 1 Oct 2012 13:09:48 +0200 Subject: [PATCH 05/30] now renders something bzr revid: nicolas.vanhoren@openerp.com-20121001110948-qu7f3ancrfa73rxw --- .../static/src/js/timesheet.js | 36 ++++++++++++++++--- .../static/src/xml/timesheet.xml | 22 ++++++++++-- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 5fc90b513af..0d459e33abf 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -20,6 +20,7 @@ openerp.hr_timesheet_sheet = function(instance) { }); this.on("change:sheets", this, this.update_sheets); this.res_o2m_drop = new instance.web.DropMisordered(); + this.render_drop = new instance.web.DropMisordered(); this.description_line = _t("No description"); }, query_sheets: function() { @@ -65,17 +66,21 @@ openerp.hr_timesheet_sheet = function(instance) { start = start.clone().addDays(1); } // group by account - self.accounts = _(this.get("sheets")).chain().map(function(el) { + self.accounts = _(this.get("sheets")).chain() + .map(function(el) { // much simpler to use only the id in all cases if (typeof(el.account_id) === "object") el.account_id = el.account_id[0]; - }).groupBy("account_id") + return el; + }) + .groupBy("account_id") .map(function(lines, account_id) { // group by days account_id = account_id === "false" ? false : Number(account_id); var index = _.groupBy(lines, "date"); var days = _.map(self.dates, function(date) { var day = {day: date, lines: index[instance.web.date_to_str(date)] || []}; + // add line where we will insert/remove hours var to_add = _.find(day.lines, function(line) { return line.name === self.description_line }); if (to_add) { day.lines = _.without(to_add); @@ -85,17 +90,38 @@ openerp.hr_timesheet_sheet = function(instance) { name: self.description_line, unit_amount: 0, date: instance.web.date_to_str(date), - account_id: k === "false" ? false : Number(account_id), + account_id: account_id, }); } + return day; }); return {account: account_id, days: days}; }).sortBy(function(account) { return account.account; }).value(); - debugger; - //TODO: handle the account_id name_get problem ! + // we need the name_get of the analytic accounts + return this.res_o2m_drop.add(new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(self.accounts, "account")]) + .pipe(function(result) { + self.account_names = {}; + _.each(result, function(el) { + self.account_names[el[0]] = el[1]; + }); + //real rendering + self.$el.html(QWeb.render("hr_timesheet_sheet.WeeklyTimesheet", {widget: self})); + _.each(self.accounts, function(account) { + var total = 0; + _.each(_.range(account.days.length), function(day_count) { + var line_total = 0; + _.each(account.days[day_count].lines, function(line) { + line_total += line.unit_amount; + }); + self.$('[data-account="' + account.account + '"][data-day-count="' + day_count + '"]').val(line_total); + total += line_total; + }); + self.$('[data-account-total="' + account.account + '"]').html(total); + }); + })); }, }); diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml index 2f4063aed01..cb633543cec 100644 --- a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml +++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml @@ -2,8 +2,26 @@ -
- Yoh! +
+ + + + + + + + + + + + +
+
+ +
Total
+ + +
\ No newline at end of file From 476b3e6a311311972c6240e82f5f3ec6b87454e5 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 1 Oct 2012 16:26:49 +0200 Subject: [PATCH 06/30] fixed race condition bzr revid: nicolas.vanhoren@openerp.com-20121001142649-hdq5nj16j1w5iy6c --- addons/hr_timesheet_sheet/static/src/js/timesheet.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 0d459e33abf..25a02f78b69 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -101,7 +101,7 @@ openerp.hr_timesheet_sheet = function(instance) { }).value(); // we need the name_get of the analytic accounts - return this.res_o2m_drop.add(new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(self.accounts, "account")]) + this.render_drop.add(new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(self.accounts, "account")])) .pipe(function(result) { self.account_names = {}; _.each(result, function(el) { @@ -121,7 +121,7 @@ openerp.hr_timesheet_sheet = function(instance) { }); self.$('[data-account-total="' + account.account + '"]').html(total); }); - })); + }); }, }); From 54419853999d7c6d8a4c573734270f85f37ee6e8 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 1 Oct 2012 16:47:50 +0200 Subject: [PATCH 07/30] added update of values bzr revid: nicolas.vanhoren@openerp.com-20121001144750-esdtzaqil3n18dty --- .../static/src/js/timesheet.js | 50 +++++++++++++++---- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 25a02f78b69..125cea17c8f 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -108,20 +108,48 @@ openerp.hr_timesheet_sheet = function(instance) { self.account_names[el[0]] = el[1]; }); //real rendering - self.$el.html(QWeb.render("hr_timesheet_sheet.WeeklyTimesheet", {widget: self})); - _.each(self.accounts, function(account) { - var total = 0; - _.each(_.range(account.days.length), function(day_count) { - var line_total = 0; - _.each(account.days[day_count].lines, function(line) { - line_total += line.unit_amount; - }); - self.$('[data-account="' + account.account + '"][data-day-count="' + day_count + '"]').val(line_total); - total += line_total; + self.display_data(); + }); + }, + display_data: function() { + var self = this; + self.$el.html(QWeb.render("hr_timesheet_sheet.WeeklyTimesheet", {widget: self})); + _.each(self.accounts, function(account) { + _.each(_.range(account.days.length), function(day_count) { + self.get_case(account, day_count).val(self.sum_case(account, day_count)).change(function() { + var num = Number($(this).val()); + if (isNaN(num)) { + $(this).val(self.sum_case(account, day_count)); + } else { + account.days[day_count].lines[0].unit_amount += num - self.sum_case(account, day_count); + self.get_total(account).html(self.sum_total(account)); + } }); - self.$('[data-account-total="' + account.account + '"]').html(total); + }); + self.get_total(account).html(self.sum_total(account)); + }); + }, + get_case: function(account, day_count) { + return this.$('[data-account="' + account.account + '"][data-day-count="' + day_count + '"]'); + }, + get_total: function(account) { + return this.$('[data-account-total="' + account.account + '"]'); + }, + sum_case: function(account, day_count) { + var line_total = 0; + _.each(account.days[day_count].lines, function(line) { + line_total += line.unit_amount; + }); + return line_total; + }, + sum_total: function(account) { + var total = 0; + _.each(account.days, function(day) { + _.each(day.lines, function(line) { + total += line.unit_amount; }); }); + return total; }, }); From 7234ef203cf0283939f86175509acf27c3fbc898 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 1 Oct 2012 16:55:16 +0200 Subject: [PATCH 08/30] Added sync with o2m bzr revid: nicolas.vanhoren@openerp.com-20121001145516-x2bidvidn0fswi4u --- .../static/src/js/timesheet.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 125cea17c8f..1cde7a80a90 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -123,6 +123,7 @@ openerp.hr_timesheet_sheet = function(instance) { } else { account.days[day_count].lines[0].unit_amount += num - self.sum_case(account, day_count); self.get_total(account).html(self.sum_total(account)); + self.sync(); } }); }); @@ -151,6 +152,24 @@ openerp.hr_timesheet_sheet = function(instance) { }); return total; }, + sync: function() { + var self = this; + var lst = []; + _.each(self.accounts, function(account) { + _.each(account.days, function(day) { + _.each(day.lines, function(line) { + if (line.unit_amount != 0) { + var tmp = _.clone(line); + line.id = undefined; + lst.push(tmp); + } + }); + }); + }); + self.setting = true; + self.set({sheets: lst}); + self.setting = false; + }, }); instance.web.form.custom_widgets.add('weekly_timesheet', 'instance.hr_timesheet_sheet.WeeklyTimesheet'); From 9d8ea41d450f738afe77c47b1f86c212e3132e33 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 1 Oct 2012 17:19:17 +0200 Subject: [PATCH 09/30] wip bzr revid: nicolas.vanhoren@openerp.com-20121001151917-o095dj2m8aypm3da --- addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml | 1 - addons/hr_timesheet_sheet/static/src/js/timesheet.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml index 6ff3e5c43e0..78fc997d15e 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml @@ -73,7 +73,6 @@ - This is a test. diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 1cde7a80a90..9b186443217 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -21,7 +21,7 @@ openerp.hr_timesheet_sheet = function(instance) { this.on("change:sheets", this, this.update_sheets); this.res_o2m_drop = new instance.web.DropMisordered(); this.render_drop = new instance.web.DropMisordered(); - this.description_line = _t("No description"); + this.description_line = _t("/"); }, query_sheets: function() { var self = this; From 7c1339928b1e69a17e84c66bd366144dec6fed8e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 1 Oct 2012 17:46:05 +0200 Subject: [PATCH 10/30] Removed day by day bzr revid: nicolas.vanhoren@openerp.com-20121001154605-nemay3pze49ejjld --- .../hr_timesheet_sheet/hr_timesheet_sheet.py | 157 +----------------- .../hr_timesheet_sheet_view.xml | 17 +- 2 files changed, 8 insertions(+), 166 deletions(-) diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index 13c11cf72c7..1c29a4e736f 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -27,80 +27,6 @@ from osv import fields, osv from tools.translate import _ import netsvc -class one2many_mod2(fields.one2many): - def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None): - if context is None: - context = {} - - if values is None: - values = {} - - # res6 = {id: date_current, ...} - res6 = dict([(rec['id'], rec['date_current']) - for rec in obj.read(cr, user, ids, ['date_current'], context=context)]) - - dom = [] - for c, id in enumerate(ids): - if id in res6: - if c: # skip first - dom.insert(0 ,'|') - dom.append('&') - dom.append('&') - dom.append(('name', '>=', res6[id])) - dom.append(('name', '<=', res6[id])) - dom.append(('sheet_id', '=', id)) - - ids2 = obj.pool.get(self._obj).search(cr, user, dom, limit=self._limit) - - res = {} - for i in ids: - res[i] = [] - - for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_read'): - if r[self._fields_id]: - res[r[self._fields_id][0]].append(r['id']) - return res - - def set(self, cr, obj, id, field, values, user=None, context=None): - if context is None: - context = {} - - context = context.copy() - context['sheet_id'] = id - return super(one2many_mod2, self).set(cr, obj, id, field, values, user=user, context=context) - - -class one2many_mod(fields.one2many): - def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None): - if context is None: - context = {} - - if values is None: - values = {} - - - res5 = obj.read(cr, user, ids, ['date_current'], context=context) - res6 = {} - for r in res5: - res6[r['id']] = r['date_current'] - - ids2 = [] - for id in ids: - dom = [] - if id in res6: - dom = [('date', '=', res6[id]), ('sheet_id', '=', id)] - ids2.extend(obj.pool.get(self._obj).search(cr, user, - dom, limit=self._limit)) - res = {} - for i in ids: - res[i] = [] - for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, - [self._fields_id], context=context, load='_classic_read'): - if r[self._fields_id]: - res[r[self._fields_id][0]].append(r['id']) - - return res - class hr_timesheet_sheet(osv.osv): _name = "hr_timesheet_sheet.sheet" _inherit = "mail.thread" @@ -111,8 +37,7 @@ class hr_timesheet_sheet(osv.osv): def _total_attendances(self, cr, uid, ids, name, args, context=None): """ Get the total attendance for the timesheets Returns a dict like : - {id: {'date_current': '2011-06-17', - 'total_per_day': {day: timedelta, ...}, + {id: {'total_per_day': {day: timedelta, ...}, }, ... } @@ -122,7 +47,6 @@ class hr_timesheet_sheet(osv.osv): res = {} for sheet_id in ids: sheet = self.browse(cr, uid, sheet_id, context=context) - date_current = sheet.date_current # field attendances_ids of hr_timesheet_sheet.sheet only # returns attendances of timesheet's current date attendance_ids = attendance_obj.search(cr, uid, [('sheet_id', '=', sheet_id)], context=context) @@ -143,20 +67,7 @@ class hr_timesheet_sheet(osv.osv): else: total_attendance[day] += attendance_interval - # if the delta is negative, it means that a sign out is missing - # in a such case, we want to have the time to the end of the day - # for a past date, and the time to now for the current date - if total_attendance[day] < timedelta(0): - if day == date_current: - now = datetime.now() - total_attendance[day] += timedelta(hours=now.hour, - minutes=now.minute, - seconds=now.second) - else: - total_attendance[day] += timedelta(days=1) - - res[sheet_id] = {'date_current': date_current, - 'total_per_day': total_attendance} + res[sheet_id] = {'total_per_day': total_attendance} return res def _total_timesheet(self, cr, uid, ids, name, args, context=None): @@ -210,24 +121,16 @@ class hr_timesheet_sheet(osv.osv): all_attendances_sheet = all_timesheet_attendances[id] - date_current = all_attendances_sheet['date_current'] total_attendances_sheet = all_attendances_sheet['total_per_day'] total_attendances_all_days = sum_all_days(total_attendances_sheet) - total_attendances_day = total_attendances_sheet.get(date_current, timedelta(seconds=0)) total_timesheets_sheet = all_timesheet_lines[id] total_timesheets_all_days = sum_all_days(total_timesheets_sheet) - total_timesheets_day = total_timesheets_sheet.get(date_current, timedelta(seconds=0)) total_difference_all_days = total_attendances_all_days - total_timesheets_all_days - total_difference_day = total_attendances_day - total_timesheets_day res[id]['total_attendance'] = timedelta_to_hours(total_attendances_all_days) res[id]['total_timesheet'] = timedelta_to_hours(total_timesheets_all_days) res[id]['total_difference'] = timedelta_to_hours(total_difference_all_days) - - res[id]['total_attendance_day'] = timedelta_to_hours(total_attendances_day) - res[id]['total_timesheet_day'] = timedelta_to_hours(total_timesheets_day) - res[id]['total_difference_day'] = timedelta_to_hours(total_difference_day) return res def check_employee_attendance_state(self, cr, uid, sheet_id, context=None): @@ -277,44 +180,6 @@ class hr_timesheet_sheet(osv.osv): raise osv.except_osv(_('Warning!'), _('Please verify that the total difference of the sheet is lower than %.2f.') %(di,)) return True - def date_today(self, cr, uid, ids, context=None): - for sheet in self.browse(cr, uid, ids, context=context): - if datetime.today() <= datetime.strptime(sheet.date_from, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context) - elif datetime.now() >= datetime.strptime(sheet.date_to, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context) - else: - self.write(cr, uid, [sheet.id], {'date_current': time.strftime('%Y-%m-%d')}, context=context) - return True - - def date_previous(self, cr, uid, ids, context=None): - for sheet in self.browse(cr, uid, ids, context=context): - if datetime.strptime(sheet.date_current, '%Y-%m-%d') <= datetime.strptime(sheet.date_from, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context) - else: - self.write(cr, uid, [sheet.id], { - 'date_current': (datetime.strptime(sheet.date_current, '%Y-%m-%d') + relativedelta(days=-1)).strftime('%Y-%m-%d'), - }, context=context) - return True - - def date_next(self, cr, uid, ids, context=None): - for sheet in self.browse(cr, uid, ids, context=context): - if datetime.strptime(sheet.date_current, '%Y-%m-%d') >= datetime.strptime(sheet.date_to, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context) - else: - self.write(cr, uid, [sheet.id], { - 'date_current': (datetime.strptime(sheet.date_current, '%Y-%m-%d') + relativedelta(days=1)).strftime('%Y-%m-%d'), - }, context=context) - return True - - def button_dummy(self, cr, uid, ids, context=None): - for sheet in self.browse(cr, uid, ids, context=context): - if datetime.strptime(sheet.date_current, '%Y-%m-%d') <= datetime.strptime(sheet.date_from, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context) - elif datetime.strptime(sheet.date_current, '%Y-%m-%d') >= datetime.strptime(sheet.date_to, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context) - return True - def attendance_action_change(self, cr, uid, ids, context=None): hr_employee = self.pool.get('hr.employee') employee_ids = [] @@ -329,14 +194,13 @@ class hr_timesheet_sheet(osv.osv): 'user_id': fields.related('employee_id', 'user_id', type="many2one", relation="res.users", store=True, string="User", required=False, readonly=True),#fields.many2one('res.users', 'User', required=True, select=1, states={'confirm':[('readonly', True)], 'done':[('readonly', True)]}), 'date_from': fields.date('Date from', required=True, select=1, readonly=True, states={'new':[('readonly', False)]}), 'date_to': fields.date('Date to', required=True, select=1, readonly=True, states={'new':[('readonly', False)]}), - 'date_current': fields.date('Current date', required=True, select=1), - 'timesheet_ids' : one2many_mod('hr.analytic.timesheet', 'sheet_id', - 'Timesheet lines', domain=[('date', '=', time.strftime('%Y-%m-%d'))], + 'timesheet_ids' : fields.one2many('hr.analytic.timesheet', 'sheet_id', + 'Timesheet lines', readonly=True, states={ 'draft': [('readonly', False)], 'new': [('readonly', False)]} ), - 'attendances_ids' : one2many_mod2('hr.attendance', 'sheet_id', 'Attendances'), + 'attendances_ids' : fields.one2many('hr.attendance', 'sheet_id', 'Attendances'), 'state' : fields.selection([ ('new', 'New'), ('draft','Open'), @@ -346,9 +210,6 @@ class hr_timesheet_sheet(osv.osv): \n* The \'Confirmed\' state is used for to confirm the timesheet by user. \ \n* The \'Done\' state is used when users timesheet is accepted by his/her senior.'), 'state_attendance' : fields.related('employee_id', 'state', type='selection', selection=[('absent', 'Absent'), ('present', 'Present')], string='Current Status', readonly=True), - 'total_attendance_day': fields.function(_total, method=True, string='Total Attendance', multi="_total"), - 'total_timesheet_day': fields.function(_total, method=True, string='Total Timesheet', multi="_total"), - 'total_difference_day': fields.function(_total, method=True, string='Difference', multi="_total"), 'total_attendance': fields.function(_total, method=True, string='Total Attendance', multi="_total"), 'total_timesheet': fields.function(_total, method=True, string='Total Timesheet', multi="_total"), 'total_difference': fields.function(_total, method=True, string='Difference', multi="_total"), @@ -386,7 +247,6 @@ class hr_timesheet_sheet(osv.osv): _defaults = { 'date_from' : _default_date_from, - 'date_current' : lambda *a: time.strftime('%Y-%m-%d'), 'date_to' : _default_date_to, 'state': 'new', 'employee_id': _default_employee, @@ -406,16 +266,9 @@ class hr_timesheet_sheet(osv.osv): return False return True - def _date_current_check(self, cr, uid, ids, context=None): - for sheet in self.browse(cr, uid, ids, context=context): - if sheet.date_current < sheet.date_from or sheet.date_current > sheet.date_to: - return False - return True - _constraints = [ (_sheet_date, 'You cannot have 2 timesheets that overlaps !\nPlease use the menu \'My Current Timesheet\' to avoid this problem.', ['date_from','date_to']), - (_date_current_check, 'You must select a Current date which is in the timesheet dates !', ['date_current']), ] def action_set_to_draft(self, cr, uid, ids, *args): diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml index 78fc997d15e..7dd2b9a1b88 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml @@ -76,19 +76,8 @@ - -
-
-
-
-
- + @@ -105,9 +94,9 @@ - + - + From d5c13c1bb2071bdab6cc1ed96d36bb9b4a2e5ed4 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 11:58:15 +0200 Subject: [PATCH 11/30] added default_get bzr revid: nicolas.vanhoren@openerp.com-20121002095815-llip0jl1j4hno9gg --- .../static/src/js/timesheet.js | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 9b186443217..cef325d93a7 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -28,7 +28,8 @@ openerp.hr_timesheet_sheet = function(instance) { if (self.updating) return; var commands = this.field_manager.get_field_value("timesheet_ids"); - this.res_o2m_drop.add(new instance.web.Model(this.view.model).call("resolve_2many_commands", ["timesheet_ids", commands, []])) + this.res_o2m_drop.add(new instance.web.Model(this.view.model).call("resolve_2many_commands", ["timesheet_ids", commands, [], + new instance.web.CompoundContext()])) .then(function(result) { self.querying = true; self.set({sheets: result}); @@ -45,10 +46,14 @@ openerp.hr_timesheet_sheet = function(instance) { }); }, start: function() { - this.on("change:sheets", this, this.render); - this.on("change:date_to", this, this.render); - this.on("change:date_from", this, this.render); - this.render(); + var self = this; + return new instance.web.Model("hr.analytic.timesheet").call("default_get", [[], new instance.web.CompoundContext()]).pipe(function(result) { + self.default_get = result; + self.on("change:sheets", self, self.render); + self.on("change:date_to", self, self.render); + self.on("change:date_from", self, self.render); + self.render(); + }); }, render: function() { var self = this; @@ -86,12 +91,12 @@ openerp.hr_timesheet_sheet = function(instance) { day.lines = _.without(to_add); day.lines.unshift(to_add); } else { - day.lines.unshift({ + day.lines.unshift(_.extend(_.clone(self.default_get), { name: self.description_line, unit_amount: 0, date: instance.web.date_to_str(date), account_id: account_id, - }); + })); } return day; }); @@ -101,7 +106,8 @@ openerp.hr_timesheet_sheet = function(instance) { }).value(); // we need the name_get of the analytic accounts - this.render_drop.add(new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(self.accounts, "account")])) + this.render_drop.add(new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(self.accounts, "account"), + new instance.web.CompoundContext()])) .pipe(function(result) { self.account_names = {}; _.each(result, function(el) { @@ -158,9 +164,9 @@ openerp.hr_timesheet_sheet = function(instance) { _.each(self.accounts, function(account) { _.each(account.days, function(day) { _.each(day.lines, function(line) { - if (line.unit_amount != 0) { + if (line.unit_amount !== 0) { var tmp = _.clone(line); - line.id = undefined; + //line.id = undefined; lst.push(tmp); } }); From 822f6bbe7b315be378df1751e56e6b25304bb3a8 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 13:15:37 +0200 Subject: [PATCH 12/30] Made if really work bzr revid: nicolas.vanhoren@openerp.com-20121002111537-6ksjtqt5k0b6jcq4 --- .../static/src/js/timesheet.js | 142 ++++++++++-------- 1 file changed, 81 insertions(+), 61 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index cef325d93a7..1077fa5e6a3 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -18,6 +18,9 @@ openerp.hr_timesheet_sheet = function(instance) { this.field_manager.on("field_changed:date_to", this, function() { this.set({"date_to": instance.web.str_to_date(this.field_manager.get_field_value("date_to"))}); }); + this.field_manager.on("field_changed:user_id", this, function() { + this.set({"user_id": this.field_manager.get_field_value("user_id")}); + }); this.on("change:sheets", this, this.update_sheets); this.res_o2m_drop = new instance.web.DropMisordered(); this.render_drop = new instance.web.DropMisordered(); @@ -47,13 +50,11 @@ openerp.hr_timesheet_sheet = function(instance) { }, start: function() { var self = this; - return new instance.web.Model("hr.analytic.timesheet").call("default_get", [[], new instance.web.CompoundContext()]).pipe(function(result) { - self.default_get = result; - self.on("change:sheets", self, self.render); - self.on("change:date_to", self, self.render); - self.on("change:date_from", self, self.render); - self.render(); - }); + self.on("change:sheets", self, self.render); + self.on("change:date_to", self, self.render); + self.on("change:date_from", self, self.render); + self.on("change:user_id", self, self.render); + self.render(); }, render: function() { var self = this; @@ -62,57 +63,71 @@ openerp.hr_timesheet_sheet = function(instance) { // don't render anything until we have date_to and date_from if (!self.get("date_to") || !self.get("date_from")) return; - // calculating dates - self.dates = []; - var start = self.get("date_from"); - var end = self.get("date_to"); - while (start <= end) { - self.dates.push(start); - start = start.clone().addDays(1); - } - // group by account - self.accounts = _(this.get("sheets")).chain() - .map(function(el) { - // much simpler to use only the id in all cases - if (typeof(el.account_id) === "object") - el.account_id = el.account_id[0]; - return el; - }) - .groupBy("account_id") - .map(function(lines, account_id) { - // group by days - account_id = account_id === "false" ? false : Number(account_id); - var index = _.groupBy(lines, "date"); - var days = _.map(self.dates, function(date) { - var day = {day: date, lines: index[instance.web.date_to_str(date)] || []}; - // add line where we will insert/remove hours - var to_add = _.find(day.lines, function(line) { return line.name === self.description_line }); - if (to_add) { - day.lines = _.without(to_add); - day.lines.unshift(to_add); - } else { - day.lines.unshift(_.extend(_.clone(self.default_get), { - name: self.description_line, - unit_amount: 0, - date: instance.web.date_to_str(date), - account_id: account_id, - })); - } - return day; - }); - return {account: account_id, days: days}; - }).sortBy(function(account) { - return account.account; - }).value(); - // we need the name_get of the analytic accounts - this.render_drop.add(new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(self.accounts, "account"), - new instance.web.CompoundContext()])) - .pipe(function(result) { - self.account_names = {}; - _.each(result, function(el) { - self.account_names[el[0]] = el[1]; - }); + // it's important to use those vars to avoid race conditions + var dates; + var accounts; + var account_names; + return this.render_drop.add(new instance.web.Model("hr.analytic.timesheet").call("default_get", [ + ['account_id','general_account_id', 'journal_id','date','name','user_id','product_id','product_uom_id','to_invoice','amount','unit_amount'], + new instance.web.CompoundContext({'user_id': self.get('user_id')})]).pipe(function(result) { + var default_get = result; + // calculating dates + dates = []; + var start = self.get("date_from"); + var end = self.get("date_to"); + while (start <= end) { + dates.push(start); + start = start.clone().addDays(1); + } + // group by account + accounts = _(self.get("sheets")).chain() + .map(function(el) { + // much simpler to use only the id in all cases + if (typeof(el.account_id) === "object") + el.account_id = el.account_id[0]; + return el; + }) + .groupBy("account_id") + .map(function(lines, account_id) { + // group by days + account_id = account_id === "false" ? false : Number(account_id); + var index = _.groupBy(lines, "date"); + var days = _.map(dates, function(date) { + var day = {day: date, lines: index[instance.web.date_to_str(date)] || []}; + // add line where we will insert/remove hours + var to_add = _.find(day.lines, function(line) { return line.name === self.description_line }); + if (to_add) { + day.lines = _.without(to_add); + day.lines.unshift(to_add); + } else { + day.lines.unshift(_.extend(_.clone(default_get), { + name: self.description_line, + unit_amount: 0, + date: instance.web.date_to_str(date), + account_id: account_id, + })); + } + return day; + }); + return {account: account_id, days: days}; + }).sortBy(function(account) { + return account.account; + }).value(); + + // we need the name_get of the analytic accounts + return new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(accounts, "account"), + new instance.web.CompoundContext()]).pipe(function(result) { + account_names = {}; + _.each(result, function(el) { + account_names[el[0]] = el[1]; + }); + });; + })).pipe(function(result) { + // we put all the gathered data in self, then we render + self.dates = dates; + self.accounts = accounts; + self.account_names = account_names; //real rendering self.display_data(); }); @@ -160,20 +175,25 @@ openerp.hr_timesheet_sheet = function(instance) { }, sync: function() { var self = this; - var lst = []; + var ops = []; _.each(self.accounts, function(account) { _.each(account.days, function(day) { _.each(day.lines, function(line) { if (line.unit_amount !== 0) { var tmp = _.clone(line); - //line.id = undefined; - lst.push(tmp); + tmp.id = undefined; + _.each(line, function(v, k) { + if (v instanceof Array) { + tmp[k] = v[0]; + } + }); + ops.push(tmp); } }); }); }); self.setting = true; - self.set({sheets: lst}); + self.set({sheets: ops}); self.setting = false; }, }); From 667989239380a4062ecd0cde0e08f10f108f1bbc Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 14:11:03 +0200 Subject: [PATCH 13/30] fixed line duplication bug bzr revid: nicolas.vanhoren@openerp.com-20121002121103-wyvshcyky324nc6r --- addons/hr_timesheet_sheet/hr_timesheet_sheet.py | 2 +- .../hr_timesheet_sheet/static/src/js/timesheet.js | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index 1c29a4e736f..4a715b620c6 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -351,7 +351,7 @@ class hr_timesheet_line(osv.osv): _columns = { 'sheet_id': fields.function(_sheet, string='Sheet', - type='many2one', relation='hr_timesheet_sheet.sheet', + type='many2one', relation='hr_timesheet_sheet.sheet', ondelete="cascade", store={ 'hr_timesheet_sheet.sheet': (_get_hr_timesheet_sheet, ['employee_id', 'date_from', 'date_to'], 10), 'account.analytic.line': (_get_account_analytic_line, ['user_id', 'date'], 10), diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 1077fa5e6a3..c15bfc38f85 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -68,10 +68,11 @@ openerp.hr_timesheet_sheet = function(instance) { var dates; var accounts; var account_names; + var default_get; return this.render_drop.add(new instance.web.Model("hr.analytic.timesheet").call("default_get", [ ['account_id','general_account_id', 'journal_id','date','name','user_id','product_id','product_uom_id','to_invoice','amount','unit_amount'], new instance.web.CompoundContext({'user_id': self.get('user_id')})]).pipe(function(result) { - var default_get = result; + default_get = result; // calculating dates dates = []; var start = self.get("date_from"); @@ -128,6 +129,7 @@ openerp.hr_timesheet_sheet = function(instance) { self.dates = dates; self.accounts = accounts; self.account_names = account_names; + self.default_get = default_get; //real rendering self.display_data(); }); @@ -176,6 +178,10 @@ openerp.hr_timesheet_sheet = function(instance) { sync: function() { var self = this; var ops = []; + var auth_keys = _.extend(_.clone(self.default_get), { + name: true, unit_amount: true, date: true, account_id:true, + }); + _.each(self.accounts, function(account) { _.each(account.days, function(day) { _.each(day.lines, function(line) { @@ -187,6 +193,11 @@ openerp.hr_timesheet_sheet = function(instance) { tmp[k] = v[0]; } }); + _.each(_.keys(tmp), function(key) { + if (auth_keys[key] === undefined) { + tmp[key] = undefined; + } + }); ops.push(tmp); } }); From 6d4320a5a6ae5c5c8d8b5d9b48d4889cfb6f6331 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 14:21:40 +0200 Subject: [PATCH 14/30] Fixed NaN problem bzr revid: nicolas.vanhoren@openerp.com-20121002122140-ode98iv2ul3ynks7 --- addons/hr_timesheet_sheet/static/src/js/timesheet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index c15bfc38f85..a21fbfbf540 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -99,7 +99,7 @@ openerp.hr_timesheet_sheet = function(instance) { // add line where we will insert/remove hours var to_add = _.find(day.lines, function(line) { return line.name === self.description_line }); if (to_add) { - day.lines = _.without(to_add); + day.lines = _.without(day.lines, to_add); day.lines.unshift(to_add); } else { day.lines.unshift(_.extend(_.clone(default_get), { From 51ba7db16756e763678a3848ce6b6ee30df48af4 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 14:39:06 +0200 Subject: [PATCH 15/30] Removed date_current bzr revid: nicolas.vanhoren@openerp.com-20121002123906-n8nuv9181mv0md83 --- .../report/timesheet_report.py | 18 +++--------------- .../report/timesheet_report_view.xml | 2 -- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/addons/hr_timesheet_sheet/report/timesheet_report.py b/addons/hr_timesheet_sheet/report/timesheet_report.py index 3db7ff8feb2..497fe8da117 100644 --- a/addons/hr_timesheet_sheet/report/timesheet_report.py +++ b/addons/hr_timesheet_sheet/report/timesheet_report.py @@ -46,7 +46,6 @@ class timesheet_report(osv.osv): 'department_id':fields.many2one('hr.department','Department',readonly=True), 'date_from': fields.date('Date from',readonly=True,), 'date_to': fields.date('Date to',readonly=True), - 'date_current': fields.date('Current date', required=True), 'state' : fields.selection([ ('new', 'New'), ('draft','Draft'), @@ -62,13 +61,9 @@ class timesheet_report(osv.osv): create or replace view timesheet_report as ( select min(aal.id) as id, - htss.date_current, htss.name, htss.date_from, htss.date_to, - to_char(htss.date_current,'YYYY') as year, - to_char(htss.date_current,'MM') as month, - to_char(htss.date_current, 'YYYY-MM-DD') as day, count(*) as nbr, aal.unit_amount as quantity, aal.amount as cost, @@ -77,18 +72,15 @@ class timesheet_report(osv.osv): (SELECT sum(day.total_difference) FROM hr_timesheet_sheet_sheet AS sheet LEFT JOIN hr_timesheet_sheet_sheet_day AS day - ON (sheet.id = day.sheet_id - AND day.name = sheet.date_current) where sheet.id=htss.id) as total_diff, + ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_diff, (SELECT sum(day.total_timesheet) FROM hr_timesheet_sheet_sheet AS sheet LEFT JOIN hr_timesheet_sheet_sheet_day AS day - ON (sheet.id = day.sheet_id - AND day.name = sheet.date_current) where sheet.id=htss.id) as total_timesheet, + ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_timesheet, (SELECT sum(day.total_attendance) FROM hr_timesheet_sheet_sheet AS sheet LEFT JOIN hr_timesheet_sheet_sheet_day AS day - ON (sheet.id = day.sheet_id - AND day.name = sheet.date_current) where sheet.id=htss.id) as total_attendance, + ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_attendance, aal.to_invoice, aal.general_account_id, htss.user_id, @@ -99,15 +91,11 @@ class timesheet_report(osv.osv): left join hr_analytic_timesheet as hat ON (hat.line_id=aal.id) left join hr_timesheet_sheet_sheet as htss ON (hat.line_id=htss.id) group by - to_char(htss.date_current,'YYYY'), - to_char(htss.date_current,'MM'), - to_char(htss.date_current, 'YYYY-MM-DD'), aal.account_id, htss.date_from, htss.date_to, aal.unit_amount, aal.amount, - htss.date_current, aal.to_invoice, aal.product_id, aal.general_account_id, diff --git a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml index 7b31f72235b..711bbaf2a35 100644 --- a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml +++ b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml @@ -17,7 +17,6 @@ timesheet.report - @@ -56,7 +55,6 @@ - From 5b910c668a6fc5cdc5a856ea2f8fad2df56d3a5c Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 14:50:55 +0200 Subject: [PATCH 16/30] added readonly mode bzr revid: nicolas.vanhoren@openerp.com-20121002125055-j01ea26yf9t3uwjg --- .../static/src/js/timesheet.js | 41 ++++++++++--------- .../static/src/xml/timesheet.xml | 5 ++- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index a21fbfbf540..d80c45162ae 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -3,7 +3,7 @@ openerp.hr_timesheet_sheet = function(instance) { var QWeb = instance.web.qweb; var _t = instance.web._t; - instance.hr_timesheet_sheet.WeeklyTimesheet = instance.web.form.FormWidget.extend({ + instance.hr_timesheet_sheet.WeeklyTimesheet = instance.web.form.FormWidget.extend(instance.web.form.ReinitializeWidgetMixin, { init: function() { this._super.apply(this, arguments); this.set({ @@ -50,13 +50,12 @@ openerp.hr_timesheet_sheet = function(instance) { }, start: function() { var self = this; - self.on("change:sheets", self, self.render); - self.on("change:date_to", self, self.render); - self.on("change:date_from", self, self.render); - self.on("change:user_id", self, self.render); - self.render(); + self.on("change:sheets", self, self.initialize_content); + self.on("change:date_to", self, self.initialize_content); + self.on("change:date_from", self, self.initialize_content); + self.on("change:user_id", self, self.initialize_content); }, - render: function() { + initialize_content: function() { var self = this; if (self.setting) return; @@ -139,27 +138,31 @@ openerp.hr_timesheet_sheet = function(instance) { self.$el.html(QWeb.render("hr_timesheet_sheet.WeeklyTimesheet", {widget: self})); _.each(self.accounts, function(account) { _.each(_.range(account.days.length), function(day_count) { - self.get_case(account, day_count).val(self.sum_case(account, day_count)).change(function() { - var num = Number($(this).val()); - if (isNaN(num)) { - $(this).val(self.sum_case(account, day_count)); - } else { - account.days[day_count].lines[0].unit_amount += num - self.sum_case(account, day_count); - self.get_total(account).html(self.sum_total(account)); - self.sync(); - } - }); + if (!self.get('effective_readonly')) { + self.get_box(account, day_count).val(self.sum_box(account, day_count)).change(function() { + var num = Number($(this).val()); + if (isNaN(num)) { + $(this).val(self.sum_box(account, day_count)); + } else { + account.days[day_count].lines[0].unit_amount += num - self.sum_box(account, day_count); + self.get_total(account).html(self.sum_total(account)); + self.sync(); + } + }); + } else { + self.get_box(account, day_count).html(self.sum_box(account, day_count)); + } }); self.get_total(account).html(self.sum_total(account)); }); }, - get_case: function(account, day_count) { + get_box: function(account, day_count) { return this.$('[data-account="' + account.account + '"][data-day-count="' + day_count + '"]'); }, get_total: function(account) { return this.$('[data-account-total="' + account.account + '"]'); }, - sum_case: function(account, day_count) { + sum_box: function(account, day_count) { var line_total = 0; _.each(account.days[day_count].lines, function(line) { line_total += line.unit_amount; diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml index cb633543cec..4da95f59a11 100644 --- a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml +++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml @@ -16,7 +16,10 @@ - + + From 2d8535e473a99d1905e084aa07a5a21e3e67c697 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 15:25:47 +0200 Subject: [PATCH 17/30] Added some styling bzr revid: nicolas.vanhoren@openerp.com-20121002132547-p7fi2ra8a0tgxpbn --- .../static/src/css/timesheet.css | 40 +++++++++++++++++++ .../static/src/js/timesheet.js | 3 +- .../static/src/xml/timesheet.xml | 4 +- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/css/timesheet.css b/addons/hr_timesheet_sheet/static/src/css/timesheet.css index e69de29bb2d..e609bb636b4 100644 --- a/addons/hr_timesheet_sheet/static/src/css/timesheet.css +++ b/addons/hr_timesheet_sheet/static/src/css/timesheet.css @@ -0,0 +1,40 @@ + +.oe_timesheet_weekly table { + width: 100%; +} + +.oe_timesheet_weekly th { + text-align: right; + color: #069; + font-family: 'Helvetica Neue', Arial, Verdana, 'Nimbus Sans L', sans-serif; + font-size: 10px; +} + +.oe_timesheet_weekly td { + text-align: right; + vertical-align: middle; +} + +.oe_timesheet_weekly .oe_timesheet_weekly_account { + text-align: left; +} + +.oe_timesheet_weekly td input { + border: 1px solid #CCC; + padding: 5px 2px !important; + color: #666 !important; + font-size: 14px; + font-weight: bold; + width: 38px; + text-align: right; + min-width: 0 !important; +} + +.oe_timesheet_weekly td .oe_timesheet_weekly_box { + padding: 5px 2px !important; + color: #666 !important; + font-size: 14px; + font-weight: bold; + width: 38px; + display: inline-block; +} \ No newline at end of file diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index d80c45162ae..16d42261585 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -48,7 +48,8 @@ openerp.hr_timesheet_sheet = function(instance) { self.updating = false; }); }, - start: function() { + initialize_field: function() { + instance.web.form.ReinitializeWidgetMixin.initialize_field.call(this); var self = this; self.on("change:sheets", self, self.initialize_content); self.on("change:date_to", self, self.initialize_content); diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml index 4da95f59a11..7fb956cc103 100644 --- a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml +++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml @@ -13,11 +13,11 @@ Total - + + t-att-data-day-count="day_count" type="text"/> From ab97cd990772bf3021ac76940f38719f87921123 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 15:27:14 +0200 Subject: [PATCH 18/30] minor bzr revid: nicolas.vanhoren@openerp.com-20121002132714-p7hxzd8meo26mwfj --- addons/hr_timesheet_sheet/static/src/xml/timesheet.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml index 7fb956cc103..e27df42d47d 100644 --- a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml +++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml @@ -10,7 +10,7 @@
- Total + TOTAL From 43322be88525a16b4e5f0266acb4bcc402ee1d6c Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 16:38:48 +0200 Subject: [PATCH 19/30] Added total stuff bzr revid: nicolas.vanhoren@openerp.com-20121002143848-1bgyz62vxn01dsvi --- .../static/src/css/timesheet.css | 35 +++++++++++++++---- .../static/src/js/timesheet.js | 30 ++++++++++++++++ .../static/src/xml/timesheet.xml | 19 ++++++++-- 3 files changed, 76 insertions(+), 8 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/css/timesheet.css b/addons/hr_timesheet_sheet/static/src/css/timesheet.css index e609bb636b4..40ef259e1c5 100644 --- a/addons/hr_timesheet_sheet/static/src/css/timesheet.css +++ b/addons/hr_timesheet_sheet/static/src/css/timesheet.css @@ -1,25 +1,34 @@ -.oe_timesheet_weekly table { +.openerp .oe_timesheet_weekly { + overflow-x: auto; +} + +.openerp .oe_timesheet_weekly table { width: 100%; } -.oe_timesheet_weekly th { +.openerp .oe_timesheet_weekly th { text-align: right; color: #069; font-family: 'Helvetica Neue', Arial, Verdana, 'Nimbus Sans L', sans-serif; font-size: 10px; } -.oe_timesheet_weekly td { +.openerp .oe_timesheet_weekly th.oe_timesheet_weekly_date_head { + width: 60px; +} + +.openerp .oe_timesheet_weekly td { text-align: right; vertical-align: middle; } -.oe_timesheet_weekly .oe_timesheet_weekly_account { +.openerp .oe_timesheet_weekly .oe_timesheet_weekly_account { text-align: left; + padding-right: 30px; } -.oe_timesheet_weekly td input { +.openerp .oe_timesheet_weekly td input { border: 1px solid #CCC; padding: 5px 2px !important; color: #666 !important; @@ -30,11 +39,25 @@ min-width: 0 !important; } -.oe_timesheet_weekly td .oe_timesheet_weekly_box { +.openerp .oe_timesheet_weekly td .oe_timesheet_weekly_box { padding: 5px 2px !important; color: #666 !important; font-size: 14px; font-weight: bold; width: 38px; display: inline-block; +} + +.openerp .oe_timesheet_weekly .oe_timesheet_weekly_adding_tot { + display: table; + width: 100%; +} + +.openerp .oe_timesheet_weekly .oe_timesheet_weekly_adding { + display: table-cell; + text-align: left; +} + +.openerp .oe_timesheet_weekly .oe_timesheet_weekly_tottot { + display: table-cell; } \ No newline at end of file diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 16d42261585..e836278fef0 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -147,6 +147,8 @@ openerp.hr_timesheet_sheet = function(instance) { } else { account.days[day_count].lines[0].unit_amount += num - self.sum_box(account, day_count); self.get_total(account).html(self.sum_total(account)); + self.get_day_total(day_count).html(self.sum_day_total(day_count)); + self.get_super_total().html(self.sum_super_total()); self.sync(); } }); @@ -156,6 +158,10 @@ openerp.hr_timesheet_sheet = function(instance) { }); self.get_total(account).html(self.sum_total(account)); }); + _.each(_.range(self.dates.length), function(day_count) { + self.get_day_total(day_count).html(self.sum_day_total(day_count)); + }); + self.get_super_total().html(self.sum_super_total()); }, get_box: function(account, day_count) { return this.$('[data-account="' + account.account + '"][data-day-count="' + day_count + '"]'); @@ -163,6 +169,12 @@ openerp.hr_timesheet_sheet = function(instance) { get_total: function(account) { return this.$('[data-account-total="' + account.account + '"]'); }, + get_day_total: function(day_count) { + return this.$('[data-day-total="' + day_count + '"]'); + }, + get_super_total: function() { + return this.$('.oe_timesheet_weekly_supertotal'); + }, sum_box: function(account, day_count) { var line_total = 0; _.each(account.days[day_count].lines, function(line) { @@ -179,6 +191,23 @@ openerp.hr_timesheet_sheet = function(instance) { }); return total; }, + sum_day_total: function(day_count) { + var total = 0; + _.each(this.accounts, function(account) { + _.each(account.days[day_count].lines, function(line) { + total += line.unit_amount; + }); + }); + return total; + }, + sum_super_total: function(account) { + var self = this; + var total = 0; + _.each(self.accounts, function(account) { + total += self.sum_total(account); + }); + return total; + }, sync: function() { var self = this; var ops = []; @@ -197,6 +226,7 @@ openerp.hr_timesheet_sheet = function(instance) { tmp[k] = v[0]; } }); + // we have to remove some keys, because analytic lines are shitty _.each(_.keys(tmp), function(key) { if (auth_keys[key] === undefined) { tmp[key] = undefined; diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml index e27df42d47d..73b95eb4840 100644 --- a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml +++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml @@ -6,11 +6,11 @@ - - + @@ -24,6 +24,21 @@ + + + + + + + + +
+
TOTALTOTAL
+
+
+
TOTAL
+
+
+
From c64ec6591c113732893f7280f5494168d40c927f Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 16:41:05 +0200 Subject: [PATCH 20/30] wip bzr revid: nicolas.vanhoren@openerp.com-20121002144105-13tzymf7fj00bml6 --- addons/hr_timesheet_sheet/static/src/xml/timesheet.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml index 73b95eb4840..59583415bb7 100644 --- a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml +++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml @@ -32,11 +32,11 @@
- - - + + + - + From e644adeca12b7ead75159f7ed76850364c9a6bae Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 16:47:08 +0200 Subject: [PATCH 21/30] wip bzr revid: nicolas.vanhoren@openerp.com-20121002144708-p88zs6a3hjkq0w8h --- addons/hr_timesheet_sheet/static/src/css/timesheet.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/hr_timesheet_sheet/static/src/css/timesheet.css b/addons/hr_timesheet_sheet/static/src/css/timesheet.css index 40ef259e1c5..3ac628ab491 100644 --- a/addons/hr_timesheet_sheet/static/src/css/timesheet.css +++ b/addons/hr_timesheet_sheet/static/src/css/timesheet.css @@ -7,6 +7,10 @@ width: 100%; } +.openerp .oe_timesheet_weekly td { + padding-top: 15px; +} + .openerp .oe_timesheet_weekly th { text-align: right; color: #069; From add8348f4ba222e046682d31e8f322bbb13b6aea Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 17:02:50 +0200 Subject: [PATCH 22/30] optimized a little total calculus bzr revid: nicolas.vanhoren@openerp.com-20121002150250-6rx77po7v40f6nqn --- .../static/src/js/timesheet.js | 47 +++++++------------ 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index e836278fef0..fbaeae2740c 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -146,9 +146,7 @@ openerp.hr_timesheet_sheet = function(instance) { $(this).val(self.sum_box(account, day_count)); } else { account.days[day_count].lines[0].unit_amount += num - self.sum_box(account, day_count); - self.get_total(account).html(self.sum_total(account)); - self.get_day_total(day_count).html(self.sum_day_total(day_count)); - self.get_super_total().html(self.sum_super_total()); + self.display_totals(); self.sync(); } }); @@ -156,12 +154,8 @@ openerp.hr_timesheet_sheet = function(instance) { self.get_box(account, day_count).html(self.sum_box(account, day_count)); } }); - self.get_total(account).html(self.sum_total(account)); }); - _.each(_.range(self.dates.length), function(day_count) { - self.get_day_total(day_count).html(self.sum_day_total(day_count)); - }); - self.get_super_total().html(self.sum_super_total()); + self.display_totals(); }, get_box: function(account, day_count) { return this.$('[data-account="' + account.account + '"][data-day-count="' + day_count + '"]'); @@ -182,31 +176,24 @@ openerp.hr_timesheet_sheet = function(instance) { }); return line_total; }, - sum_total: function(account) { - var total = 0; - _.each(account.days, function(day) { - _.each(day.lines, function(line) { - total += line.unit_amount; - }); - }); - return total; - }, - sum_day_total: function(day_count) { - var total = 0; - _.each(this.accounts, function(account) { - _.each(account.days[day_count].lines, function(line) { - total += line.unit_amount; - }); - }); - return total; - }, - sum_super_total: function(account) { + display_totals: function() { var self = this; - var total = 0; + var day_tots = _.map(_.range(self.dates.length), function() { return 0 }); + var super_tot = 0; _.each(self.accounts, function(account) { - total += self.sum_total(account); + var acc_tot = 0; + _.each(_.range(self.dates.length), function(day_count) { + var sum = self.sum_box(account, day_count); + acc_tot += sum; + day_tots[day_count] += sum; + super_tot += sum; + }); + self.get_total(account).html(acc_tot); }); - return total; + _.each(_.range(self.dates.length), function(day_count) { + self.get_day_total(day_count).html(day_tots[day_count]); + }); + self.get_super_total().html(super_tot); }, sync: function() { var self = this; From 66b62190c7128b4a13c7d9698b09ecd19d619239 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 2 Oct 2012 17:15:20 +0200 Subject: [PATCH 23/30] Removed date_current more bzr revid: nicolas.vanhoren@openerp.com-20121002151520-q1m2tpgbfmcvxzux --- addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml | 1 - addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml | 1 - addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py | 1 - .../test/worktask_entry_to_timesheetline_entry.yml | 1 - 4 files changed, 4 deletions(-) diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml index 42497eb537e..4e0e1becbe9 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml @@ -6,7 +6,6 @@ Sheet 1 - --> diff --git a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml index 070079a4b80..5ecb3ccba11 100644 --- a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml +++ b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml @@ -16,7 +16,6 @@ I create a timesheet for employee "Quentin Paolinon". - !record {model: hr_timesheet_sheet.sheet, id: hr_timesheet_sheet_sheet_deddk0}: - date_current: !eval time.strftime('%Y-%m-%d') date_from: !eval time.strftime('%Y-%m-01') name: Quentin Paolinon state: new diff --git a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py index a6974fc2ccf..3bd495036d5 100644 --- a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py +++ b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py @@ -42,7 +42,6 @@ class hr_timesheet_current_open(osv.osv_memory): view_type = 'tree,form' domain = "[('id','in',["+','.join(map(str, ids))+"]),('user_id', '=', uid)]" elif len(ids)==1: - ts.write(cr, uid, ids, {'date_current': time.strftime('%Y-%m-%d')}, context=context) domain = "[('user_id', '=', uid)]" else: domain = "[('user_id', '=', uid)]" diff --git a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml index 497ec9e3597..3efd133ffb6 100644 --- a/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml +++ b/addons/project_timesheet/test/worktask_entry_to_timesheetline_entry.yml @@ -45,7 +45,6 @@ Create a timesheet sheet for HR manager - !record {model: hr_timesheet_sheet.sheet, id: hr_timesheet_sheet_sheet_sheetforhrmanager0}: - date_current: !eval time.strftime('%Y-05-%d') date_from: !eval "'%s-05-01' %(datetime.now().year)" date_to: !eval "'%s-05-31' %(datetime.now().year)" name: Sheet for hr manager From e020a58b5fcd7f58cd8b83eba1f970670ef5105f Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 4 Oct 2012 10:34:33 +0200 Subject: [PATCH 24/30] Removed some tests that are now useless bzr revid: nicolas.vanhoren@openerp.com-20121004083433-86d2y81qdfio086c --- .../test/test_hr_timesheet_sheet.yml | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml index 5ecb3ccba11..71776af61ba 100644 --- a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml +++ b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml @@ -33,30 +33,6 @@ - !assert {model: hr.employee, id: hr.employee_qdp}: - state == 'present' -- - I want to check attendance and work of yesterday. I click on <- button. -- - !python {model: hr_timesheet_sheet.sheet}: | - date_prev = self.date_previous(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None) - assert date_prev == True, "I See Previous Date Timesheet" -- - Then I click on "Today" button to fill today's timesheet. -- - !python {model: hr_timesheet_sheet.sheet}: | - date_to = self.date_today(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None) - assert date_to == True, "I See Today Date Timesheet" -- - I can also move to next day by clicking on -> button. -- - !python {model: hr_timesheet_sheet.sheet}: | - date_next = self.date_next(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None) - assert date_next == True, "I See Next Date Timesheet" -- - I want to go to a particular date and see attendance then I select the date and click on "Go to:" button. -- - !python {model: hr_timesheet_sheet.sheet}: | - button_dumy = self.button_dummy(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None) - assert button_dumy == True, "I See Particular Date Attendance" - At the time of logout, I create attendance and perform "Sign Out". - From a21489c8c84951af4e0d035d9df9be494699d856 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 4 Oct 2012 15:48:58 +0200 Subject: [PATCH 25/30] Added on_change bzr revid: nicolas.vanhoren@openerp.com-20121004134858-bsjtmlpbr4v9zv4d --- .../hr_timesheet_sheet/hr_timesheet_sheet.py | 4 + .../static/src/js/timesheet.js | 82 ++++++++++--------- 2 files changed, 48 insertions(+), 38 deletions(-) diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index e559727cd5e..96cb15ddce1 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -387,6 +387,10 @@ class hr_timesheet_line(osv.osv): raise osv.except_osv(_('Error!'), _('You cannot modify an entry in a confirmed timesheet.')) return True + def multi_on_change_account_id(self, cr, uid, ids, account_ids, context=None): + return dict([(el, self.on_change_account_id(cr, uid, ids, el)) for el in account_ids]) + + hr_timesheet_line() class hr_attendance(osv.osv): diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index fbaeae2740c..cdf51f5f399 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -89,47 +89,53 @@ openerp.hr_timesheet_sheet = function(instance) { el.account_id = el.account_id[0]; return el; }) - .groupBy("account_id") - .map(function(lines, account_id) { - // group by days - account_id = account_id === "false" ? false : Number(account_id); - var index = _.groupBy(lines, "date"); - var days = _.map(dates, function(date) { - var day = {day: date, lines: index[instance.web.date_to_str(date)] || []}; - // add line where we will insert/remove hours - var to_add = _.find(day.lines, function(line) { return line.name === self.description_line }); - if (to_add) { - day.lines = _.without(day.lines, to_add); - day.lines.unshift(to_add); - } else { - day.lines.unshift(_.extend(_.clone(default_get), { - name: self.description_line, - unit_amount: 0, - date: instance.web.date_to_str(date), - account_id: account_id, - })); - } - return day; - }); - return {account: account_id, days: days}; - }).sortBy(function(account) { - return account.account; - }).value(); + .groupBy("account_id").value(); - // we need the name_get of the analytic accounts - return new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(accounts, "account"), - new instance.web.CompoundContext()]).pipe(function(result) { - account_names = {}; - _.each(result, function(el) { - account_names[el[0]] = el[1]; - }); - });; + var account_ids = _.map(_.keys(accounts), function(el) { return el === "false" ? false : Number(el) }); + + return new instance.web.Model("hr.analytic.timesheet").call("multi_on_change_account_id", [[], account_ids, + new instance.web.CompoundContext({'user_id': self.get('user_id')})]).pipe(function(accounts_defaults) { + accounts = _(accounts).chain().map(function(lines, account_id) { + account_defaults = _.extend({}, default_get, accounts_defaults[account_id]); + // group by days + account_id = account_id === "false" ? false : Number(account_id); + var index = _.groupBy(lines, "date"); + var days = _.map(dates, function(date) { + var day = {day: date, lines: index[instance.web.date_to_str(date)] || []}; + // add line where we will insert/remove hours + var to_add = _.find(day.lines, function(line) { return line.name === self.description_line }); + if (to_add) { + day.lines = _.without(day.lines, to_add); + day.lines.unshift(to_add); + } else { + day.lines.unshift(_.extend(_.clone(account_defaults), { + name: self.description_line, + unit_amount: 0, + date: instance.web.date_to_str(date), + account_id: account_id, + })); + } + return day; + }); + return {account: account_id, days: days, account_defaults: account_defaults}; + }).sortBy(function(account) { + return account.account; + }).value(); + + // we need the name_get of the analytic accounts + return new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(accounts, "account"), + new instance.web.CompoundContext()]).pipe(function(result) { + account_names = {}; + _.each(result, function(el) { + account_names[el[0]] = el[1]; + }); + });; + }); })).pipe(function(result) { // we put all the gathered data in self, then we render self.dates = dates; self.accounts = accounts; self.account_names = account_names; - self.default_get = default_get; //real rendering self.display_data(); }); @@ -198,11 +204,11 @@ openerp.hr_timesheet_sheet = function(instance) { sync: function() { var self = this; var ops = []; - var auth_keys = _.extend(_.clone(self.default_get), { - name: true, unit_amount: true, date: true, account_id:true, - }); _.each(self.accounts, function(account) { + var auth_keys = _.extend(_.clone(account.account_defaults), { + name: true, unit_amount: true, date: true, account_id:true, + }); _.each(account.days, function(day) { _.each(day.lines, function(line) { if (line.unit_amount !== 0) { From 3cd2ffe00608d536c6387728ad74d44f82890330 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 5 Oct 2012 15:53:52 +0200 Subject: [PATCH 26/30] [IMP] added lot of stuff bzr revid: nicolas.vanhoren@openerp.com-20121005135352-t43v2rc153ch2gvh --- .../static/src/css/timesheet.css | 13 +++++++++-- .../static/src/js/timesheet.js | 23 +++++++++++++++++++ .../static/src/xml/timesheet.xml | 5 +++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/css/timesheet.css b/addons/hr_timesheet_sheet/static/src/css/timesheet.css index 3ac628ab491..f44fbdbd4a1 100644 --- a/addons/hr_timesheet_sheet/static/src/css/timesheet.css +++ b/addons/hr_timesheet_sheet/static/src/css/timesheet.css @@ -32,7 +32,7 @@ padding-right: 30px; } -.openerp .oe_timesheet_weekly td input { +.openerp .oe_timesheet_weekly td input.oe_timesheet_weekly_input { border: 1px solid #CCC; padding: 5px 2px !important; color: #666 !important; @@ -64,4 +64,13 @@ .openerp .oe_timesheet_weekly .oe_timesheet_weekly_tottot { display: table-cell; -} \ No newline at end of file +} + +.openerp .oe_timesheet_weekly .oe_timesheet_weekly_add_row td { + text-align: left; +} + +.openerp .oe_timesheet_weekly .oe_timesheet_weekly_add_row .oe_form_field_many2one { + display: inline-block; + width: 200px; +} diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index cdf51f5f399..f8508b410d2 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -140,6 +140,12 @@ openerp.hr_timesheet_sheet = function(instance) { self.display_data(); }); }, + destroy_content: function() { + if (this.dfm) { + this.dfm.destroy(); + this.dfm = undefined; + } + }, display_data: function() { var self = this; self.$el.html(QWeb.render("hr_timesheet_sheet.WeeklyTimesheet", {widget: self})); @@ -162,6 +168,23 @@ openerp.hr_timesheet_sheet = function(instance) { }); }); self.display_totals(); + self.$(".oe_timesheet_weekly_adding button").click(function() { + self.$(".oe_timesheet_weekly_add_row").show(); + self.dfm = new instance.web.form.DefaultFieldManager(self); + self.dfm.extend_field_desc({ + account: { + relation: "account.analytic.account", + }, + }); + self.account_m2o = new instance.web.form.FieldMany2One(self.dfm, { + attrs: { + name: "account", + type: "many2one", + domain: [['type','in',['normal', 'contract']], ['state', '<>', 'close'], ['use_timesheets','=',1]], + }, + }); + self.account_m2o.appendTo(self.$(".oe_timesheet_weekly_add_row td")); + }); }, get_box: function(account, day_count) { return this.$('[data-account="' + account.account + '"][data-day-count="' + day_count + '"]'); diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml index 59583415bb7..59f3468ea48 100644 --- a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml +++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml @@ -16,7 +16,7 @@ - @@ -24,6 +24,9 @@ + + +
From ea356b175ba41d9ba2ef5e8d7b46d3d566697e20 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 8 Oct 2012 14:42:48 +0200 Subject: [PATCH 27/30] Added possibility to add an account bzr revid: nicolas.vanhoren@openerp.com-20121008124248-9fy5q3hk30tgqbjn --- .../static/src/js/timesheet.js | 69 +++++++++++++------ .../static/src/xml/timesheet.xml | 4 +- 2 files changed, 52 insertions(+), 21 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index f8508b410d2..8cf9d5415c7 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -63,6 +63,7 @@ openerp.hr_timesheet_sheet = function(instance) { // don't render anything until we have date_to and date_from if (!self.get("date_to") || !self.get("date_from")) return; + this.destroy_content(); // it's important to use those vars to avoid race conditions var dates; @@ -118,8 +119,6 @@ openerp.hr_timesheet_sheet = function(instance) { return day; }); return {account: account_id, days: days, account_defaults: account_defaults}; - }).sortBy(function(account) { - return account.account; }).value(); // we need the name_get of the analytic accounts @@ -129,6 +128,9 @@ openerp.hr_timesheet_sheet = function(instance) { _.each(result, function(el) { account_names[el[0]] = el[1]; }); + accounts = _.sortBy(accounts, function(el) { + return account_names[el.account]; + }); });; }); })).pipe(function(result) { @@ -136,6 +138,7 @@ openerp.hr_timesheet_sheet = function(instance) { self.dates = dates; self.accounts = accounts; self.account_names = account_names; + self.default_get = default_get; //real rendering self.display_data(); }); @@ -168,22 +171,45 @@ openerp.hr_timesheet_sheet = function(instance) { }); }); self.display_totals(); - self.$(".oe_timesheet_weekly_adding button").click(function() { - self.$(".oe_timesheet_weekly_add_row").show(); - self.dfm = new instance.web.form.DefaultFieldManager(self); - self.dfm.extend_field_desc({ - account: { - relation: "account.analytic.account", - }, + self.$(".oe_timesheet_weekly_adding button").click(_.bind(this.init_add_account, this)); + }, + init_add_account: function() { + var self = this; + if (self.dfm) + return; + self.$(".oe_timesheet_weekly_add_row").show(); + self.dfm = new instance.web.form.DefaultFieldManager(self); + self.dfm.extend_field_desc({ + account: { + relation: "account.analytic.account", + }, + }); + self.account_m2o = new instance.web.form.FieldMany2One(self.dfm, { + attrs: { + name: "account", + type: "many2one", + domain: [['type','in',['normal', 'contract']], ['state', '<>', 'close'], ['use_timesheets','=',1]], + modifiers: '{"required": true}', + }, + }); + self.account_m2o.prependTo(self.$(".oe_timesheet_weekly_add_row td")); + self.$(".oe_timesheet_weekly_add_row button").click(function() { + var id = self.account_m2o.get_value(); + if (id === false) { + self.dfm.set({display_invalid_fields: true}); + return; + } + var ops = self.generate_o2m_value(); + new instance.web.Model("hr.analytic.timesheet").call("on_change_account_id", [[], id]).pipe(function(res) { + var def = _.extend({}, self.default_get, res.value, { + name: self.description_line, + unit_amount: 0, + date: instance.web.date_to_str(self.dates[0]), + account_id: id, + }); + ops.push(def); + self.set({"sheets": ops}); }); - self.account_m2o = new instance.web.form.FieldMany2One(self.dfm, { - attrs: { - name: "account", - type: "many2one", - domain: [['type','in',['normal', 'contract']], ['state', '<>', 'close'], ['use_timesheets','=',1]], - }, - }); - self.account_m2o.appendTo(self.$(".oe_timesheet_weekly_add_row td")); }); }, get_box: function(account, day_count) { @@ -225,6 +251,11 @@ openerp.hr_timesheet_sheet = function(instance) { self.get_super_total().html(super_tot); }, sync: function() { + self.setting = true; + self.set({sheets: this.generate_o2m_value()}); + self.setting = false; + }, + generate_o2m_value: function() { var self = this; var ops = []; @@ -253,9 +284,7 @@ openerp.hr_timesheet_sheet = function(instance) { }); }); }); - self.setting = true; - self.set({sheets: ops}); - self.setting = false; + return ops; }, }); diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml index 59f3468ea48..24a892f9607 100644 --- a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml +++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml @@ -25,7 +25,9 @@ - + + + From 46b112f1295a4302b81d043b49df869a1aa3affe Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 8 Oct 2012 14:44:29 +0200 Subject: [PATCH 28/30] Not possible to add an already existing account bzr revid: nicolas.vanhoren@openerp.com-20121008124429-j65gc8s6jb4a8u8f --- addons/hr_timesheet_sheet/static/src/js/timesheet.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 8cf9d5415c7..8f200f487b2 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -188,7 +188,12 @@ openerp.hr_timesheet_sheet = function(instance) { attrs: { name: "account", type: "many2one", - domain: [['type','in',['normal', 'contract']], ['state', '<>', 'close'], ['use_timesheets','=',1]], + domain: [ + ['type','in',['normal', 'contract']], + ['state', '<>', 'close'], + ['use_timesheets','=',1], + ['id', 'not in', _.pluck(self.accounts, "account")], + ], modifiers: '{"required": true}', }, }); From a8772445c7e76d8a4e90bb576aaba00a0df1ad8e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 8 Oct 2012 18:22:24 +0200 Subject: [PATCH 29/30] fixed bug bzr revid: nicolas.vanhoren@openerp.com-20121008162224-inmlqdcj4jd96g67 --- addons/hr_timesheet_sheet/static/src/js/timesheet.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 8f200f487b2..1be965fd63d 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -256,6 +256,7 @@ openerp.hr_timesheet_sheet = function(instance) { self.get_super_total().html(super_tot); }, sync: function() { + var self = this; self.setting = true; self.set({sheets: this.generate_o2m_value()}); self.setting = false; From 6828d97bd580f9cf7d5e49be012e05ae40ad081e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 8 Oct 2012 18:33:53 +0200 Subject: [PATCH 30/30] Added class for today bzr revid: nicolas.vanhoren@openerp.com-20121008163353-1b9kgzg6mg1rjm2r --- .../static/src/css/timesheet.css | 3 ++ .../static/src/xml/timesheet.xml | 38 +++++++++++-------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/addons/hr_timesheet_sheet/static/src/css/timesheet.css b/addons/hr_timesheet_sheet/static/src/css/timesheet.css index f44fbdbd4a1..b486f76694d 100644 --- a/addons/hr_timesheet_sheet/static/src/css/timesheet.css +++ b/addons/hr_timesheet_sheet/static/src/css/timesheet.css @@ -74,3 +74,6 @@ display: inline-block; width: 200px; } + +.openerp .oe_timesheet_weekly_today { +} diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml index 24a892f9607..0c4ad857d3b 100644 --- a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml +++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml @@ -6,22 +6,26 @@ - + + + - + + + @@ -37,11 +41,13 @@ - + + +
-
- -
+
+ +
TOTAL
- - - - + + + +