Quellcode durchsuchen

[ADD] se agrego los widgets para terminal punto de ventas

Rodney Elpidio Enciso Arias vor 7 Jahren
Ursprung
Commit
0fef088ad0

BIN
__init__.pyc


+ 92 - 53
static/src/js/dashboard.js

@@ -2,6 +2,8 @@ function dashboard_widget (instance, widget) {
     "use strict";
 
     var widgets = widget;
+    var InstalledModule = 0;
+    
 
     widget.DashboardWidget = instance.Widget.extend({
         template: 'DashboardTmpl',
@@ -11,6 +13,7 @@ function dashboard_widget (instance, widget) {
                 name: 'CustomerCounterWidget'
             }
         ],
+
         grid: {},
         start: function () {
             this.$el.find('.grid-stack.dashboard').gridstack({
@@ -19,59 +22,95 @@ function dashboard_widget (instance, widget) {
             this.grid = this.$el.find('.grid-stack.dashboard').data('gridstack');
             this.renderWidgets();
         },
-        renderWidgets: function () {
-            // Cliente con Saldo Vencido
-            var wExpiredAccount = new widgets.ExpiredAccountCountersWidget(this);
-            wExpiredAccount.renderElement();
-            wExpiredAccount.start();
-            this.grid.addWidget(wExpiredAccount.$el, 0, 0, wExpiredAccount.size.width,  wExpiredAccount.size.height, true);
-            // Cliente a Cobrar oi
-            var wExpiredAccountNow = new widgets.ExpiredAccountCountersNowWidget(this);
-            wExpiredAccountNow.renderElement();
-            wExpiredAccountNow.start();
-            this.grid.addWidget(wExpiredAccountNow.$el, 0, 0, wExpiredAccountNow.size.width,  wExpiredAccountNow.size.height, true);
-            // Cobros de Hoy
-            var wVocuherToday = new widgets.VoucherTodayCountersWidget(this);
-            wVocuherToday.renderElement();
-            wVocuherToday.start();
-            this.grid.addWidget(wVocuherToday.$el, 0, 0, wVocuherToday.size.width,  wVocuherToday.size.height, true);
-            // Cantidad de Facturas Realizada en el dia
-            var wInvoiceToday = new widgets.InvoiceTodayCountersWidget(this);
-            wInvoiceToday.renderElement();
-            wInvoiceToday.start();
-            this.grid.addWidget(wInvoiceToday.$el, 0, 0, wInvoiceToday.size.width,  wInvoiceToday.size.height, true);
-            //Ranking de Ventas de Producto por Mes
-            var wRankingProduct = new widgets.RankingSalesProductWidget(this);
-            wRankingProduct.renderElement();
-            wRankingProduct.start();
-            this.grid.addWidget(wRankingProduct.$el, 0, 0, wRankingProduct.size.width,  wRankingProduct.size.height, true);
-            //Ranking de clientes que mas compra
-            var wRankingPartner = new widgets.RankingSalesPartnerWidget(this);
-            wRankingPartner.renderElement();
-            wRankingPartner.start();
-            this.grid.addWidget(wRankingPartner.$el, 0, 0, wRankingPartner.size.width,  wRankingPartner.size.height, true);
-            //Gasto por Mes
-            var wMonthlyExpenses = new widgets.MonthlyExpensesWidget(this);
-            wMonthlyExpenses.renderElement();
-            wMonthlyExpenses.start();
-            this.grid.addWidget(wMonthlyExpenses.$el, 0, 0, wMonthlyExpenses.size.width,  wMonthlyExpenses.size.height, true);
-            //Compras por Mes
-            var wMonthlyPurchases = new widgets.MonthlyPurchasesWidget(this);
-            wMonthlyPurchases.renderElement();
-            wMonthlyPurchases.start();
-            this.grid.addWidget(wMonthlyPurchases.$el, 0, 0, wMonthlyPurchases.size.width,  wMonthlyPurchases.size.height, true);
-            //Cantidad de Prodcutos Faltantes
-            var wMissingProduct = new widgets.MissingProductWidget(this);
-            wMissingProduct.renderElement();
-            wMissingProduct.start();
-            this.grid.addWidget(wMissingProduct.$el, 0, 0, wMissingProduct.size.width,  wMissingProduct.size.height, true);
-            // Pagos de  Hoy
-            var wPaymentsToday = new widgets.PaymentsTodayCountersWidget(this);
-            wPaymentsToday.renderElement();
-            wPaymentsToday.start();
-            this.grid.addWidget(wPaymentsToday.$el, 0, 0, wPaymentsToday.size.width,  wPaymentsToday.size.height, true);
-            //
-
+        renderWidgets: function () { 
+            var self = this; 
+            var wExpiredAccount = new widgets.ExpiredAccountCountersWidget(self);          
+            wExpiredAccount.fecthIrModuleModule().then(function(modules){
+                return modules;
+            }).then(function(modules){
+                if(modules.length == 0){
+                    // Cliente con Saldo Vencido
+                    wExpiredAccount.renderElement();
+                    wExpiredAccount.start();
+                    self.grid.addWidget(wExpiredAccount.$el, 0, 0, wExpiredAccount.size.width,  wExpiredAccount.size.height, true);
+                    // Cliente a Cobrar hoy
+                    var wExpiredAccountNow = new widgets.ExpiredAccountCountersNowWidget(self);
+                    wExpiredAccountNow.renderElement();
+                    wExpiredAccountNow.start();
+                    self.grid.addWidget(wExpiredAccountNow.$el, 0, 0, wExpiredAccountNow.size.width,  wExpiredAccountNow.size.height, true);
+                    // Cobros de Hoy
+                    var wVocuherToday = new widgets.VoucherTodayCountersWidget(self);
+                    wVocuherToday.renderElement();
+                    wVocuherToday.start();
+                    self.grid.addWidget(wVocuherToday.$el, 0, 0, wVocuherToday.size.width,  wVocuherToday.size.height, true);
+                    // Cantidad de Facturas Realizada en el dia
+                    var wInvoiceToday = new widgets.InvoiceTodayCountersWidget(self);
+                    wInvoiceToday.renderElement();
+                    wInvoiceToday.start();
+                    self.grid.addWidget(wInvoiceToday.$el, 0, 0, wInvoiceToday.size.width,  wInvoiceToday.size.height, true);
+                    //Ranking de Ventas de Producto por Mes
+                    var wRankingProduct = new widgets.RankingSalesProductWidget(self);
+                    wRankingProduct.renderElement();
+                    wRankingProduct.start();
+                    self.grid.addWidget(wRankingProduct.$el, 0, 0, wRankingProduct.size.width,  wRankingProduct.size.height, true);
+                    //Ranking de clientes que mas compra
+                    var wRankingPartner = new widgets.RankingSalesPartnerWidget(self);
+                    wRankingPartner.renderElement();
+                    wRankingPartner.start();
+                    self.grid.addWidget(wRankingPartner.$el, 0, 0, wRankingPartner.size.width,  wRankingPartner.size.height, true);
+                    //Gasto por Mes
+                    var wMonthlyExpenses = new widgets.MonthlyExpensesWidget(self);
+                    wMonthlyExpenses.renderElement();
+                    wMonthlyExpenses.start();
+                    self.grid.addWidget(wMonthlyExpenses.$el, 0, 0, wMonthlyExpenses.size.width,  wMonthlyExpenses.size.height, true);
+                    //Compras por Mes
+                    var wMonthlyPurchases = new widgets.MonthlyPurchasesWidget(self);
+                    wMonthlyPurchases.renderElement();
+                    wMonthlyPurchases.start();
+                    self.grid.addWidget(wMonthlyPurchases.$el, 0, 0, wMonthlyPurchases.size.width,  wMonthlyPurchases.size.height, true);
+                    //Cantidad de Prodcutos Faltantes
+                    var wMissingProduct = new widgets.MissingProductWidget(self);
+                    wMissingProduct.renderElement();
+                    wMissingProduct.start();
+                    self.grid.addWidget(wMissingProduct.$el, 0, 0, wMissingProduct.size.width,  wMissingProduct.size.height, true);
+                    // Pagos de  Hoy
+                    var wPaymentsToday = new widgets.PaymentsTodayCountersWidget(self);
+                    wPaymentsToday.renderElement();
+                    wPaymentsToday.start();
+                    self.grid.addWidget(wPaymentsToday.$el, 0, 0, wPaymentsToday.size.width,  wPaymentsToday.size.height, true);
+                }else{
+                    // Pedidos de Hoy - Point Of Sale
+                    var wPosOrderToday = new widgets.PosOrderTodayCountersWidget(self);
+                    wPosOrderToday.renderElement();
+                    wPosOrderToday.start();
+                    self.grid.addWidget(wPosOrderToday.$el, 0, 0, wPosOrderToday.size.width,  wPosOrderToday.size.height, true); 
+                    //Gasto por Mes
+                    var wMonthlyExpenses = new widgets.MonthlyExpensesWidget(self);
+                    wMonthlyExpenses.renderElement();
+                    wMonthlyExpenses.start();
+                    self.grid.addWidget(wMonthlyExpenses.$el, 0, 0, wMonthlyExpenses.size.width,  wMonthlyExpenses.size.height, true);
+                    //Compras por Mes
+                    var wMonthlyPurchases = new widgets.MonthlyPurchasesWidget(self);
+                    wMonthlyPurchases.renderElement();
+                    wMonthlyPurchases.start();
+                    self.grid.addWidget(wMonthlyPurchases.$el, 0, 0, wMonthlyPurchases.size.width,  wMonthlyPurchases.size.height, true);
+                    // Pagos de  Hoy
+                    var wPaymentsToday = new widgets.PaymentsTodayCountersWidget(self);
+                    wPaymentsToday.renderElement();
+                    wPaymentsToday.start();
+                    self.grid.addWidget(wPaymentsToday.$el, 0, 0, wPaymentsToday.size.width,  wPaymentsToday.size.height, true);
+                    // Ranking de clientes que mas compran - Point Of Sale
+                    var wRankingPosOrderPartner = new widgets.RankingPosOrdersPartnerWidget(self);
+                    wRankingPosOrderPartner.renderElement();
+                    wRankingPosOrderPartner.start();
+                    self.grid.addWidget(wRankingPosOrderPartner.$el, 0, 0, wRankingPosOrderPartner.size.width,  wRankingPosOrderPartner.size.height, true);
+                    //Ranking de Ventas de Producto por Mes - Point Of Sale
+                    var wRankingPosOrderProduct = new widgets.RankingPosOrdersProductWidget(self);
+                    wRankingPosOrderProduct.renderElement();
+                    wRankingPosOrderProduct.start();
+                    self.grid.addWidget(wRankingPosOrderProduct.$el, 0, 0, wRankingPosOrderProduct.size.width,  wRankingPosOrderProduct.size.height, true);
+                }
+            }); 
         }
     });
 }

+ 18 - 10
static/src/js/main.js

@@ -10,16 +10,24 @@ openerp.eiru_dashboard = function (instance) {
     dashboard_widget(instance, dashboard);
     configuration_widget(instance, dashboard);
     // Widgets
-    expired_account_counters(dashboard);
-    expired_account_counters_now(dashboard);
-    voucher_today_counters(dashboard);
-    invoice_today_counters(dashboard);
-    ranking_sales_product(dashboard);
-    ranking_sales_partner(dashboard);
-    monthly_expenses(dashboard);
-    monthly_purchases(dashboard);
-    missing_product(dashboard);
-    payments_today_counters(dashboard);
+    try{
+        expired_account_counters(dashboard);
+        expired_account_counters_now(dashboard);
+        voucher_today_counters(dashboard);
+        invoice_today_counters(dashboard);
+        ranking_sales_product(dashboard);
+        ranking_sales_partner(dashboard);
+        monthly_expenses(dashboard);
+        monthly_purchases(dashboard);
+        missing_product(dashboard); 
+        payments_today_counters(dashboard);
+        pos_order_today_counters(dashboard);
+        ranking_pos_orders_partner(dashboard);
+        ranking_pos_orders_product(dashboard);
+    }catch(e){
+        // error
+    }
+    
 
     // Action
     instance.web.client_actions.add('eiru_dashboard.action_dashboard', 'instance.eiru_dashboard.DashboardWidget');

+ 25 - 3
static/src/js/widgets/expired_account_counters.js

@@ -11,6 +11,8 @@ function expired_account_counters (widget) {
         resCurrecy: [],
         modelId: [],
         accountInvoice: [],
+        module_list: ['point_of_sale'],
+        newModule: [],
 
         events: {
             'click a': 'showCustomers',
@@ -18,9 +20,10 @@ function expired_account_counters (widget) {
         },
 
         init: function (parent) {
+            var self = this;
             this._super(parent, {
                 width: 3,
-                height: 2
+                height: 2,
             });
         },
 
@@ -28,6 +31,7 @@ function expired_account_counters (widget) {
             var self = this;
             self.fetchInitial();
         },
+
         // Consulta Inicial
         fetchInitial: function() {
             var self = this;
@@ -39,8 +43,12 @@ function expired_account_counters (widget) {
             });
 
             self.$el.find('.widget-content.widget-loading').css('display','flex');
-
-            self.fetchMoveLine().then(function (moveLine) {
+            self.fecthIrModuleModule().then(function(modules){
+                self.modules = modules;
+                return modules;
+            }).then(function(modules){
+                return self.fetchMoveLine()
+            }).then(function (moveLine) {
                 return moveLine;
             }).then(function (moveLine) {
                 self.moveLine = _.filter(moveLine, function(item) {
@@ -60,7 +68,21 @@ function expired_account_counters (widget) {
                 self.modelId= modelId;
                 return self.fetchReduceMoveLine();
             });
+        },        
+
+        // Verificar Modelos Instalados
+        fecthIrModuleModule: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var fields = ['name','id'];
+            var domain=[['state','=','installed'],['name','in',self.module_list]];
+            var irModule = new model.web.Model('ir.module.module');
+            irModule.query(fields).filter(domain).all().then(function(results){
+                defer.resolve(results);
+            })                       
+            return defer;
         },
+
         // getModelId
         fetchGetModelId: function() {
             var self = this;

+ 104 - 0
static/src/js/widgets/pos_order_today_counters.js

@@ -0,0 +1,104 @@
+function pos_order_today_counters(widget) {
+    "use strict";
+
+    var model = openerp;
+
+    widget.PosOrderTodayCountersWidget = widget.Base.extend({
+        template: 'PosOrderTodayCounters',
+        irModelData: [],
+        accountInvoice: [],
+
+        events: {
+            'click a': 'showCustomers',
+            'click h2': 'showCustomers',
+        },
+        init: function (parent) {
+            this._super(parent, {
+                width : 3,
+                height: 2
+            });
+        },
+        start: function () {
+            var self = this;
+            self.fetchInitial();
+        },
+        fetchInitial: function() {
+            var self = this;
+            self.$el.find('#morosidad').block({
+                message: null,
+                overlayCSS: {
+                    backgroundColor: '#FAFAFA'
+                }
+            });
+            self.$el.find('.widget-content.widget-loading').css('display','flex');
+
+            self.fetchPosOrder().then(function (PosOrder) {
+                return PosOrder;
+            }).then(function (PosOrder) {
+                self.PosOrder=PosOrder;
+                return self.fetchGetModelId();
+            }).then(function(irModelData) {
+                self.irModelData=irModelData;
+                return self.fetchReducePosOrder(self.PosOrder);
+            });
+        },
+        // 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');
+
+            getObtjectReference('point_of_sale', 'view_pos_pos_form').then(function(results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        // Invoice
+        fetchPosOrder: function() {
+            var self = this;
+            var defer = $.Deferred();
+            var hoy = moment().format('YYYY-MM-DD h:mm:ss');
+            // console.log(hoy)
+            var fields = ['id', 'name','date_order'];
+            var domain = [['state', 'in', ['paid','done','invoiced']],['date_order', '>=', hoy]];
+            var PosOrder = new model.web.Model('pos.order');
+
+            PosOrder.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+        fetchReducePosOrder: function (PosOrder) {
+            var self = this;
+            var fecha = new Date();
+            var cat = 0;
+
+            if (PosOrder.length > 0) {
+                cat = PosOrder.length;
+            }
+
+            self.$el.find('.widget-content.widget-loading').css('display','none');
+            self.$el.find('.widget-content').find('a').text(accounting.formatNumber(cat, ".", ","));
+            self.$el.find('#morosidad').unblock();
+        },
+        showCustomers: function (e) {
+            var self = this;
+            if (self.PosOrder.length === 0) {
+                model.web.notification.do_warn("Atención","Sin datos");
+                return
+            }
+            var hoy = moment().format('YYYY-MM-DD 00:00:00');
+            this.do_action({
+                name: "Pedidos realizados hoy",
+                type: 'ir.actions.act_window',
+                res_model: "pos.order",
+                views: [[false, 'list'],[self.irModelData[1],'form']],
+                target: 'current',
+                domain: [['state', 'in', ['paid','done','invoiced']],['date_order', '>=', hoy]],
+                context: {},
+            });
+        }
+    });
+}

+ 223 - 0
static/src/js/widgets/ranking_pos_orders_partner.js

@@ -0,0 +1,223 @@
+function ranking_pos_orders_partner (widget) {
+    "use strict";
+
+    var model = openerp;
+
+    widget.RankingPosOrdersPartnerWidget = widget.Base.extend({
+        template: 'RankingPosOrdersPartner',
+        data: [],
+        countPosOrder: [],
+        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.fecthPosOrder().then(function (PosOrder) {
+                return PosOrder;
+            }).then(function (PosOrder) {
+                self.PosOrder = PosOrder;
+                return self.fecthPartner(PosOrder);
+            }).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 Pedidos
+        fecthPosOrder: function() {
+            var self = this;
+            var desde = moment().format('YYYY-MM-01 00:00:00');
+            var hasta = moment().add(1,'months').format('YYYY-MM-01 00:00:00');
+            var defer = $.Deferred();
+            var fields = ['id','date_order','partner_id','amount_total'];
+            var domain = [['state', 'in', ['paid','done','invoiced']], ['partner_id', '!=', false], ['date_order', '>=', desde], ['date_order', '<', hasta]];
+            var PosOrder = new model.web.Model('pos.order');
+            PosOrder.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        // Consultar Clientes
+        fecthPartner: function(PosOrder) {
+            var self = this;
+            var defer = $.Deferred();
+            var partner_id = _.map(PosOrder,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
+        getPosOrder:function(partner_id) {
+            var self = this;
+            return _.flatten(_.filter(self.PosOrder,function (inv) {
+                return inv.partner_id[0] === partner_id;
+            }));
+        },
+        // Generar el Ranking
+        fetchProductRanking: function() {
+            var self = this;
+            var itemPartner;
+            var itemPosOrder;
+            var countPosOrder = 0
+            var ranking = [];
+
+            for (var i = 0; i < self.resPartner.length; i++) {
+                itemPartner = self.resPartner[i];
+                itemPosOrder = self.getPosOrder(itemPartner.id);
+
+                var quantity = _.reduce(_.map(itemPosOrder,function(item) {
+                    return item.amount_total;
+                }),function(memo, num) {
+                    return memo + num;
+                },0);
+
+                ranking.push({
+                    id: itemPartner.id,
+                    name: itemPartner.name,
+                    countPosOrder: quantity
+                });
+            }
+            ranking.sort(function (a, b) {
+                return b.countPosOrder - a.countPosOrder
+            });
+            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 && ranking.length > 0 )
+                rank= ranking.length;
+
+            for (var i = 0; i < rank; i++) {
+                if (ranking[i]) {
+                    item = ranking[i];
+                }
+                if (ranking.length === 0) {
+                    item = {};
+                    item.name = "N/A";
+                    item.countPosOrder = 0;
+                }
+                label.push(item.name);
+                body.push(item.countPosOrder);
+            }
+            // Global method for setting Y axis number format.
+            Chart.scaleService.updateScaleDefaults('linear', {
+              ticks: {
+                callback: function(tick) {
+                    return tick.toLocaleString('de-DE');
+                }
+              }
+            });
+            Chart.defaults.global.tooltips.callbacks.label = function(tooltipItem, data) {
+                var dataset = data.datasets[tooltipItem.datasetIndex];
+                var datasetLabel = dataset.label || '';
+                return datasetLabel +  dataset.data[tooltipItem.index].toLocaleString('de-DE');
+            };
+            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;
+            if (self.ranking.length === 0 ) {
+                model.web.notification.do_warn("Atención","Sin datos");
+                return
+            }
+            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: {},
+            });
+        }
+    });
+}

+ 266 - 0
static/src/js/widgets/ranking_pos_orders_product.js

@@ -0,0 +1,266 @@
+function ranking_pos_orders_product (widget) {
+    "use strict";
+
+    var model = openerp;
+
+    widget.RankingPosOrdersProductWidget = widget.Base.extend({
+        template: 'RankingPosOrdersProduct',
+        data: [],
+        accountInvoice: [],
+        invoiceLine: [],
+        productProduct: [],
+        ranking: [],
+        modelId: [],
+
+        events: {
+            // 'click canvas': 'showCustomers'
+            'click h2': '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.fecthPosOrder().then(function (PosOrder) {
+                return PosOrder;
+            }).then(function (PosOrder) {
+                self.PosOrder = PosOrder;
+                return self.fecthPosOrderLine(PosOrder);
+            }).then(function (PosOrderLine) {
+                self.PosOrderLine = PosOrderLine;
+                return self.fecthProductProduct(PosOrderLine);
+            }).then(function(productProduct){
+                self.productProduct = productProduct;
+                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('product', 'product_normal_form_view')).then(function(results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        // Obtener Pedido
+        fecthPosOrder: function() {
+            var self = this;
+            var desde = moment().format('YYYY-MM-01 00:00:00');
+            var hasta = moment().add(1,'months').format('YYYY-MM-01 00:00:00');
+            var defer = $.Deferred();
+            var fields = ['id', 'lines', 'date_order'];
+            var domain = [['date_order', '>=', desde], ['date_order', '<', hasta], ['state', 'in', ['paid','done','invoiced']]];
+            var PosOrder = new model.web.Model('pos.order');
+            PosOrder.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        // Obtener linea de la factura
+        fecthPosOrderLine: function(PosOrder) {
+            var self = this;
+            var defer = $.Deferred();
+            var lines = _.flatten(_.map(PosOrder, function (item) {
+                return item.lines;
+            }));
+            var fields = ['id', 'product_id', 'qty'];
+            var domain = [['id','in', lines]];
+            var PosOrderLine = new model.web.Model('pos.order.line');
+            PosOrderLine.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        // Obtener Productos
+        fecthProductProduct: function (PosOrderLine) {
+            var self = this;
+            var defer = $.Deferred();
+            var product_id = _.flatten(_.map(PosOrderLine,function (item) {
+                return item.product_id[0];
+            }));
+            var fields = ['id', 'name_template', 'type','attribute_str'];
+            var domain = [['id', 'in', product_id]];
+            var ProductProduct = new model.web.Model('product.product');
+            ProductProduct.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        // get line
+        getPosOrderLine: function (product_id) {
+            var self = this;
+            return _.flatten(_.filter(self.PosOrderLine,function (item) {
+                return item.product_id[0] === product_id
+            }));
+        },
+        // Generear el ranking
+        fetchProductRanking: function() {
+            var self = this;
+            var itemProduct;
+            var itemLine;
+            var ranking = [];
+            var cat = 0;
+            var attribute;
+            var lineUnik;
+            for (var i = 0; i < self.productProduct.length; i++) {
+                itemProduct = self.productProduct[i];
+                itemLine = self.getPosOrderLine(itemProduct.id);
+                if (itemLine.length > 0) {
+                    cat = _.reduce(_.map(itemLine, function (map) {
+                        return map.qty
+                    }), function (meno,num) {
+                        return meno + num
+                    }, 0);
+
+                    lineUnik = itemLine.shift();
+
+                    if(itemProduct.attribute_str){
+                        attribute = '*' + itemProduct.attribute_str;
+                    }else{
+                        attribute = ' ';
+                    }
+                    ranking.push({
+                        product: itemProduct.name_template + ' ' + attribute,
+                        qty: cat,
+                        id: lineUnik.product_id[0],
+                        type: itemProduct.type
+                    });
+                }
+            }
+            ranking.sort(function(a, b) {
+                return b.qty - a.qty
+            });
+            self.$el.unblock();
+            self.$el.find('.widget-content.widget-loading').css('display','none');
+            var fecha = new Date();
+            var meses = new Array ("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
+            self.$el.find('.widget-title').find('span').text("Ranking de productos y servicios del mes de " + meses[fecha.getMonth()]);
+            // self.$el.find('.widget-title').find('span').text("Ranking de productos más vendidos del mes de " + meses[fecha.getMonth()]);
+            self.ranking = ranking;
+            self.fetchChart(ranking);
+        },     
+        // Generar Grafico
+        fetchChart: function (ranking){
+            var self = this;
+            var label = [];
+            var bodyProducto = [];
+            var labelService = [];
+            var bodyService = [];
+            var rank = 7;
+            var item;
+
+            for (var i = 0; i < rank; i++) {
+                if (ranking[i]){
+                    item = ranking[i];
+                }else{
+                    item = {};
+                    item.product = "N/A";
+                    item.qty = 0;
+                }
+                var name = item.product.split('*');
+                if (name.length === 1) {
+                        label.push(name[0]);
+                }else{
+                    label.push(name[0]+"("+name[name.length-1]+")");
+                }
+                if (item.type === 'product'){
+                    bodyService.push(0);
+                    bodyProducto.push(item.qty);
+                }
+                if (item.type === 'service'){
+                    bodyService.push(item.qty);
+                    bodyProducto.push(0);
+                }
+            }
+
+            var chart = new Chart(this.$el.find(".widget-content").find('canvas'), {
+                type: 'bar',
+                data: {
+                    labels: label,
+                    datasets: [
+                        {
+                            label: 'Productos ',
+                             borderWidth: 1,
+                            backgroundColor: [  '#EF5350', '#EC407A', '#AB47BC', '#7E57C2', '#5C6BC0', '#42A5F5', '#26C6DA', '#26A69A', '#66BB6A', '#9CCC65'],
+                            data: bodyProducto,
+                        },
+                        {
+                            label: 'Servicios ',
+                             borderWidth: 1,
+                            backgroundColor: [  '#EF5350', '#EC407A', '#AB47BC', '#7E57C2', '#5C6BC0', '#42A5F5', '#26C6DA', '#26A69A', '#66BB6A', '#9CCC65'],
+                            data: bodyService,
+                        }
+                    ]
+                },
+                options: {
+                    tooltips: {
+                       mode: 'index',
+                       intersect: true
+                   },
+                   legend: {
+                       labels: {
+                           boxWidth: 10,
+                           fontSize: 12,
+                       },
+                       position: 'left',
+                   },
+                    layout: {
+                        padding: {
+                            top: 20,
+                            bottom: 0,
+                            left: 0,
+                            rigth: 0,
+                        }
+                    },
+                }
+            });
+        },
+        showCustomers: function (e) {
+            var self = this;
+            if (self.ranking.length === 0){
+                model.web.notification.do_warn("Atención","Sin datos");
+                return
+            }
+            var hoy = moment().format('YYYY-MM-DD');
+
+            var product_id = _.map(self.ranking,function(map){
+                return map.id;
+            })
+            this.do_action({
+                name:"Listado de productos más vendidos",
+                type: 'ir.actions.act_window',
+                res_model: "product.product",
+                views: [[false, 'list'],[self.modelId[1],'form']],
+                target: 'current',
+                domain: [['id', 'in', product_id]],
+                context: {},
+            });
+        }
+    });
+}

+ 23 - 0
static/src/xml/widgets/pos_order_today_counters.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<template xml:space="preserve">
+    <t t-name="PosOrderTodayCounters">
+        <div>
+            <div class="grid-stack-item-content dashboard">
+                <h2 class="widget-title">
+                    <i class="fa fa-files-o" aria-hidden="true"></i>
+                    Has realizado hoy
+                </h2>
+                <div class="widget-content">
+                    <a></a>
+                </div>
+                <div class="widget-footer">
+                    <span>Pedidos</span>
+                </div>
+                <div class="widget-content widget-loading">
+                    <i class='fa fa-cog fa-spin fa-3x fa-fw'></i>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 18 - 0
static/src/xml/widgets/ranking_pos_orders_partner.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<template xml:space="preserve">
+    <t t-name="RankingPosOrdersPartner">
+        <t t-call="WidgetBaseTmpl">
+            <h2  class="widget-title">
+                <i class="fa fa-bar-chart" aria-hidden="true"></i>
+                <span>Ranking de clientes con más compras en el mes</span>
+            </h2>
+            <div class="widget-content">
+                <canvas></canvas>
+            </div>
+            <div class="widget-content widget-loading">
+                <i class='fa fa-cog fa-spin fa-3x fa-fw'></i>
+            </div>
+        </t>
+    </t>
+</template>

+ 17 - 0
static/src/xml/widgets/ranking_pos_orders_product.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="RankingPosOrdersProduct">
+        <t t-call="WidgetBaseTmpl">
+            <h2  class="widget-title">
+                <i class="fa fa-bar-chart" aria-hidden="true"></i>
+                <span>Ranking de productos y servicios</span>
+            </h2>
+            <div class="widget-content">
+                <canvas></canvas>
+            </div>
+            <div class="widget-content widget-loading">
+                <i class='fa fa-cog fa-spin fa-3x fa-fw'></i>
+            </div>
+        </t>
+    </t>
+</template>

+ 5 - 0
templates.xml

@@ -25,6 +25,11 @@
                 <script type="text/javascript" src="/eiru_dashboard/static/src/js/widgets/payments_today_counters.js" />
                 <script type="text/javascript" src="/eiru_dashboard/static/src/js/widgets/ranking_sales_partner.js" />
 
+                <!-- Point Of Sale -->
+                <script type="text/javascript" src="/eiru_dashboard/static/src/js/widgets/pos_order_today_counters.js" />
+                <script type="text/javascript" src="/eiru_dashboard/static/src/js/widgets/ranking_pos_orders_partner.js" />
+                 <script type="text/javascript" src="/eiru_dashboard/static/src/js/widgets/ranking_pos_orders_product.js" />
+
                 <!-- Dashboard Main  -->
                 <script type="text/javascript" src="/eiru_dashboard/static/src/js/dashboard.js" />
                 <script type="text/javascript" src="/eiru_dashboard/static/src/js/configuration.js" />