mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-26 00:14:50 +00:00
Merge branch 'develop'
This commit is contained in:
@@ -1,2 +1,2 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
__version__ = '6.4.2'
|
__version__ = '6.4.3'
|
||||||
|
|||||||
@@ -28,5 +28,11 @@
|
|||||||
"year": "_Test Fiscal Year 2016",
|
"year": "_Test Fiscal Year 2016",
|
||||||
"year_end_date": "2016-12-31",
|
"year_end_date": "2016-12-31",
|
||||||
"year_start_date": "2016-01-01"
|
"year_start_date": "2016-01-01"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"doctype": "Fiscal Year",
|
||||||
|
"year": "_Test Fiscal Year 2017",
|
||||||
|
"year_end_date": "2017-12-31",
|
||||||
|
"year_start_date": "2017-01-01"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -74,21 +74,7 @@ erpnext.accounts.PaymentReconciliationController = frappe.ui.form.Controller.ext
|
|||||||
doc: me.frm.doc,
|
doc: me.frm.doc,
|
||||||
method: 'get_unreconciled_entries',
|
method: 'get_unreconciled_entries',
|
||||||
callback: function(r, rt) {
|
callback: function(r, rt) {
|
||||||
var invoices = [];
|
me.set_invoice_options();
|
||||||
|
|
||||||
$.each(me.frm.doc.invoices || [], function(i, row) {
|
|
||||||
if (row.invoice_number && !inList(invoices, row.invoice_number))
|
|
||||||
invoices.push(row.invoice_type + " | " + row.invoice_number);
|
|
||||||
});
|
|
||||||
|
|
||||||
frappe.meta.get_docfield("Payment Reconciliation Payment", "invoice_number",
|
|
||||||
me.frm.doc.name).options = invoices.join("\n");
|
|
||||||
|
|
||||||
$.each(me.frm.doc.payments || [], function(i, p) {
|
|
||||||
if(!inList(invoices, cstr(p.invoice_number))) p.invoice_number = null;
|
|
||||||
});
|
|
||||||
|
|
||||||
refresh_field("payments");
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -98,8 +84,29 @@ erpnext.accounts.PaymentReconciliationController = frappe.ui.form.Controller.ext
|
|||||||
var me = this;
|
var me = this;
|
||||||
return this.frm.call({
|
return this.frm.call({
|
||||||
doc: me.frm.doc,
|
doc: me.frm.doc,
|
||||||
method: 'reconcile'
|
method: 'reconcile',
|
||||||
|
callback: function(r, rt) {
|
||||||
|
me.set_invoice_options();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
set_invoice_options: function() {
|
||||||
|
var invoices = [];
|
||||||
|
|
||||||
|
$.each(me.frm.doc.invoices || [], function(i, row) {
|
||||||
|
if (row.invoice_number && !inList(invoices, row.invoice_number))
|
||||||
|
invoices.push(row.invoice_type + " | " + row.invoice_number);
|
||||||
|
});
|
||||||
|
|
||||||
|
frappe.meta.get_docfield("Payment Reconciliation Payment", "invoice_number",
|
||||||
|
me.frm.doc.name).options = invoices.join("\n");
|
||||||
|
|
||||||
|
$.each(me.frm.doc.payments || [], function(i, p) {
|
||||||
|
if(!inList(invoices, cstr(p.invoice_number))) p.invoice_number = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
refresh_field("payments");
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,11 +3,8 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
|
|
||||||
from frappe.utils import flt
|
from frappe.utils import flt
|
||||||
|
|
||||||
from frappe import msgprint, _
|
from frappe import msgprint, _
|
||||||
|
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
|
||||||
class PaymentReconciliation(Document):
|
class PaymentReconciliation(Document):
|
||||||
@@ -17,7 +14,8 @@ class PaymentReconciliation(Document):
|
|||||||
|
|
||||||
def get_jv_entries(self):
|
def get_jv_entries(self):
|
||||||
self.check_mandatory_to_fetch()
|
self.check_mandatory_to_fetch()
|
||||||
dr_or_cr = "credit" if self.party_type == "Customer" else "debit"
|
dr_or_cr = "credit_in_account_currency" if self.party_type == "Customer" \
|
||||||
|
else "debit_in_account_currency"
|
||||||
|
|
||||||
cond = self.check_condition(dr_or_cr)
|
cond = self.check_condition(dr_or_cr)
|
||||||
|
|
||||||
@@ -68,7 +66,7 @@ class PaymentReconciliation(Document):
|
|||||||
def get_invoice_entries(self):
|
def get_invoice_entries(self):
|
||||||
#Fetch JVs, Sales and Purchase Invoices for 'invoices' to reconcile against
|
#Fetch JVs, Sales and Purchase Invoices for 'invoices' to reconcile against
|
||||||
non_reconciled_invoices = []
|
non_reconciled_invoices = []
|
||||||
dr_or_cr = "debit" if self.party_type == "Customer" else "credit"
|
dr_or_cr = "debit_in_account_currency" if self.party_type == "Customer" else "credit_in_account_currency"
|
||||||
cond = self.check_condition(dr_or_cr)
|
cond = self.check_condition(dr_or_cr)
|
||||||
|
|
||||||
invoice_list = frappe.db.sql("""
|
invoice_list = frappe.db.sql("""
|
||||||
@@ -106,13 +104,15 @@ class PaymentReconciliation(Document):
|
|||||||
and account = %(account)s and {0} > 0
|
and account = %(account)s and {0} > 0
|
||||||
and against_voucher_type = %(against_voucher_type)s
|
and against_voucher_type = %(against_voucher_type)s
|
||||||
and ifnull(against_voucher, '') = %(against_voucher)s
|
and ifnull(against_voucher, '') = %(against_voucher)s
|
||||||
""".format("credit" if self.party_type == "Customer" else "debit"), {
|
""".format("credit_in_account_currency" if self.party_type == "Customer"
|
||||||
"party_type": self.party_type,
|
else "debit_in_account_currency"), {
|
||||||
"party": self.party,
|
"party_type": self.party_type,
|
||||||
"account": self.receivable_payable_account,
|
"party": self.party,
|
||||||
"against_voucher_type": d.voucher_type,
|
"account": self.receivable_payable_account,
|
||||||
"against_voucher": d.voucher_no
|
"against_voucher_type": d.voucher_type,
|
||||||
})
|
"against_voucher": d.voucher_no
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
payment_amount = payment_amount[0][0] if payment_amount else 0
|
payment_amount = payment_amount[0][0] if payment_amount else 0
|
||||||
|
|
||||||
@@ -147,7 +147,8 @@ class PaymentReconciliation(Document):
|
|||||||
|
|
||||||
self.get_invoice_entries()
|
self.get_invoice_entries()
|
||||||
self.validate_invoice()
|
self.validate_invoice()
|
||||||
dr_or_cr = "credit" if self.party_type == "Customer" else "debit"
|
dr_or_cr = "credit_in_account_currency" if self.party_type == "Customer" \
|
||||||
|
else "debit_in_account_currency"
|
||||||
lst = []
|
lst = []
|
||||||
for e in self.get('payments'):
|
for e in self.get('payments'):
|
||||||
if e.invoice_number and e.allocated_amount:
|
if e.invoice_number and e.allocated_amount:
|
||||||
|
|||||||
@@ -141,7 +141,10 @@ frappe.ui.form.on("Payment Tool", "get_outstanding_vouchers", function(frm) {
|
|||||||
c.against_voucher_no = d.voucher_no;
|
c.against_voucher_no = d.voucher_no;
|
||||||
c.total_amount = d.invoice_amount;
|
c.total_amount = d.invoice_amount;
|
||||||
c.outstanding_amount = d.outstanding_amount;
|
c.outstanding_amount = d.outstanding_amount;
|
||||||
c.payment_amount = d.outstanding_amount;
|
|
||||||
|
if (frm.doc.set_payment_amount) {
|
||||||
|
c.payment_amount = d.outstanding_amount;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
refresh_field("vouchers");
|
refresh_field("vouchers");
|
||||||
|
|||||||
@@ -185,6 +185,28 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"fieldname": "set_payment_amount",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"label": "Set Payment Amount = Outstanding Amount",
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
@@ -474,7 +496,7 @@
|
|||||||
"is_submittable": 0,
|
"is_submittable": 0,
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"modified": "2015-08-31 18:58:21.813054",
|
"modified": "2015-10-01 09:43:24.199025",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Payment Tool",
|
"name": "Payment Tool",
|
||||||
|
|||||||
@@ -40,6 +40,13 @@ class ReceivablePayableReport(object):
|
|||||||
|
|
||||||
columns += [_("Age (Days)") + "::80"]
|
columns += [_("Age (Days)") + "::80"]
|
||||||
|
|
||||||
|
if not "range1" in self.filters:
|
||||||
|
self.filters["range1"] = "30"
|
||||||
|
if not "range2" in self.filters:
|
||||||
|
self.filters["range2"] = "60"
|
||||||
|
if not "range3" in self.filters:
|
||||||
|
self.filters["range3"] = "90"
|
||||||
|
|
||||||
for label in ("0-{range1}".format(**self.filters),
|
for label in ("0-{range1}".format(**self.filters),
|
||||||
"{range1}-{range2}".format(**self.filters),
|
"{range1}-{range2}".format(**self.filters),
|
||||||
"{range2}-{range3}".format(**self.filters),
|
"{range2}-{range3}".format(**self.filters),
|
||||||
|
|||||||
@@ -198,6 +198,8 @@ def update_against_doc(d, jv_obj):
|
|||||||
"""
|
"""
|
||||||
jv_detail = jv_obj.get("accounts", {"name": d["voucher_detail_no"]})[0]
|
jv_detail = jv_obj.get("accounts", {"name": d["voucher_detail_no"]})[0]
|
||||||
jv_detail.set(d["dr_or_cr"], d["allocated_amt"])
|
jv_detail.set(d["dr_or_cr"], d["allocated_amt"])
|
||||||
|
jv_detail.set('debit' if d['dr_or_cr']=='debit_in_account_currency' else 'credit',
|
||||||
|
d["allocated_amt"]*flt(jv_detail.exchange_rate))
|
||||||
|
|
||||||
original_reference_type = jv_detail.reference_type
|
original_reference_type = jv_detail.reference_type
|
||||||
original_reference_name = jv_detail.reference_name
|
original_reference_name = jv_detail.reference_name
|
||||||
@@ -211,6 +213,9 @@ def update_against_doc(d, jv_obj):
|
|||||||
from `tabJournal Entry Account` where name = %s
|
from `tabJournal Entry Account` where name = %s
|
||||||
""", d['voucher_detail_no'], as_dict=True)
|
""", d['voucher_detail_no'], as_dict=True)
|
||||||
|
|
||||||
|
amount_in_account_currency = flt(d['unadjusted_amt']) - flt(d['allocated_amt'])
|
||||||
|
amount_in_company_currency = amount_in_account_currency * flt(jvd[0]['exchange_rate'])
|
||||||
|
|
||||||
# new entry with balance amount
|
# new entry with balance amount
|
||||||
ch = jv_obj.append("accounts")
|
ch = jv_obj.append("accounts")
|
||||||
ch.account = d['account']
|
ch.account = d['account']
|
||||||
@@ -220,8 +225,14 @@ def update_against_doc(d, jv_obj):
|
|||||||
ch.party = d["party"]
|
ch.party = d["party"]
|
||||||
ch.cost_center = cstr(jvd[0]["cost_center"])
|
ch.cost_center = cstr(jvd[0]["cost_center"])
|
||||||
ch.balance = flt(jvd[0]["balance"])
|
ch.balance = flt(jvd[0]["balance"])
|
||||||
ch.set(d['dr_or_cr'], flt(d['unadjusted_amt']) - flt(d['allocated_amt']))
|
|
||||||
ch.set(d['dr_or_cr']== 'debit' and 'credit' or 'debit', 0)
|
ch.set(d['dr_or_cr'], amount_in_account_currency)
|
||||||
|
ch.set('debit' if d['dr_or_cr']=='debit_in_account_currency' else 'credit', amount_in_company_currency)
|
||||||
|
|
||||||
|
ch.set('credit_in_account_currency' if d['dr_or_cr']== 'debit_in_account_currency'
|
||||||
|
else 'debit_in_account_currency', 0)
|
||||||
|
ch.set('credit' if d['dr_or_cr']== 'debit_in_account_currency' else 'debit', 0)
|
||||||
|
|
||||||
ch.against_account = cstr(jvd[0]["against_account"])
|
ch.against_account = cstr(jvd[0]["against_account"])
|
||||||
ch.reference_type = original_reference_type
|
ch.reference_type = original_reference_type
|
||||||
ch.reference_name = original_reference_name
|
ch.reference_name = original_reference_name
|
||||||
|
|||||||
@@ -428,7 +428,10 @@ class AccountsController(TransactionBase):
|
|||||||
if party_type and party:
|
if party_type and party:
|
||||||
party_account_currency = get_party_account_currency(party_type, party, self.company)
|
party_account_currency = get_party_account_currency(party_type, party, self.company)
|
||||||
|
|
||||||
if party_account_currency != self.company_currency and self.currency != party_account_currency:
|
if (party_account_currency
|
||||||
|
and party_account_currency != self.company_currency
|
||||||
|
and self.currency != party_account_currency):
|
||||||
|
|
||||||
frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}")
|
frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}")
|
||||||
.format(party_type, party, party_account_currency), InvalidCurrency)
|
.format(party_type, party, party_account_currency), InvalidCurrency)
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ blogs.
|
|||||||
"""
|
"""
|
||||||
app_icon = "icon-th"
|
app_icon = "icon-th"
|
||||||
app_color = "#e74c3c"
|
app_color = "#e74c3c"
|
||||||
app_version = "6.4.2"
|
app_version = "6.4.3"
|
||||||
github_link = "https://github.com/frappe/erpnext"
|
github_link = "https://github.com/frappe/erpnext"
|
||||||
|
|
||||||
error_report_email = "support@erpnext.com"
|
error_report_email = "support@erpnext.com"
|
||||||
|
|||||||
2
setup.py
2
setup.py
@@ -1,6 +1,6 @@
|
|||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
|
|
||||||
version = "6.4.2"
|
version = "6.4.3"
|
||||||
|
|
||||||
with open("requirements.txt", "r") as f:
|
with open("requirements.txt", "r") as f:
|
||||||
install_requires = f.readlines()
|
install_requires = f.readlines()
|
||||||
|
|||||||
Reference in New Issue
Block a user