#!/usr/bin/env php getEnvironment(); $dbConfig = $config->getDatabaseConfig(); echo "\n"; echo "=============================================================================\n"; echo " Création des Stripe Terminal Locations manquantes\n"; echo "=============================================================================\n"; echo "Environnement : " . strtoupper($env) . "\n"; echo "Base de données : " . $dbConfig['name'] . "\n"; echo "\n"; try { // Initialiser la base de données avec la configuration Database::init($dbConfig); $db = Database::getInstance(); // StripeService est un singleton $stripeService = StripeService::getInstance(); // 1. Identifier les comptes sans Location echo "📋 Recherche des comptes Stripe sans Location...\n\n"; $stmt = $db->query(" SELECT sa.id, sa.fk_entite, sa.stripe_account_id, sa.stripe_location_id, e.encrypted_name, e.adresse1, e.adresse2, e.code_postal, e.ville FROM stripe_accounts sa INNER JOIN entites e ON sa.fk_entite = e.id WHERE sa.stripe_account_id IS NOT NULL AND (sa.stripe_location_id IS NULL OR sa.stripe_location_id = '') AND e.chk_active = 1 "); $accountsWithoutLocation = $stmt->fetchAll(PDO::FETCH_ASSOC); $total = count($accountsWithoutLocation); if ($total === 0) { echo "✅ Aucun compte sans Location trouvé. Tous les comptes sont à jour !\n\n"; exit(0); } echo "ℹ️ Trouvé $total compte(s) sans Location :\n\n"; foreach ($accountsWithoutLocation as $account) { $name = !empty($account['encrypted_name']) ? ApiService::decryptData($account['encrypted_name']) : 'Amicale #' . $account['fk_entite']; echo " - Entité #{$account['fk_entite']} : $name\n"; echo " Stripe Account : {$account['stripe_account_id']}\n"; echo " Adresse : {$account['adresse1']}, {$account['code_postal']} {$account['ville']}\n\n"; } // Demander confirmation echo "⚠️ Voulez-vous créer les Locations manquantes ? (yes/no) : "; $handle = fopen("php://stdin", "r"); $line = trim(fgets($handle)); fclose($handle); if ($line !== 'yes') { echo "❌ Opération annulée.\n\n"; exit(0); } echo "\n🚀 Création des Locations...\n\n"; // Initialiser Stripe avec la bonne clé selon le mode $stripeConfig = $config->getStripeConfig(); $stripeMode = $stripeConfig['mode'] ?? 'test'; $stripeSecretKey = ($stripeMode === 'live') ? $stripeConfig['secret_key_live'] : $stripeConfig['secret_key_test']; \Stripe\Stripe::setApiKey($stripeSecretKey); echo "ℹ️ Mode Stripe : " . strtoupper($stripeMode) . "\n\n"; $success = 0; $errors = 0; // 2. Créer les Locations manquantes foreach ($accountsWithoutLocation as $account) { $entiteId = $account['fk_entite']; $stripeAccountId = $account['stripe_account_id']; $name = !empty($account['encrypted_name']) ? ApiService::decryptData($account['encrypted_name']) : 'Amicale #' . $entiteId; echo "🔧 Entité #{$entiteId} : $name\n"; try { // Construire l'adresse $adresse1 = !empty($account['adresse1']) ? $account['adresse1'] : 'Adresse non renseignée'; $ville = !empty($account['ville']) ? $account['ville'] : 'Ville'; $codePostal = !empty($account['code_postal']) ? $account['code_postal'] : '00000'; // Construire l'adresse pour Stripe (ne pas envoyer line2 si vide) $addressData = [ 'line1' => $adresse1, 'city' => $ville, 'postal_code' => $codePostal, 'country' => 'FR', ]; // Ajouter line2 seulement s'il n'est pas vide if (!empty($account['adresse2'])) { $addressData['line2'] = $account['adresse2']; } // Créer la Location via Stripe API $location = \Stripe\Terminal\Location::create([ 'display_name' => $name, 'address' => $addressData, 'metadata' => [ 'entite_id' => $entiteId, 'type' => 'tap_to_pay', 'created_by' => 'migration_script' ] ], [ 'stripe_account' => $stripeAccountId ]); $locationId = $location->id; // Mettre à jour la base de données $updateStmt = $db->prepare(" UPDATE stripe_accounts SET stripe_location_id = :location_id, updated_at = NOW() WHERE id = :id "); $updateStmt->execute([ 'location_id' => $locationId, 'id' => $account['id'] ]); echo " ✅ Location créée : $locationId\n\n"; $success++; } catch (\Stripe\Exception\ApiErrorException $e) { echo " ❌ Erreur Stripe : " . $e->getMessage() . "\n\n"; $errors++; } catch (Exception $e) { echo " ❌ Erreur : " . $e->getMessage() . "\n\n"; $errors++; } } // 3. Résumé echo "\n"; echo "=============================================================================\n"; echo " Résumé de l'opération\n"; echo "=============================================================================\n"; echo "✅ Locations créées avec succès : $success\n"; echo "❌ Erreurs : $errors\n"; echo "📊 Total traité : $total\n"; echo "\n"; // 4. Vérification finale echo "🔍 Vérification finale...\n"; $stmt = $db->query(" SELECT COUNT(*) as remaining FROM stripe_accounts sa WHERE sa.stripe_account_id IS NOT NULL AND (sa.stripe_location_id IS NULL OR sa.stripe_location_id = '') "); $remaining = $stmt->fetch(PDO::FETCH_ASSOC); echo " ℹ️ Comptes restants sans Location : " . $remaining['remaining'] . "\n\n"; if ($remaining['remaining'] == 0) { echo "🎉 Tous les comptes Stripe ont maintenant une Location !\n\n"; } } catch (Exception $e) { echo "\n"; echo "=============================================================================\n"; echo " ❌ ERREUR\n"; echo "=============================================================================\n"; echo "Message : " . $e->getMessage() . "\n"; echo "Fichier : " . $e->getFile() . ":" . $e->getLine() . "\n"; echo "\n"; exit(1); }