diff --git a/public/js/views/salestax-view.js b/public/js/views/salestax-view.js index ceab738..ac7d24b 100644 --- a/public/js/views/salestax-view.js +++ b/public/js/views/salestax-view.js @@ -11,6 +11,11 @@ * dieselbe QBO-Schnittstelle, die der Report "Sales Tax (QBO)" auf dem * Reports-Tab nutzt. Die Abhängigkeit liegt auf API-Ebene, die Trennung der * beiden Oberflächen berührt sie nicht. + * + * Maßgeblichkeit der Beträge: Sobald eine Periode in sales_tax_periods steht, + * ist der dort gespeicherte QBO-Snapshot (tax_collected & Co.) der angezeigte + * Grundbetrag. Der Live-Abruf liefert dann nur noch die Distrikt-Aufschlüsselung. + * Nur für eine noch nicht gespeicherte Periode kommen die Kennzahlen live. */ import '../utils/api.js'; @@ -175,17 +180,33 @@ async function openTaxPeriodDetail(startDate, endDate, existingPeriod) { } showLoading('sales-tax-detail', 'Loading tax summary from QBO…'); - let taxData; + let taxData = null; try { taxData = await window.API.accounting.getTaxSummary(startDate, endDate, 'Accrual'); } catch (e) { - showError('sales-tax-detail', e.message || 'Failed to load tax summary'); - return; + // Für eine gespeicherte Periode ist der Live-Abruf nur Beiwerk: die + // Kennzahlen stehen in der DB-Zeile, also weiter mit dem Snapshot. + if (!existingPeriod) { + showError('sales-tax-detail', e.message || 'Failed to load tax summary'); + return; + } + console.error('Tax summary fetch failed, showing saved snapshot:', e.message); } - const reportHtml = taxData?.Rows ? renderQboReport(taxData) : `
No tax data for this period.
`; + // Gespeicherte Periode → DB-Snapshot ist maßgeblich; der Live-Abruf liefert + // nur die Distrikt-Zeilen. Neue Periode → live geladene Werte. + const liveParsed = parseTaxDataFromReport(taxData); + const useSnapshot = !!existingPeriod; + const parsed = useSnapshot ? snapshotFromPeriod(existingPeriod, liveParsed) : liveParsed; + + const reportData = useSnapshot ? withSnapshotGrandTotal(taxData, parsed) : taxData; + const reportHtml = reportData?.Rows + ? renderQboReport(reportData) + : `No tax data for this period.
`; + const snapshotNote = useSnapshot + ? `Grand total shown is the saved QBO snapshot for this period${existingPeriod.updated_at ? ` (last saved ${formatDate(existingPeriod.updated_at)})` : ''}. The district rows above are recalculated live and may differ in detail.
` + : ''; - const parsed = parseTaxDataFromReport(taxData); stCurrentTaxData = { ...parsed, startDate, endDate }; const taxCollected = parsed.taxCollected; const totalSales = parsed.totalSales; @@ -210,10 +231,11 @@ async function openTaxPeriodDetail(startDate, endDate, existingPeriod) { class="px-2 py-1 text-gray-400 hover:text-gray-600 text-lg leading-none">× ${reportHtml} + ${snapshotNote}