backend.js 8.98 KB
openerp.lacagette_sales_helper = function (instance) {
    var numMedian = function(a) {
    	a = a.slice(0).sort(function(x, y) {
    	    return x - y;
    	});
    	var b = (a.length + 1) / 2;
    	return (a.length % 2) ? a[b - 1] : (a[b - 1.5] + a[b - 0.5]) / 2;
    }
    var averageQty = function(a, back_qty) {
    	//compute sum of the last "back_qty" elements of a
    	var ac = a,
    	    sum = average = 0,
    	    i = 0
    	while (i < back_qty && ac.length > 0) {
    	    i += 1
    	    sum += ac.pop()
    	}
    	if (i > 0) average = Math.round((sum / i) * 100) / 100
    	return average
    }

    // Declare which method has to be called according ir.actions.client
    instance.web.client_actions.add('custom_product_losses', 'instance.lacagette_sales_helper.ShowProductLosses');
    instance.web.client_actions.add('custom_product_autoconso', 'instance.lacagette_sales_helper.ShowProductAutoconso');
    instance.web.client_actions.add('custom_product_meals', 'instance.lacagette_sales_helper.ShowProductMeals');

    instance.lacagette_sales_helper.ShowProductLosses = instance.web.Widget.extend({
      template: 'product_losses_details',
      className: 'oe_stock_movements_data',
    	context: null,
    	init: function(parent, action) {
    	    this._super(parent, action);
    	    this.context = action.context
    	    //console.log(action)
    	},
      start: function () {
    	    jQuery('.modal-title').text("Pertes de l'article")

    	    new instance.web.Model('lacagette.sales_helper')
            .call('get_product_template_data', [this.context.active_id, {interval: 'week', type: 'losses'}])
        		.then(function(result){
        		    if (typeof result.error == "undefined"){
                  var average_qty_moved_per_week = Math.round((result.non_empty_weeks_qty / result.nb_non_empty_weeks) * 100)/100
                  var weeks_without_movement = Math.round(100 - (result.nb_non_empty_weeks / result.labels.length) * 100)
                  var non_empty_qties = result.data.filter(function(val) {
                     return val !== 0;
                  });
                  var median_qty_without_empty = numMedian(non_empty_qties)
                  var average_last_4_non_empty_weeks = averageQty(non_empty_qties, 4)
                  var comment = "Semaines sans pertes : " + weeks_without_movement + "% <br/>"
                  comment += "Perte hebdomadaire moyenne (hors semaines vides) : " + average_qty_moved_per_week + "<br/>"
                  comment += "Quantité hebdomadaire médiane (hors semaines vides) : " + median_qty_without_empty + "<br/>"
                  comment += "Quantité hebdomadaire moyenne (4 dernières semaines non vides) " + average_last_4_non_empty_weeks
            			jQuery('#product_losses_comments').html(comment)

            			var config = {
            			    type: 'bar',
            			    data: {
                        labels: result.labels,
              				  datasets: [{
            				      label: 'Quantités en pertes',
            				      data: result.data
				                }]
            				  },
            			    options: {
          				       title: {
              					   display: true,
              					   text: 'Graph. des pertes par semaine'
          				       },
                         scales: {
                    				yAxes: [{
                        			ticks: {
                                 beginAtZero: true
                               }
                             }]
                         },
            				     legend: { display: false }
            			    }
            			};

            			myChart =  new Chart(document.getElementById("product_losses_chart"), config);
        		    }
        		})

          return this._super()
      },
    	destroy: function(){
    	   return this._super()
    	}
    });

    instance.lacagette_sales_helper.ShowProductAutoconso = instance.web.Widget.extend({
      template: 'product_autoconso_details',
      className: 'oe_stock_movements_data',
    	context: null,
    	init: function(parent, action) {
    	    this._super(parent, action);
    	    this.context = action.context
    	    //console.log(action)
    	},
      start: function () {
    	    jQuery('.modal-title').text("Autoconsommation de l'article")

    	    new instance.web.Model('lacagette.sales_helper')
            .call('get_product_template_data', [this.context.active_id, {interval: 'week', type: 'autoconso'}])
        		.then(function(result){
        		    if (typeof result.error == "undefined"){
                  var average_qty_moved_per_week = Math.round((result.non_empty_weeks_qty / result.nb_non_empty_weeks) * 100)/100
                  var non_empty_qties = result.data.filter(function(val) {
                     return val !== 0;
                  });
                  var median_qty_without_empty = numMedian(non_empty_qties)
                  var average_last_4_non_empty_weeks = averageQty(non_empty_qties, 4)
                  var comment = "Autoconsommation hebdomadaire moyenne (hors semaines vides) : " + average_qty_moved_per_week + "<br/>"
                  comment += "Quantité hebdomadaire médiane (hors semaines vides) : " + median_qty_without_empty + "<br/>"
                  comment += "Quantité hebdomadaire moyenne (4 dernières semaines non vides) " + average_last_4_non_empty_weeks
            			jQuery('#product_autoconso_comments').html(comment)

            			var config = {
            			    type: 'bar',
            			    data: {
                        labels: result.labels,
              				  datasets: [{
            				      label: 'Quantités en autoconso',
            				      data: result.data
				                }]
            				  },
            			    options: {
          				       title: {
              					   display: true,
              					   text: 'Graph. des autoconso par semaine'
          				       },
                         scales: {
                    				yAxes: [{
                        			ticks: {
                                 beginAtZero: true
                               }
                             }]
                         },
            				     legend: { display: false }
            			    }
            			};

            			myChart =  new Chart(document.getElementById("product_autoconso_chart"), config);
        		    }
        		})

          return this._super()
      },
    	destroy: function(){
    	   return this._super()
    	}
    });

    instance.lacagette_sales_helper.ShowProductMeals = instance.web.Widget.extend({
      template: 'product_meals_details',
      className: 'oe_stock_movements_data',
    	context: null,
    	init: function(parent, action) {
    	    this._super(parent, action);
    	    this.context = action.context
    	    //console.log(action)
    	},
      start: function () {
    	    jQuery('.modal-title').text("Repas salariés de l'article")

    	    new instance.web.Model('lacagette.sales_helper')
            .call('get_product_template_data', [this.context.active_id, {interval: 'week', type: 'meals'}])
        		.then(function(result){
        		    if (typeof result.error == "undefined"){
                  var average_qty_moved_per_week = Math.round((result.non_empty_weeks_qty / result.nb_non_empty_weeks) * 100)/100
                  var non_empty_qties = result.data.filter(function(val) {
                     return val !== 0;
                  });
                  var median_qty_without_empty = numMedian(non_empty_qties)
                  var average_last_4_non_empty_weeks = averageQty(non_empty_qties, 4)
                  var comment = "Qté en Repas salarié hebdomadaire moyenne (hors semaines vides) : " + average_qty_moved_per_week + "<br/>"
                  comment += "Quantité hebdomadaire médiane (hors semaines vides) : " + median_qty_without_empty + "<br/>"
                  comment += "Quantité hebdomadaire moyenne (4 dernières semaines non vides) " + average_last_4_non_empty_weeks
            			jQuery('#product_meals_comments').html(comment)

            			var config = {
            			    type: 'bar',
            			    data: {
                        labels: result.labels,
              				  datasets: [{
            				      label: 'Quantités en repas salarié',
            				      data: result.data
				                }]
            				  },
            			    options: {
          				       title: {
              					   display: true,
              					   text: 'Graph. des repas salariés par semaine'
          				       },
                         scales: {
                    				yAxes: [{
                        			ticks: {
                                 beginAtZero: true
                               }
                             }]
                         },
            				     legend: { display: false }
            			    }
            			};

            			myChart =  new Chart(document.getElementById("product_meals_chart"), config);
        		    }
        		})

          return this._super()
      },
    	destroy: function(){
    	   return this._super()
    	}
    });

};