Skip to content

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 email 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.