Made if really work

bzr revid: nicolas.vanhoren@openerp.com-20121002111537-6ksjtqt5k0b6jcq4
This commit is contained in:
niv-openerp 2012-10-02 13:15:37 +02:00
parent d5c13c1bb2
commit 822f6bbe7b
1 changed files with 81 additions and 61 deletions

View File

@ -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;
},
});