create() public static method

Makes creating a processor easier.
public static create ( Order $order )
$order Order
 public function onCaptured($response)
 {
     $order = $this->owner->Order();
     if ($order->exists()) {
         OrderProcessor::create($order)->completePayment();
     }
 }
 public function testOffsitePaymentWithGatewayCallback()
 {
     //set up cart
     $cart = ShoppingCart::singleton()->setCurrent($this->objFromFixture("Order", "cart"))->current();
     //collect checkout details
     $cart->update(array('FirstName' => 'Foo', 'Surname' => 'Bar', 'Email' => '*****@*****.**'));
     $cart->write();
     //pay for order with external gateway
     $processor = OrderProcessor::create($cart);
     $this->setMockHttpResponse('PaymentExpress/Mock/PxPayPurchaseSuccess.txt');
     $response = $processor->makePayment("PaymentExpress_PxPay", array());
     //gateway responds (in a different session)
     $oldsession = $this->mainSession;
     $this->mainSession = new TestSession();
     ShoppingCart::singleton()->clear();
     $this->setMockHttpResponse('PaymentExpress/Mock/PxPayCompletePurchaseSuccess.txt');
     $this->getHttpRequest()->query->replace(array('result' => 'abc123'));
     $identifier = $response->getPayment()->Identifier;
     $response = $this->get("paymentendpoint/{$identifier}/complete");
     //reload cart as new order
     $order = Order::get()->byId($cart->ID);
     $this->assertFalse($order->isCart(), "order is no longer in cart");
     $this->assertTrue($order->isPaid(), "order is paid");
     //bring back client session
     $this->mainSession = $oldsession;
     $response = $this->get("paymentendpoint/{$identifier}/complete");
     $this->assertNull(Session::get("shoppingcartid"), "cart session id should be removed");
     $this->assertNotEquals(404, $response->getStatusCode(), "We shouldn't get page not found");
     $this->markTestIncomplete("Should assert other things");
 }
 public function testPlacedOrderImmutability()
 {
     $order = $this->objFromFixture("Order", "paid");
     $processor = OrderProcessor::create($order)->placeOrder();
     $this->assertEquals(408, $order->Total(), "check totals");
     //make a changes to existing products
     $this->mp3player->BasePrice = 100;
     $this->mp3player->write();
     $this->socks->BasePrice = 20;
     $this->socks->write();
     //total doesn't change
     $this->assertEquals(408, $order->Total());
     $this->assertFalse($order->isCart());
     //item values don't change
     $items = $order->Items()->innerJoin("Product_OrderItem", '"OrderItem"."ID" = "Product_OrderItem"."ID"');
     $this->assertNotNull($items);
     $this->assertDOSEquals(array(array('ProductID' => $this->mp3player->ID, 'Quantity' => 2, 'CalculatedTotal' => 400), array('ProductID' => $this->socks->ID, 'Quantity' => 1, 'CalculatedTotal' => 8)), $items);
     $mp3player = $items->find('ProductID', $this->mp3player->ID);
     //join needed to provide ProductID
     $this->assertNotNull($mp3player, "MP3 player is in order");
     $this->assertEquals(200, $mp3player->UnitPrice(), "Unit price remains the same");
     $this->assertEquals(400, $mp3player->Total(), "Total remains the same");
     $socks = $items->find('ProductID', $this->socks->ID);
     $this->assertNotNull($socks, "Socks are in order");
     $this->assertEquals(8, $socks->UnitPrice(), "Unit price remains the same");
     $this->assertEquals(8, $socks->Total(), "Total remains the same");
 }
 /**
  * Make payment for a place order, where payment had previously failed.
  *
  * @param array $data
  * @param Form  $form
  *
  * @return boolean
  */
 public function dopayment($data, $form)
 {
     if (self::config()->allow_paying && $this->order && $this->order->canPay()) {
         // Save payment data from form and process payment
         $data = $form->getData();
         $gateway = !empty($data['PaymentMethod']) ? $data['PaymentMethod'] : null;
         if (!GatewayInfo::is_manual($gateway)) {
             $processor = OrderProcessor::create($this->order);
             $data['cancelUrl'] = $processor->getReturnUrl();
             $response = $processor->makePayment($gateway, $data);
             if ($response) {
                 if ($response->isRedirect() || $response->isSuccessful()) {
                     return $response->redirect();
                 }
                 $form->sessionMessage($response->getMessage(), 'bad');
             } else {
                 $form->sessionMessage($processor->getError(), 'bad');
             }
         } else {
             $form->sessionMessage(_t('OrderActionsForm.MANUAL_NOT_ALLOWED', "Manual payment not allowed"), 'bad');
         }
         return $this->controller->redirectBack();
     }
     $form->sessionMessage(_t('OrderForm.COULDNOTPROCESSPAYMENT', 'Payment could not be processed.'), 'bad');
     $this->controller->redirectBack();
 }
 public function onPendingAuthorize($response)
 {
     $order = $this->owner->Order();
     if ($order->exists()) {
         OrderProcessor::create($order)->placeOrder();
     }
 }
 protected function placeOrder()
 {
     // ensure order is being reloaded from DB, to prevent dealing with stale data!
     /** @var Order $order */
     $order = Order::get()->byID($this->owner->OrderID);
     if ($order && $order->exists()) {
         OrderProcessor::create($order)->placeOrder();
     }
 }
 /**
  * Make payment for a place order, where payment had previously failed.
  *
  * @param array $data
  * @param Form  $form
  *
  * @return boolean
  */
 public function dopayment($data, $form)
 {
     if (self::config()->allow_paying && $this->order && $this->order->canPay()) {
         // Save payment data from form and process payment
         $data = $form->getData();
         $gateway = !empty($data['PaymentMethod']) ? $data['PaymentMethod'] : null;
         if (!GatewayInfo::isManual($gateway)) {
             /** @var OrderProcessor $processor */
             $processor = OrderProcessor::create($this->order);
             $response = $processor->makePayment($gateway, $data, $processor->getReturnUrl());
             if ($response && !$response->isError()) {
                 return $response->redirectOrRespond();
             } else {
                 $form->sessionMessage($processor->getError(), 'bad');
             }
         } else {
             $form->sessionMessage(_t('OrderActionsForm.ManualNotAllowed', "Manual payment not allowed"), 'bad');
         }
         return $this->controller->redirectBack();
     }
     $form->sessionMessage(_t('OrderForm.CouldNotProcessPayment', 'Payment could not be processed.'), 'bad');
     $this->controller->redirectBack();
 }
 /**
  * Helper function that populates a form with data and submits it.
  */
 protected function placeOrder($firstname, $surname, $email, $address1, $address2 = null, $city = null, $state = null, $postcode = null, $country = null, $password = null, $confirmpassword = null, $member = null)
 {
     $data = array('FirstName' => $firstname, 'Surname' => $surname, 'Email' => $email, 'Address' => $address1, 'City' => $city, 'State' => $state);
     if ($address2) {
         $data['AddressLine2'] = $address2;
     }
     if ($postcode) {
         $data['PostalCode'] = $postcode;
     }
     if ($country) {
         $data['Country'] = $country;
     }
     if ($password) {
         $data['Password[_Password]'] = $password;
     }
     if ($confirmpassword) {
         $data['Password[_ConfirmPassword]'] = $confirmpassword;
     }
     $order = $this->shoppingcart->current();
     $order->update($data);
     $address = new Address();
     $address->update($data);
     $address->write();
     $order->ShippingAddressID = $address->ID;
     $order->BillingAddressID = $address->ID;
     //same (for now)
     if ($member) {
         $order->MemberID = $member->ID;
     }
     $order->write();
     $this->processor = OrderProcessor::create($order);
     return $this->processor->placeOrder();
 }
 public function testOrderPlacedByGuest()
 {
     // start a new order
     $order = $this->objFromFixture("Order", "cart1");
     $order->FirstName = "Edmund";
     $order->Surname = "Hillary";
     $order->Email = "*****@*****.**";
     $order->Status = "Unpaid";
     $order->write();
     $no_log_generated_with_order_status_unpaid = OrderStatusLog::get()->sort('ID')->last();
     $this->assertNull($no_log_generated_with_order_status_unpaid, "no log generated with Status of 'Unpaid'");
     $processor_guest = OrderProcessor::create($order);
     $response = $processor_guest->makePayment("Manual", array());
     $order->Status = "Paid";
     $order->write();
     $log_order_status_paid = OrderStatusLog::get()->sort('ID')->last();
     $this->assertNull($log_order_status_paid, "no log generated with Status of 'Unpaid'");
     $order->Status = "Processing";
     $order->write();
     $log_order_status_processing = OrderStatusLog::get()->sort('ID')->last();
     $this->assertEquals(OrderStatusLog::get()->count(), '1', "One items in the OrderStatusLog");
     $this->assertNotNull($log_order_status_processing, "a log when changing to 'Processing' status (and PaymentMethod is 'Manual')");
     $this->assertSame($log_order_status_processing->Order()->ID, $order->ID, "Log conatins an Order");
     $this->assertContains("Processing", $log_order_status_processing->Note, "Processing note is recorded");
     $this->assertContains(' changed to "Processing"', $log_order_status_processing->Title, "Processing title is recorded");
     $this->assertEmailSent("*****@*****.**", "*****@*****.**", _t('ShopEmail.StatusChangeSubject') . $log_order_status_processing->Title);
 }