diff --git a/accounting/management/commands/accounting_sample.py b/accounting/management/commands/accounting_sample.py index 702e0d3..4d6abc1 100644 --- a/accounting/management/commands/accounting_sample.py +++ b/accounting/management/commands/accounting_sample.py @@ -23,7 +23,7 @@ import random from django.core.management import BaseCommand, CommandParser from django.utils import timezone -from accounting.populate import Populator +from accounting.utils import Populator from mia_core.models import User diff --git a/accounting/populate.py b/accounting/populate.py deleted file mode 100644 index 08464f8..0000000 --- a/accounting/populate.py +++ /dev/null @@ -1,107 +0,0 @@ -from django.utils import timezone - -from accounting.models import Transaction, Record, Account -from mia_core.models import User -from mia_core.utils import new_sn - - -class Populator: - """The helper to populate the accounting data. - - Args: - user (User): The user in action. - - Attributes: - user (User): The user in action. - """ - user = None - - def __init__(self, user): - self.user = user - - def add_accounts(self, accounts): - """Adds accounts. - - Args: - accounts (tuple[tuple[any]]): Tuples of - (code, Traditional Chinese, English, Simplified Chinese) - of the accounts. - """ - for data in accounts: - code = data[0] - if isinstance(code, int): - code = str(code) - parent = None if len(code) == 1\ - else Account.objects.get(code=code[:-1]) - Account(sn=new_sn(Account), parent=parent, code=code, - title_zh_hant=data[1], title_en=data[2], - title_zh_hans=data[3], - created_by=self.user, updated_by=self.user).save() - - def add_transfer_transaction(self, date, debit, credit): - """Adds a transfer transaction. - - Args: - date (datetime.date|int): The date, or the number of days from - today. - debit (tuple[tuple[any]]): Tuples of (account, summary, amount) - of the debit records. - credit (tuple[tuple[any]]): Tuples of (account, summary, amount) - of the credit records. - """ - if isinstance(date, int): - date = timezone.localdate() + timezone.timedelta(days=date) - order = Transaction.objects.filter(date=date).count() + 1 - transaction = Transaction(sn=new_sn(Transaction), date=date, ord=order, - created_by=self.user, updated_by=self.user) - transaction.save() - order = 1 - for data in debit: - account = data[0] - if isinstance(account, str): - account = Account.objects.get(code=account) - elif isinstance(account, int): - account = Account.objects.get(code=str(account)) - transaction.record_set.create(sn=new_sn(Record), is_credit=False, - ord=order, account=account, - summary=data[1], amount=data[2], - created_by=self.user, - updated_by=self.user) - order = order + 1 - order = 1 - for data in credit: - account = data[0] - if isinstance(account, str): - account = Account.objects.get(code=account) - elif isinstance(account, int): - account = Account.objects.get(code=str(account)) - transaction.record_set.create(sn=new_sn(Record), is_credit=True, - ord=order, account=account, - summary=data[1], amount=data[2], - created_by=self.user, - updated_by=self.user) - order = order + 1 - - def add_income_transaction(self, date, credit): - """Adds a cash income transaction. - - Args: - date (datetime.date|int): The date, or the number of days from - today. - credit (tuple[tuple[any]]): Tuples of (account, summary, amount) of - the credit records. - """ - amount = sum([x[2] for x in credit]) - self.add_transfer_transaction(date, (("1111", None, amount),), credit) - - def add_expense_transaction(self, date, debit): - """Adds a cash income transaction. - - Args: - date (datetime.date|int): The date, or the number of days from - today. - debit (tuple[tuple[any]]): Tuples of (account, summary, amount) of - the debit records. - """ - amount = sum([x[2] for x in debit]) - self.add_transfer_transaction(date, debit, (("1111", None, amount),)) diff --git a/accounting/utils.py b/accounting/utils.py index e0a7e82..8816c87 100644 --- a/accounting/utils.py +++ b/accounting/utils.py @@ -21,9 +21,11 @@ from django.conf import settings from django.urls import reverse +from django.utils import timezone -from accounting.models import Account +from accounting.models import Account, Transaction, Record from mia_core.period import Period +from mia_core.utils import new_sn class ReportUrl: @@ -100,3 +102,105 @@ class ReportUrl: @property def balance_sheet(self): return reverse("accounting:balance-sheet", args=(self._period,)) + + +class Populator: + """The helper to populate the accounting data. + + Args: + user (User): The user in action. + + Attributes: + user (User): The user in action. + """ + user = None + + def __init__(self, user): + self.user = user + + def add_accounts(self, accounts): + """Adds accounts. + + Args: + accounts (tuple[tuple[any]]): Tuples of + (code, Traditional Chinese, English, Simplified Chinese) + of the accounts. + """ + for data in accounts: + code = data[0] + if isinstance(code, int): + code = str(code) + parent = None if len(code) == 1\ + else Account.objects.get(code=code[:-1]) + Account(sn=new_sn(Account), parent=parent, code=code, + title_zh_hant=data[1], title_en=data[2], + title_zh_hans=data[3], + created_by=self.user, updated_by=self.user).save() + + def add_transfer_transaction(self, date, debit, credit): + """Adds a transfer transaction. + + Args: + date (datetime.date|int): The date, or the number of days from + today. + debit (tuple[tuple[any]]): Tuples of (account, summary, amount) + of the debit records. + credit (tuple[tuple[any]]): Tuples of (account, summary, amount) + of the credit records. + """ + if isinstance(date, int): + date = timezone.localdate() + timezone.timedelta(days=date) + order = Transaction.objects.filter(date=date).count() + 1 + transaction = Transaction(sn=new_sn(Transaction), date=date, ord=order, + created_by=self.user, updated_by=self.user) + transaction.save() + order = 1 + for data in debit: + account = data[0] + if isinstance(account, str): + account = Account.objects.get(code=account) + elif isinstance(account, int): + account = Account.objects.get(code=str(account)) + transaction.record_set.create(sn=new_sn(Record), is_credit=False, + ord=order, account=account, + summary=data[1], amount=data[2], + created_by=self.user, + updated_by=self.user) + order = order + 1 + order = 1 + for data in credit: + account = data[0] + if isinstance(account, str): + account = Account.objects.get(code=account) + elif isinstance(account, int): + account = Account.objects.get(code=str(account)) + transaction.record_set.create(sn=new_sn(Record), is_credit=True, + ord=order, account=account, + summary=data[1], amount=data[2], + created_by=self.user, + updated_by=self.user) + order = order + 1 + + def add_income_transaction(self, date, credit): + """Adds a cash income transaction. + + Args: + date (datetime.date|int): The date, or the number of days from + today. + credit (tuple[tuple[any]]): Tuples of (account, summary, amount) of + the credit records. + """ + amount = sum([x[2] for x in credit]) + self.add_transfer_transaction(date, (("1111", None, amount),), credit) + + def add_expense_transaction(self, date, debit): + """Adds a cash income transaction. + + Args: + date (datetime.date|int): The date, or the number of days from + today. + debit (tuple[tuple[any]]): Tuples of (account, summary, amount) of + the debit records. + """ + amount = sum([x[2] for x in debit]) + self.add_transfer_transaction(date, debit, (("1111", None, amount),))