Skip to content

Commit 08823e4

Browse files
authored
Added sl_no in ledger entry & fixed get balance (#65)
* Added sl_no in ledger entry & fixed get balance * Added account & key in ledger entry * Revert "Added account & key in ledger entry" This reverts commit 549c656. * Revert "Revert "Added account & key in ledger entry"" This reverts commit 3ed3dfb. * Revert "Revert "Revert "Added account & key in ledger entry""" This reverts commit 4222a3f. * added testcase * made sl_no optional
1 parent ea9e6d6 commit 08823e4

File tree

3 files changed

+32
-14
lines changed

3 files changed

+32
-14
lines changed

pyluca/ledger.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class LedgerEntry(NamedTuple):
1919
narration: str
2020
balance: float
2121
event_id: Optional[str]
22+
sl_no: Optional[int]
2223

2324

2425
class AccountLedger:
@@ -27,13 +28,22 @@ def __init__(self, account_name: str, balance_type: BalanceType):
2728
self.balance_type = balance_type
2829
self.__entries: List[LedgerEntry] = []
2930

30-
def add_entry(self, date: datetime, dr_amount: float, cr_amount: float, narration: str, event_id: Optional[str]):
31+
def add_entry(
32+
self,
33+
date: datetime,
34+
dr_amount: float,
35+
cr_amount: float,
36+
narration: str,
37+
event_id: Optional[str],
38+
sl_no: Optional[int],
39+
):
3140
if len(self.__entries) and date < self.__entries[-1].date:
3241
raise InvalidLedgerEntry("Backdated entry can't be added")
3342
balance = self.__entries[-1].balance if len(self.__entries) else 0
3443
balance += dr_amount - cr_amount if self.balance_type == BalanceType.DEBIT else cr_amount - dr_amount
3544
self.__entries.append(
3645
LedgerEntry(
46+
sl_no=sl_no,
3747
date=date,
3848
dr_amount=dr_amount,
3949
cr_amount=cr_amount,
@@ -45,7 +55,7 @@ def add_entry(self, date: datetime, dr_amount: float, cr_amount: float, narratio
4555

4656
def get_balance(self, as_of: Optional[datetime] = None) -> float:
4757
if as_of is None:
48-
return self.__entries[-1].balance
58+
return self.__entries[-1].balance if len(self.__entries) else 0
4959

5060
balance = 0
5161
start, end = 0, len(self.__entries) - 1

pyluca/tests/test_ledger.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
sample_ledger_entries = [
1010
{
11+
'sl_no': 1,
1112
'date': datetime(2024, 3, 1),
1213
'dr_amount': 0,
1314
'cr_amount': 20000,
@@ -16,6 +17,7 @@
1617
'event_id': None
1718
},
1819
{
20+
'sl_no': 2,
1921
'date': datetime(2024, 3, 2),
2022
'dr_amount': 5000,
2123
'cr_amount': 0,
@@ -24,6 +26,7 @@
2426
'event_id': None
2527
},
2628
{
29+
'sl_no': 3,
2730
'date': datetime(2024, 3, 3),
2831
'dr_amount': 3000,
2932
'cr_amount': 0,
@@ -32,6 +35,7 @@
3235
'event_id': None
3336
},
3437
{
38+
'sl_no': 4,
3539
'date': datetime(2024, 3, 4),
3640
'dr_amount': 10000,
3741
'cr_amount': 0,
@@ -40,6 +44,7 @@
4044
'event_id': None
4145
},
4246
{
47+
'sl_no': 5,
4348
'date': datetime(2024, 3, 5),
4449
'dr_amount': 0,
4550
'cr_amount': 5000,
@@ -48,6 +53,7 @@
4853
'event_id': None
4954
},
5055
{
56+
'sl_no': 6,
5157
'date': datetime(2024, 3, 6),
5258
'dr_amount': 4000,
5359
'cr_amount': 0,
@@ -56,6 +62,7 @@
5662
'event_id': None
5763
},
5864
{
65+
'sl_no': 7,
5966
'date': datetime(2024, 3, 6),
6067
'balance': 2000,
6168
'cr_amount': 0,
@@ -185,27 +192,28 @@ def test_get_accounts_balance_as_of(self):
185192

186193
def test_account_ledger(self):
187194
ledger = AccountLedger("Savings", BalanceType.CREDIT)
188-
ledger.add_entry(date=datetime(2024, 3, 1), dr_amount=0, cr_amount=20000, narration="salary credited",
195+
self.assertEqual(ledger.get_balance(), 0)
196+
ledger.add_entry(sl_no=1, date=datetime(2024, 3, 1), dr_amount=0, cr_amount=20000, narration="salary credited",
189197
event_id=None)
190198
self.assertEqual(ledger.get_balance(), 20000)
191199
self.assertEqual(ledger.get_balance(as_of=datetime(2024, 2, 29)), 0)
192200
self.assertEqual(ledger.get_balance(as_of=datetime(2024, 3, 1)), 20000)
193201
self.assertEqual(ledger.get_balance(as_of=datetime(2024, 3, 2)), 20000)
194202
with self.assertRaises(InvalidLedgerEntry) as e:
195-
ledger.add_entry(date=datetime(2024, 2, 29), dr_amount=5000, cr_amount=0, narration="loan emi",
203+
ledger.add_entry(sl_no=2, date=datetime(2024, 2, 29), dr_amount=5000, cr_amount=0, narration="loan emi",
196204
event_id=None)
197205
self.assertEqual(e.exception.__str__(), "Backdated entry can't be added")
198-
ledger.add_entry(date=datetime(2024, 3, 2), dr_amount=5000, cr_amount=0, narration="home loan emi",
206+
ledger.add_entry(sl_no=2, date=datetime(2024, 3, 2), dr_amount=5000, cr_amount=0, narration="home loan emi",
199207
event_id=None)
200-
ledger.add_entry(date=datetime(2024, 3, 3), dr_amount=3000, cr_amount=0, narration="bike emi",
208+
ledger.add_entry(sl_no=3, date=datetime(2024, 3, 3), dr_amount=3000, cr_amount=0, narration="bike emi",
201209
event_id=None)
202-
ledger.add_entry(date=datetime(2024, 3, 4), dr_amount=10000, cr_amount=0, narration="Rent",
210+
ledger.add_entry(sl_no=4, date=datetime(2024, 3, 4), dr_amount=10000, cr_amount=0, narration="Rent",
203211
event_id=None)
204-
ledger.add_entry(date=datetime(2024, 3, 5), dr_amount=0, cr_amount=5000, narration="borrowed from friend",
212+
ledger.add_entry(sl_no=5, date=datetime(2024, 3, 5), dr_amount=0, cr_amount=5000, narration="borrowed from friend",
205213
event_id=None)
206-
ledger.add_entry(date=datetime(2024, 3, 6), dr_amount=4000, cr_amount=0, narration="SIP Investment",
214+
ledger.add_entry(sl_no=6, date=datetime(2024, 3, 6), dr_amount=4000, cr_amount=0, narration="SIP Investment",
207215
event_id=None)
208-
ledger.add_entry(date=datetime(2024, 3, 6), dr_amount=1000, cr_amount=0, narration="shopping",
216+
ledger.add_entry(sl_no=7, date=datetime(2024, 3, 6), dr_amount=1000, cr_amount=0, narration="shopping",
209217
event_id=None)
210218
self.assertEqual(ledger.get_balance(), 2000)
211219
self.assertEqual(ledger.get_balance(as_of=datetime(2024, 3, 2)), 15000)
@@ -217,11 +225,11 @@ def test_account_ledger(self):
217225
self.assertEqual([entry._asdict() for entry in ledger.get_entries()], sample_ledger_entries)
218226

219227
ledger = AccountLedger("Asset", BalanceType.DEBIT)
220-
ledger.add_entry(date=datetime(2024, 3, 1), dr_amount=5000, cr_amount=0, narration="lent to friend",
228+
ledger.add_entry(sl_no=1, date=datetime(2024, 3, 1), dr_amount=5000, cr_amount=0, narration="lent to friend",
221229
event_id=None)
222-
ledger.add_entry(date=datetime(2024, 3, 2), dr_amount=0, cr_amount=2000, narration="received 2000",
230+
ledger.add_entry(sl_no=2, date=datetime(2024, 3, 2), dr_amount=0, cr_amount=2000, narration="received 2000",
223231
event_id=None)
224-
ledger.add_entry(date=datetime(2024, 3, 3), dr_amount=3000, cr_amount=0, narration="Invested in stock",
232+
ledger.add_entry(sl_no=3, date=datetime(2024, 3, 3), dr_amount=3000, cr_amount=0, narration="Invested in stock",
225233
event_id=None)
226234
self.assertEqual(ledger.get_balance(), 6000)
227235
self.assertEqual(ledger.get_balance(as_of=datetime(2024, 2, 29)), 0)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setuptools.setup(
44
name='pyluca',
5-
version='2.7.0',
5+
version='2.8.0',
66
author='datasignstech',
77
author_email='tech+opensource@datasignstech.com',
88
description='Double entry accounting system',

0 commit comments

Comments
 (0)