public function testCheckAddress() { // Prepare address and save it in database $origAddress = new \XLite\Model\Address(); $origAddress->map($this->addressFields); $origAddress->setState(\XLite\Core\Database::getRepo('XLite\\Model\\State')->findOneByCountryAndCode('US', 'NY')); $origAddress->setCountry(\XLite\Core\Database::getRepo('XLite\\Model\\Country')->find('US')); $origAddress->setProfile(\XLite\Core\Database::getRepo('XLite\\Model\\Profile')->find(1)); $address = $origAddress->cloneEntity(); $origAddress->create(); // Test: new address should not be created as it is identical $this->assertFalse($address->create(), "Check that address is not created (all fields are identical)"); foreach (\XLite\Model\Address::getAddressFields() as $field) { $address = $origAddress->cloneEntity(); if ('state_id' == $field) { $address->setState(\XLite\Core\Database::getRepo('XLite\\Model\\State')->findOneByCountryAndCode('US', 'CA')); } elseif ('country_code' == $field) { $address->setCountry(\XLite\Core\Database::getRepo('XLite\\Model\\Country')->find('GB')); } elseif ('custom_state' != $field) { $address->map($this->addressFields); $methodName = 'set' . \XLite\Core\Converter::getInstance()->convertToCamelCase($field); $this->assertTrue(method_exists($address, $methodName), "Check if method exists ({$methodName})"); $modifiedField = $this->addressFields[$field] . '2'; $address->{$methodName}($modifiedField); } // Test: new address must be created as one of fields is modified $this->assertTrue($address->create(), "Check if address is created ({$field})"); } }
/** * Update profile billing address * * @return void */ protected function updateBillingAddress() { $noAddress = false; $data = empty($this->requestData['billingAddress']) ? null : $this->requestData['billingAddress']; $profile = $this->getCartProfile(); if (isset($this->requestData['same_address'])) { \XLite\Core\Session::getInstance()->same_address = (bool) $this->requestData['same_address']; } if ($this->requestData['same_address']) { // Shipping and billing are same addresses $address = $profile->getBillingAddress(); if ($address) { // Unselect old billing address $address->setIsBilling(false); } $address = $profile->getShippingAddress(); if ($address) { // Link shipping and billing address $address->setIsBilling(true); } } elseif (isset($this->requestData['same_address']) && !$this->requestData['same_address']) { // Unlink shipping and billing addresses $address = $profile->getShippingAddress(); if ($address && $address->getIsBilling()) { $address->setIsBilling(false); } } if (is_array($data) && !$this->requestData['same_address']) { // Save separate billing address $address = $profile->getBillingAddress(); if ($address) { \XLite\Core\Database::getEM()->refresh($address); } $andAsShipping = false; $current = new \XLite\Model\Address(); $current->map($this->prepareAddressData($data, 'billing')); $equal = null; foreach ($profile->getAddresses() as $addressEqual) { if ($addressEqual->isEqualAddress($current) && (!$address || $address->getAddressId() != $addressEqual->getAddressId())) { $equal = $addressEqual; break; } } if ($equal) { if ($address && $address->getIsWork()) { $profile->getAddresses()->removeElement($address); \XLite\Core\Database::getEM()->remove($address); } if ($address) { $andAsShipping = $address->getIsShipping(); $address->setIsBilling(false); if ($andAsShipping) { $address->setIsShipping(false); } } $address = $equal; $address->setIsBilling(true); if ($andAsShipping) { $address->setIsShipping($andAsShipping); } } if (!$address || !$address->getIsWork() && !$address->isEqualAddress($current)) { if ($address) { $andAsShipping = $address->getIsShipping(); $address->setIsBilling(false); $address->setIsShipping(false); } $address = new \XLite\Model\Address(); $address->setProfile($profile); $address->setIsBilling(true); $address->setIsShipping($andAsShipping); $address->setIsWork(true); if (!(bool) \XLite\Core\Request::getInstance()->only_calculate) { $profile->addAddresses($address); \XLite\Core\Database::getEM()->persist($address); $noAddress = true; } } $address->map($this->prepareAddressData($data, 'billing')); \XLite\Core\Session::getInstance()->same_address = $this->getCart()->getProfile()->isEqualAddress(); } if ($noAddress) { \XLite\Core\Event::createBillingAddress(array('id' => $address->getAddressId())); } }
/** * Update address * * @return void */ protected function updateAddress($data) { if (!is_array($data)) { return; } $profile = $this->getCartProfile(); $address = $profile->getShippingAddress(); if ($address) { \XLite\Core\Database::getEM()->refresh($address); } $noAddress = !isset($address); $andAsBilling = true; $current = new \XLite\Model\Address(); $current->map($this->prepareAddressData($data)); if ($noAddress || !$address->getIsWork() && !$address->isEqualAddress($current)) { $address = new \XLite\Model\Address(); $address->setProfile($profile); $address->setIsShipping(true); $address->setIsBilling($andAsBilling); $address->setIsWork(true); if ($noAddress || !(bool) \XLite\Core\Request::getInstance()->only_calculate) { $profile->addAddresses($address); \XLite\Core\Database::getEM()->persist($address); } } $address->map($this->prepareAddressData($data)); if ($noAddress && !$profile->getBillingAddress() && (is_null(\XLite\Core\Session::getInstance()->same_address) || \XLite\Core\Session::getInstance()->same_address)) { // Same address as default behavior $address->setIsBilling(true); } \XLite\Core\Session::getInstance()->same_address = $this->getCart()->getProfile()->isEqualAddress(); }
/** * getTestProfile * * @param int $selectedProfileId * @param int $selectedAddressesId * * @return \XLite\Model\Profile * @access protected * @see ____func_see____ * @since 1.0.0 */ protected function getTestProfile($selectedProfileId = 0, $selectedAddressesId = 0) { $profile = new \XLite\Model\Profile(); $profile->map($this->testProfileData[$selectedProfileId]); if (1 == $selectedProfileId) { $m = \XLite\Core\Database::getRepo('XLite\\Model\\Membership')->find(1); $profile->setMembership($m); $profile->setPendingMembership($m); } foreach ($this->testAddresses[$selectedAddressesId] as $data) { $address = new \XLite\Model\Address(); $address->map($data); $address->setProfile($profile); $profile->addAddresses($address); } $result = $profile->create(); $this->assertNotNull($profile, sprintf('Profile creation failed (%d, %d)', $selectedProfileId, $selectedAddressesId)); return $profile; }