entityManager = $entityManager; } public function computeAll() { $this->computeProducts(); $this->computeVariations(); } protected function computeProducts() { sqlQueryBuilder() ->update('products', 'p') ->set('p.price', $this->getMarginPattern('p')) ->where('p.price_buy IS NOT NULL AND !FIND_IN_SET(\'MM\', p.campaign)') ->execute(); } protected function computeVariations() { sqlQuery(" UPDATE products_variations pv JOIN margins m ON m.range_from < pv.price_buy AND m.range_to >= pv.price_buy JOIN products p ON p.id = pv.id_product SET pv.price = pv.price_buy * (100 + m.margin) / 100 WHERE pv.price_buy IS NOT NULL AND !FIND_IN_SET('MM', p.campaign) "); } /** * @param $id_product int id of product * * @return bool */ public function computeProductPrice($id_product) { return sqlQueryBuilder() ->update('products', 'p') ->set('p.price', $this->getMarginPattern('p')) ->where('p.price_buy IS NOT NULL AND p.id = :id AND !FIND_IN_SET(\'MM\', p.campaign)') ->setParameter('id', $id_product) ->execute(); } /** * @param $id_variation int id of variation * * @return bool */ public function computeVariationPrice($id_variation = null) { return sqlQuery(" UPDATE products_variations pv JOIN margins m ON m.range_from < pv.price_buy AND m.range_to >= pv.price_buy JOIN products p ON p.id = pv.id_product SET pv.price = pv.price_buy * (100 + m.margin) / 100 WHERE pv.price_buy IS NOT NULL AND pv.id = :id AND !FIND_IN_SET('MM', p.campaign) ", ['id' => $id_variation]); } private function getMarginPattern($alias) { return "{$alias}.price_buy * (100 + COALESCE((SELECT margin FROM margins m WHERE m.range_from < {$alias}.price_buy AND m.range_to >= {$alias}.price_buy), 0)) / 100"; } }