1

income_funds私はデータベースに2つのコレクションを持っていますexpenditure_funds:

income_funds
    timestamp
    amount
    status (not confirmed, confirmed, refunded)

expenditure_funds
    timestamp
    amount

現在の口座残高を取得し、使用に関するレポートを取得する必要があります。このコレクションを使用して課金ロジックを実装するにはどうすればよいでしょうか?

最も簡単な方法 (追加データなし):

  1. 口座残高を取得するにはsum(confirmed income_funds) - sum(expenditure_funds)
  2. 報告書をもらう 期間別収支資金をもらう

しかし、常に口座残高を計算しなければならないのは好きではありません。

アカウント コレクションを追加します。

accountコレクションを追加します:

account
    balance
  1. アカウントの残高を取得するにはaccount.balance
  2. 以前の方法でレポートを取得する

しかし、資金が変更された (ステータスが追加または変更された) たびに残高を変更する必要があるのは好きではありません。アカウントの残高を確認するには、常に最初の方法ですべての資金を計算する必要があります。間違えると、いつ、どのように起こったのかわかりません。

期間コレクションを追加:

periodコレクションを追加します:

period
    is_closed (yes, no)
    start_timestamp
    end_timestamp
    start_balance
    end_balance
  1. 口座残高を最後に返すperiod.end_balance
  2. 以前の方法でレポートを取得しますが、期間ごとにタイムスタンプを取得するのは簡単です

end_balance期間中に資金が変更された場合はいつでも変更する必要があります。しかし、私は期間ごとに残高を確認することができ、もし間違いがあれば、それがこの期間に起こったことを知ることができます.


最後の方法が一番気に入っていますが、誰かが私の結論でアドバイスをくれたり、他の解決策を知っているかもしれません.

4

2 に答える 2

2

あなたのデザインは少し問題があると思います。少し違うことを提案します(ここでは非常に単純化されています。私は専門的に会計ソフトウェアを構築していることに注意してください):

account (id, account_number, description, account_type)
journal (id, name, description)
journal_entry (id, journal_id, reference, description, transaction_date, memo)
journal_line (journal_entry_id, account_id, amount)
invoice (id, journal_entry_id, customer_vendor_id, duedate, terms)
invoice_line (id, invoice_id, goods_service_id, qty, sellprice, discount)
account_checkpoint (id, account_id, debits, credits, balance, end_date)

次に、トランザクション日付が max(account_checkpoint.end_date) より前のエントリが拒否されるように、journal_entry にトリガーを設定します。このようにして、最後のクローズ期間からオープン期間までロール フォワードします。これにより、レポートがはるかに簡単になり、実際に集計する必要があるものを最小限に抑えることができます。

他のチェックポイント テーブルも期間ごとに追加できるため、ビジネスで必要に応じて、AR を AP よりも頻繁にクローズしたり、その逆を行ったりすることができます。このように、チェックポイントは、クロージング ポイントとしても、ロール フォワードしてレポートを生成できるポイントとしても機能します。

于 2013-03-07T15:31:28.240 に答える
1

これまで、プロジェクトで 3 つのオプションすべてを使用してきたと思います。プロジェクトの範囲と可能性に応じて、どちらに進むかを決定するのは本当にあなた次第です。

データベースがトリガーをサポートしている場合は、別の Balance テーブルを使用して、Balance テーブルのデータを更新する *_funds テーブルに update/insert/delete トリガーを設定できます。これにより、データがどのように変化しても、残高が常に正しいことが保証されます。このオプションを使用することをお勧めします。

膨大な量のデータがなく、残高を頻繁に計算する必要がない場合は、合計を再計算できます。私見では、入金と出金の両方を 1 つのテーブルに格納すると、少しは簡単になります。トランザクションの方向を示す追加のフィールド (トランザクション) を追加します (1 は着信、1 は費用です)。次に、次のようにしてバランスをとることができます

SELECT SUM(amount*transaction) from funds

そして 3 番目に、データを毎月のファイルに保存したときに、定期的な残高を保持するオプションを使用しました。新しいファイルが作成されるたびに、最初のレコードは前月のデータからその場で計算された期首残高でした。また、前月のデータが変更された場合に、まれに残高を再計算する可能性も提供しました。これは、ユーザーが自分が何をしているかを十分に認識している場合に問題なく機能します。たとえば、会計士が残高を再計算する必要があることを知っている会計システムなどです。

于 2013-03-07T07:55:02.100 に答える