StripeSubscriptionsObjectsIoT, la consolidation continue
de s'appuyer sur ce fichier. Deux fichiers sont créés, tous deux demandés en mai. Les neuf
modifications complètent l'analyse : elles ajoutent ce qui manque, elles ne remplacent rien.
Cinq modifications sur neuf sont des demandes de Franck, formulées en mai et reprises ici dans ses termes. Les quatre autres sont des propositions issues d'une relecture du modèle de données.
Franck — 21 mai, 13 h 31 « oui il faut créer un fichier historique »→ modification 9,StripeSubscriptionsHistory
Franck — 22 mai, 13 h 58 « pour l'analyse je pense qu'il y aura juste un fichier qui va alimenter les détails avec IDStripeSubscriptions, Descriptions, IDPrix, Qte, PeriodeDebut, PeriodeFin »→ modification 8,StripeInvoicesDetails— nom choisi par Franck le même jour à 14 h 54, structure complétée à 14 h 52 et validée par lui
Franck — 22 mai, 15 h 01 « il faut ajouter un flag dans SSO pour les soft delete, parce que si il y a résiliation, les jauges ne devraient plus être dans SSO après pour ne pas être pris en compte dans la prochaine facturation »→ modification 3,IsResilie
Franck — 22 mai, 15 h 17 « je pense qu'il faut quand même ajouter l'IDPrix dans SSO sans ça on ne sait pas l'historique de changement de plan »→ modification 2,IDStripePrices
Franck — 22 mai, 15 h 25 « notre liaison objet vers SSO est 1,1 il faut mettre à 1,n »→ modification 1, la cardinalité
| N° | Objet | Motif |
|---|---|---|
| 4 | SSO.IDStripeInvoices |
Sans elle, une facture contestée n'est pas justifiable a posteriori. Seule modification qui n'était pas envisagée en mai. |
| 5 | StripeSubscriptions.EndDate nullable |
Absence de date = abonnement en cours sans terme connu. |
| 6 | StripeInvoices.IDStripeSubscriptions nullable |
Une facture de pack SMS n'a pas d'abonnement. |
| 7 | Index composé sur SSO | C'est le parcours exact de la facturation mensuelle. |
Dans l'ordre d'exécution. Les modifications portant sur
StripeSubscriptionsObjectsIoT servent les deux modèles de client — gestionnaire
mensuel et client final annuel — ce fichier étant commun aux deux.
ObjectsIoT ↔ StripeSubscriptionsObjectsIoT
à modifier(0,1) côté ObjectsIoT.ObjectsIoT, la
cardinalité passe de (0,1) à (0,n) ; côté
StripeSubscriptionsObjectsIoT elle reste (1,1). La clé
IDObjectsIoT passe d'unique à clé avec doublons.StripeSubscriptionsObjectsIoT.IDStripePrices
à créerStripePrices.StripeSubscriptionsObjectsIoT.IsResilie
à créerStripeSubscriptionsObjectsIoT.IDStripeInvoices
à créerStripeInvoices, renseignée à la consolidation en même temps que le passage du
drapeau de traitement.StripeSubscriptions.EndDate — accepter la valeur vide
à modifierStripeInvoices.IDStripeSubscriptions — accepter la
valeur vide à modifier0.0.
L'absence d'abonnement se code par une valeur vide, pas par un zéro qui pointerait vers un
abonnement inexistant.IDStripePurchaseSMS, avec IDCustomer en lien direct vers
le client.StripeSubscriptionsObjectsIoT
à créer(IDStripeSubscriptions, Processed).StripeInvoicesDetails
à créerLe détail d'une facture consolidée. Décidé le 22 mai sur proposition de Franck, qui l'a également nommé. Réaffirmé le 10 juin.
IDStripeInvoicesDetails Id. automatique, clé primaire
IDStripeSubscriptions FK → abonnement du gestionnaire
IDStripePrices FK → prix appliqué
Description Texte (libellé interne de la ligne)
Qte Numérique SIGNÉ
PeriodeDebut Date (début du cycle facturé)
PeriodeFin Date (fin du cycle facturé)
MontantProrata Monétaire SIGNÉ
Processed Booléen, défaut FALSE
IDStripeInvoices FK, valeur vide autorisée → facture émise
IDStripeSubscriptions pour retrouver l'historique d'un
gestionnaire, et IDStripeInvoices pour retrouver le détail d'une facture.Processed vaut TRUE dès l'écriture et IDStripeInvoices est renseignée
immédiatement. Les rubriques sont maintenues telles quelles afin de garder ouverte la possibilité
de passer plus tard à une alimentation au mouvement.
StripeSubscriptionsHistory
à créerL'historique au niveau abonnement. Demandé par Franck le 21 mai, structure arrêtée le même jour, jamais créé.
StripeSubscriptionsObjectsIoT porte le détail jauge ↔ abonnement ; celui-ci porte
le niveau au-dessus. Les deux sont complémentaires.IDStripeSubscriptionsHistory Id. automatique, clé primaire
IDCustomer FK → client
IDStripeSubscriptions FK historique — peut pointer vers une ligne supprimée
IDStripePrices FK → prix appliqué
StartDate Date
EndDate Date
EndReason Texte libre (trop cher, plus besoin, déménagement…)
Une fois les modifications portées dans l'analyse. Rien de ce qui fonctionne aujourd'hui n'est remis en cause.
C'est le seul endroit où la logique change, du fait de la modification 1.
IsResilie passe à TRUE — et une nouvelle ligne est créée. L'historique se conserve
au lieu de s'écraser.IDStripePrices à chaque création de ligne, avec le
prix effectivement appliqué.IDObjectsIoT garantit à elle seule qu'une jauge n'a
qu'une seule ligne d'abonnement. Après la modification 1, cette garantie n'existe plus au niveau
du fichier. La règle à tenir devient :
une jauge n'a jamais plus d'une ligne non résiliée à un instant donné — unicité sur
(IDObjectsIoT, IsResilie = FALSE). Toute création de ligne doit donc être précédée
de la clôture de la ligne active, dans la même opération. Sans ce contrôle, une jauge peut se
retrouver facturée deux fois sur le même cycle sans qu'aucune erreur ne remonte.
Trois écritures à ajouter dans un traitement qui existe déjà. Aucune logique existante n'est modifiée.
IDStripeInvoices sur les lignes facturées, au même
moment que le passage du drapeau de traitement.Aucun des deux ne bloque les neuf modifications ci-dessus.
Le passage à la facture consolidée du gestionnaire était en développement le 10 juin, une partie en local. Trois points restent à confirmer avant d'écrire quoi que ce soit :
Une jauge retirée en cours de cycle donne-t-elle lieu à une correction proratisée, ou le cycle entamé est-il dû en entier ? La question a été posée le 22 mai et n'a jamais été tranchée. La seconde règle supprimerait les lignes négatives et le calcul associé, le prorata restant appliqué à l'entrée. Sans effet sur les neuf modifications ; à trancher avant d'engager du développement sur ce point.
Identifié, non traité ici.
| Sujet | Nature | Statut |
|---|---|---|
| Supervision de la tâche planifiée — alerte en cas de non-exécution, réconciliation, rattrapage d'un cycle manqué | Développement | Ouvert depuis le 10 juin. Voir encadré ci-dessous. |
| Rejeu de la tâche planifiée — relancer la tâche ne doit pas produire une seconde facture | Développement | Se règle en vérifiant qu'aucune facture n'existe déjà pour ce gestionnaire sur cette
période — les dates sont déjà présentes dans StripeInvoices |
| Écran de consultation du détail d'une facture au portail | Développement | Rendu possible par les modifications 4 et 8. À planifier séparément — aucune page du portail n'est touchée par cette passe. |
| Transfert d'une sonde d'un client à un autre | Règle métier | Soulevé le 21 mai, jamais traité. La modification 1 le rend techniquement possible. |
Fichier StripePlans | Analyse | Il stocke le prix qu'utilise un abonnement. La modification 2 fait la même chose à un grain plus fin. Laissé en l'état, mais ne rien construire dessus. |
StripeInvoices portant déjà les dates de début et de fin de période, vérifier qu'une
facture n'existe pas déjà pour ce gestionnaire sur cette période suffit à rendre la tâche rejouable
sans risque de double facturation.
| N° | Fichier | Objet | Nature |
|---|---|---|---|
| 1 | ObjectsIoT ↔ StripeSubscriptionsObjectsIoT | Cardinalité et unicité | Modification |
| 2 | StripeSubscriptionsObjectsIoT | IDStripePrices | Création |
| 3 | StripeSubscriptionsObjectsIoT | IsResilie | Création |
| 4 | StripeSubscriptionsObjectsIoT | IDStripeInvoices | Création |
| 5 | StripeSubscriptions | EndDate — valeur vide autorisée | Modification |
| 6 | StripeInvoices | IDStripeSubscriptions — valeur vide autorisée | Modification |
| 7 | StripeSubscriptionsObjectsIoT | Index (IDStripeSubscriptions, Processed) | Création |
| 8 | StripeInvoicesDetails | Détail de facture (10 rubriques) | Création |
| 9 | StripeSubscriptionsHistory | Historique d'abonnement (7 rubriques) | Création |
Trois rubriques, un index et deux fichiers à créer ; trois propriétés à modifier. L'analyse est ouverte une seule fois.