Browse Source

ADD FIX Actualización de eiru reporting totales en vista de reportes y agregar filtro de metodo de pago para restaurant

Sebas 7 years ago
parent
commit
e6900a6f73
33 changed files with 3907 additions and 116 deletions
  1. BIN
      __init__.pyc
  2. 11 4
      __openerp__.py
  3. BIN
      controllers.pyc
  4. BIN
      models.pyc
  5. 20 0
      static/src/js/configuration_reporting.js
  6. 74 0
      static/src/js/main.js
  7. 509 0
      static/src/js/reports/ranking_mrp_orders_product_cy.js
  8. 105 11
      static/src/js/reports/ranking_pos_orders_product_cy.js
  9. 110 3
      static/src/js/reports/ranking_purchases_orders_product_cy.js
  10. 551 0
      static/src/js/reports/ranking_sales_orders_product_cy.js
  11. 106 24
      static/src/js/reports/report_pos.js
  12. 33 20
      static/src/js/reports/report_pos_orders.js
  13. 12 0
      static/src/js/reports/report_puchases.js
  14. 13 0
      static/src/js/reports/report_purchases_invoice_analysis.js
  15. 117 0
      static/src/js/reports/report_ranking_pos_orders_customer.js
  16. 544 0
      static/src/js/reports/report_ranking_purchases_orders_supplier.js
  17. 554 0
      static/src/js/reports/report_ranking_sales_orders_customer.js
  18. 1 1
      static/src/js/reports/report_resumen_egresos.js
  19. 342 0
      static/src/js/reports/report_utilidad_producto.js
  20. 1 0
      static/src/js/reports/report_works.js
  21. 93 0
      static/src/reports/ranking_mrp_orders_product_cy.xml
  22. 4 2
      static/src/reports/ranking_pos_orders_product_cy.xml
  23. 6 4
      static/src/reports/ranking_purchases_orders_product_cy.xml
  24. 95 0
      static/src/reports/ranking_sales_orders_product_cy.xml
  25. 10 3
      static/src/reports/report_pos.xml
  26. 1 1
      static/src/reports/report_pos_orders.xml
  27. 10 8
      static/src/reports/report_ranking_pos_orders_customer.xml
  28. 94 0
      static/src/reports/report_ranking_purchases_orders_supplier.xml
  29. 95 0
      static/src/reports/report_ranking_sales_orders_customer.xml
  30. 62 0
      static/src/reports/report_utilidad_producto.xml
  31. 37 35
      templates.xml
  32. 187 0
      views/actions.xml
  33. 110 0
      views/menus.xml

BIN
__init__.pyc


+ 11 - 4
__openerp__.py

@@ -5,9 +5,6 @@
     'category': 'Uncategorized',
     'version': '0.1',
     'depends': ['base','eiru_assets'],
-    'data': [
-    'templates.xml',
-    ],
     'qweb': [
         'static/src/xml/*.xml',
         'static/src/reports/report_resumen_ingresos.xml',
@@ -21,6 +18,9 @@
         '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_ranking_sales_orders_customer.xml',
+        'static/src/reports/report_ranking_purchases_orders_supplier.xml',
+        'static/src/reports/ranking_sales_orders_product_cy.xml',
         'static/src/reports/report_vouchers.xml',
         'static/src/reports/report_mrp.xml',
         'static/src/reports/report_pos_orders.xml',
@@ -29,9 +29,16 @@
         '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/report_utilidad_producto.xml',
         'static/src/reports/ranking_pos_orders_product_cy.xml',
         'static/src/reports/ranking_purchases_orders_product_cy.xml',
+        'static/src/reports/ranking_mrp_orders_product_cy.xml',
         'static/src/reports/report_mrp.xml',
         'static/src/reports/report_stock.xml'
-    ]
+    ],
+    'data': [
+        'templates.xml',
+        'views/actions.xml',
+        'views/menus.xml',
+    ],
 }

BIN
controllers.pyc


BIN
models.pyc


+ 20 - 0
static/src/js/configuration_reporting.js

@@ -33,6 +33,16 @@ function configuration_reporting (instance, widget) {
                 description: 'Permite realizar un analisis de las facturas de venta.',
                 action: 'ReportSaleInvoiceAnalysis'
             },
+            {
+                title: 'Ranking Productos más Vendidos',
+                description: 'Permite realizar un analisis de los Productos más Vendidos Sales Order.',
+                action: 'RankingSalesOrdersProductcy'
+            },
+            {
+                title: 'Ranking de Clientes (Sale Order)',
+                description: 'Permite visualizar el ranking de clientes.',
+                action: 'ReportRankingSalesOrdersCustomer'
+            },
             {
                 title: 'Histórico de Punto de Venta',
                 description: 'Permite realizar un listado de la cabecera de ventas en punto de venta.',
@@ -63,6 +73,11 @@ function configuration_reporting (instance, widget) {
                 description: 'Permite realizar un analisis de los Productos más Comprados.',
                 action: 'RankingPurchasesOrdersProductcy'
             },
+            {
+                title: 'Ranking de Proveedores (Purchase Order)',
+                description: 'Permite visualizar el ranking de proveedores.',
+                action: 'ReportRankingPurchasesOrdersSupplier'
+            },
             {
                 title: 'Análisis de Stock',
                 description: 'Permite realizar un analisis de los productos disponibles en el stock.',
@@ -108,6 +123,11 @@ function configuration_reporting (instance, widget) {
                 description: 'Permite visualizar un listado de producción.',
                 action: 'ReportMrp'
             },
+            {
+                title: 'Ranking Productos más Fabricados',
+                description: 'Permite realizar un analisis de los Productos más Fabricados.',
+                action: 'RankingMrpOrdersProductcy'
+            },
             {
                 title: 'Listado de Proyectos',
                 description: 'Permite visualizar un listado de proyectos.',

+ 74 - 0
static/src/js/main.js

@@ -15,6 +15,7 @@ openerp.eiru_reporting = function (instance) {
         report_resumen_egresos(reporting);
         report_vouchers(reporting);
         report_invoice_balance(reporting);
+        report_utilidad_producto(reporting);
         report_sales_invoice_analysis(reporting);
         report_purchases_invoice_analysis(reporting);
         report_stock(reporting);
@@ -29,7 +30,11 @@ openerp.eiru_reporting = function (instance) {
         report_pos(reporting);
         report_mrp(reporting);
 	    report_ranking_pos_orders_customer(reporting);
+        report_ranking_sales_orders_customer(reporting);
+        report_ranking_purchases_orders_supplier(reporting);
         ranking_pos_orders_product_cy(reporting);
+        ranking_sales_orders_product_cy(reporting);
+        ranking_mrp_orders_product_cy(reporting);
         ranking_purchases_orders_product_cy(reporting);
         report_pos_orders(reporting);
 
@@ -39,5 +44,74 @@ openerp.eiru_reporting = function (instance) {
 
     }
 
+    // Todos los informes
     instance.web.client_actions.add('eiru_reporting.action_report', 'instance.eiru_reporting.ReportingWidget');
+
+    // ******************************************* Finanzas **********************************************************************
+    // Resumen de Ingresos
+    instance.web.client_actions.add('eiru_reporting.ingreso_action_report', 'instance.eiru_reporting.ReportResumenIngresoWidget');
+    // Resumen de Egresos
+    instance.web.client_actions.add('eiru_reporting.egreso_action_report', 'instance.eiru_reporting.ReportResumenEgresoWidget');
+    // Historico de facturas
+    instance.web.client_actions.add('eiru_reporting.invoice_action_report', 'instance.eiru_reporting.ReportInvoiceBalanceWidget');
+    // Historico de pagos
+    instance.web.client_actions.add('eiru_reporting.voucher_action_report', 'instance.eiru_reporting.ReportVoucherWidget');
+    // Listado de cuentas a cobrar Vencidas
+    instance.web.client_actions.add('eiru_reporting.account_pending_action_report', 'instance.eiru_reporting.ReportingAccountPendingWidget');
+    // Listado de cuentas a cobrar
+    instance.web.client_actions.add('eiru_reporting.account_action_report', 'instance.eiru_reporting.ReportingAccountWidget');
+
+    // ******************************************* Ventas *************************************************************************
+    // Analisis de ventas
+    instance.web.client_actions.add('eiru_reporting.sale_action_report', 'instance.eiru_reporting.ReportSaleInvoiceAnalysisWidget');
+
+    // Ranking de clientes
+    instance.web.client_actions.add('eiru_reporting.sale_customer_ranking_action_report', 'instance.eiru_reporting.ReportRankingSalesOrdersCustomerWidget');
+
+    // Ranking de productos
+    instance.web.client_actions.add('eiru_reporting.productranking_action_report', 'instance.eiru_reporting.RankingSalesOrdersProductcyWidget');
+
+    // ******************************************* Terminal de Ventas *************************************************************************
+    // Historico de ventas
+    instance.web.client_actions.add('eiru_reporting.point_of_sale_action_report', 'instance.eiru_reporting.ReportPosWidget');
+    // Analisis de ventas
+    instance.web.client_actions.add('eiru_reporting.point_of_sale_detail_action_report', 'instance.eiru_reporting.ReportPosOrdersWidget');
+    // Ranking de productos
+    instance.web.client_actions.add('eiru_reporting.point_of_sale_ranking_action_report', 'instance.eiru_reporting.RankingPosOrdersProductcyWidget');
+     // Ranking de clientes
+    instance.web.client_actions.add('eiru_reporting.point_of_sale_customer_ranking_action_report', 'instance.eiru_reporting.ReportRankingPosOrdersCustomerWidget');
+
+    // ******************************************* Compras *************************************************************************
+    // Analisis de compras
+    instance.web.client_actions.add('eiru_reporting.purchase_detail_action_report', 'instance.eiru_reporting.ReportPurchaseInvoiceAnalysisWidget');
+    // Ranking de productos
+    instance.web.client_actions.add('eiru_reporting.product_ranking_action_report', 'instance.eiru_reporting.RankingPurchasesOrdersProductcyWidget');
+    // Ranking proveedores
+    instance.web.client_actions.add('eiru_reporting.suppliers_ranking_action_report', 'instance.eiru_reporting.ReportRankingPurchasesOrdersSupplierWidget');
+
+
+    // ******************************************* CRM ***************************************************************************
+    // CRM
+    instance.web.client_actions.add('eiru_reporting.crm_action_report', 'instance.eiru_reporting.ReportCrmWidget');
+    // Historico de llamadas
+    instance.web.client_actions.add('eiru_reporting.crm_call_action_report', 'instance.eiru_reporting.ReportPhoneCallWidget');
+    // Historico de mensajes
+    instance.web.client_actions.add('eiru_reporting.crm_messages_action_report', 'instance.eiru_reporting.ReportMensajeCrmWidget');
+    // Proyectos
+    instance.web.client_actions.add('eiru_reporting.project_action_report', 'instance.eiru_reporting.ReportProjectWidget');
+
+    // ******************************************* Produccion ********************************************************************
+    // Informe de trabajos
+    instance.web.client_actions.add('eiru_reporting.work_action_report', 'instance.eiru_reporting.ReportWorksWidget');
+    // Listado de produccion
+    instance.web.client_actions.add('eiru_reporting.mrp_action_report', 'instance.eiru_reporting.ReportMrpWidget');
+    // Ranking productos más producidos
+    instance.web.client_actions.add('eiru_reporting.mrp_ranking_action_report', 'instance.eiru_reporting.RankingMrpOrdersProductcyWidget');
+
+    // ******************************************* Stock *************************************************************************
+    // Analisis de stock
+    instance.web.client_actions.add('eiru_reporting.stock_action_report', 'instance.eiru_reporting.ReportStockWidget');
+    // Analisis de movimientos de stock
+    instance.web.client_actions.add('eiru_reporting.stock_move_action_report', 'instance.eiru_reporting.ReportStockMoveWidget');
+
 }

+ 509 - 0
static/src/js/reports/ranking_mrp_orders_product_cy.js

@@ -0,0 +1,509 @@
+function ranking_mrp_orders_product_cy (reporting) {
+    "use strict";
+
+    var instance = openerp;
+
+    reporting.RankingMrpOrdersProductcyWidget = reporting.Base.extend({
+        template: 'RankingMrpOrdersProductcy',
+        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',
+            'click canvas': 'showCustomers',
+            'click #volver_btn': 'volver',
+        },
+        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.fetchMrp();
+            }).then(function(Mrp) {
+                self.Mrp = Mrp;
+                return self.fetchProduct();
+            }).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;
+            }
+        },
+
+        fetchMrp: function () {
+            var self = this;
+            var defer = $.Deferred();
+            var modules = self.checkModel('mrp');
+
+            if (modules.length <= 0){
+                self.showMensaje('mrp');
+                return defer;
+            }
+            var filter =[['state', 'in',['done']]];
+            var Mrp = new instance.web.Model('mrp.production');
+            Mrp.query(['id', 'name', 'product_id', 'date_planned', 'product_qty', 'create_date', 'state']).filter(filter).all().then(function(results){
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+
+        // ProductProduct
+        fetchProduct: function() {
+            var self = this;
+            var defer = $.Deferred();
+            var productProduct = new instance.web.Model('product.product');
+            productProduct.query(['id','name','name_template']).filter([['active', '=', true]]).all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+        valorNull:function(dato){
+            var valor ="";
+            if (dato){
+                valor=dato;
+            }
+            return valor;
+        },
+        search: function () {
+            var self = this;
+            var results = self.productProduct;
+            results = _.map(results, function (item) {
+                return {
+                        label: item.id + '-'+ item.name,
+                        value: item.id + '-'+ item.name
+                }
+            });
+            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();
+                }
+            });
+        },
+
+        // Obtener facturas por cada prodcutos
+        getMrpOrder:function(product_id) {
+            var self = this;
+            var desde = self.$el.find('#from').val();
+            var hasta = self.$el.find('#to').val();
+            var Mrp = self.Mrp;
+            // Hoy
+            if ($('#A').is(":checked")){
+                Mrp = _.filter(Mrp, function (inv){
+                    return moment(inv.create_date).format('YYYY-MM-DD') == moment().format('YYYY-MM-DD');
+                });
+            }
+            // Ayer
+            if ($('#B').is(":checked")){
+                Mrp = _.filter(Mrp, 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")){
+                Mrp = _.filter(Mrp, function (inv){
+                    return moment(inv.create_date).format('MM') == moment().format('MM');
+                });
+            }
+            // Mes Pasado
+            if ($('#D').is(":checked")){
+                Mrp = _.filter(Mrp, 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('/');
+                    Mrp = _.filter(Mrp, 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('/');
+                    Mrp = _.filter(Mrp, 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(Mrp,function (inv) {
+                return inv.product_id[0] === product_id;
+            }));
+        },
+
+        // Generar el Ranking
+        BuildTable: function() {
+            var self = this;
+            var itemProduct;
+            var itemMrpOrder;
+            var countMrpOrder = 0;
+            var quantity = 0;
+            var data = [];
+
+            for (var i = 0; i < self.productProduct.length; i++) {
+                itemProduct = self.productProduct[i];
+                itemMrpOrder = self.getMrpOrder(itemProduct.id);
+
+                quantity = _.reduce(_.map(itemMrpOrder,function(item) {
+                    return item.product_qty;
+                }),function(memo, num) {
+                    return memo + num;
+                },0);
+
+                if(quantity > 0){
+                    data.push({
+                        id: itemProduct.id,
+                        name: itemProduct.name,
+                        countMrpOrder: accounting.formatNumber(quantity,0,".",","),
+                        qty: quantity,
+                        graficar: true
+                    });
+                }
+            }
+
+            data.sort(function (a, b) {
+                return b.qty - a.qty
+            });
+
+            self.content = data;
+            self.loadTable(data);
+        },
+
+        factSearch: function(){
+            var self = this;
+
+            var producto = this.$el.find('#product').val().split('-');
+            var content = self.content;
+
+            if (producto != ""){
+                content = _.filter(content, function(inv){
+                    return inv.id == producto[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;
+        },
+
+        // volver
+        volver: function(){
+            this.$el.find('#volver').empty();
+            this.$el.find('#grafico').empty();
+            this.$el.find('.bootstrap-table').show({
+                effect: 'drop',
+                direction: 'down',
+                duration: 200,
+            });
+        },
+
+        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 Cabecera
+                _.each(_.map(data2,function(val){
+                        return val;
+                    }), function(item){
+                            getColumns.push([{
+                                        title: item.title,
+                                        dataKey: item.field
+                                    }]);
+                });
+                this.drawPDF(_.flatten(getColumns),rows);
+            }
+            if (action === 'chart'){
+                var self = this;
+                var objetChar;
+                objetChar = _.filter(rowsNew,function(item){return item.graficar === true});
+                self.fectCharFilter(objetChar);
+            }
+        },
+        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('Listado de producto más fabricados ', 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('Listado de producto más fabricados.pdf')
+        },
+        // Char filter
+        fectCharFilter: function(objetChar){
+            var self = this;
+            var dataBody=[];
+            var dataHeader=[];
+            // objetChar
+            var canvas="<canvas id='graf_resume'></canvas>";
+            this.$el.find('#grafico').append(canvas);
+            _.each(objetChar,function(rowsNew){
+                dataHeader.push(rowsNew.name);
+                dataBody.push(parseFloat(((rowsNew.countMrpOrder.replace(".","")).replace(",","."))));
+            });
+            var selector ="<button type='button' class='oe_button oe_form_button oe_highlight' id='volver_btn' name='volver_btn'><span>Atras</span></button>";
+            this.$el.find('#volver').append(selector);
+            this.$el.find('.bootstrap-table').hide({
+                    effect: 'drop',
+                    direction: 'up',
+                    duration: 200,
+                    complete: function () {
+                        self.drawChart(dataHeader,dataBody);
+                    }
+                });
+        },
+        //Chart
+        drawChart: function (dataHeader,dataBody) {
+            var barChart = new Chart(this.$el.find('#graf_resume'), {
+
+                type: 'line',
+                data: {
+                    labels: dataHeader,
+                    datasets: [
+                        {
+                            label: 'Cantidad de productos',
+                            backgroundColor: '#e3f2fd',
+                            borderColor: '#64b5f6',
+                            borderWidth: 2,
+                            data: dataBody,
+                        }
+                    ]
+                },
+                options: {
+                    responsive: true,
+                    hover: {
+                        mode: 'nearest',
+                        intersect: true
+                    },
+                    title: {
+                        display: true,
+                        text: 'Ranking de productos más producidos'
+                    }
+                }
+            });
+        },
+        // llamar a la lista
+        showCustomers: function (e) {
+            var self = this;
+            if (self.content.length === 0 ) {
+                instance.web.notification.do_warn("Atención","Sin datos");
+                return
+            }
+            var hoy = moment().format('YYYY-MM-DD');
+            var product_id = _.map(self.content,function(map){
+                return map.id;
+            })
+            this.do_action({
+                // name: "Listado de productos más comprados",
+                // type: 'ir.actions.act_window',
+                // res_model: "product.product",
+                // views: [[false,'list'],[self.modelId[1],'form']],
+                // target: 'current',
+                // domain: [['id', 'in', product_id]],
+                // context: {},
+            });
+        }
+    });
+}

+ 105 - 11
static/src/js/reports/ranking_pos_orders_product_cy.js

@@ -27,10 +27,14 @@ function ranking_pos_orders_product_cy (reporting) {
             'change #from' : 'factSearch',
             'change #to' : 'factSearch',
             'click-row.bs.table #table ' : 'clickAnalysisDetail',
+            'click canvas': 'showCustomers',
+            'click #volver_btn': 'volver',
         },
+
         init : function(parent){
             this._super(parent);
         },
+
         start: function () {
             var self = this;
             var table = this.$el.find('#table');
@@ -55,6 +59,7 @@ function ranking_pos_orders_product_cy (reporting) {
             var self = this;
             return _.filter(self.modules,function(item){return item.name === model});
         },
+
         // Lanzar el mensaje
         showMensaje : function(modelos){
             var self = this;
@@ -215,14 +220,6 @@ function ranking_pos_orders_product_cy (reporting) {
             return valor;
         },
 
-        // get line
-        // 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;
@@ -282,8 +279,10 @@ function ranking_pos_orders_product_cy (reporting) {
             var self = this;
             var itemProduct;
             var itemLine;
+            var qty = 0;
             var ranking = [];
             var cat = 0;
+            var countSalesOrder = 0;
             var attribute;
             var lineUnik;
 
@@ -310,17 +309,19 @@ function ranking_pos_orders_product_cy (reporting) {
                         qty: cat,
                         id: lineUnik.product_id[0],
                         date: moment(itemLine.create_date).format("YYYY-MM-DD"),
-                        type: itemProduct.type
+                        type: itemProduct.type,
+                        countSalesOrder: accounting.formatNumber(cat,0,".",","),
+                        graficar: true
                     });
                 }
             }
 
             ranking.sort(function (a, b) {
-                return b.countPosOrder - a.countPosOrder
+                return b.qty - a.qty
             });
 
             self.content = ranking;
-            this.loadTable(ranking);
+            self.loadTable(ranking);
 
         },
 
@@ -376,6 +377,18 @@ function ranking_pos_orders_product_cy (reporting) {
 
             return rows;
         },
+
+        // volver
+        volver: function(){
+            this.$el.find('#volver').empty();
+            this.$el.find('#grafico').empty();
+            this.$el.find('.bootstrap-table').show({
+                effect: 'drop',
+                direction: 'down',
+                duration: 200,
+            });
+        },
+
         clickOnAction: function (e) {
             var self = this;
             var rowsNew;
@@ -403,6 +416,12 @@ function ranking_pos_orders_product_cy (reporting) {
                 });
                 this.drawPDF(_.flatten(getColumns),rows);
             }
+            if (action === 'chart'){
+                var self = this;
+                var objetChar;
+                objetChar = _.filter(rowsNew,function(item){return item.graficar === true});
+                self.fectCharFilter(objetChar);
+            }
         },
         drawPDF: function (getColumns,rows) {
             var self = this;
@@ -456,5 +475,80 @@ function ranking_pos_orders_product_cy (reporting) {
             }
             pdfDoc.save('Producto más vendidos Punto de Venta.pdf')
         },
+        // Char filter
+        fectCharFilter: function(objetChar){
+            var self = this;
+            var dataBody=[];
+            var dataHeader=[];
+            // objetChar
+            var canvas="<canvas id='graf_resume'></canvas>";
+            this.$el.find('#grafico').append(canvas);
+            _.each(objetChar,function(rowsNew){
+                dataHeader.push(rowsNew.product);
+                dataBody.push(parseFloat(((rowsNew.countSalesOrder.replace(".","")).replace(",","."))));
+            });
+            var selector ="<button type='button' class='oe_button oe_form_button oe_highlight' id='volver_btn' name='volver_btn'><span>Atras</span></button>";
+            this.$el.find('#volver').append(selector);
+            this.$el.find('.bootstrap-table').hide({
+                    effect: 'drop',
+                    direction: 'up',
+                    duration: 200,
+                    complete: function () {
+                        self.drawChart(dataHeader,dataBody);
+                    }
+                });
+        },
+        //Chart
+        drawChart: function (dataHeader,dataBody) {
+            var barChart = new Chart(this.$el.find('#graf_resume'), {
+
+                type: 'line',
+                data: {
+                    labels: dataHeader,
+                    datasets: [
+                        {
+                            label: 'Cantidad de productos',
+                            backgroundColor: '#e3f2fd',
+                            borderColor: '#64b5f6',
+                            borderWidth: 2,
+                            data: dataBody,
+                            fill: false,
+                        }
+                    ]
+                },
+                options: {
+                    responsive: true,
+                    hover: {
+                        mode: 'nearest',
+                        intersect: true
+                    },
+                    title: {
+                        display: true,
+                        text: 'Ranking de productos más vendidos'
+                    }
+                }
+            });
+        },
+        // llamar a la lista
+        showCustomers: function (e) {
+            var self = this;
+            if (self.content.length === 0 ) {
+                instance.web.notification.do_warn("Atención","Sin datos");
+                return
+            }
+            var hoy = moment().format('YYYY-MM-DD');
+            var product_id = _.map(self.content,function(map){
+                return map.id;
+            })
+            this.do_action({
+                // name: "Listado de productos más comprados",
+                // type: 'ir.actions.act_window',
+                // res_model: "product.product",
+                // views: [[false,'list'],[self.modelId[1],'form']],
+                // target: 'current',
+                // domain: [['id', 'in', product_id]],
+                // context: {},
+            });
+        }
     });
 }

+ 110 - 3
static/src/js/reports/ranking_purchases_orders_product_cy.js

@@ -27,6 +27,8 @@ function ranking_purchases_orders_product_cy (reporting) {
             'change #from' : 'factSearch',
             'change #to' : 'factSearch',
             'click-row.bs.table #table ' : 'clickAnalysisDetail',
+            'click canvas': 'showSuppliers',
+            'click #volver_btn': 'volver',
         },
         init : function(parent){
             this._super(parent);
@@ -302,6 +304,7 @@ function ranking_purchases_orders_product_cy (reporting) {
             var itemLine;
             var ranking = [];
             var cat = 0;
+            var amount_total_total=0;
             var attribute;
             var lineUnik;
 
@@ -325,15 +328,28 @@ function ranking_purchases_orders_product_cy (reporting) {
 
                     ranking.push({
                         product: itemProduct.name_template + ' ' + attribute,
-                        qty: accounting.formatNumber(cat,2,".",","),
+                        qty: cat,
                         id: lineUnik.product_id[0],
-                        date: moment(itemLine.create_date).format("YYYY-MM-DD")
+                        date: moment(itemLine.create_date).format("YYYY-MM-DD"),
+                        countPurchasesOrder: accounting.formatNumber(cat,2,".",","),
+                        graficar: true
                     });
                 }
             }
 
             ranking.sort(function (a, b) {
-                return b.countPosOrder - a.countPosOrder
+                return b.qty - a.qty
+            });
+
+            var amount_total_total = _.reduce(_.map(ranking,function(map){
+                return(map.qty);
+            }),function(memo, num){
+                return memo + num;
+            },0);
+
+            ranking.push({
+                product: "Total",
+                countPurchasesOrder: accounting.formatNumber((amount_total_total),0,".",","),
             });
 
             self.content = ranking;
@@ -367,6 +383,16 @@ function ranking_purchases_orders_product_cy (reporting) {
 
             return rows;
         },
+        // volver
+        volver: function(){
+            this.$el.find('#volver').empty();
+            this.$el.find('#grafico').empty();
+            this.$el.find('.bootstrap-table').show({
+                effect: 'drop',
+                direction: 'down',
+                duration: 200,
+            });
+        },
         clickOnAction: function (e) {
             var self = this;
             var rowsNew;
@@ -394,6 +420,12 @@ function ranking_purchases_orders_product_cy (reporting) {
                 });
                 this.drawPDF(_.flatten(getColumns),rows);
             }
+            if (action === 'chart'){
+                var self = this;
+                var objetChar;
+                objetChar = _.filter(rowsNew,function(item){return item.graficar === true});
+                self.fectCharFilter(objetChar);
+            }
         },
         drawPDF: function (getColumns,rows) {
             var self = this;
@@ -446,5 +478,80 @@ function ranking_purchases_orders_product_cy (reporting) {
             }
             pdfDoc.save('Productos más comprados.pdf')
         },
+        // Char filter
+        fectCharFilter: function(objetChar){
+            var self = this;
+            var dataBody=[];
+            var dataHeader=[];
+            // objetChar
+            var canvas="<canvas id='graf_resume'></canvas>";
+            this.$el.find('#grafico').append(canvas);
+            _.each(objetChar,function(rowsNew){
+                dataHeader.push(rowsNew.product);
+                dataBody.push(parseFloat(((rowsNew.countPurchasesOrder.replace(".","")).replace(",","."))));
+            });
+            var selector ="<button type='button' class='oe_button oe_form_button oe_highlight' id='volver_btn' name='volver_btn'><span>Atras</span></button>";
+            this.$el.find('#volver').append(selector);
+            this.$el.find('.bootstrap-table').hide({
+                    effect: 'drop',
+                    direction: 'up',
+                    duration: 200,
+                    complete: function () {
+                        self.drawChart(dataHeader,dataBody);
+                    }
+                });
+        },
+
+        //Chart
+        drawChart: function (dataHeader,dataBody) {
+            var barChart = new Chart(this.$el.find('#graf_resume'), {
+
+                type: 'line',
+                data: {
+                    labels: dataHeader,
+                    datasets: [
+                        {
+                            label: 'Cantidad de productos',
+                            backgroundColor: '#e3f2fd',
+                            borderColor: '#64b5f6',
+                            borderWidth: 2,
+                            data: dataBody,
+                        }
+                    ]
+                },
+                options: {
+                    responsive: true,
+                    hover: {
+                        mode: 'nearest',
+                        intersect: true
+                    },
+                    title: {
+                        display: true,
+                        text: 'Ranking de productos más comprados'
+                    }
+                }
+            });
+        },
+        // llamar a la lista
+        showSuppliers: function (e) {
+            var self = this;
+            if (self.content.length === 0 ) {
+                instance.web.notification.do_warn("Atención","Sin datos");
+                return
+            }
+            var hoy = moment().format('YYYY-MM-DD');
+            var product_id = _.map(self.content,function(map){
+                return map.id;
+            })
+            this.do_action({
+                name: "Listado de productos más comprados",
+                type: 'ir.actions.act_window',
+                res_model: "product.product",
+                views: [[false,'list'],[self.modelId[1],'form']],
+                target: 'current',
+                domain: [['id', 'in', product_id]],
+                context: {},
+            });
+        }
     });
 }

+ 551 - 0
static/src/js/reports/ranking_sales_orders_product_cy.js

@@ -0,0 +1,551 @@
+function ranking_sales_orders_product_cy(reporting) {
+    "use strict";
+
+    var instance = openerp;
+
+    reporting.RankingSalesOrdersProductcyWidget = reporting.Base.extend({
+        template: 'RankingSalesOrdersProductcy',
+        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',
+            'click canvas': 'showCustomers',
+            'click #volver_btn': 'volver',
+        },
+
+        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.fecthSalesOrder();
+            }).then(function (SalesOrder) {
+                self.SalesOrder = SalesOrder;
+                return self.fecthSalesOrderLine(SalesOrder);
+            }).then(function (SalesOrderLine) {
+                self.SalesOrderLine = SalesOrderLine;
+                return self.fecthProductProduct(SalesOrderLine);
+            }).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
+        fecthSalesOrder: function() {
+            var self = this;
+            var defer = $.Deferred();
+            var modules = self.checkModel('sale');
+
+            if (modules.length <= 0){
+                self.showMensaje('sale');
+                return defer;
+            }
+
+            var fields = ['id', 'order_line', 'date_order'];
+            // var domain = [['date_order', '>=', desde], ['date_order', '<', hasta], ['state', 'in', ['paid','done','invoiced']]];
+            var domain = [ ['state', 'in', ['done', 'progress']]];
+            var SalesOrder = new instance.web.Model('sale.order');
+            SalesOrder.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        // Obtener linea de la factura
+        fecthSalesOrderLine: function(SalesOrder) {
+            var self = this;
+            var defer = $.Deferred();
+            var order_line = _.flatten(_.map(SalesOrder, function (item) {
+                return item.order_line;
+            }));
+            var fields = ['id', 'product_id', 'create_date', 'product_uom_qty'];
+            var domain = [['id','in', order_line]];
+            var SalesOrderLine = new instance.web.Model('sale.order.line');
+            SalesOrderLine.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        // Obtener Productos
+        fecthProductProduct: function (SalesOrderLine) {
+            var self = this;
+            var defer = $.Deferred();
+            var product_id = _.flatten(_.map(SalesOrderLine,function (item) {
+                return item.product_id[0];
+            }));
+            var fields = ['id', 'name','name_template', 'type', '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 clientes
+        getSalesOrderLiners:function(product_id) {
+            var self = this;
+            var desde = self.$el.find('#from').val();
+            var hasta = self.$el.find('#to').val();
+            var SalesOrderLine = self.SalesOrderLine;
+            // Hoy
+            if ($('#A').is(":checked")){
+                SalesOrderLine = _.filter(SalesOrderLine, function (inv){
+                    return moment(inv.create_date).format('YYYY-MM-DD') == moment().format('YYYY-MM-DD');
+                });
+            }
+            // Ayer
+            if ($('#B').is(":checked")){
+                SalesOrderLine = _.filter(SalesOrderLine, 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")){
+                SalesOrderLine = _.filter(SalesOrderLine, function (inv){
+                    return moment(inv.create_date).format('MM') == moment().format('MM');
+                });
+            }
+            // Mes Pasado
+            if ($('#D').is(":checked")){
+                SalesOrderLine = _.filter(SalesOrderLine, 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('/');
+                    SalesOrderLine = _.filter(SalesOrderLine, 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('/');
+                    SalesOrderLine = _.filter(SalesOrderLine, 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(SalesOrderLine,function (inv) {
+                return inv.product_id[0] === product_id;
+            }));
+        },
+
+        // Generar el ranking
+        BuildTable: function() {
+            var self = this;
+            var itemProduct;
+            var itemLine;
+            var ranking = [];
+            var countSalesOrder = 0;
+            var cat = 0;
+            var attribute;
+            var lineUnik;
+
+            for (var i = 0; i < self.productProduct.length; i++) {
+                itemProduct = self.productProduct[i];
+                itemLine = self.getSalesOrderLiners(itemProduct.id);
+                if (itemLine.length > 0) {
+                    cat = _.reduce(_.map(itemLine, function (map) {
+                        return map.product_uom_qty
+                    }), function (meno,num) {
+                        return meno + num
+                    }, 0);
+
+                    lineUnik = itemLine.shift();
+
+                    if(itemProduct.attribute_str){
+                        attribute = '*' + itemProduct.attribute_str;
+                    }else{
+                        attribute = ' ';
+                    }
+
+                    ranking.push({
+                        product: itemProduct.name_template + ' ' + attribute,
+                        qty: cat,
+                        id: lineUnik.product_id[0],
+                        date: moment(itemLine.create_date).format("YYYY-MM-DD"),
+                        type: itemProduct.type,
+                        countSalesOrder: accounting.formatNumber(cat,0,".",","),
+                        graficar: true
+                    });
+                }
+            }
+
+            ranking.sort(function (a, b) {
+                return b.qty - a.qty
+            });
+
+            self.content = ranking;
+            this.loadTable(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 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;
+        },
+        // volver
+        volver: function(){
+            this.$el.find('#volver').empty();
+            this.$el.find('#grafico').empty();
+            this.$el.find('.bootstrap-table').show({
+                effect: 'drop',
+                direction: 'down',
+                duration: 200,
+            });
+        },
+        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 Cabecera
+                _.each(_.map(data2,function(val){
+                        return val;
+                    }), function(item){
+                            getColumns.push([{
+                                        title: item.title,
+                                        dataKey: item.field
+                                    }]);
+                });
+                this.drawPDF(_.flatten(getColumns),rows);
+            }
+            if (action === 'chart'){
+                var self = this;
+                var objetChar;
+                objetChar = _.filter(rowsNew,function(item){return item.graficar === true});
+                self.fectCharFilter(objetChar);
+            }
+        },
+        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'},
+                    type : {halign:'left',columnWidth: '8px'},
+                },
+                margin: { top: 16, horizontal: 7},
+                addPageContent: function (data) {
+                    pdfDoc.setFontSize(12);
+                    pdfDoc.setFontStyle('bold');
+                    pdfDoc.setTextColor(40);
+                    pdfDoc.text('Listado de producto mas vendidos ', 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('Listado de producto mas vendidos.pdf')
+        },
+        // Char filter
+        fectCharFilter: function(objetChar){
+            var self = this;
+            var dataBody=[];
+            var dataHeader=[];
+            // objetChar
+            var canvas="<canvas id='graf_resume'></canvas>";
+            this.$el.find('#grafico').append(canvas);
+            _.each(objetChar,function(rowsNew){
+                dataHeader.push(rowsNew.product);
+                dataBody.push(parseFloat(((rowsNew.countSalesOrder.replace(".","")).replace(",","."))));
+            });
+            var selector ="<button type='button' class='oe_button oe_form_button oe_highlight' id='volver_btn' name='volver_btn'><span>Atras</span></button>";
+            this.$el.find('#volver').append(selector);
+            this.$el.find('.bootstrap-table').hide({
+                    effect: 'drop',
+                    direction: 'up',
+                    duration: 200,
+                    complete: function () {
+                        self.drawChart(dataHeader,dataBody);
+                    }
+                });
+        },
+        //Chart
+        drawChart: function (dataHeader,dataBody) {
+            var barChart = new Chart(this.$el.find('#graf_resume'), {
+
+                type: 'line',
+                data: {
+                    labels: dataHeader,
+                    datasets: [
+                        {
+                            label: 'Cantidad de productos',
+                            backgroundColor: '#e3f2fd',
+                            borderColor: '#64b5f6',
+                            borderWidth: 2,
+                            data: dataBody,
+                        }
+                    ]
+                },
+                options: {
+                    responsive: true,
+                    hover: {
+                        mode: 'nearest',
+                        intersect: true
+                    },
+                    title: {
+                        display: true,
+                        text: 'Ranking de productos mas vendidos'
+                    }
+                }
+            });
+        },
+
+        // llamar a la lista
+        showCustomers: function (e) {
+            var self = this;
+            if (self.content.length === 0 ) {
+                instance.web.notification.do_warn("Atención","Sin datos");
+                return
+            }
+            var hoy = moment().format('YYYY-MM-DD');
+            var product_id = _.map(self.content,function(map){
+                return map.id;
+            })
+            this.do_action({
+                // name: "Listado de productos más comprados",
+                // type: 'ir.actions.act_window',
+                // res_model: "product.product",
+                // views: [[false,'list'],[self.modelId[1],'form']],
+                // target: 'current',
+                // domain: [['id', 'in', product_id]],
+                // context: {},
+            });
+        }
+    });
+}

+ 106 - 24
static/src/js/reports/report_pos.js

@@ -7,6 +7,8 @@ function report_pos(reporting){
         template: 'ReportPos',
         content: [],
         rowsData :[],
+        PosOrder :[],
+        StatementLine :[],
         modules:[],
         events:{
             'click #toolbar > button' : 'clickOnAction',
@@ -17,6 +19,7 @@ function report_pos(reporting){
             'click #D' : 'factSearch',
             'click #Z' : 'factSearch',
             'change #from' : 'factSearch',
+            'change #current-journal' : 'factSearch',
             'change #to' : 'factSearch',
             'click-row.bs.table #table ' : 'ckickAnalysisDetail',
         },
@@ -99,9 +102,19 @@ function report_pos(reporting){
                 self.modules = modules;
                 return modules;
             }).then(function(modules){
-                return self.fetchAccountInvoice()
-            }).then(function (AccountInvoice){
-                self.AccountInvoice = AccountInvoice;
+                return self.fetchPosOrder()
+            }).then(function (PosOrder){
+                self.PosOrder = PosOrder;
+                return self.fetchStatementLine(PosOrder);
+            }).then(function(StatementLine){
+                self.StatementLine=StatementLine;
+                return self.fetchAccountJournal();
+            }).then(function (AccountJournal) {
+                self.AccountJournal =AccountJournal;
+                self.$el.find('#current-journal').append('<option value="9999999">Todos los pagos</option>');
+                _.each(AccountJournal, function (item) {
+                    self.$el.find('#current-journal').append('<option value="' + item.id + '">' + item.name + '</option>');
+                });
                 return self.fetchResPartner();
             }).then(function(ResPartner){
                 self.ResPartner=ResPartner;
@@ -157,10 +170,11 @@ function report_pos(reporting){
                 return date;
             }
         },
-        fetchAccountInvoice: function () {
+
+        fetchPosOrder: function () {
             var self = this;
-            var filter =[['state', 'in',['done','paid']]];
-            var field =['id', 'name', 'session_id', 'state', 'table_id', 'date_order','partner_id','amount_total','user_id','amount_tax'];
+            var filter =[['state', 'in',['done','paid','invoiced']]];
+            var field =['id', 'name', 'session_id', 'state', 'table_id', 'statement_ids','date_order','partner_id','amount_total','user_id','amount_tax'];
             var defer = $.Deferred();
             var modules = self.checkModel('point_of_sale');
 
@@ -168,12 +182,45 @@ function report_pos(reporting){
                 self.showMensaje('point_of_sale');
                 return defer;
             }
-            var AccountInvoice = new instance.web.Model('pos.order');
-            AccountInvoice.query(field).filter(filter).all().then(function (results) {
+            var PosOrder = new instance.web.Model('pos.order');
+            PosOrder.query(field).filter(filter).all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        // Obtener
+        fetchStatementLine: function(PosOrder) {
+            var self = this;
+            var defer = $.Deferred();
+            var statement_ids = _.flatten(_.map(self.PosOrder, function (item) {
+                return item.statement_ids;
+            }));
+
+            var fields = ['id', 'name', 'amount', 'journal_id', 'pos_statement_id'];
+            var domain = [['pos_statement_id','in', statement_ids],['amount','>', 0]];
+            var StatementLine = new instance.web.Model('account.bank.statement.line');
+            StatementLine.query(fields).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+
+        fetchAccountJournal: function () {
+            var self = this;
+            var defer = $.Deferred();
+            var journal_id = _.flatten(_.map(self.StatementLine, function (item) {
+                return item.journal_id;
+            }));
+            var AccountJournal = new instance.web.Model('account.journal');
+            var domain = [['id','in', journal_id]];
+            AccountJournal.query(['id','name']).filter([['active','=',true],['type', 'in', ['bank','cash']]]).all().then(function(results){
                 defer.resolve(results);
             });
             return defer;
         },
+
         fetchResPartner: function() {
             var self = this;
             var defer = $.Deferred();
@@ -183,6 +230,7 @@ function report_pos(reporting){
             });
             return defer;
         },
+
         valorNull:function(dato){
             var valor ="";
             if (dato){
@@ -190,6 +238,7 @@ function report_pos(reporting){
             }
             return valor;
         },
+
         search: function () {
             var self = this;
             var results = self.ResPartner;
@@ -215,30 +264,57 @@ function report_pos(reporting){
                 }
             });
         },
-        BuildTable: function(invoices){
+
+        getStatementLine: function(id){
             var self = this;
-            var AccountInvoice = self.AccountInvoice;
+            return _.filter(self.StatementLine, function(item){
+                return item.pos_statement_id[0] == id;
+            });
+        },
+
+        BuildTable: function(){
+            var self = this;
+            var PosOrder = self.PosOrder;
             var data = [];
-            _.each(AccountInvoice, function(item){
+            var invoice = [];
+            var amount_total_total=0;
+            _.each(PosOrder, function(item){
+                invoice = self.getStatementLine(item.id).shift();
                 data.push({
                     id : item.id,
                     number: item.name,
                     origin: item.session_id[1],
                     partner: item.partner_id[1],
                     date_invoice: moment(item.date_order).format("DD/MM/YYYY"),
-                    amount_total: accounting.formatNumber(item.amount_total,2,".",","),
+                    amount_total: accounting.formatNumber(item.amount_total,0,".",","),
                     date: item.date_order,
                     partner_id : item.partner_id[0],
                     amount : item.amount_total,
+                    journal: invoice.journal_id[0],
+                    namejournal: invoice.journal_id[1],
                     user: item.user_id[1]
                 });
             });
+
+            var amount_total_total = _.reduce(_.map(data,function(map){
+                return(map.amount);
+            }),function(memo, num){
+                return memo + num;
+            },0);
+
+            data.push({
+                number: "Total",
+                amount_total: accounting.formatNumber((amount_total_total),0,".",","),
+            });
+
             self.content = data;
             this.loadTable(data);
         },
+
         factSearch: function(){
             var self = this;
             var hoy = moment().format('YYYY-MM-DD');
+            var journal = this.$el.find('#current-journal').val();
             var desde =this.$el.find('#from').val();
             var hasta =this.$el.find('#to').val();
             var partner= this.$el.find('#partner').val().split('-');
@@ -304,6 +380,12 @@ function report_pos(reporting){
             }else{
                 $('#datepicker').css('display','none');
             }
+            if(journal != 9999999){
+                content = _.filter(content,function(inv){
+
+                    return inv.journal == journal;
+                });
+            }
             if (partner != ""){
                 content = _.filter(content, function(inv){
                     return inv.partner_id == partner[0];
@@ -311,36 +393,35 @@ function report_pos(reporting){
             }
             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;
+
             var amount = _.reduce(_.map(rows,function(map){
                 return(map.amount);
             }),function(memo, num){
                 return memo + num;
             },0);
-            var total_residual = _.reduce(_.map(rows,function(map){
-                return(map.total_residual);
-            }),function(memo, num){
-                return memo + num;
-            },0);
-            if (rows.length > 0){
-                rows.push({
-                    number: "Total",
-                    amount_total: accounting.formatNumber((amount),2,".",","),
-                    residual: accounting.formatNumber((total_residual),2,".",","),
 
-                });
-            }
+            // if (rows.length > 0){
+            //     rows.push({
+            //         number: "Total",
+            //         amount_total: accounting.formatNumber((amount),0,".",","),
+            //
+            //     });
+            // }
 
             return rows;
         },
+
         clickOnAction: function (e) {
             var self = this;
             var rowsNew;
@@ -384,6 +465,7 @@ function report_pos(reporting){
                     partner : {columnWidth: '8px'},
                     date_invoice : {columnWidth: '8px'},
                     amount_total : {halign:'right',columnWidth: '8px'},
+                    namejournal : {columnWidth: '6px'},
                     user : {halign:'left',columnWidth: '8px'},
                 },
                 margin: { top: 16, horizontal: 7},

+ 33 - 20
static/src/js/reports/report_pos_orders.js

@@ -7,7 +7,7 @@ function report_pos_orders(reporting){
         template: 'ReportPosOrders',
         rowsData :[],
         content:[],
-        
+
         events:{
             'click #toolbar > button' : 'clickOnAction',
             'click #X' : 'fectSearch',
@@ -22,11 +22,11 @@ function report_pos_orders(reporting){
             '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});
@@ -63,7 +63,7 @@ function report_pos_orders(reporting){
             }
             e.stopImmediatePropagation();
         },
-        
+
         fecthFecha: function() {
             var to;
             var dateFormat1 = "mm/dd/yy",
@@ -95,7 +95,7 @@ function report_pos_orders(reporting){
                 }
                 return date;
             }
-        }, 
+        },
 
         valorNull:function(dato){
             var valor ="";
@@ -104,7 +104,7 @@ function report_pos_orders(reporting){
             }
             return valor;
         },
-        
+
         // Cansultar
         submitForm: function () {
             var self = this;
@@ -172,7 +172,7 @@ function report_pos_orders(reporting){
         // clientes
         fetchResPartner: function () {
             var self = this;
-            var defer = $.Deferred();            
+            var defer = $.Deferred();
             var fields = ['id','name','ruc'];
             var domain = [['active', '=', true],['customer', '=', true]];
             var ResPartner = new model.web.Model('res.partner');
@@ -235,7 +235,7 @@ function report_pos_orders(reporting){
                 return item.id == id;
             });
         },
-        
+
         getProductProduct: function(id){
             var self = this;
             return _.filter(self.ProductProduct,function (item) {
@@ -275,8 +275,21 @@ function report_pos_orders(reporting){
                     price_unit : accounting.formatNumber(item.price_unit,0,".",","),
                     qty : accounting.formatNumber(item.qty,0,".",","),
                     price_subtotal_incl : accounting.formatNumber(item.price_subtotal_incl,0,".",","),
+                    price_subtotal_total : item.price_subtotal_incl,
                 });
             });
+
+            var amount_total_total = _.reduce(_.map(data,function(map){
+                return(map.price_subtotal_total);
+            }),function(memo, num){
+                return memo + num;
+            },0);
+
+            data.push({
+                order_name: "Total",
+                price_subtotal_incl: accounting.formatNumber((amount_total_total),0,".",","),
+            });
+
             self.content = data;
             self.loadTable(data)
         },
@@ -329,7 +342,7 @@ function report_pos_orders(reporting){
                 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');
@@ -337,18 +350,18 @@ function report_pos_orders(reporting){
 
             // Filtrar por piso o delivery
             if (floor != 9999999){
-                content=_.filter(content, function (inv){ 
+                content=_.filter(content, function (inv){
                     return inv.floor_id == floor;
                 });
-            } 
+            }
 
             // Filtrar por mesa o delivery
             if (table != 9999999){
-                content=_.filter(content, function (inv){ 
+                content=_.filter(content, function (inv){
                     return inv.table_id == table;
                 });
-            } 
-            
+            }
+
             // Buscar Producto
             if (product != ""){
                 content = _.filter(content, function(inv){
@@ -424,21 +437,21 @@ function report_pos_orders(reporting){
             var totalPagesExp = "{total_pages_count_string}";
             var pdfDoc = new jsPDF();
 
-            // Cantidad 
+            // 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,".",","),
-            });
+            // 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'},

+ 12 - 0
static/src/js/reports/report_puchases.js

@@ -262,6 +262,18 @@ function report_puchases (reporting){
                         origin: invoice.origin
                     });
             });
+
+            var amount_total_total = _.reduce(_.map(data,function(map){
+                return(map.amount);
+            }),function(memo, num){
+                return memo + num;
+            },0);
+
+            data.push({
+                number: "Total",
+                amount_total: accounting.formatNumber((amount_total_total),0,".",","),
+            });
+
             self.newInvoice = data;
             this.loadTable(data);
         },

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

@@ -287,10 +287,23 @@ function report_purchases_invoice_analysis (reporting){
                     date_invoice : (invoice.date_invoice),
                     partner_id : invoice.partner_id[0],
                     date_create :moment(invoice.date_invoice).format("DD/MM/YYYY"),
+                    amount : (item.quantity * item.price_unit),
                     partner_name : invoice.partner_id[1],
                     invoice_type : invoice_type
                 });
             });
+
+            var amount_total_total = _.reduce(_.map(data,function(map){
+                return(map.amount);
+            }),function(memo, num){
+                return memo + num;
+            },0);
+
+            data.push({
+                number: "Total",
+                standar_tot: accounting.formatNumber((amount_total_total),2,".",","),
+            });
+
             self.rowsData=data;
             self.rowOrigin=data;
             self.loadTable(data)

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

@@ -27,6 +27,8 @@ function report_ranking_pos_orders_customer (reporting) {
             'change #from' : 'factSearch',
             'change #to' : 'factSearch',
             'click-row.bs.table #table ' : 'clickAnalysisDetail',
+            'click canvas': 'showCustomers',
+            'click #volver_btn': 'volver',
         },
 
         init : function(parent){
@@ -175,6 +177,13 @@ function report_ranking_pos_orders_customer (reporting) {
         fecthPosOrder: function() {
             var self = this;
             var defer = $.Deferred();
+            var modules = self.checkModel('point_of_sale');
+
+            if (modules.length <= 0){
+                self.showMensaje('point_of_sale');
+                return defer;
+            }
+
             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');
@@ -315,14 +324,28 @@ function report_ranking_pos_orders_customer (reporting) {
                         ruc: self.valorNull(itemPartner.ruc),
                         name: itemPartner.name,
                         countPosOrder: accounting.formatNumber(quantity,0,".",","),
+                        countPosTotal: quantity,
+                        graficar: true
                     });
                 }
             }
 
+            var amount_total_total = _.reduce(_.map(data,function(map){
+                return(map.countPosTotal);
+            }),function(memo, num){
+                return memo + num;
+            },0);
+
+            data.push({
+                name: "Total",
+                quantity: accounting.formatNumber((amount_total_total),0,".",","),
+            });
+
             data.sort(function (a, b) {
                 return b.countPosOrder - a.countPosOrder
             });
 
+
             self.content = data;
             self.loadTable(data);
         },
@@ -334,9 +357,12 @@ function report_ranking_pos_orders_customer (reporting) {
             var content = self.content;
 
             if (partner != ""){
+                var botonChart =this.$el.find('#chart').attr("disabled", true);
                 content = _.filter(content, function(inv){
                     return inv.id == partner[0];
                 });
+            }else {
+                var botonChart =this.$el.find('#chart').attr("disabled", false);
             }
 
             self.BuildTable();
@@ -356,6 +382,17 @@ function report_ranking_pos_orders_customer (reporting) {
             return rows;
         },
 
+        // volver
+        volver: function(){
+            this.$el.find('#volver').empty();
+            this.$el.find('#grafico').empty();
+            this.$el.find('.bootstrap-table').show({
+                effect: 'drop',
+                direction: 'down',
+                duration: 200,
+            });
+        },
+
         clickOnAction: function (e) {
             var self = this;
             var rowsNew;
@@ -383,6 +420,12 @@ function report_ranking_pos_orders_customer (reporting) {
                 });
                 this.drawPDF(_.flatten(getColumns),rows);
             }
+            if (action === 'chart'){
+                var self = this;
+                var objetChar;
+                objetChar = _.filter(rowsNew,function(item){return item.graficar === true});
+                self.fectCharFilter(objetChar);
+            }
         },
 
         drawPDF: function (getColumns,rows) {
@@ -437,5 +480,79 @@ function report_ranking_pos_orders_customer (reporting) {
             }
             pdfDoc.save('Ranking de clientes.pdf')
         },
+        // Char filter
+        fectCharFilter: function(objetChar){
+            var self = this;
+            var dataBody=[];
+            var dataHeader=[];
+            // objetChar
+            var canvas="<canvas id='graf_resume'></canvas>";
+            this.$el.find('#grafico').append(canvas);
+            _.each(objetChar,function(rowsNew){
+                dataHeader.push(rowsNew.name);
+                dataBody.push(parseFloat(((rowsNew.countPosOrder.replace(".","")).replace(",","."))));
+            });
+            var selector ="<button type='button' class='oe_button oe_form_button oe_highlight' id='volver_btn' name='volver_btn'><span>Atras</span></button>";
+            this.$el.find('#volver').append(selector);
+            this.$el.find('.bootstrap-table').hide({
+                    effect: 'drop',
+                    direction: 'up',
+                    duration: 200,
+                    complete: function () {
+                        self.drawChart(dataHeader,dataBody);
+                    }
+                });
+        },
+        //Chart
+        drawChart: function (dataHeader,dataBody) {
+            var barChart = new Chart(this.$el.find('#graf_resume'), {
+
+                type: 'line',
+                data: {
+                    labels: dataHeader,
+                    datasets: [
+                        {
+                            label: 'Total de Venta',
+                            backgroundColor: '#e3f2fd',
+                            borderColor: '#64b5f6',
+                            borderWidth: 2,
+                            data: dataBody,
+                        }
+                    ]
+                },
+                options: {
+                    responsive: true,
+                    hover: {
+                        mode: 'nearest',
+                        intersect: true
+                    },
+                    title: {
+                        display: true,
+                        text: 'Ranking de clientes con más compras'
+                    }
+                }
+            });
+        },
+        // llamar a la lista
+        showCustomers: function (e) {
+            var self = this;
+            if (self.content.length === 0 ) {
+                instance.web.notification.do_warn("Atención","Sin datos");
+                return
+            }
+            var hoy = moment().format('YYYY-MM-DD');
+            var partner_id = _.map(self.content,function(map){
+                return map.id;
+            })
+            this.do_action({
+                name: "Listado de clientes con más compras",
+                type: 'ir.actions.act_window',
+                res_model: "res.partner",
+                views: [[false,'list'],[self.modelId[1],'form']],
+                target: 'current',
+                domain: [['id', 'in', partner_id]],
+                context: {},
+            });
+        }
     });
 }

+ 544 - 0
static/src/js/reports/report_ranking_purchases_orders_supplier.js

@@ -0,0 +1,544 @@
+function report_ranking_purchases_orders_supplier (reporting) {
+    "use strict";
+
+    var instance = openerp;
+
+    reporting.ReportRankingPurchasesOrdersSupplierWidget = reporting.Base.extend({
+        template: 'ReportRankingPurchasesOrdersSupplier',
+        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',
+            'click canvas': 'showSuppliers',
+            'click #volver_btn': 'volver',
+        },
+
+        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:"Proveedor",
+                    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.fecthPurchasesOrder();
+            }).then(function (PurchasesOrder) {
+                self.PurchasesOrder = PurchasesOrder;
+                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
+        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','date_order','partner_id','amount_total'];
+            var domain = [['state', 'in', ['done']], ['partner_id', '!=', false]];
+            var PurchasesOrder = new instance.web.Model('purchase.order');
+            PurchasesOrder.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.PurchasesOrder,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
+        getPurchasesOrder:function(partner_id) {
+            var self = this;
+            var desde = self.$el.find('#from').val();
+            var hasta = self.$el.find('#to').val();
+            var PurchasesOrder = self.PurchasesOrder;
+            // Hoy
+            if ($('#A').is(":checked")){
+                PurchasesOrder = _.filter(PurchasesOrder, function (inv){
+                    return moment(inv.date_order).format('YYYY-MM-DD') == moment().format('YYYY-MM-DD');
+                });
+            }
+            // Ayer
+            if ($('#B').is(":checked")){
+                PurchasesOrder = _.filter(PurchasesOrder, 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")){
+                PurchasesOrder = _.filter(PurchasesOrder, function (inv){
+                    return moment(inv.date_order).format('MM') == moment().format('MM');
+                });
+            }
+            // Mes Pasado
+            if ($('#D').is(":checked")){
+                PurchasesOrder = _.filter(PurchasesOrder, 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('/');
+                    PurchasesOrder = _.filter(PurchasesOrder, 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('/');
+                    PurchasesOrder = _.filter(PurchasesOrder, 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(PurchasesOrder,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 itemPurchasesOrder;
+            var countPurchasesOrder = 0;
+            var quantity = 0;
+            var data = [];
+
+            for (var i = 0; i < self.ResPartner.length; i++) {
+                itemPartner = self.ResPartner[i];
+                itemPurchasesOrder = self.getPurchasesOrder(itemPartner.id);
+
+                quantity = _.reduce(_.map(itemPurchasesOrder,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,
+                        countPurchasesOrder: accounting.formatNumber(quantity,0,".",","),
+                        qty:quantity,
+                        graficar: true
+                    });
+                }
+            }
+
+            data.sort(function (a, b) {
+                return b.qty - a.qty
+            });
+
+            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;
+        },
+
+        // volver
+        volver: function(){
+            this.$el.find('#volver').empty();
+            this.$el.find('#grafico').empty();
+            this.$el.find('.bootstrap-table').show({
+                effect: 'drop',
+                direction: 'down',
+                duration: 200,
+            });
+        },
+
+        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);
+            }
+            if (action === 'chart'){
+                var self = this;
+                var objetChar;
+                objetChar = _.filter(rowsNew,function(item){return item.graficar === true});
+                self.fectCharFilter(objetChar);
+            }
+        },
+
+        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'},
+                    countPurchasesOrder : {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 proveedores', 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 proveedores.pdf')
+        },
+        // Char filter
+        fectCharFilter: function(objetChar){
+            var self = this;
+            var dataBody=[];
+            var dataHeader=[];
+            // objetChar
+            var canvas="<canvas id='graf_resume'></canvas>";
+            this.$el.find('#grafico').append(canvas);
+            _.each(objetChar,function(rowsNew){
+                dataHeader.push(rowsNew.name);
+                dataBody.push(parseFloat(((rowsNew.countPurchasesOrder.replace(".","")).replace(",","."))));
+            });
+            var selector ="<button type='button' class='oe_button oe_form_button oe_highlight' id='volver_btn' name='volver_btn'><span>Atras</span></button>";
+            this.$el.find('#volver').append(selector);
+            this.$el.find('.bootstrap-table').hide({
+                    effect: 'drop',
+                    direction: 'up',
+                    duration: 200,
+                    complete: function () {
+                        self.drawChart(dataHeader,dataBody);
+                    }
+                });
+        },
+
+        //Chart
+        drawChart: function (dataHeader,dataBody) {
+            var barChart = new Chart(this.$el.find('#graf_resume'), {
+
+                type: 'line',
+                data: {
+                    labels: dataHeader,
+                    datasets: [
+                        {
+                            label: 'Total de Compra',
+                            backgroundColor: '#e3f2fd',
+                            borderColor: '#64b5f6',
+                            borderWidth: 2,
+                            data: dataBody,
+                        }
+                    ]
+                },
+                options: {
+                    responsive: true,
+                    hover: {
+                        mode: 'nearest',
+                        intersect: true
+                    },
+                    title: {
+                        display: true,
+                        text: 'Ranking de proveedores a quienes más compras'
+                    }
+                }
+            });
+        },
+        // llamar a la lista
+        showSuppliers: function (e) {
+            var self = this;
+            if (self.content.length === 0 ) {
+                instance.web.notification.do_warn("Atención","Sin datos");
+                return
+            }
+            var hoy = moment().format('YYYY-MM-DD');
+            var partner_id = _.map(self.content,function(map){
+                return map.id;
+            })
+            this.do_action({
+                name: "Listado de proveedores a quien mas compras",
+                type: 'ir.actions.act_window',
+                res_model: "res.partner",
+                views: [[false,'list'],[self.modelId[1],'form']],
+                target: 'current',
+                domain: [['id', 'in', partner_id]],
+                context: {},
+            });
+        }
+    });
+}

+ 554 - 0
static/src/js/reports/report_ranking_sales_orders_customer.js

@@ -0,0 +1,554 @@
+function report_ranking_sales_orders_customer(reporting) {
+    "use strict";
+
+    var instance = openerp;
+
+    reporting.ReportRankingSalesOrdersCustomerWidget = reporting.Base.extend({
+        template: 'ReportRankingSalesOrdersCustomer',
+        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',
+            'click canvas': 'showCustomers',
+            'click #volver_btn': 'volver',
+        },
+
+        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.fecthSalesOrder();
+            }).then(function (SalesOrder) {
+                self.SalesOrder = SalesOrder;
+                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;
+        },
+
+        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();
+        },
+
+        // Obtener Pedido
+        fecthSalesOrder: function() {
+            var self = this;
+            var defer = $.Deferred();
+            var modules = self.checkModel('sale');
+
+            if (modules.length <= 0){
+                self.showMensaje('sale');
+                return defer;
+            }
+
+            var fields = ['id','date_order','partner_id','amount_total'];
+            var domain = [['state', 'in', ['progress','done']], ['partner_id', '!=', false]];
+            var SalesOrder = new instance.web.Model('sale.order');
+            SalesOrder.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.SalesOrder,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
+        getSalesOrder:function(partner_id) {
+            var self = this;
+            var desde = self.$el.find('#from').val();
+            var hasta = self.$el.find('#to').val();
+            var SalesOrder = self.SalesOrder;
+            // Hoy
+            if ($('#A').is(":checked")){
+                SalesOrder = _.filter(SalesOrder, function (inv){
+                    return moment(inv.date_order).format('YYYY-MM-DD') == moment().format('YYYY-MM-DD');
+                });
+            }
+            // Ayer
+            if ($('#B').is(":checked")){
+                SalesOrder = _.filter(SalesOrder, 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")){
+                SalesOrder = _.filter(SalesOrder, function (inv){
+                    return moment(inv.date_order).format('MM') == moment().format('MM');
+                });
+            }
+            // Mes Pasado
+            if ($('#D').is(":checked")){
+                SalesOrder = _.filter(SalesOrder, 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('/');
+                    SalesOrder = _.filter(SalesOrder, 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('/');
+                    SalesOrder = _.filter(SalesOrder, 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(SalesOrder,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 itemSalesOrder;
+            var countSalesOrder = 0;
+            var quantity = 0;
+            var data = [];
+
+            for (var i = 0; i < self.ResPartner.length; i++) {
+                itemPartner = self.ResPartner[i];
+                itemSalesOrder = self.getSalesOrder(itemPartner.id);
+
+                quantity = _.reduce(_.map(itemSalesOrder,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,
+                        countSalesOrder: accounting.formatNumber(quantity,0,".",","),
+                        countPosTotal: quantity,
+                        graficar: true
+                    });
+                }
+            }
+
+            data.sort(function (a, b) {
+                return b.countSalesOrder - a.countSalesOrder
+            });
+
+            // var amount_total_total = _.reduce(_.map(data,function(map){
+            //     return(map.countPosTotal);
+            // }),function(memo, num){
+            //     return memo + num;
+            // },0);
+            //
+            // data.push({
+            //     name: "Total",
+            //     quantity:amount_total_total,
+            // });
+
+            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;
+        },
+
+        // volver
+        volver: function(){
+            this.$el.find('#volver').empty();
+            this.$el.find('#grafico').empty();
+            this.$el.find('.bootstrap-table').show({
+                effect: 'drop',
+                direction: 'down',
+                duration: 200,
+            });
+        },
+
+        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);
+            }
+            if (action === 'chart'){
+                var self = this;
+                var objetChar;
+                objetChar = _.filter(rowsNew,function(item){return item.graficar === true});
+                self.fectCharFilter(objetChar);
+            }
+        },
+
+        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')
+        },
+        // Char filter
+        fectCharFilter: function(objetChar){
+            var self = this;
+            var dataBody=[];
+            var dataHeader=[];
+            // objetChar
+            var canvas="<canvas id='graf_resume'></canvas>";
+            this.$el.find('#grafico').append(canvas);
+            _.each(objetChar,function(rowsNew){
+                dataHeader.push(rowsNew.name);
+                dataBody.push(parseFloat(((rowsNew.countSalesOrder.replace(".","")).replace(",","."))));
+            });
+            var selector ="<button type='button' class='oe_button oe_form_button oe_highlight' id='volver_btn' name='volver_btn'><span>Atras</span></button>";
+            this.$el.find('#volver').append(selector);
+            this.$el.find('.bootstrap-table').hide({
+                    effect: 'drop',
+                    direction: 'up',
+                    duration: 200,
+                    complete: function () {
+                        self.drawChart(dataHeader,dataBody);
+                    }
+                });
+        },
+
+        //Chart
+        drawChart: function (dataHeader,dataBody) {
+            var barChart = new Chart(this.$el.find('#graf_resume'), {
+
+                type: 'line',
+                data: {
+                    labels: dataHeader,
+                    datasets: [
+                        {
+                            label: 'Total de Venta',
+                            backgroundColor: '#e3f2fd',
+                            borderColor: '#64b5f6',
+                            borderWidth: 2,
+                            data: dataBody,
+                        }
+                    ]
+                },
+                options: {
+                    responsive: true,
+                    hover: {
+                        mode: 'nearest',
+                        intersect: true
+                    },
+                    title: {
+                        display: true,
+                        text: 'Ranking de clientes con más compras'
+                    }
+                }
+            });
+        },
+        // llamar a la lista
+        showCustomers: function (e) {
+            var self = this;
+            if (self.content.length === 0 ) {
+                instance.web.notification.do_warn("Atención","Sin datos");
+                return
+            }
+            var hoy = moment().format('YYYY-MM-DD');
+            var partner_id = _.map(self.content,function(map){
+                return map.id;
+            })
+            this.do_action({
+                name: "Listado de clientes con más compras",
+                type: 'ir.actions.act_window',
+                res_model: "res.partner",
+                views: [[false,'list'],[self.modelId[1],'form']],
+                target: 'current',
+                domain: [['id', 'in', partner_id]],
+                context: {},
+            });
+        }
+    });
+}

+ 1 - 1
static/src/js/reports/report_resumen_egresos.js

@@ -2,7 +2,7 @@ function report_resumen_egresos (reporting){
 
     var instance = openerp;
 
-    reporting.ReportResumenEngresoWidget = reporting.Base.extend({
+    reporting.ReportResumenEgresoWidget = reporting.Base.extend({
         template :'ReportResumenEngreso',
         accountVoucher:[],
         resCurrency:[],

+ 342 - 0
static/src/js/reports/report_utilidad_producto.js

@@ -0,0 +1,342 @@
+function report_utilidad_producto (reporting){
+    "use strict";
+
+    var instance = openerp;
+
+    reporting.ReportUtilidadProductoWidget = reporting.Base.extend({
+        template: 'ReportUtilidadProducto',
+        stockLocation: [],
+        stockQuant: [],
+        productProduct : [],
+        rowsData: [],
+        content: [],
+        newStock: [],
+
+        events : {
+            'change #current-location' : 'factSearch',
+            'change #current-category' : 'factSearch',
+            'click #toolbar > button' : 'clickOnAction',
+            'click-row.bs.table #table ' : 'clickAnalysisDetail',
+        },
+        init : function(parent){
+            this._super(parent);
+        },
+        start : function(){
+            var self = this;
+            var dato=[];
+            var table = this.$el.find('#table');
+            table.bootstrapTable({data : self.rowsData});
+            self.submitForm();
+        },
+        valorNull:function(dato){
+            var valor ="";
+            if (dato){
+                valor=dato;
+            }
+            return valor;
+        },
+        clickAnalysisDetail: function(e, row, $element,field){
+            if (field == 'product'){
+                this.do_action({
+                    name:"Variantes de Producto",
+                    type: 'ir.actions.act_window',
+                    res_model: "product.product",
+                    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.fecthStockLocation().then(function(StockLocation){
+                self.StockLocation=StockLocation;
+                return StockLocation;
+            }).then(function(StockLocation){
+                return self.fecthStockQuant();
+            }).then(function(StockQuant){
+                self.StockQuant = StockQuant;
+                return self.fecthProductProduct();
+            }).then(function(ProductProduct){
+                self.ProductProduct = ProductProduct;
+                return self.fecthProductCategory();
+            }).then(function(ProductCategory){
+                self.ProductCategory = ProductCategory;
+                self.$el.find('#current-category').append('<option value="9999999">Todos las categorias</option>');
+                _.each(ProductCategory, function (item) {
+                    self.$el.find('#current-category').append('<option value="' + item.id + '">' + item.name + '</option>');
+                });
+                self.search();
+                return self.BuildTable(self.stockQuant, self.stockLocation);
+            });
+        },
+        fecthStockLocation : function(){
+            var self = this;
+            var defer = $.Deferred();
+            var location = new instance.web.Model('stock.location');
+            var fields = ['id', 'name', 'company_id', 'location_id'];
+            var domain =[['active', '=', true],['usage', '=', 'internal']];
+            location.query(fields).filter(domain).order_by('id').all().then(function(results){
+                defer.resolve(results);
+            })
+            return defer;
+        },
+        fecthStockQuant : function(){
+            var self = this;
+            var defer = $.Deferred();
+            var location = _.flatten(_.map(self.StockLocation,function(item){
+                return item.id;
+            }));
+            var company_id =(_.map(self.StockLocation, function(item){
+                return item.company_id[0];
+            })).shift();
+            var quant = new instance.web.Model('stock.quant');
+            var fields = ['id', 'product_id', 'qty', 'cost','location_id'];
+            var domain =[['company_id', '=', company_id],['location_id', 'in',location]];
+            quant.query(fields).filter(domain).all().then(function(results){
+                defer.resolve(results);
+            })
+            return defer;
+        },
+        fecthProductProduct: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var ids = _.flatten(_.map(self.StockQuant, function (item) {
+                return item.product_id[0];
+            }));
+            var fields = ['id','name','name_template', 'standard_price','type','attribute_value_ids', 'lst_price','ean13','categ_id','attribute_str'];
+            var ProductProduct =  new instance.web.Model('product.product');
+            ProductProduct.query(fields).filter([['id', 'in', ids]]).all().then(function (results) {
+              defer.resolve(results)
+            });
+            return defer;
+        },
+        fecthProductCategory: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var fields = ['id','name'];
+            var ProductCategory =  new instance.web.Model('product.category');
+            ProductCategory.query(fields).filter([['type', '=', 'normal']]).all().then(function (results) {
+              defer.resolve(results)
+            });
+            return defer;
+        },
+        getProductProduct: function(ProductProduct, StockQuant){
+            var self = this;
+            var product_ids= _.flatten(_.map(StockQuant,function(map){
+                return map.product_id[0];
+            }));
+
+            return _.filter(ProductProduct,function(prod){return _.contains(product_ids, prod.id)});
+        },
+        getStockQuant: function(product_id, quantObjs){
+            var self = this;
+            var quantProduct = quantObjs;
+            if (product_id){
+                quantProduct = _.filter(quantProduct, function(item){
+                    return item.product_id[0] == product_id;
+                });
+            }
+            return quantProduct;
+        },
+        BuildTable : function(stockQuant,stockLocation){
+            var self = this;
+            var data=[];
+            var itemLocation;
+            var itemProduct;
+            var itemQuant;
+            var ProductProduct;
+            var product;
+            var quantity = 0;
+            var totalcoste=0;
+            var totalventa=0;
+            var utilidad=0;
+            ProductProduct = self.getProductProduct(self.ProductProduct, self.StockQuant);
+            _.each(ProductProduct, function(item){
+                itemProduct = item;
+                itemQuant = self.getStockQuant( itemProduct.id, self.StockQuant);
+                if (itemQuant.length > 0){
+                    quantity = _.reduce(_.map(itemQuant,function(item){
+                        return item.qty;
+                    }),function(mamo, num){
+                        return mamo + num;
+                    },0);
+                    product = itemQuant.shift();
+                    totalcoste = parseInt(quantity * itemProduct.standard_price);
+                    totalventa = parseInt(quantity * itemProduct.lst_price);
+                    utilidad = totalventa - totalcoste;
+                    data.push({
+                        id : product.product_id[0],
+                        product : product.product_id[1],
+                        ean13 : self.valorNull(itemProduct.ean13),
+                        category_name : itemProduct.categ_id[1],
+                        qty : accounting.formatNumber(quantity,2, ".", ","),
+                        lst_price : accounting.formatNumber(itemProduct.lst_price,0, ".", ","),
+                        valuation_venta: accounting.formatNumber(totalventa,0,".",","),
+                        standard_price : accounting.formatNumber(itemProduct.standard_price,0, ".", ","),
+                        valuation_coste: accounting.formatNumber(totalcoste,0,".",","),
+                        utilidad_stock: accounting.formatNumber(utilidad,0,".",","),
+                        category_id : itemProduct.categ_id[0],
+                        location_id : product.location_id[0],
+                        totalcoste : totalcoste,
+                        totalventa : totalventa,
+                        stocktotal : utilidad
+                    });
+                }
+            })
+            self.content = data;
+            self.loadTable(data);
+        },
+        search: 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.factSearch();
+                    }
+                },
+                close: function( event, ui ) {
+                        self.factSearch();
+                },
+                select: function(event, ui) {
+                    self.factSearch();
+                }
+            });
+        },
+        factSearch: function(){
+            var self = this;
+            var category = this.$el.find('#current-category').val();
+            var product= this.$el.find('#product').val().split('-');
+            var content = self.content;
+            if(category != 9999999){
+                content = _.filter(content,function(inv){
+                    return inv.category_id == category;
+                });
+            }
+            if (product != ""){
+                content = _.filter(content, function(inv){
+                    return inv.id == product[0];
+                });
+            }
+            self.loadTable(content)
+        },
+        loadTable:function(rowsTable){
+            var self = this;
+            self.rowsData = rowsTable;
+            var table = self.$el.find('#table');
+            table.bootstrapTable('load' ,rowsTable);
+        },
+        getObjectPdf: function(rowsTable){
+            var self = this;
+            var rows=[];
+            var rows = self.rowsData;
+
+            var valuation_venta = _.reduce(_.map(rows,function(map){
+                return(map.totalventa);
+            }),function(memo, num){
+                return memo + num;
+            },0);
+            var valuation_coste = _.reduce(_.map(rows,function(map){
+                return(map.totalcoste);
+            }),function(memo, num){
+                return memo + num;
+            },0);
+            var utilidad_stock = _.reduce(_.map(rows,function(map){
+                return(map.stocktotal);
+            }),function(memo, num){
+                return memo + num;
+            },0);
+            if (rows.length > 0){
+                rows.push({
+                    product: "Totales ",
+                    valuation_venta: accounting.formatNumber(valuation_venta,0,".",","),
+                    valuation_coste: accounting.formatNumber(valuation_coste,0,".",","),
+                    utilidad_stock: accounting.formatNumber(utilidad_stock,0,".",","),
+                });
+            }
+            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.getObjectPdf();
+            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 fechaActu= new Date();
+            var location = this.sucDescrip = this.$el.find('#current-location option:selected').text();
+            var totalPagesExp = "{total_pages_count_string}";
+            var pdfDoc = new jsPDF('l');
+
+            pdfDoc.autoTable(getColumns, rows, {
+                    styles: { overflow: 'linebreak', fontSize:8 , columnWidth: 'wrap'},
+                    columnStyles:{
+                                    product :{columnWidth: '8px'},
+                                    qty : {halign:'center'},
+                                    lst_price : {halign:'right'},
+                                    valuation_venta : {halign:'right'},
+                                    standard_price : {halign:'right'},
+                                    valuation_coste : {halign:'right'},
+                                    utilidad_stock : {halign:'right'},
+                                },
+                    margin: { top: 16, horizontal: 7},
+                addPageContent: function (data) {
+                    pdfDoc.setFontSize(12);
+                    pdfDoc.setFontStyle('bold');
+                    pdfDoc.setTextColor(40);
+                    pdfDoc.text('Análisis de Utilidad por Producto', data.settings.margin.left, 10);
+                    // FOOTER
+                    var str = "Pagina  " + data.pageCount;
+                    if (typeof pdfDoc.putTotalPages === 'function') {
+                        str = str + " de " + totalPagesExp;
+                        // +"\n  Día de Expedición  "+fechaActu.getDate()+"/"+fechaActu.getMonth()+"/"+fechaActu.getFullYear();
+                    }
+                    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 Utilidad por Producto.pdf');
+        }
+    });
+}

+ 1 - 0
static/src/js/reports/report_works.js

@@ -336,6 +336,7 @@ function report_works(reporting){
 
                 });
             });
+            
             self.content = data;
             this.loadTable(data);
         },

+ 93 - 0
static/src/reports/ranking_mrp_orders_product_cy.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="RankingMrpOrdersProductcy">
+        <div class="report_view">
+            <div class="reporting_page_header">
+                <h1>Ranking Producto más fabricados</h1>
+                <div id="volver"></div>
+            </div>
+            <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 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="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 type="button" class="oe_button oe_form_button oe_highlight btn-block" aria-label="Left Align" data-toggle="collapse" href="#collapseExample" aria-expanded="false" aria-controls="collapseExample">FILTRAR</button>
+                <button class="oe_button oe_form_button oe_highlight btn-block" value="pdf">PDF</button>
+                <button class="oe_button oe_form_button oe_highlight btn-block" value="chart" id="chart">Graficar</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">Producto</th>
+                        <th data-field="qty" data-sortable="true" data-align="right">Cantidad</th>
+                    </tr>
+                </thead>
+            </table>
+            <canvas></canvas>
+            <div class="widget-content" id="grafico"></div>
+            <div id="dialog"></div>
+        </div>
+    </t>
+</template>

+ 4 - 2
static/src/reports/ranking_pos_orders_product_cy.xml

@@ -4,9 +4,8 @@
         <div class="report_view">
             <div class="reporting_page_header">
                 <h1>Ranking Producto más vendidos Punto de Venta</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">
                 <div class="card card-body">
                     <br/>
@@ -64,7 +63,9 @@
                 </div>
             </div>
             <div id="toolbar">
+                <button type="button" class="oe_button oe_form_button oe_highlight btn-block" aria-label="Left Align" data-toggle="collapse" href="#collapseExample" aria-expanded="false" aria-controls="collapseExample">FILTRAR</button>
                 <button class="oe_button oe_form_button oe_highlight btn-block" value="pdf">PDF</button>
+                <button class="oe_button oe_form_button oe_highlight btn-block" value="chart" id="chart">Graficar</button>
             </div>
             <table id="table" class="table_paint_first_row"
                 data-pagination="true"
@@ -86,6 +87,7 @@
                 </thead>
             </table>
             <canvas></canvas>
+            <div class="widget-content" id="grafico"></div>
             <div id="dialog"></div>
         </div>
     </t>

+ 6 - 4
static/src/reports/ranking_purchases_orders_product_cy.xml

@@ -4,9 +4,8 @@
         <div class="report_view">
             <div class="reporting_page_header">
                 <h1>Ranking Producto más comprados</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">
                 <div class="card card-body">
                     <br/>
@@ -15,7 +14,7 @@
                             <div class="panel panel-default">
                                 <div class="panel-heading">Fechas</div>
                                 <div class="panel-body">
-                                    <ul>
+                                    <ul class="list-unstyled">
                                         <li>
                                             <input type="radio" name="valores" id="X" value="X" checked="checked"/>
                                             <label for="X">Sin Filtro</label>
@@ -64,7 +63,9 @@
                 </div>
             </div>
             <div id="toolbar">
-                <button class="oe_button oe_form_button oe_highlight btn-block" value="pdf">PDF</button>
+                <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>
+                <button class="oe_button oe_form_button oe_highlight" value="pdf">PDF</button>
+                <button class="oe_button oe_form_button oe_highlight" value="chart" id="chart">Graficar</button>
             </div>
             <table id="table" class="table_paint_first_row"
                 data-pagination="true"
@@ -85,6 +86,7 @@
                 </thead>
             </table>
             <canvas></canvas>
+            <div class="widget-content" id="grafico"></div>
             <div id="dialog"></div>
         </div>
     </t>

+ 95 - 0
static/src/reports/ranking_sales_orders_product_cy.xml

@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="RankingSalesOrdersProductcy">
+        <div class="report_view">
+            <div class="reporting_page_header">
+                <h1>Ranking Producto más vendidos</h1>
+                <div id="volver"></div>
+            </div>
+
+            <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 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="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 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>
+                <button class="oe_button oe_form_button oe_highlight" value="pdf">PDF</button>
+                <button class="oe_button oe_form_button oe_highlight" value="chart" id="chart">Graficar</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>
+                        <th data-field="type" data-sortable="true">Tipo</th>
+                    </tr>
+                </thead>
+            </table>
+            <canvas></canvas>
+            <div class="widget-content" id="grafico"></div>
+            <div id="dialog"></div>
+        </div>
+    </t>
+</template>

+ 10 - 3
static/src/reports/report_pos.xml

@@ -3,7 +3,7 @@
     <t t-name="ReportPos">
         <div class="report_view">
             <div class="reporting_page_header">
-                <h1>Histórico de Ventas Pos</h1>
+                <h1>Histórico de Punto de Ventas</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>
@@ -55,8 +55,14 @@
                             <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="current-journal">Metodo de pago: </label>
+                                        <select id="current-journal" class="form-control ui-autocomplete-input"  name="current-journal"></select>
+                                    </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>
@@ -84,6 +90,7 @@
                         <th data-field="partner">Cliente</th>
                         <th data-field="date_invoice" data-sortable="true">Fecha</th>
                         <th data-field="amount_total" data-sortable="true" data-align="right">Total</th>
+                        <th data-field="namejournal">Metodo de pago</th>
                         <th data-field="user" data-sortable="true">Vendedor</th>
                     </tr>
                 </thead>

+ 1 - 1
static/src/reports/report_pos_orders.xml

@@ -3,7 +3,7 @@
       <t t-name="ReportPosOrders">
         <div class="report_view">
           <div class="reporting_page_header">
-            <h1>Análisis de Ventas (Point Of Sale)</h1>
+            <h1>Análisis de Punto de Venta</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

+ 10 - 8
static/src/reports/report_ranking_pos_orders_customer.xml

@@ -3,14 +3,18 @@
     <t t-name="ReportRankingPosOrdersCustomer">
         <div class="report_view">
             <div class="reporting_page_header">
-                <h1>Ranking de Clientes</h1>
+                <h1>Ranking de Clientes con más compras</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">
                 <div class="card card-body">
                     <br/>
                     <div class="row">
+                        <div id="toolbar">
+                            <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>
+                            <button class="oe_button oe_form_button oe_highlight" value="pdf">PDF</button>
+                            <button class="oe_button oe_form_button oe_highlight" value="chart" id="chart">Graficar</button>
+                        </div>
                         <div class="col-xs-6">
                             <div class="panel panel-default">
                                 <div class="panel-heading">Fechas</div>
@@ -63,14 +67,12 @@
                     </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-toolbar="#toolbar"
                 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"
@@ -85,7 +87,7 @@
                     </tr>
                 </thead>
             </table>
-            <canvas></canvas>
+            <div class="widget-content" id="grafico" width="800" height="450"></div>
             <div id="dialog"></div>
         </div>
     </t>

+ 94 - 0
static/src/reports/report_ranking_purchases_orders_supplier.xml

@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ReportRankingPurchasesOrdersSupplier">
+        <div class="report_view">
+            <div class="reporting_page_header">
+                <h1>Ranking de proveedores a quienes más compras</h1>
+                <div id="volver"></div>
+            </div>
+            <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 Proveedor</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 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>
+                <button class="oe_button oe_form_button oe_highlight" value="pdf">PDF</button>
+                <button class="oe_button oe_form_button oe_highlight" value="chart" id="chart">Graficar</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">Proveedor</th>
+                        <th data-field="ruc">RUC</th>
+                        <th data-field="countPurchasesOrder" data-sortable="true" data-align="right">Monto</th>
+                    </tr>
+                </thead>
+            </table>
+            <canvas></canvas>
+            <div class="widget-content" id="grafico" width="800" height="450"></div>
+            <div id="dialog"></div>
+        </div>
+    </t>
+</template>

+ 95 - 0
static/src/reports/report_ranking_sales_orders_customer.xml

@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ReportRankingSalesOrdersCustomer">
+        <div class="report_view">
+            <div class="reporting_page_header">
+                <h1>Ranking de Clientes  con más compras</h1>
+                <div id="volver"></div>
+            </div>
+
+            <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 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>
+                <button class="oe_button oe_form_button oe_highlight" value="pdf">PDF</button>
+                <button class="oe_button oe_form_button oe_highlight" value="chart" id="chart">Graficar</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="countSalesOrder" data-sortable="true" data-align="right">Monto</th>
+                    </tr>
+                </thead>
+            </table>
+            <canvas></canvas>
+            <div class="widget-content" id="grafico" width="800" height="450"></div>
+            <div id="dialog"></div>
+        </div>
+    </t>
+</template>

+ 62 - 0
static/src/reports/report_utilidad_producto.xml

@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+    <template xml:space="preserve">
+        <t t-name="ReportUtilidadProducto">
+            <div class="report_view">
+                <div class="reporting_page_header">
+                    <h1>Análisis de Utilidad por Producto</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">
+                    <br/>
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <div class="panel panel-default">
+                                <div class="panel-heading">Características</div>
+                                <div class="panel-body">
+                                    <div class="col-xs-6">
+                                        <div class="form-group">
+                                            <label for="current-category">Todas la categorias: </label>
+                                            <select id="current-category" class="form-control ui-autocomplete-input"  name="current-category"></select>
+                                        </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>
+                <div id="toolbar">
+                    <button class="oe_button oe_form_button oe_highlight" value="pdf" id="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 class="table_header">
+                        <tr>
+                            <th data-field="product" data-sortable="true" >Producto</th>
+                            <th data-field="ean13" data-sortable="true" >Codigo de barras</th>
+                            <th data-field="category_name" data-sortable="true" >Categoria</th>
+                            <th data-field="qty" data-sortable="true" data-align="center">Cantidad</th>
+                            <th data-field="lst_price" data-sortable="true" data-align="right">Precio Venta</th>
+                            <th data-field="valuation_venta" data-sortable="true" data-align="right">Total Venta</th>
+                            <th data-field="standard_price" data-sortable="true" data-align="right">Precio Costo</th>
+                            <th data-field="valuation_coste" data-sortable="true" data-align="right">Total Costo</th>
+                            <th data-field="utilidad_stock" data-sortable="true" data-align="right">Utilidad Stock</th>
+                        </tr>
+                    </thead>
+                </table>
+            </div>
+        </t>
+    </template>

+ 37 - 35
templates.xml

@@ -25,43 +25,48 @@
 
                 <!-- Analisis de ventas -->
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_sales_invoice_analysis.js" />
+                <!-- Ranking ventas -->
+                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/ranking_sales_orders_product_cy.js"/>
                 <!-- Analisis de compras -->
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_purchases_invoice_analysis.js" />
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_stock.js" />
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_stock_move.js" />
                 <!-- crm -->
-                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_crm.js"/>
-                 <!-- crm_phonecall -->
-                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_phonecall.js"/>
-                 <!-- crm_mensaje -->
-                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_mensajecrm.js"/>
-                 <!-- project -->
-                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_project.js"/>
-                 <!-- <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_balance.js"/> -->
-                <!-- account -->
-                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/reporting_account.js"/>
-                <!-- accountpending -->
-                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/reporting_accountpending.js"/>
-                <!-- work -->
-                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_works.js"/>
-                <!-- 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"/>
-                <!-- 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 -->
-                <!-- <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_invoice_utility.js" /> -->
-                <!-- Listado de productos -->
-                <!-- <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_stock_product.js" /> -->
-
-                <!-- <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_stock_location.js" /> -->
+                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_crm.js"/>
+                <!-- crm_phonecall -->
+                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_phonecall.js"/>
+                  <!-- crm_mensaje -->
+                  <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_mensajecrm.js"/>
+                  <!-- project -->
+                  <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_project.js"/>
+                  <!-- <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_balance.js"/> -->
+                 <!-- account -->
+                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/reporting_account.js"/>
+                 <!-- accountpending -->
+                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/reporting_accountpending.js"/>
+                 <!-- work -->
+                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_works.js"/>
+                 <!-- mrp -->
+                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_mrp.js"/>
+                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/ranking_mrp_orders_product_cy.js"/>
+                 <!-- Ranking Pos -->
+                 <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"/>
+                 <!-- Ranking Customers (Sale)-->
+                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_ranking_sales_orders_customer.js"/>
+                 <!-- Ranking Supplier (Purchase)-->
+                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_ranking_purchases_orders_supplier.js"/>
+                 <!-- Analisis de gastos -->
+                 <!-- <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_expenses_invoice _analysis.js" /> -->
+                 <!-- Utilidad de facturas detalladas -->
+                 <!-- <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_invoice_utility.js" /> -->
+                 <!-- Listado de utilidad por producto -->
+                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_utilidad_producto.js" />
             </xpath>
         </template>
 
@@ -69,8 +74,5 @@
             <field name="name">Eiru Reporting</field>
             <field name="tag">eiru_reporting.action_report</field>
         </record>
-
-        <menuitem id="eiru_report_menu" name="Reportes" parent="base.menu_reporting" />
-        <menuitem id="eiru_report_menu_submenu" parent="eiru_report_menu" name="Reportes" action="eiru_reporting_action" />
     </data>
 </openerp>

+ 187 - 0
views/actions.xml

@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+	<data>
+
+        <!-- Todos los informes -->
+        <record id="all_report_action" model="ir.actions.client">
+            <field name="name">Todos los Informes</field>
+            <field name="tag">eiru_reporting.action_report</field>
+        </record>
+        <!-- Reporting Dashboard -->
+        <record id="eiru_reporting_dashboard_action" model="ir.actions.client">
+            <field name="name">Reporting Dashboard</field>
+            <field name="tag">eiru_reporting_dashboard.action_dashboard</field>
+        </record>
+
+
+        <!-- *************************** Finanzas *************************** -->
+        <!-- Resumen de ingreso -->
+        <record id="ingreso_report_action" model="ir.actions.client">
+            <field name="name">Resumen de Ingresos</field>
+            <field name="tag">eiru_reporting.ingreso_action_report</field>
+        </record>
+
+        <!-- Resumen de egreso -->
+        <record id="egreso_report_action" model="ir.actions.client">
+            <field name="name">Resumen de Egresos</field>
+            <field name="tag">eiru_reporting.egreso_action_report</field>
+        </record>
+
+        <!-- Historico de facturas -->
+        <record id="invoice_report_action" model="ir.actions.client">
+            <field name="name">Historico de Facturas</field>
+            <field name="tag">eiru_reporting.invoice_action_report</field>
+        </record>
+
+        <!-- Historico de pagos -->
+         <record id="voucher_report_action" model="ir.actions.client">
+            <field name="name">Historico de Pagos</field>
+            <field name="tag">eiru_reporting.voucher_action_report</field>
+        </record>
+
+        <!-- Listado de cuentas vencidas a cobrar -->
+         <record id="account_pending_report_action" model="ir.actions.client">
+            <field name="name">Cuentas a Cobrar</field>
+            <field name="tag">eiru_reporting.account_pending_action_report</field>
+        </record>
+
+        <!-- Listado de cuentas a cobrar -->
+         <record id="account_report_action" model="ir.actions.client">
+            <field name="name">Cuentas a Cobrar (Vencidos)</field>
+            <field name="tag">eiru_reporting.account_action_report</field>
+        </record>
+
+        <!-- *************************** Ventas *************************** -->
+
+        <!-- Analisis de facturas de ventas -->
+        <record id="sale_report_action" model="ir.actions.client">
+            <field name="name">Analisis de facturas de ventas</field>
+            <field name="tag">eiru_reporting.sale_action_report</field>
+        </record>
+
+		<!-- Ranking de clientes con mas compras -->
+		<record id="sale_customer_ranking_report_action" model="ir.actions.client">
+			<field name="name">Ranking de clientes</field>
+			<field name="tag">eiru_reporting.sale_customer_ranking_action_report</field>
+		</record>
+
+		<!-- Ranking Productos (Sale)-->
+		<record id="productranking_report_action" model="ir.actions.client">
+            <field name="name">Ranking de productos mas vendidos</field>
+            <field name="tag">eiru_reporting.productranking_action_report</field>
+        </record>
+
+        <!-- *************************** Punto de Ventas *************************** -->
+
+        <!-- Historico punto de ventas -->
+        <record id="point_sale_report_action" model="ir.actions.client">
+            <field name="name">Historico de Ventas</field>
+            <field name="tag">eiru_reporting.point_of_sale_action_report</field>
+        </record>
+
+        <!-- Analisis de ventas -->
+        <record id="point_sale_detail_report_action" model="ir.actions.client">
+            <field name="name">Analisis de Ventas</field>
+            <field name="tag">eiru_reporting.point_of_sale_detail_action_report</field>
+        </record>
+
+        <!-- Ranking de productos mas vendidos -->
+        <record id="point_sale_ranking_report_action" model="ir.actions.client">
+            <field name="name">Ranking de Productos</field>
+            <field name="tag">eiru_reporting.point_of_sale_ranking_action_report</field>
+        </record>
+
+        <!-- Ranking de clientes que mas compran -->
+        <record id="point_sale_customer_ranking_report_action" model="ir.actions.client">
+            <field name="name">Ranking de clientes</field>
+            <field name="tag">eiru_reporting.point_of_sale_customer_ranking_action_report</field>
+        </record>
+
+        <!-- *************************** Compras *************************** -->
+
+        <!-- Analisis de facturas de compras -->
+        <record id="purchase_detail_report_action" model="ir.actions.client">
+            <field name="name">Analisis de facturas de compras</field>
+            <field name="tag">eiru_reporting.purchase_detail_action_report</field>
+        </record>
+
+         <!-- Ranking de productos mas comprados -->
+        <record id="product_ranking_report_action" model="ir.actions.client">
+            <field name="name">Ranking de productos</field>
+            <field name="tag">eiru_reporting.product_ranking_action_report</field>
+        </record>
+
+		<!-- Ranking Supplier (Purchase)-->
+		<record id="suppliers_ranking_report_action" model="ir.actions.client">
+            <field name="name">Ranking de proveedores a quienes mas compras</field>
+            <field name="tag">eiru_reporting.suppliers_ranking_action_report</field>
+        </record>
+
+        <!-- Analisis de facturas de ventas -->
+        <record id="sale_report_action" model="ir.actions.client">
+            <field name="name">Analisis de facturas de ventas</field>
+            <field name="tag">eiru_reporting.sale_action_report</field>
+        </record>
+
+        <!-- *************************** CRM *************************** -->
+
+        <!-- Historico -->
+        <record id="crm_report_action" model="ir.actions.client">
+            <field name="name">Historico CRM</field>
+            <field name="tag">eiru_reporting.crm_action_report</field>
+        </record>
+
+        <!-- Historico de llamadas -->
+        <record id="crm_call_report_action" model="ir.actions.client">
+            <field name="name">Historico Llamadas</field>
+            <field name="tag">eiru_reporting.crm_call_action_report</field>
+        </record>
+
+        <!-- Historico de Mensajes -->
+        <record id="crm_messages_report_action" model="ir.actions.client">
+            <field name="name">Historico Mensajes</field>
+            <field name="tag">eiru_reporting.crm_messages_action_report</field>
+        </record>
+
+        <!-- Proyectos -->
+        <record id="project_report_action" model="ir.actions.client">
+            <field name="name">Proyectos</field>
+            <field name="tag">eiru_reporting.project_action_report</field>
+        </record>
+
+        <!-- *************************** Produccion *************************** -->
+
+        <!-- Informe de trabajos -->
+        <record id="work_report_action" model="ir.actions.client">
+            <field name="name">Informe de Trabajos</field>
+            <field name="tag">eiru_reporting.work_action_report</field>
+        </record>
+
+        <!-- Listado de produccion -->
+        <record id="mrp_report_action" model="ir.actions.client">
+            <field name="name">Listado de produccion</field>
+            <field name="tag">eiru_reporting.mrp_action_report</field>
+        </record>
+
+		<!-- Ranking productos más producidos (Producción)-->
+		<record id="mrp_ranking_report_action" model="ir.actions.client">
+			<field name="name">Ranking de productos mas producidos</field>
+			<field name="tag">eiru_reporting.mrp_ranking_action_report</field>
+		</record>
+
+        <!-- *************************** Stock *************************** -->
+
+        <!-- Analisis de stock -->
+        <record id="stock_report_action" model="ir.actions.client">
+            <field name="name">Analisis de Stock</field>
+            <field name="tag">eiru_reporting.stock_action_report</field>
+        </record>
+
+        <!-- Analisis de movimientos de stock -->
+        <record id="stock_move_report_action" model="ir.actions.client">
+            <field name="name">Analisis de movimiento de stock</field>
+            <field name="tag">eiru_reporting.stock_move_action_report</field>
+        </record>
+
+    </data>
+</openerp>

+ 110 - 0
views/menus.xml

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data>
+        <!-- menu principal -->
+        <menuitem id="eiru_report_main_menu" name="Informes" sequence="20"/>
+        <!-- Primer Submenu -->
+        <!-- <menuitem id="all_report_parent_menu" name="Todos los informes" parent="eiru_report_main_menu" sequence="1"/> -->
+         <menuitem id="report_dashboard_parent_menu" name="Panel de control" parent="eiru_report_main_menu" sequence="1"/>
+
+	        <!-- Todos los informes -->
+	        <menuitem id="report_dashboard_menu_submenu" parent="report_dashboard_parent_menu" name="Panel de control" action="eiru_reporting_dashboard_action" />
+
+	    <!-- Segundo Submenu -->
+        <menuitem id="account_report_parent_menu" name="Finanzas" parent="eiru_report_main_menu" sequence="2"/>
+
+	        <!-- Resumen Ingreso -->
+	        <menuitem id="resumen_ingreso_report_menu_submenu" parent="account_report_parent_menu" name="Resumen Ingresos" action="ingreso_report_action" sequence="0"/>
+
+	        <!-- Resumen Egreso -->
+	        <menuitem id="resumen_egreso_report_menu_submenu" parent="account_report_parent_menu" name="Resumen Egresos" action="egreso_report_action" sequence="1"/>
+
+	        <!-- Historico de facturas -->
+	        <menuitem id="invoice_report_menu_submenu" parent="account_report_parent_menu" name="Historico de Facturas" action="invoice_report_action" sequence="2"/>
+
+	        <!-- Historico de pagos -->
+	        <menuitem id="voucher_report_menu_submenu" parent="account_report_parent_menu" name="Historico de Pagos" action="voucher_report_action" sequence="3"/>
+
+	        <!-- Listado de cuentas a cobrar-->
+	        <menuitem id="account_pending_menu_submenu" parent="account_report_parent_menu" name="Cuentas a cobrar" action="account_pending_report_action" sequence="4"/>
+
+	        <!-- Listado de cuentas a cobrar (vencidos)-->
+	        <menuitem id="account_report_menu_submenu" parent="account_report_parent_menu" name="Cuentas a cobrar (Vencidos)" action="account_report_action" sequence="5"/>
+
+	    <!-- Ventas Submenu -->
+        <menuitem id="sale_report_parent_menu" name="Ventas" parent="eiru_report_main_menu" sequence="3"/>
+
+	        <!-- Analisis de facturas de ventas -->
+	        <menuitem id="sale_report_menu_submenu" parent="sale_report_parent_menu" name="Analisis Ventas" action="sale_report_action" sequence="0"/>
+
+            <!-- Ranking de clientes con mas compras -->
+            <menuitem id="saleranking_report_menu_submenu" parent="sale_report_parent_menu" name="Ranking de clientes con mas compras" action="sale_customer_ranking_report_action" sequence="1"/>
+
+            <!-- Ranking de productos mas vendidos -->
+            <menuitem id="productranking_report_menu_submenu" parent="sale_report_parent_menu" name="Ranking de productos mas vendidos" action="productranking_report_action" sequence="2"/>
+
+	    <!-- POS Submenu -->
+        <menuitem id="point_of_sale_report_parent_menu" name="Terminal de Ventas" parent="eiru_report_main_menu" sequence="4"/>
+
+	        <!-- Historico de ventas -->
+	        <menuitem id="point_of_sale_report_menu_submenu" parent="point_of_sale_report_parent_menu" name="Historico de Ventas" action="point_sale_report_action" />
+
+			<!-- Analisis de ventas -->
+	        <menuitem id="point_of_sale_detail_report_menu_submenu" parent="point_of_sale_report_parent_menu" name="Analisis de Ventas" action="point_sale_detail_report_action" />
+
+	        <!-- Ranking de productos -->
+	        <menuitem id="point_of_sale_ranking_report_menu_submenu" parent="point_of_sale_report_parent_menu" name="Ranking de productos" action="point_sale_ranking_report_action"/>
+
+	        <!-- Ranking de clientes -->
+	        <menuitem id="point_of_sale_customer_ranking_report_menu_submenu" parent="point_of_sale_report_parent_menu" name="Ranking de Clientes" action="point_sale_customer_ranking_report_action"/>
+
+	    <!-- Quinto Submenu -->
+        <menuitem id="purchase_report_parent_menu" name="Compras" parent="eiru_report_main_menu" sequence="5"/>
+
+	        <!-- Analisis de compras -->
+	        <menuitem id="purchase_detail_report_menu_submenu" parent="purchase_report_parent_menu" name="Analisis de compras" action="purchase_detail_report_action" />
+
+			<!-- Ranking de productos -->
+	        <menuitem id="product_ranking_report_menu_submenu" parent="purchase_report_parent_menu" name="Ranking de productos" action="product_ranking_report_action" />
+
+            <!-- Ranking de proveedores -->
+            <menuitem id="suppliers_ranking_report_menu_submenu" parent="purchase_report_parent_menu" name="Ranking de proveedores a quien mas compras" action="suppliers_ranking_report_action" />
+
+        <!-- Sexto Submenu -->
+        <menuitem id="crm_report_parent_menu" name="CRM" parent="eiru_report_main_menu" sequence="6"/>
+
+	        <!-- CRM -->
+	        <menuitem id="crm_report_menu_submenu" parent="crm_report_parent_menu" name="Historico CRM" action="crm_report_action" />
+
+	        <!-- Historico de llamadas -->
+	        <menuitem id="crm_call_report_menu_submenu" parent="crm_report_parent_menu" name="Historico de llamadas" action="crm_call_report_action" />
+
+	        <!-- Historico de mensajes -->
+	        <menuitem id="crm_messages_report_menu_submenu" parent="crm_report_parent_menu" name="Historico de mensajes" action="crm_messages_report_action" />
+
+	        <!-- Proyectos -->
+	        <menuitem id="project_report_menu_submenu" parent="crm_report_parent_menu" name="Proyectos" action="project_report_action" />
+
+	    <!-- Septimo Submenu -->
+        <menuitem id="mrp_report_parent_menu" name="Produccion" parent="eiru_report_main_menu" sequence="7"/>
+
+	        <!-- Informe de trabajos -->
+	        <menuitem id="work_report_menu_submenu" parent="mrp_report_parent_menu" name="Informes de trabajos" action="work_report_action" />
+
+	        <!--Listado de produccion -->
+	        <menuitem id="mrp_report_menu_submenu" parent="mrp_report_parent_menu" name="Listado de produccion" action="mrp_report_action"/>
+
+            <!--Listado de productos más producidos -->
+            <menuitem id="rankingmrp_report_menu_submenu" parent="mrp_report_parent_menu" name="Ranking de productos mas producidos" action="mrp_ranking_report_action"/>
+
+	    <!-- Octavo Submenu -->
+        <menuitem id="stock_report_parent_menu" name="Stock" parent="eiru_report_main_menu" sequence="8"/>
+
+	        <!-- Analisis de stock -->
+	        <menuitem id="stock_report_menu_submenu" parent="stock_report_parent_menu" name="Analisis de Stock" action="stock_report_action" />
+
+	        <!--Analisis de movimientos de stock -->
+	        <menuitem id="stock_move_report_menu_submenu" parent="stock_report_parent_menu" name="Analisis de movimientos de stock" action="stock_move_report_action"/>
+
+    </data>
+</openerp>