Open Journal Systems  3.3.0
SubscriptionDAO.inc.php
1 <?php
2 
17 import('classes.subscription.Subscription');
18 import('classes.subscription.SubscriptionType');
19 
20 define('SUBSCRIPTION_USER', 0x01);
21 define('SUBSCRIPTION_MEMBERSHIP', 0x02);
22 define('SUBSCRIPTION_REFERENCE_NUMBER', 0x03);
23 define('SUBSCRIPTION_NOTES', 0x04);
24 
25 abstract class SubscriptionDAO extends DAO {
26 
32  abstract function getById($subscriptionId);
33 
39  function getSubscriptionJournalId($subscriptionId) {
40  $result = $this->retrieve(
41  'SELECT journal_id FROM subscriptions WHERE subscription_id = ?', (int) $subscriptionId
42  );
43 
44  $returner = isset($result->fields[0]) ? $result->fields[0] : false;
45 
46  $result->Close();
47  return $returner;
48  }
49 
54  static function getStatusOptions() {
55  return array(
56  SUBSCRIPTION_STATUS_ACTIVE => 'subscriptions.status.active',
57  SUBSCRIPTION_STATUS_NEEDS_INFORMATION => 'subscriptions.status.needsInformation',
58  SUBSCRIPTION_STATUS_NEEDS_APPROVAL => 'subscriptions.status.needsApproval',
59  SUBSCRIPTION_STATUS_AWAITING_MANUAL_PAYMENT => 'subscriptions.status.awaitingManualPayment',
60  SUBSCRIPTION_STATUS_AWAITING_ONLINE_PAYMENT => 'subscriptions.status.awaitingOnlinePayment',
61  SUBSCRIPTION_STATUS_OTHER => 'subscriptions.status.other'
62  );
63  }
64 
70  abstract function getStatusCount($status);
71 
77  abstract function subscriptionExists($subscriptionId);
78 
85  abstract function subscriptionExistsByUser($subscriptionId, $userId);
86 
93  abstract function subscriptionExistsByUserForJournal($userId, $journalId);
94 
99  abstract function insertObject($subscription);
100 
105  function getInsertId() {
106  return $this->_getInsertId('subscriptions', 'subscription_id');
107  }
108 
114  abstract function updateObject($subscription);
115 
121  abstract function deleteById($subscriptionId, $journalId);
122 
128  abstract function deleteByJournalId($journalId);
129 
135  abstract function deleteByUserId($userId);
136 
142  abstract function deleteByTypeId($subscriptionTypeId);
143 
148  abstract function getAll($rangeInfo = null);
149 
162  abstract function getByJournalId($journalId, $status = null, $searchField = null, $searchMatch = null, $search = null, $dateField = null, $dateFrom = null, $dateTo = null, $rangeInfo = null);
163 
170  abstract function getByDateEnd($dateEnd, $journalId, $rangeInfo = null);
171 
178  abstract function renewSubscription($subscription);
179 
184  protected function _generateSearchSQL($status = null, $searchField = null, $searchMatch = null, $search = null, $dateField = null, $dateFrom = null, $dateTo = null, &$params) {
185  $searchSql = '';
186 
187  if (!empty($search)) switch ($searchField) {
188  case IDENTITY_SETTING_GIVENNAME:
189  if ($searchMatch === 'is') {
190  $searchSql = ' AND LOWER(COALESCE(ugl.setting_value,ugpl.setting_value)) = LOWER(?)';
191  } elseif ($searchMatch === 'contains') {
192  $searchSql = ' AND LOWER(COALESCE(ugl.setting_value,ugpl.setting_value)) LIKE LOWER(?)';
193  $search = '%' . $search . '%';
194  } else { // $searchMatch === 'startsWith'
195  $searchSql = ' AND LOWER(COALESCE(ugl,ugpl)) LIKE LOWER(?)';
196  $search = $search . '%';
197  }
198  $params[] = $search;
199  break;
200  case IDENTITY_SETTING_FAMILYNAME:
201  if ($searchMatch === 'is') {
202  $searchSql = ' AND LOWER(COALESCE(ufl.setting_value,ufpl.setting_value)) = LOWER(?)';
203  } elseif ($searchMatch === 'contains') {
204  $searchSql = ' AND LOWER(COALESCE(ufl.setting_value,ufpl.setting_value)) LIKE LOWER(?)';
205  $search = '%' . $search . '%';
206  } else { // $searchMatch === 'startsWith'
207  $searchSql = ' AND LOWER(COALESCE(ufl.setting_value,ufpl.setting_value)) LIKE LOWER(?)';
208  $search = $search . '%';
209  }
210  $params[] = $search;
211  break;
212  case USER_FIELD_USERNAME:
213  if ($searchMatch === 'is') {
214  $searchSql = ' AND LOWER(u.username) = LOWER(?)';
215  } elseif ($searchMatch === 'contains') {
216  $searchSql = ' AND LOWER(u.username) LIKE LOWER(?)';
217  $search = '%' . $search . '%';
218  } else { // $searchMatch === 'startsWith'
219  $searchSql = ' AND LOWER(u.username) LIKE LOWER(?)';
220  $search = $search . '%';
221  }
222  $params[] = $search;
223  break;
224  case USER_FIELD_EMAIL:
225  if ($searchMatch === 'is') {
226  $searchSql = ' AND LOWER(u.email) = LOWER(?)';
227  } elseif ($searchMatch === 'contains') {
228  $searchSql = ' AND LOWER(u.email) LIKE LOWER(?)';
229  $search = '%' . $search . '%';
230  } else { // $searchMatch === 'startsWith'
231  $searchSql = ' AND LOWER(u.email) LIKE LOWER(?)';
232  $search = $search . '%';
233  }
234  $params[] = $search;
235  break;
236  case SUBSCRIPTION_MEMBERSHIP:
237  if ($searchMatch === 'is') {
238  $searchSql = ' AND LOWER(s.membership) = LOWER(?)';
239  } elseif ($searchMatch === 'contains') {
240  $searchSql = ' AND LOWER(s.membership) LIKE LOWER(?)';
241  $search = '%' . $search . '%';
242  } else { // $searchMatch === 'startsWith'
243  $searchSql = ' AND LOWER(s.membership) LIKE LOWER(?)';
244  $search = $search . '%';
245  }
246  $params[] = $search;
247  break;
248  case SUBSCRIPTION_REFERENCE_NUMBER:
249  if ($searchMatch === 'is') {
250  $searchSql = ' AND LOWER(s.reference_number) = LOWER(?)';
251  } elseif ($searchMatch === 'contains') {
252  $searchSql = ' AND LOWER(s.reference_number) LIKE LOWER(?)';
253  $search = '%' . $search . '%';
254  } else { // $searchMatch === 'startsWith'
255  $searchSql = ' AND LOWER(s.reference_number) LIKE LOWER(?)';
256  $search = $search . '%';
257  }
258  $params[] = $search;
259  break;
260  case SUBSCRIPTION_NOTES:
261  if ($searchMatch === 'is') {
262  $searchSql = ' AND LOWER(s.notes) = LOWER(?)';
263  } elseif ($searchMatch === 'contains') {
264  $searchSql = ' AND LOWER(s.notes) LIKE LOWER(?)';
265  $search = '%' . $search . '%';
266  } else { // $searchMatch === 'startsWith'
267  $searchSql = ' AND LOWER(s.notes) LIKE LOWER(?)';
268  $search = $search . '%';
269  }
270  $params[] = $search;
271  break;
272  }
273 
274  if (!empty($dateFrom) || !empty($dateTo)) switch($dateField) {
275  case SUBSCRIPTION_DATE_START:
276  if (!empty($dateFrom)) {
277  $searchSql .= ' AND s.date_start >= ' . $this->datetimeToDB($dateFrom);
278  }
279  if (!empty($dateTo)) {
280  $searchSql .= ' AND s.date_start <= ' . $this->datetimeToDB($dateTo);
281  }
282  break;
283  case SUBSCRIPTION_DATE_END:
284  if (!empty($dateFrom)) {
285  $searchSql .= ' AND s.date_end >= ' . $this->datetimeToDB($dateFrom);
286  }
287  if (!empty($dateTo)) {
288  $searchSql .= ' AND s.date_end <= ' . $this->datetimeToDB($dateTo);
289  }
290  break;
291  }
292 
293  if (!empty($status)) {
294  $searchSql .= ' AND s.status = ' . (int) $status;
295  }
296 
297  return $searchSql;
298  }
299 
304  abstract function newDataObject();
305 
311  function _fromRow($row) {
312  $subscription = $this->newDataObject();
313  $subscription->setId($row['subscription_id']);
314  $subscription->setJournalId($row['journal_id']);
315  $subscription->setUserId($row['user_id']);
316  $subscription->setTypeId($row['type_id']);
317  $subscription->setDateStart($this->dateFromDB($row['date_start']));
318  $subscription->setDateEnd($this->dateFromDB($row['date_end']));
319  $subscription->setStatus($row['status']);
320  $subscription->setMembership($row['membership']);
321  $subscription->setReferenceNumber($row['reference_number']);
322  $subscription->setNotes($row['notes']);
323 
324  HookRegistry::call('SubscriptionDAO::_fromRow', array(&$subscription, &$row));
325 
326  return $subscription;
327  }
328 
334  function _insertObject($subscription) {
335  $dateStart = $subscription->getDateStart();
336  $dateEnd = $subscription->getDateEnd();
337  $this->update(
338  sprintf('INSERT INTO subscriptions
339  (journal_id, user_id, type_id, date_start, date_end, status, membership, reference_number, notes)
340  VALUES
341  (?, ?, ?, %s, %s, ?, ?, ?, ?)',
342  $dateStart!==null?$this->dateToDB($dateStart):'null',
343  $dateEnd!==null?$this->datetimeToDB($dateEnd):'null'
344  ), array(
345  (int) $subscription->getJournalId(),
346  (int) $subscription->getUserId(),
347  (int) $subscription->getTypeId(),
348  (int) $subscription->getStatus(),
349  $subscription->getMembership(),
350  $subscription->getReferenceNumber(),
351  $subscription->getNotes()
352  )
353  );
354 
355  $subscriptionId = $this->getInsertId();
356  $subscription->setId($subscriptionId);
357 
358  return $subscriptionId;
359  }
360 
365  function _updateObject($subscription) {
366  $dateStart = $subscription->getDateStart();
367  $dateEnd = $subscription->getDateEnd();
368  $this->update(
369  sprintf('UPDATE subscriptions
370  SET
371  journal_id = ?,
372  user_id = ?,
373  type_id = ?,
374  date_start = %s,
375  date_end = %s,
376  status = ?,
377  membership = ?,
378  reference_number = ?,
379  notes = ?
380  WHERE subscription_id = ?',
381  $dateStart!==null?$this->dateToDB($dateStart):'null',
382  $dateEnd!==null?$this->datetimeToDB($dateEnd):'null'
383  ), array(
384  (int) $subscription->getJournalId(),
385  (int) $subscription->getUserId(),
386  (int) $subscription->getTypeId(),
387  (int) $subscription->getStatus(),
388  $subscription->getMembership(),
389  $subscription->getReferenceNumber(),
390  $subscription->getNotes(),
391  (int) $subscription->getId()
392  )
393  );
394  }
395 
402  function _renewSubscription($subscription) {
403  if ($subscription->isNonExpiring()) return;
404 
405  $subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /* @var $subscriptionTypeDao SubscriptionTypeDAO */
406  $subscriptionType = $subscriptionTypeDao->getById($subscription->getTypeId());
407 
408  $duration = $subscriptionType->getDuration();
409  $dateEnd = strtotime($subscription->getDateEnd());
410 
411  // if the subscription is expired, extend it to today + duration of subscription
412  $time = time();
413  if ($dateEnd < $time ) $dateEnd = $time;
414 
415  $subscription->setDateEnd(mktime(23, 59, 59, date("m", $dateEnd)+$duration, date("d", $dateEnd), date("Y", $dateEnd)));
416  $this->updateObject($subscription);
417  }
418 }
419 
420 
SubscriptionDAO\getByDateEnd
getByDateEnd($dateEnd, $journalId, $rangeInfo=null)
SubscriptionDAO\updateObject
updateObject($subscription)
SubscriptionDAO\getSubscriptionJournalId
getSubscriptionJournalId($subscriptionId)
Definition: SubscriptionDAO.inc.php:39
SubscriptionDAO\_insertObject
_insertObject($subscription)
Definition: SubscriptionDAO.inc.php:334
SubscriptionDAO\insertObject
insertObject($subscription)
SubscriptionDAO\getById
getById($subscriptionId)
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
SubscriptionDAO\getByJournalId
getByJournalId($journalId, $status=null, $searchField=null, $searchMatch=null, $search=null, $dateField=null, $dateFrom=null, $dateTo=null, $rangeInfo=null)
SubscriptionDAO\_generateSearchSQL
_generateSearchSQL($status=null, $searchField=null, $searchMatch=null, $search=null, $dateField=null, $dateFrom=null, $dateTo=null, &$params)
Definition: SubscriptionDAO.inc.php:184
DAO\dateToDB
dateToDB($d)
Definition: DAO.inc.php:309
DAO\retrieve
& retrieve($sql, $params=false, $callHooks=true)
Definition: DAO.inc.php:85
SubscriptionDAO\deleteByTypeId
deleteByTypeId($subscriptionTypeId)
SubscriptionDAO\deleteByJournalId
deleteByJournalId($journalId)
SubscriptionDAO\getAll
getAll($rangeInfo=null)
SubscriptionDAO\renewSubscription
renewSubscription($subscription)
SubscriptionDAO\getInsertId
getInsertId()
Definition: SubscriptionDAO.inc.php:105
SubscriptionDAO
Abstract class for retrieving and modifying subscriptions.
Definition: SubscriptionDAO.inc.php:25
SubscriptionDAO\subscriptionExistsByUser
subscriptionExistsByUser($subscriptionId, $userId)
DAO\update
update($sql, $params=false, $callHooks=true, $dieOnError=true)
Definition: DAO.inc.php:214
DAO\datetimeToDB
datetimeToDB($dt)
Definition: DAO.inc.php:299
SubscriptionDAO\deleteById
deleteById($subscriptionId, $journalId)
SubscriptionDAO\subscriptionExistsByUserForJournal
subscriptionExistsByUserForJournal($userId, $journalId)
DAO\dateFromDB
dateFromDB($d)
Definition: DAO.inc.php:329
DAO\_getInsertId
_getInsertId($table='', $id='')
Definition: DAO.inc.php:255
SubscriptionDAO\_renewSubscription
_renewSubscription($subscription)
Definition: SubscriptionDAO.inc.php:402
SubscriptionDAO\newDataObject
newDataObject()
SubscriptionDAO\_fromRow
_fromRow($row)
Definition: SubscriptionDAO.inc.php:311
SubscriptionDAO\getStatusOptions
static getStatusOptions()
Definition: SubscriptionDAO.inc.php:54
SubscriptionDAO\_updateObject
_updateObject($subscription)
Definition: SubscriptionDAO.inc.php:365
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
DAO
Operations for retrieving and modifying objects from a database.
Definition: DAO.inc.php:31
SubscriptionDAO\deleteByUserId
deleteByUserId($userId)
SubscriptionDAO\getStatusCount
getStatusCount($status)
SubscriptionDAO\subscriptionExists
subscriptionExists($subscriptionId)