рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо "рдЦреВрдиреА рдЙрджреНрдпрдо" рдХреЗ рдмрд╣реБрдд рджрд┐рд▓ рдореЗрдВ рдШреБрд╕рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ - рд▓реЗрдЦрд╛рдВрдХрдиред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдЦрд╛рддрд╛ рдмрд╣реА, рдЦрд╛рддреЛрдВ рдФрд░ рдмреИрд▓реЗрдВрд╕ рд╢реАрдЯ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВрдЧреЗ, рдЙрдирдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЧреБрдгреЛрдВ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВрдЧреЗред рд╣рдо рдкрд╛рдпрдерди рдФрд░ рдЯреЗрд╕реНрдЯ рдбреНрд░рд┐рд╡реЗрди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдо рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рд▓рдЧреЗ рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдореВрд▓ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ: рд╕реВрдЪрд┐рдпрд╛рдВ, рд╢рдмреНрджрдХреЛрд╢ рдФрд░ рдЯреНрдпреВрдкрд▓реНрд╕ред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдореНрдкрд╛рдпрд░ рдИрдЖрд░рдкреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред
рдЯрд╛рд╕реНрдХ рдХреА рд╕реНрдерд┐рддрд┐
рдЕрдВрддрд░рд┐рдХреНрд╖ ... рд╕рд╛рдореНрд░рд╛рдЬреНрдп рдХрд╛ рдЧреНрд░рд╣ ... рдкреВрд░реЗ рдЧреНрд░рд╣ рдкрд░ рдПрдХ рд░рд╛рдЬреНрдпред рдЖрдмрд╛рджреА 2 рд╕рдкреНрддрд╛рд╣ рдореЗрдВ 2 рдШрдВрдЯреЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд░рд┐рдЯрд╛рдпрд░ рд╣реЛрдиреЗ рдХреЗ 2 рд╕рд╛рд▓ рдмрд╛рджред рдЦрд╛рддреЛрдВ рдХреЗ рдЪрд╛рд░реНрдЯ рдореЗрдВ 12 рд╕реНрдерд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдЦрд╛рддреЗ 1-4 рд╕рдХреНрд░рд┐рдп рд╣реИрдВ, 5-8 рд╕рдХреНрд░рд┐рдп-рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИрдВ, 9-12 рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИрдВред рдХрдВрдкрдиреА рд╕реАрдВрдЧ рдФрд░ рдЦреБрд░ред рд╕рднреА рд▓реЗрдирджреЗрди рдПрдХ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдЕрд╡рдзрд┐ рдореЗрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕ рдЕрд╡рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЛрдИ рд╕рдВрддреБрд▓рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк
рд╣рдо рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЬреАрдердм рд╕реЗ рдХреНрд▓реЛрди рдХрд░рддреЗ рд╣реИрдВ:
git clone https://github.com/nomhoi/empire-erp.git
рд╣рдо Python 3.7.4 рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯ рдЕрдк рдХрд░реЗрдВ, рдЗрд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВ рдФрд░ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ред
pip install pytest
1. рд╕рд╛рдорд╛рдиреНрдп рдиреЗрддреГрддреНрд╡рдХрд░реНрддрд╛
Reaserch / day1 / step1 рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВред
рд▓реЗрдЦрд╛рдВрдХрди рдерд┐рдВрдХ :
DEBIT = 0 CREDIT = 1 AMOUNT = 2 class GeneralLedger(list): def __str__(self): res = '\nGeneral ledger' for e in self: res += '\n {:2} {:2} {:8.2f}'.format(e[DEBIT], e[CREDIT], e[AMOUNT]) res += "\n----------------------" return res
test_accounting.py
import pytest from accounting import * from decimal import * @pytest.fixture def ledger(): return GeneralLedger() @pytest.mark.parametrize('entries', [ [(1, 12, 100.00), (1, 11, 100.00)] ]) def test_ledger(ledger, entries): for entry in entries: ledger.append((entry[DEBIT], entry[CREDIT], Decimal(entry[AMOUNT]))) assert len(ledger) == 2 assert ledger[0][DEBIT] == 1 assert ledger[0][CREDIT] == 12 assert ledger[0][AMOUNT] == Decimal(100.00) assert ledger[1][DEBIT] == 1 assert ledger[1][CREDIT] == 11 assert ledger[1][AMOUNT] == Decimal(100.00) print(ledger)
рдореБрдЦреНрдп рдкреБрд╕реНрддрдХ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдЕрднрд┐рд▓реЗрдЦреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЬрд╛рддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдПрдХ рдЯрдкрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрди-рджреЗрди рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдЕрдм рддрдХ рд╣рдо рдбреЗрдмрд┐рдЯ рдФрд░ рдХреНрд░реЗрдбрд┐рдЯ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЦрд╛рддрд╛ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд▓реЗрдирджреЗрди рдХреА рд░рд╛рд╢рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рджрд┐рдирд╛рдВрдХ, рд╡рд┐рд╡рд░рдг рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЕрднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред
рд▓реЗрдЬрд╝рд░ рдХреБрдВрдбреА рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдг test_ledger рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдереЗ ред рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ, рд╣рдо рд▓реЗрдирджреЗрди рдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рддреБрд░рдВрдд рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ pytest -s -v рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдо рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЦрд╛рддрд╛ рдмрд╣реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд▓реЗрдирджреЗрди рдХреА рдкреВрд░реА рд╕реВрдЪреА рджреЗрдЦреЗрдВрдЧреЗ:
General ledger 1 12 100.00 1 11 100.00
2. рд▓реЗрдЦрд╛
рдЕрдм рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрдирд╡реЙрдЗрд╕ рд╕рдкреЛрд░реНрдЯ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдлрд╝реЛрд▓реНрдбрд░ day1 / step2 рдкрд░ рдЬрд╛рдПрдВ ред
рд▓реЗрдЦрд╛рдВрдХрди рдерд┐рдВрдХ :
class GeneralLedger(list): def __init__(self, accounts=None): self.accounts = accounts def append(self, entry): if self.accounts is not None: self.accounts.append_entry(entry) super().append(entry)
GeneralLedger рд╡рд░реНрдЧ рдиреЗ рдПрдкреЗрдВрдб рдкрджреНрдзрддрд┐ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред рдЬрдм рдЖрдк рдХрд┐рд╕реА рдкреБрд╕реНрддрдХ рдореЗрдВ рд▓реЗрди-рджреЗрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрд╕реЗ рддреБрд░рдВрдд рдЦрд╛рддреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
рд▓реЗрдЦрд╛рдВрдХрди рдерд┐рдВрдХ :
class Account: def __init__(self, id, begin=Decimal(0.00)): self.id = id self.begin = begin self.end = begin self.entries = [] def append(self, id, amount): self.entries.append((id, amount)) self.end += amount class Accounts(dict): def __init__(self): self.range = range(1, 13) for i in self.range: self[i] = Account(i) def append_entry(self, entry): self[entry[DEBIT]].append(entry[CREDIT], Decimal(entry[AMOUNT])) self[entry[CREDIT]].append(entry[DEBIT], Decimal(-entry[AMOUNT]))
рдПрдХ рд▓реЗрдЦрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреБрдВрдЬрд┐рдпреЛрдВ рдореЗрдВ, рдЦрд╛рддрд╛ рд╕рдВрдЦреНрдпрд╛, рдЦрд╛рддреЗ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ, рдЕрд░реНрдерд╛рддреНред рдЦрд╛рддрд╛ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдЬрд┐рд╕рдореЗрдВ рдмрджрд▓реЗ рдореЗрдВ рд╕рдВрддреБрд▓рди рдХреНрд╖реЗрддреНрд░ рдЦреЛрд▓рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рдЦрд╛рддреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓реЗрдирджреЗрди рдХреА рдПрдХ рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдбреЗрдмрд┐рдЯ рдФрд░ рдХреНрд░реЗрдбрд┐рдЯ рд▓реЗрдирджреЗрди рдХреА рд░рд╛рд╢рд┐ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИ, рдбреЗрдмрд┐рдЯ рд░рд╛рд╢рд┐ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рдЛрдг рд░рд╛рд╢рд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИред
test_accounting.py
@pytest.fixture def accounts(): return Accounts() @pytest.fixture def ledger(accounts): return GeneralLedger(accounts)
рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдордиреЗ рдЦрд╛рддреЛрдВ рдХреЗ рд▓реЙрдХ рдХреЛ рдЬреЛрдбрд╝рд╛ рдФрд░ рд▓реЗрдЬрд╝рд░ рд▓реЙрдХ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ред
test_accounting.py
@pytest.mark.parametrize('entries', [ [(1, 12, 100.00), (1, 11, 100.00)] ]) def test_accounts(accounts, ledger, entries): for entry in entries: ledger.append((entry[DEBIT], entry[CREDIT], Decimal(entry[AMOUNT]))) assert len(ledger) == 2 assert ledger[0][DEBIT] == 1 assert ledger[0][CREDIT] == 12 assert ledger[0][AMOUNT] == Decimal(100.00) assert len(accounts) == 12 assert accounts[1].end == Decimal(200.00) assert accounts[11].end == Decimal(-100.00) assert accounts[12].end == Decimal(-100.00) print(ledger) print(accounts)
рдПрдХ рдирдпрд╛ рдкрд░реАрдХреНрд╖рдг test_accounts рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред
рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦреЗрдВ:
General ledger 1 12 100.00 1 11 100.00 ---------------------- Account 1 beg: 0.00 0.00 12: 100.00 0.00 11: 100.00 0.00 end: 200.00 0.00 ---------------------- Account 11 beg: 0.00 0.00 1: 0.00 100.00 end: 0.00 100.00 ---------------------- Account 12 beg: 0.00 0.00 1: 0.00 100.00 end: 0.00 100.00 ----------------------
рдЦрд╛рддрд╛ рдФрд░ рдПрдЯреЛрдиреНрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ, __str__ рд╡рд┐рдзрд┐рдпрд╛рдВ рднреА рдЕрддрд┐рднрд╛рд░рд┐рдд рд╣реИрдВ, рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╣рддрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдФрд░ рд╢реЗрд╖ рд░рд╛рд╢рд┐ рдХреЛ рджреЛ рдХреЙрд▓рдореЛрдВ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдбреЗрдмрд┐рдЯ рдФрд░ рдХреНрд░реЗрдбрд┐рдЯред
3. рд▓реЗрдЦрд╛: рдкреЛрд╕реНрдЯрд┐рдВрдЧ рд╕рддреНрдпрд╛рдкрди
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ:
. . - .
рдЦрд╛рддрд╛ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рдХреНрд░рд┐рдп рдЦрд╛рддреЛрдВ рдкрд░ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп (рдЕрдВрддрд┐рдо рд╢реЗрд╖) рдирдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЦрд╛рддреЛрдВ рдкрд░ рдпрд╣ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдлрд╝реЛрд▓реНрдбрд░ day1 / step3 рдкрд░ рдЬрд╛рдПрдВ ред
рд▓реЗрдЦрд╛рдВрдХрди рдерд┐рдВрдХ :
class BalanceException(Exception): pass
рдПрдХ рд╢реЗрд╖ рдЬреЛрдбрд╝реЗрдВ ред
class Account: ... def is_active(self): return True if self.id < 5 else False def is_passive(self): return True if self.id > 8 else False ...
рдЦрд╛рддрд╛ рд╕рдХреНрд░рд┐рдп рд╣реИ рдпрд╛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд╛рддрд╛ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдЪреЗрдХ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред
class Accounts(dict): ... def check_balance(self, entry): if self[entry[CREDIT]].end - Decimal(entry[AMOUNT]) < 0 and self[entry[CREDIT]].is_active(): raise BalanceException('BalanceException') if self[entry[DEBIT]].end + Decimal(entry[AMOUNT]) > 0 and self[entry[DEBIT]].is_passive(): raise BalanceException('BalanceException') ...
рдпрджрд┐ рдХреЛрдИ рдирдпрд╛ рд▓реЗрди-рджреЗрди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рд╕рдХреНрд░рд┐рдп рдбреЗрдмрд┐рдЯ рдорд╛рди рд╕рдХреНрд░рд┐рдп рдЦрд╛рддреЗ рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдЦрд╛рддрд╛ рдЦрд╛рддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╣реА рдмрд╛рдд рдЕрдЧрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЦрд╛рддреЗ рдкрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдЛрдг рдорд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
class GeneralLedger(list): ... def append(self, entry): if self.accounts is not None: self.accounts.check_balance(entry) self.accounts.append_entry(entry) super().append(entry) ...
GeneralLedger рд╡рд░реНрдЧ рдореЗрдВ , рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдХреЛ рдЦрд╛рддреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЕрдкрд╡рд╛рдж рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд╛рддреЛрдВ рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЦрд╛рддрд╛ рдмрд╣реА рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИред
test_accounting.py
@pytest.mark.parametrize('entries, exception', [ ([(12, 1, 100.00)], BalanceException('BalanceException')), ([(12, 6, 100.00)], BalanceException('BalanceException')), ([(12, 11, 100.00)], BalanceException('BalanceException')), ([(6, 2, 100.00)], BalanceException('BalanceException')), #([(6, 7, 100.00)], BalanceException('BalanceException')), #([(6, 12, 100.00)], BalanceException('BalanceException')), ([(1, 2, 100.00)], BalanceException('BalanceException')), #([(1, 6, 100.00)], BalanceException('BalanceException')), #([(1, 12, 100.00)], BalanceException('BalanceException')), ]) def test_accounts_balance(accounts, ledger, entries, exception): for entry in entries: try: ledger.append((entry[DEBIT], entry[CREDIT], Decimal(entry[AMOUNT]))) except BalanceException as inst: assert isinstance(inst, type(exception)) assert inst.args == exception.args else: pytest.fail("Expected error but found none") assert len(ledger) == 0 assert len(accounts) == 12
Test_accounts_balance рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкрд░реАрдХреНрд╖рдг рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдирджреЗрди рдХреА рд╕реВрдЪреА рдиреЗ рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдФрд░ рдЙрди рд╕рднреА рд▓реЗрдирджреЗрди рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреА рдЬреЛ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдЙрдард╛рддреЗ рд╣реИрдВред рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╢реЗрд╖ 5 рдкреЛрд╕реНрдЯрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк рдПрдХ рдмреИрд▓реЗрдВрд╕рдПрдХреНрд╕ рдЕрдкрд╡рд╛рдж рдЙрдард╛рддреЗ рд╣реИрдВ ред
4. рд╕рдВрддреБрд▓рди
рдлрд╝реЛрд▓реНрдбрд░ day1 / step4 рдкрд░ рдЬрд╛рдПрдВ ред
рд▓реЗрдЦрд╛рдВрдХрди рдерд┐рдВрдХ :
class Balance(list): def __init__(self, accounts): self.accounts = accounts self.suma = Decimal(0.00) self.sump = Decimal(0.00) def create(self): self.suma = Decimal(0.00) self.sump = Decimal(0.00) for i in self.accounts.range: active = self.accounts[i].end if self.accounts[i].end >= 0 else Decimal(0.00) passive = -self.accounts[i].end if self.accounts[i].end < 0 else Decimal(0.00) self.append((active, passive)) self.suma += active self.sump += passive
рд╕рдВрддреБрд▓рди рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо рдмрд╕ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рднреА рдЦрд╛рддреЛрдВ рд╕реЗ рд╢реЗрд╖ рд░рд╛рд╢рд┐ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред
test_accounting.py
@pytest.fixture def balance(accounts): return Balance(accounts)
рдПрдХ рд╕рдВрддреБрд▓рди рдХреБрдВрдбреА рдмрдирд╛рдПрдБред
@pytest.mark.parametrize('entries', [ [ ( 1, 12, 200.00), # increase active and passive ],[ ( 1, 12, 200.00), # increase active and passive (12, 1, 100.00), # decrease passive and decrease active ],[ ( 1, 12, 300.00), # increase active and passive (12, 1, 100.00), # decrease passive and decrease active ( 2, 1, 100.00), # increase active and decrease active ],[ ( 1, 12, 300.00), # increase active and passive (12, 1, 100.00), # decrease passive and decrease active ( 2, 1, 100.00), # increase active and decrease active (12, 11, 100.00), # decrease passive and increase passive ] ]) def test_balance(accounts, ledger, balance, entries): for entry in entries: ledger.append(entry) balance.create() print(accounts) print(balance)
рд╣рдордиреЗ test_balance рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдпрд╛ред рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдирджреЗрди рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдорд╛рдирдХреЛрдВ рдХреА рд╕реВрдЪреА: рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐ рдФрд░ рджреЗрдпрддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐, рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐ рдФрд░ рджреЗрдпрддрд╛ рдореЗрдВ рдХрдореА, рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдФрд░ рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдХрдореА, рджреЗрдпрддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдФрд░ рджреЗрдпрддрд╛ рдореЗрдВ рдХрдореАред рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП 4 рд╡рд┐рдХрд▓реНрдк рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рд╣реИрдВ, рддрд╛рдХрд┐ рдЖрдк рдЪрд░рдгрдмрджреНрдз рддрд░реАрдХреЗ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦ рд╕рдХреЗрдВред рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП, рдЖрдЙрдЯрдкреБрдЯ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
General ledger 1 12 300.00 12 1 100.00 2 1 100.00 12 11 100.00 ---------------------- Account 1 beg: 0.00 0.00 12: 300.00 0.00 12: 0.00 100.00 2: 0.00 100.00 end: 100.00 0.00 ---------------------- Account 2 beg: 0.00 0.00 1: 100.00 0.00 end: 100.00 0.00 ---------------------- Account 11 beg: 0.00 0.00 12: 0.00 100.00 end: 0.00 100.00 ---------------------- Account 12 beg: 0.00 0.00 1: 0.00 300.00 1: 100.00 0.00 11: 100.00 0.00 end: 0.00 100.00 ---------------------- Balance 1 : 100.00 0.00 2 : 100.00 0.00 3 : 0.00 0.00 4 : 0.00 0.00 5 : 0.00 0.00 6 : 0.00 0.00 7 : 0.00 0.00 8 : 0.00 0.00 9 : 0.00 0.00 10 : 0.00 0.00 11 : 0.00 100.00 12 : 0.00 100.00 ---------------------- sum: 200.00 200.00 ======================
5. рдЙрд▓реНрдЯрд╛
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдЙрд▓рдЯрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
@pytest.mark.parametrize('entries', [ [ ( 1, 12, 100.00), ( 1, 12,-100.00), ] ]) def test_storno(accounts, ledger, balance, entries): for entry in entries: ledger.append(entry) balance.create() print(ledger) print(accounts) print(balance)
рдирд┐рд╖реНрдХрд░реНрд╖ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛:
General ledger 1 12 100.00 1 12 -100.00 ---------------------- Account 1 beg: 0.00 0.00 12: 100.00 0.00 12: 0.00 100.00 end: 0.00 0.00 ---------------------- Account 12 beg: 0.00 0.00 1: 0.00 100.00 1: 100.00 0.00 end: 0.00 0.00 ---------------------- Balance 1 : 0.00 0.00 2 : 0.00 0.00 3 : 0.00 0.00 4 : 0.00 0.00 5 : 0.00 0.00 6 : 0.00 0.00 7 : 0.00 0.00 8 : 0.00 0.00 9 : 0.00 0.00 10 : 0.00 0.00 11 : 0.00 0.00 12 : 0.00 0.00 ---------------------- sum: 0.00 0.00 ======================
рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИред
рдФрд░ рдпрджрд┐ рд╣рдо рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдРрд╕реЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЬрд╛рдПрдЧрд╛:
( 1, 12, 100.00), (12, 1, 100.00), ( 1, 12,-100.00),
рдФрд░ рдЕрдЧрд░ рдРрд╕рд╛ рдХреЛрдИ рд╕реЗрдЯ рд╣реИ, рддреЛ рдкрд┐рдЫрд▓реА 2 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕реНрд╡реИрдк рдХрд░реЗрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓реЗрдЧрд╛:
( 1, 12, 100.00), ( 1, 12,-100.00), (12, 1, 100.00),
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрди-рджреЗрди рд╕рд╣реА рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд░рд┐рд╡рд░реНрд╕рд▓ рдХреЛ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирд┐рд╖реНрдХрд░реНрд╖
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╣рдо рд▓реЗрдЦрд╛рдВрдХрди рдХрд╛ рдЕрдзреНрдпрдпрди рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ рдФрд░ рдЖрдИрдЬреАрдкреА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рднреА рдкрд╣рд▓реБрдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред