perbaikan generate dan scan tiket

This commit is contained in:
Fanrouver
2026-01-15 14:32:21 +07:00
parent eac6529a77
commit 8aa5ab2ded
4 changed files with 154 additions and 222 deletions
+4 -78
View File
@@ -18,82 +18,9 @@ export interface ThermalPrintData {
export const useThermalPrint = () => {
const isPrinting = ref(false);
/**
* Generate barcode dengan format: YYMMDD + 5 digit sequential
* Format: YY (tahun 2 digit terakhir) + MM (bulan 2 digit) + DD (tanggal 2 digit) + XXXXX (5 digit sequential)
* Contoh: 26011400001, 26011400002, dst
* Counter akan reset setiap ganti tanggal (mulai dari 00001 lagi)
*
* @param existingBarcodes - Array barcode yang sudah ada (optional, untuk validasi uniqueness)
* @returns Barcode string dengan format YYMMDDXXXXX
*/
const generateBarcode = (existingBarcodes: string[] = []): string => {
if (typeof window === 'undefined') {
// Fallback untuk SSR: gunakan counter berdasarkan existingBarcodes
const now = new Date();
const year = String(now.getFullYear()).slice(-2); // 2 digit tahun terakhir
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const datePrefix = `${year}${month}${day}`; // YYMMDD
// Gunakan counter berdasarkan existingBarcodes untuk sequential
const existingCount = existingBarcodes.filter(b => b && b.startsWith(datePrefix)).length;
const counter = existingCount + 1;
const counterCode = String(counter).padStart(5, '0');
return `${datePrefix}${counterCode}`;
}
const now = new Date();
const year = String(now.getFullYear()).slice(-2); // 2 digit tahun terakhir
const month = String(now.getMonth() + 1).padStart(2, '0'); // 2 digit bulan
const day = String(now.getDate()).padStart(2, '0'); // 2 digit tanggal
const datePrefix = `${year}${month}${day}`; // YYMMDD
// Key untuk localStorage berdasarkan tanggal
const STORAGE_KEY = `barcode_counter_${datePrefix}`;
const LAST_DATE_KEY = 'barcode_last_date';
// Cek apakah tanggal sudah berubah (reset counter)
const lastDate = localStorage.getItem(LAST_DATE_KEY);
const currentDate = datePrefix;
let counter = 1; // Default mulai dari 1
if (lastDate === currentDate) {
// Tanggal sama, lanjutkan counter dari localStorage
const storedCounter = localStorage.getItem(STORAGE_KEY);
if (storedCounter) {
counter = parseInt(storedCounter, 10) || 1;
}
} else {
// Tanggal berbeda, reset counter ke 1
counter = 1;
// Hapus counter lama untuk tanggal sebelumnya (cleanup)
if (lastDate) {
localStorage.removeItem(`barcode_counter_${lastDate}`);
}
}
// Generate barcode dengan counter saat ini
let barcode = `${datePrefix}${String(counter).padStart(5, '0')}`;
// Cek apakah barcode sudah ada di existingBarcodes
let attempts = 0;
const maxAttempts = 1000; // Maksimal 1000 pasien per hari
while (existingBarcodes.includes(barcode) && attempts < maxAttempts) {
counter++;
barcode = `${datePrefix}${String(counter).padStart(5, '0')}`;
attempts++;
}
// Increment counter untuk next call dan simpan
counter++;
localStorage.setItem(STORAGE_KEY, String(counter));
localStorage.setItem(LAST_DATE_KEY, currentDate);
return barcode;
};
// NOTE: generateBarcode telah dihapus dari useThermalPrint
// Gunakan generateBarcode dari queueStore.js untuk konsistensi
// Semua barcode generation harus melalui queueStore.generateBarcode()
/**
* Generate QR Code data URL
@@ -699,7 +626,6 @@ export const useThermalPrint = () => {
isPrinting,
printTicket,
printTicketFromPatient,
generateQRCode,
generateBarcode
generateQRCode
};
};