Problème d'affichage des factures sur Cywise¶
Sylvain Moreaux, Oppscience, n'a plus accès à ses factures depuis app.cywise.io. Voir le ticket FreshDesk #8991.
De plus, les offres affichées semblent farfelues : les prix sont en dollars...
Analyse¶
Nous avons 2 clients qui payent en passant par Stripe : smoreau@oppscience.com et ndr@elephantastic.io.
Quand j'avais converti les informations Stripe pour passer de la v0.x à la v1.x de Cywise, j'avais ces infos pour ces 2 clients :
| id | name | stripe_id | stripe_tx_id | |
|---|---|---|---|---|
| 46 | Elephantastic | ndr@elephantastic.io | cus_Rn7oy3DOjeicTv | |
| 53 | Sylvain Moreau | smoreau@oppscience.com | cus_RNWQiA86rsWNjh |
Je n'ai qu'une souscription dans la table subscriptions : celle de ndr@elephantastic.io.
Donc pour Oppscience, il faut ajouter la souscription pour que cela fonctionne.
Et pour Elephantastic, je pense que le problème vient du fait que le plan (#2) a changé d'identifiant
de tarif ce qui ne correspond plus à ce que Stripe a de son côté pour cette souscription.
Résolution¶
Je vais donc faire des requêtes SQL afin de recréer les éléments manquants dans la base de données. Je veux que cet enchaînement de requêtes soit idempotent afin de le rejouer plus tard pour restaurer les informations si besoin.
Pour que ça fonctionne, la souscription doit être reliée à un plan qui a le bon price_id. Du coup,
je vais créer les plans de Oppscience et de Elephantastic avec les informations qui existaient
au moment de leur souscription (y compris le price_id). J'ai retrouvé la description dans la branche
0.x de la repo et le fichier resources/views/subscriptions/plans.blade.php.
Voici mon enchaînement de requêtes SQL :
-- ---------------------------------------------------------------------------
-- Retrouver l'ID du rôle 'essential'
SELECT id INTO @essential_role_id
FROM `roles`
WHERE `name` = 'essential';
-- Retrouver l'ID du rôle 'standard'
SELECT id INTO @standard_role_id
FROM `roles`
WHERE `name` = 'standard';
-- ---------------------------------------------------------------------------
-- Retrouver l'ID de l'utilisateur ndr@elephantastic.io
SELECT id INTO @elephantastic_user_id
FROM users
WHERE email = 'ndr@elephantastic.io';
-- Créer le plan Standard (400€/mois) de ndr@elephantastic.io s'il n'existe pas
INSERT INTO plans (`name`, features, monthly_price_id, active, role_id, monthly_price, currency)
SELECT
'Standard',
'20 serveurs, 12€/mois/serveur supplémentaire, Scanner de vulnérabilités (200 IP ou DNS), Honeypots (HTTP, HTTPS et SSH), Évènements de sécurité des serveurs, Métriques des serveurs, PSSI (chatbot), Rapports personnalisés',
'price_1QeeA0DHRqrzgOLGmijDTdnj',
0,
@standard_role_id,
400,
'€'
WHERE NOT EXISTS (
SELECT 1 FROM plans WHERE `name` = 'Standard' AND monthly_price_id = 'price_1QeeA0DHRqrzgOLGmijDTdnj'
);
UPDATE plans
SET
`description` = null,
features = '20 serveurs, 12€/mois/serveur supplémentaire, Scanner de vulnérabilités (200 IP ou DNS), Honeypots (HTTP, HTTPS et SSH), Évènements de sécurité des serveurs, Métriques des serveurs, PSSI (chatbot), Rapports personnalisés',
monthly_price_id = 'price_1QeeA0DHRqrzgOLGmijDTdnj',
active = 0,
role_id = @standard_role_id,
monthly_price = 400,
currency = '€'
WHERE `name` = 'Standard' AND monthly_price_id = 'price_1QeeA0DHRqrzgOLGmijDTdnj';
-- Retrouver l'ID du plan de ndr@elephantastic.io
SELECT id INTO @elephantastic_plan_id
FROM plans
WHERE monthly_price_id = 'price_1QeeA0DHRqrzgOLGmijDTdnj';
-- Créer la souscription de ndr@elephantastic.io s'elle n'existe pas
INSERT INTO subscriptions (billable_type, billable_id, plan_id, vendor_slug, vendor_customer_id, vendor_subscription_id, `status`, cycle, seats)
SELECT
'user',
@elephantastic_user_id,
@elephantastic_plan_id,
'stripe',
'cus_Rn7oy3DOjeicTv',
'sub_1QtXaYDHRqrzgOLGjCwvwQ3f',
'active',
'month',
1
WHERE NOT EXISTS (
SELECT 1 FROM subscriptions WHERE billable_type = 'user' AND billable_id = @elephantastic_user_id
);
UPDATE subscriptions
SET
plan_id = @elephantastic_plan_id,
vendor_slug = 'stripe',
vendor_customer_id = 'cus_Rn7oy3DOjeicTv',
vendor_subscription_id = 'sub_1QtXaYDHRqrzgOLGjCwvwQ3f',
`status` = 'active',
cycle = 'month',
seats = 1
WHERE billable_type = 'user' AND billable_id = @elephantastic_user_id;
-- ---------------------------------------------------------------------------
-- Retrouver l'ID de l'utilisateur smoreau@oppscience.com
SELECT id INTO @oppscience_user_id
FROM users
WHERE email = 'smoreau@oppscience.com';
-- Créer le plan Essentiel (150€/mois) de smoreau@oppscience.com s'il n'existe pas
INSERT INTO plans (`name`, features, monthly_price_id, active, role_id, monthly_price, currency)
SELECT
'Essentiel',
'5 serveurs, 15€/mois/serveur supplémentaire, Scanner de vulnérabilités (100 IP ou DNS), Honeypots (HTTP, HTTPS et SSH), Évènements de sécurité des serveurs, Métriques des serveurs, PSSI (chatbot), Rapports personnalisés',
'price_1Qee99DHRqrzgOLGOfaVSPbt',
0,
@essential_role_id,
150,
'€'
WHERE NOT EXISTS (
SELECT 1 FROM plans WHERE `name` = 'Essentiel' AND monthly_price_id = 'price_1Qee99DHRqrzgOLGOfaVSPbt'
);
UPDATE plans
SET
`description` = null,
features = '5 serveurs, 15€/mois/serveur supplémentaire, Scanner de vulnérabilités (100 IP ou DNS), Honeypots (HTTP, HTTPS et SSH), Évènements de sécurité des serveurs, Métriques des serveurs, PSSI (chatbot), Rapports personnalisés',
monthly_price_id = 'price_1Qee99DHRqrzgOLGOfaVSPbt',
active = 0,
role_id = @essential_role_id,
monthly_price = 150,
currency = '€'
WHERE `name` = 'Essentiel' AND monthly_price_id = 'price_1Qee99DHRqrzgOLGOfaVSPbt';
-- Retrouver l'ID du plan de smoreau@oppscience.com
SELECT id INTO @oppscience_plan_id
FROM plans
WHERE monthly_price_id = 'price_1Qee99DHRqrzgOLGOfaVSPbt';
-- Créer la souscription de smoreau@oppscience.com s'elle n'existe pas
INSERT INTO subscriptions (billable_type, billable_id, plan_id, vendor_slug, vendor_customer_id, vendor_subscription_id, `status`, cycle, seats)
SELECT
'user',
@oppscience_user_id,
@oppscience_plan_id,
'stripe',
'cus_RNWQiA86rsWNjh',
'sub_1QiBy7DHRqrzgOLGk5s0SOeP',
'active',
'month',
1
WHERE NOT EXISTS (
SELECT 1 FROM subscriptions WHERE billable_type = 'user' AND billable_id = @oppscience_user_id
);
UPDATE subscriptions
SET
plan_id = @oppscience_plan_id,
vendor_slug = 'stripe',
vendor_customer_id = 'cus_RNWQiA86rsWNjh',
vendor_subscription_id = 'sub_1QiBy7DHRqrzgOLGk5s0SOeP',
`status` = 'active',
cycle = 'month',
seats = 1
WHERE billable_type = 'user' AND billable_id = @oppscience_user_id;
Cela a résolu un problème : les 2 clients ont bien une offre maintenant. Mais j'ai toujours une erreur 500 pour l'accès aux factures.
Je me rends compte que les clés Stripe sont à 3 endroits dans la config de
Laravel et mis en place à un seul endroit dans la table app_config.
Je rajoute les 2 autres endroits et ça résout le problème.