public function getServices($product_id, $sku_id) { $product_model = new shopProductModel(); $product = $product_model->getById($product_id); $type_service_model = new shopTypeServicesModel(); $service_ids = $type_service_model->getServiceIds($product['type_id']); $sql = "SELECT v.*, ps.price p_price, ps.status, ps.sku_id, s.currency FROM shop_service_variants v\n LEFT JOIN shop_product_services ps ON v.id = ps.service_variant_id AND ps.product_id = i:product_id\n JOIN shop_service s ON v.service_id = s.id\n WHERE " . ($service_ids ? "v.service_id IN (i:service_ids) OR " : '') . "\n ps.product_id = i:product_id OR ps.sku_id = i:sku_id\n ORDER BY ps.sku_id"; $product_services_model = new shopProductServicesModel(); $rows = $product_services_model->query($sql, array('service_ids' => $service_ids, 'product_id' => $product_id, 'sku_id' => $sku_id))->fetchAll(); $services = array(); foreach ($rows as $row) { $services[$row['service_id']][$row['id']] = array('name' => $row['name'], 'price' => $row['p_price'] ? $row['p_price'] : $row['price'], 'currency' => $row['currency']); } return $services; }
<?php $model = new waModel(); $service_variants_model = new shopServiceVariantsModel(); $product_services_model = new shopProductServicesModel(); // one service - at least one variant $sql = "SELECT s.* FROM `shop_service` s\n LEFT JOIN `shop_service_variants` sv ON s.id = sv.service_id\n WHERE sv.id IS NULL"; foreach ($model->query($sql) as $service) { $id = $service_variants_model->insert(array('service_id' => $service['id'], 'name' => '', 'price' => $service['price'], 'primary_price' => $service['primary_price'])); } // default variant_id $model->exec("\n UPDATE `shop_service` s JOIN `shop_service_variants` sv ON s.id = sv.service_id\n SET s.variant_id = sv.id\n WHERE s.variant_id IS NULL\n"); // one service - at least one variant, so correct shop_product_services $model->exec("\n UPDATE `shop_product_services` ps JOIN `shop_service` s ON s.id = ps.service_id\n SET ps.service_variant_id = s.variant_id\n WHERE ps.service_variant_id IS NULL\n"); foreach ($product_services_model->query($sql) as $item) { $product_services_model->updateById($item['id'], array('status' => (int) ($item['status'] > 0))); } $model->exec("\n ALTER TABLE `shop_product_services` CHANGE service_variant_id service_variant_id INT (11) NOT NULL\n"); $model->exec("\n ALTER TABLE `shop_service` CHANGE variant_id variant_id INT(11) NOT NULL\n"); $model->exec("\n ALTER TABLE `shop_service_variants` CHANGE price price decimal(15,4) NOT NULL DEFAULT 0\n"); $model->exec("\n ALTER TABLE `shop_service_variants` CHANGE primary_price primary_price decimal(15,4) NOT NULL DEFAULT 0\n"); try { $sql = "UPDATE `shop_service` SET price = primary_price"; $model->exec($sql); $model->exec("\n ALTER TABLE `shop_service` DROP primary_price\n "); } catch (waDbException $e) { } $sql = "UPDATE `shop_service` s\n JOIN `shop_service_variants` sv ON s.id = sv.service_id AND s.variant_id = sv.id\n SET s.price = sv.primary_price\n WHERE s.price != sv.primary_price"; $model->exec($sql); $sql = "UPDATE `shop_order_items` oi\n JOIN `shop_service` s ON oi.service_id = s.id\n SET oi.service_variant_id = s.variant_id\n WHERE oi.type = 'service' AND service_variant_id IS NULL"; $model->exec($sql);
/** * Returns total cost of current shopping cart's item with specified id, expressed in default currency. * * @param int|array $item_id Item id or item data array. * @return float */ public function getItemTotal($item_id) { if (is_array($item_id)) { $item = $item_id; } else { $item = $this->getItem($item_id); } $cart_items_model = new shopCartItemsModel(); $items = $cart_items_model->getByField('parent_id', $item['id'], true); $price = shop_currency($item['price'] * $item['quantity'], $item['currency'], null, false); if (!$items) { return $price; } $variants = array(); foreach ($items as $s) { $variants[] = $s['service_variant_id']; } $product_services_model = new shopProductServicesModel(); $sql = "SELECT v.id, s.currency, ps.sku_id, ps.price, v.price base_price FROM shop_service_variants v\n LEFT JOIN shop_product_services ps ON\n v.id = ps.service_variant_id AND ps.product_id = i:0 AND (ps.sku_id = i:1 OR ps.sku_id IS NULL)\n JOIN shop_service s ON v.service_id = s.id\n WHERE v.id IN (i:2)\n ORDER BY ps.sku_id"; $rows = $product_services_model->query($sql, $item['product_id'], $item['sku_id'], $variants)->fetchAll(); $prices = array(); foreach ($rows as $row) { if (!isset($prices[$row['id']]) || $row['price']) { if ($row['price'] === null) { $row['price'] = $row['base_price']; } $prices[$row['id']] = $row; } } foreach ($items as $s) { $v = $prices[$s['service_variant_id']]; if ($v['currency'] == '%') { $v['price'] = $v['price'] * $item['price'] / 100; $v['currency'] = $item['currency']; } $price += shop_currency($v['price'] * $item['quantity'], $v['currency'], null, false); } return $price; }