frappe.pages['sales-manager'].on_page_load = function(wrapper) { var page = frappe.ui.make_app_page({ parent: wrapper, title: 'Sales Manager', single_column: true }); var $content = $(wrapper).find('.page-content'); $content.html(frappe.render_template('sales_manager')); loadPricingData(); $('#btn-refresh').on('click', function() { loadPricingData(); }); $('#btn-batch-score').on('click', function() { frappe.confirm('Calculate scores for all serials?', function() { frappe.call({ method: 'westech_r2.api.scoring.batch_calculate_scores', args: {batch_size: 500}, callback: function(r) { if (r.message) { frappe.msgprint('Updated: ' + r.message.updated + ', Scrap: ' + r.message.scrap + ', Errors: ' + r.message.errors); loadPricingData(); } } }); }); }); $('#btn-all, #btn-current, #btn-stale, #btn-aging, #btn-expired').on('click', function() { var filter = $(this).attr('id').replace('btn-', ''); filterTable(filter); }); }; function loadPricingData() { $('#loading').show(); $('#pricing-tbody').empty(); frappe.call({ method: 'westech_r2.api.scoring.get_sales_pricing_data', args: {limit: 100}, callback: function(r) { $('#loading').hide(); if (r.message && r.message.serials) { renderPricingTable(r.message.serials); } } }); } function renderPricingTable(serials) { var tbody = $('#pricing-tbody'); tbody.empty(); serials.forEach(function(s) { var ageBadge = '' + (s.age.status || 'unknown') + ''; var tierBadge = '' + (s.tier || 'N/A') + ''; var specs = []; if (s.processor) specs.push(s.processor); if (s.ram) specs.push(s.ram); var marketRange = '$' + (s.market.low || 0).toFixed(0) + ' - $' + (s.market.high || 0).toFixed(0); var row = '