var table = $('#sales_list'); var active_table = null; var filter_pareto = $('#filter_pareto'); var raw_lines_data = []; var pareto_sales_80_data = []; var parsed_sum_up = {total: 0, sale_to_zero: []}; var compute_price_delta_level = function(prices) { var min = 100000000000000; var max = -100000000000000; var level = 0; for (i in prices) { if (prices[i] < min) min = prices[i]; if (prices[i] > max) max = prices[i]; } if (min == 0) { level = 10; } else { var ratio = max/min; if (ratio > 10) { level = 9; } else if (ratio > 5) { level = 8; } else if (ratio > 2) { level = 7; } else if (ratio > 1.75) { level = 6; } else if (ratio > 1.5) { level = 5; } else if (ratio > 1.4) { level = 4; } else if (ratio > 1.3) { level = 3; } else if (ratio > 1.2) { level = 2; } else if (ratio > 1.1) { level = 1; } } return level; }; //console.log(window.sales_data) $.each(window.sales_data.sales.products, function(pid, elt) { //clef elts = discount_x, details, qty, total try { product = window.sales_data.products[pid]; raw_lines_data.push({id: pid, barcode: product.barcode, name: product.p_name, categ: window.sales_data.pcat[product.categ_id], qty: elt.qty, total: elt.total, details: elt.details}); parsed_sum_up.total += elt.total; } catch { console.log("Pb avec produit " + pid); } }); // console.log(window.sales_data) // console.log(parsed_sum_up.total) var display_table = function (data) { var cols = [ {data: 'barcode', title: "Code-barre", className: 'barcode'}, {data: 'name', title: "Nom", className: 'name'}, {data: 'categ', title: "Catégorie", className: 'categ'}, {data: 'qty', title: "Qté"}, {data: 'total', title: "Total TTC", className: 'ttc'}, {data: 'details', title: "Détails", className: 'details'} ]; var select = { style: 'os', selector: 'td:first-child' }; var settings = { dom: '<lf<t>i><"clear"><B>', lengthMenu : [ [ 10, 25, 50, 100, -1 ], [ 10, 25, 50, 100, 'Tout' ] ], buttons: [], columns: cols, select: select, rowId : "id", data : data, language: {url : '/static/js/datatables/french.json'}, createdRow: function(row, rdata, index) { var details = ''; var nb_dates = Object.keys(rdata.details).length; var anomalie_classes = []; if (nb_dates > 0) { details = $('<div>'); list = $('<ul>').css('display', 'none'); var prices = []; var price_delta_level = 0; var price_1 = false; var price_0 = false; for (d in rdata.details) { var l = $('<li>'); var detail_info = rdata.details[d].date + ' : ' + rdata.details[d].val + '€, '; detail_info += rdata.details[d].qty + ' en ' + rdata.details[d].transacs.length + ' transac.'; if (rdata.details[d].transacs.length > 1) { detail_info = $('<a>').addClass('open_day_details') .text(detail_info); day_list = $('<ul>').css('display', 'none'); $.each(rdata.details[d].transacs, function(idx, transac) { var det_line = $('<li>'); var pfound = false; for (pidx in prices) { if (prices[pidx] == transac.price) pfound = true; } if (pfound == false || prices.length == 0) prices.push(transac.price); if (transac.price == 1) { price_1 = true; day_list.addClass('pr_1'); det_line.addClass('pr_1'); l.addClass('pr_1'); } else if (transac.price == 0) { price_0 = true; day_list.addClass('pr_0'); det_line.addClass('pr_0'); l.addClass('pr_0'); } var full_d = transac.qty + ' x ' + transac.price + '€ = ' + transac.subtotal; if (transac.discount > 0) full_d += ' (remise=' + transac.discount +')'; det_line.text(full_d); day_list.append(det_line); }); detail_info.append(day_list); } if (price_1 == true) anomalie_classes.push('pr_1'); if (price_0 == true) anomalie_classes.push('pr_0'); l.html(detail_info); list.append(l); } if (prices.length > 1) price_delta_level = compute_price_delta_level(prices); if (price_delta_level > 0) anomalie_classes.push('pdl_'+price_delta_level); var date_msg = nb_dates + ' date'; if (nb_dates > 1) date_msg += 's'; text = $('<a>').addClass('open_details') .text(date_msg); details.append(text); details.append(list); } $(row).addClass(anomalie_classes.join(' ')); $(row).find('td') .last() .html(details); }, initComplete: function() { } }; active_table = table.DataTable(settings); table.show(); table.off('click', '.open_details'); table.off('click', '.open_day_details'); table.on('click', '.open_details', function() { var clicked = $(this); var details = clicked.closest('td').find('ul') .first(); if (details.css('display') == 'none') { details.show(); } else { details.hide(); } }); table.on('click', '.open_day_details', function() { var clicked = $(this); var details = clicked.find('ul'); if (details.css('display') == 'none') { details.show(); } else { details.hide(); } }); }; function get_x_pc_sales_products() { var kept = []; var local_sum = 0; var ref_sum = window.sales_data.sales.full_total - window.sales_data.sales.full_discount; var pareto_num = $('#pareto_num').val(); if (isNaN(pareto_num)) pareto_num = 0.8; else pareto_num = pareto_num / 100; raw_lines_data.sort(function(a, b) { return parseFloat(b.total) - parseFloat(a.total); }); $.each(raw_lines_data, function(i, e) { local_sum += e.total; if (local_sum < ref_sum * pareto_num) { kept.push(e); } }); return kept; } function display_sum_up() { // verifier delta parsed_sum_up.total et window.sales_data.sales.full_total - window.sales_data.sales.full_discount var ttc_ar = window.sales_data.sales.full_total; var total_r = window.sales_data.sales.full_discount; var msg = '<strong>Total TTC</strong> : ' + ttc_ar + ' - ' + total_r + ' (remises) '; msg += '= <strong>' + (ttc_ar - total_r) + ' €</strong>'; msg += ' (' + window.sales_data.sales.orders + ' passages en caisse '; msg += ' --> ' + window.sales_data.sales.pol_nb + ' lignes de tickets)'; msg += ' réalisé avec ' + window.sales_data.sales.partners + ' coopérateurs différents'; $('#sum_up').html(msg); } filter_pareto.click(function() { active_table.destroy(); if ($(this).is(':checked')) { display_table(get_x_pc_sales_products()); } else { display_table(raw_lines_data); } }); display_sum_up(); display_table(raw_lines_data);