brotherton-erpnext/erpnext/stock/dashboard/item_dashboard.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

304 lines
8.0 KiB
JavaScript
Raw Normal View History

2016-04-25 12:23:42 +00:00
frappe.provide('erpnext.stock');
erpnext.stock.ItemDashboard = Class.extend({
2021-03-17 13:10:21 +00:00
init: function (opts) {
2016-04-25 12:23:42 +00:00
$.extend(this, opts);
this.make();
},
2021-03-17 13:10:21 +00:00
make: function () {
2016-04-25 12:23:42 +00:00
var me = this;
this.start = 0;
2021-03-17 13:10:21 +00:00
if (!this.sort_by) {
2016-04-25 12:23:42 +00:00
this.sort_by = 'projected_qty';
this.sort_order = 'asc';
}
this.content = $(frappe.render_template('item_dashboard')).appendTo(this.parent);
this.result = this.content.find('.result');
2021-03-17 13:10:21 +00:00
this.content.on('click', '.btn-move', function () {
handle_move_add($(this), "Move");
});
2021-03-17 13:10:21 +00:00
this.content.on('click', '.btn-add', function () {
handle_move_add($(this), "Add");
});
2021-03-17 13:10:21 +00:00
this.content.on('click', '.btn-edit', function () {
let item = unescape($(this).attr('data-item'));
let warehouse = unescape($(this).attr('data-warehouse'));
let company = unescape($(this).attr('data-company'));
2021-03-17 13:10:21 +00:00
frappe.db.get_value('Putaway Rule', {
'item_code': item,
'warehouse': warehouse,
'company': company
}, 'name', (r) => {
frappe.set_route("Form", "Putaway Rule", r.name);
});
});
function handle_move_add(element, action) {
let item = unescape(element.attr('data-item'));
let warehouse = unescape(element.attr('data-warehouse'));
let actual_qty = unescape(element.attr('data-actual_qty'));
let disable_quick_entry = Number(unescape(element.attr('data-disable_quick_entry')));
2021-03-17 13:10:21 +00:00
let entry_type = action === "Move" ? "Material Transfer" : null;
2019-07-16 07:02:50 +00:00
if (disable_quick_entry) {
open_stock_entry(item, warehouse, entry_type);
2019-07-16 07:02:50 +00:00
} else {
if (action === "Add") {
let rate = unescape($(this).attr('data-rate'));
2021-03-17 13:10:21 +00:00
erpnext.stock.move_item(item, null, warehouse, actual_qty, rate, function () {
me.refresh();
});
} else {
erpnext.stock.move_item(item, warehouse, null, actual_qty, null, function () {
me.refresh();
});
}
2019-07-16 07:02:50 +00:00
}
}
function open_stock_entry(item, warehouse, entry_type) {
2021-03-17 13:10:21 +00:00
frappe.model.with_doctype('Stock Entry', function () {
var doc = frappe.model.get_new_doc('Stock Entry');
if (entry_type) doc.stock_entry_type = entry_type;
var row = frappe.model.add_child(doc, 'items');
row.item_code = item;
row.s_warehouse = warehouse;
frappe.set_route('Form', doc.doctype, doc.name);
2021-03-17 13:10:21 +00:00
});
}
2016-04-25 12:23:42 +00:00
// more
2021-03-17 13:10:21 +00:00
this.content.find('.btn-more').on('click', function () {
me.start += me.page_length;
2016-04-25 12:23:42 +00:00
me.refresh();
});
},
2021-03-17 13:10:21 +00:00
refresh: function () {
if (this.before_refresh) {
2016-04-25 12:23:42 +00:00
this.before_refresh();
}
let args = {
item_code: this.item_code,
warehouse: this.warehouse,
parent_warehouse: this.parent_warehouse,
item_group: this.item_group,
company: this.company,
start: this.start,
sort_by: this.sort_by,
sort_order: this.sort_order
};
2016-04-25 12:23:42 +00:00
var me = this;
frappe.call({
method: this.method,
args: args,
2021-03-17 13:10:21 +00:00
callback: function (r) {
2016-04-25 12:23:42 +00:00
me.render(r.message);
}
});
},
2021-03-17 13:10:21 +00:00
render: function (data) {
if (this.start === 0) {
2016-04-25 12:23:42 +00:00
this.max_count = 0;
this.result.empty();
}
let context = "";
if (this.page_name === "warehouse-capacity-summary") {
context = this.get_capacity_dashboard_data(data);
} else {
context = this.get_item_dashboard_data(data, this.max_count, true);
}
2016-04-25 12:23:42 +00:00
this.max_count = this.max_count;
// show more button
2021-03-17 13:10:21 +00:00
if (data && data.length === (this.page_length + 1)) {
2016-04-25 12:23:42 +00:00
this.content.find('.more').removeClass('hidden');
// remove the last element
data.splice(-1);
} else {
this.content.find('.more').addClass('hidden');
}
2018-01-24 08:21:26 +00:00
// If not any stock in any warehouses provide a message to end user
if (context.data.length > 0) {
this.content.find('.result').css('text-align', 'unset');
$(frappe.render_template(this.template, context)).appendTo(this.result);
} else {
var message = __("No Stock Available Currently");
this.content.find('.result').css('text-align', 'center');
$(`<div class='text-muted' style='margin: 20px 5px;'>
${message} </div>`).appendTo(this.result);
}
2016-04-25 12:23:42 +00:00
},
2021-03-17 13:10:21 +00:00
get_item_dashboard_data: function (data, max_count, show_item) {
if (!max_count) max_count = 0;
if (!data) data = [];
2018-01-24 14:17:59 +00:00
2021-03-17 13:10:21 +00:00
data.forEach(function (d) {
d.actual_or_pending = d.projected_qty + d.reserved_qty + d.reserved_qty_for_production + d.reserved_qty_for_sub_contract;
2016-04-25 12:23:42 +00:00
d.pending_qty = 0;
d.total_reserved = d.reserved_qty + d.reserved_qty_for_production + d.reserved_qty_for_sub_contract;
2021-03-17 13:10:21 +00:00
if (d.actual_or_pending > d.actual_qty) {
2016-04-25 12:23:42 +00:00
d.pending_qty = d.actual_or_pending - d.actual_qty;
}
max_count = Math.max(d.actual_or_pending, d.actual_qty,
d.total_reserved, max_count);
});
2018-01-24 14:17:59 +00:00
let can_write = 0;
if (frappe.boot.user.can_write.indexOf("Stock Entry") >= 0) {
2018-01-24 14:17:59 +00:00
can_write = 1;
}
2016-04-25 12:23:42 +00:00
return {
data: data,
max_count: max_count,
2021-03-17 13:10:21 +00:00
can_write: can_write,
2016-04-25 12:23:42 +00:00
show_item: show_item || false
};
},
2021-03-17 13:10:21 +00:00
get_capacity_dashboard_data: function (data) {
if (!data) data = [];
2021-03-17 13:10:21 +00:00
data.forEach(function (d) {
d.color = d.percent_occupied >= 80 ? "#f8814f" : "#2490ef";
});
let can_write = 0;
if (frappe.boot.user.can_write.indexOf("Putaway Rule") >= 0) {
can_write = 1;
2016-04-25 12:23:42 +00:00
}
return {
data: data,
can_write: can_write,
};
2016-04-25 12:23:42 +00:00
}
});
2021-03-17 13:10:21 +00:00
erpnext.stock.move_item = function (item, source, target, actual_qty, rate, callback) {
var dialog = new frappe.ui.Dialog({
title: target ? __('Add Item') : __('Move Item'),
2021-03-17 13:10:21 +00:00
fields: [{
fieldname: 'item_code',
label: __('Item'),
fieldtype: 'Link',
options: 'Item',
read_only: 1
},
{
fieldname: 'source',
label: __('Source Warehouse'),
fieldtype: 'Link',
options: 'Warehouse',
read_only: 1
},
{
fieldname: 'target',
label: __('Target Warehouse'),
fieldtype: 'Link',
options: 'Warehouse',
reqd: 1
},
{
fieldname: 'qty',
label: __('Quantity'),
reqd: 1,
fieldtype: 'Float',
description: __('Available {0}', [actual_qty])
},
{
fieldname: 'rate',
label: __('Rate'),
fieldtype: 'Currency',
hidden: 1
},
],
2021-03-17 13:10:21 +00:00
});
dialog.show();
dialog.get_field('item_code').set_input(item);
2021-03-17 13:10:21 +00:00
if (source) {
dialog.get_field('source').set_input(source);
} else {
dialog.get_field('source').df.hidden = 1;
dialog.get_field('source').refresh();
}
2021-03-17 13:10:21 +00:00
if (rate) {
dialog.get_field('rate').set_value(rate);
dialog.get_field('rate').df.hidden = 0;
dialog.get_field('rate').refresh();
}
2021-03-17 13:10:21 +00:00
if (target) {
dialog.get_field('target').df.read_only = 1;
dialog.get_field('target').value = target;
dialog.get_field('target').refresh();
}
2021-03-17 13:10:21 +00:00
dialog.set_primary_action(__('Submit'), function () {
var values = dialog.get_values();
2021-03-17 13:10:21 +00:00
if (!values) {
return;
}
2021-03-17 13:10:21 +00:00
if (source && values.qty > actual_qty) {
frappe.msgprint(__('Quantity must be less than or equal to {0}', [actual_qty]));
return;
}
2021-03-17 13:10:21 +00:00
if (values.source === values.target) {
frappe.msgprint(__('Source and target warehouse must be different'));
}
frappe.call({
method: 'erpnext.stock.doctype.stock_entry.stock_entry_utils.make_stock_entry',
args: values,
btn: dialog.get_primary_btn(),
freeze: true,
freeze_message: __('Creating Stock Entry'),
2021-03-17 13:10:21 +00:00
callback: function (r) {
frappe.show_alert(__('Stock Entry {0} created',
2021-03-17 13:10:21 +00:00
['<a href="/app/stock-entry/' + r.message.name + '">' + r.message.name + '</a>']));
dialog.hide();
callback(r);
},
});
});
2021-03-17 13:10:21 +00:00
$('<p style="margin-left: 10px;"><a class="link-open text-muted small">' +
__("Add more items or open full form") + '</a></p>')
.appendTo(dialog.body)
.find('.link-open')
2021-03-17 13:10:21 +00:00
.on('click', function () {
frappe.model.with_doctype('Stock Entry', function () {
var doc = frappe.model.get_new_doc('Stock Entry');
doc.from_warehouse = dialog.get_value('source');
doc.to_warehouse = dialog.get_value('target');
var row = frappe.model.add_child(doc, 'items');
row.item_code = dialog.get_value('item_code');
row.f_warehouse = dialog.get_value('target');
row.t_warehouse = dialog.get_value('target');
row.qty = dialog.get_value('qty');
row.conversion_factor = 1;
row.transfer_qty = dialog.get_value('qty');
row.basic_rate = dialog.get_value('rate');
frappe.set_route('Form', doc.doctype, doc.name);
2021-03-17 13:10:21 +00:00
});
});
2021-03-17 13:10:21 +00:00
};