代码之家  ›  专栏  ›  技术社区  ›  Tallboy

复式记帐+我的代码中某处的错误=:(

  •  0
  • Tallboy  · 技术社区  · 6 年前

    我本来打算在货币堆栈交换中问这个问题,但我认为,因为这更多的是一个编程问题,所以在这里会更好。我已经试过从多个非程序员会计师那里得到帮助,但那是一场灾难。

    我有三种型号: Account , JournalEntry LineItem

    帐户

    • category %i[asset liability equity income expense]
    • normal_balance %i[debit credit]
    • ID为的通知帐户 3 是一个反向账户 credit 资产账户通常是 debit )

    account

    日记

    journal entry

    行项目

    • side %i[借方贷方]
    • amount 总是积极的

    line item


    所以我对“反向”账户有些困难。

    我认为我的数据模型有一个潜在的问题。我注意到其他会计图书馆的许多人 数量 作为+/,不储存 . 我选择存储 数量 作为一个总是正数的模型,真实世界的会计在纸上(记住我也存储 正常_平衡 所以这就是我所比较的)。

    我知道这对数学来说有点慢,但我想先让它发挥作用,而不要让它对我自己造成太大的困扰。

    我这样存储的另一个原因是,这样在添加新事务时更直观。帮助我的会计同意了 +200 -150 令人困惑而不是说 debit the sales account

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

    而不是

    Transaction.create!(accumulated_depreciation, -140.30)
    

    现在的问题是,我试图编写一些公式来执行两个操作:

    1. 0.00 : asset balance liability balance + equity balance + income balance - expense balance ))
    2. 结余一个特定的帐户(如损益表行 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 ,我总共得到一个。但如果我这样做了 余额帐户 在该类别的所有帐户上,然后将这些总数相加,我 如果我有来自对销账户的行项目,则得到相同的号码。所以有些地方出了问题。

    我的直觉告诉我 不考虑反作用,但我不确定。。。

    0 回复  |  直到 6 年前
        1
  •  0
  •   Tallboy    6 年前

    这是我和一个会计打了很长时间的电话后,我错过的。。。当你存储价值时,如果是对销账户,你实际上需要再次翻转符号。

    下面是我用来在每个金额上存储正确的符号的函数(每行项目调用一次)

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