/**
  * Process the items in the shopping cart from session,
  * creating a new {@link Order} record, and updating the
  * customer's details {@link Member} record.
  *
  * {@link Payment} instance is created, linked to the order,
  * and payment is processed {@link Payment::processPayment()}
  *
  * @param array $data Form request data submitted from OrderForm
  * @param Form $form Form object for this action
  * @param HTTPRequest $request Request object for this action
  */
 function saveAddress(array $data, Form $form, SS_HTTPRequest $request)
 {
     Session::set("BillingEcommerceGeocodingFieldValue", empty($data["BillingEcommerceGeocodingField"]) ? null : $data["BillingEcommerceGeocodingField"]);
     Session::set("ShippingEcommerceGeocodingFieldValue", empty($data["ShippingEcommerceGeocodingField"]) ? null : $data["ShippingEcommerceGeocodingField"]);
     $data = Convert::raw2sql($data);
     //check for cart items
     if (!$this->order) {
         $form->sessionMessage(_t('OrderForm.ORDERNOTFOUND', 'Your order could not be found.'), 'bad');
         $this->controller->redirectBack();
         return false;
     }
     if ($this->order && $this->order->TotalItems($recalculate = true) < 1) {
         // WE DO NOT NEED THE THING BELOW BECAUSE IT IS ALREADY IN THE TEMPLATE AND IT CAN LEAD TO SHOWING ORDER WITH ITEMS AND MESSAGE
         $form->sessionMessage(_t('OrderForm.NOITEMSINCART', 'Please add some items to your cart.'), 'bad');
         $this->controller->redirectBack();
         return false;
     }
     //----------- START BY SAVING INTO ORDER
     $form->saveInto($this->order);
     //----------- --------------------------------
     //MEMBER
     $this->orderMember = $this->createOrFindMember($data);
     if ($this->orderMember && is_object($this->orderMember)) {
         if ($this->memberShouldBeSaved($data)) {
             $form->saveInto($this->orderMember);
             $password = $this->validPasswordHasBeenEntered($data);
             if ($password) {
                 $this->orderMember->changePassword($password);
             }
             $this->orderMember->write();
         }
         if ($this->memberShouldBeLoggedIn($data)) {
             $this->orderMember->LogIn();
         }
         //this causes ERRORS ....
         //$this->order->MemberID = $this->orderMember->ID;
         Session::set("Ecommerce_Member_For_Order", $this->orderMember->ID);
     }
     //BILLING ADDRESS
     if ($billingAddress = $this->order->CreateOrReturnExistingAddress("BillingAddress")) {
         $form->saveInto($billingAddress);
         // NOTE: write should return the new ID of the object
         $this->order->BillingAddressID = $billingAddress->write();
     }
     // SHIPPING ADDRESS
     if (isset($data['UseShippingAddress'])) {
         if ($data['UseShippingAddress']) {
             if ($shippingAddress = $this->order->CreateOrReturnExistingAddress("ShippingAddress")) {
                 $form->saveInto($shippingAddress);
                 // NOTE: write should return the new ID of the object
                 $this->order->ShippingAddressID = $shippingAddress->write();
             }
         }
     }
     $this->extend("saveAddressExtension", $data, $form, $order, $this->orderMember);
     //SAVE ORDER
     $this->order->write();
     //----------------- CLEAR OLD DATA ------------------------------
     $this->clearSessionData();
     //clears the stored session form data that might have been needed if validation failed
     //-----------------------------------------------
     $nextStepLink = CheckoutPage::find_next_step_link("orderformaddress");
     $this->controller->redirect($nextStepLink);
     return true;
 }
 /**
  * Process the items in the shopping cart from session,
  * creating a new {@link Order} record, and updating the
  * customer's details {@link Member} record.
  *
  * {@link Payment} instance is created, linked to the order,
  * and payment is processed {@link Payment::processPayment()}
  *
  * @param array $data Form request data submitted from OrderForm
  * @param Form $form Form object for this action
  * @param HTTPRequest $request Request object for this action
  */
 function saveAddress($data, $form, $request)
 {
     $this->saveDataToSession($data);
     //save for later if necessary
     $order = ShoppingCart::current_order();
     //check for cart items
     if (!$order) {
         $form->sessionMessage(_t('OrderForm.ORDERNOTFOUND', 'Your order could not be found.'), 'bad');
         Director::redirectBack();
         return false;
     }
     if ($order && $order->TotalItems($recalculate = true) < 1) {
         // WE DO NOT NEED THE THING BELOW BECAUSE IT IS ALREADY IN THE TEMPLATE AND IT CAN LEAD TO SHOWING ORDER WITH ITEMS AND MESSAGE
         $form->sessionMessage(_t('OrderForm.NOITEMSINCART', 'Please add some items to your cart.'), 'bad');
         Director::redirectBack();
         return false;
     }
     //PASSWORD HACK ... TO DO: test that you can actually update a password as the method below
     //does NOT change the FORM only DATA, but we save to the new details using $form->saveInto($member)
     //and NOT $data->saveInto($member)
     $password = $this->validPassword($data);
     //----------- START BY SAVING INTO ORDER
     $form->saveInto($order);
     //----------- --------------------------------
     //MEMBER
     $member = $this->createOrFindMember($data);
     if ($member && is_object($member)) {
         if ($this->memberShouldBeSaved($data)) {
             $form->saveInto($member);
             if ($password) {
                 $member->changePassword($password);
             }
             $member->write();
         }
         if ($this->memberShouldBeLoggedIn($data)) {
             $member->logIn();
         }
     }
     //BILLING ADDRESS
     if ($billingAddress = $order->CreateOrReturnExistingAddress("BillingAddress")) {
         $form->saveInto($billingAddress);
         // NOTE: write should return the new ID of the object
         $order->BillingAddressID = $billingAddress->write();
     }
     // SHIPPING ADDRESS
     if (isset($data['UseShippingAddress'])) {
         if ($data['UseShippingAddress']) {
             if ($shippingAddress = $order->CreateOrReturnExistingAddress("ShippingAddress")) {
                 $form->saveInto($shippingAddress);
                 // NOTE: write should return the new ID of the object
                 $order->ShippingAddressID = $shippingAddress->write();
             }
         }
     }
     //SAVE ORDER
     $order->write();
     //----------------- CLEAR OLD DATA ------------------------------
     $this->clearSessionData();
     //clears the stored session form data that might have been needed if validation failed
     //-----------------------------------------------
     $nextStepLink = CheckoutPage::find_next_step_link("orderformaddress");
     Director::redirect($nextStepLink);
     return true;
 }