{{-- Scripts para manejo de hardware POS --}} `); printWindow.document.close(); }, printViaUSB(content) { // Implementación básica para impresoras térmicas vía USB // Esto requeriría una implementación más completa según el modelo console.log('Intentando imprimir vía USB...'); // Por ahora usamos el método de ventana como fallback this.printViaWindow(content); }, // Inicializar cajón de dinero initCashDrawer() { Livewire.on('open-cash-drawer', () => { this.openCashDrawer(); }); }, openCashDrawer() { // Comando ESC/POS para abrir cajón de dinero const drawerCommand = '\x1B\x70\x00\x19\xFA'; // Comando estándar para abrir cajón // Intentar enviar comando a la impresora if (window.electronAPI && window.electronAPI.sendToPrinter) { window.electronAPI.sendToPrinter(drawerCommand); } else { // Fallback: usar una señal acústica para indicar que se debería abrir el cajón this.playCashDrawerSound(); } }, playCashDrawerSound() { // Reproducir sonido de apertura de cajón const audio = new Audio('data:audio/wav;base64,UklGRnoGAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQoGAACBhYqFbF1fdJivrJBhNjVgodDbq2EcBj+a2/LDciUFLIHO8tiJNwgZaLvt559NEAxQp+PwtmMcBjiR1/LMeSwFJHfH8N2QQAoUXrTp66hVFApGn+DyvmwhBSuBzvLZiTYIG2m98OScTgwOUarm7blmGgU7k9n1unEiBC13yO/eizEIHWq+8+OWT'); audio.play().catch(() => { // Si no se puede reproducir audio, usar beep del sistema console.log('Abriendo cajón de dinero...'); }); }, // Inicializar pantalla de cliente initCustomerDisplay() { Livewire.on('update-customer-display', (event) => { const data = event[0]; this.updateCustomerDisplay(data); }); }, updateCustomerDisplay(data) { // Buscar pantalla de cliente (segunda ventana o monitor) const customerWindow = this.findCustomerDisplay(); if (customerWindow) { this.renderCustomerDisplay(customerWindow, data); } else { // Si no hay pantalla secundaria, mostrar en una esquina de la pantalla principal // Verificar si está habilitada antes de mostrar overlay if (window.Livewire && window.Livewire.find && window.Livewire.find('{{ $this->getId() }}')) { const component = window.Livewire.find('{{ $this->getId() }}'); if (component && component.customerDisplayEnabled) { this.showCustomerDisplayOverlay(data); } } else { this.showCustomerDisplayOverlay(data); } } }, findCustomerDisplay() { // Intentar encontrar una ventana de pantalla de cliente existente // Esto podría ser una ventana emergente o una conexión a un monitor secundario return null; // Por ahora retornamos null, se implementará según necesidades }, renderCustomerDisplay(window, data) { // Renderizar información en la pantalla del cliente // Esto se personalizará según el diseño deseado console.log('Actualizando pantalla de cliente:', data); }, showCustomerDisplayOverlay(data) { // Mostrar información del cliente como overlay en la pantalla principal const overlay = document.createElement('div'); overlay.className = 'customer-display-overlay'; overlay.style.cssText = ` position: fixed; top: 20px; right: 20px; background: #fff; border: 2px solid #007bff; border-radius: 10px; padding: 20px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); z-index: 9999; font-family: Arial, sans-serif; min-width: 300px; `; let content = ''; if (data.action === 'sale_completed') { content = `

¡Gracias por su compra!

Total: $${data.total.toFixed(2)}

Cambio: $${data.cambio.toFixed(2)}

`; } overlay.innerHTML = content; document.body.appendChild(overlay); // Remover después de 5 segundos setTimeout(() => { if (overlay.parentNode) { overlay.parentNode.removeChild(overlay); } }, 5000); } }; // Inicializar cuando el DOM esté listo document.addEventListener('DOMContentLoaded', function() { POSHardware.initBarcodeScanner(); POSHardware.initPrinter(); POSHardware.initCashDrawer(); POSHardware.initCustomerDisplay(); console.log('Hardware POS inicializado'); }); // Escuchar eventos de Livewire para enfocar el input de código de barras Livewire.on('focus-barcode-input', () => { const barcodeInput = document.querySelector('[data-barcode-input]'); if (barcodeInput) { barcodeInput.focus(); barcodeInput.select(); } });