Merge branch 'develop' into fix_PE_allocated_amt
This commit is contained in:
		
						commit
						07fb98b91d
					
				| @ -20,10 +20,11 @@ | ||||
|   "discount", | ||||
|   "section_break_9", | ||||
|   "payment_amount", | ||||
|   "outstanding", | ||||
|   "paid_amount", | ||||
|   "discounted_amount", | ||||
|   "column_break_3", | ||||
|   "outstanding", | ||||
|   "paid_amount" | ||||
|   "base_payment_amount" | ||||
|  ], | ||||
|  "fields": [ | ||||
|   { | ||||
| @ -78,7 +79,8 @@ | ||||
|    "depends_on": "paid_amount", | ||||
|    "fieldname": "paid_amount", | ||||
|    "fieldtype": "Currency", | ||||
|    "label": "Paid Amount" | ||||
|    "label": "Paid Amount", | ||||
|    "options": "currency" | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "column_break_3", | ||||
| @ -97,6 +99,7 @@ | ||||
|    "fieldname": "outstanding", | ||||
|    "fieldtype": "Currency", | ||||
|    "label": "Outstanding", | ||||
|    "options": "currency", | ||||
|    "read_only": 1 | ||||
|   }, | ||||
|   { | ||||
| @ -145,12 +148,18 @@ | ||||
|   { | ||||
|    "fieldname": "section_break_4", | ||||
|    "fieldtype": "Section Break" | ||||
|   }, | ||||
|   { | ||||
|    "fieldname": "base_payment_amount", | ||||
|    "fieldtype": "Currency", | ||||
|    "label": "Payment Amount (Company Currency)", | ||||
|    "options": "Company:company:default_currency" | ||||
|   } | ||||
|  ], | ||||
|  "index_web_pages_for_search": 1, | ||||
|  "istable": 1, | ||||
|  "links": [], | ||||
|  "modified": "2021-02-15 21:03:12.540546", | ||||
|  "modified": "2021-04-28 05:41:35.084233", | ||||
|  "modified_by": "Administrator", | ||||
|  "module": "Accounts", | ||||
|  "name": "Payment Schedule", | ||||
|  | ||||
| @ -397,7 +397,7 @@ class TestPurchaseInvoice(unittest.TestCase): | ||||
| 
 | ||||
| 		pi.update({ | ||||
| 			"payment_schedule": get_payment_terms("_Test Payment Term Template", | ||||
| 				pi.posting_date, pi.grand_total) | ||||
| 				pi.posting_date, pi.grand_total, pi.base_grand_total) | ||||
| 		}) | ||||
| 
 | ||||
| 		pi.save() | ||||
|  | ||||
| @ -923,29 +923,34 @@ class AccountsController(TransactionBase): | ||||
| 		date = self.get("due_date") | ||||
| 		due_date = date or posting_date | ||||
| 
 | ||||
| 		if party_account_currency == self.company_currency: | ||||
| 			grand_total = self.get("base_rounded_total") or self.base_grand_total | ||||
| 		else: | ||||
| 			grand_total = self.get("rounded_total") or self.grand_total | ||||
| 		base_grand_total = self.get("base_rounded_total") or self.base_grand_total | ||||
| 		grand_total = self.get("rounded_total") or self.grand_total | ||||
| 
 | ||||
| 		if self.doctype in ("Sales Invoice", "Purchase Invoice"): | ||||
| 			base_grand_total = base_grand_total - flt(self.base_write_off_amount) | ||||
| 			grand_total = grand_total - flt(self.write_off_amount) | ||||
| 
 | ||||
| 		if self.get("total_advance"): | ||||
| 			grand_total -= self.get("total_advance") | ||||
| 			if party_account_currency == self.company_currency: | ||||
| 				base_grand_total -= self.get("total_advance") | ||||
| 				grand_total = flt(base_grand_total / self.get("conversion_rate"), self.precision("grand_total")) | ||||
| 			else: | ||||
| 				grand_total -= self.get("total_advance") | ||||
| 				base_grand_total = flt(grand_total * self.get("conversion_rate"), self.precision("base_grand_total")) | ||||
| 
 | ||||
| 		if not self.get("payment_schedule"): | ||||
| 			if self.get("payment_terms_template"): | ||||
| 				data = get_payment_terms(self.payment_terms_template, posting_date, grand_total) | ||||
| 				data = get_payment_terms(self.payment_terms_template, posting_date, grand_total, base_grand_total) | ||||
| 				for item in data: | ||||
| 					self.append("payment_schedule", item) | ||||
| 			else: | ||||
| 				data = dict(due_date=due_date, invoice_portion=100, payment_amount=grand_total) | ||||
| 				data = dict(due_date=due_date, invoice_portion=100, payment_amount=grand_total, base_payment_amount=base_grand_total) | ||||
| 				self.append("payment_schedule", data) | ||||
| 		else: | ||||
| 			for d in self.get("payment_schedule"): | ||||
| 				if d.invoice_portion: | ||||
| 					d.payment_amount = flt(grand_total * flt(d.invoice_portion / 100), d.precision('payment_amount')) | ||||
| 					d.base_payment_amount = flt(base_grand_total * flt(d.invoice_portion / 100), d.precision('payment_amount')) | ||||
| 					d.outstanding = d.payment_amount | ||||
| 
 | ||||
| 	def set_due_date(self): | ||||
| @ -982,22 +987,28 @@ class AccountsController(TransactionBase): | ||||
| 
 | ||||
| 		if self.get("payment_schedule"): | ||||
| 			total = 0 | ||||
| 			base_total = 0 | ||||
| 			for d in self.get("payment_schedule"): | ||||
| 				total += flt(d.payment_amount) | ||||
| 				base_total += flt(d.base_payment_amount) | ||||
| 
 | ||||
| 			if party_account_currency == self.company_currency: | ||||
| 				total = flt(total, self.precision("base_grand_total")) | ||||
| 				grand_total = flt(self.get("base_rounded_total") or self.base_grand_total, self.precision('base_grand_total')) | ||||
| 			else: | ||||
| 				total = flt(total, self.precision("grand_total")) | ||||
| 				grand_total = flt(self.get("rounded_total") or self.grand_total, self.precision('grand_total')) | ||||
| 
 | ||||
| 			if self.get("total_advance"): | ||||
| 				grand_total -= self.get("total_advance") | ||||
| 			base_grand_total = self.get("base_rounded_total") or self.base_grand_total | ||||
| 			grand_total = self.get("rounded_total") or self.grand_total | ||||
| 
 | ||||
| 			if self.doctype in ("Sales Invoice", "Purchase Invoice"): | ||||
| 				base_grand_total = base_grand_total - flt(self.base_write_off_amount) | ||||
| 				grand_total = grand_total - flt(self.write_off_amount) | ||||
| 			if total != flt(grand_total, self.precision("grand_total")): | ||||
| 
 | ||||
| 			if self.get("total_advance"): | ||||
| 				if party_account_currency == self.company_currency: | ||||
| 					base_grand_total -= self.get("total_advance") | ||||
| 					grand_total = flt(base_grand_total / self.get("conversion_rate"), self.precision("grand_total")) | ||||
| 				else: | ||||
| 					grand_total -= self.get("total_advance") | ||||
| 					base_grand_total = flt(grand_total * self.get("conversion_rate"), self.precision("base_grand_total")) | ||||
| 			print(grand_total, base_grand_total) | ||||
| 			if total != flt(grand_total, self.precision("grand_total")) or \ | ||||
| 				base_total != flt(base_grand_total, self.precision("base_grand_total")): | ||||
| 				frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total")) | ||||
| 
 | ||||
| 	def is_rounded_total_disabled(self): | ||||
| @ -1237,7 +1248,7 @@ def update_invoice_status(): | ||||
| 
 | ||||
| 
 | ||||
| @frappe.whitelist() | ||||
| def get_payment_terms(terms_template, posting_date=None, grand_total=None, bill_date=None): | ||||
| def get_payment_terms(terms_template, posting_date=None, grand_total=None, base_grand_total=None, bill_date=None): | ||||
| 	if not terms_template: | ||||
| 		return | ||||
| 
 | ||||
| @ -1245,14 +1256,14 @@ def get_payment_terms(terms_template, posting_date=None, grand_total=None, bill_ | ||||
| 
 | ||||
| 	schedule = [] | ||||
| 	for d in terms_doc.get("terms"): | ||||
| 		term_details = get_payment_term_details(d, posting_date, grand_total, bill_date) | ||||
| 		term_details = get_payment_term_details(d, posting_date, grand_total, base_grand_total, bill_date) | ||||
| 		schedule.append(term_details) | ||||
| 
 | ||||
| 	return schedule | ||||
| 
 | ||||
| 
 | ||||
| @frappe.whitelist() | ||||
| def get_payment_term_details(term, posting_date=None, grand_total=None, bill_date=None): | ||||
| def get_payment_term_details(term, posting_date=None, grand_total=None, base_grand_total=None, bill_date=None): | ||||
| 	term_details = frappe._dict() | ||||
| 	if isinstance(term, text_type): | ||||
| 		term = frappe.get_doc("Payment Term", term) | ||||
| @ -1261,9 +1272,9 @@ def get_payment_term_details(term, posting_date=None, grand_total=None, bill_dat | ||||
| 	term_details.description = term.description | ||||
| 	term_details.invoice_portion = term.invoice_portion | ||||
| 	term_details.payment_amount = flt(term.invoice_portion) * flt(grand_total) / 100 | ||||
| 	term_details.base_payment_amount = flt(term.invoice_portion) * flt(base_grand_total) / 100 | ||||
| 	term_details.discount_type = term.discount_type | ||||
| 	term_details.discount = term.discount | ||||
| 	# term_details.discounted_amount = flt(grand_total) * (term.discount / 100) if term.discount_type == 'Percentage' else discount | ||||
| 	term_details.outstanding = term_details.payment_amount | ||||
| 	term_details.mode_of_payment = term.mode_of_payment | ||||
| 
 | ||||
|  | ||||
| @ -640,6 +640,10 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ | ||||
| 										let key = item.name; | ||||
| 										me.apply_rule_on_other_items({key: item}); | ||||
| 									} | ||||
| 								}, | ||||
| 								() => { | ||||
| 									var company_currency = me.get_company_currency(); | ||||
| 									me.update_item_grid_labels(company_currency); | ||||
| 								} | ||||
| 							]); | ||||
| 						} | ||||
| @ -1321,11 +1325,9 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ | ||||
| 	change_grid_labels: function(company_currency) { | ||||
| 		var me = this; | ||||
| 
 | ||||
| 		this.frm.set_currency_labels(["base_rate", "base_net_rate", "base_price_list_rate", "base_amount", "base_net_amount", "base_rate_with_margin"], | ||||
| 			company_currency, "items"); | ||||
| 		this.update_item_grid_labels(company_currency); | ||||
| 
 | ||||
| 		this.frm.set_currency_labels(["rate", "net_rate", "price_list_rate", "amount", "net_amount", "stock_uom_rate", "rate_with_margin"], | ||||
| 			this.frm.doc.currency, "items"); | ||||
| 		this.toggle_item_grid_columns(company_currency); | ||||
| 
 | ||||
| 		if(this.frm.fields_dict["operations"]) { | ||||
| 			this.frm.set_currency_labels(["operating_cost", "hour_rate"], this.frm.doc.currency, "operations"); | ||||
| @ -1360,6 +1362,39 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ | ||||
| 				this.frm.doc.party_account_currency, "advances"); | ||||
| 		} | ||||
| 
 | ||||
| 		this.update_payment_schedule_grid_labels(company_currency); | ||||
| 	}, | ||||
| 
 | ||||
| 	update_item_grid_labels: function(company_currency) { | ||||
| 		this.frm.set_currency_labels([ | ||||
| 			"base_rate", "base_net_rate", "base_price_list_rate", | ||||
| 			"base_amount", "base_net_amount", "base_rate_with_margin" | ||||
| 		], company_currency, "items"); | ||||
| 
 | ||||
| 		this.frm.set_currency_labels([ | ||||
| 			"rate", "net_rate", "price_list_rate", "amount", | ||||
| 			"net_amount", "stock_uom_rate", "rate_with_margin" | ||||
| 		], this.frm.doc.currency, "items"); | ||||
| 	}, | ||||
| 
 | ||||
| 	update_payment_schedule_grid_labels: function(company_currency) { | ||||
| 		const me = this; | ||||
| 		if (this.frm.fields_dict["payment_schedule"]) { | ||||
| 			this.frm.set_currency_labels(["base_payment_amount", "base_outstanding", "base_paid_amount"], | ||||
| 				company_currency, "payment_schedule"); | ||||
| 			this.frm.set_currency_labels(["payment_amount", "outstanding", "paid_amount"], | ||||
| 				this.frm.doc.currency, "payment_schedule"); | ||||
| 			 | ||||
| 			var schedule_grid = this.frm.fields_dict["payment_schedule"].grid; | ||||
| 			$.each(["base_payment_amount", "base_outstanding", "base_paid_amount"], function(i, fname) { | ||||
| 				if (frappe.meta.get_docfield(schedule_grid.doctype, fname)) | ||||
| 					schedule_grid.set_column_disp(fname, me.frm.doc.currency != company_currency); | ||||
| 			}); | ||||
| 		} | ||||
| 	}, | ||||
| 
 | ||||
| 	toggle_item_grid_columns: function(company_currency) { | ||||
| 		const me = this; | ||||
| 		// toggle columns
 | ||||
| 		var item_grid = this.frm.fields_dict["items"].grid; | ||||
| 		$.each(["base_rate", "base_price_list_rate", "base_amount", "base_rate_with_margin"], function(i, fname) { | ||||
| @ -1379,9 +1414,6 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ | ||||
| 			if(frappe.meta.get_docfield(item_grid.doctype, fname)) | ||||
| 				item_grid.set_column_disp(fname, (show && (me.frm.doc.currency != company_currency))); | ||||
| 		}); | ||||
| 
 | ||||
| 		// set labels
 | ||||
| 		var $wrapper = $(this.frm.wrapper); | ||||
| 	}, | ||||
| 
 | ||||
| 	recalculate: function() { | ||||
| @ -1995,11 +2027,14 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ | ||||
| 					terms_template: doc.payment_terms_template, | ||||
| 					posting_date: posting_date, | ||||
| 					grand_total: doc.rounded_total || doc.grand_total, | ||||
| 					base_grand_total: doc.base_rounded_total || doc.base_grand_total, | ||||
| 					bill_date: doc.bill_date | ||||
| 				}, | ||||
| 				callback: function(r) { | ||||
| 					if(r.message && !r.exc) { | ||||
| 						me.frm.set_value("payment_schedule", r.message); | ||||
| 						const company_currency = me.get_company_currency(); | ||||
| 						this.update_payment_schedule_grid_labels(company_currency); | ||||
| 					} | ||||
| 				} | ||||
| 			}) | ||||
| @ -2007,6 +2042,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ | ||||
| 	}, | ||||
| 
 | ||||
| 	payment_term: function(doc, cdt, cdn) { | ||||
| 		const me = this; | ||||
| 		var row = locals[cdt][cdn]; | ||||
| 		if(row.payment_term) { | ||||
| 			frappe.call({ | ||||
| @ -2015,12 +2051,15 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ | ||||
| 					term: row.payment_term, | ||||
| 					bill_date: this.frm.doc.bill_date, | ||||
| 					posting_date: this.frm.doc.posting_date || this.frm.doc.transaction_date, | ||||
| 					grand_total: this.frm.doc.rounded_total || this.frm.doc.grand_total | ||||
| 					grand_total: this.frm.doc.rounded_total || this.frm.doc.grand_total, | ||||
| 					base_grand_total: this.frm.doc.base_rounded_total || this.frm.doc.base_grand_total | ||||
| 				}, | ||||
| 				callback: function(r) { | ||||
| 					if(r.message && !r.exc) { | ||||
| 						for (var d in r.message) { | ||||
| 							frappe.model.set_value(cdt, cdn, d, r.message[d]); | ||||
| 							const company_currency = me.get_company_currency(); | ||||
| 							me.update_payment_schedule_grid_labels(company_currency); | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user