diff --git a/admin/include/tests/Verfallen-NEU.php b/admin/include/tests/Verfallen-NEU.php new file mode 100644 index 0000000..e5203a1 --- /dev/null +++ b/admin/include/tests/Verfallen-NEU.php @@ -0,0 +1,162 @@ +#!/usr/bin/php56 + 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()); +} \ No newline at end of file