Jump to content

Recommended Posts

Интеграция с МойСклад


Интеграция с МойСклад


Модуль синхронизации товаров из сервиса МойСклад в OpenCart 2.3

 

Доступный функционал:

- Синхронизация категорий

- Синхронизация остатков

- Синхронизация заказов

- Синхронизация модификаций

- Синхронизации статусов заказа из OpenCart в МойСклад (при условии создании в МойСклад таких же статусов как и в OpenCart)

- Приветственное СМС при регистрации в магазине (SMSInt)

- Отправка СМС сообщения пользователям, у которых не было покупок в течении 30 дней

 

Чтобы СМС сообщения работали надо аккаунт на сервисе SMSInt

 

 

Пожелания по улучшению пишите в теме поддержке.


  • Добавил
  • Добавлено
    25.05.2018
  • Категория
  • Системные требования
  • Сайт разработчика
  • Старая цена
  • Метод активации
    Без активации
  • Ioncube Loader
    Нет
  • OpenCart
    2.3
  • ocStore
    2.3
  • OpenCart.Pro, ocShop

 

Share this post


Link to post
Share on other sites

с локальным сервером не работает. openserver php 5.6 

Share this post


Link to post
Share on other sites

Можете посодействовать в установке - версия opencart 2.03. Нужно чтобы был обмен остатками 9253028609

Share this post


Link to post
Share on other sites

работает по api?

Share this post


Link to post
Share on other sites

Мне кажется или в модуле не хватает файлов?

Share this post


Link to post
Share on other sites

Добрый день, подскажите,

1) авто обновление товаров не работает прописали, как сказано в документации.. и крон ежедневно, выполняет операции

2) После обновления в ручную у товаров не происходит замена наименование старые товары остались с тем же наименованием что и было загружено ранее а новые позиции наименованы правильно 

 

image.png

Share this post


Link to post
Share on other sites

Для работы модуля сначала нужно удалить лицензию admin\controller\extension\module\ms.php

 

<?php  
class ControllerExtensionModuleMS extends Controller {
	private $error = array();

	public function index() {
		$this->load->language('extension/module/ms'); //подключаем любой языковой файл

		 $request_data = [
		 	'host' => $_SERVER['HTTP_HOST'],
		 	'secret' => 'zerrnoco'
		 ];

		 if (true) {

			$this->document->addScript('view/javascript/ms/ms.js');
			$this->document->addStyle('view/stylesheet/ms/ms.css');

			$this->document->setTitle($this->language->get('heading_title'));

			// регистрируем модуль
			$this->load->model('setting/setting');

			if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
			    $this->model_setting_setting->editSetting('ms', $this->request->post);
			    $this->session->data['success'] = $this->language->get('text_success');
			    $data['success'] = $this->session->data['success'] ;

			    //создаем таблицы в БД
				$this->load->model('extension/module/ms');    		
	    		$this->model_extension_module_ms->createTable();

			    $this->response->redirect($this->url->link('extension/module/ms', 'token=' . $this->session->data['token'] . '&type=module', true));
			}

			if (!empty($this->config->get('ms_name')) && !empty($this->config->get('ms_password'))) {

				$sklad = new Sklad ($this->config->get('ms_name'), $this->config->get('ms_password'));

				$ms_organizations = $sklad->getOrganizations();


				if (isset($ms_organizations['errors'])) {
					foreach ($ms_organizations['errors'] as $error) {
						$data['errors'][] = $error['error'];
					}
				} else {
					foreach ($ms_organizations['rows'] as $row) {
						$data['organizations'][] = [
							'id' => $row['id'],
							'name' => $row['name'],
						];
					}
				}
			}

			$data['ms_name'] = $this->config->get('ms_name');
			$data['ms_pasword'] = $this->config->get('ms_password');

			$data['heading_title'] = $this->language->get('heading_title'); //объявляем переменную heading_title с данными из языкового файла

			$data['entry_status'] = $this->language->get('entry_status'); 
			$data['entry_name'] = $this->language->get('entry_name'); 
			$data['entry_password'] = $this->language->get('entry_password'); 
			$data['entry_organization'] = $this->language->get('entry_organization'); 
			$data['entry_category'] = $this->language->get('entry_category'); 
			$data['entry_stock'] = $this->language->get('entry_stock'); 
			$data['entry_sms'] = $this->language->get('entry_sms'); 
			$data['entry_order'] = $this->language->get('entry_order'); 
			$data['entry_opt'] = $this->language->get('entry_opt'); 
			$data['entry_sms_template'] = $this->language->get('entry_sms_template'); 
			$data['entry_name_sms'] = $this->language->get('entry_name_sms'); 
			$data['entry_password_sms'] = $this->language->get('entry_password_sms'); 
			$data['entry_values'] = $this->language->get('entry_values'); 
			$data['help_ms_sms'] = $this->language->get('help_ms_sms'); 
			$data['help_sms_tpl'] = $this->language->get('help_sms_tpl'); 
			$data['help_sms_tpl_30'] = $this->language->get('help_sms_tpl_30'); 

			$data['button_save'] = $this->language->get('button_save');
			$data['button_cancel'] = $this->language->get('button_cancel');
			$data['text_enabled'] = $this->language->get('text_enabled'); 
			$data['text_disabled'] = $this->language->get('text_disabled'); 
			$data['text_edit'] = $this->language->get('text_edit'); 
			$data['text_sync'] = $this->language->get('text_sync'); 
			$data['text_yes'] = $this->language->get('text_yes'); 
			$data['text_no'] = $this->language->get('text_no');  

			$data['token'] = $this->session->data['token'];
			$data['loader'] = HTTPS_SERVER . 'view/image/ms/loader.gif';

			if (isset($this->error['warning'])) {
			 $data['error_warning'] = $this->error['warning'];
			} else {
			 $data['error_warning'] = '';
			}

			$data['breadcrumbs'] = array();
			 // Добавляем по одной крошке, сначала ссылка на главную страницу
			 $data['breadcrumbs'][] = array(
			  'text' => $this->language->get('text_home'), // text_home по всей видимости доступен отовсюду
			  'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL')
			  );
			// добавляем ссылку на список с модулями, прописано в своем языковом файле
			 $data['breadcrumbs'][] = array(
			  'text' => $this->language->get('text_module'),
			  'href' => $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')
			);

			// кнопки		
			$data['action'] = $this->url->link('extension/module/ms', 'token=' . $this->session->data['token'], 'SSL');
			$data['cancel'] = $this->url->link('extension/extension', 'token=' . $this->session->data['token'], 'SSL');
			
			if (!empty($this->config->get('ms_name')) && !empty($this->config->get('ms_password'))) {
				$data['sync'] = $this->url->link('extension/module/ms/sync', 'token=' . $this->session->data['token'], 'SSL');
			} else {
				$data['sync'] ='';
			}

			if (isset($this->request->post['ms_status'])) {//статус модуля
			 $data['ms_status'] = $this->request->post['ms_status'];
			} else {
			 $data['ms_status'] = $this->config->get('ms_status');
			}

			if ($data['ms_status'] != 1) {//если модуль отключен удалить все данные из него
				$this->model_setting_setting->deleteSetting('ms');
			}

			if (isset($this->request->post['ms_name'])) {
			 $data['ms_name'] = $this->request->post['ms_name'];
			} else {
			 $data['ms_name'] = $this->config->get('ms_name');
			}

			if (isset($this->request->post['ms_password'])) {
			 $data['ms_password'] = $this->request->post['ms_password'];
			} else {
			 $data['ms_password'] = $this->config->get('ms_password');
			}

			if (isset($this->request->post['ms_category'])) {
			 $data['ms_category'] = $this->request->post['ms_category'];
			} else {
			 $data['ms_category'] = $this->config->get('ms_category');
			}

			if (isset($this->request->post['ms_stock'])) {
			 $data['ms_stock'] = $this->request->post['ms_stock'];
			} else {
			 $data['ms_stock'] = $this->config->get('ms_stock');
			}

			if (isset($this->request->post['ms_org'])) {
			 $data['ms_org'] = $this->request->post['ms_org'];
			} else {
			 $data['ms_org'] = $this->config->get('ms_org');
			}

			if (isset($this->request->post['ms_sms'])) {
			 $data['ms_sms'] = $this->request->post['ms_sms'];
			} else {
			 $data['ms_sms'] = $this->config->get('ms_sms');
			}

			if (isset($this->request->post['ms_order'])) {
			 $data['ms_order'] = $this->request->post['ms_order'];
			} else {
			 $data['ms_order'] = $this->config->get('ms_order');
			}

			if (isset($this->request->post['ms_opt'])) {
			 $data['ms_opt'] = $this->request->post['ms_opt'];
			} else {
			 $data['ms_opt'] = $this->config->get('ms_opt');
			}

			if (isset($this->request->post['ms_sms_tpl'])) {
			 $data['ms_sms_tpl'] = $this->request->post['ms_sms_tpl'];
			} else {
			 $data['ms_sms_tpl'] = $this->config->get('ms_sms_tpl');
			}

			if (isset($this->request->post['ms_sms_login'])) {
			 $data['ms_sms_login'] = $this->request->post['ms_sms_login'];
			} else {
			 $data['ms_sms_login'] = $this->config->get('ms_sms_login');
			}

			if (isset($this->request->post['ms_sms_password'])) {
			 $data['ms_sms_password'] = $this->request->post['ms_sms_password'];
			} else {
			 $data['ms_sms_password'] = $this->config->get('ms_sms_password');
			}

			if (isset($this->request->post['ms_sms_tpl_30'])) {
			 $data['ms_sms_tpl_30'] = $this->request->post['ms_sms_tpl_30'];
			} else {
			 $data['ms_sms_tpl_30'] = $this->config->get('ms_sms_tpl_30');
			}


			$data['header'] = $this->load->controller('common/header');
			$data['column_left'] = $this->load->controller('common/column_left');
			$data['footer'] = $this->load->controller('common/footer');

			// передаем данные на отрисовку
			$this->response->setOutput($this->load->view('extension/module/ms.tpl', $data));
		 } else {
		 	// $this->response->setOutput($this->load->view('extension/extension', $data));
//		 	$this->session->data['license_error'] = $this->language->get('license_error');
//		     $data['license_error'] = $this->session->data['license_error'];
		    
		 	$this->response->redirect($this->url->link('extension/extension', '&token=' . $this->session->data['token'], 'SSL'));
		 }
	}

	protected function validate() {
		if (!$this->user->hasPermission('modify', 'extension/module/ms')) {
			$this->error['warning'] = $this->language->get('error_permission');
		}

		return !$this->error;
	}

//	protected function license($request_data) {
//		$url = 'http://www.api.zerrno.com/?apiLicense.validateLicense={"host":"'.$request_data['host'].'","secret":"'.$request_data['secret'].'"}';
//		$process = curl_init($url);
//		curl_setopt($process, CURLOPT_HEADER, false);
//		curl_setopt($process, CURLOPT_TIMEOUT, 30);
//		curl_setopt($process, CURLOPT_RETURNTRANSFER, true);
//		$return = curl_exec($process) or die(curl_error($process));
//		$return = (array)(json_decode($return));
//
//		curl_close($process);
//
//		return $return['response']->license;
//	}


	public function sync() {
		$this->load->language('extension/module/ms');
		set_time_limit(900);

		$request_data = [
			'host' => $_SERVER['HTTP_HOST']
		];

		if (true) {
			$this->load->model('extension/module/ms');
			$this->load->model('catalog/category');
			$this->load->model('catalog/product');
			$this->load->model('catalog/option');

			$json = [];

			if (!empty($this->config->get('ms_name')) && !empty($this->config->get('ms_password'))) {
				$login = $this->config->get('ms_name');
				$password = $this->config->get('ms_password');
			} else {
				return false;
			}

			$sklad = new Sklad($login, $password);
			
			$products = $sklad->getAllProducts();
			$sklad->response = [];

			$stocks = $sklad->getAllStocks();//остаток
			$sklad->response = [];

			$ms_product_ids = $this->model_extension_module_ms->getMSProductIds();
			$ms_category_ids = $this->model_extension_module_ms->getMSCategoryIds();
			
			foreach ($products as $product) {
				if (isset($ms_product_ids) && !empty($ms_product_ids)) {
					for ($i = 0; $i < count((array)$ms_product_ids); $i++) {//находим id товаров которые нужно удалить из опенкарт
						if ($ms_product_ids[$i]['ms_product_id'] == $product['id']) {
							unset($ms_product_ids[$i]);
							sort($ms_product_ids);
						}
					}
				}

				$product_oc = $this->model_catalog_product->getProduct($this->model_extension_module_ms->getProductIdByMSId($product['id']));

				if (!empty($product_oc)) {// если продукт уже существует в опенкарт, нужно обновить его

					if (isset($product['name'])) {
						$name = $product['name'];
					} else {
						$name = '';
					}

					// $name = $product['name'] ?? '';

					if (isset($product['code'])) {
						$model = $product['code'];
					} else {
						$model = '';	
					}

					// $model = $product['code'] ?? '';

					if (isset($product['description'])) {
						$description = $product['description'];
					} else {
						$description = '';	
					}

					// $description = $product['description'] ?? '';

					if (isset($product['article'])) {
						$sku = $product['article'];
					} else {
						$sku = '';
					}

					// $sku = $product['article'] ?? '';

					if (isset($product['image'])) { 
						$image = $sklad->getProductImage($product['image']['meta']['href']);
					} else {
						$image = '';
					}

					// $image = isset($product['image']) ? $sklad->getProductImage($product['image']['meta']['href']) : ''; 

					// if (isset($product['attributes'])) {
					// 	foreach ($product['attributes'] as $field) {
					// 		switch ($field['name']) {
					// 			case 'SEO URL':
					// 				$keyword = $field['value'];
					// 				break;

					// 			case 'Мета-тег Description':
					// 				$meta_desc = $field['value'];
					// 				break;
								
					// 			default:
					// 				$value = '';
					// 				break;
					// 		}
					// 	}
					// }

					if (isset($product['salePrices'])) {
						foreach ($product['salePrices'] as $prices) {
							if ($prices['priceType'] == 'Цена продажи') {
								$price = $prices['value']/100;
							}
						}
					}

					if ($this->config->get('ms_category')) {
						if (isset($product['productFolder']) && $product['pathName'] != '') {//добавляем категорию в опенкарт
							$categories = [];
							$path = explode('/', $product['pathName']);

							$i = 0;
							for ($i = 0; $i < count($path); $i++) {
								$category_info = $this->model_extension_module_ms->getSyncCategory($path[$i]);
								
								$j = 0;
								if (isset($ms_category_ids)) {
									for ($j = 0; $j < count((array)$ms_category_ids); $j++) {
										$ms_category_name = $this->model_extension_module_ms->getSyncCategoryById($ms_category_ids[$j]['category_id']);

										if ($ms_category_name[0]['category_name'] == $path[$i]) {
											unset($ms_category_ids[$j]);
											sort($ms_category_ids);
										}
									}
								}

								if (empty($category_info)) {
									$data_category = [
										'category_description' => [
											'1' => [
												'name' => $path[$i],
												'description' => $path[$i],
												'meta_title' => $path[$i],
												'meta_h1' => $path[$i],
												'meta_description' => $path[$i],
												'meta_keyword' => $path[$i],
											]
										],
										'category_store' => [
											'0' => 0
										],
										'status' => 1,
										'image' => '',
										'top' => 1,
										'column' => 1,
		    							'sort_order' => 0,
		    							'keyword' => '',
		    							'parent_id' => '',
									];

								if (isset($path[$i - 1])) {
									$parent_category_id = $this->model_extension_module_ms->getSyncCategory($path[$i - 1]);
									$data_category['parent_id'] = $parent_category_id[0]['category_id'];
								}
								
									$category_id = $this->model_catalog_category->addCategory($data_category);
									$this->model_extension_module_ms->setSyncCategory($category_id, $path[$i]);
									$categories[] = $category_id;
								} else {
									if (isset($path[$i - 1])) {
										$parent_category_id = $this->model_extension_module_ms->getSyncCategory($path[$i - 1]);
										$edit_category_data = [
											'category_description' => [
												'1' => [
													'name' => $path[$i],
													'description' => $path[$i],
													'meta_title' => $path[$i],
													'meta_h1' => $path[$i],
													'meta_description' => $path[$i],
													'meta_keyword' => $path[$i],
												]
											],
											'category_store' => [
												'0' => 0
											],
											'status' => 1,
											'image' => '',
											'top' => 1,
											'column' => 1,
			    							'sort_order' => 0,
			    							'keyword' => '',
											'parent_id' => $parent_category_id[0]['category_id'],
										];
										$this->model_catalog_category->editCategory($category_info[0]['category_id'], $edit_category_data);	
									}
									$categories[] = $category_info[0]['category_id'];
								}
							}

							// echo '<pre>';
							// print_r($data_category);
							// echo '</pre>';

							$main_category_id = $this->model_extension_module_ms->getSyncCategory(array_pop($path));
						}
					}

					$quantity = 0;
					if ($this->config->get('ms_stock')) {
						if (!empty($stocks) && isset($product['code'])) {//синхронизация остатков
							foreach ($stocks as $stock) {
								if (isset($product['code'])) {
									if ($stock['code'] == $product['code']) {
										$quantity += $stock['quantity'];
									}
								}
							}
						}
					}

					if ($this->config->get('ms_opt')) {
						if ($product['modificationsCount'] > 0) {//добавить модификации в опенкарт
							$variants = $sklad->getVariantsById($product['id']);
							$product_options = [];
							$product_option_values = [];

							if (isset($variants['errors'])) {
								$this->error += $variants['errors'];
							} else {
								foreach ($variants as $variant) {
									foreach ($variant['characteristics'] as $options => $option) {
										$option_oc = $this->model_extension_module_ms->getOptionByName($option['name']);

										$product_options[] = $option['name'];//////////////////////////////////array_unique()собираем в массив опции данного товара
										$product_option_values[] = $option['value'];//////////////////////////////////array_unique() -=- значения опций

										if (empty($option_oc)) {

											$data_option = [
												'option_description' => [
													'1' => [
														'name' => $option['name'],
													],
												],
												'type' => 'select',
											    'sort_order' => '',
											    'option_value' => [
											    	'0' => [
											    		'option_value_id' => '',
			                    						'option_value_description' => [
			                    							'1' => [
			                    								'name' => $option['value'],
			                    							],
			                    						],
			                    						'image' => '',
			                    						'sort_order' => '',
											    	],
											    ],
											];
											$option_id_oc = $this->model_catalog_option->addOption($data_option);
											$this->model_extension_module_ms->setSyncOption($option_id_oc, $option['name']);	
										} else {
											$option_values_oc = $this->model_catalog_option->getOptionValues($option_oc[0]['option_id']);

											$option_value = [];

											$find = false;

											foreach ($option_values_oc as $option_values) {

												$option_value[] = [
													'option_value_id' => $option_values['option_value_id'],
			                						'option_value_description' => [
			                							'1' => [
			                								'name' => $option_values['name'],
			                							],
			                						],
			                						'image' => '',
			                						'sort_order' => '',
												];

												if ($option_values['name'] == $option['value']) {
													$find = true;
												}
											}

											if (!$find) {
												$option_value[] = [
													'option_value_id' => '',
			                						'option_value_description' => [
			                							'1' => [
			                								'name' => $option['value'],
			                							],
			                						],
			                						'image' => '',
			                						'sort_order' => '',
												];
											}

											$edit_option_data = [
												'option_description' => [
													'1' => [
														'name' => $option['name']
													] 
												],
												'type' => 'select',
									    		'sort_order' => '',
									    		'option_value' => isset($option_value) ? $option_value : [],
											];

											$this->model_catalog_option->editOption($option_oc[0]['option_id'], $edit_option_data);
										}
									}
								}
								//

								// echo "<pre>";
								// print_r(array_unique($product_option_values));
								// echo "</pre>";
								// die();
								if (!empty($product_options)) {//добавляем опции к товарам 

									$product_options = array_unique($product_options);//удаляем повторяющиеся эллементы массива с опциями 

									foreach ($product_options as $key => $option_name) {
										$oc_option_id = $this->model_extension_module_ms->getOptionByName($option_name);
										if (!empty($oc_option_id)) {
											$oc_option = $this->model_catalog_option->getOption($oc_option_id[0]['option_id']);


											$product_option = [
												'product_option_id' => '',
							                    'name' => $oc_option['name'],
							                    'option_id' => $oc_option['option_id'],
							                    'type' => $oc_option['type'],
							                    'required' => '1',
											];
										}

										//по аналогии с опциями нужно собрать массив значений опций данного товара
										if (!empty($product_option_values)) {
											
											$product_option_values = array_unique($product_option_values);//удаляем повторяющиеся эллементы массива
											
											foreach ($product_option_values as $value) {//перебираем значения модификации данного товара
												$product_option_values_oc = $this->model_catalog_option->getOptionValues($oc_option_id[0]['option_id']);//получаем значения данной опции из опенкарт
												foreach ($product_option_values_oc as $values) {//перебираем значения опций опенкарт 
													if ($values['name'] == $value) {//если значение опции опенкарт == значению модификации мойсклад -> добавляем значение этой опции к товару
														$product_option['product_option_value'][] = [
															'option_value_id' => $values['option_value_id'],
						                                    'product_option_value_id' => '',
						                                    'quantity' => '',
						                                    'subtract' => 0,
						                                    'price_prefix' => '+',
						                                    'price' => '',
						                                    'points_prefix' => '+',
						                                    'points' => '',
						                                    'weight_prefix' => '+',
						                                    'weight' => '',
														];
													}
												}
											}
										}
										$product_option_arr[] = $product_option; 
									}
								}
							}
							// echo "<pre>";
							// print_r($product_option_arr);	
							// echo "</pre>";
							// print_r("END------------------");
						}
					}
					//


					$product_data = [
						'product_description' => [
							'1' => [
								'name' => $name,
			                    'description' => $description,
			                    'meta_title' => $name,
			                    'meta_h1' => $name,
			                    'meta_description' => $name,
			                    'meta_keyword' => $name,
			                    'tag' => $name
							]
						],
						'model' => $model,
						'sku' => $sku,
					    'upc' => '',
					    'ean' => '',
					    'jan' => '',
					    'isbn' => '',
					    'mpn' => '',
					    'location' => '',
						'image' => $image,
						'keyword' => '',
						'length' => '',
		    			'width'=> '',
		    			'height' => '',
					    'status' => 1,
					    'price' => isset($price) ? $price : 1,
					    'tax_class_id' => 0,
					    'minimum' => 1,
					    'shipping' => 1,
					    'product_store' => [
					    	'0' => 0
					    ],
					    'quantity' => $quantity,
					    'subtract' => 1,
					    'manufacturer_id' => 0,
					    'sort_order' => 1,
					    'weight_class_id' => 1,
					    'weight' => '',
					    'length_class_id' => 1,
					    'location' => '', 
			   		    'product_category' => isset($categories) ? $categories : [],
					    'stock_status_id' => ($quantity == 0) ? 5 : 7,
					    'date_available' => date('Y-m-d', time()),
					    'points' => '',
					    'main_category_id' => isset($main_category_id) ? $main_category_id[0]['category_id'] : '',
					];

					if (isset($product_option_arr)) {
						$product_data['product_option'] = $product_option_arr;
					}

					$product_data['main_category_id'] = isset($main_category_id) ? $main_category_id[0]['category_id'] : '';

					$this->model_catalog_product->editProduct($product_oc['product_id'], $product_data);

					unset($data_category);
					unset($categories);
					unset($main_category_id);
					unset($product_option_arr);

				} else {//иначе добавить новый товар в опенкарт

					if (isset($product['name'])) {//название товара
						$name = $product['name'];
					} else {
						$name = '';
					}

					// $name = $product['name'] ?? '';

					if (isset($product['code'])) {//код(модель товара)
						$model = $product['code'];
					} else {
						$model = '';	
					}

					// $model = $product['code'] ?? '';

					if (isset($product['description'])) {//описание товара
						$description = $product['description'];
					} else {
						$description = '';	
					}

					// $description = $product['description'] ?? '';

					if (isset($product['article'])) {//артикул товара
						$sku = $product['article'];
					} else {
						$sku = '';
					}

					// $sku = $product['article'] ?? '';

					if (isset($product['image'])) { //изображение товара
						$image = $sklad->getProductImage($product['image']['meta']['href']);
					} else {
						$image = '';
					}

					// $image = isset($product['image']) ? $sklad->getProductImage($product['image']['meta']['href']) : '';

					// if (isset($product['attributes'])) {//дополнительные поля
					// 	foreach ($product['attributes'] as $field) {
					// 		switch ($field['name']) {
					// 			case 'SEO URL':
					// 				$keyword = $field['value'];
					// 				break;

					// 			case 'Мета-тег Description':
					// 				$meta_desc = $field['value'];
					// 				break;
								
					// 			default:
					// 				$value = '';
					// 				break;
					// 		}
					// 	}
					// }

					if (isset($product['salePrices'])) {//цена продажи
						foreach ($product['salePrices'] as $prices) {
							if ($prices['priceType'] == 'Цена продажи') {
								$price = $prices['value']/100;
							}
						}
					}

					if ($this->config->get('ms_category')) {
						if (isset($product['productFolder']) && $product['pathName'] != '') {//добавляем категорию в опенкарт
							$categories = [];
							$path = explode('/', $product['pathName']);
							$i = 0;
							for ($i = 0; $i < count($path); $i++) {
								$category_info = $this->model_extension_module_ms->getSyncCategory($path[$i]);

								$j = 0;
								if (isset($ms_category_ids)) {
									for ($j = 0; $j < count((array)$ms_category_ids); $j++) {
										$ms_category_name = $this->model_extension_module_ms->getSyncCategoryById($ms_category_ids[$j]['category_id']);
										if ($ms_category_name[0]['category_name'] == $path[$i]) {
											unset($ms_category_ids[$j]);
											sort($ms_category_ids);
										}
									}
								}

								if (empty($category_info)) {
									$data_category = [
										'category_description' => [
											'1' => [
												'name' => $path[$i],
												'description' => $path[$i],
												'meta_title' => $path[$i],
												'meta_h1' => $path[$i],
												'meta_description' => $path[$i],
												'meta_keyword' => $path[$i],
											]
										],
										'category_store' => [
											'0' => 0
										],
										'status' => 1,
										'image' => '',
										'top' => 1,
										'column' => 1,
		    							'sort_order' => 0,
		    							'keyword' => '',
		    							'parent_id' => '',
									];

								if (isset($path[$i - 1])) {
									$parent_category_id = $this->model_extension_module_ms->getSyncCategory($path[$i - 1]);
									$data_category['parent_id'] = $parent_category_id[0]['category_id'];
								}

									$category_id = $this->model_catalog_category->addCategory($data_category);
									$this->model_extension_module_ms->setSyncCategory($category_id, $path[$i]);
									$categories[] = $category_id;
								} else {
									if (isset($path[$i - 1])) {
										$parent_category_id = $this->model_extension_module_ms->getSyncCategory($path[$i - 1]);
										$edit_category_data = [
										'category_description' => [
											'1' => [
												'name' => $path[$i],
												'description' => $path[$i],
												'meta_title' => $path[$i],
												'meta_h1' => $path[$i],
												'meta_description' => $path[$i],
												'meta_keyword' => $path[$i],
											]
										],
										'category_store' => [
											'0' => 0
										],
										'status' => 1,
										'image' => '',
										'top' => 1,
										'column' => 1,
		    							'sort_order' => 0,
		    							'keyword' => '',
										'parent_id' => $parent_category_id[0]['category_id'],
										];
										$this->model_catalog_category->editCategory($category_info[0]['category_id'], $edit_category_data);	
									}
									$categories[] = $category_info[0]['category_id'];
								}
							}

							// echo '<pre>';
							// print_r($data_category);
							// echo '</pre>';

							$main_category_id = $this->model_extension_module_ms->getSyncCategory(array_pop($path));
						}
					}

					$quantity = 0;
					if ($this->config->get('ms_stock')) {	
						if (!empty($stocks) && isset($product['code'])) {//синхронизация остатков
							foreach ($stocks as $stock) {
								if (isset($product['code'])) {
									if ($stock['code'] == $product['code']) {
										$quantity += $stock['quantity'];
									}
								}
							}
						}
					}
					// 
					if ($this->config->get('ms_opt')) {
						if ($product['modificationsCount'] > 0) {//добавить модификации в опенкарт
							$variants = $sklad->getVariantsById($product['id']);
							$product_options = [];
							$product_option_values = [];

							if (isset($variants['errors'])) {
								$this->error += $variants['errors'];
							} else {
								foreach ($variants as $variant) {
									foreach ($variant['characteristics'] as $options => $option) {
										$option_oc = $this->model_extension_module_ms->getOptionByName($option['name']);

										$product_options[] = $option['name'];//////////////////////////////////array_unique()собираем в массив опции данного товара
										$product_option_values[] = $option['value'];//////////////////////////////////array_unique() -=- значения опций

										if (empty($option_oc)) {

											$data_option = [
												'option_description' => [
													'1' => [
														'name' => $option['name'],
													],
												],
												'type' => 'select',
											    'sort_order' => '',
											    'option_value' => [
											    	'0' => [
											    		'option_value_id' => '',
			                    						'option_value_description' => [
			                    							'1' => [
			                    								'name' => $option['value'],
			                    							],
			                    						],
			                    						'image' => '',
			                    						'sort_order' => '',
											    	],
											    ],
											];
											$option_id_oc = $this->model_catalog_option->addOption($data_option);
											$this->model_extension_module_ms->setSyncOption($option_id_oc, $option['name']);	
										} else {
											$option_values_oc = $this->model_catalog_option->getOptionValues($option_oc[0]['option_id']);
											$option_value = [];

											$find = false;

											foreach ($option_values_oc as $option_values) {

												$option_value[] = [
													'option_value_id' => $option_values['option_value_id'],
			                						'option_value_description' => [
			                							'1' => [
			                								'name' => $option_values['name'],
			                							],
			                						],
			                						'image' => '',
			                						'sort_order' => '',
												];

												if ($option_values['name'] == $option['value']) {
													$find = true;
												}
											}

											if (!$find) {
												$option_value[] = [
													'option_value_id' => '',
			                						'option_value_description' => [
			                							'1' => [
			                								'name' => $option['value'],
			                							],
			                						],
			                						'image' => '',
			                						'sort_order' => '',
												];
											}

											$edit_option_data = [
												'option_description' => [
													'1' => [
														'name' => $option['name']
													] 
												],
												'type' => 'select',
									    		'sort_order' => '',
									    		'option_value' => isset($option_value) ? $option_value : [],
											];

											$this->model_catalog_option->editOption($option_oc[0]['option_id'], $edit_option_data);
										}
									}
								}
								//

								// echo "<pre>";
								// print_r(array_unique($product_option_values));
								// echo "</pre>";
								// die();
								if (!empty($product_options)) {//добавляем опции к товарам 

									$product_options = array_unique($product_options);//удаляем повторяющиеся эллементы массива с опциями 

									foreach ($product_options as $key => $option_name) {
										$oc_option_id = $this->model_extension_module_ms->getOptionByName($option_name);
										$oc_option = $this->model_catalog_option->getOption($oc_option_id[0]['option_id']);


										$product_option = [
											'product_option_id' => '',
						                    'name' => $oc_option['name'],
						                    'option_id' => $oc_option['option_id'],
						                    'type' => $oc_option['type'],
						                    'required' => '1',
										];

										//по аналогии с опциями нужно собрать массив значений опций данного товара
										if (!empty($product_option_values)) {
											
											$product_option_values = array_unique($product_option_values);//удаляем повторяющиеся эллементы массива
											
											foreach ($product_option_values as $value) {//перебираем значения модификации данного товара
												$product_option_values_oc = $this->model_catalog_option->getOptionValues($oc_option_id[0]['option_id']);//получаем значения данной опции из опенкарт
												foreach ($product_option_values_oc as $values) {//перебираем значения опций опенкарт 
													if ($values['name'] == $value) {//если значение опции опенкарт == значению модификации мойсклад -> добавляем значение этой опции к товару
														$product_option['product_option_value'][] = [
															'option_value_id' => $values['option_value_id'],
						                                    'product_option_value_id' => '',
						                                    'quantity' => '',
						                                    'subtract' => 0,
						                                    'price_prefix' => '+',
						                                    'price' => '',
						                                    'points_prefix' => '+',
						                                    'points' => '',
						                                    'weight_prefix' => '+',
						                                    'weight' => '',
														];
													}
												}
											}
										}
										$product_option_arr[] = $product_option; 
									}
								}
							}
							// echo "<pre>";
							// print_r($product_option_arr);	
							// echo "</pre>";
							// print_r("END------------------");
						}
					}
					//

					$product_data = [
						'product_description' => [
							'1' => [
								'name' => $name,
			                    'description' => $description,
			                    'meta_title' => $name,
			                    'meta_h1' => $name,
			                    'meta_description' => $name,
			                    'meta_keyword' => $name,
			                    'tag' => $name
							]
						],
						'model' => $model,
						'sku' => $sku,
						'upc' => '',
					    'ean' => '',
					    'jan' => '',
					    'isbn' => '',
					    'mpn' => '',
						'image' => $image,
						'keyword' => '',
						'length' => '',
		    			'width'=> '',
		    			'height' => '',
					    'status' => 1,
					    'price' => isset($price) ? $price : 1,
					    'tax_class_id' => 0,
					    'minimum' => 1,
					    'shipping' => 1,
					    'product_store' => [
					    	'0' => 0
					    ],
					    'quantity' => $quantity,
					    'subtract' => 1,
					    'manufacturer_id' => 0,
					    'sort_order' => 1,
					    'weight_class_id' => 1,
					    'weight' => '',
					    'length_class_id' => 1,
					    'location' => '',
			   		    'product_category' => isset($categories) ? $categories : [],
					    'stock_status_id' => ($quantity == 0) ? 5 : 7,
					    'date_available' => date('Y-m-d', time()),
					    'points' => '',
					    'main_category_id' => isset($main_category_id) ? $main_category_id[0]['category_id'] : '',
					];

					if (isset($product_option_arr)) {
						$product_data['product_option'] = $product_option_arr;
					}

					$product_id = $this->model_catalog_product->addProduct($product_data);

					unset($data_category);
					unset($categories);
					unset($main_category_id);
					unset($product_option_arr);

					$this->model_extension_module_ms->syncProducts($product_id, $product['id']);
				}

			}


			//удалить товары 
			if (!empty($ms_product_ids)) {
				foreach ($ms_product_ids as $id) {
					$product_oc_id = $this->model_extension_module_ms->getProductIdByMSId($id['ms_product_id']);
					$this->model_catalog_product->deleteProduct($product_oc_id);
					// $this->model_extension_module_ms->deleteProductId($product_oc_id);

				}
			}
			//удалить категории
			if (!empty($ms_category_ids)) {
				foreach ($ms_category_ids as $cat_id) {
					$this->model_catalog_category->deleteCategory($cat_id['category_id']);
					// $this->model_extension_module_ms->deleteCategoryId($cat_id['category_id']);

				}
			}

			if ($this->error) {//return json errors
				$json['errors'] = $this->error;
			}
			
			// sleep(10); 
			$this->response->addHeader('Content-Type: application/json');
			$this->response->setOutput(json_encode($json));
			// $this->response->redirect($this->url->link('catalog/product','&token=' . $this->session->data['token'], 'SSL'));
		} else {

//			$this->session->data['license_error'] = $this->language->get('license_error');
//		    $data['license_error'] = $this->session->data['license_error'];
		    
			$this->response->redirect($this->url->link('extension/extension', '&token=' . $this->session->data['token'], 'SSL'));
		}
	}

	//function for send SMS customers who didn`t have orders last 30 days 
	public function sendSMS() {
		$this->load->language('extension/module/ms');
		$request_data = [
			'host' => $_SERVER['HTTP_HOST'],
			'secret' => 'zerrnoco'
		];

		if (true) {
			$this->load->model('extension/module/ms');
			$this->load->model('customer/customer');

			$customers_id = $this->model_extension_module_ms->getCustomerIds();


			if (!empty($customers_id)) {
				//send msg SMSint
				$sms_login = $this->config->get('ms_sms_login');
				$sms_password = $this->config->get('ms_sms_password');

				$smsint = new Transport($sms_login, $sms_password);
				
				foreach ($customers_id as $customer) {
					$customer_info = $this->model_customer_customer->getCustomer($customer['customer_id']);
					// echo '<pre>';
					// print_r($customer_info);
					// echo '</pre>';
					// die();
					if (!empty($customer_info)) {
						if ($customer_info['sms_status'] == 0) {
							$sms_text = $this->config->get('ms_sms_tpl_30');
							
							$customer_telephone = str_replace(array('+', ' ', '(' , ')', '-'), '', $customer_info['telephone']);
							$customer_email = $customer_info['email'];
							//replace values
							$replace = [
								'{$name}' => isset($customer_name) ? $customer_name : '',
								'{$email}' => isset($customer_email) ? $customer_email : '',
							];
							// 

							$sms_text = strtr($sms_text, $replace);

							$params = [
								'text' => $sms_text,
								'source' => 'PikFormy',
								'action' => 'check'
							];

							$phones = [strval($customer_telephone)];

							$send = $smsint->send($params, $phones);
							
							echo "<pre>";
							print_r($send);
							echo "</pre>";

							if ($send['code'] == 1) {
								$status = 1;
								$this->model_extension_module_ms->changeSmsStatus($customer['customer_id'], $status);
							} 
						} elseif ($customer_info['sms_status'] == 1) {
							$diff = (time() - strtotime($customer_info['date_update_status'], time()))/(60 * 60 * 24);//(*24)

							if ($diff >= 30) {
								$this->model_extension_module_ms->changeSmsStatus($customer['customer_id'], 0);
							}
						}
					}
				}
			}
		} else {
//			$this->session->data['license_error'] = $this->language->get('license_error');
//		    $data['license_error'] = $this->session->data['license_error'];
		    
			$this->response->redirect($this->url->link('extension/extension', '&token=' . $this->session->data['token'], 'SSL'));
		}
	}
}

 

Share this post


Link to post
Share on other sites
Posted (edited)

Приветствую

Модуль установился, но в разделе Дополнения когда нажимаешь Установить вылезает ошибка

Parse error: syntax error, unexpected '$this' (T_VARIABLE) in /var/www/u0554028/data/www/hikari-cosmetics.ru/admin/controller/extension/module/ms.php on line 6

 

Как решить это?

Версия ocStore 2.3.0.2.3

Edited by mikkymike

Share this post


Link to post
Share on other sites

Fatal error: Can't use method return value in write context in /var/www/u0554028/data/www/hikari-cosmetics.ru/admin/controller/extension/module/ms.php on line 35

 

При установке вылезает вот такая ошибка. Что это?

Share this post


Link to post
Share on other sites

Модуль рабочий, однако есть проблема с загрузкой модификаций товаров - не подгружает цены модификаций

Share this post


Link to post
Share on other sites

Кому интересно, можете почитать вот эту статью:

https://weburoki.pro/opencart-moysklad

она как раз про это, и показываеться как исправить несколько ошибок (которые занимают очень много времени если про них не знать)

Share this post


Link to post
Share on other sites

Скажите, а поддерживает ли синхронизацию нескольких складов? 

В мойСкладе сейчас несколько - по разным магазинам. Вот хотим свести в один опенкартовский мультимагазин, или мультирегион с разными складами, соответственно и остатки - цены хотелось бы с соответствующими синхронизировать.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By Rainier
      Здравствуйте!
      Из-за специфичной структуры в которой все категории магазина вложены в единую родительскую МАГАЗИН,  имеются проблемы с отображением: http://new.invalidnye-koljaski.ru/ Для удобства хочу поставить ссылку на родительскую категорию МАГАЗИН вместо стандартной "Список категорий" в главном меню, чтобы она также открывалась при наведении. Т.е. при наведении курсора отображалось выплывающее меню с содержимым категории МАГАЗИН
       
      Как правильнее всего это реализовать? Посоветуйте, пожалуйста
    • By zeon1983
      ТЗ  во вложении.  Вкратце -
      Нужно создать три документа с соотвествующими кнопками, которые формируются из заказа:
      1) Коммерческое предложение;
      2) Спецификация;
      3) Доверенность.
       Надо знать цену и сроки выполнения для сотрудничества?
      Техническое задание.docx
    • By Sunser
      300.00 руб
      Скачать/Купить дополнение


      Sunser Callback - форма обратной связи
      Sunser Callback - форма обратной связи, расширение созданное для Opencart и ocStore.

      Расширение подходит и тестировалось на версиях Opencart 2.0, 2.1, 2.2 и 2.3.
      Так же подойдет для OpencartPro версии 2.0, 2.1, 2.2 и 2.3

      Расширение подходит и тестировалось на версиях ocStore 2.1 и 2.3, не тестировалось с версией 2.2
      -- Расширение легкое в установке. Просто в своей админке загрузите файл который вы скачали для своей версии через менеджер дополнений, после чего обновите модификатор.
      Как на самом сайте вызвать форму при нажатии?
      После установки расширения, просто в ту кнопку, ссылку, тег, где вам нужно что бы при нажатии вызывалась форма, вставте этот код - onclick="sunserCallback(event)"
      После чего при нажатии будет вызывать форма.
      Расширение сделано так что бы не грузить сайт, не добавлять свои js файлы в header.
      Расширение имеет свой шаблон для отправки писем. Если вы верстальщик или разработчик, то вы можете менять стиль писем.
      Если вы не разработчик и хотите изменить письмо, то вы можете написать на почту, которая указано ниже для доработки письма, за небольшую плату.
      Так же если вы разработчик или верстальщик, вы можете легко менять стиль всплывающей формы
       
      -- Расширение поддерживает мультиязычность и имеет свой шаблон отправки писем. То есть если сайт на английском, то уведомление на почту придет на английском, если на русском, уведомление на почту придет на русском.
      Проблемы и решения после установки:
      -- Приложение установлено, все поля заполнены. Но при нажатии отправить, ничего не происходит.
      В таком случае, первое, это проверьте чтобы в настройках почты были заполненные поля тема письма, заголовок и кому отправлять.
      -- Настроил все и нажал сохранить, после чего при нажатии кнопки форма не вызывается.
      В таком случае проверте что сам модуль включен в настройках.
      И если это не помогает, то проблемы могут быть в самом модификаторе. Он не находит тех путей что в нем указано, поскольку вы что-то меняли в контролерах своего сайта.
       
      Если вы замечаете баги по форме, пишите автору и в ближайшие время проблема исправится и зальется свежая версия, после чего вы сможете скачать и обновить модуль
      Если вы установили модуль, настроили и модуль не работает и сделали и переделали все, что указано выше при проблемах установки, то пишите автору.
       
      Добавил Sunser Добавлено 28.07.2019 Категория Обратная связь, звонки Системные требования Сайт разработчика Старая цена Метод активации Без активации Ioncube Loader Нет OpenCart 2.3
      2.2
      2.1
      2.0 ocStore 2.3
      2.1 OpenCart.Pro, ocShop Opencart.pro 2.3
      Opencart.pro 2.1 Обращение к серверу разработчика Нет  
    • By Sunser
      300.00 руб
      Скачать/Купить дополнение


      Sunser map - кастомная карта для сайта
      Sunser map - кастомная карта для сайта.
       
      Модуль Sunser map создан для удобного управления с админ панели и вывода на сайт карты гугл. Модуль Легкий в установке и Управлении.
      Модуль поддерживает мультиязычность и почти полностью управляется с админки.
      Модуль подходит и тестировался для Opencart v: 2.0, 2.1, 2.2, 2.3
      OpencartPro v: 2.1 и 2.3
      Модуль подходит и тестировался для ocStore 2.1 и 2.3
       
      Инструкция по установке модуля:
       - Для установки модуля, загрузите ocmod.zip той версии opencart или ocstore которая у вас в админке через установщик модулей, после чего обновите модификаторы.
      Модуль лежит по пути модули(расширения)/Sunser map.
      Второй способ, распакуйте ocmod.zip той версии что вам нужно и скиньте в корень вашего сайта.
      Инструкция, как настроить:
       - Активируйте модуль, после чего перейдите в настройку модуля;
       - Первое поле, это название модуля, это название отображается только в вашей админке;
       - Заголовок, поле отображаемое на сайте, сверху карты, если поле не заполнить, то на сайте заголовок не выведется, так же выводится во всплывающем окне при наведении на маркер;
       - Координаты x, y - здесь введите координаты долготы и широты вашего местоположения;
       - Расстояние карты - здесь введите значение, насколько вы хотите что бы на карте была приближена ваша карта;
       - Описание окна - тут пишите что угодно, оно будет выводится при наведение на маркер карты, если оставить пустым, всплывушка на маркере не будет выводится;
       - Стили для карты, здесь по стандарту уже прописаны основные стили для карты. Если не прописать стили или оставить пустым, карта будет не корректно выводится, поскольку изначально надо прописать ширину и высоту для карты. Так же, если вы разбираете в css, то можете прописывать тут стили для других элементов карты;
       - Api карты - здесь нужно ввести api карты, от google. Если не прописать ключ или если ключ будет не корректен, то карта не будет работать;
       - Маркер, тут можно задавать свою картинку для маркера, если оставить пустым, то будет выводится стандартный маркер гугл;
       - Статус, отвечает, будет ли работать и отображается на сайте или нет;
       - После сохранения, перейдите в макеты и выберите место для вывода модуля.
       
      Проблемы и решения:
       - Установил модуль, настроил, но на сайте не отображается. Первое, это не правильно прописаны стили в модуле;
       - Некорректно прописан api ключ или является не действителен;
       - Установил модуль, но языки не корректно отображается. В таком случае бывает, когда языки в папке language в модуле не совпадают с языками в папке language вашей админки.
       
      Если другая какая ошибка, пишите автору и он поможет в решении данной проблемы.
      Добавил Sunser Добавлено 01.08.2019 Категория Модули Системные требования Сайт разработчика Старая цена Метод активации Без активации Ioncube Loader Нет OpenCart 2.3
      2.2
      2.1
      2.0 ocStore 2.3
      2.1 OpenCart.Pro, ocShop Opencart.pro 2.3
      Opencart.pro 2.1 Обращение к серверу разработчика Нет  
    • By Sunser
      Sunser map - кастомная карта для сайта.
       
      Модуль Sunser map создан для удобного управления с админ панели и вывода на сайт карты гугл. Модуль Легкий в установке и Управлении.
      Модуль поддерживает мультиязычность и почти полностью управляется с админки.
      Модуль подходит и тестировался для Opencart v: 2.0, 2.1, 2.2, 2.3
      OpencartPro v: 2.1 и 2.3
      Модуль подходит и тестировался для ocStore 2.1 и 2.3
       
      Инструкция по установке модуля:
       - Для установки модуля, загрузите ocmod.zip той версии opencart или ocstore которая у вас в админке через установщик модулей, после чего обновите модификаторы.
      Модуль лежит по пути модули(расширения)/Sunser map.
      Второй способ, распакуйте ocmod.zip той версии что вам нужно и скиньте в корень вашего сайта.
      Инструкция, как настроить:
       - Активируйте модуль, после чего перейдите в настройку модуля;
       - Первое поле, это название модуля, это название отображается только в вашей админке;
       - Заголовок, поле отображаемое на сайте, сверху карты, если поле не заполнить, то на сайте заголовок не выведется, так же выводится во всплывающем окне при наведении на маркер;
       - Координаты x, y - здесь введите координаты долготы и широты вашего местоположения;
       - Расстояние карты - здесь введите значение, насколько вы хотите что бы на карте была приближена ваша карта;
       - Описание окна - тут пишите что угодно, оно будет выводится при наведение на маркер карты, если оставить пустым, всплывушка на маркере не будет выводится;
       - Стили для карты, здесь по стандарту уже прописаны основные стили для карты. Если не прописать стили или оставить пустым, карта будет не корректно выводится, поскольку изначально надо прописать ширину и высоту для карты. Так же, если вы разбираете в css, то можете прописывать тут стили для других элементов карты;
       - Api карты - здесь нужно ввести api карты, от google. Если не прописать ключ или если ключ будет не корректен, то карта не будет работать;
       - Маркер, тут можно задавать свою картинку для маркера, если оставить пустым, то будет выводится стандартный маркер гугл;
       - Статус, отвечает, будет ли работать и отображается на сайте или нет;
       - После сохранения, перейдите в макеты и выберите место для вывода модуля.
       
      Проблемы и решения:
       - Установил модуль, настроил, но на сайте не отображается. Первое, это не правильно прописаны стили в модуле;
       - Некорректно прописан api ключ или является не действителен;
       - Установил модуль, но языки не корректно отображается. В таком случае бывает, когда языки в папке language в модуле не совпадают с языками в папке language вашей админки.
       
      Если другая какая ошибка, пишите автору и он поможет в решении данной проблемы.
  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.