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