Перейти к содержанию
Официальный форум поддержки Simpla

6cnitymi

Пользователь
  • Публикаций

    9
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные 6cnitymi

  1. Приветствую, друзья!
    На форуме уже присутствует старая тема "Объединение товаров в варианты":

    На днях столкнулся с аналогичной проблемой, в связи с чем и отправился на поиски решения, найдя эту тему.
    В моём случае, решение оказалось муторным и не совсем удобным, т.к. каждое объединение необходимо вручную исправлять, потому решил его немного расширить, может кому-то тоже понадобится.
    Собственно, к сути - при выборе нескольких товаров, с одним, по сути, названием (например, "Термос Супер (Black)",  "Термос Супер (White)",  "Термос Супер (Yellow)"),
    при объединении, мы получим товар "Термос Супер" и три варианта - BlackWhite и Yellow.
    Понимаю, что формат выгрузки прайсов у кого-то может быть специфическим, но по моему опыту, чаще всего это именно вид "Категория Производитель Модель (Модификация)".

    Само решение:
    1. В ProductsAdmin добавляем новую функцию (перед последней закрывающей фигурной скобкой):

    	function longest_common_substring($words)
    	{
    	  $words = array_map('strtolower', array_map('trim', $words));
    	  $sort_by_strlen = create_function('$a, $b', 'if (strlen($a) == strlen($b)) { return strcmp($a, $b); } return (strlen($a) < strlen($b)) ? -1 : 1;');
    	  usort($words, $sort_by_strlen);
    	  $longest_common_substring = array();
    	  $shortest_string = str_split(array_shift($words));
    	  while (sizeof($shortest_string)) {
    		array_unshift($longest_common_substring, '');
    		foreach ($shortest_string as $ci => $char) {
    		  foreach ($words as $wi => $word) {
    			if (!strstr($word, $longest_common_substring[0] . $char)) {
    			  break 2;
    			} 
    		  }
    		  $longest_common_substring[0].= $char;
    		}
    		array_shift($shortest_string);
    	  }
    	  usort($longest_common_substring, $sort_by_strlen);
    	  return array_pop($longest_common_substring);
    	}

    2. Немного меняем механику в блоке "combine":

    				case 'combine':
    				{
    					$combine_id = $ids[0];
    
    					$parent_name = array();
    					$sub_variants = $this->variants->get_variants(array('product_id'=>$ids));
    					foreach ($sub_variants as $variant) 
    					{    
    						$native_product = $this->products->get_product((int)$variant->product_id);
    						array_push($parent_name, $native_product->name);
    					}
    					$honor_name = $this->longest_common_substring($parent_name);
    
    					foreach ($sub_variants as $variant) 
    					{    
    						$native_product = $this->products->get_product((int)$variant->product_id);
    	
    						$variant->product_id = $combine_id;
    						$n = $native_product->name;
    						$n = str_ireplace($honor_name, '', $n);
    						$n = str_ireplace(')', '', $n);
    						
    						if (empty($variant->name)) $variant->name = $n;
    						unset($variant->infinity);
    
    
    						$this->variants->update_variant($variant->id, $variant);
    						if (is_object($native_product) && ($native_product->id != $combine_id)) 
    						{   $products_to_delete[]  = $native_product;
    							
    						}
    					}
    					foreach ($products_to_delete as $p) {
    						$this->products->delete_product((int)$p->id);}
    
    					$this->products->update_product($combine_id, array('name'=>rtrim($honor_name," (")));
    					break;
    				}

    Собственно, на этом все изменения. Код можно оптимизировать, например, убрав два цикла перебора вариантов в один, и тд
    Из явных минусов только один - родительский товар теряет регистр, вместо "Термос Супер Пупер М-1 (Black)" мы получаем "Термос супер пупер м-1", но это мелочи, не влияющие на работу.
    Надеюсь, решение кому-нибудь окажется полезным.

  2. Добрый день, давно стояла необходимость в учете остатков и себестоимости товара.
    Решил попробовать реализовать в самой симпле. По аналогии с заказами и продажами (таблица с перечнем товаров заказа), создал еще две таблицы- поставки и закупки (перечень товаров в поставке). Механику и api реализовал по аналогии с продажами (Orders). В админке сделал отдельное окно для поставок. Так же, добавил таблицу для складов, и в таблицы поставок и заказов добавил столбец warehouse_id, для контроля склада.
    всё работает хорошо - поставки сохраняются в поставки, заказы клиентов в заказы клиентов.
    Задумка в следующем - реализовать механику,подобную сервису МойСклад: что бы остатки и себестоимость товара просчитывались и выводились динамически, а не хранились в базе данных.

    Набросал код запроса:

    SELECT DATE, amount, price, order_id, stock - amount AS stock from (select DATE, product, variant, amount, price, order_id,
        (case when product=@prod then @costnew:=(case when amount>0 then (@costnew*@ost+amount*price)/(@stock+amount) 
                                                                  else @costnew end)
                                else @costnew:=price END) costnew,
        (case when product=@prod then @stock:=@stock+amount else @stock:=amount END) stock,
        @prod:=product
      FROM ((SELECT pu.product_id AS product, pu.variant_id AS variant, pu.amount AS amount, pu.price AS price, pr.date, pr.warehouse_id, 0 AS order_id FROM s_purchases AS pu LEFT JOIN s_procurements AS pr ON pr.id=pu.order_id WHERE pr.date<(SELECT DATE FROM s_orders WHERE id=3)) 
      UNION (SELECT s.product_id AS product, s.variant_id AS variant, -s.amount AS amount, s.price AS price, o.date, o.warehouse_id, order_id FROM s_sales AS s LEFT JOIN s_orders AS o ON o.id=s.order_id WHERE o.date<=(SELECT DATE FROM s_orders WHERE id=3))) dat,(select @prod:=0, @stock:=0, @costnew:=0.0) u
      order by product,DATE) d
    
      ORDER BY DATE DESC LIMIT 10

    Логика запроса - соединить таблицу закупок товаров и таблицу продаж товаров, и на основе этой общей таблицы получить остаток и себестоимость товара в заказе на конкретную дату (дату заказа).
    Хотелось бы услышать мнение местных профессионалов - на сколько это хорошее решение, и не аукнится ли оно мне со временем/ростом количества заказов? Если же решение не из лучших, быть может кто-то сможет предложить более грамотное решение?
    И, да, я понимаю, что симпла это CMS, и может не совсем рационально пихать в нее CRM и WMS механики, но почему бы и нет? Система простая, открытая, а иметь  все под рукой было бы идеально.
    Заранее, спасибо!

  3. Добрый день!
    Пытаюсь сделать ограничение для скидки, т.к. она может суммироваться исходя из разных аспектов (скидка пользователя, скидка от суммы, скидка по купону и тд), может выходить так, что скидка на заказ будет больше допустимой (цена с учетом скидки будет ниже чем себестоимость товара).
    Добавил  к товарам в БД и в симплу поле с себестоимостью товара. Хотелось бы при работе с корзиной\заказом, суммировать стоимость и себестоимость товаров, и исходя из этих значений просчитывать максимальную скидку, которая может быть.

    Например, есть товар с себестоимостью 600р, и розницей 1000р и клиент со скидкой 20%. Соответственно скидка максимальная может быть лишь 40%.
    Клиент добавил его в корзину, перешёл на страницу оформления заказа, видит - заказ на 1000р, со скидкой 200р, итоговая цена 800р. 20%
    Клиент выставил количество в 20 штук, ему добавилась скидка от суммы, 10% - заказ на 1000р, со скидкой 300р, итоговая цена 700р. 30%
    Ввел купон на скидку в 15%, ему выставилась еще скидка 10% - заказ на 1000р, со скидкой 400р, итоговая цена 600р. 40% (5% получается просто не учитываются)
    Клиент добавил низкомаржинальный товар, потолок скидки еще упал, например, до 35%, или наоборот, вырос до 45% и тд

    Подскажите, в сторону каких файлов копать?
    View вроде отвечает только за сохранение этого всего и внесения в базу. Можно и на этом уровне, конечно, понижать скидку, но это некрасиво - клиент оформляет заказ, там скидка 50%, нажимает Оформить - открывается оформленный заказ а в нем уже скидка 30%. 

  4. Коллеги, столкнулся с необходимостью синхронизации товаров между сайтом и самописной программой учета. 
    Самым доступным вариантом посчитал штатный импорт из csv - программа учета выгружает прайс со всей информацией о товарах в файл export.csv, в ручном режиме сайт данный файл полностью принимает и успешно импортирует.
    Задача показалась простой - создал в корне сайта папку rest, туда скопировал файл import.php (ajax'овский) из админки, туда же по FTP выгружаю export.csv, и через CURL вызываю http://сайт/rest/import.php.
    В import.php переписал все пути, убрал проверки прав, файл export.csv он видит, читает, но товары не импортирует. В ответе выдаёт {"end":false,"from":50035,"totalsize":102471,"items":0}
    Подскажите, где я допустил ошибку?
    Файл import.php
    Файл export.csv

×
×
  • Создать...