Browse Source

ADD FIX Actualización de eiru reporting filtros y nuevos reportes para restaurant y nuevos filtros

Sebas 7 years ago
parent
commit
bbf5c13bdc

+ 4 - 0
__openerp__.py

@@ -20,13 +20,17 @@
         'static/src/reports/report_project.xml',
         'static/src/reports/report_works.xml',
         'static/src/reports/report_invoice_balance.xml',
+        'static/src/reports/report_ranking_pos_orders_customer.xml',
         'static/src/reports/report_vouchers.xml',
         'static/src/reports/report_mrp.xml',
+        'static/src/reports/report_pos_orders.xml',
         'static/src/reports/reporting_accountpending.xml',
         'static/src/reports/reporting_account.xml',
         'static/src/reports/report_sales_invoice_analysis.xml',
         'static/src/reports/report_purchases_invoice_analysis.xml',
         'static/src/reports/report_product_utility.xml',
+        'static/src/reports/ranking_pos_orders_product_cy.xml',
+        'static/src/reports/ranking_purchases_orders_product_cy.xml',
         'static/src/reports/report_mrp.xml',
         'static/src/reports/report_stock.xml'
     ]

+ 25 - 15
static/src/js/configuration_reporting.js

@@ -18,11 +18,6 @@ function configuration_reporting (instance, widget) {
                 description: 'Permite visualizar de forma global los egresos realizado por la empresa.',
                 action: 'ReportResumenEngreso'
             },
-            // {
-            //    title: 'Balance de sumas y saldos',
-            //    description: 'Permite visualizar un balance de Ingreso y Egreso',
-            //    action: 'ReportBalance'
-            // },
             {
                 title: 'Histórico de Pagos',
                 description: 'Permite visualizar de todos los pagos.',
@@ -39,25 +34,35 @@ function configuration_reporting (instance, widget) {
                 action: 'ReportSaleInvoiceAnalysis'
             },
             {
-                title: 'Análisis de Punto de Venta',
-                description: 'Permite realizar un analisis de las venta en punto de venta.',
+                title: 'Histórico de Punto de Venta',
+                description: 'Permite realizar un listado de la cabecera de ventas en punto de venta.',
                 action: 'ReportPos'
             },
-            // {
-            //     title: 'Ranking Productos más Vendidos de Punto de Venta',
-            //     description: 'Permite realizar un analisis de los Productos más Vendidos de Punto de Venta.',
-            //     action: 'RankingPosOrdersProductcy'
-            // },
             {
-                title: 'Informe de Trabajos',
-                description: 'Permite visualizar los trabajos facturados y no facturados.',
-                action: 'ReportWorks'
+                title: 'Analisis de ventas (POS)',
+                description: 'Permite visualizar de forma global los ingresos obtenidos por la empresa.',
+                action: 'ReportPosOrders'
+            },
+            {
+                title: 'Ranking Productos más Vendidos de Punto de Venta',
+                description: 'Permite realizar un analisis de los Productos más Vendidos de Punto de Venta.',
+                action: 'RankingPosOrdersProductcy'
+            },
+            {
+                title: 'Ranking de Clientes (PointOfSale)',
+                description: 'Permite visualizar el ranking de clientes.',
+                action: 'ReportRankingPosOrdersCustomer'
             },
             {
                 title: 'Análisis de Compras y Gastos',
                 description: 'Permite realizar un analisis de las facturas de compra y de gastos',
                 action: 'ReportPurchaseInvoiceAnalysis'
             },
+            {
+                title: 'Ranking Productos más Comprados',
+                description: 'Permite realizar un analisis de los Productos más Comprados.',
+                action: 'RankingPurchasesOrdersProductcy'
+            },
             {
                 title: 'Análisis de Stock',
                 description: 'Permite realizar un analisis de los productos disponibles en el stock.',
@@ -93,6 +98,11 @@ function configuration_reporting (instance, widget) {
                 description: 'Permite visualizar un listado de cuentas a cobrar.',
                 action: 'ReportingAccountPending'
             },
+            {
+                title: 'Informe de Trabajos',
+                description: 'Permite visualizar los trabajos facturados y no facturados.',
+                action: 'ReportWorks'
+            },
             {
                 title: 'Listado de Producción',
                 description: 'Permite visualizar un listado de producción.',

+ 4 - 2
static/src/js/main.js

@@ -25,11 +25,13 @@ openerp.eiru_reporting = function (instance) {
         report_project(reporting);
         reporting_account(reporting);
         reporting_accountpending(reporting);
-        // report_balance(reporting);
         report_works(reporting);
         report_pos(reporting);
         report_mrp(reporting);
-        // ranking_pos_orders_product_cy(reporting);
+	    report_ranking_pos_orders_customer(reporting);
+        ranking_pos_orders_product_cy(reporting);
+        ranking_purchases_orders_product_cy(reporting);
+        report_pos_orders(reporting);
 
     } catch (e) {
 

+ 120 - 90
static/src/js/reports/ranking_pos_orders_product_cy.js

@@ -9,6 +9,7 @@ function ranking_pos_orders_product_cy (reporting) {
         accountInvoice: [],
         invoiceLine: [],
         productProduct: [],
+        productAtributo: [],
         ranking: [],
         content: [],
         modelId: [],
@@ -99,7 +100,8 @@ function ranking_pos_orders_product_cy (reporting) {
                 return self.fecthProductProduct(PosOrderLine);
             }).then(function(productProduct){
                 self.productProduct = productProduct;
-                return self.fetchProductRanking();
+                self.search();
+                return self.BuildTable();
             });
         },
 
@@ -154,8 +156,6 @@ function ranking_pos_orders_product_cy (reporting) {
         // 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 modules = self.checkModel('point_of_sale');
 
@@ -165,8 +165,9 @@ function ranking_pos_orders_product_cy (reporting) {
             }
 
             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');
+            // var domain = [['date_order', '>=', desde], ['date_order', '<', hasta], ['state', 'in', ['paid','done','invoiced']]];
+            var domain = [ ['state', 'in', ['paid','done','invoiced']]];
+            var PosOrder = new instance.web.Model('pos.order');
             PosOrder.query(fields).filter(domain).all().then(function (results) {
                 defer.resolve(results);
             });
@@ -180,9 +181,9 @@ function ranking_pos_orders_product_cy (reporting) {
             var lines = _.flatten(_.map(PosOrder, function (item) {
                 return item.lines;
             }));
-            var fields = ['id', 'product_id', 'qty'];
+            var fields = ['id', 'product_id', 'create_date', 'qty'];
             var domain = [['id','in', lines]];
-            var PosOrderLine = new model.web.Model('pos.order.line');
+            var PosOrderLine = new instance.web.Model('pos.order.line');
             PosOrderLine.query(fields).filter(domain).all().then(function (results) {
                 defer.resolve(results);
             });
@@ -196,24 +197,88 @@ function ranking_pos_orders_product_cy (reporting) {
             var product_id = _.flatten(_.map(PosOrderLine,function (item) {
                 return item.product_id[0];
             }));
-            var fields = ['id', 'name_template', 'type','attribute_str'];
+            var fields = ['id', 'name','name_template', 'type', 'ean13','attribute_str'];
             var domain = [['id', 'in', product_id]];
-            var ProductProduct = new model.web.Model('product.product');
+            var ProductProduct = new instance.web.Model('product.product');
             ProductProduct.query(fields).filter(domain).all().then(function (results) {
                 defer.resolve(results);
             });
 
             return defer;
         },
+
+        valorNull:function(dato){
+            var valor ="";
+            if (dato){
+                valor=dato;
+            }
+            return valor;
+        },
+
         // get line
-        getPosOrderLine: function (product_id) {
+        // getPosOrderLine: function (product_id) {
+        //     var self = this;
+        //     return _.flatten(_.filter(self.PosOrderLine,function (item) {
+        //         return item.product_id[0] === product_id
+        //     }));
+        // },
+
+        // Obtener facturas por cada clientes
+        getPosOrderLiners:function(product_id) {
             var self = this;
-            return _.flatten(_.filter(self.PosOrderLine,function (item) {
-                return item.product_id[0] === product_id
+            var desde = self.$el.find('#from').val();
+            var hasta = self.$el.find('#to').val();
+            var PosOrderLine = self.PosOrderLine;
+            // Hoy
+            if ($('#A').is(":checked")){
+                PosOrderLine = _.filter(PosOrderLine, function (inv){
+                    return moment(inv.create_date).format('YYYY-MM-DD') == moment().format('YYYY-MM-DD');
+                });
+            }
+            // Ayer
+            if ($('#B').is(":checked")){
+                PosOrderLine = _.filter(PosOrderLine, function (inv){
+                    return moment(inv.create_date).format('YYYY-MM-DD') == moment().add(-1,'days').format('YYYY-MM-DD');
+                });
+            }
+            // Mes Actual
+            if ($('#C').is(":checked")){
+                PosOrderLine = _.filter(PosOrderLine, function (inv){
+                    return moment(inv.create_date).format('MM') == moment().format('MM');
+                });
+            }
+            // Mes Pasado
+            if ($('#D').is(":checked")){
+                PosOrderLine = _.filter(PosOrderLine, function (inv){
+                    return moment(inv.create_date).format('MM') == moment().add(-1,'months').format('MM');
+                });
+            }
+            // Rango de fechas
+            if ($('#Z').is(":checked")){
+                $('#datepicker').css('display','block');
+                if (desde.length > 0){
+                    var date = desde.split('/');
+                    PosOrderLine = _.filter(PosOrderLine, function (inv){
+                        return moment(inv.create_date).format('YYYY-MM-DD') >= (date[2]+"-"+date[1]+"-"+date[0]);
+                    });
+                }
+                if (hasta.length > 0){
+                    var date= hasta.split('/');
+                    PosOrderLine = _.filter(PosOrderLine, function (inv){
+                        return moment(inv.create_date).format('YYYY-MM-DD') <= (date[2]+"-"+date[1]+"-"+date[0]);
+                    });
+                }
+            }else{
+                $('#datepicker').css('display','none');
+            }
+
+            return _.flatten(_.filter(PosOrderLine,function (inv) {
+                return inv.product_id[0] === product_id;
             }));
         },
-        // Generear el ranking
-        fetchProductRanking: function() {
+
+        // Generar el ranking
+        BuildTable: function() {
             var self = this;
             var itemProduct;
             var itemLine;
@@ -221,10 +286,10 @@ function ranking_pos_orders_product_cy (reporting) {
             var cat = 0;
             var attribute;
             var lineUnik;
-            console.log(self.productProduct);
+
             for (var i = 0; i < self.productProduct.length; i++) {
                 itemProduct = self.productProduct[i];
-                itemLine = self.getPosOrderLine(itemProduct.id);
+                itemLine = self.getPosOrderLiners(itemProduct.id);
                 if (itemLine.length > 0) {
                     cat = _.reduce(_.map(itemLine, function (map) {
                         return map.qty
@@ -239,101 +304,66 @@ function ranking_pos_orders_product_cy (reporting) {
                     }else{
                         attribute = ' ';
                     }
+
                     ranking.push({
                         product: itemProduct.name_template + ' ' + attribute,
                         qty: cat,
                         id: lineUnik.product_id[0],
+                        date: moment(itemLine.create_date).format("YYYY-MM-DD"),
                         type: itemProduct.type
                     });
                 }
             }
 
+            ranking.sort(function (a, b) {
+                return b.countPosOrder - a.countPosOrder
+            });
 
-            // ranking.sort(function(a, b) {
-            //     return b.qty - a.qty
-            // });
+            self.content = ranking;
+            this.loadTable(ranking);
 
-            self.content = data;
-            this.loadTable(data);
-            // 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.ranking = ranking;
-            // self.fetchChart(ranking);
+        },
+
+        search: function () {
+            var self = this;
+            var results = self.productProduct;
+            results = _.map(results, function (item) {
+                return {
+                        label: item.id + '- '+ ' [ ' + self.valorNull(item.ean13) + ' ] ' + item.name + ' ( ' +  self.valorNull(item.attribute_str) + ' ) ' ,
+                        value: item.id + '- '+ ' [ ' + self.valorNull(item.ean13) + ' ] ' + item.name + ' ( ' +  self.valorNull(item.attribute_str) + ' ) '
+                }
+            });
+            self.$('#product').autocomplete({
+                source: results,
+                minLength:0,
+                search: function(event, ui) {
+                    if (!(self.$('#product').val())){
+                        self.factSearch();
+                    }
+                },
+                close: function( event, ui ) {
+                        self.factSearch();
+                },
+                select: function(event, ui) {
+                    self.factSearch();
+                }
+            });
         },
 
         factSearch: function(){
             var self = this;
-            var hoy = moment().format('YYYY-MM-DD');
-            var desde =this.$el.find('#from').val();
-            var hasta =this.$el.find('#to').val();
+            var product= this.$el.find('#product').val().split('-');
             var content = self.content;
-
-            if ($('#A').is(":checked")){
-                content = _.filter(content, function (inv){
-                    return inv.date == hoy;
-                });
-            }
-            if ($('#B').is(":checked")){
-                var date = hoy.split('-');
-                var ayer = date[2] - 1;
-                date.splice(2,0);
-                date[2] = '0'+ayer;
-                content = _.filter(content, function (inv){
-                    return inv.date == date[0]+'-'+date[1]+'-'+date[2];
-                });
-            }
-            if ($('#C').is(":checked")){
-                var date = hoy.split('-');
-                content = _.filter(content, function (inv){
-                    var mes = inv.date.split('-');
-                    return mes[0]+'-'+mes[1] == date[0]+'-'+date[1];
+            if (product != ""){
+                content = _.filter(content, function(inv){
+                    return inv.id == product[0];
                 });
             }
-            if ($('#D').is(":checked")){
-                var date = hoy.split('-');
-                var mes = date[1] - 1;
-                var year;
-                date.splice(1,0);
-                if(date[1] == 1){
-                    date[1] = '12';
-                    year = date[0] - 1;
-                    date[0] = year;
-                }else{
-
-                 if(date[1] < 10){
-                     date[1] = '0'+mes;
-                 }else{
-                     date[1] = mes;
-                 }
-                }
-                content = _.filter(content, function (inv){
-                    var mes = inv.date.split('-');
-                    return mes[0]+'-'+mes[1] == date[0]+'-'+date[1];
-                });
-            }
-            if ($('#Z').is(":checked")){
-                $('#datepicker').css('display','block');
-                if (desde.length > 0){
-                    var date= desde.split('/');
-                    content = _.filter(content, function (inv){
-                        return inv.date >= (date[2]+"-"+date[1]+"-"+date[0]);
-                    });
-                }
-                if (hasta.length > 0){
-                    var date= hasta.split('/');
-                    content = _.filter(content, function (inv){
-                        return inv.date <= (date[2]+"-"+date[1]+"-"+date[0]);
-                    });
-                }
-            }else{
-                $('#datepicker').css('display','none');
-            }
 
+            self.BuildTable();
             self.loadTable(content)
         },
+
         loadTable:function(rowsTable){
             var self = this;
             self.rowsData = rowsTable;

+ 450 - 0
static/src/js/reports/ranking_purchases_orders_product_cy.js

@@ -0,0 +1,450 @@
+function ranking_purchases_orders_product_cy (reporting) {
+    "use strict";
+
+    var instance = openerp;
+
+    reporting.RankingPurchasesOrdersProductcyWidget = reporting.Base.extend({
+        template: 'RankingPurchasesOrdersProductcy',
+        data: [],
+        accountInvoice: [],
+        invoiceLine: [],
+        productProduct: [],
+        productAtributo: [],
+        ranking: [],
+        content: [],
+        modelId: [],
+
+        events:{
+            'click #toolbar > button' : 'clickOnAction',
+            'click #X' : 'factSearch',
+            'click #A' : 'factSearch',
+            'click #B' : 'factSearch',
+            'click #C' : 'factSearch',
+            'click #D' : 'factSearch',
+            'click #Z' : 'factSearch',
+
+            'click #Y' : 'factSearch',
+            'change #from' : 'factSearch',
+            'change #to' : 'factSearch',
+            'click-row.bs.table #table ' : 'clickAnalysisDetail',
+        },
+        init : function(parent){
+            this._super(parent);
+        },
+        start: function () {
+            var self = this;
+            var table = this.$el.find('#table');
+            table.bootstrapTable({data : self.rowsData});
+            this.fecthFecha();
+            this.submitForm();
+        },
+
+        // Redirecionar
+        renderReport: function () {
+            var self = this;
+
+            var container = this.$el.closest('.oe_form_sheet.oe_form_sheet_width');
+            this.$el.closest('.report_view').remove();
+            container.find('.report_view').show({
+                effect: 'fade',
+                duration: 200,
+            });
+        },
+        // Verificar el modelo
+        checkModel : function(model){
+            var self = this;
+            return _.filter(self.modules,function(item){return item.name === model});
+        },
+        // Lanzar el mensaje
+        showMensaje : function(modelos){
+            var self = this;
+            $("#dialog" ).dialog({
+                autoOpen: true,
+                resizable: false,
+                modal: true,
+                title: 'Atención',
+                width: 500,
+                open: function() {
+                    $(this).html('Reporte in-disponible, contacte con el administrador del sistema ref : '+modelos);
+                },
+                show: {
+                    effect: "fade",
+                    duration: 200
+                },
+                hide: {
+                    effect: "fade",
+                    duration: 200
+                },
+                buttons: {
+                    Aceptar: function() {
+                        $(this).dialog('close');
+                        self.renderReport()
+                    }
+                }
+            });
+            return
+        },
+
+        submitForm: function () {
+            var self = this;
+            self.fecthIrModuleModule().then(function(modules){
+                self.modules = modules;
+                return modules;
+            }).then(function(modules){
+                return self.fecthPurchasesOrder();
+            }).then(function (PurchasesOrder) {
+                self.PurchasesOrder = PurchasesOrder;
+                return self.fecthPurchasesOrderLine(PurchasesOrder);
+            }).then(function (PurchasesOrderLine) {
+                self.PurchasesOrderLine = PurchasesOrderLine;
+                return self.fecthProductProduct(PurchasesOrderLine);
+            }).then(function(productProduct){
+                self.productProduct = productProduct;
+                self.search();
+                return self.BuildTable();
+            });
+        },
+
+        // Modelos instalados
+        fecthIrModuleModule: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var fields = ['name','id'];
+            var domain=[['state','=','installed']];
+            var irModule = new instance.web.Model('ir.module.module');
+
+            irModule.query(fields).filter(domain).all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        fecthFecha: function() {
+            var to;
+            var dateFormat1 = "mm/dd/yy",
+            from = $( "#from" )
+            .datepicker({
+                dateFormat: "dd/mm/yy",
+                changeMonth: true,
+                numberOfMonths: 1,
+            })
+            .on( "change", function() {
+                to.datepicker( "option", "minDate", getDate(this), "dd/mm/yyyy");
+            });
+            to = $( "#to" ).datepicker({
+                dateFormat: "dd/mm/yy",
+                defaultDate: "+7d",
+                changeMonth: true,
+                numberOfMonths: 1,
+            })
+            .on( "change", function() {
+                from.datepicker( "option", "maxDate", getDate(this));
+            });
+
+            function getDate( element ) {
+                var fechaSel =element.value.split('/');
+                var date;
+                try {
+                    date = $.datepicker.parseDate( dateFormat1, (fechaSel[1]+"/"+fechaSel[0]+"/"+fechaSel[2]));
+                } catch( error ) {
+                    date = null;
+                }
+                return date;
+            }
+        },
+
+        // Obtener Pedido
+        fecthPurchasesOrder: function() {
+            var self = this;
+            var defer = $.Deferred();
+            var modules = self.checkModel('purchase');
+
+            if (modules.length <= 0){
+                self.showMensaje('purchase');
+                return defer;
+            }
+
+            var fields = ['id', 'order_line', 'date_order', 'state' ];
+            // var domain = [['date_order', '>=', desde], ['date_order', '<', hasta], ['state', 'in', ['paid','done','invoiced']]];
+            var domain = [ ['state', 'in', ['approved','done','invoiced']]];
+            var PurchasesOrder = new instance.web.Model('purchase.order');
+            PurchasesOrder.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        // Obtener linea de la factura
+        fecthPurchasesOrderLine: function(PurchasesOrder) {
+            var self = this;
+            var defer = $.Deferred();
+            var order_line = _.flatten(_.map(PurchasesOrder, function (item) {
+                return item.order_line;
+            }));
+            var fields = ['id', 'product_id', 'create_date', 'product_qty'];
+            var domain = [['id','in', order_line]];
+            var PurchasesOrderLine = new instance.web.Model('purchase.order.line');
+            PurchasesOrderLine.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        // Obtener Productos
+        fecthProductProduct: function (PurchasesOrderLine) {
+            var self = this;
+            var defer = $.Deferred();
+            var product_id = _.flatten(_.map(PurchasesOrderLine,function (item) {
+                return item.product_id[0];
+            }));
+            var fields = ['id', 'name','name_template','ean13', 'attribute_str'];
+            var domain = [['id', 'in', product_id]];
+            var ProductProduct = new instance.web.Model('product.product');
+            ProductProduct.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+
+        valorNull:function(dato){
+            var valor ="";
+            if (dato){
+                valor=dato;
+            }
+            return valor;
+        },
+
+        // Obtener facturas por cada productos
+        getPurchasesOrderLiners:function(product_id) {
+            var self = this;
+            var desde = self.$el.find('#from').val();
+            var hasta = self.$el.find('#to').val();
+            var PurchasesOrderLine = self.PurchasesOrderLine;
+            // Hoy
+            if ($('#A').is(":checked")){
+                PurchasesOrderLine = _.filter(PurchasesOrderLine, function (inv){
+                    return moment(inv.create_date).format('YYYY-MM-DD') == moment().format('YYYY-MM-DD');
+                });
+            }
+            // Ayer
+            if ($('#B').is(":checked")){
+                PurchasesOrderLine = _.filter(PurchasesOrderLine, function (inv){
+                    return moment(inv.create_date).format('YYYY-MM-DD') == moment().add(-1,'days').format('YYYY-MM-DD');
+                });
+            }
+            // Mes Actual
+            if ($('#C').is(":checked")){
+                PurchasesOrderLine = _.filter(PurchasesOrderLine, function (inv){
+                    return moment(inv.create_date).format('MM') == moment().format('MM');
+                });
+            }
+            // Mes Pasado
+            if ($('#D').is(":checked")){
+                PurchasesOrderLine = _.filter(PurchasesOrderLine, function (inv){
+                    return moment(inv.create_date).format('MM') == moment().add(-1,'months').format('MM');
+                });
+            }
+            // Rango de fechas
+            if ($('#Z').is(":checked")){
+                $('#datepicker').css('display','block');
+                if (desde.length > 0){
+                    var date = desde.split('/');
+                    PurchasesOrderLine = _.filter(PurchasesOrderLine, function (inv){
+                        return moment(inv.create_date).format('YYYY-MM-DD') >= (date[2]+"-"+date[1]+"-"+date[0]);
+                    });
+                }
+                if (hasta.length > 0){
+                    var date= hasta.split('/');
+                    PurchasesOrderLine = _.filter(PurchasesOrderLine, function (inv){
+                        return moment(inv.create_date).format('YYYY-MM-DD') <= (date[2]+"-"+date[1]+"-"+date[0]);
+                    });
+                }
+            }else{
+                $('#datepicker').css('display','none');
+            }
+
+            return _.flatten(_.filter(PurchasesOrderLine,function (inv) {
+                return inv.product_id[0] === product_id;
+            }));
+        },
+
+        search: function () {
+            var self = this;
+            var results = self.productProduct;
+            results = _.map(results, function (item) {
+                return {
+                        label: item.id + '- '+ ' [ ' + self.valorNull(item.ean13) + ' ] ' + item.name + ' ( ' +  self.valorNull(item.attribute_str) + ' ) ' ,
+                        value: item.id + '- '+ ' [ ' + self.valorNull(item.ean13) + ' ] ' + item.name + ' ( ' +  self.valorNull(item.attribute_str) + ' ) '
+                }
+            });
+            self.$('#product').autocomplete({
+                source: results,
+                minLength:0,
+                search: function(event, ui) {
+                    if (!(self.$('#product').val())){
+                        self.factSearch();
+                    }
+                },
+                close: function( event, ui ) {
+                        self.factSearch();
+                },
+                select: function(event, ui) {
+                    self.factSearch();
+                }
+            });
+        },
+
+        // Generar el ranking
+        BuildTable: 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.getPurchasesOrderLiners(itemProduct.id);
+                if (itemLine.length > 0) {
+                    cat = _.reduce(_.map(itemLine, function (map) {
+                        return map.product_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: accounting.formatNumber(cat,2,".",","),
+                        id: lineUnik.product_id[0],
+                        date: moment(itemLine.create_date).format("YYYY-MM-DD")
+                    });
+                }
+            }
+
+            ranking.sort(function (a, b) {
+                return b.countPosOrder - a.countPosOrder
+            });
+
+            self.content = ranking;
+            this.loadTable(ranking);
+
+        },
+
+        factSearch: function(){
+            var self = this;
+            var product= this.$el.find('#product').val().split('-');
+            var content = self.content;
+            if (product != ""){
+                content = _.filter(content, function(inv){
+                    return inv.id == product[0];
+                });
+            }
+
+            self.BuildTable();
+            self.loadTable(content)
+        },
+
+        loadTable:function(rowsTable){
+            var self = this;
+            self.rowsData = rowsTable;
+            var table = this.$el.find('#table');
+            table.bootstrapTable('load',rowsTable);
+        },
+        getObjetPdf: function(rowsTable){
+            var self = this;
+            var rows=self.rowsData;
+
+            return rows;
+        },
+        clickOnAction: function (e) {
+            var self = this;
+            var rowsNew;
+            var action = self.$el.find(e.target).val();
+            var table = self.$el.find("#table");
+            var data2 = table.bootstrapTable('getVisibleColumns');
+            var getColumns=[];
+            var rows=[];
+            rowsNew = self.getObjetPdf();
+            if (action === 'pdf') {
+                var dataNEW = _.map(data2, function (val){
+                    return val.field;
+                });
+                _.each(rowsNew,function (item){
+                    rows.push(_.pick(item, dataNEW));
+                });
+                // Obtener los nombre de la Cabezera
+                _.each(_.map(data2,function(val){
+                        return val;
+                    }), function(item){
+                            getColumns.push([{
+                                        title: item.title,
+                                        dataKey: item.field
+                                    }]);
+                });
+                this.drawPDF(_.flatten(getColumns),rows);
+            }
+        },
+        drawPDF: function (getColumns,rows) {
+            var self = this;
+            var desde =(this.$el.find('#from').val());
+            var hasta =(this.$el.find('#to').val());
+            var totalPagesExp = "{total_pages_count_string}";
+            var pdfDoc = new jsPDF();
+
+            pdfDoc.autoTable(getColumns, rows, {
+                styles: { overflow: 'linebreak', fontSize: 8, columnWidth: 'wrap'},
+                columnStyles: {
+                    product : {columnWidth: '10px'},
+                    qty : {halign:'right',columnWidth: '8px'},
+                },
+                margin: { top: 16, horizontal: 7},
+                addPageContent: function (data) {
+                    pdfDoc.setFontSize(12);
+                    pdfDoc.setFontStyle('bold');
+                    pdfDoc.setTextColor(40);
+                    pdfDoc.text('Productos más comprados', data.settings.margin.left, 10);
+
+                    if(desde.length > 0 || hasta.length > 0){
+                        var fecha='';
+                        if(desde){
+                            fecha=fecha.concat(' Desde '+desde);
+                        }
+                        if (hasta){
+                            fecha=fecha.concat(' Hasta '+hasta);
+                        }
+                        pdfDoc.setFontSize(10);
+                        pdfDoc.setFontStyle('bold');
+                        pdfDoc.setTextColor(40)
+                        pdfDoc.text(fecha, data.settings.margin.left,14);
+                    }
+                    // FOOTER
+                    var str = "Pagina  " + data.pageCount;
+                    // Total page number plugin only available in jspdf v1.0+
+                    if (typeof pdfDoc.putTotalPages === 'function') {
+                        str = str + " de " + totalPagesExp;
+                    }
+                    pdfDoc.setFontSize(9);
+                    pdfDoc.setFontStyle('bold');
+                    pdfDoc.setTextColor(40);
+                    pdfDoc.text(str, data.settings.margin.left, pdfDoc.internal.pageSize.height - 5);
+                    }
+            });
+
+            if (typeof pdfDoc.putTotalPages === 'function') {
+                pdfDoc.putTotalPages(totalPagesExp);
+            }
+            pdfDoc.save('Productos más comprados.pdf')
+        },
+    });
+}

+ 493 - 0
static/src/js/reports/report_pos_orders.js

@@ -0,0 +1,493 @@
+function report_pos_orders(reporting){
+    "use strict";
+
+    var model = openerp;
+
+    reporting.ReportPosOrdersWidget = reporting.Base.extend({
+        template: 'ReportPosOrders',
+        rowsData :[],
+        content:[],
+        
+        events:{
+            'click #toolbar > button' : 'clickOnAction',
+            'click #X' : 'fectSearch',
+            'click #A' : 'fectSearch',
+            'click #B' : 'fectSearch',
+            'click #C' : 'fectSearch',
+            'click #D' : 'fectSearch',
+            'click #Z' : 'fectSearch',
+            'change #from' : 'fectSearch',
+            'change #to': 'fectSearch',
+            'change #current-floor': 'fectSearch',
+            'change #current-table': 'fectSearch',
+            'click-row.bs.table #table' : 'clickAnalysisDetail',
+        },
+        
+        init : function(parent){
+          this._super(parent);
+        },
+        
+        start: function () {
+            var table = this.$el.find('#table');
+            table.bootstrapTable({data : self.rowData});
+            this.fecthFecha();
+            this.submitForm();
+        },
+
+        clickAnalysisDetail: function(e, row, $element, field){
+            if (field == 'order_name'){
+                this.do_action({
+                    name : "Pedido",
+                    type : 'ir.actions.act_window',
+                    res_model : "pos.order",
+                    views : [[false,'form']],
+                    target : 'new',
+                    domain : [['id','=', row.order_id]],
+                    context : {},
+                    flags : {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
+                    res_id : row.order_id,
+                });
+            }
+            if (field == 'product_name'){
+                this.do_action({
+                    name : "Productos",
+                    type : 'ir.actions.act_window',
+                    res_model : "product.product",
+                    views : [[false,'form']],
+                    target : 'new',
+                    domain : [['id','=', row.product_id]],
+                    context : {},
+                    flags : {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
+                    res_id : row.product_id,
+                });
+            }
+            e.stopImmediatePropagation();
+        },
+        
+        fecthFecha: function() {
+            var to;
+            var dateFormat1 = "mm/dd/yy",
+                from = $( "#from" )
+                .datepicker({
+                  dateFormat: "dd/mm/yy",
+                  changeMonth: true,
+                  numberOfMonths: 1,
+                })
+                .on( "change", function() {
+                  to.datepicker( "option", "minDate", getDate(this), "dd/mm/yyyy");
+                });
+                to = $( "#to" ).datepicker({
+                dateFormat: "dd/mm/yy",
+                defaultDate: "+7d",
+                changeMonth: true,
+                numberOfMonths: 1,
+                })
+                .on( "change", function() {
+                    from.datepicker( "option", "maxDate", getDate(this));
+                });
+            function getDate( element ) {
+                var fechaSel =element.value.split('/');
+                var date;
+                try {
+                    date = $.datepicker.parseDate( dateFormat1, (fechaSel[1]+"/"+fechaSel[0]+"/"+fechaSel[2]));
+                } catch( error ) {
+                    date = null;
+                }
+                return date;
+            }
+        }, 
+
+        valorNull:function(dato){
+            var valor ="";
+            if (dato){
+                valor=dato;
+            }
+            return valor;
+        },
+        
+        // Cansultar
+        submitForm: function () {
+            var self = this;
+            this.fetchPosOrder().then(function(PosOrder) {
+                self.PosOrder = PosOrder;
+                return PosOrder;
+            }).then(function (PosOrder) {
+                return self.fetchPosOrderLine();
+            }).then(function (PosOrderLine) {
+                self.PosOrderLine = PosOrderLine;
+                return self.fetchResPartner();
+            }).then(function (ResPartner){
+                self.ResPartner = ResPartner;
+                return self.fetchProductProduct();
+            }).then(function (ProductProduct) {
+                self.ProductProduct = ProductProduct;
+                return self.fetchPosFloor();
+            }).then(function(PosFloor){
+                self.PosFloor = PosFloor;
+                self.$el.find('#current-floor').append('<option value="9999999">Ubicacion</option>');
+                _.each(PosFloor,function(item){
+                    self.$el.find('#current-floor').append('<option value="' + item.id + '">' + item.name + '</option>');
+                });
+                return self.fetchPosTable();
+            }).then(function(PosTable){
+                self.PosTable = PosTable;
+                self.$el.find('#current-table').append('<option value="9999999">Mesa o Delivery</option>');
+                _.each(PosTable,function(item){
+                     self.$el.find('#current-table').append('<option value="' + item.id + '">' + item.name + '</option>');
+                });
+                self.searchProduct();
+                return self.BuildTable();
+            });
+        },
+
+        // Ventas (Point Of Sale)
+        fetchPosOrder: function () {
+            var self = this;
+            var defer = $.Deferred();
+            var fields = ['id','name','date_order','lines','table_id'];
+            var domain = [['state', 'not in', ['draft','cancel']]];
+            var PosOrder = new model.web.Model('pos.order');
+            PosOrder.query(fields).filter(domain).all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        // Lineas de venta (Point Of Sale)
+        fetchPosOrderLine: function () {
+            var self = this;
+            var defer = $.Deferred();
+            var ids = _.flatten(_.map(self.PosOrder, function (item) {
+                return item.id;
+            }));
+            var fields = ['id', 'name', 'order_id', 'product_id', 'qty', 'price_unit', 'price_subtotal_incl']
+            var domain = [['order_id', 'in', ids]];
+            var PosOrderLine = new model.web.Model('pos.order.line');
+            PosOrderLine.query().filter(domain).all().then(function (results) {
+                defer.resolve(results)
+            });
+            return defer;
+        },
+
+        // clientes
+        fetchResPartner: function () {
+            var self = this;
+            var defer = $.Deferred();            
+            var fields = ['id','name','ruc'];
+            var domain = [['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;
+        },
+
+        // Productos
+        fetchProductProduct: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var porduct_ids = _.flatten(_.map(self.PosOrderLine, function (item) {
+                return item.product_id[0];
+            }));
+            var fields = ['id','name', 'default_code', 'name_template','ean13', 'standard_price','type','attribute_str'];
+            var domain = [['id', 'in', porduct_ids]];
+            var ProductProduct =  new model.web.Model('product.product');
+            ProductProduct.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        // Mesa o delivery
+        fetchPosTable: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var fields = ['id','name', 'floor_id'];
+            var ProductProduct =  new model.web.Model('pos.table');
+            ProductProduct.query(fields).filter().all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        // Salon o Delivery
+        fetchPosFloor: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var fields = ['id','name', 'table_ids'];
+            var ProductProduct =  new model.web.Model('pos.floor');
+            ProductProduct.query(fields).filter().all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        getPosOrder: function(id){
+            var self = this;
+            return _.filter(self.PosOrder,function (item) {
+                return item.id == id;
+            });
+        },
+
+        getPosTable: function(id){
+            var self = this;
+            return _.filter(self.PosTable,function (item) {
+                return item.id == id;
+            });
+        },
+        
+        getProductProduct: function(id){
+            var self = this;
+            return _.filter(self.ProductProduct,function (item) {
+                return item.id == id;
+            });
+        },
+
+        BuildTable: function(){
+            var self = this;
+            var PosOrderLine = self.PosOrderLine;
+            var data = [];
+            var order;
+            var product;
+            _.each(PosOrderLine, function(item){
+                product = self.getProductProduct(item.product_id[0]);
+                order = self.getPosOrder(item.order_id[0]).shift();
+                var place_id;
+                var place_name;
+                var floor;
+                if(order.table_id){
+                    floor = self.getPosTable(order.table_id[0]).shift();
+                    floor = floor.floor_id[0];
+                    place_id = order.table_id[0];
+                    place_name = order.table_id[1];
+                }
+                data.push({
+                    id : item.id,
+                    order_id : item.order_id[0],
+                    order_name : item.order_id[1],
+                    date : order.date_order,
+                    date_order : moment(order.date_order).format("DD/MM/YYYY"),
+                    table_id : self.valorNull(place_id),
+                    table_name : self.valorNull(place_name),
+                    floor_id : floor,
+                    product_id : item.product_id[0],
+                    product_name : item.product_id[1],
+                    price_unit : accounting.formatNumber(item.price_unit,0,".",","),
+                    qty : accounting.formatNumber(item.qty,0,".",","),
+                    price_subtotal_incl : accounting.formatNumber(item.price_subtotal_incl,0,".",","),
+                });
+            });
+            self.content = data;
+            self.loadTable(data)
+        },
+
+        fectSearch: function(){
+            var self = this;
+            var floor =this.$el.find('#current-floor').val();
+            var table =this.$el.find('#current-table').val();
+            var desde =this.$el.find('#from').val();
+            var hasta =this.$el.find('#to').val();
+            var product = this.$el.find('#product').val().split('-');
+            var content = self.content;
+
+            // Hoy
+            if ($('#A').is(":checked")){
+                content = _.filter(content, function (inv){
+                    return moment(inv.date_order).format("YYYY-MM-DD") == moment().format("YYYY-MM-DD");
+                });
+            }
+
+            // Ayer
+            if ($('#B').is(":checked")){
+                content = _.filter(content, function (inv){
+                    return moment(inv.date_order).format("YYYY-MM-DD") == moment().add(-1,"days").format("YYYY-MM-DD");
+                });
+            }
+
+            // Mes Actual
+            if ($('#C').is(":checked")){
+                content = _.filter(content, function (inv){
+                    return moment(inv.date_order).format("YYYY-MM") == moment().format("YYYY-MM");
+                });
+            }
+
+            //  Mes Pasado
+            if ($('#D').is(":checked")){
+                content = _.filter(content, function (inv){
+                    return moment(inv.date_order).format("YYYY-MM") == moment().add(-1,'months').format("YYYY-MM");
+                });
+            }
+
+            // Rango de fechas
+            if ($('#Z').is(":checked")){
+                $('#datepicker').css('display','block');
+                if (desde.length > 0){
+                    content = _.filter(content, function (inv){
+                        return moment(inv.date_order).format("YYYY-MM-DD") >= moment(desde).format("YYYY-MM-DD");
+                    });
+                }
+                if (hasta.length > 0){
+                    content = _.filter(content, function (inv){
+                        return moment(inv.date_order).format("YYYY-MM-DD") <= moment(hasta).format("YYYY-MM-DD");
+                    });   
+                }
+            }else{
+                $('#datepicker').css('display','none');
+            }
+
+            // Filtrar por piso o delivery
+            if (floor != 9999999){
+                content=_.filter(content, function (inv){ 
+                    return inv.floor_id == floor;
+                });
+            } 
+
+            // Filtrar por mesa o delivery
+            if (table != 9999999){
+                content=_.filter(content, function (inv){ 
+                    return inv.table_id == table;
+                });
+            } 
+            
+            // Buscar Producto
+            if (product != ""){
+                content = _.filter(content, function(inv){
+                    return inv.product_id == product[0];
+                });
+            }
+            self.loadTable(content);
+        },
+
+        searchProduct: function () {
+            var self = this;
+            var results = self.ProductProduct;
+            results = _.map(results, function (item) {
+                return {
+                    label: item.id + '- '+ ' [ ' + self.valorNull(item.default_code) + ' - ' + self.valorNull(item.ean13) + ' ] ' + item.name + ' ( ' +  self.valorNull(item.attribute_str) + ' ) ' ,
+                    value: item.id + '- '+ ' [ ' + self.valorNull(item.default_code) + ' - ' + self.valorNull(item.ean13) + ' ] ' + item.name + ' ( ' +  self.valorNull(item.attribute_str) + ' ) '
+                }
+            });
+            self.$('#product').autocomplete({
+                source: results,
+                minLength:0,
+                search: function(event, ui) {
+                    if (!(self.$('#product').val())){
+                        self.fectSearch();
+                    }
+                },
+                close: function( event, ui ) {
+                        self.fectSearch();
+                },
+                select: function(event, ui) {
+                    self.fectSearch();
+                }
+            });
+        },
+
+        loadTable:function(rowsTable){
+            var self = this;
+            self.rowsData = rowsTable;
+            var table = this.$el.find('#table');
+            table.bootstrapTable('load',rowsTable);
+        },
+
+        clickOnAction: function (e) {
+            var action = this.$el.find(e.target).val();
+            var self = this;
+            var getColumns=[];
+            var rows=[];
+            var table = this.$el.find("#table");
+            var data2 = table.bootstrapTable('getVisibleColumns');
+            if (action === 'pdf') {
+                var dataNEW = _.map(data2, function (val){ return val.field});
+                _.each(this.rowsData,function (item){
+                    rows.push(_.pick(item, dataNEW));
+                });
+                // Obtener los nombre de la Cabezera
+                _.each(_.map(data2,function(val){
+                    return val}), function(item){
+                    getColumns.push([{
+                                    title: item.title,
+                                    dataKey: item.field
+                                }]);
+                });
+                // Llamar al pdf
+                this.drawPDF(_.flatten(getColumns),rows)
+            }
+        },
+
+        drawPDF: function (getColumns,rows) {
+            var self = this;
+            var rowsPdf=[];
+            var desde =(this.$el.find('#from').val());
+            var hasta =(this.$el.find('#to').val());
+            var totalPagesExp = "{total_pages_count_string}";
+            var pdfDoc = new jsPDF();
+
+            // Cantidad 
+            var qty =_.reduce(_.map(rows,function(item){
+                var valor=0;
+                if (item.qty){valor = parseFloat(((item.qty.replace(".","")).replace(",",".")))}return valor}), function(memo, num){ return memo + num; },0);
+            
+            var price_subtotal_incl =_.reduce(_.map(rows,function(item){
+                var valor =0;
+                if (item.price_subtotal_incl){valor=parseFloat(((item.price_subtotal_incl.replace(".","")).replace(",",".")))} return valor}), function(memo, num){ return memo + num; },0);
+
+            rowsPdf = rows;
+
+            rowsPdf.push({
+                qty : accounting.formatNumber(qty,0,".",","),
+                price_subtotal_incl : accounting.formatNumber(price_subtotal_incl,0,".",","),
+            });
+
+            pdfDoc.autoTable(getColumns, rowsPdf, {
+                styles: { overflow: 'linebreak', fontSize: 8, columnWidth: 'wrap'},
+                columnStyles: {
+                    order_name: {halign:'left', fontStyle: 'bold'},
+                    date_order :{halign:'left'},
+                    table_id :{halign:'left'},
+                    product_name :{halign:'left' },
+                    price_unit : {halign:'right' },
+                    qty : {halign:'right' },
+                    price_subtotal_incl : {halign:'right'},
+                },
+                margin: { top: 16, horizontal: 7},
+                addPageContent: function (data) {
+                    pdfDoc.setFontSize(12);
+                    pdfDoc.setFontStyle('bold');
+                    pdfDoc.setTextColor(40);
+                    pdfDoc.text('Análisis de pedidos (Point Of Sale)', data.settings.margin.left, 10);
+
+                    if(desde.length > 0 || hasta.length > 0){
+                      var fecha='';
+                      if(desde){
+                        fecha=fecha.concat(' Desde '+desde);
+                      }
+                      if (hasta){
+                        fecha=fecha.concat(' Hasta '+hasta);
+                      }
+                        pdfDoc.setFontSize(10);
+                        pdfDoc.setFontStyle('bold');
+                        pdfDoc.setTextColor(40)
+                        pdfDoc.text(fecha, data.settings.margin.left,14);
+                    }
+                    // FOOTER
+                    var str = "Pagina  " + data.pageCount;
+                    // Total page number plugin only available in jspdf v1.0+
+                    if (typeof pdfDoc.putTotalPages === 'function') {
+                        str = str + " de " + totalPagesExp;
+                    }
+                    pdfDoc.setFontSize(9);
+                    pdfDoc.setFontStyle('bold');
+                    pdfDoc.setTextColor(40);
+                    pdfDoc.text(str, data.settings.margin.left, pdfDoc.internal.pageSize.height - 5);
+                }
+            });
+
+            if (typeof pdfDoc.putTotalPages === 'function') {
+                pdfDoc.putTotalPages(totalPagesExp);
+            }
+            pdfDoc.save('Análisis de pedidos.pdf')
+        },
+    });
+}

+ 2 - 0
static/src/js/reports/report_purchases_invoice_analysis.js

@@ -286,6 +286,7 @@ function report_purchases_invoice_analysis (reporting){
                     journal_name :(invoice.journal_id[1]),
                     date_invoice : (invoice.date_invoice),
                     partner_id : invoice.partner_id[0],
+                    date_create :moment(invoice.date_invoice).format("DD/MM/YYYY"),
                     partner_name : invoice.partner_id[1],
                     invoice_type : invoice_type
                 });
@@ -528,6 +529,7 @@ function report_purchases_invoice_analysis (reporting){
                 styles: { overflow: 'linebreak', fontSize: 8, columnWidth: 'wrap'},
                 columnStyles: {
                     number: {fontStyle: 'bold'},
+                    date_create :{columnWidth: '12px'},
                     partner_name :{columnWidth: '10px'},
                     name :{columnWidth: '10px'},
                     quantity :{halign:'right' },

+ 441 - 0
static/src/js/reports/report_ranking_pos_orders_customer.js

@@ -0,0 +1,441 @@
+function report_ranking_pos_orders_customer (reporting) {
+    "use strict";
+
+    var instance = openerp;
+
+    reporting.ReportRankingPosOrdersCustomerWidget = reporting.Base.extend({
+        template: 'ReportRankingPosOrdersCustomer',
+        data: [],
+        accountInvoice: [],
+        invoiceLine: [],
+        ResPartner: [],
+        productProduct: [],
+        ranking: [],
+        content: [],
+        modelId: [],
+
+        events:{
+            'click #toolbar > button' : 'clickOnAction',
+            'click #X' : 'factSearch',
+            'click #A' : 'factSearch',
+            'click #B' : 'factSearch',
+            'click #C' : 'factSearch',
+            'click #D' : 'factSearch',
+            'click #Z' : 'factSearch',
+            'click #partner' : 'factSearch',
+            'click #Y' : 'factSearch',
+            'change #from' : 'factSearch',
+            'change #to' : 'factSearch',
+            'click-row.bs.table #table ' : 'clickAnalysisDetail',
+        },
+
+        init : function(parent){
+            this._super(parent);
+        },
+
+        start: function () {
+            var self = this;
+            var table = this.$el.find('#table');
+            table.bootstrapTable({data : self.rowsData});
+            this.fecthFecha();
+            this.submitForm();
+        },
+
+        // Redirecionar
+        renderReport: function () {
+            var self = this;
+
+            var container = this.$el.closest('.oe_form_sheet.oe_form_sheet_width');
+            this.$el.closest('.report_view').remove();
+            container.find('.report_view').show({
+                effect: 'fade',
+                duration: 200,
+            });
+        },
+
+        // Verificar el modelo
+        checkModel : function(model){
+            var self = this;
+            return _.filter(self.modules,function(item){return item.name === model});
+        },
+
+        // Lanzar el mensaje
+        showMensaje : function(modelos){
+            var self = this;
+            $("#dialog" ).dialog({
+                autoOpen: true,
+                resizable: false,
+                modal: true,
+                title: 'Atención',
+                width: 500,
+                open: function() {
+                    $(this).html('Reporte in-disponible, contacte con el administrador del sistema ref : '+modelos);
+                },
+                show: {
+                    effect: "fade",
+                    duration: 200
+                },
+                hide: {
+                    effect: "fade",
+                    duration: 200
+                },
+                buttons: {
+                    Aceptar: function() {
+                        $(this).dialog('close');
+                        self.renderReport()
+                    }
+                }
+            });
+            return
+        },
+
+        fecthFecha: function() {
+            var to;
+            var dateFormat1 = "mm/dd/yy",
+            from = $( "#from" )
+            .datepicker({
+                dateFormat: "dd/mm/yy",
+                changeMonth: true,
+                numberOfMonths: 1,
+            })
+            .on( "change", function() {
+                to.datepicker( "option", "minDate", getDate(this), "dd/mm/yyyy");
+            });
+            to = $( "#to" ).datepicker({
+                dateFormat: "dd/mm/yy",
+                defaultDate: "+7d",
+                changeMonth: true,
+                numberOfMonths: 1,
+            })
+            .on( "change", function() {
+                from.datepicker( "option", "maxDate", getDate(this));
+            });
+
+            function getDate( element ) {
+                var fechaSel =element.value.split('/');
+                var date;
+                try {
+                    date = $.datepicker.parseDate( dateFormat1, (fechaSel[1]+"/"+fechaSel[0]+"/"+fechaSel[2]));
+                } catch( error ) {
+                    date = null;
+                }
+                return date;
+            }
+        },
+
+        clickAnalysisDetail: function(e, row, $element, field){
+            if (field == 'name'){
+                this.do_action({
+                    name:"Cliente",
+                    type: 'ir.actions.act_window',
+                    res_model: "res.partner",
+                    views: [[false,'form']],
+                    target: 'new',
+                    domain: [['id','=', row.id]],
+                    context: {},
+                    flags: {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
+                    res_id: row.id,
+                });
+            }
+            e.stopImmediatePropagation();
+        },
+
+        submitForm: function () {
+            var self = this;
+            self.fecthIrModuleModule().then(function(modules){
+                self.modules = modules;
+                return modules;
+            }).then(function(modules){
+                return self.fecthPosOrder();
+            }).then(function (PosOrder) {
+                self.PosOrder = PosOrder;
+                return self.fecthResPartner();
+            }).then(function (ResPartner) {
+                self.ResPartner = ResPartner;
+                self.search();
+                return self.BuildTable();
+            });
+        },
+
+        // Modelos instalados
+        fecthIrModuleModule: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var fields = ['name','id'];
+            var domain=[['state','=','installed']];
+            var irModule = new instance.web.Model('ir.module.module');
+
+            irModule.query(fields).filter(domain).all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        // Obtener Pedido
+        fecthPosOrder: function() {
+            var self = this;
+            var defer = $.Deferred();
+            var fields = ['id','date_order','partner_id','amount_total'];
+            var domain = [['state', 'in', ['paid','done','invoiced']], ['partner_id', '!=', false]];
+            var PosOrder = new instance.web.Model('pos.order');
+            PosOrder.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+
+        valorNull:function(dato){
+            var valor ="";
+            if (dato){
+                valor=dato;
+            }
+            return valor;
+        },
+
+        // Consultar Clientes
+        fecthResPartner: function() {
+            var self = this;
+            var defer = $.Deferred();
+            var partner_id = _.map(self.PosOrder,function(map){
+                return map.partner_id[0];
+            });
+            var fields = ['id', 'name', 'ruc'];
+            var domain = [['id', 'in', partner_id]];
+            var ResPartner = new instance.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;
+            var desde = self.$el.find('#from').val();
+            var hasta = self.$el.find('#to').val();
+            var PosOrder = self.PosOrder;
+            // Hoy
+            if ($('#A').is(":checked")){
+                PosOrder = _.filter(PosOrder, function (inv){
+                    return moment(inv.date_order).format('YYYY-MM-DD') == moment().format('YYYY-MM-DD');
+                });
+            }
+            // Ayer
+            if ($('#B').is(":checked")){
+                PosOrder = _.filter(PosOrder, function (inv){
+                    return moment(inv.date_order).format('YYYY-MM-DD') == moment().add(-1,'days').format('YYYY-MM-DD');
+                });
+            }
+            // Mes Actual
+            if ($('#C').is(":checked")){
+                PosOrder = _.filter(PosOrder, function (inv){
+                    return moment(inv.date_order).format('MM') == moment().format('MM');
+                });
+            }
+            // Mes Pasado
+            if ($('#D').is(":checked")){
+                PosOrder = _.filter(PosOrder, function (inv){
+                    return moment(inv.date_order).format('MM') == moment().add(-1,'months').format('MM');
+                });
+            }
+            // Rango de fechas
+            if ($('#Z').is(":checked")){
+                $('#datepicker').css('display','block');
+                if (desde.length > 0){
+                    var date = desde.split('/');
+                    PosOrder = _.filter(PosOrder, function (inv){
+                        return moment(inv.date_order).format('YYYY-MM-DD') >= (date[2]+"-"+date[1]+"-"+date[0]);
+                    });
+                }
+                if (hasta.length > 0){
+                    var date= hasta.split('/');
+                    PosOrder = _.filter(PosOrder, function (inv){
+                        return moment(inv.date_order).format('YYYY-MM-DD') <= (date[2]+"-"+date[1]+"-"+date[0]);
+                    });
+                }
+            }else{
+                $('#datepicker').css('display','none');
+            }
+
+            return _.flatten(_.filter(PosOrder,function (inv) {
+                return inv.partner_id[0] === partner_id;
+            }));
+        },
+
+        search: function () {
+            var self = this;
+            var results = self.ResPartner;
+            results = _.map(results, function (item) {
+                return {
+                        label: item.id + '-'+ item.name + ' ' + self.valorNull(item.ruc),
+                        value: item.id + '-'+ item.name + ' ' + self.valorNull(item.ruc)
+                }
+            });
+            self.$('#partner').autocomplete({
+                source: results,
+                minLength:0,
+                search: function(event, ui) {
+                    if (!(self.$('#partner').val())){
+                        self.factSearch();
+                    }
+                },
+                close: function( event, ui ) {
+                        self.factSearch();
+                },
+                select: function(event, ui) {
+                    self.factSearch();
+                }
+            });
+        },
+
+        // Generar el Ranking
+        BuildTable: function() {
+            var self = this;
+            var itemPartner;
+            var itemPosOrder;
+            var countPosOrder = 0;
+            var quantity = 0;
+            var data = [];
+
+            for (var i = 0; i < self.ResPartner.length; i++) {
+                itemPartner = self.ResPartner[i];
+                itemPosOrder = self.getPosOrder(itemPartner.id);
+
+                quantity = _.reduce(_.map(itemPosOrder,function(item) {
+                    return item.amount_total;
+                }),function(memo, num) {
+                    return memo + num;
+                },0);
+
+                if(quantity > 0){
+                    data.push({
+                        id: itemPartner.id,
+                        ruc: self.valorNull(itemPartner.ruc),
+                        name: itemPartner.name,
+                        countPosOrder: accounting.formatNumber(quantity,0,".",","),
+                    });
+                }
+            }
+
+            data.sort(function (a, b) {
+                return b.countPosOrder - a.countPosOrder
+            });
+
+            self.content = data;
+            self.loadTable(data);
+        },
+
+        factSearch: function(){
+            var self = this;
+
+            var partner= this.$el.find('#partner').val().split('-');
+            var content = self.content;
+
+            if (partner != ""){
+                content = _.filter(content, function(inv){
+                    return inv.id == partner[0];
+                });
+            }
+
+            self.BuildTable();
+            self.loadTable(content)
+        },
+
+        loadTable:function(rowsTable){
+            var self = this;
+            self.rowsData = rowsTable;
+            var table = this.$el.find('#table');
+            table.bootstrapTable('load',rowsTable);
+        },
+
+        getObjetPdf: function(rowsTable){
+            var self = this;
+            var rows=self.rowsData;
+            return rows;
+        },
+
+        clickOnAction: function (e) {
+            var self = this;
+            var rowsNew;
+            var action = self.$el.find(e.target).val();
+            var table = self.$el.find("#table");
+            var data2 = table.bootstrapTable('getVisibleColumns');
+            var getColumns=[];
+            var rows=[];
+            rowsNew = self.getObjetPdf();
+            if (action === 'pdf') {
+                var dataNEW = _.map(data2, function (val){
+                    return val.field;
+                });
+                _.each(rowsNew,function (item){
+                    rows.push(_.pick(item, dataNEW));
+                });
+                // Obtener los nombre de la Cabezera
+                _.each(_.map(data2,function(val){
+                        return val;
+                    }), function(item){
+                            getColumns.push([{
+                                        title: item.title,
+                                        dataKey: item.field
+                                    }]);
+                });
+                this.drawPDF(_.flatten(getColumns),rows);
+            }
+        },
+
+        drawPDF: function (getColumns,rows) {
+            var self = this;
+            var desde =(this.$el.find('#from').val());
+            var hasta =(this.$el.find('#to').val());
+            var totalPagesExp = "{total_pages_count_string}";
+            var pdfDoc = new jsPDF();
+
+            pdfDoc.autoTable(getColumns, rows, {
+                styles: { overflow: 'linebreak', fontSize: 8, columnWidth: 'wrap'},
+                columnStyles: {
+                    name : {columnWidth: '10px'},
+                    ruc : {columnWidth: '8px'},
+                    quantity : {halign:'right',columnWidth: '8px'},
+                },
+                margin: { top: 16, horizontal: 7},
+                addPageContent: function (data) {
+                    pdfDoc.setFontSize(12);
+                    pdfDoc.setFontStyle('bold');
+                    pdfDoc.setTextColor(40);
+                    pdfDoc.text('Ranking de clientes', data.settings.margin.left, 10);
+
+                    if(desde.length > 0 || hasta.length > 0){
+                        var fecha='';
+                        if(desde){
+                            fecha=fecha.concat(' Desde '+desde);
+                        }
+                        if (hasta){
+                            fecha=fecha.concat(' Hasta '+hasta);
+                        }
+                        pdfDoc.setFontSize(10);
+                        pdfDoc.setFontStyle('bold');
+                        pdfDoc.setTextColor(40)
+                        pdfDoc.text(fecha, data.settings.margin.left,14);
+                    }
+                    // FOOTER
+                    var str = "Pagina  " + data.pageCount;
+                    // Total page number plugin only available in jspdf v1.0+
+                    if (typeof pdfDoc.putTotalPages === 'function') {
+                        str = str + " de " + totalPagesExp;
+                    }
+                    pdfDoc.setFontSize(9);
+                    pdfDoc.setFontStyle('bold');
+                    pdfDoc.setTextColor(40);
+                    pdfDoc.text(str, data.settings.margin.left, pdfDoc.internal.pageSize.height - 5);
+                    }
+            });
+
+            if (typeof pdfDoc.putTotalPages === 'function') {
+                pdfDoc.putTotalPages(totalPagesExp);
+            }
+            pdfDoc.save('Ranking de clientes.pdf')
+        },
+    });
+}

+ 2 - 3
static/src/js/reports/report_stock.js

@@ -154,7 +154,7 @@ function report_stock (reporting){
             var quantity = 0;
             var total=0;
             ProductProduct = self.getProductProduct(self.ProductProduct, self.StockQuant);
-            _.each(ProductProduct, function(item){    
+            _.each(ProductProduct, function(item){
                 itemProduct = item;
                 itemQuant = self.getStockQuant( itemProduct.id, self.StockQuant);
                 if (itemQuant.length > 0){
@@ -165,7 +165,7 @@ function report_stock (reporting){
                     },0);
                     product = itemQuant.shift();
                     total = parseInt(quantity * itemProduct.standard_price);
-                    data.push({ 
+                    data.push({
                         id : product.product_id[0],
                         product : product.product_id[1],
                         ean13 : self.valorNull(itemProduct.ean13),
@@ -286,7 +286,6 @@ function report_stock (reporting){
                     styles: { overflow: 'linebreak', fontSize:8 , columnWidth: 'wrap'},
                     columnStyles:{
                                     product :{columnWidth: '8px'},
-
                                     qty : {halign:'center'},
                                     standard_price : {halign:'right'},
                                     lst_price : {halign:'right'},

+ 5 - 5
static/src/reports/ranking_pos_orders_product_cy.xml

@@ -51,15 +51,15 @@
                                 </div>
                             </div>
                         </div>
-                        <!-- <div class="col-xs-6">
+                        <div class="col-xs-6">
                             <div class="panel panel-default">
                                 <div class="panel-heading">Características</div>
-                                <div class="panel-body">
-                                    <label for="partner">Buscar Cliente:</label>
-                                    <input id="partner" type="text" class="form-control ui-autocomplete-input" autocomplete="off" placeholder="Nombre/ CI/ Ruc"/>
+                                <div class="form-group">
+                                    <label for="product">Buscar Producto:</label>
+                                    <input id="product" type="text" class="form-control ui-autocomplete-input" autocomplete="off" placeholder="Nombre/ Referencia/ Codigo de barras"/>
                                 </div>
                             </div>
-                        </div> -->
+                        </div>
                     </div>
                 </div>
             </div>

+ 91 - 0
static/src/reports/ranking_purchases_orders_product_cy.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="RankingPurchasesOrdersProductcy">
+        <div class="report_view">
+            <div class="reporting_page_header">
+                <h1>Ranking Producto más comprados</h1>
+            </div>
+            <button type="button" class="oe_button oe_form_button oe_highlight" aria-label="Left Align" data-toggle="collapse" href="#collapseExample" aria-expanded="false" aria-controls="collapseExample">FILTRAR
+            </button>
+            <div class="collapse" id="collapseExample">
+                <div class="card card-body">
+                    <br/>
+                    <div class="row">
+                        <div class="col-xs-6">
+                            <div class="panel panel-default">
+                                <div class="panel-heading">Fechas</div>
+                                <div class="panel-body">
+                                    <ul>
+                                        <li>
+                                            <input type="radio" name="valores" id="X" value="X" checked="checked"/>
+                                            <label for="X">Sin Filtro</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="valores" id="A" value="A"/>
+                                            <label for="A">Hoy</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="valores" id="B" value="B"/>
+                                            <label for="B">Ayer</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="valores" id="C" value="C"/>
+                                            <label for="C">Mes Actual</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="valores" id="D" value="D"/>
+                                            <label for="D">Mes Pasado</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="valores" id="Z" value="Z"/>
+                                            <label for="Z">Busqueda Avanzada</label>
+                                        </li>
+                                    </ul>
+                                    <div id="datepicker" style="display:none;" class="container">
+                                        <label for="from">Desde: </label>
+                                        <input type="text"  id="from" name="from"/>
+                                        <label for="to" >Hasta: </label>
+                                        <input type="text"  id="to" name="to" />
+                                    </div>
+
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-xs-6">
+                            <div class="panel panel-default">
+                                <div class="panel-heading">Características</div>
+                                <div class="form-group">
+                                    <label for="product">Buscar Producto:</label>
+                                    <input id="product" type="text" class="form-control ui-autocomplete-input" autocomplete="off" placeholder="Nombre/ Referencia/ Codigo de barras"/>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div id="toolbar">
+                <button class="oe_button oe_form_button oe_highlight btn-block" value="pdf">PDF</button>
+            </div>
+            <table id="table" class="table_paint_first_row"
+                data-pagination="true"
+                data-toggle="table"
+                data-reorderable-columns="true"
+                data-toolbar="#toolbar"
+                data-show-columns="true"
+                data-buttons-class="oe_button oe_form_button oe_highlight"
+                data-height="auto"
+                data-classes="table table-hover table-condensed"
+                data-row-style="rowStyle"
+                data-search="true">
+                <thead>
+                    <tr>
+                        <th data-field="product">Producto</th>
+                        <th data-field="qty" data-sortable="true" data-align="right">Cantidad</th>
+                    </tr>
+                </thead>
+            </table>
+            <canvas></canvas>
+            <div id="dialog"></div>
+        </div>
+    </t>
+</template>

+ 101 - 0
static/src/reports/report_pos_orders.xml

@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+  <template xml:space="preserve">
+      <t t-name="ReportPosOrders">
+        <div class="report_view">
+          <div class="reporting_page_header">
+            <h1>Análisis de Ventas (Point Of Sale)</h1>
+            <div id="volver"></div>
+          </div>
+          <button type="button" class="oe_button oe_form_button oe_highlight" aria-label="Left Align" data-toggle="collapse" href="#collapseExample" aria-expanded="false" aria-controls="collapseExample">FILTRAR
+            </button>
+            <div class="collapse" id="collapseExample">
+                <br/>
+                <div class="row">
+                    <div class="col-xs-6">
+                        <div class="panel panel-default">
+                            <div class="panel-heading">Fechas</div>
+                            <div class="panel-body">
+                                <ul class="list-unstyled">
+                                    <li>
+                                        <input type="radio" name="valores" id="X" value="X" checked="checked"/>
+                                        <label for="X">Sin Filtro</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="A" value="A"/>
+                                        <label for="A">Hoy</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="B" value="B"/>
+                                        <label for="B">Ayer</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="C" value="C"/>
+                                        <label for="C">Mes Actual</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="D" value="D"/>
+                                        <label for="D">Mes Pasado</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="Z" value="Z"/>
+                                        <label for="Z">Busqueda Avanzada</label>
+                                    </li>
+                                </ul>
+                                <div id="datepicker" style="display:none;" class="container">
+                                    <label for="from">Desde: </label>
+                                    <input type="text"  id="from" name="from"/>
+                                    <label for="to" >Hasta: </label>
+                                    <input type="text"  id="to" name="to" />
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-xs-6">
+                        <div class="panel panel-default">
+                            <div class="panel-heading">Características</div>
+                            <div class="panel-body">
+                                <div class="form-group">
+                                    <label for="current-floor">Ubicacion: </label>
+                                    <select id="current-floor" class="form-control ui-autocomplete-input"  name="floor"></select>
+                                    <label for="current-table">Lugar: </label>
+                                    <select id="current-table" class="form-control ui-autocomplete-input"  name="table"></select>
+                                    <label for="product">Buscar Producto</label>
+                                    <input id="product" type="text" class="form-control ui-autocomplete-input" autocomplete="off" placeholder="Nombre/ Referencia/ Codigo de barras"/>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+          <div id="toolbar">
+            <button class="oe_button oe_form_button oe_highlight" value="pdf">PDF</button>
+        </div>
+        <table id="table" class="table_paint_first_row"
+            data-pagination="true"
+            data-toggle="table"
+            data-reorderable-columns="true"
+            data-toolbar="#toolbar"
+            data-show-columns="true"
+            data-buttons-class="oe_button oe_form_button oe_highlight"
+            data-height="auto"
+            data-classes="table table-hover table-condensed"
+            data-row-style="rowStyle"
+            data-search="true">
+            <thead>
+              <tr>
+                <th data-field="order_name" data-sortable="true">Pedido</th>
+                <th data-field="date_order" data-sortable="true">Fecha</th>
+                <th data-field="table_name">Lugar</th>
+                <th data-field="product_name" data-sortable="true">Productos</th>
+                <th data-field="price_unit" data-align="right">Precio Unitario</th>
+                <th data-field="qty" data-sortable="true" data-align="right">Cantidad</th>
+                <th data-field="price_subtotal_incl" data-sortable="true" data-align="right">Total</th>
+              </tr>
+            </thead>
+        </table>
+        <div class="widget-content" id="grafico"></div>
+        <div id="dialog"></div>
+      </div>
+      </t>
+  </template>

+ 14 - 13
static/src/reports/report_purchases_invoice_analysis.xml

@@ -16,12 +16,12 @@
                             <div class="panel-body">
                                 <ul class="list-unstyled">
                                     <li>
-                                        <input type="radio" name="valores" id="X" value="X" checked="checked"/> 
-                                        <label for="X">Sin Filtro</label>  
+                                        <input type="radio" name="valores" id="X" value="X" checked="checked"/>
+                                        <label for="X">Sin Filtro</label>
                                     </li>
                                     <li>
-                                        <input type="radio" name="valores" id="A" value="A"/> 
-                                        <label for="A">Hoy</label>  
+                                        <input type="radio" name="valores" id="A" value="A"/>
+                                        <label for="A">Hoy</label>
                                     </li>
                                     <li>
                                         <input type="radio" name="valores" id="B" value="B"/>
@@ -44,11 +44,11 @@
                                     <label for="from">Desde: </label>
                                     <input type="text"  id="from" name="from"/>
                                     <label for="to" >Hasta: </label>
-                                    <input type="text"  id="to" name="to" />    
+                                    <input type="text"  id="to" name="to" />
                                 </div>
 
                             </div>
-                        </div> 
+                        </div>
                     </div>
                     <div class="col-xs-6">
                         <div class="panel panel-default">
@@ -56,12 +56,12 @@
                             <div class="panel-body">
                                 <ul class="list-unstyled">
                                     <li>
-                                        <input type="radio" name="tipo" id="Y" value="Y" checked="checked"/> 
-                                        <label for="Y">Sin Filtro</label>  
+                                        <input type="radio" name="tipo" id="Y" value="Y" checked="checked"/>
+                                        <label for="Y">Sin Filtro</label>
                                     </li>
                                     <li>
-                                        <input type="radio" name="tipo" id="purchase" value="purchase"/> 
-                                        <label for="purchase">Facturas de compra</label>  
+                                        <input type="radio" name="tipo" id="purchase" value="purchase"/>
+                                        <label for="purchase">Facturas de compra</label>
                                     </li>
                                     <li>
                                         <input type="radio" name="tipo" id="expense" value="expense"/>
@@ -74,10 +74,10 @@
                                 </div>
                                 <div class="form-group">
                                     <label for="product">Buscar Producto</label>
-                                    <input id="product" type="text" class="form-control ui-autocomplete-input" autocomplete="off" placeholder="Nombre/ Referencia/ Codigo de barras"/>   
-                                </div>  
+                                    <input id="product" type="text" class="form-control ui-autocomplete-input" autocomplete="off" placeholder="Nombre/ Referencia/ Codigo de barras"/>
+                                </div>
                             </div>
-                        </div> 
+                        </div>
                     </div>
                 </div>
             </div>
@@ -98,6 +98,7 @@
                 <thead>
                     <tr>
                         <th data-field="number" data-sortable="true">Factura</th>
+                        <th data-field="date_create" data-sortable="true">Fecha</th>
                         <th data-field="partner_name" >Proveedor</th>
                         <th data-field="name" >Producto</th>
                         <th data-field="quantity" data-sortable="true" data-align="right">Cantidad</th>

+ 92 - 0
static/src/reports/report_ranking_pos_orders_customer.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ReportRankingPosOrdersCustomer">
+        <div class="report_view">
+            <div class="reporting_page_header">
+                <h1>Ranking de Clientes</h1>
+            </div>
+            <button type="button" class="oe_button oe_form_button oe_highlight" aria-label="Left Align" data-toggle="collapse" href="#collapseExample" aria-expanded="false" aria-controls="collapseExample">FILTRAR
+            </button>
+            <div class="collapse" id="collapseExample">
+                <div class="card card-body">
+                    <br/>
+                    <div class="row">
+                        <div class="col-xs-6">
+                            <div class="panel panel-default">
+                                <div class="panel-heading">Fechas</div>
+                                <div class="panel-body">
+                                    <ul>
+                                        <li>
+                                            <input type="radio" name="valores" id="X" value="X" checked="checked"/>
+                                            <label for="X">Sin Filtro</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="valores" id="A" value="A"/>
+                                            <label for="A">Hoy</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="valores" id="B" value="B"/>
+                                            <label for="B">Ayer</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="valores" id="C" value="C"/>
+                                            <label for="C">Mes Actual</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="valores" id="D" value="D"/>
+                                            <label for="D">Mes Pasado</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="valores" id="Z" value="Z"/>
+                                            <label for="Z">Busqueda Avanzada</label>
+                                        </li>
+                                    </ul>
+                                    <div id="datepicker" style="display:none;" class="container">
+                                        <label for="from">Desde: </label>
+                                        <input type="text"  id="from" name="from"/>
+                                        <label for="to" >Hasta: </label>
+                                        <input type="text"  id="to" name="to" />
+                                    </div>
+
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-xs-6">
+                            <div class="panel panel-default">
+                                <div class="panel-heading">Características</div>
+                                <div class="form-group">
+                                    <label for="partner">Buscar Cliente</label>
+                                    <input id="partner" type="text" class="form-control ui-autocomplete-input" autocomplete="off" placeholder="Nombre/ CI/ Ruc"/>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div id="toolbar">
+                <button class="oe_button oe_form_button oe_highlight btn-block" value="pdf">PDF</button>
+            </div>
+            <table id="table" class="table_paint_first_row"
+                data-pagination="true"
+                data-toggle="table"
+                data-reorderable-columns="true"
+                data-toolbar="#toolbar"
+                data-show-columns="true"
+                data-buttons-class="oe_button oe_form_button oe_highlight"
+                data-height="auto"
+                data-classes="table table-hover table-condensed"
+                data-row-style="rowStyle"
+                data-search="true">
+                <thead>
+                    <tr>
+                        <th data-field="name">Cliente</th>
+                        <th data-field="ruc">RUC</th>
+                        <th data-field="countPosOrder" data-sortable="true" data-align="right">Monto</th>
+                    </tr>
+                </thead>
+            </table>
+            <canvas></canvas>
+            <div id="dialog"></div>
+        </div>
+    </t>
+</template>

+ 0 - 1
static/src/reports/report_stock.xml

@@ -4,7 +4,6 @@
             <div class="report_view">
                 <div class="reporting_page_header">
                     <h1>Análisis de Stock</h1>
-                    <button onclick="window.history.back()">Atrás</button>
                 </div>
                 <button type="button" class="oe_button oe_form_button oe_highlight" aria-label="Left Align" data-toggle="collapse" href="#collapseExample" aria-expanded="false" aria-controls="collapseExample">FILTRAR
                 </button>

+ 7 - 1
templates.xml

@@ -47,7 +47,13 @@
                 <!-- mrp -->
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_mrp.js"/>
                 <!-- Ranking Pos -->
-                <!-- <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/ranking_pos_orders_product_cy.js"/> -->
+                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/ranking_pos_orders_product_cy.js"/>
+                <!-- Ranking Purchases -->
+                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/ranking_purchases_orders_product_cy.js"/>
+                <!-- Ranking Customers (PointOfSale)-->
+                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_ranking_pos_orders_customer.js"/>
+                <!-- Analisis Pos -->
+                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_pos_orders.js"/>
                 <!-- Analisis de gastos -->
                 <!-- <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_expenses_invoice _analysis.js" /> -->
                 <!-- Utilidad de facturas detalladas -->