ranking_sales_partner.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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)
  133. rank= ranking.length;
  134. for (var i = 0; i < rank; i++) {
  135. if (ranking[i]){
  136. item = ranking[i];
  137. }
  138. label.push(item.name);
  139. body.push(item.countInvoice);
  140. }
  141. var chart = new Chart(this.$el.find(".widget-content").find('canvas'), {
  142. type: 'bar',
  143. data: {
  144. labels: label,
  145. datasets: [
  146. {
  147. backgroundColor: [ '#EF5350', '#F06292', '#AB47BC', '#7E57C2', '#5C6BC0', '#42A5F5', '#26C6DA', '#26A69A', '#66BB6A', '#9CCC65'],
  148. data: body,
  149. }
  150. ]
  151. },
  152. options: {
  153. scales: {
  154. xAxes: [{ stacked: true }],
  155. yAxes: [{ stacked: true }],
  156. },
  157. legend: {
  158. display: false,
  159. },
  160. layout: {
  161. padding:{
  162. top: 20,
  163. bottom:0,
  164. left : 0,
  165. rigth:0,
  166. }
  167. },
  168. }
  169. });
  170. },
  171. // llamar a la lista
  172. showCustomers: function (e) {
  173. var self = this;
  174. var hoy =moment().format('YYYY-MM-DD');
  175. var partner_id= _.map(self.ranking,function(map){
  176. return map.id;
  177. })
  178. this.do_action({
  179. name:"Listado de clientes con más compras",
  180. type: 'ir.actions.act_window',
  181. res_model: "res.partner",
  182. views: [[false,'list'],[self.modelId[1],'form']],
  183. target: 'current',
  184. domain: [['id', 'in', partner_id]],
  185. context: {},
  186. });
  187. }
  188. });
  189. }