poster-prro-kit
Version:
Цей Kit призначений для роботи з PRRO, а саме для генерації XML документів для податкової, генерації фіскальних чеків для термопринтерів, генерації документів для PRRO в офлайн режимі, розрахунку податків та генераціі посилання на фіскальний чек в кабін
1,607 lines (1,604 loc) • 45.2 kB
JavaScript
import { v4 as uuidv4 } from "uuid";
import { mockCustomTaxes } from "../taxes/mock/taxes.js";
import {
getReceiptOfflineModeRequestData,
getTransactionOfflineModeRequestData,
getZReportOfflineModeRequestData,
getOpenShiftOfflineModeRequestData,
getCloseShiftOfflineModeRequestData,
getStartOfflineModeRequestData,
getFinishOfflineModeRequestData,
mergeOperationsAndXReport,
} from "./index.js";
jest.mock("uuid", () => ({
v4: jest.fn(),
}));
describe("offline mode", () => {
beforeAll(() => {
const fakeUUID = "11111111-1111-1111-1111-111111111111";
uuidv4.mockImplementation(() => fakeUUID);
});
it("getReceiptOfflineModeRequestData", async () => {
expect(
await getReceiptOfflineModeRequestData({
type: "receipt",
dateTime: "2024-06-04T12:26:18.293Z",
uid: "11111111-1111-1111-1111-111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
ipn: "",
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
isTestingMode: true,
isOffline: true,
VATTaxList: mockCustomTaxes.VATTaxList,
exciseTaxList: mockCustomTaxes.exciseTaxList,
nextDocumentNumber: 2828,
offlineSessionData: {
id: "23649865",
seed: "135969449201653",
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"47a08c017274237765f9081d994e76e08742dcef85056d655a8458ec43dff6e4",
},
},
cashier: "Шевченко Т.Г.",
total: 95004,
payments: [
{ sum: 10000, type: "cash" },
{ sum: 85004, type: "card" },
],
products: [
{
id: 54,
name: "Сирна паличка",
count: 4000,
unit: "шт",
price: 20000,
discount: 3000,
taxPrograms: "ГД",
},
{
id: 55,
name: "Морозиво",
count: 2000,
unit: "шт",
price: 9013,
discount: 2000,
taxPrograms: "БД",
},
{
id: 56,
name: "Кава",
count: 1000,
unit: "шт",
price: 2013,
discount: 35,
taxPrograms: "В",
},
],
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
taxesConfig: mockCustomTaxes,
}),
).toEqual({
type: "receipt",
fiscalId: "23649865.1.1236",
fiscalLink:
"https://cabinet.tax.gov.ua/cashregs/check?id=23649865.1.1236&date=20240604&time=152618&fn=4000438533&sm=950.04&mac=47a08c017274237765f9081d994e76e08742dcef85056d655a8458ec43dff6e4",
isOffline: true,
uid: "11111111-1111-1111-1111-111111111111",
dateTime: "2024-06-04T12:26:18.293Z",
documentHash:
"1111111111111111111111111111111111111111111111111111111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
ipn: "",
isOffline: true,
isTestingMode: true,
nextDocumentNumber: 2828,
VATTaxList: mockCustomTaxes.VATTaxList,
exciseTaxList: mockCustomTaxes.exciseTaxList,
offlineSessionData: {
id: "23649865",
seed: "135969449201653",
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"47a08c017274237765f9081d994e76e08742dcef85056d655a8458ec43dff6e4",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
total: 95004,
payments: [
{
sum: 10000,
type: "cash",
},
{
sum: 85004,
type: "card",
},
],
products: [
{
count: 4000,
discount: 3000,
id: 54,
name: "Сирна паличка",
price: 20000,
taxPrograms: "ГД",
unit: "шт",
},
{
count: 2000,
discount: 2000,
id: 55,
name: "Морозиво",
price: 9013,
taxPrograms: "БД",
unit: "шт",
},
{
count: 1000,
discount: 35,
id: 56,
name: "Кава",
price: 2013,
taxPrograms: "В",
unit: "шт",
},
],
taxes: [
{
name: "Акциз",
percent: 5,
program: "Д",
sourceSum: 93026,
sum: 4430,
turnover: 98026,
turnoverDiscount: 93026,
type: 1,
},
{
name: "ПДВ 0%",
percent: 0,
program: "Г",
sourceSum: 73333,
sum: 0,
turnover: 80000,
turnoverDiscount: 77000,
type: 0,
},
{
name: "ПДВ 7%",
percent: 7,
program: "Б",
sourceSum: 15263,
sum: 999,
turnover: 18026,
turnoverDiscount: 16026,
type: 0,
},
{
name: "ПДВ 20%",
percent: 20,
program: "В",
sourceSum: 1978,
sum: 330,
turnover: 2013,
turnoverDiscount: 1978,
type: 0,
},
],
});
});
it("getReceiptOfflineModeRequestData in cents and grams format", async () => {
expect(
await getReceiptOfflineModeRequestData({
type: "receipt",
dateTime: "2024-06-04T12:26:18.293Z",
uid: "11111111-1111-1111-1111-111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
ipn: "",
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
isTestingMode: true,
isOffline: true,
nextDocumentNumber: 2828,
VATTaxList: mockCustomTaxes.VATTaxList,
exciseTaxList: mockCustomTaxes.exciseTaxList,
offlineSessionData: {
id: "23649865",
seed: "135969449201653",
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"47a08c017274237765f9081d994e76e08742dcef85056d655a8458ec43dff6e4",
},
},
cashier: "Шевченко Т.Г.",
total: 95004,
payments: [
{ sum: 10000, type: "cash" },
{ sum: 85004, type: "card" },
],
products: [
{
id: 54,
name: "Сирна паличка",
count: 4000,
unit: "шт",
price: 20000,
discount: 3000,
taxPrograms: "ГД",
},
{
id: 55,
name: "Морозиво",
count: 2000,
unit: "шт",
price: 9013,
discount: 2000,
taxPrograms: "БД",
},
{
id: 56,
name: "Кава",
count: 1000,
unit: "шт",
price: 2013,
discount: 35,
taxPrograms: "В",
},
],
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
taxesConfig: mockCustomTaxes,
}),
).toEqual({
type: "receipt",
fiscalId: "23649865.1.1236",
fiscalLink:
"https://cabinet.tax.gov.ua/cashregs/check?id=23649865.1.1236&date=20240604&time=152618&fn=4000438533&sm=950.04&mac=47a08c017274237765f9081d994e76e08742dcef85056d655a8458ec43dff6e4",
isOffline: true,
uid: "11111111-1111-1111-1111-111111111111",
dateTime: "2024-06-04T12:26:18.293Z",
documentHash:
"1111111111111111111111111111111111111111111111111111111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
ipn: "",
isOffline: true,
isTestingMode: true,
nextDocumentNumber: 2828,
VATTaxList: mockCustomTaxes.VATTaxList,
exciseTaxList: mockCustomTaxes.exciseTaxList,
offlineSessionData: {
id: "23649865",
seed: "135969449201653",
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"47a08c017274237765f9081d994e76e08742dcef85056d655a8458ec43dff6e4",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
total: 95004,
payments: [
{
sum: 10000,
type: "cash",
},
{
sum: 85004,
type: "card",
},
],
products: [
{
count: 4000,
discount: 3000,
id: 54,
name: "Сирна паличка",
price: 20000,
taxPrograms: "ГД",
unit: "шт",
},
{
count: 2000,
discount: 2000,
id: 55,
name: "Морозиво",
price: 9013,
taxPrograms: "БД",
unit: "шт",
},
{
count: 1000,
discount: 35,
id: 56,
name: "Кава",
price: 2013,
taxPrograms: "В",
unit: "шт",
},
],
taxes: [
{
name: "Акциз",
percent: 5,
program: "Д",
sourceSum: 93026,
sum: 4430,
turnover: 98026,
turnoverDiscount: 93026,
type: 1,
},
{
name: "ПДВ 0%",
percent: 0,
program: "Г",
sourceSum: 73333,
sum: 0,
turnover: 80000,
turnoverDiscount: 77000,
type: 0,
},
{
name: "ПДВ 7%",
percent: 7,
program: "Б",
sourceSum: 15263,
sum: 999,
turnover: 18026,
turnoverDiscount: 16026,
type: 0,
},
{
name: "ПДВ 20%",
percent: 20,
program: "В",
sourceSum: 1978,
sum: 330,
turnover: 2013,
turnoverDiscount: 1978,
type: 0,
},
],
});
});
it("getTransactionOfflineModeRequestData", async () => {
expect(
await getTransactionOfflineModeRequestData({
type: "serviceEntry",
dateTime: "2024-06-04T12:26:18.293Z",
uid: "11111111-1111-1111-1111-111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
sum: 100000,
}),
).toEqual({
type: "serviceEntry",
fiscalId: "23649865.1.4646",
fiscalLink:
"https://cabinet.tax.gov.ua/cashregs/check?id=23649865.1.4646&date=20240604&time=152618&fn=4000438533&sm=1000&mac=685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
isOffline: true,
uid: "11111111-1111-1111-1111-111111111111",
dateTime: "2024-06-04T12:26:18.293Z",
documentHash:
"1111111111111111111111111111111111111111111111111111111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
isTestingMode: true,
isOffline: true,
nextDocumentNumber: 1,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
sum: 100000,
});
});
it("getOpenShiftOfflineModeRequestData", async () => {
expect(
await getOpenShiftOfflineModeRequestData({
type: "shiftOpen",
dateTime: "2024-06-04T12:26:18.293Z",
uid: "11111111-1111-1111-1111-111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
}),
).toEqual({
type: "shiftOpen",
uid: "11111111-1111-1111-1111-111111111111",
dateTime: "2024-06-04T12:26:18.293Z",
documentHash:
"1111111111111111111111111111111111111111111111111111111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isOffline: true,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
});
});
it("getCloseShiftOfflineModeRequestData", async () => {
expect(
await getCloseShiftOfflineModeRequestData({
type: "shiftClose",
dateTime: "2024-06-04T12:26:18.293Z",
uid: "11111111-1111-1111-1111-111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
}),
).toEqual({
type: "shiftClose",
uid: "11111111-1111-1111-1111-111111111111",
dateTime: "2024-06-04T12:26:18.293Z",
documentHash:
"1111111111111111111111111111111111111111111111111111111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isOffline: true,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
});
});
it.skip("getZReportOfflineModeRequestData", async () => {
const data = [
{
cashbox: 4000847239,
type: "shiftOpen",
uid: "d4d97788-a770-4110-a978-632e31060356",
dateTime: "2024-06-05T10:29:32.890Z",
documentNumber: 786,
},
{
type: "receipt",
cashbox: 4000847239,
dateTime: "2024-06-05T10:29:37.624Z",
total: 23,
payments: [
{
sum: 10,
type: "card",
},
{
sum: 13,
type: "cash",
},
],
products: [
{
count: 1,
discount: 0,
id: 7,
name: "Паштейш",
price: 18,
roundSum: 0,
tax: 8,
taxName: "Без ПДВ + Акциз 5%",
taxType: 1,
promotionId: 0,
modificationId: 0,
isWeight: 0,
marking: [],
barcodes: [],
taxPrograms: "ЖЗ",
},
{
count: 1,
discount: 0,
id: 54,
name: "Сирна паличка",
price: 5,
roundSum: 0,
tax: 8,
taxName: "Без ПДВ + Акциз 5%",
taxType: 1,
promotionId: 0,
modificationId: 0,
isWeight: 0,
marking: [],
barcodes: [],
taxPrograms: "ЖЗ",
},
],
sstData: false,
cashier: "Maksym",
uid: "3096ab29-6ce4-42f5-8131-802e58755ca7",
taxes: [
{
sum: 1.1,
turnover: 23,
sourceSum: 0,
program: "З",
type: 9,
name: "Акциз",
percent: 5,
},
{
sum: 0,
turnover: 23,
sourceSum: 0,
program: "Ж",
type: 8,
name: "Без ПДВ + Акциз 5%",
percent: 0,
},
],
documentNumber: 787,
},
{
type: "receipt",
cashbox: 4000847239,
dateTime: "2024-06-05T10:29:49.338Z",
total: 16.04,
payments: [
{
sum: 1,
type: "card",
},
{
sum: 15.04,
type: "cash",
},
],
products: [
{
count: 1,
discount: 0,
id: 20,
name: "Сітро (0.5л)",
price: 15,
roundSum: 0.04,
tax: 4,
taxName: "ПДВ 0%",
taxType: 1,
promotionId: 0,
modificationId: 0,
isWeight: 0,
marking: [],
barcodes: [],
taxPrograms: "Г",
},
{
count: 1,
discount: 0,
id: 49,
name: "2204109600#Pepsi (0.5л)",
price: 1.04,
roundSum: 0,
tax: 3,
taxName: "ПДВ 20% + Акциз 5%",
taxType: 1,
promotionId: 0,
modificationId: 0,
isWeight: 0,
marking: [],
barcodes: ["1234567890123"],
taxPrograms: "ВД",
},
],
sstData: false,
cashier: "Maksym",
uid: "0b649c87-ca32-4cf0-bba5-0e6d36996fc1",
taxes: [
{
sum: 0,
turnover: 15,
sourceSum: 0,
program: "Г",
type: 4,
name: "ПДВ 0%",
percent: 0,
},
{
sum: 0.05,
turnover: 1.04,
sourceSum: 0,
program: "Д",
type: 5,
name: "Акциз",
percent: 5,
},
{
sum: 0.17,
turnover: 1.04,
sourceSum: 0,
program: "В",
type: 3,
name: "ПДВ 20% + Акциз 5%",
percent: 20,
},
],
documentNumber: 788,
},
{
type: "returnReceipt",
cashbox: 4000847239,
dateTime: "2024-06-05T10:29:57.160Z",
total: 16.04,
payments: [
{
sum: 1,
type: "card",
},
{
sum: 15.04,
type: "cash",
},
],
products: [
{
count: 1,
discount: 0,
id: 20,
name: "Сітро (0.5л)",
price: 15,
roundSum: 0.04,
tax: 4,
taxName: "ПДВ 0%",
taxType: 1,
promotionId: 0,
modificationId: 0,
isWeight: 0,
marking: [],
barcodes: [],
taxPrograms: "Г",
},
{
count: 1,
discount: 0,
id: 49,
name: "2204109600#Pepsi (0.5л)",
price: 1.04,
roundSum: 0,
tax: 3,
taxName: "ПДВ 20% + Акциз 5%",
taxType: 1,
promotionId: 0,
modificationId: 0,
isWeight: 0,
marking: [],
barcodes: ["1234567890123"],
taxPrograms: "ВД",
},
],
sstData: false,
cashier: "Maksym",
documentFiscalId: "2507944945",
uid: "e7d179eb-55ca-4c9a-b6cc-8feb9a937a15",
taxes: [
{
sum: 0,
turnover: 15,
sourceSum: 0,
program: "Г",
type: 4,
name: "ПДВ 0%",
percent: 0,
},
{
sum: 0.05,
turnover: 1.04,
sourceSum: 0,
program: "Д",
type: 5,
name: "Акциз",
percent: 5,
},
{
sum: 0.17,
turnover: 1.04,
sourceSum: 0,
program: "В",
type: 3,
name: "ПДВ 20% + Акциз 5%",
percent: 20,
},
],
documentNumber: 789,
},
];
expect(
await getZReportOfflineModeRequestData({
type: "ZReport",
dateTime: "2024-06-04T12:26:18.293Z",
uid: "11111111-1111-1111-1111-111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
ZReportData: data,
lastFiscalDocument: {
documentNumber: 789,
fiscalId: "2507944945",
request: {
dateTime: "2024-06-04T12:30:18.293Z",
},
},
taxesConfig: mockCustomTaxes,
}),
).toEqual({
type: "ZReport",
uid: "11111111-1111-1111-1111-111111111111",
dateTime: "2024-06-04T12:26:18.293Z",
documentHash:
"1111111111111111111111111111111111111111111111111111111111111111",
fiscalId: "23649865.1.9535",
lastFiscalDocumentData: {
dateTime: "2024-06-04T12:30:18.293Z",
documentNumber: 789,
fiscalId: "2507944945",
},
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
isOffline: true,
isTestingMode: true,
nextDocumentNumber: 1,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
realiz: {
payments: [
{
payFormCode: 0,
payFormName: "ГОТІВКА",
sum: 28,
},
{
payFormCode: 1,
payFormName: "КАРТКА",
sum: 11,
},
],
receiptCount: 2,
sum: 39,
taxes: [
{
name: "Акциз",
percent: 5,
program: "З",
sourceSum: 0,
sum: 1.1,
turnover: 23,
type: 9,
},
{
name: "Без ПДВ + Акциз 5%",
percent: 0,
program: "Ж",
sourceSum: 0,
sum: 0,
turnover: 23,
type: 8,
},
{
name: "ПДВ 0%",
percent: 0,
program: "Г",
sourceSum: 0,
sum: 0,
turnover: 15,
type: 4,
},
{
name: "Акциз",
percent: 5,
program: "Д",
sourceSum: 0,
sum: 0.05,
turnover: 1.04,
type: 5,
},
{
name: "ПДВ 20%",
percent: 20,
program: "В",
sourceSum: 0,
sum: 0.17,
turnover: 1.04,
type: 3,
},
],
},
return: {
payments: [
{
payFormCode: 0,
payFormName: "ГОТІВКА",
sum: 15,
},
{
payFormCode: 1,
payFormName: "КАРТКА",
sum: 1,
},
],
receiptCount: 1,
sum: 16,
taxes: [
{
name: "ПДВ 0%",
percent: 0,
program: "Г",
sourceSum: 0,
sum: 0,
turnover: 15,
type: 4,
},
{
name: "Акциз",
percent: 5,
program: "Д",
sourceSum: 0,
sum: 0.05,
turnover: 1.04,
type: 5,
},
{
name: "ПДВ 20%",
percent: 20,
program: "В",
sourceSum: 0,
sum: 0.17,
turnover: 1.04,
type: 3,
},
],
},
serviceInput: null,
serviceOutput: null,
});
});
it("getStartOfflineModeRequestData", async () => {
expect(
await getStartOfflineModeRequestData({
type: "offlineStart",
dateTime: "2024-06-04T12:26:18.293Z",
uid: "11111111-1111-1111-1111-111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isOffline: true,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
}),
).toEqual({
type: "offlineStart",
uid: "11111111-1111-1111-1111-111111111111",
dateTime: "2024-06-04T12:26:18.293Z",
documentHash:
"1111111111111111111111111111111111111111111111111111111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isOffline: true,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
});
});
it("getFinishOfflineModeRequestData", async () => {
expect(
await getFinishOfflineModeRequestData({
type: "offlineFinish",
dateTime: "2024-06-04T12:26:18.293Z",
uid: "11111111-1111-1111-1111-111111111111",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isOffline: true,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
}),
).toEqual({
type: "offlineFinish",
uid: "11111111-1111-1111-1111-111111111111",
dateTime: "2024-06-04T12:26:18.293Z",
documentHash:
"1111111111111111111111111111111111111111111111111111111111111111",
cashboxData: {
cashbox: "4000438533",
cashboxLocalNumber: "123",
name: "ТОВ ТЕСТ ПРРО",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
pointName: "кафе Ромашка",
tin: 44657555,
isOffline: true,
isTestingMode: true,
nextDocumentNumber: 1,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
});
});
it.skip("mergeOperationsAndXReport", async () => {
const receiptOperation = {
type: "receipt",
dateTime: "2024-06-04T12:26:18.293Z",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isOffline: true,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
fiscalId: "23649865.1.4646",
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
total: 95004,
payments: [
{ sum: 10000, type: "cash" },
{ sum: 85004, type: "card" },
],
products: [
{
id: 54,
name: "Сирна паличка",
count: 4000,
unit: "шт",
price: 20000,
discount: 3000,
taxPrograms: "ГД",
},
{
id: 55,
name: "Морозиво",
count: 2000,
unit: "шт",
price: 9013,
discount: 2000,
taxPrograms: "БД",
},
{
id: 56,
name: "Кава",
count: 1000,
unit: "шт",
price: 2013,
discount: 35,
taxPrograms: "В",
},
],
taxesConfig: mockCustomTaxes,
};
const serviceEntryOperation = {
type: "serviceEntry",
dateTime: "2024-06-04T12:26:18.293Z",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isOffline: true,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
sum: 1000,
};
const serviceDeliveryOperation = {
type: "serviceDelivery",
dateTime: "2024-06-04T12:36:18.293Z",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
ipn: "",
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isOffline: true,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
sum: 900,
};
const returnOperation = {
type: "returnReceipt",
dateTime: "2024-06-05T10:29:57.160Z",
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isOffline: true,
isTestingMode: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
fiscalId: "2507944945",
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
total: 1604,
payments: [
{
sum: 1604,
type: "cash",
},
],
products: [
{
count: 1000,
discount: 0,
id: 20,
name: "Сітро (0.5л)",
price: 1500,
roundSum: 4,
tax: 4,
taxName: "ПДВ 0%",
taxType: 1,
promotionId: 0,
modificationId: 0,
isWeight: 0,
marking: [],
barcodes: [],
taxPrograms: "Г",
},
{
count: 1000,
discount: 0,
id: 49,
name: "2204109600#Pepsi (0.5л)",
price: 104,
roundSum: 0,
tax: 3,
taxName: "ПДВ 20% + Акциз 5%",
taxType: 1,
promotionId: 0,
modificationId: 0,
isWeight: 0,
marking: [],
barcodes: ["1234567890123"],
taxPrograms: "ВД",
},
],
taxesConfig: mockCustomTaxes,
};
const xReport = {
type: "XReport",
uid: "11111111-1111-1111-1111-111111111111",
dateTime: "2024-06-04T12:26:18.293Z",
documentHash:
"1111111111111111111111111111111111111111111111111111111111111111",
fiscalId: "23649865.1.9535",
lastFiscalDocumentData: {
dateTime: "2024-06-04T12:30:18.293Z",
documentNumber: 789,
fiscalId: "2507944945",
},
cashboxData: {
cashbox: "4000438533",
tin: 44657555,
name: "ТОВ ТЕСТ ПРРО",
pointName: "кафе Ромашка",
pointAddress: "Дніпропетровська область, м. Дніпро, вул. Шевченка, 1",
cashboxLocalNumber: "123",
nextDocumentNumber: 1,
isOffline: true,
offlineSessionData: {
id: 23649865,
seed: 135969449201653,
nextOfflineDocumentNumber: 1,
lastDocumentHash:
"685df9bd624bde3dfb25c40c1d80583e60fe1d6ec6f4932343d79abb1aecab40",
},
},
cashier: "Шевченко Т.Г.",
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
realiz: {
payments: [
{
payFormCode: 0,
payFormName: "ГОТІВКА",
sum: 2800,
},
{
payFormCode: 1,
payFormName: "КАРТКА",
sum: 1100,
},
],
receiptCount: 2,
sum: 3900,
taxes: [
{
name: "Акциз",
percent: 5,
program: "З",
sourceSum: 0,
sum: 110,
turnover: 230,
type: 9,
},
{
name: "Без ПДВ + Акциз 5%",
percent: 0,
program: "Ж",
sourceSum: 0,
sum: 0,
turnover: 2300,
type: 8,
},
{
name: "ПДВ 0%",
percent: 0,
program: "Г",
sourceSum: 0,
sum: 0,
turnover: 15,
type: 4,
},
{
name: "Акциз",
percent: 5,
program: "Д",
sourceSum: 0,
sum: 5,
turnover: 104,
type: 5,
},
{
name: "ПДВ 20%",
percent: 20,
program: "В",
sourceSum: 0,
sum: 17,
turnover: 104,
type: 3,
},
],
},
return: {
payments: [
{
payFormCode: 0,
payFormName: "ГОТІВКА",
sum: 1500,
},
{
payFormCode: 1,
payFormName: "КАРТКА",
sum: 100,
},
],
receiptCount: 1,
sum: 1600,
taxes: [
{
name: "ПДВ 0%",
percent: 0,
program: "Г",
sourceSum: 0,
sum: 0,
turnover: 1500,
type: 4,
},
{
name: "Акциз",
percent: 5,
program: "Д",
sourceSum: 0,
sum: 5,
turnover: 104,
type: 5,
},
{
name: "ПДВ 20%",
percent: 20,
program: "В",
sourceSum: 0,
sum: 17,
turnover: 104,
type: 3,
},
],
},
serviceInput: null,
serviceOutput: null,
};
expect(
await mergeOperationsAndXReport({
operations: [
receiptOperation,
serviceEntryOperation,
serviceDeliveryOperation,
returnOperation,
],
xReport,
taxesConfig: mockCustomTaxes,
}),
).toEqual({
lastFiscalDocumentData: {
dateTime: "2024-06-05T10:29:57.160Z",
documentNumber: 1,
fiscalId: "2507944945",
},
realiz: {
payments: [
{
payFormCode: 0,
payFormName: "ГОТІВКА",
sum: 12800,
},
{
payFormCode: 1,
payFormName: "КАРТКА",
sum: 86104,
},
],
receiptCount: 3,
sum: 98904,
taxes: [
{
name: "Акциз",
percent: 5,
program: "З",
sourceSum: 0,
sum: 110,
turnover: 2300,
type: 9,
},
{
name: "Без ПДВ + Акциз 5%",
percent: 0,
program: "Ж",
sourceSum: 0,
sum: 0,
turnover: 2300,
type: 8,
},
{
name: "ПДВ 0%",
percent: 0,
program: "Г",
sourceSum: 73333,
sum: 0,
turnover: 81500,
type: 4,
},
{
name: "Акциз",
percent: 5,
program: "Д",
sourceSum: 93026,
sum: 4435,
turnover: 98130,
type: 5,
},
{
name: "ПДВ 20%",
percent: 20,
program: "В",
sourceSum: 1978,
sum: 347,
turnover: 2117,
type: 3,
},
{
name: "ПДВ 7%",
percent: 7,
program: "Б",
sourceSum: 15263,
sum: 999,
turnover: 18026,
type: 2,
},
],
},
return: {
payments: [
{
payFormCode: 0,
payFormName: "ГОТІВКА",
sum: 3104,
},
{
payFormCode: 1,
payFormName: "КАРТКА",
sum: 100,
},
],
receiptCount: 2,
sum: 3200,
taxes: [
{
name: "ПДВ 0%",
percent: 0,
program: "Г",
sourceSum: 1500,
sum: 0,
turnover: 3000,
type: 4,
},
{
name: "Акциз",
percent: 5,
program: "Д",
sourceSum: 104,
sum: 10,
turnover: 208,
type: 5,
},
{
name: "ПДВ 20%",
percent: 20,
program: "В",
sourceSum: 99,
sum: 34,
turnover: 208,
type: 3,
},
],
},
serviceInput: 1000,
serviceOutput: 900,
shiftOpenData: {
dateTime: "2024-06-04T10:26:18.293Z",
},
});
});
});