Skip to content

Commit

Permalink
Added sl_no in ledger entry & fixed get balance (#65)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
sameer-639 authored Apr 10, 2024
1 parent ea9e6d6 commit 08823e4
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 14 deletions.
14 changes: 12 additions & 2 deletions pyluca/ledger.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class LedgerEntry(NamedTuple):
narration: str
balance: float
event_id: Optional[str]
sl_no: Optional[int]


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

def add_entry(self, date: datetime, dr_amount: float, cr_amount: float, narration: str, event_id: Optional[str]):
def add_entry(
self,
date: datetime,
dr_amount: float,
cr_amount: float,
narration: str,
event_id: Optional[str],
sl_no: Optional[int],
):
if len(self.__entries) and date < self.__entries[-1].date:
raise InvalidLedgerEntry("Backdated entry can't be added")
balance = self.__entries[-1].balance if len(self.__entries) else 0
balance += dr_amount - cr_amount if self.balance_type == BalanceType.DEBIT else cr_amount - dr_amount
self.__entries.append(
LedgerEntry(
sl_no=sl_no,
date=date,
dr_amount=dr_amount,
cr_amount=cr_amount,
Expand All @@ -45,7 +55,7 @@ def add_entry(self, date: datetime, dr_amount: float, cr_amount: float, narratio

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

balance = 0
start, end = 0, len(self.__entries) - 1
Expand Down
30 changes: 19 additions & 11 deletions pyluca/tests/test_ledger.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

sample_ledger_entries = [
{
'sl_no': 1,
'date': datetime(2024, 3, 1),
'dr_amount': 0,
'cr_amount': 20000,
Expand All @@ -16,6 +17,7 @@
'event_id': None
},
{
'sl_no': 2,
'date': datetime(2024, 3, 2),
'dr_amount': 5000,
'cr_amount': 0,
Expand All @@ -24,6 +26,7 @@
'event_id': None
},
{
'sl_no': 3,
'date': datetime(2024, 3, 3),
'dr_amount': 3000,
'cr_amount': 0,
Expand All @@ -32,6 +35,7 @@
'event_id': None
},
{
'sl_no': 4,
'date': datetime(2024, 3, 4),
'dr_amount': 10000,
'cr_amount': 0,
Expand All @@ -40,6 +44,7 @@
'event_id': None
},
{
'sl_no': 5,
'date': datetime(2024, 3, 5),
'dr_amount': 0,
'cr_amount': 5000,
Expand All @@ -48,6 +53,7 @@
'event_id': None
},
{
'sl_no': 6,
'date': datetime(2024, 3, 6),
'dr_amount': 4000,
'cr_amount': 0,
Expand All @@ -56,6 +62,7 @@
'event_id': None
},
{
'sl_no': 7,
'date': datetime(2024, 3, 6),
'balance': 2000,
'cr_amount': 0,
Expand Down Expand Up @@ -185,27 +192,28 @@ def test_get_accounts_balance_as_of(self):

def test_account_ledger(self):
ledger = AccountLedger("Savings", BalanceType.CREDIT)
ledger.add_entry(date=datetime(2024, 3, 1), dr_amount=0, cr_amount=20000, narration="salary credited",
self.assertEqual(ledger.get_balance(), 0)
ledger.add_entry(sl_no=1, date=datetime(2024, 3, 1), dr_amount=0, cr_amount=20000, narration="salary credited",
event_id=None)
self.assertEqual(ledger.get_balance(), 20000)
self.assertEqual(ledger.get_balance(as_of=datetime(2024, 2, 29)), 0)
self.assertEqual(ledger.get_balance(as_of=datetime(2024, 3, 1)), 20000)
self.assertEqual(ledger.get_balance(as_of=datetime(2024, 3, 2)), 20000)
with self.assertRaises(InvalidLedgerEntry) as e:
ledger.add_entry(date=datetime(2024, 2, 29), dr_amount=5000, cr_amount=0, narration="loan emi",
ledger.add_entry(sl_no=2, date=datetime(2024, 2, 29), dr_amount=5000, cr_amount=0, narration="loan emi",
event_id=None)
self.assertEqual(e.exception.__str__(), "Backdated entry can't be added")
ledger.add_entry(date=datetime(2024, 3, 2), dr_amount=5000, cr_amount=0, narration="home loan emi",
ledger.add_entry(sl_no=2, date=datetime(2024, 3, 2), dr_amount=5000, cr_amount=0, narration="home loan emi",
event_id=None)
ledger.add_entry(date=datetime(2024, 3, 3), dr_amount=3000, cr_amount=0, narration="bike emi",
ledger.add_entry(sl_no=3, date=datetime(2024, 3, 3), dr_amount=3000, cr_amount=0, narration="bike emi",
event_id=None)
ledger.add_entry(date=datetime(2024, 3, 4), dr_amount=10000, cr_amount=0, narration="Rent",
ledger.add_entry(sl_no=4, date=datetime(2024, 3, 4), dr_amount=10000, cr_amount=0, narration="Rent",
event_id=None)
ledger.add_entry(date=datetime(2024, 3, 5), dr_amount=0, cr_amount=5000, narration="borrowed from friend",
ledger.add_entry(sl_no=5, date=datetime(2024, 3, 5), dr_amount=0, cr_amount=5000, narration="borrowed from friend",
event_id=None)
ledger.add_entry(date=datetime(2024, 3, 6), dr_amount=4000, cr_amount=0, narration="SIP Investment",
ledger.add_entry(sl_no=6, date=datetime(2024, 3, 6), dr_amount=4000, cr_amount=0, narration="SIP Investment",
event_id=None)
ledger.add_entry(date=datetime(2024, 3, 6), dr_amount=1000, cr_amount=0, narration="shopping",
ledger.add_entry(sl_no=7, date=datetime(2024, 3, 6), dr_amount=1000, cr_amount=0, narration="shopping",
event_id=None)
self.assertEqual(ledger.get_balance(), 2000)
self.assertEqual(ledger.get_balance(as_of=datetime(2024, 3, 2)), 15000)
Expand All @@ -217,11 +225,11 @@ def test_account_ledger(self):
self.assertEqual([entry._asdict() for entry in ledger.get_entries()], sample_ledger_entries)

ledger = AccountLedger("Asset", BalanceType.DEBIT)
ledger.add_entry(date=datetime(2024, 3, 1), dr_amount=5000, cr_amount=0, narration="lent to friend",
ledger.add_entry(sl_no=1, date=datetime(2024, 3, 1), dr_amount=5000, cr_amount=0, narration="lent to friend",
event_id=None)
ledger.add_entry(date=datetime(2024, 3, 2), dr_amount=0, cr_amount=2000, narration="received 2000",
ledger.add_entry(sl_no=2, date=datetime(2024, 3, 2), dr_amount=0, cr_amount=2000, narration="received 2000",
event_id=None)
ledger.add_entry(date=datetime(2024, 3, 3), dr_amount=3000, cr_amount=0, narration="Invested in stock",
ledger.add_entry(sl_no=3, date=datetime(2024, 3, 3), dr_amount=3000, cr_amount=0, narration="Invested in stock",
event_id=None)
self.assertEqual(ledger.get_balance(), 6000)
self.assertEqual(ledger.get_balance(as_of=datetime(2024, 2, 29)), 0)
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

setuptools.setup(
name='pyluca',
version='2.7.0',
version='2.8.0',
author='datasignstech',
author_email='[email protected]',
description='Double entry accounting system',
Expand Down

0 comments on commit 08823e4

Please sign in to comment.