/** * Fetches any points redeemable options. * @param TBT_Rewards_Model_Customer &$customer * @param TBT_Rewards_Model_Catalog_Product &$product * @return array() */ protected function getRuleIds() { $applicable_rules = $this->_product->getRedeemableOptions($this->_customer, $this->_product); $rule_ids = array(); foreach ($applicable_rules as &$rule_entry) { $rule_ids[] = $rule_entry[TBT_Rewards_Model_Catalogrule_Rule::POINTS_RULE_ID]; } return $applicable_rules; }
public function getPredictedPointsEarned() { if ($this->product) { $earnable = $this->product->getEarnablePoints(); } else { $earnable = array(); } return $earnable; }
/** * Ensures that the given product model is a rewards catlaog product * * @param mixed $product * @return TBT_Rewards_Model_Catalog_Product */ private function ensureProduct($product) { if ($product == null) { $product = $this->getProduct(); } if ($product instanceof Mage_Catalog_Model_Product) { $product = TBT_Rewards_Model_Catalog_Product::wrap($product); } return $product; }
/** * Returns an array of the lowest possible price using points, * and the points used to obtain that price * * @deprecated * * @param TBT_Rewards_Model_Catalog_Product $product * @return array */ public function getRewardAdjustedPrice($product) { if ($product instanceof Mage_Catalog_Model_Product) { $product = TBT_Rewards_Model_Catalog_Product::wrap($product); } if (!$product instanceof TBT_Rewards_Model_Catalog_Product) { $product = Mage::getModel('rewards/catalog_product')->load($product->getId()); } $optimized_price = $product->getRewardAdjustedPrice(); return $optimized_price; }
/** * returns an empty product if the product model could not be found * * @param Mage_Sales_Model_Quote_Item||TBT_Rewards_Model_Catalog_Product $item : the catalog item associated * @return TBT_Rewards_Model_Catalog_Product */ private function assureProduct($item) { if ($item instanceof TBT_Rewards_Model_Catalog_Product) { $product =& $item; } else { if ($item instanceof Mage_Catalog_Model_Product) { $product = $this->assureProduct(TBT_Rewards_Model_Catalog_Product::wrap($item)); } else { if ($this->hasGetProductFunc($item)) { $product = $item->getProduct(); if (empty($product)) { $product = Mage::getModel('rewards/catalog_product'); } } else { $product = Mage::getModel('rewards/catalog_product'); } } } return $product; }
/** * AJAX CALL. return a list of rules given a product and product price * param product_id * param rule_id * param price */ public function getProductPriceRuleSettingsAction() { try { //$storeId = $product->getStoreId(); // Mage::app()->getStore($storeId); /* @var $store Mage_Core_Model_Store */ $store = Mage::app()->getStore(); /* @var $product Mage_Catalog_Model_Product */ $productId = $this->getRequest()->get("productId"); $product = Mage::getModel('catalog/product')->setStoreId($store->getId())->load($productId); if (!$product->getId()) { throw new Exception("Product ID provided does not exist"); } if ($product instanceof Mage_Catalog_Model_Product) { $product = TBT_Rewards_Model_Catalog_Product::wrap($product); } /* @var $customer TBT_Rewards_Model_Customer */ $customer = false; // set to false becaue getCatalogRedemptionRules( false | customer ) if (Mage::getSingleton('rewards/session')->isCustomerLoggedIn()) { $customer = Mage::getSingleton('rewards/session')->getCustomer(); } $price = (double) $this->getRequest()->get("price"); $productPriceRuleMap = array(); $applicableRules = $product->getCatalogRedemptionRules($customer); foreach ($applicableRules as $i => &$r) { $r = (array) $r; $ruleId = $r[TBT_Rewards_Model_Catalogrule_Rule::POINTS_RULE_ID]; $rule = Mage::getModel('rewards/catalogrule_rule')->load($ruleId); if ($rule->getId()) { $productPriceRuleMap[$ruleId] = $rule->getPointSliderSettings($store, $product, $customer, $price); } } echo json_encode($productPriceRuleMap); } catch (Exception $e) { die("Error: " . $e->getMessage()); } }
/** * Fetches a points model from a product. * TODO: Ideally the product should reutnr the points model. * * @param TBT_Rewards_Model_Catalog_Product $product * @return TBT_Rewards_Model_Points */ public function _genPointsModel($product) { $points = Mage::getModel('rewards/points'); $points->add($product->getEarnablePoints()); return $points; }
/** * * @param Mage_Core_Model_Store $store * @param TBT_Rewards_Model_Catalog_Product $product * @param TBT_Rewards_Model_Customer $customer * @param float $redeemable_price * */ public function getPointSliderSettings($store, $product, $customer, $price) { try { if (!$this->getId()) { throw new Exception("Bad rule ID"); } if (!$product->getId()) { throw new Exception("Product ID provided does not exist"); } $redeem_price_per_usage = $price - Mage::helper('rewards')->priceAdjuster($price, $this->getEffect(), false, false); $redeemable_price = $price; // limit $redeemable_price to the redeem_percentage_price limit if ($this['points_max_redeem_percentage_price']) { $redeemable_price = $price * (min($this['points_max_redeem_percentage_price'], 100) / 100); } // find the number of redeem_usages needed to get the full product free $max_redeem_usage = $redeemable_price / $redeem_price_per_usage; // HACK: to keep none hole usage percent $max_redeem_usage_part = $max_redeem_usage; if ($max_redeem_usage > (int) $max_redeem_usage) { $max_redeem_usage = (int) $max_redeem_usage + 1; } // set of max points that can be used $points_max_set = array(); $points_max_set[] = $this['points_amount'] * $max_redeem_usage; if ($this['points_max_qty'] > 0) { $points_max_set[] = $this['points_max_qty']; } if ($customer != null && Mage::getSingleton('rewards/session')->isCustomerLoggedIn()) { $points_max_set[] = $customer->getUsablePointsBalance($this->getPointsCurrencyId()); } if (Mage::helper('rewards/config')->canUseRedemptionsIfNotLoggedIn() == false && Mage::getSingleton('rewards/session')->isCustomerLoggedIn() == false) { $points_max_set[] = 0; } // set of max usage that can be used $usage_max_set = array(); $usage_max_set[] = $max_redeem_usage; $usage_max_set[] = (int) (min($points_max_set) / $this['points_amount']); if ($this['points_uses_per_product'] > 0) { $usage_max_set[] = $this['points_uses_per_product']; } // set of max redeem price $redeem_price_max_set = array(); $redeem_price_max_set[] = $redeemable_price; $redeem_price_max_set[] = max($usage_max_set) * $redeem_price_per_usage; // --------- min $usage_min_set = array(); $usage_min_set[] = 0; $rRule = array(); // HACK: to keep none hole usage percent $rRule['on_price'] = $price; $rRule['max_redeem_usage_part'] = $max_redeem_usage_part; // TODO - admin option to change redeemer type $rRule['redeam_type'] = 'slider'; if ($this['points_uses_per_product'] == 1) { $rRule['redeam_type'] = 'once_per_product'; } //$rRule['effect_type'] = $rule->getPointsCatalogruleSimpleAction(); //$rRule['effect'] = $rule->getEffect(); //$rRule['can_use_rule'] = Mage::getSingleton('rewards/session')->isCustomerLoggedIn() || Mage::helper('rewards/config')->canUseRedemptionsIfNotLoggedIn(); $rRule['points_per_usage'] = $this['points_amount']; $rRule['points_spend_min'] = 0; $rRule['points_spend_max'] = min($points_max_set); $rRule['usage_min'] = max($usage_min_set); // mostly 0 $rRule['usage_max'] = min($usage_max_set); // the min of all the max $rRule['redeem_price_per_usage'] = $redeem_price_per_usage; $rRule['redeem_price_min'] = 0; $rRule['redeem_price_max'] = min($redeem_price_max_set); $rRule['rule_id'] = $this->getId(); $rRule['product_id'] = $product->getId(); $rRule['currency_id'] = $this->getPointsCurrencyId(); $rRule['name'] = $this->getName(); $rRule['currency_id'] = $this->getPointsCurrencyId(); // [TBT_Rewards_Model_Catalogrule_Rule::POINTS_CURRENCY_ID]; $rRule['points'] = Mage::helper('rewards/currency')->formatCurrency($rRule['points_per_usage'], $rRule['currency_id']); // $rRule['points_caption'] = Mage::helper('rewards')->getPointsString(array( // $rRule['currency_id'] => $rRule['points_per_usage'] // )); return $rRule; } catch (Exception $e) { // TODO FIX LOG ERROR Mage::log($e->getMessage()); //die("Error: " . $e->getMessage()); return null; } }