В кассовом ПО Artix реализована возможность закрытия смены автоматически по расписанию или при выключении кассы, а также посредством отправки запроса через REST API.

Начиная с версии 4.6 | 5.304 добавлена возможность оповещения кассира с помощью отправки запроса через REST API.

Конфигурирование плагина

Активация плагина "Операционный день" определяется параметром operationday, который задается в конфигурационном файле /linuxcash/cash/conf/ncash.ini.d/operationday.ini в секции [plugins].

НаименованиеТип данныхВозможные значенияОписаниеПримечания
operationdayстроковый
  • on
  • off
Активация плагина "Операционный день"По умолчанию off
Пример настройки
[plugins]
; Плагин Операционный день
; для контроля состояния кассы и смены
;operationday = off

Настройка плагина "Операционный день" производится в конфигурационном файле /linuxcash/cash/conf/ncash.ini.d/operationday.ini в секции [OperationDay].

НаименованиеТип данныхВозможные значенияОписаниеПримечания
executeCSCommandsлогический
  • true
  • false

Выполнять команды, полученные с кассового сервера

Запросы принимаются на порт 38082.

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

shiftCloseTimeстроковый

Автоматически закрывать смену в указанное время

Время задается в формате чч:мм

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

closeShiftOnShutdownлогический
  • true
  • false
Закрывать смену при выключении кассыПо умолчанию false
userNameстроковый
Имя пользователя, от имени которого смена будет закрываться по времени и при выключении кассы
userIdстроковый
Идентификатор пользователя, от имени которого смена будет закрываться по времени и при выключении кассы
beforeShiftCloseMacroCodeцелочисленный
Код макроса, который будет выполняться перед закрытием сменыПо умолчанию -1
showAlarmDialogлогический
  • true
  • false
Отображения диалога выбора с возможностью отложить закрытие сменыПо умолчанию false
alarmTimeoutцелочисленный
Таймаут отображения диалога выбора с возможностью отложить закрытие смены (в минутах).  По истечению указанного времени смена закроетсяПо умолчанию -1
alarmIntervalцелочисленный
Интервал отображения диалога выбора с возможностью отложить закрытие смены (в минутах)По умолчанию -1
postponeShiftCloseлогический
  • true
  • false
Отложить закрытие смены, или иное действие, связанное с закрытием смены, до момента закрытия или отмены чекаПо умолчанию false
Пример настройки
[OperationDay]

; Выполнять команды, полученные с кассового сервера
; запросы принимаются на порт 38082
; по умолчанию выключено
;executeCSCommands = false

; Автоматически закрывать смену в указанное время
; время в формате чч:мм
; по умолчанию выключено
;shiftCloseTime = ""

; Закрывать смену при выключении кассы
; по умолчанию false
;closeShiftOnShutdown = false

; Имя пользователя, от имени которого смена будет закрываться по времени и при выключении кассы
;userName = ""

; Идентификатор пользователя, от имени которого смена будет закрываться по времени и при выключении кассы
;userId = ""

; Код макроса, который будет выполняться перед закрытием смены
; По умолчанию -1 (макрос не выполняется)
;beforeShiftCloseMacroCode = -1

;Отображения диалога выбора с возможностью отложить закрытие смены
; по умолчанию false (диалог выбора не отображается)
;showAlarmDialog = false

; Таймаут отображения диалога выбора с возможностью отложить закрытие смены (в минутах)
; По истечению указанного времени смена закроется
; по умолчанию -1 (нет таймаута)
;alarmTimeout = -1

; Интервал отображения диалога выбора с возможностью отложить закрытие смены (в минутах)
; по умолчанию -1 (диалог не отображается повторно)
;alarmInterval = -1

; Отложить закрытие смены, или иное действие, связанное с закрытием смены, до момента закрытия или отмены чека
; по умолчанию false
;postponeShiftClose = false

Если имя (userName) и идентификатор пользователя (userId) не заданы, то для автоматического закрытия смены будут использоваться данные последнего пользователя из БД Documents таблицы Users.

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


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

Если включена проверка счетчиков в смене и в ФР при закрытии смены, то при расхождении сумм смену можно будет закрыть только вручную.

Автоматическое закрытие смены

В кассовом ПО Artix реализовано автоматическое закрытие смены. Время автоматического закрытия смены задается параметром shiftCloseTime.

Если параметр showAlarmDialog имеет значение true, то перед закрытием смены будет отображен диалог с возможностью отложить процедуру закрытия смены. Время отображения диалога определяется параметром alarmTimeout. Если в течение указанного времени пользователь не отложит закрытие, то смена будет закрыта автоматически. Интервал повторного отображения диалога после выбора отложенного закрытия смены определяется параметром alarmInterval

Если параметр postponeShiftClose имеет значение true, то выполнение закрытия смены откладывается до завершения работы с текущим чеком. Закрытие будет выполнено после закрытия или отмены чека.

API для удаленного закрытия смены

Плагин "Операционный день" поддерживает следующие команды (GET-запросы):

  • getState – получение состояния, команда без параметров,
  • closeShift – закрытие смены. Обязательные параметры cashierName – ФИО кассира, инициирующего закрытие смены, cashierCode – код кассира,
  • closeShiftResult – результат закрытия смены.

Команды можно выполнять через любую программу, отправляя GET-запросы, например:

curl --location --request GET 'http://192.169.10.8:38082/getState'
curl --location --request GET 'http://192.169.10.8:38082/closeShift?cashierName=Test&cashierCode=999'
curl --location --request GET 'http://192.169.10.8:38082/closeShiftResult'

Ответы на запросы

Ответы на запросы возвращаются в формате json.

Наименования полей совпадают с наименованием аналогичных полей, выгружаемых через aif. Поэтому в некоторых полях используются заглавные буквы, а в некоторых нет.

Запрос на получение состояния (getState)

При выполнении запроса на получение состояния могут быть получены следующие ответы:

Пример ответа, если в смене нет закрытых чеков, в первый чек добавлен товар
{
  "canCloseShift": false,
  "cashInfo": {
    "kkms": [],
    "mode": "normal"
  },
  "context": "receiptforming",
  "error": "Смена не открыта",
  "shift": {
    "cashCode": "177",
    "countBack": 0,
    "countMoneyIn": 0,
    "countMoneyOut": 0,
    "countSale": 0,
    "firstchecktime": "",
    "shift": 280,
    "shopCode": "1234567890",
    "status": "new",
    "statusDescription": "Новая смена",
    "sumBack": "0.00",
    "sumMoneyIn": "0.00",
    "sumMoneyOut": "0.00",
    "sumSale": "0.00",
    "timeBeg": "",
    "timeEnd": ""
  },
  "user": {
    "userCode": "4",
    "userName": "Мастер"
  }
}

, где:

  • canCloseShift – флаг возможности закрытия смены. Если true, то смену можно закрыть, false – смену закрыть нельзя,
  • cashInfo – информация о кассе:
    • kkms – информация о ККМ (в виде списка),
    • mode – режим работы. Возможные значения: normal – обычный режим, demo – демо-режим, training – тренировочный. Так как возможно сочетание демо и тренировочного режима, то в этом случае возвращается значение demo|training.

      На SCO при переходе в режим кассира не передается информация о режиме, поэтому будет отображаться "mode": "normal".

  • context – поле с именем текущего контекста,

  • error – текст ошибки,

  • shift – информация о смене:

    • cashCode – код кассы,

    • countBack – количество возвратов,

    • countMoneyIn – количество внесений,

    • countMoneyOut – количество выемов,

    • countSale – количество продаж,

    • firstchecktime – дата и время первого чека в смене,

    • shift – номер смены,

    • shopCode – код магазина,

    • status – статус смены. Возможные значения: new – новая смена, open – открытая смена, closed – закрытая смена, inCloseProcess – смена в процессе закрытия, errorOnClose – ошибка в процессе закрытия смены,

    • statusDescription – описание статуса смены. Возможные значения соответствуют вышеприведенным статусам: Новая смена, Смена открыта, Смена закрыта, Смена в процессе закрытия. В случае ошибки в качестве описания возвращается текст ошибки,

    • sumBack – сумма возвратов,

    • sumMoneyIn – сумма внесений,

    • sumMoneyOut – сумма выемов,

    • sumSale – сумма продаж,

    • timeBeg – дата и время открытия смены,

    • timeEnd – дата и время закрытия смены,

  • user – текущий пользователь:

    • userCode – код пользователя,

    • userName – имя пользователя.

Пример ответа, если в смене есть закрытый чек
{
  "canCloseShift": true,
  "cashInfo": {
    "kkms": [
      {
        "countBack": "",
        "countMoneyIn": "",
        "countMoneyOut": "",
        "countSale": "",
        "fnnumber": "9999078902008655",
        "kkmNum": 1,
        "serialNum": "0381080012020518",
        "shiftnumkkm": 102,
        "sumBack": "0.00",
        "sumMoneyIn": "0.00",
        "sumMoneyOut": "0.00",
        "sumSale": "0.00",
        "unsenddoccount": -1,
        "unsenddocdate": ""
      }
    ],
    "mode": "normal"
  },
  "context": "receiptview",
  "shift": {
    "cashCode": "177",
    "countBack": 0,
    "countMoneyIn": 0,
    "countMoneyOut": 0,
    "countSale": 1,
    "firstchecktime": "2022-02-25T11:20:26",
    "shift": 280,
    "shopCode": "1234567890",
    "status": "open",
    "statusDescription": "Смена открыта",
    "sumBack": "0.00",
    "sumMoneyIn": "0.00",
    "sumMoneyOut": "0.00",
    "sumSale": "20.90",
    "timeBeg": "2022-02-25T11:22:14",
    "timeEnd": ""
  },
  "user": {
    "userCode": "4",
    "userName": "Мастер"
  }
}

, где для kkms:

  • fnnumber – номер ФН,

  • kkmNum – порядковый номер ККМ,

  • serialNum – серийный номер ККМ (на чеках ЗН ККТ),

  • shiftnumkkm – номер смены в ККМ,

  • unsenddoccount – количество документов, неотправленных в ОФД,

  • unsenddocdate – дата и время первого неотправленного документа в ОФД,

  • Поля countBack, sumBack и т.д. аналогичны одноименным полям в смене.

Пример ответа после закрытия смены
{
  "canCloseShift": false,
  "cashInfo": {
    "kkms": [
      {
        "countBack": "0",
        "countMoneyIn": "0",
        "countMoneyOut": "0",
        "countSale": "1",
        "fnnumber": "9999078902008655",
        "kkmNum": 1,
        "serialNum": "0381080012020518",
        "shiftnumkkm": 102,
        "sumBack": "0.00",
        "sumMoneyIn": "0.00",
        "sumMoneyOut": "0.00",
        "sumSale": "20.90",
        "unsenddoccount": 0,
        "unsenddocdate": ""
      }
    ],
    "mode": "normal"
  },
  "context": "mainmenu",
  "error": "Смена не открыта",
  "shift": {
    "cashCode": "177",
    "countBack": 0,
    "countMoneyIn": 0,
    "countMoneyOut": 0,
    "countSale": 1,
    "firstchecktime": "2022-02-25T11:20:27",
    "shift": 280,
    "shopCode": "1234567890",
    "status": "closed",
    "statusDescription": "Смена закрыта",
    "sumBack": "0.00",
    "sumMoneyIn": "0.00",
    "sumMoneyOut": "0.00",
    "sumSale": "20.90",
    "timeBeg": "2022-02-25T11:22:15",
    "timeEnd": "2022-02-25T11:23:07"
  },
  "user": {
    "userCode": "4",
    "userName": "Мастер"
  }
}

Поля countBack, sumBack, countSale, sumSale, countMoneyIn, sumMoneyIn, countMoneyOut, sumMoneyOut, unsenddoccount, unsenddocdate для kkms заполняются только при закрытии смены, так как эти данные запрашиваются у ФР при закрытии смены.

Пример ответа при запросе во время закрытия смены, если возникла ошибка
{
    "canCloseShift": false,
    "cashInfo": {
        "kkms": [],
        "mode": "normal"
    },
    "context": "shiftclose",
    "error": "Процесс закрытия смены уже начался",
    "shift": {
        "cashCode": "777",
        "countBack": 0,
        "countMoneyIn": 0,
        "countMoneyOut": 0,
        "countSale": 1,
        "firstchecktime": "2024-01-30T02:49:49",
        "shift": 132,
        "shopCode": "123",
        "status": "errorOnClose",
        "statusDescription": "Ошибка при закрытии смены",
        "sumBack": "0.00",
        "sumMoneyIn": "0.00",
        "sumMoneyOut": "0.00",
        "sumSale": "67.00",
        "timeBeg": "2024-01-30T02:50:04",
        "timeEnd": "2024-01-30T03:05:57"
    },
    "user": {
        "userCode": "4",
        "userName": "Мастер"
    }
}

Пример ответа при запросе после закрытия смены, если во время закрытия смены возникла ошибка
 {
    "canCloseShift": true,
    "cashInfo": {
        "kkms": [],
        "mode": "normal"
    },
    "context": "registration",
    "shift": {
        "cashCode": "777",
        "countBack": 0,
        "countMoneyIn": 0,
        "countMoneyOut": 0,
        "countSale": 0,
        "firstchecktime": "",
        "shift": 133,
        "shopCode": "123",
        "status": "new",
        "statusDescription": "Новая смена",
        "sumBack": "0.00",
        "sumMoneyIn": "0.00",
        "sumMoneyOut": "0.00",
        "sumSale": "0.00",
        "timeBeg": "",
        "timeEnd": ""
    },
    "user": {
        "userCode": "4",
        "userName": "Мастер"
    }
}  

Запрос на закрытие смены (closeShift)

При выполнении запроса на закрытие смены могут быть получены следующие ответы:

Пример ответа, если смену закрыть нельзя
{
    "errorCode": 1,
    "errorMessage": "Обнаружен незавершенный чек" 
}
Пример ответа, если началось закрытие смены
{
    "errorCode": 0,
    "errorMessage": "OK"
}

, где:

  • errorCode – результат выполнения операции. Возможные значения: 0 – успешно, 1 – ошибка.

  • errorMessage – текст результата выполнения операции. Возможные значения: OK – в случае успеха, текст ошибки – в случае ошибки.

Предполагается, что при выполнении длительных операций в ответ отправляется "OK" при начале выполнения операции, а далее КС должен запрашивать состояние до окончания выполнения длительной операции.

При закрытии смены данные кассира, переданные в запросе, записываются в БД Documents таблицу Workshift (поле scode – код кассира), users (поля usercode – код кассира, username – имя кассира), crights (cashiercard – код кассира, cashiername – имя кассира).

При закрытии смены по команде происходит переход в главное меню и блокировка кассы.

Если смена была закрыта, а в новой смене ещё не было операций, то при запросе состояния возвращаются данные о закрытой смене.

Запрос о результате закрытия смены (closeShiftResult)

При перезапуске кассового ПО json-объект с результатом закрытия смены перезаписывается, значения полей объекта сбрасываются.

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

Пример ответа, если при закрытии смены ошибки не обнаружены
{
  "closedatetime": "2022-02-21T15:40:18.640+07",
  "context": "registration",
  "errors": []
}
Пример ответа при запросе во время закрытия смены, если возникла ошибка
{
  "closedatetime": "+07",
  "context": "shiftclose",
  "errors": []
}
Пример ответа при запросе после закрытия смены, если во время закрытия смены возникла ошибка
{
  "closedatetime": "2024-01-30T03:06:34.852+00",
  "context": "registration",
  "errors": [
    {
      "COMMAND_VERIFYTOTAL": "Ошибка при выполнении операции"
    }
  ]
}

, где:

  • closedatetime – время последнего закрытия смены,
  • context – поле с именем текущего контекста,

  • errors – список соответствий "<действие>: <сообщение_об_ошибке>".

API для удаленного оповещения кассира

Плагин "Операционный день" поддерживает команду (POST-запрос):

  • acceptNotification – оповещение кассира с действием.

Команду можно выполнять через любую программу, отправляя POST-запрос, например:

curl --location --request POST 'http://192.169.10.8:38082/acceptNotification' \
--header 'Content-Type: application/json' \
--data '{
"message": "<текст сообщения>",
"action": "<действие>"
}'

Тело запроса:

НаименованиеТип данныхОписаниеПримечание
messageтекстовыйТекстовое сообщение, которое будет показано в окне кассовой программы    Необязательное
actionтекстовыйДействие, выполняемое после показа сообщенияЗначение action не может быть пустым

Допустимые значения параметра action (возможные действия):

  • restart – перезапуск программы;

  • reboot – перезагрузка кассы;

  • restartWithBlock – перезапуск программы с последующей блокировкой кассы;

  • undefined – при оповещении не выполняется никаких действий.

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

В результате выполнения команды будет создан файл /linuxcash/cash/data/tmp/notification.json.

Ответ на запрос

Ответ на запрос возвращается в формате json.

Запрос на оповещение кассира с действием (acceptNotification)

При выполнении запроса могут быть получены следующие варианты ответов:

Пример успешного ответа
{"errorCode":0,"errorMessage":"OK"}
Пример ответа, если задано недопустимое значение параметра action
{"errorCode":1,"errorMessage":"Недопустимое значение action: shutdown"}
Пример ответа, если не удалось создать файл
{"errorCode":1,"errorMessage":"Не удалось создать временный файл /linuxcash/cash/data/tmp/notification.json.tmp"}

, где:

  • errorCode – результат выполнения операции. Возможные значения: 0 – успешно, 1 – ошибка.
  • errorMessage – текст результата выполнения операции. Возможные значения: OK – в случае успеха, текст ошибки – в случае ошибки.
  • No labels