четверг, октября 11, 2012

Домашняя бухгалтерия в командной строке, yet another

Сделал вот ещё одно приложение для «домашней бухгалтерии в командной строке», в стиле ledger или hledger, но лучше :)
Называется YaLedger (yet another ledger).
Код: https://gitorious.org/yaledger
README: https://gitorious.org/yaledger/yaledger/blobs/master/README.ru
Умеет:
  • Автоматический выбор корреспондирующих счетов по настраиваемым правилам, так что в большинстве случаев достаточно записывать только одну половину проводки;
  • Сверку балансов счетов — можно указать, что в данный момент на счёте такая-то сумма, и yaledger автоматически сделает проводку, чтобы его данные сходились с указанными;
  • Шаблоны проводок; периодические проводки; автоматическое выполнение проводок при определённых условиях;
  • Чтение проводок из нескольких файлов;
  • Чтение проводок из форматов CSV и HTML (выписки из телебанков);
  • Само собой, работу с разными валютами;
  • Учёт курсовой разницы (из-за разницы между курсами купли/продажи)
  • Загрузку курсов валют ЦБ РФ;
  • Умную обработку дублирующихся записей;
  • Несколько отчётов: балансы счетов, обороты по счетам итп.
Сделано на haskell, с учётом основных (моих) требований:
  • Это приложение именно для домашней бухгалтерии, так что вести журнал проводок должно быть максимально просто (например, мне лень для каждой проводки указывать два счёта).
  • Я хочу, чтобы приложение оперировало более-менее стандартными объектами бухгалтерского учёта. Ну, например, hledger не использует таких сущностей, как "дебет" или "кредит", он просто прибавляет к балансу число, которое может быть отрицательным и положительным; yaledger ведёт себя более похоже на "взрослые" системы, учитывая отдельно кредитовые и дебетовые полупроводки.
  • Мне лень, да и некогда особенно, заниматься отладкой; поэтому максимально возможное количество проверок я переложил на систему типов, а там, где в компайл-тайме особенно ничего не проверишь — сделал так, чтобы система типов заставляла меня проверять всё что можно (например, невозможно кредитовать дебетовый счёт, не сойдутся типы; а если в данном случае неизвестно, кредитовый это счёт или дебетовый, компилятор заставит явно написать проверку).
Что-то вроде документации (неполной) тут:  http://redmine.iportnov.ru/projects/yaledger/wiki.

Эту штуку я использую в течение всего периода её разработки (чуть больше месяца :)). У меня работает, но баги, конечно, возможны.

Это пока что-то типа пре-релиза. На днях допишу документацию и выложу на hackage.