[fix] Valuation rate in stock entry and code cleanup (#11614)
This commit is contained in:
parent
bb34c57603
commit
51a397c97f
@ -14,8 +14,6 @@ frappe.ui.form.on('Stock Entry', {
|
||||
]
|
||||
}
|
||||
});
|
||||
// },
|
||||
// onload_post_render: function(frm) {
|
||||
|
||||
frm.set_query('batch_no', 'items', function(doc, cdt, cdn) {
|
||||
var item = locals[cdt][cdn];
|
||||
@ -40,9 +38,8 @@ frappe.ui.form.on('Stock Entry', {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
},
|
||||
|
||||
refresh: function(frm) {
|
||||
if(!frm.doc.docstatus) {
|
||||
frm.add_custom_button(__('Make Material Request'), function() {
|
||||
@ -73,10 +70,12 @@ frappe.ui.form.on('Stock Entry', {
|
||||
frm.trigger("toggle_display_account_head");
|
||||
}
|
||||
},
|
||||
|
||||
purpose: function(frm) {
|
||||
frm.fields_dict.items.grid.refresh();
|
||||
frm.cscript.toggle_related_fields(frm.doc);
|
||||
},
|
||||
|
||||
company: function(frm) {
|
||||
if(frm.doc.company) {
|
||||
var company_doc = frappe.get_doc(":Company", frm.doc.company);
|
||||
@ -86,6 +85,7 @@ frappe.ui.form.on('Stock Entry', {
|
||||
frm.trigger("toggle_display_account_head");
|
||||
}
|
||||
},
|
||||
|
||||
set_serial_no: function(frm, cdt, cdn) {
|
||||
var d = frappe.model.get_doc(cdt, cdn);
|
||||
if(!d.item_code && !d.s_warehouse && !d.qty) return;
|
||||
@ -104,20 +104,142 @@ frappe.ui.form.on('Stock Entry', {
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
toggle_display_account_head: function(frm) {
|
||||
var enabled = erpnext.is_perpetual_inventory_enabled(frm.doc.company);
|
||||
frm.fields_dict["items"].grid.set_column_disp(["cost_center", "expense_account"], enabled);
|
||||
}
|
||||
},
|
||||
|
||||
set_basic_rate: function(frm, cdt, cdn, callback) {
|
||||
const item = locals[cdt][cdn];
|
||||
item.transfer_qty = flt(item.qty) * flt(item.conversion_factor);
|
||||
|
||||
const args = {
|
||||
'item_code' : item.item_code,
|
||||
'posting_date' : frm.doc.posting_date,
|
||||
'posting_time' : frm.doc.posting_time,
|
||||
'warehouse' : cstr(item.s_warehouse) || cstr(item.t_warehouse),
|
||||
'serial_no ' : item.serial_no,
|
||||
'company' : frm.doc.company,
|
||||
'qty' : item.s_warehouse ? -1*flt(item.transfer_qty) : flt(item.transfer_qty)
|
||||
};
|
||||
|
||||
frappe.call({
|
||||
method: "erpnext.stock.utils.get_incoming_rate",
|
||||
args: {
|
||||
args: args
|
||||
},
|
||||
callback: function(r) {
|
||||
frappe.model.set_value(cdt, cdn, 'basic_rate', r.message);
|
||||
frm.events.calculate_basic_amount(frm, item);
|
||||
|
||||
if (callback) {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
get_warehouse_details: function(frm, cdt, cdn, callback) {
|
||||
var child = locals[cdt][cdn];
|
||||
if(!child.bom_no) {
|
||||
frappe.call({
|
||||
method: "erpnext.stock.doctype.stock_entry.stock_entry.get_warehouse_details",
|
||||
args: {
|
||||
"args": {
|
||||
'item_code': child.item_code,
|
||||
'warehouse': cstr(child.s_warehouse) || cstr(child.t_warehouse),
|
||||
'transfer_qty': child.transfer_qty,
|
||||
'serial_no': child.serial_no,
|
||||
'qty': child.s_warehouse ? -1* child.transfer_qty : child.transfer_qty,
|
||||
'posting_date': frm.doc.posting_date,
|
||||
'posting_time': frm.doc.posting_time
|
||||
}
|
||||
},
|
||||
callback: function(r) {
|
||||
if (!r.exc) {
|
||||
$.extend(child, r.message);
|
||||
frm.events.calculate_basic_amount(frm, child);
|
||||
}
|
||||
|
||||
if (callback) {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
calculate_basic_amount: function(frm, item) {
|
||||
item.basic_amount = flt(flt(item.transfer_qty) * flt(item.basic_rate),
|
||||
precision("basic_amount", item));
|
||||
|
||||
frm.events.calculate_amount(frm);
|
||||
},
|
||||
|
||||
calculate_amount: function(frm) {
|
||||
frm.events.calculate_total_additional_costs(frm);
|
||||
|
||||
const total_basic_amount = frappe.utils.sum(
|
||||
(frm.doc.items || []).map(function(i) { return i.t_warehouse ? flt(i.basic_amount) : 0; })
|
||||
);
|
||||
|
||||
for (let i in frm.doc.items) {
|
||||
let item = frm.doc.items[i];
|
||||
|
||||
if (item.t_warehouse && total_basic_amount) {
|
||||
item.additional_cost = (flt(item.basic_amount) / total_basic_amount) * frm.doc.total_additional_costs;
|
||||
} else {
|
||||
item.additional_cost = 0;
|
||||
}
|
||||
|
||||
item.amount = flt(item.basic_amount + flt(item.additional_cost),
|
||||
precision("amount", item));
|
||||
|
||||
item.valuation_rate = flt(flt(item.basic_rate)
|
||||
+ (flt(item.additional_cost) / flt(item.transfer_qty)),
|
||||
precision("valuation_rate", item));
|
||||
}
|
||||
|
||||
refresh_field('items');
|
||||
},
|
||||
|
||||
calculate_total_additional_costs: function(frm) {
|
||||
const total_additional_costs = frappe.utils.sum(
|
||||
(frm.doc.additional_costs || []).map(function(c) { return flt(c.amount); })
|
||||
);
|
||||
|
||||
frm.set_value("total_additional_costs",
|
||||
flt(total_additional_costs, precision("total_additional_costs")));
|
||||
},
|
||||
})
|
||||
|
||||
frappe.ui.form.on('Stock Entry Detail', {
|
||||
qty: function(frm, cdt, cdn) {
|
||||
frm.events.set_serial_no(frm, cdt, cdn);
|
||||
frm.events.set_basic_rate(frm, cdt, cdn, () => {
|
||||
frm.events.set_serial_no(frm, cdt, cdn);
|
||||
});
|
||||
},
|
||||
|
||||
conversion_factor: function(frm, cdt, cdn) {
|
||||
frm.events.set_basic_rate(frm, cdt, cdn);
|
||||
},
|
||||
|
||||
s_warehouse: function(frm, cdt, cdn) {
|
||||
frm.events.set_serial_no(frm, cdt, cdn);
|
||||
frm.events.get_warehouse_details(frm, cdt, cdn, () => {
|
||||
frm.events.set_serial_no(frm, cdt, cdn);
|
||||
});
|
||||
},
|
||||
|
||||
t_warehouse: function(frm, cdt, cdn) {
|
||||
frm.events.get_warehouse_details(frm, cdt, cdn);
|
||||
},
|
||||
|
||||
basic_rate: function(frm, cdt, cdn) {
|
||||
var item = locals[cdt][cdn];
|
||||
frm.events.calculate_basic_amount(frm, item);
|
||||
},
|
||||
|
||||
barcode: function(doc, cdt, cdn) {
|
||||
var d = locals[cdt][cdn];
|
||||
if (d.barcode) {
|
||||
@ -132,6 +254,7 @@ frappe.ui.form.on('Stock Entry Detail', {
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
uom: function(doc, cdt, cdn) {
|
||||
var d = locals[cdt][cdn];
|
||||
if(d.uom && d.item_code){
|
||||
@ -150,6 +273,7 @@ frappe.ui.form.on('Stock Entry Detail', {
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
item_code: function(frm, cdt, cdn) {
|
||||
var d = locals[cdt][cdn];
|
||||
if(d.item_code) {
|
||||
@ -191,7 +315,7 @@ frappe.ui.form.on('Stock Entry Detail', {
|
||||
|
||||
frappe.ui.form.on('Landed Cost Taxes and Charges', {
|
||||
amount: function(frm) {
|
||||
frm.events.calculate_amount();
|
||||
frm.events.calculate_amount(frm);
|
||||
}
|
||||
});
|
||||
|
||||
@ -330,12 +454,6 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({
|
||||
}
|
||||
},
|
||||
|
||||
qty: function(doc, cdt, cdn) {
|
||||
var d = locals[cdt][cdn];
|
||||
d.transfer_qty = flt(d.qty) * flt(d.conversion_factor);
|
||||
this.calculate_basic_amount(d);
|
||||
},
|
||||
|
||||
production_order: function() {
|
||||
var me = this;
|
||||
this.toggle_enable_bom();
|
||||
@ -434,88 +552,6 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({
|
||||
erpnext.setup_serial_no();
|
||||
},
|
||||
|
||||
basic_rate: function(doc, cdt, cdn) {
|
||||
var item = frappe.model.get_doc(cdt, cdn);
|
||||
this.calculate_basic_amount(item);
|
||||
},
|
||||
|
||||
s_warehouse: function(doc, cdt, cdn) {
|
||||
this.get_warehouse_details(doc, cdt, cdn)
|
||||
},
|
||||
|
||||
t_warehouse: function(doc, cdt, cdn) {
|
||||
this.get_warehouse_details(doc, cdt, cdn)
|
||||
},
|
||||
|
||||
get_warehouse_details: function(doc, cdt, cdn) {
|
||||
var me = this;
|
||||
var d = locals[cdt][cdn];
|
||||
if(!d.bom_no) {
|
||||
frappe.call({
|
||||
method: "erpnext.stock.doctype.stock_entry.stock_entry.get_warehouse_details",
|
||||
args: {
|
||||
"args": {
|
||||
'item_code': d.item_code,
|
||||
'warehouse': cstr(d.s_warehouse) || cstr(d.t_warehouse),
|
||||
'transfer_qty': d.transfer_qty,
|
||||
'serial_no': d.serial_no,
|
||||
'qty': d.s_warehouse ? -1* d.qty : d.qty,
|
||||
'posting_date': this.frm.doc.posting_date,
|
||||
'posting_time': this.frm.doc.posting_time
|
||||
}
|
||||
},
|
||||
callback: function(r) {
|
||||
if (!r.exc) {
|
||||
$.extend(d, r.message);
|
||||
me.calculate_basic_amount(d);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
calculate_basic_amount: function(item) {
|
||||
item.basic_amount = flt(flt(item.transfer_qty) * flt(item.basic_rate),
|
||||
precision("basic_amount", item));
|
||||
|
||||
this.calculate_amount();
|
||||
},
|
||||
|
||||
calculate_amount: function() {
|
||||
this.calculate_total_additional_costs();
|
||||
|
||||
var total_basic_amount = frappe.utils.sum(
|
||||
(this.frm.doc.items || []).map(function(i) { return i.t_warehouse ? flt(i.basic_amount) : 0; })
|
||||
);
|
||||
|
||||
for (var i in this.frm.doc.items) {
|
||||
var item = this.frm.doc.items[i];
|
||||
|
||||
if (item.t_warehouse && total_basic_amount) {
|
||||
item.additional_cost = (flt(item.basic_amount) / total_basic_amount) * this.frm.doc.total_additional_costs;
|
||||
} else {
|
||||
item.additional_cost = 0;
|
||||
}
|
||||
|
||||
item.amount = flt(item.basic_amount + flt(item.additional_cost),
|
||||
precision("amount", item));
|
||||
|
||||
item.valuation_rate = flt(flt(item.basic_rate)
|
||||
+ (flt(item.additional_cost) / flt(item.transfer_qty)),
|
||||
precision("valuation_rate", item));
|
||||
}
|
||||
|
||||
refresh_field('items');
|
||||
},
|
||||
|
||||
calculate_total_additional_costs: function() {
|
||||
var total_additional_costs = frappe.utils.sum(
|
||||
(this.frm.doc.additional_costs || []).map(function(c) { return flt(c.amount); })
|
||||
);
|
||||
|
||||
this.frm.set_value("total_additional_costs", flt(total_additional_costs, precision("total_additional_costs")));
|
||||
},
|
||||
|
||||
toggle_related_fields: function(doc) {
|
||||
this.frm.toggle_enable("from_warehouse", doc.purpose!='Material Receipt');
|
||||
this.frm.toggle_enable("to_warehouse", doc.purpose!='Material Issue');
|
||||
|
@ -517,7 +517,7 @@ class StockEntry(StockController):
|
||||
args['posting_date'] = self.posting_date
|
||||
args['posting_time'] = self.posting_time
|
||||
|
||||
stock_and_rate = args.get('warehouse') and get_warehouse_details(args) or {}
|
||||
stock_and_rate = get_warehouse_details(args) if args.get('warehouse') else {}
|
||||
ret.update(stock_and_rate)
|
||||
|
||||
# automatically select batch for outgoing item
|
||||
|
Loading…
x
Reference in New Issue
Block a user