Browse Source

[ADD] agregado informe de analisis de sesiones

Rodney Elpidio Enciso Arias 6 years ago
parent
commit
6fdbb0ad7e

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

@@ -7,9 +7,11 @@ openerp.eiru_reports_pos_analytic = function (instance) {
 
     try {
         report_session(reporting);
+        report_session_analytic(reporting);
     } catch (e) {
         // ignorar error
     }
 
     instance.web.client_actions.add('eiru_reports_pos_analytic.session_action', 'instance.eiru_reports_pos_analytic.ReportSessionWidget');
+    instance.web.client_actions.add('eiru_reports_pos_analytic.session_analytic_action', 'instance.eiru_reports_pos_analytic.ReportSessionAnalyticWidget');
 }

+ 20 - 15
static/src/js/reports/report_session.js

@@ -460,6 +460,13 @@ function report_session(reporting){
                     utc_stop = moment.utc(item.stop_at,'YYYY-MM-DD h:mm:ss A');
                     utc_stop = moment(utc_stop._d).format('DD/MM/YYYY HH:mm:ss');
                 };
+
+                var total = _.reduce(_.map(PosOrder,function(item) {
+                    return item.amount_total_currency;
+                }),function(memo, num) {
+                    return memo + num;
+                },0);
+
                 data.push({
                     id: item.id,
                     config_id: item.config_id[1],
@@ -467,6 +474,8 @@ function report_session(reporting){
                     user_id: item.user_id[1],
                     start_at: utc_start,
                     stop_at: utc_stop,
+                    amount_total: accounting.formatMoney(total, '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator),
+                    amount: total,
                     /*
                     ================================
                         TOTAL FOOTER CONFIGURATION
@@ -523,12 +532,6 @@ function report_session(reporting){
             var column = table.bootstrapTable('getVisibleColumns');
             var row = table.bootstrapTable('getData');
 
-            var qty = _.reduce(_.map(row, function (map) {
-                return map.qty;
-            }), function (memo, num) {
-                return memo + num;
-            });
-
             var amount = _.reduce(_.map(row, function (map) {
                 return map.amount;
             }), function (memo, num) {
@@ -536,10 +539,9 @@ function report_session(reporting){
             });
 
             row.push({
-                medic: 'Totales',
-                qty_total: qty,
-                total_amount: accounting.formatMoney(amount, '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator),
-            })
+                config_id: 'Totales',
+                amount_total: accounting.formatMoney(amount, '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator),
+            });
 
             if (action === 'pdf') {
                 var data = _.map(column, function (val){ return val.field});
@@ -555,13 +557,16 @@ function report_session(reporting){
                     CONFIGURACION DEL PDF
                 ============================================================
                 */
-                var pdf_title = 'Ranking de Doctores';
+                var pdf_title = 'Sesiones de Venta';
                 var pdf_type = '';
-                var pdf_name = 'ranking_de_doctores';
+                var pdf_name = 'sesiones_de_venta';
                 var pdf_columnStyles =  {
-                    product :{halign:'left'},
-                    qty_total :{columnWidth: 30, halign:'right'},
-                    total_amount:{columnWidth: 30, halign:'right'},
+                    config_id :{halign:'left'},
+                    name :{halign:'left'},
+                    user_id :{halign:'left'},
+                    start_at :{columnWidth: 30},
+                    stop_at:{columnWidth: 30},
+                    amount_total:{halign:'right',columnWidth: 30},
                 };
                 /*
                 ============================================================

+ 629 - 0
static/src/js/reports/report_session_analytic.js

@@ -0,0 +1,629 @@
+function report_session_analytic(reporting){
+    "use strict";
+
+    var model = openerp;
+
+    reporting.ReportSessionAnalyticWidget = reporting.Base.extend({
+        template: 'ReportSessionAnalytic',
+        rowsData :[],
+        content :[],
+        modules: ['point_of_sale'],
+
+        events:{
+            'click #toolbar > button' : 'clickOnAction',
+            'click #generate' : 'fetchGenerate',
+            'change #current-company' : 'updateSelections',
+            'change #current-attribute' : 'updateAttributeSelections',
+            'change #current-period' : 'updatePeriodSelections',
+            'change #current-date' : 'ShowDateRange',
+        },
+
+        init : function(parent){
+            this._super(parent);
+        },
+
+        start: function () {
+            var table = this.$el.find('#table');
+            table.bootstrapTable({data : self.rowsData});
+            var date = new model.eiru_reports.ReportDatePickerWidget(self);
+            date.fecthFecha();
+            this.fetchInitial();
+        },
+
+        valorNull:function(dato){
+            var valor = "";
+            if (dato){
+                valor = dato;
+            }
+            return valor;
+        },
+
+        checkModel : function(model){
+            var self = this;
+            return _.filter(self.IrModuleModule,function(item){
+                return item.name === model
+            });
+        },
+
+        ShowDateRange : function(){
+            var self = this;
+            var date = self.$el.find('#current-date').val();
+            if(date == 'range'){
+                self.$el.find('.datepicker').css('display','block');
+            }
+            if(date != 'range'){
+                self.$el.find('.datepicker').css('display','none');
+            }
+
+        },
+
+        fetchInitial: function () {
+            var self = this;
+            self.fetchResCompany().then(function (ResCompany) {
+                return ResCompany;
+            }).then(function(ResCompany) {
+                self.ResCompany = ResCompany;
+                if(ResCompany.length > 1){
+                    self.$el.find('#current-company').append('<option value="9999999">Todas las empresas</option>');
+                    _.each(ResCompany,function(item){
+                        self.$el.find('#current-company').append('<option value="' + item.id + '">' + item.name + '</option>');
+                    });
+                }else{
+                    self.$el.find('.company').css('display','none');
+                }
+                return self.fetchResStore();
+            }).then(function(ResStore){
+                self.ResStore = ResStore;
+                if(ResStore.length > 1){
+                    self.$el.find('#current-store').append('<option value="9999999">Todas las sucursales</option>');
+                    _.each(ResStore,function(item){
+                        self.$el.find('#current-store').append('<option value="' + item.id + '">' + item.name + '</option>');
+                    });
+                }else{
+                    self.$el.find('.store').css('display','none');
+                }
+                return self.fetchAccountJournal();
+            }).then(function(AccountJournal){
+                self.AccountJournal = AccountJournal;
+                return self.fetchPosConfig();
+            }).then(function(PosConfig){
+                self.PosConfig = PosConfig;
+                self.$el.find('#current-config').append('<option value="9999999">Todas las Terminales</option>');
+                _.each(PosConfig,function(item){
+                    self.$el.find('#current-config').append('<option value="' +  item.id + '">' + item.name + '</option>');
+                });
+                return self.fetchResCurrency();
+            }).then(function(ResCurrency){
+                self.ResCurrency = ResCurrency;
+            });
+            self.$el.find('#generate').css('display','inline');
+            return;
+        },
+
+        fetchGenerate: function () {
+            var self = this;
+            self.$el.find('.search-form').block({
+                message: null,
+                overlayCSS: {
+                    backgroundColor: '#FAFAFA'
+                }
+            });
+            self.$el.find('.report-form').block({
+                message: null,
+                overlayCSS: {
+                    backgroundColor: '#FAFAFA'
+                }
+            });
+
+            this.fetchPosSession().then(function(PosSession) {
+                return PosSession;
+            }).then(function (PosSession) {
+                self.PosSession = PosSession;
+                return self.fetchPosOrder();
+            }).then(function (PosOrder){
+                self.PosOrder = PosOrder;
+                return self.fetchPosOrderLine();
+            }).then(function (PosOrderLine){
+                self.PosOrderLine = PosOrderLine;
+                return self.fetchProductProduct();
+            }).then(function (ProductProduct){
+                self.ProductProduct = ProductProduct;
+                return self.BuildTable();
+            });
+        },
+
+        /*====================================================================
+            RES COMPANY
+        ====================================================================*/
+        fetchResCompany: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var currency = new model.web.Model('res.company');
+            var field=['id','name','currency_id','logo'];
+            currency.query(field).filter().all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        /*====================================================================
+            RES STORE
+        ====================================================================*/
+        fetchResStore: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var field = ['id','name','company_id'];
+            var ResStore = new model.web.Model('res.store');
+            ResStore.query(field).all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        /*====================================================================
+            ACCOUNT JOURNAL
+        ====================================================================*/
+        fetchAccountJournal: function(){
+            var self = this;
+            var domain = [['active','=',true],['type','=','sale']];
+            var AccountJournal = new model.web.Model('account.journal');
+            return AccountJournal.call('getAccountJournal',[domain], {
+                context: new model.web.CompoundContext()
+            });
+        },
+
+        /*=====================================================================
+            ACCOUNT PERIOD
+        =====================================================================*/
+        fetchAccountPeriod: function () {
+            var self = this;
+            var defer = $.Deferred();
+            var domain = [['special','=',false]];
+            var field =['id', 'name', 'date_start','date_stop','company_id'];
+            var AccountPeriod = new model.web.Model('account.period');
+            AccountPeriod.query(field).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        /*====================================================================
+            RES CURRENCY
+        ====================================================================*/
+        fetchResCurrency : function(){
+            var self = this;
+            var defer = $.Deferred();
+            var fields = ['id','name', 'symbol', 'rate_silent', 'base', 'decimal_separator', 'decimal_places', 'thousands_separator', 'symbol_position'];
+            var domain = [['active', '=', true]];
+            var ResCurrency = new model.web.Model('res.currency');
+            ResCurrency.query(fields).filter(domain).all().then(function(results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        /*====================================================================
+            POS CONFIG
+        ====================================================================*/
+        fetchPosConfig: function () {
+            var self = this;
+            var domain = [
+                ['state','in',['active']],
+            ];
+            var PosConfig = new model.web.Model('pos.config');
+            return PosConfig.call('getPosConfig',[domain], {
+                context: new model.web.CompoundContext()
+            });
+        },
+
+        /*====================================================================
+            POS SESSION
+        ====================================================================*/
+        fetchPosSession: function () {
+            var self = this;
+            var store = self.$el.find('#current-store').val();
+            var date = self.$el.find('#current-date').val();
+            var desde = self.$el.find('#from').val();
+            var hasta = self.$el.find('#to').val();
+            if(store && store != 9999999){
+                var journal_ids = _.map(_.filter(self.AccountJournal,function (item) {
+                    return item.store_ids[0] == store;
+                }), function(map){
+                    return map.id;
+                });
+                var config_ids = _.map(_.filter(self.PosConfig,function (item) {
+                    return _.contains(journal_ids, item.journal_id[0])
+                }), function(map){
+                    return map.id;
+                });
+            }else{
+                var journal_ids = _.flatten(_.map(self.AccountJournal, function (item) {
+                    return item.id;
+                }));
+                var config_ids = _.map(_.filter(self.PosConfig,function (item) {
+                    return _.contains(journal_ids, item.journal_id[0])
+                }), function(map){
+                    return map.id;
+                });
+            };
+            var domain = [
+                ['state','in',['opened','closed']],
+                ['config_id','in',config_ids],
+            ];
+            if(date && date != 9999999){
+                if(date == 'range'){
+                    if(desde){
+                        var date = desde.split('/')
+                        date = date[2]+"-"+date[1]+"-"+date[0]+" 00:00:00";
+                        var utc = moment.utc(date,'YYYY-MM-DD h:mm:ss A');
+                        var first = moment('00:00:00','HH:mm:ss');
+                        var second = moment(moment(utc._d,'HH:mm:ss'));
+                        var data = moment.duration(first - second);
+                        date = moment(date).add(data._data.hours,'hours').format('YYYY-MM-DD HH:mm:ss');
+                        domain.push(['start_at','>=',date]);
+                    }
+                    if(hasta){
+                        var date = hasta.split('/')
+                        date = date[2]+"-"+date[1]+"-"+date[0]+" 00:00:00";
+                        var utc = moment.utc(date,'YYYY-MM-DD h:mm:ss A');
+                        var first = moment('00:00:00','HH:mm:ss');
+                        var second = moment(moment(utc._d,'HH:mm:ss'));
+                        var data = moment.duration(first - second);
+                        date = moment(date).add(data._data.hours,'hours').format('YYYY-MM-DD HH:mm:ss');
+                        date = moment(date).add(1,'days').format('YYYY-MM-DD HH:mm:ss');
+                        domain.push(['start_at','<=',date]);
+                    }
+                }
+                if(date == 'today'){
+                    var today = moment().format('YYYY-MM-DD 00:00:00');
+                    var utc = moment.utc(today,'YYYY-MM-DD h:mm:ss A');
+                    var first = moment('00:00:00','HH:mm:ss');
+                    var second = moment(moment(utc._d,'HH:mm:ss'));
+                    var data = moment.duration(first - second);
+                    today = moment(today).add(data._data.hours,'hours').format('YYYY-MM-DD HH:mm:ss');
+                    domain.push(['start_at','>=',today]);
+                }
+                if(date == 'yesterday'){
+                    var today = moment().format('YYYY-MM-DD 00:00:00');
+                    var yesterday = moment().add(-2,'days').format('YYYY-MM-DD 00:00:00');
+                    var utc = moment.utc(yesterday,'YYYY-MM-DD h:mm:ss A');
+                    var first = moment('00:00:00','HH:mm:ss');
+                    var second = moment(moment(utc._d,'HH:mm:ss'));
+                    var data = moment.duration(first - second);
+                    yesterday = moment(yesterday).add(data._data.hours,'hours').format('YYYY-MM-DD HH:mm:ss');
+                    today = moment(today).add(data._data.hours,'hours').format('YYYY-MM-DD HH:mm:ss');
+                    domain.push(['start_at','>=',yesterday]);
+                    domain.push(['start_at','<=',today]);
+                }
+                if(date == 'currentMonth'){
+                    var currentMonth = moment().format('YYYY-MM-01 00:00:00');
+                    var utc = moment.utc(currentMonth,'YYYY-MM-DD h:mm:ss A');
+                    var first = moment('00:00:00','HH:mm:ss');
+                    var second = moment(moment(utc._d,'HH:mm:ss'));
+                    var data = moment.duration(first - second);
+                    currentMonth = moment(currentMonth).add(data._data.hours,'hours').format('YYYY-MM');
+                    domain.push(['start_at','like',currentMonth]);
+                }
+                if(date == 'lastMonth'){
+                    var lastMonth = moment().add(-1,'months').format('YYYY-MM-01 00:00:00');
+                    var utc = moment.utc(lastMonth,'YYYY-MM-DD h:mm:ss A');
+                    var first = moment('00:00:00','HH:mm:ss');
+                    var second = moment(moment(utc._d,'HH:mm:ss'));
+                    var data = moment.duration(first - second);
+                    lastMonth = moment(lastMonth).add(data._data.hours,'hours').format('YYYY-MM');
+                    domain.push(['start_at','like',lastMonth]);
+                }
+            }
+            var PosSession = new model.web.Model('pos.session');
+            return PosSession.call('getPosSession',[domain], {
+                context: new model.web.CompoundContext()
+            });
+        },
+
+        /*====================================================================
+            POS ORDER
+        ====================================================================*/
+        fetchPosOrder: function () {
+            var self = this;
+            var session_ids = _.flatten(_.map(self.PosSession, function (item) {
+                return item.id;
+            }));
+            var domain = [
+                ['session_id','in',session_ids],
+            ];
+            var PosOrder = new model.web.Model('account.invoice');
+            return PosOrder.call('getPosOrder',[domain], {
+                context: new model.web.CompoundContext()
+            });
+        },
+
+        /*====================================================================
+            POS ORDER LINE
+        ====================================================================*/
+        fetchPosOrderLine: function () {
+            var self = this;
+            var order_ids = _.flatten(_.map(self.PosOrder, function (item) {
+                return item.id;
+            }));
+            var domain = [
+                ['order_id','in',order_ids],
+            ];
+            var PosOrderLine = new model.web.Model('account.invoice.line');
+            return PosOrderLine.call('getPosOrderLine',[domain], {
+                context: new model.web.CompoundContext()
+            });
+        },
+
+        /*====================================================================
+            PRODUCT PRODUCT
+        ====================================================================*/
+        fetchProductProduct: function () {
+            var self = this;
+            var line_ids = _.flatten(_.map(self.PosOrderLine, function (item) {
+                return item.product_id[0];
+            }));
+            var domain = [
+                ['id','in',line_ids],
+            ];
+            var ProductProduct = new model.web.Model('product.product');
+            return ProductProduct.call('getProductProduct',[domain], {
+                context: new model.web.CompoundContext()
+            });
+        },
+
+        /*====================================================================
+            UPDATE SELECTIONS
+        ====================================================================*/
+        updateSelections: function () {
+            var self = this;
+            var company = self.$el.find('#current-company').val();
+            if(company != 9999999){
+                /*===================
+                    STORE SELECTION
+                ===================*/
+                var store = self.$el.find('#current-store').empty();
+                self.$el.find('#current-store').append('<option value="9999999">Todas las sucursales</option>');
+                _.each(self.ResStore,function(item){
+                    if(parseFloat(company) == item.company_id[0]){
+                        self.$el.find('#current-store').append('<option value="' + item.id + '">' + item.name + '</option>');
+                    }
+                });
+                /*====================
+                    PERIOD SELECTION
+                ====================*/
+                var period = self.$el.find('#current-period').empty();
+                self.$el.find('#current-period').append('<option value="9999999">Todos los periodos</option>');
+                _.each(self.AccountPeriod,function(item){
+                    if(parseFloat(company) == item.company_id[0]){
+                        self.$el.find('#current-period').append('<option value="' + item.id + '">' + item.name + '</option>');
+                    }
+                });
+            }else{
+                /*===================
+                    STORE SELECTION
+                ===================*/
+                var store = self.$el.find('#current-store').empty();
+                self.$el.find('#current-store').append('<option value="9999999">Todas las sucursales</option>');
+                _.each(self.ResStore,function(item){
+                    self.$el.find('#current-store').append('<option value="' + item.id + '">' + item.name + '</option>');
+                });
+                /*====================
+                    PERIOD SELECTION
+                ====================*/
+                var period = self.$el.find('#current-period').empty();
+                self.$el.find('#current-period').append('<option value="9999999">Todas los periodos</option>');
+                _.each(self.AccountPeriod,function(item){
+                    self.$el.find('#current-period').append('<option value="' + item.id + '">' + item.name + '</option>');
+                });
+            };
+        },
+
+        /*====================================================================
+            GET RES COMPANY
+        ====================================================================*/
+        getResCompany: function (id) {
+            var self = this;
+            return _.filter(self.ResCompany,function (item) {
+                return item.id == id;
+            });
+        },
+
+        /*====================================================================
+            GET RES CURRENCY BASE
+        ====================================================================*/
+        getResCurrency: function (id) {
+            var self = this;
+            return _.filter(self.ResCurrency,function (item) {
+                return item.id === id;
+            });
+        },
+
+        /*====================================================================
+            GET POS ORDER LINE
+        ====================================================================*/
+        getPosOrderLine: function (session_id, product_id) {
+            var self = this;
+            var order_ids =  _.map(_.filter(self.PosOrder,function (item) {
+                return item.session_id[0] == session_id;
+            }), function(map){
+                return map.id;
+            });
+            return _.filter(self.PosOrderLine,function (item) {
+                return _.contains(order_ids, item.order_id[0]) && item.product_id[0] == product_id;
+            });
+        },
+
+        /*====================================================================
+            BUILD
+        ====================================================================*/
+        BuildTable: function(){
+            var self = this;
+            var data = [];
+            var PosSession = self.PosSession;
+            var ProductProduct = self.ProductProduct;
+            var company = $('#current-company').val();
+            if(company && company != 9999999){
+                var ResCompany = self.getResCompany(company).shift();
+                var CurrencyBase = self.getResCurrency(ResCompany.currency_id[0]).shift();
+            }else{
+                var CurrencyBase = self.getResCurrency(self.ResCompany[0].currency_id[0]).shift();
+            };
+            var info = [];
+            _.each(PosSession,function(item) {
+                info = [];
+                _.each(ProductProduct,function(index) {
+                    var PosOrderLine = self.getPosOrderLine(item.id, index.id);
+                    var total = _.reduce(_.map(PosOrderLine,function(item) {
+                        return item.price_subtotal_incl_currency;
+                    }),function(memo, num) {
+                        return memo + num;
+                    },0);
+                    var qty = _.reduce(_.map(PosOrderLine,function(item) {
+                        return item.qty;
+                    }),function(memo, num) {
+                        return memo + num;
+                    },0);
+                    if(total > 0){
+                        info.push({
+                            name: index.display_name,
+                            qty: qty,
+                            total: accounting.formatMoney(total, '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator),
+                        });
+                    };
+                });
+                info.sort(function(a, b) {
+                    return b.qty - a.qty
+                });
+                var utc_start;
+                var utc_stop = ' ';
+                utc_start = moment.utc(item.start_at,'YYYY-MM-DD h:mm:ss A');
+                utc_start = moment(utc_start._d).format('DD/MM/YYYY HH:mm:ss');
+
+                if(item.stop_at){
+                    utc_stop = moment.utc(item.stop_at,'YYYY-MM-DD h:mm:ss A');
+                    utc_stop = moment(utc_stop._d).format('DD/MM/YYYY HH:mm:ss');
+                };
+
+                data.push({
+                    id: item.id,
+                    config_id: item.config_id[1],
+                    name: item.name,
+                    user_id: item.user_id[1],
+                    start_at: utc_start,
+                    stop_at: utc_stop,
+                    /*
+                    ================================
+                        TOTAL FOOTER CONFIGURATION
+                    ================================
+                    */
+                    decimal_places : CurrencyBase.decimal_places,
+                    thousands_separator: CurrencyBase.thousands_separator,
+                    decimal_separator: CurrencyBase.decimal_separator,
+                    /*
+                    ================================
+                    DATA
+                    ================================
+                    */
+                    info: info,
+                });
+
+            });
+            self.content = data;
+            self.loadTable(data);
+            self.$el.find('.report-form').css('display','block');
+            self.$el.find('.search-form').unblock();
+            self.$el.find('.report-form').unblock();
+        },
+
+        /*====================================================================
+            LOAD BOOTSTRAP TABLE
+        ====================================================================*/
+        loadTable:function(rowsTable){
+            var self = this;
+            self.rowsData = rowsTable;
+            var table = this.$el.find('#table');
+            table.bootstrapTable('load', rowsTable);
+        },
+
+        /*====================================================================
+            PRINT PDF
+        ====================================================================*/
+        clickOnAction: function (e) {
+            var self = this;
+            var ResCompany;
+            var action = this.$el.find(e.target).val();
+            var company = $('#current-company').val();
+            if(company && company != 9999999){
+                ResCompany = self.getResCompany(company).shift();
+                var CurrencyBase = self.getResCurrency(ResCompany.currency_id[0]).shift();
+            }else{
+                ResCompany = self.ResCompany[0];
+                var CurrencyBase = self.getResCurrency(self.ResCompany[0].currency_id[0]).shift();
+            }
+            var getColumns=[];
+            var rows=[];
+            var table = this.$el.find("#table");
+            var column = table.bootstrapTable('getVisibleColumns');
+            var row = table.bootstrapTable('getData');
+
+            var qty = _.reduce(_.map(row, function (map) {
+                return map.qty;
+            }), function (memo, num) {
+                return memo + num;
+            });
+
+            var amount = _.reduce(_.map(row, function (map) {
+                return map.amount;
+            }), function (memo, num) {
+                return memo + num;
+            });
+
+            row.push({
+                medic: 'Totales',
+                qty_total: qty,
+                total_amount: accounting.formatMoney(amount, '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator),
+            })
+
+            if (action === 'pdf') {
+                var data = _.map(column, function (val){ return val.field});
+                _.each(_.map(column,function(val){
+                    return val}), function(item){
+                    getColumns.push([{
+                        title: item.title,
+                        dataKey: item.field
+                    }]);
+                });
+                /*
+                ============================================================
+                    CONFIGURACION DEL PDF
+                ============================================================
+                */
+                var pdf_title = 'Analisis de sesiones';
+                var pdf_type = '';
+                var pdf_name = 'analisis_de_sesiones';
+                var pdf_columnStyles =  {
+                    config_id :{halign:'left'},
+                    name :{halign:'left'},
+                    user_id :{halign:'left'},
+                    start_at :{columnWidth: 30},
+                    stop_at:{columnWidth: 30},
+                };
+                /*
+                ============================================================
+                    LLAMAR FUNCION DE IMPRESION
+                ============================================================
+                */
+                var pdf = new model.eiru_reports.ReportPdfWidget(self);
+                pdf.drawPDF(
+                    _.flatten(getColumns),
+                    row,
+                    ResCompany,
+                    pdf_title,
+                    pdf_type,
+                    pdf_name,
+                    pdf_columnStyles,
+                );
+            }
+        },
+    });
+}

+ 2 - 2
static/src/reports/report_session.xml

@@ -81,11 +81,12 @@
                         >
                         <thead style="background:none;">
                             <tr>
-                                <th data-field="config_id">Terminal</th>
+                                <th data-field="config_id" data-footer-formatter="Totales">Terminal</th>
                                 <th data-field="name">Sesion</th>
                                 <th data-field="user_id">Responsable</th>
                                 <th data-field="start_at">Fecha de Apertura</th>
                                 <th data-field="stop_at">Fecha de Cierre</th>
+                                <th data-field="amount_total" data-align="right" data-footer-formatter="totalFormatter">Total</th>
                             </tr>
                         </thead>
                     </table>
@@ -97,7 +98,6 @@
                     var html = [];
                     if(row.info.length > 0){
                         html.push('<div class="panel panel-default">');
-                        <!-- html.push('<div class="panel-heading panel-header-first-style">Ventas</div>'); -->
                         html.push('<div class="panel-body">');
                         html.push('<table class="table table-condensed table-no-bordered">');
                         html.push('<thead style="background:none;"><tr><th>Fecha</th><th>Numero</th><th>Cliente</th><th style="text-align:right;">Monto</th></tr></thead>');

+ 157 - 0
static/src/reports/report_session_analytic.xml

@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ReportSessionAnalytic">
+        <div class="report_view">
+            <div class="reporting_page_header">
+                <h1 class="report_title"> Analisis de Sesiones de Venta</h1>
+            </div>
+            <div class="container search-form" style="border-bottom:1px solid #eee; width:95%;">
+                <div class="row">
+                    <div class="col-lg-3 company filter-style">
+                        <label>Empresa</label>
+                        <select id="current-company" class="form-control form-control-sm"></select>
+                    </div>
+                    <div class="col-lg-3 store filter-style">
+                        <label>Sucursal</label>
+                        <select id="current-store" class="form-control form-control-sm">
+                        </select>
+                    </div>
+                    <div class="col-lg-3 filter-style">
+                        <label>Fechas</label>
+                        <select id="current-date" class="form-control form-control-sm">
+                            <option value="9999999">Sin fechas</option>
+                            <option value="today">Hoy</option>
+                            <option value="yesterday">Ayer</option>
+                            <option value="currentMonth">Mes Actual</option>
+                            <option value="lastMonth">Mes Pasado</option>
+                            <option value="range">Busqueda Avanzada</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="row" >
+                    <div class="datepicker" style="display:none;">
+                        <div class="col-lg-3 filter-style col-md-offset-3">
+                            <div class="input-group">
+                                <span class="input-group-addon" id="basic-addon1">Desde</span>
+                                <input type="text" id="from" class="form-control" aria-describedby="basic-addon1"/>
+                            </div>
+                        </div>
+                        <div class="col-lg-3 filter-style">
+                            <div class="input-group">
+                                <span class="input-group-addon" id="basic-addon1">Hasta</span>
+                                <input type="text" id="to" class="form-control" aria-describedby="basic-addon1"/>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="text-center" style="padding-top:20px;">
+                        <button id="generate" class="myButton" aria-label="Left Align">
+                            Generar
+                        </button>
+                    </div>
+                    <br/>
+                </div>
+            </div>
+
+            <div class="report-form" style="display:none;">
+                <div id="toolbar">
+                    <button class="oe_button myButton" value="pdf">Imprimir Informe</button>
+                </div>
+                <div class="container" style="width:95%;">
+                    <table id="table"
+                        data-pagination="true"
+                        data-toggle="table"
+                        data-toolbar="#toolbar"
+                        data-show-columns="true"
+                        data-classes="table table-condensed  table-no-bordered"
+                        data-search="true"
+                        data-show-export="true"
+                        data-show-toggle="true"
+                        data-pagination-detail-h-align="left"
+                        data-show-footer="true"
+                        data-footer-style="footerStyle"
+                        data-buttons-class="oe_button myButton"
+                        data-show-pagination-switch="true"
+                        data-page-size="10"
+                        data-search-on-enter-key="true"
+                        data-undefined-text=" "
+                        data-detail-view="true"
+                        data-detail-formatter="detailFormatter"
+                        >
+                        <thead style="background:none;">
+                            <tr>
+                                <th data-field="config_id">Terminal</th>
+                                <th data-field="name">Sesion</th>
+                                <th data-field="user_id">Responsable</th>
+                                <th data-field="start_at">Fecha de Apertura</th>
+                                <th data-field="stop_at">Fecha de Cierre</th>
+                            </tr>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+            <script>
+
+                function detailFormatter(index, row) {
+                    var html = [];
+                    if(row.info.length > 0){
+                        html.push('<div class="panel panel-default">');
+                        html.push('<div class="panel-body">');
+                        html.push('<table class="table table-condensed table-no-bordered">');
+                        html.push('<thead style="background:none;"><tr><th>Producto</th><th style="text-align:right;">Cantidad</th><th style="text-align:right;">Monto</th></tr></thead>');
+                        _.each(row.info,function(item) {
+                            html.push('<tr><td>' + item.name + '</td><td style="text-align:right;">' + item.qty + '</td><td style="text-align:right;">' + item.total + '</td></tr>');
+                        });
+                        html.push('</table>');
+                        html.push('</div></div>');
+                    }else{
+                        html.push('<blockquote>');
+                            html.push('<p>Aún no se a efectuado ninguna venta en esta sesión.</p>');
+                        html.push('</blockquote>');
+                    }
+                    return html.join('');
+                }
+
+                <!--
+                    TOTAL
+                -->
+                function totalFormatter(rowsTable) {
+                    var decimal_places = 0;
+                    var thousands_separator = '.';
+                    var decimal_separator = ',';
+                    if(rowsTable.length > 0){
+                        decimal_places = rowsTable[0].decimal_places;
+                        thousands_separator = rowsTable[0].thousands_separator;
+                        decimal_separator = rowsTable[0].decimal_separator;
+                    }
+                    var amount =  _.reduce(_.map(rowsTable,function(item){
+                        return (item.amount);
+                    }), function(memo, num){
+                    return memo + num; },0)
+                    return accounting.formatNumber(amount,decimal_places,thousands_separator,decimal_separator);
+                }
+                <!--
+                    TOTAL
+                -->
+                function qtyFormatter(rowsTable) {
+                    var quantity =  _.reduce(_.map(rowsTable,function(item){
+                        return (item.qty);
+                    }), function(memo, num){
+                    return memo + num; },0)
+                    return accounting.formatNumber(quantity,0,'.',',');
+                }
+                <!--
+                    FOOTER STYLE
+                -->
+                function footerStyle(row, index) {
+                    return {
+                        css: {
+                          "font-weight": "bold"
+                        }
+                    };
+                };
+            </script>
+        </div>
+    </t>
+</template>

+ 1 - 0
templates.xml

@@ -9,6 +9,7 @@
                 <script type="text/javascript" src="/eiru_reports_pos_analytic/static/src/js/reporting_base.js" />
 
                 <script type="text/javascript" src="/eiru_reports_pos_analytic/static/src/js/reports/report_session.js"/>
+                <script type="text/javascript" src="/eiru_reports_pos_analytic/static/src/js/reports/report_session_analytic.js"/>
 
             </xpath>
         </template>

+ 5 - 0
views/actions.xml

@@ -7,5 +7,10 @@
             <field name="tag">eiru_reports_pos_analytic.session_action</field>
         </record>
 
+		<record id="session_analytic_action" model="ir.actions.client">
+            <field name="name">Analisis de Sesiones</field>
+            <field name="tag">eiru_reports_pos_analytic.session_analytic_action</field>
+        </record>
+
     </data>
 </openerp>

+ 6 - 0
views/menus.xml

@@ -13,5 +13,11 @@
             action="session_action"
             sequence="0"/>
 
+        <menuitem id="sesion_analytic_menu"
+            parent="session_parent_menu"
+            name="Analisis de Sesiones"
+            action="session_analytic_action"
+            sequence="0"/>
+
     </data>
 </openerp>