/** * settings-view.js — Logo upload, QBO import, QBO connection test * Extracted from app.js */ let currentLogoFile = null; export async function checkCurrentLogo() { try { const response = await fetch('/api/logo-info'); if (response.ok) { const data = await response.json(); if (data.hasLogo) { document.getElementById('logo-preview').classList.remove('hidden'); document.getElementById('logo-image').src = data.logoPath + '?t=' + Date.now(); } } } catch (error) { console.error('Error checking logo:', error); } } export async function uploadLogo() { if (!currentLogoFile) { alert('Please select a file first'); return; } const formData = new FormData(); formData.append('logo', currentLogoFile); const statusDiv = document.getElementById('upload-status'); statusDiv.innerHTML = '

Uploading...

'; try { const response = await fetch('/api/upload-logo', { method: 'POST', body: formData }); if (response.ok) { const data = await response.json(); statusDiv.innerHTML = '

✓ Logo uploaded successfully!

'; document.getElementById('logo-preview').classList.remove('hidden'); document.getElementById('logo-image').src = data.path + '?t=' + Date.now(); document.getElementById('upload-btn').disabled = true; currentLogoFile = null; document.getElementById('logo-filename').textContent = ''; document.getElementById('logo-upload').value = ''; } else { const error = await response.json(); statusDiv.innerHTML = `

✗ Error: ${error.error}

`; } } catch (error) { console.error('Upload error:', error); statusDiv.innerHTML = '

✗ Upload failed

'; } } export function initSettingsView() { const logoUpload = document.getElementById('logo-upload'); if (logoUpload) { logoUpload.addEventListener('change', (e) => { const file = e.target.files[0]; if (file) { currentLogoFile = file; document.getElementById('logo-filename').textContent = file.name; document.getElementById('upload-btn').disabled = false; } }); } } export async function checkQboOverdue() { const btn = document.querySelector('button[onclick="checkQboOverdue()"]'); const resultDiv = document.getElementById('qbo-result'); const tbody = document.getElementById('qbo-result-list'); const originalText = btn.innerHTML; btn.innerHTML = '⏳ Connecting to QBO...'; btn.disabled = true; resultDiv.classList.add('hidden'); tbody.innerHTML = ''; try { const response = await fetch('/api/qbo/overdue'); const invoices = await response.json(); if (response.ok) { resultDiv.classList.remove('hidden'); if (invoices.length === 0) { tbody.innerHTML = '✅ Good news! No overdue invoices found older than 30 days.'; } else { tbody.innerHTML = invoices.map(inv => ` ${inv.DocNumber || '(No Num)'} ${inv.CustomerRef?.name || 'Unknown'} ${inv.DueDate} $${inv.Balance} `).join(''); } alert(`Success! Connection working. Found ${invoices.length} overdue invoices.`); } else { throw new Error(invoices.error || 'Unknown error'); } } catch (error) { console.error('QBO Test Error:', error); alert('❌ Connection Test Failed: ' + error.message); tbody.innerHTML = `Error: ${error.message}`; resultDiv.classList.remove('hidden'); } finally { btn.innerHTML = originalText; btn.disabled = false; } } export async function importFromQBO() { if (!confirm( 'Alle unbezahlten Rechnungen aus QBO importieren?\n\n' + '• Bereits importierte werden übersprungen\n' + '• Nur Kunden die lokal verknüpft sind\n\n' + 'Fortfahren?' )) return; const btn = document.querySelector('button[onclick="importFromQBO()"]'); const resultDiv = document.getElementById('qbo-import-result'); const originalText = btn.innerHTML; btn.innerHTML = '⏳ Importiere aus QBO...'; btn.disabled = true; resultDiv.classList.add('hidden'); try { const response = await fetch('/api/qbo/import-unpaid', { method: 'POST' }); const result = await response.json(); resultDiv.classList.remove('hidden'); if (response.ok) { let html = `
`; html += `

Import abgeschlossen

`; html += `
`; resultDiv.innerHTML = html; if (result.imported > 0 && window.invoiceView) { window.invoiceView.loadInvoices(); } } else { resultDiv.innerHTML = `

Import fehlgeschlagen

${result.error}

`; } } catch (error) { console.error('Import Error:', error); resultDiv.classList.remove('hidden'); resultDiv.innerHTML = `

Netzwerkfehler beim Import.

`; } finally { btn.innerHTML = originalText; btn.disabled = false; } } // Expose for onclick handlers window.uploadLogo = uploadLogo; window.checkQboOverdue = checkQboOverdue; window.importFromQBO = importFromQBO;