我打算在Money Stack Exchange上问这个问题,但我认为,因为这更多是编程问题,所以在这里会更好。我已经尝试过从多个非程序员会计师那里寻求帮助,这是一场灾难。
我有3个模型:Account
,JournalEntry
,LineItem
category
与%i[asset liability equity income expense]
normal_balance
与%i[debit credit]
3
的通知帐户是一个对冲帐户(这是一个credit
帐户,其中资产帐户通常为debit
)side
与%i[debit credit]
amount
始终是积极的所以我在使用“相反”帐户时遇到了一些真正的困难。
我认为我的数据模型存在潜在问题。我注意到其他会计库中的许多人将amount
存储为+/-,而不存储side
。我选择将订单项的side
和amount
都存储为一个始终为正数,以便在纸上模拟现实世界中的会计(请记住,我也存储了normal_balance
个帐户,因此我比较一下。)
我知道这在数学上会稍微慢一些,但是我想让它首先运行而不会使自己过于困惑。
我之所以存储它的另一个原因是,这样在添加新交易时更加直观。帮助我的会计师同意,说+200
或-150
令人困惑,而不是说debit the sales account
。所以我可以这样写:
Transaction.create!(:debit, sales, 200)
而不是
Transaction.create!(accumulated_depreciation, -140.30)
现在的问题是我正在尝试编写一些公式来执行2个操作:
0.00
:asset balance
-({{1 }} + liability balance
+ equity balance
-income balance
))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
并未考虑到这一事实,但我不确定...
答案 0 :(得分:0)
这是我与一位会计师长时间通话后所缺少的...存储该值时,如果是对冲帐户,实际上您需要再次翻转符号。
这是我用来在每个金额上存储正确符号的功能(每个订单项调用一次)
if side == normal_balance
# do nothing
else
amount = amount * BigDecimal(-1)
end
amount = amount * BigDecimal(-1) if account.contra?
我意识到逻辑可以简化,但我想明确一点,因为它很容易让人误解