function history($request = null)
 {
     $id = intval($request->param("ID"));
     $buyableStockCalculatedQuantity = BuyableStockCalculatedQuantity::get()->byID($id);
     if ($buyableStockCalculatedQuantity) {
         $buyableStockCalculatedQuantity->ManualUpdates = BuyableStockManualUpdate::get()->filter(array('ParentID' => $buyableStockCalculatedQuantity->ID));
         $buyableStockCalculatedQuantity->OrderEntries = BuyableStockOrderEntry::get()->filter(array('ParentID' => $buyableStockCalculatedQuantity->ID));
         $graphArray = array();
         if ($buyableStockCalculatedQuantity->ManualUpdates) {
             foreach ($buyableStockCalculatedQuantity->ManualUpdates as $obj) {
             }
         }
         if ($buyableStockCalculatedQuantity->OrderEntries) {
             foreach ($buyableStockCalculatedQuantity->OrderEntries as $obj) {
             }
         }
         return $this->customise($buyableStockCalculatedQuantity)->renderWith("AjaxStockControlPageHistory");
     } else {
         return " could not find historical data";
     }
 }
 public static function get_by_buyable($buyable)
 {
     $obj = BuyableStockCalculatedQuantity::get()->filter(array('BuyableID' => $buyable->ID, 'BuyableClassName' => $buyable->ClassName))->First();
     if ($obj) {
         //do nothing
     } else {
         $obj = new BuyableStockCalculatedQuantity();
         $obj->BuyableID = $buyable->ID;
         $obj->BuyableClassName = $buyable->ClassName;
     }
     if ($obj) {
         if (isset($obj->ID) && $obj->exists() && $obj->UnlimitedStock == $buyable->UnlimitedStock) {
             //do nothing
         } else {
             $obj->UnlimitedStock = $buyable->UnlimitedStock;
             //we must write here to calculate quantities
             $obj->write();
         }
         return $obj;
     }
     user_error("Could not find / create BuyableStockCalculatedQuantity for buyable with ID / ClassName " . $buyableID . "/" . $buyableClassName, E_WARNING);
 }