双重记帐+我的代码在某处= =(

时间:2019-05-11 05:54:27

标签: ruby-on-rails ruby database postgresql accounting

我打算在Money Stack Exchange上问这个问题,但我认为,因为这更多是编程问题,所以在这里会更好。我已经尝试过从多个非程序员会计师那里寻求帮助,这是一场灾难。

我有3个模型:AccountJournalEntryLineItem

帐户

  • category%i[asset liability equity income expense]
  • normal_balance%i[debit credit]
  • ID为3的通知帐户是一个对冲帐户(这是一个credit帐户,其中资产帐户通常为debit

account

JournalEntry

journal entry

LineItem

  • side%i[debit credit]
  • amount始终是积极的

line item


所以我在使用“相反”帐户时遇到了一些真正的困难。

我认为我的数据模型存在潜在问题。我注意到其他会计库中的许多人将amount存储为+/-,而不存储side。我选择将订单项的sideamount都存储为一个始终为正数,以便在纸上模拟现实世界中的会计(请记住,我也存储了normal_balance个帐户,因此我比较一下。)

我知道这在数学上会稍微慢一些,但是我想让它首先运行而不会使自己过于困惑。

我之所以存储它的另一个原因是,这样在添加新交易时更加直观。帮助我的会计师同意,说+200-150令人困惑,而不是说debit the sales account。所以我可以这样写:

Transaction.create!(:debit, sales, 200)

而不是

Transaction.create!(accumulated_depreciation, -140.30)

现在的问题是我正在尝试编写一些公式来执行2个操作:

  1. 余额类别功能,我将使用5次来计算试算表余额(即,我分别平衡所有类别并将结果插入公式中以获得0.00asset balance-({{1 }} + liability balance + equity balance-income balance))
  2. 平衡特定帐户(例如像expense balance帐户这样的损益行)

这是我执行的功能。请注意,Sales是如何不涉及考虑balance_account的。

contra

我试图获得非程序员会计师的帮助来验证这一点,但这是没有希望的。我尝试过使用它,但是对冲帐户却相当混乱,我怀疑这是否正确,即使我的试算表可以正常工作。

我写这篇文章是因为在编程时  我意识到的一份损益报告...如果我对def balance_category(category) # ... LineItem .joins(:account) .where('accounts.category = ?', category_index) .sum('CASE WHEN line_items.side = accounts.normal_balance THEN (CASE WHEN accounts.contra = false THEN line_items.amount ELSE -line_items.amount END) ELSE (CASE WHEN accounts.contra = false THEN -line_items.amount ELSE line_items.amount END) END') end def self.balance_account(account) # ... LineItem .joins(:account) .where('accounts.id = ?', account.id) .sum('CASE WHEN line_items.side = accounts.normal_balance THEN line_items.amount ELSE -line_items.amount END') end balance_category,我会得到一个总计。但是,如果我在该类别中的所有帐户上进行:asset,然后将这些总计加在一起,如果我有来自对销帐户的订单项,则我不要获得相同的数字。所以某个地方出了问题。

我的直觉是balance_account并未考虑到这一事实,但我不确定...

1 个答案:

答案 0 :(得分:0)

这是我与一位会计师长时间通话后所缺少的...存储该值时,如果是对冲帐户,实际上您需要再次翻转符号。

这是我用来在每个金额上存储正确符号的功能(每个订单项调用一次)

if side == normal_balance
  # do nothing
else
  amount = amount * BigDecimal(-1)
end

amount = amount * BigDecimal(-1) if account.contra?

我意识到逻辑可以简化,但我想明确一点,因为它很容易让人误解