/**
  * 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) {
             $obj = DataObject::get_one("OrderModifier_Descriptor", "\"ModifierClassName\" = '" . $className . "'");
             if (!$obj) {
                 $modifier = singleton($className);
                 $obj = new OrderModifier_Descriptor();
                 $obj->ModifierClassName = $className;
                 $obj->Heading = $modifier->i18n_singular_name();
                 $obj->write();
                 DB::alteration_message("Creating description for " . $className, "created");
             }
         }
     }
     $orderModifierDescriptors = DataObject::get("OrderModifier_Descriptor");
     if ($orderModifierDescriptors) {
         foreach ($orderModifierDescriptors as $orderModifierDescriptor) {
             if (!in_array($orderModifierDescriptor->ModifierClassName, $arrayOfModifiers)) {
                 $orderModifierDescriptor->delete();
                 DB::alteration_message("Deleting description for " . $orderModifierDescriptor->ModifierClassName, "created");
             }
         }
     }
 }
 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;
 }