184 lines
6.6 KiB
Dart
184 lines
6.6 KiB
Dart
import 'package:cashumit/models/receipt_item.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import 'package:intl/intl.dart';
|
|
|
|
/// Class untuk menghasilkan struk dalam format teks untuk printer thermal
|
|
class StrukTextGenerator {
|
|
/// Fungsi untuk mengatur teks ke tengah
|
|
static String centerText(String text, int width, [String padChar = ' ']) {
|
|
if (text.length >= width) return text;
|
|
int padLeft = (width - text.length) ~/ 2;
|
|
int padRight = width - text.length - padLeft;
|
|
return padChar * padLeft + text + padChar * padRight;
|
|
}
|
|
|
|
/// Fungsi untuk membuat garis pemisah
|
|
static String createSeparator(int width, String char) {
|
|
return char * width;
|
|
}
|
|
|
|
/// Fungsi untuk membuat representasi ASCII sederhana dari logo
|
|
static String createAsciiLogo(String storeName, int width) {
|
|
final buffer = StringBuffer();
|
|
|
|
// Membuat logo ASCII sederhana dengan nama toko
|
|
final int nameLength = storeName.length;
|
|
final int boxWidth = nameLength + 4;
|
|
final String horizontalLine = '=' * boxWidth;
|
|
final String emptyLine = '|${' ' * (boxWidth - 2)}|';
|
|
|
|
buffer.writeln(centerText(horizontalLine, width));
|
|
buffer.writeln(centerText(emptyLine, width));
|
|
buffer.writeln(centerText('| $storeName |', width));
|
|
buffer.writeln(centerText(emptyLine, width));
|
|
buffer.writeln(centerText(horizontalLine, width));
|
|
|
|
return buffer.toString();
|
|
}
|
|
|
|
/// Menghasilkan struk dalam format teks berdasarkan data transaksi
|
|
static Future<String> generateStrukText({
|
|
required List<ReceiptItem> items,
|
|
required DateTime transactionDate,
|
|
required String cashierId,
|
|
required String transactionId,
|
|
}) async {
|
|
print('Memulai generateStrukText...');
|
|
print('Jumlah item: ${items.length}');
|
|
print('Tanggal transaksi: $transactionDate');
|
|
print('ID kasir: $cashierId');
|
|
print('ID transaksi: $transactionId');
|
|
|
|
// Load store info from shared preferences
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final storeName = prefs.getString('store_name') ?? 'TOKO SEMBAKO MURAH';
|
|
final storeAddress = prefs.getString('store_address') ?? 'Jl. Merdeka No. 123';
|
|
final adminName = prefs.getString('admin_name') ?? 'Budi Santoso';
|
|
final adminPhone = prefs.getString('admin_phone') ?? '08123456789';
|
|
final logoPath = prefs.getString('store_logo_path'); // Load logo path
|
|
|
|
print('Nama toko: $storeName');
|
|
print('Alamat toko: $storeAddress');
|
|
print('Nama admin: $adminName');
|
|
print('Telepon admin: $adminPhone');
|
|
print('Logo path: $logoPath');
|
|
|
|
// Format tanggal
|
|
final dateFormatter = DateFormat('dd/MM/yyyy');
|
|
final formattedDate = dateFormatter.format(transactionDate);
|
|
print('Tanggal yang diformat: $formattedDate');
|
|
|
|
// Format angka ke rupiah
|
|
String formatRupiah(double amount) {
|
|
final formatter = NumberFormat("#,##0", "id_ID");
|
|
return "Rp ${formatter.format(amount)}";
|
|
}
|
|
|
|
// Bangun struk dalam format teks
|
|
final buffer = StringBuffer();
|
|
|
|
// Header toko dengan logo ASCII - menggunakan lebar 32 karakter untuk kompatibilitas printer termal
|
|
buffer.write(createAsciiLogo(storeName, 32));
|
|
buffer.writeln('');
|
|
buffer.writeln(centerText(storeAddress, 32));
|
|
buffer.writeln(centerText('Admin: $adminName', 32));
|
|
buffer.writeln(centerText('Telp: $adminPhone', 32));
|
|
buffer.writeln(centerText(' $formattedDate ', 32));
|
|
buffer.writeln(createSeparator(32, '='));
|
|
|
|
// Header tabel - disesuaikan lebar kolom untuk printer termal
|
|
buffer.writeln('ITEM QTY HARGA TOTAL');
|
|
buffer.writeln(createSeparator(32, '-'));
|
|
|
|
// Item list
|
|
print('Memulai iterasi item...');
|
|
for (int i = 0; i < items.length; i++) {
|
|
var item = items[i];
|
|
print('Item $i: ${item.description}, qty: ${item.quantity}, price: ${item.price}, total: ${item.total}');
|
|
|
|
// Nama item (potong jika terlalu panjang) - maks 12 karakter
|
|
String itemName = item.description.length > 12
|
|
? '${item.description.substring(0, 9)}...'
|
|
: item.description.padRight(12);
|
|
|
|
// Quantity (3 karakter)
|
|
String qty = item.quantity.toString().padRight(3);
|
|
|
|
// Harga (7 karakter)
|
|
String price = formatRupiah(item.price).padLeft(7);
|
|
|
|
// Total (7 karakter)
|
|
String total = formatRupiah(item.total).padLeft(7);
|
|
|
|
buffer.writeln('$itemName $qty $price $total');
|
|
}
|
|
print('Selesai iterasi item');
|
|
|
|
// Garis pemisah sebelum total
|
|
buffer.writeln(createSeparator(32, '-'));
|
|
|
|
// Total
|
|
final totalAmount = items.fold(0.0, (sum, item) => sum + item.total);
|
|
print('Total amount: $totalAmount');
|
|
buffer.writeln('TOTAL: ${formatRupiah(totalAmount)}'.padLeft(32));
|
|
|
|
// Garis pemisah setelah total
|
|
buffer.writeln(createSeparator(32, '='));
|
|
|
|
// Memuat teks kustom dari shared preferences
|
|
final customDisclaimer = prefs.getString('store_disclaimer_text') ??
|
|
'Barang yang sudah dibeli tidak dapat dikembalikan/ditukar. '
|
|
'Harap periksa kembali struk belanja Anda sebelum meninggalkan toko.';
|
|
final customThankYou = prefs.getString('thank_you_text') ?? '*** TERIMA KASIH ***';
|
|
final customPantun = prefs.getString('pantun_text') ??
|
|
'Belanja di toko kami, hemat dan nyaman,\n'
|
|
'Dengan penuh semangat, kami siap melayani,\n'
|
|
'Harapan kami, Anda selalu puas,\n'
|
|
'Sampai jumpa lagi, selamat tinggal.';
|
|
|
|
// Menambahkan disclaimer
|
|
buffer.writeln('');
|
|
// Memecah disclaimer menjadi beberapa baris jika terlalu panjang
|
|
final disclaimerLines = customDisclaimer.split(' ');
|
|
final List<String> wrappedDisclaimer = [];
|
|
String currentLine = '';
|
|
|
|
for (final word in disclaimerLines) {
|
|
if ((currentLine + word).length > 32) {
|
|
wrappedDisclaimer.add(currentLine.trim());
|
|
currentLine = word + ' ';
|
|
} else {
|
|
currentLine += word + ' ';
|
|
}
|
|
}
|
|
if (currentLine.trim().isNotEmpty) {
|
|
wrappedDisclaimer.add(currentLine.trim());
|
|
}
|
|
|
|
for (final line in wrappedDisclaimer) {
|
|
buffer.writeln(centerText(line, 32));
|
|
}
|
|
|
|
// Menambahkan ucapan terima kasih
|
|
buffer.writeln('');
|
|
buffer.writeln(centerText(customThankYou, 32));
|
|
|
|
// Menambahkan pantun
|
|
buffer.writeln('');
|
|
final pantunLines = customPantun.split('\n');
|
|
for (final line in pantunLines) {
|
|
buffer.writeln(centerText(line, 32));
|
|
}
|
|
|
|
// Spasi di akhir
|
|
buffer.writeln('');
|
|
buffer.writeln('');
|
|
|
|
final result = buffer.toString();
|
|
print('Teks struk yang dihasilkan:');
|
|
print(result);
|
|
|
|
return result;
|
|
}
|
|
}
|