findExistingDiscount (); if (isset ($existing)) { $this->id = $existing->id; $this->loaded = true; } } parent::save (); } public function updateDiscountedTemplatePrice () { $database = Database::instance (); $database->query (new SqlQuery ('TRUNCATE `discountupdates`')); if ($this->isTypeCategoryDiscountActive ()) { if (in_array ($this->discounttype_id, array (self::DISCOUNT_TYPE_TYPE, self::DISCOUNT_TYPE_CATEGORY)) and $this->discount > 0) { $this->apply (); ORM::factory ('discountupdate')->flush (); return; } } $this->recalculateTemplatePrice (); } function recalculateTemplatePrice () { $this->resetTemplatePrice (); if ($this->isTypeCategoryDiscountActive ()) { $active_discounts = ORM::factory ('discount') ->where ('discount >', 0) ->in ('discounttype_id', array (Discount_Model::DISCOUNT_TYPE_TYPE, Discount_Model::DISCOUNT_TYPE_CATEGORY)) ->orderby ('discount', 'DESC') ->find_all () ; if ($active_discounts->count ()) { foreach ($active_discounts as $active_discount) { $active_discount->apply (); } ORM::factory ('discountupdate')->flush (); return; } } } private function resetTemplatePrice () { $preset_rate = (100 - Setting_Model::get (Setting_Model::S_DISCOUNT_PERCENT)) / 100; $new_price = new String ("ROUND(price * $preset_rate)"); Database::instance()->update ('templates', array ('discounted_price' => $new_price), array ('id >' => '0')); } private function apply () { $discount_rate = (100 - $this->discount) / 100; $query = <<discounttype_id == self::DISCOUNT_TYPE_TYPE) { $query .= "WHERE `templatetype_id` = '$this->entity_id'"; } elseif ($this->discounttype_id == self::DISCOUNT_TYPE_CATEGORY) { $query .= "INNER JOIN `:prefix:templatecategories_templates` ON template_id = `:prefix:templates`.id AND templatecategory_id = '$this->entity_id'"; } Database::instance ()->query (new SqlQuery ($query)); } function isTypeCategoryDiscountActive () { $preset_discount = ORM::factory ('discount')->where ('discounttype_id', self::DISCOUNT_TYPE_PRESET)->find (); if ($preset_discount->isExist ()) { return $preset_discount->discount > 0; } return true; } function getDiscountByType ($type_id) { $discount = ORM::factory ('discount') ->where ('discounttype_id', self::DISCOUNT_TYPE_TYPE) ->where ('entity_id', $type_id) ->find (); if ($discount->exists ()) { return $discount->discount; } return 0; } function getDiscountByCategoryId ($category_id) { if (! is_array ($category_id)) { $category_id = array ($category_id); } Database::instance()->push (); { $list = Database::instance()->select ('MAX(discount) AS max_discount') ->from ('discounts') ->in ('entity_id', $category_id) ->where ('discounttype_id', self::DISCOUNT_TYPE_CATEGORY) ->get () ; } Database::instance()->pop (); foreach ($list as $record) { return (int) $record->max_discount; } return 0; } private function findExistingDiscount () { if (self::DISCOUNT_TYPE_PRESET == $this->discounttype_id) { $result = ORM::factory ('discount') ->where ('discounttype_id=', self::DISCOUNT_TYPE_PRESET) ->find (); } else { $result = ORM::factory ('discount') ->where ('discounttype_id', $this->discounttype_id) ->where ('entity_id', $this->entity_id) ->find (); } if (isset ($result)) { if ($result->isExist ()) { return $result; } } } }