PageRenderTime 61ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/classes/SpecificPriceRule.php

https://gitlab.com/staging06/myproject
PHP | 315 lines | 241 code | 31 blank | 43 comment | 30 complexity | 7eb941653a1bec7869f1998fab726013 MD5 | raw file
  1. <?php
  2. /*
  3. * 2007-2015 PrestaShop
  4. *
  5. * NOTICE OF LICENSE
  6. *
  7. * This source file is subject to the Open Software License (OSL 3.0)
  8. * that is bundled with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://opensource.org/licenses/osl-3.0.php
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@prestashop.com so we can send you a copy immediately.
  14. *
  15. * DISCLAIMER
  16. *
  17. * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
  18. * versions in the future. If you wish to customize PrestaShop for your
  19. * needs please refer to http://www.prestashop.com for more information.
  20. *
  21. * @author PrestaShop SA <contact@prestashop.com>
  22. * @copyright 2007-2015 PrestaShop SA
  23. * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  24. * International Registered Trademark & Property of PrestaShop SA
  25. */
  26. class SpecificPriceRuleCore extends ObjectModel
  27. {
  28. public $name;
  29. public $id_shop;
  30. public $id_currency;
  31. public $id_country;
  32. public $id_group;
  33. public $from_quantity;
  34. public $price;
  35. public $reduction;
  36. public $reduction_tax;
  37. public $reduction_type;
  38. public $from;
  39. public $to;
  40. protected static $rules_application_enable = true;
  41. /**
  42. * @see ObjectModel::$definition
  43. */
  44. public static $definition = array(
  45. 'table' => 'specific_price_rule',
  46. 'primary' => 'id_specific_price_rule',
  47. 'fields' => array(
  48. 'name' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true),
  49. 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
  50. 'id_country' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
  51. 'id_currency' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
  52. 'id_group' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
  53. 'from_quantity' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true),
  54. 'price' => array('type' => self::TYPE_FLOAT, 'validate' => 'isNegativePrice', 'required' => true),
  55. 'reduction' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice', 'required' => true),
  56. 'reduction_tax' => array('type' => self::TYPE_INT, 'validate' => 'isBool', 'required' => true),
  57. 'reduction_type' => array('type' => self::TYPE_STRING, 'validate' => 'isReductionType', 'required' => true),
  58. 'from' => array('type' => self::TYPE_DATE, 'validate' => 'isDateFormat', 'required' => false),
  59. 'to' => array('type' => self::TYPE_DATE, 'validate' => 'isDateFormat', 'required' => false),
  60. ),
  61. );
  62. protected $webserviceParameters = array(
  63. 'objectsNodeName' => 'specific_price_rules',
  64. 'objectNodeName' => 'specific_price_rule',
  65. 'fields' => array(
  66. 'id_shop' => array('xlink_resource' => 'shops', 'required' => true),
  67. 'id_country' => array('xlink_resource' => 'countries', 'required' => true),
  68. 'id_currency' => array('xlink_resource' => 'currencies', 'required' => true),
  69. 'id_group' => array('xlink_resource' => 'groups', 'required' => true),
  70. ),
  71. );
  72. public function delete()
  73. {
  74. $this->deleteConditions();
  75. Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'specific_price WHERE id_specific_price_rule='.(int)$this->id);
  76. return parent::delete();
  77. }
  78. public function deleteConditions()
  79. {
  80. $ids_condition_group = Db::getInstance()->executeS('SELECT id_specific_price_rule_condition_group
  81. FROM '._DB_PREFIX_.'specific_price_rule_condition_group
  82. WHERE id_specific_price_rule='.(int)$this->id);
  83. if ($ids_condition_group) {
  84. foreach ($ids_condition_group as $row) {
  85. Db::getInstance()->delete('specific_price_rule_condition_group', 'id_specific_price_rule_condition_group='.(int)$row['id_specific_price_rule_condition_group']);
  86. Db::getInstance()->delete('specific_price_rule_condition', 'id_specific_price_rule_condition_group='.(int)$row['id_specific_price_rule_condition_group']);
  87. }
  88. }
  89. }
  90. public static function disableAnyApplication()
  91. {
  92. SpecificPriceRule::$rules_application_enable = false;
  93. }
  94. public static function enableAnyApplication()
  95. {
  96. SpecificPriceRule::$rules_application_enable = true;
  97. }
  98. public function addConditions($conditions)
  99. {
  100. if (!is_array($conditions)) {
  101. return;
  102. }
  103. $result = Db::getInstance()->insert('specific_price_rule_condition_group', array(
  104. 'id_specific_price_rule' => (int)$this->id
  105. ));
  106. if (!$result) {
  107. return false;
  108. }
  109. $id_specific_price_rule_condition_group = (int)Db::getInstance()->Insert_ID();
  110. foreach ($conditions as $condition) {
  111. $result = Db::getInstance()->insert('specific_price_rule_condition', array(
  112. 'id_specific_price_rule_condition_group' => (int)$id_specific_price_rule_condition_group,
  113. 'type' => pSQL($condition['type']),
  114. 'value' => (float)$condition['value'],
  115. ));
  116. if (!$result) {
  117. return false;
  118. }
  119. }
  120. return true;
  121. }
  122. public function apply($products = false)
  123. {
  124. if (!SpecificPriceRule::$rules_application_enable) {
  125. return;
  126. }
  127. $this->resetApplication($products);
  128. $products = $this->getAffectedProducts($products);
  129. foreach ($products as $product) {
  130. SpecificPriceRule::applyRuleToProduct((int)$this->id, (int)$product['id_product'], (int)$product['id_product_attribute']);
  131. }
  132. }
  133. public function resetApplication($products = false)
  134. {
  135. $where = '';
  136. if ($products && count($products)) {
  137. $where .= ' AND id_product IN ('.implode(', ', array_map('intval', $products)).')';
  138. }
  139. return Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'specific_price WHERE id_specific_price_rule='.(int)$this->id.$where);
  140. }
  141. /**
  142. * @param array|bool $products
  143. */
  144. public static function applyAllRules($products = false)
  145. {
  146. if (!SpecificPriceRule::$rules_application_enable) {
  147. return;
  148. }
  149. $rules = new PrestaShopCollection('SpecificPriceRule');
  150. foreach ($rules as $rule) {
  151. /** @var SpecificPriceRule $rule */
  152. $rule->apply($products);
  153. }
  154. }
  155. public function getConditions()
  156. {
  157. $conditions = Db::getInstance()->executeS('
  158. SELECT g.*, c.*
  159. FROM '._DB_PREFIX_.'specific_price_rule_condition_group g
  160. LEFT JOIN '._DB_PREFIX_.'specific_price_rule_condition c
  161. ON (c.id_specific_price_rule_condition_group = g.id_specific_price_rule_condition_group)
  162. WHERE g.id_specific_price_rule='.(int)$this->id
  163. );
  164. $conditions_group = array();
  165. if ($conditions) {
  166. foreach ($conditions as &$condition) {
  167. if ($condition['type'] == 'attribute') {
  168. $condition['id_attribute_group'] = Db::getInstance()->getValue('SELECT id_attribute_group
  169. FROM '._DB_PREFIX_.'attribute
  170. WHERE id_attribute='.(int)$condition['value']);
  171. } elseif ($condition['type'] == 'feature') {
  172. $condition['id_feature'] = Db::getInstance()->getValue('SELECT id_feature
  173. FROM '._DB_PREFIX_.'feature_value
  174. WHERE id_feature_value='.(int)$condition['value']);
  175. }
  176. $conditions_group[(int)$condition['id_specific_price_rule_condition_group']][] = $condition;
  177. }
  178. }
  179. return $conditions_group;
  180. }
  181. /**
  182. * Return the product list affected by this specific rule.
  183. *
  184. * @param bool|array $products Products list limitation.
  185. * @return array Affected products list IDs.
  186. * @throws PrestaShopDatabaseException
  187. */
  188. public function getAffectedProducts($products = false)
  189. {
  190. $conditions_group = $this->getConditions();
  191. $current_shop_id = Context::getContext()->shop->id;
  192. $result = array();
  193. if ($conditions_group) {
  194. foreach ($conditions_group as $id_condition_group => $condition_group) {
  195. // Base request
  196. $query = new DbQuery();
  197. $query->select('p.`id_product`')
  198. ->from('product', 'p')
  199. ->leftJoin('product_shop', 'ps', 'p.`id_product` = ps.`id_product`')
  200. ->where('ps.id_shop = '.(int)$current_shop_id);
  201. $attributes_join_added = false;
  202. // Add the conditions
  203. foreach ($condition_group as $id_condition => $condition) {
  204. if ($condition['type'] == 'attribute') {
  205. if (!$attributes_join_added) {
  206. $query->select('pa.`id_product_attribute`')
  207. ->leftJoin('product_attribute', 'pa', 'p.`id_product` = pa.`id_product`')
  208. ->join(Shop::addSqlAssociation('product_attribute', 'pa', false));
  209. $attributes_join_added = true;
  210. }
  211. $query->leftJoin('product_attribute_combination', 'pac'.(int)$id_condition, 'pa.`id_product_attribute` = pac'.(int)$id_condition.'.`id_product_attribute`')
  212. ->where('pac'.(int)$id_condition.'.`id_attribute` = '.(int)$condition['value']);
  213. } elseif ($condition['type'] == 'manufacturer') {
  214. $query->where('p.id_manufacturer = '.(int)$condition['value']);
  215. } elseif ($condition['type'] == 'category') {
  216. $query->leftJoin('category_product', 'cp'.(int)$id_condition, 'p.`id_product` = cp'.(int)$id_condition.'.`id_product`')
  217. ->where('cp'.(int)$id_condition.'.id_category = '.(int)$condition['value']);
  218. } elseif ($condition['type'] == 'supplier') {
  219. $query->where('EXISTS(
  220. SELECT
  221. `ps'.(int)$id_condition.'`.`id_product`
  222. FROM
  223. `'._DB_PREFIX_.'product_supplier` `ps'.(int)$id_condition.'`
  224. WHERE
  225. `p`.`id_product` = `ps'.(int)$id_condition.'`.`id_product`
  226. AND `ps'.(int)$id_condition.'`.`id_supplier` = '.(int)$condition['value'].'
  227. )');
  228. } elseif ($condition['type'] == 'feature') {
  229. $query->leftJoin('feature_product', 'fp'.(int)$id_condition, 'p.`id_product` = fp'.(int)$id_condition.'.`id_product`')
  230. ->where('fp'.(int)$id_condition.'.`id_feature_value` = '.(int)$condition['value']);
  231. }
  232. }
  233. // Products limitation
  234. if ($products && count($products)) {
  235. $query->where('p.`id_product` IN ('.implode(', ', array_map('intval', $products)).')');
  236. }
  237. // Force the column id_product_attribute if not requested
  238. if (!$attributes_join_added) {
  239. $query->select('NULL as `id_product_attribute`');
  240. }
  241. $result = array_merge($result, Db::getInstance()->executeS($query));
  242. }
  243. } else {
  244. // All products without conditions
  245. if ($products && count($products)) {
  246. $query = new DbQuery();
  247. $query->select('p.`id_product`')
  248. ->select('NULL as `id_product_attribute`')
  249. ->from('product', 'p')
  250. ->leftJoin('product_shop', 'ps', 'p.`id_product` = ps.`id_product`')
  251. ->where('ps.id_shop = '.(int)$current_shop_id);
  252. $query->where('p.`id_product` IN ('.implode(', ', array_map('intval', $products)).')');
  253. $result = Db::getInstance()->executeS($query);
  254. } else {
  255. $result = array(array('id_product' => 0, 'id_product_attribute' => null));
  256. }
  257. }
  258. return $result;
  259. }
  260. public static function applyRuleToProduct($id_rule, $id_product, $id_product_attribute = null)
  261. {
  262. $rule = new SpecificPriceRule((int)$id_rule);
  263. if (!Validate::isLoadedObject($rule) || !Validate::isUnsignedInt($id_product)) {
  264. return false;
  265. }
  266. $specific_price = new SpecificPrice();
  267. $specific_price->id_specific_price_rule = (int)$rule->id;
  268. $specific_price->id_product = (int)$id_product;
  269. $specific_price->id_product_attribute = (int)$id_product_attribute;
  270. $specific_price->id_customer = 0;
  271. $specific_price->id_shop = (int)$rule->id_shop;
  272. $specific_price->id_country = (int)$rule->id_country;
  273. $specific_price->id_currency = (int)$rule->id_currency;
  274. $specific_price->id_group = (int)$rule->id_group;
  275. $specific_price->from_quantity = (int)$rule->from_quantity;
  276. $specific_price->price = (float)$rule->price;
  277. $specific_price->reduction_type = $rule->reduction_type;
  278. $specific_price->reduction_tax = $rule->reduction_tax;
  279. $specific_price->reduction = ($rule->reduction_type == 'percentage' ? $rule->reduction / 100 : (float)$rule->reduction);
  280. $specific_price->from = $rule->from;
  281. $specific_price->to = $rule->to;
  282. return $specific_price->add();
  283. }
  284. }