Pull to refresh

Пишем софт для учёта финансов: Открытый API

Reading time3 min
Views2.4K
Один из моих прошлых постов про домашнюю бухгалтерию, породил много обсуждений на тему — можно ли вести учёт финансов в интернете, или лучше по старинке использовать оффлайн приложения типа Excel?

Мнения разделились, но факт остаётся фактом — многие делают выбор в пользу онлайна. А мы подумали, так ли уж непримиримы онлайн с оффлайном?

И вот теперь, всякое приложение для учёта финансов, под любую ОС, может обмениваться данными с онлайном, используя открытое API от drebedengi.ru. А как вы думаете, нужно ли это людям?

Статистика


Оказывается, нужно. По нашей статистике (~43 000 пользователей), сейчас наиболее актуальны приложения с синхронизацией для:
  1. Andriod, IPhone, Windows Mobile, Symbian
  2. Unix/Linux
  3. Flash приложения для vkontakte.ru и т.п.
  4. Плагины для браузеров FireFox, Chrome, Opera, IE
  5. Кроссбраузерные виджеты на js, для быстрого ввода трат
Публичное голосование на реформале тому подтверждение.

Сотрудничество


Итак, любой желающий может написать своё приложение для drebedengi.ru. При этом не глючные хорошие приложения, могут быть размещены на официальном сайте и предлагаться напрямую нашим пользователям. Для этого заключается специальное соглашение о сотрудничестве, которое обсуждается индивидуально. После этого, разработчик становится участником нашей партнёрской программы, и сразу начинает получать доход с продаж. Иными словами, успешное приложение мгновенно попадает в руки многотысячной аудитории.

Как всё работает


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

anyType getCategoryList(string $apiId, string $login, string $pass, anyType $idList)
anyType getSourceList(string $apiId, string $login, string $pass, anyType $idList)
anyType getPlaceList(string $apiId, string $login, string $pass, anyType $idList)
anyType getCurrencyList(string $apiId, string $login, string $pass, anyType $idList)
anyType getTagList(string $apiId, string $login, string $pass, anyType $idList)

Описывать входные параметры для каждого метода смысла нет, они описаны в WSDL. И да, пока мы решили в каждом методе передавать логин и пароль. Было много раздумий на эту тему, но пока решили, как решили. Гуру архитектуры — предложите более правильную схему?

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

anyType getRecordList(string $apiId, string $login, string $pass, anyType $params, anyType $idList)

В массиве params — содержится огромный набор параметров, согласно которым можно запрашивать разные комбинации данных. На первом шаге нужно просто выкачать все транзакции и сохранить их на клиенте.

Алгоритм синхронизации


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

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

Клиент хранит номер серверной ревизии, до которой он последний раз успешно синхронизировался и присылает его всякий раз, когда решит синхронизироваться снова. Сервер в ответ выдаёт список изменений в хронологическом порядке, на основе которого клиент выкачивает с сервера изменения. См. методы:

anyType getChangeList(string $apiId, string $login, string $pass, string $revision)
integer getCurrentRevision(string $apiId, string $login, string $pass)

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

Заключение


Итак, если вам это интересно, вот тут вы найдёте ссылку на wsdl, полноценный тестовый пример клиента на PHP, низкоуровневый XML SOAP запрос, на примере метода getRecordList и ещё кое-что.

Да… тем кто боится перехвата данных по сети — предлагаем найти soap библиотеку с поддержкой SSL, и использовать отдельный wsdl для этого.
Tags:
Hubs:
Total votes 27: ↑20 and ↓7+13
Comments32

Articles