/**
  * @param SS_HTTPRequest $request
  */
 public function run($request)
 {
     $email = $request->remaining();
     $params = $request->allParams();
     $url = Director::absoluteURL("dev/{$params['Action']}/{$params['TaskName']}", true);
     echo '<h2>Choose Email</h2>';
     echo '<ul>';
     foreach ($this->previewableEmails as $key => $method) {
         echo '<li><a href="' . $url . '/' . $method . '">' . $method . '</a></li>';
     }
     echo '</ul><hr>';
     if ($email && in_array($email, $this->previewableEmails)) {
         $order = Order::get()->first();
         $notifier = OrderEmailNotifier::create($order)->setDebugMode(true);
         $method = "send{$email}";
         echo $notifier->{$method}();
     } else {
     }
     //this is a little hardcore way of ending the party,
     //but as it's only used for styling, it works for now
     die;
 }
 /**
  * Takes an order from being a cart to awaiting payment.
  *
  * @param Member $member - assign a member to the order
  *
  * @return boolean - success/failure
  */
 public function placeOrder()
 {
     if (!$this->order) {
         $this->error(_t("OrderProcessor.NoOrderStarted", "A new order has not yet been started."));
         return false;
     }
     if (!$this->canPlace($this->order)) {
         //final cart validation
         return false;
     }
     if ($this->order->Locale) {
         ShopTools::install_locale($this->order->Locale);
     }
     // recalculate order to be sure we have the correct total
     $this->order->calculate();
     if (ShopTools::DBConn()->supportsTransactions()) {
         ShopTools::DBConn()->transactionStart();
     }
     //update status
     if ($this->order->TotalOutstanding(false)) {
         $this->order->Status = 'Unpaid';
     } else {
         $this->order->Status = 'Paid';
     }
     if (!$this->order->Placed) {
         $this->order->Placed = SS_Datetime::now()->Rfc2822();
         //record placed order datetime
         if ($request = Controller::curr()->getRequest()) {
             $this->order->IPAddress = $request->getIP();
             //record client IP
         }
     }
     // Add an error handler that throws an exception upon error, so that we can catch errors as exceptions
     // in the following block.
     set_error_handler(function ($severity, $message, $file, $line) {
         throw new ErrorException($message, 0, $severity, $file, $line);
     }, E_ALL & ~(E_STRICT | E_NOTICE));
     try {
         //re-write all attributes and modifiers to make sure they are up-to-date before they can't be changed again
         $items = $this->order->Items();
         if ($items->exists()) {
             foreach ($items as $item) {
                 $item->onPlacement();
                 $item->write();
             }
         }
         $modifiers = $this->order->Modifiers();
         if ($modifiers->exists()) {
             foreach ($modifiers as $modifier) {
                 $modifier->write();
             }
         }
         //add member to order & customers group
         if ($member = Member::currentUser()) {
             if (!$this->order->MemberID) {
                 $this->order->MemberID = $member->ID;
             }
             $cgroup = ShopConfig::current()->CustomerGroup();
             if ($cgroup->exists()) {
                 $member->Groups()->add($cgroup);
             }
         }
         //allow decorators to do stuff when order is saved.
         $this->order->extend('onPlaceOrder');
         $this->order->write();
     } catch (Exception $ex) {
         // Rollback the transaction if an error occurred
         if (ShopTools::DBConn()->supportsTransactions()) {
             ShopTools::DBConn()->transactionRollback();
         }
         $this->error($ex->getMessage());
         return false;
     } finally {
         // restore the error handler, no matter what
         restore_error_handler();
     }
     // Everything went through fine, complete the transaction
     if (ShopTools::DBConn()->supportsTransactions()) {
         ShopTools::DBConn()->transactionEnd();
     }
     //remove from session
     $cart = ShoppingCart::curr();
     if ($cart && $cart->ID == $this->order->ID) {
         // clear the cart, but don't write the order in the process (order is finalized and should NOT be overwritten)
         ShoppingCart::singleton()->clear(false);
     }
     //send confirmation if configured and receipt hasn't been sent
     if (self::config()->send_confirmation && !$this->order->ReceiptSent) {
         $this->notifier->sendConfirmation();
     }
     //notify admin, if configured
     if (self::config()->send_admin_notification) {
         $this->notifier->sendAdminNotification();
     }
     // Save order reference to session
     OrderManipulation::add_session_order($this->order);
     return true;
     //report success
 }
 /**
  * @deprecated 2.0
  */
 public function sendStatusChange($title, $note = null)
 {
     Deprecation::notice('2.0', 'Use OrderEmailNotifier instead');
     $this->notifier->sendStatusChange($title, $note);
 }
예제 #4
0
 public function onAfterWrite()
 {
     parent::onAfterWrite();
     //create an OrderStatusLog
     if ($this->flagOrderStatusWrite) {
         $this->flagOrderStatusWrite = false;
         $log = OrderStatusLog::create();
         // populate OrderStatusLog
         $log->Title = _t('ShopEmail.StatusChanged', 'Status for order #{OrderNo} changed to "{OrderStatus}"', '', array('OrderNo' => $this->Reference, 'OrderStatus' => $this->getStatusI18N()));
         $log->Note = _t('ShopEmail.StatusChange' . $this->Status . 'Note');
         $log->OrderID = $this->ID;
         OrderEmailNotifier::create($this)->sendStatusChange($log->Title, $log->Note);
         $log->SentToCustomer = true;
         $this->extend('updateOrderStatusLog', $log);
         $log->write();
     }
 }
 public function testStatusUpdate()
 {
     $this->notifier->sendStatusChange('test subject');
     $this->assertEmailSent('*****@*****.**', '*****@*****.**', _t('ShopEmail.StatusChangeSubject') . 'test subject');
 }
 public function testStatusUpdate()
 {
     $this->notifier->sendStatusChange('test subject');
     $this->assertEmailSent('*****@*****.**', '*****@*****.**', 'test subject');
 }
 /**
  * Form action handler for CancelOrderForm.
  *
  * Take the order that this was to be change on,
  * and set the status that was requested from
  * the form request data.
  *
  * @param array $data The form request data submitted
  * @param Form  $form The {@link Form} this was submitted on
  */
 public function docancel($data, $form)
 {
     if (self::config()->allow_cancelling && $this->order->canCancel()) {
         $this->order->Status = 'MemberCancelled';
         $this->order->write();
         if (self::config()->email_notification) {
             OrderEmailNotifier::create($this->order)->sendCancelNotification();
         }
         $this->controller->sessionMessage(_t("OrderForm.OrderCancelled", "Order sucessfully cancelled"), 'warning');
         if (Member::currentUser() && ($link = $this->order->Link())) {
             $this->controller->redirect($link);
         } else {
             $this->controller->redirectBack();
         }
     }
 }