/**
  * When a user selects an address on the shipping address page the
  * information gets updated to the checkout form object.
  *
  * @param $addressId An existing customer address id.
  * @param $userId When a userId is provided then the address must belong to
  * the provided user, otherwise the address must belong to the current user.
  *
  * @return bool false if it was not possible to change shipping and customer
  * information true if it was possible.
  */
 public function fetchCustomerShippingAddress($addressId, $userId = null)
 {
     if (is_null($userId)) {
         $userId = Yii::app()->user->id;
     }
     $selectedAddress = CustomerAddress::findCustomerAddress($userId, $addressId);
     if ($selectedAddress instanceof CustomerAddress === false) {
         return false;
     }
     $this->intShippingAddress = $selectedAddress->id;
     $this->intBillingAddress = $selectedAddress->id;
     $this->fillAddressFields($selectedAddress->id, 'shipping');
     $this->shippingResidential = $selectedAddress->residential;
     // TODO: Verify that none the shippingFirstName can't never be null based
     // on the validations on CustomerAddress
     if (isset($this->shippingFirstName)) {
         $this->contactFirstName = $this->shippingFirstName;
     } else {
         $this->contactFirstName = $this->shippingFirstName = $selectedAddress->first_name;
     }
     if (isset($this->shippingLastName)) {
         $this->contactLastName = $this->shippingLastName;
     } else {
         $this->contactLastName = $this->shippingLastName = $selectedAddress->last_name;
     }
     $this->recipientName = $this->shippingFirstName . ' ' . $this->shippingLastName;
     $this->pickupPerson = $this->recipientName;
     $this->saveFormToSession();
     return true;
 }
Beispiel #2
0
	<fieldset class="col-sm-12">
		<div class="row">
			<div class="col-sm-8"><h2><?php 
echo Yii::t('global', 'My Addresses');
?>
:</h2></div>
			<div class="col-sm-4 subcategories "><?php 
echo CHtml::link(Yii::t('global', 'Add new address'), Yii::app()->createUrl('myaccount/address'));
?>
</div>
		</div>

		<div class="row">
			<?php 
foreach (CustomerAddress::getAllAddresses() as $objAddress) {
    ?>
				<div class="col-sm-3 myaddress">
					<?php 
    echo CHtml::link("<strong>" . $objAddress->address_label . "</strong><br>" . $objAddress->address1 . "<br>" . $objAddress->city . " " . $objAddress->state . " " . $objAddress->postal . ($objAddress->id == $model->default_billing_id ? "<br><span class='default'>" . Yii::t('global', 'Default Billing Address') . "</span>" : "") . ($objAddress->id == $model->default_shipping_id ? "<br><span class='default'>" . Yii::t('global', 'Default Shipping Address') . "</span>" : ""), Yii::app()->createUrl('myaccount/address', array('id' => $objAddress->id)));
    ?>
				</div>
			<?php 
}
?>
			<div class="clearfix spaceafter"></div>

		</div>
	</fieldset>
	<div class="clearfix spaceafter"></div>
 function getCustomer()
 {
     $this->autoRender = false;
     $sql = "SELECT * FROM customer_old;";
     $datas = $this->Cabinet->query($sql);
     App::import("Model", "CustomerManager.Customer");
     App::import("Model", "CustomerManager.BuilderAccount");
     App::import("Model", "CustomerManager.CustomerAddress");
     foreach ($datas as $data) {
         $Customer_model = new Customer();
         $BuilderAccount_model = new BuilderAccount();
         $CustomerAddress_model = new CustomerAddress();
         $cus_data['Customer']['last_name'] = $data['customer_old']['CustomerName'];
         $cus_data['Customer']['website'] = $data['customer_old']['WebSite'];
         if ($data['customer_old']['Inactive'] == 0) {
             $cus_data['Customer']['status'] = 1;
         } else {
             $cus_data['Customer']['status'] = 0;
         }
         $cus_data['Customer']['address'] = $data['customer_old']['loc_Address1'];
         $cus_data['Customer']['city'] = $data['customer_old']['loc_City'];
         $cus_data['Customer']['province'] = $data['customer_old']['loc_Province'];
         $cus_data['Customer']['postal_code'] = $data['customer_old']['loc_PostalCode'];
         $cus_data['Customer']['country'] = $data['customer_old']['loc_Country'];
         $cus_data['Customer']['phone'] = $data['customer_old']['loc_Phone'];
         $cus_data['Customer']['fax_number'] = $data['customer_old']['loc_FaxNumber'];
         $cus_data['Customer']['customer_type_id'] = 2;
         $cus_data['Customer']['site_address_exists'] = 1;
         $sales_person = array($this->loginUser['id']);
         $cus_data['Customer']['sales_representatives'] = serialize($sales_person);
         $Customer_model->save($cus_data['Customer']);
         App::uses("CustomerSalesRepresentetives", "CustomerManager.Model");
         $s = new CustomerSalesRepresentetives();
         $sales_data['customer_id'] = $Customer_model->id;
         $sales_data['user_id'] = $this->loginUser['id'];
         $s->save($sales_data);
         $cus_data['BuilderAccount']['customer_id'] = $Customer_model->id;
         $cus_data['BuilderAccount']['builder_legal_name'] = $data['customer_old']['CustomerName'];
         $cus_data['BuilderAccount']['credit_terms'] = $data['customer_old']['CreditTerms'];
         $cus_data['BuilderAccount']['credit_limit'] = $data['customer_old']['CreditLimit'];
         $cus_data['BuilderAccount']['invoice_on_day'] = $data['customer_old']['StartDate'];
         $cus_data['BuilderAccount']['quotes_validity'] = 30;
         $BuilderAccount_model->save($cus_data['BuilderAccount']);
         $cus_data['CustomerAddress']['customer_id'] = $Customer_model->id;
         $cus_data['CustomerAddress']['first_name'] = $data['customer_old']['con_ContactName'];
         $cus_data['CustomerAddress']['title'] = $data['customer_old']['con_Title'];
         $cus_data['CustomerAddress']['phone'] = $data['customer_old']['con_WorkPhone'];
         $cus_data['CustomerAddress']['fax_number'] = $data['customer_old']['con_FAX'];
         $cus_data['CustomerAddress']['cell'] = $data['customer_old']['con_MobilePhone'];
         $cus_data['CustomerAddress']['address'] = $data['customer_old']['con_Address1'];
         $cus_data['CustomerAddress']['city'] = $data['customer_old']['con_City'];
         $cus_data['CustomerAddress']['province'] = $data['customer_old']['con_Province'];
         $cus_data['CustomerAddress']['postal_code'] = $data['customer_old']['con_PostalCode'];
         $cus_data['CustomerAddress']['country'] = $data['customer_old']['con_Country'];
         $cus_data['CustomerAddress']['email'] = $data['customer_old']['con_eMail_Address'];
         $CustomerAddress_model->save($cus_data['CustomerAddress']);
     }
 }
 /**
  * Get payment choice and have end user confirm and place order.
  * A user can choose a simple integration method which will redirect
  * them to the confirmation page. If they put their cc details directly
  * in the form to checkout with an advanced method, the confirmation
  * page is immediately rendered.
  *
  * @return void
  */
 public function actionFinal()
 {
     $this->checkoutForm = MultiCheckoutForm::loadFromSessionOrNew();
     $arrCheckbox = array('id' => 1, 'name' => 'MultiCheckoutForm[billingSameAsShipping]', 'label' => Yii::t('checkout', 'Use my shipping address as my billing address'), 'address' => $this->checkoutForm->strShippingAddress);
     $objCart = Yii::app()->shoppingcart;
     // check to see if we have any advanced methods and if not redirect to the simple payment action
     $arrModules = $this->checkoutForm->getAimPaymentMethods();
     if (count($arrModules) < 1) {
         $this->redirect($this->createAbsoluteUrl('/checkout/paymentsimple'));
     }
     // set cardholder name to default i.e. contact name
     $this->checkoutForm->cardNameOnCard = $this->checkoutForm->contactFirstName . ' ' . $this->checkoutForm->contactLastName;
     // is an existing user changing their billing address?
     if (isset($_POST['BillingAddress']) && !isset($_POST['MultiCheckoutForm']['intBillingAddress'])) {
         $val = $_POST['BillingAddress'];
         if (is_numeric($val)) {
             if (isset($_POST['MultiCheckoutForm'])) {
                 $this->checkoutForm->attributes = $_POST['MultiCheckoutForm'];
             }
             $this->checkoutForm->intBillingAddress = $val;
             $this->checkoutForm->fillAddressFields($val);
             $arrCheckbox['id'] = $val;
             $arrCheckbox['name'] = 'MultiCheckoutForm[intBillingAddress]';
             $arrCheckbox['label'] = Yii::t('checkout', 'Use this as my billing address');
             $arrCheckbox['address'] = $this->checkoutForm->strBillingAddress;
             $arrAddresses = CustomerAddress::getActiveAddresses();
             // remove shipping address from the address array
             // to prevent someone attempting to edit it
             foreach ($arrAddresses as $key => $objAddress) {
                 if ($objAddress->id === $this->checkoutForm->intShippingAddress) {
                     unset($arrAddresses[$key]);
                     break;
                 }
             }
             $this->checkoutForm->objAddresses = $arrAddresses;
             $this->layout = '/layouts/checkout';
             $this->render('paymentaddress', array('model' => $this->checkoutForm, 'checkbox' => $arrCheckbox, 'error' => $this->formatErrors(), 'paymentFormModules' => $this->checkoutForm->getAlternativePaymentMethodsThatUseSubForms()));
         }
     } elseif (isset($_POST['Payment']) || isset($_POST['Paypal'])) {
         if (isset($_POST['MultiCheckoutForm'])) {
             $this->checkoutForm->attributes = $_POST['MultiCheckoutForm'];
             if (_xls_get_conf('SHIP_SAME_BILLSHIP') == 1) {
                 $this->checkoutForm->billingSameAsShipping = 1;
             }
             // get all the active alternative / offline payment methods
             $alternatePaymentMethods = $this->checkoutForm->getAlternativePaymentMethods();
             if (array_key_exists($this->checkoutForm->paymentProvider, $alternatePaymentMethods) || isset($_POST['Paypal'])) {
                 // end user has either chosen an alternative payment method or hit the Paypal button
                 // clear sensitive data just in case
                 $this->checkoutForm->clearCCdata();
                 // set billing address to be the same as shipping so that the form passes validation
                 $this->checkoutForm->billingSameAsShipping = 1;
                 $blnBillAddressHandled = true;
                 // user chose paypal
                 if (isset($_POST['Paypal'])) {
                     $this->checkoutForm->paymentProvider = $_POST['Paypal'];
                 }
                 $this->checkoutForm->saveFormToSession();
                 // set scenario
                 if ($objCart->shipping->isStorePickup) {
                     $this->checkoutForm->setScenario('PaymentStorePickup');
                     // no customer addresses required
                 } else {
                     $this->checkoutForm->setScenario('PaymentSim');
                     // shipping address is required
                     $blnBillAddressHandled = $this->checkoutForm->updateAddressId('billing');
                     // set billing address to shipping address to pass validation
                 }
                 // validate and update payment
                 $objPayment = CartPayment::getOrCreateCartPayment();
                 if ($blnBillAddressHandled && $this->checkoutForm->validate() && $this->checkoutForm->handleSubform() && $objPayment->updateCartPayment($this->checkoutForm, $this->checkoutForm->subFormModel)) {
                     // save the passed scenario
                     $this->checkoutForm->passedScenario = $this->checkoutForm->getScenario();
                     $this->checkoutForm->saveFormToSession();
                     $this->redirect($this->createAbsoluteUrl('/checkout/confirmation'));
                 }
                 $this->checkoutForm->addErrors($objPayment->getErrors());
                 $this->publishJS('payment');
                 $this->publishJS('zippo');
                 $this->layout = '/layouts/checkout';
                 if (count($this->checkoutForm->objAddresses) > 0) {
                     $this->render('paymentaddress', array('model' => $this->checkoutForm, 'checkbox' => $arrCheckbox, 'error' => $this->formatErrors(), 'paymentFormModules' => $this->checkoutForm->getAlternativePaymentMethodsThatUseSubForms()));
                 } else {
                     $this->render('payment', array('model' => $this->checkoutForm, 'error' => $this->formatErrors(), 'paymentFormModules' => $this->checkoutForm->getAlternativePaymentMethodsThatUseSubForms()));
                 }
             } else {
                 // if we are here, the end user has entered their card details directly (AIM)
                 // ensure form is populated with billing address
                 if (isset($this->checkoutForm->intBillingAddress)) {
                     $this->checkoutForm->fillAddressFields($this->checkoutForm->intBillingAddress);
                     $this->checkoutForm->billingSameAsShipping = null;
                 }
                 // payment processors require the cardNumber formatted as an
                 // actual number so remove whitespace from the cardNumber
                 $this->checkoutForm->cardNumber = _xls_number_only($this->checkoutForm->cardNumber);
                 $this->checkoutForm->cardNumberLast4 = substr($this->checkoutForm->cardNumber, -4);
                 // only the last 4 digits
                 // prevent an exception if cardExpiry is left blank
                 if (isset($this->checkoutForm->cardExpiry) && $this->checkoutForm->cardExpiry !== '') {
                     $arrCardExpiry = explode('/', $this->checkoutForm->cardExpiry);
                     $this->checkoutForm->cardExpiryMonth = $arrCardExpiry[0];
                     $this->checkoutForm->cardExpiryYear = $arrCardExpiry[1] + 2000;
                 }
                 // set scenario
                 if ($objCart->shipping->isStorePickup) {
                     $this->checkoutForm->setScenario('PaymentStorePickupCC');
                     // only billing address required
                 } else {
                     $this->checkoutForm->setScenario('Payment');
                     // shipping and billing address required
                 }
                 // validate the form
                 $objPayment = CartPayment::getOrCreateCartPayment();
                 if ($this->checkoutForm->updateAddressId('billing') && $this->checkoutForm->validate() && $objPayment->updateCartPayment($this->checkoutForm)) {
                     $this->layout = '/layouts/checkout-confirmation';
                     $this->render('confirmation', array('model' => $this->checkoutForm, 'cart' => Yii::app()->shoppingcart, 'shippingEstimatorOptions' => $this->_getShippingEstimatorOptions(), 'error' => $this->formatErrors()));
                 } else {
                     $this->checkoutForm->addErrors($objPayment->getErrors());
                     // clear sensitive data and force user to re-enter them
                     $this->checkoutForm->clearCCdata();
                     $this->publishJS('payment');
                     $this->publishJS('zippo');
                     $this->layout = '/layouts/checkout';
                     if (count($this->checkoutForm->objAddresses) > 0) {
                         $this->render('paymentaddress', array('model' => $this->checkoutForm, 'checkbox' => $arrCheckbox, 'error' => $this->formatErrors(), 'paymentFormModules' => $this->checkoutForm->getAlternativePaymentMethodsThatUseSubForms()));
                     } else {
                         $this->render('payment', array('model' => $this->checkoutForm, 'error' => $this->formatErrors(), 'paymentFormModules' => $this->checkoutForm->getAlternativePaymentMethodsThatUseSubForms()));
                     }
                 }
             }
         }
     } elseif (isset($_POST['Confirmation'])) {
         $haveCartItemsBeenUpdated = false;
         if (isset($_POST['MultiCheckoutForm'])) {
             $this->checkoutForm->attributes = $_POST['MultiCheckoutForm'];
             if ($objCart->shipping->isStorePickup) {
                 $this->checkoutForm->setScenario('ConfirmationStorePickupCC');
                 // only billing address required
             } else {
                 $this->checkoutForm->setScenario('Confirmation');
                 // shipping and billing address required
             }
             // validate form and cart
             if ($this->checkoutForm->updateCartCustomerId() && $this->checkoutForm->validate()) {
                 // if the cart was modified stop checkout and re-render the page with the message to the end user
                 if (Yii::app()->shoppingcart->wasCartModified === false) {
                     // cart is as we expect, continue
                     $result = $this->executeCheckoutProcess();
                     if (isset($result['success']) && isset($result['cartlink'])) {
                         // send user to receipt
                         $this->redirect($this->createAbsoluteUrl("/checkout/thankyou/" . $result['cartlink']));
                     }
                 }
             }
         }
         $this->layout = '/layouts/checkout-confirmation';
         $this->render('confirmation', array('model' => $this->checkoutForm, 'cart' => Yii::app()->shoppingcart, 'shippingEstimatorOptions' => $this->_getShippingEstimatorOptions(), 'error' => $this->formatErrors(), 'recalculateShippingOnLoad' => Yii::app()->shoppingcart->wasCartModified));
     } else {
         $this->layout = '/layouts/checkout';
         $this->publishJS('payment');
         $this->publishJS('zippo');
         // clear sensitive data
         $this->checkoutForm->clearCCdata();
         // existing user with existing addresses
         if (count($this->checkoutForm->objAddresses) > 0) {
             $arrCheckbox['name'] = 'MultiCheckoutForm[intBillingAddress]';
             // if the billing address was defined before, set the checkbox label
             if (isset($this->checkoutForm->intBillingAddress) && $this->checkoutForm->intBillingAddress !== $this->checkoutForm->intShippingAddress) {
                 $arrCheckbox['label'] = Yii::t('checkout', 'Use this as my billing address');
             }
             // get up to date address info
             $arrAddresses = CustomerAddress::getActiveAddresses();
             // find the selected address id
             $selectedAddressId = null;
             $blnDefaultBilling = true;
             if (isset($_POST['BillingAddress']) === false && isset($this->checkoutForm->intBillingAddress) === false) {
                 // Check to see if the customer has a default billing address set
                 if ($objCart->customer->default_billing_id !== null) {
                     $objTemp = $objCart->customer->defaultBilling;
                     if ($objTemp->active == 1) {
                         $selectedAddressId = $objTemp->id;
                     } else {
                         $blnDefaultBilling = false;
                     }
                 } else {
                     $blnDefaultBilling = false;
                 }
                 if ($blnDefaultBilling === false) {
                     // No default billing address available so just use the first address in the array
                     $objAddress = current($arrAddresses);
                     $selectedAddressId = $objAddress->id;
                 }
             } else {
                 $selectedAddressId = $this->checkoutForm->intShippingAddress;
             }
             // remove the selected address from the array
             foreach ($arrAddresses as $key => $objAddress) {
                 if ($objAddress->id === $selectedAddressId) {
                     $arrCheckbox['id'] = $objAddress->id;
                     $arrCheckbox['address'] = _xls_string_address($objAddress);
                     break;
                 }
             }
             // remove the shipping address from the array
             foreach ($arrAddresses as $key => $objAddress) {
                 if ($objAddress->id === $this->checkoutForm->intShippingAddress) {
                     unset($arrAddresses[$key]);
                     break;
                 }
             }
             $this->checkoutForm->objAddresses = $arrAddresses;
             $this->checkoutForm->saveFormToSession();
             $this->render('paymentaddress', array('model' => $this->checkoutForm, 'checkbox' => $arrCheckbox, 'error' => $this->formatErrors(), 'paymentFormModules' => $this->checkoutForm->getAlternativePaymentMethodsThatUseSubForms()));
         } else {
             $this->render('payment', array('model' => $this->checkoutForm, 'error' => $this->formatErrors(), 'paymentFormModules' => $this->checkoutForm->getAlternativePaymentMethodsThatUseSubForms()));
         }
     }
 }
 /**
  * Remove address
  *
  * @return void
  */
 public function actionRemoveAddress()
 {
     $deactivated = false;
     $data = array('status' => 'error');
     $customerAddressId = $_POST['CustomerAddressId'];
     if (isset($customerAddressId)) {
         $deactivated = CustomerAddress::deactivateCustomerShippingAddress($customerAddressId, Yii::app()->user->id);
     }
     if (Yii::app()->request->isAjaxRequest) {
         if ($deactivated) {
             $data["status"] = "success";
         }
         $this->renderJSON($data);
     } else {
         $this->redirect(Yii::app()->request->urlReferrer);
     }
 }
Beispiel #6
0
 public function actionAjaxAddress()
 {
     $rec = PaymentCustomerUser::model()->findByAttributes(array('email' => $_REQUEST['email']));
     $detail = CustomerAddress::model()->findAll(array('condition' => 'customer_id=:cId AND zipcode=:zip ', 'params' => array(':cId' => $rec->id, ':zip' => $_REQUEST['zip'])));
     foreach ($detail as $d) {
         $val[] = $d->address;
     }
     echo json_encode($val);
     exit;
 }
Beispiel #7
0
 public function addAddress(CustomerAddress $address)
 {
     $this->addresses[$address->getID()] = $address;
     return $this;
 }
Beispiel #8
0
 /**
  * This function will run parse an order that we get from Amazon MWS.
  * It saves orders of the customers to the DB.
  * @param $response ListOrderItemsResponse Contains the orders from Amazon
  * Marketplace WebService
  * @return void
  */
 public function parseListOrders($response)
 {
     $checkDate = date("Y-m-d", strtotime($this->amazon_check_time));
     $listOrdersResult = $response->getListOrdersResult();
     if ($listOrdersResult->isSetOrders()) {
         $orders = $listOrdersResult->getOrders();
         $orderList = $orders->getOrder();
         foreach ($orderList as $order) {
             if ($order->isSetAmazonOrderId()) {
                 $strOrderId = $order->getAmazonOrderId();
                 Yii::log("Found Amazon Order " . $strOrderId, 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                 $objCart = Cart::LoadByIdStr($strOrderId);
                 if (!$objCart instanceof Cart) {
                     //We ignore orders we've already downloaded
                     $objCart = new Cart();
                     $objCart->id_str = $strOrderId;
                     $objCart->origin = 'amazon';
                     //We mark this as just a cart, not an order, because we download the items next
                     $objCart->cart_type = CartType::cart;
                     $objOrderTotal = $order->getOrderTotal();
                     Yii::log("Order total information " . print_r($objOrderTotal, true), 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                     $objCart->total = $objOrderTotal->getAmount();
                     $objCart->currency = $objOrderTotal->getCurrencyCode();
                     $objCart->status = OrderStatus::Requested;
                     $objCart->datetime_cre = $order->getPurchaseDate();
                     $objCart->modified = $order->getLastUpdateDate();
                     if (!$objCart->save()) {
                         Yii::log("Error saving cart " . print_r($objCart->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                     }
                     //Since email from is Anonymous, we probably will have to create a shell record
                     $objCustomer = Customer::LoadByEmail($order->getBuyerEmail());
                     if (!$objCustomer) {
                         $customerName = $this->_getCustomerName($order->getBuyerName());
                         $objCustomer = new Customer();
                         $objCustomer->email = $order->getBuyerEmail();
                         $objCustomer->first_name = $customerName['first_name'];
                         $objCustomer->last_name = $customerName['last_name'];
                         $objCustomer->record_type = Customer::EXTERNAL_SHELL_ACCOUNT;
                         $objCustomer->allow_login = Customer::UNAPPROVED_USER;
                         $objCustomer->save();
                     }
                     $objCart->customer_id = $objCustomer->id;
                     if (!$objCart->save()) {
                         Yii::log("Error saving cart " . print_r($objCart->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                     }
                     if ($order->isSetShippingAddress()) {
                         $shippingAddress = $order->getShippingAddress();
                         $countrycode = Country::IdByCode($shippingAddress->getCountryCode());
                         if ($shippingAddress->isSetStateOrRegion()) {
                             $objState = State::LoadByCode($shippingAddress->getStateOrRegion(), $countrycode);
                         }
                         $customerName = $this->_getCustomerName($shippingAddress->getName());
                         $config = array('address_label' => 'amazon', 'customer_id' => $objCustomer->id, 'first_name' => $customerName['first_name'], 'last_name' => $customerName['last_name'], 'address1' => $shippingAddress->getAddressLine1(), 'address2' => trim($shippingAddress->getAddressLine2() . " " . $shippingAddress->getAddressLine3()), 'city' => $shippingAddress->getCity(), 'state_id' => $objState->id, 'postal' => $shippingAddress->getPostalCode(), 'country_id' => $countrycode, 'phone' => $shippingAddress->getPhone());
                         $objCustAddress = CustomerAddress::findOrCreate($config);
                         $objCustomer->default_billing_id = $objCustAddress->id;
                         $objCustomer->default_shipping_id = $objCustAddress->id;
                         $objCustomer->save();
                         $objCart->shipaddress_id = $objCustAddress->id;
                         $objCart->billaddress_id = $objCustAddress->id;
                         //Amazon doesn't provide billing data, just dupe
                         if (!$objCart->save()) {
                             Yii::log("Error saving cart " . print_r($objCart->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                         }
                         Yii::log("Looking for destination " . $objState->country_code . " " . $objState->code . " " . $shippingAddress->getPostalCode(), 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                         $objDestination = Destination::LoadMatching($objState->country_code, $objState->code, $shippingAddress->getPostalCode());
                         if ($objDestination === null) {
                             Yii::log("Did not find destination, using default in Web Store ", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                             $objDestination = Destination::getAnyAny();
                         }
                         $objCart->tax_code_id = $objDestination->taxcode;
                         $objCart->recalculateAndSave();
                     }
                     if ($order->isSetShipServiceLevel()) {
                         $strShip = $order->getShipServiceLevel();
                         //If we have a shipping object already, update it, otherwise create it
                         if (isset($objCart->shipping)) {
                             $objShipping = $objCart->shipping;
                         } else {
                             //create
                             $objShipping = new CartShipping();
                             if (!$objShipping->save()) {
                                 Yii::log("Error saving shipping info for cart " . print_r($objShipping->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                             }
                         }
                         if ($order->isSetShipmentServiceLevelCategory()) {
                             $strShip = $order->getShipmentServiceLevelCategory();
                         }
                         $objShipping->shipping_module = get_class($this);
                         $objShipping->shipping_data = $strShip;
                         $objShipping->shipping_method = $this->objModule->getConfig('product');
                         $objShipping->shipping_cost = 0;
                         $objShipping->shipping_sell = 0;
                         $objShipping->save();
                         $objCart->shipping_id = $objShipping->id;
                         if (!$objCart->save()) {
                             Yii::log("Error saving cart " . print_r($objCart->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                         }
                     }
                     //Because Amazon comes down with no payment info, just generate one here
                     $objP = new CartPayment();
                     $objP->payment_method = $this->objModule->getConfig('ls_payment_method');
                     $objP->payment_module = get_class($this);
                     $objP->payment_data = 'Amazon';
                     $objP->payment_amount = $objOrderTotal->getAmount();
                     $objP->datetime_posted = $order->getPurchaseDate();
                     if (!$objP->save()) {
                         Yii::log("Error saving payment " . print_r($objP->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                     }
                     $objCart->payment_id = $objP->id;
                     if (!$objCart->save()) {
                         Yii::log("Error saving cart " . print_r($objCart->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                     }
                     TaskQueue::CreateEvent('integration', get_class($this), 'ListOrderDetails', $objCart->id_str . "," . $checkDate);
                 }
             }
         }
     }
 }
 /**
  * Finds the customer's address based on his id and the address
  * id that is requested.
  * @param $userId The current user id
  * @param $addressId The address id that was selected
  * @return CustomerAddress
  */
 public static function findCustomerAddress($userId, $addressId)
 {
     return CustomerAddress::model()->find('customer_id=:customer_id AND id=:id', array(':customer_id' => $userId, ':id' => $addressId));
 }
 /**
  * Extract shipping and billing address information, create address book and map to the carts
  */
 protected function actionConvertAddressBook()
 {
     $sql = "select * from xlsws_cart where billaddress_id IS NULL and address_bill IS NOT NULL order by id limit 500";
     $arrProducts = Yii::app()->db->createCommand($sql)->query();
     while (($result = $arrProducts->read()) !== false) {
         $result['email'] = strtolower($result['email']);
         //verify that Customer ID really exists in customer table
         $objCust = Customer::model()->findByPk($result['customer_id']);
         if (!$objCust instanceof Customer) {
             $result['customer_id'] = 0;
         }
         if (strlen($result['address_bill']) > 0) {
             $arrAddress = explode("\n", $result['address_bill']);
             if (count($arrAddress) == 5) {
                 //old format address, should be 6 pieces
                 $arrAddress[5] = $arrAddress[4];
                 $strSt = $arrAddress[3];
                 if ($strSt[0] == " ") {
                     //no state on this address
                     $arrAddress[4] = substr($strSt, 1, 100);
                     $arrAddress[3] = "";
                 } else {
                     $arrSt = explode(" ", $strSt);
                     $arrAddress[3] = $arrSt[0];
                     $arrAddress[4] = str_replace($arrSt[0] . " ", "", $strSt);
                 }
             }
             $objAddress = new CustomerAddress();
             if (count($arrAddress) >= 5) {
                 $objCountry = Country::LoadByCode($arrAddress[5]);
                 if ($objCountry) {
                     $objAddress->country_id = $objCountry->id;
                     $objState = State::LoadByCode($arrAddress[3], $objCountry->id);
                     if ($objState) {
                         $objAddress->state_id = $objState->id;
                     }
                 }
                 $objAddress->address1 = $arrAddress[0];
                 $objAddress->address2 = $arrAddress[1];
                 $objAddress->city = $arrAddress[2];
                 $objAddress->postal = $arrAddress[4];
                 $objAddress->first_name = $result['first_name'];
                 $objAddress->last_name = $result['last_name'];
                 $objAddress->company = $result['company'];
                 $objAddress->phone = $result['phone'];
                 $objAddress->residential = CustomerAddress::RESIDENTIAL;
                 $objAddress->created = $result['datetime_cre'];
                 $objAddress->modified = $result['datetime_cre'];
                 $objAddress->active = 1;
                 if (empty($objAddress->address2)) {
                     $objAddress->address2 = null;
                 }
                 if (empty($objAddress->company)) {
                     $objAddress->company = null;
                 }
                 $blnFound = false;
                 if ($result['customer_id'] > 0) {
                     //See if this is already in our database
                     $objPriorAddress = CustomerAddress::model()->findByAttributes(array('address1' => $objAddress->address1, 'address2' => $objAddress->address2, 'city' => $objAddress->city, 'postal' => $objAddress->postal, 'first_name' => $objAddress->first_name, 'last_name' => $objAddress->last_name, 'company' => $objAddress->company, 'phone' => $objAddress->phone));
                     if ($objPriorAddress instanceof CustomerAddress) {
                         Yii::app()->db->createCommand("update xlsws_cart set billaddress_id=" . $objPriorAddress->id . " where id=" . $result['id'])->execute();
                         $blnFound = true;
                     } else {
                         $objAddress->customer_id = $result['customer_id'];
                     }
                 } else {
                     //We need a shell customer record just for the email
                     $objC = Customer::model()->findByAttributes(array('email' => $result['email']));
                     if ($objC instanceof Customer) {
                         Yii::app()->db->createCommand("UPDATE xlsws_cart set customer_id=" . $objC->id . " where id=" . $result['id'])->execute();
                     } else {
                         $objC = new Customer();
                         $objC->record_type = Customer::GUEST;
                         $objC->email = $result['email'];
                         $objC->first_name = $objAddress->first_name;
                         $objC->last_name = $objAddress->last_name;
                         $objC->company = $objAddress->company;
                         if (!$objC->validate()) {
                             $arrErr = $objC->getErrors();
                             if (isset($arrErr['email'])) {
                                 $objC->email = $result['id'] . "*****@*****.**";
                             }
                             if (!$objC->validate()) {
                                 return print_r($objC->getErrors(), true);
                             }
                         }
                         if (!$objC->save()) {
                             Yii::log("Import Error " . print_r($objC->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                             return print_r($objC->getErrors(), true);
                         } else {
                             $cid = $objC->id;
                         }
                         Yii::app()->db->createCommand("UPDATE xlsws_cart set customer_id=" . $cid . " where id=" . $result['id'])->execute();
                     }
                     $result['customer_id'] = $objC->id;
                     $objAddress->customer_id = $result['customer_id'];
                 }
                 if (!$blnFound) {
                     if (!$objAddress->save()) {
                         //We have a corrupt billing address, just blank it out so import goes on
                         Yii::app()->db->createCommand("update xlsws_cart set address_bill=null where id=" . $result['id'])->execute();
                     } else {
                         $cid = $objAddress->id;
                         Yii::app()->db->createCommand("update xlsws_cart set billaddress_id=" . $cid . " where id=" . $result['id'])->execute();
                     }
                 }
             } else {
                 //We have a corrupt billing address, just blank it out so import goes on
                 Yii::app()->db->createCommand("update xlsws_cart set address_bill=null where id=" . $result['id'])->execute();
             }
             $objAddress = new CustomerAddress();
             $objCountry = Country::LoadByCode($result['ship_country']);
             if ($objCountry) {
                 $objAddress->country_id = $objCountry->id;
                 $objState = State::LoadByCode($result['ship_state'], $objCountry->id);
                 if ($objState) {
                     $objAddress->state_id = $objState->id;
                 }
             }
             $objAddress->first_name = $result['ship_firstname'];
             $objAddress->last_name = $result['ship_lastname'];
             $objAddress->company = $result['ship_company'];
             $objAddress->address1 = $result['ship_address1'];
             $objAddress->address2 = $result['ship_address2'];
             $objAddress->city = $result['ship_city'];
             $objAddress->postal = $result['ship_zip'];
             $objAddress->phone = $result['ship_phone'];
             $objAddress->residential = CustomerAddress::RESIDENTIAL;
             $objAddress->created = $result['datetime_cre'];
             $objAddress->modified = $result['datetime_cre'];
             $objAddress->active = 1;
             if (empty($objAddress->address2)) {
                 $objAddress->address2 = null;
             }
             if (empty($objAddress->company)) {
                 $objAddress->company = null;
             }
             $blnFound = false;
             if ($result['customer_id'] > 0) {
                 //See if this is already in our database
                 $objPriorAddress = CustomerAddress::model()->findByAttributes(array('address1' => $objAddress->address1, 'city' => $objAddress->city, 'postal' => $objAddress->postal, 'first_name' => $objAddress->first_name, 'last_name' => $objAddress->last_name, 'company' => $objAddress->company, 'phone' => $objAddress->phone));
                 if ($objPriorAddress instanceof CustomerAddress) {
                     Yii::app()->db->createCommand("update xlsws_cart set shipaddress_id=" . $objPriorAddress->id . " where id=" . $result['id'])->execute();
                     $blnFound = true;
                 } else {
                     $objAddress->customer_id = $result['customer_id'];
                 }
             }
             if (!$blnFound) {
                 if (!$objAddress->save()) {
                     Yii::log("Import Error " . print_r($objAddress->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                 } else {
                     $cid = $objAddress->id;
                     Yii::app()->db->createCommand("update xlsws_cart set shipaddress_id=" . $cid . " where id=" . $result['id'])->execute();
                 }
             }
         }
         $objShipping = new CartShipping();
         $objShipping->shipping_method = $result['shipping_method'];
         $objShipping->shipping_module = $result['shipping_module'];
         $objShipping->shipping_data = $result['shipping_data'];
         $objShipping->shipping_cost = $result['shipping_cost'];
         $objShipping->shipping_sell = $result['shipping_sell'];
         if (!$objShipping->save()) {
             return print_r($objShipping->getErrors());
         } else {
             $cid = $objShipping->id;
         }
         Yii::app()->db->createCommand("update xlsws_cart set shipping_id=" . $cid . " where id=" . $result['id'])->execute();
         $objPayment = new CartPayment();
         $objPayment->payment_method = $result['payment_method'];
         $objPayment->payment_module = str_replace(".php", "", $result['payment_module']);
         $objPayment->payment_data = $result['payment_data'];
         $objPayment->payment_amount = $result['payment_amount'];
         $objPayment->datetime_posted = $result['datetime_posted'];
         if ($result['fk_promo_id'] > 0) {
             $objPromo = PromoCode::model()->findByPk($result['fk_promo_id']);
             if ($objPromo) {
                 $objPayment->promocode = $objPromo->code;
             }
         }
         if (!$objPayment->save()) {
             return print_r($objPayment->getErrors());
         } else {
             $cid = $objPayment->id;
         }
         Yii::app()->db->createCommand("update xlsws_cart set payment_id=" . $cid . " where id=" . $result['id'])->execute();
     }
     $results2 = Yii::app()->db->createCommand("select count(*) from xlsws_cart where billaddress_id IS NULL and address_bill IS NOT NULL")->queryScalar();
     if ($results2 == 0) {
         $remain = 8;
     } else {
         $remain = 3;
     }
     return array('result' => "success", 'makeline' => $remain, 'total' => 50, 'tag' => 'Converting cart addresses, ' . $results2 . ' remaining');
 }
Beispiel #11
0
 /**
  * @return array
  */
 public function getShippingOptions()
 {
     $arrReturn = array('0' => Yii::t('wishlist', 'None'));
     $objAddresses = CustomerAddress::getActiveAddresses();
     foreach ($objAddresses as $objAddress) {
         $str = $objAddress->fullname . ", " . $objAddress->address1 . ($objAddress->address2 != '' ? " " : "") . $objAddress->address2 . ", " . $objAddress->city;
         $str .= empty($objAddress->state) ? '' : ", " . $objAddress->state;
         $str .= empty($objAddress->postal) ? '' : ", " . $objAddress->postal;
         $str .= ', ' . $objAddress->country;
         $arrReturn[$objAddress->id] = $str;
     }
     return $arrReturn;
 }
Beispiel #12
0
 public function GiftAddress()
 {
     foreach ($this->cartItems as $item) {
         if (isset($item->wishlist_item)) {
             if ($item->wishlistItem->registry->customer_id != Yii::app()->user->id && $item->wishlistItem->registry->ship_option > 0) {
                 return CustomerAddress::model()->findAllByPk($item->wishlistItem->registry->ship_option);
             }
         }
     }
     return null;
 }
 /**
  * If the shopper has chosen an address from the address book, copy the values to the
  * relevant address fields since they're needed for shipping and payment calculations
  *
  * @return void
  */
 public function fillFieldsFromPreselect()
 {
     $arrObjAddresses = CustomerAddress::getActiveAddresses();
     $objCustomer = Customer::GetCurrent();
     if ($this->intShippingAddress > 0) {
         // We've picked a preset to ship to, so grab that info from the db.
         if (Yii::app()->shoppingcart->HasShippableGift) {
             $objAddresses = array_merge($arrObjAddresses, Yii::app()->shoppingcart->GiftAddress);
         }
         foreach ($arrObjAddresses as $objAddress) {
             if ($objAddress->id != $this->intShippingAddress) {
                 continue;
             }
             $this->shippingFirstName = $objAddress->first_name;
             $this->shippingLastName = $objAddress->last_name;
             $this->shippingAddress1 = $objAddress->address1;
             $this->shippingAddress2 = $objAddress->address2;
             $this->shippingCity = $objAddress->city;
             $this->shippingState = $objAddress->state_id;
             $this->shippingPostal = $objAddress->postal;
             $this->shippingCountry = $objAddress->country_id;
             $this->shippingResidential = $objAddress->residential;
             if (empty($objAddress->phone) === false) {
                 $this->shippingPhone = $objAddress->phone;
             }
             break;
         }
     }
     if ($this->billingSameAsShipping == 1) {
         $this->billingAddress1 = $this->shippingAddress1;
         $this->billingAddress2 = $this->shippingAddress2;
         $this->billingCity = $this->shippingCity;
         $this->billingCountry = $this->shippingCountry;
         $this->billingCountryCode = $this->shippingCountryCode;
         $this->billingState = $this->shippingState;
         $this->billingStateCode = $this->shippingStateCode;
         $this->billingPostal = $this->shippingPostal;
         $this->billingResidential = $this->shippingResidential;
     } elseif ($this->intBillingAddress > 0) {
         // end-user has selected an existing address
         $objAddress = CustomerAddress::findCustomerAddress($objCustomer->id, $this->intBillingAddress);
         $this->billingAddress1 = $objAddress->address1;
         $this->billingAddress2 = $objAddress->address2;
         $this->billingCity = $objAddress->city;
         $this->billingState = $objAddress->state_id;
         $this->billingPostal = $objAddress->postal;
         $this->billingCountry = $objAddress->country_id;
         $this->billingResidential = $objAddress->residential;
     }
     if ($objCustomer instanceof Customer) {
         $this->contactFirstName = $objCustomer->first_name;
         $this->contactLastName = $objCustomer->last_name;
         $this->contactPhone = $objCustomer->mainphone;
         $this->contactEmail = $objCustomer->email;
     }
 }
    /**
     * Displays and processes the checkout form. This is our big function which
     * validates everything and calls for order completion when done.
     * TODO: Would be better broken into small functions to aid unit testing.
     */
    public function actionCheckout()
    {
        // We shouldn't be in this controller if we don't have any products in
        // our cart.
        if (!Yii::app()->shoppingcart->itemCount) {
            Yii::log("Attempted to check out with no cart items", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
            Yii::app()->user->setFlash('warning', Yii::t('cart', 'Oops, you cannot checkout. You have no items in your cart.'));
            if (!Yii::app()->user->isGuest && Yii::app()->user->fullname == "Guest") {
                // Probably here because of cancelling an AIM payment.
                Yii::log("Checkout as Guest .. logging out", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                Yii::app()->user->logout();
            }
            $this->redirect($this->createAbsoluteUrl("/cart", array(), 'http'));
        }
        $this->pageTitle = _xls_get_conf('STORE_NAME') . ' : Checkout';
        // Set breadcrumbs.
        $this->breadcrumbs = array(Yii::t('global', 'Edit Cart') => array('/cart'), Yii::t('global', 'Checkout') => array('cart/checkout'));
        $model = new CheckoutForm();
        $model->objAddresses = CustomerAddress::getActiveAddresses();
        // If this cart was built from another person's wish list.
        if (Yii::app()->shoppingcart->HasShippableGift) {
            $model->objAddresses = array_merge($model->objAddresses, Yii::app()->shoppingcart->GiftAddress);
        }
        if (isset($_POST['CheckoutForm'])) {
            $strLogLevel = Yii::app()->getComponent('log')->routes[0]->levels;
            if (stripos($strLogLevel, ",info")) {
                $arrSubmitted = $_POST['CheckoutForm'];
                // Redact sensitive information.
                if (isset($arrSubmitted['cardNumber'])) {
                    $arrSubmitted['cardNumber'] = "A " . strlen($arrSubmitted['cardNumber']) . " digit number here";
                }
                if (isset($arrSubmitted['cardCVV'])) {
                    $arrSubmitted['cardCVV'] = "A " . strlen($arrSubmitted['cardCVV']) . " digit number here";
                }
                Yii::log("*** CHECKOUT FORM *** Submission data: " . print_r($arrSubmitted, true), 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
            }
            $model->attributes = $_POST['CheckoutForm'];
            if (Yii::app()->params['SHIP_SAME_BILLSHIP']) {
                $model->billingSameAsShipping = 1;
            }
            // Force lower case on emails.
            $model->contactEmail = strtolower($model->contactEmail);
            $model->contactEmail_repeat = strtolower($model->contactEmail_repeat);
            $cacheModel = clone $model;
            unset($cacheModel->cardNumber);
            unset($cacheModel->cardCVV);
            unset($cacheModel->cardExpiryMonth);
            unset($cacheModel->cardExpiryYear);
            Yii::app()->session['checkout.cache'] = $cacheModel;
            if (!Yii::app()->user->IsGuest) {
                $model->setScenario('formSubmitExistingAccount');
            } elseif ($model->createPassword) {
                $model->setScenario('formSubmitCreatingAccount');
            } else {
                $model->setScenario('formSubmitGuest');
            }
            // Copy address book to field if necessary.
            $model->fillFieldsFromPreselect();
            // Validate our primary CheckoutForm model here.
            $valid = $model->validate();
            //For any payment processor with its own form -- not including CC -- validate here
            if ($model->paymentProvider) {
                $objPaymentModule = Modules::model()->findByPk($model->paymentProvider);
                $objComponent = Yii::app()->getComponent($objPaymentModule->module);
                if (isset($objComponent->subform)) {
                    Yii::log("Form validation for card provider  " . strip_tags($objComponent->name()), 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                    $paymentSubform = $objComponent->subform;
                    $paymentSubformModel = new $paymentSubform();
                    $paymentSubformModel->attributes = isset($_POST[$paymentSubform]) ? $_POST[$paymentSubform] : array();
                    $subValidate = $paymentSubformModel->validate();
                    $valid = $subValidate && $valid;
                } else {
                    Yii::log("Payment module " . strip_tags($objComponent->name()), 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                }
            }
            //If this came in as AJAX validation, return the results and exit
            if (Yii::app()->getRequest()->getIsAjaxRequest()) {
                echo $valid;
                Yii::app()->end();
            }
            //If all our validation passed, run our checkout procedure
            if ($valid) {
                Yii::log("All actionCheckout validation passed, attempting to complete checkout", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                $objCart = Yii::app()->shoppingcart;
                //Assign CartID if not currently assigned
                //If we have provided a password
                if ($model->createPassword) {
                    Yii::log("Password was part of CheckoutForm", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                    // Test to see if we can log in with the provided password.
                    $identity = new UserIdentity($model->contactEmail, $model->createPassword);
                    $identity->authenticate();
                    switch ($identity->errorCode) {
                        case UserIdentity::ERROR_PASSWORD_INVALID:
                            //Oops, email is already in system but not with that password
                            Yii::app()->user->setFlash('error', Yii::t('global', 'This email address already exists but that is not the correct password so we cannot log you in.'));
                            Yii::log($model->contactEmail . " login from checkout with invalid password", 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                            $this->refresh();
                            return;
                        case UserIdentity::ERROR_USERNAME_INVALID:
                            $objCustomer = Customer::CreateFromCheckoutForm($model);
                            $identity = new UserIdentity($model->contactEmail, $model->createPassword);
                            $identity->authenticate();
                            if ($identity->errorCode !== UserIdentity::ERROR_NONE) {
                                Yii::log("Error logging in after creating account for " . $model->contactEmail . ". Error:" . $identity->errorCode . " Cannot continue", 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                                Yii::app()->user->setFlash('error', Yii::t('global', 'Error logging in after creating account. Cannot continue.'));
                                $this->refresh();
                                return;
                            }
                            break;
                        case UserIdentity::ERROR_NONE:
                            break;
                        default:
                            Yii::log("Error: Unhandled errorCode " . $identity->errorCode, 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                            break;
                    }
                    $intTaxCode = Yii::app()->shoppingcart->tax_code_id;
                    //Save tax code already chosen
                    Yii::app()->user->login($identity, 3600 * 24 * 30);
                    Yii::app()->user->setState('createdoncheckout', 1);
                    Yii::app()->shoppingcart->tax_code_id = $intTaxCode;
                }
                // If we're not logged in, create guest account, or get our logged in ID.
                if (Yii::app()->user->isGuest) {
                    Yii::log("Creating Guest account to complete checkout", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                    if (is_null($objCart->customer_id)) {
                        //create a new guest ID
                        $identity = new GuestIdentity();
                        Yii::app()->user->login($identity, 300);
                        $intCustomerId = $objCart->customer_id = $identity->getId();
                        $this->intGuestCheckout = 1;
                        $objCustomer = Customer::model()->findByPk($intCustomerId);
                        $objCustomer->first_name = $model->contactFirstName;
                        $objCustomer->last_name = $model->contactLastName;
                        $objCustomer->mainphone = $model->contactPhone;
                        $objCustomer->email = $model->contactEmail;
                        $objCustomer->save();
                    } else {
                        $intCustomerId = $objCart->customer_id;
                        $objCustomer = Customer::model()->findByPk($intCustomerId);
                    }
                } else {
                    $intCustomerId = Yii::app()->user->getId();
                    $objCustomer = Customer::model()->findByPk($intCustomerId);
                }
                $objCart->customer_id = $intCustomerId;
                if (trim($objCart->currency) == '') {
                    $objCart->currency = _xls_get_conf('CURRENCY_DEFAULT', 'USD');
                }
                $objCart->save();
                //If shipping address is value, then choose that
                //otherwise enter new shipping address
                //and assign value
                if ($model->intShippingAddress) {
                    $objCart->shipaddress_id = $model->intShippingAddress;
                } else {
                    Yii::log("Creating new shipping address", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                    if (empty($model->shippingLabel)) {
                        $model->shippingLabel = Yii::t('global', 'Unlabeled Address');
                    }
                    $objAddress = new CustomerAddress();
                    $objAddress->customer_id = $intCustomerId;
                    $objAddress->address_label = $model->shippingLabel;
                    $objAddress->first_name = $model->shippingFirstName;
                    $objAddress->last_name = $model->shippingLastName;
                    $objAddress->address1 = $model->shippingAddress1;
                    $objAddress->address2 = $model->shippingAddress2;
                    $objAddress->city = $model->shippingCity;
                    $objAddress->state_id = $model->shippingState;
                    $objAddress->postal = $model->shippingPostal;
                    $objAddress->country_id = $model->shippingCountry;
                    $objAddress->residential = $model->shippingResidential;
                    if (!$objAddress->save()) {
                        Yii::app()->user->setFlash('error', print_r($objAddress->getErrors(), true));
                        Yii::log("Error creating CustomerAddress Shipping " . print_r($objAddress->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                        $this->refresh();
                    }
                    $objCart->shipaddress_id = $model->intShippingAddress = $objAddress->id;
                    unset($objAddress);
                }
                if ($objCustomer instanceof Customer) {
                    if (is_null($objCustomer->default_shipping_id)) {
                        $objCustomer->default_shipping_id = $model->intShippingAddress;
                        $objCustomer->save();
                        try {
                            $objCart->setTaxCodeByDefaultShippingAddress();
                        } catch (Exception $e) {
                            Yii::log("Error updating customer cart " . $e->getMessage(), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                        }
                        $objCart->recalculateAndSave();
                    }
                }
                // If billing address is value, then choose that otherwise enter
                // new billing address and assign value.
                if ($model->intBillingAddress) {
                    $objCart->billaddress_id = $model->intBillingAddress;
                } elseif ($model->billingSameAsShipping) {
                    $objCart->billaddress_id = $model->intBillingAddress = $model->intShippingAddress;
                } else {
                    if (empty($model->billingLabel)) {
                        $model->billingLabel = Yii::t('checkout', 'Unlabeled address');
                    }
                    if (!Yii::app()->user->isGuest) {
                        $objCustomer = Customer::GetCurrent();
                        if ($objCustomer instanceof Customer) {
                            $model->contactFirstName = $objCustomer->first_name;
                            $model->contactLastName = $objCustomer->last_name;
                        }
                    }
                    $objAddress = new CustomerAddress();
                    $objAddress->customer_id = $intCustomerId;
                    $objAddress->address_label = $model->billingLabel;
                    $objAddress->first_name = $model->contactFirstName;
                    $objAddress->last_name = $model->contactLastName;
                    $objAddress->company = $model->contactCompany;
                    $objAddress->address1 = $model->billingAddress1;
                    $objAddress->address2 = $model->billingAddress2;
                    $objAddress->city = $model->billingCity;
                    $objAddress->state_id = $model->billingState;
                    $objAddress->postal = $model->billingPostal;
                    $objAddress->country_id = $model->billingCountry;
                    $objAddress->phone = $model->contactPhone;
                    $objAddress->residential = $model->billingResidential;
                    if (!$objAddress->save()) {
                        Yii::app()->user->setFlash('error', print_r($objAddress->getErrors(), true));
                        Yii::log("Error creating CustomerAddress Billing " . print_r($objAddress->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                        $this->refresh();
                    }
                    $objCart->billaddress_id = $model->intBillingAddress = $objAddress->id;
                    unset($objAddress);
                }
                if ($objCustomer instanceof Customer) {
                    if (is_null($objCustomer->default_billing_id)) {
                        $objCustomer->default_billing_id = $model->intBillingAddress;
                        $objCustomer->save();
                    }
                }
                // Mark order as awaiting payment.
                Yii::log("Marking as " . OrderStatus::AwaitingPayment, 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                $objCart->cart_type = CartType::awaitpayment;
                $objCart->status = OrderStatus::AwaitingPayment;
                $objCart->downloaded = 0;
                $objCart->origin = _xls_get_ip();
                $objCart->save();
                //save cart so far
                // Assign next WO number, and LinkID.
                $objCart->SetIdStr();
                Yii::log("Order assigned " . $objCart->id_str, 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                $objCart->linkid = $objCart->GenerateLink();
                // Get Shipping Information.
                // Prices are stored in session from Calculate Shipping.
                // TODO: rewrite to use the "selectedCartScenario" mechanism.
                $objShippingModule = Modules::model()->findByPk($model->shippingProvider);
                $arrShippingOptionPrice = Yii::app()->session->get('ship.prices.cache', null);
                if ($arrShippingOptionPrice === null) {
                    Yii::app()->user->setFlash('error', Yii::t('global', 'Oops, something went wrong, please try submitting your order again.'));
                    Yii::log('Cannot checkout: ship.prices.cache was not cached. This should never happen.', 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                    // Must use false here to prevent process termination or
                    // the UTs die completely when this occurs.
                    $this->refresh(false);
                    return;
                }
                $fltShippingSell = $arrShippingOptionPrice[$model->shippingProvider][$model->shippingPriority];
                $fltShippingCost = $fltShippingSell - $objShippingModule->markup;
                // If the chosen shipping module has In-Store pickup, charge
                // store local tax.
                if (Yii::app()->getComponent($objShippingModule->module)->IsStorePickup) {
                    Yii::log("In Store pickup chosen, requires store tax code", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                    $objCart->tax_code_id = TaxCode::getDefaultCode();
                    $objCart->recalculateAndSave();
                }
                // If we have a shipping object already, update it, otherwise create it.
                if (isset($objCart->shipping)) {
                    $objShipping = $objCart->shipping;
                    //update
                } else {
                    //create
                    $objShipping = new CartShipping();
                    if (!$objShipping->save()) {
                        print_r($objShipping->getErrors());
                    }
                }
                $objShipping->shipping_module = $objShippingModule->module;
                Yii::log("Shipping module is " . $objShipping->shipping_module, 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                $providerLabel = Yii::app()->session['ship.providerLabels.cache'][$model->shippingProvider];
                $priorityLabel = Yii::app()->session['ship.priorityLabels.cache'][$model->shippingProvider][$model->shippingPriority];
                if (stripos($priorityLabel, $providerLabel) !== false) {
                    $strLabel = $priorityLabel;
                } else {
                    $strLabel = $providerLabel . ' ' . $priorityLabel;
                }
                $objShipping->shipping_data = $strLabel;
                $objShipping->shipping_method = $objShippingModule->product;
                $objShipping->shipping_cost = $fltShippingCost;
                $objShipping->shipping_sell = $fltShippingSell;
                $objShipping->save();
                $objCart->shipping_id = $objShipping->id;
                $objCart->save();
                //save cart so far
                // Update the cart totals.
                $objCart->recalculateAndSave();
                // Get payment Information.
                $objPaymentModule = Modules::model()->findByPk($model->paymentProvider);
                // If we have a payment object already, update it, otherwise create it.
                if (isset($objCart->payment)) {
                    $objPayment = $objCart->payment;
                    //update
                } else {
                    //create
                    $objPayment = new CartPayment();
                    if (!$objPayment->save()) {
                        print_r($objPayment->getErrors());
                    }
                }
                Yii::log("Payment method is " . $objPaymentModule->payment_method, 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                $objPayment->payment_method = $objPaymentModule->payment_method;
                $objPayment->payment_module = $objPaymentModule->module;
                $objPayment->save();
                $objCart->payment_id = $objPayment->id;
                $objCart->save();
                /* RUN PAYMENT HERE */
                Yii::log("Running payment on " . $objCart->id_str, 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                // See if we have a subform for our payment module, set that as
                // part of running payment module.
                if (isset($paymentSubformModel)) {
                    $arrPaymentResult = Yii::app()->getComponent($objPaymentModule->module)->setCheckoutForm($model)->setSubForm($paymentSubformModel)->run();
                } else {
                    $arrPaymentResult = Yii::app()->getComponent($objPaymentModule->module)->setCheckoutForm($model)->run();
                }
                // If we have a full Jump submit form, render it out here.
                if (isset($arrPaymentResult['jump_form'])) {
                    Yii::log("Using payment jump form", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                    $objCart->printed_notes .= $model->orderNotes;
                    $this->completeUpdatePromoCode();
                    $this->layout = '//layouts/jumper';
                    Yii::app()->clientScript->registerScript('submit', '$(document).ready(function(){
						$("form:first").submit();
						});');
                    $this->render('jumper', array('form' => $arrPaymentResult['jump_form']));
                    Yii::app()->shoppingcart->releaseCart();
                    return;
                }
                // At this point, if we have a JumpURL, off we go...
                if (isset($arrPaymentResult['jump_url']) && $arrPaymentResult['jump_url']) {
                    Yii::log("Using payment jump url", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                    // Redirect to another URL for payment.
                    $objCart->printed_notes .= $model->orderNotes;
                    $this->completeUpdatePromoCode();
                    Yii::app()->shoppingcart->releaseCart();
                    Yii::app()->controller->redirect($arrPaymentResult['jump_url']);
                    return;
                }
                // to support error messages that occur with Cayan during the createTransaction process
                // see the extension for more info
                if (isset($arrPaymentResult['errorMessage'])) {
                    Yii::app()->user->setFlash('error', $arrPaymentResult['errorMessage']);
                    $this->redirect($this->createAbsoluteUrl('/cart/checkout'));
                }
                // If we are this far, we're using an Advanced Payment (or
                // non-payment like COD) so save the result of the payment
                // process (may be pass or fail).
                $objPayment->payment_data = $arrPaymentResult['result'];
                $objPayment->payment_amount = $arrPaymentResult['amount_paid'];
                $objPayment->datetime_posted = isset($retVal['payment_date']) ? date("Y-m-d H:i:s", strtotime($retVal['payment_date'])) : new CDbExpression('NOW()');
                $objPayment->save();
                if (isset($arrPaymentResult['success']) && $arrPaymentResult['success']) {
                    Yii::log("Payment Success! Wrapping up processing", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
                    //We have successful payment, so close out the order and show the receipt
                    $objCart->printed_notes .= $model->orderNotes;
                    $this->completeUpdatePromoCode();
                    self::EmailReceipts($objCart);
                    Yii::log('Receipt e-mails added to the queue', 'info', __CLASS__ . '.' . __FUNCTION__);
                    self::FinalizeCheckout($objCart);
                    return;
                } else {
                    Yii::app()->user->setFlash('error', isset($arrPaymentResult['result']) ? $arrPaymentResult['result'] : "UNKNOWN ERROR");
                }
            } else {
                Yii::log("Error submitting form " . print_r($model->getErrors(), true), 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                Yii::app()->user->setFlash('error', Yii::t('cart', 'Please check your form for errors.'));
                if (YII_DEBUG) {
                    Yii::app()->user->setFlash('error', "DEBUG: " . _xls_convert_errors_display(_xls_convert_errors($model->getErrors())));
                }
            }
        } else {
            if (isset(Yii::app()->session['checkout.cache'])) {
                $model = Yii::app()->session['checkout.cache'];
                $model->clearErrors();
            } else {
                //If this is the first time we're displaying the Checkout form, set some defaults
                $model->setScenario('formSubmit');
                $model->billingCountry = _xls_get_conf('DEFAULT_COUNTRY');
                $model->shippingCountry = _xls_get_conf('DEFAULT_COUNTRY');
                $model->billingSameAsShipping = 1;
                $model->billingResidential = 1;
                $model->shippingResidential = 1;
                //Set our default payment module to first on the list
                $obj = new CheckoutForm();
                $data = array_keys($obj->getPaymentMethods());
                if (count($data) > 0) {
                    $model->paymentProvider = $data[0];
                }
                if (!Yii::app()->user->isGuest) {
                    //For logged in users, preset to customer account information
                    $objCustomer = Customer::GetCurrent();
                    if (!$objCustomer instanceof Customer) {
                        //somehow we're logged in without a valid Customer object
                        Yii::app()->user->logout();
                        $url = Yii::app()->createUrl('site/index');
                        $this->redirect($url);
                    }
                    $model->contactFirstName = $objCustomer->first_name;
                    $model->contactLastName = $objCustomer->last_name;
                    $model->contactPhone = $objCustomer->mainphone;
                    $model->contactEmail = $objCustomer->email;
                    if (!empty($objCustomer->defaultBilling)) {
                        $model->intBillingAddress = $objCustomer->default_billing_id;
                    }
                    if (!empty($objCustomer->defaultShipping)) {
                        $model->intShippingAddress = $objCustomer->default_shipping_id;
                    }
                } else {
                    //Set some defaults for guest checkouts
                    $model->receiveNewsletter = Yii::app()->params['DISABLE_ALLOW_NEWSLETTER'] == 1 ? 0 : 1;
                }
            }
        }
        $this->objCart = Yii::app()->shoppingcart;
        // When CheckoutForm is initialized the shippingProvider and
        // shippingPriority are null.  The AJAX validation sends empty
        // strings for these fields until a shipping option is selected.
        if (is_null($model->shippingProvider) || $model->shippingProvider === '') {
            // Use -1 to indicate that the shipping provider has not been chosen.
            $model->shippingProvider = '-1';
        }
        if (is_null($model->shippingPriority) || $model->shippingPriority === '') {
            // Use -1 to indicate that the shipping priority has not been chosen.
            $model->shippingPriority = '-1';
        }
        //If we have a default shipping address on, hide our Shipping box
        if (!empty($model->intShippingAddress) && count($model->objAddresses) > 0) {
            Yii::app()->clientScript->registerScript('shipping', '$(document).ready(function(){
				$("#CustomerContactShippingAddress").hide();
				});');
            // These need to go at POS_END because they need to be ran after
            // SinglePageCheckout has been instantiated. Further granularity in
            // the load order can be achieved by passing an integer to the
            // $position parameter. @See CClientScript::registerScript.
            Yii::app()->clientScript->registerScript('shippingforceclick', '$(document).ready(function(){
				singlePageCheckout.calculateShipping();
				});', CClientScript::POS_END);
        }
        //If we have a default billing address on, hide our Billing box
        if (!empty($model->intBillingAddress) && count($model->objAddresses) > 0) {
            Yii::app()->clientScript->registerScript('billingadd', '$(document).ready(function(){
				$("#CustomerContactBillingAddressAdd").hide();
				});');
        }
        //If Same as Billing checkbox is on, hide our Billing box
        if ($model->billingSameAsShipping) {
            Yii::app()->clientScript->registerScript('billing', 'if ($("#CheckoutForm_billingSameAsShipping:checked").length>0)
				$("#CustomerContactBillingAddress").hide();');
        }
        $paymentForms = $model->getAlternativePaymentMethodsThatUseSubForms();
        // If we have chosen a payment provider (indicating this is a refresh),
        // repick here.
        if ($model->paymentProvider > 0) {
            $objPaymentModule = Modules::model()->findByPk($model->paymentProvider);
            if ($objPaymentModule instanceof Modules) {
                $objModule = Yii::app()->getComponent($objPaymentModule->module);
                if (!$objModule) {
                    Yii::log("Error missing module " . $objPaymentModule->module, 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
                    $model->paymentProvider = null;
                } else {
                    $subForm = $objModule->subform;
                    if (isset($subForm)) {
                        if (isset($_POST[$subForm])) {
                            $paymentForms[$objPaymentModule->id]->attributes = $_POST[$subForm];
                            $paymentForms[$objPaymentModule->id]->validate();
                        }
                    }
                    Yii::app()->clientScript->registerScript('payment', sprintf('$(document).ready(function(){
							singlePageCheckout.changePayment(%s)
							});', CJSON::encode($model->paymentProvider)), CClientScript::POS_END);
                }
            } else {
                $model->paymentProvider = null;
            }
        }
        // Disable button on Submit to prevent double-clicking.
        $cs = Yii::app()->clientScript;
        $cs->registerScript('submit', '$("checkout:submit").mouseup(function() {
			$(this).attr("disabled",true);
			$(this).parents("form").submit();
			})', CClientScript::POS_READY);
        // This registers a backwards-compatibility shim for the pre-3.2.2
        // single-page checkout. 3.2.2 moved much of the JavaScript out of
        // checkout.php and _cartjs.php into WsSinglePageCheckout.js to
        // improve testability. This shim exists to support stores with a
        // customized checkout that is based on a version before 3.2.2. At
        // some point, we should find a way to move customers customers forward
        // and remove this shim.
        $cs->registerScript('compatibility-shim', '$(document).ready(function(){
				if (typeof singlePageCheckout === "undefined" && typeof updateShippingPriority === "function") {
					singlePageCheckout = {
						calculateShipping: function() { $("#btnCalculate").click(); },
						changePayment: function(paymentProviderId) { changePayment(paymentProviderId); },
						pickShippingProvider: function(providerId) { updateShippingPriority(providerId); },
						updateCart: function(priorityId) { updateCart(priorityId); }
					};
				}
			})', CClientScript::POS_BEGIN);
        // Clear out anything we don't to survive the round trip.
        $model->cardNumber = null;
        $model->cardCVV = null;
        $this->render('checkout', array('model' => $model, 'paymentForms' => $paymentForms));
    }