ranking_sales_partner.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. function ranking_sales_partner (widget) {
  2. "use strict";
  3. var model= openerp;
  4. widget.RankingSalesPartnerWidget = widget.Base.extend({
  5. template: 'RankingSalesPartner',
  6. data : [],
  7. accountInvoice : [],
  8. resPartner : [],
  9. modelId:[],
  10. events: {
  11. 'click canvas': 'showCustomers'
  12. },
  13. init: function (parent) {
  14. this._super(parent, {
  15. width : 6,
  16. height: 4
  17. });
  18. },
  19. start: function () {
  20. var self = this;
  21. self.fetchInitial();
  22. },
  23. fetchInitial:function(){
  24. var self = this;
  25. self.$el.block({
  26. message: null,
  27. overlayCSS: {
  28. backgroundColor: '#FAFAFA'
  29. }
  30. });
  31. self.$el.find('.widget-content.widget-loading').css('display','flex');
  32. self.fecthInvoice().then(function (accountInvoice) {
  33. return accountInvoice;
  34. }).then(function (accountInvoice) {
  35. self.accountInvoice = accountInvoice;
  36. return self.fecthPartner(accountInvoice);
  37. }).then(function (resPartner) {
  38. self.resPartner = resPartner;
  39. return self.fetchGetModelId();
  40. }).then(function(modelId){
  41. self.modelId = modelId;
  42. return self.fetchProductRanking();
  43. });
  44. },
  45. // getModelId
  46. fetchGetModelId: function(){
  47. var self = this;
  48. var defer = $.Deferred();
  49. var irModelData = new model.web.Model('ir.model.data');
  50. var getObtjectReference = irModelData.get_func('get_object_reference');
  51. this.alive(getObtjectReference('base', 'view_partner_form')).then(function(results){
  52. defer.resolve(results);
  53. });
  54. return defer;
  55. },
  56. // Obtener factura
  57. fecthInvoice: function(){
  58. var self = this;
  59. var desde =moment().format('YYYY-MM-01');
  60. var hasta =moment().add(1,'months').format('YYYY-MM-01');
  61. var defer = $.Deferred();
  62. var fields = ['id', 'invoice_line', 'date_invoice','partner_id','amount_total'];
  63. var domain = [['type', '=', 'out_invoice'], ['date_invoice', '>=', desde], ['date_invoice', '<', hasta], ['state', 'in', ['open','paid']]];
  64. var invoice = new model.web.Model('account.invoice');
  65. invoice.query(fields).filter(domain).all().then(function (results) {
  66. defer.resolve(results);
  67. });
  68. return defer;
  69. },
  70. // Partner
  71. fecthPartner: function(invoice){
  72. var self = this;
  73. var defer = $.Deferred();
  74. var partner_id = _.map(invoice,function(map){
  75. return map.partner_id[0];
  76. });
  77. var fields =['id', 'name'];
  78. var domain =[['id', 'in', partner_id],['active', '=', true],['customer','=',true]];
  79. var resPartner = new model.web.Model('res.partner');
  80. resPartner.query(fields).filter(domain).all().then(function(results){
  81. defer.resolve(results);
  82. });
  83. return defer;
  84. },
  85. // Obtener facturas por cada clientes
  86. getAccountInvoice:function(id_partner){
  87. var self = this;
  88. return _.flatten(_.filter(self.accountInvoice,function (inv) {
  89. return inv.partner_id[0] === id_partner;
  90. }));
  91. },
  92. fetchProductRanking: function(){
  93. var self = this;
  94. var itemPartner;
  95. var itemInvoice;
  96. var countInvoice = 0
  97. var ranking = [];
  98. for (var i = 0; i < self.resPartner.length; i++) {
  99. itemPartner = self.resPartner[i];
  100. itemInvoice = self.getAccountInvoice(itemPartner.id);
  101. // countInvoice =_.countBy(_.map(itemInvoice,function(map){
  102. // return map.id;
  103. // }),function(num){
  104. // return num ? 'even': 'odd';
  105. // });
  106. var quantity = _.reduce(_.map(itemInvoice,function(item){
  107. return item.amount_total;
  108. }),function(memo, num){
  109. return memo + num;
  110. },0);
  111. ranking.push({ id : itemPartner.id,
  112. name : itemPartner.name,
  113. countInvoice : quantity
  114. });
  115. }
  116. ranking.sort(function (a, b) {
  117. return b.countInvoice - a.countInvoice
  118. });
  119. self.ranking=ranking;
  120. self.$el.unblock();
  121. self.$el.find('.widget-content.widget-loading').css('display','none');
  122. self.$el.find('.widget-title').find('span').text("Ranking de clientes con más compras en el mes");
  123. self.fetchChart(ranking);
  124. },
  125. // Generar Grafico
  126. fetchChart: function (ranking){
  127. var self = this;
  128. var label = [];
  129. var body = [];
  130. var item;
  131. var rank = 5;
  132. if (ranking.length < rank && ranking.length > 0 )
  133. rank= ranking.length;
  134. for (var i = 0; i < rank; i++) {
  135. if (ranking[i]){
  136. item = ranking[i];
  137. }
  138. if (ranking.length === 0) {
  139. item = {};
  140. item.name = "N/A";
  141. item.countInvoice = 0;
  142. }
  143. label.push(item.name);
  144. body.push(item.countInvoice);
  145. }
  146. // Global method for setting Y axis number format.
  147. Chart.scaleService.updateScaleDefaults('linear', {
  148. ticks: {
  149. callback: function(tick) {
  150. return tick.toLocaleString('de-DE');
  151. }
  152. }
  153. });
  154. Chart.defaults.global.tooltips.callbacks.label = function(tooltipItem, data) {
  155. var dataset = data.datasets[tooltipItem.datasetIndex];
  156. var datasetLabel = dataset.label || '';
  157. return datasetLabel + dataset.data[tooltipItem.index].toLocaleString('de-DE');
  158. };
  159. var chart = new Chart(this.$el.find(".widget-content").find('canvas'), {
  160. type: 'bar',
  161. data: {
  162. labels: label,
  163. datasets: [
  164. {
  165. backgroundColor: [ '#EF5350', '#F06292', '#AB47BC', '#7E57C2', '#5C6BC0', '#42A5F5', '#26C6DA', '#26A69A', '#66BB6A', '#9CCC65'],
  166. data: body,
  167. }
  168. ]
  169. },
  170. options: {
  171. scales: {
  172. xAxes: [{ stacked: true }],
  173. yAxes: [{ stacked: true }],
  174. },
  175. legend: {
  176. display: false,
  177. },
  178. layout: {
  179. padding:{
  180. top: 20,
  181. bottom:0,
  182. left : 0,
  183. rigth:0,
  184. }
  185. },
  186. }
  187. });
  188. },
  189. // llamar a la lista
  190. showCustomers: function (e) {
  191. var self = this;
  192. var hoy =moment().format('YYYY-MM-DD');
  193. var partner_id= _.map(self.ranking,function(map){
  194. return map.id;
  195. })
  196. this.do_action({
  197. name:"Listado de clientes con más compras",
  198. type: 'ir.actions.act_window',
  199. res_model: "res.partner",
  200. views: [[false,'list'],[self.modelId[1],'form']],
  201. target: 'current',
  202. domain: [['id', 'in', partner_id]],
  203. context: {},
  204. });
  205. }
  206. });
  207. }