Merge pull request #41607 from frappe/mergify/bp/version-15-hotfix/pr-41594

refactor: 'Payment Period Based On Invoice Date' report (backport #41594)
This commit is contained in:
ruthra kumar
2024-05-24 10:53:51 +05:30
committed by GitHub

View File

@@ -3,7 +3,9 @@
import frappe import frappe
from frappe import _ from frappe import _, qb
from frappe.query_builder import Criterion
from frappe.query_builder.functions import Abs
from frappe.utils import flt, getdate from frappe.utils import flt, getdate
from erpnext.accounts.report.accounts_receivable.accounts_receivable import ReceivablePayableReport from erpnext.accounts.report.accounts_receivable.accounts_receivable import ReceivablePayableReport
@@ -21,16 +23,12 @@ def execute(filters=None):
data = [] data = []
for d in entries: for d in entries:
invoice = invoice_details.get(d.against_voucher) or frappe._dict() invoice = invoice_details.get(d.against_voucher_no) or frappe._dict()
payment_amount = d.amount
if d.reference_type == "Purchase Invoice":
payment_amount = flt(d.debit) or -1 * flt(d.credit)
else:
payment_amount = flt(d.credit) or -1 * flt(d.debit)
d.update({"range1": 0, "range2": 0, "range3": 0, "range4": 0, "outstanding": payment_amount}) d.update({"range1": 0, "range2": 0, "range3": 0, "range4": 0, "outstanding": payment_amount})
if d.against_voucher: if d.against_voucher_no:
ReceivablePayableReport(filters).get_ageing_data(invoice.posting_date, d) ReceivablePayableReport(filters).get_ageing_data(invoice.posting_date, d)
row = [ row = [
@@ -39,11 +37,10 @@ def execute(filters=None):
d.party_type, d.party_type,
d.party, d.party,
d.posting_date, d.posting_date,
d.against_voucher, d.against_voucher_no,
invoice.posting_date, invoice.posting_date,
invoice.due_date, invoice.due_date,
d.debit, d.amount,
d.credit,
d.remarks, d.remarks,
d.age, d.age,
d.range1, d.range1,
@@ -111,8 +108,7 @@ def get_columns(filters):
"width": 100, "width": 100,
}, },
{"fieldname": "due_date", "label": _("Payment Due Date"), "fieldtype": "Date", "width": 100}, {"fieldname": "due_date", "label": _("Payment Due Date"), "fieldtype": "Date", "width": 100},
{"fieldname": "debit", "label": _("Debit"), "fieldtype": "Currency", "width": 140}, {"fieldname": "amount", "label": _("Amount"), "fieldtype": "Currency", "width": 140},
{"fieldname": "credit", "label": _("Credit"), "fieldtype": "Currency", "width": 140},
{"fieldname": "remarks", "label": _("Remarks"), "fieldtype": "Data", "width": 200}, {"fieldname": "remarks", "label": _("Remarks"), "fieldtype": "Data", "width": 200},
{"fieldname": "age", "label": _("Age"), "fieldtype": "Int", "width": 50}, {"fieldname": "age", "label": _("Age"), "fieldtype": "Int", "width": 50},
{"fieldname": "range1", "label": _("0-30"), "fieldtype": "Currency", "width": 140}, {"fieldname": "range1", "label": _("0-30"), "fieldtype": "Currency", "width": 140},
@@ -129,51 +125,68 @@ def get_columns(filters):
def get_conditions(filters): def get_conditions(filters):
ple = qb.DocType("Payment Ledger Entry")
conditions = [] conditions = []
if not filters.party_type: conditions.append(ple.delinked.eq(0))
if filters.payment_type == _("Outgoing"): if filters.payment_type == _("Outgoing"):
filters.party_type = "Supplier" conditions.append(ple.party_type.eq("Supplier"))
else: conditions.append(ple.against_voucher_type.eq("Purchase Invoice"))
filters.party_type = "Customer" else:
conditions.append(ple.party_type.eq("Customer"))
if filters.party_type: conditions.append(ple.against_voucher_type.eq("Sales Invoice"))
conditions.append("party_type=%(party_type)s")
if filters.party: if filters.party:
conditions.append("party=%(party)s") conditions.append(ple.party.eq(filters.party))
if filters.party_type:
conditions.append("against_voucher_type=%(reference_type)s")
filters["reference_type"] = (
"Sales Invoice" if filters.party_type == "Customer" else "Purchase Invoice"
)
if filters.get("from_date"): if filters.get("from_date"):
conditions.append("posting_date >= %(from_date)s") conditions.append(ple.posting_date.gte(filters.get("from_date")))
if filters.get("to_date"): if filters.get("to_date"):
conditions.append("posting_date <= %(to_date)s") conditions.append(ple.posting_date.lte(filters.get("to_date")))
return "and " + " and ".join(conditions) if conditions else "" if filters.get("company"):
conditions.append(ple.company.eq(filters.get("company")))
return conditions
def get_entries(filters): def get_entries(filters):
return frappe.db.sql( ple = qb.DocType("Payment Ledger Entry")
"""select conditions = get_conditions(filters)
voucher_type, voucher_no, party_type, party, posting_date, debit, credit, remarks, against_voucher
from `tabGL Entry` query = (
where company=%(company)s and voucher_type in ('Journal Entry', 'Payment Entry') and is_cancelled = 0 {} qb.from_(ple)
""".format(get_conditions(filters)), .select(
filters, ple.voucher_type,
as_dict=1, ple.voucher_no,
ple.party_type,
ple.party,
ple.posting_date,
Abs(ple.amount).as_("amount"),
ple.remarks,
ple.against_voucher_no,
)
.where(Criterion.all(conditions))
) )
res = query.run(as_dict=True)
return res
def get_invoice_posting_date_map(filters): def get_invoice_posting_date_map(filters):
invoice_details = {} invoice_details = {}
dt = "Sales Invoice" if filters.get("payment_type") == _("Incoming") else "Purchase Invoice" dt = (
for t in frappe.db.sql(f"select name, posting_date, due_date from `tab{dt}`", as_dict=1): qb.DocType("Sales Invoice")
if filters.get("payment_type") == _("Incoming")
else qb.DocType("Purchase Invoice")
)
res = (
qb.from_(dt)
.select(dt.name, dt.posting_date, dt.due_date)
.where((dt.docstatus.eq(1)) & (dt.company.eq(filters.get("company"))))
.run(as_dict=1)
)
for t in res:
invoice_details[t.name] = t invoice_details[t.name] = t
return invoice_details return invoice_details