Skip to content
Code-Schnipsel Gruppen Projekte
Cron.php 4,15 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    namespace QUI\Memberships;
    
    use QUI;
    use QUI\Memberships\Users\Handler as MembershipUsersHandler;
    use QUI\Memberships\Users\MembershipUser;
    
    /**
     * Class Cron
     *
     * Automatically checks memberships and cancels or extends them
     */
    class Cron
    {
        public static function checkMembershipUsers()
        {
            $MembershipUsers = MembershipUsersHandler::getInstance();
    
    
            $result = QUI::getDataBase()->fetch([
                'select' => [
    
                'from'   => $MembershipUsers->getDataBaseTableName(),
    
            $now                            = time();
            $cancelConfirmReminderAfterDays = (int)MembershipUsersHandler::getSetting('cancelReminderDays');
            $Now                            = date_create();
    
    
            foreach ($result as $row) {
    
    Patrick Müller's avatar
    Patrick Müller committed
                try {
                    /** @var MembershipUser $MembershipUser */
                    $MembershipUser = $MembershipUsers->getChild($row['id']);
                    $Membership     = $MembershipUser->getMembership();
    
                    try {
                        $MembershipUser->getUser();
                    } catch (QUI\Users\Exception $Exception) {
                        // archive MembershipUser if QUIQQER User cannot be found
                        if ($Exception->getCode() === 404) {
                            $MembershipUser->archive(MembershipUsersHandler::ARCHIVE_REASON_USER_DELETED);
                        }
    
                        continue;
    
                    // Check if cancellation of membership has been started but NOT yet confirmed.
                    // Send reminder e-mail after X days of unconfirmed cancellation.
                    if (!empty($cancelConfirmReminderAfterDays)
                        && (int)$MembershipUser->getAttribute('cancelStatus') === MembershipUsersHandler::CANCEL_STATUS_CANCEL_CONFIRM_PENDING) {
                        $CancelDate = \date_create($MembershipUser->getAttribute('cancelDate'));
    
                        if ($CancelDate) {
                            $RemindDate = $CancelDate->add(new \DateInterval('P'.$cancelConfirmReminderAfterDays.'D'));
    
                            $User       = $MembershipUser->getUser();
    
                            if (!$User->getAttribute(MembershipUsersHandler::USER_ATTR_CANCEL_REMINDER_SENT)
                                && $Now > $RemindDate) {
                                $sent = $MembershipUser->sendConfirmCancelReminderMail();
    
                                if ($sent) {
                                    $User->setAttribute(MembershipUsersHandler::USER_ATTR_CANCEL_REMINDER_SENT, true);
                                    $User->save(QUI::getUsers()->getSystemUser());
                                }
                            }
    
                    // never expire a membership with infinite duration
                    if ($Membership->isInfinite()) {
                        continue;
    
    Patrick Müller's avatar
    Patrick Müller committed
                    // check if membership has expired
    
                    $endTimestamp = strtotime($MembershipUser->getAttribute('endDate'));
    
    Patrick Müller's avatar
    Patrick Müller committed
                        continue;
                    }
    
    Patrick Müller's avatar
    Patrick Müller committed
                    // if membership has been cancelled -> archive it immediately
                    if ($MembershipUser->isCancelled()) {
    
                        $cancelEndDate = $MembershipUser->getAttribute('cancelEndDate');
                        $cancelEndTime = strtotime($cancelEndDate);
    
                        if ($now >= $cancelEndTime) {
                            $MembershipUser->cancel();
                            continue;
                        }
    
    Patrick Müller's avatar
    Patrick Müller committed
                    }
    
                    // extend if membership is extended automatically
                    if ($Membership->isAutoExtend()) {
                        $MembershipUser->extend();
                        continue;
                    }
    
    Patrick Müller's avatar
    Patrick Müller committed
                    // expire membership
                    $MembershipUser->expire();
                } catch (\Exception $Exception) {
                    QUI\System\Log::addError(
    
                        self::class.' :: checkMembershipUsers() -> '.$Exception->getMessage()
    
    
                    QUI\System\Log::writeException($Exception);