feat: multi-currency in Opportunity (#26590)
* feat: multi-currency * refactor: lead form * fix: test case for opportunity item * fix: removing local changes * fix: test cases * fix: test cases * fix: review changes * fix: reverting lead.json chnages * fix: toggle display for currency fields * review changes * fix: test case * fix: linter issues * fix: unused import * feat: grand total in opportunity * fix: patch * fix: sort imports * fix: reload opportunity item doctype Co-authored-by: Rucha Mahabal <ruchamahabal2@gmail.com>
This commit is contained in:
		
							parent
							
								
									14b01619de
								
							
						
					
					
						commit
						b0d970001a
					
				| @ -132,10 +132,43 @@ frappe.ui.form.on("Opportunity", { | ||||
| 		} | ||||
| 	}, | ||||
| 
 | ||||
| 	currency: function(frm) { | ||||
| 		let company_currency = erpnext.get_currency(frm.doc.company); | ||||
| 		if (company_currency != frm.doc.company) { | ||||
| 			frappe.call({ | ||||
| 				method: "erpnext.setup.utils.get_exchange_rate", | ||||
| 				args: { | ||||
| 					from_currency: frm.doc.currency, | ||||
| 					to_currency: company_currency | ||||
| 				}, | ||||
| 				callback: function(r) { | ||||
| 					if (r.message) { | ||||
| 						frm.set_value('conversion_rate', flt(r.message)); | ||||
| 						frm.set_df_property('conversion_rate', 'description', '1 ' + frm.doc.currency | ||||
| 						+ ' = [?] ' + company_currency); | ||||
| 					} | ||||
| 				} | ||||
| 			}); | ||||
| 		} else { | ||||
| 			frm.set_value('conversion_rate', 1.0); | ||||
| 			frm.set_df_property('conversion_rate', 'hidden', 1); | ||||
| 			frm.set_df_property('conversion_rate', 'description', ''); | ||||
| 		} | ||||
| 
 | ||||
| 		frm.trigger('opportunity_amount'); | ||||
| 		frm.trigger('set_dynamic_field_label'); | ||||
| 	}, | ||||
| 
 | ||||
| 	opportunity_amount: function(frm) { | ||||
| 		frm.set_value('base_opportunity_amount', flt(frm.doc.opportunity_amount) * flt(frm.doc.conversion_rate)); | ||||
| 	}, | ||||
| 
 | ||||
| 	set_dynamic_field_label: function(frm){ | ||||
| 		if (frm.doc.opportunity_from) { | ||||
| 			frm.set_df_property("party_name", "label", frm.doc.opportunity_from); | ||||
| 		} | ||||
| 		frm.trigger('change_grid_labels'); | ||||
| 		frm.trigger('change_form_labels'); | ||||
| 	}, | ||||
| 
 | ||||
| 	make_supplier_quotation: function(frm) { | ||||
| @ -152,6 +185,62 @@ frappe.ui.form.on("Opportunity", { | ||||
| 		}) | ||||
| 	}, | ||||
| 
 | ||||
| 	change_form_labels: function(frm) { | ||||
| 		let company_currency = erpnext.get_currency(frm.doc.company); | ||||
| 		frm.set_currency_labels(["base_opportunity_amount", "base_total", "base_grand_total"], company_currency); | ||||
| 		frm.set_currency_labels(["opportunity_amount", "total", "grand_total"], frm.doc.currency); | ||||
| 
 | ||||
| 		// toggle fields
 | ||||
| 		frm.toggle_display(["conversion_rate", "base_opportunity_amount", "base_total", "base_grand_total"], | ||||
| 			frm.doc.currency != company_currency); | ||||
| 	}, | ||||
| 
 | ||||
| 	change_grid_labels: function(frm) { | ||||
| 		let company_currency = erpnext.get_currency(frm.doc.company); | ||||
| 		frm.set_currency_labels(["base_rate", "base_amount"], company_currency, "items"); | ||||
| 		frm.set_currency_labels(["rate", "amount"], frm.doc.currency, "items"); | ||||
| 
 | ||||
| 		let item_grid = frm.fields_dict.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, frm.doc.currency != company_currency); | ||||
| 		}); | ||||
| 		frm.refresh_fields(); | ||||
| 	}, | ||||
| 
 | ||||
| 	calculate_total: function(frm) { | ||||
| 		let total = 0, base_total = 0, grand_total = 0, base_grand_total = 0; | ||||
| 		frm.doc.items.forEach(item => { | ||||
| 			total += item.amount; | ||||
| 			base_total += item.base_amount; | ||||
| 		}) | ||||
| 
 | ||||
| 		base_grand_total = base_total + frm.doc.base_opportunity_amount; | ||||
| 		grand_total = total + frm.doc.opportunity_amount; | ||||
| 
 | ||||
| 		frm.set_value({ | ||||
| 			'total': flt(total), | ||||
| 			'base_total': flt(base_total), | ||||
| 			'grand_total': flt(grand_total), | ||||
| 			'base_grand_total': flt(base_grand_total) | ||||
| 		}); | ||||
| 	} | ||||
| 
 | ||||
| }); | ||||
| frappe.ui.form.on("Opportunity Item", { | ||||
| 	calculate: function(frm, cdt, cdn) { | ||||
| 		let row = frappe.get_doc(cdt, cdn); | ||||
| 		frappe.model.set_value(cdt, cdn, "amount", flt(row.qty) * flt(row.rate)); | ||||
| 		frappe.model.set_value(cdt, cdn, "base_rate", flt(frm.doc.conversion_rate) * flt(row.rate)); | ||||
| 		frappe.model.set_value(cdt, cdn, "base_amount", flt(frm.doc.conversion_rate) * flt(row.amount)); | ||||
| 		frm.trigger("calculate_total"); | ||||
| 	}, | ||||
| 	qty: function(frm, cdt, cdn) { | ||||
| 		frm.trigger("calculate", cdt, cdn); | ||||
| 	}, | ||||
| 	rate: function(frm, cdt, cdn) { | ||||
| 		frm.trigger("calculate", cdt, cdn); | ||||
| 	} | ||||
| }) | ||||
| 
 | ||||
| // TODO commonify this code
 | ||||
| @ -169,6 +258,7 @@ erpnext.crm.Opportunity = class Opportunity extends frappe.ui.form.Controller { | ||||
| 		} | ||||
| 
 | ||||
| 		this.setup_queries(); | ||||
| 		this.frm.trigger('currency'); | ||||
| 	} | ||||
| 
 | ||||
| 	setup_queries() { | ||||
|  | ||||
| @ -33,12 +33,20 @@ | ||||
|   "to_discuss", | ||||
|   "section_break_14", | ||||
|   "currency", | ||||
|   "opportunity_amount", | ||||
|   "conversion_rate", | ||||
|   "base_opportunity_amount", | ||||
|   "with_items", | ||||
|   "column_break_17", | ||||
|   "probability", | ||||
|   "opportunity_amount", | ||||
|   "items_section", | ||||
|   "items", | ||||
|   "section_break_32", | ||||
|   "base_total", | ||||
|   "base_grand_total", | ||||
|   "column_break_33", | ||||
|   "total", | ||||
|   "grand_total", | ||||
|   "contact_info", | ||||
|   "customer_address", | ||||
|   "address_display", | ||||
| @ -425,12 +433,65 @@ | ||||
|    "fieldtype": "Link", | ||||
|    "label": "Print Language", | ||||
|    "options": "Language" | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "base_opportunity_amount", | ||||
|    "fieldtype": "Currency", | ||||
|    "label": "Opportunity Amount (Company Currency)", | ||||
|    "options": "Company:company:default_currency", | ||||
|    "print_hide": 1, | ||||
|    "read_only": 1 | ||||
|   }, | ||||
|   { | ||||
|    "depends_on": "with_items", | ||||
|    "fieldname": "section_break_32", | ||||
|    "fieldtype": "Section Break", | ||||
|    "hide_border": 1 | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "base_total", | ||||
|    "fieldtype": "Currency", | ||||
|    "label": "Total (Company Currency)", | ||||
|    "options": "Company:company:default_currency", | ||||
|    "print_hide": 1, | ||||
|    "read_only": 1 | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "total", | ||||
|    "fieldtype": "Currency", | ||||
|    "label": "Total", | ||||
|    "options": "currency", | ||||
|    "read_only": 1 | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "conversion_rate", | ||||
|    "fieldtype": "Float", | ||||
|    "label": "Exchange Rate" | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "column_break_33", | ||||
|    "fieldtype": "Column Break" | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "base_grand_total", | ||||
|    "fieldtype": "Currency", | ||||
|    "label": "Grand Total (Company Currency)", | ||||
|    "options": "Company:company:default_currency", | ||||
|    "print_hide": 1, | ||||
|    "read_only": 1 | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "grand_total", | ||||
|    "fieldtype": "Currency", | ||||
|    "label": "Grand Total", | ||||
|    "options": "currency", | ||||
|    "read_only": 1 | ||||
|   } | ||||
|  ], | ||||
|  "icon": "fa fa-info-sign", | ||||
|  "idx": 195, | ||||
|  "links": [], | ||||
|  "modified": "2021-08-25 10:28:24.923543", | ||||
|  "modified": "2021-09-06 10:02:18.609136", | ||||
|  "modified_by": "Administrator", | ||||
|  "module": "CRM", | ||||
|  "name": "Opportunity", | ||||
|  | ||||
| @ -9,9 +9,8 @@ import frappe | ||||
| from frappe import _ | ||||
| from frappe.email.inbox import link_communication_to_document | ||||
| from frappe.model.mapper import get_mapped_doc | ||||
| from frappe.utils import cint, cstr, get_fullname | ||||
| from frappe.utils import cint, cstr, flt, get_fullname | ||||
| 
 | ||||
| from erpnext.accounts.party import get_party_account_currency | ||||
| from erpnext.setup.utils import get_exchange_rate | ||||
| from erpnext.utilities.transaction_base import TransactionBase | ||||
| 
 | ||||
| @ -41,6 +40,23 @@ class Opportunity(TransactionBase): | ||||
| 		if not self.with_items: | ||||
| 			self.items = [] | ||||
| 
 | ||||
| 		else: | ||||
| 			self.calculate_totals() | ||||
| 
 | ||||
| 	def calculate_totals(self): | ||||
| 		total = base_total = 0 | ||||
| 		for item in self.get('items'): | ||||
| 			item.amount = flt(item.rate) * flt(item.qty) | ||||
| 			item.base_rate = flt(self.conversion_rate * item.rate) | ||||
| 			item.base_amount = flt(self.conversion_rate * item.amount) | ||||
| 			total += item.amount | ||||
| 			base_total += item.base_amount | ||||
| 
 | ||||
| 		self.total = flt(total) | ||||
| 		self.base_total = flt(base_total) | ||||
| 		self.grand_total = flt(self.total) + flt(self.opportunity_amount) | ||||
| 		self.base_grand_total = flt(self.base_total) + flt(self.base_opportunity_amount) | ||||
| 
 | ||||
| 	def make_new_lead_if_required(self): | ||||
| 		"""Set lead against new opportunity""" | ||||
| 		if (not self.get("party_name")) and self.contact_email: | ||||
| @ -224,13 +240,6 @@ def make_quotation(source_name, target_doc=None): | ||||
| 
 | ||||
| 		company_currency = frappe.get_cached_value('Company',  quotation.company,  "default_currency") | ||||
| 
 | ||||
| 		if quotation.quotation_to == 'Customer' and quotation.party_name: | ||||
| 			party_account_currency = get_party_account_currency("Customer", quotation.party_name, quotation.company) | ||||
| 		else: | ||||
| 			party_account_currency = company_currency | ||||
| 
 | ||||
| 		quotation.currency = party_account_currency or company_currency | ||||
| 
 | ||||
| 		if company_currency == quotation.currency: | ||||
| 			exchange_rate = 1 | ||||
| 		else: | ||||
| @ -254,7 +263,7 @@ def make_quotation(source_name, target_doc=None): | ||||
| 			"doctype": "Quotation", | ||||
| 			"field_map": { | ||||
| 				"opportunity_from": "quotation_to", | ||||
| 				"name": "enq_no", | ||||
| 				"name": "enq_no" | ||||
| 			} | ||||
| 		}, | ||||
| 		"Opportunity Item": { | ||||
|  | ||||
| @ -63,6 +63,10 @@ class TestOpportunity(unittest.TestCase): | ||||
| 		self.assertEqual(opp_doc.opportunity_from, "Customer") | ||||
| 		self.assertEqual(opp_doc.party_name, customer.name) | ||||
| 
 | ||||
| 	def test_opportunity_item(self): | ||||
| 		opportunity_doc = make_opportunity(with_items=1, rate=1100, qty=2) | ||||
| 		self.assertEqual(opportunity_doc.total, 2200) | ||||
| 
 | ||||
| def make_opportunity(**args): | ||||
| 	args = frappe._dict(args) | ||||
| 
 | ||||
| @ -71,6 +75,7 @@ def make_opportunity(**args): | ||||
| 		"company": args.company or "_Test Company", | ||||
| 		"opportunity_from": args.opportunity_from or "Customer", | ||||
| 		"opportunity_type": "Sales", | ||||
| 		"conversion_rate": 1.0, | ||||
| 		"with_items": args.with_items or 0, | ||||
| 		"transaction_date": today() | ||||
| 	}) | ||||
| @ -85,6 +90,7 @@ def make_opportunity(**args): | ||||
| 		opp_doc.append('items', { | ||||
| 			"item_code": args.item_code or "_Test Item", | ||||
| 			"qty": args.qty or 1, | ||||
| 			"rate": args.rate or 1000, | ||||
| 			"uom": "_Test UOM" | ||||
| 		}) | ||||
| 
 | ||||
|  | ||||
| @ -1,469 +1,177 @@ | ||||
| { | ||||
|  "allow_copy": 0,  | ||||
|  "allow_events_in_timeline": 0,  | ||||
|  "allow_guest_to_view": 0,  | ||||
|  "allow_import": 0,  | ||||
|  "allow_rename": 0,  | ||||
|  "beta": 0,  | ||||
|  "creation": "2013-02-22 01:27:51",  | ||||
|  "custom": 0,  | ||||
|  "docstatus": 0,  | ||||
|  "doctype": "DocType",  | ||||
|  "editable_grid": 1,  | ||||
|  "engine": "InnoDB",  | ||||
|  "actions": [], | ||||
|  "creation": "2013-02-22 01:27:51", | ||||
|  "doctype": "DocType", | ||||
|  "editable_grid": 1, | ||||
|  "engine": "InnoDB", | ||||
|  "field_order": [ | ||||
|   "item_code", | ||||
|   "item_name", | ||||
|   "col_break1", | ||||
|   "uom", | ||||
|   "qty", | ||||
|   "section_break_6", | ||||
|   "brand", | ||||
|   "item_group", | ||||
|   "description", | ||||
|   "column_break_8", | ||||
|   "image", | ||||
|   "image_view", | ||||
|   "quantity_and_rate_section", | ||||
|   "base_rate", | ||||
|   "base_amount", | ||||
|   "column_break_16", | ||||
|   "rate", | ||||
|   "amount" | ||||
|  ], | ||||
|  "fields": [ | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "item_code",  | ||||
|    "fieldtype": "Link",  | ||||
|    "hidden": 0,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 0,  | ||||
|    "in_list_view": 1,  | ||||
|    "in_standard_filter": 0,  | ||||
|    "label": "Item Code",  | ||||
|    "length": 0,  | ||||
|    "no_copy": 0,  | ||||
|    "oldfieldname": "item_code",  | ||||
|    "oldfieldtype": "Link",  | ||||
|    "options": "Item",  | ||||
|    "permlevel": 0,  | ||||
|    "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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|   },  | ||||
|    "fieldname": "item_code", | ||||
|    "fieldtype": "Link", | ||||
|    "in_list_view": 1, | ||||
|    "label": "Item Code", | ||||
|    "oldfieldname": "item_code", | ||||
|    "oldfieldtype": "Link", | ||||
|    "options": "Item" | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "col_break1",  | ||||
|    "fieldtype": "Column Break",  | ||||
|    "hidden": 0,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 0,  | ||||
|    "in_list_view": 0,  | ||||
|    "in_standard_filter": 0,  | ||||
|    "length": 0,  | ||||
|    "no_copy": 0,  | ||||
|    "permlevel": 0,  | ||||
|    "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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|   },  | ||||
|    "fieldname": "col_break1", | ||||
|    "fieldtype": "Column Break" | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "qty",  | ||||
|    "fieldtype": "Float",  | ||||
|    "hidden": 0,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 0,  | ||||
|    "in_list_view": 1,  | ||||
|    "in_standard_filter": 0,  | ||||
|    "label": "Qty",  | ||||
|    "length": 0,  | ||||
|    "no_copy": 0,  | ||||
|    "oldfieldname": "qty",  | ||||
|    "oldfieldtype": "Currency",  | ||||
|    "permlevel": 0,  | ||||
|    "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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|   },  | ||||
|    "default": "1", | ||||
|    "fieldname": "qty", | ||||
|    "fieldtype": "Float", | ||||
|    "in_list_view": 1, | ||||
|    "label": "Qty", | ||||
|    "oldfieldname": "qty", | ||||
|    "oldfieldtype": "Currency" | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "description": "",  | ||||
|    "fieldname": "item_group",  | ||||
|    "fieldtype": "Link",  | ||||
|    "hidden": 1,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 0,  | ||||
|    "in_list_view": 0,  | ||||
|    "in_standard_filter": 0,  | ||||
|    "label": "Item Group",  | ||||
|    "length": 0,  | ||||
|    "no_copy": 0,  | ||||
|    "oldfieldname": "item_group",  | ||||
|    "oldfieldtype": "Link",  | ||||
|    "options": "Item Group",  | ||||
|    "permlevel": 0,  | ||||
|    "print_hide": 1,  | ||||
|    "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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|   },  | ||||
|    "fieldname": "item_group", | ||||
|    "fieldtype": "Link", | ||||
|    "hidden": 1, | ||||
|    "label": "Item Group", | ||||
|    "oldfieldname": "item_group", | ||||
|    "oldfieldtype": "Link", | ||||
|    "options": "Item Group", | ||||
|    "print_hide": 1 | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "brand",  | ||||
|    "fieldtype": "Link",  | ||||
|    "hidden": 1,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 0,  | ||||
|    "in_list_view": 0,  | ||||
|    "in_standard_filter": 0,  | ||||
|    "label": "Brand",  | ||||
|    "length": 0,  | ||||
|    "no_copy": 0,  | ||||
|    "oldfieldname": "brand",  | ||||
|    "oldfieldtype": "Link",  | ||||
|    "options": "Brand",  | ||||
|    "permlevel": 0,  | ||||
|    "print_hide": 1,  | ||||
|    "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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|   },  | ||||
|    "fieldname": "brand", | ||||
|    "fieldtype": "Link", | ||||
|    "hidden": 1, | ||||
|    "label": "Brand", | ||||
|    "oldfieldname": "brand", | ||||
|    "oldfieldtype": "Link", | ||||
|    "options": "Brand", | ||||
|    "print_hide": 1 | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "section_break_6",  | ||||
|    "fieldtype": "Section Break",  | ||||
|    "hidden": 0,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|   },  | ||||
|    "collapsible": 1, | ||||
|    "fieldname": "section_break_6", | ||||
|    "fieldtype": "Section Break", | ||||
|    "label": "Description" | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "uom",  | ||||
|    "fieldtype": "Link",  | ||||
|    "hidden": 0,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 0,  | ||||
|    "in_list_view": 0,  | ||||
|    "in_standard_filter": 0,  | ||||
|    "label": "UOM",  | ||||
|    "length": 0,  | ||||
|    "no_copy": 0,  | ||||
|    "oldfieldname": "uom",  | ||||
|    "oldfieldtype": "Link",  | ||||
|    "options": "UOM",  | ||||
|    "permlevel": 0,  | ||||
|    "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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|   },  | ||||
|    "fieldname": "uom", | ||||
|    "fieldtype": "Link", | ||||
|    "label": "UOM", | ||||
|    "oldfieldname": "uom", | ||||
|    "oldfieldtype": "Link", | ||||
|    "options": "UOM" | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "item_name",  | ||||
|    "fieldtype": "Data",  | ||||
|    "hidden": 0,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 1,  | ||||
|    "in_list_view": 1,  | ||||
|    "in_standard_filter": 0,  | ||||
|    "label": "Item Name",  | ||||
|    "length": 0,  | ||||
|    "no_copy": 0,  | ||||
|    "oldfieldname": "item_name",  | ||||
|    "oldfieldtype": "Data",  | ||||
|    "permlevel": 0,  | ||||
|    "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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|   },  | ||||
|    "fieldname": "item_name", | ||||
|    "fieldtype": "Data", | ||||
|    "in_global_search": 1, | ||||
|    "label": "Item Name", | ||||
|    "oldfieldname": "item_name", | ||||
|    "oldfieldtype": "Data" | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "description",  | ||||
|    "fieldtype": "Text Editor",  | ||||
|    "hidden": 0,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 0,  | ||||
|    "in_list_view": 0,  | ||||
|    "in_standard_filter": 0,  | ||||
|    "label": "Description",  | ||||
|    "length": 0,  | ||||
|    "no_copy": 0,  | ||||
|    "oldfieldname": "description",  | ||||
|    "oldfieldtype": "Text",  | ||||
|    "permlevel": 0,  | ||||
|    "print_hide": 0,  | ||||
|    "print_hide_if_no_value": 0,  | ||||
|    "print_width": "300px",  | ||||
|    "read_only": 0,  | ||||
|    "remember_last_selected_value": 0,  | ||||
|    "report_hide": 0,  | ||||
|    "reqd": 0,  | ||||
|    "search_index": 0,  | ||||
|    "set_only_once": 0,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0,  | ||||
|    "fieldname": "description", | ||||
|    "fieldtype": "Text Editor", | ||||
|    "label": "Description", | ||||
|    "oldfieldname": "description", | ||||
|    "oldfieldtype": "Text", | ||||
|    "print_width": "300px", | ||||
|    "width": "300px" | ||||
|   },  | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "column_break_8",  | ||||
|    "fieldtype": "Column Break",  | ||||
|    "hidden": 0,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|   },  | ||||
|    "fieldname": "column_break_8", | ||||
|    "fieldtype": "Column Break" | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "image",  | ||||
|    "fieldtype": "Attach",  | ||||
|    "hidden": 1,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 0,  | ||||
|    "in_list_view": 0,  | ||||
|    "in_standard_filter": 0,  | ||||
|    "label": "Image",  | ||||
|    "length": 0,  | ||||
|    "no_copy": 0,  | ||||
|    "options": "",  | ||||
|    "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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|   },  | ||||
|    "fieldname": "image", | ||||
|    "fieldtype": "Attach", | ||||
|    "hidden": 1, | ||||
|    "label": "Image" | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "image_view",  | ||||
|    "fieldtype": "Image",  | ||||
|    "hidden": 0,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 0,  | ||||
|    "in_list_view": 0,  | ||||
|    "in_standard_filter": 0,  | ||||
|    "label": "Image View",  | ||||
|    "length": 0,  | ||||
|    "no_copy": 0,  | ||||
|    "options": "image",  | ||||
|    "permlevel": 0,  | ||||
|    "precision": "",  | ||||
|    "print_hide": 1,  | ||||
|    "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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|   },  | ||||
|    "fieldname": "image_view", | ||||
|    "fieldtype": "Image", | ||||
|    "label": "Image View", | ||||
|    "options": "image", | ||||
|    "print_hide": 1 | ||||
|   }, | ||||
|   { | ||||
|    "allow_bulk_edit": 0,  | ||||
|    "allow_in_quick_entry": 0,  | ||||
|    "allow_on_submit": 0,  | ||||
|    "bold": 0,  | ||||
|    "collapsible": 0,  | ||||
|    "columns": 0,  | ||||
|    "fieldname": "basic_rate",  | ||||
|    "fieldtype": "Currency",  | ||||
|    "hidden": 1,  | ||||
|    "ignore_user_permissions": 0,  | ||||
|    "ignore_xss_filter": 0,  | ||||
|    "in_filter": 0,  | ||||
|    "in_global_search": 0,  | ||||
|    "in_list_view": 0,  | ||||
|    "in_standard_filter": 0,  | ||||
|    "label": "Basic Rate",  | ||||
|    "length": 0,  | ||||
|    "no_copy": 0,  | ||||
|    "oldfieldname": "basic_rate",  | ||||
|    "oldfieldtype": "Currency",  | ||||
|    "options": "Company:company:default_currency",  | ||||
|    "permlevel": 0,  | ||||
|    "print_hide": 1,  | ||||
|    "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,  | ||||
|    "translatable": 0,  | ||||
|    "unique": 0 | ||||
|    "fieldname": "rate", | ||||
|    "fieldtype": "Currency", | ||||
|    "in_list_view": 1, | ||||
|    "label": "Rate", | ||||
|    "options": "currency", | ||||
|    "reqd": 1 | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "quantity_and_rate_section", | ||||
|    "fieldtype": "Section Break", | ||||
|    "label": "Quantity and Rate" | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "base_amount", | ||||
|    "fieldtype": "Currency", | ||||
|    "label": "Amount (Company Currency)", | ||||
|    "options": "Company:company:default_currency", | ||||
|    "print_hide": 1, | ||||
|    "read_only": 1, | ||||
|    "reqd": 1 | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "column_break_16", | ||||
|    "fieldtype": "Column Break" | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "amount", | ||||
|    "fieldtype": "Currency", | ||||
|    "in_list_view": 1, | ||||
|    "label": "Amount", | ||||
|    "options": "currency", | ||||
|    "read_only": 1, | ||||
|    "reqd": 1 | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "base_rate", | ||||
|    "fieldtype": "Currency", | ||||
|    "label": "Rate (Company Currency)", | ||||
|    "oldfieldname": "basic_rate", | ||||
|    "oldfieldtype": "Currency", | ||||
|    "options": "Company:company:default_currency", | ||||
|    "print_hide": 1, | ||||
|    "read_only": 1, | ||||
|    "reqd": 1 | ||||
|   } | ||||
|  ],  | ||||
|  "has_web_view": 0,  | ||||
|  "hide_heading": 0,  | ||||
|  "hide_toolbar": 0,  | ||||
|  "idx": 1,  | ||||
|  "image_view": 0,  | ||||
|  "in_create": 0,  | ||||
|  "is_submittable": 0,  | ||||
|  "issingle": 0,  | ||||
|  "istable": 1,  | ||||
|  "max_attachments": 0,  | ||||
|  "modified": "2018-12-28 15:43:09.382012",  | ||||
|  "modified_by": "Administrator",  | ||||
|  "module": "CRM",  | ||||
|  "name": "Opportunity Item",  | ||||
|  "owner": "Administrator",  | ||||
|  "permissions": [],  | ||||
|  "quick_entry": 0,  | ||||
|  "read_only": 0,  | ||||
|  "read_only_onload": 0,  | ||||
|  "show_name_in_global_search": 0,  | ||||
|  "track_changes": 1,  | ||||
|  "track_seen": 0,  | ||||
|  "track_views": 0 | ||||
|  ], | ||||
|  "idx": 1, | ||||
|  "istable": 1, | ||||
|  "links": [], | ||||
|  "modified": "2021-07-30 16:39:09.775720", | ||||
|  "modified_by": "Administrator", | ||||
|  "module": "CRM", | ||||
|  "name": "Opportunity Item", | ||||
|  "owner": "Administrator", | ||||
|  "permissions": [], | ||||
|  "sort_field": "modified", | ||||
|  "sort_order": "DESC", | ||||
|  "track_changes": 1 | ||||
| } | ||||
| @ -304,3 +304,4 @@ erpnext.patches.v13_0.set_operation_time_based_on_operating_cost | ||||
| erpnext.patches.v13_0.validate_options_for_data_field | ||||
| erpnext.patches.v13_0.create_gst_payment_entry_fields | ||||
| erpnext.patches.v14_0.delete_shopify_doctypes | ||||
| erpnext.patches.v14_0.update_opportunity_currency_fields | ||||
							
								
								
									
										36
									
								
								erpnext/patches/v14_0/update_opportunity_currency_fields.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								erpnext/patches/v14_0/update_opportunity_currency_fields.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
| from __future__ import unicode_literals | ||||
| 
 | ||||
| import frappe | ||||
| from frappe.utils import flt | ||||
| 
 | ||||
| import erpnext | ||||
| from erpnext.setup.utils import get_exchange_rate | ||||
| 
 | ||||
| 
 | ||||
| def execute(): | ||||
| 	frappe.reload_doc('crm', 'doctype', 'opportunity') | ||||
| 	frappe.reload_doc('crm', 'doctype', 'opportunity_item') | ||||
| 
 | ||||
| 	opportunities = frappe.db.get_list('Opportunity', filters={ | ||||
| 		'opportunity_amount': ['>', 0] | ||||
| 	}, fields=['name', 'company', 'currency', 'opportunity_amount']) | ||||
| 
 | ||||
| 	for opportunity in opportunities: | ||||
| 		company_currency = erpnext.get_company_currency(opportunity.company) | ||||
| 
 | ||||
| 		# base total and total will be 0 only since item table did not have amount field earlier | ||||
| 		if opportunity.currency != company_currency: | ||||
| 			conversion_rate = get_exchange_rate(opportunity.currency, company_currency) | ||||
| 			base_opportunity_amount = flt(conversion_rate) * flt(opportunity.opportunity_amount) | ||||
| 			grand_total = flt(opportunity.opportunity_amount) | ||||
| 			base_grand_total = flt(conversion_rate) * flt(opportunity.opportunity_amount) | ||||
| 		else: | ||||
| 			conversion_rate = 1 | ||||
| 			base_opportunity_amount = grand_total = base_grand_total = flt(opportunity.opportunity_amount) | ||||
| 
 | ||||
| 		frappe.db.set_value('Opportunity', opportunity.name, { | ||||
| 			'conversion_rate': conversion_rate, | ||||
| 			'base_opportunity_amount': base_opportunity_amount, | ||||
| 			'grand_total': grand_total, | ||||
| 			'base_grand_total': base_grand_total | ||||
| 		}, update_modified=False) | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user