| @@ -0,0 +1,162 @@ | |||||
| #!/usr/bin/php56 | |||||
| <?php | |||||
| require_once('../functions.php'); | |||||
| /** | |||||
| * Main script to handle point expiration | |||||
| * Rules: | |||||
| * 1. Check if there was any credit in the last 24 months | |||||
| * 2. If no credit in 24 months -> all points expire | |||||
| * 3. If there was credit -> points older than 4 years expire monthly | |||||
| */ | |||||
| // Get current month and year | |||||
| $currentMonth = date('m', time()); | |||||
| $currentYear = date('Y', time()); | |||||
| $currentTimestamp = time(); | |||||
| // Process all users | |||||
| $result = dbQuery("SELECT userId FROM users") or die(dbError()); | |||||
| while ($row = dbFetchRow($result)) { | |||||
| $userId = $row['userId']; | |||||
| if ($userId <= 0) { | |||||
| continue; | |||||
| } | |||||
| processUserPoints($userId, $currentYear, $currentMonth, $currentTimestamp); | |||||
| } | |||||
| /** | |||||
| * Process points for a single user | |||||
| */ | |||||
| function processUserPoints($userId, $currentYear, $currentMonth, $currentTimestamp) { | |||||
| $konto = new konto($userId); | |||||
| // Calculate timestamp for 24 months ago | |||||
| $twoYearsAgo = strtotime("-24 months", $currentTimestamp); | |||||
| // Check for any credits in last 24 months | |||||
| $lastCreditDate = getLastPositiveEntry($userId, $currentTimestamp); | |||||
| if ($lastCreditDate === 0 || $lastCreditDate < $twoYearsAgo) { | |||||
| // No credits in last 24 months - all points expire | |||||
| expireAllPoints($konto, $currentTimestamp); | |||||
| } else { | |||||
| // Process 4-year expiration | |||||
| processFourYearExpiration($konto, $currentYear, $currentMonth, $currentTimestamp); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Get the date of the last positive entry (credit) for a user | |||||
| */ | |||||
| function getLastPositiveEntry($userId, $currentTimestamp) { | |||||
| $query = "SELECT MAX(datum) as last_credit | |||||
| FROM kontobewegungen | |||||
| WHERE userId = $userId | |||||
| AND wert > 0 | |||||
| AND gueltig = 1 | |||||
| AND geloescht != 1 | |||||
| AND datum <= $currentTimestamp"; | |||||
| $result = dbQuery($query) or die(dbError()); | |||||
| $row = dbFetchRow($result); | |||||
| return $row['last_credit'] ? intval($row['last_credit']) : 0; | |||||
| } | |||||
| /** | |||||
| * Expire all points for inactive accounts (no credits in 24 months) | |||||
| */ | |||||
| function expireAllPoints($konto, $currentTimestamp) { | |||||
| $currentBalance = $konto->getSaldo(); | |||||
| if ($currentBalance <= 0) { | |||||
| return; | |||||
| } | |||||
| $user = new user(0, $konto->userId); | |||||
| echo "{$konto->userId}, {$user->versnummer}: Expire all points due to 24 months inactivity. Balance: $currentBalance\n"; | |||||
| // Create expiration entry | |||||
| $expiration = new kontoBewegung(); | |||||
| $expiration->userId = $konto->userId; | |||||
| $expiration->kategorie = 0; | |||||
| $expiration->unterkategorie = 0; | |||||
| $expiration->praemienid = 0; | |||||
| $expiration->praemienhmid = 0; | |||||
| $expiration->kommentar = 'Punkteverfall, da 2 Jahre keine Punkte aufgefrischt wurden'; | |||||
| $expiration->datum = $currentTimestamp; | |||||
| $expiration->datumerwerb = date('Y-m-d', $currentTimestamp); | |||||
| $expiration->beschreibung = 'Punkteverfall, da 2 Jahre keine Punkte aufgefrischt wurden'; | |||||
| $expiration->wert = -$currentBalance; | |||||
| $expiration->gueltig = 0; | |||||
| $konto->addKontobewegung($expiration); | |||||
| $updateQuery = "UPDATE kontobewegungen SET gueltig = 0 | |||||
| WHERE wert > 0 | |||||
| AND gueltig = 1 | |||||
| AND geloescht != 1 | |||||
| AND userId = {$konto->userId}"; | |||||
| dbQuery($updateQuery) or die(dbError()); | |||||
| } | |||||
| /** | |||||
| * Process 4-year expiration for active accounts | |||||
| */ | |||||
| function processFourYearExpiration($konto, $currentYear, $currentMonth, $currentTimestamp) { | |||||
| // Get timestamp for 4 years ago | |||||
| $fourYearsAgo = strtotime("-4 years", $currentTimestamp); | |||||
| // Get all valid points older than 4 years that haven't expired yet | |||||
| $query = "SELECT SUM(wert) as expiring_points | |||||
| FROM kontobewegungen | |||||
| WHERE userId = {$konto->userId} | |||||
| AND datum < $fourYearsAgo | |||||
| AND wert > 0 | |||||
| AND gueltig = 1 | |||||
| AND geloescht != 1"; | |||||
| $result = dbQuery($query) or die(dbError()); | |||||
| $row = dbFetchRow($result); | |||||
| $expiringPoints = intval($row['expiring_points']); | |||||
| if ($expiringPoints <= 0) { | |||||
| return; | |||||
| } | |||||
| // Make sure we don't expire more points than the current balance | |||||
| $currentBalance = $konto->getSaldo(); | |||||
| if ($expiringPoints > $currentBalance) { | |||||
| $expiringPoints = $currentBalance; | |||||
| } | |||||
| $user = new user(0, $konto->userId); | |||||
| echo "{$konto->userId}, {$user->versnummer}: Expire $expiringPoints points older than 4 years. Balance: $currentBalance\n"; | |||||
| // Create expiration entry | |||||
| $expiration = new kontoBewegung(); | |||||
| $expiration->userId = $konto->userId; | |||||
| $expiration->kategorie = 0; | |||||
| $expiration->unterkategorie = 0; | |||||
| $expiration->praemienid = 0; | |||||
| $expiration->praemienhmid = 0; | |||||
| $expiration->kommentar = 'Punkteverfall nach 4 Jahren'; | |||||
| $expiration->datum = $currentTimestamp; | |||||
| $expiration->datumerwerb = date('Y-m-d', $currentTimestamp); | |||||
| $expiration->beschreibung = 'Punkteverfall nach 4 Jahren'; | |||||
| $expiration->wert = -$expiringPoints; | |||||
| $expiration->gueltig = 0; | |||||
| $konto->addKontobewegung($expiration); | |||||
| // Mark expired points as invalid | |||||
| $updateQuery = "UPDATE kontobewegungen | |||||
| SET gueltig = 0 | |||||
| WHERE userId = {$konto->userId} | |||||
| AND datum < $fourYearsAgo | |||||
| AND wert > 0 | |||||
| AND gueltig = 1 | |||||
| AND geloescht != 1"; | |||||
| dbQuery($updateQuery) or die(dbError()); | |||||
| } | |||||