126 lines
4.2 KiB
JavaScript
126 lines
4.2 KiB
JavaScript
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 = '<span class="badge badge-' + (s.age.color || 'secondary') + '">' +
|
|
(s.age.status || 'unknown') + '</span>';
|
|
|
|
var tierBadge = '<span class="badge badge-info">' + (s.tier || 'N/A') + '</span>';
|
|
|
|
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 = '<tr data-age="' + s.age.status + '">' +
|
|
'<td><a href="/app/serial-no/' + s.serial_no + '">' + s.serial_no + '</a></td>' +
|
|
'<td>' + (s.item_name || s.item_code) + '</td>' +
|
|
'<td>' + (s.cosmetic_grade || '') + '</td>' +
|
|
'<td><small>' + specs.join(' / ') + '</small></td>' +
|
|
'<td><strong>' + (s.score || 0) + '</strong></td>' +
|
|
'<td>' + tierBadge + '</td>' +
|
|
'<td><small>' + marketRange + '</small></td>' +
|
|
'<td>$' + (s.suggested_price || 0).toFixed(2) + '</td>' +
|
|
'<td>' + ageBadge + '<br><small>' + s.age.days + 'd</small></td>' +
|
|
'<td><input type="number" class="form-control form-control-sm final-price" ' +
|
|
'data-serial="' + s.serial_no + '" value="' + (s.assigned_price || '') + '" step="0.01"></td>' +
|
|
'<td>' +
|
|
'<button class="btn btn-sm btn-success btn-save-price" data-serial="' + s.serial_no + '">Save</button>' +
|
|
'</td>' +
|
|
'</tr>';
|
|
|
|
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'});
|
|
}
|
|
}
|
|
});
|
|
}
|