Если не были применены правила разбора, заданные в конфигурационном файле /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 – дата окончания срока годности товара.

Принцип работы

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

Если введенные данные содержат как штрих-код товара так и код, то товар будет добавлен по штрих-коду.

Если введенные данные содержат как вес товара так и количество, то товар будет добавлен со значением веса.

Если последовательность содержит ошибочный код товара (или была ошибка при добавлении товара, например, при отсутствии товара в базе данных), то все позиции этой последовательности не будут добавлены в чек.

Примеры разбора

Пример 1. Разбор штрих-кодов. Получение количества товара

Правило разбора в 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, стоящее до или после запятой в регулярном выражении. Для этого необходимо изменить правило разбора.
Пример 2. Разбор штрих-кода. Получение даты окончания срока годности

Правило разбора в 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 символов – ггММддччммсс.
Пример 3. Разбор штрих-кода. Получение кода

Правило разбора в 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.

Пример 4. Разбор штрих-кода. Получение цены

Правило разбора в 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.

Если текущая цена товара меньше минимальной цены товара, то товар будет добавлен в чек с минимальной ценой.
Пример 5. Разбор кода маркировки. Удаление лидирующих непечатаемых символов

Правило разбора в 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 реализована возможность использования правил интерпретации штрих-кодов при считывании карты через ридер и при добавлении купона по кнопке. Подробнее об этом можно прочитать в статье "Использование правил интерпретации штрих-кодов".

Добавление товара с применением следующего подходящего правила

В кассовом ПО Artix реализована возможность применения следующего подходящего правила к вводимым данным, если не найден товар по текущему правилу. Для этого необходимо включить настройку useNextRuleOnFailInput в конфигурационном файле /linuxcash/cash/conf/ncash.ini.d/input.ini в секции [Rule.<номер правила разбора>]:

  • при значении true, если товар не найден по правилу разбора, то используется следующее правило,
  • при значении false следующее правило разбора не применяется.
НаименованиеТип данныхВозможные значенияОписаниеПримечания

useNextRuleOnFailInput

логический
  • true
  • false

Применять следующее подходящее правило к вводимым данным, если ввод по текущему правилу завершился с ошибкой

По умолчанию false

Пример настройки
;[Rule.1]
; Применять следующее подходящее правило к вводимым данным, если ввод по текущему правилу завершился с ошибкой
; По умолчанию false
;useNextRuleOnFailInput = false
Пример 1. Разбор штрих-кода. Переход к следующему правилу

Правило разбора в 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.

Пример 2. Разбор штрих-кода. Переход к следующему правилу

Правило разбора в 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.

Пример 3. Разбор кода. Переход к следующему правилу

Правило разбора в 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.

  • No labels