Skip to content

feat(dashboard): forgotten-bills alert (THI-329, epic final brick)#229

Merged
thierryvm merged 2 commits into
mainfrom
feat/forgotten-bills-alert
Jul 19, 2026
Merged

feat(dashboard): forgotten-bills alert (THI-329, epic final brick)#229
thierryvm merged 2 commits into
mainfrom
feat/forgotten-bills-alert

Conversation

@thierryvm

@thierryvm thierryvm commented Jul 19, 2026

Copy link
Copy Markdown
Owner

Alerte « factures oubliées » — dernière brique de l'epic Factures cohérentes (THI-329)

Ta demande de juin (P5) : « en auto ça ne garantit pas que toutes les factures sont bien payées le mois précédent, il faut un moyen de prévenir quand on a oublié une facture ».

Ce que ça fait

La card factures du dashboard s'ouvre désormais sur un bandeau calme quand des factures dues le mois précédent n'ont jamais été cochées :

⚠ 2 factures de juin n'ont jamais été cochées — vérifie qu'elles ont bien été payées.

  • Le snapshot lit maintenant aussi la période précédente du ledger (année-consciente : janvier → décembre N-1).
  • Nouveau domaine pur countUnpaidForPeriod(charges, paidIds, period).
  • a11y : texte porteur en foreground (AA les 2 thèmes), teinte warning purement décorative — même règle dark-safe que le badge « En retard ».

Décision produit à valider (documentée, réversible)

La spec de juin prévoyait aussi un bouton « Réinitialiser le mois ». Je l'ai abandonné avec rationale : le ledger est par période → les coches repartent à zéro naturellement chaque mois (le « reset auto » existe de fait), et décocher une facture individuellement couvre les corrections. Un bouton bulk-décocher le mois courant n'aurait pas d'usage réel identifié. Si tu le veux quand même, dis-le — ajout trivial.

Tests

5 domaine + 2 card ; suite complète 1494 verte ; typecheck/lint/build clean. UI-only + lecture élargie (aucune migration, aucune Server Action).

Smoke @Thierry

Cas concret : tes factures de juin étant toutes cochées (16/16), le bandeau ne doit pas apparaître. Pour le voir : décoche une facture de juin depuis… (impossible — juin est passé 😉) → il apparaîtra naturellement le 1er août si tu oublies des coches en juillet.

🤖 Generated with Claude Code

Summary by Sourcery

Ajouter une alerte sur le tableau de bord qui met en avant les factures dues le mois précédent qui n’ont jamais été marquées comme payées, complétant la partie « factures oubliées » de l’épopée des factures.

Nouvelles fonctionnalités :

  • Introduire une bannière d’avertissement discrète dans la carte du tableau de bord des factures à venir lorsque le mois dernier comporte des frais impayés et non cochés, y compris une formulation localisée du mois.

Améliorations :

  • Étendre la capture instantanée de l’espace de travail pour inclure les métadonnées de la période précédente et les identifiants des frais payés afin que le tableau de bord puisse raisonner sur les factures du mois dernier.
  • Ajouter un petit helper de domaine pur pour compter les frais impayés pour une période donnée et l’intégrer dans le flux du tableau de bord.
  • Améliorer les tests du tableau de bord et ajouter une note de passation documentée pour l’épopée des factures désormais terminée et l’incident de migration associé.

Tests :

  • Ajouter des tests unitaires pour le helper de domaine de comptage des impayés et pour le nouveau comportement d’alerte du tableau de bord afin de protéger la logique des factures oubliées.
Original summary in English

Summary by Sourcery

Add a dashboard alert that surfaces bills due in the previous month that were never marked as paid, completing the forgotten-bills piece of the invoices epic.

New Features:

  • Introduce a calm warning banner in the upcoming bills dashboard card when last month has unpaid, unticked charges, including localized month wording.

Enhancements:

  • Extend the workspace snapshot to include previous-period metadata and paid charge IDs so the dashboard can reason about last month’s bills.
  • Add a small pure domain helper to count unpaid charges for a given period and integrate it into the dashboard flow.
  • Enhance dashboard tests and add a documented handoff note for the completed invoices epic and related migration incident.

Tests:

  • Add unit tests for the unpaid-count domain helper and new dashboard alert behavior to guard the forgotten-bills logic.

…s (THI-329, epic final brick)

The payment ledger is per-period, so checkboxes naturally reset on month
rollover — which also silently hides last month's untracked bills. The
dashboard bills card now opens with a calm warning when bills due LAST month
were never ticked: 'N factures de {mois} n'ont jamais été cochées — vérifie
qu'elles ont bien été payées.'

- snapshot reads the PREVIOUS period's charge_payments too (year-wrap aware)
  and exposes previousPeriod + previousMonthPaidChargeIds;
- new pure countUnpaidForPeriod(charges, paidIds, period) in the domain;
- alert text stays text-foreground (AA both themes), warning tint decorative
  only — same dark-safety rule as the overdue badge.

Design note: the June spec's manual 'reset month' button became moot — the
per-period ledger IS the reset (each month starts unticked); per-bill
untick already covers corrections. Dropped with rationale (PR body).

i18n: dashboard.upcomingBills.forgottenAlert x5. Tests: 5 domain + 2 card;
full suite 1494 green. Also ships the 2026-07-19 session handoff mirror.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@vercel

vercel Bot commented Jul 19, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ankora Ready Ready Preview, Comment Jul 19, 2026 7:42am

@github-actions github-actions Bot added status:review-needed Ready for review type:feat New user-facing feature labels Jul 19, 2026
@sourcery-ai

sourcery-ai Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Guide du·de la relecteur·rice

Implémente l’alerte « factures oubliées » sur le tableau de bord en étendant le snapshot de workspace avec les données de paiements de la période précédente, en ajoutant un helper de domaine pur pour compter les charges impayées sur cette période, en raccordant le résultat à la carte des prochaines factures, et en couvrant le nouveau comportement par des tests et de la documentation.

Diagramme de séquence pour le calcul et le rendu de l’alerte « factures oubliées »

sequenceDiagram
  actor User
  participant DashboardPage
  participant getWorkspaceSnapshot
  participant supabase
  participant countUnpaidForPeriod
  participant ProchainesFacturesCard

  User->>DashboardPage: request dashboard
  DashboardPage->>getWorkspaceSnapshot: getWorkspaceSnapshot()
  getWorkspaceSnapshot->>supabase: select charge_payments (currentYear,currentMonth)
  getWorkspaceSnapshot->>supabase: select charge_payments (previousYear,previousMonth)
  supabase-->>getWorkspaceSnapshot: snapshot with previousPeriod, previousMonthPaidChargeIds
  getWorkspaceSnapshot-->>DashboardPage: WorkspaceSnapshot

  DashboardPage->>countUnpaidForPeriod: countUnpaidForPeriod(snapshot.charges, Set(previousMonthPaidChargeIds), snapshot.previousPeriod)
  countUnpaidForPeriod-->>DashboardPage: forgottenCount

  DashboardPage->>ProchainesFacturesCard: ProchainesFacturesCard({charges, payments, todayIso, locale, forgottenCount, forgottenMonthLabel})

  alt [forgottenCount > 0]
    ProchainesFacturesCard->>ProchainesFacturesCard: render forgottenAlert
  end
Loading

Modifications au niveau des fichiers

Changement Détails Fichiers
Le snapshot de workspace charge désormais les données de paiements de charges de la période précédente et les expose pour utilisation par le tableau de bord.
  • Ajouter les champs previousPeriod et previousMonthPaidChargeIds au type WorkspaceSnapshot et au payload du snapshot.
  • Calculer previousYear/previousMonth avec gestion du changement d’année à partir de currentPeriod.
  • Étendre le Supabase Promise.all pour récupérer les charge_payments du mois précédent et les mapper vers previousMonthPaidChargeIds, avec journalisation d’avertissement en cas d’échec.
src/lib/data/workspace-snapshot.ts
La page de tableau de bord dérive le nombre de factures oubliées depuis la logique de domaine et le transmet à la carte des prochaines factures avec un libellé de mois localisé.
  • Importer et utiliser countUnpaidForPeriod depuis le domaine charges pour calculer forgottenCount sur la base de previousMonthPaidChargeIds et previousPeriod.
  • Passer forgottenCount et un libellé formaté du mois précédent dans les props de ProchainesFacturesCard.
src/app/[locale]/app/page.tsx
Le composant de carte des prochaines factures affiche une alerte accessible et sereine lorsqu’il y a des factures oubliées du mois précédent.
  • Étendre les props de ProchainesFacturesCard avec forgottenCount et forgottenMonthLabel, en les faisant par défaut pointer vers des valeurs de repli sûres.
  • Afficher une ligne d’alerte avec bordure et fond teinté, icône AlertTriangle et texte localisé lorsque forgottenCount > 0, incluant les hooks de test.
  • Ajouter des tests pour vérifier que l’alerte de factures oubliées n’apparaît que lorsque prévu et qu’elle contient le bon libellé de mois.
  • Mettre à jour les traductions pour inclure le texte de l’alerte « factures oubliées » dans toutes les locales prises en charge.
src/components/dashboard/ProchainesFacturesCard.tsx
src/components/dashboard/__tests__/ProchainesFacturesCard.test.tsx
messages/de-DE.json
messages/en.json
messages/es-ES.json
messages/fr-BE.json
messages/nl-BE.json
Nouveau helper de domaine pur qui compte les charges impayées pour une période donnée sur la base du statut actif et du calendrier de paiement, avec tests unitaires.
  • Introduire le type UnpaidCountCharge qui capture id, paymentMonths et isActive pour les besoins du comptage.
  • Implémenter countUnpaidForPeriod pour filtrer les charges actives dues sur un mois donné qui n’ont pas de « tick » de paiement dans l’ensemble fourni.
  • Exporter le nouveau helper et le type depuis l’index du domaine charges pour réutilisation.
  • Ajouter des tests unitaires qui valident le comportement pour les scénarios de charges payées, hors mois, inactives et mixtes.
src/lib/domain/charges/unpaid-count.ts
src/lib/domain/charges/index.ts
src/lib/domain/charges/__tests__/unpaid-count.test.ts
Ajouter un document de handoff qui résume la session Fable 5, les PR livrées, l’incident de migration et le travail restant.
  • Créer un fichier de handoff au format Markdown décrivant les PR fusionnées, la résolution de l’incident de migration Supabase, les décisions produit/techniques et les prochaines étapes.
  • Inclure des notes opérationnelles et des anti-pièges pour les futures sessions.
docs/handoffs/2026-07-19-0030-fable5-epic-factures-complete.md

Conseils et commandes

Interagir avec Sourcery

  • Déclencher une nouvelle revue : Commentez @sourcery-ai review sur la pull request.
  • Poursuivre les discussions : Répondez directement aux commentaires de revue de Sourcery.
  • Générer une issue GitHub à partir d’un commentaire de revue : Demandez à Sourcery de créer une issue à partir d’un commentaire de revue en y répondant. Vous pouvez aussi répondre à un commentaire de revue avec @sourcery-ai issue pour créer une issue à partir de celui-ci.
  • Générer un titre de pull request : Écrivez @sourcery-ai n’importe où dans le titre de la pull request pour générer un titre à tout moment. Vous pouvez également commenter @sourcery-ai title sur la pull request pour (re)générer le titre à tout moment.
  • Générer un résumé de pull request : Écrivez @sourcery-ai summary n’importe où dans le corps de la pull request pour générer un résumé de PR à tout moment exactement à l’endroit souhaité. Vous pouvez aussi commenter @sourcery-ai summary sur la pull request pour (re)générer le résumé à tout moment.
  • Générer le guide du·de la relecteur·rice : Commentez @sourcery-ai guide sur la pull request pour (re)générer le guide du·de la relecteur·rice à tout moment.
  • Résoudre tous les commentaires Sourcery : Commentez @sourcery-ai resolve sur la pull request pour résoudre tous les commentaires Sourcery. Utile si vous avez déjà traité tous les commentaires et ne souhaitez plus les voir.
  • Ignorer toutes les revues Sourcery : Commentez @sourcery-ai dismiss sur la pull request pour ignorer toutes les revues Sourcery existantes. Particulièrement utile si vous voulez repartir de zéro avec une nouvelle revue – n’oubliez pas de commenter @sourcery-ai review pour déclencher une nouvelle revue !

Personnaliser votre expérience

Accédez à votre dashboard pour :

  • Activer ou désactiver des fonctionnalités de revue comme le résumé de pull request généré par Sourcery, le guide du·de la relecteur·rice, et d’autres.
  • Changer la langue de revue.
  • Ajouter, supprimer ou modifier des instructions de revue personnalisées.
  • Ajuster d’autres paramètres de revue.

Obtenir de l’aide

Original review guide in English

Reviewer's Guide

Implements the "forgotten bills" alert on the dashboard by extending the workspace snapshot with previous-period payment data, adding a pure domain helper to count unpaid charges for that period, wiring the result into the upcoming bills card, and covering the new behavior with tests and docs.

Sequence diagram for forgotten-bills alert computation and rendering

sequenceDiagram
  actor User
  participant DashboardPage
  participant getWorkspaceSnapshot
  participant supabase
  participant countUnpaidForPeriod
  participant ProchainesFacturesCard

  User->>DashboardPage: request dashboard
  DashboardPage->>getWorkspaceSnapshot: getWorkspaceSnapshot()
  getWorkspaceSnapshot->>supabase: select charge_payments (currentYear,currentMonth)
  getWorkspaceSnapshot->>supabase: select charge_payments (previousYear,previousMonth)
  supabase-->>getWorkspaceSnapshot: snapshot with previousPeriod, previousMonthPaidChargeIds
  getWorkspaceSnapshot-->>DashboardPage: WorkspaceSnapshot

  DashboardPage->>countUnpaidForPeriod: countUnpaidForPeriod(snapshot.charges, Set(previousMonthPaidChargeIds), snapshot.previousPeriod)
  countUnpaidForPeriod-->>DashboardPage: forgottenCount

  DashboardPage->>ProchainesFacturesCard: ProchainesFacturesCard({charges, payments, todayIso, locale, forgottenCount, forgottenMonthLabel})

  alt [forgottenCount > 0]
    ProchainesFacturesCard->>ProchainesFacturesCard: render forgottenAlert
  end
Loading

File-Level Changes

Change Details Files
Workspace snapshot now loads and exposes previous-period charge payment data for use by the dashboard.
  • Add previousPeriod and previousMonthPaidChargeIds fields to WorkspaceSnapshot type and snapshot payload.
  • Compute previousYear/previousMonth with year-wrap awareness from currentPeriod.
  • Extend the Supabase Promise.all to fetch last month’s charge_payments and map them to previousMonthPaidChargeIds, with warning logging on failure.
src/lib/data/workspace-snapshot.ts
Dashboard page derives the forgotten-bills count from domain logic and passes it to the upcoming bills card with a localized month label.
  • Import and use countUnpaidForPeriod from the charges domain to compute forgottenCount based on previousMonthPaidChargeIds and previousPeriod.
  • Pass forgottenCount and a formatted previous month label into ProchainesFacturesCard props.
src/app/[locale]/app/page.tsx
Upcoming bills card component renders an accessible, calm alert when there are forgotten bills from the previous month.
  • Extend ProchainesFacturesCard props with forgottenCount and forgottenMonthLabel, defaulting to safe fallbacks.
  • Render a bordered, tinted alert row with AlertTriangle icon and localized copy when forgottenCount > 0, including testing hooks.
  • Add tests to verify that the forgotten alert appears only when expected and contains the correct month label.
  • Update translations to include copy for the forgotten bills alert in all supported locales.
src/components/dashboard/ProchainesFacturesCard.tsx
src/components/dashboard/__tests__/ProchainesFacturesCard.test.tsx
messages/de-DE.json
messages/en.json
messages/es-ES.json
messages/fr-BE.json
messages/nl-BE.json
New pure domain helper counts unpaid charges for a given period based on active status and payment schedule, with unit tests.
  • Introduce UnpaidCountCharge type capturing id, paymentMonths, and isActive for counting purposes.
  • Implement countUnpaidForPeriod to filter active charges due in a given month that lack a payment tick in the provided set.
  • Export the new helper and type from the charges domain index for reuse.
  • Add unit tests validating behavior for paid, off-month, inactive, and mixed-charge scenarios.
src/lib/domain/charges/unpaid-count.ts
src/lib/domain/charges/index.ts
src/lib/domain/charges/__tests__/unpaid-count.test.ts
Add a handoff document summarizing the Fable 5 session, delivered PRs, migration incident, and remaining work.
  • Create a markdown handoff file describing merged PRs, the Supabase migration incident resolution, product/technical decisions, and next steps.
  • Include operational notes and anti-pitfalls for future sessions.
docs/handoffs/2026-07-19-0030-fable5-epic-factures-complete.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - j'ai trouvé 1 problème et laissé quelques commentaires de haut niveau :

  • Si la requête des paiements du mois précédent échoue, previousMonthPaidChargeIds devient silencieusement vide, ce qui va surcompter les factures « oubliées » et afficher une alerte trompeuse ; envisagez de court-circuiter l’alerte (par exemple en passant forgottenCount = 0 ou un indicateur de désactivation) lorsque previousMonthPaymentsRes.error est présent.
Prompt pour les agents IA
Veuillez traiter les commentaires de cette revue de code :

## Commentaires généraux
- Si la requête des paiements du mois précédent échoue, `previousMonthPaidChargeIds` devient silencieusement vide, ce qui va surcompter les factures « oubliées » et afficher une alerte trompeuse ; envisagez de court-circuiter l’alerte (par exemple en passant `forgottenCount = 0` ou un indicateur de désactivation) lorsque `previousMonthPaymentsRes.error` est présent.

## Commentaires individuels

### Commentaire 1
<location path="src/components/dashboard/__tests__/ProchainesFacturesCard.test.tsx" line_range="188-195" />
<code_context>
     expect(screen.getByTestId('prochaines-factures-watched-hint')).toBeInTheDocument();
   });

+  it('renders the forgotten-bills alert when last month left unticked bills', async () => {
+    await renderCard({
+      charges: [makeCharge()],
+      forgottenCount: 2,
+      forgottenMonthLabel: 'juin',
+    });
+    expect(screen.getByTestId('prochaines-factures-forgotten')).toHaveTextContent(/juin/);
+  });
+
</code_context>
<issue_to_address>
**suggestion (testing):** Renforcer l’assertion de l’alerte sur les factures oubliées pour couvrir le nombre dynamique ainsi que le libellé du mois

Ce test vérifie uniquement que le libellé du mois (« juin ») apparaît dans l’alerte, mais le texte est également paramétré par `forgottenCount`. En conséquence, il ne détecterait pas les régressions où le nombre est manquant ou incorrect alors que le mois est toujours présent. Merci de mettre à jour l’assertion pour couvrir à la fois le mois et le nombre (par exemple via une expression régulière sur la chaîne localisée complète ou des attentes combinées sur `textContent`).

```suggestion
  it('renders the forgotten-bills alert when last month left unticked bills', async () => {
    await renderCard({
      charges: [makeCharge()],
      forgottenCount: 2,
      forgottenMonthLabel: 'juin',
    });
    const alert = screen.getByTestId('prochaines-factures-forgotten');
    expect(alert).toHaveTextContent(/2/);
    expect(alert).toHaveTextContent(/juin/);
  });
```
</issue_to_address>

Sourcery est gratuit pour l’open source – si vous appréciez nos revues, pensez à les partager ✨
Aidez-moi à être plus utile ! Merci de cliquer sur 👍 ou 👎 sur chaque commentaire ; j’utiliserai ces retours pour améliorer vos revues.
Original comment in English

Hey - I've found 1 issue, and left some high level feedback:

  • If the previous-month payments query fails, previousMonthPaidChargeIds silently becomes empty, which will overcount "forgotten" bills and show a misleading alert; consider short-circuiting the alert (e.g. passing forgottenCount = 0 or a disabled flag) when previousMonthPaymentsRes.error is present.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- If the previous-month payments query fails, `previousMonthPaidChargeIds` silently becomes empty, which will overcount "forgotten" bills and show a misleading alert; consider short-circuiting the alert (e.g. passing `forgottenCount = 0` or a disabled flag) when `previousMonthPaymentsRes.error` is present.

## Individual Comments

### Comment 1
<location path="src/components/dashboard/__tests__/ProchainesFacturesCard.test.tsx" line_range="188-195" />
<code_context>
     expect(screen.getByTestId('prochaines-factures-watched-hint')).toBeInTheDocument();
   });

+  it('renders the forgotten-bills alert when last month left unticked bills', async () => {
+    await renderCard({
+      charges: [makeCharge()],
+      forgottenCount: 2,
+      forgottenMonthLabel: 'juin',
+    });
+    expect(screen.getByTestId('prochaines-factures-forgotten')).toHaveTextContent(/juin/);
+  });
+
</code_context>
<issue_to_address>
**suggestion (testing):** Strengthen the forgotten-bills alert assertion to cover the dynamic count as well as the month label

This test only verifies that the month label (« juin ») appears in the alert, but the copy is also parameterized by `forgottenCount`. As a result, it wouldn’t catch regressions where the count is missing or wrong while the month is still present. Please update the assertion to cover both month and count (e.g. via a regex on the full localized string or combined expectations on `textContent`).

```suggestion
  it('renders the forgotten-bills alert when last month left unticked bills', async () => {
    await renderCard({
      charges: [makeCharge()],
      forgottenCount: 2,
      forgottenMonthLabel: 'juin',
    });
    const alert = screen.getByTestId('prochaines-factures-forgotten');
    expect(alert).toHaveTextContent(/2/);
    expect(alert).toHaveTextContent(/juin/);
  });
```
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread src/components/dashboard/__tests__/ProchainesFacturesCard.test.tsx Outdated
…month asserts (Sourcery #229)

The naive regex mock could not render ICU plurals, so the forgotten-alert
copy was only assertable by fragments. getTranslations now delegates to
next-intl's createTranslator (real ICU) — the tests assert the exact
user-facing copy in both plural ('2 factures de juin n'ont jamais été
cochées') and singular forms. 12 card tests green.
@thierryvm
thierryvm merged commit 0ce66cc into main Jul 19, 2026
9 checks passed
@thierryvm
thierryvm deleted the feat/forgotten-bills-alert branch July 19, 2026 07:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status:review-needed Ready for review type:feat New user-facing feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant