[Enhancement] Currency added in the BOM
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js
index ce0cb50..ea1a2e3 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.js
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js
@@ -120,50 +120,21 @@
set_dynamic_labels: function(frm) {
var company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency;
- var field_label_map = {};
- var grid_field_label_map = {};
-
- var setup_field_label_map = function(fields_list, currency, parentfield) {
- var doctype = parentfield ? frm.fields_dict[parentfield].grid.doctype : frm.doc.doctype;
- $.each(fields_list, function(i, fname) {
- var docfield = frappe.meta.docfield_map[doctype][fname];
- if(docfield) {
- var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
- if(parentfield) {
- grid_field_label_map[doctype + "-" + fname] =
- label.trim() + " (" + __(currency) + ")";
- } else {
- field_label_map[fname] = label.trim() + " (" + currency + ")";
- }
- }
- });
- }
-
- setup_field_label_map(["base_paid_amount", "base_received_amount", "base_total_allocated_amount",
+ frm.set_currency_labels(["base_paid_amount", "base_received_amount", "base_total_allocated_amount",
"difference_amount"], company_currency);
- setup_field_label_map(["paid_amount"], frm.doc.paid_from_account_currency);
- setup_field_label_map(["received_amount"], frm.doc.paid_to_account_currency);
+ frm.set_currency_labels(["paid_amount"], frm.doc.paid_from_account_currency);
+ frm.set_currency_labels(["received_amount"], frm.doc.paid_to_account_currency);
var party_account_currency = frm.doc.payment_type=="Receive" ?
frm.doc.paid_from_account_currency : frm.doc.paid_to_account_currency;
- setup_field_label_map(["total_allocated_amount", "unallocated_amount"], party_account_currency);
+ frm.set_currency_labels(["total_allocated_amount", "unallocated_amount"], party_account_currency);
- $.each(field_label_map, function(fname, label) {
- me.frm.fields_dict[fname].set_label(label);
- });
-
- setup_field_label_map(["total_amount", "outstanding_amount", "allocated_amount"],
+ frm.set_currency_labels(["total_amount", "outstanding_amount", "allocated_amount"],
party_account_currency, "references");
- setup_field_label_map(["amount"], company_currency, "deductions");
-
- $.each(grid_field_label_map, function(fname, label) {
- fname = fname.split("-");
- var df = frappe.meta.get_docfield(fname[0], fname[1], me.frm.doc.name);
- if(df) df.label = label;
- });
+ frm.set_currency_labels(["amount"], company_currency, "deductions");
cur_frm.set_df_property("source_exchange_rate", "description",
("1 " + frm.doc.paid_from_account_currency + " = [?] " + company_currency));
diff --git a/erpnext/docs/assets/img/manufacturing/price-list-based-currency-bom.png b/erpnext/docs/assets/img/manufacturing/price-list-based-currency-bom.png
new file mode 100644
index 0000000..c8eca6a
--- /dev/null
+++ b/erpnext/docs/assets/img/manufacturing/price-list-based-currency-bom.png
Binary files differ
diff --git a/erpnext/docs/user/manual/en/manufacturing/bill-of-materials.md b/erpnext/docs/user/manual/en/manufacturing/bill-of-materials.md
index 34d8530..91bf7ed 100644
--- a/erpnext/docs/user/manual/en/manufacturing/bill-of-materials.md
+++ b/erpnext/docs/user/manual/en/manufacturing/bill-of-materials.md
@@ -31,6 +31,11 @@
<img class="screenshot" alt="Update Cost" src="{{docs_base_url}}/assets/img/manufacturing/bom-update-cost.png">
+* User can select the currency in the BOM
+* System calculates the costing based on the price list currency
+
+<img class="screenshot" alt="Update Cost" src="{{docs_base_url}}/assets/img/manufacturing/price-list-based-currency-bom.png">
+
### Materials Required(exploded)
This table lists down all the Material required for the Item to be Manufactured.
diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js
index ce4c4cb..5181cf4 100644
--- a/erpnext/manufacturing/doctype/bom/bom.js
+++ b/erpnext/manufacturing/doctype/bom/bom.js
@@ -4,9 +4,19 @@
frappe.provide("erpnext.bom");
frappe.ui.form.on("BOM", {
+ setup: function(frm) {
+ frm.add_fetch('buying_price_list', 'currency', 'currency')
+ frm.fields_dict["items"].grid.get_field("bom_no").get_query = function(doc, cdt, cdn){
+ return {
+ filters: {'currency': frm.doc.currency}
+ }
+ }
+ },
+
onload_post_render: function(frm) {
frm.get_field("items").grid.set_multiple_add("item_code", "qty");
},
+
refresh: function(frm) {
frm.toggle_enable("item", frm.doc.__islocal);
toggle_operations(frm);
@@ -31,6 +41,7 @@
});
}
},
+
update_cost: function(frm) {
return frappe.call({
doc: frm.doc,
@@ -43,6 +54,28 @@
}
});
+erpnext.bom.BomController = erpnext.TransactionController.extend({
+ conversion_rate: function(doc, cdt, cdn) {
+ if(this.frm.doc.currency === this.get_company_currency()) {
+ this.frm.set_value("conversion_rate", 1.0);
+ } else {
+ erpnext.bom.update_cost(doc);
+ }
+ },
+
+ item_code: function(doc, cdt, cdn){
+ var scrap_items = false;
+ child = locals[cdt][cdn];
+ if(child.doctype == 'BOM Scrap Item') {
+ scrap_items = true;
+ }
+
+ get_bom_material_detail(doc, cdt, cdn, scrap_items);
+ },
+})
+
+$.extend(cur_frm.cscript, new erpnext.bom.BomController({frm: cur_frm}));
+
cur_frm.add_fetch("item", "description", "description");
cur_frm.add_fetch("item", "image", "image");
cur_frm.add_fetch("item", "item_name", "item_name");
@@ -56,19 +89,15 @@
cur_frm.cscript.time_in_mins = cur_frm.cscript.hour_rate;
-cur_frm.cscript.item_code = function(doc, cdt, cdn) {
- get_bom_material_detail(doc, cdt, cdn);
-}
-
cur_frm.cscript.bom_no = function(doc, cdt, cdn) {
- get_bom_material_detail(doc, cdt, cdn);
+ get_bom_material_detail(doc, cdt, cdn, false);
}
cur_frm.cscript.is_default = function(doc) {
if (doc.is_default) cur_frm.set_value("is_active", 1);
}
-var get_bom_material_detail= function(doc, cdt, cdn) {
+var get_bom_material_detail= function(doc, cdt, cdn, scrap_items) {
var d = locals[cdt][cdn];
if (d.item_code) {
return frappe.call({
@@ -77,6 +106,7 @@
args: {
'item_code': d.item_code,
'bom_no': d.bom_no != null ? d.bom_no: '',
+ "scrap_items": scrap_items,
'qty': d.qty
},
callback: function(r) {
@@ -96,60 +126,99 @@
cur_frm.cscript.qty = function(doc, cdt, cdn) {
erpnext.bom.calculate_rm_cost(doc);
+ erpnext.bom.calculate_scrap_materials_cost(doc);
erpnext.bom.calculate_total(doc);
}
cur_frm.cscript.rate = function(doc, cdt, cdn) {
var d = locals[cdt][cdn];
+ var scrap_items = false;
+
+ if(child.doctype == 'BOM Scrap Item') {
+ scrap_items = true;
+ }
+
if (d.bom_no) {
msgprint(__("You can not change rate if BOM mentioned agianst any item"));
- get_bom_material_detail(doc, cdt, cdn);
+ get_bom_material_detail(doc, cdt, cdn, scrap_items);
} else {
erpnext.bom.calculate_rm_cost(doc);
+ erpnext.bom.calculate_scrap_materials_cost(doc);
erpnext.bom.calculate_total(doc);
}
}
+erpnext.bom.update_cost = function(doc) {
+ erpnext.bom.calculate_op_cost(doc);
+ erpnext.bom.calculate_rm_cost(doc);
+ erpnext.bom.calculate_scrap_materials_cost(doc);
+ erpnext.bom.calculate_total(doc);
+}
+
erpnext.bom.calculate_op_cost = function(doc) {
var op = doc.operations || [];
doc.operating_cost = 0.0;
+ doc.base_operating_cost = 0.0;
+
for(var i=0;i<op.length;i++) {
operating_cost = flt(flt(op[i].hour_rate) * flt(op[i].time_in_mins) / 60, 2);
+ base_operating_cost = flt(flt(op[i].base_hour_rate) * flt(op[i].time_in_mins) / 60, 2);
frappe.model.set_value('BOM Operation',op[i].name, "operating_cost", operating_cost);
+ frappe.model.set_value('BOM Operation',op[i].name, "base_operating_cost", base_operating_cost);
doc.operating_cost += operating_cost;
+ doc.base_operating_cost += base_operating_cost;
}
- refresh_field('operating_cost');
+ refresh_field(['operating_cost', 'base_operating_cost']);
}
// rm : raw material
erpnext.bom.calculate_rm_cost = function(doc) {
var rm = doc.items || [];
total_rm_cost = 0;
+ base_total_rm_cost = 0;
for(var i=0;i<rm.length;i++) {
- amt = flt(rm[i].rate) * flt(rm[i].qty);
- set_multiple('BOM Item',rm[i].name, {'amount': amt}, 'items');
- set_multiple('BOM Item',rm[i].name,
- {'qty_consumed_per_unit': flt(rm[i].qty)/flt(doc.quantity)}, 'items');
- total_rm_cost += amt;
+ amount = flt(rm[i].rate) * flt(rm[i].qty);
+ base_amount = flt(rm[i].rate) * flt(doc.conversion_rate) * flt(rm[i].qty);
+ frappe.model.set_value('BOM Item', rm[i].name, 'base_rate', flt(rm[i].rate) * flt(doc.conversion_rate))
+ frappe.model.set_value('BOM Item', rm[i].name, 'amount', amount)
+ frappe.model.set_value('BOM Item', rm[i].name, 'qty_consumed_per_unit', flt(rm[i].qty)/flt(doc.quantity))
+ frappe.model.set_value('BOM Item', rm[i].name, 'base_amount', base_amount)
+ total_rm_cost += amount;
+ base_total_rm_cost += base_amount;
}
cur_frm.set_value("raw_material_cost", total_rm_cost);
+ cur_frm.set_value("base_raw_material_cost", base_total_rm_cost);
}
//sm : scrap material
erpnext.bom.calculate_scrap_materials_cost = function(doc) {
var sm = doc.scrap_items || [];
total_sm_cost = 0;
+ base_total_sm_cost = 0;
+
for(var i=0;i<sm.length;i++) {
- amt = flt(sm[i].rate) * flt(sm[i].qty);
- set_multiple('BOM Scrap Item',sm[i].name, {'amount': amt}, 'scrap_items');
+ base_rate = flt(sm[i].rate) * flt(doc.conversion_rate);
+ amount = flt(sm[i].rate) * flt(sm[i].qty);
+ base_amount = flt(sm[i].rate) * flt(sm[i].qty) * flt(doc.conversion_rate);
+ frappe.model.set_value('BOM Scrap Item',sm[i].name, 'base_rate', base_rate);
+ frappe.model.set_value('BOM Scrap Item',sm[i].name, 'amount', amount);
+ frappe.model.set_value('BOM Scrap Item',sm[i].name, 'base_amount', base_amount);
+
+ total_sm_cost += amount;
+ base_total_sm_cost += base_amount;
}
+
+ cur_frm.set_value("scrap_material_cost", total_sm_cost);
+ cur_frm.set_value("base_scrap_material_cost", base_total_sm_cost);
}
// Calculate Total Cost
erpnext.bom.calculate_total = function(doc) {
- total_cost = flt(doc.operating_cost) + flt(doc.raw_material_cost);
- frappe.model.set_value(doc.doctype, doc.name, "total_cost", total_cost);
+ total_cost = flt(doc.operating_cost) + flt(doc.raw_material_cost) - flt(doc.scrap_material_cost);
+ base_total_cost = flt(doc.base_operating_cost) + flt(doc.base_raw_material_cost) - flt(doc.base_scrap_material_cost);
+ cur_frm.set_value("total_cost", total_cost);
+ cur_frm.set_value("base_total_cost", base_total_cost);
}
@@ -186,10 +255,7 @@
}
cur_frm.cscript.validate = function(doc, dt, dn) {
- erpnext.bom.calculate_op_cost(doc);
- erpnext.bom.calculate_rm_cost(doc);
- erpnext.bom.calculate_scrap_materials_cost(doc);
- erpnext.bom.calculate_total(doc);
+ erpnext.bom.update_cost(doc)
}
frappe.ui.form.on("BOM Operation", "operation", function(frm, cdt, cdn) {
@@ -225,6 +291,7 @@
},
callback: function (data) {
frappe.model.set_value(d.doctype, d.name, "hour_rate", data.message.hour_rate);
+ frappe.model.set_value(d.doctype, d.name, "base_hour_rate", flt(data.message.hour_rate) * flt(frm.doc.conversion_rate));
erpnext.bom.calculate_op_cost(frm.doc);
erpnext.bom.calculate_total(frm.doc);
}
@@ -252,7 +319,6 @@
toggle_operations(frm);
});
-
cur_frm.cscript.image = function() {
refresh_field("image_view");
}
diff --git a/erpnext/manufacturing/doctype/bom/bom.json b/erpnext/manufacturing/doctype/bom/bom.json
index ea43090..193f920 100644
--- a/erpnext/manufacturing/doctype/bom/bom.json
+++ b/erpnext/manufacturing/doctype/bom/bom.json
@@ -276,6 +276,118 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "currency_detail",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "currency",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Currency",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "column_break_12",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "conversion_rate",
+ "fieldtype": "Float",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Conversion Rate",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "9",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"depends_on": "",
"description": "Specify the operations, operating cost and give a unique Operation no to your operations.",
"fieldname": "operations_section",
@@ -490,7 +602,7 @@
"label": "Operating Cost",
"length": 0,
"no_copy": 0,
- "options": "Company:company:default_currency",
+ "options": "currency",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
@@ -518,7 +630,7 @@
"label": "Raw Material Cost",
"length": 0,
"no_copy": 0,
- "options": "Company:company:default_currency",
+ "options": "currency",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
@@ -535,6 +647,35 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "scrap_material_cost",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Scrap Material Cost",
+ "length": 0,
+ "no_copy": 0,
+ "options": "currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "cb1",
"fieldtype": "Column Break",
"hidden": 0,
@@ -561,6 +702,120 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "base_operating_cost",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Operating Cost (Company Currency)",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "base_raw_material_cost",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Raw Material Cost(Company Currency)",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "base_scrap_material_cost",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Scrap Material Cost(Company Currency)",
+ "length": 0,
+ "no_copy": 1,
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "total_cost_of_bom",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "total_cost",
"fieldtype": "Currency",
"hidden": 0,
@@ -572,7 +827,7 @@
"label": "Total Cost",
"length": 0,
"no_copy": 0,
- "options": "Company:company:default_currency",
+ "options": "currency",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
@@ -589,6 +844,62 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "column_break_26",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "base_total_cost",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Total Cost(Company Currency)",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "more_info_section",
"fieldtype": "Section Break",
"hidden": 0,
@@ -960,8 +1271,8 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2016-11-07 05:13:12.904755",
- "modified_by": "Administrator",
+ "modified": "2016-11-21 17:06:49.349654",
+ "modified_by": "rohit@erpnext.com",
"module": "Manufacturing",
"name": "BOM",
"owner": "Administrator",
@@ -969,6 +1280,27 @@
{
"amend": 0,
"apply_user_permissions": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 0,
+ "is_custom": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "All",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 1
+ },
+ {
+ "amend": 0,
+ "apply_user_permissions": 0,
"cancel": 1,
"create": 1,
"delete": 1,
@@ -1016,4 +1348,4 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_seen": 0
-}
+}
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index c6a3f1f..2a27922 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -5,6 +5,7 @@
import frappe
from frappe.utils import cint, cstr, flt
from frappe import _
+from erpnext.setup.utils import get_exchange_rate
from frappe.model.document import Document
from operator import itemgetter
@@ -35,6 +36,8 @@
def validate(self):
self.clear_operations()
self.validate_main_item()
+ self.validate_currency()
+ self.set_conversion_rate()
from erpnext.utilities.transaction_base import validate_uom_is_integer
validate_uom_is_integer(self, "stock_uom", "qty", "BOM Item")
@@ -84,6 +87,8 @@
for r in ret:
if not item.get(r):
item.set(r, ret[r])
+
+ self.validate_bom_currecny(item)
def get_bom_material_detail(self, args=None):
""" Get raw material details like uom, desc and rate"""
@@ -102,19 +107,27 @@
rate = self.get_rm_rate(args)
ret_item = {
- 'item_name' : item and args['item_name'] or '',
- 'description' : item and args['description'] or '',
- 'image' : item and args['image'] or '',
- 'stock_uom' : item and args['stock_uom'] or '',
- 'bom_no' : args['bom_no'],
- 'rate' : rate
+ 'item_name' : item and args['item_name'] or '',
+ 'description' : item and args['description'] or '',
+ 'image' : item and args['image'] or '',
+ 'stock_uom' : item and args['stock_uom'] or '',
+ 'bom_no' : args['bom_no'],
+ 'rate' : rate,
+ 'base_rate' : rate if self.company_currency() == self.currency else rate * self.conversion_rate
}
return ret_item
+ def validate_bom_currecny(self, item):
+ if item.get('bom_no') and frappe.db.get_value('BOM', item.get('bom_no'), 'currency') != self.currency:
+ frappe.throw(_("Row {0}: Currency of the BOM #{1} should be equal to the selected currency {2}").format(item.idx, item.bom_no, self.currency))
+
def get_rm_rate(self, arg):
""" Get raw material rate as per selected method, if bom exists takes bom cost """
rate = 0
- if arg['bom_no']:
+
+ if arg.get('scrap_items'):
+ rate = self.get_valuation_rate(arg)
+ elif arg['bom_no']:
rate = self.get_bom_unitcost(arg['bom_no'])
elif arg:
if self.rm_cost_as_per == 'Valuation Rate':
@@ -209,6 +222,14 @@
if not self.quantity:
frappe.throw(_("Quantity should be greater than 0"))
+
+ def validate_currency(self):
+ if self.rm_cost_as_per == 'Price List' and \
+ frappe.db.get_value('Price List', self.buying_price_list, 'currency') != self.currency:
+ frappe.throw(_("Currency of the price list {0} is not similar with the selected currency {1}").format(self.buying_price_list, self.currency))
+
+ def set_conversion_rate(self):
+ self.conversion_rate = get_exchange_rate(self.currency, self.company_currency())
def validate_materials(self):
""" Validate raw material entries """
@@ -270,11 +291,14 @@
"""Calculate bom totals"""
self.calculate_op_cost()
self.calculate_rm_cost()
- self.total_cost = self.operating_cost + self.raw_material_cost
+ self.calculate_sm_cost()
+ self.total_cost = self.operating_cost + self.raw_material_cost - self.scrap_material_cost
+ self.base_total_cost = self.base_operating_cost + self.base_raw_material_cost - self.base_scrap_material_cost
def calculate_op_cost(self):
"""Update workstation rate and calculates totals"""
self.operating_cost = 0
+ self.base_operating_cost = 0
for d in self.get('operations'):
if d.workstation:
if not d.hour_rate:
@@ -282,20 +306,45 @@
if d.hour_rate and d.time_in_mins:
d.operating_cost = flt(d.hour_rate) * flt(d.time_in_mins) / 60.0
+ d.base_hour_rate = flt(d.hour_rate) * flt(self.conversion_rate)
+ d.base_operating_cost = flt(d.base_hour_rate) * flt(d.time_in_mins) / 60.0
self.operating_cost += flt(d.operating_cost)
+ self.base_operating_cost += flt(d.base_operating_cost)
def calculate_rm_cost(self):
"""Fetch RM rate as per today's valuation rate and calculate totals"""
total_rm_cost = 0
+ base_total_rm_cost = 0
+
for d in self.get('items'):
if d.bom_no:
d.rate = self.get_bom_unitcost(d.bom_no)
+
+ d.base_rate = d.rate * self.conversion_rate
d.amount = flt(d.rate, self.precision("rate", d)) * flt(d.qty, self.precision("qty", d))
+ d.base_amount = d.amount * self.conversion_rate
d.qty_consumed_per_unit = flt(d.qty, self.precision("qty", d)) / flt(self.quantity, self.precision("quantity"))
total_rm_cost += d.amount
+ base_total_rm_cost += d.base_amount
self.raw_material_cost = total_rm_cost
+ self.base_raw_material_cost = base_total_rm_cost
+
+ def calculate_sm_cost(self):
+ """Fetch RM rate as per today's valuation rate and calculate totals"""
+ total_sm_cost = 0
+ base_total_sm_cost = 0
+
+ for d in self.get('scrap_items'):
+ d.base_rate = d.rate * self.conversion_rate
+ d.amount = flt(d.rate, self.precision("rate", d)) * flt(d.qty, self.precision("qty", d))
+ d.base_amount = d.amount * self.conversion_rate
+ total_sm_cost += d.amount
+ base_total_sm_cost += d.base_amount
+
+ self.scrap_material_cost = total_sm_cost
+ self.base_scrap_material_cost = base_total_sm_cost
def update_exploded_items(self):
""" Update Flat BOM, following will be correct data"""
@@ -316,8 +365,11 @@
'image' : d.image,
'stock_uom' : d.stock_uom,
'qty' : flt(d.qty),
- 'rate' : flt(d.rate),
+ 'rate' : d.base_rate,
}))
+
+ def company_currency(self):
+ return frappe.db.get_value('Company', self.company, 'default_currency')
def add_to_cur_exploded_items(self, args):
if self.cur_exploded_items.get(args.item_code):
diff --git a/erpnext/manufacturing/doctype/bom/test_records.json b/erpnext/manufacturing/doctype/bom/test_records.json
index da8d67b..5baa0cb 100644
--- a/erpnext/manufacturing/doctype/bom/test_records.json
+++ b/erpnext/manufacturing/doctype/bom/test_records.json
@@ -22,6 +22,7 @@
],
"docstatus": 1,
"doctype": "BOM",
+ "currency": "USD",
"is_active": 1,
"is_default": 1,
"item": "_Test Item Home Desktop Manufactured",
@@ -63,6 +64,7 @@
"doctype": "BOM",
"is_active": 1,
"is_default": 1,
+ "currency": "USD",
"item": "_Test FG Item",
"quantity": 1.0
},
@@ -101,6 +103,7 @@
"doctype": "BOM",
"is_active": 1,
"is_default": 1,
+ "currency": "USD",
"item": "_Test FG Item 2",
"quantity": 1.0,
"with_operations": 1
@@ -130,6 +133,7 @@
"doctype": "BOM",
"is_active": 1,
"is_default": 1,
+ "currency": "USD",
"item": "_Test Variant Item",
"quantity": 1.0,
"with_operations": 1
diff --git a/erpnext/manufacturing/doctype/bom_item/bom_item.json b/erpnext/manufacturing/doctype/bom_item/bom_item.json
index d485abc..bb55c73 100644
--- a/erpnext/manufacturing/doctype/bom_item/bom_item.json
+++ b/erpnext/manufacturing/doctype/bom_item/bom_item.json
@@ -7,6 +7,7 @@
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
+ "document_type": "Setup",
"editable_grid": 1,
"fields": [
{
@@ -317,7 +318,7 @@
"label": "Rate",
"length": 0,
"no_copy": 0,
- "options": "Company:company:default_currency",
+ "options": "currency",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
@@ -333,6 +334,36 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "amount",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Amount",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "amount_as_per_mar",
+ "oldfieldtype": "Currency",
+ "options": "currency",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "print_width": "150px",
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0,
+ "width": "150px"
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "col_break2",
"fieldtype": "Column Break",
"hidden": 0,
@@ -385,30 +416,79 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "amount",
+ "fieldname": "base_rate",
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
- "in_list_view": 1,
- "label": "Amount",
+ "in_list_view": 0,
+ "label": "Basic Rate (Company Currency)",
"length": 0,
"no_copy": 0,
- "oldfieldname": "amount_as_per_mar",
- "oldfieldtype": "Currency",
"options": "Company:company:default_currency",
"permlevel": 0,
- "print_hide": 0,
+ "precision": "",
+ "print_hide": 1,
"print_hide_if_no_value": 0,
- "print_width": "150px",
"read_only": 1,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "unique": 0,
- "width": "150px"
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "base_amount",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Amount (Company Currency)",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "section_break_18",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
},
{
"allow_on_submit": 0,
@@ -475,7 +555,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2016-08-26 02:42:40.468812",
+ "modified": "2016-10-21 15:57:22.521537",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM Item",
diff --git a/erpnext/manufacturing/doctype/bom_operation/bom_operation.json b/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
index 8b6406e..50f1c6c 100644
--- a/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
+++ b/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
@@ -9,11 +9,13 @@
"doctype": "DocType",
"document_type": "Setup",
"editable_grid": 1,
+ "engine": "InnoDB",
"fields": [
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "columns": 0,
"fieldname": "operation",
"fieldtype": "Link",
"hidden": 0,
@@ -41,6 +43,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "columns": 0,
"fieldname": "workstation",
"fieldtype": "Link",
"hidden": 0,
@@ -68,6 +71,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "columns": 0,
"fieldname": "description",
"fieldtype": "Text Editor",
"hidden": 0,
@@ -94,6 +98,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "columns": 0,
"fieldname": "col_break1",
"fieldtype": "Column Break",
"hidden": 0,
@@ -117,8 +122,9 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "columns": 0,
"fieldname": "hour_rate",
- "fieldtype": "Float",
+ "fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
@@ -129,6 +135,7 @@
"no_copy": 0,
"oldfieldname": "hour_rate",
"oldfieldtype": "Currency",
+ "options": "currency",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
@@ -143,6 +150,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "columns": 0,
"description": "In minutes",
"fieldname": "time_in_mins",
"fieldtype": "Float",
@@ -171,6 +179,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "columns": 0,
"fieldname": "operating_cost",
"fieldtype": "Currency",
"hidden": 0,
@@ -183,6 +192,7 @@
"no_copy": 0,
"oldfieldname": "operating_cost",
"oldfieldtype": "Currency",
+ "options": "currency",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
@@ -192,6 +202,61 @@
"search_index": 0,
"set_only_once": 0,
"unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "base_hour_rate",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Base Hour Rate(Company Currency)",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "default": "5",
+ "fieldname": "base_operating_cost",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Operating Cost(Company Currency)",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
}
],
"hide_heading": 0,
@@ -204,7 +269,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2016-07-11 03:27:58.625909",
+ "modified": "2016-10-21 18:38:14.700637",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM Operation",
diff --git a/erpnext/manufacturing/doctype/bom_scrap_item/bom_scrap_item.json b/erpnext/manufacturing/doctype/bom_scrap_item/bom_scrap_item.json
index ea5e6c1..fe81592 100644
--- a/erpnext/manufacturing/doctype/bom_scrap_item/bom_scrap_item.json
+++ b/erpnext/manufacturing/doctype/bom_scrap_item/bom_scrap_item.json
@@ -130,7 +130,7 @@
"label": "Rate",
"length": 0,
"no_copy": 0,
- "options": "Company:company:default_currency",
+ "options": "currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -147,6 +147,33 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "amount",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Amount",
+ "length": 0,
+ "no_copy": 0,
+ "options": "currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "column_break_6",
"fieldtype": "Column Break",
"hidden": 0,
@@ -199,20 +226,47 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "amount",
+ "fieldname": "base_rate",
"fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Amount",
+ "label": "Basic Rate (Company Currency)",
"length": 0,
"no_copy": 0,
"options": "Company:company:default_currency",
"permlevel": 0,
"precision": "",
- "print_hide": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "base_amount",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Basic Amount (Company Currency)",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 1,
"report_hide": 0,
@@ -232,7 +286,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2016-09-26 02:58:58.433348",
+ "modified": "2016-10-25 00:27:53.712140",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM Scrap Item",
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py
index fc3c92c..aa69342 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/production_order.py
@@ -217,7 +217,7 @@
return
self.set('operations', [])
operations = frappe.db.sql("""select operation, description, workstation, idx,
- hour_rate, time_in_mins, "Pending" as status from `tabBOM Operation`
+ base_hour_rate as hour_rate, time_in_mins, "Pending" as status from `tabBOM Operation`
where parent = %s order by idx""", self.bom_no, as_dict=1)
self.set('operations', operations)
self.calculate_time()
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 2c6f912..952eed7 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -352,3 +352,5 @@
erpnext.patches.v7_1.update_missing_salary_component_type
erpnext.patches.v7_1.rename_quality_inspection_field
erpnext.patches.v7_0.update_autoname_field
+erpnext.patches.v7_1.repost_gle_for_pi_with_update_stock
+erpnext.patches.v7_1.update_bom_base_currency
\ No newline at end of file
diff --git a/erpnext/patches/v7_1/update_bom_base_currency.py b/erpnext/patches/v7_1/update_bom_base_currency.py
new file mode 100644
index 0000000..c8af033
--- /dev/null
+++ b/erpnext/patches/v7_1/update_bom_base_currency.py
@@ -0,0 +1,19 @@
+import frappe
+from erpnext import get_default_currency
+
+def execute():
+ frappe.reload_doc("manufacturing", "doctype", "bom")
+ frappe.reload_doc("manufacturing", "doctype", "bom_item")
+ frappe.reload_doc("manufacturing", "doctype", "bom_explosion_item")
+ frappe.reload_doc("manufacturing", "doctype", "bom_operation")
+ frappe.reload_doc("manufacturing", "doctype", "bom_scrap_item")
+
+ frappe.db.sql(""" update `tabBOM Operation` set base_hour_rate = hour_rate,
+ base_operating_cost = operating_cost """)
+
+ frappe.db.sql(""" update `tabBOM Item` set base_rate = rate, base_amount = amount """)
+ frappe.db.sql(""" update `tabBOM Scrap Item` set base_rate = rate, base_amount = amount """)
+
+ frappe.db.sql(""" update `tabBOM` set `tabBOM`.base_operating_cost = `tabBOM`.operating_cost,
+ `tabBOM`.base_raw_material_cost = `tabBOM`.raw_material_cost,
+ `tabBOM`.currency = (select default_currency from `tabCompany` where name = `tabBOM`.company)""")
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index b529f0f..6c03706 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -550,28 +550,20 @@
change_form_labels: function(company_currency) {
var me = this;
- var field_label_map = {};
- var setup_field_label_map = function(fields_list, currency) {
- $.each(fields_list, function(i, fname) {
- var docfield = frappe.meta.docfield_map[me.frm.doc.doctype][fname];
- if(docfield) {
- var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
- field_label_map[fname] = label.trim() + " (" + currency + ")";
- }
- });
- };
- setup_field_label_map(["base_total", "base_net_total", "base_total_taxes_and_charges",
+ this.frm.set_currency_labels(["base_total", "base_net_total", "base_total_taxes_and_charges",
"base_discount_amount", "base_grand_total", "base_rounded_total", "base_in_words",
"base_taxes_and_charges_added", "base_taxes_and_charges_deducted", "total_amount_to_pay",
- "base_paid_amount", "base_write_off_amount", "base_change_amount"
+ "base_paid_amount", "base_write_off_amount", "base_change_amount", "base_operating_cost",
+ "base_raw_material_cost", "base_total_cost", "base_scrap_material_cost"
], company_currency);
- setup_field_label_map(["total", "net_total", "total_taxes_and_charges", "discount_amount",
+ this.frm.set_currency_labels(["total", "net_total", "total_taxes_and_charges", "discount_amount",
"grand_total", "taxes_and_charges_added", "taxes_and_charges_deducted",
- "rounded_total", "in_words", "paid_amount", "write_off_amount"], this.frm.doc.currency);
+ "rounded_total", "in_words", "paid_amount", "write_off_amount", "operating_cost", "scrap_material_cost",
+ "raw_material_cost", "total_cost"], this.frm.doc.currency);
- setup_field_label_map(["outstanding_amount", "total_advance"], this.frm.doc.party_account_currency);
+ this.frm.set_currency_labels(["outstanding_amount", "total_advance"], this.frm.doc.party_account_currency);
cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency
+ " = [?] " + company_currency)
@@ -585,17 +577,13 @@
this.frm.toggle_display(["conversion_rate", "base_total", "base_net_total", "base_total_taxes_and_charges",
"base_taxes_and_charges_added", "base_taxes_and_charges_deducted",
"base_grand_total", "base_rounded_total", "base_in_words", "base_discount_amount",
- "base_paid_amount", "base_write_off_amount"],
+ "base_paid_amount", "base_write_off_amount", "base_operating_cost",
+ "base_raw_material_cost", "base_total_cost", "base_scrap_material_cost"],
this.frm.doc.currency != company_currency);
this.frm.toggle_display(["plc_conversion_rate", "price_list_currency"],
this.frm.doc.price_list_currency != company_currency);
- // set labels
- $.each(field_label_map, function(fname, label) {
- me.frm.fields_dict[fname].set_label(label);
- });
-
var show =cint(cur_frm.doc.discount_amount) ||
((cur_frm.doc.taxes || []).filter(function(d) {return d.included_in_print_rate===1}).length);
@@ -609,34 +597,43 @@
change_grid_labels: function(company_currency) {
var me = this;
- var field_label_map = {};
- var setup_field_label_map = function(fields_list, currency, parentfield) {
- var grid_doctype = me.frm.fields_dict[parentfield].grid.doctype;
- $.each(fields_list, function(i, fname) {
- var docfield = frappe.meta.docfield_map[grid_doctype][fname];
- if(docfield) {
- var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
- field_label_map[grid_doctype + "-" + fname] =
- label.trim() + " (" + __(currency) + ")";
- }
+ this.frm.set_currency_labels(["base_rate", "base_net_rate", "base_price_list_rate", "base_amount", "base_net_amount"],
+ company_currency, "items");
+
+ this.frm.set_currency_labels(["rate", "net_rate", "price_list_rate", "amount", "net_amount"],
+ this.frm.doc.currency, "items");
+
+ if(this.frm.fields_dict["operations"]) {
+ this.frm.set_currency_labels(["operating_cost", "hour_rate"], this.frm.doc.currency, "operations");
+ this.frm.set_currency_labels(["base_operating_cost", "base_hour_rate"], company_currency, "operations");
+
+ var item_grid = this.frm.fields_dict["operations"].grid;
+ $.each(["base_operating_cost", "base_hour_rate"], function(i, fname) {
+ if(frappe.meta.get_docfield(item_grid.doctype, fname))
+ item_grid.set_column_disp(fname, me.frm.doc.currency != company_currency);
});
}
- setup_field_label_map(["base_rate", "base_net_rate", "base_price_list_rate", "base_amount", "base_net_amount"],
- company_currency, "items");
+ if(this.frm.fields_dict["scrap_items"]) {
+ this.frm.set_currency_labels(["rate", "amount"], this.frm.doc.currency, "scrap_items");
+ this.frm.set_currency_labels(["base_rate", "base_amount"], company_currency, "scrap_items");
- setup_field_label_map(["rate", "net_rate", "price_list_rate", "amount", "net_amount"],
- this.frm.doc.currency, "items");
+ var item_grid = this.frm.fields_dict["scrap_items"].grid;
+ $.each(["base_rate", "base_amount"], function(i, fname) {
+ if(frappe.meta.get_docfield(item_grid.doctype, fname))
+ item_grid.set_column_disp(fname, me.frm.doc.currency != company_currency);
+ });
+ }
if(this.frm.fields_dict["taxes"]) {
- setup_field_label_map(["tax_amount", "total", "tax_amount_after_discount"], this.frm.doc.currency, "taxes");
+ this.frm.set_currency_labels(["tax_amount", "total", "tax_amount_after_discount"], this.frm.doc.currency, "taxes");
- setup_field_label_map(["base_tax_amount", "base_total", "base_tax_amount_after_discount"], company_currency, "taxes");
+ this.frm.set_currency_labels(["base_tax_amount", "base_total", "base_tax_amount_after_discount"], company_currency, "taxes");
}
if(this.frm.fields_dict["advances"]) {
- setup_field_label_map(["advance_amount", "allocated_amount"],
+ this.frm.set_currency_labels(["advance_amount", "allocated_amount"],
this.frm.doc.party_account_currency, "advances");
}
@@ -662,11 +659,6 @@
// set labels
var $wrapper = $(this.frm.wrapper);
- $.each(field_label_map, function(fname, label) {
- fname = fname.split("-");
- var df = frappe.meta.get_docfield(fname[0], fname[1], me.frm.doc.name);
- if(df) df.label = label;
- });
},
recalculate: function() {