Работа с Честным знаком (определение срока годности молочной продукции)

Программы на Clarion, шаблоны, библиотеки и пр.

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение finsoftrz »

Проверил запрос с токеном, полученном в кабинете Честного знака, как было показано на скриншоте выше.

Код: Выделить всё

curl -X POST "https://markirovka.crpt.ru/api/v4/true-api/codes/check" -H "X-API-KEY: 43...ed" -H "Content-Type: application/json" -d @"mark.json" -o 1.txt
Содержание файла с маркой mark.json:

Код: Выделить всё

{
  "codes":[
      "0104607150100176215(j4Fc\u001D93aQ55"
  ]
}
Ответ в json пришел, срок годности совпадает с упаковкой (expireDate) (файл 1.txt).

Код: Выделить всё

{"code":0,"description":"ok","codes":[{"cis":"0104607150100176215(j4Fc\u001D93aQ55","valid":true,"printView":"0104607150100176215(j4Fc","gtin":"04607150100176","groupIds":[8],"verified":true,"found":true,"realizable":true,"utilised":true,"isBlocked":false,"expireDate":"2023-10-18T00:00:00.000Z","productionDate":"2023-10-15T00:00:00.000Z","prVetDocument":"6b6bbe21-6492-4b8b-a999-6f2ef5c764c6","errorCode":0,"isTracking":false,"sold":false,"packageType":"UNIT","producerInn":"6221000024","grayZone":false}],"reqId":"add5dafd-6648-47a9-90e8-2d2846cf0e75","reqTimestamp":1697874169849}
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7377
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение Игорь Столяров »

OK ! Т.е. действительно можно по марке получить параметры партии товара ...
Интересно почему это до сих пор не реализовано на уровне драйвера ККТ.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение finsoftrz »

В автономных кассах уже есть. Это свежая тема, летом только пилотные проекты были. Этот запрос только в последнее время заработал, насколько я понял. Токен из личного кабинета будет действовать ограниченное время, потом хотят усложнить его получение.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7377
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение Игорь Столяров »

Значит ната сделать набросок класса и юзать пока не появится данная опция в драйвере ККТ. 8)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение finsoftrz »

Если есть время и желание, то почему бы нет. С True api все равно рано или поздно придётся работать.
Кстати, про cjson. Попробовал для разбора результата. Программа вылетала, пока не добавил sleep(100) после парсинга и перед очисткой структур. Потом подумал, нафиг на ровном месте приключения и переделал на substring. Но рано или поздно с json потребуется работать. Не сталкивались с таким?
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7377
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение Игорь Столяров »

finsoftrz писал(а): 22 Октябрь 2023, 14:29 Программа вылетала, пока не добавил sleep(100) после парсинга и перед очисткой структур.
Всегда хорошо собрать и показать чистый пример демострирующий проблему (если она там будет).
Мы ведь не знаем, что ещё прицепилось к приложению из шаблонов или других библиотек.
Мало информации, могу предположить (!!) что программа закрывалась при работающем потоке
и введение задержки даёт возможность потоку штатно закрыться без принудильного вырубания.
finsoftrz писал(а): 22 Октябрь 2023, 14:29 на ровном месте приключения и переделал на substring
Уточните пожалуйста, а что Вы переделали на SubString() ?
Если просто вытащить пару дат из текстовой JSON строки - то можно конечно временно и так ...
Но там в запросе (и ответе) стоит массив, что бы одним запросом обрабатывать всё содержание чека.
Это уже будет сложно парсить как текст ... а запрашивать по одной марке - это только для теста ... :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение finsoftrz »

Игорь Столяров писал(а): 22 Октябрь 2023, 16:04
finsoftrz писал(а): 22 Октябрь 2023, 14:29 Программа вылетала, пока не добавил sleep(100) после парсинга и перед очисткой структур.
Всегда хорошо собрать и показать чистый пример демострирующий проблему (если она там будет).
Мы ведь не знаем, что ещё прицепилось к приложению из шаблонов или других библиотек.
Мало информации, могу предположить (!!) что программа закрывалась при работающем потоке
и введение задержки даёт возможность потоку штатно закрыться без принудильного вырубания.
Приложение однопоточное. Проявляется только после обращения к методам cjson. Мне пока нет интереса копаться в нюансах, что с чем может конфликтовать, просто отметил факт и спросил, может у кого тоже проявлялось. Если хотите, могу запостить пример, вроде ничего военного.

Код: Выделить всё

testOld_r  routine   !проверка
   DATA
jsonFactory  cJSONFactory
root    &cJSON
item    &cJSON

JSONString STRING(10024)
lor:mark    string(80)
lor:dateStr string(40)
lor:date    long

   CODE

  JSONString='тут json строка'

   root &= jsonFactory.Parse(JSONString)
  if root &= null
     exit
  .
  item &= root.FindArrayItem('codes', 1)
  if ~(item &= null)
     item &= item.GetObjectItem('expireDate')
     lor:dateStr = item.ToString(1)
     sleep(100)  !вот это ---------------------------------------
     if lor:dateStr<>''
        lor:date=deformat(sub(lor:dateStr,2,10),@d10-)
        if lor:date>0 and lor:date<today()
           Loc:Ok=0   !просрочено
        .
     .
  .

  root.Delete()

Игорь Столяров писал(а): 22 Октябрь 2023, 16:04
finsoftrz писал(а): 22 Октябрь 2023, 14:29 на ровном месте приключения и переделал на substring
Уточните пожалуйста, а что Вы переделали на SubString() ?
Если просто вытащить пару дат из текстовой JSON строки - то можно конечно временно и так ...
Но там в запросе (и ответе) стоит массив, что бы одним запросом обрабатывать всё содержание чека.
Это уже будет сложно парсить как текст ... а запрашивать по одной марке - это только для теста ... :(
Надо вытащить одну дату. Именно по одной марке, на кассе. Посмотрим, как в реальной работе будет. В методичке ЧЗ именно так предлагается делать. Есть, конечно, вариант вначале пропикать все марки, а потом скопом проверять, это уже более сложно, так как придется где-то отображать колонку со сроком годности после проверки, чтобы кассир мог потом найти среди нескольких для удаления.
Я думаю, что такая проверка не совсем логична, так как марки потом все равно проверяются еще раз, зачем 2 раза обращаться к сервисам ЧЗ. Возможно, потом объединят в одну и пока требуется по быстрому сделать какое-то решение.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7377
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение Игорь Столяров »

Сразу хочу сказать, что жись полна многообразия и я его принимаю ! :)
Но как я понимаю концепцию CJSON (да поправят меня старшие товарищи), массив парсим вот так:

Код: Выделить всё

  Root &= MyJSon.Parse(JSONString)
  If Not (Root &= Null)
  
     jResult &= Root.FindObjectItem('Codes')
     If Not (jResult &= Null)
     
        jResult.ToQueue(qResult)
        If Records(qResult) > 0
           Get(qResult,1)
           If Not ErrorCode() then Message(Format( Deformat(Sub(qResult.expireDate,2,10),@d10-),@d06.b)).
        end
     end
     
     Root.Delete()
  end
Что бы не набирать - прикрепляю готовый к сборке пример в архиве.
Прогнал тысячу раз в цикле - никаких проблем ...

Посмотрите пожалуйста ! :)
Вложения
solution.zip
(1.17 КБ) 33 скачивания
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение finsoftrz »

Насколько я понимаю логику, оба варианта должны дать идентичный результат, только в первом случае без дополнительной кьюшки. Непонятка была именно в том, при чем тут sleep. Почему без него программа вылетает, а с ним нет. Код то вроде как линейный.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7377
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение Игорь Столяров »

В Ваших условиях сборки вариант с парсом массива в Queue работает или всё-равно есть проблемы ?
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение finsoftrz »

Игорь Столяров писал(а): 22 Октябрь 2023, 21:26 В Ваших условиях сборки вариант с парсом массива в Queue работает или всё-равно есть проблемы ?
Лень проверять, сейчас на substring. У меня и со sleep работало, просто тащить большой класс для простой задачи, у нас другие обычаи. :-)
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7377
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Работа с Честным знаком (определение срока годности молочной продукции)

Сообщение Игорь Столяров »

finsoftrz писал(а): 22 Октябрь 2023, 21:30 тащить большой класс для простой задачи, у нас другие обычаи
Понял ! :)
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить