NAV Navbar
  • 1. Introduction
  • 2. Launch API on iKKM
  • 3. Protocol basics
  • 4. Web-API key
  • 5. Fiscal operations
  • 6 Bank operations
  • 7. Checking the status
  • 8. Printer mode
  • 9. Directories and Reports
  • 10. Management
  • 11. Error codes
  • Document version 22, iKKM firmware 1016 and greater.

    1. Introduction

    Integration of iKKM API, is different from traditional integration with Cash registrars, usually connected by COM / USB. In legacy Cash registers, the process of data exchange consists of 5-6 steps: polling the state, opening a receipt, transferring the receipt data, obtaining status, etc.

    In iKKM, due to the use of the web server, the entire process of data exchange consists of the transmission of one request. However, in case of a situation when the POS system software constantly requires polling of any parameters, iKKM provides all necessary functions (see chapter Additional features)

    2. Launch API on iKKM

    Web-api mode is available when iKKM is connected via LAN or WiFi. Before you start, you need to enable web-api in the Main Menu - Fiscal Registrar - Fiscal Mode, then Log in, select the default tax, and click on the 'Enable Web Cashier' All this actions are described in detail in iKKM user manual, and also in the knowledge base. If you have any questions, open a ticket in support service

    3. Protocol basics

    The data is sent using the HTTP / 1.1 protocol. The TCP port is always 8080, the methods POST or GET are allowed (only in a few cases, only POST is used). Use the most appropriate method for you.

    The standard request timeout is 30 seconds. When the shift is closing, up to 90 seconds. The number of requests is not more than one per second.

    The transmitted parameters are case-sensitive. There are two types of data string and number

    String

    Use the Utf-8 encoding. English, Russian and Kazakh alphabets are supported.

    Number (Int, Float)

    The maximum allowed value is 20 million. The transmitted numbers can be integers or floats, delimiter . (dot) when sending amounts more than 2 characters (hundredths), rounding occurs. In case of quantity represented by weight rounding is 3 decimals.

    To check whether rounding is enabled or not, use the report /apicheck/getInfo

    4. Web-API key

    For authorization in all requests, the parameter key consisting of 8 numbers is passed. After any successful operation with the database or iKKM fiscal memory, the web-api key changes, the new key comes as a response. On the next request, you need to use a new key.

    If the key in the web-api request does not match the current one, iKKM returns an error. The only exception is the registration method /api/sale | buy | ... in case of transfer of the previous key, iKKM will repeat the answer: return a new key, print a duplicate of the receipt, but the operation will not be duplicated.

    You can find out the actual web-api key on the iKKM screen before launching the Web-api mode; read the QR code from the iKKM display, or remotely login under the administrator rights in the web management (web-api key can be found on the first page).

    5. Fiscal operations

    5.1 Registration

    Registration is the main operation of iKKM, registration affects iKKM database and fiscal memory. The method calls /api/ ..., the following parameters are passed:

    Types of registration

    Successful sale of 800 tenge, received 1000, change 200

    GET /api/?key=12345678&sale=800&cash=1000 HTTP/1.1
      Response: 200 (text/plain)
      Description: 123 #Receipt number for successful operation
      Body: 87654321
    

    Invalid query execution

    GET /api/?key=12345678&sale=800&cash=200 HTTP/1.1
      Response: 400 (text/plain)
      Description: cash-lq-sale #The cash accepted is less than the receipt total sum
      Body: -10
    

    The main trading operations are only four:

    Payment

    A successful example of mixed (cash and bank) payment

    GET /api/?key=12345678&sale=800&cash=500&bank=400 HTTP/1.1
      Response: 200 (text/plain)
      Description: 124
      Body: 87654321
    

    Invalid operation

    GET /api/?key=12345678&sale=800&cash=2000&bank=800 HTTP/1.1
      Response: 400 (text/plain)
      Description: no-cache-hq-sale #Receipt already been payed by bank, cash not allowed.
      Body: -13
    

    Types of payment:

    Tax selection (optional)

    tax - An optional parameter that is used to select a tax that is not specified by default. The parameter value is the tax id (to get tax id, see request for tax dictionary)

    Table part of receipt (optional)

    iKKM can fill out the table part of the receipt as follows:

    Example of parameter itemdata

    [{
        "name": "Tea",
        "price": "200",
        "qty": "2",
        "sum": "400"
    }, {
        "name": "Stake",
        "price": "6000",
        "qty": "2",
        "sum": "12000"
    }, {
        "name": "discount 10%",
        "discount": "1240" #if is discount parameters price|qty|sum not included in item
    }]
    

    print is an optional parameter for printing a table part of a receipt or advertisement. The method of sending the request is only POST, encoding UTF-8. The number of lines is unlimited, separating the string \n.

    The following line sizes are allowed:

    itemdata - optional parameter, serves for printing and transferring the table part of the receipt to the Tax Online server. Method of transmission only POST, encoding UTF-8. JSON data format. Maximum number of positions in one receipt is 80. In case of excess, all items will be printed, but one position with the name of the registration type will be sent to the Online server, for example: Sale 1x100 = 100 tg. If the parameter print is also transfered along withitemdata, it will be printed first.

    footer - optional parameter, serves for printing advertising text at the end of the receipt, the method is only POST. In this parameter, you can print barcodes, the format is described in printHeader

    5.2 Answers

    TCP dump of answer (200 - success, 164 - receipt number, 29852781 - new web-api key )

    HTTP/1.1 200 164
    Content-Length: 8
    Content-Type: text/html; charset=UTF-8
    Date: 2017-02-15 15:00
    
    29852781
    

    The iKKM reply is returned in text format, only the number. If the answer is a positive number of length 8, the query is executed successfully and you have received a new web-api key. If reply body text is negative, look at the error codes.

    Additionally if the request is successful, the HTTP status will be 200, and the description will contain the receipt number.

    If errors occur, the HTTP status code will be 400, and the description (HTTP status description) will contain a short reason for the error, for example:bank-param-error.

    5.3 Other operations

    Other cash operations

    GET /apiwithdraw/?key=12345678&cash=200 HTTP/1.1
      Response: 200 (text/plain)
      Description: 126
      Body: 12345678
    

    Cash withdraw / deposit

    GET /apideposit/?key=12345678&cash=2000 HTTP/1.1
      Response: 200 (text/plain)
      Description: 127
      Body: 12345678
    

    Print X-report

    GET /apixreport/?key=12345678 HTTP/1.1
      Response: 200 (text/plain)
      Description: x-report-started
      Body: 0
    

    Shift close (operational day) and print Z-report

    GET /apizreport/?key=12345678 HTTP/1.1
      Response: 200 (text/plain)
      Description: z-report-started
      Body: 0
    

    Withdraw / Deposit cash

    The value of cash is only a positive number.

    Shift close, Z and X reports

    For correct cash discipline, we recommend using the iKKM interface directly for cash withdrawal and shift closing.

    However, you can perform all operations via web-api if necessary. The web-api key will not change after this operations.

    There is no provision for answers, you can always get the data of any shift and operations by completing the requests for receiving reports or use the Tax Committee website.

    6 Bank operations

    6.1 Start payment

    Starting a bank card payment

    GET /apibank/?key=12345678&message=purchase&amount=1500&trackdocument=345 HTTP/1.1
      Response: 200 (text/plain)
      Description: bank-is-opened
      Body: 0
    

    To run the banking application, execute the /apibank/... method, the following parameters are passed:

    The possible values message is:

    6.2 Getting Results

    Detailed information getInfo

    {
        "foundTransactions": "1",
        "totalAmount": "200.00",  
        "transactionResult": "success",
        "details": [{  # array of transactions
            "AID": "VISA CREDIT", 
            "PAN": "1234 XXXX XXXX 1234",
            "amount": "100.00",
            "bankslot": "1",
            "cardHolderName": "CARDTESTNAME",
            "currency": "398",
            "dateTime": "22-11-2017 17:19:55",
            "operationType": "purchase", 
            "refnum": "100000000013",
            "responce": "00",
            "result": "success", # success | fail
            "traceNumber": "60"
        }],
    }
    

    You can get the result by running the query: /dump/bank/[trackdocument number]/trackdocument

    1. foundTransactions number of transactions found
    2. totalAmount the total amount of successful transactions
    3. transactionResult the result of the operationsuccess | fail
    4. details list of all transactions (array):
      1. AID payment system
      2. PAN card number
      3. amount amount
      4. bankslot bank slot (in case we have multi-bank this is important)
      5. cardHolderName the cardholder (usually empty)
      6. currency currency code
      7. dateTime date and time (yyyy-MM-dd hh: mm: ss)
      8. operationType operation typepurchase | refund | reversal
      9. refnum reference number (from the bank)
      10. responce bank response code
      11. result the result of the operationsuccess | fail
      12. traceNumber the document number for the bank

    7. Checking the status

    To get the status of iKKM, use the /apicheck query, Positive answer 0 - iKKM is ready to work. The HTTP status code will be 200, the description will contain the number of the last closed receipt, if the receipt number is 0 (zero) this means that this is a new iKKM.

    You do not need to request for the status of iKKM before each registration, as any method of registration conducts all the checks.

    7.1 Additional Features of apicheck

    Detailed info: getInfo

    {   "applicationVersion": 101021, # version of the application, integer
        "batteryCapacityPerc": "80", # battery charge (if any)
        "cashWeHave": "1108.00", # cash currently cashier has 
        "cashierID": "166", # ID of the current cashier
        "cashierName": "default", # cashier's name
        "currentShiftID": "109", # number of the current work shift
        "currentShiftStatus": "closed", # change state (opened | closed)
        "databaseSizeKb": "46", # database size in KB
        "defaultApiTaxID": "15", # Default tax ID
        "factorySerialNumber": "011700029000", # factory number iKKM
        "lastClosedChequeId": "4231", # last closed receipt number
        "messagesQueSize": "0", # the queue size of not sent messages to the Tax Committee
        "printingMode": "internal", # print mode external or internal printer
        "roudingRule": "no", # rounding rule
        "totalFlashUsedMb": "78", # total used flash memory
        "totalRamUsedMb": "70" # free memory}
    

    8. Printer mode

    123456789012345678901234567890
    Brick quiz whangs jumpy veldt 
    fox!
    --cut--
    съешь ещё этих мягких францу-
    зских булок, да выпей чаю.
    --line--
    Жылқының еті жесең-тісіне 
    кіреді, жемесең-үсіңе кіреді.  
    --cut--
    --open-cash--
    

    For printing, you need to send the parameter print containing the text to /apiprint. Sending request only POST, encoding UTF-8. Line separators: \n. The following line sizes are allowed:

    If you use an external printer, the following commands are available:

    Print a logo in this method is not provided.

    9. Directories and Reports

    For easy integration with your application all iKKM replies in JSON format

    9.1 Directories

    Directories Goods

    [{
        "uid": 11, # internal and unique product code
        "code1": 888, # unique product code
        "code2": "008123563127", # barcode
        "name": "Coffee", # product name
        "price1": 77, # retail price
        "itemtax1": 2, # tax code (see directory of taxes)
        "itemtype": 0, # type
        "measure": 0, # measurement
        "catalogid": 16 # directory code (see directory directory)
    },...
    }]
    

    Directories Goods /dump/table/items Not required in web-api mode, since computer POS is responsible for items. In case when merchant use iKKM for traveling and trading autonomously this is usefull.

    1. uid internal and unique product code
    2. code1 unique product code
    3. code2 barcode
    4. name name of the product
    5. price1 retail price
    6. itemtax1 tax code (see the directory taxes)
    7. itemtype product type | services
    8. measure type of measurement
    9. catalogid directory code (see directory catalog)

    Directories Catalog

    {   "1": "Kitchen",
        "2": "Bar",
        ... }
    

    Directories Catalog /dump/table/catalog Not required in web-api mode

    1. Internal ID
    2. Folder name

    Directories Taxes

    {   "1": "VAT 13%",
        "2": "w/o VAT",
    ...}
    

    Directories Taxes /dump/table/taxes

    1. Internal ID
    2. Tax Name

    When you edit the tax, for example, % of the rate, the tax code will also change automatically, so do not hard-code the tax ID in your program.

    Directory Cashiers

    {   "100": "Aliya cashier",
        "201": "Natasha manager",
    ...}
    

    Directory Cashiers /dump/table/cashiers

    1. Cashier ID
    2. Cashier Name

    9.2 Reports

    These methods are available to users Senior Cashier or Administrator. All methods start with /dump

    Report all shifts

    [{
        "id": 12, # Shift number
        "opened": 0, # 1 - the change is open, 0 - the change is closed
        "openDate": "2016-01-18 20:41:06", # the date of the opening of the shift
        "closeDate": "2016-01-19 17:21:46", # closing date of the shift
        "cashierId": 166, # cashier code
        "sale": 5210, # the sum of all sales at the beginning of the shift
        "buy": 100, # sum of all purchases at the beginning of the shift
        "saleReturn": 803, # the sum of all sales returns at the beginning of the shift
        "buyReturn": 50 # the sum of all returns of purchases at the beginning of the shift
    },
    }]
    

    Report all shifts /dump/table/shifts Returns all shifts except archived

    1. id Shift number
    2. opened Change status: 1 - open, 0 - closed
    3. openDate the date the shift was opened (yyyy-MM-dd hh: mm: ss)
    4. closeDate the closing date of the shift (yyyy-MM-dd hh: mm: ss)
    5. cashierId cashier code
    6. sale the sum of all sales at the beginning of the shift
    7. buy the sum of all purchases at the beginning of the shift
    8. saleReturn sum of all sales returns at the beginning of the shift
    9. buyReturn the sum of all returns of purchases at the beginning of the shift

    Receipts report

    [{
        "chequeId": 244, # receipt number
        "chequeDate": "2016-01-18 20:41:08", # the date of the receipt opening
        "chequeType": "1", # 0 - sale, 1 - purchase, 2 - return of sale, 3 - return of purchase
        "chequeSales": [{
            "id": 878, # sale code
            "itemCode": "1001", # item code (can be empty)
            "qty": 1, # number (can be Double)
            "price": 23, # unit price
            "saleSum": 23, # sale amount
            "taxId": 2 # tax code
            }, ...
        ],
    
    }]
    

    Receipts report /dump/table/shifts/[shift-number]/cheques

    1. chequeId is the receipt number
    2. chequeDate the date of the receipt opening
    3. chequeType receipt type 0 - sale, 1 - purchase, 2 - return of sale, 3 - return
    4. chequeSales Table of the receipt:
      1. id sales code
      2. itemCode product code (can be empty)
      3. qty number (can be Double)
      4. price unit price
      5. saleSum sale amount
      6. taxId tax code

    Use /salescheques instead of/cheques at the end of the query, to get a flat structure

    Operations reports

    [{
        "id": 878, # sale code
        "chequeId": 244, # receipt number, sort result by this field
        "itemCode": "1001", # item code (can be empty)
        "qty": 2, # number (can be Double even if rounded amounts are included)
        "price": 30, # unit price
        "saleSum": 60, # sale amount
        "taxId": 2 # tax code
    },….] 
    

    Operations reports /dump/table/shifts/[shift-number]/sales

    1. id sales code
    2. chequeId receipt number, sort result by this field
    3. itemCode item code (can be empty)
    4. qty quantity (can be Double even if the sums are rounded off)
    5. price unit price
    6. saleSum sale amount
    7. taxId tax code

    Shift report (z/x-report)

    {
        "shiftState": "closed", # switch status is closed or open
        "dateOpen": "2016-07-18 20:03", # the opening time of the shift
        "dateClose": "2016-07-18 20:03", # the closing time of the shift (if the shift is closed)
        "fiscalDataOnShiftOpen": {# fiscal data at the beginning of the shift
        "sale": 218861420.47, # the sum of all sales
        "buy": 529.70, # amount of all purchases
        "saleReturn": 19999600.00, # the sum of all sales returns
        "buyReturn": 0.00}, # the sum of all returns of purchases
    
        "totalSaleCheques": 1200, # the number of all sales receipts
        "saleDetails": {"sum": 1000.00, "cheques": 12}, # sales amount per shift
        "totalBuyCheques": 1007, # shopping information
        "buyDetails": {"sum": 0.00, "cheques": 0},
        "totalSaleReturnCheques": 1000, # information on sales returns
        "saleReturnDetails": {"sum": 0.00, "cheques": 0},
        "totalBuyReturnCheques": 947, # information on returns of purchases
        "buyRetDetails": {"sum": 0.00, "cheques": 0},
    
        "cashOutDocCount": 1, # number of documents withdrawing cash
        "cashOutTotal": 100.00, # cash withdrawn
        "cashInDocCount": 0, # number of cash advance documents
        "cashInTotal": 0.00, # cash deposited
        "cashWeHave": 1108.00, # cash on hand
        "revenue": 0.00, # income
        "fiscalData": {# current fiscal data
            "sales": 218867407.47,
            "buy": 529.70,
            "saleReturn": 19999600.00,
            "buyReturn": 0.00
        }
    }
    
    ...
        #Shift report + taxes (.../reportwithtax)
        "taxes": {
            "sale": [{
                "taxId": 5,
                "turnover": 815.00,
                "taxDetails": [{
                    "taxId": 5,
                    "isIncluded": "true",
                    "taxPercent": 12,
                    "amount": 87.32
                }]
            }]...
        }
    

    Shift report (z/x-report) /dump/table/shifts/[shift-number]/report

    If the change is in the archive, only the fiscal data will be returned and the value of isArhived = true

    1. shiftState change status is closed or open (closed | opened)
    2. dateOpen time of shift opening (yyyy-MM-dd hh: mm: ss)
    3. dateClose the closing time of the shift (if the shift is closed)
    4. fiscalDataOnShiftOpen fiscal data at the beginning of the shift
      • sale the sum of all sales
      • buy the amount of all purchases
      • saleReturn the amount of all sales returns
      • buyReturn the amount of all returns
    5. totalSaleCheques the number of all sales receipts
    6. saleDetails sales per shift
      • sum sum
      • cheques number of receipts
    7. totalBuyCheques the number of all purchase receipts
    8. buyDetails purchases per shift
      • sum sum
      • cheques number of receipts
    9. totalSaleReturnCheques the number of all receipts for returns on sales
    10. saleReturnDetails returns sales per shift
      • sum sum
      • cheques number of receipts
    11. totalBuyReturnCheques the number of all receipts on returns of purchases
    12. buyRetDetails refunds of purchases per shift
      • sum sum
      • cheques number of receipts
    13. cashOutDocCount number of documents withdrawing cash
    14. cashOutTotal cash withdrawn
    15. cashInDocCount number of documents for cash inflows
    16. cashInTotal is paid in cash
    17. cashWeHave cash on hand
    18. revenue income
    19. fiscalData current fiscal data, do not depend on the chosen shift (relevant if you specified the ID of the last shift)
      • sale the sum of all sales
      • buy the amount of all purchases
      • saleReturn the amount of all sales returns
      • buyReturn the amount of all returns

    To include taxes details in the report, use /reportwithtax instead of /report at the end of the query.

    Receipt details

    {
        "docid": "247", # receipt number
        "createDate": "2016-01-20 18:10:43", # creation date
        "submitDate": "2016-01-20 18:11:12", # sending date
        "status": 1, # 0 - not sent to the Tax Committee, 1 - sent
        "onlineCode": "020223112" # online receipt number (can be empty)
    }
    

    Receipt details [/dump/transaction/web-key-of-receipt]

    Example: /dump/transaction/11112222?key=33334444 Where: 11112222 - web-key of requesting receipt, 33334444 - current actual web-api key

    1. docid receipt number
    2. createDate the creation date (yyyy-MM-dd hh:mm:ss)
    3. submitDate the sending date (yyyy-MM-dd hh:mm:ss)
    4. status status 0 - not sent to Tax Committee, 1 - sent
    5. onlineCode online receipt number (can be empty)

    10. Management

    10.1 Sessional variables

    In some cases, it is necessary to quickly change some iKKM parameters during operation. For this purpose these functions are intended. Note that these parameters are not saved and After reboot will return to the original states set in the iKKM settings.

    Buzzer

    Sometimes it is necessary to attract the attention of the cashier, use the request: /apicheck/?beep=true

    Quick Z-report

    The reason for the long operation of the Z-report (~ 40 seconds) is the need for a time delay between the withdrawal of cash and the closure of the shift. If you cash withdrawal operation occurs separately with the closing shift, use the fast Z-report timers.

    Working with an external LAN printer

    In some cases, you can significantly speed up the printing of a receipt on Lan printer while keeping a constant TCP connect to the printer.

    Changing print mode

    If you need to switch for example from LAN to an internal printer, you can use the queries:

    Printing modes:

    1. lan-printer
    2. internal-printer
    3. usb-printer

    Message que management for Tax Committee

    You can switch from online message processing to batch with this command: /apicheck/?ofdPacketMode=true

    To manually push a message que, use this request: /apicheck/?pushTheQue=true Please note: in batch mode iKKM will not automatically send messages.

    To return to normal, online operation mode, use this request: /apicheck/?ofdNormalMode=true

    Disable web management

    In addition to the API, iKKM has a interface for managing and viewing the device status. To disable this interface, use the query: /apicheck/?disableWebMgmt=true

    Restrict access by IP

    After sending the request /apicheck/?Lockhost=true all subsequent requests from other hosts will be rejected. This setting is valid until iKKM reboots. At the beginning of the cashier's session, we recommend that you enable this option to improve security.

    Additional text in receipt

    You can set up printing of advertising text (as well as other variables) in one query, at the very beginning of the cashier session.

    In order to add advertising text for printing in the top of the receipt, use '/apicheck', the parameter printHeader, the method is only POST. After the query is executed, the text will be printed on all receipts until the iKKM reboots. To remove the advertising text, send the same parameter: printHeader with the value clear.

    Example of text with barcode printing

    * Advertising * Advertising *
    --barcodeEAN13-7501031311309--
    you can print multiple bar-
    codes in one text
    --barcode128-TESTCODE123--
    other text...
    

    The following commands are available for printing barcodes in text:

    In CODE128 allowed symbols: a-zA-Z0-9 !?:.,+=_;

    10.2 System functions

    For remote management, you can use the following methods:

    11. Error codes

    11.1 All errors

    TCP dump of error (incorrect web-api key)

    HTTP/1.1 400 incorrect-web-api-key
    Content-Length: 2
    Content-Type: text/html; charset=UTF-8
    Date: 2017-02-15 15:00
    
    -1
    
    answer descr.
    [more than zero] the data is accepted, returns a new web-api key * success, save the web-api key for the next operation
    0 the device is ready for use, you can register
    -1 incorrect web-api key, configure a new key on iKKM
    -2 a registration or banking transaction occurs, please try again later.
    -3 the shift exceeded 24 hours, it is necessary to close the shift
    - 4 offline period of more than 72 hours, solve the communication problem and unlock the ccm
    -5 low battery charge
    -6 The printer is not ready, check the paper
    -7 query error, check the passed parameters
    -8 method error
    -9 error of parameter values ​​to transmit only digits (except print parameter)
    -10 the amount of cash (bank, tara, credit) is less than sale (buy ...), check the logic of working with the API
    -11 change is opened by another cashier, close the shift
    -12 the value of cash is less than the estimated total amount, it can arise if the tax is over the amount
    -13 bank or container or credit more than the total amount (or check already paid for in cash), check the logic of working with the API
    -14 tax error, tax not found
    -15 there is no cash at the checkout (return of sale, purchase), check the transmitted parameters
    -16 Only the senior cashier can perform the operation, check the user
    -17 error processing JSON request in itemdata, check the logic of working with the API
    -18 The IP address of the host from which the request was made is rejected
    - 100 ... -199 kkm is blocked by the Tax Committee. see Tax Committee documentation (subtract 100 from their error codes)
    - 99 iKKM error "see the iKKM event log in the device status menu"
    no answer the iKKM does not work, check the network, whether the web-api mode is turned on, etc.

    11.2 Short descriptions

    These errors can be read in the HTTP header, the HTTP status description field

    HTTP status description HTTP Body descr.
    no-web-api-key-provided -7 Not passed the web-api key
    incorrect-web-api-key -1 Not a valid web-api key
    ikkm-is-blocked -100 Tax Committee blocked iKKM
    check-external-printer -6 No connection to external printer
    check-printer-or-batt -6 No paper or low battery
    sale-param-error -9 Error passing parameter
    buy-param-error -9 Error passing parameter
    saleRet-param-error -9 Error passing parameter
    buyRet-param-error -9 Error passing parameter
    check-all-params -7 Check all parameters
    payment-params-missed -7 No payment options
    cache-param-error -7 Error passing parameter
    bank-param-error -7 Error passing parameter
    tara-param-error -7 Error passing parameter
    credit-param-error -7 Error passing parameter
    cache-not-in-range -7 Parameter outside the values
    bank-not-in-range -7 Parameter outside the values
    tara-not-in-range -7 Parameter outside the values
    credit-not-in-range -7 Parameter outside the values
    sale-lq-one -7 Value less than 1
    sale-hq-20mil -7 The value is more than 20,000,000
    cash-lq-sale -10 The cash is less than the check amount
    bank-hq-sale -10 Value less than 1
    tara-hq-sale -10 Value less than 1
    credit-hq-sale -10 Value less than 1
    bank-tara-credit-hq-sale -13 Payment by bank transfer is more than the amount of check
    no-cache-hq-sale -13 The check is paid by a bank transfer, cash is banned
    no-mixed-payment-allowed -13 Mixed payment method is disabled in the settings
    change-not-allowed -13 The transfer is prohibited in this operation
    tax-invlid-num -14 Invalid tax code
    tax-not-found -14 Tax code not found
    cash-lq-tax -12 The amount of the check (with tax) is more than the accepted payment
    no-cash-in-pos -15 No cash on hand
    internal-error -99 Internal cashier error (damaged database)
    wrong-cashier -11 Another cashier opened the door
    shift-gt-24h -3 Change is more than 24 hours
    no-last-document -7 No last document
    print-lines-parse-error -7 Parameter parsing error print
    only-master-cashier -16 The operation can be carried out only by the senior cashier
    payment-params-missed -7 Parameters are missing (see cash entry / withdrawal)
    cache-param-error -9 Error passing parameter
    cache-not-in-range -9 Parameter outside the values
    shift-gt-7days -3 Change is open for more than 7 days
    incorrect-method -8 Invalid method specified
    unknown-error -99 Unknown error