Jelajahi Sumber

First Commit

deisy 5 tahun lalu
melakukan
7bf8ef3642

+ 2 - 0
__init__.py

@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+import controllers

+ 22 - 0
__openerp__.py

@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+{
+    'name': "Eiru Reports Bienstar",
+    'author': "Eiru",
+    'category': 'Reports',
+    'version': '0.1',
+    'depends': [
+        'base',
+        'account',
+        'eiru_assets',
+        'eiru_reports',
+    ],
+    'qweb': [
+        'static/src/xml/*.xml',
+        'static/src/reports/*.xml'
+    ],
+    'data': [
+        'templates.xml',
+        'views/actions.xml',
+        'views/menus.xml',
+    ],
+}

+ 2 - 0
controllers.py

@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from openerp import http

TEMPAT SAMPAH
static/description/icon.png


+ 10 - 0
static/src/css/custom.css

@@ -0,0 +1,10 @@
+.openerp_webclient_container {
+    height: 100% !important;
+    height: calc(100% - 45px) !important;
+    overflow: auto !important;
+  }
+
+.hover:hover{
+  cursor: -webkit-grab;
+  cursor: grab;
+}

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

@@ -0,0 +1,17 @@
+openerp.eiru_reports_bienstar = function(instance) {
+  "use strict";
+
+  var reporting = instance.eiru_reports_bienstar;
+
+  reporting_base(instance, reporting);
+
+  try {
+    bienstar_pdf(reporting);
+    report_customer_ratings(reporting);
+
+  } catch (e) {
+    // ignorar error
+  }
+
+  instance.web.client_actions.add('eiru_reports_bienstar.customer_ratings_action', 'instance.eiru_reports_bienstar.ReportCustomerRatingsWidget');
+}

+ 248 - 0
static/src/js/pdf.js

@@ -0,0 +1,248 @@
+function bienstar_pdf(reporting){
+    "use strict";
+
+    var model = openerp;
+
+    reporting.ReportPdfWidget = reporting.Base.extend({
+      drawStarPdf: function(row,ResCompany,pdf_title,pdf_type,pdf_name,pdf_columnStyles,filter){
+         var self = this;
+         var base64Img = 'data:image/png;base64,' + ResCompany.logo;
+         var hoy = moment().format('DD/MM/YYYY');
+         var totalPagesExp = "{total_pages_count_string}";
+         var pdfDoc = new jsPDF(pdf_type);
+         var title = [];
+         var currentpage = 0;
+         var i = 0;
+         var position = 27;
+         var y_position2 = 27;
+
+         title.push({
+           title : 'Factura',
+           dataKey: 'invoice',
+         });
+         title.push({
+           title : 'Cuota',
+           dataKey: 'name',
+         });
+         title.push({
+           title : 'Fecha de Vencimiento',
+           dataKey: 'date',
+         });
+         title.push({
+           title : 'Estado',
+           dataKey: 'state',
+         });
+         title.push({
+           title : 'Días Atrasados',
+           dataKey: 'days_of_delays',
+         });
+         title.push({
+           title : 'Total',
+           dataKey: 'amount',
+         });
+         title.push({
+           title : 'Saldo',
+           dataKey: 'residual',
+         });
+         title.push({
+           title : 'Saldo Factura',
+           dataKey: 'invoice_residual',
+         });
+
+         //LOGO
+         pdfDoc.addImage(base64Img, 'png', 7, 2, 0, 15);
+
+         //FECHA
+         pdfDoc.setFontSize(13);
+         pdfDoc.setFontStyle('normal');
+         pdfDoc.setTextColor(40)
+         pdfDoc.text(pdfDoc.internal.pageSize.getWidth() - 35, 12,hoy);
+
+         //TITULO
+         pdfDoc.setFontSize(15);
+         pdfDoc.setFontStyle('bold');
+         pdfDoc.setTextColor('#0288d1');
+         pdfDoc.autoTableText(pdf_title, pdfDoc.internal.pageSize.getWidth() - 12, 18, {
+           halign: 'right',
+           valign: 'middle'
+         });
+         pdfDoc.setLineWidth(0.5);
+         pdfDoc.setDrawColor('#424242');
+         pdfDoc.line(10, 22, pdfDoc.internal.pageSize.getWidth() - 10 , 22);
+
+         var ii=0;
+         if(pdf_type == 'l'){
+           var col1_title = 15;
+           var col1_value = 55;
+           var col2_title = 150;
+           var col2_value = 190;
+         }
+         else{
+           var col1_title = 10;
+           var col1_value = 50;
+           var col2_title = 110;
+           var col2_value = 150;
+         }
+         if(filter.length >0){
+           _.each(filter,function(item){
+             if(ii<4){
+               self.addFilter(pdfDoc,item.title,item.value,col1_title,col1_value,position);
+               position = position + 5;
+             }else{
+               self.addFilter(pdfDoc,item.title,item.value,col2_title,col2_value,y_position2);
+               y_position2 = y_position2 + 5;
+             }
+               ii++;
+           });
+           pdfDoc.setLineWidth(0.5);
+           pdfDoc.setDrawColor('#424242');
+
+           if(position >= y_position2){
+             position = position;
+             pdfDoc.line(10, position, pdfDoc.internal.pageSize.getWidth() - 10 , position);
+           }else{
+             position = y_position2;
+             pdfDoc.line(10, y_position2, pdfDoc.internal.pageSize.getWidth() - 10 , y_position2);
+           }
+         }
+
+         _.each(row, function(item){
+           if(i > 0){
+             let first = pdfDoc.autoTable.previous;
+             position = first.finalY + 5;
+           };
+
+           var docItem = [];
+           if(item.info != 'undefined'){
+             _.each(item.info, function(index){
+               docItem.push({
+                 invoice: index.invoice,
+                 name: index.name,
+                 date: index.date,
+                 state: index.state,
+                 days_of_delays: index.days_of_delays,
+                 amount: index.amount,
+                 residual: index.residual,
+                 invoice_residual: index.invoice_residual,
+               })
+             });
+           }
+
+           pdfDoc.setDrawColor(0);
+           pdfDoc.setFillColor(76, 133, 248);
+           pdfDoc.rect(7, position+5, 196, 8, 'F');
+
+           pdfDoc.setFontSize(9);
+           pdfDoc.setTextColor(255,255,255)
+           pdfDoc.setFontStyle('bold');
+
+           pdfDoc.autoTableText('Cliente: ', 10, position+9, {
+             halign: 'left',
+             valign: 'middle'
+           });
+
+           pdfDoc.autoTableText(item.partner_name, 22, position+9, {
+             halign: 'left',
+             valign: 'middle'
+           });
+
+           pdfDoc.autoTableText('Cuotas Vencidas: ', 80, position+9, {
+             halign: 'left',
+             valign: 'middle'
+           });
+
+           pdfDoc.autoTableText(item.due_qty.toString(), 108, position+9, {
+             halign: 'left',
+             valign: 'middle'
+           });
+
+           pdfDoc.autoTableText('Días Atrasados: ', 115, position+9, {
+             halign: 'left',
+             valign: 'middle'
+           });
+
+           pdfDoc.autoTableText(item.max_days_of_delay.toString(), 140, position+9, {
+             halign: 'left',
+             valign: 'middle'
+           });
+
+           pdfDoc.autoTableText('Monto Atrasado: ', 148, position+9, {
+             halign: 'left',
+             valign: 'middle'
+           });
+
+           pdfDoc.autoTableText(item.amount, 175, position+9, {
+             halign: 'left',
+             valign: 'middle'
+           });
+
+           pdfDoc.autoTable(title, docItem, {
+             //  showHeader: false,
+             startY: position+15,
+             theme: 'grid',
+             styles: {
+               overflow: 'linebreak',
+               fontSize: 8,
+               margin: 50,
+               lineWidth: 0.3,
+               lineColor: [132,132,132]
+             },
+
+             headerStyles: {
+               fillColor: [255,255,255],
+               fontSize: 9,
+               textColor: [0,0,0],
+               lineWidth: 0.3,
+               lineColor: [132,132,132],
+               halign: 'center',
+             },
+             columnStyles: pdf_columnStyles,
+             margin: 'auto',
+             tableWidth: 'auto',
+
+             addPageContent: function (data) {
+               // FOOTER
+               if (currentpage < pdfDoc.internal.getNumberOfPages()) {
+                 var str = "Página " + pdfDoc.internal.getNumberOfPages();
+                 str = str + " de " + totalPagesExp;
+                 pdfDoc.setFontSize(9);
+                 pdfDoc.setFontStyle('bold');
+                 pdfDoc.setTextColor(40);
+                 var pageHeight = pdfDoc.internal.pageSize.height || pdfDoc.internal.pageSize.getHeight();
+                 pdfDoc.text(str, pdfDoc.internal.pageSize.getWidth() - 55, pageHeight - 5);
+                 currentpage = pdfDoc.internal.getNumberOfPages();
+               }
+             }
+           });
+           i++;
+         });
+         if(typeof pdfDoc.putTotalPages === 'function'){
+           pdfDoc.putTotalPages(totalPagesExp);
+         }
+         row.pop();
+         if(model.printer_bridge){
+           var data = pdfDoc.output('datauristring');
+           model.printer_bridge.print(data);
+           return;
+         }
+         pdfDoc.save(pdf_name + hoy + '.pdf');
+       },
+
+       addFilter: function(pdfDoc,title,value,x_position_title,x_position_value,y_position){
+            pdfDoc.setFontSize(10);
+            pdfDoc.setTextColor('#424242');
+            pdfDoc.setFontStyle('bold');
+            pdfDoc.autoTableText(title+':', x_position_title, y_position, {
+              halign: 'left',
+              valign: 'middle'
+            });
+            pdfDoc.setFontSize(10);
+            pdfDoc.setTextColor('#424242');
+            pdfDoc.setFontStyle('normal');
+            pdfDoc.autoTableText(value, x_position_value, y_position, {
+              halign: 'left',
+              valign: 'middle'
+            });
+      },
+  });
+}

+ 22 - 0
static/src/js/reporting_base.js

@@ -0,0 +1,22 @@
+function reporting_base (instance, widget) {
+    "use strict";
+
+    widget.Base = instance.Widget.extend({
+
+        position: 0,
+
+        init: function (parent, position) {
+            this._super(parent);
+            this.position = position || this.position;
+        },
+        start: function () {
+            
+        },
+        getPosition: function () {
+            return this.position;
+        },
+        setPosition: function (position) {
+            this.position = position;
+        }
+    });
+}

+ 907 - 0
static/src/js/reports/report_customer_ratings.js

@@ -0,0 +1,907 @@
+function report_customer_ratings(reporting){
+  "use strict";
+  var model = openerp;
+
+  reporting.ReportCustomerRatingsWidget = reporting.Base.extend({
+       template: 'ReportCustomerRatings',
+       rowsData :[],
+       content :[],
+
+       events:{
+           'click #toolbar > button' : 'clickOnAction',
+           'click #generate' : 'fetchGenerate',
+           'change #current-company' : 'updateSelections',
+           'change #current-period' : 'updatePeriodSelections',
+           'change #current-date' : 'ShowDateRange',
+       },
+
+       init: function(parent){
+           this._super(parent);
+       },
+
+       start: function(){
+         var self = this;
+         var date = new model.eiru_reports.ReportDatePickerWidget(self);
+         date.fecthFecha();
+         this.fetchInitial();
+       },
+
+       valorNull:function(dato){
+           var valor = "";
+           if (dato){
+               valor = dato;
+           }
+           return valor;
+       },
+
+       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.fecthIrModuleModule().then(function(IrModuleModule){
+               return IrModuleModule;
+           }).then(function(IrModuleModule){
+               self.IrModuleModule = IrModuleModule;
+               return self.fetchResUser;
+           }).then(function (ResUser){
+               self.ResUser = ResUser;
+               return self.fetchResCompany();
+           }).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.fetchAccountPeriod();
+           }).then(function(AccountPeriod){
+               self.AccountPeriod = AccountPeriod;
+               self.$el.find('#current-period').append('<option value="9999999">Todos los periodos</option>');
+               _.each(AccountPeriod,function(item){
+                   self.$el.find('#current-period').append('<option value="' + item.id + '">' + item.name + '</option>');
+               });
+               return self.fetchResCurrency();
+           }).then(function(ResCurrency){
+               self.ResCurrency = ResCurrency;
+               return self.fetchResPartner();
+           }).then(function(ResPartner){
+               self.ResPartner = ResPartner;
+               self.$el.find('#current-partner').append('<option value="9999999">Todos los clientes</option>');
+               _.each(ResPartner,function(item){
+                   self.$el.find('#current-partner').append('<option value="' + item.id + '">' + item.name + '</option>');
+               });
+               return self.fetchAccountJournal();
+           }).then(function(AccountJournal){
+               self.AccountJournal = AccountJournal;
+           });
+           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.fetchAccountInvoice().then(function(AccountInvoice) {
+               return AccountInvoice;
+           }).then(function (AccountInvoice) {
+               self.AccountInvoice = AccountInvoice;
+               return self.fetchAccountMoveLine();
+           }).then(function (AccountMoveLine){
+               self.AccountMoveLine = AccountMoveLine;
+               return self.BuildTable();
+           });
+       },
+
+       /*=====================================================================
+           IR MODULE
+       =====================================================================*/
+       fecthIrModuleModule: function(){
+           var self = this;
+           var defer = $.Deferred();
+           var fields = ['name','id'];
+           var domain=[['state','=','installed']];
+           var IrModuleModule = new model.web.Model('ir.module.module');
+           IrModuleModule.query(fields).filter(domain).all().then(function(results){
+             defer.resolve(results);
+           })
+           return defer;
+       },
+
+       /*
+       =====================================================================
+           USER
+       =====================================================================
+       */
+       fetchResUser: function(){
+           var self = this;
+           var defer = $.Deferred();
+           var fields = ['id','name','store_id'];
+           var domain = [['id','=',self.session.uid]];
+           var ResUser = new model.web.Model('res.users');
+           ResUser.query(fields).filter(domain).all().then(function(results){
+               defer.resolve(results);
+           });
+           return defer;
+       },
+
+       /*
+       =====================================================================
+           PARTNER
+       =====================================================================
+       */
+       fetchResPartner: function(){
+           var self = this;
+           var defer = $.Deferred();
+           var fields = ['id','name'];
+           var domain = [
+             ['active','=', true],
+             ['customer','=', true]];
+           var ResPartner = new model.web.Model('res.partner');
+           ResPartner.query(fields).filter(domain).all().then(function(results){
+               defer.resolve(results);
+           });
+           return defer;
+       },
+       /*
+       =====================================================================
+           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 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 defer = $.Deferred();
+           var company = $('#current-company').val();
+           var store = $('#current-store').val();
+           var domain = [['active','=',true],['type','=','sale']];
+           if(company && company != 9999999){
+               domain.push(['company_id','=',parseFloat(company)]);
+           }
+           if(store && store != 9999999){
+               domain.push(['store_ids','=',parseFloat(store)]);
+           }
+           var field = ['id', 'name','store_ids'];
+           var AccountJournal = new model.web.Model('account.journal');
+           AccountJournal.query(field).filter(domain).all().then(function(results){
+               defer.resolve(results);
+           });
+           return defer;
+       },
+       /*
+       ====================================================================
+           ACCOUNT INVOICE
+       ====================================================================
+       */
+       fetchAccountInvoice: function(){
+           var self = this;
+           var store = self.$el.find('#current-store').val();
+           var journal = self.$el.find('#current-journal').val();
+           var partner = self.$el.find('#current-partner').val();
+
+           if(store && store != 9999999){
+               var journal_ids = _.map(_.filter(self.AccountJournal,function(item){
+                   return item.store_ids == store;
+               }), function(map){
+                   return map.id;
+               });
+           }else{
+               var journal_ids = _.flatten(_.map(self.AccountJournal, function(item){
+                   return item.id;
+               }));
+           }
+           var domain = [
+               ['state', 'in',['open']],
+               ['type', '=', 'out_invoice'],
+               ['journal_id','in',journal_ids],
+           ];
+           if(journal && journal != 9999999){
+               domain.push(['journal_id','=',parseInt(journal)]);
+           }
+
+           if(partner && partner != 9999999){
+               domain.push(['partner_id','=',parseInt(partner)]);
+           }
+
+           var AccountInvoice = new model.web.Model('account.invoice');
+           return AccountInvoice.call('getAccountInvoice',[domain], {
+               context: new model.web.CompoundContext()
+           });
+       },
+       /*
+       ====================================================================
+           ACCOUNT INVOICE LINE
+       ====================================================================
+       */
+       fetchAccountMoveLine: function(){
+           var self = this;
+           var invoice_numbers = _.flatten(_.map(self.AccountInvoice, function(item){
+               return item.number;
+           }));
+           var domain = [
+               ['move_id','in',invoice_numbers],
+               ['debit','>',0],
+           ];
+
+           var AccountMoveLine = new model.web.Model('account.move.line');
+           return AccountMoveLine.call('getAccountMoveLine',[domain], {
+               context: new model.web.CompoundContext()
+           });
+       },
+       /*
+       ====================================================================
+           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 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;
+       },
+
+       /*
+       ====================================================================
+           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">Todos los periodos</option>');
+               _.each(self.AccountPeriod,function(item){
+                   self.$el.find('#current-period').append('<option value="' + item.id + '">' + item.name + '</option>');
+               });
+           }
+       },
+
+       updatePeriodSelections: function(){
+           var self = this;
+           var period = self.$el.find('#current-period').val();
+           if(period != 9999999){
+               self.$el.find('#current-date').val(9999999);
+               self.$el.find('#current-date').prop('disabled','disabled');
+               self.$el.find('.datepicker').css('display','none');
+           }else{
+               self.$el.find('#current-date').prop('disabled',false);
+           }
+       },
+
+       /*====================================================================
+           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 ACCOUNT MOVE LINE
+       ====================================================================*/
+       getAccountMoveLine: function(number){
+           var self = this;
+           var period = self.$el.find('#current-period').val();
+           var date = self.$el.find('#current-date').val();
+           var desde = self.$el.find('#from').val();
+           var hasta = self.$el.find('#to').val();
+           var AccountMoveLine = _.filter(self.AccountMoveLine,function(item){
+                return item.move_id[1] == number;
+            });
+            var x = AccountMoveLine.length;
+            var i = AccountMoveLine.length;
+
+           var content =_.map(AccountMoveLine, function(item2){
+               if(item2.date_maturity != false){
+                   item2.dues_name= 'Cuota ' + i +' / ' + x;
+                   i--;
+                   return item2;
+               };
+           });
+
+           if(date && date != 9999999){
+               if(date == 'range'){
+                   if(desde){
+                       var date = desde.split('/')
+                       date = (date[2]+"-"+date[1]+"-"+date[0]);
+                       content = _.flatten(_.filter(content,function(item){
+                         return item.date_maturity >= date;
+                       }));
+                   }
+                   if(hasta){
+                       var date = hasta.split('/')
+                       date = (date[2]+"-"+date[1]+"-"+date[0]);
+                       content = _.flatten(_.filter(content,function(item){
+                         return item.date_maturity <= date;
+                       }));
+                   }
+               }
+               if(date == 'today'){
+                   var today = moment().format('YYYY-MM-DD');
+                   content = _.flatten(_.filter(content,function(item){
+                     return item.date_maturity == today;
+                   }));
+               }
+
+               if(date == 'yesterday'){
+                   var yesterday = moment().add(-1,'days').format('YYYY-MM-DD');
+                   content = _.flatten(_.filter(content,function(item){
+                     return item.date_maturity == yesterday;
+                   }));
+               }
+               if(date == 'currentMonth'){
+                   var currentMonth = moment().format('YYYY-MM');
+                   content = _.flatten(_.filter(content,function(item){
+                     return moment(item.date_maturity,'YYYY-MM-DD').format('YYYY-MM') == currentMonth;
+                   }));
+               }
+               if(date == 'lastMonth'){
+                   var lastMonth = moment().add(-1,'months').format('YYYY-MM');
+                   content = _.flatten(_.filter(content,function(item){
+                     return moment(item.date_maturity,'YYYY-MM-DD').format('YYYY-MM') == lastMonth;
+                   }));
+               }
+           }
+
+           if(period && period != 9999999){
+               var periodo = _.flatten(_.filter(self.AccountPeriod,function (item) {
+                   return item.id == period;
+               }));
+
+               content = _.flatten(_.filter(content,function (item) {
+                   return moment(item.date_maturity,'YYYY-MM-DD').format('MM/YYYY') == periodo[0].name;
+               }));
+           }
+           content = _.filter(content,function(item){
+             return item != undefined;
+           })
+           return content;
+       },
+
+
+       /*============================
+           GET INVOICE
+       ============================*/
+       getAccountInvoice:function(partner_id){
+         var self = this;
+         return _.filter(self.AccountInvoice,function(item){
+             return item.partner_id[0] === partner_id;
+         })
+       },
+
+       /*====================================================================
+           BUILD
+       ====================================================================*/
+       BuildTable: function(){
+           var self = this;
+           var data = [];
+           var company = $('#current-company').val();
+           var state = $('#current-state').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 ResPartner = self.ResPartner;
+
+           _.each(ResPartner, function(item){
+             var info = [];
+             var due_qty=0;
+             var amount=0;
+
+               var AccountInvoice = self.getAccountInvoice(item.id);
+
+               _.each(AccountInvoice, function(item){
+
+                   var AccountMoveLine = self.getAccountMoveLine(item.number);
+                   var Currency = self.getResCurrency(item.invoice_currency[0]).shift();
+
+                   _.each(AccountMoveLine, function(index){
+
+                       var date;
+
+                       var state = 'Vencido';
+                       if(index.reconcile_ref){
+                           if(index.amount_residual == 0){
+                               state = 'Pagado';
+                           }
+                           if(index.amount_residual > 0){
+                               var value = accounting.formatMoney(index.credit - index.amount_residual, '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator);
+                               state = 'Amortizado ' + ' (' + value + ')';
+                           }
+                       }
+
+                       date = moment(index.date_maturity,'YYYY-MM-DD').format('DD/MM/YYYY');
+                       if(state != 'Pagado'){
+
+                           if(index.date_maturity < moment().format('YYYY-MM-DD')){
+
+                               due_qty++;
+
+                               var days_of_delays =  moment().diff(moment(index.date_maturity), 'days');
+
+                               amount = amount + index.amount_residual;
+
+                               info.push({
+                                   invoice_id : item.id,
+                                   invoice : item.number,
+                                   partner_ruc : self.valorNull(item.partner_id[2]),
+                                   partner_name : item.partner_id[1],
+                                   date : date,
+                                   name : index.dues_name,
+                                   state : state,
+                                   days_of_delays: days_of_delays,
+                                   amount : accounting.formatMoney(index.credit, '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator),
+                                   residual : accounting.formatMoney(index.amount_residual, '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator),
+                                   invoice_residual : accounting.formatMoney(item.residual, '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator),
+
+                                   invoice_residual_no_format : item.residual,
+                                   amount_no_format : index.credit,
+                                   residual_no_format : index.amount_residual,
+
+                                   decimal_places : CurrencyBase.decimal_places,
+                                   thousands_separator : CurrencyBase.thousands_separator,
+                                   decimal_separator : CurrencyBase.decimal_separator,
+                               });
+
+                           };
+                       };
+
+                   });
+                 });
+
+                 if(info.length > 0){
+
+                     var max_days_of_delay= info.reduce((max, p) => p.days_of_delays > max ? p.days_of_delays : max, info[0].days_of_delays);
+
+                     info.sort(function(a, b){
+                       if(state == 'day_of_delay'){
+                         var x = a.days_of_delays;
+                         var y = b.days_of_delays;
+                       };
+
+                       if(state == 'amount_delay'){
+                         var x = a.residual_no_format;
+                         var y = b.residual_no_format;
+                       };
+
+                         if (x > y) {
+                             return -1;
+                         }
+                         if (x < y) {
+                             return 1;
+                         }
+                         return 0;
+                     });
+
+                     data.push({
+                         partner_name : item.name,
+                         due_qty:due_qty,
+                         max_days_of_delay: max_days_of_delay,
+                         amount: accounting.formatMoney(amount, '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator),
+
+                         amount_no_format: amount,
+
+                         info: info,
+
+                         decimal_places : CurrencyBase.decimal_places,
+                         thousands_separator : CurrencyBase.thousands_separator,
+                         decimal_separator : CurrencyBase.decimal_separator,
+                       });
+                 }
+           });
+
+           data.sort(function(a, b){
+
+             if(state == 'day_of_delay'){
+               var x = a.max_days_of_delay;
+               var y = b.max_days_of_delay;
+             };
+             if(state == 'due_qty'){
+               var x = a.due_qty;
+               var y = b.due_qty;
+             }
+             if(state == 'amount_delay'){
+               var x = a.amount_no_format;
+               var y = b.amount_no_format;
+             };
+
+               if (x > y) {
+                   return -1;
+               }
+               if (x < y) {
+                   return 1;
+               }
+               return 0;
+           });
+
+           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;
+         var data = [];
+         self.rowsData = rowsTable;
+         var table = this.$el.find('#table');
+
+         table.bootstrapTable({
+           data:rowsTable,
+           detailView: true,
+           onExpandRow: function(index, row, $detail){
+             $detail.html('<div class="panel panel-first-style"><div class="panel-heading panel-header-first-style">Cuotas vencidas</div><table id="table2"></table></div>').find('table').bootstrapTable({
+               columns: [
+                     {
+                         field: 'invoice',
+                         title: 'Factura',
+                         align: 'center',
+                     },
+                     {
+                         field: 'name',
+                         title: 'Cuota',
+                         align: 'center',
+                     },
+                     {
+                         field: 'date',
+                         title: 'Fecha Vencimiento',
+                         align: 'center',
+                     },
+                     {
+                         field: 'state',
+                         title: 'Estado',
+                         align: 'center',
+                     },
+                     {
+                         field: 'days_of_delays',
+                         title: 'Días atrasados',
+                         align: 'center',
+                     },
+                     {
+                         field: 'amount',
+                         title: 'Total',
+                         align: 'right',
+                     },
+                     {
+                         field: 'residual',
+                         title: 'Saldo',
+                         align: 'right',
+                     },
+                     {
+                         field: 'invoice_residual',
+                         title: 'Saldo Factura',
+                         align: 'right',
+                     }
+                   ],
+
+             data:row.info,
+             })
+               $('#table2').removeClass('table-hover').addClass('table-no-bordered');
+               $('thead').css('background','none');
+           }
+         });
+
+         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();
+           }else{
+               ResCompany = self.ResCompany[0];
+           }
+
+
+           var table = this.$el.find("#table");
+           var row = table.bootstrapTable('getData');
+
+
+           if (action === 'pdf') {
+
+               var pdf_title = 'Calificación de Cliente.';
+               var pdf_type = '';
+               var pdf_name = 'calificacion_de_clientes_';
+               var pdf_columnStyles = {
+                 invoice: {
+                   columnWidth: 30,
+                   halign: 'center'
+                 },
+                 name: {
+                   columnWidth: 18,
+                   halign: 'center'
+                 },
+
+                 date: {
+                   columnWidth: 22,
+                   halign: 'center'
+                 },
+
+                 state: {
+                   columnWidth: 20,
+                   halign: 'center'
+                 },
+
+                 days_of_delays: {
+                   columnWidth: 20,
+                   halign: 'center'
+                 },
+
+                 amount: {
+                   columnWidth: 25,
+                   halign: 'right'
+                 },
+
+                 residual: {
+                   columnWidth: 25,
+                   halign: 'right'
+                 },
+
+                 invoice_residual: {
+                   columnWidth: 25,
+                   halign: 'right'
+                 },
+               };
+               /*
+               ============================================================
+                   LLAMAR FUNCION DE IMPRESION
+               ============================================================
+               */
+               var filter =self.getFilter();
+               var pdf = new reporting.ReportPdfWidget(self);
+               pdf.drawStarPdf(
+                   row,
+                   ResCompany,
+                   pdf_title,
+                   pdf_type,
+                   pdf_name,
+                   pdf_columnStyles,
+                   filter
+               );
+             }
+       },
+
+       getFilter: function(){
+         var self = this;
+         var company = self.$el.find('#current-company').val();
+         var store = self.$el.find('#current-store').val();
+         var partner = self.$el.find('#current-partner').val();
+         var state = self.$el.find('#current-state').val();
+         var period = self.$el.find('#current-period').val();
+         var date = self.$el.find('#current-date').val();
+         var desde = self.$el.find('#from').val();
+         var hasta = self.$el.find('#to').val();
+
+         var filter = [];
+
+         if(company && company != 9999999){
+           var ResCompany = _.filter(self.ResCompany, function(item){
+             return item.id == company;
+           });
+           filter.push({
+             title:'Empresa',
+             value: ResCompany[0].name,
+           });
+         }
+
+         if(store && store != 9999999){
+           var ResStore =  _.filter(self.ResStore,function(item){
+               return item.id == store;
+           });
+
+           filter.push({
+               title: 'Sucursal',
+               value:  ResStore[0].name,
+           });
+         }
+
+         if(partner && partner != 9999999){
+           var ResPartner =  _.filter(self.ResPartner,function(item){
+               return item.id == partner;
+           });
+
+           filter.push({
+               title: 'Cliente',
+               value:  ResPartner[0].name,
+           });
+         }
+
+         if(state && state != 9999999){
+           filter.push({
+               title: 'Ordenado por',
+               value:  $("#current-state option:selected").text(),
+           });
+         }
+
+         if(period && period != 9999999){
+
+           var AccountPeriod =  _.filter(self.AccountPeriod,function(item){
+               return item.id == period;
+           });
+           filter.push({
+                title: 'Periodo',
+                value:  AccountPeriod[0].name,
+              });
+         }
+
+         if(date && date != 9999999){
+           moment.locale('es', {
+             months: 'Enero_Febrero_Marzo_Abril_Mayo_Junio_Julio_Agosto_Septiembre_Octubre_Noviembre_Diciembre'.split('_'),
+           });
+
+           if(date == 'range'){
+             filter.push({
+                 title: 'Fecha',
+                 value:  desde +' al '+hasta,
+             });
+
+           }
+           else {
+             if(date == 'today'){
+                 var fecha = moment().format('DD/MM/YYYY');
+             }
+
+             if(date == 'yesterday'){
+                 var fecha = moment().add(-1,'days').format('DD/MM/YYYY');
+             }
+             if(date == 'currentMonth'){
+                 var fecha = moment().format('MMMM/YYYY');
+             }
+             if(date == 'lastMonth'){
+                 var fecha = moment().add(-1,'months').format('MMMM/YYYY');
+             }
+
+             filter.push({
+                 title: 'Fecha',
+                 value:  fecha,
+             });
+           }
+         }
+         return filter;
+       },
+   });
+}

+ 159 - 0
static/src/reports/report_customer_ratings.xml

@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ReportCustomerRatings">
+        <div class="report_view">
+            <div class="reporting_page_header">
+                <h1 class="report_title">Calificación de Clientes</h1>
+            </div>
+            <div class="container search-form" style="border-bottom:1px solid #eee; width:90%;">
+                <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 partner filter-style">
+                        <label>Cliente</label>
+                        <select id="current-partner" class="form-control form-control-sm">
+                        </select>
+                    </div>
+                    <div class="col-lg-3 state filter-style">
+                        <label>Ordenar por</label>
+                        <select id="current-state" class="form-control form-control-sm">
+                              <option value="day_of_delay">Días atrasados</option>
+                              <option value="due_qty">Cantidad de cuotas vencidas</option>
+                              <option value="amount_delay">Monto atrasado</option>
+                        </select>
+                    </div>
+                    <div class="col-lg-3 filter-style">
+                        <label>Periodo</label>
+                        <select id="current-period" class="form-control form-control-sm">
+                        </select>
+                    </div>
+
+                    <div class="col-lg-3 filter-style">
+                       <label>Fecha de Vencimiento</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="oe_button oe_form_button myButton">Generar</button>
+                  </div>
+                  <br/>
+                </div>
+            </div>
+
+            <div class="report-form" style="display:none;">
+                <div id="toolbar">
+                    <button class="oe_button oe_form_button myButton" value="pdf">Imprimir Informe</button>
+                </div>
+                <div class="container" style="width:90%;">
+                    <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-row-style="rowStyle"
+                        data-search="true"
+                        data-show-export="true"
+                        data-show-toggle="true"
+                        data-pagination-detail-h-align="center"
+                        data-show-footer="true"
+                        data-footer-style="footerStyle"
+                        data-buttons-class="oe_button oe_form_button myButton"
+                        data-show-pagination-switch="true"
+                        data-page-size="10"
+                        data-search-on-enter-key="true"
+                        data-undefined-text=" "
+                        data-detail-view="true">
+
+                        <thead style="background:none;">
+                            <tr>
+                                <th data-field="partner_name" data-align="left" data-footer-formatter="Totales">Cliente</th>
+                                <th data-field="due_qty" data-align="center" data-footer-formatter="qtyFormatter">Cuotas vencidas</th>
+                                <th data-field="max_days_of_delay" data-align="center">Días atrasados</th>
+                                <th data-field="amount" data-align="right" data-footer-formatter="amountFormatter">Monto total atrasado</th>
+                            </tr>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+            <script>
+
+              function qtyFormatter(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.due_qty);
+                }), function(memo, num) {
+                  return memo + num;
+                }, 0)
+                return accounting.formatNumber(amount, decimal_places, thousands_separator, decimal_separator);
+              };
+
+              function amountFormatter(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_no_format);
+                }), function(memo, num) {
+                  return memo + num;
+                }, 0)
+                return accounting.formatNumber(amount, decimal_places, thousands_separator, decimal_separator);
+              };
+
+               <!-- FOOTER STYLE -->
+
+              function footerStyle(row, index) {
+                return {
+                  css: {
+                    "font-weight": "bold",
+                  }
+                };
+              };
+            </script>
+        </div>
+    </t>
+</template>

+ 5 - 0
static/src/xml/eiru_reporting.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<template xml:space="preserve">
+    
+</template>

+ 5 - 0
static/src/xml/eiru_reporting_base.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<template xml:space="preserve">
+    
+</template>

+ 17 - 0
templates.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+  <data>
+    <template id="eiru_reports_bienstar_assets" inherit_id="eiru_assets.assets">
+      <xpath expr="." position="inside">
+        <link rel="stylesheet" href="/eiru_reports_bienstar/static/src/css/custom.css"/>
+
+        <script type="text/javascript" src="/eiru_reports_bienstar/static/src/js/main.js"/>
+        <script type="text/javascript" src="/eiru_reports_bienstar/static/src/js/reporting_base.js"/>
+        <script type="text/javascript" src="/eiru_reports_bienstar/static/src/js/pdf.js" />
+
+        <script type="text/javascript" src="/eiru_reports_bienstar/static/src/js/reports/report_customer_ratings.js"/>
+
+      </xpath>
+    </template>
+  </data>
+</openerp>

+ 11 - 0
views/actions.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+	<data>
+
+		<record id="customer_ratings_action" model="ir.actions.client">
+			<field name="name">Calificación de Clientes</field>
+			<field name="tag">eiru_reports_bienstar.customer_ratings_action</field>
+		</record>
+
+	</data>
+</openerp>

+ 12 - 0
views/menus.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+  <data>
+    <!-- main menu name -->
+    <menuitem id="bienstar_parent_menu" name="Bienstar" parent="eiru_reports.eiru_reports_main_menu" sequence="7"/>
+
+    <!-- sub menu -->
+
+    <menuitem id="customer_ratings_menu" parent="bienstar_parent_menu" name="Calificación de Clientes" action="customer_ratings_action" sequence="1"/>
+
+  </data>
+</openerp>