function SubmittedOrder() { $lastStatusOrder = OrderStep::get()->Last(); if ($lastStatusOrder) { return Order::get()->Filter("StatusID", $lastStatusOrder->ID)->Sort("RAND()")->First(); } }
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); } }
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 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); }
/** *@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>"; } }
/** * 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; }
/** * 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(); } } }
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; } } }
function getOrderStepNice() { if ($this->OrderStepID) { $orderStep = OrderStep::get()->byID($this->OrderStepID); if ($orderStep) { return $orderStep->Name; } } }
/** * 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; }
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; }
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); }