Inheritance: extends DataObject
 function populateDefaults()
 {
     parent::populateDefaults();
     $this->Title = "Update Member with points from Order.";
     $this->Note = "Records the points before, the points added and subtracted and the points after.";
     $this->InternalUseOnly = 1;
 }
 /**
  * adding a sequential order number.
  */
 function onBeforeWrite()
 {
     parent::onBeforeWrite();
     if ($order = $this->Order()) {
         if (!$this->Total) {
             $this->Total = $order->Total();
             $this->SubTotal = $order->SubTotal();
         }
     }
     if (!intval($this->SequentialOrderNumber)) {
         $this->SequentialOrderNumber = 1;
         $min = intval(EcommerceConfig::get("Order", "order_id_start_number")) - 0;
         if (isset($this->ID)) {
             $id = intval($this->ID);
         } else {
             $id = 0;
         }
         $lastOne = OrderStatusLog_Submitted::get()->Exclude(array("ID" => $id))->Sort("SequentialOrderNumber", "DESC")->First();
         if ($lastOne) {
             $this->SequentialOrderNumber = intval($lastOne->SequentialOrderNumber) + 1;
         }
         if (intval($min) && $this->SequentialOrderNumber < $min) {
             $this->SequentialOrderNumber = $min;
         }
     }
 }
 function populateDefaults()
 {
     parent::populateDefaults();
     $this->Title = "Calculate Points from Order.";
     $this->Note = "Works out the points gained and points used for an Order.";
     $this->InternalUseOnly = 1;
 }
 public function getCMSFields()
 {
     $fields = parent::getCMSFields();
     $fields->removeByName("Title");
     $fields->removeByName("Note");
     $fields->addFieldToTab('Root.Main', new CheckboxField("PaymentConfirmed", _t("OrderStatusLog.CONFIRMED", "Payment is confirmed")));
     return $fields;
 }
 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();
 }
 /**
  * Standard SS method
  * Deletes the files in the download folder,
  * and the actual download folder itself.
  */
 function onBeforeDelete()
 {
     parent::onBeforeDelete();
     if ($this->FolderName && !$this->Completed) {
         $this->deleteFolderContents();
     }
 }
示例#9
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();
     }
 }
示例#10
0
 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());
 }
 public function requireDefaultRecords()
 {
     parent::requireDefaultRecords();
     if ($this->config()->dont_upgrade_on_build) {
         return;
     }
     // Perform migrations
     DB::query(sprintf('UPDATE "%s" SET "%s" = \'%s\'', 'OrderStatusLog', 'ClassName', 'OrderLog'));
     if (DB::get_schema()->hasField('OrderStatusLog', 'Changes')) {
         $fields = '"' . implode('", "', array_intersect(array_keys(DB::get_schema()->fieldList('OrderLog')), array_keys(DB::get_schema()->fieldList('OrderStatusLog')))) . '"';
         DB::query(sprintf('INSERT INTO "%s" (%s) SELECT %s FROM "%s" ON DUPLICATE KEY UPDATE ID=VALUES(ID)', 'OrderLog', $fields, $fields, 'OrderStatusLog'));
     }
     DB::alteration_message('Migrated order status logs', 'changed');
 }
 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;
 }
 /**
  *
  *@return FieldSet
  **/
 function getCMSFields()
 {
     $fields = parent::getCMSFields();
     return $fields;
 }
 function onBeforeWrite()
 {
     parent::onBeforeWrite();
 }
 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);
 }
 /**
  * standard SS method
  */
 function populateDefaults()
 {
     parent::populateDefaults();
     $this->AuthorID = Member::currentUserID();
     $this->InternalUseOnly = false;
 }
示例#17
0
 /**
  * Will update payment status to "Paid if there is no outstanding amount".
  */
 function updatePaymentStatus()
 {
     if ($this->Total() > 0 && $this->TotalOutstanding() <= 0) {
         //TODO: only run this if it is setting to Paid, and not cancelled or similar
         $this->Status = 'Paid';
         $this->write();
         $logEntry = new OrderStatusLog();
         $logEntry->OrderID = $this->ID;
         $logEntry->Status = 'Paid';
         $logEntry->write();
     }
 }