function testEcommerceRoleCreateOrMerge() { $member = $this->objFromFixture('Member', 'member1'); $this->session()->inst_set('loggedInAs', $member->ID); $uniqueField = Member::get_unique_identifier_field(); $this->assertEquals('*****@*****.**', $member->getField($uniqueField), 'The unique field is the email address'); $this->assertEquals('US', $member->getField('Country'), 'The country is US'); /* Change the email address to a new one (doesn't exist) */ $member = EcommerceRole::createOrMerge(array('Country' => 'AU', $uniqueField => '*****@*****.**')); $this->assertType('object', $member, 'The member is an object, not FALSE'); $this->assertEquals('*****@*****.**', $member->getField($uniqueField), 'The unique field is changed (no member with that email)'); $this->assertEquals('AU', $member->getField('Country'), 'The member country is now AU'); /* Change the data (update existing record - logged in member owns this email) */ $member = EcommerceRole::createOrMerge(array('Country' => 'NZ', $uniqueField => '*****@*****.**')); $this->assertType('object', $member, 'The member is an object, not FALSE'); $this->assertEquals('*****@*****.**', $member->getField($uniqueField), 'The unique field is the same (updated own record)'); $this->assertEquals('NZ', $member->getField('Country'), 'The member country is now NZ'); /* Change the email address to one exists (we should not get a member back when trying to merge!) */ $member = EcommerceRole::createOrMerge(array('Country' => 'US', $uniqueField => '*****@*****.**')); $this->assertFalse($member, 'No member returned because we tried to merge an email that already exists in the DB'); /* Log the member out */ $this->session()->inst_set('loggedInAs', null); /* Non-logged in site user creating a new member with email that doesn't exist */ $member = EcommerceRole::createOrMerge(array('Country' => 'NZ', $uniqueField => '*****@*****.**')); $this->assertType('object', $member, 'The member is an object, not FALSE'); $this->assertEquals('*****@*****.**', $member->getField($uniqueField)); $this->assertEquals('NZ', $member->getField('Country'), 'The member country is NZ'); /* Non-logged in site user creating a member with email that DOES exist */ $member = EcommerceRole::createOrMerge(array('Country' => 'AU', $uniqueField => '*****@*****.**')); $this->assertFalse($member, 'The new user tried to create a member with an email that already exists, FALSE returned'); $member = EcommerceRole::createOrMerge(array('Country' => 'AU', $uniqueField => '*****@*****.**')); $this->assertFalse($member, 'Even if the email has a different case, FALSE is still returned'); }
/** * Process the items in the shopping cart from session, * creating a new {@link Order} record, and updating the * customer's details {@link Member} record. * * {@link Payment} instance is created, linked to the order, * and payment is processed {@link Payment::processPayment()} * * @param array $data Form request data submitted from OrderForm * @param Form $form Form object for this action * @param HTTPRequest $request Request object for this action */ function processOrder($data, $form, $request) { $paymentClass = !empty($data['PaymentMethod']) ? $data['PaymentMethod'] : null; $payment = class_exists($paymentClass) ? new $paymentClass() : null; if (!($payment && $payment instanceof Payment)) { user_error(get_class($payment) . ' is not a valid Payment object!', E_USER_ERROR); } if (!ShoppingCart::has_items()) { $form->sessionMessage('Please add some items to your cart', 'bad'); Director::redirectBack(); return false; } // Create new OR update logged in {@link Member} record $member = EcommerceRole::createOrMerge($data); if (!$member) { $form->sessionMessage(_t('OrderForm.MEMBEREXISTS', 'Sorry, a member already exists with that email address. If this is your email address, please log in first before placing your order.'), 'bad'); Director::redirectBack(); return false; } $member->write(); $member->logIn(); // Create new Order from shopping cart, discard cart contents in session $order = ShoppingCart::save_current_order(); ShoppingCart::clear(); // Write new record {@link Order} to database $form->saveInto($order); $order->write(); // Save payment data from form and process payment $form->saveInto($payment); $payment->OrderID = $order->ID; $payment->Amount = $order->Total(); $payment->write(); // Process payment, get the result back $result = $payment->processPayment($data, $form); // isProcessing(): Long payment process redirected to another website (PayPal, Worldpay) if ($result->isProcessing()) { return $result->getValue(); } if ($result->isSuccess()) { $order->sendReceipt(); } Director::redirect($order->Link()); return true; }