ranking_sales_partner.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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. events: {
  10. 'click canvas': 'showCustomers'
  11. },
  12. init: function (parent) {
  13. this._super(parent, {
  14. width : 6,
  15. height: 4
  16. });
  17. },
  18. start: function () {
  19. var self = this;
  20. self.fetchInitial();
  21. },
  22. fetchInitial:function(){
  23. var self = this;
  24. self.$el.block({
  25. message: null,
  26. overlayCSS: {
  27. backgroundColor: '#FAFAFA'
  28. }
  29. });
  30. self.$el.find('.widget-content.widget-loading').css('display','flex');
  31. self.fecthInvoice().then(function (accountInvoice) {
  32. return accountInvoice;
  33. }).then(function (accountInvoice) {
  34. self.accountInvoice = accountInvoice;
  35. return self.fecthPartner(accountInvoice);
  36. }).then(function (resPartner) {
  37. self.resPartner = resPartner;
  38. return self.fetchProductRanking();
  39. });
  40. },
  41. // Obtener factura
  42. fecthInvoice: function(){
  43. var self = this;
  44. var desde =moment().format('YYYY-MM-01');
  45. var hasta =moment().add(1,'months').format('YYYY-MM-01');
  46. var defer = $.Deferred();
  47. var fields = ['id', 'invoice_line', 'date_invoice','partner_id'];
  48. var domain = [['type', '=', 'out_invoice'], ['date_invoice', '>=', desde], ['date_invoice', '<', hasta], ['state', 'in', ['open','paid']]];
  49. var invoice = new model.web.Model('account.invoice');
  50. invoice.query(fields).filter(domain).all().then(function (results) {
  51. defer.resolve(results);
  52. });
  53. return defer;
  54. },
  55. // Partner
  56. fecthPartner: function(invoice){
  57. var self = this;
  58. var defer = $.Deferred();
  59. var partner_id = _.map(invoice,function(map){
  60. return map.partner_id[0];
  61. });
  62. var fields =['id', 'name'];
  63. var domain =[['id', 'in', partner_id],['active', '=', true],['customer','=',true]];
  64. var resPartner = new model.web.Model('res.partner');
  65. resPartner.query(fields).filter(domain).all().then(function(results){
  66. defer.resolve(results);
  67. });
  68. return defer;
  69. },
  70. // Obtener facturas por cada clientes
  71. getAccountInvoice:function(id_partner){
  72. var self = this;
  73. return _.flatten(_.filter(self.accountInvoice,function (inv) {
  74. return inv.partner_id[0] === id_partner;
  75. }));
  76. },
  77. fetchProductRanking: function(){
  78. var self = this;
  79. var itemPartner;
  80. var itemInvoice;
  81. var countInvoice = 0
  82. var ranking = [];
  83. for (var i = 0; i < self.resPartner.length; i++) {
  84. itemPartner = self.resPartner[i];
  85. itemInvoice = self.getAccountInvoice(itemPartner.id);
  86. countInvoice =_.countBy(_.map(itemInvoice,function(map){
  87. return map.id;
  88. }),function(num){
  89. return num ? 'even': 'odd';
  90. });
  91. ranking.push({ id : itemPartner.id,
  92. name: itemPartner.name,
  93. countInvoice :countInvoice.even
  94. });
  95. }
  96. ranking.sort(function (a, b) {
  97. return b.countInvoice - a.countInvoice
  98. });
  99. self.ranking=ranking;
  100. self.$el.unblock();
  101. self.$el.find('.widget-content.widget-loading').css('display','none');
  102. self.$el.find('.widget-title').find('span').text("Ranking de clientes con más compras en el mes");
  103. self.fetchChart(ranking);
  104. },
  105. // Generar Grafico
  106. fetchChart: function (ranking){
  107. var self = this;
  108. var label = [];
  109. var body = [];
  110. var item;
  111. var rank = 10;
  112. rank= ranking.length;
  113. for (var i = 0; i < rank; i++) {
  114. if (ranking[i]){
  115. item = ranking[i];
  116. }
  117. label.push(item.name);
  118. body.push(item.countInvoice);
  119. }
  120. var chart = new Chart(this.$el.find(".widget-content").find('canvas'), {
  121. type: 'pie',
  122. data: {
  123. labels: label,
  124. datasets: [
  125. {
  126. backgroundColor: ['#01579B','#0277BD','#0288D1','#039BE5','#03A9F4','#29B6F6','#4FC3F7','#81D4FA','#B3E5FC','#E1F5FE'],
  127. data: body,
  128. }
  129. ]
  130. },
  131. options: {
  132. animation: {
  133. animateScale: true,
  134. animateRotate: true
  135. },
  136. maintainAspectRatio: false,
  137. layout: {
  138. padding: 20
  139. },
  140. legend: {
  141. display: false,
  142. },
  143. }
  144. });
  145. // var chart = new Chart(this.$el.find(".widget-content").find('canvas'), {
  146. // // type: 'doughnut',
  147. // type: 'horizontalBar',
  148. // // type: '',
  149. // data: {
  150. // labels: label,
  151. // datasets: [
  152. // {
  153. // backgroundColor: ['#0288d1', '#0288d1', '#0288d1', '#0288d1', '#0288d1', '#0288d1', '#0288d1', '#0288d1', '#0288d1', '#0288d1'],
  154. // data: body,
  155. // }
  156. // ]
  157. // },
  158. // options: {
  159. // maintainAspectRatio: false,
  160. // layout: {
  161. // padding: 20
  162. // },
  163. // scales: {
  164. // xAxes: [{ stacked: true }],
  165. // yAxes: [{ stacked: true }],
  166. // },
  167. // legend: {
  168. // display: false,
  169. // },
  170. // }
  171. // });
  172. },
  173. // llamar a la lista
  174. showCustomers: function (e) {
  175. var self = this;
  176. var hoy =moment().format('YYYY-MM-DD');
  177. var partner_id= _.map(self.ranking,function(map){
  178. return map.id;
  179. })
  180. this.do_action({
  181. name:"Listado de clientes con más compras",
  182. type: 'ir.actions.act_window',
  183. res_model: "res.partner",
  184. views: [[false,'list'],[false,'form']],
  185. target: 'new',
  186. domain: [['id', 'in', partner_id]],
  187. context: {},
  188. flags: {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
  189. });
  190. }
  191. });
  192. }