commit
e7c6605455
@ -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]
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
@ -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),
|
||||||
@ -210,7 +208,7 @@ class JournalEntry(AccountsController):
|
|||||||
|
|
||||||
def validate_against_invoice_fields(self, doctype, payment_against_voucher):
|
def validate_against_invoice_fields(self, doctype, payment_against_voucher):
|
||||||
for voucher_no, payment_list in payment_against_voucher.items():
|
for voucher_no, payment_list in payment_against_voucher.items():
|
||||||
voucher_properties = frappe.db.get_value(doctype, voucher_no,
|
voucher_properties = frappe.db.get_value(doctype, voucher_no,
|
||||||
["docstatus", "outstanding_amount"])
|
["docstatus", "outstanding_amount"])
|
||||||
|
|
||||||
if voucher_properties[0] != 1:
|
if voucher_properties[0] != 1:
|
||||||
@ -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()
|
||||||
|
@ -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"))
|
||||||
|
@ -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")):
|
||||||
|
@ -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
|
||||||
},
|
},
|
||||||
|
@ -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
|
||||||
|
12
erpnext/patches/v5_4/fix_invoice_outstanding.py
Normal file
12
erpnext/patches/v5_4/fix_invoice_outstanding.py
Normal 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)
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user