NORD POS. Історія про те, навіщо мені потрібен був ще один форк Openbravo POS

Вступ

минулій статті я розповів читачам коротку історію десяти років розвитку проекту 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 тема Сгеам за замовчуванням.
Ще планувалося, але поки що залишилося нереалізованим, перевести роботу з базою даних на ORMLite, а розрахунки робити в BigDecimal, також як це вже зроблено в мобільних веб-додатках.
В іншому я хочу зараз більше сконцентруватися на відпрацюванні вже зробленого і створення розширень до того базису, що вдалося створити в першій публічній версії NORD POS(наприклад, вже зараз існує гілка для реалізації в ній оплати за допомогою Bitcoin). Але при цьому, я найбільше зацікавлений у залученні нових учасників до роботи над проектом. Так що, якщо після прочитання цієї статті у вас з'явилося питання по автоматизації в торгівлі, то завжди радий допомогти і розповісти більше про те, як це можна зробити використовуючи відкритий код NORD POS.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.