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 = '' + '' + s.serial_no + '' + '' + (s.item_name || s.item_code) + '' + '' + (s.cosmetic_grade || '') + '' + '' + specs.join(' / ') + '' + '' + (s.score || 0) + '' + '' + tierBadge + '' + '' + marketRange + '' + '$' + (s.suggested_price || 0).toFixed(2) + '' + '' + ageBadge + '
' + s.age.days + 'd' + '' + '' + '' + '' + ''; tbody.append(row); }); $('.btn-save-price').on('click', function() { var serial = $(this).data('serial'); var price = $(this).closest('tr').find('.final-price').val(); saveFinalPrice(serial, price); }); } function filterTable(filter) { if (filter === 'all') { $('#pricing-tbody tr').show(); } else { $('#pricing-tbody tr').hide(); $('#pricing-tbody tr[data-age="' + filter + '"]').show(); } } function saveFinalPrice(serial_no, price) { frappe.call({ method: 'frappe.client.set_value', args: { doctype: 'Serial No', name: serial_no, fieldname: { 'assigned_price': price, 'pricing_status': 'Manual Override' } }, callback: function(r) { if (!r.exc) { frappe.show_alert({message: 'Price saved for ' + serial_no, indicator: 'green'}); } } }); }