feat: Version 3.3.4 - Nouvelle architecture pages, optimisations widgets Flutter et API

- Mise à jour VERSION vers 3.3.4
- Optimisations et révisions architecture API (deploy-api.sh, scripts de migration)
- Ajout documentation Stripe Tap to Pay complète
- Migration vers polices Inter Variable pour Flutter
- Optimisations build Android et nettoyage fichiers temporaires
- Amélioration système de déploiement avec gestion backups
- Ajout scripts CRON et migrations base de données

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
pierre
2025-10-05 20:11:15 +02:00
parent 2786252307
commit 570a1fa1f0
212 changed files with 24275 additions and 11321 deletions

114
bao/bin/decrypt-entite Executable file
View File

@@ -0,0 +1,114 @@
#!/usr/bin/env php
<?php
declare(strict_types=1);
/**
* Script de décryptage d'une entité (amicale) spécifique
* Usage: ./decrypt-entite <environment> <entite_id>
*/
require_once __DIR__ . '/../lib/CryptoService.php';
require_once __DIR__ . '/../lib/DatabaseConnection.php';
require_once __DIR__ . '/../lib/helpers.php';
// Vérifier les arguments
if ($argc < 3) {
error("Usage: " . basename($argv[0]) . " <environment> <entite_id>");
error("Exemple: " . basename($argv[0]) . " dev 5");
exit(1);
}
$environment = strtoupper($argv[1]);
$entiteId = (int)$argv[2];
try {
// Ouvrir le tunnel SSH si nécessaire
$tunnelScript = __DIR__ . '/_ssh-tunnel.sh';
exec("$tunnelScript open $environment 2>&1", $output, $exitCode);
if ($exitCode !== 0) {
error("Impossible d'ouvrir le tunnel SSH");
exit(1);
}
// Connexion à la base de données
$db = new DatabaseConnection($environment);
$pdo = $db->connect();
info("Environnement: $environment");
info("Recherche de l'entité #$entiteId...\n");
// Requête pour récupérer l'entité
$stmt = $pdo->prepare("
SELECT
e.*,
COUNT(DISTINCT u.id) as nb_users,
COUNT(DISTINCT o.id) as nb_operations
FROM entites e
LEFT JOIN users u ON u.fk_entite = e.id
LEFT JOIN operations o ON o.fk_entite = e.id
WHERE e.id = :entite_id
GROUP BY e.id
");
$stmt->execute(['entite_id' => $entiteId]);
$entite = $stmt->fetch();
if (!$entite) {
error("Entité #$entiteId introuvable");
exit(1);
}
// Déchiffrer les données
$config = DatabaseConfig::getInstance();
$crypto = new CryptoService($config->getEncryptionKey());
$entite['name'] = $crypto->decryptWithIV($entite['encrypted_name']);
$entite['email'] = $crypto->decryptSearchable($entite['encrypted_email']);
$entite['phone'] = $crypto->decryptWithIV($entite['encrypted_phone']);
$entite['mobile'] = $crypto->decryptWithIV($entite['encrypted_mobile']);
$entite['iban'] = $crypto->decryptWithIV($entite['encrypted_iban']);
$entite['bic'] = $crypto->decryptWithIV($entite['encrypted_bic']);
// Affichage
title("ENTITÉ (AMICALE) #" . $entite['id']);
echo color("Identité\n", 'bold');
display("Nom", $entite['name']);
display("Email", $entite['email']);
display("Téléphone", $entite['phone']);
display("Mobile", $entite['mobile']);
echo "\n" . color("Adresse\n", 'bold');
display("Adresse 1", $entite['adresse1'] ?: '-');
display("Adresse 2", $entite['adresse2'] ?: '-');
display("Code postal", $entite['code_postal'] ?: '-');
display("Ville", $entite['ville'] ?: '-');
echo "\n" . color("Coordonnées bancaires\n", 'bold');
display("IBAN", $entite['iban'] ?: '-');
display("BIC", $entite['bic'] ?: '-');
echo "\n" . color("Configuration\n", 'bold');
display("Stripe activé", $entite['chk_stripe'] ? 'Oui' : 'Non');
display("Gestion MDP manuelle", $entite['chk_mdp_manuel'] ? 'Oui' : 'Non');
display("Gestion username manuelle", $entite['chk_username_manuel'] ? 'Oui' : 'Non');
display("Copie mail reçu", $entite['chk_copie_mail_recu'] ? 'Oui' : 'Non');
display("Accepte SMS", $entite['chk_accept_sms'] ? 'Oui' : 'Non');
echo "\n" . color("Statistiques\n", 'bold');
display("Nombre d'utilisateurs", (string)$entite['nb_users']);
display("Nombre d'opérations", (string)$entite['nb_operations']);
echo "\n" . color("Dates\n", 'bold');
display("Date création", formatDate($entite['created_at']));
display("Dernière modif", formatDate($entite['updated_at']));
echo "\n";
success("Entité déchiffrée avec succès");
} catch (Exception $e) {
error("Erreur: " . $e->getMessage());
exit(1);
}