From e67045b2bfc99a0d777fa743444c469c83525c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asger=20Geel=20Weirs=C3=B8e?= Date: Tue, 16 Jun 2026 19:20:40 +0200 Subject: [PATCH] =?UTF-8?q?feat(ubl):=20UBL-profil-detektor=20+=20identifi?= =?UTF-8?q?kator-afkoder=20(/ubl,=20client-side)=20+=20/profiler=20=3Fq=3D?= =?UTF-8?q?-prefill=20+=20=E2=8C=98K?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/profiler.astro | 2 + src/pages/search-index.json.js | 1 + src/pages/ubl.astro | 194 +++++++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+) create mode 100644 src/pages/ubl.astro diff --git a/src/pages/profiler.astro b/src/pages/profiler.astro index bf8f67c..f620fdd 100644 --- a/src/pages/profiler.astro +++ b/src/pages/profiler.astro @@ -164,6 +164,8 @@ const kilde = (p: (typeof profiles)[number]) => { setTimeout(function () { btn.textContent = orig; }, 1200); }).catch(function () {}); }); + var qp = new URLSearchParams(location.search).get('q'); + if (qp) { search.value = qp; q = qp.trim().toLowerCase(); } apply(); })(); diff --git a/src/pages/search-index.json.js b/src/pages/search-index.json.js index e2b95f5..92f335d 100644 --- a/src/pages/search-index.json.js +++ b/src/pages/search-index.json.js @@ -11,6 +11,7 @@ export async function GET() { { type: 'page', title: 'Tags', url: '/tags' }, { type: 'page', title: 'NemHandel-opslag', url: '/nemhandel' }, { type: 'page', title: 'Profil-opslag (Nemhandel & Peppol)', url: '/profiler' }, + { type: 'page', title: 'UBL-tjek & identifikator-afkoder', url: '/ubl' }, { type: 'page', title: 'Spørg mit CV (AI-chat)', url: '/chat' }, { type: 'page', title: 'Status (homelab)', url: '/status' }, { type: 'page', title: 'Now', url: '/now' }, diff --git a/src/pages/ubl.astro b/src/pages/ubl.astro new file mode 100644 index 0000000..5c2a26c --- /dev/null +++ b/src/pages/ubl.astro @@ -0,0 +1,194 @@ +--- +import Base from '../layouts/Base.astro'; +import { profiles } from '../data/profiles'; + +// Minimal data til klient-matchning (id + customization + navn + standard + dokumenter). +const idx = profiles.map((p) => ({ + standard: p.standard, + navn: p.navn, + id: p.id, + customization: p.customization, + dokumenter: p.dokumenter, +})); +--- + +

UBL-tjek

+

+ Træk en UBL/OIOUBL-faktura (eller andet UBL-dokument) ind — eller indsæt en + CustomizationID/ProfileID — så afkoder den profilen, syntaksen og + EN 16931-status og kobler til profil-opslaget. + Alt sker lokalt i din browser; intet sendes nogen steder. +

+ +
+

Træk en .xml-fil hertil, eller + . +

+
+ +
+ …eller indsæt XML / en identifikator manuelt + +

+
+ + + + +

+ Heuristik mod kendte profiler (samme datagrundlag som /profiler) + + EN 16931-/Peppol-/OIOUBL-mønstre. Privat: ingen upload, ingen sporing af indholdet. +

+ + + +