Open Journal Systems  3.3.0
SubscriptionExpiryReminder.inc.php
1 <?php
2 
16 import('lib.pkp.classes.scheduledTask.ScheduledTask');
17 
19 
23  function getName() {
24  return __('admin.scheduledTask.subscriptionExpiryReminder');
25  }
26 
33  protected function sendReminder ($subscription, $journal, $emailKey) {
34  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
35  $subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /* @var $subscriptionTypeDao SubscriptionTypeDAO */
36 
37  $journalName = $journal->getLocalizedName();
38  $user = $userDao->getById($subscription->getUserId());
39  if (!isset($user)) return false;
40 
41  $subscriptionType = $subscriptionTypeDao->getById($subscription->getTypeId());
42 
43  $subscriptionName = $journal->getData('subscriptionName');
44  $subscriptionEmail = $journal->getData('subscriptionEmail');
45  $subscriptionPhone = $journal->getData('subscriptionPhone');
46  $subscriptionMailingAddress = $journal->getData('subscriptionMailingAddress');
47 
48  $subscriptionContactSignature = $subscriptionName;
49 
50  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_USER, LOCALE_COMPONENT_APP_COMMON);
51 
52  if ($subscriptionMailingAddress != '') {
53  $subscriptionContactSignature .= "\n" . $subscriptionMailingAddress;
54  }
55  if ($subscriptionPhone != '') {
56  $subscriptionContactSignature .= "\n" . __('user.phone') . ': ' . $subscriptionPhone;
57  }
58 
59  $subscriptionContactSignature .= "\n" . __('user.email') . ': ' . $subscriptionEmail;
60 
61  $paramArray = array(
62  'subscriberName' => $user->getFullName(),
63  'journalName' => $journalName,
64  'subscriptionType' => $subscriptionType->getSummaryString(),
65  'expiryDate' => $subscription->getDateEnd(),
66  'username' => $user->getUsername(),
67  'subscriptionContactSignature' => $subscriptionContactSignature
68  );
69 
70  import('lib.pkp.classes.mail.MailTemplate');
71  $mail = new MailTemplate($emailKey, $journal->getPrimaryLocale(), $journal, false);
72  $mail->setReplyTo(null);
73  $mail->setFrom($subscriptionEmail, $subscriptionName);
74  $mail->addRecipient($user->getEmail(), $user->getFullName());
75  $mail->setSubject($mail->getSubject($journal->getPrimaryLocale()));
76  $mail->setBody($mail->getBody($journal->getPrimaryLocale()));
77  $mail->assignParams($paramArray);
78  $mail->send();
79  }
80 
86  protected function sendJournalReminders ($journal, $curDate) {
87  // Only send reminders if subscriptions are enabled
88  if ($journal->getData('publishingMode') == PUBLISHING_MODE_SUBSCRIPTION) {
89 
90  $curYear = $curDate['year'];
91  $curMonth = $curDate['month'];
92  $curDay = $curDate['day'];
93 
94  // Check if expiry notification before months is enabled
95  if ($beforeMonths = $journal->getData('numMonthsBeforeSubscriptionExpiryReminder')) {
96  $beforeYears = (int)floor($beforeMonths/12);
97  $beforeMonths = (int)fmod($beforeMonths,12);
98 
99  $expiryYear = $curYear + $beforeYears + (int)floor(($curMonth+$beforeMonths)/12);
100  $expiryMonth = (int)fmod($curMonth+$beforeMonths,12);
101  $expiryDay = $curDay;
102 
103  // Retrieve all subscriptions that match expiry date
104  $individualSubscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /* @var $individualSubscriptionDao IndividualSubscriptionDAO */
105  $institutionalSubscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /* @var $institutionalSubscriptionDao InstitutionalSubscriptionDAO */
106  $dateEnd = $expiryYear . '-' . $expiryMonth . '-' . $expiryDay;
107  $individualSubscriptions = $individualSubscriptionDao->getByDateEnd($dateEnd, $journal->getId());
108  $institutionalSubscriptions = $institutionalSubscriptionDao->getByDateEnd($dateEnd, $journal->getId());
109 
110  while ($subscription = $individualSubscriptions->next()) {
111  $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_BEFORE_EXPIRY');
112  }
113 
114  while ($subscription = $institutionalSubscriptions->next()) {
115  $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_BEFORE_EXPIRY');
116  }
117  }
118 
119  // Check if expiry notification before weeks is enabled
120  if ($beforeWeeks = $journal->getData('numWeeksBeforeSubscriptionExpiryReminder')) {
121  $beforeDays = $beforeWeeks * 7;
122 
123  $expiryMonth = $curMonth + (int)floor(($curDay+$beforeDays)/31);
124  $expiryYear = $curYear + (int)floor($expiryMonth/12);
125  $expiryDay = (int)fmod($curDay+$beforeDays,31);
126  $expiryMonth = (int)fmod($expiryMonth,12);
127 
128  // Retrieve all subscriptions that match expiry date
129  $individualSubscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /* @var $individualSubscriptionDao IndividualSubscriptionDAO */
130  $institutionalSubscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /* @var $institutionalSubscriptionDao InstitutionalSubscriptionDAO */
131  $dateEnd = $expiryYear . '-' . $expiryMonth . '-' . $expiryDay;
132  $individualSubscriptions = $individualSubscriptionDao->getByDateEnd($dateEnd, $journal->getId());
133  $institutionalSubscriptions = $institutionalSubscriptionDao->getByDateEnd($dateEnd, $journal->getId());
134 
135  while ($subscription = $individualSubscriptions->next()) {
136  $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_BEFORE_EXPIRY');
137  }
138 
139  while ($subscription = $institutionalSubscriptions->next()) {
140  $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_BEFORE_EXPIRY');
141  }
142  }
143 
144  // Check if expiry notification after months is enabled
145  if ($afterMonths = $journal->getData('numMonthsAfterSubscriptionExpiryReminder')) {
146  $afterYears = (int)floor($afterMonths/12);
147  $afterMonths = (int)fmod($afterMonths,12);
148 
149  if (($curMonth - $afterMonths) <= 0) {
150  $afterYears++;
151  $expiryMonth = 12 + ($curMonth - $afterMonths);
152  } else {
153  $expiryMonth = $curMonth - $afterMonths;
154  }
155 
156  $expiryYear = $curYear - $afterYears;
157  $expiryDay = $curDay;
158 
159  // Retrieve all subscriptions that match expiry date
160  $individualSubscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /* @var $individualSubscriptionDao IndividualSubscriptionDAO */
161  $institutionalSubscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /* @var $institutionalSubscriptionDao InstitutionalSubscriptionDAO */
162  $dateEnd = $expiryYear . '-' . $expiryMonth . '-' . $expiryDay;
163  $individualSubscriptions = $individualSubscriptionDao->getByDateEnd($dateEnd, $journal->getId());
164  $institutionalSubscriptions = $institutionalSubscriptionDao->getByDateEnd($dateEnd, $journal->getId());
165 
166  while ($subscription = $individualSubscriptions->next()) {
167  $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_AFTER_EXPIRY_LAST');
168  }
169 
170  while ($subscription = $institutionalSubscriptions->next()) {
171  $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_AFTER_EXPIRY_LAST');
172  }
173  }
174 
175  // Check if expiry notification after weeks is enabled
176  if ($afterWeeks = $journal->getData('numWeeksAfterSubscriptionExpiryReminder')) {
177  $afterDays = $afterWeeks * 7;
178 
179  if (($curDay - $afterDays) <= 0) {
180  $afterMonths = 1;
181  $expiryDay = 31 + ($curDay - $afterDays);
182  } else {
183  $afterMonths = 0;
184  $expiryDay = $curDay - $afterDays;
185  }
186 
187  if (($curMonth - $afterMonths) == 0) {
188  $afterYears = 1;
189  $expiryMonth = 12;
190  } else {
191  $afterYears = 0;
192  $expiryMonth = $curMonth - $afterMonths;
193  }
194 
195  $expiryYear = $curYear - $afterYears;
196 
197  // Retrieve all subscriptions that match expiry date
198  $individualSubscriptionDao = DAORegistry::getDAO('IndividualSubscriptionDAO'); /* @var $individualSubscriptionDao IndividualSubscriptionDAO */
199  $institutionalSubscriptionDao = DAORegistry::getDAO('InstitutionalSubscriptionDAO'); /* @var $institutionalSubscriptionDao InstitutionalSubscriptionDAO */
200  $dateEnd = $expiryYear . '-' . $expiryMonth . '-' . $expiryDay;
201  $individualSubscriptions = $individualSubscriptionDao->getByDateEnd($dateEnd, $journal->getId());
202  $institutionalSubscriptions = $institutionalSubscriptionDao->getByDateEnd($dateEnd, $journal->getId());
203 
204  while ($subscription = $individualSubscriptions->next()) {
205  $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_AFTER_EXPIRY');
206  }
207 
208  while ($subscription = $institutionalSubscriptions->next()) {
209  $this->sendReminder($subscription, $journal, 'SUBSCRIPTION_AFTER_EXPIRY');
210  }
211  }
212  }
213  }
214 
218  protected function executeActions() {
219  $journalDao = DAORegistry::getDAO('JournalDAO'); /* @var $journalDao JournalDAO */
220  $journals = $journalDao->getAll(true);
221 
222  $todayDate = array(
223  'year' => date('Y'),
224  'month' => date('n'),
225  'day' => date('j')
226  );
227 
228  while ($journal = $journals->next()) {
229  // Send reminders based on current date
230  $this->sendJournalReminders($journal, $todayDate);
231  }
232 
233  // If it is the first day of a month but previous month had only
234  // 30 days then simulate 31st day for expiry dates that end on
235  // that day.
236  $shortMonths = array(2,4,6,9,11);
237 
238  if (($todayDate['day'] == 1) && in_array(($todayDate['month'] - 1), $shortMonths)) {
239 
240  $curDate['day'] = 31;
241  $curDate['month'] = $todayDate['month'] - 1;
242 
243  if ($curDate['month'] == 0) {
244  $curDate['month'] = 12;
245  $curDate['year'] = $todayDate['year'] - 1;
246  } else {
247  $curDate['year'] = $todayDate['year'];
248  }
249 
250  $journals = $journalDao->getAll(true);
251  while ($journal = $journals->next()) {
252  // Send reminders for simulated 31st day of short month
253  $this->sendJournalReminders($journal, $curDate);
254  }
255  }
256 
257  // If it is the first day of March, simulate 29th and 30th days for February
258  // or just the 30th day in a leap year.
259  if (($todayDate['day'] == 1) && ($todayDate['month'] == 3)) {
260 
261  $curDate['day'] = 30;
262  $curDate['month'] = 2;
263  $curDate['year'] = $todayDate['year'];
264 
265  $journals = $journalDao->getAll(true);
266  while ($journal = $journals->next()) {
267  // Send reminders for simulated 30th day of February
268  $this->sendJournalReminders($journal, $curDate);
269  }
270 
271  // Check if it's a leap year
272  if (date("L", mktime(0,0,0,0,0,$curDate['year'])) != '1') {
273 
274  $curDate['day'] = 29;
275 
276  $journals = $journalDao->getAll(true);
277 
278  while ($journal = $journals->next()) {
279  // Send reminders for simulated 29th day of February
280  $this->sendJournalReminders($journal, $curDate);
281  }
282  }
283  }
284  return true;
285  }
286 }
287 
288 
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
SubscriptionExpiryReminder\getName
getName()
Definition: SubscriptionExpiryReminder.inc.php:23
SubscriptionExpiryReminder\sendReminder
sendReminder($subscription, $journal, $emailKey)
Definition: SubscriptionExpiryReminder.inc.php:33
SubscriptionExpiryReminder
Class to perform automated reminders for reviewers.
Definition: SubscriptionExpiryReminder.inc.php:18
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
MailTemplate
Subclass of Mail for mailing a template email.
Definition: MailTemplate.inc.php:21
SubscriptionExpiryReminder\executeActions
executeActions()
Definition: SubscriptionExpiryReminder.inc.php:218
ScheduledTask
Base class for executing scheduled tasks. All scheduled task classes must extend this class and imple...
Definition: ScheduledTask.inc.php:20
SubscriptionExpiryReminder\sendJournalReminders
sendJournalReminders($journal, $curDate)
Definition: SubscriptionExpiryReminder.inc.php:86