Files
Webklar-Kundenbereich/public/neu/rechnung-offen.js
T
ClaudeandClaude Sonnet 5.5 8e349f6eca Kundenansicht neu E-Fix F3c: 44-px-Tippfläche für Kündigen, Widerrufen, Vertragsbedingungen und Zahlen am Handy
"Verträge hier kündigen", "Vertrag widerrufen", die Vertragsbedingungen und das "Zahlen" der Zeile "Rechnung offen" waren 14-px-Textlinks
von etwa 16 px Höhe. Am Handy jetzt inline-flex mit 44 px Mindesthöhe; das "Zahlen" steht rechts in der Zeile (der Trenner davor ist ein
eigenes Element und am Handy ausgeblendet, textContent unverändert). Pin in test/knEfixCss.test.js, Tippflächen-Prüfung in den
Werkzeug-Ansichten kn-p2-abo-privat und kn-p2-website-rechnung.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 21:30:45 +00:00

38 lines
1.9 KiB
JavaScript

/* Kundenansicht neu (P2): Zeile "Rechnung offen" für Website und Funktionen. Offen heißt wie überall Number(balance) > 0 (V3).
Fällt der Abruf aus, fehlt nur diese Zeile. */
import { api } from './api.js'
import { h } from './dom.js'
import { fmtEuro, sichereAdresse, zuAnsicht } from './ansicht-hilfen.js'
/** Rechnungen mit offenem Betrag, in der Reihenfolge der Antwort von GET /api/invoices. */
export function offeneRechnungen(antwort) {
const liste = Array.isArray(antwort?.invoices) ? antwort.invoices : []
return liste.filter((r) => Number(r?.balance) > 0)
}
/** Lädt GET /api/invoices und liefert die offenen Rechnungen; jeder Fehler ergibt eine leere Liste. */
export async function ladeOffeneRechnungen(apiFn = api) {
try {
return offeneRechnungen(await apiFn('/api/invoices'))
} catch {
return []
}
}
/** Die Zeile für die offenen Rechnungen; ohne offene Rechnung null. Eine Rechnung mit sicherem Link führt dorthin, sonst zu den Rechnungen. */
export function rechnungOffenZeile(offen) {
if (!Array.isArray(offen) || !offen.length) return null
const summe = Math.round(offen.reduce((s, r) => s + (Number(r.balance) || 0), 0) * 100) / 100
const einzel = offen.length === 1 ? offen[0] : null
const url = einzel ? sichereAdresse(einzel.portalUrl) : ''
const link = url
? h('a', { href: url, target: '_blank', rel: 'noopener noreferrer' }, 'Zahlen')
: h('a', zuAnsicht('invoices'), 'Zahlen')
const teile = einzel
? ['Rechnung offen', einzel.number, fmtEuro(summe)]
: [`${offen.length} Rechnungen offen`, fmtEuro(summe)]
// Der Trenner vor dem Link ist ein eigenes Element: am Handy steht das „Zahlen“ rechts in der Zeile ohne hängenden Punkt (textContent bleibt gleich)
return h('p', { class: 'kn-rechnung-offen' }, h('span', { class: 'kn-rechnung-text' }, teile.filter(Boolean).join(' · ')), h('span', { class: 'kn-trenner' }, ' · '), link)
}