/**
  * No validation errors occured, so we register the customer and send
  * mails with further instructions for the double opt-in procedure.
  *
  * @param SS_HTTPRequest $data       SS session data
  * @param Form           $form       the form object
  * @param array          $formData   CustomHTMLForms session data
  * @param bool           $doRedirect Set to true to redirect after submitSuccess
  *
  * @return void
  * 
  * @author Sebastian Diel <*****@*****.**>,
  *         Roland Lehmann <*****@*****.**>,
  *         Sascha Koehler <*****@*****.**>
  * @since 28.01.2015
  */
 protected function submitSuccess($data, $form, $formData, $doRedirect = true)
 {
     $anonymousCustomer = false;
     /*
      * Logout anonymous users and save their shoppingcart temporarily.
      */
     if (SilvercartCustomer::currentUser()) {
         $anonymousCustomer = SilvercartCustomer::currentUser();
         SilvercartCustomer::currentUser()->logOut();
     }
     // Aggregate Data and set defaults
     $formData['MemberID'] = Member::currentUserID();
     $formData['Locale'] = Translatable::get_current_locale();
     if ($this->demandBirthdayDate()) {
         $formData['Birthday'] = $formData['BirthdayYear'] . '-' . $formData['BirthdayMonth'] . '-' . $formData['BirthdayDay'];
         if ($this->UseMinimumAgeToOrder()) {
             if (!SilvercartConfig::CheckMinimumAgeToOrder($formData['Birthday'])) {
                 $this->errorMessages['BirthdayDay'] = array('message' => SilvercartConfig::MinimumAgeToOrderError(), 'fieldname' => _t('SilvercartPage.BIRTHDAY'), 'BirthdayDay' => array('message' => SilvercartConfig::MinimumAgeToOrderError()));
                 $this->errorMessages['BirthdayMonth'] = array('message' => SilvercartConfig::MinimumAgeToOrderError(), 'fieldname' => _t('SilvercartPage.BIRTHDAY'), 'BirthdayMonth' => array('message' => SilvercartConfig::MinimumAgeToOrderError()));
                 $this->errorMessages['BirthdayYear'] = array('message' => SilvercartConfig::MinimumAgeToOrderError(), 'fieldname' => _t('SilvercartPage.BIRTHDAY'), 'BirthdayYear' => array('message' => SilvercartConfig::MinimumAgeToOrderError()));
                 $this->setSubmitSuccess(false);
                 return $this->submitFailure($data, $form);
             }
         }
     }
     // Create new regular customer and perform a log in
     $customer = new Member();
     // Pass shoppingcart to registered customer and delete the anonymous
     // customer.
     if ($anonymousCustomer) {
         $newShoppingCart = $anonymousCustomer->getCart()->duplicate(true);
         foreach ($anonymousCustomer->getCart()->SilvercartShoppingCartPositions() as $shoppingCartPosition) {
             $newShoppingCartPosition = $shoppingCartPosition->duplicate(false);
             $newShoppingCartPosition->SilvercartShoppingCartID = $newShoppingCart->ID;
             $newShoppingCartPosition->write();
             $shoppingCartPosition->transferToNewPosition($newShoppingCartPosition);
         }
         $customer->SilvercartShoppingCartID = $newShoppingCart->ID;
         $anonymousCustomer->delete();
     }
     $customer->castedUpdate($formData);
     $customer->write();
     $customer->logIn();
     $customer->changePassword($formData['Password']);
     $customerGroup = $this->getTargetCustomerGroup($formData);
     if ($customerGroup) {
         $customer->Groups()->add($customerGroup);
     }
     // Create ShippingAddress for customer and populate it with registration data
     $address = new SilvercartAddress();
     $address->castedUpdate($formData);
     $country = DataObject::get_by_id('SilvercartCountry', (int) $formData['Country']);
     if ($country) {
         $address->SilvercartCountryID = $country->ID;
     }
     $address->write();
     $this->extend('updateRegisteredAddress', $address, $data, $form, $formData);
     //connect the ShippingAddress and the InvoiceAddress to the customer
     $customer->SilvercartShippingAddressID = $address->ID;
     $customer->SilvercartInvoiceAddressID = $address->ID;
     $customer->SilvercartAddresses()->add($address);
     $customer->write();
     // Remove from the anonymous newsletter recipients list
     if (SilvercartAnonymousNewsletterRecipient::doesExist($customer->Email)) {
         $recipient = SilvercartAnonymousNewsletterRecipient::getByEmailAddress($customer->Email);
         if ($recipient->NewsletterOptInStatus) {
             $customer->NewsletterOptInStatus = 1;
             $customer->NewsletterConfirmationHash = $recipient->NewsletterOptInConfirmationHash;
             $customer->write();
         }
         SilvercartAnonymousNewsletterRecipient::removeByEmailAddress($customer->Email);
     }
     if ($customer->SubscribedToNewsletter && !$customer->NewsletterOptInStatus) {
         SilvercartNewsletter::subscribeRegisteredCustomer($customer);
     }
     $this->extend('updateRegisteredCustomer', $customer, $data, $form, $formData);
     if ($doRedirect) {
         // Redirect to welcome page
         if (array_key_exists('backlink', $formData) && !empty($formData['backlink'])) {
             $this->controller->redirect($formData['backlink']);
         } else {
             $this->controller->redirect($this->controller->PageByIdentifierCode('SilvercartRegisterConfirmationPage')->Link());
         }
     }
 }
 /**
  * We save the data of the user here.
  *
  * @param SS_HTTPRequest $data     contains the frameworks form data
  * @param Form           $form     not used
  * @param array          $formData contains the modules form data
  *
  * @return void
  *
  * @author Sascha Koehler <*****@*****.**>
  * @since 22.03.2011
  */
 protected function submitSuccess($data, $form, $formData)
 {
     $member = SilvercartCustomer::currentRegisteredCustomer();
     if ($member) {
         $formData['Salutation'] = $member->Salutation;
         $formData['FirstName'] = $member->FirstName;
         $formData['Surname'] = $member->Surname;
         $formData['Email'] = $member->Email;
         // ----------------------------------------------------------------
         // For registered and logged in customers all we have to do is set
         // the respective field in the customer object.
         // ----------------------------------------------------------------
         switch ($formData['NewsletterAction']) {
             case '1':
                 SilvercartNewsletter::subscribeRegisteredCustomer($member);
                 $this->setSessionMessage(sprintf(_t('SilvercartNewsletterStatus.SUBSCRIBED_SUCCESSFULLY'), $formData['Email']));
                 break;
             case '2':
             default:
                 SilvercartNewsletter::unSubscribeRegisteredCustomer($member);
                 $this->setSessionMessage(sprintf(_t('SilvercartNewsletterStatus.UNSUBSCRIBED_SUCCESSFULLY'), $formData['Email']));
         }
     } else {
         // ----------------------------------------------------------------
         // For unregistered customers we have to add / remove them from
         // the datastore for unregistered newsletter recipients.
         //
         // If the given email address belongs to a registered customer we
         // should not do anything but ask the user to log in first.
         // ----------------------------------------------------------------
         if (SilvercartNewsletter::isEmailAllocatedByRegularCustomer($formData['Email'])) {
             $this->setSessionMessage(sprintf(_t('SilvercartNewsletterStatus.REGULAR_CUSTOMER_WITH_SAME_EMAIL_EXISTS'), $formData['Email'], '/Security/Login/?BackURL=' . $this->controller->PageByIdentifierCode('SilvercartNewsletterPage')->Link()));
         } else {
             if ($formData['NewsletterAction'] == '1') {
                 // --------------------------------------------------------
                 // Subscribe to newsletter.
                 // If the user is already subscribed we display a
                 // message accordingly.
                 // --------------------------------------------------------
                 if (SilvercartNewsletter::isEmailAllocatedByAnonymousRecipient($formData['Email'])) {
                     $this->setSessionMessage(sprintf(_t('SilvercartNewsletterStatus.ALREADY_SUBSCRIBED'), $formData['Email']));
                 } else {
                     SilvercartNewsletter::subscribeAnonymousCustomer($formData['Salutation'], $formData['FirstName'], $formData['Surname'], $formData['Email']);
                     $this->setSessionMessage(sprintf(_t('SilvercartNewsletterStatus.SUBSCRIBED_SUCCESSFULLY_FOR_OPT_IN'), $formData['Email']));
                 }
             } else {
                 // --------------------------------------------------------
                 // Unsubscribe from newsletter.
                 // If no email address exists we display a message
                 // accordingly.
                 // --------------------------------------------------------
                 if (SilvercartNewsletter::isEmailAllocatedByAnonymousRecipient($formData['Email'])) {
                     SilvercartNewsletter::unSubscribeAnonymousCustomer($formData['Email']);
                     $this->setSessionMessage(sprintf(_t('SilvercartNewsletterStatus.UNSUBSCRIBED_SUCCESSFULLY'), $formData['Email']));
                 } else {
                     $this->setSessionMessage(sprintf(_t('SilvercartNewsletterStatus.NO_EMAIL_FOUND'), $formData['Email']));
                 }
             }
         }
     }
     $redirectLink = '/';
     $responsePage = SilvercartPage_Controller::PageByIdentifierCode("SilvercartNewsletterResponsePage");
     if ($responsePage) {
         $redirectLink = $responsePage->RelativeLink();
     }
     $this->controller->redirect($redirectLink);
 }
 /**
  * executed if there are no valdation errors on submit
  * Form data is saved in session
  *
  * @param SS_HTTPRequest $data             contains the frameworks form data
  * @param Form           $form             not used
  * @param array          $registrationData contains the modules form data
  *
  * @return void
  * 
  * @author Sebastian Diel <*****@*****.**>,
  *         Roland Lehmann <*****@*****.**>,
  *         Sascha Koehler <*****@*****.**>
  * @since 15.11.2014
  */
 protected function submitSuccess($data, $form, $registrationData)
 {
     $member = SilvercartCustomer::currentUser();
     // -------------------------------------------------------------------
     // process data
     // -------------------------------------------------------------------
     // Password
     unset($registrationData['PasswordCheck']);
     if (empty($registrationData['Password'])) {
         unset($registrationData['Password']);
     }
     // birthday
     if ($this->demandBirthdayDate()) {
         if (!empty($registrationData['BirthdayDay']) && !empty($registrationData['BirthdayMonth']) && !empty($registrationData['BirthdayYear'])) {
             $registrationData['Birthday'] = $registrationData['BirthdayYear'] . '-' . $registrationData['BirthdayMonth'] . '-' . $registrationData['BirthdayDay'];
         }
         if ($this->UseMinimumAgeToOrder()) {
             if (!SilvercartConfig::CheckMinimumAgeToOrder($registrationData['Birthday'])) {
                 $this->errorMessages['BirthdayDay'] = array('message' => SilvercartConfig::MinimumAgeToOrderError(), 'fieldname' => _t('SilvercartPage.BIRTHDAY'), 'BirthdayDay' => array('message' => SilvercartConfig::MinimumAgeToOrderError()));
                 $this->errorMessages['BirthdayMonth'] = array('message' => SilvercartConfig::MinimumAgeToOrderError(), 'fieldname' => _t('SilvercartPage.BIRTHDAY'), 'BirthdayMonth' => array('message' => SilvercartConfig::MinimumAgeToOrderError()));
                 $this->errorMessages['BirthdayYear'] = array('message' => SilvercartConfig::MinimumAgeToOrderError(), 'fieldname' => _t('SilvercartPage.BIRTHDAY'), 'BirthdayYear' => array('message' => SilvercartConfig::MinimumAgeToOrderError()));
                 $this->setSubmitSuccess(false);
                 return $this->submitFailure($data, $form);
             }
         }
     }
     $member->castedUpdate($registrationData);
     if (!$member->SubscribedToNewsletter) {
         $member->NewsletterOptInStatus = false;
         $member->NewsletterConfirmationHash = '';
     }
     $member->write();
     if ($member->SubscribedToNewsletter && !$member->NewsletterOptInStatus) {
         $confirmationHash = SilvercartNewsletter::createConfirmationHash($member->Salutation, $member->FirstName, $member->Surname, $member->Email);
         $member->setField('NewsletterConfirmationHash', $confirmationHash);
         $member->write();
         SilvercartNewsletter::sendOptInEmailTo($member->Salutation, $member->FirstName, $member->Surname, $member->Email, $confirmationHash);
     }
     $this->controller->redirect($this->controller->Link());
 }