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

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

Активация плагина "Операционный день" определяется параметром 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строковый
Идентификатор пользователя, от имени которого смена будет закрываться по времени и при выключении кассы
Пример настройки
[OperationDay]

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

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

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

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

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

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

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

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

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

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 – список соответствий "<действие>: <сообщение_об_ошибке>".

  • No labels