Rails: логика учета ... Создание нескольких записей одновременно - PullRequest
2 голосов
/ 03 февраля 2012

Я на самом деле пытаюсь разработать приложение учета Rails, и я застрял с логикой ...

На самом деле, я хочу упростить жизнь пользователям, пытающимся автоматизировать "грязных"дебетовые / кредитные вещи.

Допустим, у меня есть следующие поля в моей форме:

  1. Дата (хххх)
  2. Банковский счет (счет 1)
  3. Категория расходов (счет 2)
  4. Сумма (1000)

В мире бухгалтерского учета это соответствует 1 строке в журнале следующим образом: 1. Дата: xxxx Дебет:account2 Credit: account1 Сумма: 1000

Но если я воспользуюсь этой логикой, расчет и отчетность в Rails станут настоящим кошмаром ... Тогда я хочу разбить ее на 2 линии, например:

  1. Дата: xxxx Аккаунт: account2 Сумма: 1000
  2. Дата: xxxx Аккаунт: account1 Сумма: -1000

Имеет ли это смысл?Если да, единственный способ, который я нашел, это создать скрытые поля в форме, обновленной с помощью javascript, а затем сохранить записи (звучит немного неприятно на мой вкус :)) Есть ли способ справиться с этим вконтроллер для генерации 2 записей в базе данных без использования техники «полей-призраков»?

Проблема усложняется, если представить себе добавление в нее логики НДС ... Тот же пример, но с, скажем, 80 изНДС в операции ...

  1. Дата: xxxx
  2. Банковский счет: счет 1
  3. Категория расходов: счет 2
  4. Сумма (сНДС): 1000
  5. Счет НДС: счет 3
  6. Сумма НДС: 80

В бухгалтерском журнале World будет:

  1. Дата: xxxx Дебет: account2 Кредит: account1 Сумма: 1000
  2. Дата: xxxx Дебет: account3 Кредит: account1 Сумма: 80

В базе данных:

1.Date: xxxx Account: account2 Сумма: 1000

2.Date: xxxx Account: account1 Сумма:-1000

3.Дата: xxxx Аккаунт: account3 Сумма: 80

4.Дата: xxxx Аккаунт: account1 Сумма: -80

Это означает, что с "призраком"техника полей, мне нужно создать 4 скрытые линии и так далее ...

Есть ли лучший способ сделать это?

Большое спасибо за вашу помощь.

Dan

Ответы [ 5 ]

2 голосов
/ 03 февраля 2012

Вы должны сделать дополнительные записи в модели с обратным вызовом, а не в контроллере:

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 записи на соответствующих счетах.

0 голосов
/ 19 мая 2012

Я наткнулся на этот камень для бухгалтерских книг: https://github.com/mbulat/plutus

Из файла readme:

Плагин plutus предоставляет полную систему учета двойной записи для использования в любом приложении Ruby on Rails. Плагин следует общей практике ведения двойной записи. Все вычисления выполняются с использованием BigDecimal, чтобы предотвратить ошибки округления с плавающей запятой. Плагину также необходим десятичный тип в вашей базе данных.

Система состоит из таблиц, которые обслуживают ваши счета, транзакции, а также дебеты и кредиты. Каждая транзакция может иметь много дебетов и кредитов. Таблица транзакций, в которой записываются ваши бизнес-операции, - это, по сути, ваш бухгалтерский журнал.

Проводку в Главную книгу можно считать выполненной автоматически, поскольку Учетные записи имеют обратную связь has_many с кредитными или дебетовыми транзакциями.

0 голосов
/ 25 февраля 2012

Привет, ребята, и большое спасибо за вашу помощь.

Я наконец-то нашел способ решить эту проблему, используя вдохновение из ваших различных сообщений.

Что я сделал, так это добавил несколькокод на уровне модели для обработки действия after_create, например:

after_create: journalize

, тогда я определил: действие по журнализации в другом def, например:

def journalize Lignecreate ({с различными данными для создания}) end

Так что еще раз спасибо за вашу помощь.Мир Дан

0 голосов
/ 03 февраля 2012

Вы переводите сумму со счета1 (сумма списания) на счет1 (сумма кредита).Это можно сделать с помощью стандартной формы с полями для сбора account_frm, account_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
0 голосов
/ 03 февраля 2012

Это может хорошо вписаться в шаблон DCI.Это означает, что вы можете создать контекст AddToJournal, в котором роль бухгалтера добавляет расходы в журнал.Таким образом, у вас есть единственное место для логики, которое можно легко протестировать.

DCI - это совершенно новая концепция в мире Rails, поэтому нет никаких соглашений о том, как ее реализовать, но мне очень нравитсяПодход, принятый в этой статье: http://mikepackdev.com/blog_posts/24-the-right-way-to-code-dci-in-ruby

...