# POS / Penjualan

Panduan lengkap penggunaan modul Point of Sale (POS) untuk transaksi penjualan obat, alat kesehatan, dan produk lainnya di Dekacare.

# Halaman Utama Penjualan

## Tentang Modul Penjualan

Modul **Penjualan (POS)** pada Dekacare adalah sistem Point of Sale terintegrasi yang dirancang khusus untuk fasilitas kesehatan. Modul ini memungkinkan staf farmasi dan kasir melakukan transaksi penjualan obat, alat kesehatan, serta produk lainnya secara cepat dan akurat.

Modul ini dapat diakses melalui menu navigasi **Penjualan** atau langsung ke halaman `/apps/penjualan`.

## Struktur Halaman

Halaman utama Penjualan terdiri dari **tiga tab utama** yang memisahkan setiap fungsi transaksi:

1. **Buat Penjualan (POS)** — Tab utama untuk membuat transaksi baru. Dilengkapi ikon *Shopping Cart*. Di sinilah Anda mencari produk, mengatur keranjang, dan memproses pembayaran.
2. **Riwayat Penjualan** — Tab untuk melihat seluruh riwayat transaksi yang telah dilakukan. Dilengkapi ikon *Book*. Anda dapat melihat detail, mengedit, mencetak ulang struk, atau memproses retur dari sini.
3. **Retur Penjualan** — Tab khusus untuk mengelola data retur. Dilengkapi ikon *X-Octagon*. Menampilkan seluruh transaksi yang telah diretur beserta detailnya.

<div class="callout info" id="bkmrk-tips%3A-setiap-tab-sal">**Tips:** Setiap tab saling terhubung. Misalnya, saat Anda berhasil menyelesaikan transaksi di tab "Buat Penjualan", tab "Riwayat Penjualan" akan otomatis di-refresh. Begitu pula ketika retur diproses dari riwayat, tab "Retur Penjualan" akan diperbarui secara otomatis.

</div>## Hak Akses

Modul Penjualan memerlukan hak akses (permission) dengan resource `pos`. Berikut peran yang umumnya memiliki akses:

- **Kasir** — Akses penuh untuk membuat transaksi, melihat riwayat, dan mencetak struk.
- **Superadmin** — Akses penuh ke seluruh fitur termasuk pengelolaan retur.
- **Farmasi** — Akses untuk membuat penjualan terkait obat dan melihat riwayat transaksi.
- **Admin** — Akses untuk monitoring riwayat penjualan dan laporan.

<div class="callout warning" id="bkmrk-perhatian%3A-jika-anda">**Perhatian:** Jika Anda tidak dapat mengakses halaman Penjualan, hubungi administrator untuk memastikan role Anda memiliki permission terhadap resource `pos`.

</div>## Fitur Unggulan

- **Pencarian Cepat** — Cari produk berdasarkan nama, kode, zat aktif, atau scan barcode/QR code.
- **Keyboard Shortcut** — Navigasi tanpa mouse menggunakan shortcut seperti <kbd>F1</kbd> (pencarian), <kbd>F2</kbd> (input bayar), <kbd>F3</kbd> (uang pas), dan <kbd>F4</kbd> (bayar &amp; cetak struk).
- **Mode Fullscreen** — Tampilan layar penuh untuk fokus transaksi tanpa gangguan.
- **Dual Layout** — Tampilan otomatis menyesuaikan antara desktop (split view) dan mobile (tab view).
- **Diskon Fleksibel** — Diskon per item dan diskon keranjang, bisa dalam persen (%) maupun nominal (Rp).
- **Multi Metode Pembayaran** — Mendukung tunai, transfer, QRIS, dan metode pembayaran lainnya.
- **Reward Points** — Sistem poin reward untuk pasien terdaftar yang melakukan pembelian.
- **Cetak Multi-Format** — Struk POS thermal 80mm, struk A4, etiket, dan kirim via WhatsApp.
- **Shift Kasir** — Dukungan pergantian shift kasir dengan tracking total harian.

## Navigasi Cepat

Berikut panduan lanjutan untuk setiap fitur dalam modul Penjualan:

- **Tambah Transaksi Penjualan** — Panduan lengkap membuat transaksi baru dari pencarian produk hingga pembayaran.
- **Riwayat Penjualan** — Cara melihat, mencari, dan mengelola riwayat transaksi.
- **Retur Penjualan** — Prosedur pengembalian barang dan pengelolaan data retur.
- **Cetak Struk Penjualan** — Pengaturan dan format pencetakan struk transaksi.

# Tambah Transaksi Penjualan

## Membuat Transaksi Penjualan Baru

Tab **Buat Penjualan (POS)** adalah antarmuka utama untuk melakukan transaksi penjualan. Tampilan ini dibagi menjadi dua area: **area produk** (kiri) tempat Anda mencari dan menambahkan produk ke keranjang, serta **area checkout** (kanan) tempat Anda mengatur pembayaran dan menyelesaikan transaksi.

## Langkah 1: Pencarian Produk

Di bagian atas area produk terdapat kolom pencarian dengan fitur berikut:

1. **Pencarian Teks** — Ketik nama produk, kode produk, atau zat aktif pada kolom pencarian. Tekan <kbd>F1</kbd> untuk langsung fokus ke kolom ini.
2. **Scan Barcode/QR Code** — Klik ikon QR di samping kolom pencarian untuk mengaktifkan mode scan barcode.
3. **Hasil Pencarian** — Sistem akan menampilkan daftar produk yang sesuai secara real-time. Kata kunci pencarian akan di-highlight berwarna kuning untuk memudahkan identifikasi.

Klik produk dari hasil pencarian untuk menambahkannya ke keranjang belanja.

## Langkah 2: Mengatur Keranjang Belanja

Setelah produk ditambahkan ke keranjang, Anda dapat mengatur detail setiap item:

- **Batch** (<kbd>Alt+Q</kbd>) — Pilih nomor batch produk jika tersedia. Berguna untuk tracking expired date dan lot number.
- **Diskon** (<kbd>Alt+W</kbd>) — Masukkan diskon per item. Mode diskon (persen atau rupiah) mengikuti pengaturan global di sidebar checkout.
- **Margin** (<kbd>Alt+R</kbd>) — Atur margin keuntungan dalam persen. Pilihan margin tersedia dari dropdown.
- **Jumlah** (<kbd>Alt+E</kbd>) — Masukkan jumlah produk yang dibeli. Mendukung angka desimal (misalnya 0.5 untuk setengah).
- **Total** — Dihitung otomatis berdasarkan harga satuan, margin, dan jumlah. Anda dapat **double-click** kolom total untuk mengedit harga secara manual.
- **Hapus Item** — Klik ikon tempat sampah merah di kolom paling kiri untuk menghapus item dari keranjang.

<div class="callout info" id="bkmrk-tips%3A-gunakan-keyboa">**Tips:** Gunakan keyboard shortcut <kbd>Alt+Q</kbd>, <kbd>Alt+W</kbd>, <kbd>Alt+R</kbd>, dan <kbd>Alt+E</kbd> untuk berpindah antar kolom input tanpa menggunakan mouse. Tekan <kbd>Enter</kbd> setelah selesai mengedit setiap kolom.

</div>## Langkah 3: Pilih Pembeli

Di area checkout (sidebar kanan), tentukan identitas pembeli:

- **Pasien Terdaftar** — Pilih mode "Pasien" dari dropdown, lalu ketik nama atau NORM pasien. Sistem akan menampilkan saran otomatis. Memilih pasien terdaftar memungkinkan fitur *Reward Points*.
- **Non-Pasien** — Pilih mode "Non-Pasien" untuk pembeli umum. Cukup ketik nama pembeli secara manual.

## Langkah 4: Pengaturan Diskon &amp; Pembayaran

Pada area checkout, atur detail keuangan transaksi:

1. **Mode Diskon** — Toggle switch "Diskon %" atau "Diskon Rp" untuk mengatur mode diskon (berlaku global untuk seluruh item).
2. **Diskon Keranjang** — Masukkan diskon keseluruhan yang berlaku untuk total belanja.
3. **Pembulatan** — Sistem otomatis menghitung pembulatan harga.
4. **Total Belanja** — Ditampilkan besar di bagian atas sidebar sebagai grand total.
5. **Dibayar** (<kbd>F2</kbd>) — Masukkan jumlah uang yang diterima dari pembeli.
6. **Uang Pas** (<kbd>F3</kbd>) — Klik tombol ini untuk mengisi otomatis jumlah bayar sesuai grand total.
7. **Cara Bayar** (<kbd>Alt+C</kbd>) — Pilih metode pembayaran: Tunai, Transfer, QRIS, atau lainnya.
8. **Kembalian** — Dihitung otomatis dari selisih jumlah bayar dan grand total.

<div class="callout info" id="bkmrk-tips%3A-sistem-menampi">**Tips:** Sistem menampilkan **shortcut nominal pembayaran** terdekat (misalnya Rp 50.000, Rp 100.000) berdasarkan total belanja agar kasir dapat mengklik langsung tanpa mengetik nominal.

</div>## Langkah 5: Selesaikan Transaksi

1. Klik tombol **BAYAR &amp; CETAK STRUK** (<kbd>F4</kbd>) di bagian bawah sidebar.
2. Akan muncul dialog konfirmasi *"Selesaikan Transaksi Ini?"*. Klik **Ya** untuk melanjutkan atau **Tidak** untuk membatalkan.
3. Sistem akan memproses pembayaran dengan indikator progress bar.
4. Setelah berhasil, muncul dialog cetak dengan ringkasan transaksi (Total Belanja, Dibayar, Kembalian, dan Hutang jika ada).

## Langkah 6: Cetak atau Kirim Struk

Setelah transaksi berhasil, pilih aksi selanjutnya:

- **Cetak Struk POS** — Cetak ke printer thermal 80mm.
- **Cetak Struk A4** — Cetak dalam format A4 untuk arsip.
- **Cetak Etiket** — Cetak label produk/obat.
- **Kirim Struk ke WhatsApp** — Kirim bukti transaksi langsung ke WhatsApp pembeli.
- **Selesai Tanpa Cetak / Tutup** — Tutup dialog tanpa mencetak.

<div class="callout warning" id="bkmrk-perhatian%3A-pastikan-">**Perhatian:** Pastikan jumlah stok mencukupi sebelum menyelesaikan transaksi. Sistem akan menampilkan informasi stok terkini di kolom "Stok" pada tabel keranjang.

</div>## Daftar Keyboard Shortcut

<table id="bkmrk-shortcutfungsi-f1fok"><thead><tr><th>Shortcut</th><th>Fungsi</th></tr></thead><tbody><tr><td><kbd>F1</kbd></td><td>Fokus ke kolom pencarian produk</td></tr><tr><td><kbd>F2</kbd></td><td>Fokus ke kolom input pembayaran</td></tr><tr><td><kbd>F3</kbd></td><td>Isi otomatis uang pas</td></tr><tr><td><kbd>F4</kbd></td><td>Bayar dan cetak struk</td></tr><tr><td><kbd>Alt+Q</kbd></td><td>Pindah ke kolom Batch</td></tr><tr><td><kbd>Alt+W</kbd></td><td>Pindah ke kolom Diskon</td></tr><tr><td><kbd>Alt+R</kbd></td><td>Pindah ke kolom Margin</td></tr><tr><td><kbd>Alt+E</kbd></td><td>Pindah ke kolom Jumlah</td></tr><tr><td><kbd>Alt+C</kbd></td><td>Ubah metode pembayaran</td></tr></tbody></table>

# Riwayat Penjualan

## Tentang Riwayat Penjualan

Tab **Riwayat Penjualan** menampilkan seluruh transaksi penjualan yang pernah dilakukan. Dari halaman ini Anda dapat melihat detail transaksi, mengedit data, mencetak ulang struk, atau memproses retur barang.

## Tampilan Tabel Riwayat

Data riwayat ditampilkan dalam tabel interaktif dengan kolom-kolom berikut:

<table id="bkmrk-kolomketerangan-no.-"><thead><tr><th>Kolom</th><th>Keterangan</th></tr></thead><tbody><tr><td>**No. Invoice**</td><td>Nomor unik transaksi dalam format tanggal + nomor urut (contoh: 28022026-00015).</td></tr><tr><td>**Jumlah Tagihan**</td><td>Total nominal transaksi dalam format Rupiah.</td></tr><tr><td>**Tanggal Transaksi**</td><td>Tanggal dan waktu transaksi dilakukan.</td></tr><tr><td>**Pengunjung**</td><td>Nama pembeli atau pasien terkait transaksi.</td></tr><tr><td>**Status**</td><td>Status pembayaran transaksi (Lunas, Belum Lunas, dll.).</td></tr><tr><td>**Aksi**</td><td>Tombol-tombol aksi: Detail, Edit, Retur, dan Cetak Ulang.</td></tr></tbody></table>

## Filter dan Pencarian

Gunakan fitur filter untuk menemukan transaksi yang Anda cari dengan cepat:

### Filter Waktu Cepat

Klik tombol preset waktu untuk memfilter transaksi berdasarkan periode:

- **Kemarin** — Menampilkan transaksi hari kemarin.
- **Hari Ini** — Menampilkan transaksi hari ini (default saat membuka halaman).
- **Minggu Ini** — Menampilkan transaksi dari Senin hingga Minggu pada minggu berjalan.
- **Bulan Ini** — Menampilkan transaksi dari tanggal 1 hingga akhir bulan berjalan.

### Filter Tanggal Kustom

Untuk rentang tanggal tertentu, gunakan date picker:

1. Klik kolom **Dari** dan pilih tanggal awal.
2. Klik kolom **Sampai** dan pilih tanggal akhir.
3. Tabel akan otomatis memuat ulang data sesuai rentang tanggal yang dipilih.

### Filter Status Pembayaran

Gunakan dropdown status untuk memfilter berdasarkan kondisi pembayaran:

- **Semua** — Tampilkan semua transaksi tanpa filter status.
- **Lunas** — Hanya transaksi yang sudah dibayar penuh.
- **Belum Lunas** — Transaksi yang masih memiliki sisa pembayaran.

### Pencarian Teks

Ketik kata kunci pada kolom pencarian untuk mencari berdasarkan nomor invoice, nama pengunjung, atau detail transaksi lainnya. Pencarian bersifat *debounced*, artinya sistem akan menunggu 300 milidetik setelah Anda berhenti mengetik sebelum menjalankan pencarian.

## Aksi pada Transaksi

Setiap baris transaksi memiliki tombol aksi di kolom paling kanan:

### Detail Transaksi

1. Klik ikon **mata** (Eye) pada baris transaksi.
2. Modal detail akan terbuka menampilkan informasi lengkap: daftar produk, kuantitas, harga, diskon, total, dan informasi pembayaran.

### Edit Transaksi

1. Klik ikon **pensil** (Edit) pada baris transaksi.
2. Modal edit akan terbuka untuk mengubah data transaksi yang masih diizinkan.
3. Simpan perubahan setelah selesai mengedit.

<div class="callout warning" id="bkmrk-perhatian%3A-tidak-sem">**Perhatian:** Tidak semua transaksi dapat diedit. Transaksi yang sudah diproses retur atau sudah melewati batas waktu edit tidak dapat diubah.

</div>### Proses Retur

1. Klik ikon **retur** pada baris transaksi.
2. Modal retur akan terbuka menampilkan daftar item yang dapat diretur.
3. Pilih item dan masukkan jumlah retur serta alasan.
4. Konfirmasi proses retur. Stok akan otomatis dikembalikan ke inventaris.

### Cetak Ulang Struk

1. Klik ikon **printer** pada baris transaksi.
2. Pilih format cetakan yang diinginkan: 
    - **Cetak Struk POS** — Format thermal 80mm.
    - **Cetak Etiket** — Label produk.
    - **Kirim ke WhatsApp** — Kirim struk digital ke pembeli.

<div class="callout info" id="bkmrk-tips%3A-anda-dapat-men">**Tips:** Anda dapat mencetak ulang struk berulang kali tanpa batas. Fitur ini berguna jika struk pertama tidak tercetak dengan baik atau pembeli meminta salinan tambahan.

</div>## Paginasi dan Pengaturan Tampilan

Di bagian bawah tabel terdapat kontrol paginasi:

- **Jumlah per halaman** — Pilih 10, 25, 50, atau 100 data per halaman.
- **Navigasi halaman** — Gunakan tombol panah atau nomor halaman untuk berpindah antar halaman.
- **Informasi total** — Menampilkan jumlah total data yang ditemukan sesuai filter aktif.

## Sorting Data

Klik header kolom pada tabel untuk mengurutkan data secara ascending (A-Z / terkecil) atau descending (Z-A / terbesar). Kolom yang mendukung sorting ditandai dengan ikon panah di sebelah judul kolom.

# Retur Penjualan

## Tentang Retur Penjualan

Tab **Retur Penjualan** digunakan untuk mengelola pengembalian barang dari transaksi penjualan yang telah selesai. Fitur ini memungkinkan kasir atau admin memproses retur dengan pencatatan yang rapi, termasuk pengembalian stok secara otomatis ke inventaris.

## Tampilan Halaman Retur

Halaman Retur Penjualan menampilkan tabel berisi seluruh transaksi yang telah diretur. Tabel ini memiliki kolom-kolom berikut:

<table id="bkmrk-kolomketerangan-no.-"><thead><tr><th>Kolom</th><th>Keterangan</th></tr></thead><tbody><tr><td>**No. Invoice**</td><td>Nomor invoice asli dari transaksi yang diretur.</td></tr><tr><td>**Tanggal Transaksi**</td><td>Tanggal dan waktu transaksi asli dilakukan (format: DD-MM-YYYY HH:mm).</td></tr><tr><td>**Nama Pembeli**</td><td>Nama pembeli atau pasien yang melakukan transaksi awal.</td></tr><tr><td>**Total Nominal Retur**</td><td>Total nilai retur dalam format Rupiah.</td></tr><tr><td>**Status**</td><td>Selalu bertanda badge merah **RETUR**.</td></tr><tr><td>**Aksi**</td><td>Tombol Detail (lihat detail retur) dan Hapus.</td></tr></tbody></table>

## Filter dan Pencarian Data Retur

### Pencarian

Gunakan kolom pencarian di bagian atas tabel untuk mencari data retur berdasarkan:

- **NORM** — Nomor rekam medis pasien.
- **Nama** — Nama pembeli atau pasien.
- **No Invoice** — Nomor invoice transaksi.

### Filter Waktu Cepat

Klik tombol preset waktu untuk memfilter data retur:

- **Kemarin** — Data retur hari kemarin.
- **Hari Ini** — Data retur hari ini (default).
- **Minggu Ini** — Data retur minggu berjalan.
- **Bulan Ini** — Data retur bulan berjalan.

### Filter Tanggal Kustom

1. Atur tanggal pada kolom **Dari** untuk tanggal awal.
2. Atur tanggal pada kolom **Sampai** untuk tanggal akhir.
3. Klik tombol **Cari** untuk memuat data sesuai rentang tanggal.

<div class="callout info" id="bkmrk-tips%3A-tombol-refresh">**Tips:** Tombol refresh di sudut kanan atas kartu dapat digunakan untuk memuat ulang data tanpa mengubah filter yang sedang aktif.

</div>## Cara Memproses Retur Penjualan

Retur penjualan diproses melalui tab **Riwayat Penjualan**, bukan langsung dari tab Retur. Berikut langkah-langkahnya:

1. Buka tab **Riwayat Penjualan**.
2. Cari transaksi yang akan diretur menggunakan filter atau pencarian.
3. Klik ikon **Retur** pada kolom aksi di baris transaksi yang dipilih.
4. Modal retur akan terbuka menampilkan daftar item dalam transaksi tersebut.
5. Untuk setiap item yang akan diretur: 
    - Centang item yang ingin diretur.
    - Masukkan **jumlah retur** (tidak boleh melebihi jumlah pembelian awal).
    - Masukkan **alasan retur** sebagai dokumentasi.
6. Klik tombol **Proses Retur** untuk menyelesaikan.
7. Sistem akan otomatis: 
    - Mengembalikan stok ke inventaris sesuai jumlah retur.
    - Mencatat transaksi retur di tab Retur Penjualan.
    - Memperbarui status transaksi asli.

<div class="callout warning" id="bkmrk-perhatian%3A-proses-re">**Perhatian:** Proses retur bersifat permanen dan tidak dapat dibatalkan. Pastikan jumlah dan item yang diretur sudah benar sebelum mengklik "Proses Retur".

</div>## Melihat Detail Retur

1. Pada tab Retur Penjualan, klik ikon **mata** (Eye) di kolom aksi.
2. Modal detail retur akan terbuka dengan informasi lengkap: 
    - **Header** — Nomor invoice, badge RETUR, tanggal transaksi, dan nama pembeli.
    - **Kop Faskes** — Logo, nama, alamat, dan telepon fasilitas kesehatan (terlihat saat dicetak).
    - **Tabel Produk** — Daftar item retur dengan kolom: Nama Produk, No Batch, Jumlah, Harga Satuan, Diskon, dan Total.
    - **Ringkasan** — Sub Total, Diskon, dan Grand Total retur.
3. Dari modal detail, Anda dapat mencetak bukti retur menggunakan tombol cetak.

## Menghapus Data Retur

1. Klik ikon **tempat sampah** merah (Trash) pada baris data retur.
2. Konfirmasi penghapusan saat dialog muncul.

<div class="callout warning" id="bkmrk-perhatian%3A-menghapus">**Perhatian:** Menghapus data retur hanya menghapus catatan retur dari sistem. Konsultasikan dengan admin atau supervisor sebelum menghapus data retur untuk memastikan integritas laporan keuangan.

</div>## Paginasi

Tabel retur mendukung paginasi dengan pilihan menampilkan 5, 10, 50, atau 100 data per halaman. Gunakan navigasi halaman di bagian bawah tabel untuk berpindah antar halaman data.

# Cetak Struk Penjualan

## Tentang Cetak Struk

Sistem Dekacare menyediakan fitur pencetakan struk penjualan yang mendukung berbagai format output. Struk dapat dicetak langsung setelah transaksi selesai, maupun dicetak ulang dari halaman Riwayat Penjualan.

## Format Struk yang Tersedia

Dekacare mendukung beberapa format cetakan untuk kebutuhan yang berbeda:

### 1. Struk POS Thermal (80mm)

Format utama untuk printer thermal kasir dengan lebar kertas 80mm. Struk ini berisi:

- **Header Fasilitas Kesehatan** — Logo (jika ada), nama faskes, alamat, dan nomor telepon.
- **Informasi Transaksi** — Nomor nota dan tanggal/waktu transaksi.
- **Data Pembeli** — Nama pembeli atau "Pembeli Langsung" untuk transaksi tanpa data pembeli.
- **Daftar Produk** — Setiap produk ditampilkan dengan: 
    - Nama produk dan ukuran kemasan.
    - Harga satuan dan kuantitas (format: @harga x jumlah).
    - Total harga per item.
    - Diskon per item (jika ada).
- **Ringkasan Pembayaran**: 
    - Sub Total — Total sebelum diskon dan pembulatan.
    - Diskon Total — Diskon keseluruhan transaksi (jika ada).
    - Pembulatan — Nilai pembulatan harga (jika ada).
    - Grand Total — Total akhir yang harus dibayar.
    - Dibayar — Jumlah bayar beserta metode pembayaran (TUNAI, TRANSFER, dll.).
    - Kembalian — Selisih bayar dan grand total.
- **Reward Points** — Ditampilkan jika pembeli adalah pasien terdaftar dengan program reward: poin yang diraih, saldo poin, dan tingkatan member.
- **Informasi Kasir** — Nama kasir/operator yang memproses transaksi.
- **Footer** — Teks footer kustom (dapat diatur per faskes) dan watermark "Powered By: dekate".

### 2. Struk A4

Format dokumen A4 standar untuk keperluan arsip atau bukti transaksi formal. Berisi informasi yang sama dengan struk POS namun dalam tata letak yang lebih luas dan profesional, cocok untuk dicetak pada printer inkjet atau laser.

### 3. Etiket Produk

Label yang dicetak untuk ditempel pada kemasan produk/obat. Berisi informasi produk, dosis, dan petunjuk penggunaan.

### 4. Struk Digital via WhatsApp

Bukti transaksi digital yang dikirim langsung ke nomor WhatsApp pembeli. Format ini praktis dan ramah lingkungan karena tidak memerlukan kertas.

## Pengaturan Font Struk

Dekacare mendukung sistem **dynamic font** yang dapat dikonfigurasi per fasilitas kesehatan:

### Cara Mengatur Font

1. Buka menu **Pengaturan Faskes**.
2. Cari pengaturan dengan key `faskes:font-cetakan`.
3. Pilih font yang diinginkan dari 17 pilihan font yang tersedia.
4. Simpan pengaturan. Font akan langsung diterapkan pada semua cetakan berikutnya.

<div class="callout info" id="bkmrk-tips%3A-untuk-printer-">**Tips:** Untuk printer thermal, disarankan menggunakan font yang dioptimalkan untuk ESCPOS seperti font monospace. Font seperti **Courier New** atau **Roboto Mono** memberikan hasil terbaik pada printer thermal.

</div>### Cara Kerja Font Override

Sistem menggunakan utilitas `printWithFontOverride` yang secara otomatis:

1. Membaca pengaturan font dari konfigurasi faskes.
2. Meng-inject CSS dinamis ke elemen cetak sebelum proses print dimulai.
3. Menerapkan font secara konsisten ke seluruh elemen struk.
4. Membersihkan CSS yang di-inject setelah proses cetak selesai.

## Mencetak Struk Setelah Transaksi

Setelah transaksi berhasil diproses, dialog cetak akan otomatis muncul dengan pilihan:

1. **Cetak Struk POS** — Klik untuk mencetak ke printer thermal.
2. **Cetak Struk A4** — Klik untuk mencetak format A4.
3. **Cetak Etiket** — Klik untuk mencetak label produk.
4. **Kirim Struk ke WhatsApp** — Klik untuk mengirim bukti digital.
5. **Selesai Tanpa Cetak / Tutup** — Klik untuk melewati pencetakan.

Setiap tombol memiliki indikator loading saat proses cetak sedang berlangsung.

## Mencetak Ulang Struk dari Riwayat

1. Buka tab **Riwayat Penjualan**.
2. Cari transaksi yang ingin dicetak ulang.
3. Klik ikon **printer** pada kolom aksi.
4. Pilih format cetakan yang diinginkan dari dialog yang muncul.

<div class="callout info" id="bkmrk-tips%3A-cetak-ulang-st">**Tips:** Cetak ulang struk dapat dilakukan berulang kali tanpa batas dan tidak memengaruhi data transaksi. Setiap cetakan akan selalu menampilkan data terkini sesuai status transaksi saat ini.

</div>## Troubleshooting Cetak

<table id="bkmrk-masalahsolusi-struk-"><thead><tr><th>Masalah</th><th>Solusi</th></tr></thead><tbody><tr><td>Struk tidak tercetak</td><td>Pastikan printer thermal terhubung dan dikenali oleh sistem. Cek koneksi USB atau jaringan printer.</td></tr><tr><td>Font tidak sesuai</td><td>Periksa pengaturan `faskes:font-cetakan`. Pastikan font yang dipilih terinstal di komputer kasir.</td></tr><tr><td>Layout berantakan</td><td>Pastikan lebar kertas printer sesuai (80mm untuk POS). Periksa pengaturan margin pada driver printer.</td></tr><tr><td>Logo tidak muncul</td><td>Pastikan logo faskes sudah diunggah di pengaturan entitas. Format yang didukung: PNG, JPG.</td></tr><tr><td>Tombol cetak loading terus</td><td>Refresh halaman dan coba cetak ulang dari Riwayat Penjualan. Pastikan tidak ada popup blocker yang aktif di browser.</td></tr></tbody></table>

<div class="callout warning" id="bkmrk-perhatian%3A-pastikan-">**Perhatian:** Pastikan popup blocker pada browser dinonaktifkan untuk domain Dekacare, karena proses cetak menggunakan jendela popup browser. Jika popup diblokir, struk tidak akan tercetak.

</div>