За основу взято SDK з https://github.com/igorbunov/checkbox-in-ua-php-sdk, внесено деякі зміни для зручності роботи з API та перекладено на українську мову. Вдячний пану igorbunov за його роботу над цим репо.
В даному SDK реалізовані тільки функції онлайн режиму (офлайн ніт)
https://api.checkbox.ua/api/redoc
https://api.checkbox.ua/api/docs
https://wiki.checkbox.ua/uk/api
composer require digit-soft/checkbox-ua-php-sdk
require_once 'vendor/autoload.php';
адреса серверу http://api.checkbox.ua (тепер тільки одна адреса для продакш та тестування)
версія API - v1
$config = \DigitSoft\Checkbox\Config::makeWithPin(
'ключ лицензії каси',
'PIN-код'
)
або
$config = \DigitSoft\Checkbox\Config::makeWithLoginPass(
'ключ лицензії каси',
'логін касира',
'пароль касира'
)
$api = new \DigitSoft\Checkbox\CheckboxJsonApi($config);
$api->cashier()->signIn();
$api->cashier()->signOut();
\DigitSoft\Checkbox\Exceptions\InvalidCredentials - невірні дані логіну чи паролю
\DigitSoft\Checkbox\Exceptions\EmptyResponse - порожня відповідь
\DigitSoft\Checkbox\Exceptions\Validation - помилка валидації (є детальні дані $err->getDetail())
\DigitSoft\Checkbox\Exceptions\NoActiveShift - Немає активної зміни
\DigitSoft\Checkbox\Exceptions\AlreadyOpenedShift - Зміна вже відкрита
\Exception - стандартна помилка
$api->cashier()->getProfile() : \DigitSoft\Checkbox\Models\Cashier\Cashier // повертає профіль касира
$api->cashier()->getShift() : \DigitSoft\Checkbox\Models\Shifts\Shift // повертає поточну зміну касира
$api->shifts()->one('ID зміни') : \DigitSoft\Checkbox\Models\Shifts\Shift // повертає зміну по ID
$api->shifts()->all() : \DigitSoft\Checkbox\Models\Shifts\Shifts // повертає зміни
або
$api->shifts()->all(
new \DigitSoft\Checkbox\Models\Shifts\ShiftsQueryParams(
[
\DigitSoft\Checkbox\Models\Shifts\ShiftsQueryParams::STATUS_CLOSED,
\DigitSoft\Checkbox\Models\Shifts\ShiftsQueryParams::STATUS_OPENED
], // статуси змін
false, // desc - сортування (false || true)
2, // limit
0 // offset
)
): \DigitSoft\Checkbox\Models\Shifts\Shifts // повертає зміни з урахуванням фільтру
$api->shifts()->create() : \DigitSoft\Checkbox\Models\Shifts\CreateShift // створює/відкриває зміну
$api->shifts()->close() : \DigitSoft\Checkbox\Models\Shifts\CloseShift // закриває зміну
$api->cashRegisters()->all() : \DigitSoft\Checkbox\Models\CashRegisters\CashRegisters // повертає касові реєстратори (пРРО)
або
$api->cashRegisters()->all(
new \DigitSoft\Checkbox\Models\CashRegisters\CashRegistersQueryParams(
true, // inUse - використовується чи ні (true or false)
3, // limit
0 // offset
)
) : \DigitSoft\Checkbox\Models\CashRegisters\CashRegisters // повертає касові реєстратори по фільтру
$api->cashRegisters()->one('ID каси') : \DigitSoft\Checkbox\Models\CashRegisters\CashRegister // повертає касу по ID
$api->cashRegisters()->info() : \DigitSoft\Checkbox\Models\CashRegisters\CashRegisterInfo // повертає інформацію по поточній касі
$api->taxes()->all() : \DigitSoft\Checkbox\Models\Receipts\Taxes\GoodTaxes // повертає всі податки
$api->taxes()->allByCashier() : \DigitSoft\Checkbox\Models\Receipts\Taxes\GoodTaxes // повертає всі податки по поточному касиру
$api->transactions()->all(
new \DigitSoft\Checkbox\Models\Transactions\TransactionsQueryParams(
[
\DigitSoft\Checkbox\Models\Transactions\TransactionsQueryParams::STATUS_CREATED,
\DigitSoft\Checkbox\Models\Transactions\TransactionsQueryParams::STATUS_DONE,
\DigitSoft\Checkbox\Models\Transactions\TransactionsQueryParams::STATUS_SIGNED
], // статуси транзакцій
[
\DigitSoft\Checkbox\Models\Transactions\TransactionsQueryParams::TYPE_RECEIPT,
\DigitSoft\Checkbox\Models\Transactions\TransactionsQueryParams::TYPE_SHIFT_OPEN,
\DigitSoft\Checkbox\Models\Transactions\TransactionsQueryParams::TYPE_Z_REPORT
], // типи транзакцій
2, // limit
0 // offset
)
) : \DigitSoft\Checkbox\Models\Transactions\Transactions // повертає транзакції по фільтру
$api->transactions()->one('ID транзакції') : \DigitSoft\Checkbox\Models\Transactions\Transaction // повертає транзакцію по ID
// Увага! Даний ендпоінт API на даний момент вже прибраний з документації
$api->transactions()->update(
'ID транзакції',
base64_encode('request_signature')
) : \DigitSoft\Checkbox\Models\Transactions\Transaction // змінює request_signature в транзакції, працює тільки якщо у неї статус PENDING
$api->reports()->createX() : \DigitSoft\Checkbox\Models\Shifts\ZReport // створює X звіт
$api->reports()->one('ID звіту') : \DigitSoft\Checkbox\Models\Shifts\ZReport // повертає дані звіту по ID
$api->reports()->oneAsText('ID звіту') : string // повертає дані звіту по ID у вигляді тексту
або
$api->reports()->oneAsText('ID звіту', 60) : string // повертає дані звіту по ID у вигляді тексту, із вказанням ширини тексту
$api->reports()->onePeriodical(
new \DigitSoft\Checkbox\Models\Reports\PeriodicalReportQueryParams(
'2020-10-27T00:00:00+03:00', // дата з
'2020-11-04T13:15:00+03:00', // дата по
60 // ширина тексту
)
) : string // повертає дані звіту за період по фільтру
$api->reports()->all(
new \DigitSoft\Checkbox\Models\Reports\ReportsQueryParams(
'2020-10-27T00:00:00+03:00', // дата з
'2020-11-04T13:15:00+03:00', // дата по
[], // масив ID змін
false, // is_z_report (true or false)
true, // desc - сортування (false or true)
3, // limit
0 // offset
)
) : \DigitSoft\Checkbox\Models\Reports\Reports // повертає звіт по фільтру
$api->receipts()->all() : \DigitSoft\Checkbox\Models\Receipts\Receipts // повертає чеки
$api->receipts()->all(
new \DigitSoft\Checkbox\Models\Receipts\ReceiptsQueryParams(
'', // fiscal code
'', // serial
false, // desc - сортування (false or true)
2, // limit
0 // offset
)
) : \DigitSoft\Checkbox\Models\Receipts\Receipts // повертає чеки по фільтру
$api->receipts()->one('ID чеку') : \DigitSoft\Checkbox\Models\Receipts\Receipt // повертає чек по ID
$api->receipts()->oneAsPdf('ID чеку') : string // повертає чек по ID у вигляді PDF
$api->receipts()->oneAsHtml('ID чеку') : string // повертає чек по ID у вигляді HTML
$api->receipts()->oneAsText('ID чеку') : string // повертає чек по ID у вигляді тексту
$api->receipts()->oneAsImageQrCode('ID чеку') : string // повертає чек по ID у вигляді QR коду
або
// Приклад з відображенням QR-коду
$rawImageContent = $api->receipts()->oneAsImageQrCode('ID чеку');
echo '<img src="data:image/png;base64,' . base64_encode($rawImageContent) . '"/>';
$receipt = new \DigitSoft\Checkbox\Models\Receipts\SellReceipt(
'Вася Пупкін', // касир
'Відділ продаж', // відділ
new \DigitSoft\Checkbox\Models\Receipts\Goods\Goods(
[
new \DigitSoft\Checkbox\Models\Receipts\Goods\GoodItemModel( // товар 1
new \DigitSoft\Checkbox\Models\Receipts\Goods\GoodModel(
'vm-123', // good_id
50 * 100, // 50 грн
'Биовак' // назва товару
),
1 * 1000 // к-сть товару 1 шт
),
new \DigitSoft\Checkbox\Models\Receipts\Goods\GoodItemModel( // товар 2
new \DigitSoft\Checkbox\Models\Receipts\Goods\GoodModel(
'vm-124', // good_id
20 * 100, // 20 грн
'Биовак 2' // назва товару
),
2 * 1000 // к-сть товару 2 шт
)
]
),
new \DigitSoft\Checkbox\Models\Receipts\Delivery(['[email protected]']), // кому надсилати чек на пошту
new \DigitSoft\Checkbox\Models\Receipts\Payments\Payments([
new \DigitSoft\Checkbox\Models\Receipts\Payments\CardPaymentPayload( // безготівкова оплата
40 * 100 // 40 грн
),
new \DigitSoft\Checkbox\Models\Receipts\Payments\CashPaymentPayload( // готівкова оплата
50 * 100 // 50 грн
)
])
);
$api->receipts()->createSell($receipt): \DigitSoft\Checkbox\Models\Receipts\Receipt; // виконуємо оплату
більш складна оплата
$allTaxes = $api->taxes()->all(); // отримали всі податки
$tax = $allTaxes->getTaxByLabel('Акцизний збір'); // отримали один податок за назвою (поле label)
$goodTaxes = $allTaxes->getTaxesByLabel('ПДВ'); // отримали масив податків по label
$taxCodes = [];
// Підготуємо масив кодів податків
foreach ($goodTaxes->results as $goodTax) {
$taxCodes[] = $goodTax->code;
}
$receipt = new \DigitSoft\Checkbox\Models\Receipts\SellReceipt(
'Вася Пупкін', // Ім'я касира
'Відділ продажу', // Відділ
new \DigitSoft\Checkbox\Models\Receipts\Goods\Goods( // товари
[
new \DigitSoft\Checkbox\Models\Receipts\Goods\GoodItemModel(
new \DigitSoft\Checkbox\Models\Receipts\Goods\GoodModel(
'vm-123', // good_id ID товару
5000, // 50 грн ціна 100 = 1 грн
'Біовак', // назва
'5р47ле78675е3', // баркод
'шапка', // header
'футер', // footer
'3700', // uktzed
$goodTaxes // податки товару
),
1000, // к-сть 1000 = 1 шт
new \DigitSoft\Checkbox\Models\Receipts\Discounts\Discounts( // знижки чи надбавки
[
new \DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel(
\DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel::TYPE_DISCOUNT, // знижка або надбавка
\DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel::MODE_VALUE, // по значенню чи по відсотку
100, // 1 грн сума знижки/надбавки 100 = 1 грн
$tax->code, // код податку (підготували вище)
$taxCodes, // масив кодів податку (підготували вище)
'one good discount' // назва
)
]
),
$allTaxes->getTaxesByLabel('Акцизний збір'), // податки товару
false, // повернення товару (false or true)
0, // сума (не використовується в даному SDK)
null // ID товару (тільки якщо ви завантажували список товарів (не використовується в даному SDK))
)
]
),
new \DigitSoft\Checkbox\Models\Receipts\Delivery(['[email protected]']), // кому надсилати чек на пошту
new \DigitSoft\Checkbox\Models\Receipts\Payments\Payments([ // оплати
new \DigitSoft\Checkbox\Models\Receipts\Payments\CardPaymentPayload( // безготівкова оплата
400, // сума оплати 400 = 4 грн
'безготівка', // текст оплати
0, // code - не знаю для чого
'0000 0000 0000 0000' // номер картки
),
new \DigitSoft\Checkbox\Models\Receipts\Payments\CashPaymentPayload( // готівкова оплата
4300, // сума оплати 4300 = 43 грн
'готівка' // текст оплати
)
]),
new \DigitSoft\Checkbox\Models\Receipts\Discounts\Discounts( // знижки/надбавки на весь чек
[
new \DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel(
\DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel::TYPE_DISCOUNT, // знижка чи надбавка
\DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel::MODE_VALUE, // по значенню чи по проценту
200, // 2 грн сума знижки/надбавки 200 = 2 грн
$tax->code, // код податку (підготували вище)
$taxCodes, // масив кодів податку (підготували вище)
'total discount' // назва
)
]
),
'check header', // чек хидер
'check footer', // чек футер
'45435h543twrege' // баркод
);
$saleReceiptResult = $api->receipts()->createSell($receipt): \DigitSoft\Checkbox\Models\Receipts\Receipt; // виконуємо оплату
ще приклад
$allTaxes = $api->taxes()->all();
$tax = $allTaxes->getTaxByLabel('Акцизний збір');
$goodTaxes = $allTaxes->getTaxesByCode('1'); // ПДВ 20%
$taxCodes = [];
foreach ($goodTaxes->results as $goodTax) {
$taxCodes[] = $goodTax->code;
}
$receipt = new \DigitSoft\Checkbox\Models\Receipts\SellReceipt(
'Вася Пупкин',
'Отдел продаж',
new \DigitSoft\Checkbox\Models\Receipts\Goods\Goods(
[
new \DigitSoft\Checkbox\Models\Receipts\Goods\GoodItemModel(
new \DigitSoft\Checkbox\Models\Receipts\Goods\GoodModel(
'vm-123', // good_id
5000, // 50 грн
'Биовак',
null,
null,
null,
null,
$goodTaxes
),
1000,
new \DigitSoft\Checkbox\Models\Receipts\Discounts\Discounts(
[
new \DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel(
\DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel::TYPE_DISCOUNT,
\DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel::MODE_VALUE,
100, // 1 грн
$tax->code,
$taxCodes,
'моя знижка'
)
]
),
$allTaxes->getTaxesByLabel('Акцизний збір'),
false,
0,
''
),
new \DigitSoft\Checkbox\Models\Receipts\Goods\GoodItemModel(
new \DigitSoft\Checkbox\Models\Receipts\Goods\GoodModel(
'vm-124', // good_id
2000, // 20 грн
'Биовак 2',
null,
null,
null,
null,
$goodTaxes
),
2000, // 2 шт
new \DigitSoft\Checkbox\Models\Receipts\Discounts\Discounts(
[
new \DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel(
\DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel::TYPE_EXTRA_CHARGE,
\DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel::MODE_VALUE,
200, // 2 грн
$tax->code,
$taxCodes,
'моя надбавка'
)
]
),
$allTaxes->getTaxesByLabel('Акцизний збір'),
false,
0,
null
)
]
),
new \DigitSoft\Checkbox\Models\Receipts\Delivery(['[email protected]']),
new \DigitSoft\Checkbox\Models\Receipts\Payments\Payments([
new \DigitSoft\Checkbox\Models\Receipts\Payments\CardPaymentPayload(
4700
),
new \DigitSoft\Checkbox\Models\Receipts\Payments\CashPaymentPayload(
4700
)
]),
new \DigitSoft\Checkbox\Models\Receipts\Discounts\Discounts(
[
new \DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel(
\DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel::TYPE_EXTRA_CHARGE,
\DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel::MODE_VALUE,
200, // 2 грн
$tax->code,
$taxCodes,
'загальна надбавка'
)
]
)
);
$api->receipts()->createSell($receipt): \DigitSoft\Checkbox\Models\Receipts\Receipt;
$api->receipts()->createService(
new \DigitSoft\Checkbox\Models\Receipts\ServiceReceipt(
new \DigitSoft\Checkbox\Models\Receipts\Payments\CashPaymentPayload(5100)
)
): \DigitSoft\Checkbox\Models\Receipts\Receipt // створюємо чек сервісного внесення коштів (готівкою)
$api->receipts()->createService(
new \DigitSoft\Checkbox\Models\Receipts\ServiceReceipt(
new \DigitSoft\Checkbox\Models\Receipts\Payments\CardPaymentPayload(1000)
)
): \DigitSoft\Checkbox\Models\Receipts\Receipt // створюємо чек сервісного внесення коштів (картою)
$api->receipts()->createService(
new \DigitSoft\Checkbox\Models\Receipts\ServiceReceipt(
new \DigitSoft\Checkbox\Models\Receipts\Payments\CashPaymentPayload(-5100)
)
): \DigitSoft\Checkbox\Models\Receipts\Receipt // створюємо чек сервісного внесення коштів (готівка) (знак мінус)
$api->receipts()->createService(
new \DigitSoft\Checkbox\Models\Receipts\ServiceReceipt(
new \DigitSoft\Checkbox\Models\Receipts\Payments\CardPaymentPayload(-1000)
)
): \DigitSoft\Checkbox\Models\Receipts\Receipt // створюємо чек сервісного внесення коштів (картою) (знак мінус)
всі операції обгортати в try catch
try {
// код для роботи з API тут
} catch (\DigitSoft\Checkbox\Exceptions\InvalidCredentialsException $err) {
var_dump('creds err', $err->getMessage());
} catch (\DigitSoft\Checkbox\Exceptions\EmptyResponseException $err) {
var_dump('empty response', $err->getMessage(), $err->getTraceAsString());
} catch (\DigitSoft\Checkbox\Exceptions\ValidationException $err) {
var_dump('valid err', $err->getMessage());
var_dump('error detail', $err->getDetail());
} catch (\DigitSoft\Checkbox\Exceptions\NoActiveShiftException $err) {
var_dump('no shift', $err->getMessage());
} catch (\DigitSoft\Checkbox\Exceptions\AlreadyOpenedShiftException $err) {
var_dump('opened shift', $err->getMessage());
} catch (\Exception $err) {
var_dump('default err', $err->getMessage());
}
use DigitSoft\Checkbox\Config;
use DigitSoft\Checkbox\CheckboxJsonApi;
use DigitSoft\Checkbox\Exceptions\ValidationException;
use DigitSoft\Checkbox\Exceptions\EmptyResponseException;
use DigitSoft\Checkbox\Exceptions\NoActiveShiftException;
use DigitSoft\Checkbox\Exceptions\InvalidCredentialsException;
use DigitSoft\Checkbox\Exceptions\AlreadyOpenedShiftException;
use DigitSoft\Checkbox\Models\Shifts\ShiftsQueryParams;
use DigitSoft\Checkbox\Models\Reports\ReportsQueryParams;
use DigitSoft\Checkbox\Models\Receipts\ReceiptsQueryParams;
use DigitSoft\Checkbox\Models\Reports\PeriodicalReportQueryParams;
use DigitSoft\Checkbox\Models\Transactions\TransactionsQueryParams;
use DigitSoft\Checkbox\Models\CashRegisters\CashRegistersQueryParams;
use DigitSoft\Checkbox\Models\Receipts\Goods\Goods;
use DigitSoft\Checkbox\Models\Receipts\Goods\GoodModel;
use DigitSoft\Checkbox\Models\Receipts\Goods\GoodItemModel;
use DigitSoft\Checkbox\Models\Receipts\SellReceipt;
use DigitSoft\Checkbox\Models\Receipts\ServiceReceipt;
use DigitSoft\Checkbox\Models\Receipts\Delivery;
use DigitSoft\Checkbox\Models\Receipts\Payments\Payments;
use DigitSoft\Checkbox\Models\Receipts\Payments\CardPaymentPayload;
use DigitSoft\Checkbox\Models\Receipts\Payments\CashPaymentPayload;
use DigitSoft\Checkbox\Models\Receipts\Discounts\Discounts;
use DigitSoft\Checkbox\Models\Receipts\Discounts\DiscountModel;
Without Docker
#validate composer json
composer check-composer
#static analyzes and codestyle
composer static
#run unit tests
composer unit-tests
#run all tests
composer all-tests