Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions docs/features/maintenance-and-roadmap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<!--
- SPDX-FileCopyrightText: 2026 Conduction B.V. <info@conduction.nl>
- SPDX-License-Identifier: EUPL-1.2
-->

# Maintenance and roadmap

Suppliers announce planned maintenance on their applications and publish where each application is heading. Organisations that use an application see the maintenance on their dashboard and on the application's page, and read the roadmap before they plan an upgrade.

Specification: [`openspec/specs/maintenance-and-supplier-roadmap/spec.md`](https://github.com/ConductionNL/stackiq/blob/development/openspec/specs/maintenance-and-supplier-roadmap/spec.md).

## Announcing maintenance

Open your application's page under **Applications** and click **Announce maintenance** in the **Planned maintenance** section. Fill in:

- **Title** and **Description**: what happens and what users should do.
- **Version**: only when the maintenance concerns one version.
- **Starts at** and **Ends at**.
- **Impact**: No impact, Degraded or Unavailable.

A new window starts as Planned. From its page you move it to In progress, Completed or Cancelled.

## Who is told

When you announce a window, stackiq looks up every organisation that uses the application and the business owner and technical owner of each usage. Those owners get a Nextcloud notification, and a reminder the day before the window starts while it is still planned. Owners are set on the usage, under **Applications in use**; a usage without owners still shows the window on its organisation's dashboard.

## Following maintenance

The dashboard lists **Planned maintenance** on the applications your organisation uses in the next 30 days, with the time window and the impact. Each application's page lists all its planned maintenance.

## The roadmap

A supplier writes the direction of an application in the **Roadmap** field of the application. The application's page shows it with the application's versions on a timeline, the planned versions first. A version is placed on its go-live date, or on the date development started when it has no go-live date yet.

Under **Module versions**, the **Planned releases** tab lists the versions still in development, with the date development started. A supplier releases a planned version from its page with **Release**.
42 changes: 41 additions & 1 deletion l10n/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -828,7 +828,47 @@ OC.L10N.register(
"Add to our landscape": "Add to our landscape",
"Connections and services": "Connections and services",
"The applications your organisation uses, with the version it runs, where it stands and who owns it.": "The applications your organisation uses, with the version it runs, where it stands and who owns it.",
"No applications in use recorded for this organisation yet": "No applications in use recorded for this organisation yet"
"No applications in use recorded for this organisation yet": "No applications in use recorded for this organisation yet",
"Maintenance window": "Maintenance window",
"Maintenance a supplier plans on one of its products, with the time window and the expected impact.": "Maintenance a supplier plans on one of its products, with the time window and the expected impact.",
"The product the maintenance is on.": "The product the maintenance is on.",
"The version the maintenance is on, when it concerns one version.": "The version the maintenance is on, when it concerns one version.",
"What the maintenance is, in a few words.": "What the maintenance is, in a few words.",
"What changes and what users should do.": "What changes and what users should do.",
"Starts at": "Starts at",
"When the maintenance starts.": "When the maintenance starts.",
"Ends at": "Ends at",
"When the maintenance ends.": "When the maintenance ends.",
"Impact": "Impact",
"What users notice while the maintenance runs.": "What users notice while the maintenance runs.",
"Where the maintenance stands.": "Where the maintenance stands.",
"Owners to notify": "Owners to notify",
"The Nextcloud users who own a usage of the product, resolved when the maintenance is announced.": "The Nextcloud users who own a usage of the product, resolved when the maintenance is announced.",
"Owners resolved at": "Owners resolved at",
"When the owners to notify were resolved.": "When the owners to notify were resolved.",
"No impact": "No impact",
"Degraded": "Degraded",
"Unavailable": "Unavailable",
"In progress": "In progress",
"Completed": "Completed",
"Cancelled": "Cancelled",
"Start the maintenance.": "Start the maintenance.",
"Complete the maintenance.": "Complete the maintenance.",
"Cancel the maintenance.": "Cancel the maintenance.",
"Roadmap": "Roadmap",
"The direction the supplier takes with this application: what the next versions bring and when.": "The direction the supplier takes with this application: what the next versions bring and when.",
"Planned maintenance": "Planned maintenance",
"Announce maintenance": "Announce maintenance",
"No maintenance planned on this application": "No maintenance planned on this application",
"Planned releases": "Planned releases",
"Loading planned maintenance": "Loading planned maintenance",
"The planned maintenance could not be loaded.": "The planned maintenance could not be loaded.",
"No maintenance planned on the applications you use in the next 30 days": "No maintenance planned on the applications you use in the next 30 days",
"{start} to {end}": "{start} to {end}",
"Loading the roadmap": "Loading the roadmap",
"The roadmap could not be loaded.": "The roadmap could not be loaded.",
"The supplier has not published a roadmap for this application": "The supplier has not published a roadmap for this application",
"No versions with a date yet": "No versions with a date yet"
},
"nplurals=2; plural=(n != 1);"
)
42 changes: 41 additions & 1 deletion l10n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -827,6 +827,46 @@
"Add to our landscape": "Add to our landscape",
"Connections and services": "Connections and services",
"The applications your organisation uses, with the version it runs, where it stands and who owns it.": "The applications your organisation uses, with the version it runs, where it stands and who owns it.",
"No applications in use recorded for this organisation yet": "No applications in use recorded for this organisation yet"
"No applications in use recorded for this organisation yet": "No applications in use recorded for this organisation yet",
"Maintenance window": "Maintenance window",
"Maintenance a supplier plans on one of its products, with the time window and the expected impact.": "Maintenance a supplier plans on one of its products, with the time window and the expected impact.",
"The product the maintenance is on.": "The product the maintenance is on.",
"The version the maintenance is on, when it concerns one version.": "The version the maintenance is on, when it concerns one version.",
"What the maintenance is, in a few words.": "What the maintenance is, in a few words.",
"What changes and what users should do.": "What changes and what users should do.",
"Starts at": "Starts at",
"When the maintenance starts.": "When the maintenance starts.",
"Ends at": "Ends at",
"When the maintenance ends.": "When the maintenance ends.",
"Impact": "Impact",
"What users notice while the maintenance runs.": "What users notice while the maintenance runs.",
"Where the maintenance stands.": "Where the maintenance stands.",
"Owners to notify": "Owners to notify",
"The Nextcloud users who own a usage of the product, resolved when the maintenance is announced.": "The Nextcloud users who own a usage of the product, resolved when the maintenance is announced.",
"Owners resolved at": "Owners resolved at",
"When the owners to notify were resolved.": "When the owners to notify were resolved.",
"No impact": "No impact",
"Degraded": "Degraded",
"Unavailable": "Unavailable",
"In progress": "In progress",
"Completed": "Completed",
"Cancelled": "Cancelled",
"Start the maintenance.": "Start the maintenance.",
"Complete the maintenance.": "Complete the maintenance.",
"Cancel the maintenance.": "Cancel the maintenance.",
"Roadmap": "Roadmap",
"The direction the supplier takes with this application: what the next versions bring and when.": "The direction the supplier takes with this application: what the next versions bring and when.",
"Planned maintenance": "Planned maintenance",
"Announce maintenance": "Announce maintenance",
"No maintenance planned on this application": "No maintenance planned on this application",
"Planned releases": "Planned releases",
"Loading planned maintenance": "Loading planned maintenance",
"The planned maintenance could not be loaded.": "The planned maintenance could not be loaded.",
"No maintenance planned on the applications you use in the next 30 days": "No maintenance planned on the applications you use in the next 30 days",
"{start} to {end}": "{start} to {end}",
"Loading the roadmap": "Loading the roadmap",
"The roadmap could not be loaded.": "The roadmap could not be loaded.",
"The supplier has not published a roadmap for this application": "The supplier has not published a roadmap for this application",
"No versions with a date yet": "No versions with a date yet"
}
}
42 changes: 41 additions & 1 deletion l10n/nl.js
Original file line number Diff line number Diff line change
Expand Up @@ -898,7 +898,47 @@ OC.L10N.register(
"Add to our landscape": "Toevoegen aan ons landschap",
"Connections and services": "Koppelingen en diensten",
"The applications your organisation uses, with the version it runs, where it stands and who owns it.": "De applicaties die uw organisatie gebruikt, met de versie die draait, de fase waarin ze staan en wie de eigenaar is.",
"No applications in use recorded for this organisation yet": "Nog geen applicaties in gebruik vastgelegd voor deze organisatie"
"No applications in use recorded for this organisation yet": "Nog geen applicaties in gebruik vastgelegd voor deze organisatie",
"Maintenance window": "Onderhoudsvenster",
"Maintenance a supplier plans on one of its products, with the time window and the expected impact.": "Onderhoud dat een leverancier plant op een van zijn producten, met het tijdvenster en de verwachte impact.",
"The product the maintenance is on.": "Het product waarop het onderhoud plaatsvindt.",
"The version the maintenance is on, when it concerns one version.": "De versie waarop het onderhoud plaatsvindt, als het om één versie gaat.",
"What the maintenance is, in a few words.": "Wat het onderhoud is, in een paar woorden.",
"What changes and what users should do.": "Wat er verandert en wat gebruikers moeten doen.",
"Starts at": "Begint op",
"When the maintenance starts.": "Wanneer het onderhoud begint.",
"Ends at": "Eindigt op",
"When the maintenance ends.": "Wanneer het onderhoud eindigt.",
"Impact": "Impact",
"What users notice while the maintenance runs.": "Wat gebruikers merken zolang het onderhoud loopt.",
"Where the maintenance stands.": "Waar het onderhoud staat.",
"Owners to notify": "Te informeren eigenaren",
"The Nextcloud users who own a usage of the product, resolved when the maintenance is announced.": "De Nextcloud-gebruikers die eigenaar zijn van een gebruik van het product, bepaald bij de aankondiging van het onderhoud.",
"Owners resolved at": "Eigenaren bepaald op",
"When the owners to notify were resolved.": "Wanneer de te informeren eigenaren zijn bepaald.",
"No impact": "Geen impact",
"Degraded": "Verminderd",
"Unavailable": "Niet beschikbaar",
"In progress": "Bezig",
"Completed": "Afgerond",
"Cancelled": "Geannuleerd",
"Start the maintenance.": "Start het onderhoud.",
"Complete the maintenance.": "Rond het onderhoud af.",
"Cancel the maintenance.": "Annuleer het onderhoud.",
"Roadmap": "Roadmap",
"The direction the supplier takes with this application: what the next versions bring and when.": "De richting die de leverancier met deze applicatie kiest: wat de volgende versies brengen en wanneer.",
"Planned maintenance": "Gepland onderhoud",
"Announce maintenance": "Onderhoud aankondigen",
"No maintenance planned on this application": "Geen onderhoud gepland op deze applicatie",
"Planned releases": "Geplande releases",
"Loading planned maintenance": "Gepland onderhoud laden",
"The planned maintenance could not be loaded.": "Het geplande onderhoud kon niet worden geladen.",
"No maintenance planned on the applications you use in the next 30 days": "Geen onderhoud gepland op de applicaties die u gebruikt in de komende 30 dagen",
"{start} to {end}": "{start} tot {end}",
"Loading the roadmap": "Roadmap laden",
"The roadmap could not be loaded.": "De roadmap kon niet worden geladen.",
"The supplier has not published a roadmap for this application": "De leverancier heeft geen roadmap voor deze applicatie gepubliceerd",
"No versions with a date yet": "Nog geen versies met een datum"
},
"nplurals=2; plural=(n != 1);"
)
42 changes: 41 additions & 1 deletion l10n/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -897,6 +897,46 @@
"Add to our landscape": "Toevoegen aan ons landschap",
"Connections and services": "Koppelingen en diensten",
"The applications your organisation uses, with the version it runs, where it stands and who owns it.": "De applicaties die uw organisatie gebruikt, met de versie die draait, de fase waarin ze staan en wie de eigenaar is.",
"No applications in use recorded for this organisation yet": "Nog geen applicaties in gebruik vastgelegd voor deze organisatie"
"No applications in use recorded for this organisation yet": "Nog geen applicaties in gebruik vastgelegd voor deze organisatie",
"Maintenance window": "Onderhoudsvenster",
"Maintenance a supplier plans on one of its products, with the time window and the expected impact.": "Onderhoud dat een leverancier plant op een van zijn producten, met het tijdvenster en de verwachte impact.",
"The product the maintenance is on.": "Het product waarop het onderhoud plaatsvindt.",
"The version the maintenance is on, when it concerns one version.": "De versie waarop het onderhoud plaatsvindt, als het om één versie gaat.",
"What the maintenance is, in a few words.": "Wat het onderhoud is, in een paar woorden.",
"What changes and what users should do.": "Wat er verandert en wat gebruikers moeten doen.",
"Starts at": "Begint op",
"When the maintenance starts.": "Wanneer het onderhoud begint.",
"Ends at": "Eindigt op",
"When the maintenance ends.": "Wanneer het onderhoud eindigt.",
"Impact": "Impact",
"What users notice while the maintenance runs.": "Wat gebruikers merken zolang het onderhoud loopt.",
"Where the maintenance stands.": "Waar het onderhoud staat.",
"Owners to notify": "Te informeren eigenaren",
"The Nextcloud users who own a usage of the product, resolved when the maintenance is announced.": "De Nextcloud-gebruikers die eigenaar zijn van een gebruik van het product, bepaald bij de aankondiging van het onderhoud.",
"Owners resolved at": "Eigenaren bepaald op",
"When the owners to notify were resolved.": "Wanneer de te informeren eigenaren zijn bepaald.",
"No impact": "Geen impact",
"Degraded": "Verminderd",
"Unavailable": "Niet beschikbaar",
"In progress": "Bezig",
"Completed": "Afgerond",
"Cancelled": "Geannuleerd",
"Start the maintenance.": "Start het onderhoud.",
"Complete the maintenance.": "Rond het onderhoud af.",
"Cancel the maintenance.": "Annuleer het onderhoud.",
"Roadmap": "Roadmap",
"The direction the supplier takes with this application: what the next versions bring and when.": "De richting die de leverancier met deze applicatie kiest: wat de volgende versies brengen en wanneer.",
"Planned maintenance": "Gepland onderhoud",
"Announce maintenance": "Onderhoud aankondigen",
"No maintenance planned on this application": "Geen onderhoud gepland op deze applicatie",
"Planned releases": "Geplande releases",
"Loading planned maintenance": "Gepland onderhoud laden",
"The planned maintenance could not be loaded.": "Het geplande onderhoud kon niet worden geladen.",
"No maintenance planned on the applications you use in the next 30 days": "Geen onderhoud gepland op de applicaties die u gebruikt in de komende 30 dagen",
"{start} to {end}": "{start} tot {end}",
"Loading the roadmap": "Roadmap laden",
"The roadmap could not be loaded.": "De roadmap kon niet worden geladen.",
"The supplier has not published a roadmap for this application": "De leverancier heeft geen roadmap voor deze applicatie gepubliceerd",
"No versions with a date yet": "Nog geen versies met een datum"
}
}
4 changes: 4 additions & 0 deletions lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
use OCA\Stackiq\Controller\ContactpersonenController;
use OCA\Stackiq\Dashboard\ConceptOrganisatiesWidget;
use OCA\Stackiq\EventListener\DecisionConcludedListener;
use OCA\Stackiq\EventListener\MaintenanceRecipientsListener;
use OCA\Stackiq\EventListener\ModuleComplianceSubscriber;
use OCA\Stackiq\EventListener\ModuleRegistrationSubscriber;
use OCA\Stackiq\EventListener\TestEventListener;
Expand Down Expand Up @@ -807,6 +808,9 @@ private function registerEventListeners(IRegistrationContext $context): void {
$context->registerEventListener(ObjectCreatedEvent::class, ModuleRegistrationSubscriber::class);
$context->registerEventListener(ObjectUpdatedEvent::class, ModuleRegistrationSubscriber::class);

// Queue the owner resolution when a supplier announces maintenance (lifecycle-maintenance-and-supplier-roadmap).
$context->registerEventListener(ObjectCreatedEvent::class, MaintenanceRecipientsListener::class);

// Sync user profile updates into the contactpersoon mirror.
$context->registerEventListener(UserProfileUpdatedEvent::class, UserProfileUpdatedEventListener::class);

Expand Down
Loading
Loading