Aller au contenu
My Amana · Reporting boardÉdition du 19 septembre 2026

Équipe backend · Opérationnel, directement exploitable

Équipe technique backend

17 points bloquent la mise en production. Ils sont listés à part, en tête ; tout le reste est classé par priorité, et chaque ligne renvoie à son ticket.

Bloquants pour la mise en production

17

section 3.0 : à traiter avant toute autre

Tickets dans l’outil de ticketing

71 / 71

un par référence, rattaché à son workflow

Ouverts, correctif serveur attendu

50

aucune absorption côté application

Contournés côté application

16

l’application absorbe le défaut ; le correctif reste attendu

Section 3.1 : Tickets par priorité

La colonne « N° » porte le numéro attribué par l'outil de ticketing ; la référence (P0-M#5(ticket dans l’outil de ticketing, nouvelle fenêtre), P1-A#20(ticket dans l’outil de ticketing, nouvelle fenêtre), P2.13#32(ticket dans l’outil de ticketing, nouvelle fenêtre), P3.19#47(ticket dans l’outil de ticketing, nouvelle fenêtre), §31#14(ticket dans l’outil de ticketing, nouvelle fenêtre), A9#1(ticket dans l’outil de ticketing, nouvelle fenêtre)…) est la clé stable reprise dans le titre de chaque ticket. Priorités : P0 = critique / bloquant pour une mise en production · P1 = haute (défaut de fiabilité de contrat) · P2 = normale (alignement du contrat et de la documentation) · P3 = à traiter ultérieurement (endpoints manquants ou insuffisants). Statuts : ouvert · contourné (l'application absorbe le défaut, le correctif reste attendu) · arbitrage (décision attendue) · résolu. Les échéances cibles renvoient aux lots du plan d'action (section 2.3) ; leur calendrier est en section 1.4. Les 16 tickets bloquants pour la mise en production sont sortis de ces listes et regroupés en section 3.0.

Tickets bloquants pour la mise en production

Liste à part, à traiter avant toute autre. Tant qu'un seul de ces points est ouvert, l'application ne peut pas être publiée : soit une fonction livrée n'opère pas, soit un client réel subirait un défaut visible ou dangereux. Ils sont sortis des listes par priorité de la section 3.1. Tous relèvent des lots 1 et 2 du plan d'action, attendus à la fin de la semaine de traitement des issues (calendrier en section 1.4). Le détail de chaque ticket est en section 3.2.

17 points · 13 ouverts, 2 contournés côté application, 2 en arbitrage. Tant qu’un seul reste ouvert, l’application ne peut pas être publiée.

Tickets backend bloquants pour la mise en production
N°Réf.WorkflowTitreCe qui casse en productionStatutResponsable
#1 (nouvelle fenêtre)A9Authentification – Connexion, Empreinte digitalePOST /auth/refresh répond 500 avec un jeton valideTout utilisateur est déconnecté au bout de 30 minutes ; la connexion par empreinte n'opère que dans cette fenêtre ; aucun contournement propre côté mobileOuvertBackend
#2 (nouvelle fenêtre)P0-DAuthentification – InscriptionVérifier l'OTP téléphone à l'inscriptionUn compte peut être créé avec un numéro dont l'utilisateur n'est pas titulaireArbitrage attendu

(A1)

Amana puis Backend
#3 (nouvelle fenêtre)P0-LMenu – Documents utilesServir GET /documents à tout souscripteurÉcran mort pour la majorité des clients réels, sur un catalogue réglementaire publicOuvertBackend
#4 (nouvelle fenêtre)P0-HMenu – Documents utilesExposer une URL téléchargeable pour les documents utilesAucun document n'est ouvrableOuvertBackend
#5 (nouvelle fenêtre)P0-MPaiement CIBRevenir dans l'application après le 3-D SecureLe client paie puis reste sur le site vitrine, dans le navigateurOuvertBackend / Satim
#6 (nouvelle fenêtre)P0-NPaiement CIBconfirmPayment nie le paiement qu'il vient d'encaisserSans le contournement, écran d'échec après un paiement réussi ; avec, jusqu'à 90 s avant l'écran de succèsContourné côté appBackend
#7 (nouvelle fenêtre)P0-BPaiement Points vertsPaiement Points verts répond 500Moyen de paiement inopérant ; un GET exécute un débit, rejouable par rafraîchissementOuvertBackend
#8 (nouvelle fenêtre)P0-CPaiement À la livraisonExposer la confirmation du paiement à la livraisonL'encaissement d'un contrat payé à la livraison reste invisibleOuvertBackend
#9 (nouvelle fenêtre)A14Souscription AccidentCréation Accident en groupe répond 409 sans messageLe produit Accident n'est pas vendable en groupeOuvertBackend
#10 (nouvelle fenêtre)P0-KSinistresExposer le référentiel « produit » de POST /claimsLa déclaration de sinistre n'est jamais déposéeOuvertBackend
#11 (nouvelle fenêtre)P3.12SinistresRattacher le chat du service client à un sinistreLa même conversation s'affiche sous chaque dossier ; un message envoyé depuis l'un apparaît sous tous les autresArbitrage attendu

(A3)

Produit / Backend
#12 (nouvelle fenêtre)P0-IRemboursements, Menu – Contact, Compléter profil santéRelever la limite de téléversementUne photo de justificatif prise avec un téléphone (3 à 5 Mo) est refusée : cas nominal en échecContourné côté app

(compression, refus expliqué)

Backend
#13 (nouvelle fenêtre)P0-JCompléter profil santé (Individuelle, Famille, Groupe)Publier le contrat de POST /members/addPieceJointeLes pièces du profil santé n'ont nulle part où allerOuvertBackend
#14 (nouvelle fenêtre)§31Compléter profil santé (Individuelle, Famille, Groupe)POST /ayantDroits répond un 500 nuLes personnes à charge ne sont jamais soumisesOuvertBackend
#15 (nouvelle fenêtre)P3.10Compléter profil santé (Individuelle, Famille, Groupe)GET /members/bulletinAdhesion répond 500Le bulletin réclamé par la validation d'adhérent est introuvable ; le profil n'est jamais activéOuvertBackend
#16 (nouvelle fenêtre)A22Authentification – ConnexionLe code MFA de connexion n'est pas délivré par e-mailUn compte qui a réinitialisé son mot de passe (ou un compte neuf après le changement forcé) ne peut plus ouvrir de sessionOuvertBackend
#17 (nouvelle fenêtre)A10TransverseServir tout le JSON en UTF-8Les messages d'erreur français affichés à l'utilisateur arrivent illisiblesOuvertBackend
17 points, dont 13 ouverts, 2 contournés côté application P0-N#6(ticket dans l’outil de ticketing, nouvelle fenêtre), P0-I#12(ticket dans l’outil de ticketing, nouvelle fenêtre) et 2 en arbitrage P0-D#2(ticket dans l’outil de ticketing, nouvelle fenêtre), P3.12#11(ticket dans l’outil de ticketing, nouvelle fenêtre). Chaque ligne correspond à un ticket de l'outil de ticketing ; la référence (P0-M#5(ticket dans l’outil de ticketing, nouvelle fenêtre), A22#16(ticket dans l’outil de ticketing, nouvelle fenêtre), …) est la clé stable reprise dans le titre du ticket, le numéro attribué par l'outil figure dans la colonne « N° ».

Correctifs applicatifs bloquants (côté SHIFTIN, sans dépendance backend)

Correctifs applicatifs bloquants
Réf.WorkflowDéfautCorrectifÉchéance
APP-1Authentification – InscriptionL'OTP e-mail était envoyé avant POST /users ; le serveur répond 404 pour toute adresse nouvelleCorrigé : le compte est créé à l'étape téléphone, puis l'adresse est vérifiée par l'OTP ; l'étape SMS (non envoyable, A23#69(ticket dans l’outil de ticketing, nouvelle fenêtre)) est retirée ; écrans instrumentés, flow Maestro 02 réenregistré de bout en boutLivré dans l'APK de référence
APP-2Authentification – Réinitialisation du mot de passeÉtape 1 sur POST /auth/mfa/send (jeton obligatoire) au lieu de POST /auth/otp ; jeton de /auth/otp/validate non conservé pour PATCH /auth/passwordCorrigé : /auth/otp à l'étape 1, jeton conservé (préfixe Bearer retiré) et porté vers PATCH /auth/password, tests unitaires sur la chaîne ; flow Maestro 03 réenregistré de bout en boutLivré dans l'APK de référence

Prérequis client bloquants pour la mise en production

Prérequis client bloquants
Réf.BesoinCe qui est bloqué sans luiResponsable
CP-02Compte App Store (organisation, D-U-N-S, certificats)Build iOS, TestFlight, publicationAmana
CP-01Compte Google Play StorePublication AndroidAmana
CP-11URL de l'API de productionBuild de production (l'URL configurée est encore factice)Amana
CP-12Instance Satim marchande au nom d'AmanaLe paiement carte de test s'exécute sur une page au nom d'un marchand tiers, non livrableAmana / Satim
CP-08Cartes Dahabia de testLe paiement Dahabia n'a jamais été réglé de bout en boutAmana
CP-03Décision A1 : authentification par téléphoneTicket P0-D#2(ticket dans l’outil de ticketing, nouvelle fenêtre)Amana
CP-04Décision A2 : plafond de la prime Voyage Famille au 7ᵉ voyageurTrois voyageurs sur dix assurés sans contrepartie tant que non tranchéAmana

Tous les tickets, par priorité

Critiques, haute priorité, priorité normale, à traiter ultérieurement, et les constats d’audit ticketés depuis cette édition. Les bloquants de mise en production sont marqués et remontent en tête.

71 tickets
Liste des tickets par priorité
#1 (nouvelle fenêtre)A9P0 · critiqueAuthentification – Connexion, Empreinte digitalePOST /auth/refresh répond 500 avec un jeton validebloquant prodOuvertBackendLot 1
#2 (nouvelle fenêtre)P0-DP0 · critiqueAuthentification – InscriptionVérifier l'OTP téléphone à l'inscriptionbloquant prodArbitrage attenduAmana puis BackendLot 1
#3 (nouvelle fenêtre)P0-LP0 · critiqueMenu – Documents utilesServir GET /documents à tout souscripteurbloquant prodOuvertBackendLot 2
#4 (nouvelle fenêtre)P0-HP0 · critiqueMenu – Documents utilesExposer une URL téléchargeable pour les documents utilesbloquant prodOuvertBackendLot 2
#5 (nouvelle fenêtre)P0-MP0 · critiquePaiement CIBRevenir dans l'application après le 3-D Securebloquant prodOuvertBackend / SatimLot 1
#6 (nouvelle fenêtre)P0-NP0 · critiquePaiement CIBconfirmPayment nie le paiement qu'il vient d'encaisserbloquant prodContourné côté appBackendLot 1
#7 (nouvelle fenêtre)P0-BP0 · critiquePaiement Points vertsPaiement Points verts répond 500bloquant prodOuvertBackendLot 1
#8 (nouvelle fenêtre)P0-CP0 · critiquePaiement À la livraisonExposer la confirmation du paiement à la livraisonbloquant prodOuvertBackendLot 1
#10 (nouvelle fenêtre)P0-KP0 · critiqueSinistresExposer le référentiel « produit » de POST /claimsbloquant prodOuvertBackendLot 2
#12 (nouvelle fenêtre)P0-IP0 · critiqueRemboursements, Menu – Contact, Compléter profil santéRelever la limite de téléversementbloquant prodContourné côté appBackendLot 2
#13 (nouvelle fenêtre)P0-JP0 · critiqueCompléter profil santé (Individuelle, Famille, Groupe)Publier le contrat de POST /members/addPieceJointebloquant prodOuvertBackendLot 2
#14 (nouvelle fenêtre)§31P0 · critiqueCompléter profil santé (Individuelle, Famille, Groupe)POST /ayantDroits répond un 500 nubloquant prodOuvertBackendLot 2
#16 (nouvelle fenêtre)A22P0 · critiqueAuthentification – ConnexionLe code MFA de connexion n'est pas délivré par e-mailbloquant prodOuvertBackendLot 1
#17 (nouvelle fenêtre)A10P0 · critiqueTransverseServir tout le JSON en UTF-8bloquant prodOuvertBackendLot 1
#9 (nouvelle fenêtre)A14P1 · hauteSouscription AccidentCréation Accident en groupe répond 409 sans messagebloquant prodOuvertBackendLot 2
#11 (nouvelle fenêtre)P3.12P3 · ultérieureSinistresRattacher le chat du service client à un sinistrebloquant prodArbitrage attenduProduit / BackendLot 3
#15 (nouvelle fenêtre)P3.10P3 · ultérieureCompléter profil santé (Individuelle, Famille, Groupe)GET /members/bulletinAdhesion répond 500bloquant prodOuvertBackendLot 2
#18 (nouvelle fenêtre)P0-FP0 · critiqueCompte – Profil santé, Compléter profil santéDocumenter le contrat réel de PUT /membersContourné côté appBackendLot 4
#19 (nouvelle fenêtre)P0-GP0 · critiqueRemboursementsAnnoncer les renommages de champContourné côté appBackendLot 4
#66 (nouvelle fenêtre)A19P0 · critiqueAuthentification – RéinitialisationOTP réutilisable jusqu'à expirationOuvertBackendLot 1
#20 (nouvelle fenêtre)P1-AP1 · hauteSouscription VoyageNe plus répondre « succès » sur un échec (V8b)Contourné côté appBackendLot 4
#21 (nouvelle fenêtre)P1-BP1 · hauteSouscription VoyageRendre la souscription Voyage atomique (V8c)OuvertBackendLot 4
#22 (nouvelle fenêtre)P1-CP1 · hauteSouscription VoyageValider réellement les champs obligatoires (V5)Contourné côté appBackendLot 4
#23 (nouvelle fenêtre)P1-DP1 · hauteSouscription VoyageTrancher le plafonnement de la prime Famille au 7ᵉ voyageur (V13)Arbitrage attenduAmanaLot 1
#24 (nouvelle fenêtre)P1-EP1 · hauteSouscription VoyageCorriger les primes négatives (V12)OuvertBackendLot 4

Constats d’audit ticketés depuis cette édition

Relevés par l’audit « API réelle vs spécification » et la recette OTP ; hors bloquants de mise en production, déjà listés ci-dessus.

Constats d’audit ticketés depuis cette édition
N°Réf.WorkflowConstatPriorité
#59 (nouvelle fenêtre)A11Souscription, PaiementIdempotence et compensation

aucune idempotence sur /souscriptions, /souscriptions/voyage, /modePaiement/* ; aucune compensation (DELETE) sur un contrat non payé

P1 · haute
#60 (nouvelle fenêtre)A12AuthentificationJeton client portant 19 rôles

le JWT d'un simple assuré porte 19 rôles dont des périmètres de back-office ; au moins un est inerte sur cette passerelle. Questions : les 18 autres sont-ils inertes partout ? Le compte de test est-il représentatif ?

P1 · haute
#61 (nouvelle fenêtre)A13Souscription Santé, VoyageMontants en flottants non arrondis

primeNetteSansReduction: 16164.146341463415, primeNetteSansReductionMensuel: 1347.0121951219512 ; reduction: false alors que les variantes avec et sans réduction diffèrent

P2 · normale
#62 (nouvelle fenêtre)A15Contrats500 divulguant un chemin de service interneP2 · normale
#63 (nouvelle fenêtre)A16TransverseRemplir les required de la spécification et corriger les cinq écarts actifs

par ordre de nocivité : POST /refunds (documente type, retiré ; omet codeActe) → PUT /members (questionnaire plat au lieu d'imbriqué) → GET /auth/me (5 champs au lieu de 18 + 4 objets) → /refunds et `/clai…

P1 · haute
#64 (nouvelle fenêtre)A17Authentification – InscriptionAucun OTP possible avant POST /users

POST /auth/otp répond 404 « User Not found » pour toute adresse non inscrite et pour tout numéro de téléphone A17#64(ticket dans l’outil de ticketing, nouvelle fenêtre), A23#69(ticket dans l’outil de ticketing, nouvelle fenêtre) ; POST /users crée le compte sans OTP préalable (201) ; un mot de passe accepté par `POS…

P1 · haute
#65 (nouvelle fenêtre)A18Authentification – InscriptionPolitique de mot de passe non appliquée à POST /users

POST /auth/otp répond 404 « User Not found » pour toute adresse non inscrite et pour tout numéro de téléphone A17#64(ticket dans l’outil de ticketing, nouvelle fenêtre), A23#69(ticket dans l’outil de ticketing, nouvelle fenêtre) ; POST /users crée le compte sans OTP préalable (201) ; un mot de passe accepté par `POS…

P1 · haute
#66 (nouvelle fenêtre)A19Authentification – RéinitialisationOTP réutilisable jusqu'à expiration

POST /auth/otp répond 404 « User Not found » pour toute adresse non inscrite et pour tout numéro de téléphone A17#64(ticket dans l’outil de ticketing, nouvelle fenêtre), A23#69(ticket dans l’outil de ticketing, nouvelle fenêtre) ; POST /users crée le compte sans OTP préalable (201) ; un mot de passe accepté par `POS…

P0 · critique

sécurité

#67 (nouvelle fenêtre)A20Authentification – Réinitialisation409 « Code generated déja » pendant 15 min

POST /auth/otp répond 404 « User Not found » pour toute adresse non inscrite et pour tout numéro de téléphone A17#64(ticket dans l’outil de ticketing, nouvelle fenêtre), A23#69(ticket dans l’outil de ticketing, nouvelle fenêtre) ; POST /users crée le compte sans OTP préalable (201) ; un mot de passe accepté par `POS…

P1 · haute
#68 (nouvelle fenêtre)A21Authentification – Réinitialisationcode vide → 409 exposant une SQLGrammarException

POST /auth/otp répond 404 « User Not found » pour toute adresse non inscrite et pour tout numéro de téléphone A17#64(ticket dans l’outil de ticketing, nouvelle fenêtre), A23#69(ticket dans l’outil de ticketing, nouvelle fenêtre) ; POST /users crée le compte sans OTP préalable (201) ; un mot de passe accepté par `POS…

P1 · haute

sécurité

#69 (nouvelle fenêtre)A23Authentification – InscriptionPOST /auth/otp par numéro de téléphone → 404

POST /auth/otp répond 404 « User Not found » pour toute adresse non inscrite et pour tout numéro de téléphone A17#64(ticket dans l’outil de ticketing, nouvelle fenêtre), A23#69(ticket dans l’outil de ticketing, nouvelle fenêtre) ; POST /users crée le compte sans OTP préalable (201) ; un mot de passe accepté par `POS…

P1 · haute
#70 (nouvelle fenêtre)A24AuthentificationJeton renvoyé avec le préfixe Bearer dans la valeur

POST /auth/otp répond 404 « User Not found » pour toute adresse non inscrite et pour tout numéro de téléphone A17#64(ticket dans l’outil de ticketing, nouvelle fenêtre), A23#69(ticket dans l’outil de ticketing, nouvelle fenêtre) ; POST /users crée le compte sans OTP préalable (201) ; un mot de passe accepté par `POS…

P3 · ultérieure
#71 (nouvelle fenêtre)Q1-Q9Authentification – ConnexionComptes migrés et POST /auth/attach

modèle du compte unifié, identifiant stable de la personne, rôle exact de l'endpoint, session porteuse de l'appel, contenu du LoginDto renvoyé, cas d'échec et idempotence, déclencheur côté application (checkuser ?…

P1 · haute

Section 3.2 : Détail des tickets

Organisé par workflow, dans l’ordre du référentiel. Pour chaque ticket : description, impact, priorité, responsable, statut, dépendances et échéance cible (lot). Le détail complet est dans l’outil.

Authentification

P0-D#2 (nouvelle fenêtre)P0 · critiqueArbitrage attendubloquant pour la mise en production
Vérifier l'OTP téléphone à l'inscription

POST /auth/otp/validate

Description
Le backend ne contrôle que l'OTP e-mail ; l'OTP téléphone est envoyé, collecté et jamais vérifié.
Impact
Un compte peut être créé avec un numéro dont l'utilisateur n'est pas titulaire.
Priorité
P0
Responsable
Amana (décision A1) puis Backend
Statut
Arbitrage.
Dépendances
Décision de maintenir ou d'abandonner l'authentification par téléphone.
Échéance cible
Lot 1
A9#1 (nouvelle fenêtre)P0 · critiqueOuvertbloquant pour la mise en production
POST /auth/refresh répond 500
Description
Avec un jeton de rafraîchissement valide (émis 2 minutes plus tôt, expirant dans 8 heures), l'endpoint répond 500 INTERNAL_SERVER_ERROR. Un corps avec un autre nom de champ répond 400 « refreshToken ne doit pas être vide », ce qui confirme que la requête de l'application est correcte. La spécification est juste ; l'implémentation est cassée.
Impact
Le jeton d'accès vit 30 minutes ; tout utilisateur au-delà est déconnecté au lieu d'être renouvelé ; la connexion par empreinte digitale échoue de la même façon. Aucun contournement propre côté mobile (ré-authentifier silencieusement exigerait de stocker le mot de passe)
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Dépendances
Aucune. À défaut de correctif immédiat, allonger nettement la durée de vie du jeton d'accès (palliatif, pas correctif)
Échéance cible
Lot 1
P2.2#30 (nouvelle fenêtre)P2 · normaleOuvert
Enveloppe d'erreur et codes 419 / 420 non déclarés

POST /auth/login

Description
Les réponses 419 (changement de mot de passe imposé) et 420 (MFA requis) arrivent avec un jeton porteur sans champ status ; une connexion est rejetée si un JWT périmé est attaché.
Impact
Comportement découvert par l'essai ; hiérarchie d'erreurs dédiée côté application.
Priorité
P2
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4
P3.7résolu, sans ticketP3 · ultérieureRésolu
/auth/password-policy annoncé mais absent

PATCH /auth/password

Description
GET /auth/password-policy répond désormais, en anonyme, quatre règles en français (8 caractères minimum ; majuscule, minuscule, chiffre et caractère spécial parmi @ # ! ? $ £ ; pas d'informations personnelles ; différent des 5 derniers mots de passe). L'application les affiche et les évalue à chaque frappe. Reste : déclarer l'endpoint dans la spécification, et faire nommer par le 419 la règle violée
Priorité
P3
Responsable
Backend
Statut
Résolu, documentation à compléter.
A22#16 (nouvelle fenêtre)P0 · critiqueOuvertbloquant pour la mise en production
Le code MFA de connexion n'est pas délivré par e-mail

POST /auth/mfa/send

Description
La séquence du diagramme backend (création, connexion, 420 INSERT_CODE_MULTIFACTORIELLE, OTP, mfa/verify) a été rejouée sur le compte de recette demo@shiftin-demo.com, seule adresse dont la boîte est relevée. Aucun code n'arrive par e-mail après le 420 (attente 2 min) ; POST /auth/mfa/send répond 200 « RESENDING WITH SUCCESS !!! » pour EMAIL, email, MAIL, avec username et à corps vide, sans qu'aucun e-mail ne soit délivré (INBOX, Junk, spam), sur une adresse qui reçoit bien l'OTP de /auth/otp. POST /auth/mfa/verify avec un code erroné répond proprement 400. Si le code part par SMS, ce n'est ni documenté ni observable.
Impact
Aucun compte ne peut franchir le défi MFA par e-mail ; le compte de recette est dans cet état. Les étapes 14 à 25 du diagramme backend ne peuvent pas être validées.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 1 (chantier 2). Attendu : délivrer le code par e-mail, ou documenter le canal réellement utilisé (SMS ?)
Chaîne OTP

POST /auth/otp, POST /auth/otp/validate, POST /users

Description
POST /auth/otp répond 404 « User Not found » pour toute adresse non inscrite et pour tout numéro de téléphone A17#64(ticket dans l’outil de ticketing, nouvelle fenêtre), A23#69(ticket dans l’outil de ticketing, nouvelle fenêtre) ; POST /users crée le compte sans OTP préalable (201) ; un mot de passe accepté par POST /users est refusé en 419 CHANGE_PASSWORD à la première connexion, la politique n'étant pas appliquée à la création A18#65(ticket dans l’outil de ticketing, nouvelle fenêtre) ; POST /auth/otp répond 409 « Code generated déja » pendant les 15 minutes de validité A20#67(ticket dans l’outil de ticketing, nouvelle fenêtre) ; POST /auth/otp/validate accepte le même code plusieurs fois et émet un nouveau jeton à chaque fois A19#66(ticket dans l’outil de ticketing, nouvelle fenêtre) ; un code vide expose une SQLGrammarException A21#68(ticket dans l’outil de ticketing, nouvelle fenêtre) ; le jeton est renvoyé avec le préfixe Bearer A24#70(ticket dans l’outil de ticketing, nouvelle fenêtre)
Impact
L'ordre du parcours d'inscription doit être tranché (l'application le corrige de son côté) ; le bouton « renvoyer le code » échouera ; la réutilisation d'un OTP est un défaut de sécurité.
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 1 A17#64(ticket dans l’outil de ticketing, nouvelle fenêtre), A19#66(ticket dans l’outil de ticketing, nouvelle fenêtre), Lot 4 (le reste). Détail et reproduction : note de recette OTP dans docs/rapports-internes/ (référencée en section 2.3)
Q1-Q9#71 (nouvelle fenêtre)P1 · hauteRéponse attendue
Comptes migrés et POST /auth/attach
Description
Modèle du compte unifié, identifiant stable de la personne, rôle exact de l'endpoint, session porteuse de l'appel, contenu du LoginDto renvoyé, cas d'échec et idempotence, déclencheur côté application (checkuser ? altern_users ?), parcours « ancien compte Assurance seul ». Point connexe : le CIN collecté à l'inscription n'a aucun champ dans POST /users.
Impact
Quatre écrans construits et testés, inaccessibles à l'utilisateur.
Responsable
Backend
Statut
Questions transmises, sans réponse.
Ce qui débloquerait le plus vite
Un curl complet d'un rattachement réussi, un compte de test possédant deux anciens comptes non rattachés, la réponse à Q8.

Accueil

P3.2#43 (nouvelle fenêtre)P3 · ultérieureContourné côté app
GET /notifications/unread-count répond 404
Description
Aucun endpoint de comptage ; le badge est compté sur une page de 50 notifications dans 4 écrans.
Impact
Compteur plafonné par la taille de page ; N+1 évitable.
Priorité
P3 (majeur)
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 6
P3.9#44 (nouvelle fenêtre)P3 · ultérieureOuvert
GET /tarifs sans codeProduit → 200 []
Description
Réponse vide au lieu d'un 400. À rapprocher de l'absence de prix minimum sur GET /produits, qui impose un appel /tarifs par produit à l'accueil.
Priorité
P3 (mineur)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 6

Dashboard

P2.4#33 (nouvelle fenêtre)P2 · normaleContourné côté app
Deux enveloppes de pagination subsistent

GET /contrats, /beneficiaries, /notifications, /refunds, /claims

Description
Page Spring complète d'un côté, page réduite de l'autre ; base d'index 0 ou 1 selon l'endpoint ; /refunds, /claims et /beneficiaries répondent 500 sans page ; la spécification documente encore l'enveloppe retirée.
Impact
Lecture unifiée côté application ; base codée en dur par appel.
Priorité
P2
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 6 (page Spring complète partout, base 0, valeur par défaut sans page)
P3.15#46 (nouvelle fenêtre)P3 · ultérieureOuvert
Ordre de tri et politique d'exclusion de GET /contrats
Description
Question restée sans réponse ; limitation à 1 000 éléments signalée par le backend.
Impact
Le « dernier contrat » n'est pas identifiable de façon fiable.
Priorité
P3 (mineur)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 6

Compte

P2.1#31 (nouvelle fenêtre)P2 · normaleContourné côté app
GET /auth/me : DTO plat déclaré, réponse imbriquée
Description
5 champs plats déclarés, 18 champs et 4 objets imbriqués réels (souscripteur, adresse, tel, email, wilaya) ; nom/prenom vides à la racine ; deux champs déclarés n'existent pas. L'endpoint le plus utilisé de l'application (10 hooks) est documenté à 22 %
Priorité
P2
Responsable
Backend
Statut
Contourné (lecture dans souscripteur{})
Échéance cible
Lot 6
P0-F#18 (nouvelle fenêtre)P0 · critiqueContourné côté app
Documenter le contrat réel de PUT /members
Description
Remplacement d'enregistrement complet et non mise à jour partielle ; bloc questionnaire nommé questionnaire et non bonneSanteQuestion ; réponses en chaînes « Oui »/« Non » ; validation (téléphone 10 chiffres, code postal 5 chiffres, ville et date d'entrée en service obligatoires) documentée nulle part ; aucun champ pour la wilaya.
Impact
Codé d'après la documentation, l'enregistrement du profil santé échouait à 100 %. Contourné par relecture et fusion avant chaque écriture.
Priorité
P0
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 4
P1-F#26 (nouvelle fenêtre)P1 · hauteContourné côté app
Règle des 100 % sur PUT /beneficiaries/updateTaux et seed du compte de test
Description
Le total des parts est imposé à 100 % (non documenté) ; le compte de test porte 10 % + 19 %, donc aucune répartition ne peut y être enregistrée.
Priorité
P1
Responsable
Backend
Statut
Contourné (refus explicite côté application)
Dépendances
Re-seed du compte de test.
Échéance cible
Lot 2
P1-G#27 (nouvelle fenêtre)P1 · hauteContourné côté app
Publier LienParenteEnum et SexeEnum

POST /beneficiaries

Description
LienParenteEnum n'accepte que Conjoint, Enfant, Ascendant ; le produit propose aussi « frère/sœur » et « autre ». SexeEnum : Masculin / Féminin
Impact
Deux relations repliées sur « Ascendant » avec indicateur à l'écran.
Priorité
P1
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 2
P2.13#32 (nouvelle fenêtre)P2 · normaleContourné côté app
Format de date de POST /beneficiaries
Description
Seule la forme compacte AAAAMMJJ est acceptée ; JJ/MM/AAAA (le format que l'endpoint renvoie en lecture) répond 400, les formes ISO 422.
Priorité
P2
Responsable
Backend
Statut
Contourné (l'application crée les bénéficiaires)
Échéance cible
Lot 6
P3.19#47 (nouvelle fenêtre)P3 · ultérieureOuvert
État d'une demande de retrait d'ayant droit

DELETE /ayantDroits/{id}/demandeSuppression

Description
Corps multipart déclaré sans aucun champ ; 500 sur identifiant inconnu ; l'ayant droit continue d'être renvoyé sans indicateur après la demande.
Impact
L'état « en attente » est maintenu localement sur l'appareil.
Priorité
P3 (moyen)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 6
P2.8#36 (nouvelle fenêtre)P2 · normaleContourné côté app
Énumérations déclarées « texte libre »

(partagé avec Carte Flash Amana)

Description
Réponses médicales « Oui »/« Non » là où la documentation annonce des booléens ; statut de la carte Flash vaut la chaîne "false".
Priorité
P2
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 4

Menu

P0-L#3 (nouvelle fenêtre)P0 · critiqueOuvertbloquant pour la mise en production
Servir GET /documents à tout souscripteur
Description
500 dès que l'appelant n'est pas adhérent santé (route interne bulletinV2DocumentUtil/{adherentId} : « cet adherent n'existe pas »), sur un catalogue de textes réglementaires publics
Impact
Écran mort pour la majorité des souscripteurs réels, là où la réglementation impose la mise à disposition. Découvert en exécutant les parcours E2E.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2. Attendu : servir le catalogue à tout compte authentifié, remonter un 404 amont en 404
P0-H#4 (nouvelle fenêtre)P0 · critiqueOuvertbloquant pour la mise en production
URL téléchargeable pour les documents utiles
Description
fichier est un chemin de fichier serveur (opt/amana-digitale-preprod/…) ; GET /assets?path= répond 404
Impact
La liste s'affiche, aucun document n'est ouvrable ; bouton masqué ; quatre boutons « documents » de contrat et de sinistre bloqués par la même absence.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2. Attendu : une route de téléchargement et un identifiant par document
P3.16#49 (nouvelle fenêtre)P3 · ultérieureOuvert
Localiser le contenu éditorial

/a-propos-amana/sos, /documents, /actes/groups

Description
accept-language ignoré
Impact
En arabe, titres traduits autour de contenus français. Aucun contournement possible.
Priorité
P3 (moyen)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 6
P3.6#48 (nouvelle fenêtre)P3 · ultérieureOuvert
GET /garanties/{codeProduit} renvoie des valeurs par formule
Description
Le modèle attend une valeur unique ; la fiche produit Santé renvoie guarantees: [] et force le repli sur cet endpoint.
Priorité
P3 (mineur)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 6
P2.6#37 (nouvelle fenêtre)P2 · normaleContourné côté app
Téléversements non déclarés multipart/form-data

(partagé avec Remboursements) — POST /nousContacter, POST /refunds, DELETE /ayantDroits/{id}/demandeSuppression

Description
Champs documentés nulle part ; /nousContacter répond 500 « Required part 'nom' is not present » sur champ manquant.
Priorité
P2
Responsable
Backend
Statut
Contourné (contrats écrits à la main d'après les essais)
Échéance cible
Lot 6

Souscription

P1-A#20 (nouvelle fenêtre)P1 · hauteContourné côté app
Ne plus répondre « succès » sur un échec (V8b)

POST /souscriptions/voyage

Description
201 success: true avec un contratId qui répond ensuite 404. Le backend indique que le contrôle est fait en amont sur la création de l'assuré principal ; un contrôle côté appelant ne remplace pas une validation côté API
Impact
Relecture systématique de GET /contrats/{id} après chaque souscription (un aller-retour par vente), à retirer dès correction.
Priorité
P1
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 4. Attendu : 400/404 avec le motif quand une personne ou un contrat référencé n'existe pas
P1-B#21 (nouvelle fenêtre)P1 · hauteOuvert
Rendre la souscription Voyage atomique (V8c)

POST /personnes/assure → POST /souscriptions/voyage → POST /personnes/membre-assure

Description
Trois appels enchaînés sans transaction ni annulation ; rattacher un membre à un contrat inexistant → 500 Cannot invoke "…toEntity()" because "dto" is null.
Impact
Une coupure laisse un contrat vendu pour N voyageurs mais n'en couvrant qu'une partie. Risque assumé, le contrat restant impayé.
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4. Attendu, par ordre de préférence : membres dans le payload de souscription ; à défaut, une annulation d'un contrat non payé ; dans tous les cas, 400/404 au lieu de 500
P1-C#22 (nouvelle fenêtre)P1 · hauteContourné côté app
Valider réellement les champs obligatoires (V5)

POST /simulation-voyage

Description
age omis → 200 avec un prix plausible mais faux ; destinationId omis → bascule silencieuse sur une autre destination ; dateEffet/dateFin omis → 500 « date must not be null »
Priorité
P1
Responsable
Backend
Statut
Contourné (appel émis seulement une fois tous les champs réunis)
Échéance cible
Lot 4
P1-D#23 (nouvelle fenêtre)P1 · hauteArbitrage attendu
Plafonnement de la prime Famille au 7ᵉ voyageur (V13)
Description
La prime cesse d'augmenter au-delà de 7 personnes ; avec la règle métier « 2 adultes + 8 enfants », une famille de 10 paie le prix de 7. Confirmé par le backend comme comportement attendu.
Impact
Seul point ouvert à impact financier direct.
Priorité
P1
Responsable
Amana (décision A2)
Statut
Arbitrage.
Échéance cible
Lot 1
P1-E#24 (nouvelle fenêtre)P1 · hauteOuvert
Corriger les primes négatives (V12)

POST /simulation-voyage (Groupe)

Description
Effets de bord de la convention tarifaire appliquée au type Groupe, dont des primes négatives renvoyées en succès.
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4
P1-J#25 (nouvelle fenêtre)P1 · hauteOuvert
Signaler un compte sans enregistrement souscripteur

GET /auth/me, POST /souscriptions

Description
Un compte de test ne renvoie ni personneId ni bloc souscripteur dans /auth/me alors que /auth/login renvoie personne_id ; POST /souscriptions exige personneId.
Impact
Le client remplit tout le tunnel et n'obtient que « Paiement non abouti » alors que rien n'a été créé ; « Oui, je suis l'assuré » ne préremplit presque rien.
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2. Attendu : refuser l'entrée dans le tunnel avec un motif nommé, et provisionner le compte
P2.11#34 (nouvelle fenêtre)P2 · normaleOuvert
Accepter un professionId sur POST /personnes/assure

GET /professions

Description
profession en chaîne libre ; 354 professions arrivent non triées
Priorité
P2
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 6
P3.3#50 (nouvelle fenêtre)P3 · ultérieureOuvert
Aucun code promotionnel valide en base

POST /promoCode/validate (partagé avec Santé – Souscription)

Description
Tout code répond 409 ; la simulation hors santé ignore un coupon inconnu en silence, la Santé le refuse.
Priorité
P3 (moyen)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 6
P3.14#51 (nouvelle fenêtre)P3 · ultérieureOuvert
Indicateur de formule recommandée

POST /simulation-voyage

Description
Demande restée sans réponse ; un champ recommandee: true est apparu depuis sur list_formule sans annonce.
Priorité
P3 (mineur)
Responsable
Backend
Statut
Ouvert (à confirmer et documenter)
Échéance cible
Lot 6
A14#9 (nouvelle fenêtre)P1 · hauteOuvertbloquant pour la mise en production
Création Accident en groupe en 409

POST /souscriptions (types 533 / 529)

Description
Avec le prix issu de la simulation du backend et la règle de typeContratId communiquée par le backend, la création en groupe répond 409 Bad Request sans message.
Impact
Le produit Accident n'est pas vendable en groupe
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2
A11#59 (nouvelle fenêtre)P1 · hauteOuvert
Idempotence et compensation
Description
Aucune idempotence sur /souscriptions, /souscriptions/voyage, /modePaiement/* ; aucune compensation (DELETE) sur un contrat non payé.
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4. Attendu : accepter un en-tête Idempotency-Key

Paiement

P0-M#5 (nouvelle fenêtre)P0 · critiqueOuvertbloquant pour la mise en production
Revenir dans l'application après le 3-D Secure

POST /modePaiement/CIB (returnUrl)

Description
Après un règlement réussi, Satim redirige vers site-test.amana.dz, le site vitrine, au lieu du lien profond de l'application. Vérifié sur des paiements réellement encaissés, sur les quatre produits.
Impact
Le client reste dans le navigateur, sur une page sans rapport avec sa souscription, et doit fermer la session à la main. Dernier obstacle entre un paiement qui marche et un paiement présentable. Bloque la validation client du sprint 2.
Priorité
P0
Responsable
Backend / Satim
Statut
Ouvert.
Échéance cible
Lot 1. À traiter en même temps : remplacer le marchand de test tiers par Amana
P0-N#6 (nouvelle fenêtre)P0 · critiqueContourné côté appbloquant pour la mise en production
confirmPayment nie le paiement qu'il vient d'encaisser

GET /modePaiement/confirmPayment/{orderId}

Description
valid: false, tous champs nuls, sur un contrat passé à ENCAISSE avec police émise ; deux appels à plusieurs minutes d'intervalle, même réponse
Impact
Sans le contournement (relecture du contrat), tout paiement réussi s'afficherait en échec ; avec, jusqu'à 90 s avant l'écran de succès.
Priorité
P0
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 1
P0-B#7 (nouvelle fenêtre)P0 · critiqueOuvertbloquant pour la mise en production
Paiement Points verts répond 500

GET /points-verts/paiement/{quittanceId}

Description
500 systématique depuis le premier signalement, reproduit pendant près de deux mois ; 500 nu sur solde insuffisant ; c'est un GET qui exécute un débit
Impact
Le cas nominal n'a jamais pu être exécuté ; un balayage en lecture seule a déclenché une tentative de paiement.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 1. Attendu : 404 sur quittance inconnue, 409 sur solde insuffisant, méthode POST
P0-C#8 (nouvelle fenêtre)P0 · critiqueOuvertbloquant pour la mise en production
Exposer la confirmation du paiement à la livraison

confirmPayment/livraison/{quittanceId}

Description
L'endpoint décrit par l'équipe backend (« le passage à Encaissé se fait dans confirmPayment/livraison ») n'existe pas dans la spécification.
Impact
L'application ne peut pas afficher le passage du contrat à l'état encaissé.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 1
CL-DAHABIA
Cartes Dahabia de test

(prérequis client, hors outil de ticketing)

Description
Demandées dès la réception des cartes CIB, jamais transmises ; la page de paiement Dahabia est atteinte mais aucun règlement n'a pu être exécuté.
Responsable
Amana
Statut
Ouvert.
Échéance cible
Avant l'APK « ready for client testing » du sprint 2.

Contrats

P2.5#35 (nouvelle fenêtre)P2 · normaleOuvert
GET /contrats n'expose aucun numéro de police

Voyage, Accident, Scolaire

Priorité
P2
Responsable
Backend
Statut
Ouvert (champ omis à l'écran)
Échéance cible
Lot 6
P3.5#53 (nouvelle fenêtre)P3 · ultérieureOuvert
Le détail de contrat est incomplet

GET /contrats/{id}

Description
Personnes assurées, libellé du moyen de paiement et valeur par garantie sans source ; second appel GET /coverages/{produitId} à chaque ouverture.
Priorité
P3 (moyen)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 6
P3.17#54 (nouvelle fenêtre)P3 · ultérieureOuvert
Envoi multipart pour le justificatif de résiliation

POST /avenant/resiliation

Description
AvenantDTO.justificatif est une chaîne base64 là où tous les autres téléversements sont multipart ; 500 sur contrat inconnu, divulguant un chemin interne
Impact
La demande part avec son motif et son commentaire, sans ses pièces jointes ; produire du base64 exigerait une nouvelle dépendance native côté mobile.
Priorité
P3 (sévérité majeure)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2
P3.18#55 (nouvelle fenêtre)P3 · ultérieureOuvert
Publier la liste des motifId de résiliation
Description
Entier sans énumération documentée ; proposer GET /avenant/motifs.
Priorité
P3 (moyen)
Responsable
Backend
Statut
Ouvert (motifs codés en dur)
Échéance cible
Lot 6
P2.8#36 (nouvelle fenêtre)P2 · normaleContourné côté app
Statut de la carte Flash en texte libre

POST /carteFlash/checkTicketValidation (voir Compte)

Description
statut vaut la chaîne "false"
Impact
Liste blanche côté application ; tout statut inconnu est traité comme un refus.
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 4

Sinistres

P0-K#10 (nouvelle fenêtre)P0 · critiqueOuvertbloquant pour la mise en production
Exposer le référentiel « produit » de POST /claims
Description
produit doit correspondre à un référentiel « produit sinistre » qu'aucun endpoint mobile n'expose ; dix valeurs candidates (codes produit, identifiants, libellés) échouent sur Attempt to read property "produit_sinistre_id" on null. Piège associé : le validateur nomme date_naiss, date_sinistre, path_files alors que l'endpoint lit dateNaiss, dateSinistre, pieces
Impact
La déclaration de sinistre n'est jamais déposée ; l'écran affichait un succès sans rien envoyer. Le point le plus trompeur du périmètre. Bloque la validation client du sprint 3.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2. Attendu : le référentiel ou la liste des valeurs acceptées, et des noms de champs alignés
P3.12#11 (nouvelle fenêtre)P3 · ultérieureArbitrage attendubloquant pour la mise en production
Rattacher le chat du service client à un sinistre

GET /chat/history, POST /chat/send

Description
Aucun paramètre de dossier ; tous les messages du compte partagent un identifiant de conversation unique ; updatedAt déclaré mais absent.
Impact
La même conversation s'affiche sous chaque sinistre ; un message envoyé depuis un dossier apparaît sous tous les autres.
Priorité
P3 (sévérité bloquante)
Responsable
Produit / Backend (décision A3)
Statut
Arbitrage.
Échéance cible
Lot 3. Deux issues : un paramètre sinistreId (l'écran fonctionne alors tel quel), ou un fil unique déplacé vers le menu

Remboursements

P0-I#12 (nouvelle fenêtre)P0 · critiqueContourné côté appbloquant pour la mise en production
Relever la limite de téléversement

tous les téléversements (POST /refunds, /nousContacter, profil santé)

Description
Plafond d'environ 1 Mio par fichier (valeur Spring par défaut) ; dépassement → 500 « Maximum upload size exceeded » sans nom de champ ni limite. Mesuré : 1 024 Kio accepté, 1 200 Kio refusé, deux fichiers de 600 Kio dans le même appel acceptés (plafond par fichier)
Impact
Une photo de justificatif prise avec un téléphone récent (3 à 5 Mo) ne passe pas : le cas nominal d'une fonction livrée. Atténué côté application (compression, refus expliqué)
Priorité
P0
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 2 (le plus urgent du lot). Attendu : max-file-size porté à 10 Mo, et un 413 ou un 422 nommant la pièce et la limite
P0-G#19 (nouvelle fenêtre)P0 · critiqueContourné côté app
Annoncer les renommages de champ

POST /refunds

Description
Le champ portant l'acte est passé de type à codeActe côté serveur sans préavis ; l'ancien nom répond 404 « Acte non trouvé » ; la spécification documente le champ retiré et omet celui qui fonctionne.
Impact
Une déclaration codée d'après l'indication du backend échouait silencieusement. Un contrat consommé par une autre équipe ne peut pas changer sans annonce.
Priorité
P0
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 4
P3.1#56 (nouvelle fenêtre)P3 · ultérieureOuvert
GET /actes/groups sans catégorie ni illustration, codeActe non unique
Description
Les 8 prestations sociales partagent le code Evenement ; catégorie et illustration déduites côté mobile.
Priorité
P3 (moyen)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 6
P3.11#57 (nouvelle fenêtre)P3 · ultérieureOuvert
GET /refunds/{id}/documents : régression 200 → 404
Description
Relevée par le contrôle automatisé ; endpoint non consommé.
Priorité
P3 (majeur)
Responsable
Backend
Statut
Ouvert (rétablir ou acter le retrait)
Échéance cible
Lot 6

Santé Individuelle · Santé Famille · Santé Groupe

P0-J#13 (nouvelle fenêtre)P0 · critiqueOuvertbloquant pour la mise en production
Publier le contrat de POST /members/addPieceJointe

Compléter profil santé (3 segments)

Description
Annoncé prêt par l'équipe backend ; la spécification déclare un corps multipart sans aucun champ ; toute requête répond 422 « The given data was invalid. » sans nommer de champ ; plus de 25 noms de parties testés, en fichier comme en texte ; une seule propriété identifiée (rib, String) par fuite d'erreur de conversion.
Impact
Le dépôt des pièces du profil santé n'est pas branchable ; les fichiers réellement sélectionnés n'ont nulle part où aller.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2. Attendu : la liste des parties (un curl fonctionnel suffirait) ou un validateur qui nomme les champs manquants, comme le fait /refunds
§31#14 (nouvelle fenêtre)P0 · critiqueOuvertbloquant pour la mise en production
POST /ayantDroits répond un 500 nu

Compléter profil santé (3 segments)

Description
500 quels que soient les champs, aucun champ nommé
Impact
Les personnes à charge sont collectées, conservées dans le brouillon, jamais soumises.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2
P3.10#15 (nouvelle fenêtre)P3 · ultérieureOuvertbloquant pour la mise en production
GET /members/bulletinAdhesion répond 500 et ne répond plus au-delà de 12 s

Compléter profil santé (3 segments)

Impact
L'écran existe, rien à télécharger ; le message de succès de la validation d'adhérent réclame de renvoyer ce bulletin signé, étape impossible de bout en bout ; le profil reste non activé.
Priorité
P3 (sévérité bloquante)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2
P1-H#28 (nouvelle fenêtre)P1 · hauteOuvert
Rendre exploitable le devis de renouvellement Santé

POST /avenants/{contratId}/renouvellements/sante/devis — Contrat santé (Individuelle, Famille)

Description
409 « problem devis Renouvellement Sante » à tout payload : six contrats (individuel et famille, encaissés et non payés), les deux valeurs de modifyDevis, types 530 et 531, formule en libellé et en identifiant. Aucun champ nommé, aucune raison
Impact
Le renouvellement a une interface complète et rien à appeler ; seul reliquat de donnée simulée de l'application.
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Dépendances
Décision A5.
Échéance cible
Lot 3. Attendu : un message exploitable, ou les préconditions par écrit (états renouvelables, fenêtre de renouvellement)
P1-I#29 (nouvelle fenêtre)P1 · hauteOuvert
Corriger le DTO d'erreur de l'adjonction Santé

POST /avenants/{contratId}/adjonctions/sante/devis

Description
Le champ error est typé int alors que le service amont renvoie la chaîne "409 :" ; la passerelle plante sur sa propre gestion d'erreur et répond 500, masquant le refus métier réel.
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 3
P3.13#58 (nouvelle fenêtre)P3 · ultérieureArbitrage attendu
Confirmer l'absence de niveau Groupe pour la Santé

Santé Groupe – Contrat santé

Description
Seuls les types 530 (Individuel) et 531 (Famille) existent.
Priorité
P3 (moyen)
Responsable
Amana (décision A4)
Statut
Arbitrage.
Échéance cible
Lot 3
A13#61 (nouvelle fenêtre)P2 · normaleOuvert
Montants en flottants non arrondis

POST /souscriptions/devis-souscription-sante

Description
primeNetteSansReduction: 16164.146341463415, primeNetteSansReductionMensuel: 1347.0121951219512 ; reduction: false alors que les variantes avec et sans réduction diffèrent
Priorité
P2
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4. Attendu : décimaux arrondis à la source

Transverse

P2.3#39 (nouvelle fenêtre)P2 · normaleContourné côté app
Cinq formats de dates coexistent
Description
Cinq formats selon les endpoints ; /beneficiaries renvoie JJ/MM/AAAA et refuse ce même format en écriture.
Priorité
P2
Responsable
Backend
Statut
Contourné (analyseurs multiples)
Échéance cible
Lot 4. Attendu : ISO 8601 partout
P2.7#40 (nouvelle fenêtre)P2 · normaleContourné côté app
Types et casse divergents

/destination/getGlobal, /auth/refresh, /members

Description
personne_id chaîne vs personneId entier ; {key, value} au lieu de {id, label} ; PoliceId en PascalCase ; code_reference / codeReference selon le résultat
Priorité
P2
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 6
P2.9#41 (nouvelle fenêtre)P2 · normaleOuvert
Fournir un exemple de requête fonctionnelle par endpoint d'écriture
Description
Demande formelle restée sans réponse ; 41 opérations sur 107 déclarent required: [] alors que l'API valide strictement.
Impact
Cause racine du mode essai/erreur ; la mesure au meilleur rapport coût/effet du registre. Remplir les required rendrait le générateur de code utilisable et supprimerait 1 968 lignes maintenues à la main.
Priorité
P2 (proposée P1)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4
P2.10#42 (nouvelle fenêtre)P2 · normaleOuvert
Harmoniser les enveloppes de réponse en écriture

/nousContacter, /refunds, /members, /chat/send, /auth/refresh

Description
Cinq formes d'enveloppe d'erreur, trois formats d'horodatage, messages de validation en français.
Priorité
P2
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4
P3.8#45 (nouvelle fenêtre)P3 · ultérieureOuvert
GET /assets sans path → 500 puis 404
Priorité
P3 (mineur)
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 6
A10#17 (nouvelle fenêtre)P0 · critiqueOuvertbloquant pour la mise en production
Servir tout le JSON en UTF-8
Description
Les erreurs arrivent en application/json;charset=ISO-8859-1 (« Acc?s refus? » une fois décodé en UTF-8)
Impact
Le message serveur affiché en repli à l'utilisateur est illisible, sur le chemin d'erreur. Aucun contournement propre.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 1. Un en-tête suffit
A12#60 (nouvelle fenêtre)P1 · hauteOuvert
Jeton client portant 19 rôles
Description
Le JWT d'un simple assuré porte 19 rôles dont des périmètres de back-office ; au moins un est inerte sur cette passerelle. Questions : les 18 autres sont-ils inertes partout ? Le compte de test est-il représentatif ?
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4. Attendu : moindre privilège
A15#62 (nouvelle fenêtre)P2 · normaleOuvert
500 divulguant un chemin de service interne

/avenant/resiliation

Priorité
P2
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4
A16#63 (nouvelle fenêtre)P1 · hauteOuvert
Remplir les required de la spécification et corriger les cinq écarts actifs
Description
Par ordre de nocivité : POST /refunds (documente type, retiré ; omet codeActe) → PUT /members (questionnaire plat au lieu d'imbriqué) → GET /auth/me (5 champs au lieu de 18 + 4 objets) → /refunds et /claims (enveloppe retirée) → /simulation-voyage (type: string au lieu de JSON). Documenter GET /produits/{id}/detail. Déclarer les 4xx réellement renvoyés. Ouvrir /api-docs au compte mobile ou publier la spécification dans le dépôt.
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4

Prérequis côté client (hors outil de ticketing)

Prérequis côté client
Réf.BesoinBloqueResponsable
CP-01Compte Google Play StorePublication AndroidAmana
CP-02Compte App Store (organisation, D-U-N-S, certificats)Build iOS, TestFlight, publicationAmana
CP-03Décision : authentification par téléphone (A1)Sprint 1 — inscriptionAmana
CP-04Décision : plafond de la prime Voyage Famille (A2)Sprint 3 — VoyageAmana
CP-05Décision : chat par sinistre ou fil unique (A3)Sprint 3 — SinistresProduit
CP-06Décision : périmètre Santé Groupe (A4)Sprint 5Amana
CP-07Décision : renouvellements et avenants Santé (A5)Sprint 5Amana
CP-08Cartes Dahabia de testSprint 2 — paiement DahabiaAmana
CP-09Compte de test jetable en pré-production✅ Fourni : khaddoucheTest@amana.dz, déjà utilisé pour des paiements réels ; il reste à y rejouer la résiliation et le retrait d'ayant droitAmana / Backend
CP-10Accès à une boîte mail de test ou OTP fixe en pré-productionRecette des parcours inscription et mot de passe oubliéAmana / Backend
CP-11URL de l'API de productionBuild de productionAmana
CP-12Instance Satim marchande au nom d'AmanaPaiement carte en productionAmana / Satim
CP-13Validation de l'APK de référence (section 1.4), qui remplace le livrable précédent non validéClôture des sprints 1 et 2Amana

Section 3.3 : Outil de ticketing

Le reporting ne présente que ce qui sert au suivi et à la priorisation ; le détail complet de chaque ticket est dans l’outil de ticketing.

Outil de ticketing AMANA-MOBILE

71 tickets, un par référence des sections 3.0 et 3.1, rattachés au projet de leur workflow. L’outil fait foi pour le statut.

Ouvrir l’outil
  • Outil : https://amana-support.shiftin-demo.com/ — un ticket par ligne des sections 3.0 et 3.1 (55 demandes du registre plus les constats A9#1(ticket dans l’outil de ticketing, nouvelle fenêtre) à A24#70(ticket dans l’outil de ticketing, nouvelle fenêtre) et les questions Q1-Q9#71(ticket dans l’outil de ticketing, nouvelle fenêtre)), rattaché au projet correspondant à la clé du workflow (par exemple paiement-cib, sinistres, sante-individuelle-completer-profil-sante), titre préfixé par la référence stable. Chaque ticket porte l'endpoint, le comportement observé, le comportement attendu, l'impact et les références aux documents internes. Les accès nominatifs de l'équipe backend sont transmis séparément.
  • Le détail complet de chaque ticket est disponible dans l'outil de ticketing. Le présent reporting ne présente que les informations nécessaires au suivi et à la priorisation ; en cas d'écart entre les deux, l'outil fait foi pour le statut.
  • Annexes techniques exploitables directement : le journal des écarts de contrat (33 sections, avec les commandes curl de reproduction) docs/BACKEND_CHANGES_wire-remaining-app-flows.md ; le registre des anomalies et l'ordre de résorption API_Remaining_Tasks_Issues.md ; l'audit « API réelle vs spécification » audit-api-reel-vs-specification.md ; les questions sur les comptes migrés docs/backend-requests/QUESTIONS_AUTH_ATTACH.md.
  • Reproduction et surveillance : yarn api:probe (54 endpoints de lecture, sans écriture), yarn api:contract (comparaison au contrat figé, distinction entre rupture sur endpoint consommé et dérive sur endpoint non branché), scripts/capture-live-mutations.mts --dry-run --tier 4 (les 31 payloads réels de l'application, rien d'envoyé).
  • Dashboard de reporting : https://reporting-amana.164-132-116-139.nip.io/ (hôte provisoire jusqu'au rattachement du sous-domaine reporting-amana.octera.tech), sections Livraison APK, QA, Statut, Timeline, Planning ; filtres par sprint et par workflow dans l'URL ; export CSV et Excel.
  • Numéros de tickets : à reporter dans les colonnes « N° » des sections 3.0 et 3.1 et dans le dashboard au fur et à mesure de leur création.

Annexes techniques

Document confidentiel — OCTERA / SHIFTIN pour Amana Assurances. Source de données du dashboard de reporting du board. Toute mise à jour de ce document doit préserver la règle de datation : aucune date en dehors des sections 1.4 et 2.3.