【问题标题】:How implement billing system如何实施计费系统
【发布时间】:2013-02-21 12:57:54
【问题描述】:

我在数据库income_fundsexpenditure_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。但是我可以按周期验证余额,如果有错误我会知道它发生在这个周期。


最后一种方法最喜欢我,但也许有人可以在我的结论中给我建议或知道其他解决方案。

【问题讨论】:

  • 只是一个旁注:不要将时间戳称为“datetime”,与模块“datetime”一起使用可能会导致问题。我的建议是将它们命名为“时间戳”。

标签: database-design business-logic billing application-design web-application-design


【解决方案1】:

我认为您的设计有些问题。我会建议一些不同的东西(这里非常简化,注意我专业地构建会计软件):

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)

然后你要做的是在 journal_entry 上触发,这样 transaction_date 这里的任何条目早于 max(account_checkpoint.end_date) 都会被拒绝。通过这种方式,您可以从上一个关闭期间向前滚动并通过开放期间。这使报告变得更加容易,并最大限度地减少了您实际需要汇总的内容。

也可以为周期添加其他检查点表,因此如果企业愿意,您可以比 AP 更频繁地关闭 AR,反之亦然。通过这种方式,检查点既可以作为结束点,也可以作为您可以前滚以从中生成报告的点。

【讨论】:

    【解决方案2】:

    我想我已经在我的项目中使用了所有 3 个选项。这取决于您的项目范围和可能性,具体由您决定。

    如果您的数据库支持触发器,那么您可以使用单独的 Balance 表并在您的 *_funds 表中使用更新/插入/删除触发器来更新 Balance 表中的数据。这样可以确保无论数据如何变化,您的余额始终是正确的。我建议使用此选项。

    如果您没有大量数据并且不需要经常计算余额,那么您可以重新计算总和。恕我直言,它将传入和传出的资金存储在一张表中会更容易一些。添加指示交易方向的额外字段(交易)(1 表示收款,-1 表示费用)。然后你可以通过做来获得平衡

    SELECT SUM(amount*transaction) from funds
    

    第三,当我将数据存储在月度文件中时,我使用了过去定期余额的选项。每当创建新文件时,第一条记录就是开始余额,根据上个月的数据当场计算。当上个月的数据发生变化时,我还提供了在极少数情况下重新计算余额的可能性。当用户非常清楚自己在做什么时,这可以正常工作 - 例如在会计师知道他需要重新计算余额的会计系统中。

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多