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

; Применять следующее подходящее правило к вводимым данным, если ввод по текущему правилу завершился без ошибки
; По умолчанию false
;useNextRuleOnSuccessInput = 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}.+)"

Имена piece и fractional используются для захвата целых и дробных значений соответственно и могут быть заданы произвольно.

Значения date_price и old_price не используются кассовым ПО.

Значения для префиксов кодов или штрих-кодов (в примере выше – 26 и 27) могут быть заданы произвольно.

В каждой секции вида [Rule.<порядок>] задается одно правило в формате:

search = <регулярное выражение со значениями для захвата>

В каждой секции вида [Rule.<порядок>.<имя захваченного значения>] задаются два правила в формате:

search = <регулярное выражение со значениями для захвата>
replace = <выражение для подстановки обработанных захваченных значений в исходное регулярное выражение>

или

search = <регулярное выражение со значениями для захвата>
format = <выражение для подстановки формата даты в исходное регулярное выражение>

Совместное использование выражений replace и format не поддержано.

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

МодификаторТип данныхОписаниеПримечания
additionalBarcodeстроковыйДополнительный штрих-код товара

Если модификатор заполнен, его значение будет передаваться в ФР вместо штрих-кода.

Значение модификатора записывается в БД Documents таблицу goodsitem поле additionalBarcode.

additionalExciseMarkстроковый


barcodeстроковыйШтрих-код товара

Используется для:

  • поиска:
    • товаров в БД,
    • комплектов товаров из плагина goodsKit,
    • позиций в возврате по чеку, в списке, представленном к возврату,
    • в софт-чеках, списках товаров.
  • проверки по маске из настройки notMatchingBarcodesMask и сравнении со штрих-кодом из маркировки при работе с плагином markedgoods.

Перезадается вручную, если у товара есть признак "Товар по свободной цене".

Значение модификатора записывается:

cardNumberстроковыйНомер карты

Используется для поиска группы карт и последующего поиска карты с учетом параметров найденной группы карт.

Модификатор невозможно использовать в инвентаризации и обучении контрольным весам.

При заполненном модификаторе, значения следующих модификаторов будут проигнорированы: barcode, code, couponNumber, couponEncryptNumber, couponOnlineNumber, exciseMark, tobaccoDataMatrix, shoesDataMatrix, medicineDataMatrix, markedGoodsDataMatrix, consultantNumber, deferredCheckId, extendedOption, onlineCheckId и softCheckId.
codeстроковыйКод товара

Заполняет модификатор barcode, если он пуст. В этом случае поиск товара в БД производится по коду.

consultantNumberстроковыйНомер консультанта

Используется для поиска консультанта в БД Dictionaries таблице consultant по полю password и добавления его в текущую позицию или ко всем позициям заранее открытого документа в зависимости от настройки applyConsultantOnCheck.

Данные консультанта сохраняются в БД Documents таблице consultant.

Модификатор невозможно использовать в инвентаризации, возврате поставщику или обучении контрольным весам.

При заполненном модификаторе, значения следующих модификаторов будут проигнорированы: barcode, code, exciseMark, tobaccoDataMatrix, shoesDataMatrix, medicineDataMatrix, markedGoodsDataMatrix, deferredCheckId, extendedOption, onlineCheckId и softCheckId.
couponEncryptNumberстроковыйЗашифрованный номер купона

Применяется для использования купонов в дисконтной системе.

Используется для поиска купонов в чеке при удалении по команде COMMAND_COUPON_DELETE.

Модификатор невозможно использовать вне чека продажи.

При заполненном модификаторе, значения модификаторов barcode, code, couponOnlineNumber, exciseMark, tobaccoDataMatrix, shoesDataMatrix, medicineDataMatrix, markedGoodsDataMatrix, consultantNumber, deferredCheckId, extendedOption, onlineCheckId и softCheckId игнорируются.
couponNumberстроковыйНомер купона

Используется для:

  • поиска купонов в системах лояльности:
    • Kilbil,
    • Loymax,
    • PriorityApi,
    • RsLoyalty,
    • PriceCore.
  • Использования в дисконтной системе.
При заполненном модификаторе, значения следующих модификаторов будут проигнорированы: barcode, code, couponEncryptNumber, couponOnlineNumber, exciseMark, tobaccoDataMatrix, shoesDataMatrix, medicineDataMatrix, markedGoodsDataMatrix, consultantNumber, deferredCheckId, extendedOption, onlineCheckId и softCheckId.

Используется для поиска купонов в чеке при удалении по команде COMMAND_COUPON_DELETE.

Модификатор невозможно использовать вне чека продажи.

couponOnlineNumberстроковыйОнлайн номер купона

Применяется для поиска купонов на сервере купонов Artix через плагин OnlineCoupon и использования в дисконтной системе.

Используется для поиска купонов в чеке при удалении по команде COMMAND_COUPON_DELETE.

Модификатор невозможно использовать вне чека продажи.

При заполненном модификаторе, значения следующих модификаторов будут проигнорированы: barcode, code, exciseMark, tobaccoDataMatrix, shoesDataMatrix, medicineDataMatrix, markedGoodsDataMatrix, consultantNumber, deferredCheckId, extendedOption, onlineCheckId и softCheckId.
deferredCheckIdстроковый



deptNumberцелочисленный

Номер отдела

Отдел товара записывается в БД Documents таблицу goodsitem поле deptcode.

Параметр "Обязательный ввод номера отдела вручную" будет проигнорирован, будет применён отдел из модификатора.

Заполнение модификатора для комплектов товаров из плагина goodsKit запрещено. Добавление комплекта будет отменено.

exciseMarkстроковый



expirationDateстроковый



extendedOptionстроковый



forbidDiscountлогический



giftDiscountIdцелочисленный



groupстроковый

Идентификатор группы товара

Устанавливает номер группы для позиции.

Позиции группы не объединяются независимо от значения параметра UnitePosition.

Сторнирование возможно только для всех позиций группы.

Собственная группа может быть создана плагином DraftBeer при разбиении позиции.

kitDataстроковый



markedGoodsDataMatrixстроковый



markingCodeстроковый



medicineDataMatrixстроковый



minRetailPriceстроковый



modifyPriceReasonIndexцелочисленный



modifyPriceReasonстроковый



nameстроковый



noChangeQrстроковый



onlineCheckId

строковый



packingModeлогический

Расфасовка

При активированой расфасовке в БД Documents таблице goodsitem поле prepackaged будет запись 1.

Если расфасовка активирована, то при заполнении:

Заполнение модификатора для комплектов товаров из плагина goodsKit запрещено. Добавление комплекта будет отменено.

packingPriceвещественное число

Цена для расфасовки

Устанавливает цену для расфасованных товаров.

Работает в связке с модификатором packingMode.

price

вещественное число

Цена товара

Устанавливает цену товара.

Если указанная цена товара меньше минимальной цены, то применяется минимальная цена.

При включенной настройке ignoreMinPriceWhenInputPriceManual можно указывать цену меньше минимальной, но не ниже минимальной розничной цены.

Значение модификатора записывается в БД Documents таблицу goodsitem поле pricei.

При включенной настройке ignoreMinPriceWhenInputPriceManual указанная цена записывается в БД Documents таблицу goodsitem поле minprice.

Имеет больший приоритет, чем модификатор priceIndex.

Если включена система "POS-Интеллект (ITV), то в систему будет дополнительно отправлено событие "Изменение текущей позиции".

При включённом плагине restrictions значение модификатора сравнивается с нижним порогом цен из параметра minAllowedPriceRatio. Если значение модификатора < <цена товара> * значение minAllowedPriceRatio, то добавление товара будет отменено.

priceIndex

целочисленныйИндекс цены товара

Из записи в БД Dictionaries таблице tprices поле tindex, которой соответствует значению модификатора, заполняет:

Значение модификатора записывается в БД Documents таблицу goodsitem поле tindex.

Если цена из указанной переоценки < минимальной цены, то:

  • применяется цена из указанной переоценки,
  • цена из указанной переоценки записывается в БД Documents таблицу goodsitem поле minprice.

quantityFromBcode

вещественное числоКоличество из штрих-кода

При включенном плагине AdditionalWeighing значение модификатора будет сравниваться со значением с весов.

quantityвещественное числоКоличество

Заполняет модификатор quantityFromBcode, перезаписывает его, если модификатор заполнен.

В возврате по чеку, если количество из модификатора совпадает с проданным количеством товара в позиции, то позиция, чьи данные были введены, будет отмечена для возврата. Если количество не совпадает, то будет выведен диалог ввода количества товара для возврата.

Если задано ограничение количества на позицию, то значение модификатора будет сравниваться с ним, и добавление товара будет отменено при превышении заданного количества.

С заданным модификатором и активированным параметром multipleModifierQuant, если модификатор, до разбора введённых данных, уже задан - значения будут перемножены

Для весового товара значение модификатора уменьшается на указанный вес тары, если:

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

Для весового товара параметр "Получать количество с весов автоматически" будет проигнорирован, вместо него будет применено значение модификатора.

При выставленной настройке ignoreRequireQuantityScales, параметр "Обязателен ввод количества с весов" будет проигнорирован, будет применено значение модификатора.

Если включена система "POS-Интеллект (ITV), то в систему будет дополнительно отправлено событие "Изменение текущей позиции".

Заполнение модификатора для штучных маркированных товаров из плагинов markedgoods, motp запрещено. Добавление товара будет отменено.

Заполнение модификатора для алкогольных товаров запрещено. Добавление товара будет отменено.

Заполнение модификатора для товаров с rfid-метками из плагина rfid. Добавление товара будет отменено.

При включённом плагине restrictions:

    • с настройкой checkQuantityByBarcode значение модификатора сравнивается с пределами при проверке аномального количества из БД Dictionaries таблицы abnormalquantity с возможностью подтвердить или изменить количество,
    • с настройкой limit значение модификатора сравнивается с указанным пределом с  возможностью подтвердить его или отказаться от добавления товара,
    • с обеими настройками будут срабатывать проверка:

shoesDataMatrix

строковый

softCheckIdстроковый

tobaccoDataMatrixстроковый

weightвещественное числоВес товараЗаполняет модификатор quantity, перезаписывает его, если модификатор заполнен.

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

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

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

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

Пример 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 в чек не будет добавлен, так как срок годности истек.

Дата окончания срока годности может быть задана в произвольном формате.

Пример 1
[Rule.1]
search = "(?<barcode>[0-9]{13})(?<expirationDate>17[0-9]{12})"

[Rule.1.expiration_date]
search = "17(?<dateTime>[0-9]{12})"
format = "yyMMddhhmmss"
Пример 2
[Rule.1]
search = "(?<barcode>[0-9]{13})(?<expirationDate>17[0-9]{12})"

[Rule.1.expiration_date]
search = "17(?<dateTime>[0-9]{12})"
format = "ssmmhhddMMyy"
Пример 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}.+)"

Разбор:

При вводе [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.

Если при добавлении товара возникает ошибка, то обработка правил прекращается, на экран выводится диалог с ошибкой.

Применение следующего подходящего правила в случае успешного разбора текущего правила

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

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

useNextRuleOnSuccessInput

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

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

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

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

Логирование

Логирование работы плагина ведется в файле /linuxcash/logs/current/terminal.log.


  • No labels