
HTML receipt and report rendering module for Superkassa
A modular, clean-architecture Kotlin/JVM library providing flexible HTML/text receipt rendering mechanisms for the Superkassa fiscalization system.
It handles rendering of sale and return receipts, cash operations (in/out), shift openings, and shift closures (Z-reports, X-reports) using modern Google Material 3 CSS styles suitable for web presentation, mobile app previews, and thermal printouts.
prefers-color-scheme: dark) and programmatic override classes (body.dark / body.light) for visual editors.@media print) to eliminate background colors and save ink/toner.@page size) and container dimensions for standard layouts: 80mm (standard wide POS tape), 58mm (narrow mobile POS tape, auto-adjusting font size and margins to prevent squeeze and overlaps), and Fullscreen mode (for borderless, seamless integration into mobile/web preview screens).themeColor), logo loading, custom CSS injection, and a dedicated mockup preview rendering API (renderPreviewHtml).Add the dependency to your build.gradle.kts:
dependencies {
implementation("io.github.texport:superkassa-receipt-renderer:1.0.4")
}Add the dependency in Xcode using the Swift Package Manager:
https://github.com/texport/superkassa-receipt-renderer.git
1.0.4
SuperkassaReceiptRenderer
import kz.mybrain.superkassa.core.data.receipt.ReceiptHtmlRenderer
import kz.mybrain.superkassa.core.domain.model.*
// 1. Instantiate renderer with a QR code generator adapter
val renderer = ReceiptHtmlRenderer(
qrCodeGenerator = myQrCodeGeneratorImpl,
ofdProviders = myOfdProvidersMap // optional custom map of OFD provider configs
)
// 2. Prepare mock/real KkmInfo with branding config
val kkmInfo = KkmInfo(
id = "kkm-123",
createdAt = System.currentTimeMillis(),
updatedAt = System.currentTimeMillis(),
mode = "PRODUCTION",
state = "READY",
registrationNumber = "RN-999999",
factoryNumber = "FN-888888",
branding = ReceiptBranding(
language = ReceiptLanguage.MIXED, // RU, KK, or MIXED (Kazakh first)
paperWidthMm = 58, // 58 (narrow POS tape) or 80 (default)
themeColor = "indigo", // Accent color key (indigo, teal, green, blue, orange, rose)
headerLogoUrl = "https://mysite.com/logo.png", // Optional logo URL
// Custom branding message slots (Clean Architecture compatible text, safe HTML wrap)
beforeHeaderMsg = "TOP AD BLOCK",
headerMsg = "Welcome to Store!",
afterHeaderMsg = "Sub-header info",
beforeItemsMsg = "Items list below:",
afterItemsMsg = "Items list above",
beforeTotalsMsg = "Promo: 10% applied",
afterTotalsMsg = "Refund terms & info",
beforeQrMsg = "Scan to verify check",
footerMsg = "Thank you for choosing us!",
useForceDarkTheme = false, // Dynamic theme controls
customBackgroundColorHex = "#faf8f5",
customCardTopBorderColorHex = "#4f46e5"
),
ofdServiceInfo = myOfdServiceInfo
)
// 3. Generate receipt HTML
val htmlString = renderer.renderHtml(myReceiptRequest, myFiscalDocumentSnapshot, kkmInfo)
// 4. Render HTML in WebView or send to PDF converter
myWebView.loadDataWithBaseURL(null, htmlString, "text/html", "UTF-8", null)val xReportHtml = renderer.renderXReportHtml(
shift = myShiftInfo,
counters = myCountersMap,
kkm = kkmInfo,
ofdStatus = "DELIVERED" // or "OFFLINE", "ERROR"
)
val zReportHtml = renderer.renderCloseShiftHtml(
shift = myShiftInfo,
counters = myCountersMap,
kkm = kkmInfo,
ofdStatus = "DELIVERED"
)val cashOpHtml = renderer.renderCashOperationHtml(
doc = myFiscalDocumentSnapshot,
kkm = kkmInfo
)val openShiftHtml = renderer.renderOpenShiftHtml(
shift = myShiftInfo,
kkm = kkmInfo,
ofdStatus = "DELIVERED"
)If you are building a visual branding configurator UI editor, you can generate an instant preview of a mock receipt styled with the current draft branding settings:
val draftBranding = ReceiptBranding(
language = ReceiptLanguage.MIXED,
paperWidthMm = 58,
themeColor = "#ff5722",
headerHtml = "<div>Store Preview</div>"
)
val previewHtml = renderer.renderPreviewHtml(draftBranding)Модульная библиотека на Kotlin/JVM для отрисовки печатных форм (HTML) фискальных чеков и отчетов системы Superkassa.
Библиотека отвечает за формирование HTML-страниц для чеков продажи/возврата, операций инкассации/внесения наличных, открытия смены и закрытия смены (Z-отчеты, X-отчеты) с адаптивной версткой под Google Material 3.
MIXED) казахский язык идет приоритетным (первым).prefers-color-scheme: dark) и ручного форсирования классов (body.dark / body.light) для Web-интерфейсов визуальных редакторов.@media print) для экономии тонера и сохранения читаемости на бумаге.themeColor), вставка HTML-фрагментов во все ключевые секции чека, инжекция произвольных CSS-стилей и вызов предпросмотра макета через renderPreviewHtml.Добавьте зависимость в ваш build.gradle.kts:
dependencies {
implementation("io.github.texport:superkassa-receipt-renderer:1.0.4")
}Добавьте зависимость в Xcode с помощью Swift Package Manager:
https://github.com/texport/superkassa-receipt-renderer.git
1.0.4
SuperkassaReceiptRenderer
import kz.mybrain.superkassa.core.data.receipt.ReceiptHtmlRenderer
import kz.mybrain.superkassa.core.domain.model.*
// 1. Инициализация рендерера с адаптером QR-кодов
val renderer = ReceiptHtmlRenderer(
qrCodeGenerator = myQrCodeGeneratorImpl,
ofdProviders = myOfdProvidersMap // карта конфигураций провайдеров ОФД
)
// 2. Подготовка настроек брендирования ККМ
val kkmInfo = KkmInfo(
id = "kkm-123",
createdAt = System.currentTimeMillis(),
updatedAt = System.currentTimeMillis(),
mode = "PRODUCTION",
state = "READY",
registrationNumber = "RN-999999",
factoryNumber = "FN-888888",
branding = ReceiptBranding(
language = ReceiptLanguage.MIXED, // Язык чека: RU, KK, или MIXED (казахский идет первым)
paperWidthMm = 58, // Ширина ленты: 58 или 80 (по умолчанию)
themeColor = "indigo", // Цветовой акцент чека (indigo, teal, green, blue, orange, rose)
headerLogoUrl = "https://mysite.com/logo.png", // Ссылка на логотип
// Слоты для кастомных текстовых сообщений (Clean Architecture)
beforeHeaderMsg = "РЕКЛАМНЫЙ БЛОК НАВЕРХУ",
headerMsg = "Добро пожаловать!",
afterHeaderMsg = "Адрес магазина или режим работы",
beforeItemsMsg = "Список товаров ниже:",
afterItemsMsg = "Список товаров выше",
beforeTotalsMsg = "Промокод на скидку 10%",
afterTotalsMsg = "Информация по условиям возврата",
beforeQrMsg = "Отсканируйте для проверки",
footerMsg = "Спасибо за покупку!",
useForceDarkTheme = false, // Управление темой оформления
customBackgroundColorHex = "#faf8f5",
customCardTopBorderColorHex = "#4f46e5"
),
ofdServiceInfo = myOfdServiceInfo
)
// 3. Генерация печатной формы
val htmlString = renderer.renderHtml(myReceiptRequest, myFiscalDocumentSnapshot, kkmInfo)
// 4. Отображение в WebView или отправка на принтер
webView.loadDataWithBaseURL(null, htmlString, "text/html", "UTF-8", null)val xReportHtml = renderer.renderXReportHtml(
shift = myShiftInfo,
counters = myCountersMap,
kkm = kkmInfo,
ofdStatus = "DELIVERED" // "OFFLINE", "ERROR"
)
val zReportHtml = renderer.renderCloseShiftHtml(
shift = myShiftInfo,
counters = myCountersMap,
kkm = kkmInfo,
ofdStatus = "DELIVERED"
)val cashOpHtml = renderer.renderCashOperationHtml(
doc = myFiscalDocumentSnapshot,
kkm = kkmInfo
)val openShiftHtml = renderer.renderOpenShiftHtml(
shift = myShiftInfo,
kkm = kkmInfo,
ofdStatus = "DELIVERED"
)Если вы разрабатываете UI-редактор брендирования чеков, вы можете быстро сгенерировать готовый макет чека с тестовым набором товаров для отображения в WebView/iframe:
val draftBranding = ReceiptBranding(
language = ReceiptLanguage.KK,
paperWidthMm = 58,
themeColor = "#e91e63",
headerHtml = "<div>Тестовый чек предпросмотра</div>"
)
val previewHtml = renderer.renderPreviewHtml(draftBranding)A modular, clean-architecture Kotlin/JVM library providing flexible HTML/text receipt rendering mechanisms for the Superkassa fiscalization system.
It handles rendering of sale and return receipts, cash operations (in/out), shift openings, and shift closures (Z-reports, X-reports) using modern Google Material 3 CSS styles suitable for web presentation, mobile app previews, and thermal printouts.
prefers-color-scheme: dark) and programmatic override classes (body.dark / body.light) for visual editors.@media print) to eliminate background colors and save ink/toner.@page size) and container dimensions for standard layouts: 80mm (standard wide POS tape), 58mm (narrow mobile POS tape, auto-adjusting font size and margins to prevent squeeze and overlaps), and Fullscreen mode (for borderless, seamless integration into mobile/web preview screens).themeColor), logo loading, custom CSS injection, and a dedicated mockup preview rendering API (renderPreviewHtml).Add the dependency to your build.gradle.kts:
dependencies {
implementation("io.github.texport:superkassa-receipt-renderer:1.0.4")
}Add the dependency in Xcode using the Swift Package Manager:
https://github.com/texport/superkassa-receipt-renderer.git
1.0.4
SuperkassaReceiptRenderer
import kz.mybrain.superkassa.core.data.receipt.ReceiptHtmlRenderer
import kz.mybrain.superkassa.core.domain.model.*
// 1. Instantiate renderer with a QR code generator adapter
val renderer = ReceiptHtmlRenderer(
qrCodeGenerator = myQrCodeGeneratorImpl,
ofdProviders = myOfdProvidersMap // optional custom map of OFD provider configs
)
// 2. Prepare mock/real KkmInfo with branding config
val kkmInfo = KkmInfo(
id = "kkm-123",
createdAt = System.currentTimeMillis(),
updatedAt = System.currentTimeMillis(),
mode = "PRODUCTION",
state = "READY",
registrationNumber = "RN-999999",
factoryNumber = "FN-888888",
branding = ReceiptBranding(
language = ReceiptLanguage.MIXED, // RU, KK, or MIXED (Kazakh first)
paperWidthMm = 58, // 58 (narrow POS tape) or 80 (default)
themeColor = "indigo", // Accent color key (indigo, teal, green, blue, orange, rose)
headerLogoUrl = "https://mysite.com/logo.png", // Optional logo URL
// Custom branding message slots (Clean Architecture compatible text, safe HTML wrap)
beforeHeaderMsg = "TOP AD BLOCK",
headerMsg = "Welcome to Store!",
afterHeaderMsg = "Sub-header info",
beforeItemsMsg = "Items list below:",
afterItemsMsg = "Items list above",
beforeTotalsMsg = "Promo: 10% applied",
afterTotalsMsg = "Refund terms & info",
beforeQrMsg = "Scan to verify check",
footerMsg = "Thank you for choosing us!",
useForceDarkTheme = false, // Dynamic theme controls
customBackgroundColorHex = "#faf8f5",
customCardTopBorderColorHex = "#4f46e5"
),
ofdServiceInfo = myOfdServiceInfo
)
// 3. Generate receipt HTML
val htmlString = renderer.renderHtml(myReceiptRequest, myFiscalDocumentSnapshot, kkmInfo)
// 4. Render HTML in WebView or send to PDF converter
myWebView.loadDataWithBaseURL(null, htmlString, "text/html", "UTF-8", null)val xReportHtml = renderer.renderXReportHtml(
shift = myShiftInfo,
counters = myCountersMap,
kkm = kkmInfo,
ofdStatus = "DELIVERED" // or "OFFLINE", "ERROR"
)
val zReportHtml = renderer.renderCloseShiftHtml(
shift = myShiftInfo,
counters = myCountersMap,
kkm = kkmInfo,
ofdStatus = "DELIVERED"
)val cashOpHtml = renderer.renderCashOperationHtml(
doc = myFiscalDocumentSnapshot,
kkm = kkmInfo
)val openShiftHtml = renderer.renderOpenShiftHtml(
shift = myShiftInfo,
kkm = kkmInfo,
ofdStatus = "DELIVERED"
)If you are building a visual branding configurator UI editor, you can generate an instant preview of a mock receipt styled with the current draft branding settings:
val draftBranding = ReceiptBranding(
language = ReceiptLanguage.MIXED,
paperWidthMm = 58,
themeColor = "#ff5722",
headerHtml = "<div>Store Preview</div>"
)
val previewHtml = renderer.renderPreviewHtml(draftBranding)Модульная библиотека на Kotlin/JVM для отрисовки печатных форм (HTML) фискальных чеков и отчетов системы Superkassa.
Библиотека отвечает за формирование HTML-страниц для чеков продажи/возврата, операций инкассации/внесения наличных, открытия смены и закрытия смены (Z-отчеты, X-отчеты) с адаптивной версткой под Google Material 3.
MIXED) казахский язык идет приоритетным (первым).prefers-color-scheme: dark) и ручного форсирования классов (body.dark / body.light) для Web-интерфейсов визуальных редакторов.@media print) для экономии тонера и сохранения читаемости на бумаге.themeColor), вставка HTML-фрагментов во все ключевые секции чека, инжекция произвольных CSS-стилей и вызов предпросмотра макета через renderPreviewHtml.Добавьте зависимость в ваш build.gradle.kts:
dependencies {
implementation("io.github.texport:superkassa-receipt-renderer:1.0.4")
}Добавьте зависимость в Xcode с помощью Swift Package Manager:
https://github.com/texport/superkassa-receipt-renderer.git
1.0.4
SuperkassaReceiptRenderer
import kz.mybrain.superkassa.core.data.receipt.ReceiptHtmlRenderer
import kz.mybrain.superkassa.core.domain.model.*
// 1. Инициализация рендерера с адаптером QR-кодов
val renderer = ReceiptHtmlRenderer(
qrCodeGenerator = myQrCodeGeneratorImpl,
ofdProviders = myOfdProvidersMap // карта конфигураций провайдеров ОФД
)
// 2. Подготовка настроек брендирования ККМ
val kkmInfo = KkmInfo(
id = "kkm-123",
createdAt = System.currentTimeMillis(),
updatedAt = System.currentTimeMillis(),
mode = "PRODUCTION",
state = "READY",
registrationNumber = "RN-999999",
factoryNumber = "FN-888888",
branding = ReceiptBranding(
language = ReceiptLanguage.MIXED, // Язык чека: RU, KK, или MIXED (казахский идет первым)
paperWidthMm = 58, // Ширина ленты: 58 или 80 (по умолчанию)
themeColor = "indigo", // Цветовой акцент чека (indigo, teal, green, blue, orange, rose)
headerLogoUrl = "https://mysite.com/logo.png", // Ссылка на логотип
// Слоты для кастомных текстовых сообщений (Clean Architecture)
beforeHeaderMsg = "РЕКЛАМНЫЙ БЛОК НАВЕРХУ",
headerMsg = "Добро пожаловать!",
afterHeaderMsg = "Адрес магазина или режим работы",
beforeItemsMsg = "Список товаров ниже:",
afterItemsMsg = "Список товаров выше",
beforeTotalsMsg = "Промокод на скидку 10%",
afterTotalsMsg = "Информация по условиям возврата",
beforeQrMsg = "Отсканируйте для проверки",
footerMsg = "Спасибо за покупку!",
useForceDarkTheme = false, // Управление темой оформления
customBackgroundColorHex = "#faf8f5",
customCardTopBorderColorHex = "#4f46e5"
),
ofdServiceInfo = myOfdServiceInfo
)
// 3. Генерация печатной формы
val htmlString = renderer.renderHtml(myReceiptRequest, myFiscalDocumentSnapshot, kkmInfo)
// 4. Отображение в WebView или отправка на принтер
webView.loadDataWithBaseURL(null, htmlString, "text/html", "UTF-8", null)val xReportHtml = renderer.renderXReportHtml(
shift = myShiftInfo,
counters = myCountersMap,
kkm = kkmInfo,
ofdStatus = "DELIVERED" // "OFFLINE", "ERROR"
)
val zReportHtml = renderer.renderCloseShiftHtml(
shift = myShiftInfo,
counters = myCountersMap,
kkm = kkmInfo,
ofdStatus = "DELIVERED"
)val cashOpHtml = renderer.renderCashOperationHtml(
doc = myFiscalDocumentSnapshot,
kkm = kkmInfo
)val openShiftHtml = renderer.renderOpenShiftHtml(
shift = myShiftInfo,
kkm = kkmInfo,
ofdStatus = "DELIVERED"
)Если вы разрабатываете UI-редактор брендирования чеков, вы можете быстро сгенерировать готовый макет чека с тестовым набором товаров для отображения в WebView/iframe:
val draftBranding = ReceiptBranding(
language = ReceiptLanguage.KK,
paperWidthMm = 58,
themeColor = "#e91e63",
headerHtml = "<div>Тестовый чек предпросмотра</div>"
)
val previewHtml = renderer.renderPreviewHtml(draftBranding)