86 lines
3.2 KiB
PHP
86 lines
3.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* cron_subscriptions.php — Da eseguire UNA VOLTA AL GIORNO.
|
|
*
|
|
* Cosa fa:
|
|
* - Trova gli abbonamenti "active" la cui expires_at è già passata → li mette "expired"
|
|
* e spegne il salone (shops.active = 0).
|
|
* - Riaccende i saloni il cui abbonamento è tornato valido (active e non scaduto)
|
|
* ma che risultano ancora spenti (es. dopo un rinnovo registrato).
|
|
*
|
|
* NON tocca i saloni "blocked" dall'admin: quelli restano spenti finché l'admin non li sblocca.
|
|
*
|
|
* Esecuzione (XAMPP / Windows Task Scheduler):
|
|
* C:\xampp\php\php.exe C:\xampp\htdocs\comelifacciamo\public\cron_subscriptions.php
|
|
* Esecuzione (cron Linux, ogni giorno alle 3:00):
|
|
* 0 3 * * * /usr/bin/php /percorso/public/cron_subscriptions.php
|
|
*/
|
|
|
|
// Percorso corretto: questo file sta in public/, la classe DB è in public/userarea/class/
|
|
require_once(__DIR__ . '/userarea/class/db-functions.php');
|
|
$pdo = DBHandlerSelect::getInstance()->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);
|
|
}
|