Exemplo n.º 1
0
 public static function sendNotifications($memberships, $cid = null, $resend = false)
 {
     // Get custom fields
     $db = JFactory::getDBO();
     $query = $db->getQuery(true);
     $date = JFactory::getDate();
     $fields = RSMembership::getCustomFields();
     $config = RSMembershipConfig::getInstance();
     $update_ids = array();
     foreach ($memberships as $membership) {
         $date = JFactory::getDate();
         $interval = $membership->expire_notify_interval;
         $date->modify("+{$interval} days");
         // Select all the subscriptions that match (about to expire)
         $query->clear();
         $query->select($db->qn('u.id', 'user_id'))->select($db->qn('u.email', 'user_email'))->select($db->qn('u.name', 'user_name'))->select($db->qn('u.username', 'user_username'))->select($db->qn('mu.id', 'muid'))->select($db->qn('mu.extras'))->select($db->qn('mu.membership_end'))->select($db->qn('mu.from_transaction_id'))->from($db->qn('#__rsmembership_membership_subscribers', 'mu'))->join('left', $db->qn('#__users', 'u') . ' ON ' . $db->qn('mu.user_id') . ' = ' . $db->qn('u.id'))->where($db->qn('mu.status') . ' = ' . $db->q(MEMBERSHIP_STATUS_ACTIVE))->where($db->qn('mu.published') . ' = ' . $db->q(1));
         if (!$resend) {
             $query->where($db->qn('mu.notified') . ' = ' . $db->q($db->getNullDate()));
         }
         $query->where($db->qn('mu.membership_end') . ' != ' . $db->q($db->getNulldate()))->where($db->qn('mu.membership_end') . ' < ' . $db->q($date->toSql()))->where($db->qn('mu.membership_id') . ' = ' . $db->q($membership->id));
         if ($cid != null && is_array($cid) && count($cid) > 0) {
             $ids = implode($db->q(','), $cid);
             $query->where($db->qn('mu.id') . ' IN (' . $ids . ')');
         }
         $db->setQuery($query, 0, $config->get('expire_emails'));
         $results = $db->loadObjectList();
         // No results, next membership
         if (empty($results)) {
             continue;
         }
         $now = JFactory::getDate()->toUnix();
         $sentToUser = false;
         $sentToAdmin = false;
         foreach ($results as $result) {
             $extras = '';
             // Performance check
             if ($result->extras && (strpos($membership->user_email_expire_text . $membership->user_email_expire_subject, '{extras}') !== false || strpos($membership->admin_email_expire_text . $membership->admin_email_expire_subject, '{extras}') !== false)) {
                 $extras = RSMembershipHelper::getExtrasNames($result->extras);
             }
             $expireDate = JFactory::getDate($result->membership_end);
             $expireIn = ceil(($expireDate->toUnix() - $now) / 86400);
             $placeholders = array('{membership}' => $membership->name, '{membership_end}' => RSMembershipHelper::showDate($result->membership_end), '{extras}' => $extras, '{email}' => $result->user_email, '{name}' => $result->user_name, '{username}' => $result->user_username, '{interval}' => $expireIn);
             $replace = array_keys($placeholders);
             $with = array_values($placeholders);
             $query->clear();
             $query->select('*')->from($db->qn('#__rsmembership_subscribers'))->where($db->qn('user_id') . ' = ' . $db->q($result->user_id));
             $db->setQuery($query);
             $user_data_tmp = $db->loadObject();
             $user_data = array();
             foreach ($fields as $field) {
                 $field_id = 'f' . $field->id;
                 $user_data[$field->name] = isset($user_data_tmp->{$field_id}) ? $user_data_tmp->{$field_id} : '';
             }
             unset($user_data_tmp);
             foreach ($fields as $field) {
                 $name = $field->name;
                 $replace[] = '{' . $name . '}';
                 if (isset($user_data[$name])) {
                     $with[] = is_array($user_data[$name]) ? implode("\n", $user_data[$name]) : $user_data[$name];
                 } else {
                     $with[] = '';
                 }
             }
             $membership_fields = RSMembership::getCustomMembershipFields($membership->id);
             $transaction_user_data = RSMembership::getUserData($result->from_transaction_id);
             foreach ($membership_fields as $field) {
                 $name = $field->name;
                 $replace[] = '{' . $name . '}';
                 if (isset($transaction_user_data->membership_fields[$name])) {
                     $with[] = is_array($transaction_user_data->membership_fields[$name]) ? implode("\n", $transaction_user_data->membership_fields[$name]) : $transaction_user_data->membership_fields[$name];
                 } else {
                     $with[] = '';
                 }
             }
             $jconfig = JFactory::getConfig();
             if ($membership->user_email_expire_subject) {
                 $message = str_replace($replace, $with, $membership->user_email_expire_text);
                 // from address
                 $from = $membership->user_email_use_global ? $jconfig->get('mailfrom') : $membership->user_email_from_addr;
                 // from name
                 $fromName = $membership->user_email_use_global ? $jconfig->get('fromname') : $membership->user_email_from;
                 // recipient
                 $recipient = $result->user_email;
                 // user email
                 // subject
                 $subject = str_replace($replace, $with, $membership->user_email_expire_subject);
                 // body
                 $body = $message;
                 // mode
                 $mode = $membership->user_email_mode;
                 // cc
                 $cc = null;
                 // bcc
                 $bcc = null;
                 // attachments
                 $query->clear();
                 $query->select($db->qn('path'))->from($db->qn('#__rsmembership_membership_attachments'))->where($db->qn('membership_id') . ' = ' . $db->q($membership->id))->where($db->qn('email_type') . ' = ' . $db->q('user_email_expire'))->where($db->qn('published') . '=' . $db->q('1'))->order($db->qn('ordering') . ' ASC');
                 $db->setQuery($query);
                 $attachment = $db->loadColumn();
                 // reply to
                 $replyto = $from;
                 // reply to name
                 $replytoname = $fromName;
                 // send to user
                 RSMembershipHelper::sendMail($from, $fromName, $recipient, $subject, $body, $mode, $cc, $bcc, $attachment, $replyto, $replytoname);
                 $sentToUser = true;
                 self::syslog('expiry-notification', "Membership: " . $membership->name . " (" . $membership->id . ") | Email sent to {$recipient} (Subject: {$subject})");
             }
             // admin emails
             if ($membership->admin_email_expire_subject) {
                 $message = str_replace($replace, $with, $membership->admin_email_expire_text);
                 // from address
                 $from = trim($membership->admin_email_from_addr) != '' ? $membership->admin_email_from_addr : $result->user_email;
                 // from name
                 $fromName = $result->user_name;
                 // recipient
                 $recipient = $membership->admin_email_to_addr;
                 // subject
                 $subject = str_replace($replace, $with, $membership->admin_email_expire_subject);
                 // body
                 $body = $message;
                 // mode
                 $mode = $membership->admin_email_mode;
                 // cc
                 $cc = null;
                 // bcc
                 $bcc = null;
                 // attachments
                 $attachment = null;
                 // reply to
                 $replyto = $from;
                 // reply to name
                 $replytoname = $fromName;
                 // send to admin
                 if ($subject != '') {
                     RSMembershipHelper::sendMail($from, $fromName, $recipient, $subject, $body, $mode, $cc, $bcc, $attachment, $replyto, $replytoname);
                     $sentToAdmin = true;
                     self::syslog('expiry-notification', "Membership: " . $membership->name . " (" . $membership->id . ") | Admin email sent to {$recipient} (Subject: {$subject})");
                 }
             }
             if ($sentToUser || $sentToAdmin) {
                 $update_ids[] = $result->muid;
             }
         }
     }
     if (!empty($update_ids)) {
         $query->clear();
         $query->update($db->qn('#__rsmembership_membership_subscribers'))->set($db->qn('notified') . ' = ' . $db->q($date->toSql()))->where($db->qn('id') . ' IN (\'' . implode($db->q(','), $update_ids) . '\')');
         $db->setQuery($query);
         $db->execute();
         return true;
     } else {
         return false;
     }
 }