/** * 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; }
<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); } }
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; }
public function addAddress(CustomerAddress $address) { $this->addresses[$address->getID()] = $address; return $this; }
/** * 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'); }
/** * @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; }
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)); }