getConnection(); $today = date('Y-m-d'); $log = []; try { $pdo->beginTransaction(); // 1. Scaduti: erano active, la data è passata → expired + salone spento $exp = $pdo->prepare(" SELECT shop_id FROM shop_subscriptions WHERE status = 'active' AND expires_at IS NOT NULL AND expires_at < ? "); $exp->execute([$today]); $expiredShops = $exp->fetchAll(PDO::FETCH_COLUMN); if ($expiredShops) { $updSub = $pdo->prepare(" UPDATE shop_subscriptions SET status = 'expired' WHERE status = 'active' AND expires_at IS NOT NULL AND expires_at < ? "); $updSub->execute([$today]); // Spegni i saloni relativi $in = implode(',', array_fill(0, count($expiredShops), '?')); $updShop = $pdo->prepare("UPDATE shops SET active = 0 WHERE id IN ($in)"); $updShop->execute($expiredShops); $log[] = count($expiredShops) . " salone/i scaduto/i e disattivato/i."; } // 2. Riattivazione: abbonamento tornato valido ma salone ancora spento. // (utile se un rinnovo ha rimesso status=active ma active era 0) $rea = $pdo->prepare(" SELECT s.id FROM shops s JOIN shop_subscriptions sub ON sub.shop_id = s.id WHERE s.active = 0 AND sub.status = 'active' AND (sub.expires_at IS NULL OR sub.expires_at >= ?) "); $rea->execute([$today]); $reactivate = $rea->fetchAll(PDO::FETCH_COLUMN); if ($reactivate) { $in = implode(',', array_fill(0, count($reactivate), '?')); $updOn = $pdo->prepare("UPDATE shops SET active = 1 WHERE id IN ($in)"); $updOn->execute($reactivate); $log[] = count($reactivate) . " salone/i riattivato/i."; } $pdo->commit(); if (empty($log)) $log[] = "Nessuna modifica."; $line = '[' . date('Y-m-d H:i:s') . '] ' . implode(' ', $log) . PHP_EOL; echo $line; // Log su file accanto allo script @file_put_contents(__DIR__ . '/cron_subscriptions.log', $line, FILE_APPEND); } catch (Throwable $e) { if ($pdo->inTransaction()) $pdo->rollBack(); $err = '[' . date('Y-m-d H:i:s') . '] ERRORE: ' . $e->getMessage() . PHP_EOL; echo $err; @file_put_contents(__DIR__ . '/cron_subscriptions.log', $err, FILE_APPEND); }