content(profiler): mapping mod Nemhandelsregistret — alle 38 danske profiler + registerkategorier
Build & Deploy / deploy (push) Successful in 2m5s

Siden viste 12 af de OIOUBL-profiler man faktisk kan vælge i Nemhandelsregistrets
profil-dropdown. Nu er alle med, i registrets egen rækkefølge og under registrets egne
gruppenavne ("Profiler for: ..."), så man kan slå direkte op mellem det man tilmelder sig
og hvilke dokumenttyper der så ligger i pakken.

- EProfile får valgfri `kategori` = registrets gruppeoverskrift; ny `kategorier`-eksport.
- 26 nye danske profiler: hele Catalogue-familien (CatBas/CatSim/CatExt/CatAdv/CatPriUpd
  + R-varianter), PayBas/PayBasR (Statement), OrdSel- og OrdAdv-varianterne,
  Reference-UtilityR, TecRes, NES1/2/7/8 og cenbii bii30 (DespatchAdvice).
- Registerprofilerne OrdRes-1.0 og BilSimReminderOnly-1.0 er med, mærket som "single"
  og henvist til registret — de står ikke i G26 v1.3.
- Dokumentlisterne er rettet til efter G26 v1.3 tabel 1-3: BilSim manglede
  ApplicationResponse (kun ved afvisning), OrdAdv-BilSim manglede OrderResponseSimple.
  "*" markerer nu at ApplicationResponse i ordreprofilerne kun bruges til afvisning.
- UI: registerkategori vises som badge og som egen filterrække (AND med standard-filteret),
  og indgår i fritekstsøgningen.

Claude-Session: https://claude.ai/code/session_018oXJWTRxTYdcV9Kw6M7e5J
This commit is contained in:
Asger Geel Weirsøe
2026-08-07 18:47:00 +02:00
parent 4ff1157978
commit 6c2c7588f8
2 changed files with 436 additions and 96 deletions
+386 -81
View File
@@ -1,7 +1,15 @@
// E-dokumentprofiler (Nemhandel OIOUBL + Peppol BIS/PINT) til /profiler-opslaget.
// Data vedligeholdes her; siden bygger søge-/filter-UI'et af det.
//
// De danske profiler er ordnet som i Nemhandelsregistrets profil-dropdown, og `kategori`
// er registrets egen gruppeoverskrift ("Profiler for: …"). Dokumentlisterne følger
// OIOUBL Profiler-guiden (G26) v1.3, tabel 1-3.
// * = ApplicationResponse bruges her kun til afvisning; det forretningsmæssige svar på en
// ordre er altid OrderResponse/OrderResponseSimple.
export interface EProfile {
standard: string;
/** Nemhandelsregistrets gruppeoverskrift ("Profiler for: …"). Kun danske profiler. */
kategori?: string;
navn: string;
id: string;
customization: string;
@@ -10,45 +18,57 @@ export interface EProfile {
bemaerkninger: string;
}
const NH = 'Nemhandel OIOUBL (UBL 2.1)';
export const profiles: EProfile[] = [
// ── Profiler for: Fakturering ──────────────────────────────────────────────
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
standard: NH,
kategori: 'Fakturering',
navn: 'Procurement-BilSim-1.0 (simpel fakturering)',
id: 'Procurement-BilSim-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Invoice', 'CreditNote', 'Reminder'],
anvendelse: 'Ren fakturering: leverandør sender faktura/kreditnota/rykker til kunde. Ingen ordreproces og intet krævet svar.',
bemaerkninger: 'Mest udbredte rene faktura-pakke i Nemhandel.',
dokumenter: ['Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse (kun ved afvisning)'],
anvendelse: 'Ren fakturering: leverandør sender faktura/kreditnota/rykker til kunde. Ingen ordreproces, og kunden er ikke forpligtet til at kvittere.',
bemaerkninger: 'Obligatorisk profil og den mest udbredte rene faktura-pakke i Nemhandel. Kunden må afvise med ApplicationResponse, men skal ikke kvittere positivt.',
},
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
navn: 'Procurement-BilSimR-1.0 (simpel fakturering m. krævet svar)',
id: 'Procurement-BilSimR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse'],
anvendelse: 'Som BilSim, men kunden skal altid kvittere med et ApplicationResponse (accept/afvisning).',
bemaerkninger: "R = 'Response required' \u2014 kunden skal kvittere.",
},
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
navn: 'urn:www.nesubl.eu:profiles:profile5:ver2.0 (NES5)',
standard: NH,
kategori: 'Fakturering',
navn: 'urn:www.nesubl.eu:profiles:profile5:ver2.0 (NES5, Billing Basic)',
id: 'urn:www.nesubl.eu:profiles:profile5:ver2.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Invoice', 'CreditNote'],
anvendelse: 'Internationalt NES-fakturaprofil: kunde modtager faktura og kreditnota fra leverandør.',
bemaerkninger: 'Ældre/NES-baseret faktureringsprofil.',
bemaerkninger: 'Obligatorisk profil. Den profil der ligger tættest på den gamle OIOXML-faktura — kun afløftede felter er tilladt. Bruges når fakturaafsender teknisk set ikke kan modtage en ApplicationResponse.',
},
// ── Profiler for: Ordre til fakturering ────────────────────────────────────
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
navn: 'Reference-Utility-1.0 (forsyningsspecifikation)',
id: 'Reference-Utility-1.0',
standard: NH,
kategori: 'Ordre til fakturering',
navn: 'Procurement-OrdSim-BilSim-1.0 (simpel ordre + simpel fakturering)',
id: 'Procurement-OrdSim-BilSim-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['UtilityStatement', 'ApplicationResponse'],
anvendelse: 'Forsyningsbranchen (el/vand/varme/gas): leverandør sender detaljeret forbrugs-/forsyningsspecifikation der ledsager fakturaen; kunden kan svare med ApplicationResponse.',
bemaerkninger: 'Bruges som tillæg til BilSim-fakturering.',
dokumenter: ['Order', 'OrderResponseSimple', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse *'],
anvendelse: 'Komplet simpel handel: simpel ordre efterfulgt af simpel fakturering. Dækker bestilling til betaling.',
bemaerkninger: 'Samlepakken de fleste vælger, når de vil kunne både bestille og fakturere. Ingen ordreændring/-annullering — det kræver en OrdAdv-variant.',
},
// ── Profiler for: Simple Ordrer ────────────────────────────────────────────
{
standard: NH,
kategori: 'Simple Ordrer',
navn: 'Procurement-OrdRes-1.0 (kun ordresvar)',
id: 'Procurement-OrdRes-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['OrderResponse'],
anvendelse: 'Enkeltdokument-profil til alene at kunne udveksle en ordrebekræftelse (OrderResponse) uden at tilmelde sig en fuld ordreproces.',
bemaerkninger: 'Registerprofil af typen "single" — findes i Nemhandelsregistret, men er ikke beskrevet i OIOUBL Profiler-guiden (G26) v1.3. Verificér mod registret før brug.',
},
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
standard: NH,
kategori: 'Simple Ordrer',
navn: 'Procurement-OrdSim-1.0 (simpel ordre)',
id: 'Procurement-OrdSim-1.0',
customization: 'OIOUBL-2.x',
@@ -57,68 +77,348 @@ export const profiles: EProfile[] = [
bemaerkninger: 'Ren ordre-only proces; kombineres typisk med en faktureringsprofil.',
},
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
standard: NH,
kategori: 'Simple Ordrer',
navn: 'Procurement-OrdSimR-1.0 (simpel ordre m. krævet svar)',
id: 'Procurement-OrdSimR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponseSimple'],
anvendelse: 'Som OrdSim, men leverandør skal altid sende ordresvar.',
bemaerkninger: 'R = svar påkrævet.',
bemaerkninger: "R = 'Response required' — samme dokumenter som OrdSim, men svaret er obligatorisk.",
},
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
navn: 'Procurement-OrdSim-BilSim-1.0 (ordre + fakturering)',
id: 'Procurement-OrdSim-BilSim-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponseSimple', 'Invoice', 'CreditNote', 'Reminder'],
anvendelse: 'Komplet simpel handel: simpel ordre efterfulgt af simpel fakturering. Dækker bestilling til betaling.',
bemaerkninger: 'Samlepakke: ordre + faktura.',
},
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
navn: 'Procurement-OrdSimR-BilSim-1.0',
id: 'Procurement-OrdSimR-BilSim-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponseSimple', 'Invoice', 'CreditNote', 'Reminder'],
anvendelse: 'Som OrdSim-BilSim, men ordresvar er påkrævet.',
bemaerkninger: 'Ordre + fakturering med påkrævet ordresvar.',
},
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
navn: 'Procurement-OrdSim-BilSimR-1.0',
id: 'Procurement-OrdSim-BilSimR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponseSimple', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse'],
anvendelse: 'Simpel ordre + fakturering hvor faktura-svar (ApplicationResponse) er påkrævet.',
bemaerkninger: 'Kombination af krav på faktura-svar.',
},
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
navn: 'Procurement-OrdSimR-BilSimR-1.0',
id: 'Procurement-OrdSimR-BilSimR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponseSimple', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse'],
anvendelse: 'Simpel ordre og fakturering hvor både ordresvar og faktura-svar er påkrævet.',
bemaerkninger: 'Ordre + fakturering med påkrævet ordre- og faktura-svar.',
},
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
navn: 'Procurement-OrdAdv-BilSim-1.0 (avanceret ordre + fakturering)',
id: 'Procurement-OrdAdv-BilSim-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponse (avanceret/fuld)', 'OrderChange', 'OrderCancellation', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse'],
anvendelse: 'Avanceret ordreproces (med ordreændring/-annullering og fuldt ordresvar) efterfulgt af simpel fakturering.',
bemaerkninger: 'Avanceret variant med fuldt ordresvar.',
},
{
standard: 'Nemhandel OIOUBL (UBL 2.1)',
navn: 'urn:www.nesubl.eu:profiles:profile3:ver2.0 (NES3)',
standard: NH,
kategori: 'Simple Ordrer',
navn: 'urn:www.nesubl.eu:profiles:profile3:ver2.0 (NES3, "Order Only")',
id: 'urn:www.nesubl.eu:profiles:profile3:ver2.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order'],
anvendelse: 'Leverandør modtager ordrer fra kunder (uden ordresvar/fakturering i profilen).',
anvendelse: 'Leverandør modtager ordrer fra kunder. Intet ordresvar og ingen fakturering i profilen.',
bemaerkninger: 'Ældre NES-ordreprofil; OrdSim-varianterne anbefales i stedet.',
},
// ── Profiler for: Katalog ──────────────────────────────────────────────────
{
standard: NH,
kategori: 'Katalog',
navn: 'Catalogue-CatBas-1.0 (basalt katalog)',
id: 'Catalogue-CatBas-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Catalogue', 'CatalogueDeletion', 'ApplicationResponse'],
anvendelse: 'Leverandør sender et produktkatalog til kunden og kan slette det igen. Kunden kan afvise med ApplicationResponse.',
bemaerkninger: 'Simpleste katalogprofil — ingen prisopdatering, ingen katalogforespørgsel.',
},
{
standard: NH,
kategori: 'Katalog',
navn: 'Catalogue-CatPriUpd-1.0 (kun prisopdatering)',
id: 'Catalogue-CatPriUpd-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['CataloguePricingUpdate', 'ApplicationResponse'],
anvendelse: 'Leverandør opdaterer alene priserne i et allerede udvekslet katalog.',
bemaerkninger: '"Catalogue Pricing Update Only" — forudsætter at kataloget er sendt via en anden katalogprofil.',
},
{
standard: NH,
kategori: 'Katalog',
navn: 'Catalogue-CatPriUpdR-1.0 (kun prisopdatering m. krævet svar)',
id: 'Catalogue-CatPriUpdR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['CataloguePricingUpdate', 'ApplicationResponse'],
anvendelse: 'Som CatPriUpd, men kunden skal kvittere for prisopdateringen.',
bemaerkninger: 'R = svar påkrævet.',
},
{
standard: NH,
kategori: 'Katalog',
navn: 'Catalogue-CatSim-1.0 (katalogforespørgsel + katalog)',
id: 'Catalogue-CatSim-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['CatalogueRequest', 'Catalogue', 'CatalogueDeletion', 'ApplicationResponse'],
anvendelse: 'Kunden beder om et katalog (CatalogueRequest), leverandøren sender det og kan slette det igen.',
bemaerkninger: 'CatBas udvidet med katalogforespørgsel fra kunden.',
},
// ── Profiler for: Udvidet fakturering ──────────────────────────────────────
{
standard: NH,
kategori: 'Udvidet fakturering',
navn: 'Procurement-BilSimR-1.0 (simpel fakturering m. krævet svar)',
id: 'Procurement-BilSimR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse'],
anvendelse: 'Som BilSim, men kunden skal altid kvittere med et ApplicationResponse (accept/afvisning).',
bemaerkninger: "R = 'Response required' — kunden skal kvittere. Bemærk: tilmelding til BilSimR giver ikke automatisk BilSim; begge skal registreres hver for sig.",
},
{
standard: NH,
kategori: 'Udvidet fakturering',
navn: 'Procurement-BilSimReminderOnly-1.0 (kun rykker)',
id: 'Procurement-BilSimReminderOnly-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Reminder'],
anvendelse: 'Enkeltdokument-profil til alene at kunne modtage rykkere.',
bemaerkninger: 'Registerprofil af typen "single" — ikke i OIOUBL Profiler-guiden (G26) v1.3. Praktisk fordi Reminder ikke findes i Peppol BIS Billing og derfor kun kan sendes i OIOUBL-profilerne.',
},
{
standard: NH,
kategori: 'Udvidet fakturering',
navn: 'Procurement-PayBas-1.0 (kontoudtog)',
id: 'Procurement-PayBas-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Statement', 'ApplicationResponse'],
anvendelse: 'Leverandør sender kontoudtog (Statement) til kunden — en samlet oversigt over udestående poster, ikke en faktura.',
bemaerkninger: 'G26 kalder profilen direkte "Statement". Trods "Pay"-navnet er der ingen betalingsdokumenter i profilen.',
},
{
standard: NH,
kategori: 'Udvidet fakturering',
navn: 'Procurement-PayBasR-1.0 (kontoudtog m. krævet svar)',
id: 'Procurement-PayBasR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Statement', 'ApplicationResponse'],
anvendelse: 'Som PayBas, men kunden skal kvittere for kontoudtoget.',
bemaerkninger: 'R = svar påkrævet.',
},
{
standard: NH,
kategori: 'Udvidet fakturering',
navn: 'urn:www.nesubl.eu:profiles:profile8:ver2.0 (NES8)',
id: 'urn:www.nesubl.eu:profiles:profile8:ver2.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Invoice', 'CreditNote', 'ApplicationResponse'],
anvendelse: 'NES-faktureringsprofil med kvittering: faktura og kreditnota, hvor kunden kan svare med ApplicationResponse.',
bemaerkninger: 'NES5 udvidet med ApplicationResponse. Ingen Reminder.',
},
// ── Profiler for: Udvidet katalog ──────────────────────────────────────────
{
standard: NH,
kategori: 'Udvidet katalog',
navn: 'Catalogue-CatAdv-1.0 (avanceret katalog)',
id: 'Catalogue-CatAdv-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['CatalogueRequest', 'Catalogue', 'CatalogueItemSpecificationUpdate', 'CataloguePricingUpdate', 'CatalogueDeletion', 'ApplicationResponse'],
anvendelse: 'Fuld katalogproces: forespørgsel, katalog, opdatering af både varebeskrivelser og priser samt sletning.',
bemaerkninger: 'Den mest komplette katalogprofil — CatExt plus katalogforespørgsel.',
},
{
standard: NH,
kategori: 'Udvidet katalog',
navn: 'Catalogue-CatAdvR-1.0 (avanceret katalog m. krævet svar)',
id: 'Catalogue-CatAdvR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['CatalogueRequest', 'Catalogue', 'CatalogueItemSpecificationUpdate', 'CataloguePricingUpdate', 'CatalogueDeletion', 'ApplicationResponse'],
anvendelse: 'Som CatAdv, men modtageren skal kvittere for katalogdokumenterne.',
bemaerkninger: 'R = svar påkrævet.',
},
{
standard: NH,
kategori: 'Udvidet katalog',
navn: 'Catalogue-CatBasR-1.0 (basalt katalog m. krævet svar)',
id: 'Catalogue-CatBasR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Catalogue', 'CatalogueDeletion', 'ApplicationResponse'],
anvendelse: 'Som CatBas, men kunden skal kvittere for kataloget.',
bemaerkninger: 'R = svar påkrævet.',
},
{
standard: NH,
kategori: 'Udvidet katalog',
navn: 'Catalogue-CatExt-1.0 (udvidet katalog + opdatering)',
id: 'Catalogue-CatExt-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Catalogue', 'CatalogueItemSpecificationUpdate', 'CataloguePricingUpdate', 'CatalogueDeletion', 'ApplicationResponse'],
anvendelse: 'Katalogudveksling med efterfølgende opdatering af varebeskrivelser og priser samt sletning. Ingen katalogforespørgsel.',
bemaerkninger: 'CatBas udvidet med opdateringsdokumenter.',
},
{
standard: NH,
kategori: 'Udvidet katalog',
navn: 'Catalogue-CatExtR-1.0 (udvidet katalog + opdatering m. krævet svar)',
id: 'Catalogue-CatExtR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Catalogue', 'CatalogueItemSpecificationUpdate', 'CataloguePricingUpdate', 'CatalogueDeletion', 'ApplicationResponse'],
anvendelse: 'Som CatExt, men kunden skal kvittere.',
bemaerkninger: 'R = svar påkrævet.',
},
{
standard: NH,
kategori: 'Udvidet katalog',
navn: 'Catalogue-CatSimR-1.0 (katalogforespørgsel + katalog m. krævet svar)',
id: 'Catalogue-CatSimR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['CatalogueRequest', 'Catalogue', 'CatalogueDeletion', 'ApplicationResponse'],
anvendelse: 'Som CatSim, men katalogsvar er påkrævet.',
bemaerkninger: 'R = svar påkrævet.',
},
{
standard: NH,
kategori: 'Udvidet katalog',
navn: 'urn:www.nesubl.eu:profiles:profile1:ver2.0 (NES1, "Catalogue Only")',
id: 'urn:www.nesubl.eu:profiles:profile1:ver2.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Catalogue', 'ApplicationResponse'],
anvendelse: 'Ren katalogudsendelse: leverandør sender katalog, kunden kan afvise.',
bemaerkninger: 'Ældre NES-katalogprofil; Catalogue-CatBas-1.0 anbefales i stedet.',
},
{
standard: NH,
kategori: 'Udvidet katalog',
navn: 'urn:www.nesubl.eu:profiles:profile2:ver2.0 (NES2, simpel katalogproces)',
id: 'urn:www.nesubl.eu:profiles:profile2:ver2.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Catalogue', 'CatalogueItemSpecificationUpdate', 'CataloguePricingUpdate'],
anvendelse: 'Katalog med efterfølgende opdatering af varebeskrivelser og priser. Ingen kvittering i profilen.',
bemaerkninger: 'Ældre NES-katalogprofil; Catalogue-CatExt-1.0 anbefales i stedet.',
},
// ── Profiler for: Udvidet ordre til fakturering ────────────────────────────
{
standard: NH,
kategori: 'Udvidet ordre til fakturering',
navn: 'Procurement-OrdAdv-BilSim-1.0 (avanceret ordre + simpel fakturering)',
id: 'Procurement-OrdAdv-BilSim-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponse', 'OrderResponseSimple', 'OrderChange', 'OrderCancellation', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse *'],
anvendelse: 'Avanceret ordreproces (fuldt ordresvar samt ordreændring og -annullering) efterfulgt af simpel fakturering.',
bemaerkninger: 'Understøtter begge parter både OrdSim-BilSim og OrdAdv-BilSim, skal OrdAdv-BilSim bruges.',
},
{
standard: NH,
kategori: 'Udvidet ordre til fakturering',
navn: 'Procurement-OrdAdv-BilSimR-1.0 (avanceret ordre + fakturering m. krævet fakturasvar)',
id: 'Procurement-OrdAdv-BilSimR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponse', 'OrderResponseSimple', 'OrderChange', 'OrderCancellation', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse *'],
anvendelse: 'Som OrdAdv-BilSim, men fakturasvar (ApplicationResponse) er påkrævet.',
bemaerkninger: 'R sidder på fakturadelen — ordresvaret er stadig valgfrit.',
},
{
standard: NH,
kategori: 'Udvidet ordre til fakturering',
navn: 'Procurement-OrdAdvR-BilSim-1.0 (avanceret ordre m. krævet ordresvar + simpel fakturering)',
id: 'Procurement-OrdAdvR-BilSim-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponse', 'OrderResponseSimple', 'OrderChange', 'OrderCancellation', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse *'],
anvendelse: 'Som OrdAdv-BilSim, men ordresvar er påkrævet.',
bemaerkninger: 'R sidder på ordredelen — fakturasvaret er valgfrit.',
},
{
standard: NH,
kategori: 'Udvidet ordre til fakturering',
navn: 'Procurement-OrdAdvR-BilSimR-1.0 (avanceret ordre + fakturering, begge svar krævet)',
id: 'Procurement-OrdAdvR-BilSimR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponse', 'OrderResponseSimple', 'OrderChange', 'OrderCancellation', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse *'],
anvendelse: 'Avanceret ordre og fakturering hvor både ordresvar og fakturasvar er påkrævet.',
bemaerkninger: 'Strammeste variant af ordre-til-faktura-kæden.',
},
{
standard: NH,
kategori: 'Udvidet ordre til fakturering',
navn: 'Procurement-OrdSel-BilSim-1.0 (sælgerinitieret ordre + simpel fakturering)',
id: 'Procurement-OrdSel-BilSim-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['OrderResponse', 'OrderResponseSimple', 'OrderChange', 'OrderCancellation', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse *'],
anvendelse: 'Sælgerinitieret handel: leverandøren starter med en ordrebekræftelse (fx efter aftale i marken eller telefonisk), kunden kan ændre eller annullere, og der faktureres bagefter.',
bemaerkninger: 'Bemærk: ingen Order i profilen — "Sel" = seller initiated, så processen starter med OrderResponse.',
},
{
standard: NH,
kategori: 'Udvidet ordre til fakturering',
navn: 'Procurement-OrdSel-BilSimR-1.0 (sælgerinitieret ordre + fakturering m. krævet svar)',
id: 'Procurement-OrdSel-BilSimR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['OrderResponse', 'OrderResponseSimple', 'OrderChange', 'OrderCancellation', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse *'],
anvendelse: 'Som OrdSel-BilSim, men fakturasvar er påkrævet.',
bemaerkninger: 'Ingen Order i profilen — processen starter hos sælger.',
},
{
standard: NH,
kategori: 'Udvidet ordre til fakturering',
navn: 'Procurement-OrdSim-BilSimR-1.0 (simpel ordre + fakturering m. krævet fakturasvar)',
id: 'Procurement-OrdSim-BilSimR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponseSimple', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse *'],
anvendelse: 'Simpel ordre + fakturering hvor fakturasvar (ApplicationResponse) er påkrævet.',
bemaerkninger: 'R sidder på fakturadelen.',
},
{
standard: NH,
kategori: 'Udvidet ordre til fakturering',
navn: 'Procurement-OrdSimR-BilSim-1.0 (simpel ordre m. krævet ordresvar + fakturering)',
id: 'Procurement-OrdSimR-BilSim-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponseSimple', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse *'],
anvendelse: 'Som OrdSim-BilSim, men ordresvar er påkrævet.',
bemaerkninger: 'R sidder på ordredelen.',
},
{
standard: NH,
kategori: 'Udvidet ordre til fakturering',
navn: 'Procurement-OrdSimR-BilSimR-1.0 (simpel ordre + fakturering, begge svar krævet)',
id: 'Procurement-OrdSimR-BilSimR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponseSimple', 'Invoice', 'CreditNote', 'Reminder', 'ApplicationResponse *'],
anvendelse: 'Simpel ordre og fakturering hvor både ordresvar og fakturasvar er påkrævet.',
bemaerkninger: 'Begge R’er sat — modparten skal kvittere i begge led.',
},
{
standard: NH,
kategori: 'Udvidet ordre til fakturering',
navn: 'urn:www.nesubl.eu:profiles:profile7:ver2.0 (NES7, ordre til faktura)',
id: 'urn:www.nesubl.eu:profiles:profile7:ver2.0',
customization: 'OIOUBL-2.x',
dokumenter: ['Order', 'OrderResponseSimple', 'Invoice', 'CreditNote', 'ApplicationResponse *'],
anvendelse: 'NES-profil for simpel ordre efterfulgt af simpel fakturering.',
bemaerkninger: 'Ældre NES-pendant til OrdSim-BilSim. Ingen Reminder i profilen.',
},
// ── Profiler for: ForsyningsSpecifikation ──────────────────────────────────
{
standard: NH,
kategori: 'ForsyningsSpecifikation',
navn: 'Reference-Utility-1.0 (forsyningsspecifikation, UTS)',
id: 'Reference-Utility-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['UtilityStatement', 'ApplicationResponse'],
anvendelse: 'Forsyningsbranchen (el/vand/varme/gas): leverandør sender detaljeret forbrugs-/forsyningsspecifikation der ledsager fakturaen; kunden kan svare med ApplicationResponse.',
bemaerkninger: 'Bruges som tillæg til en faktureringsprofil — UTS erstatter ikke fakturaen.',
},
{
standard: NH,
kategori: 'ForsyningsSpecifikation',
navn: 'Reference-UtilityR-1.0 (forsyningsspecifikation m. krævet svar)',
id: 'Reference-UtilityR-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['UtilityStatement', 'ApplicationResponse'],
anvendelse: 'Som Reference-Utility, men kunden skal kvittere for forsyningsspecifikationen.',
bemaerkninger: 'R = svar påkrævet.',
},
// ── Profiler for: Diverse ──────────────────────────────────────────────────
{
standard: NH,
kategori: 'Diverse',
navn: 'Procurement-TecRes-1.0 (kvittering på modtaget dokument)',
id: 'Procurement-TecRes-1.0',
customization: 'OIOUBL-2.x',
dokumenter: ['ApplicationResponse'],
anvendelse: 'Ren kvitteringsprofil: bruges til at svare på et modtaget dokument, typisk når afsendelsen ikke kan behandles pga. tekniske fejl eller en ikke-understøttet profil.',
bemaerkninger: 'Bruges som ProfileID på selve ApplicationResponse’en, ikke som en forretningsproces man handler i.',
},
{
standard: NH,
navn: 'urn:www.cenbii.eu:profile:bii30:ver2.0 (forsendelsesadvis / despatch advice)',
id: 'urn:www.cenbii.eu:profile:bii30:ver2.0',
customization: 'OIOUBL-2.x',
dokumenter: ['DespatchAdvice'],
anvendelse: 'Leverandør varsler en forsendelse, så kunden kan forberede modtagelse og afstemme leveringen mod ordren.',
bemaerkninger: 'CEN BII-profil optaget i OIOUBL (G26 afsnit 3.3.15). Ikke placeret i en registerkategori her — bekræft gruppen i Nemhandelsregistrets dropdown før brug.',
},
// ── Peppol BIS 3.0 ─────────────────────────────────────────────────────────
{
standard: 'Peppol BIS 3.0',
navn: 'Peppol BIS Billing 3.0',
@@ -126,7 +426,7 @@ export const profiles: EProfile[] = [
customization: 'urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0',
dokumenter: ['Invoice', 'CreditNote'],
anvendelse: 'Den centrale e-faktura/kreditnota-pakke i Peppol. CIUS af EN 16931. Bruges til EU-grænsehandel og DK/Peppol-fakturering.',
bemaerkninger: 'Langt den mest brugte BIS3-profil. Invoice Response er en separat profil.',
bemaerkninger: 'Langt den mest brugte BIS3-profil. Invoice Response er en separat profil. Bemærk: Reminder findes ikke i Peppol — brug OIOUBL-profilerne til rykkere.',
},
{
standard: 'Peppol BIS 3.0',
@@ -144,7 +444,7 @@ export const profiles: EProfile[] = [
customization: 'urn:fdc:peppol.eu:poacc:trns:invoice_response:3',
dokumenter: ['ApplicationResponse (Invoice Response)'],
anvendelse: 'Køber sender struktureret status/svar på en modtaget faktura (accepteret, afvist, under behandling, betalt).',
bemaerkninger: 'Bruges sammen med Billing til at lukke faktura-livscyklussen.',
bemaerkninger: 'Bruges sammen med Billing til at lukke faktura-livscyklussen. Peppol-pendant til OIOUBL-ernes "R"-profiler.',
},
{
standard: 'Peppol BIS 3.0',
@@ -153,7 +453,7 @@ export const profiles: EProfile[] = [
customization: 'urn:fdc:peppol.eu:poacc:trns:mlr:3',
dokumenter: ['ApplicationResponse (Message Level Response)'],
anvendelse: 'Teknisk kvittering på beskedniveau: bekræfter modtagelse/validering af et hvilket som helst dokument.',
bemaerkninger: 'Transport-/syntaks-niveau svar, ikke forretningsmæssigt indhold.',
bemaerkninger: 'Transport-/syntaks-niveau svar, ikke forretningsmæssigt indhold. Peppol-pendant til Procurement-TecRes-1.0.',
},
{
standard: 'Peppol BIS 3.0',
@@ -161,8 +461,8 @@ export const profiles: EProfile[] = [
id: 'urn:fdc:peppol.eu:poacc:bis:ordering:3',
customization: 'urn:fdc:peppol.eu:poacc:trns:order:3 / urn:fdc:peppol.eu:poacc:trns:order_response:3',
dokumenter: ['Order', 'Order Response'],
anvendelse: 'Fuld ordreproces: køber sender ordre, sælger svarer med ordrebekraeftelse/-svar.',
bemaerkninger: 'Order = Trdm01, Order Response = Trdm76.',
anvendelse: 'Fuld ordreproces: køber sender ordre, sælger svarer med ordrebekræftelse/-svar.',
bemaerkninger: 'Order = Trdm01, Order Response = Trdm76. Peppol-pendant til Procurement-OrdSim-1.0.',
},
{
standard: 'Peppol BIS 3.0',
@@ -171,7 +471,7 @@ export const profiles: EProfile[] = [
customization: 'urn:fdc:peppol.eu:poacc:trns:order:3',
dokumenter: ['Order'],
anvendelse: 'Kun afsendelse af ordre uden forventet struktureret ordresvar.',
bemaerkninger: 'Enkel ordre-only proces.',
bemaerkninger: 'Enkel ordre-only proces. Peppol-pendant til NES3 ("Order Only").',
},
{
standard: 'Peppol BIS 3.0',
@@ -189,7 +489,7 @@ export const profiles: EProfile[] = [
customization: 'urn:fdc:peppol.eu:poacc:trns:catalogue:3',
dokumenter: ['Catalogue', 'ApplicationResponse (Catalogue Response)'],
anvendelse: 'Sælger sender produktkatalog (priser/varer) til køber, der kan svare med accept/afvisning.',
bemaerkninger: 'Grundlag for efterfølgende ordrer.',
bemaerkninger: 'Grundlag for efterfølgende ordrer. Peppol-pendant til Catalogue-CatBasR-1.0.',
},
{
standard: 'Peppol BIS 3.0',
@@ -216,8 +516,10 @@ export const profiles: EProfile[] = [
customization: 'urn:fdc:peppol.eu:poacc:trns:despatch_advice:3',
dokumenter: ['Despatch Advice (følgeseddel)'],
anvendelse: 'Sælger sender forsendelses-/leveringsmeddelelse (hvad er afsendt, hvornår, hvordan) inden faktura.',
bemaerkninger: 'Logistik-dokument mellem ordre og faktura.',
bemaerkninger: 'Logistik-dokument mellem ordre og faktura. Peppol-pendant til urn:www.cenbii.eu:profile:bii30:ver2.0 i OIOUBL.',
},
// ── Peppol BIS 4.0 / PINT ──────────────────────────────────────────────────
{
standard: 'Peppol BIS 4.0 / PINT',
navn: 'EU PINT Billing (v1.0.1; forløber for BIS Billing 4.0)',
@@ -239,3 +541,6 @@ export const profiles: EProfile[] = [
];
export const standarder = [...new Set(profiles.map((p) => p.standard))];
/** Nemhandelsregistrets kategorier i registrets egen rækkefølge. */
export const kategorier = [...new Set(profiles.map((p) => p.kategori).filter((k): k is string => Boolean(k)))];
+50 -15
View File
@@ -1,13 +1,18 @@
---
import Base from '../layouts/Base.astro';
import { profiles, standarder } from '../data/profiles';
import { profiles, standarder, kategorier } from '../data/profiles';
const searchString = (p: (typeof profiles)[number]) =>
[p.standard, p.navn, p.id, p.customization, p.dokumenter.join(' '), p.anvendelse, p.bemaerkninger]
[p.standard, p.kategori ?? '', p.navn, p.id, p.customization, p.dokumenter.join(' '), p.anvendelse, p.bemaerkninger]
.join(' ')
.toLowerCase();
// Registerprofilerne af "single"-typen står ikke i G26 — dem henviser vi til registret for.
const kunIRegistret = new Set(['Procurement-OrdRes-1.0', 'Procurement-BilSimReminderOnly-1.0']);
const kilde = (p: (typeof profiles)[number]) => {
if (kunIRegistret.has(p.id))
return { label: 'Nemhandelsregistret', url: 'https://nemhandel.dk/nemhandelsregisteret' };
if (p.standard.startsWith('Nemhandel'))
return { label: 'OIOUBL Profiler (G26)', url: 'https://oioubl21.oioubl.dk/documents/en/en/Guidelines/OIOUBL_GUIDE_PROFILES.pdf' };
if (p.standard.includes('PINT'))
@@ -31,6 +36,11 @@ const kilde = (p: (typeof profiles)[number]) => {
<strong class="text-text">Peppol BIS/PINT</strong> — profil-/proces-id, customization-id, hvilke
dokumenter profilen indeholder og typisk anvendelse. Klik på et id for at kopiere det.
</p>
<p class="mt-3 max-w-2xl text-sm text-muted">
De danske profiler står i samme rækkefølge og under samme gruppenavne som i
<strong class="text-text">Nemhandelsregistrets</strong> profil-dropdown (“Profiler for: …”), så du kan
slå direkte op mellem registrering og dokumentindhold.
</p>
<div class="mt-8 flex flex-col gap-4 sm:flex-row sm:items-center">
<div class="relative flex-1">
@@ -52,12 +62,21 @@ const kilde = (p: (typeof profiles)[number]) => {
{standarder.map((s) => <button type="button" class="p-chip" data-std={s} aria-pressed="false">{s}</button>)}
</div>
<div class="mt-3">
<span class="mr-2 text-xs text-muted">Nemhandelsregistrets kategori:</span>
<span class="mt-1 inline-flex flex-wrap gap-2 align-middle">
<button type="button" class="p-chip" data-kat="" aria-pressed="true">Alle</button>
{kategorier.map((k) => <button type="button" class="p-chip" data-kat={k} aria-pressed="false">{k}</button>)}
</span>
</div>
<div class="mt-6 space-y-3">
{
profiles.map((p) => { const k = kilde(p); return (
<article
data-profile
data-standard={p.standard}
data-kategori={p.kategori ?? ''}
data-search={searchString(p)}
class="rounded-2xl border border-border bg-surface/60 p-5 transition-colors hover:border-accent/50"
>
@@ -65,6 +84,14 @@ const kilde = (p: (typeof profiles)[number]) => {
<span class="rounded-full border border-accent/40 bg-accent/10 px-2.5 py-0.5 text-xs font-medium text-accent">
{p.standard}
</span>
{p.kategori && (
<span
class="rounded-full border border-border bg-surface-2 px-2.5 py-0.5 text-xs text-muted"
title="Gruppen profilen står under i Nemhandelsregistrets dropdown"
>
Register: {p.kategori}
</span>
)}
</div>
<h2 class="mt-2 text-lg font-semibold tracking-tight">{p.navn}</h2>
@@ -90,7 +117,7 @@ const kilde = (p: (typeof profiles)[number]) => {
</div>
<p class="mt-3 text-sm text-muted">{p.anvendelse}</p>
<p class="mt-2 text-xs text-muted/80">
<p class="mt-2 text-xs text-muted">
<span class="font-semibold text-muted">Bemærk:</span> {p.bemaerkninger}
</p>
<p class="mt-3 text-xs"><a href={k.url} target="_blank" rel="noopener" class="text-accent/80 transition-colors hover:text-accent">Kilde: {k.label} ↗</a></p>
@@ -101,9 +128,11 @@ const kilde = (p: (typeof profiles)[number]) => {
<p id="p-none" class="mt-6 text-sm text-muted" hidden>Ingen profiler matcher.</p>
<p class="mt-10 text-xs text-muted/80">
Kilder: OIOUBL Profiler-guiden (G26) og Peppol BIS/PINT (docs.peppol.eu). Øjebliksbillede —
verificér altid id'er mod den officielle dokumentation før brug.
<p class="mt-10 text-xs text-muted">
Kilder: OIOUBL Profiler-guiden (G26) v1.3 (dokumentlister, tabel 1-3), Nemhandelsregistret
(gruppering og profilnavne) og Peppol BIS/PINT (docs.peppol.eu). * = ApplicationResponse bruges kun
til afvisning; det forretningsmæssige svar på en ordre er altid OrderResponse/OrderResponseSimple.
Øjebliksbillede — verificér altid id'er mod den officielle dokumentation før brug.
</p>
<style is:inline>
@@ -131,16 +160,18 @@ const kilde = (p: (typeof profiles)[number]) => {
(function () {
var cards = [].slice.call(document.querySelectorAll('[data-profile]'));
var search = document.getElementById('p-search');
var chips = [].slice.call(document.querySelectorAll('.p-chip'));
var stdChips = [].slice.call(document.querySelectorAll('.p-chip[data-std]'));
var katChips = [].slice.call(document.querySelectorAll('.p-chip[data-kat]'));
var count = document.getElementById('p-count');
var none = document.getElementById('p-none');
var q = '', std = '';
var q = '', std = '', kat = '';
function apply() {
var shown = 0;
cards.forEach(function (c) {
var okS = !std || c.getAttribute('data-standard') === std;
var okK = !kat || c.getAttribute('data-kategori') === kat;
var okQ = !q || c.getAttribute('data-search').indexOf(q) > -1;
var hit = okS && okQ;
var hit = okS && okK && okQ;
c.hidden = !hit;
if (hit) shown++;
});
@@ -148,13 +179,17 @@ const kilde = (p: (typeof profiles)[number]) => {
none.hidden = shown > 0;
}
search.addEventListener('input', function () { q = search.value.trim().toLowerCase(); apply(); });
chips.forEach(function (b) {
b.addEventListener('click', function () {
std = b.getAttribute('data-std') || '';
chips.forEach(function (x) { x.setAttribute('aria-pressed', x === b ? 'true' : 'false'); });
apply();
function wire(group, attr, set) {
group.forEach(function (b) {
b.addEventListener('click', function () {
set(b.getAttribute(attr) || '');
group.forEach(function (x) { x.setAttribute('aria-pressed', x === b ? 'true' : 'false'); });
apply();
});
});
});
}
wire(stdChips, 'data-std', function (v) { std = v; });
wire(katChips, 'data-kat', function (v) { kat = v; });
document.addEventListener('click', function (e) {
var btn = e.target.closest && e.target.closest('[data-copy]');
if (!btn || !navigator.clipboard) return;