Rails:会计逻辑......一次创建多个记录

时间:2012-02-03 13:32:50

标签: ruby-on-rails modeling accounting

我实际上是在尝试开发一个会计Rails应用程序而且我坚持逻辑......

事实上,我想简化试图自动化“脏”借记/贷记内容的用户的生活。

假设我的表格中包含以下字段:

  1. 日期(xxxx)
  2. 银行帐户(帐户1)
  3. 费用类别(帐户2)
  4. 金额(1000)
  5. 在会计世界中,这对应于期刊中的1个ligne,如下所示: 1.日期:xxxx借记:account2贷记:account1金额:1000

    但如果我使用这种逻辑,计算和报告将成为Rails的噩梦...... 然后我的想法是把它分成2个lignes,如:

    1. 日期:xxxx帐户:account2金额:1000
    2. 日期:xxxx帐户:account1金额:-1000
    3. 有意义吗?如果是的话,我发现这样做的唯一方法是在javascript更新的表单中创建隐藏字段然后保存记录(听起来有点太讨厌我的味道:))有没有办法处理它控制器在数据库中生成2条记录而不使用“鬼域”技术?

      如果我们想要在其中添加增值税逻辑,问题就会变得更加复杂......同样的例子,但让我们说操作中增值税为80 ...

      1. 日期:xxxx
      2. 银行帐户:帐户1
      3. 费用类别:帐户2
      4. 金额(含增值税):1000
      5. 增值税帐户:帐户3
      6. 增值税金额:80
      7. 会计世界期刊将是:

        1. 日期:xxxx借记:account2贷记:account1金额:1000
        2. 日期:xxxx借记:account3贷记:account1金额:80
        3. 在数据库中:

          1.Date:xxxx账户:account2金额:1000

          2.Date:xxxx账户:account1金额:-1000

          3.Date:xxxx账户:account3金额:80

          4.Date:xxxx账户:account1金额:-80

          这意味着使用“ghost fields”技术,我需要创建4条隐藏线等等......

          有更好的方法吗?

          非常感谢你的帮助。

5 个答案:

答案 0 :(得分:2)

您应该使用回调在模型中创建额外的记录,而不是在控制器中:

class Journal
  # ...

  after_create :update_individual_accounts

  def update_individual_accounts
    debited_account.create_accounting_entry_with self
    credited_account.create_accounting_entry_with self
  end
end

现在,每当您添加新的Journal记录时,您还会在相应的帐户上创建两条AccountingEntry条记录。

答案 1 :(得分:0)

这可能很适合DCI模式。这意味着您可以创建一个AddToJournal上下文,其中Accountant角色会向日记帐添加费用。通过这种方式,您可以轻松测试逻辑,

DCI在Rails世界中是一个相当新的概念,所以没有关于如何实现它的约定,但我真的很喜欢本文中的方法:http://mikepackdev.com/blog_posts/24-the-right-way-to-code-dci-in-ruby

答案 2 :(得分:0)

您正在将金额从account1(借方金额)转移到account1(贷方金额)。 可以使用带有字段的标准表单来收集account_frmaccount_to& amount。在内部代码中,您将加载account_frm&的帐户对象。 account_to并转移资金,然后进行日记帐分录。

= form_tag amount_transfer_url do
  = f.select :account_frm
  = f.select :accoutn_to
  = f.text_field :amount

class AccountsController < ..
 def transfer
  account1, account2 = Account.find_all_by_id(params[:account_frm], params[:accpunt_to])
  account1.transfer(params[:amount], account2)
 end
end

class Account < ..
 def transfer(accnt2, amt)
   # here self is account1
   # make journal entries after successfull transfer
 end
end

答案 3 :(得分:0)

大家好,非常感谢你的帮助。

我终于找到了一种方法,可以通过各种帖子的灵感解决这个问题。

我所做的是在模型级别添加一些代码来处理after_create操作,如:

after_create:journalize

然后我定义了:在另一个def中记录行动:

def journalize    Ligne.create({与要创建的各种数据})    端

再次感谢您的帮助。 和平 丹

答案 4 :(得分:0)

我遇到了会计分类帐的宝石:https://github.com/mbulat/plutus

自述文件:

  

plutus插件提供了一个完整的双入口会计系统,可用于任何Ruby on Rails应用程序。该插件遵循一般双重记录簿记惯例。所有计算都使用BigDecimal完成,以防止浮点舍入错误。该插件也需要数据库的十进制类型。

     

系统由维护您的帐户,交易和借记以及信用的表组成。每笔交易都可以有很多借记和贷记。记录您的业务交易的交易表基本上是您的会计日记帐。

     

可以认为过账到分类账是自动发生的,因为账户与其信用卡或借记卡交易具有相反的has_many关系。