⚠️ OpenSpec-managed issue — this content is automatically synced
from the openspec/ directory. Manual edits will be overwritten on next sync.
Artifacts
Summary
Softwarecatalog's top-level navigation currently exposes Organisations
(Organisaties) and Contacts (Contactpersonen) as first-class
transactional sections backed by two app-local OpenRegister schemas —
organisatie and contactpersoon — in the voorzieningen register. These two
schemas store raw person/organisation identity (names, e-mail, phone,
website, logo, CBS/KvK-style code, job function), which per cross-app contract
#2 is the responsibility of the Nextcloud addressbook
(OCP\Contacts\IManager), not of an app-local party schema.
This change moves person/org identity into Nextcloud Contacts and reduces
softwarecatalog's footprint to only the catalog-specific relationship/role
that genuinely belongs to it: which contact is the maintainer/vendor/registrant
of which software product, in which catalog role, under which participation.
Each relationship record is keyed by contactsUid (a reference into the NC
addressbook) instead of embedding identity. The identity fields (voornaam,
achternaam, e-mailadres, naam, website, logo, telefoonnummer, …)
are owned by the NC Contact; softwarecatalog reads them through the contacts
abstraction, never duplicating them.
The top-level Organisations and Contacts menu entries are removed from
the primary navigation; their identity-listing function is served by the
Nextcloud Contacts app. The remaining catalog-specific relationship records
(organisation participation, contact roles on products) are surfaced in
context on the software product / organisation detail views and grouped
under the existing Settings area where they are administered, not as
top-level identity browsers. All existing routes stay routable for deep
links during the transition.
A fail-safe, idempotent repair step (lib/Repair/MigrateContactsToNc.php)
resolves or creates an NC Contact for every existing organisatie and
contactpersoon object — matching on e-mail (and on CBS/KvK code for
organisations) — writes the resulting contactsUid onto the kept relationship
record, and never deletes the source object until it has been migrated.
Specs
Tasks
Design
See design.md for technical design details.
Synced from openspec/changes/archive/2026-06-15-softwarecatalog-contacts-to-nc by OpenSpec workflow
App: stackiq
Artifacts
Summary
Softwarecatalog's top-level navigation currently exposes Organisations
(
Organisaties) and Contacts (Contactpersonen) as first-classtransactional sections backed by two app-local OpenRegister schemas —
organisatieandcontactpersoon— in thevoorzieningenregister. These twoschemas store raw person/organisation identity (names, e-mail, phone,
website, logo, CBS/KvK-style code, job function), which per cross-app contract
#2 is the responsibility of the Nextcloud addressbook
(
OCP\Contacts\IManager), not of an app-local party schema.This change moves person/org identity into Nextcloud Contacts and reduces
softwarecatalog's footprint to only the catalog-specific relationship/role
that genuinely belongs to it: which contact is the maintainer/vendor/registrant
of which software product, in which catalog role, under which participation.
Each relationship record is keyed by
contactsUid(a reference into the NCaddressbook) instead of embedding identity. The identity fields (
voornaam,achternaam,e-mailadres,naam,website,logo,telefoonnummer, …)are owned by the NC Contact; softwarecatalog reads them through the contacts
abstraction, never duplicating them.
The top-level Organisations and Contacts menu entries are removed from
the primary navigation; their identity-listing function is served by the
Nextcloud Contacts app. The remaining catalog-specific relationship records
(organisation participation, contact roles on products) are surfaced in
context on the software product / organisation detail views and grouped
under the existing Settings area where they are administered, not as
top-level identity browsers. All existing routes stay routable for deep
links during the transition.
A fail-safe, idempotent repair step (
lib/Repair/MigrateContactsToNc.php)resolves or creates an NC Contact for every existing
organisatieandcontactpersoonobject — matching on e-mail (and on CBS/KvK code fororganisations) — writes the resulting
contactsUidonto the kept relationshiprecord, and never deletes the source object until it has been migrated.
Specs
Tasks
OCP\Contacts\IManager) is thepipelinq/lib/Service/ContactSyncService.php(andlib/Settings/softwarecatalogus_register.jsonorganisatie+rollen,Softwarecatalogus/VNG repo is OUT of scope.lib/Service/SoftwareCatalogContactSyncService.phpmodeled onlib/Settings/softwarecatalogus_register.json(or an ADR-037 fragmentcontactpersoon(voornaam,organisatie(naam,beschrijvingKort,menu[]entriesOrganisaties(order 20) andContactpersonenpages[]Organisaties,Contactpersonen,ContactpersoonDetailContactpersonenindexconfig.columnsfrom identity columnslib/Repair/MigrateContactsToNc.php, registered inorganisatie/contactpersoonobjectcontactsUidpresence → re-run is a no-op (idempotent).getAppValue,IManager) per thelib/BackgroundJob/OrganizationContactSyncJob.phpto refreshcd softwarecatalog && openspec validate softwarecatalog-contacts-to-nc --strictpasses (exit 0).Design
See design.md for technical design details.
Synced from
openspec/changes/archive/2026-06-15-softwarecatalog-contacts-to-ncby OpenSpec workflowApp:
stackiq