Вступление
В прошлой статье я рассказал читателям краткую историю десяти лет развития проекта Openbravo POS. В течении 7 лет я принимал активное участие в нём и совместно с другими участниками разрабатывал систему управления торговой точкой с открытым исходным кодом. Но в этом году я решил перенести все свои накопленные наработки в самостоятельный проект nordpos.mobi и развивать их уже в рамках собственного форка, созданного на базе открытого исходного кода Openbravo POS.
Истоки
Ключевой причиной остановки развития Openbravo POS, стал фактический уход из проекта её основателя Эдрина Ромера, он полностью переключился на разработку коммерческой версии Openbravo Web POS и с 2010 года к исходному коду оригинальной версии больше не прикасался. По этому больших надежд на возрождение проекта я не питал, а необходимость в развитие приложения у меня была.
Практически с первых дней параллельно с общественной работой по локализации Openbravo POS, я вёл разработку внутреннего проекта для бизнеса своей семьи под названием NORD POS. Так как семейный бизнес у нас связан с техническим обслуживанием кассовой и прочей торговой техники, то и в дальнейшем развитие собственного приложения, которое может с этим оборудованием работать, мы были немало заинтересованы. Что и подтолкнуло меня в 2012 году выложить исходный код NORD POS сначала в репозитарий Mercurial на Bitbucket, а затем на GitHub после перехода на Git. Нумерацию версий пришлось начать сразу с цифры 3 по причине того, что одной из главных особенностей моего приложения стала возможность миграции с последней версии Openbravo POS. В итоге, первой версией NORD POS стала версия за номер 3.0.0, в неё вошли не только косметические изменения интерфейса и обновления версий библиотек, но и изменения влияющие на структуру всего проекта в целом.
Разделение базиса и надстройки
Само по себе приложение Openbravo POS было в общем самодостаточно для задач организации кассового учёта. В нём присутствовал полный набор функций выполняемых на рабочем месте кассира, но пользователям всё время не хватало возможностей и гибкости подстройки их под специфику того или иного бизнеса. Хотя что-то можно было решить с помощью написания встроенных скриптов, но их сфера действия была ограничена только панелью продаж. Если требовалось как-то изменить бизнес-логику и подключить новое оборудование, то приходилось вносить изменения в ядро приложения. А так как изначально оно было монолитным и разрабатывалось по сути только одним человеком, эти изменения могли затрагивать значительную часть исходного кода. Хотя с версии 2.10, где Эдриан Ромеро выделил генерацию отчётов в отдельный подключаемый ресурс, начался постепенный переход к модульности и расширяемости с помощью выведения части ресурсов из ядра исходного кода приложения, но к сожалению с 2009 года проект был по сути заморожен и этот процесс не получил дальнейшего развития. Также это направление не нашло развитие и в форках основанных на Openbravo POS и мне стало интересно попробовать самому это осуществить.
Текущая версия десктоп приложения: NORD POS 3.0.1 Community Edition
Системные требования: ОС Windows или Linux с Java SE 7.
Интерфейс: Java Swing в десктоп приложении и jQuery Mobile в мобильных веб-приложениях.
Базы данных: Apache Derby и MySQL в качестве основных, но доступно использовать СУБД PostgeSQL, HSQL, Firebird или Oracle.
Языки интерфейса: английский и русский.
Исходный код: github.com/nordpos/nordpos
Бинарные сборки: sourceforge.net/projects/nordpos/files/app-platform/
Лицензия: GNU GPL v3.
Подключаемое оборудование в драйверах периферии
Это решение я подсмотрел в коммерческой версии Openbravo Web POS, где интерфейсы были вынесены с помощью Java SPI в отдельные пакеты для каждого типа оборудования. Это дало возможность разрешить проблему с подключением оборудования, присутствовавшим только на нашем локальном рынке, для которого теперь нет необходимости делать отдельный форк всей системы, а достаточно внести изменения только в один вынесенный в самостоятельную библиотеку драйвер. Таким-же образом в NORD POS реализовано подключение к платёжным шлюзам карточных процессингов.
На диаграмме представлены реализованные интерфейсы для отдельных типов торгового оборудования. При этом управление дисплеем покупателя, фискальным регистратором, чековым и этикет принтером осуществляется через специальные XML-шаблоны, структура этих шаблонов описана в Schema.Printer.xsd. Также, для реализации работы через подключаемые драйверы, была изменена структура каталогов приложения для правки ресурсов без необходимости компиляция основного пакета.
- ./services, файлы с объявлением вызываемых сервисов;
- ./templates, пользовательские шаблоны;
- ./lib-ext, сами библиотеки драйверов.
Кроме того, как и в Openbravo POS, к NORD POS могут быть подключены без проблем в режиме клавиатуры сканеры штрих-кодов или магнитных карт.
Бизнес-логика в мобильных дополнениях
Про саму идея я уже подробно рассказывал в статье Компактный Java сервлет для мобильного веб, в дальнейшем она могла бы стать флагманом развития Openbravo POS, но к сожалению кроме меня она никем не была подхвачена, и на сегодня является основной для проекта nordpos.mobi отличительной особенностью. При этом, в нём не только размещён исходный код для создания собственных Java-сервлетов, но и есть возможность попробовать работу демонстрационных версий для каталога товара и рабочего места официанта, которые уже скомпилированы и развёрнуты на виртуальной машине в облаке Windows Azure. И сейчас у меня в планах сделать для NORD POS мобильный онлайн магазин и мобильный терминал сбора данных для склада.
С технической точки зрения, это самостоятельные веб-приложения, имеющие с десктоп-версией NORD POS только общую базу данных, при этом, база данных не сильно отличается от оригинальной, и веб-приложения от NORD POS могут использоваться в связке и с другими форками Openbravo POS. В отличие от десктоп-версии, где взаимодействие с системой управления базой данных осуществлялось через SQL-запросы, в Java-сервлетах для доступа к информации через модель данных используются Java-аннотации библиотеки ORMLite. Список поддерживаемых баз данных через JDBC-драйвер достаточно обширный, а всё что нужно для подключения, это в /WEB-INF/web.xml сервлета указать параметры подключения. При этом единственное условие, чтобы в папке /WEB-INF/lib был JDBC-драйвер для соответствующей СУБД. Вот пример настроек для MySQL:
<context-param>
<param-name>db.URL</param-name>
<param-value>jdbc:mysql://localhost:3306/nordpos?useUnicode=yes&characterEncoding=UTF-8</param-value>
</context-param>
<context-param>
<param-name>db.user</param-name>
<param-value>nordposuser</param-value>
</context-param>
<context-param>
<param-name>db.password</param-name>
<param-value>nordpospassword</param-value>
</context-param>
<context-param>
<param-name>db.application.id</param-name>
<param-value>nordpos</param-value>
</context-param>
Визуальные схемы для синхронизации данных
Ещё одной необходимой особенностью POS программ является наличие в них средств интеграции с другим программным обеспечением уже внедрённым или планируемым к внедрению. У нас это обычно 1С, за границей это различные ERP-система, также очень часто это бывают интернет магазины, построенные как на популярных CMS, так и самописные. Чаше всего разработчики POS в качестве универсального решения используют выгрузку и загрузку в текстовой файл, который затем обрабатывает внешняя система. Но мне понравилось решение, использовать специализированное программное обеспечением для ETL. В версии Openbravo POS 2.30 использовался комплекс программ Pentaho Data Integration. Так как это более универсальный подход, то в нём можно как подстраивается под API чужих систем, так и реализовывать собственные варианты обмена данными. В Pentaho Data Integration используется визуальный подход к процессу извлечению, преобразованию и выгрузки данных. Например, схема для выгрузки из базы данных NORD POS таблиц товаров, категорий и налогов будет выглядеть следующим образом.
Схемы преобразований Pentaho Data Integration можно запускать несколькими способами: из графической оболочки, командной строки, по расписанию, через веб-сервер или встроенный в другое приложение API. Для NORD POS я выбрал последний вариант, так как он наиболее удобен пользователям.
Реализована интеграция схем трансформации была аналогична интеграции шаблонов отчётов JasperReports. В визуальном редакторе создаётся схема трансформации.
После чего в текстовом редакторе или IDE для её вызова из приложения создаётся скрипт.
transformation = new com.nordpos.sync.panel.PanelTransformationBean();
transformation.setTitleKey("Menu.SyncImportProducts");
transformation.setTransformation("/com/nordpos/transformations/csv/IMPORT_PRODUCTS.ktr");
transformation.addTransVariable("db.URL", this.app.getProperties().getDBURL());
transformation.addTransVariable("db.driver", this.app.getProperties().getDBDriver());
transformation.addTransVariable("db.user", this.app.getProperties().getDBUser());
transformation.addTransVariable("db.password", this.app.getProperties().getDBPassword());
transformation;
В нём, как даётся ссылка на схему, так и задаются параметры переменных необходимые для выполнения преобразования. Если преобразование будет связанно с обработкой информации из базы данных, то обязательно необходимо задать параметры подключения к ней. Затем в ресурсе приложения Menu.Root задаётся кнопка и вызов панели выполнения скрипта в меню приложения.
submenu.addPanel("/com/openbravo/images/database_imp.png", "Menu.SyncImportProducts", "/com/nordpos/transformations/csv/import_products.bsh");
А в правах роли пользователя разрешается доступ к ней.
<class name="/com/nordpos/transformations/csv/import_products.bsh"/>
Перезапустив приложение можно будет уже непосредственно из него выполнять по схемам Pentaho Data Integration загрузку данных из внешних файлов в NORD POS.
Встроенные серверы
Сервер базы данных
Базой данных по-умолчанию в Openbravo POS была Apache Derby, но не сетевая версия, сразу с возможностью нескольких одновременных подключений, а встроенная версия от JDBC-драйвера только с одним одновременным подключением. При этом для подключения нескольких POS-систем к одной базе данных необходимо было либо устанавливать сервер Apache Derby, либо выбирать другую СУБД в которой функция для одновременного подключения нескольких соединений поддерживалась изначально. Также использовать несколько подключений было необходимо для обменна данных через Pentaho Data Integration. Так как функция миграции с Openbravo POS на NORD POS была у меня запланирована изначально, то в качестве удобного средства обновления базы данных я решил использовать встроенную версию Apache Derby Network Server. Теперь для обновления достаточно скопировать папку с базой данных от Openbravo POS в папку .derby-db каталога пользователя, прописав в URL JDBC-драйвера её наименования, и обновление пройдёт автоматически. Если в качестве хранилища используется другая СУБД, то запуск встроенного сервера можно отключить.
Сервер веб-приложений
Так как основной аудиторий NORD POS будут всё-таки простые пользователи, неискушённые в вопросах установки веб-серверов и развёртывания веб-приложений в контейнерах сервлетов, то по аналогии с встроенным сервером базы данных в приложение был интегрирован веб-сервер Jetty 9. Запускается он опционально, если в настройках это задано.
Веб-приложения устанавливаются в папку ./webapps непосредственно в каталоге NORD POS, при установке необходимо предварительно скомпилированное содержимое war-файла распаковать в папку с соответствующим названием. После запуска NORD POS, по названию этой папки в строке браузера, будет доступно установленное веб-приложение.
Ещё изменения и планы
Кроме перечисленных выше достаточно глобальных изменений, есть в NORD POS и не столь кардинальные:
- обновлены полностью все библиотеки, в том числе, RXTX заменён на Neuron Robotics Java Serial, а JasperReports обновлён до 4.8.0;
- поддержка двумерных штрих-кодов DataMatrix и QR-код;
- возможность использовать скидки на всю сумму чека или на отдельные позиции;
- новые отчёты;
- подсветка синтаксиса в ресурсах и скриптах;
- набор иконок Faenza и тема Сream по-умолчанию.
Ещё планировалось, но пока осталось нереализованным, перевести работу с базой данных на ORMLite, а расчёты делать в BigDecimal, также как это уже сделано в мобильных веб-приложениях.
В остальном я хочу сейчас больше сконцентрироваться на отработке уже сделанного и создании расширений к тому базису, что удалось создать в первой публичной версии NORD POS(например, уже сейчас существует ветка для реализации в ней оплаты с помощью Bitcoin). Но при этом, я больше всего заинтересован в привлечении новых участников к работе над проектом. Так что, если после прочтения этой статьи у вас появилось вопросы по автоматизации в торговле, то всегда рад помочь и рассказать больше о том, как это можно сделать используя открытый код NORD POS.
Автор: Svininykh