You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
3.2 KiB

  1. /* Copyright 2019 Onestein
  2. * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
  3. odoo.define('web_group_by_percentage', function (require) {
  4. "use strict";
  5. var ListRenderer = require('web.ListRenderer'),
  6. BasicModel = require('web.BasicModel');
  7. ListRenderer.include({
  8. /**
  9. * Render the percentage to the group row.
  10. *
  11. * @override
  12. */
  13. _renderGroupRow: function (group) {
  14. var self = this;
  15. var res = this._super.apply(this, arguments);
  16. _.each(group.aggregatePercentages, function (percentage, field) {
  17. var cellIndex = _.findIndex(self.columns, function (column) {
  18. if (field === column.attrs.name) {
  19. return true;
  20. }
  21. });
  22. var $cell = $(res.find('td').get(cellIndex - 1));
  23. var $b = $('<span>')
  24. .addClass('web_group_by_percentage')
  25. .html(_.str.sprintf('%s%% ', percentage.toFixed(2)))
  26. .data('percentage', percentage);
  27. $cell.prepend($b);
  28. });
  29. return res;
  30. },
  31. });
  32. BasicModel.include({
  33. /**
  34. * Adds aggregatePercentages to the result.
  35. *
  36. * @override
  37. */
  38. get: function () {
  39. var result = this._super.apply(this, arguments),
  40. dp = result && this.localData[result.id];
  41. if (dp) {
  42. if (dp.aggregatePercentages) {
  43. result.aggregatePercentages = $.extend({}, dp.aggregatePercentages);
  44. }
  45. }
  46. return result;
  47. },
  48. /**
  49. * Calculate percentages.
  50. *
  51. * @override
  52. */
  53. _readGroup: function () {
  54. var self = this,
  55. res = this._super.apply(this, arguments);
  56. res.done(function (list) {
  57. // Calculate totals
  58. var sums = {};
  59. _.each(list.data, function (groupId) {
  60. var group = self.get(groupId);
  61. _.each(group.aggregateValues, function (value, field) {
  62. if (!(field in sums)) {
  63. sums[field] = 0;
  64. }
  65. sums[field] += value;
  66. });
  67. });
  68. // Calculate percentages
  69. _.each(list.data, function (groupId) {
  70. var group = self.get(groupId),
  71. aggregatePercentages = {};
  72. _.each(_.keys(sums), function (field) {
  73. var percentage = 0;
  74. if (sums[field]) {
  75. percentage = (group.aggregateValues[field] / sums[field]) * 100;
  76. }
  77. aggregatePercentages[field] = percentage;
  78. });
  79. var dp = self.localData[groupId];
  80. dp.aggregatePercentages = aggregatePercentages;
  81. });
  82. return list;
  83. });
  84. return res;
  85. },
  86. });
  87. });