/**
  * Allows the opportunity for the Order Step to add any fields to Order::getCMSFields
  *
  * @param FieldList $fields
  * @param Order $order
  * @return FieldList
  **/
 function addOrderStepFields(FieldList $fields, Order $order)
 {
     $fields = parent::addOrderStepFields($fields, $order);
     $title = _t("OrderStep.MUSTENTERDISPATCHRECORD", " ... To move this order to the next step you enter the dispatch details in the logs.");
     $fields->addFieldToTab("Root.Next", $order->getOrderStatusLogsTableField("OrderStatusLog_DispatchPhysicalOrder", $title), "ActionNextStepManually");
     return $fields;
 }
 function SubmittedOrder()
 {
     $lastStatusOrder = OrderStep::get()->Last();
     if ($lastStatusOrder) {
         return Order::get()->Filter("StatusID", $lastStatusOrder->ID)->Sort("RAND()")->First();
     }
 }
 function run($request)
 {
     //IMPORTANT!
     Config::inst()->update("Email", "send_all_emails_to", "no-one@localhost");
     Email::set_mailer(new EcommerceTaskTryToFinaliseOrders_Mailer());
     $orderStatusLogClassName = "OrderStatusLog";
     $submittedOrderStatusLogClassName = EcommerceConfig::get("OrderStatusLog", "order_status_log_class_used_for_submitting_order");
     if ($submittedOrderStatusLogClassName) {
         $sampleSubmittedStatusLog = $submittedOrderStatusLogClassName::get()->First();
         if ($sampleSubmittedStatusLog) {
             $lastOrderStep = OrderStep::get()->sort("Sort", "DESC")->First();
             if ($lastOrderStep) {
                 $joinSQL = "INNER JOIN \"{$orderStatusLogClassName}\" ON \"{$orderStatusLogClassName}\".\"OrderID\" = \"Order\".\"ID\"";
                 $whereSQL = "WHERE \"StatusID\" <> " . $lastOrderStep->ID . " AND \"{$orderStatusLogClassName}\".ClassName = '{$submittedOrderStatusLogClassName}'";
                 $count = DB::query("\r\n\t\t\t\t\t\tSELECT COUNT (\"Order\".\"ID\")\r\n\t\t\t\t\t\tFROM \"Order\"\r\n\t\t\t\t\t\t{$joinSQL}\r\n\t\t\t\t\t\t{$whereSQL}\r\n\t\t\t\t\t")->value();
                 $do = DB::query("\r\n\t\t\t\t\t\tUPDATE \"Order\"\r\n\t\t\t\t\t\t{$joinSQL}\r\n\t\t\t\t\t\tSET \"Order\".\"StatusID\" = " . $lastOrderStep->ID . "\r\n\t\t\t\t\t\t{$whereSQL}\r\n\t\t\t\t\t");
                 if ($count) {
                     DB::alteration_message("NOTE: {$count} records were updated.", "created");
                 } else {
                     DB::alteration_message("No records were updated.");
                 }
             } else {
                 DB::alteration_message("Could not find the last order step.", "deleted");
             }
         } else {
             DB::alteration_message("Could not find any submitted order logs.", "deleted");
         }
     } else {
         DB::alteration_message("Could not find a class name for submitted orders.", "deleted");
     }
 }
 /**
  *@param DataObject $order Order
  *@return DataObject | Null - DataObject = OrderStep
  **/
 public function nextStep($order)
 {
     if ($this->doesNotNeedToBeChecked($order) || $this->hasBeenChecked($order)) {
         return parent::nextStep($order);
     }
     return null;
 }
 /**
  * go to next step if order has been submitted.
  *@param DataObject - $order Order
  *@return DataObject | Null	(next step OrderStep)
  **/
 public function nextStep(Order $order)
 {
     if ($order->IsSubmitted()) {
         return parent::nextStep($order);
     }
     return null;
 }
 /**
  * Allows the opportunity for the Order Step to add any fields to Order::getCMSFields
  *@param FieldList $fields
  *@param Order $order
  *@return FieldList
  **/
 function addOrderStepFields(FieldList $fields, Order $order)
 {
     $fields = parent::addOrderStepFields($fields, $order);
     $title = _t("OrderStep.CANADDGENERALLOG", " ... if you want to make some notes about this step then do this here...");
     $fields->addFieldToTab("Root.Next", $order->getOrderStatusLogsTableField("OrderStatusLog", $title), "ActionNextStepManually");
     return $fields;
 }
 protected function createSubmissionLogForArchivedOrders()
 {
     $lastOrderStep = OrderStep::get()->sort("Sort", "DESC")->First();
     $submissionLogClassName = EcommerceConfig::get("OrderStatusLog", "order_status_log_class_used_for_submitting_order");
     $obj = $submissionLogClassName::create();
     if (!is_a($obj, Object::getCustomClass("OrderStatusLog"))) {
         user_error('EcommerceConfig::get("OrderStatusLog", "order_status_log_class_used_for_submitting_order") refers to a class that is NOT an instance of OrderStatusLog');
     }
     $orderStatusLogClassName = "OrderStatusLog";
     $offset = 0;
     $orders = $this->getOrdersForCreateSubmissionLogForArchivedOrders($lastOrderStep, $orderStatusLogClassName, $offset);
     while ($orders->count()) {
         foreach ($orders as $order) {
             $isSubmitted = $submissionLogClassName::get()->Filter(array("OrderID" => $order->ID))->count();
             if (!$isSubmitted) {
                 $obj = $submissionLogClassName::create();
                 $obj->OrderID = $order->ID;
                 //it is important we add this here so that we can save the 'submitted' version.
                 //this is particular important for the Order Item Links.
                 $obj->write();
                 $obj->OrderAsHTML = $order->ConvertToHTML();
                 $obj->write();
                 DB::alteration_message("creating submission log for Order #" . $obj->OrderID, "created");
             }
         }
         $offset += 100;
         $orders = $this->getOrdersForCreateSubmissionLogForArchivedOrders($lastOrderStep, $orderStatusLogClassName, $offset);
     }
 }
 /**
  * Allows the opportunity for the Order Step to add any fields to Order::getCMSFields
  * @param FieldList $fields
  * @param Order $order
  * @return FieldList
  **/
 function addOrderStepFields(FieldList $fields, Order $order)
 {
     $fields = parent::addOrderStepFields($fields, $order);
     $title = _t("OrderStep.MUSTDOPAYMENTCHECK", " ... To move this order to the next step you must carry out a payment check (is the money in the bank?) by creating a record here (click me)");
     $fields->addFieldToTab("Root.Next", $order->getOrderStatusLogsTableField("OrderStatusLog_PaymentCheck", $title), "ActionNextStepManually");
     $fields->addFieldToTab("Root.Next", new LiteralField("ExampleOfThingsToCheck", "<ul><li>" . implode("</li><li>", EcommerceConfig::get("OrderStep_Confirmed", "list_of_things_to_check")) . "</li></ul>"), "ActionNextStepManually");
     return $fields;
 }
 /**
  * Allows the opportunity for the Order Step to add any fields to Order::getCMSFields
  *@param FieldList $fields
  *@param Order $order
  *@return FieldList
  **/
 function addOrderStepFields(FieldList $fields, Order $order)
 {
     $fields = parent::addOrderStepFields($fields, $order);
     if (!$order->IsPaid()) {
         $header = _t("OrderStep.SUBMITORDER", "Order NOT Paid");
         $msg = _t("OrderStep.ORDERNOTPAID", "This order can not be completed, because it has not been paid. You can either create a payment or change the status of any existing payment to <i>success</i>.");
         $fields->addFieldToTab("Root.Next", new HeaderField("NotPaidHeader", $header, 3), "ActionNextStepManually");
         $fields->addFieldToTab("Root.Next", new LiteralField("NotPaidMessage", '<p>' . $msg . '</p>'), "ActionNextStepManually");
     }
     return $fields;
 }
 /**
  * @param String $name
  * @param Order $order
  * @param Member $member
  */
 function __construct($name, Order $order, Member $member = null)
 {
     if (!$member) {
         $member = $order->Member();
     }
     if (!$member) {
         $member = new Member();
     }
     $orderSteps = OrderStep::get();
     $where = "\"HideStepFromCustomer\" = 0";
     $currentStep = $order->CurrentStepVisibleToCustomer();
     if ($member->IsShopAdmin()) {
         $where = "";
         $currentStep = $order->MyStep();
     } else {
         $currentStep = $order->CurrentStepVisibleToCustomer();
         $orderSteps->filter(array("HideStepFromCustomer" => 0));
     }
     $future = false;
     $html = "\r\n\t\t<div class=\"orderStepField\">\r\n\t\t\t<ol>";
     if ($orderSteps->count()) {
         foreach ($orderSteps as $orderStep) {
             $description = "";
             if ($member->IsShopAdmin()) {
                 if ($orderStep->Description) {
                     $description = " title=\"" . Convert::raw2att($orderStep->Description) . "\" ";
                 }
             }
             $class = "";
             if ($orderStep->ID == $currentStep->ID) {
                 $future = true;
                 $class .= " current";
             } elseif ($future) {
                 $class .= " todo";
             } else {
                 $class .= " done";
             }
             $html .= '<li class="' . $class . '" ' . $description . '>' . $orderStep->Title . '</li>';
         }
     } else {
         $html .= "no steps";
     }
     $html .= "</ol><div class=\"clear\"></div></div>";
     if ($currentStep->Description) {
         $html .= "\r\n\t\t\t\t<p>" . "<strong>" . $currentStep->Title . "</strong> " . _t("OrderStepField.STEP", "step") . ": " . "<i>" . $currentStep->Description . "</i>" . "</p>";
     }
     $this->content = $html;
     Requirements::themedCSS("OrderStepField", 'ecommerce');
     parent::__construct($name);
 }
 /**
  * Allows the opportunity for the Order Step to add any fields to Order::getCMSFields
  *@param FieldList $fields
  *@param Order $order
  *@return FieldList
  **/
 function addOrderStepFields(FieldList $fields, Order $order)
 {
     $fields = parent::addOrderStepFields($fields, $order);
     if (!$order->IsSubmitted()) {
         //LINE BELOW IS NOT REQUIRED
         $header = _t("OrderStep.SUBMITORDER", "Submit Order");
         $label = _t("OrderStep.SUBMITNOW", "Submit Now");
         $msg = _t("OrderStep.MUSTDOSUBMITRECORD", "<p>Tick the box below to submit this order.</p>");
         $problems = array();
         if (!$order->getTotalItems()) {
             $problems[] = "There are no --- Order Items (products) --- associated with this order.";
         }
         if (!$order->MemberID) {
             $problems[] = "There is no --- Customer --- associated with this order.";
         }
         if (!$order->BillingAddressID) {
             $problems[] = "There is no --- Billing Address --- associated with this order.";
         } elseif ($billingAddress = $order->BillingAddress()) {
             $requiredBillingFields = $billingAddress->getRequiredFields();
             if ($requiredBillingFields && is_array($requiredBillingFields) && count($requiredBillingFields)) {
                 foreach ($requiredBillingFields as $requiredBillingField) {
                     if (!$billingAddress->{$requiredBillingField}) {
                         $problems[] = "There is no --- {$requiredBillingField} --- recorded in the billing address.";
                     }
                 }
             }
         }
         if (count($problems)) {
             $msg = "<p>You can not submit this order because:</p> <ul><li>" . implode("</li><li>", $problems) . "</li></ul>";
         }
         $fields->addFieldToTab("Root.Next", new HeaderField("CreateSubmitRecordHeader", $header, 3), "ActionNextStepManually");
         $fields->addFieldToTab("Root.Next", new LiteralField("CreateSubmitRecordMessage", $msg), "ActionNextStepManually");
         if (!$problems) {
             $fields->addFieldToTab("Root.Next", new CheckboxField("SubmitOrderViaCMS", $label), "ActionNextStepManually");
         }
     }
     return $fields;
 }
 function getOrderStepNice()
 {
     if ($this->OrderStepID) {
         $orderStep = OrderStep::get()->byID($this->OrderStepID);
         if ($orderStep) {
             return $orderStep->Name;
         }
     }
 }
 /**
  *@return Integer - number of carts destroyed
  **/
 public function run($request)
 {
     if ($this->verbose) {
         $countAll = DB::query("SELECT COUNT(\"ID\") FROM \"Order\"")->value();
         DB::alteration_message("<h2>deleting empty and abandonned carts (total cart count = {$countAll})</h2>.");
     }
     //ABANDONNED CARTS
     $clearMinutes = EcommerceConfig::get("CartCleanupTask", "clear_minutes");
     $maximumNumberOfObjectsDeleted = EcommerceConfig::get("CartCleanupTask", "maximum_number_of_objects_deleted");
     if (isset($_GET["limit"]) && $this->verbose) {
         $maximumNumberOfObjectsDeleted = intval($_GET["limit"]);
     }
     $time = strtotime("-" . $clearMinutes . " minutes");
     $where = "\"StatusID\" = " . OrderStep::get_status_id_from_code("CREATED") . " AND UNIX_TIMESTAMP(\"Order\".\"LastEdited\") < '{$time}'";
     $sort = "\"Order\".\"Created\" ASC";
     $join = "";
     $limit = "0, " . $maximumNumberOfObjectsDeleted;
     $neverDeleteIfLinkedToMember = EcommerceConfig::get("CartCleanupTask", "never_delete_if_linked_to_member");
     if ($neverDeleteIfLinkedToMember) {
         $where .= " AND \"Member\".\"ID\" IS NULL";
         $join .= "LEFT JOIN \"Member\" ON \"Member\".\"ID\" = \"Order\".\"MemberID\" ";
         $memberDeleteNote = "(Carts linked to a member will NEVER be deleted)";
     } else {
         $memberDeleteNote = "(We will also delete carts in this category that are linked to a member)";
     }
     $oldCarts = DataObject::get('Order', $where, $sort, $join, $limit);
     if ($oldCarts) {
         $count = 0;
         if ($this->verbose) {
             $totalToDeleteSQLObject = DB::query("SELECT COUNT(*) FROM \"Order\" {$join} WHERE {$where}");
             $totalToDelete = $totalToDeleteSQLObject->value();
             DB::alteration_message("\r\n\t\t\t\t\t<h2>Total number of abandonned carts: " . $totalToDelete . "</h2>\r\n\t\t\t\t\t<br /><b>number of records deleted at one time:</b> " . $maximumNumberOfObjectsDeleted . "\r\n\t\t\t\t\t<br /><b>Criteria:</b> last edited " . $clearMinutes . " minutes ago or more {$memberDeleteNote}", "created");
         }
         foreach ($oldCarts as $oldCart) {
             $count++;
             if ($this->verbose) {
                 DB::alteration_message("{$count} ... deleting abandonned order #" . $oldCart->ID, "deleted");
             }
             $this->deleteObject($oldCart);
         }
     }
     if ($this->verbose) {
         $timeLegible = date('Y-m-d H:i:s', $time);
         $countCart = DB::query("SELECT COUNT(\"ID\") FROM \"Order\" WHERE \"StatusID\" = " . OrderStep::get_status_id_from_code("CREATED") . " ")->value();
         $countCartWithinTimeLimit = DB::query("SELECT COUNT(\"ID\") FROM \"Order\" WHERE \"StatusID\" = " . OrderStep::get_status_id_from_code("CREATED") . " AND UNIX_TIMESTAMP(\"Order\".\"LastEdited\") >= '{$time}' ")->value();
         DB::alteration_message("{$countCart} Orders are still in the intial cart state (not submitted), {$countCartWithinTimeLimit} of them are within the time limit (last edited after {$timeLegible}) so they are not deleted yet.", "created");
     }
     //EMPTY ORDERS
     $clearMinutes = EcommerceConfig::get("CartCleanupTask", "clear_minutes_empty_carts");
     $time = strtotime("-" . $clearMinutes . " minutes");
     $where = "\"StatusID\" = 0 AND UNIX_TIMESTAMP(\"Order\".\"LastEdited\") < '{$time}'";
     $sort = "\"Order\".\"Created\" ASC";
     $join = "";
     $limit = "0, " . $maximumNumberOfObjectsDeleted;
     $neverDeleteIfLinkedToMember = EcommerceConfig::get("CartCleanupTask", "never_delete_if_linked_to_member");
     if ($neverDeleteIfLinkedToMember) {
         $where .= " AND \"Member\".\"ID\" IS NULL";
         $join .= "LEFT JOIN \"Member\" ON \"Member\".\"ID\" = \"Order\".\"MemberID\" ";
         $memberDeleteNote = "(Carts linked to a member will NEVER be deleted)";
     } else {
         $memberDeleteNote = "(We will also delete carts in this category that are linked to a member)";
     }
     $oldCarts = DataObject::get('Order', $where, $sort, $join, $limit);
     if ($oldCarts) {
         $count = 0;
         if ($this->verbose) {
             $totalToDeleteSQLObject = DB::query("SELECT COUNT(*) FROM \"Order\" {$join} WHERE {$where}");
             $totalToDelete = $totalToDeleteSQLObject->value();
             DB::alteration_message("\r\n\t\t\t\t\t<h2>Total number of empty carts: " . $totalToDelete . "</h2>\r\n\t\t\t\t\t<br /><b>number of records deleted at one time:</b> " . $maximumNumberOfObjectsDeleted . "\r\n\t\t\t\t\t<br /><b>Criteria:</b> there are no order items and the order was last edited {$clearMinutes} minutes ago {$memberDeleteNote}", "created");
         }
         foreach ($oldCarts as $oldCart) {
             $count++;
             if ($this->verbose) {
                 DB::alteration_message("{$count} ... deleting empty order #" . $oldCart->ID, "deleted");
             }
             $this->deleteObject($oldCart);
         }
     }
     if ($this->verbose) {
         $timeLegible = date('Y-m-d H:i:s', $time);
         $countCart = DB::query("SELECT COUNT(\"ID\") FROM \"Order\" WHERE \"StatusID\" = 0 ")->value();
         $countCartWithinTimeLimit = DB::query("SELECT COUNT(\"ID\") FROM \"Order\" WHERE \"StatusID\" = 0 AND UNIX_TIMESTAMP(\"Order\".\"LastEdited\") <= '{$time}'")->value();
         DB::alteration_message("{$countCart} Orders are empty, {$countCartWithinTimeLimit} are within the time limit (last edited after {$timeLegible}) so they are not deleted yet.", "created");
     }
     $oneToMany = EcommerceConfig::get("CartCleanupTask", "one_to_many_classes");
     $oneToOne = EcommerceConfig::get("CartCleanupTask", "one_to_one_classes");
     $manyToMany = EcommerceConfig::get("CartCleanupTask", "many_to_many_classes");
     /***********************************************
     		//CLEANING ONE-TO-ONES
     		************************************************/
     if ($this->verbose) {
         DB::alteration_message("<h2>Checking one-to-one relationships</h2>.");
     }
     if (is_array($oneToOne) && count($oneToOne)) {
         foreach ($oneToOne as $orderFieldName => $className) {
             if (!in_array($className, $oneToMany) && !in_array($className, $manyToMany)) {
                 if ($this->verbose) {
                     DB::alteration_message("looking for {$className} objects without link to order.");
                 }
                 $rows = DB::query("\r\n\t\t\t\t\t\tSELECT \"{$className}\".\"ID\"\r\n\t\t\t\t\t\tFROM \"{$className}\"\r\n\t\t\t\t\t\t\tLEFT JOIN \"Order\"\r\n\t\t\t\t\t\t\t\tON \"Order\".\"{$orderFieldName}\" = \"{$className}\".\"ID\"\r\n\t\t\t\t\t\tWHERE \"Order\".\"ID\" IS NULL\r\n\t\t\t\t\t\tLIMIT 0, " . $maximumNumberOfObjectsDeleted);
                 //the code below is a bit of a hack, but because of the one-to-one relationship we
                 //want to check both sides....
                 $oneToOneIDArray = array();
                 if ($rows) {
                     foreach ($rows as $row) {
                         $oneToOneIDArray[$row["ID"]] = $row["ID"];
                     }
                 }
                 if (count($oneToOneIDArray)) {
                     $unlinkedObjects = DataObject::get($className, "\"{$className}\".\"ID\" IN (" . implode(",", $oneToOneIDArray) . ")");
                     if ($unlinkedObjects) {
                         foreach ($unlinkedObjects as $unlinkedObject) {
                             if ($this->verbose) {
                                 DB::alteration_message("Deleting " . $unlinkedObject->ClassName . " with ID #" . $unlinkedObject->ID . " because it does not appear to link to an order.", "deleted");
                             }
                             $this->deleteObject($unlinkedObject);
                         }
                     } else {
                         if ($this->verbose) {
                             DB::alteration_message("No objects where found for {$className} even though there appear to be missing links.", "created");
                         }
                     }
                 } elseif ($this->verbose) {
                     DB::alteration_message("All references in Order to {$className} are valid.", "created");
                 }
                 if ($this->verbose) {
                     $countAll = DB::query("SELECT COUNT(\"ID\") FROM \"{$className}\"")->value();
                     $countUnlinkedOnes = DB::query("SELECT COUNT(\"{$className}\".\"ID\") FROM \"{$className}\" LEFT JOIN \"Order\" ON \"{$className}\".\"ID\" = \"Order\".\"{$orderFieldName}\" WHERE \"Order\".\"ID\" IS NULL")->value();
                     DB::alteration_message("In total there are {$countAll} {$className} ({$orderFieldName}), of which there are {$countUnlinkedOnes} not linked to an order. ", "created");
                     if ($countUnlinkedOnes) {
                         DB::alteration_message("There should be NO {$orderFieldName} ({$className}) without link to Order - un error is suspected", "deleted");
                     }
                 }
             }
         }
     }
     /***********************************************
     		//CLEANING ONE-TO-MANY
     		*************************************************/
     if ($this->verbose) {
         DB::alteration_message("<h2>Checking one-to-many relationships</h2>.");
     }
     if (is_array($oneToMany) && count($oneToMany)) {
         foreach ($oneToMany as $classWithOrderID => $classWithLastEdited) {
             if (!in_array($classWithLastEdited, $oneToOne) && !in_array($classWithLastEdited, $manyToMany)) {
                 if ($this->verbose) {
                     DB::alteration_message("looking for {$classWithOrderID} objects without link to order.");
                 }
                 $rows = DB::query("\r\n\t\t\t\t\t\tSELECT \"{$classWithOrderID}\".\"ID\"\r\n\t\t\t\t\t\tFROM \"{$classWithOrderID}\"\r\n\t\t\t\t\t\t\tLEFT JOIN \"Order\"\r\n\t\t\t\t\t\t\t\tON \"Order\".\"ID\" = \"{$classWithOrderID}\".\"OrderID\"\r\n\t\t\t\t\t\tWHERE \"Order\".\"ID\" IS NULL\r\n\t\t\t\t\t\tLIMIT 0, " . $maximumNumberOfObjectsDeleted);
                 $oneToManyIDArray = array();
                 if ($rows) {
                     foreach ($rows as $row) {
                         $oneToManyIDArray[$row["ID"]] = $row["ID"];
                     }
                 }
                 if (count($oneToManyIDArray)) {
                     $unlinkedObjects = DataObject::get($classWithLastEdited, "\"{$classWithLastEdited}\".\"ID\" IN (" . implode(",", $oneToManyIDArray) . ")");
                     if ($unlinkedObjects) {
                         foreach ($unlinkedObjects as $unlinkedObject) {
                             if ($this->verbose) {
                                 DB::alteration_message("Deleting " . $unlinkedObject->ClassName . " with ID #" . $unlinkedObject->ID . " because it does not appear to link to an order.", "deleted");
                             }
                             $this->deleteObject($unlinkedObject);
                         }
                     } elseif ($this->verbose) {
                         DB::alteration_message("{$classWithLastEdited} objects could not be found even though they were referenced.", "deleted");
                     }
                 } elseif ($this->verbose) {
                     DB::alteration_message("All {$classWithLastEdited} objects have a reference to a valid order.", "created");
                 }
                 if ($this->verbose) {
                     $countAll = DB::query("SELECT COUNT(\"ID\") FROM \"{$classWithLastEdited}\"")->value();
                     $countUnlinkedOnes = DB::query("SELECT COUNT(\"{$classWithOrderID}\".\"ID\") FROM \"{$classWithOrderID}\" LEFT JOIN \"Order\" ON \"{$classWithOrderID}\".\"OrderID\" = \"Order\".\"ID\" WHERE \"Order\".\"ID\" IS NULL")->value();
                     DB::alteration_message("In total there are {$countAll} {$classWithOrderID} ({$classWithLastEdited}), of which there are {$countUnlinkedOnes} not linked to an order. ", "created");
                 }
             }
         }
     }
 }
 /**
  *@return Integer - number of carts destroyed
  **/
 public function run($request)
 {
     //IMPORTANT!
     if ($this->doNotSendEmails) {
         Config::inst()->update("Email", "send_all_emails_to", "no-one@localhost");
         Email::set_mailer(new EcommerceTaskTryToFinaliseOrders_Mailer());
     }
     $orderStatusLogClassName = "OrderStatusLog";
     $submittedOrderStatusLogClassName = EcommerceConfig::get("OrderStatusLog", "order_status_log_class_used_for_submitting_order");
     if ($submittedOrderStatusLogClassName) {
         $submittedStatusLog = $submittedOrderStatusLogClassName::get()->First();
         if ($submittedStatusLog) {
             $orderSteps = OrderStep::get()->sort("Sort", "DESC")->limit(1);
             $lastOrderStep = $orderSteps->First();
             if ($lastOrderStep) {
                 $joinSQL = "INNER JOIN \"\" ON ";
                 $whereSQL = "\"StatusID\" <> " . $lastOrderStep->ID . "";
                 $count = null;
                 if (isset($_GET["count"])) {
                     $count = intval($_GET["count"]);
                 }
                 if (!intval($count)) {
                     $count = 50;
                 }
                 $last = null;
                 if (isset($_GET["last"])) {
                     $last = intval($_GET["last"]);
                 }
                 if (!intval($last)) {
                     $last = intval(Session::get("EcommerceTaskTryToFinaliseOrders"));
                     if (!$last) {
                         $last = 0;
                     }
                 }
                 $orders = Order::get()->where($whereSQL)->sort("ID", "ASC")->innerJoin($orderStatusLogClassName, "\"{$orderStatusLogClassName}\".\"OrderID\" = \"Order\".\"ID\"")->limit($count, $last);
                 if ($orders->count()) {
                     DB::alteration_message("<h1>Moving {$count} Orders (starting from {$last})</h1>");
                     foreach ($orders as $order) {
                         $last++;
                         Session::set("EcommerceTaskTryToFinaliseOrders", $last);
                         $stepBefore = OrderStep::get()->byID($order->StatusID);
                         try {
                             $order->tryToFinaliseOrder();
                         } catch (Exception $e) {
                             DB::alteration_message($e, "deleted");
                         }
                         $stepAfter = OrderStep::get()->byID($order->StatusID);
                         if ($stepBefore) {
                             if ($stepBefore->ID == $stepAfter->ID) {
                                 DB::alteration_message("could not move Order " . $order->getTitle() . ", remains at <strong>" . $stepBefore->Name . "</strong>");
                             } else {
                                 DB::alteration_message("Moving Order #" . $order->getTitle() . " from <strong>" . $stepBefore->Name . "</strong> to <strong>" . $stepAfter->Name . "</strong>", "created");
                             }
                         } else {
                             DB::alteration_message("Moving Order " . $order->getTitle() . " from <strong>unknown step</strong> to <strong>" . $stepAfter->Name . "</strong>", "created");
                         }
                     }
                 } else {
                     Session::clear("EcommerceTaskTryToFinaliseOrders");
                     DB::alteration_message("<br /><br /><br /><br /><h1>COMPLETED!</h1>All orders have been moved.", "created");
                 }
             } else {
                 DB::alteration_message("NO last order step.", "deleted");
             }
         } else {
             DB::alteration_message("NO submitted order status log.", "deleted");
         }
     } else {
         DB::alteration_message("NO EcommerceConfig::get(\"OrderStatusLog\", \"order_status_log_class_used_for_submitting_order\")", "deleted");
     }
     if (Session::get("EcommerceTaskTryToFinaliseOrders")) {
         DB::alteration_message("WAIT: we are still moving more orders ... this page will automatically load the next lot in 5 seconds.", "deleted");
         echo "<script type=\"text/javascript\">window.setTimeout(function() {location.reload();}, 5000);</script>";
     }
 }
 function orderSteps()
 {
     $steps = OrderStep::get();
     if ($steps->count()) {
         foreach ($steps as $step) {
             $fields = Config::inst()->get($step->ClassName, "db");
             $defaultsArray = $step->stat("defaults", true);
             $configArray = array();
             foreach ($fields as $fieldKey => $fieldType) {
                 if ($fields) {
                     $configArray[$fieldKey] = $step->{$fieldKey};
                     if (!isset($defaultsArray[$fieldKey])) {
                         $defaultsArray[$fieldKey] = "[default not set]";
                     }
                 }
             }
             $ecommerceDBConfig = EcommerceDBConfig::current_ecommerce_db_config();
             $this->definitions["OrderStep"][$step->Code] = $step->Description . "<br />see: <a href=\"/admin/shop/OrderStep/EditForm/field/OrderStep/item/" . $step->ID . "/edit\">Ecommerce Configuration</a>.";
             $this->configs["OrderStep"][$step->Code] = $configArray;
             $this->defaults["OrderStep"][$step->Code] = $defaultsArray;
             $this->databaseValues["OrderStep"][$step->Code] = true;
         }
     }
 }
 protected function getOrderStepsField()
 {
     $gridFieldConfig = GridFieldConfig::create()->addComponents(new GridFieldToolbarHeader(), new GridFieldSortableHeader(), new GridFieldDataColumns(10), new GridFieldPaginator(10), new GridFieldEditButton(), new GridFieldDeleteAction(), new GridFieldDetailForm());
     return new GridField("OrderSteps", _t("OrderStep.PLURALNAME", "Order Steps"), OrderStep::get(), $gridFieldConfig);
 }
Esempio n. 17
0
 /**
  * Allows the opportunity for the Order Step to add any fields to Order::getCMSFields
  *@param FieldSet $fields
  *@param Order $order
  *@return FieldSet
  **/
 function addOrderStepFields(&$fields, $order)
 {
     $fields = parent::addOrderStepFields($fields, $order);
     $msg = _t("OrderStep.CANADDGENERALLOG", " ... if you want to make some notes about this order then do this here ...");
     $fields->addFieldToTab("Root.Next", $order->OrderStatusLogsTable("OrderStatusLog_Archived", $msg), "ActionNextStepManually");
     return $fields;
 }
 /**
  * standard SS method
  * USED TO BE: Unpaid,Query,Paid,Processing,Sent,Complete,AdminCancelled,MemberCancelled,Cart
  */
 public function requireDefaultRecords()
 {
     parent::requireDefaultRecords();
     $orderStepsToInclude = EcommerceConfig::get("OrderStep", "order_steps_to_include");
     $codesToInclude = self::get_codes_for_order_steps_to_include();
     $indexNumber = 0;
     if ($orderStepsToInclude && count($orderStepsToInclude)) {
         if ($codesToInclude && count($codesToInclude)) {
             foreach ($codesToInclude as $className => $code) {
                 $indexNumber += 10;
                 $itemCount = $className::get()->Count();
                 if ($itemCount) {
                     $obj = $className::get()->First();
                     if ($obj->Code != $code) {
                         $obj->Code = $code;
                         $obj->write();
                     }
                     $parentObj = singleton("OrderStep");
                     if ($obj->Description == $parentObj->myDescription()) {
                         $obj->Description = $obj->myDescription();
                         $obj->write();
                     }
                 } else {
                     $obj = new $className();
                     $obj->Code = strtoupper($obj->Code);
                     $obj->Description = $obj->myDescription();
                     $obj->write();
                     DB::alteration_message("Created \"{$code}\" as {$className}.", "created");
                 }
                 $obj = OrderStep::get()->filter(array("Code" => strtoupper($code)))->First();
                 if ($obj) {
                     if ($obj->Sort != $indexNumber) {
                         $obj->Sort = $indexNumber;
                         $obj->write();
                     }
                 } else {
                     user_error("There was an error in creating the {$code} OrderStep");
                 }
             }
         }
     }
     $steps = OrderStep::get();
     foreach ($steps as $step) {
         if (!$step->Description) {
             $step->Description = $step->myDescription();
             $step->write();
         }
     }
 }
 protected function fixBadOrderStatus_68()
 {
     $explanation = "\r\n\t\t\t<h1>68. Fix Bad Order Status</h1>\r\n\t\t\t<p>Fixing any orders with an StatusID that is not in use...</p>\r\n\t\t";
     if ($this->retrieveInfoOnly) {
         return $explanation;
     } else {
         echo $explanation;
     }
     $firstOption = OrderStep::get()->First();
     if ($firstOption) {
         $badOrders = Order::get()->where("\"StatusID\" = 0 OR \"StatusID\" IS NULL OR \"OrderStep\".\"ID\" IS NULL")->leftJoin("OrderStep", "\"Order\".\"StatusID\" = \"OrderStep\".\"ID\"")->limit($this->limit, $this->start);
         if ($badOrders->count()) {
             foreach ($badOrders as $order) {
                 if ($order->TotalItems() > 0) {
                     DB::query("UPDATE \"Order\" SET \"StatusID\" = " . $firstOption->ID . " WHERE \"Order\".\"ID\" = " . $order->ID);
                     $this->DBAlterationMessageNow("No order status for order number #" . $order->ID . " reverting to: {$firstOption->Name}.", "error");
                 }
             }
             return $this->start + $this->limit;
         } else {
             $this->DBAlterationMessageNow("There are no orders with incorrect order status.");
         }
     } else {
         $this->DBAlterationMessageNow("No first order step.", "error");
     }
     return 0;
 }
 /**
  * works out if the order is still at the first OrderStep.
  * @return boolean
  */
 public function IsFirstStep()
 {
     $firstStep = OrderStep::get()->First();
     $currentStep = $this->MyStep();
     if ($firstStep && $currentStep) {
         if ($firstStep->ID == $currentStep->ID) {
             return true;
         }
     }
     return false;
 }
 /**
  * Allows the opportunity for the Order Step to add any fields to Order::getCMSFields
  *
  * @param FieldList $fields
  * @param Order $order
  *
  * @return FieldList
  **/
 function addOrderStepFields(FieldList $fields, Order $order)
 {
     $fields = parent::addOrderStepFields($fields, $order);
     $fields->addFieldToTab("Root.Next", new HeaderField("DownloadFiles", _t("ElectronicDelivery_OrderStep.AVAILABLE_FOR_DOWNLOAD", "Files are available for download"), 3), "ActionNextStepManually");
     return $fields;
 }
 /**
  * Allows the opportunity for the Order Step to add any fields to Order::getCMSFields
  *@param FieldSet $fields
  *@param Order $order
  *@return FieldSet
  **/
 function addOrderStepFields(FieldList $fields, Order $order)
 {
     $fields = parent::addOrderStepFields($fields, $order);
     return $fields;
 }
 /**
  * Gets or creates the current order.
  * Based on the session ONLY!
  * IMPORTANT FUNCTION!
  * @todo - does this need to be public????
  * @return void
  */
 public function currentOrder($recurseCount = 0)
 {
     if (!$this->order) {
         $sessionVariableName = $this->sessionVariableName("OrderID");
         $orderIDFromSession = intval(Session::get($sessionVariableName));
         if ($orderIDFromSession > 0) {
             $this->order = Order::get()->byID($orderIDFromSession);
         }
         $member = Member::currentUser();
         if ($this->order) {
             //first reason to set to null: it is already submitted
             if ($this->order->IsSubmitted()) {
                 $this->order = null;
             } elseif (!$this->order->canView()) {
                 $this->order = null;
             } elseif ($member && $member->exists()) {
                 if ($this->order->MemberID != $member->ID) {
                     $updateMember = false;
                     if (!$this->order->MemberID) {
                         $updateMember = true;
                     }
                     if (!$member->IsShopAdmin()) {
                         $updateMember = true;
                     }
                     if ($updateMember) {
                         $this->order->MemberID = $member->ID;
                         $this->order->write();
                     }
                 }
                 //IF current order has nothing in it AND the member already has an order: use the old one first
                 //first, lets check if the current order is worthwhile keeping
                 if ($this->order->StatusID || $this->order->TotalItems()) {
                     //do NOTHING!
                 } else {
                     $firstStep = OrderStep::get()->First();
                     //we assume the first step always exists.
                     //TODO: what sort order?
                     $count = 0;
                     while ($firstStep && ($previousOrderFromMember = Order::get()->where("\r\n\t\t\t\t\t\t\t\t\t\"MemberID\" = " . $member->ID . "\r\n\t\t\t\t\t\t\t\t\tAND (\"StatusID\" = " . $firstStep->ID . " OR \"StatusID\" = 0)\r\n\t\t\t\t\t\t\t\t\tAND \"Order\".\"ID\" <> " . $this->order->ID)->First())) {
                         //arbritary 12 attempts ...
                         if ($count > 12) {
                             break;
                         }
                         $count++;
                         if ($previousOrderFromMember && $previousOrderFromMember->canView()) {
                             if ($previousOrderFromMember->StatusID || $previousOrderFromMember->TotalItems()) {
                                 $this->order->delete();
                                 $this->order = $previousOrderFromMember;
                                 break;
                             } else {
                                 $previousOrderFromMember->delete();
                             }
                         }
                     }
                 }
             }
         }
         if (!$this->order) {
             if ($member) {
                 $firstStep = OrderStep::get()->First();
                 if ($firstStep) {
                     $previousOrderFromMember = Order::get()->filter(array("MemberID" => $member->ID, "StatusID" => array($firstStep->ID, 0)))->First();
                     if ($previousOrderFromMember) {
                         if ($previousOrderFromMember->canView()) {
                             $this->order = $previousOrderFromMember;
                         }
                     }
                 }
             }
             if ($this->order && !$this->order->exists()) {
                 $this->order = null;
             }
             if (!$this->order) {
                 //here we cleanup old orders, because they should be
                 //cleaned at the same rate that they are created...
                 if (EcommerceConfig::get("ShoppingCart", "cleanup_every_time")) {
                     $cartCleanupTask = EcommerceTaskCartCleanup::create();
                     $cartCleanupTask->runSilently();
                 }
                 //create new order
                 $this->order = Order::create();
                 if ($member) {
                     $this->order->MemberID = $member->ID;
                 }
                 $this->order->write();
             }
             Session::set($sessionVariableName, intval($this->order->ID));
         } elseif ($this->order->MemberID && !$member) {
             $this->clear();
             $this->order = null;
         }
         if ($this->order && $this->order->exists()) {
             $this->order->calculateOrderAttributes($force = false);
         }
         if ($this->order && !$this->order->SessionID) {
             $this->order->SessionID = session_id();
             $this->order->write();
         }
     }
     //just in case ...
     if (!$this->order && $recurseCount < 3) {
         $recurseCount++;
         return $this->currentOrder();
     }
     return $this->order;
 }