/** * 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); }
/** * 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; }