/**
  * Replaces markers in newsletter content
  * @param string $content
  * @param CjwNewsletterEditionSend $newsletterEditionSend
  * @param CjwNewsletterUser $newsletterUser
  * @return string
  */
 static function replaceNewsletterMarkers($content, CjwNewsletterEditionSend $newsletterEditionSend, CjwNewsletterUser $newsletterUser = null)
 {
     // TODO parse extra variables
     $editionSendHash = $newsletterEditionSend->attribute('hash');
     $searchArray = array('#_hash_editionsend_#');
     $replaceArray = array($editionSendHash);
     if ($newsletterUser) {
         $subscription = CjwNewsletterSubscription::fetchByListIdAndNewsletterUserId($newsletterEditionSend->attribute('list_contentobject_id'), $newsletterUser->attribute('id'));
         $newsletterUnsubscribeHash = $subscription->attribute('hash');
         $newsletterConfigureHash = $newsletterUser->attribute('hash');
         $personalizeContent = (int) $newsletterEditionSend->attribute('personalize_content');
         $searchArray = array_merge($searchArray, array('#_hash_unsubscribe_#', '#_hash_configure_#'));
         $replaceArray = array_merge($replaceArray, array($newsletterUnsubscribeHash, $newsletterConfigureHash));
         if ($personalizeContent === 1) {
             $searchArray = array_merge($searchArray, array('[[name]]', '[[salutation_name]]', '[[first_name]]', '[[last_name]]'));
             $replaceArray = array_merge($replaceArray, array($newsletterUser->attribute('name'), $newsletterUser->attribute('salutation_name'), $newsletterUser->attribute('first_name'), $newsletterUser->attribute('last_name')));
         }
     }
     return str_replace($searchArray, $replaceArray, $content);
 }
 /**
  * create / update subscription
  * return newsletter_user_object
  *
  * @param integer $listContentObjectId
  * @param integer $newsletterUserId
  * @param array $outputFormatArray
  * @param integer $status
  * @param integer $dryRun if true changes will be not stored to db usefull for test runs @see user_edit
  * @return object
  */
 static function createUpdateNewsletterSubscription($listContentObjectId, $newsletterUserId, $outputFormatArray, $status = CjwNewsletterSubscription::STATUS_PENDING, $dryRun = false, $context = 'default')
 {
     $existingSubscriptionObject = CjwNewsletterSubscription::fetchByListIdAndNewsletterUserId($listContentObjectId, $newsletterUserId);
     $newsletterUser = CjwNewsletterUser::fetch($newsletterUserId);
     // if nl user status is confirmed set all nl subscription with status pending to confirmed
     if (is_object($newsletterUser) && (int) $newsletterUser->attribute('status') == CjwNewsletterUser::STATUS_CONFIRMED && $status == CjwNewsletterSubscription::STATUS_PENDING) {
         $status = CjwNewsletterSubscription::STATUS_CONFIRMED;
     }
     // update existing
     if (is_object($existingSubscriptionObject)) {
         $existingSubscriptionObject->setAttribute('output_format_array_string', CjwNewsletterSubscription::arrayToString($outputFormatArray));
         if ($context == 'configure') {
             // if nl list autoapprove is disabled + admin has approved the nl subscription
             // + the nl subscription should be get status approved when update confirmstatus,
             if ($existingSubscriptionObject->attribute('status') == CjwNewsletterSubscription::STATUS_APPROVED) {
                 // set confirmed timestamp if emty - could be possible if admin has approved subscription before user has confirm his email address
                 if ($existingSubscriptionObject->attribute('confirmed') == 0) {
                     $existingSubscriptionObject->setAttribute('confirmed', time());
                 }
                 // else nothing
             } else {
                 $existingSubscriptionObject->setAttribute('status', $status);
             }
         } else {
             $existingSubscriptionObject->setAttribute('status', $status);
         }
         if ($dryRun === false) {
             $existingSubscriptionObject->sync();
         }
         return $existingSubscriptionObject;
     } else {
         $object = CjwNewsletterSubscription::create($listContentObjectId, $newsletterUserId, $outputFormatArray, $status, $context);
         if ($dryRun === false) {
             $object->store();
         }
         return $object;
     }
 }
     $userObject = CjwNewsletterUser::createUpdateNewsletterUser($email, $salutation, $firstName, $lastName, $eZUserId, CjwNewsletterUser::STATUS_CONFIRMED, 'default', $customDataText1, $customDataText2, $customDataText3, $customDataText4);
     $userObject->setAttribute('import_id', $importId);
     // set new remote_id
     if ($remote_id !== false) {
         $userObject->setAttribute('remote_id', $remote_id);
     } else {
         $userObject->setAttribute('remote_id', 'cjwnl:csvimport:' . CjwNewsletterUtils::generateUniqueMd5Hash($userObject->attribute('id')));
     }
     $userObject->store();
     $newUserStatus = $userObject->attribute('status');
 }
 $newsletterUserId = $userObject->attribute('id');
 $outputFormatArray = $selectedOutputFormatArray;
 // only user which are not blacklisted can get a new subscription
 if ($newsletterUserId != null && $userIsBlacklistedOrRemoved === false) {
     $existingSubscription = CjwNewsletterSubscription::fetchByListIdAndNewsletterUserId($listContentObjectId, $newsletterUserId);
     // if subscription exists do nothing
     if (is_object($existingSubscription)) {
         $existingSubscriptionStatus = $existingSubscription->attribute('status');
         // if user has removed a subscription by himself
         // don't activate it again
         if ($existingSubscription->isRemovedSelf() || $existingSubscription->isBlacklisted()) {
             // no
             $createNewSubscription = 0;
         } else {
             // 2 - update
             $createNewSubscription = 2;
             $subscriptionObject = $existingSubscription;
             $subscriptionObject->setAttribute('status', CjwNewsletterSubscription::STATUS_APPROVED);
             $subscriptionObject->setAttribute('import_id', $importId);
             // set new remote_id