123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- function ranking_sales_partner (widget) {
- "use strict";
- var model= openerp;
- widget.RankingSalesPartnerWidget = widget.Base.extend({
- template: 'RankingSalesPartner',
- data : [],
- accountInvoice : [],
- resPartner : [],
- modelId:[],
- events: {
- 'click canvas': 'showCustomers'
- },
- init: function (parent) {
- this._super(parent, {
- width : 6,
- height: 4
- });
- },
- start: function () {
- var self = this;
- self.fetchInitial();
- },
- fetchInitial:function(){
- var self = this;
- self.$el.block({
- message: null,
- overlayCSS: {
- backgroundColor: '#FAFAFA'
- }
- });
- self.$el.find('.widget-content.widget-loading').css('display','flex');
- self.fecthInvoice().then(function (accountInvoice) {
- return accountInvoice;
- }).then(function (accountInvoice) {
- self.accountInvoice = accountInvoice;
- return self.fecthPartner(accountInvoice);
- }).then(function (resPartner) {
- self.resPartner = resPartner;
- return self.fetchGetModelId();
- }).then(function(modelId){
- self.modelId = modelId;
- return self.fetchProductRanking();
- });
- },
- // getModelId
- fetchGetModelId: function(){
- var self = this;
- var defer = $.Deferred();
- var irModelData = new model.web.Model('ir.model.data');
- var getObtjectReference = irModelData.get_func('get_object_reference');
- this.alive(getObtjectReference('base', 'view_partner_form')).then(function(results){
- defer.resolve(results);
- });
- return defer;
- },
- // Obtener factura
- fecthInvoice: function(){
- var self = this;
- var desde =moment().format('YYYY-MM-01');
- var hasta =moment().add(1,'months').format('YYYY-MM-01');
- var defer = $.Deferred();
- var fields = ['id', 'invoice_line', 'date_invoice','partner_id','amount_total'];
- var domain = [['type', '=', 'out_invoice'], ['date_invoice', '>=', desde], ['date_invoice', '<', hasta], ['state', 'in', ['open','paid']]];
- var invoice = new model.web.Model('account.invoice');
- invoice.query(fields).filter(domain).all().then(function (results) {
- defer.resolve(results);
- });
- return defer;
- },
- // Partner
- fecthPartner: function(invoice){
- var self = this;
- var defer = $.Deferred();
- var partner_id = _.map(invoice,function(map){
- return map.partner_id[0];
- });
- var fields =['id', 'name'];
- var domain =[['id', 'in', partner_id],['active', '=', true],['customer','=',true]];
- var resPartner = new model.web.Model('res.partner');
- resPartner.query(fields).filter(domain).all().then(function(results){
- defer.resolve(results);
- });
- return defer;
- },
- // Obtener facturas por cada clientes
- getAccountInvoice:function(id_partner){
- var self = this;
- return _.flatten(_.filter(self.accountInvoice,function (inv) {
- return inv.partner_id[0] === id_partner;
- }));
- },
- fetchProductRanking: function(){
- var self = this;
- var itemPartner;
- var itemInvoice;
- var countInvoice = 0
- var ranking = [];
- for (var i = 0; i < self.resPartner.length; i++) {
- itemPartner = self.resPartner[i];
- itemInvoice = self.getAccountInvoice(itemPartner.id);
- // countInvoice =_.countBy(_.map(itemInvoice,function(map){
- // return map.id;
- // }),function(num){
- // return num ? 'even': 'odd';
- // });
- var quantity = _.reduce(_.map(itemInvoice,function(item){
- return item.amount_total;
- }),function(memo, num){
- return memo + num;
- },0);
- ranking.push({ id : itemPartner.id,
- name : itemPartner.name,
- countInvoice : quantity
- });
- }
- ranking.sort(function (a, b) {
- return b.countInvoice - a.countInvoice
- });
- self.ranking=ranking;
- self.$el.unblock();
- self.$el.find('.widget-content.widget-loading').css('display','none');
- self.$el.find('.widget-title').find('span').text("Ranking de clientes con más compras en el mes");
- self.fetchChart(ranking);
- },
- // Generar Grafico
- fetchChart: function (ranking){
- var self = this;
- var label = [];
- var body = [];
- var item;
- var rank = 5;
- if (ranking.length < rank)
- rank= ranking.length;
- for (var i = 0; i < rank; i++) {
- if (ranking[i]){
- item = ranking[i];
- }
- label.push(item.name);
- body.push(item.countInvoice);
- }
- var chart = new Chart(this.$el.find(".widget-content").find('canvas'), {
- type: 'bar',
- data: {
- labels: label,
- datasets: [
- {
- backgroundColor: [ '#EF5350', '#F06292', '#AB47BC', '#7E57C2', '#5C6BC0', '#42A5F5', '#26C6DA', '#26A69A', '#66BB6A', '#9CCC65'],
- data: body,
- }
- ]
- },
- options: {
- scales: {
- xAxes: [{ stacked: true }],
- yAxes: [{ stacked: true }],
- },
- legend: {
- display: false,
- },
- layout: {
- padding:{
- top: 20,
- bottom:0,
- left : 0,
- rigth:0,
- }
- },
- }
- });
- },
- // llamar a la lista
- showCustomers: function (e) {
- var self = this;
- var hoy =moment().format('YYYY-MM-DD');
- var partner_id= _.map(self.ranking,function(map){
- return map.id;
- })
- this.do_action({
- name:"Listado de clientes con más compras",
- type: 'ir.actions.act_window',
- res_model: "res.partner",
- views: [[false,'list'],[self.modelId[1],'form']],
- target: 'current',
- domain: [['id', 'in', partner_id]],
- context: {},
- });
- }
- });
- }
|