<?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);
private function updateVariants($service_id, $variants) { $add = array(); $update = array(); $variants_model = new shopServiceVariantsModel(); $products_model = new shopProductServicesModel(); $old_variants = $variants_model->getByField('service_id', $service_id, 'id'); $sort = 0; foreach ($variants as $item) { $item['sort'] = $sort; $sort += 1; if (empty($item['id']) || empty($old_variants[$item['id']])) { $item['service_id'] = $service_id; $add[] = $item; } else { $variant_id = $item['id']; $update[$variant_id] = $item; unset($old_variants[$variant_id]); } } $default_id = null; foreach ($add as $item) { $added_id = $variants_model->insert($item); if (!empty($item['default'])) { $default_id = $added_id; } } foreach ($update as $id => $item) { if (!empty($item['default'])) { $default_id = $id; } $variants_model->updateById($id, $item); } if ($old_variants) { $ids = array_keys($old_variants); $variants_model->delete($ids); $products_model->deleteByVariants($ids); } if (!$default_id) { $default_id = $this->query("\n SELECT id FROM `shop_service_variants`\n WHERE service_id = " . (int) $service_id . " LIMIT 1\n ")->fetchField('id'); $default_id = $default_id ? $default_id : null; } $this->updateById($service_id, array('variant_id' => $default_id)); return array_keys($variants_model->getByField('service_id', $service_id, 'id')); }