diff --git a/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index 979ee836fb..157b80ded8 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -67,6 +67,7 @@ class Scheduler { } function processPostNotificationNewsletter($newsletter, $queue) { + // ensure that segments exist $segments = $newsletter->segments()->findArray(); if(empty($segments)) { $this->deleteQueueOrUpdateNextRunDate($queue, $newsletter); @@ -76,6 +77,7 @@ class Scheduler { return (int)$segment['id']; }, $segments); + // ensure that subscribers are in segments $subscribers = Subscriber::getSubscribedInSegments($segment_ids) ->findArray(); $subscribers = Helpers::arrayColumn($subscribers, 'subscriber_id'); @@ -85,13 +87,13 @@ class Scheduler { $this->deleteQueueOrUpdateNextRunDate($queue, $newsletter); return; } - // schedule new queue if the post notification is not destined for immediate delivery - if($newsletter->intervalType !== NewsletterScheduler::INTERVAL_IMMEDIATELY) { - $new_queue = SendingQueue::create(); - $new_queue->newsletter_id = $newsletter->id; - $new_queue->status = SendingQueue::STATUS_SCHEDULED; - self::deleteQueueOrUpdateNextRunDate($new_queue, $newsletter); - } + + // create a duplicate newsletter that acts as a history record + $notification_history = $this->createNotificationHistory($newsletter->id); + if(!$notification_history) return; + + // queue newsletter for delivery + $queue->newsletter_id = $notification_history->id; $queue->subscribers = serialize( array( 'to_process' => $subscribers @@ -166,7 +168,7 @@ class Scheduler { return true; } - private function deleteQueueOrUpdateNextRunDate($queue, $newsletter) { + function deleteQueueOrUpdateNextRunDate($queue, $newsletter) { if($newsletter->intervalType === NewsletterScheduler::INTERVAL_IMMEDIATELY) { $queue->delete(); } else { @@ -175,4 +177,12 @@ class Scheduler { $queue->save(); } } -} + + function createNotificationHistory($newsletter_id) { + $newsletter = Newsletter::findOne($newsletter_id); + $notification_history = $newsletter->createNotificationHistory(); + return ($notification_history->getErrors() === false) ? + $notification_history : + false; + } +} \ No newline at end of file diff --git a/lib/Cron/Workers/SendingQueue/SendingQueue.php b/lib/Cron/Workers/SendingQueue/SendingQueue.php index 168d3bd063..25fc18551a 100644 --- a/lib/Cron/Workers/SendingQueue/SendingQueue.php +++ b/lib/Cron/Workers/SendingQueue/SendingQueue.php @@ -178,13 +178,14 @@ class SendingQueue { if(!$queue->count_to_process) { $queue->processed_at = current_time('mysql'); $queue->status = SendingQueueModel::STATUS_COMPLETED; - // set newsletter status to sent + // if it's a standard or post notificaiton newsletter, update its status to sent $newsletter = NewsletterModel::findOne($queue->newsletter_id); - // if it's a standard newsletter, update its status - if($newsletter->type === NewsletterModel::TYPE_STANDARD) { + if($newsletter->type === NewsletterModel::TYPE_STANDARD || + $newsletter->type === NewsletterModel::TYPE_NOTIFICATION_HISTORY + ) { $newsletter->setStatus(NewsletterModel::STATUS_SENT); } } return $queue->save(); } -} +} \ No newline at end of file diff --git a/lib/Models/Newsletter.php b/lib/Models/Newsletter.php index d04c750bcc..b39ee0e868 100644 --- a/lib/Models/Newsletter.php +++ b/lib/Models/Newsletter.php @@ -109,6 +109,44 @@ class Newsletter extends Model { return $duplicate; } + function createNotificationHistory() { + // get current newsletter's data as an array + $newsletter_data = $this->asArray(); + + // remove id so that it creates a new record + unset($newsletter_data['id']); + + // update newsletter columns + $data = array_merge( + $newsletter_data, + array( + 'parent_id' => $this->id, + 'type' => self::TYPE_NOTIFICATION_HISTORY, + 'status' => self::STATUS_SENDING + )); + + $notification_history = self::create(); + $notification_history->hydrate($data); + + $notification_history->save(); + + if($notification_history->getErrors() === false) { + // create relationships between notification history and segments + $segments = $this->segments()->findArray(); + + if(!empty($segments)) { + foreach($segments as $segment) { + $relation = NewsletterSegment::create(); + $relation->segment_id = $segment['id']; + $relation->newsletter_id = $notification_history->id; + $relation->save(); + } + } + } + + return $notification_history; + } + function asArray() { $model = parent::asArray(); @@ -580,4 +618,4 @@ class Newsletter extends Model { ->whereIn('options.value', $segments) ->findMany(); } -} +} \ No newline at end of file diff --git a/lib/Router/SendingQueue.php b/lib/Router/SendingQueue.php index 508eab0177..9ab1d0b32d 100644 --- a/lib/Router/SendingQueue.php +++ b/lib/Router/SendingQueue.php @@ -37,8 +37,10 @@ class SendingQueue { ); } - if($newsletter->type === Newsletter::TYPE_WELCOME) { - // set welcome email active + if($newsletter->type === Newsletter::TYPE_WELCOME || + $newsletter->type === Newsletter::TYPE_NOTIFICATION + ) { + // set newsletter status to active $result = $newsletter->setStatus(Newsletter::STATUS_ACTIVE); $errors = $result->getErrors(); @@ -48,20 +50,16 @@ class SendingQueue { 'errors' => $errors ); } else { + $message = ($newsletter->type === Newsletter::TYPE_WELCOME) ? + __('Your welcome email has been activated') : + __('Your post notification has been activated'); return array( 'result' => true, 'data' => array( - 'message' => __('Your welcome email has been activated') + 'message' => $message ) ); } - } else if($newsletter->type === Newsletter::TYPE_NOTIFICATION) { - // Post Notifications - $newsletter = Scheduler::processPostNotificationSchedule($newsletter->id); - Scheduler::createPostNotificationQueue($newsletter); - - // set post notification active - $newsletter->setStatus(Newsletter::STATUS_ACTIVE); } $queue = SendingQueueModel::whereNull('status') @@ -83,18 +81,6 @@ class SendingQueue { $queue->newsletter_id = $newsletter->id; } - if($newsletter->type === Newsletter::TYPE_NOTIFICATION) { - $queue->scheduled_at = Scheduler::getNextRunDate($newsletter->schedule); - $queue->status = SendingQueueModel::STATUS_SCHEDULED; - $queue->save(); - return array( - 'result' => true, - 'data' => array( - 'message' => __('Your post notification has been activated') - ) - ); - } - if((bool)$newsletter->isScheduled) { // set newsletter status $newsletter->setStatus(Newsletter::STATUS_SCHEDULED); @@ -188,4 +174,4 @@ class SendingQueue { 'result' => $result ); } -} +} \ No newline at end of file