mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-26 21:35:19 +00:00
fix: scope Share Balance report to the selected company
This commit is contained in:
@@ -22,7 +22,7 @@ def execute(filters=None):
|
|||||||
else:
|
else:
|
||||||
share_type, no_of_shares, rate, amount = 1, 2, 3, 4
|
share_type, no_of_shares, rate, amount = 1, 2, 3, 4
|
||||||
|
|
||||||
all_shares = get_all_shares(filters.get("shareholder"), filters.get("date"))
|
all_shares = get_all_shares(filters.get("shareholder"), filters.get("date"), filters.get("company"))
|
||||||
for share_entry in all_shares:
|
for share_entry in all_shares:
|
||||||
row = False
|
row = False
|
||||||
for datum in data:
|
for datum in data:
|
||||||
@@ -61,16 +61,35 @@ def get_columns(filters):
|
|||||||
return columns
|
return columns
|
||||||
|
|
||||||
|
|
||||||
def get_all_shares(shareholder, date):
|
def get_all_shares(shareholder, date, company=None):
|
||||||
"""Share movements for the shareholder up to (and including) `date`, signed by direction:
|
"""Share movements for the shareholder up to (and including) `date`, signed by direction:
|
||||||
shares received are positive, shares transferred/sold out are negative."""
|
shares received are positive, shares transferred/sold out are negative.
|
||||||
transfers = frappe.get_all(
|
|
||||||
"Share Transfer",
|
The shareholder and company predicates are pushed into the query so only the
|
||||||
filters={"docstatus": 1, "date": ("<=", date)},
|
relevant transfers are fetched instead of scanning the whole table."""
|
||||||
fields=["share_type", "no_of_shares", "rate", "amount", "from_shareholder", "to_shareholder"],
|
share_transfer = frappe.qb.DocType("Share Transfer")
|
||||||
order_by="date",
|
query = (
|
||||||
|
frappe.qb.from_(share_transfer)
|
||||||
|
.select(
|
||||||
|
share_transfer.share_type,
|
||||||
|
share_transfer.no_of_shares,
|
||||||
|
share_transfer.rate,
|
||||||
|
share_transfer.amount,
|
||||||
|
share_transfer.from_shareholder,
|
||||||
|
share_transfer.to_shareholder,
|
||||||
|
)
|
||||||
|
.where((share_transfer.docstatus == 1) & (share_transfer.date <= date))
|
||||||
|
.where(
|
||||||
|
(share_transfer.to_shareholder == shareholder) | (share_transfer.from_shareholder == shareholder)
|
||||||
|
)
|
||||||
|
.orderby(share_transfer.date)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if company:
|
||||||
|
query = query.where(share_transfer.company == company)
|
||||||
|
|
||||||
|
transfers = query.run(as_dict=True)
|
||||||
|
|
||||||
shares = []
|
shares = []
|
||||||
for transfer in transfers:
|
for transfer in transfers:
|
||||||
if transfer.to_shareholder == shareholder:
|
if transfer.to_shareholder == shareholder:
|
||||||
|
|||||||
@@ -42,6 +42,30 @@ class TestShareBalanceReport(ERPNextTestSuite):
|
|||||||
self.assertEqual(row[3], 10) # average rate
|
self.assertEqual(row[3], 10) # average rate
|
||||||
self.assertEqual(row[4], 1000) # amount = 100 * 10
|
self.assertEqual(row[4], 1000) # amount = 100 * 10
|
||||||
|
|
||||||
|
def test_company_filter_scopes_transfers(self):
|
||||||
|
# the transfer is booked under `_Test Company`
|
||||||
|
create_share_transfer(
|
||||||
|
transfer_type="Issue",
|
||||||
|
to_shareholder=self.shareholder,
|
||||||
|
share_type=self.share_type,
|
||||||
|
from_no=1,
|
||||||
|
to_no=100,
|
||||||
|
no_of_shares=100,
|
||||||
|
rate=10,
|
||||||
|
date="2026-06-01",
|
||||||
|
)
|
||||||
|
|
||||||
|
# matching company: the holding shows up
|
||||||
|
self.assertEqual(self.get_row(date="2026-06-05")[2], 100)
|
||||||
|
|
||||||
|
# a different company must not surface this shareholder's transfer
|
||||||
|
other_company_data = execute(
|
||||||
|
frappe._dict(
|
||||||
|
{"date": "2026-06-05", "company": "_Test Company 1", "shareholder": self.shareholder}
|
||||||
|
)
|
||||||
|
)[1]
|
||||||
|
self.assertEqual(other_company_data, [])
|
||||||
|
|
||||||
def test_balance_increases_on_second_issue(self):
|
def test_balance_increases_on_second_issue(self):
|
||||||
create_share_transfer(
|
create_share_transfer(
|
||||||
transfer_type="Issue",
|
transfer_type="Issue",
|
||||||
|
|||||||
Reference in New Issue
Block a user