Skip to content
Code-Schnipsel Gruppen Projekte
Cron.php 4,19 KiB
Newer Older
<?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(),
                'archived' => 0
        $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->getContractId()) {
Patrick Müller's avatar
Patrick Müller committed
                    $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()
Patrick Müller's avatar
Patrick Müller committed
                );

                QUI\System\Log::writeException($Exception);