Показаны сообщения с ярлыком tutorial. Показать все сообщения
Показаны сообщения с ярлыком tutorial. Показать все сообщения

понедельник, 12 июля 2010 г.

kilork.org открылся!

Рад представить общественности новый сайт kilork.org.

Что из себя представляет этот сайт? Прежде всего, это место для централизованной раздачи руководства по GnuCash. Блог был хорошей отправной точкой, kilork.org стал логичным продолжением. Свои инструменты, патчи, репозитории, статьи и прочее я буду складировать на этом ресурсе. Исходные материалы руководства доступны для свободного распространения и модификации. Это отличное место для обкатки технологий, и я буду добиваться не последних позиций в поисках за счет реальной полезности ресурса.

Добро пожаловать на kilork.org. Подписывайтесь на новости (скоро и их я приведу в порядок), скачивайте руководство, сообщайте о найденных косяках и о том, чего бы Вам хотелось увидеть еще.

понедельник, 15 марта 2010 г.

Работа с GnuCash. Часть 8. Комиссия.

UPD: Внимание! Последняя самая актуальная и полная версия руководства по GnuCash на русском языке в различных форматах доступна по адресу http://kilork.org/gnucash.html.

Один из частых вопросов, это как правильно учитывать комиссии. Подходов тут может быть несколько, в зависимости от потребностей пользователя. Рядовая ситуация: у Вас есть WebMoney и Вы выводите деньги в наличность (после чего Вами начинает активно интересоваться налоговая). Итак, какие у Вас есть варианты?

Вариант 1. Забалансовый счет.

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

Вариант 2. Счет в стандартной валюте.

Электронные деньги номинируют обычно в одной из стандартных международных валют. Это на самом деле не так, но почти так. Поэтому мы можем завести счет активов для электронных денег в его международной валюте, честно делать на этот счет переводы со счетов доходов и видеть свои полные активы весьма точно. В том случае, если нам надо вывести наличные деньги, мы делаем перевод на наличные деньги и счет расходов по комиссии (я бы воспользовался счетом банковского обслуживания в стандартной картине счетов GnuCash). Вводить такие разделенные проводки (кредит одного счета, дебет двух) можно просто двумя проводками, либо - через "Детали" (тогда будет три части в одной проводке). При любом раскладе удобства Вам будет не много, так как придется много всего вводить.

Вариант 3. Счет в новой валюте.

Мне кажется, это самый разумный вариант. Вводим электронные деньги как новую ценную бумагу. В счета доходов добавляем субсчет в новой валюте. Аналогично - в активы. Если будут расходы непосредственно в WebMoney - то и счета расходов. При переводе просто указываем курс, либо две суммы, как удобнее. Плюс, что в случае постоянной комиссии нам не надо будет ничего дополнительно вводить, достаточно будет ввести целевую сумму, остальное будет рассчитано автоматически. Единственное, не удивляйтесь, если GnuCash не сможет сделать проводку непосредственно с WebMoney на наличные. Можно делать перевод на -Сумму с наличных на WebMoney.


Надеюсь информация будет полезна. Предложения и вопросы приветствуются.

воскресенье, 6 декабря 2009 г.

Работа с GnuCash. Часть 7. Плановые проводки.

UPD: Внимание! Последняя самая актуальная и полная версия руководства по GnuCash на русском языке в различных форматах доступна по адресу http://kilork.org/gnucash.html.

Один из первых вопросов, который возникает у человека после первого знакомства с gnucash, это - а как автоматизировать получение процентов по депозиту, начислений по кредиту, налоговых отчислений, платежей за квартиру и т.п.

Итак, представим себе простейший случай. Каждый месяц 6 числа мы платим 1000 рублей за обеспечение нас Интернетом. Допустим, что мы это делаем безупречно, или это делаем не мы. Но ровно 6 числа счет оплачен. Для отражения таких проводок в gnucash предназначен механизм плановых проводок. Выбираем меню Действия->Плановые проводки->Редактор плановых проводок. Появляется закладка "Плановые проводки".



Рис 7.1. Закладка "Плановые проводки".

Выбираем создание новой проводки. В наименование вводим "Платеж за Интернет". На закладках оставляем все по умолчанию. Идем на закладку "Шаблон проводки". Здесь мы вводим нашу проводку. Только вот вводим мы каждую часть проводки отдельно. Т.е. сначала вводим кредит счета наличных на сумму 1000 рублей, а затем - дебет счета услуг интернета на 1000 рублей. В итоге получаем следующую картину:



Рис 7.2. Вводим детали шаблона проводки.

Проводка введена. Пора бы попробовать ее исполнить, тем более, сегодня как раз еще нужное нам число. Выбираем Действия->Плановые проводки->С момента последнего запуска...



Рис 7.3. Список сформированных проводок.

Все достаточно просто.

Теперь, как можно это использовать дальше? Не для простейшего случая. Тоже начисление процентов по депозиту - достаточно сложная вещь. В расчете участвует как ставка рефинансирования, так и много других параметров, как срок нахождения средств на счету, средний или наименьший остаток средств и так далее. Да, еще выходные дни, их тоже надо учитывать. Вообщем, я считаю, что к сожалению, механизм плановых проводок gnucash слабо подходит для решения таких задач. Но, для тех кто все же хочет попробовать приходят на помощь формулы. Дело в том, что вместо суммы мы можем указать формулу, которая будет расчитываться. Плюс возможно использование параметров, ну и есть возможность получить номер текущей плановой проводки. Основной недостаток - формуле тяжело получить текущее состояние счета, например (во всяком случае, я пока не знаю, как это сделать, а те, кто в рассылках gnucash про это пишут, утверждают, что это невозможно). Формулы доступные можно посмотреть в /usr/share/gnucash/scm/fin.scm. Вызывать можно формулы с префиксом gnc:, указывать их соответственно надо без этого префикса. Т.е. чтобы вызвать функцию gnc:foobar с параметром 1000 надо писать foobar(1000). Для разделения передачи нескольких параметров используется :. Естественно, определенных стандартных функций мало кому хватит. Поэтому мы создадим простейшую функцию, которая вернет разницу от переданной базы - проценты, притом мы будем передавать базу числом, а проценты - как параметр для уточнения при создании проводки. Забавно, что человек, который в рассылке gnucash отвечает на вопросы предлагал это делать в оригинальном файле. Это явно нехорошо. Мы попробуем сделать это в файле ~/.gnucash/config.user:

(define (gnc:kilork base tax) (- base tax))


Перезапускаем gnucash и снова создаем плановую проводку, но на этот раз вместо 1000 мы пишем kilork(1000,tax), где kilork - наша функция, а tax - переменная, значение которой мы пока не знаем. Хочу обратить внимание, что не получится использовать символ "-" в имени функции, хотя все тот же автор из рассылки приводит именно такой пример.



Рис 7.4. Использование функции в плановых проводках.

Вызываем создание проводок, и видим, что теперь требуется ввести значение параметра tax, чтобы наша проводка создалась:



Рис 7.5. Создание проводки с использование функции и параметров.

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

P.S. На самом деле для учета поступлений из внешних источников мне кажется неправильным использовать плановые проводки. Я вижу правильным в данном случае загрузку из online источников. Т.е. это должно выглядеть так, мы подключаемся к нашему банку, получаем выписку по счету, после чего все остатки меняются соответственно. В gnucash есть возможности online-банкинга, но в нашей стране мало банков поддерживают такой формат. Соответственно, для нас дело чести реализовать провайдеров для как можно большего числа источников, чтобы сделать мир еще чуть-чуть лучше.

вторник, 7 апреля 2009 г.

Работа с GnuCash. Часть 6. Получение котировок автоматически.

UPD: Внимание! Последняя самая актуальная и полная версия руководства по GnuCash на русском языке в различных форматах доступна по адресу http://kilork.org/gnucash.html.

Я совершенно забыл рассказать о том, как организовал ежедневное получение котировок.
Собственно, все как всегда просто, если не требовать слишком много. Хотелось бы знать, какое число пользователей gnucash - пользователи Windows. А для пользователей unix-подобных систем вполне удобен способ с использованием cron.

Итак, для получения котировок для файлика $HOME/finans без запуска gui-клиента достаточно выполнить следующую команду:
gnucash --add-price-quotes $HOME/finans


Кроме этого, нам надо бы загрузить требуемые переменные окружения, так как мы используем наши собственные модули получения котировок (Quote::Sberbank). Есть еще одна занятная особенность, связанная с установкой текущей локали: GnuCash получает котировки для той валюты, которая связана с текущей локалью. Особенность состоит в том, что при запуске cron эта переменная может оказаться и пустой. В итоге оформляем все это в виде небольшого скрипта:
kilork@phoenix ~ $ cat gnucash_fetch.sh
#!/bin/bash

if [ -z "$PERL5LIB" ]
then
PERL5LIB=~/perl/lib64/perl5/site_perl/5.8.8
else
PERL5LIB=$PERL5LIB:~/perl/lib64/perl5/site_perl/5.8.8
fi

MANPATH=$MANPATH:~/perl/share/man

export PERL5LIB MANPATH

export LANG="ru_RU.UTF-8"
export LC_ALL="ru_RU.UTF-8"
FQ_LOAD_QUOTELET="-defaults Sberbank" gnucash --add-price-quotes $HOME/finans


Уже почти все, теперь вписываем вызов этого скрипта в crontab:
kilork@phoenix ~ $ crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.XXXXbHRdTU installed on Sat Jan 10 00:36:54 2009)
# (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
55 23 *    * *    $HOME/gnucash_fetch.sh > $HOME/gnucash_fetch_log 2>&1


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

пятница, 13 февраля 2009 г.

Работа с GnuCash. Часть 5. Finance::Quote. Придание модулю Sberbank полезных функций.

UPD: Внимание! Последняя самая актуальная и полная версия руководства по GnuCash на русском языке в различных форматах доступна по адресу http://kilork.org/gnucash.html.

Для разнообразия решил писать этот пост в emacs. Несколько странно, поскольку делаю это уже где-то в 4-й раз, привыкаю к emacs, потом начинаешь пользоваться "классическим редактором", и emacs забывается. А зря. На eee есть правда существенный недостаток - справа нет ctrl, что делает пользование несколько осложненным. В четвертый раз вместо забоя пользуюсь backspace, что свидетельствует о наличии застарелых рудиментарных атавизмов, а ведь одна из главных идей emacs - отказ от лишних и утомительных движений, а тянуться к backspace между прочим очень утомительно. Все, хватит о emacs, вернемся к нашим баранчикам.

Чтобы сделать что-то полезное, зайдем на сайт Сбербанка на страничку с котировками ОМС. Текст странички сохраняем на диск. Файл с котировками в формате xls аналогично. Начнем разбираться с последним. Для работы с excel файлами используется модуль Spreadsheet::Read. Все тонкости работы с excel нам не нужны, достаточно с первой странички получить значение из ячейки с известным адресом. Делается это следующим образом:

#!/usr/bin/perl
use Spreadsheet::Read;

my $xls = ReadData("dm1002.xls");

print "$xls->[1]{'A1'}\n";


Этот код выведет первую ячейку, с первой страницы.

Нам надо существенно больше. Найти котировки счетов и вытащить цену покупки/продажи. Но простота обращения с модулем облегчит нам задачу. Теперь надо разобраться со страничкой. Если взглянуть на реализации других модулей для Finance::Quote, то можно понять, что люди предпочитают HTML::TableExtract. Нам же только вытащить ссылку с первой строчкой, так что сойдут и более простые методы. Котировки в Сбербанке идут по месяцам. Страница для января 2009 года это:

http://sbrf.ru/ru/valkprev/archive_1/index.php?year114=2009&month114=01


Получаемая страница содержит котировки с датами, идут они в обратном порядке. Пример HTML кода с котировками:

<li class="xls"><a href="/common/img/uploaded/c_list/sdmet/download/2009/01/dm0131.xls" target="_blank">31 января 2009 года</a><!-- --> (с 00 часов 00 мин.)</li>


Для отбора нам понадобится регулярное выражение. Наверно это самый сложный для понимания кусок, но к счастью, писать регулярные выражения существенно проще, чем читать. Итак, на основе предыдущего текста:

<li class="xls"><a href="(.*\/(\d{4})\/(\d{2})\/dm(\d{2})(\d{2})(?:\_\d+)?\.xls)"[^\(]*\(.+(\d{2}).+(\d{2})


Еще один кусок кода. Пора объединить все это в единое целое. В модуле Finance::Quote::Sberbank находим метод sberbank. Сейчас он имеет следующий вид:

sub sberbank {
my $quoter = shift;
my @stocks = @_;
}


Для получения текста страничек нам понадобится user agent. К счастью, он есть у нас, итак, первая строка:

my $ua = $quoter->user_agent;


Теперь можно и запросить страничку.

my $year = 2009;
my $mon = 1;
my $url = "http://sbrf.ru/ru/valkprev/archive_1/index.php?year114=${year}&month114=${mon}";
my $response = $ua->request(GET $url);


Важно стараться сделать какую-никакую, но обработку ошибок, в случае с запросом странички, стоит проверить успешность операции. А если неуспешно, нам надо правильно выставить статусы ошибок. Статусы ошибок записываются в @stocks следующим образом:
unless ($response->is_success) {
foreach my $stock (@stocks) {
$info{$stock, "success"} = 0;
$info{$stock, "errormsg"} = "HTTP failure";
}
return wantarray() ? %info : \%info;
}


Т.е. для каждого запрашиваемого инструмента ставим статус success = 0 и errormsg = HTTP failure. Какая-то обработка ошибок. Теперь надо разобрать содержимое на предмет интересующих нас ссылок:
my $link = "";
my $content = $response->content;
if($content =~ /<li class="xls"><a href="(.*\/(\d{4})\/(\d{2})\/dm(\d{2})(\d{2})(?:\_\d+)?\.xls)"[^\(]*\(.+(\d{2}).+(\d{2})/g) {
$link = $1;
}


Получили ссылку на файлик xls, теперь надо бы его получить, и наконец уже зачитать наши котировки. Единственное, надо бы определиться как мы их назовем. Например, вот так:
Золото SBRF.AU
Серебро SBRF.AG
Платина SBRF.PT
Палладий SBRF.PD


Итак, ссылка найдена, и мы получаем котировки:

if($link) {
$url = "http://sbrf.ru/".$link;
$response = $ua->request(GET $url);
unless($response->is_success) {
foreach my $stock (@stocks) {
$info{$stock, "success"} = 0;
$info{$stock, "errormsg"} = "HTTP failure";
}
return wantarray() ? %info : \%info;
}
$content = $response->content;


Загружаем его как xls-файл:

my $xls = ReadData($content);


Теперь нам надо найти начало котировок ОМС. Это место начинается со строки, определяемой следующим регулярным выражением:

/\d+\. Котировки продажи и покупки драгоценных металлов в обезличенном виде/


Пробегаем примитивным поиском:

my $start = 1;
while($xls->[1]{"A$start"} !~ /\d+\. Котировки продажи и покупки драгоценных металлов в обезличенном виде/ && $start < 100) {
$start++;
}


Определим хэш значений для поиска, в соответствии с определенными выше кодами для различных ОМС:

my %map = (
'Золото' => 'SBRF.AU',
'Серебро' => 'SBRF.AG',
'Платина' => 'SBRF.PT',
'Палладий' => 'SBRF.PD'
);


Начиная с этого момента нам осталось только пробежать по оставшимся строкам в файле, найти наши котировки и заполнить соответствующие части в info:

while($xls->[1]{"A$start"}) {
$start++;
my $name = $xls->[1]{"A$start"};
if($name) {
my $stock = $map{$name};
next unless($stock);
$info{$stock, "symbol"} = $stock;
$info{$stock, "name"} = $name;
$info{$stock, "currency"} = "RUB";
$info{$stock, "method"} = "sberbank";
$info{$stock, "bid"} = $xls->[1]{"E$start"};
$info{$stock, "ask"} = $xls->[1]{"D$start"};
$info{$stock, "last"} = $info{$stock, "bid"};
$quoter->store_date(\%info, $stock, {today => 1});
$info{$stock, "success"} = 1;
}
}


Теперь осталось только сделать тесты. Здесь на помощь приходит модуль Test::More. Открываем t/Finance-Quote-Sberbank.t и пишем там такое:

use encoding 'utf8';
use Test::More;

plan tests => 5;

use_ok('Finance::Quote');
use_ok('Finance::Quote::Sberbank');

my $quoter = Finance::Quote->new("Sberbank");

ok(defined $quoter, "created");

my %info = $quoter->fetch("sberbank", "SBRF.PD");

ok(%info, "fetched");

ok($info{"SBRF.PD", "name"}, "palladium");



Запускаем тесты в терминале и если все получилось, то видим следующее:

kilork@pantogan:~/Desktop/test/Finance-Quote-Sberbank$ make test
cp lib/Finance/Quote/Sberbank.pm blib/lib/Finance/Quote/Sberbank.pm
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/Finance-Quote-Sberbank....ok                                               
All tests successful.
Files=1, Tests=5,  1 wallclock secs ( 1.05 cusr +  0.06 csys =  1.11 CPU)


Это хорошо, теперь можно смело делать make install и запускать gnucash с загрузкой нашего свежего модуля:

kilork@pantogan:~/Desktop/test/Finance-Quote-Sberbank$ make install
Manifying blib/man3/Finance::Quote::Sberbank.3pm
Installing /home/kilork/perl/share/perl/5.8.8/Finance/Quote/Sberbank.pm
Installing /home/kilork/perl/man/man3/Finance::Quote::Sberbank.3pm
Writing /home/kilork/perl/lib/perl/5.8.8/auto/Finance/Quote/Sberbank/.packlist
Appending installation info to /home/kilork/perl/lib/perl/5.8.8/perllocal.pod
kilork@pantogan:~/Desktop/test/Finance-Quote-Sberbank$ FQ_LOAD_QUOTELET="-defaults Sberbank" gnucash
gnc.bin-Message: main: binreloc relocation support was disabled at configure time.

Found Finance::Quote version 1.15


Заходим в редактор цен, жмем "Получить котировки", убеждаемся, что все получилось:



Рис 5.1. Получение котировок новым модулем Sberbank.

В заключение, полный текст модуля и скриншот набора текста в emacs:

package Finance::Quote::Sberbank;

use 5.008008;
use strict;
use warnings;
use encoding 'utf8';

use HTTP::Request::Common;
use Spreadsheet::Read;

require Exporter;

our @ISA = qw(Exporter);

# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration use Finance::Quote::Sberbank ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' => [ qw(

) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

our @EXPORT = qw(

);

our $VERSION = '0.01';


# Preloaded methods go here.
sub methods { return ( sberbank => \&sberbank ); }

{
my @labels = qw/name last bid ask date isodate currency/;

sub labels { return ( sberbank => \@labels ); }
}

sub sberbank {
my $quoter = shift;
my @stocks = @_;
my %info;

my $ua = $quoter->user_agent;
my $year = 2009;
my $mon = 1;
my $url = "http://sbrf.ru/ru/valkprev/archive_1/index.php?year114=${year}&month114=${mon}";
my $response = $ua->request(GET $url);
unless ($response->is_success) {
foreach my $stock (@stocks) {
$info{$stock, "success"} = 0;
$info{$stock, "errormsg"} = "HTTP failure";
}
return wantarray() ? %info : \%info;
}
my $link = "";
my $content = $response->content;
if($content =~ /<li class="xls"><a href="(.*\/(\d{4})\/(\d{2})\/dm(\d{2})(\d{2})(?:\_\d+)?\.xls)"[^\(]*\(.+(\d{2}).+(\d{2})/g) {
$link = $1;
}
if($link) {
$url = "http://sbrf.ru/".$link;
$response = $ua->request(GET $url);
unless($response->is_success) {
foreach my $stock (@stocks) {
$info{$stock, "success"} = 0;
$info{$stock, "errormsg"} = "HTTP failure";
}
return wantarray() ? %info : \%info;
}
$content = $response->content;
my $xls = ReadData($content);
my $start = 1;
while($xls->[1]{"A$start"} !~ /\d+\. Котировки продажи и покупки драгоценных металлов в обезличенном виде/ && $start < 100) {
$start++;
}
my %map = (
'Золото' => 'SBRF.AU',
'Серебро' => 'SBRF.AG',
'Платина' => 'SBRF.PT',
'Палладий' => 'SBRF.PD'
);
while($xls->[1]{"A$start"}) {
$start++;
my $name = $xls->[1]{"A$start"};
if($name) {
my $stock = $map{$name};
next unless($stock);
$info{$stock, "symbol"} = $stock;
$info{$stock, "name"} = $name;
$info{$stock, "currency"} = "RUB";
$info{$stock, "method"} = "sberbank";
$info{$stock, "bid"} = $xls->[1]{"E$start"};
$info{$stock, "ask"} = $xls->[1]{"D$start"};
$info{$stock, "last"} = $info{$stock, "bid"};
$quoter->store_date(\%info, $stock, {today => 1});
$info{$stock, "success"} = 1;
}
}
}
return wantarray() ? %info : \%info;
}
1;
__END__




Рис 5.2. Набор этого поста в emacs.

Очередная часть могучего труда готова. Удачи и успехов в освоении gnucash!

пятница, 30 января 2009 г.

Работа с GnuCash. Часть 4. Finance::Quote. Разработка собственных модулей получения котировок.

UPD: Внимание! Последняя самая актуальная и полная версия руководства по GnuCash на русском языке в различных форматах доступна по адресу http://kilork.org/gnucash.html.

В предыдущей части мы вплотную подошли к необходимости автоматизировать процесс получения котировок. И gnucash предоставляет нам для этого отлично средство - Finance::Quote. Finance::Quote - это perl-модуль, и этим очень многое сказано. В комплекте поставки версии 0.15 множество разнообразных подмодулей. Но нужных нам, естественно, все равно нет. Написаны модули на perl. Множество уже в страхе будут бежать без оглядки, так как perl ассоциируется у всех с чем-то сложным и совершенно непонятным. Скажу, так оно и есть. Но в данном случае, модули очень просто написаны, откомментированы. Я убежден, что для того, чтобы написать собственный модуль под Finance::Quote нужны минимальные познания в программировании, не требуется глубокое знание perl, и нужно только желание достичь цели. В состав Finance::Quote входит документация о разработке собственных модулей получения котировок. Используя это руководство мы сделаем простой модуль для получения котировок ОМС Сбербанка. Процесс создания разобьем на шаги. Начнем с того, что у нашего пользователя нет опыта работы с perl. Прекрасно, тогда переходим к созданию нашего модуля для новичков в perl.

Создание модуля.

Мне кажется, очень много для популярности того или иного языка делают вовсе не его качества именно как языка, а какие-то маленькие удобные фенечки, или большие удобные фенечки. В perl главная большая удобная фенечка - это CPAN, гигантский архив готовых модулей, которые ставятся через единый интерфейс, с зависимостями, тестами, и прочим. Очень большая удобная фенечка. Есть фенечки поменьше. Например, утилитки для генерации каркаса модуля. Открываем терминал, идем в папочку проектов (у себя назову ее ~/Desktop/test):

kilork@pantogan:~$ mkdir Desktop/test
kilork@pantogan:~$ cd Desktop/test
kilork@pantogan:~/Desktop/test$ 


Надо определиться с названием. Я обычно весьма много времени трачу на придумывание названия. Как говорил небезизвестный персонаж, как вы яхту назовете, так она и поплывет. Поэтому название надо очень тщательно выбирать. Наш модуль будет жить в пространстве имен Finance::Quote и относится к Сбербанку, назовем его Finance::Quote::Sberbank. Итак, воспользуемся командой h2xs:

kilork@pantogan:~/Desktop/test$ h2xs -AX -n Finance::Quote::Sberbank
Defaulting to backwards compatibility with perl 5.8.8
If you intend this module to be compatible with earlier perl versions, please
specify a minimum perl version with the -b option.

Writing Finance-Quote-Sberbank/lib/Finance/Quote/Sberbank.pm
Writing Finance-Quote-Sberbank/Makefile.PL
Writing Finance-Quote-Sberbank/README
Writing Finance-Quote-Sberbank/t/Finance-Quote-Sberbank.t
Writing Finance-Quote-Sberbank/Changes
Writing Finance-Quote-Sberbank/MANIFEST


Как видно, одна маленькая команда насоздавала нам множество файликов. Один, очевидно, сам каркас модуля. Затем идет генератор Makefile'ов. Файлик с README, файлик тестов. Лог изменений Changes. И MANIFEST. Чудеса, да и только, почти вся работа сделана за нас этой маленькой чудесной командой. Главное - не давать никому знать об этом.

Сгенерируем Makefile. Укажем дополнительный параметр, говорящий о нашем желании ставить модули в локальную директорию пользователя.

kilork@pantogan:~/Desktop/test/Finance-Quote-Sberbank$ perl Makefile.PL PREFIX=~/perl
Checking if your kit is complete...
Looks good
Writing Makefile for Finance::Quote::Sberbank


Отлично, теперь мы можем собирать, тестировать, инсталлировать, и собирать дистрибутив следующими простыми командами:

kilork@pantogan:~/Desktop/test/Finance-Quote-Sberbank$ make # собираем
cp lib/Finance/Quote/Sberbank.pm blib/lib/Finance/Quote/Sberbank.pm
Manifying blib/man3/Finance::Quote::Sberbank.3pm

kilork@pantogan:~/Desktop/test/Finance-Quote-Sberbank$ make test # тестируем
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/Finance-Quote-Sberbank....ok                                               
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.08 cusr +  0.01 csys =  0.09 CPU)

kilork@pantogan:~/Desktop/test/Finance-Quote-Sberbank$ make install # инсталлируем
Installing /home/kilork/perl/share/perl/5.8.8/Finance/Quote/Sberbank.pm
Installing /home/kilork/perl/man/man3/Finance::Quote::Sberbank.3pm
Writing /home/kilork/perl/lib/perl/5.8.8/auto/Finance/Quote/Sberbank/.packlist
Appending installation info to /home/kilork/perl/lib/perl/5.8.8/perllocal.pod

kilork@pantogan:~/Desktop/test/Finance-Quote-Sberbank$ make dist # собираем дистрибутив
rm -rf Finance-Quote-Sberbank-0.01
/usr/bin/perl "-MExtUtils::Manifest=manicopy,maniread" \
-e "manicopy(maniread(),'Finance-Quote-Sberbank-0.01', 'best');"
mkdir Finance-Quote-Sberbank-0.01
mkdir Finance-Quote-Sberbank-0.01/lib
mkdir Finance-Quote-Sberbank-0.01/lib/Finance
mkdir Finance-Quote-Sberbank-0.01/lib/Finance/Quote
mkdir Finance-Quote-Sberbank-0.01/t
Generating META.yml
tar cvf Finance-Quote-Sberbank-0.01.tar Finance-Quote-Sberbank-0.01
Finance-Quote-Sberbank-0.01/
Finance-Quote-Sberbank-0.01/MANIFEST
Finance-Quote-Sberbank-0.01/lib/
Finance-Quote-Sberbank-0.01/lib/Finance/
Finance-Quote-Sberbank-0.01/lib/Finance/Quote/
Finance-Quote-Sberbank-0.01/lib/Finance/Quote/Sberbank.pm
Finance-Quote-Sberbank-0.01/t/
Finance-Quote-Sberbank-0.01/t/Finance-Quote-Sberbank.t
Finance-Quote-Sberbank-0.01/Changes
Finance-Quote-Sberbank-0.01/README
Finance-Quote-Sberbank-0.01/Makefile.PL
Finance-Quote-Sberbank-0.01/META.yml
rm -rf Finance-Quote-Sberbank-0.01
gzip --best Finance-Quote-Sberbank-0.01.tar


Команд немного, все очень просто, на текущем этапе нам понадобятся команды make и make test. Затем make install, если надо будет использовать модуль из gnucash или других программ, и наконец - make dist, если нам вдруг захочется все это дело выложить на CPAN (мне захотелось, можно поискать Sberbank на http://search.cpan.org).

Каркас модуля мы создали, подготовили среду к сборке и тестированию, приступаем к реализации модуля для Finance::Quote.

Реализация модуля для Finance::Quote.

Открываем Sberbank.pm в нашем любимом текстовом редакторе. Текст снабжен неплохими комментариями, так что понятно назначение той или иной секции в сгенерированном файле. Нам надо удалить все лишнее, и реализовать методы для Finance::Quote. Самое забавное, что реализуя модуль под Finance::Quote нам вовсе не надо что-то знать о Finance::Quote, не надо даже упоминать ее в нашем модуле. Достаточно поддержать нужный интерфейс и подложить модуль в правильное место.

Находим строку "# Preloaded methods go here.". Отсюда мы и начнем определять наши методы. Первый метод, который нам понадобится, это метод methods. Этот метод будет вызван Finance::Quote для получения списка нестандартных методов, определяемых нашим модулем. Это как раз та строчка, которую мы увидим, когда подключим наш модуль в gnucash. Кроме этого нам понадобится метод, который вернет список поддерживаемых нами атрибутов labels, ну и собственно, главный метод, в котором мы и будем лазить на сайт Sberbank'а, и забивать значения атрибутов. Пока определим только стандартные методы, и пустышку для главного метода. Вот, что у меня получилось:

sub methods { return ( sberbank => \&sberbank ); }

{
my @labels = qw/name last bid ask date isodate currency/;

sub labels { return ( sberbank => \@labels ); }
}

sub sberbank {
my $quoter = shift;
my @stocks = @_;
}


Получился метод sberbank с двумя параметрами, загадочный $quoter, и не менее загадочные @stocks. Метод ничего не возвращает, а вообще говоря - должен. Тем не менее, это уже вполне минимально подходящий для использования модуль Finance::Quote.

Делаем make, make test, make install. Запускаем gnucash командой:
kilork@pantogan:~/Desktop$ FQ_LOAD_QUOTELET="-defaults Sberbank" gnucash


У меня открылся наш последний пример из 3-й части руководства. Есть золото, но котировки надо вбивать руками. Теперь мы попробуем настроить получение котировок с помощью нашего новомодного модуля. Пустышки правда пока.

Идем в редактор ценных бумаг, находим там наше золото, выбираем "Правка", на открывающеся форме настройки ставим галочку "Получить онлайн котировки", устанавливаем радио-переключатель в положение "Неизвестный", в выпадающем списке находим "sberbank" и выбираем. Жмем "Ок".



Рис 4.1. Настройка получения онлайн котировок.

Мы подключили наш модуль к нашему инструменту - золоту. Теперь убедимся, что пока ничего не работает. Идем в редактор цен, жмем "Получить котировки", получаем вполне ожиаемый результат.



Рис 4.2. Получение котировок с новым "пустым" модулем приводит к ошибке.

Уже чего-то мы достигли, наш модуль виден gnucash, и выдает даже какую-то ошибку при попытке запроса. В следующей части мы постараемся научить его делать более полезные вещи.

понедельник, 26 января 2009 г.

Работа с GnuCash. Часть 3. Ценные бумаги, драгоценности и слитки.

UPD: Внимание! Последняя самая актуальная и полная версия руководства по GnuCash на русском языке в различных форматах доступна по адресу http://kilork.org/gnucash.html.

Снова возвращаемся к нашей славной программе. До этого мы получили очень неплохие результаты, завели счета, в разных валютах, сделали переводы. Что же теперь? Для меня интереснее всего знать текущее распределение активов. Но валюта - это во первых очень медленный инструмент, а во вторых, для не спекулянта - не особо доходный, а может даже убыточный. Хочется чего то другого. Может быть купить акций, войти в паевые фонды, купить драгоценные металлы, или мешок угля. Кстати, срок хранения сахара - не имеет ограничений, можно и его купить, и тем самым сберечь деньги гораздо лучше, чем в депозите. У меня не хватает времени ни на внутридневную торговлю, ни даже на дневную. Иногда времени нет даже на недельном интервале. В таких условиях инвестиции долгосрочные, и дергаться смысла нет. Но следить за общей массой активов все равно хочется. Пришло время gnucash.

Одним из простых способов инвестирования является открытие металлических счетов. Все просто и понятно, купили золото сегодня, продали золото завтра, цена на золото приятным образом связана с огромным количеством факторов, которые рассматривать здесь совершенно бесполезно. Если цена продажи оказалась выше цены покупки - имеем доход. В противном случае - убыток. Цена задается в рублях, так что имеет смысл еще и учитывать цену в долларах, и движение курса рубля к доллару. Итак, мы пошли в Сбербанк, и открыли ОМС счет в золоте, закинули на него нажитые непосильным трудом денежки, в итоге получили 60 грамм на счету. Как теперь все это занести в gnucash? Такой валюты у нас нет, да и к чему привязываться тоже непонятно. Оказывается, никаких проблем нет, нам надо завести еще один счет, и на этот раз номинировать его не в валюте, а в граммах, и на эти граммы установить стоимость.

Начальная конфигурации состоит из 100000 р наличных, мы создаем счет в долларах, переводим туда 32500 рублей по курсу 32.50. Итого 1000 долларов и 67500 рублей. Теперь попробуем добавить сюда золото.

Выбирем Активы->Текущие активы. Выбираем создать новый счет. В типе счета выбираем "Ценные бумаги".



Рис 3.1. Добавление счета для золота.

Жмем "Выбрать..." для валюты счета. В типе указываем "FUND". Жмем на "New" - такого вида ценностей у нас еще нет. Вводим следующие параметры:



Рис 3.2. Параметры для типа ценности "Золото в Сбербанке".

Обязательно надо указать Символ/Аббревиатуру, тут указываем "SBRF.AU". Так как меньше грамма нам не продадут: часть для продажи - 1. Заканчиваем со вводом параметров, новый счет добавлен, пока на нем ничего нет.



Рис 3.3. Общий список счетов с новым "золотым" счетом.

Вызываем диалог перевода, и со счета наличных рублей переводим 50000, на сумму 60. Т.е. получаем наши заветные 60 грамм золота.



Рис 3.4. Перевод средств на "золотой" счет.

Еще раз посмотрим на общий список счетов после перевода средств на золотой счет. Видно, что общая сумма по прежнему 100000 рублей. Хотя наличности у нас осталось совсем немного.



Рис 3.5. Общий список счетов после перевода средств на "золотой" счет.

Ну это ненадолго, пришло время вернуться в реальный мир. Идем в редактор цен.



Рис 3.6. Редактор цен с ценами обмена золота и долларов на рубли.

Жмем "Получить котировки...". Как и ожидалось, пришли новые котировки. Но, естественно, только для стандартного доллара.



Рис 3.7. Редактор цен с ценами обмена золота и долларов на рубли после получения новых котировок.

Закрываем до поры редактор цен (ненадолго). Видим, что с новыми ценами наши активы уже немного подросли.



Рис 3.8. Общий список счетов после получения новых котировок.

Но это не полная информация. Ведь котировок по золоту нет. Придется добавить их вручную. Снова идем в редактор цен. Жмем "+Add" (чудеса локализации). Находим нашу ценную бумагу через "Выбрать...".



Рис 3.9. Выбор ценной бумаги при добавлении котировок.

Валюта "RUB". Тип выбираем "Последний". Цена будет 900.



Рис 3.10. Ввод котировок.

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



Рис 3.11. Вид редактора цен после ввода котировок.

Теперь мы можем начинать пользоваться отчетами, которые работают исключительно с ценными бумагами. Например, отчет по портфелю.



Рис 3.12. Отчет по портфелю.

Здесь мы видим и отражение по стоимости, и начальную стоимость, и процентное изменение - все, что нам нужно.

Ну и наконец, общий вид счетов после всех манипуляций.



Рис 3.13. Окончательный вид счетов.

Все видно как в начальной валюте (ценности), так и итоговой суммой. В выпадающем списке снизу экрана можно посмотреть прибыли и текущее состояние в разрезе по ценностям, что тоже достаточно удобно. Неудобно вводить котировки руками. Эту проблему мы и научимся решать в следующей части.

понедельник, 19 января 2009 г.

Logitech QuickCam E2500 - оживляем всевидящее око...

Прокопавшись по форумам нашел нужную информацию для запуска этого устройства. Теперь спешу поделиться с Вами.

Итак, используем поставляемый в ядре 2.6.28 драйвер gspca. Только придется его чуток пропатчить. Всего навсего прописываем идентификатор нашей камерки.

kilork@phoenix ~ $ diff -u /usr/src/linux/drivers/media/video/gspca/zc3xx.c~ /usr/src/linux/drivers/media/video/gspca/zc3xx.c
--- /usr/src/linux/drivers/media/video/gspca/zc3xx.c~ 2008-12-25 02:26:37.000000000 +0300
+++ /usr/src/linux/drivers/media/video/gspca/zc3xx.c 2009-01-19 01:21:08.000000000 +0300
@@ -7530,6 +7530,7 @@
{USB_DEVICE(0x0458, 0x700c)},
{USB_DEVICE(0x0458, 0x700f)},
{USB_DEVICE(0x0461, 0x0a00)},
+ {USB_DEVICE(0x046d, 0x089d), .driver_info = SENSOR_MC501CB},
{USB_DEVICE(0x046d, 0x08a0)},
{USB_DEVICE(0x046d, 0x08a1)},
{USB_DEVICE(0x046d, 0x08a2)},


Пересобираем ядро с нужными модулями. modprobe gspca_zc3xx. dmesg. Видим что наше устройство зацепилось. Теперь пробуем запустить cheese. Ни фига. Одни квадратики.

На этот случай есть замечательный пакет libv4l:
kilork@phoenix ~ $ emerge -s libv4l
Searching...
[ Results for search key : libv4l ]
[ Applications found : 1 ]

* media-libs/libv4l
Latest version available: 0.5.7
Latest version installed: 0.5.7
Size of files: 84 kB
Homepage: http://people.atrpms.net/~hdegoede/ http://hansdegoede.livejournal.com/3636.html
Description: V4L userspace libraries
License: LGPL-2.1


После установки пробуем еще раз, на этот раз таким образом:

kilork@phoenix ~ $ LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so cheese


Ура, на какую-то долю секунды показалась картинка с камеры, страшная, но живая. Потом куда-то делась яркость. На форумах расписано как и с этим побороться, но мне было уже как-то влом. Поэтому я зашел в настройки cheese. Выбрал разрешение 320х240, потом обратно в 640х480, картинка стала поживее. Итак, камера работает, картинку кажет.

Поскольку считаю такой способ запуска устройства сильно извращенным, жду ядра 2.6.29 - там обещали добавить эту строчку, а может быть и победить косяки с яркостью, сообщениями о битых mjpeg, а так же загрузкой процессора под завязку. Ждем ebuild'ов!

P.S. Интересная штука с скайпом, пока не разбирался, но он игнорирует мои попытки подключить камерку, и даже когда я ее выбираю (/dev/video1) все равно в предпросмотре показывает изображение с тюнера (/dev/video0). Могу конечно организовать телетрансляцию через skype, но все же как-то это странно, ругнулся бы хоть как. Ладно, запустим с libv4l и из консольки, может разберемся с бякой.

пятница, 16 января 2009 г.

CPAN Finance::Quote::Sberbank - Модуль для получения котировок ОМС Сбербанка

Выложил свои труды на CPAN. Теперь любой желающий сможет это установить.

kilork@pantogan:~$ cpan

cpan> i Finance::Quote::Sberbank
Strange distribution name [Finance::Quote::Sberbank]
Module id = Finance::Quote::Sberbank
CPAN_USERID KILORK (Alexander Korolyoff )
CPAN_VERSION 0.01
CPAN_FILE K/KI/KILORK/Finance-Quote-Sberbank-0.01.tar.gz
MANPAGE Finance::Quote::Sberbank - Obtain quotes from Sberbank (Savings Bank of the Russian Federation)
INST_FILE /home/kilork/perl/share/perl/5.8.8/Finance/Quote/Sberbank.pm
INST_VERSION 0.01


cpan> install Finance::Quote::Sberbank


Сразу, правда, в gnucash это не заработает - требуется немного магии. Магия заключается в том, что надо поправить сам Finance::Quote и добавить туда загрузку модуля, выглядит это приблизительно так:

kilork@pantogan:~/perl/share/perl/5.8.8/Finance$ diff Quote.pm~ Quote.pm -u
--- Quote.pm~ 2008-10-26 11:15:50.000000000 +0300
+++ Quote.pm 2009-01-08 11:13:02.000000000 +0300
@@ -170,7 +170,7 @@
DWS FTPortfolios Fidelity FinanceCanada Fool HEX IndiaMutual
LeRevenu ManInvestments NZX Platinum SEB StockHouseCanada
TSP TSX Tdefunds Tdwaterhouse Tiaacref Troweprice Trustnet Union
- USFedBonds VWD ZA Cominvest Finanzpartner
+ USFedBonds VWD ZA Cominvest Finanzpartner Sberbank
Yahoo::Asia Yahoo::Australia Yahoo::Brasil
Yahoo::Europe Yahoo::NZ Yahoo::USA/; }


Т.е. просто дописываем модуль в список загружаемых. В данном примере подразумевается, что cpan для пользователя настроен на локальную директорию в папке пользователя, и туда же установлены модули Finance::Quote и Finance::Quote::Sberbank. Подробнее о настройке установки модулей в локальную директорию можно посмотреть здесь. Я пока сомневаюсь, что мой модуль включат в официальный дистрибутив, так что пока так.

UPDATE: Внимательно прочитал модуль, можно сделать гораздо проще, надо назначить переменную окружения:
FQ_LOAD_QUOTELET="-defaults Sberbank"

В таком случае можно ничего не править, будут загружены как модули по-умолчанию, так и наш новый модуль. Как передавать переменную окружения уже отдельный вопрос. Можно переопределить в профиле, или просто передавать через командную строку:

kilork@mexidol ~$ FQ_LOAD_QUOTELET="-defaults Sberbank" gnucash finans



Итак, если мы все сделали правильно, то в gnucash->Инструменты->"Редактор ценных бумаг" можно будет настроить следующее:




Теперь, надеюсь более подробно описать собственно сам процесс разработки новых модулей для gnucash. Цепочка отработана.

UPDATE2: Добавил отдельный сайт для работы с котировками ОМС Сбербанка - пользовательский и программный интерфейс: http://kilork.blogspot.com/2012/01/sberbank-quotes.html.

вторник, 13 января 2009 г.

Работа с GnuCash. Часть 2. Валюта в личной бухгалтерии

UPD: Внимание! Последняя самая актуальная и полная версия руководства по GnuCash на русском языке в различных форматах доступна по адресу http://kilork.org/gnucash.html.

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

В текущей структуре счетов нет валютных счетов, поэтому идем в Активы->Текущие активы, в контекстном меню выбираем пункт меню "Новый счет". Это будет счет для имеющихся у нас наличных долларов. Назовем его Cash, валюту выбираем USD, следим, чтобы тип счета был "Активы", а родительски счет "Текущие активы".



Рис 2.1. Создание нового счета в иностранной валюте.

Поскольку деньги у нас уже есть, то перед тем, как создать счет, зайдем на закладку "Начальное сальдо", здесь вводим имеющуюся у нас сумму $. В примере это 1000.



Рис 2.2. Закладка "Начальное сальдо".

Снова посмотрим на общий список счетов.



Рис 2.3. Вид счетов после добавления счета Cash, номинируемого в USD.

На лицо явное противоречие - у нас на 1000 USD больше, но активы по прежнему 99700. Все дело в том, что GnuCash пока не знает курсы обмена, чтобы правильно отразить сумму активов. Заходим в меню Инструменты->Редактор цен.



Рис 2.4. Редактор цен.

Сейчас у нас нет котировок. Жмем кнопку "Получить котировки".



Рис 2.5. Редактор цен после получения котировок.

Теперь виден полученный курс обмена USD к RUR. Отлично. Закрываем редактор цен. И снова смотрим на общий список счетов. Замечательно, мы видим именно то, что хотелось видеть.



Рис 2.6. Вид счетов после получения котировок.

Проведем типичную обменную операцию. Для этого встаем на счет Cash, выбираем в контекстном меню "Перевести". Выбираем для передачи счет наличных, который номинируется в рублях, после этого снизу становится доступным для ввода курс обмена. Вводим там 30.5, подтверждаем "Ок".



Рис 2.7. Перевод между счетами в разных валютах с указанием курса обмена.

Теперь список счетов выглядит так:



Рис 2.8. Счета после проведения обменной операции.

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

воскресенье, 11 января 2009 г.

Знакомство с GnuCash - программой по учету личных финансов

UPD: Внимание! Последняя самая актуальная и полная версия руководства по GnuCash на русском языке в различных форматах доступна по адресу http://kilork.org/gnucash.html.

Предисловие.

В этом руководстве мне бы хотелось осветить аспекты начала работы с программой GnuCash - представителем семейства программ для учета личных финансов. Если вы пробовали записывать свои расходы и составлять семейный бюджет - то эта программа для вас. Если вы храните деньги в нескольких валютах - эта программа для вас. Если вы имеете депозиты и кредиты в банках - эта программа для вас. Если вы купили акции, или золото в слитках - gnucash снова может вам пригодиться.

Я не буду рассматривать аспекты установки программы, в случае Windows это обычный инсталлер, для Linux это ваш любимый пакетный менеджер используемого дистрибутива, руководство я пишу используя ubuntu на eee pc, непосредственно учет веду в gentoo на большой машинке. Никаких проблем нигде не возникало, либо удавалось их достаточно легко решить.

Запуск gnucash.

Итак, выбираем либо пункт меню, либо иконку на рабочем столе. Я набираю gnucash в терминале, интересно, что он напечатает в output:

kilork@pantogan:~$ gnucash

Если все установлено и нам повезло, мы увидим симпатичный логотип gnucash, и загружаемые модули, так же, возможно покажутся и многочисленные советы новичкам и продвинутым пользователям, которые могут оказаться весьма полезными:



Рис 1. Запуск gnucash.

Начало работы.

Работа с gnucash начинается с создания набора счетов. Если вы запускаете gnucash в первый раз, то мастер покажется автоматически. В противном случае он будет показан при выборе пункта меню Файл->Новый...->Новый файл.



Рис 2. Мастер создания новой иерархии счетов.

После показа приветствия жмем "Далее" и попадаем на выбор валюты по умолчанию. Валюта выбирается на основе стоящей в системе локали, но может быть изменена на этом этапе мастера. Если все правильно, то вы увидите в качестве валюты счетов RUB (Russian Ruble).



Рис 3. Выбор валюты счетов.

Далее gnucash предлагает несколько вариантов структуры счетов. Предполагая чисто домашнее использование системы на начальном этапе оставляем все по умолчанию.



Рис 4. Выбор структуры счетов.

Хотелось бы сразу увидеть на наших счетах какие-то деньги. Считаем, что в начале у нас есть только наличность. Выбираем счет "Наличные" (Активы->Текущие активы->Наличные), щелкаем в колонке "Начальное сальдо", и вбиваем имеющуюся сумму наличных. Для примера я ввел значение 100000, надеюсь, хватит на первое время.



Рис 5. Начальные параметры счетов.

Вот и все, мы создали начальную структуру счетов, у нас есть какие-то средства на них, можно начинать работать.

Закрываем окно мастера, перед нами появляется основное окно gnucash.



Рис 6. Главное окно gnucash с открытым списком счетов.

Теперь перейдем к некоторым деталям. Для начала разберемся откуда у нас взялись наличные, и что нам дает "Начальное сальдо". Разворачиваем в счетах Активы->Текущие активы->Наличные. Двойным щелчком переходим на список транзакций по счету. Сейчас в этом списке присутствует единственная транзакция со счета начального сальдо. Притом, если найти этот счет в списке счетов, его остаток так же будет равен 100000. Это одна из главных концепций бухучета - активные и пассивные счета. В данном случае счет наличных активный, а счет начального сальдо - пассивный. Перевод со счета начального сальдо на счет наличных приводит к увеличению остатка на обоих счетах на 100000. И никаких отрицательных значений. Вот так и делается начальный капитал банка.



Рис 7. Список транзакция счета "Наличные".

Теперь понятно, откуда взялись наши наличные. Они пришли со счета начального сальдо. Теперь доходы за отчетный период будут считаться от суммы этого начального сальдо. Т.е., если через месяц у нас будет 110000, то доход будет равен 10000.

Продолжаем. Настало время что-нибудь купить за наши наличные деньги. Допустим нам понадобился дорожные путеводитель. В списке счетов находим Расходы->Книги, вызываем контекстное меню, выбираем пункт "Перевести". На экране появляется диалог для перевода средств между счетами. Слева выбираем счет наличных, справа оставляем выбор на книгах. Вводим сумму, описание. У меня получилось что-то в этом духе:



Рис 8. Ввод перевода со счета наличных на счет расходов по книгам.

После этого мы видим, что расходы стали равны 100, наличность вместе с активами - 99900. Ну и прибыль, что логично, стала -100. Начались наши непростые финансовые будни.



Рис 9. Состояние счетов сразу после ввода перевода.

Откроем список транзакций по счету "Книги". Здесь видно, как отразились введеные нами атрибуты.



Рис 10. Список транзакций по счету "Книги".

Собственно, гораздо проще вводить транзакции именно со списка транзакций. Что я и делаю, ввожу еще одну транзакцию по счету книги, но на этот раз не прибегая к пункту меню, а непосредственно со списка. На этот раз это будет атлас дорог за 200.



Рис 11. Ввод транзакции со списка.

На этом можно считать законченным первый этап знакомства с gnucash. Мы создали структуру счетов, ввели начальные данные, выполнили операции по счетам. На текущий момент наши активы равны 99700, расходы - 300, доходы - 0, прибыль - -300, начальное сальдо - 100000. В следующем посте я создам счет в USD, сделаю перевод между счетами в разной валюте, а также покажу, как получать котировки из интернета. Да в целом, все это может сделать и любознательный читатель, так как это очень просто и весьма занимательно. Мои цели чуть другие, кроме ведения просто своих расходов, мне требуется полная автоматизация процесса, так что будут посты и про написание собственных модулей для получения котировок, и по интеграции с банковскими системами. Надеюсь это будет интересно, и не только мне.