5

複式簿記で取引が常に均衡していることを保証する最善の方法は何ですか?

Django で複式簿記アプリを作成しています。私はこれらのモデルを持っています:

class Account(models.Model):
    TYPE_CHOICES = (
        ('asset', 'Asset'),
        ('liability', 'Liability'),
        ('equity', 'Equity'),
        ('revenue', 'Revenue'),
        ('expense', 'Expense'),
    )

    num = models.IntegerField()
    type = models.CharField(max_length=20, choices=TYPE_CHOICES, blank=False)
    description = models.CharField(max_length=1000)


class Transaction(models.Model):
    date = models.DateField()
    description = models.CharField(max_length=1000)
    notes = models.CharField(max_length=1000, blank=True)


class Entry(models.Model):
    TYPE_CHOICES = (
        ('debit', 'Debit'),
        ('credit', 'Credit'),
    )

    transaction = models.ForeignKey(Transaction, related_name='entries')
    type = models.CharField(max_length=10, choices=TYPE_CHOICES, blank=False)
    account = models.ForeignKey(Account, related_name='entries')
    amount = models.DecimalField(max_digits=11, decimal_places=2)

モデル レベルでバランスの取れたトランザクションを適用したいのですが、適切な場所にフックがないようです。たとえば、トランザクションが最初に保存され、次に Entry.transaction ForeignKey によってエントリが追加されるため、Transaction.clean は機能しません。

admin 内でも残高チェックが機能するようにしたいと思います。現在、私は EntryInlineFormSet を管理者の残高をチェックする clean メソッドで使用していますが、これはスクリプトからトランザクションを追加する場合には役に立ちません。これを簡単にするために、モデルを変更することにオープンです。

4

2 に答える 2

2

これは非常に単純に聞こえるかもしれませんが、トランザクションごとに 2 つのレコードを作成しようとするのではなく、accounts テーブルにリンクする「to account」および「from account」の外部キーを含む単一のレコードに各トランザクションを記録しないのはなぜでしょうか? 私の見解では、「複式簿記」の本質は、取引が常にある口座から別の口座にお金を移動することだと思われます。このようなトランザクションを保存するために 2 つのレコードを使用する利点はなく、多くの欠点もあります。

于 2011-01-26T10:36:20.383 に答える
2

(こんにちはライアン! -- スティーブ・トラウゴット)

これを投稿してからしばらく経ちましたので、このパズルはもうおしまいだと思います。他の人や後世のために、私はイエスと言わなければなりません。トランザクションを分割できる必要があります。いいえ、素朴なアプローチを取り、トランザクションレッグが常にペアになると仮定したくありません。N 方向の分割を実行できる必要があります。N は 1 より大きい任意の正の整数です。Ryan はここで正しい構造を持っています。

Ryan が Entry と呼んでいるもの 私は通常、トランザクション レッグのように Leg と呼んでいます。通常、SQL データベース上で裸の Python を使用しています。私はまだ Django を使用したことがありませんが、Django が次のようなものをサポートしていないとしたら、私は驚きます (ショックを受けます)。他のソース、Transaction オブジェクトと Leg オブジェクトの両方に保存し、最終チェックを行って借方と貸方のバランスを確認し、Transaction と Legs の両方を 1 つの SQL トランザクションでデータベースにコミットします。

ライアン、それは多かれ少なかれあなたがやったことですか?

于 2012-04-01T05:33:32.127 に答える