fix bug: can't make PE for invoice with multi due date

This commit is contained in:
tunde 2017-09-26 00:48:30 +01:00
parent 31ddbe36c0
commit c4b0d17c08
3 changed files with 49 additions and 35 deletions

View File

@ -8,14 +8,16 @@ from frappe import _, scrub, ValidationError
from frappe.utils import flt, comma_or, nowdate from frappe.utils import flt, comma_or, nowdate
from erpnext.accounts.utils import get_outstanding_invoices, get_account_currency, get_balance_on from erpnext.accounts.utils import get_outstanding_invoices, get_account_currency, get_balance_on
from erpnext.accounts.party import get_party_account from erpnext.accounts.party import get_party_account
from erpnext.accounts.doctype.journal_entry.journal_entry \ from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account
import get_average_exchange_rate, get_default_bank_cash_account
from erpnext.setup.utils import get_exchange_rate from erpnext.setup.utils import get_exchange_rate
from erpnext.accounts.general_ledger import make_gl_entries from erpnext.accounts.general_ledger import make_gl_entries
from erpnext.hr.doctype.expense_claim.expense_claim import update_reimbursed_amount from erpnext.hr.doctype.expense_claim.expense_claim import update_reimbursed_amount
from erpnext.controllers.accounts_controller import AccountsController from erpnext.controllers.accounts_controller import AccountsController
class InvalidPaymentEntry(ValidationError): pass
class InvalidPaymentEntry(ValidationError):
pass
class PaymentEntry(AccountsController): class PaymentEntry(AccountsController):
def setup_party_account_field(self): def setup_party_account_field(self):
@ -69,10 +71,9 @@ class PaymentEntry(AccountsController):
def validate_duplicate_entry(self): def validate_duplicate_entry(self):
reference_names = [] reference_names = []
for d in self.get("references"): for d in self.get("references"):
if (d.reference_doctype, d.reference_name) in reference_names: if (d.reference_doctype, d.reference_name, d.due_date) in reference_names:
frappe.throw(_("Row #{0}: Duplicate entry in References {1} {2}").format(d.idx, d.reference_doctype, d.reference_name)) frappe.throw(_("Row #{0}: Duplicate entry in References {1} {2}").format(d.idx, d.reference_doctype, d.reference_name))
reference_names.append((d.reference_doctype, d.reference_name)) reference_names.append((d.reference_doctype, d.reference_name, d.due_date))
def validate_allocated_amount(self): def validate_allocated_amount(self):
for d in self.get("references"): for d in self.get("references"):
@ -80,7 +81,6 @@ class PaymentEntry(AccountsController):
if flt(d.allocated_amount) > flt(d.outstanding_amount): if flt(d.allocated_amount) > flt(d.outstanding_amount):
frappe.throw(_("Row #{0}: Allocated Amount cannot be greater than outstanding amount.").format(d.idx)) frappe.throw(_("Row #{0}: Allocated Amount cannot be greater than outstanding amount.").format(d.idx))
def delink_advance_entry_references(self): def delink_advance_entry_references(self):
for reference in self.references: for reference in self.references:
if reference.reference_doctype in ("Sales Invoice", "Purchase Invoice"): if reference.reference_doctype in ("Sales Invoice", "Purchase Invoice"):
@ -128,7 +128,6 @@ class PaymentEntry(AccountsController):
self.set_missing_ref_details() self.set_missing_ref_details()
def set_missing_ref_details(self): def set_missing_ref_details(self):
for d in self.get("references"): for d in self.get("references"):
if d.allocated_amount: if d.allocated_amount:

View File

@ -14,6 +14,7 @@ from erpnext.hr.doctype.expense_claim.test_expense_claim import make_expense_cla
test_dependencies = ["Item"] test_dependencies = ["Item"]
class TestPaymentEntry(unittest.TestCase): class TestPaymentEntry(unittest.TestCase):
def test_payment_entry_against_order(self): def test_payment_entry_against_order(self):
so = make_sales_order() so = make_sales_order()
@ -65,6 +66,18 @@ class TestPaymentEntry(unittest.TestCase):
outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount")) outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount"))
self.assertEqual(outstanding_amount, 100) self.assertEqual(outstanding_amount, 100)
def test_payment_entry_against_si_multi_due_dates(self):
si = create_sales_invoice(do_not_save=1)
si.payment_terms_template = '_Test Payment Term Template'
si.insert()
si.submit()
pe = get_payment_entry(si.doctype, si.name)
pe.reference_no = "1"
pe.reference_date = "2016-01-01"
pe.insert()
pe.submit()
def test_payment_entry_against_pi(self): def test_payment_entry_against_pi(self):
pi = make_purchase_invoice(supplier="_Test Supplier USD", debit_to="_Test Payable USD - _TC", pi = make_purchase_invoice(supplier="_Test Supplier USD", debit_to="_Test Payable USD - _TC",
currency="USD", conversion_rate=50) currency="USD", conversion_rate=50)

View File

@ -569,6 +569,7 @@ def get_stock_rbnb_difference(posting_date, company):
# Amount should be credited # Amount should be credited
return flt(stock_rbnb) + flt(sys_bal) return flt(stock_rbnb) + flt(sys_bal)
def get_outstanding_invoices(party_type, party, account, condition=None): def get_outstanding_invoices(party_type, party, account, condition=None):
outstanding_invoices = [] outstanding_invoices = []
precision = frappe.get_precision("Sales Invoice", "outstanding_amount") precision = frappe.get_precision("Sales Invoice", "outstanding_amount")
@ -584,11 +585,6 @@ def get_outstanding_invoices(party_type, party, account, condition=None):
invoice_list = frappe.db.sql(""" invoice_list = frappe.db.sql("""
select select
voucher_no, voucher_type, posting_date, ifnull(sum({dr_or_cr}), 0) as invoice_amount, due_date, voucher_no, voucher_type, posting_date, ifnull(sum({dr_or_cr}), 0) as invoice_amount, due_date,
(
case when (voucher_type = 'Sales Invoice' or voucher_type = 'Purchase Invoice')
then (select due_date from `tab{invoice}` where name = voucher_no)
else posting_date end
) as due_date,
( (
select ifnull(sum({payment_dr_or_cr}), 0) select ifnull(sum({payment_dr_or_cr}), 0)
from `tabGL Entry` payment_gl_entry from `tabGL Entry` payment_gl_entry
@ -623,18 +619,24 @@ def get_outstanding_invoices(party_type, party, account, condition=None):
}, as_dict=True) }, as_dict=True)
for d in invoice_list: for d in invoice_list:
due_date = d.due_date or (frappe.db.get_value(d.voucher_type, d.voucher_no, due_date = d.due_date or (
"posting_date" if party_type=="Employee" else "due_date")) frappe.db.get_value(
outstanding_invoices.append(frappe._dict({ d.voucher_type, d.voucher_no,
"posting_date" if party_type == "Employee" else "due_date"
)
)
outstanding_invoices.append(
frappe._dict({
'voucher_no': d.voucher_no, 'voucher_no': d.voucher_no,
'voucher_type': d.voucher_type, 'voucher_type': d.voucher_type,
'due_date': d.due_date,
'posting_date': d.posting_date, 'posting_date': d.posting_date,
'invoice_amount': flt(d.invoice_amount), 'invoice_amount': flt(d.invoice_amount),
'payment_amount': flt(d.payment_amount), 'payment_amount': flt(d.payment_amount),
'outstanding_amount': flt(d.invoice_amount - d.payment_amount, precision), 'outstanding_amount': flt(d.invoice_amount - d.payment_amount, precision),
'due_date': due_date 'due_date': due_date
})) })
)
outstanding_invoices = sorted(outstanding_invoices, key=lambda k: k['due_date'] or getdate(nowdate())) outstanding_invoices = sorted(outstanding_invoices, key=lambda k: k['due_date'] or getdate(nowdate()))