fix: AP and AR summary

(cherry picked from commit e355dea4b5)
This commit is contained in:
Gursheen Anand
2023-07-28 14:51:28 +05:30
committed by Mergify
parent 674dba8cd7
commit 769d7d7554
3 changed files with 58 additions and 30 deletions

View File

@@ -14,6 +14,7 @@ from frappe.contacts.doctype.address.address import (
from frappe.contacts.doctype.contact.contact import get_contact_details from frappe.contacts.doctype.contact.contact import get_contact_details
from frappe.core.doctype.user_permission.user_permission import get_permitted_documents from frappe.core.doctype.user_permission.user_permission import get_permitted_documents
from frappe.model.utils import get_fetch_values from frappe.model.utils import get_fetch_values
from frappe.query_builder.functions import Date, Sum
from frappe.utils import ( from frappe.utils import (
add_days, add_days,
add_months, add_months,
@@ -883,32 +884,35 @@ def get_party_shipping_address(doctype: str, name: str) -> Optional[str]:
def get_partywise_advanced_payment_amount( def get_partywise_advanced_payment_amount(
party_type, posting_date=None, future_payment=0, company=None, party=None party_type, posting_date=None, future_payment=0, company=None, party=None, account_type=None
): ):
cond = "1=1" gle = frappe.qb.DocType("GL Entry")
query = (
frappe.qb.from_(gle)
.select(gle.party)
.where(
(gle.party_type.isin(party_type)) & (gle.against_voucher == None) & (gle.is_cancelled == 0)
)
.groupby(gle.party)
)
if account_type == "Receivable":
query = query.select(Sum(gle.credit).as_("amount"))
else:
query = query.select(Sum(gle.debit).as_("amount"))
if posting_date: if posting_date:
if future_payment: if future_payment:
cond = "(posting_date <= '{0}' OR DATE(creation) <= '{0}')" "".format(posting_date) query = query.where((gle.posting_date <= posting_date) | (Date(gle.creation) <= posting_date))
else: else:
cond = "posting_date <= '{0}'".format(posting_date) query = query.where(gle.posting_date <= posting_date)
if company: if company:
cond += "and company = {0}".format(frappe.db.escape(company)) query = query.where(gle.company == company)
if party: if party:
cond += "and party = {0}".format(frappe.db.escape(party)) query = query.where(gle.party == party)
data = frappe.db.sql( data = query.run(as_dict=True)
""" SELECT party, sum({0}) as amount
FROM `tabGL Entry`
WHERE
party_type = %s and against_voucher is null
and is_cancelled = 0
and {1} GROUP BY party""".format(
("credit") if party_type == "Customer" else "debit", cond
),
party_type,
)
if data: if data:
return frappe._dict(data) return frappe._dict(data)

View File

@@ -9,7 +9,7 @@ from erpnext.accounts.report.accounts_receivable_summary.accounts_receivable_sum
def execute(filters=None): def execute(filters=None):
args = { args = {
"party_type": "Supplier", "account_type": "Payable",
"naming_by": ["Buying Settings", "supp_master_name"], "naming_by": ["Buying Settings", "supp_master_name"],
} }
return AccountsReceivableSummary(filters).run(args) return AccountsReceivableSummary(filters).run(args)

View File

@@ -12,7 +12,7 @@ from erpnext.accounts.report.accounts_receivable.accounts_receivable import Rece
def execute(filters=None): def execute(filters=None):
args = { args = {
"party_type": "Customer", "account_type": "Receivable",
"naming_by": ["Selling Settings", "cust_master_name"], "naming_by": ["Selling Settings", "cust_master_name"],
} }
@@ -21,7 +21,10 @@ def execute(filters=None):
class AccountsReceivableSummary(ReceivablePayableReport): class AccountsReceivableSummary(ReceivablePayableReport):
def run(self, args): def run(self, args):
self.party_type = args.get("party_type") self.account_type = args.get("account_type")
self.party_type = frappe.db.get_all(
"Party Type", {"account_type": self.account_type}, pluck="name"
)
self.party_naming_by = frappe.db.get_value( self.party_naming_by = frappe.db.get_value(
args.get("naming_by")[0], None, args.get("naming_by")[1] args.get("naming_by")[0], None, args.get("naming_by")[1]
) )
@@ -35,13 +38,19 @@ class AccountsReceivableSummary(ReceivablePayableReport):
self.get_party_total(args) self.get_party_total(args)
party = None
for party_type in self.party_type:
if self.filters.get(scrub(party_type)):
party = self.filters.get(scrub(party_type))
party_advance_amount = ( party_advance_amount = (
get_partywise_advanced_payment_amount( get_partywise_advanced_payment_amount(
self.party_type, self.party_type,
self.filters.report_date, self.filters.report_date,
self.filters.show_future_payments, self.filters.show_future_payments,
self.filters.company, self.filters.company,
party=self.filters.get(scrub(self.party_type)), party=party,
account_type=self.account_type,
) )
or {} or {}
) )
@@ -57,9 +66,13 @@ class AccountsReceivableSummary(ReceivablePayableReport):
row.party = party row.party = party
if self.party_naming_by == "Naming Series": if self.party_naming_by == "Naming Series":
row.party_name = frappe.get_cached_value( if self.account_type == "Payable":
self.party_type, party, scrub(self.party_type) + "_name" doctype = "Supplier"
) fieldname = "supplier_name"
else:
doctype = "Customer"
fieldname = "customer_name"
row.party_name = frappe.get_cached_value(doctype, party, fieldname)
row.update(party_dict) row.update(party_dict)
@@ -93,6 +106,7 @@ class AccountsReceivableSummary(ReceivablePayableReport):
# set territory, customer_group, sales person etc # set territory, customer_group, sales person etc
self.set_party_details(d) self.set_party_details(d)
self.party_total[d.party].update({"party_type": d.party_type})
def init_party_total(self, row): def init_party_total(self, row):
self.party_total.setdefault( self.party_total.setdefault(
@@ -131,17 +145,27 @@ class AccountsReceivableSummary(ReceivablePayableReport):
def get_columns(self): def get_columns(self):
self.columns = [] self.columns = []
self.add_column( self.add_column(
label=_(self.party_type), label="Party Type",
fieldname="party_type",
fieldtype="Data",
width=100,
)
self.add_column(
label="Party",
fieldname="party", fieldname="party",
fieldtype="Link", fieldtype="Dynamic Link",
options=self.party_type, options="party_type",
width=180, width=180,
) )
if self.party_naming_by == "Naming Series": if self.party_naming_by == "Naming Series":
self.add_column(_("{0} Name").format(self.party_type), fieldname="party_name", fieldtype="Data") self.add_column(
label="Supplier Name" if self.account_type == "Payable" else "Customer Name",
fieldname="party_name",
fieldtype="Data",
)
credit_debit_label = "Credit Note" if self.party_type == "Customer" else "Debit Note" credit_debit_label = "Credit Note" if self.account_type == "Receivable" else "Debit Note"
self.add_column(_("Advance Amount"), fieldname="advance") self.add_column(_("Advance Amount"), fieldname="advance")
self.add_column(_("Invoiced Amount"), fieldname="invoiced") self.add_column(_("Invoiced Amount"), fieldname="invoiced")
@@ -159,7 +183,7 @@ class AccountsReceivableSummary(ReceivablePayableReport):
self.add_column(label=_("Future Payment Amount"), fieldname="future_amount") self.add_column(label=_("Future Payment Amount"), fieldname="future_amount")
self.add_column(label=_("Remaining Balance"), fieldname="remaining_balance") self.add_column(label=_("Remaining Balance"), fieldname="remaining_balance")
if self.party_type == "Customer": if self.account_type == "Receivable":
self.add_column( self.add_column(
label=_("Territory"), fieldname="territory", fieldtype="Link", options="Territory" label=_("Territory"), fieldname="territory", fieldtype="Link", options="Territory"
) )