Если не были применены правила разбора, заданные в конфигурационном файле /linuxcash/cash/conf/ncash.ini.d/input.ini
, то будут применены правила разбора из файла
/linuxcash/cash/conf/bcode.ini
.
Задание правил разбора вводимых данных в input.ini
позволяет добиться большой гибкости при обработке последовательностей данных, отличающихся по структуре.
Конфигурирование
Правила разбора и преобразований задаются в конфигурационном файле /linuxcash/cash/conf/ncash.ini.d/input.ini
.
Правила разбора представляют собой набор секций вида [Rule.<порядок>]
или [Rule.<порядок>.<имя захваченного значения>],
где <порядок>
– целое положительное число.
Значения по умолчанию не заданы. Для корректной работы необходимо раскомментировать секции и параметры.
;[Rule.1] ; Правило разбора с порядком 1 ;search = "((?<piece>26)|(?<fractional>27))(?<code>[0-9]{10})(?(piece)(?<quantity>[0-9]{5})|(?<weight>[0-9]{5})),[0-9]{5};" ; Применять следующее подходящее правило к вводимым данным, если ввод по текущему правилу завершился с ошибкой ; По умолчанию false ;useNextRuleOnFailInput = false ;[Rule.2] ; Правило разбора с порядком 2 ;search = "(?<text>.*prc=)?(?<barcode>[0-9]{13})(?<price>P[0-9]*)?(?<date_price>D[0-9]{6})?(?<old_price>L[0-9]*)?" ;[Rule.3] ; Правило разбора с порядком 3 ;search = "(?<barcode>[0-9]{13})(?<expirationDate>17[0-9]{6})" ;[Rule.1.code] ; Правило преобразования захваченного значения code ;search = "0*([0-9]{0,10})" ;replace = "\1" ;[Rule.1.weight] ; Правило преобразования захваченного значения weight ;search = "0*([0-9]{0,2})([0-9]{3})" ;replace = "\1.\2" ;[Rule.2.price] ; Правило преобразования захваченного значения price ;search = "^P(.*)([0-9]{2}$)" ;replace = "\1.\2" ;[Rule.3.expirationDate] ; Правило преобразования захваченного значения expirationDate ;search = "17(?<dateTime>[0-9]{6})" ;format = "yyMMdd" ;[Rule.4] ; Правило разбора с порядком 4 ;search = "^(\x1D|\x1A)*(?<rawdata>01[0-9]{14}.+)" ;[Rule.4.rawdata] ; Правило преобразования захваченного значения rawdata. Модификация введенных данных ;search = "(\x1D|\x1A)*(01[0-9]{14}.+)" ;replace = "\2"
Имена piece
и fractional
используются для захвата целых и дробных значений соответственно и могут быть заданы произвольно.
Значения date_price
и old_price
не используются кассовым ПО.
Значения для префиксов кодов или штрих-кодов (в примере выше – 26 и 27) могут быть заданы произвольно.
В каждой секции вида [Rule.<порядок>]
задается одно правило в формате:
search = <регулярное выражение со значениями для захвата>
В каждой секции вида [Rule.<порядок>.<имя захваченного значения>]
задаются два правила в формате:
search = <регулярное выражение со значениями для захвата> replace = <выражение для подстановки обработанных захваченных значений в исходное регулярное выражение>
или
search = <регулярное выражение со значениями для захвата> format = <выражение для подстановки формата даты в исходное регулярное выражение>
Совместное использование выражений replace
и format
не рекомендуется.
Допускается использование следующих имен для захваченных значений:
barcode
– штрих-код товара,code
– код товара,weight
– вес товара,price
– цена товара,quantity
– количество товара,expirationDate
– дата окончания срока годности товара.
Принцип работы
Поиск подходящего правила разбора происходит по возрастанию порядка. Если введенная последовательность данных удовлетворяет правилу разбора, то будет осуществлен переход к разбору по секциям для захваченных значений. При корректных данных товары с введенными штрих-кодами (кодами) будут добавлены в чек.
Если введенные данные содержат как штрих-код товара так и код, то товар будет добавлен по штрих-коду.
Если введенные данные содержат как вес товара так и количество, то товар будет добавлен со значением веса.
Примеры разбора
Правило разбора в input.ini
:
[Rule.1]
search = "((?<piece>26)|(?<fractional>27))(?<barcode>[0-9]{20})(?(piece)(?<quantity>[0-9]{5})|(?<weight>[0-9]{5})),[0-9]{5};"
[Rule.1.weight]
search = "0*([0-9]{0,2})([0-9]{3})"
replace = "\1.\2"
Разбор:
При вводе 26460708092027100015,00020;27460708092024002315,00025; строка будет разобрана следующим образом:
Реальный штрих-код первого товара = 4607080920271,
Кол-во = 15 шт.
Реальный штрих-код второго товара = 4607080920240,
Вес = 2.315 кг.
В чек будут добавлены товары со штрих-кодами 4607080920271 и 4607080920240.
Последовательность введенных данных может содержать любое ненулевое количество штрих-кодов с неуникальными префиксами, расположенных в произвольном порядке. Например:
- 26460708092027100015,00020;
- 27460708092024002315,00025;26460708092027100015,00020;27460708092024402315,00025;
quantity
или weight
, стоящее до или после запятой в регулярном выражении. Для этого необходимо изменить правило разбора.Правило разбора в input.ini
:
[Rule.1]
search = "(?<barcode>[0-9]{13})(?<expiration_date>17[0-9]{6})"
[Rule.1.expiration_date]
search = "17(?<dateTime>[0-9]{6})"
format = "yyMMdd"
Разбор:
1) При вводе 460478569147417251203 строка будет разобрана следующим образом:
Реальный штрих-код первого товара = 4604785691474,
Дата окончания срока годности = 03.12.2025 00:00.
В чек будет добавлен товар со штрих-кодом 4604785691474.
2) При вводе 460478569147417201225 строка будет разобрана следующим образом:
Реальный штрих-код второго товара = 4604785691474,
Дата окончания срока годности = 25.12.2020 00:00.
Товар 4604785691474 в чек не будет добавлен, так как срок годности истек.
Дата окончания срока годности может состоять из 4, 6, 8 или 10 символов:
- 4 символа – ММдд,
- 6 символов – ггММдд,
- 8 символов – ггММддчч,
- 10 символов – ггММддччмм,
- 12 символов – ггММддччммсс.
Правило разбора в input.ini
:
[Rule.1]
search = "((?<piece>301)|(?<fractional>401))(?<code>[0-9]{10})[0-9]{5},(?(piece)(?<quantity>[0-9]{5})|(?<weight>[0-9]{5}));"
[Rule.1.code]
search = "0*([0-9]{0,10})"
replace = "\1"
Разбор:
При вводе 301000001006800010,00020; строка будет разобрана следующим образом:
Реальный код (с отсеченными лидирующими нулями) = 10068,
Кол-во товара = 20 шт.
В чек будет добавлен товар с кодом 10068.
Правило разбора в input.ini
:
[Rule.2]
search = "(?<text>.*prc=)?(?<barcode>[0-9]{13})(?<price>P[0-9]*)?(?<date_price>D[0-9]{6})?(?<old_price>L[0-9]*)?"
[Rule.2.price]
search = "^P(.*)([0-9]{2}$)"
replace = "\1.\2
Разбор:
При вводе 4600605011560P65500D121212L10000 строка будет разобрана следующим образом:
Реальный штрих-код = 4600605011560,
Текущая цена (P65000) = 655.00,
Дата цены = D121212 (не используется),
Старая цена = L10000 (не используется).
В чек будет добавлен товар с ценой 655.00.
Правило разбора в input.ini
:
[Rule.4]
search = "^(\x1D|\x1A)*(?<rawdata>01[0-9]{14}.+)"
[Rule.4.rawdata]
search = "(\x1D|\x1A)*(01[0-9]{14}.+)"
replace = "\2"
Разбор:
При вводе [GS]0104603783031078215qkTc%[GS]91EE10[GS]920zUQSW3i/UhmXwBmyF/RlbUJExITLdqpLWO5qAV08+g= строка будет разобрана следующим образом:
Реальный штрих-код = 4603783031078
Код маркировки = 0104603783031078215qkTc%[GS]91EE10[GS]920zUQSW3i/UhmXwBmyF/RlbUJExITLdqpLWO5qAV08+g=
Добавление товара с применением следующего подходящего правила
В кассовом ПО Artix реализована возможность применения следующего подходящего правила к вводимым данным, если не найден товар по текущему правилу. Для этого необходимо включить настройку useNextRuleOnFailInput
в конфигурационном файле /linuxcash/cash/conf/ncash.ini.d/input.ini
в секции [Rule.<номер
правила
разбора>]
:
- при значении
true
, если товар не найден по правилу разбора, то используется следующее правило, - при значении
false
следующее правило разбора не применяется.
Наименование | Тип данных | Возможные значения | Описание | Примечания |
---|---|---|---|---|
useNextRuleOnFailInput | логический |
| Применять следующее подходящее правило к вводимым данным, если ввод по текущему правилу завершился с ошибкой | По умолчанию |
;[Rule.1] ; Применять следующее подходящее правило к вводимым данным, если ввод по текущему правилу завершился с ошибкой ; По умолчанию false ;useNextRuleOnFailInput = false
Правило разбора в input.ini
:
[Rule.1]
search = "(?<barcode>^90[0-9]{11})"
useNextRuleOnFailInput = true
[Rule.2]
search = "(?<prefix>^90)(?<barcode>[0-9]{5})(?<weight>[0-9]{5})[0-9]{1}"
[Rule.2.weight]
search = "0*([0-9]{0,2})([0-9]{3})"
replace = "\1.\2"
В БД товар со штрих-кодом 77777.
Разбор:
При вводе 9077777012000; строка будет разобрана по правилу разбора второго порядка следующим образом:
Реальный штрих-код = 77777,
Количество = 1.200 кг.
В чек будет добавлен товар со штрих-кодом 77777.
Правило разбора в input.ini
:
[Rule.1]
search = "(?<barcode>^90[0-9]{11})"
useNextRuleOnFailInput = true
[Rule.2]
search ="(?<prefix>^90)(?<barcode>[0-9]{5})(?<weight>[0-9]{5})[0-9]{1}"
[Rule.2.weight]
search = "0*([0-9]{0,2})([0-9]{3})"
replace = "\1.\2"
В БД товар с кодом 10169.
Разбор:
При вводе 9010169009700 строка будет разобрана по правилу разбора второго порядка следующим образом:
Реальный штрих-код = 10169,
Количество = 0.970 кг.
Осуществляется поиск штрих-кода. Штрих-код не найден. Происходит поиск по коду.
В чек будет добавлен товар с кодом 10169.
Правило разбора в input.ini
:
[Rule.1]
search = "(?<barcode>^90[0-9]{11})"
useNextRuleOnFailInput = true
[Rule.2]
search = "(?<prefix>^90)(?<code>[0-9]{5})(?<weight>[0-9]{5})[0-9]{1}"
[Rule.2.weight]
search = "0*([0-9]{0,2})([0-9]{3})"
replace = "\1.\2"
В БД товар с кодом 66666.
Разбор:
При вводе 9066666009750 строка будет разобрана по правилу разбора второго порядка следующим образом:
Реальный код = 66666,
Количество = 0.975 кг.
В чек будет добавлен товар с кодом 66666.
Если при добавлении товара возникает ошибка, то обработка правил прекращается, на экран выводится диалог с ошибкой.
Логирование
Логирование работы плагина ведется в файле /linuxcash/logs/current/terminal.log
.