Commit 6c476a4b by Иван Кубота

fix multiselect when need single bug

parent 20843987
Pipeline #557 failed with stage
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
2. Дает возможность участвовать в акциях: назначать ""Любимый продукт"", покупать товары по ценникам желтого цвета. 2. Дает возможность участвовать в акциях: назначать ""Любимый продукт"", покупать товары по ценникам желтого цвета.
3. Получать дополнительную ежедневную скидку на 6 продуктов, а также пользоваться дополнительными возможностями, подключившись к боту или мобильному приложению. 3. Получать дополнительную ежедневную скидку на 6 продуктов, а также пользоваться дополнительными возможностями, подключившись к боту или мобильному приложению.
", /2/images/cards/1.jpg ", /2/images/cards/1.jpg
4,Преимущества Карты,3,"Если покупатель не является держателем нашей карты, подарите ее бесплатно и расскажите о преимуществах, а также предложите активировать ее на кассе.", 4,Преимущества Карты,2,"Если покупатель не является держателем нашей карты, подарите ее бесплатно и расскажите о преимуществах, а также предложите активировать ее на кассе.",
,Обслуживание клиента на кассе,4,"По стандартам нашей компании клиент на кассе обслуживается по следующему алгоритму: ,Обслуживание клиента на кассе,2,"По стандартам нашей компании клиент на кассе обслуживается по следующему алгоритму:
1. Поприветствуйте покупателя. 1. Поприветствуйте покупателя.
2. Поинтересуйтесь, нужен ли пакет. 2. Поинтересуйтесь, нужен ли пакет.
3. Просканируйте продукты и сложите покупки аккуратно в пакеты. 3. Просканируйте продукты и сложите покупки аккуратно в пакеты.
......
категория,Название,номер карточки,Текст карточки,Картинка
,"Когда основан ""ВкусВилл""?",1,"""ВкусВилл"" — российская розничная сеть супермаркетов, основанная в 2009 году предпринимателем Андреем Кривенко как сеть магазинов под названием ""Избенка"".
С 2012 года помимо (впоследствии и вместо) ""Избенок"", торговавших исключительно молочной продукцией, начали открываться магазины ""ВкусВилл"" с более широким ассортиментом, с фокусом на скоропортящуюся продукцию без консервантов и усилителей вкуса от небольших производителей.", /2/images/cards/1.png
,"Карта ""ВкусВилл""",3,"Карта ""ВкусВилл"" обладает следующими преимуществами:
1. Дарится бесплатно.
2. Дает возможность участвовать в акциях: назначать ""Любимый продукт"", покупать товары по ценникам желтого цвета.
3. Получать дополнительную ежедневную скидку на 6 продуктов, а также пользоваться дополнительными возможностями, подключившись к боту или мобильному приложению.
", /2/images/cards/3.jpg
,Преимущества Карты,3,"Если покупатель не является держателем нашей карты, подарите ее бесплатно и расскажите о преимуществах, а также предложите активировать ее на кассе.", /2/images/cards/3.jpg
,Обслуживание клиента на кассе,4,"По стандартам нашей компании клиент на кассе обслуживается по следующему алгоритму:
1. Поприветствуйте покупателя.
2. Поинтересуйтесь, нужен ли пакет.
3. Просканируйте продукты и сложите покупки аккуратно в пакеты.
4. Спросите про карту магазина.
После прокатки карты озвучьте:
- количество бонусов (от 30 руб.);
- любимый продукт;
- в случае, если ЛП отсутствует, сообщите об этом покупателю и предложите сделать скидку на сегодня на другой продукт из ассортимента магазина.
5. Если ввод карты был по QR-коду, напомните о функции ""Я в магазине"" и предложите ознакомиться с абонементом.
6. Будьте в курсе всех действующих акций в магазине и не забывайте напоминать и рассказывать о них покупателям (желтые, оранжевые ценники, ""Разнообразное питание"", подписка, абонемент).
7. Спросите о методе оплаты: наличный/безналичный расчет.
При наличном методе оплаты озвучьте три суммы вслух:
1) сумма покупки;
2) сумма денег, полученных от покупателя;
3) сумма сдачи.
8. Положите на монетницу сдачу, а сверху — чек. По просьбе покупателя вы можете положить чек в пакет.
9. Поблагодарите за покупку и пригласите посетить магазин снова.", /2/images/cards/4.jpg
,Взвешивание весового товара,4,"Если вам необходимо взвесить весовой товар:
1. Нажмите ""Ноль на весах"".
2. Далее кнопки ""Подбор товара"" и ""Весовой товар"".
3. Выберите товар из сетки.
4. Положите товар на весы.
При необходимости отнимите тару (если лоток прозрачный, на кнопку ""-20гр"" нажимаем 1 раз; если зеленый — ""-20гр"" 2 раза).", /2/images/cards/4.jpg
,Отмена позиции в чеке,4,"Если покупатель хочет отказаться от какой-либо позиции в чеке или вам необходимо полностью отменить чек, обязательно позовите старшего продавца.", /2/images/cards/4.jpg
,Возврат товара,4,Для совершения возврата товара вам необходимо вызвать старшего продавца., /2/images/cards/4.jpg
,Количество бонусов покупателя,4,"Если покупатель хочет увидеть количество бонусов или ЛП без покупки товара, введите карту, озвучьте ЛП и количество бонусов! После этого ОБЯЗАТЕЛЬНО отмените карту, нажав клавишу ""Отмена бонусной карты"".", /2/images/cards/4.jpg
,Любимый продукт,3,"""Любимый продукт"" назначается при совершении покупки свыше 500 руб. за один день или за два дня подряд неразрывно. Назначить ""Любимый продукт"" можно в течение 6 дней.",
,"Изменение ""Любимого продукта""",3,"Менять ""Любимый продукт"" можно ежедневно без ограничений.",
,"Скидка на ""Любимый продукт""",3,"Скидка на ""Любимый продукт"" начинает действовать на следующий день после назначения.",
,"Сколько раз можно купить ""Любимый продукт""",3,"За один раз можно купить неограниченное количество ""Любимого продукта"".",
,"Если ""Любимый продукт"" отсутствует в магазине",4,"Если ""Любимый продукт"" отсутствует в магазине, покупатель может назначить скидку на другой товар только на сегодня.
Выделите товар, на который будет действовать скидка.
Нажмите ""Прочие операции"", далее — ""Любимый продукт на сегодня"" и ""Вернуться в окно регистрации"".", /2/images/cards/4.jpg
,Если товар отсутствует,3,"Если товар отсутствует, но есть на остатках, с разрешения старшего продавца можно заменить ЛП на один день.", /2/images/cards/3.jpg
,"Если ""Любимый продукт"" отсутствует",3,"Если ЛП стоит товар, которого на данный момент уже нет на остатках во всех магазинах ""ВкусВилл"" или он выведен, замена ЛП на один день приведет к его установке на весь срок действия.", /2/images/cards/3.jpg
,После окончания сканирования,4,"После окончания сканирования:
Озвучьте сумму покупки.
Озвучьте сумму, полученную от покупателя.
В поле ввода введите полученную сумму.
Нажмите “Оплата нал”.
Нажмите “Подтвердить оплату”.
Озвучьте сумму сдачи.
Положите сдачу и сверху чек на монетницу.
Поблагодарите покупателя за покупку и пригласите к нам снова.
", /2/images/cards/4.jpg
,После окончания сканирования,4,"После окончания сканирования:
Озвучьте сумму покупки.
Нажмите “ОПЛАТА БАНК”.
На терминале со стороны клиента появится инструкция.
Нажмите “Подтвердить оплату”.
Положите чек на монетницу.
Поблагодарите покупателя за покупку и пригласите к нам снова.
", /2/images/cards/4.jpg
,Какие документы можно предъявить при покупке алкогольной продукции,4,"При продаже алкогольной продукции покупатель может предъявить вам: паспорт РФ, загранпаспорт, временное удостоверение личности гражданина РФ, водительские права, удостоверение личности моряка, служебный паспорт, дипломатический паспорт, военный билет, вид на жительство, разрешение на временное проживание лица без гражданства РФ, удостоверение беженца и свидетельство о предоставлении временного убежища на территории РФ.", /2/images/cards/4.jpg
,Продажа алкогольных продуктов,4,"В соответствии с Федеральным законом, продажа алкогольной продукции разрешена ТОЛЬКО лицам, достигшим 18 лет. За реализацию спиртного несовершеннолетним продавцам, кассирам и лицам, отпускающим товар, может грозить административная и даже уголовная ответственность.", /2/images/cards/4.jpg
,Продажа безалкогольного пива,4,Продажа безалкогольного пива происходит БЕЗ паспорта!, /2/images/cards/4.jpg
,Предложить покупателю пакет,4,"Перед пробитием товара на кассе предложите покупателю пакет. Жалоба покупателя на то, что ему постоянно предлагают пакет, не учитывается, так как предложение пакета на кассе — наш стандарт.", /2/images/cards/4.jpg
,Как избежать двойного пробития,4,"Во избежание двойного пробития на кассе сразу после пробития товара складывайте его в пакет или дальше от кассы, чтобы избежать повторного проведения через сканер.", /2/images/cards/4.jpg
,"Если вернули товар, в котором есть посторонний предмет",4,"Если покупатель принес товар, в котором есть посторонний предмет, ни в коем случае не выбрасывайте такой возврат! Товар оформляется старшим продавцом и отдается курьеру, который специально за ним приезжает! ", /2/images/cards/4.jpg
,Цветные ценники,2,"В магазинах есть 4 вида цветных ценников:
Желтый ценник — сниженная цена по карте магазина.
Оранжевый ценник — сниженная цена при покупке от 2-х или 3-х одинаковых наименований, наличие карты не имеет значения.
Зеленый ценник — скидка 40% на товар с подходящим сроком реализации.
Синий — новинка.", /2/images/cards/2.png
,Наши ценности,2,"Наши ценности: честность, доверие, ответственность, хорошие взаимоотношения и взаимопомощь.", /2/images/cards/2.png
,Наш девиз,2,"Наш девиз: зарплату нам платит не начальник, а довольные покупатели!", /2/images/cards/2.png
,Каждый сотрудник нашего магазин обещает,2,"Каждый сотрудник нашего магазина обещает:
1) Что на полках не будет просроченных продуктов! Как только в магазине окажется три разных срока годности одного товара, обклеить самый старый зеленым ценником на скидку.
2) Никогда не проявлять грубость, непрофессионализм, чёрствость.
3) Ни в коем случае не обсуждать покупателей в магазине.
4) В случае выбора между двумя рабочими задачами всегда выбирать ту, которая важнее для покупателей, находящихся в магазине.", /2/images/cards/2.png
,Всем коллективом мы обещаем,2,"Всем коллективом мы обещаем:
1) Совершать покупку удобно и приятно: хорошая выкладка, легко найти товар, актуальные ценники, а коробки не мешают, в магазине чисто и соблюдены санитарные нормы.
2) Очередь более двух покупателей, только если все кассы в магазине обслуживают других покупателей.
3) Если видим, что появилась очередь, а хотя бы одна касса пустует, то встанем на нее сами или позовем коллегу на помощь.", /2/images/cards/2.png
,Мы НЕ обещаем покупателям,2,"Мы НЕ обещаем покупателям:
1) Пускать их в магазин с животными и создавать места для привязи рядом с магазином, кроме служебных собак, собак-поводырей, которых отличает жёсткая шлейка.
2) Что будем продавать алкоголь без предъявления документа.
3) Поставлять в магазин товар определённого производителя.", /2/images/cards/2.png
,"3 основных правила проекта ""Закажи и Забери""",2,"3 основных правила проекта ""Закажи и забери"":
1. При сборе заказа покупателю смотрите производителя по заказанному товару и соберите именно то, что написано в заказе.
2. Сформируйте заказ к открытию магазина, выбирая самые свежие сроки.
3. Поддерживайте обратную связь с покупателем.", /2/images/cards/2.png
,Если покупатель хочет оставить отзыв или претензию,2,"Если покупатель хочет оставить отзыв или предложение, он может воспользоваться следующими формами связи:
Горячая линия: +7 (495) 66-38-60
Приложение или Телеграм-бот
Сайт: https://vkusvill.ru
Почта: info@izbenka.msk.ru
Социальные сети:
Vk: https://vk.com/vkusvill_ru
Facebook: https://www.facebook.com/vkusvill.ru/
Twitter: https://twitter.com/we_are_vkusvill
Instagram: https://www.instagram.com/izbenka_vkusvill/
Отзовик", /2/images/cards/2.png
\ No newline at end of file
...@@ -445,12 +445,13 @@ data = {tags:[], connections:[], more:[], standardQuestions: {}, standardAnswers ...@@ -445,12 +445,13 @@ data = {tags:[], connections:[], more:[], standardQuestions: {}, standardAnswers
var tagsHash = {}; var tagsHash = {};
data.more = data.more.concat([ data.more = data.more.concat([
{p: '1cards.csv', i: '1components.csv'}, {p: '1cards.csv', i: '1components.csv'},
{q: '2questions.csv', a: '2answers.csv', c: '2cards.csv'}, {q: '2questions.csv', a: '2answers.csv', c: '2cards_2020_2_21.csv'},
{q: '3questions.csv', a: '3answers.csv', c: '3cards.csv'}, {q: '3questions.csv', a: '3answers.csv', c: '3cards.csv'},
{q: '4questions.csv', a: '4answers.csv', c: '4cards.csv'} {q: '4questions.csv', a: '4answers.csv', c: '4cards.csv'}
]); ]);
let id = 1; let id = 1;
let theInc = ()=>id++; let theInc = ()=>id++;
let was = {};
if(data.more){ if(data.more){
for( let i = 0, _i = data.more.length; i < _i; i++ ){ for( let i = 0, _i = data.more.length; i < _i; i++ ){
var adishen = i*300; var adishen = i*300;
...@@ -557,7 +558,14 @@ data = {tags:[], connections:[], more:[], standardQuestions: {}, standardAnswers ...@@ -557,7 +558,14 @@ data = {tags:[], connections:[], more:[], standardQuestions: {}, standardAnswers
description: a.description, description: a.description,
image: a.image image: a.image
}]; }];
data.products[a.iID] = a; //debugger
if(a.id in was){
was[a.id].items.push(a.items[0]);
}else{
was[a.id] = a;
data.products[ a.iID ] = a;
}
}, },
index: 'id' index: 'id'
}) })
......
...@@ -74,7 +74,7 @@ const qB = { ...@@ -74,7 +74,7 @@ const qB = {
similarClusters = Object.keys(similarTags) similarClusters = Object.keys(similarTags)
.map(k=>({k, v:similarTags[k]})) .map(k=>({k, v:similarTags[k]}))
.filter( a => a.v.length >= minAmount); .filter( a => a.v.length >= minAmount && a.v.filter(av=>av.use).length>0);
log.push(`Clusters that have >= ${minSimilarTags} similar tags: `+Object.values(similarClusters).length); log.push(`Clusters that have >= ${minSimilarTags} similar tags: `+Object.values(similarClusters).length);
...@@ -89,7 +89,7 @@ const qB = { ...@@ -89,7 +89,7 @@ const qB = {
let result; let result;
if(single){ if(single){
result = rand(filtered); result = rand(filtered.filter(p=>p.use));
log.push('Matched product: '+result.title); log.push('Matched product: '+result.title);
}else{ }else{
...@@ -98,9 +98,13 @@ const qB = { ...@@ -98,9 +98,13 @@ const qB = {
return false; return false;
} }
result = shuffle(filtered).slice(0, doNotTrim?filtered.length:rand(minAmount, maxAmount)); let used = rand(filtered.filter(p=>p.use)),
other = filtered.slice();
other.splice(other.indexOf(used));
result = shuffle([used].concat(other).slice(0, doNotTrim? filtered.length: rand(minAmount, maxAmount)));
log.push('Base products:'); log.push('Base products:');
result.forEach(p => log.push(` > ${p.title}`)) result.forEach(p => log.push(` > ${p.title}`));
log.push(''); log.push('');
} }
...@@ -247,6 +251,8 @@ const qB = { ...@@ -247,6 +251,8 @@ const qB = {
} }
const possibility = products.map(p=>{ const possibility = products.map(p=>{
if(!p.use)
return false;
const similar = qB.getProductsWithTags({ const similar = qB.getProductsWithTags({
products: allProducts, products: allProducts,
tags: p.getTags(), tags: p.getTags(),
...@@ -292,6 +298,8 @@ const qB = { ...@@ -292,6 +298,8 @@ const qB = {
const product = products[ i ]; const product = products[ i ];
/* if(this.withPhoto && !product.image) /* if(this.withPhoto && !product.image)
continue;*/ continue;*/
if(!product.use)
continue;
const cmps = product const cmps = product
.getComponents() .getComponents()
.filter(cmp => products.filter(p=>p.containsComponent(cmp)).length === 1) .filter(cmp => products.filter(p=>p.containsComponent(cmp)).length === 1)
......
...@@ -94,12 +94,14 @@ const quizGenerator = function(type, photo, subType) { ...@@ -94,12 +94,14 @@ const quizGenerator = function(type, photo, subType) {
if(subType === void 0){ if(subType === void 0){
log = quizGenerator.log = [ 'Random seed: ' + initialSeed, 'Quiz generate ' + type + ( photo ? ' with photo' : '' ) + ' ' + ( subType ? `${lapk( subType.type )}` : '. FAIL' ) ]; log = quizGenerator.log = [ 'Random seed: ' + initialSeed, 'Quiz generate ' + type + ( photo ? ' with photo' : '' ) + ' ' + ( subType ? `${lapk( subType.type )}` : '. FAIL' ) ];
photo = true; photo = true;
type='radio';
subType = probabilityRand(quizTypes[ 'radio' + ( photo ? 'Photo' : '' ) ]); subType = probabilityRand(quizTypes[ 'radio' + ( photo ? 'Photo' : '' ) ]);
log = quizGenerator.log = [ 'Change type to radioPhoto' ]; log = quizGenerator.log = [ 'Change type to radioPhoto' ];
}else{ }else{
log = quizGenerator.log = [ 'Random seed: ' + initialSeed, 'Quiz generate ' + type + ( photo ? ' with photo' : '' ) + ' ' + ( subType ? `${lapk( subType.type )}` : '. FAIL' ) ]; log = quizGenerator.log = [ 'Random seed: ' + initialSeed, 'Quiz generate ' + type + ( photo ? ' with photo' : '' ) + ' ' + ( subType ? `${lapk( subType.type )}` : '. FAIL' ) ];
} }
}else if(attempt<30){ }else if(attempt<60){
log = quizGenerator.log; log = quizGenerator.log;
log.push('\nATTEMPT FAILED!\n\n'+ log.push('\nATTEMPT FAILED!\n\n'+
'------------------------\n' + '------------------------\n' +
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment