00001 <?php
00002
00015
00016
00017
00018 import('scheduledTask.ScheduledTask');
00019
00020 class SubscriptionExpiryReminder extends ScheduledTask {
00021
00025 function SubscriptionExpiryReminder() {
00026 $this->ScheduledTask();
00027 }
00028
00029 function sendReminder ($subscription, $journal, $emailKey) {
00030
00031 $userDao = &DAORegistry::getDAO('UserDAO');
00032 $subscriptionTypeDao = &DAORegistry::getDAO('SubscriptionTypeDAO');
00033
00034 $journalName = $journal->getJournalTitle();
00035 $journalId = $journal->getJournalId();
00036 $user = &$userDao->getUser($subscription->getUserId());
00037 if (!isset($user)) return false;
00038
00039 $subscriptionType = &$subscriptionTypeDao->getSubscriptionType($subscription->getTypeId());
00040
00041 $subscriptionName = $journal->getSetting('subscriptionName');
00042 $subscriptionEmail = $journal->getSetting('subscriptionEmail');
00043 $subscriptionPhone = $journal->getSetting('subscriptionPhone');
00044 $subscriptionFax = $journal->getSetting('subscriptionFax');
00045 $subscriptionMailingAddress = $journal->getSetting('subscriptionMailingAddress');
00046
00047 $subscriptionContactSignature = $subscriptionName;
00048
00049 if ($subscriptionMailingAddress != '') {
00050 $subscriptionContactSignature .= "\n" . $subscriptionMailingAddress;
00051 }
00052 if ($subscriptionPhone != '') {
00053 $subscriptionContactSignature .= "\n" . Locale::Translate('user.phone') . ': ' . $subscriptionPhone;
00054 }
00055 if ($subscriptionFax != '') {
00056 $subscriptionContactSignature .= "\n" . Locale::Translate('user.fax') . ': ' . $subscriptionFax;
00057 }
00058
00059 $subscriptionContactSignature .= "\n" . Locale::Translate('user.email') . ': ' . $subscriptionEmail;
00060
00061 $paramArray = array(
00062 'subscriberName' => $user->getFullName(),
00063 'journalName' => $journalName,
00064 'subscriptionType' => $subscriptionType->getSummaryString(),
00065 'expiryDate' => $subscription->getDateEnd(),
00066 'username' => $user->getUsername(),
00067 'subscriptionContactSignature' => $subscriptionContactSignature
00068 );
00069
00070 import('mail.MailTemplate');
00071 $mail = &new MailTemplate($emailKey);
00072 $mail->setFrom($subscriptionEmail, $subscriptionName);
00073 $mail->addRecipient($user->getEmail(), $user->getFullName());
00074 $mail->setSubject($mail->getSubject($journal->getPrimaryLocale()));
00075 $mail->setBody($mail->getBody($journal->getPrimaryLocale()));
00076 $mail->assignParams($paramArray);
00077 $mail->send();
00078 }
00079
00080 function sendJournalReminders ($journal, $curDate) {
00081
00082
00083 if ($journal->getSetting('enableSubscriptions')) {
00084
00085 $curYear = $curDate['year'];
00086 $curMonth = $curDate['month'];
00087 $curDay = $curDate['day'];
00088
00089
00090 if ($journal->getSetting('enableSubscriptionExpiryReminderBeforeMonths')) {
00091
00092 $beforeMonths = $journal->getSetting('numMonthsBeforeSubscriptionExpiryReminder');
00093 $beforeYears = (int)floor($beforeMonths/12);
00094 $beforeMonths = (int)fmod($beforeMonths,12);
00095
00096 $expiryYear = $curYear + $beforeYears + (int)floor(($curMonth+$beforeMonths)/12);
00097 $expiryMonth = (int)fmod($curMonth+$beforeMonths,12);
00098 $expiryDay = $curDay;
00099
00100
00101 $subscriptionDao = &DAORegistry::getDAO('SubscriptionDAO');
00102 $dateEnd = $expiryYear . '-' . $expiryMonth . '-' . $expiryDay;
00103 $subscriptions = &$subscriptionDao->getSubscriptionsByDateEnd($dateEnd, $journal->getJournalId());
00104
00105 while (!$subscriptions->eof()) {
00106 $subscription = &$subscriptions->next();
00107 $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_BEFORE_EXPIRY');
00108 }
00109 }
00110
00111
00112 if ($journal->getSetting('enableSubscriptionExpiryReminderBeforeWeeks')) {
00113
00114 $beforeWeeks = $journal->getSetting('numWeeksBeforeSubscriptionExpiryReminder');
00115 $beforeDays = $beforeWeeks * 7;
00116
00117 $expiryMonth = $curMonth + (int)floor(($curDay+$beforeDays)/31);
00118 $expiryYear = $curYear + (int)floor($expiryMonth/12);
00119 $expiryDay = (int)fmod($curDay+$beforeDays,31);
00120 $expiryMonth = (int)fmod($expiryMonth,12);
00121
00122
00123 $subscriptionDao = &DAORegistry::getDAO('SubscriptionDAO');
00124 $dateEnd = $expiryYear . '-' . $expiryMonth . '-' . $expiryDay;
00125 $subscriptions = &$subscriptionDao->getSubscriptionsByDateEnd($dateEnd, $journal->getJournalId());
00126
00127 while (!$subscriptions->eof()) {
00128 $subscription = &$subscriptions->next();
00129 $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_BEFORE_EXPIRY');
00130 }
00131 }
00132
00133
00134 if ($journal->getSetting('enableSubscriptionExpiryReminderAfterMonths')) {
00135
00136 $afterMonths = $journal->getSetting('numMonthsAfterSubscriptionExpiryReminder');
00137 $afterYears = (int)floor($afterMonths/12);
00138 $afterMonths = (int)fmod($afterMonths,12);
00139
00140 if (($curMonth - $afterMonths) <= 0) {
00141 $afterYears++;
00142 $expiryMonth = 12 + ($curMonth - $afterMonths);
00143 } else {
00144 $expiryMonth = $curMonth - $afterMonths;
00145 }
00146
00147 $expiryYear = $curYear - $afterYears;
00148 $expiryDay = $curDay;
00149
00150
00151 $subscriptionDao = &DAORegistry::getDAO('SubscriptionDAO');
00152 $dateEnd = $expiryYear . '-' . $expiryMonth . '-' . $expiryDay;
00153 $subscriptions = &$subscriptionDao->getSubscriptionsByDateEnd($dateEnd, $journal->getJournalId());
00154
00155 while (!$subscriptions->eof()) {
00156 $subscription = &$subscriptions->next();
00157
00158 if (!$subscriptionDao->isValidSubscriptionByUser($subscription->getUserId(), $journal->getJournalId())) {
00159 $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_AFTER_EXPIRY_LAST');
00160 }
00161 }
00162 }
00163
00164
00165 if ($journal->getSetting('enableSubscriptionExpiryReminderAfterWeeks')) {
00166
00167 $afterWeeks = $journal->getSetting('numWeeksAfterSubscriptionExpiryReminder');
00168 $afterDays = $afterWeeks * 7;
00169
00170 if (($curDay - $afterDays) <= 0) {
00171 $afterMonths = 1;
00172 $expiryDay = 31 + ($curDay - $afterDays);
00173 } else {
00174 $afterMonths = 0;
00175 $expiryDay = $curDay - $afterDays;
00176 }
00177
00178 if (($curMonth - $afterMonths) == 0) {
00179 $afterYears = 1;
00180 $expiryMonth = 12;
00181 } else {
00182 $afterYears = 0;
00183 $expiryMonth = $curMonth - $afterMonths;
00184 }
00185
00186 $expiryYear = $curYear - $afterYears;
00187
00188
00189 $subscriptionDao = &DAORegistry::getDAO('SubscriptionDAO');
00190 $dateEnd = $expiryYear . '-' . $expiryMonth . '-' . $expiryDay;
00191 $subscriptions = &$subscriptionDao->getSubscriptionsByDateEnd($dateEnd, $journal->getJournalId());
00192
00193 while (!$subscriptions->eof()) {
00194 $subscription = &$subscriptions->next();
00195
00196 if (!$subscriptionDao->isValidSubscriptionByUser($subscription->getUserId(), $journal->getJournalId())) {
00197 $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_AFTER_EXPIRY');
00198 }
00199 }
00200 }
00201 }
00202 }
00203
00204 function execute() {
00205 $journalDao = &DAORegistry::getDAO('JournalDAO');
00206 $journals = &$journalDao->getEnabledJournals();
00207
00208 $todayDate = array(
00209 'year' => date('Y'),
00210 'month' => date('n'),
00211 'day' => date('j')
00212 );
00213
00214 while (!$journals->eof()) {
00215 $journal = &$journals->next();
00216
00217
00218 $this->sendJournalReminders($journal, $todayDate);
00219 unset($journal);
00220 }
00221
00222
00223
00224
00225 $shortMonths = array(2,4,6,8,10,12);
00226
00227 if (($todayDate['day'] == 1) && in_array(($todayDate['month'] - 1), $shortMonths)) {
00228
00229 $curDate['day'] = 31;
00230 $curDate['month'] = $todayDate['month'] - 1;
00231
00232 if ($curDate['month'] == 12) {
00233 $curDate['year'] = $todayDate['year'] - 1;
00234 } else {
00235 $curDate['year'] = $todayDate['year'];
00236 }
00237
00238 $journals = &$journalDao->getEnabledJournals();
00239
00240 while (!$journals->eof()) {
00241 $journal = &$journals->next();
00242
00243
00244 $this->sendJournalReminders($journal, $curDate);
00245 unset($journal);
00246 }
00247 }
00248
00249
00250
00251 if (($todayDate['day'] == 1) && ($todayDate['month'] == 3)) {
00252
00253 $curDate['day'] = 30;
00254 $curDate['month'] = 2;
00255 $curDate['year'] = $todayDate['year'];
00256
00257 $journals = &$journalDao->getEnabledJournals();
00258
00259 while (!$journals->eof()) {
00260 $journal = &$journals->next();
00261
00262
00263 $this->sendJournalReminders($journal, $curDate);
00264 unset($journal);
00265 }
00266
00267
00268 if (date("L", mktime(0,0,0,0,0,$curDate['year'])) != '1') {
00269
00270 $curDate['day'] = 29;
00271
00272 $journals = &$journalDao->getEnabledJournals();
00273
00274 while (!$journals->eof()) {
00275 $journal = &$journals->next();
00276
00277
00278 $this->sendJournalReminders($journal, $curDate);
00279 unset($journal);
00280 }
00281 }
00282 }
00283 }
00284 }
00285
00286 ?>