Merge pull request #3761 from nabinhait/fix1

Fixes
This commit is contained in:
Anand Doshi 2015-08-03 19:20:31 +05:30
commit e7c6605455
8 changed files with 36 additions and 22 deletions

View File

@ -58,7 +58,7 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
filters: [ filters: [
[opts[1], opts[2], "=", jvd.party], [opts[1], opts[2], "=", jvd.party],
[opts[1], "docstatus", "=", 1], [opts[1], "docstatus", "=", 1],
[opts[1], "outstanding_amount", ">", 0] [opts[1], "outstanding_amount", "!=", 0]
] ]
}; };
}); });

View File

@ -156,12 +156,10 @@ class JournalEntry(AccountsController):
.format(d.against_jv, dr_or_cr)) .format(d.against_jv, dr_or_cr))
def validate_against_sales_invoice(self): def validate_against_sales_invoice(self):
payment_against_voucher = self.validate_account_in_against_voucher("against_invoice", "Sales Invoice") self.validate_account_in_against_voucher("against_invoice", "Sales Invoice")
self.validate_against_invoice_fields("Sales Invoice", payment_against_voucher)
def validate_against_purchase_invoice(self): def validate_against_purchase_invoice(self):
payment_against_voucher = self.validate_account_in_against_voucher("against_voucher", "Purchase Invoice") self.validate_account_in_against_voucher("against_voucher", "Purchase Invoice")
self.validate_against_invoice_fields("Purchase Invoice", payment_against_voucher)
def validate_against_sales_order(self): def validate_against_sales_order(self):
payment_against_voucher = self.validate_account_in_against_voucher("against_sales_order", "Sales Order") payment_against_voucher = self.validate_account_in_against_voucher("against_sales_order", "Sales Order")
@ -183,10 +181,10 @@ class JournalEntry(AccountsController):
if d.get(against_field): if d.get(against_field):
dr_or_cr = "credit" if against_field in ["against_invoice", "against_sales_order"] \ dr_or_cr = "credit" if against_field in ["against_invoice", "against_sales_order"] \
else "debit" else "debit"
if against_field in ["against_invoice", "against_sales_order"] and flt(d.debit) > 0: if against_field == "against_sales_order" and flt(d.debit) > 0:
frappe.throw(_("Row {0}: Debit entry can not be linked with a {1}").format(d.idx, doctype)) frappe.throw(_("Row {0}: Debit entry can not be linked with a {1}").format(d.idx, doctype))
if against_field in ["against_voucher", "against_purchase_order"] and flt(d.credit) > 0: if against_field == "against_purchase_order" and flt(d.credit) > 0:
frappe.throw(_("Row {0}: Credit entry can not be linked with a {1}").format(d.idx, doctype)) frappe.throw(_("Row {0}: Credit entry can not be linked with a {1}").format(d.idx, doctype))
against_voucher = frappe.db.get_value(doctype, d.get(against_field), against_voucher = frappe.db.get_value(doctype, d.get(against_field),
@ -555,18 +553,18 @@ def get_outstanding(args):
and ifnull(against_jv, '')=''""".format(condition), args) and ifnull(against_jv, '')=''""".format(condition), args)
against_jv_amount = flt(against_jv_amount[0][0]) if against_jv_amount else 0 against_jv_amount = flt(against_jv_amount[0][0]) if against_jv_amount else 0
if against_jv_amount > 0:
return {"credit": against_jv_amount}
else:
return {"debit": -1* against_jv_amount}
elif args.get("doctype") == "Sales Invoice":
return { return {
"credit": flt(frappe.db.get_value("Sales Invoice", args["docname"], "outstanding_amount")) ("credit" if against_jv_amount > 0 else "debit"): abs(against_jv_amount)
}
elif args.get("doctype") == "Sales Invoice":
outstanding_amount = flt(frappe.db.get_value("Sales Invoice", args["docname"], "outstanding_amount"))
return {
("credit" if outstanding_amount > 0 else "debit"): abs(outstanding_amount)
} }
elif args.get("doctype") == "Purchase Invoice": elif args.get("doctype") == "Purchase Invoice":
outstanding_amount = flt(frappe.db.get_value("Purchase Invoice", args["docname"], "outstanding_amount"))
return { return {
"debit": flt(frappe.db.get_value("Purchase Invoice", args["docname"], "outstanding_amount")) ("debit" if outstanding_amount > 0 else "credit"): abs(outstanding_amount)
} }
@frappe.whitelist() @frappe.whitelist()

View File

@ -192,9 +192,9 @@ class PaymentReconciliation(Document):
.format(p.idx, p.allocated_amount, p.amount)) .format(p.idx, p.allocated_amount, p.amount))
invoice_outstanding = unreconciled_invoices.get(p.invoice_type, {}).get(p.invoice_number) invoice_outstanding = unreconciled_invoices.get(p.invoice_type, {}).get(p.invoice_number)
if abs(flt(p.allocated_amount) - invoice_outstanding) > 0.009: if flt(p.allocated_amount) - invoice_outstanding > 0.009:
frappe.throw(_("Row {0}: Allocated amount {1} must be less than or equals to invoice outstanding amount {2}") frappe.throw(_("Row {0}: Allocated amount {1} must be less than or equals to invoice outstanding amount {2}")
.format(p.idx, p.allocated_amount, unreconciled_invoices.get(p.invoice_type, {}).get(p.invoice_number))) .format(p.idx, p.allocated_amount, invoice_outstanding))
if not invoices_to_reconcile: if not invoices_to_reconcile:
frappe.throw(_("Please select Allocated Amount, Invoice Type and Invoice Number in atleast one row")) frappe.throw(_("Please select Allocated Amount, Invoice Type and Invoice Number in atleast one row"))

View File

@ -439,7 +439,7 @@ class SalesInvoice(SellingController):
if gl_entries: if gl_entries:
from erpnext.accounts.general_ledger import make_gl_entries from erpnext.accounts.general_ledger import make_gl_entries
# if POS and amount is written off, there's no outstanding and hence no need to update it # if POS and amount is written off, updating outstanding amt after posting all gl entries
update_outstanding = "No" if (cint(self.is_pos) or self.write_off_account) else "Yes" update_outstanding = "No" if (cint(self.is_pos) or self.write_off_account) else "Yes"
make_gl_entries(gl_entries, cancel=(self.docstatus == 2), make_gl_entries(gl_entries, cancel=(self.docstatus == 2),
@ -447,7 +447,8 @@ class SalesInvoice(SellingController):
if update_outstanding == "No": if update_outstanding == "No":
from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt
update_outstanding_amt(self.debit_to, "Customer", self.customer, self.doctype, self.name) update_outstanding_amt(self.debit_to, "Customer", self.customer,
self.doctype, self.return_against if cint(self.is_return) else self.name)
if repost_future_gle and cint(self.update_stock) \ if repost_future_gle and cint(self.update_stock) \
and cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): and cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):

View File

@ -136,7 +136,9 @@ def make_return_doc(doctype, source_name, target_doc=None):
"doctype": doctype + " Item", "doctype": doctype + " Item",
"fields": { "fields": {
"purchase_order": "purchase_order", "purchase_order": "purchase_order",
"purchase_receipt": "purchase_receipt" "purchase_receipt": "purchase_receipt",
"serial_no": "serial_no",
"batch_no": "batch_no"
}, },
"postprocess": update_item "postprocess": update_item
}, },

View File

@ -186,3 +186,4 @@ execute:frappe.reload_doctype("Leave Type")
execute:frappe.db.sql("update `tabLeave Type` set include_holiday=0") execute:frappe.db.sql("update `tabLeave Type` set include_holiday=0")
erpnext.patches.v5_4.set_root_and_report_type erpnext.patches.v5_4.set_root_and_report_type
erpnext.patches.v5_4.notify_system_managers_regarding_wrong_tax_calculation erpnext.patches.v5_4.notify_system_managers_regarding_wrong_tax_calculation
erpnext.patches.v5_4.fix_invoice_outstanding

View File

@ -0,0 +1,12 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import frappe
from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt
def execute():
return_entries = frappe.get_list("Sales Invoice", filters={"is_return": 1, "docstatus": 1},
fields=["debit_to", "customer", "return_against"])
for d in return_entries:
update_outstanding_amt(d.debit_to, "Customer", d.customer, "Sales Invoice", d.return_against)

View File

@ -115,7 +115,7 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten
d.get_input("fetch").on("click", function() { d.get_input("fetch").on("click", function() {
var values = d.get_values(); var values = d.get_values();
if(!values) return; if(!values) return;
values["company"] = cur_frm.doc.company;
frappe.call({ frappe.call({
method: "erpnext.manufacturing.doctype.bom.bom.get_bom_items", method: "erpnext.manufacturing.doctype.bom.bom.get_bom_items",
args: values, args: values,