/* Buchungskalender, Reiter „Rechnungen“: Liste der Rechnungen und Storno-Rechnungen mit PDF-Link. API: GET /api/unterkunft/rechnungen?projectId= => { rechnungen:[{ id, nummer, datum, art:'rechnung'|'storno', gastName, bruttoCent, anfrageNummer? }] }; PDF: GET /api/unterkunft/rechnungen/.pdf?projectId= (Einzel-PDF, kein ZIP). Fremdtext nur ueber textContent. render(panel, ctx). */ import { abschnitt, datumText, euroText, h, infoKarte } from './shop-dom.js' import { enc, zeichen } from './buchungen-uk-hilfe.js' const ART = { rechnung: 'Rechnung', storno: 'Storno-Rechnung' } const betragText = (cent) => { if (!Number.isInteger(cent)) return '' return cent < 0 ? `−${euroText(-cent)}` : euroText(cent) } export async function render(panel, ctx = {}) { const q = `projectId=${enc(ctx.projectId)}` const antwort = await ctx.request(`/api/unterkunft/rechnungen?${q}`) const liste = Array.isArray(antwort?.rechnungen) ? antwort.rechnungen : [] if (!liste.length) { panel.replaceChildren(infoKarte('Rechnungen', 'Noch keine Rechnungen. Sobald ein Gast bucht, erscheint hier die Rechnung.')) return } const zeilen = liste.map((r) => h('li', { class: 'bk-rechnung', 'data-rechnung': zeichen(r.id), 'data-art': zeichen(r.art) }, h('span', { class: 'bk-nummer' }, zeichen(r.nummer)), h('span', { class: 'bk-zeitraum' }, datumText(zeichen(r.datum), { zeit: false })), h('span', { class: 'bk-gast' }, zeichen(r.gastName)), h('span', { class: `sh-pille ${r.art === 'storno' ? 'sh-pille-bad' : 'sh-pille-ok'}` }, ART[r.art] || 'Rechnung'), h('span', { class: 'bk-betrag' }, betragText(r.bruttoCent)), h('a', { class: 'kb-btn-outline', 'data-aktion': 'pdf', href: `/api/unterkunft/rechnungen/${enc(zeichen(r.id))}.pdf?${q}`, target: '_blank', rel: 'noopener', 'aria-label': `PDF zu ${zeichen(r.nummer)} herunterladen`, }, 'PDF'))) panel.replaceChildren(abschnitt('Rechnungen', 'Rechnungen und Storno-Rechnungen deiner Gäste, ausgestellt in deinem Namen.', h('ul', { class: 'bk-liste' }, zeilen))) }