Skip to content

# Bug Report Diggo POS KMP — 31 Agustus 2026 #1

Description

@ringga-bf

Isu yang Perlu Diperbaiki di Library Printer — io.github.ringga-dev:kmp_printer:2.3.5

Untuk dikirim ke maintainer library kmp_printer. App saat ini workaround via UI helper, tapi fix ideal di library.


1) leftMargin tanpa autoCenter menyebabkan kanan terpotong / overflow

Lokasi library:
commonMain/ngga/ring/printer/util/escpos/ESCPosCommandBuilder.kt:fromPrinterConfig (lihat decompile di sumber kmp_printer-2.3.5-sources.jar)

Kode saat ini (ringkas):

val dots = if (config.paperWidthDots > 0) config.paperWidthDots else ((config.paperWidth - 10)*8).coerceAtLeast(384)
val dotsPerChar = dots.toDouble() / config.characterPerLine
val printWidth = if (config.autoCenter) (dots - 2*config.leftMargin).coerceAtLeast(1) else dots
val effectiveChars = if (config.autoCenter) (printWidth/dotsPerChar).toInt().coerceAtLeast(1) else config.characterPerLine
val actualTextWidth = effectiveChars * dotsPerChar
val centeringPadding = if (config.autoCenter) ((printWidth - actualTextWidth)/2).toInt().coerceAtLeast(0) else 0
ESCPosConfig(
  charsPerLine = effectiveChars,
  paperWidthDots = actualTextWidth.toInt(), // = dots saat OFF
  leftMargin = config.leftMargin + centeringPadding
).also { hardwareTotalDots = dots }

Masalah:

  • autoCenter==falseprintWidth = dots (misal 384), paperWidthDots = dots (384), leftMargin = 20. Total lebar yang dipakai = leftMargin (20) + actualTextWidth (384) = 404 > dots (384) → melebihi lebar fisik kertas → sisi kanan terpotong / wrap. User set kiri 20, kanan ikut kena.
  • autoCenter==trueprintWidth = dots - 2*left, jadi margin simetris kiri & kanan, tidak overflow tapi printable mengecil di kedua sisi.

Yang diharapkan:

  • leftMargin seharusnya offset murni tanpa mengorbankan kanan melebihi kertas: lebar printable = dots - leftMargin (kanan tetap di tepi kertas). Jika user set kiri 20 pada 384 dots, printable harus 364 dots (~30 char pada 32cpl).
  • autoCenter seharusnya opsional untuk centering, bukan satu-satunya cara agar tidak overflow.

Dampak di app:
User Diggo POS bingung: set kiri 10 kanan jadi sempit/terpotong. Workaround app saat ini hanya tampil warning & sarankan autoCenter=true atau left 0–4/0–8.

Usulan fix di library (patch fromPrinterConfig):

// Before
val printWidth = if (config.autoCenter) (dots - 2*config.leftMargin).coerceAtLeast(1) else dots
val effectiveChars = if (config.autoCenter) (printWidth/dotsPerChar).toInt().coerceAtLeast(1) else config.characterPerLine

// After (fix)
val printWidth = if (config.autoCenter) (dots - 2*config.leftMargin).coerceAtLeast(1) else (dots - config.leftMargin).coerceAtLeast(1)
val effectiveChars = (printWidth / dotsPerChar).toInt().coerceAtLeast(1)
// actualTextWidth & centeringPadding tetap, tapi sekarang tidak overflow saat OFF

Dengan ini OFF + left=20printWidth=364, effectiveChars≈30 (bukan 32), actualTextWidth≈364, leftMargin=20 → total 384 pas, tidak terpotong. ON tetap simetris.

Alternatif lebih lengkap: tambah field rightMargin di PrinterConfig agar kiri/kanan bisa diatur independen, bukan hanya left dengan autoCenter mirroring.

data class PrinterConfig(
  val leftMargin: Int = 0,
  val rightMargin: Int = 0, // NEW
  val autoCenter: Boolean = false,
  ...
)
// printWidth = dots - left - right   (atau dots -2*left jika autoCenter)

2) Tidak ada rightMargin — tidak bisa atur margin kanan independen

Lokasi: PrinterConfig (PrinterModels.kt) & ESCPosCommandBuilder

Masalah: Hanya leftMargin. User yang butuh margin kanan saja (atau kiri≠kanan) tidak bisa. autoCenter meniru kanan = kiri, bukan solusi.

Usulan: Tambah rightMargin: Int = 0 di PrinterConfig & PrinterProfile, hitung printWidth = dots - left - right (atau dots -2*left bila autoCenter). UI app sudah siap preset, tinggal kirim rightMargin.


3) paperWidthDots == 0 fallback heuristik (paperWidth -10)*8 tidak akurat untuk printer 58/80 tertentu

Lokasi: fromPrinterConfig baris dots = if (paperWidthDots>0) ... else ((paperWidth -10)*8)

Masalah: Beberapa thermal printer 58mm = 372/384 dots, 80mm = 576/640 dots tergantung DPI (203 vs 180). Heuristik -10 bisa salah 10–20 dots → centering melenceng.

Usulan: Jika paperWidthDots == 0, fallback berdasarkan characterPerLine & paperWidth yang lebih presisi, atau wajibkan paperWidthDots di preset (app sudah lakukan via PaperPreset). Documentasikan agar paperWidthDots wajib diisi.


4) leftMargin + autoCenter centeringPadding bisa off-by-one untuk karakter ganjil

Lokasi: centeringPadding = ((printWidth - actualTextWidth)/2).toInt()

Masalah: Integer truncation bisa 1 dot miring kiri.

Usulan: Pakai roundToInt() atau distribusikan sisa 1 dot ke kanan via ESC/POS GS L + ESC $.


Reproduksi untuk maintainer

  1. PrinterConfig(name="Test", connectionType=NETWORK, address="192.168.1.100", paperWidth=58, paperWidthDots=384, characterPerLine=32, leftMargin=20, autoCenter=false)
  2. val builder = ESCPosCommandBuilder.fromPrinterConfig(config); builder.line("12345678901234567890123456789012")
  3. Print ke 58mm → sisi kanan terpotong 20 dots (2 karakter hilang).
  4. Aktifkan autoCenter=true dengan margin sama → tidak terpotong tapi kiri-kanan simetris.

Workaround app saat ini: PrinterFormComponents.kt tampilkan warning & sarankan 0–4 dots (58mm) / 0–8 (80mm) atau aktifkan Auto Center.


Info

  • Library: io.github.ringga-dev:kmp_printer:2.3.5 (kmp_printer-2.3.5-sources.jar)
  • File terkait: PrinterModels.kt, ESCPosCommandBuilder.kt, ESCPosConfig.kt, PrinterProfile.kt
  • Dilaporkan oleh: Tim Diggo POS KMP — 31 Aug 2026 — branch dev-split-payment
  • Kontak repro: shared/.../printer/ui/form/PrinterFormComponents.kt live helper calculation

Mohon fix #1 diutamakan (1 baris patch), karena langsung memblokir setting margin kiri di produksi.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions