|
@@ -0,0 +1,164 @@
|
|
|
+function ranking_sales_product (widget) {
|
|
|
+ "use strict";
|
|
|
+
|
|
|
+ var model= openerp;
|
|
|
+ widget.RankingSalesProductWidget = widget.Base.extend({
|
|
|
+ template: 'RankingSalesProductTmpl',
|
|
|
+ data : [],
|
|
|
+ accountInvoice : [],
|
|
|
+ invoiceLine : [],
|
|
|
+ productProdcut : [],
|
|
|
+
|
|
|
+ init: function (parent) {
|
|
|
+ this._super(parent, {
|
|
|
+ width : 6,
|
|
|
+ height: 4
|
|
|
+ });
|
|
|
+ },
|
|
|
+ start: function () {
|
|
|
+ var self = this;
|
|
|
+ self.fecthInitial();
|
|
|
+ },
|
|
|
+ fecthInitial:function(){
|
|
|
+ var self = this;
|
|
|
+ self.$el.block({ message: null, overlayCSS: { backgroundColor: '#FAFAFA' }});
|
|
|
+ self.$el.find('.widget-content.widget-loading').css('display','flex');
|
|
|
+ self.fecthInvoice().then(function(accountInvoice){
|
|
|
+ return accountInvoice;
|
|
|
+ }).then(function(accountInvoice){
|
|
|
+ self.accountInvoice = accountInvoice;
|
|
|
+ return self.fecthInvoiceLine(accountInvoice);
|
|
|
+ }).then(function(invoiceLine){
|
|
|
+ self.invoiceLine = invoiceLine;
|
|
|
+ return self.fecthProductProduct(invoiceLine);
|
|
|
+ }).then(function(productProdcut){
|
|
|
+ self.productProdcut = productProdcut;
|
|
|
+ return self.fecthRankingProdcuto();
|
|
|
+ });
|
|
|
+ return false;
|
|
|
+ },
|
|
|
+ // Obtener factura
|
|
|
+ fecthInvoice :function(){
|
|
|
+ var self = this;
|
|
|
+ var fecha = new Date
|
|
|
+ var desde =fecha.getFullYear()+"-"+(fecha.getMonth()+1)+"-01";
|
|
|
+ var hasta =fecha.getFullYear()+"-"+(fecha.getMonth()+2)+"-01";
|
|
|
+ var defer =$.Deferred();
|
|
|
+ var fields =['id','invoice_line', 'date_invoice'];
|
|
|
+ var domain =[['type', '=', 'out_invoice'],['date_invoice', '>=', desde],['date_invoice', '<', hasta],['state', '=',['open','paid']]];
|
|
|
+ // date_invoice
|
|
|
+ var invoice = new model.web.Model('account.invoice');
|
|
|
+ invoice.query(fields).filter(domain).all().then(function(results){
|
|
|
+ defer.resolve(results);
|
|
|
+ });
|
|
|
+ return defer;
|
|
|
+ },
|
|
|
+ // Obtener linea de la factura
|
|
|
+ fecthInvoiceLine : function(accountInvoice){
|
|
|
+ var self = this;
|
|
|
+ var defer =$.Deferred();
|
|
|
+ var invoice_line =_.flatten(_.map(accountInvoice, function(item){return item.invoice_line}));
|
|
|
+ var fields =['id', 'product_id','quantity'];
|
|
|
+ var domain = [['id','=', invoice_line]];
|
|
|
+ var invoiceLine = new model.web.Model('account.invoice.line');
|
|
|
+ invoiceLine.query(fields).filter(domain).all().then(function(results){
|
|
|
+ defer.resolve(results);
|
|
|
+ });
|
|
|
+ return defer;
|
|
|
+ },
|
|
|
+ // Obtener Prodcutos
|
|
|
+ fecthProductProduct : function(invoiceLine){
|
|
|
+ var self = this;
|
|
|
+ var defer =$.Deferred();
|
|
|
+ var prodcut_id = _.flatten(_.map(invoiceLine,function(item){return item.product_id[0]}));
|
|
|
+ var fields = ['id', 'name_template', 'type'];
|
|
|
+ var domain =[['id', '=', prodcut_id]];
|
|
|
+ var prodcut= new model.web.Model('product.product');
|
|
|
+ prodcut.query(fields).filter(domain).all().then(function(results){
|
|
|
+ defer.resolve(results);
|
|
|
+ });
|
|
|
+ return defer;
|
|
|
+ },
|
|
|
+
|
|
|
+ fecthRankingProdcuto : function(){
|
|
|
+ var self = this;
|
|
|
+ var itemProduct;
|
|
|
+ var itemLine;
|
|
|
+ var ranking=[];
|
|
|
+ var cat=0;
|
|
|
+ var lineUnik;
|
|
|
+ for (var i = 0; i < self.productProdcut.length; i++) {
|
|
|
+ itemProduct = self.productProdcut[i];
|
|
|
+ itemLine= self.getInvoiceLine(itemProduct.id);
|
|
|
+ if (itemProduct.type == 'product'){
|
|
|
+ if (itemLine.length > 0){
|
|
|
+ cat = _.reduce(_.map(itemLine,function(map){return map.quantity}),function(meno,num){return meno + num},0);
|
|
|
+ lineUnik=itemLine.shift();
|
|
|
+ ranking.push({ product :lineUnik.product_id[1],qty:cat });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ranking.sort(function(a,b){return b.qty - a.qty});
|
|
|
+ self.$el.unblock()
|
|
|
+ self.$el.find('.widget-content.widget-loading').css('display','none');
|
|
|
+ var fecha = new Date();
|
|
|
+ var meses = new Array ("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");
|
|
|
+ self.$el.find('.widget-title').find('span').text("Ranking de Producto mas Vendido Mes de "+meses[fecha.getMonth()]);
|
|
|
+
|
|
|
+ self.fecthChart(ranking);
|
|
|
+ },
|
|
|
+ // get line
|
|
|
+ getInvoiceLine(product_id){
|
|
|
+ var self = this;
|
|
|
+ return _.flatten(_.filter(self.invoiceLine,function(line){return line.product_id[0] === product_id}));
|
|
|
+ },
|
|
|
+ // Generar Grafico
|
|
|
+ fecthChart: function(ranking){
|
|
|
+ var self = this;
|
|
|
+ var label=[];
|
|
|
+ var body=[];
|
|
|
+ var item;
|
|
|
+ var rank=10;
|
|
|
+
|
|
|
+ for (var i = 0; i < rank; i++) {
|
|
|
+ if (ranking[i]){
|
|
|
+ item = ranking[i];
|
|
|
+ }else{
|
|
|
+ item={};
|
|
|
+ item.product="N/A";
|
|
|
+ item.qty=0;
|
|
|
+ }
|
|
|
+ label.push(item.product);
|
|
|
+ body.push(item.qty);
|
|
|
+ }
|
|
|
+ var chart = new Chart(this.$el.find(".widget-content").find('canvas'), {
|
|
|
+ // type: 'doughnut',
|
|
|
+ type: 'horizontalBar',
|
|
|
+ // type: '',
|
|
|
+ data: {
|
|
|
+ labels: label,
|
|
|
+ datasets: [
|
|
|
+ {
|
|
|
+ backgroundColor: ['#7c7bad', '#7c7bad', '#7c7bad', '#7c7bad', '#7c7bad', '#7c7bad', '#7c7bad', '#7c7bad', '#7c7bad', '#7c7bad'],
|
|
|
+ data: body,
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ options: {
|
|
|
+ maintainAspectRatio: false,
|
|
|
+ layout: {
|
|
|
+ padding: 20
|
|
|
+ },
|
|
|
+ scales: {
|
|
|
+ xAxes: [{ stacked: true }],
|
|
|
+ yAxes: [{ stacked: true }],
|
|
|
+ },
|
|
|
+ legend: {
|
|
|
+ display: false,
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|