function checkoutAndModifierDetails() { $checkoutPage = CheckoutPage::get()->First(); if (!$checkoutPage) { $task = new EcommerceTaskDefaultRecords(); $task->run(null); $checkoutPage = CheckoutPage::get()->First(); if (!$checkoutPage) { user_error("There is no checkout page available and it seems impossible to create one."); } } $steps = CheckoutPage_StepDescription::get(); if ($steps->count()) { foreach ($steps as $key => $step) { $stepNumber = $key + 1; $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]"; } } } $this->definitions["CheckoutPage_Controller"]["STEP_{$stepNumber}" . "_" . $step->getCode()] = $step->Description . "<br />see: <a href=\"/admin/pages/edit/show/" . $checkoutPage->ID . "/\">checkout page</a>."; $this->configs["CheckoutPage_Controller"]["STEP_{$stepNumber}" . "_" . $step->getCode()] = $configArray; $this->defaults["CheckoutPage_Controller"]["STEP_{$stepNumber}" . "_" . $step->getCode()] = $defaultsArray; $this->databaseValues["CheckoutPage_Controller"]["STEP_{$stepNumber}" . "_" . $step->getCode()] = true; } } $steps = OrderModifier_Descriptor::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]"; } } } $this->definitions["CheckoutPage_Controller"]["OrderModifier_Descriptor_" . $step->ModifierClassName] = $step->Description . "<br />see: <a href=\"/admin/pages/edit/show/" . $checkoutPage->ID . "/\">checkout page</a>."; $this->configs["CheckoutPage_Controller"]["OrderModifier_Descriptor_" . $step->ModifierClassName] = $configArray; $this->defaults["CheckoutPage_Controller"]["OrderModifier_Descriptor_" . $step->ModifierClassName] = $defaultsArray; $this->databaseValues["CheckoutPage_Controller"]["OrderModifier_Descriptor_" . $step->ModifierClassName] = true; } } }
/** * * @return GridField */ protected function getOrderModifierDescriptionField() { $gridFieldConfig = GridFieldConfig::create()->addComponents(new GridFieldToolbarHeader(), new GridFieldSortableHeader(), new GridFieldDataColumns(), new GridFieldEditButton(), new GridFieldDetailForm()); $title = _t("CheckoutPage.ORDERMODIFIERDESCRIPTMESSAGES", "Messages relating to order form extras (e.g. tax or shipping)"); $source = OrderModifier_Descriptor::get(); return new GridField("OrderModifier_Descriptor", $title, $source, $gridFieldConfig); }
/** * Adds OrderModifier_Descriptors and deletes the irrelevant ones * stardard SS method */ function requireDefaultRecords() { parent::requireDefaultRecords(); $arrayOfModifiers = EcommerceConfig::get("Order", "modifiers"); if (!is_array($arrayOfModifiers)) { $arrayOfModifiers = array(); } if (count($arrayOfModifiers)) { foreach ($arrayOfModifiers as $className) { $orderModifier_Descriptor = OrderModifier_Descriptor::get()->Filter(array("ModifierClassName" => $className))->First(); if (!$orderModifier_Descriptor) { $modifier = singleton($className); $orderModifier_Descriptor = OrderModifier_Descriptor::create(); $orderModifier_Descriptor->ModifierClassName = $className; $orderModifier_Descriptor->Heading = $modifier->i18n_singular_name(); $orderModifier_Descriptor->write(); DB::alteration_message("Creating description for " . $className, "created"); } } } //delete the ones that are not relevant $orderModifierDescriptors = OrderModifier_Descriptor::get(); if ($orderModifierDescriptors && $orderModifierDescriptors->count()) { foreach ($orderModifierDescriptors as $orderModifierDescriptor) { if (!in_array($orderModifierDescriptor->ModifierClassName, $arrayOfModifiers)) { $orderModifierDescriptor->delete(); DB::alteration_message("Deleting description for " . $orderModifierDescriptor->ModifierClassName, "created"); } } } }
/** * works out the tax to pay for the order modifiers, * based on a rate * @param float $rate * @return float - amount of tax to pay */ protected function workoutModifiersTax($rate, $country) { $modifiersTotal = 0; $order = $this->Order(); if ($order) { if ($modifiers = $order->Modifiers()) { foreach ($modifiers as $modifier) { if ($modifier->IsRemoved()) { //do nothing //we just double-check this... } else { if ($modifier instanceof GSTTaxModifier) { //do nothing } else { $actualRate = $rate; $modifierDescriptor = OrderModifier_Descriptor::get()->filter(array("ModifierClassName" => $modifier->ClassName))->First(); if ($modifierDescriptor) { if ($modifierDescriptor->hasExtension("GSTTaxDecorator")) { $excludedTaxes = $modifierDescriptor->ExcludedFrom(); $additionalTaxes = $modifierDescriptor->AdditionalTax(); if ($excludedTaxes) { foreach ($excludedTaxes as $tax) { if (!$tax->DoesNotApplyToAllProducts) { $this->debugMessage .= "<hr />found tax to exclude for " . $modifier->Title . ": " . $tax->Title(); $actualRate -= $tax->Rate; } } } if ($additionalTaxes) { foreach ($additionalTaxes as $tax) { if ($tax->DoesNotApplyToAllProducts) { if ($tax->AppliesToAllCountries || $tax->CountryCode == $country) { $this->debugMessage .= "<hr />found adtax to add for " . $modifier->Title . ": " . $tax->Title(); $actualRate += $tax->Rate; } } } } } else { $this->debugMessage .= "<hr />" . $modifierDescriptor->ClassName . " does not have the GSTTaxDecorator extension"; } } $totalForModifier = $modifier->CalculationTotal(); $functionName = $this->config()->get("order_item_function_for_tax_exclusive_portion"); if ($functionName) { if ($modifier->hasMethod($functionName)) { $totalForModifier -= $item->{$functionName}(); $this->debugMessage .= "<hr />running {$functionName} on " . $modifier->ClassName . "." . $modifier->ID; } } //turnRateIntoCalculationRate is really important - //a 10% rate is different for inclusive than for an exclusive tax $actualRateCalculationRate = $this->turnRateIntoCalculationRate($actualRate); $this->debugMessage .= "<hr />rate of {$actualRate}' turned into calculation rate of " . round($actualRateCalculationRate, 2) . " for the total of {$totalForModifier}' on " . $modifier->ClassName . "." . $modifier->ID; $modifiersTotal += floatval($totalForModifier) * $actualRateCalculationRate; } } } } } $this->debugMessage .= "<hr />Total order modifiers tax: \$ " . round($modifiersTotal, 4); return $modifiersTotal; }