Init Git Prod Mars 2026

This commit is contained in:
Oleg Barykin committed 2026-03-05 10:25:39 +01:00
commit d81efe93b1
362 files changed
+86627

No files matched your search

+123
View File
@@ -0,0 +1,123 @@
<?php
// /public/resiliation_action.php
require_once __DIR__ . '/../includes/init_praticien.php';
if (!isset($pdo) || !($pdo instanceof PDO)) {
http_response_code(500);
exit('DB_ERROR');
}
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$praticien_id = (int)($_SESSION['reference_id'] ?? 0);
if ($praticien_id <= 0) {
header('Location: /public/login.php');
exit;
}
// ---- Helper: colonne existe ? (évite de casser selon schéma) ----
function colExists(PDO $pdo, string $table, string $col): bool {
static $cache = [];
$k = $table.'.'.$col;
if (array_key_exists($k, $cache)) return $cache[$k];
$st = $pdo->prepare("
SELECT 1
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = ?
AND COLUMN_NAME = ?
LIMIT 1
");
$st->execute([$table, $col]);
$cache[$k] = (bool)$st->fetchColumn();
return $cache[$k];
}
try {
// 🔎 Récupération du billing le plus récent "utile"
// On vise l’entrée la plus récente; si elle est déjà canceled, ça reste idempotent.
$stmt = $pdo->prepare("
SELECT id, billing_mode, provider, provider_subscription_id, current_period_end, status
FROM billing_subscriptions
WHERE praticien_id = ?
ORDER BY id DESC
LIMIT 1
");
$stmt->execute([$praticien_id]);
$billing = $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
// ==========================
// 1) Appel Stripe (si auto)
// ==========================
if ($billing) {
$isAutoStripe = (
(string)($billing['billing_mode'] ?? '') === 'auto'
&& (string)($billing['provider'] ?? '') === 'stripe'
&& !empty($billing['provider_subscription_id'])
);
if ($isAutoStripe) {
require_once __DIR__ . '/../../plata/lib/stripe_client.php'; // $stripe
try {
// Résiliation à fin de période
$stripe->subscriptions->update(
(string)$billing['provider_subscription_id'],
['cancel_at_period_end' => true]
);
} catch (Throwable $e) {
// On ne bloque pas la résiliation locale si Stripe échoue
@file_put_contents(
'/tmp/stripe_resiliation.log',
'['.date('c').'] '.$e->getMessage()."\n",
FILE_APPEND
);
}
}
}
// ==========================
// 2) Mise à jour locale (TX)
// ==========================
$pdo->beginTransaction();
// 2.1) billing_subscriptions -> canceled (+ flags si colonnes existent)
if ($billing && !empty($billing['id'])) {
$sets = ["status = 'canceled'"];
$vals = [];
if (colExists($pdo, 'billing_subscriptions', 'cancel_at_period_end')) {
$sets[] = "cancel_at_period_end = 1";
}
if (colExists($pdo, 'billing_subscriptions', 'canceled_at')) {
$sets[] = "canceled_at = NOW()";
}
$sql = "UPDATE billing_subscriptions SET ".implode(', ', $sets)." WHERE id = ?";
$vals[] = (int)$billing['id'];
$pdo->prepare($sql)->execute($vals);
}
// 2.2) praticien -> abonnement_id NULL (NE PAS toucher date_expiration)
if (colExists($pdo, 'praticien', 'abonnement_id')) {
$pdo->prepare("UPDATE praticien SET abonnement_id = NULL WHERE id = ?")
->execute([$praticien_id]);
}
$pdo->commit();
} catch (Throwable $e) {
if ($pdo->inTransaction()) $pdo->rollBack();
@file_put_contents(
'/tmp/resiliation_error.log',
'['.date('c').'] '.$e->getMessage()."\n",
FILE_APPEND
);
}
// Redirection finale
header('Location: /public/praticien/resiliation.php?ok=1');
exit;