public static function find_or_make($name)
 {
     if ($type = ProductAttributeType::get()->filter("Name:nocase", $name)->first()) {
         return $type;
     }
     $type = new ProductAttributeType();
     $type->Name = $name;
     $type->Label = $name;
     $type->write();
     return $type;
 }
 static function find_or_make($name)
 {
     $name = strtolower($name);
     if ($type = DataObject::get_one('ProductAttributeType', "LOWER(\"Name\") = '{$name}'")) {
         return $type;
     }
     $type = new ProductAttributeType();
     $type->Name = $name;
     $type->Label = $name;
     $type->write();
     return $type;
 }
 private function addvariations()
 {
     $colourObject = ProductAttributeType::get()->where("\"Name\" = 'Colour'")->First();
     if (!$colourObject) {
         $colourObject = new ProductAttributeType();
         $colourObject->Name = "Colour";
         $colourObject->Label = "Colour";
         $colourObject->IsColour = true;
         $colourObject->Sort = 100;
         $colourObject->write();
     }
     if ($colourObject) {
         $redObject = ProductAttributeValue::get()->where("\"Value\" = 'red'")->First();
         if (!$redObject) {
             $redObject = new ProductAttributeValue();
             $redObject->Value = "red";
             $redObject->RGBCode = "ff0000";
             $redObject->ContrastRGBCode = "BFC1C1";
             $redObject->TypeID = $colourObject->ID;
             $redObject->Sort = 100;
             $redObject->write();
         }
         $blueObject = ProductAttributeValue::get()->where("\"Value\" = 'blue'")->First();
         if (!$blueObject) {
             $blueObject = new ProductAttributeValue();
             $blueObject->Value = "blue";
             $blueObject->RGBCode = "0000ff";
             $blueObject->ContrastRGBCode = "BFC1C1";
             $blueObject->TypeID = $colourObject->ID;
             $blueObject->Sort = 110;
             $blueObject->write();
         }
     } else {
         die("COULD NOT CREATE COLOUR OBJECT");
     }
     $sizeObject = ProductAttributeType::get()->filter("Name", 'Size')->First();
     if (!$sizeObject) {
         $sizeObject = new ProductAttributeType();
         $sizeObject->Name = "Size";
         $sizeObject->Label = "Size";
         $sizeObject->Sort = 110;
         $sizeObject->write();
     }
     if ($sizeObject) {
         $smallObject = ProductAttributeValue::get()->where("\"Value\" = 'S'")->First();
         if (!$smallObject) {
             $smallObject = new ProductAttributeValue();
             $smallObject->Value = "S";
             $smallObject->TypeID = $sizeObject->ID;
             $smallObject->Sort = 100;
             $smallObject->write();
         }
         $xtraLargeObject = ProductAttributeValue::get()->where("\"Value\" = 'XL'")->First();
         if (!$xtraLargeObject) {
             $xtraLargeObject = new ProductAttributeValue();
             $xtraLargeObject->Value = "XL";
             $xtraLargeObject->TypeID = $sizeObject->ID;
             $xtraLargeObject->Sort = 110;
             $xtraLargeObject->write();
         }
     } else {
         die("COULD NOT CREATE SIZE OBJECT");
     }
     $products = Product::get()->where("ClassName = 'Product'")->sort("RAND()")->limit(2);
     $this->addExamplePages(1, "products with variations (size, colour, etc...)", $products);
     if ($products->count() && $colourObject && $sizeObject) {
         $variationCombos = array(array("Size" => $xtraLargeObject, "Colour" => $redObject), array("Size" => $xtraLargeObject, "Colour" => $blueObject), array("Size" => $smallObject, "Colour" => $redObject), array("Size" => $smallObject, "Colour" => $blueObject));
         foreach ($products as $product) {
             $existingAttributeTypes = $product->VariationAttributes();
             $existingAttributeTypes->add($sizeObject);
             $existingAttributeTypes->add($colourObject);
             $this->addToTitle($product, "with variation", false);
             $product->Content .= "<p>On this page you can see two example of how you customers can add variations to their products (form / table)... In a real-life shop you would probably choose one or the other.</p>";
             $product->write();
             $product->Publish('Stage', 'Live');
             $product->flushCache();
             $descriptionOptions = array("", "Per Month", "", "", "Per Year", "This option has limited warranty");
             if (!ProductVariation::get()->where("ProductID  = " . $product->ID)->count()) {
                 foreach ($variationCombos as $variationCombo) {
                     $productVariation = new ProductVariation();
                     $productVariation->ProductID = $product->ID;
                     $productVariation->Price = $product->Price * 2;
                     $productVariation->Description = $descriptionOptions[rand(0, 5)];
                     $productVariation->ImageID = rand(0, 1) ? 0 : $this->getRandomImageID();
                     $productVariation->write();
                     $existingAttributeValues = $productVariation->AttributeValues();
                     $existingAttributeValues->add($variationCombo["Size"]);
                     $existingAttributeValues->add($variationCombo["Colour"]);
                     DB::alteration_message(" Creating variation for " . $product->Title . " // COLOUR " . $variationCombo["Colour"]->Value . " SIZE " . $variationCombo["Size"]->Value, "created");
                 }
             }
         }
     }
 }