cashumit/lib/services/struk_text_generator.dart

126 lines
4.5 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;
}
/// 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';
print('Nama toko: $storeName');
print('Alamat toko: $storeAddress');
print('Nama admin: $adminName');
print('Telepon admin: $adminPhone');
// 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 - menggunakan lebar 32 karakter untuk kompatibilitas printer termal
buffer.writeln(centerText(storeName, 32));
buffer.writeln(centerText(storeAddress, 32));
buffer.writeln(centerText('Admin: $adminName', 32));
buffer.writeln(centerText('Telp: $adminPhone', 32));
buffer.writeln(createSeparator(32, '='));
// Info transaksi
buffer.writeln('TANGGAL : $formattedDate');
buffer.writeln('DARI : Kas Tunai');
buffer.writeln('KE : Pendapatan Harian');
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, '='));
// Footer
buffer.writeln(centerText('*** TERIMA KASIH ***', 32));
buffer.writeln(centerText('Barang yang sudah dibeli', 32));
buffer.writeln(centerText('tidak dapat dikembalikan', 32));
// Spasi di akhir
buffer.writeln('');
buffer.writeln('');
final result = buffer.toString();
print('Teks struk yang dihasilkan:');
print(result);
return result;
}
}