protected function updateWithLastInfo()
 {
     if ($this->OrderID) {
         if ($latestLog = OrderStatusLog::get()->filter('OrderID', $this->OrderID)->sort('Created', 'DESC')->first()) {
             $this->DispatchedBy = $latestLog->DispatchedBy;
             $this->DispatchedOn = $latestLog->DispatchedOn;
             $this->DispatchTicket = $latestLog->DispatchTicket;
             $this->PaymentCode = $latestLog->PaymentCode;
             $this->PaymentOK = $latestLog->PaymentOK;
         }
     }
 }
 /**
  * Add a member to the order - in case he / she is not a shop admin.
  *
  * @param Order object
  * @return Boolean - true if run correctly.
  **/
 public function doStep(Order $order)
 {
     if (!$order->IsSubmitted()) {
         $className = $this->getRelevantLogEntryClassName();
         if (class_exists($className)) {
             //add currency if needed.
             $order->getHasAlternativeCurrency();
             $obj = $className::create();
             if (is_a($obj, Object::getCustomClass("OrderStatusLog"))) {
                 $obj->OrderID = $order->ID;
                 $obj->Title = $this->Name;
                 //it is important we add this here so that we can save the 'submitted' version.
                 //this is particular important for the Order Item Links.
                 //order write will also update all the OrderAttributes!
                 $obj->write();
                 $obj = OrderStatusLog::get()->byID($obj->ID);
                 $saved = false;
                 if ($this->SaveOrderAsSerializedObject) {
                     $obj->OrderAsString = $order->ConvertToString();
                     $saved = true;
                 }
                 if ($this->SaveOrderAsHTML || !$saved) {
                     $obj->OrderAsHTML = Convert::raw2sql($order->ConvertToHTML());
                 }
                 $obj->write();
             } else {
                 user_error('EcommerceConfig::get("OrderStatusLog", "order_status_log_class_used_for_submitting_order") refers to a class that is NOT an instance of OrderStatusLog');
             }
         } else {
             user_error('EcommerceConfig::get("OrderStatusLog", "order_status_log_class_used_for_submitting_order") refers to a non-existing class');
         }
         $order->LastEdited = "'" . SS_Datetime::now()->Rfc2822() . "'";
         //add member if needed...
         if (!$order->MemberID) {
             //lets see if we can find a member
             $memberOrderID = Session::get("Ecommerce_Member_For_Order");
             Session::clear("Ecommerce_Member_For_Order");
             Session::set("Ecommerce_Member_For_Order", 0);
             Session::save();
             if ($memberOrderID) {
                 $order->MemberID = $memberOrderID;
             }
         }
         $order->write($showDebug = false, $forceInsert = false, $forceWrite = true);
     }
     return true;
 }
 /**
  * Send a message to the client containing the latest
  * note of {@link OrderStatusLog} and the current status.
  *
  * Used in {@link OrderReport}.
  *
  * @param string $note Optional note-content (instead of using the OrderStatusLog)
  */
 public function sendStatusChange($title, $note = null)
 {
     if (!$note) {
         $latestLog = OrderStatusLog::get()->filter("OrderID", $this->order->ID)->filter("SentToCustomer", 1)->first();
         if ($latestLog) {
             $note = $latestLog->Note;
             $title = $latestLog->Title;
         }
     }
     $member = $this->order->Member();
     if (Config::inst()->get('OrderProcessor', 'receipt_email')) {
         $adminEmail = Config::inst()->get('OrderProcessor', 'receipt_email');
     } else {
         $adminEmail = Email::config()->admin_email;
     }
     $e = new Order_statusEmail();
     $e->populateTemplate(array("Order" => $this->order, "Member" => $member, "Note" => $note));
     $e->setFrom($adminEmail);
     $e->setSubject($title);
     $e->setTo($member->Email);
     $e->send();
 }
 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);
 }
 public function testDelete()
 {
     Config::inst()->update('FlatTaxModifier', 'rate', 0.25);
     Config::inst()->update('Order', 'modifiers', array('FlatTaxModifier'));
     $order = Order::create();
     $shirt = $this->objFromFixture("Product", "tshirt");
     $mp3player = $this->objFromFixture("Product", "mp3player");
     $order->Items()->add($shirt->createItem(3));
     $order->Items()->add($mp3player->createItem(1));
     $order->write();
     $order->calculate();
     $statusLogId = OrderStatusLog::create(array('Title' => 'Test status log', 'OrderID' => $order->ID))->write();
     $paymentId = Payment::create(array('OrderID' => $order->ID))->init('Manual', 343.75, 'NZD')->write();
     $this->assertEquals(4, $order->Items()->Quantity());
     $this->assertEquals(1, $order->Modifiers()->count());
     $this->assertEquals(1, $order->OrderStatusLogs()->count());
     $this->assertEquals(1, $order->Payments()->count());
     $itemIds = Product_OrderItem::get()->filter('OrderID', $order->ID)->column('ID');
     $modifierIds = OrderModifier::get()->filter('OrderID', $order->ID)->column('ID');
     $order->delete();
     // Items should no longer be linked to order
     $this->assertEquals(0, $order->Items()->count());
     $this->assertEquals(0, $order->Modifiers()->count());
     $this->assertEquals(0, $order->OrderStatusLogs()->count());
     $this->assertEquals(0, $order->Payments()->count());
     // Ensure the order items have been deleted!
     $this->assertEquals(0, Product_OrderItem::get()->filter('ID', $itemIds)->count());
     $this->assertEquals(0, OrderModifier::get()->filter('ID', $modifierIds)->count());
     $this->assertEquals(0, OrderStatusLog::get()->filter('ID', $statusLogId)->count());
     // Keep the payment… it might be relevant for book keeping
     $this->assertEquals(1, Payment::get()->filter('ID', $paymentId)->count());
 }
 function mergeUncompletedOrderForOneMember_170()
 {
     $explanation = "\r\n\t\t\t<h1>170. Merge uncompleted orders into one.</h1>\r\n\t\t\t<p>Merges uncompleted orders by the same user into one.</p>\r\n\t\t";
     if ($this->retrieveInfoOnly) {
         return $explanation;
     } else {
         echo $explanation;
     }
     $orders = Order::get()->filter(array("MemberID:GreaterThan" => 0))->sort(array("MemberID" => "ASC", "\"Order\".\"Created\"" => "DESC"))->innerJoin("Member", "\"Order\".\"MemberID\" = \"Member\".\"ID\"")->limit($this->limit, $this->start);
     $count = 0;
     $previousOrderMemberID = 0;
     $lastOrderFromMember = null;
     if ($orders->count()) {
         foreach ($orders as $order) {
             //crucial ONLY for non-submitted orders...
             if ($order->IsSubmitted()) {
                 //do nothing!
                 $count++;
             } else {
                 $memberID = $order->MemberID;
                 //recurring member
                 if ($previousOrderMemberID == $memberID && $lastOrderFromMember) {
                     $this->DBAlterationMessageNow("We have a duplicate order for a member: " . $order->Member()->Email, "created");
                     $orderAttributes = OrderAttribute::get()->filter(array("OrderID" => $order->ID));
                     if ($orderAttributes->count()) {
                         foreach ($orderAttributes as $orderAttribute) {
                             $this->DBAlterationMessageNow("Moving attribute #" . $orderAttribute->ID, "created");
                             DB::query("UPDATE \"OrderAttribute\" SET \"OrderID\" = " . $lastOrderFromMember->ID . " WHERE \"ID\" = " . $orderAttribute->ID);
                         }
                     } else {
                         $this->DBAlterationMessageNow("There are no attributes for this order");
                     }
                     $orderStatusLogs = OrderStatusLog::get()->filter(array("OrderID" => $order->ID));
                     if ($orderStatusLogs->count()) {
                         foreach ($orderStatusLogs as $orderStatusLog) {
                             $this->DBAlterationMessageNow("Moving order status log #" . $orderStatusLog->ID, "created");
                             DB::query("UPDATE \"OrderStatusLog\" SET \"OrderID\" = " . $lastOrderFromMember->ID . " WHERE \"ID\" = " . $orderStatusLog->ID);
                         }
                     } else {
                         $this->DBAlterationMessageNow("There are no order status logs for this order");
                     }
                     $orderEmailRecords = OrderEmailRecord::get()->filter(array("OrderID" => $order->ID));
                     if ($orderEmailRecords->count()) {
                         foreach ($orderEmailRecords as $orderEmailRecord) {
                             DB::query("UPDATE \"OrderEmailRecord\" SET \"OrderID\" = " . $lastOrderFromMember->ID . " WHERE \"ID\" = " . $orderEmailRecord->ID);
                             $this->DBAlterationMessageNow("Moving email #" . $orderEmailRecord->ID, "created");
                         }
                     } else {
                         $this->DBAlterationMessageNow("There are no emails for this order.");
                     }
                 } else {
                     $previousOrderMemberID = $order->MemberID;
                     $lastOrderFromMember = $order;
                     $this->DBAlterationMessageNow("Found last order from member.");
                 }
                 if ($order->BillingAddressID && !$lastOrderFromMember->BillingAddressID) {
                     $this->DBAlterationMessageNow("Moving Billing Address.");
                     DB::query("UPDATE \"Order\" SET \"BillingAddressID\" = " . $order->BillingAddressID . " WHERE \"ID\" = " . $lastOrderFromMember->ID);
                     DB::query("UPDATE \"BillingAddress\" SET \"OrderID\" = " . $lastOrderFromMember->ID . " WHERE \"ID\" = " . $order->BillingAddressID);
                 }
                 if ($order->ShippingAddressID && !$lastOrderFromMember->ShippingAddressID) {
                     $this->DBAlterationMessageNow("Moving Shipping Address.");
                     DB::query("UPDATE \"Order\" SET \"ShippingAddressID\" = " . $order->ShippingAddressID . " WHERE \"ID\" = " . $lastOrderFromMember->ID);
                     DB::query("UPDATE \"ShippingAddress\" SET \"OrderID\" = " . $lastOrderFromMember->ID . " WHERE \"ID\" = " . $order->ShippingAddressID);
                 }
                 $order->delete();
             }
         }
         $this->DBAlterationMessageNow("Ignored {$count} Orders that have already been submitted.");
         return $this->start + $this->limit;
     } else {
         $this->DBAlterationMessageNow("There were no orders at all to work through.");
     }
     return 0;
 }