Commit 2ea85a78 by Иван Кубота

manual importer. +use real database for generation

parent 98907d9e
Pipeline #565 failed with stage
...@@ -2,35 +2,35 @@ ...@@ -2,35 +2,35 @@
2,1,"С какого года на рынке компания ""Избёнка""?",1,нет,текст,текст 2,1,"С какого года на рынке компания ""Избёнка""?",1,нет,текст,текст
2,2,"В каком году открылся первый магазин ""ВкусВилл""",1,нет,текст,текст 2,2,"В каком году открылся первый магазин ""ВкусВилл""",1,нет,текст,текст
2,3,"Кто основатель проекта ""ВкусВилл""",1,нет,текст,текст 2,3,"Кто основатель проекта ""ВкусВилл""",1,нет,текст,текст
2,4,Где покупатель может оставить отзыв или предложение?,31,да,текст,текст 2,4,Где покупатель может оставить отзыв или предложение?,2,да,текст,текст
2,5,Каковы преимущества карты во ВкусВилл?,2,да,текст,текст 2,5,Каковы преимущества карты во ВкусВилл?,3,да,текст,текст
2,6,Покупатель не является держателем карты. Ваши действия?,3,нет,текст,текст 2,6,Покупатель не является держателем карты. Ваши действия?,3,нет,текст,текст
2,7,Что необходимо сообщить клиенту после прокатки карты на кассе,4,да,текст,текст 2,7,Что необходимо сообщить клиенту после прокатки карты на кассе,4,да,текст,текст
2,8,"Если клиент расплачивается наличными, что необходимо озвучить на кассе?",4,да,текст,текст 2,8,"Если клиент расплачивается наличными, что необходимо озвучить на кассе?",4,да,текст,текст
2,9,Как правильно выдать чек покупателю?,4,нет,текст,текст 2,9,Как правильно выдать чек покупателю?,4,нет,текст,текст
2,10,"Какую клавишу необходимо нажать на кассе после взвешивания, если вы собираетесь пробить 3 яблока, сложенных в зеленый контейнер",5,нет,текст,текст 2,10,"Какую клавишу необходимо нажать на кассе после взвешивания, если вы собираетесь пробить 3 яблока, сложенных в зеленый контейнер",4,нет,текст,текст
2,11,"Какую клавишу необходимо нажать на кассе после взвешивания, если вы собираетесь пробить 3 яблока, сложенных в прозрачный контейнер",5,нет,текст,текст 2,11,"Какую клавишу необходимо нажать на кассе после взвешивания, если вы собираетесь пробить 3 яблока, сложенных в прозрачный контейнер",4,нет,текст,текст
2,12,"Какую клавишу необходимо нажать на кассе в первую очередь, если вы собираетесь пробить 3 яблока, сложенных в пакет",5,нет,текст,текст 2,12,"Какую клавишу необходимо нажать на кассе в первую очередь, если вы собираетесь пробить 3 яблока, сложенных в пакет",4,нет,текст,текст
2,13,Как осуществить отказ от позиции или отмену чека?,6,нет,текст,текст 2,13,Как осуществить отказ от позиции или отмену чека?,4,нет,текст,текст
2,14,Как сделать возврат?,7,нет,текст,текст 2,14,Как сделать возврат?,4,нет,текст,текст
2,15,Каковы условия назначения Любимого продукта?,9,да,текст,текст 2,15,Каковы условия назначения Любимого продукта?,3,да,текст,текст
2,16,Как часто можно менять Любимый продукт ?,10,нет,текст,текст 2,16,Как часто можно менять Любимый продукт ?,3,нет,текст,текст
2,17,Когда начинает действовать скидка на Любимый продукт?,11,нет,текст,текст 2,17,Когда начинает действовать скидка на Любимый продукт?,3,нет,текст,текст
2,18,Какое количество любимого продукта можно купить за 1 раз?,12,нет,текст,текст 2,18,Какое количество любимого продукта можно купить за 1 раз?,3,нет,текст,текст
2,19,"Что делать, если ЛП отсутствует и покупатель хочет назначить скидку на другой товар только на сегодня?",13,нет,текст,текст 2,19,"Что делать, если ЛП отсутствует и покупатель хочет назначить скидку на другой товар только на сегодня?",3,нет,текст,текст
2,20,"Что делать, если ЛП у покупателя отсутствует в зале, но есть на остатках?",14,нет,текст,текст 2,20,"Что делать, если ЛП у покупателя отсутствует в зале, но есть на остатках?",3,нет,текст,текст
2,21,В каком случае замена ЛП на 1 день приведет к его установке на весь срок действия?,15,нет,текст,текст 2,21,В каком случае замена ЛП на 1 день приведет к его установке на весь срок действия?,3,нет,текст,текст
2,22,Какие документы могут считаться удостоверением личности при продаже алкогольной продукции?,18,да,текст,текст 2,22,Какие документы могут считаться удостоверением личности при продаже алкогольной продукции?,4,да,текст,текст
2,23,"Почему необходимо спрашивать документы, при продаже алкогольной продукции",19,нет,текст,текст 2,23,"Почему необходимо спрашивать документы, при продаже алкогольной продукции",4,нет,текст,текст
2,24,Нужно ли спрашивать документы при продаже безалкогольного пива?,20,нет,текст,текст 2,24,Нужно ли спрашивать документы при продаже безалкогольного пива?,4,нет,текст,текст
2,25,Что обязательно перед пробитием товара на кассе?,21,да,текст,текст 2,25,Что обязательно перед пробитием товара на кассе?,4,да,текст,текст
2,26,"Как правильно поступать с возвратом товара, в котором есть посторонний предмет?",23,нет,текст,текст 2,26,"Как правильно поступать с возвратом товара, в котором есть посторонний предмет?",4,нет,текст,текст
2,27,Желтый ценник это-,24,нет,текст,текст 2,27,Желтый ценник это-,2,нет,текст,текст
2,28,Оранжевый ценник это-,24,нет,текст,текст 2,28,Оранжевый ценник это-,2,нет,текст,текст
2,29,Зеленый ценник это-,24,нет,текст,текст 2,29,Зеленый ценник это-,2,нет,текст,текст
2,30,Синий ценник это-,24,нет,текст,текст 2,30,Синий ценник это-,2,нет,текст,текст
2,31,Наши ценности,25,нет,текст,текст 2,31,Наши ценности,2,нет,текст,текст
2,32,Наш девиз,26,нет,текст,текст 2,32,Наш девиз,2,нет,текст,текст
2,33,Что обещают наши консультанты,27,да,текст,текст 2,33,Что обещают наши консультанты,2,да,текст,текст
2,34,Что НЕ обещают наши консультанты,29,да,текст,текст 2,34,Что НЕ обещают наши консультанты,2,да,текст,текст
2,35,"Назовите 3 принципа сервиса ""Закажи и забери"". ",30,да,текст,текст 2,35,"Назовите 3 принципа сервиса ""Закажи и забери"". ",2,да,текст,текст
\ No newline at end of file \ No newline at end of file
...@@ -446,13 +446,13 @@ data = {tags:[], connections:[], more:[], standardQuestions: {}, standardAnswers ...@@ -446,13 +446,13 @@ data = {tags:[], connections:[], more:[], standardQuestions: {}, standardAnswers
/*data.more = data.more.concat([ /*data.more = data.more.concat([
{c: 'top-35-march-c.csv', q: 'top-35-march-q.csv', a: 'top-35-march-a.csv'} {c: 'top-35-march-c.csv', q: 'top-35-march-q.csv', a: 'top-35-march-a.csv'}
])*/ ])*/
data.more = data.more.concat([ /*data.more = data.more.concat([
{p: '1cards_2020_02_28.csv', i: '1components.csv'}, {p: '1cards_2020_02_28.csv', i: '1components.csv'},
{q: '2questions.csv', a: '2answers.csv', c: '2cards_2020_2_21.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'},
{c: 'top-35-march-c.csv', q: 'top-35-march-q.csv', a: 'top-35-march-a.csv'}, {c: 'top-35-march-c.csv', q: 'top-35-march-q.csv', a: 'top-35-march-a.csv'},
]); ]);*/
let id = 1; let id = 1;
let theInc = ()=>id++; let theInc = ()=>id++;
let was = {}; let was = {};
......
const useSubSub = true; const useSubSub = false;
let dataProvider = { let dataProvider = {
maxConnection: 0, maxConnection: 0,
maxTagID: 0, maxTagID: 0,
......
...@@ -65,11 +65,232 @@ data.after = function(inComeData, skipInit){ ...@@ -65,11 +65,232 @@ data.after = function(inComeData, skipInit){
} }
ctx.setData(theData=inComeData); ctx.setData(theData=inComeData);
standardQuestions = inComeData.standardQuestions; standardQuestions = inComeData.standardQuestions;
//firstRequest(); firstRequest();
} }
}; };
const csv = require('csv-parser');
const readCSV = async function(scope) {
const {fileName, types, keys, index} = scope,
postProcess = scope.postProcess || (a => a);
const trash = Symbol('Trash')
const hash = {};
return await new Promise(function(resolve, reject) {
let id = 1;
const inc = ()=>id++;
fs.createReadStream(fileName)
.pipe(csv({
mapHeaders: ({header}) => keys[header] || trash,
mapValues: ({header, value}) => header in types ? types[header](value) : null
}))
.on('data', (obj) => {
if(postProcess(obj, inc)!==false)
hash[obj[index]] = obj;
})
.on('end', () => {
resolve(hash);
console.log('CSV parsed: '+ fileName)
});
});
};
let afterLoaded = async function(infoHash) {
return;// everything imported
let categoryID = 5;
console.log('Importing category:', categoryID);
let hashSlice = {};
for(let i in infoHash){
if(infoHash[i].category_id === categoryID){
hashSlice[i] = infoHash[i];
}
}
let normalizedTitleHash = {};
for(let i in hashSlice){
//normalizedTitleHash[normalizeText(hashSlice[i].title)] = hashSlice[i];
for( let j = 0, _j = hashSlice[ i ].items.length; j < _j; j++ ){
const item = hashSlice[ i ].items[ j ];
normalizedTitleHash[normalizeText(item.name || item.text)] = hashSlice[i];
}
}
let moreElement ={c: 'top-35-march-c.csv', q: 'top-35-march-q.csv', a: 'top-35-march-a.csv'};
const base = process.env.KUS_DATA_DIR || './data';
let mapIDHash = {};
if( moreElement.c ){
await readCSV({
fileName: path.join(base,moreElement.c),
keys: {
'номер карточки': 'id',
'Текст карточки': 'description',
'Картинка': 'image',
'Название': 'title',
'категория': 'category_id'
},
types: {
id: Number,
title: String,
description: String,
category_id: String,
image: String
},
postProcess: ( a, inc ) => {
if( a.description.trim() === '' ) return false;
let norm = normalizeText(a.description);//(a.title);
if(norm in normalizedTitleHash){
mapIDHash[a.id] = normalizedTitleHash[norm].id;
}
a.id = mapIDHash[a.id];
a.use = ( a.use + '' )[ 0 ].toLowerCase() in { 'д': 1, '1': 1, 'y': '1', 'c': '1' };
a.type = 2;
a.category_id = moreElement.c[0]|0;
a.items = [{
description: a.description,
image: a.image
}];
//debugger
},
index: 'id'
})
}
if( moreElement.q ){
const Q = await readCSV( {
fileName: path.join( base, moreElement.q ),
keys: {
'номер вопроса': 'qID',
'карточка': 'cardInfoID',
'Заголовок': 'title',
'Тип вопроса': 'image',
'множественный выбор': 'multiple',
'Тип ответа': 'answer_type',
'\\': 'category',
'категория': 'category'
},
types: {
qID: Number,
cardInfoID: Number,
title: String,
image: String,
multiple: String,
category: Number,
answer_type: String
},
postProcess: ( a ) => {
if( a.title.trim() === '' ) return false;
a.cardInfoID = mapIDHash[a.cardInfoID];
a.category_id = categoryID;
a.answers = [];
a.multiple = ( a.multiple + '' )[ 0 ].toLowerCase() in { 'д': 1, '1': 1, 'y': '1', 'c': '1' };
a.image = a.image.indexOf('с ')>-1? hashSlice[a.cardInfoID].image :null;
},
index: 'qID'
} );
let inc = 1;
const A = await readCSV( {
fileName: path.join( base, moreElement.a ),
keys: {
'номер вопроса': 'qID',
'ответ': 'title',
'правильный': 'correct',
},
types: {
qID: Number,
title: String,
correct: String
},
postProcess: ( a, inc ) => {
if( a.title.trim() === '' ) return false;
a.id = inc++;
a.correct = ( a.correct + '' )[ 0 ].toLowerCase() in { 'д': 1, '1': 1, 'y': '1', 'c': '1' };
Q[ a.qID ].answers.push( a );
},
index: 'id'
} );
var request = require('request');
let QS = Object.values(Q);
for( let i = 0, _i = QS.length; i < _i; i++ ){
const q = QS[ i ];
debugger
// REAL SAVE
//return;
let saved = await new Promise((r,j)=>{
var options = {
'method': 'POST',
'url': 'https://api.new.local.vkusvill.testin.ru/api/admin/question/',
'headers': {
'Content-Type': 'application/json'
},
body: JSON.stringify({"card_info_id":q.cardInfoID,"text":q.title,"type":q.multiple?'checkbox':'radio'})
};
request(options, function (error, response) {
if (error) throw new Error(error);
r(JSON.parse(response.body));
});
});
let questionID = saved.id;
console.log(i,'/',_i,' Question added',questionID, q.title);
for( let j = 0, _j = q.answers.length; j < _j; j++ ){
const answer = q.answers[ j ];
let answerResponse = await new Promise((r,j)=>{
var options = {
'method': 'POST',
'url': 'https://api.new.local.vkusvill.testin.ru/api/admin/answer/',
'headers': {
'Content-Type': 'application/json'
},
body: JSON.stringify({"question_id":questionID,"text": answer.title,"correct":answer.correct?1:0})
//{"card_info_id":q.cardInfoID,"text":q.title,"type":q.multiple?'checkbox':'radio'})
};
request(options, function (error, response) {
if (error) throw new Error(error);
r(JSON.parse(response.body));
});
});
console.log(' Answer added',answerResponse.data.id, answer.title);
}
console.log('');
}
/* for( var qI in Q ){
let id = ++maxQ;
Q[ qI ].qID = id;
Q[ qI ].answers.forEach( a => a.qID = id );
data.standardQuestions[ id ] = Q[ qI ];
}*/
}
}
let theData; let theData;
let countStdQ; let countStdQ;
let firstRequest; let firstRequest;
...@@ -119,13 +340,13 @@ module.exports = { ...@@ -119,13 +340,13 @@ module.exports = {
if( error ) throw new Error( error ); if( error ) throw new Error( error );
var questions = JSON.parse( response.body ); var questions = JSON.parse( response.body );
var qCardHash = {}; var qCardHash = {}, infoHash = {};
questions.forEach(function(q) { questions.forEach(function(q) {
(qCardHash[q.card_info_id] || (qCardHash[q.card_info_id]=[])).push(q); (qCardHash[q.card_info_id] || (qCardHash[q.card_info_id]=[])).push(q);
}); });
var mimicri = { var mimicri = {
tags: [], tags: tags,
connections: [], connections: [],
products: {}, products: {},
components: {}, components: {},
...@@ -159,6 +380,7 @@ module.exports = { ...@@ -159,6 +380,7 @@ module.exports = {
} ) } )
}else if( category.type === 2 && !category.hidden ){ }else if( category.type === 2 && !category.hidden ){
category.cards.forEach( card => { category.cards.forEach( card => {
infoHash[card.id] = card;
var base = { var base = {
category: card.category_id, category: card.category_id,
cardInfoID: card.id, cardInfoID: card.id,
...@@ -256,6 +478,9 @@ module.exports = { ...@@ -256,6 +478,9 @@ module.exports = {
initCtx(); initCtx();
theData = JSON.stringify( mimicri ); theData = JSON.stringify( mimicri );
ctx.setData( mimicri ); ctx.setData( mimicri );
afterLoaded(infoHash);
}); });
} ); } );
}); });
...@@ -519,14 +744,21 @@ ${ result.answers.map(a=> ...@@ -519,14 +744,21 @@ ${ result.answers.map(a=>
const TRANSFORMER = { const TRANSFORMER = {
IMAGE: function( image ){ IMAGE: function( image ){
return image; if(!image || image === 'null' || image === '0' || image === '' || image===null){
if( !image ){ return null;
}else{ }else{
image = image.trim(); image = image.trim();
if(image.indexOf('http')===0){
if( image.indexOf( 'https://api.new.local.vkusvill.testin.ru/storage ' ) === 0 ){
image = image.replace( /\s/g, '' );
}
return image;
}
if( image.indexOf( '/upload/resize' ) === 0 ){ if( image.indexOf( '/upload/resize' ) === 0 ){
image = 'https://vkusvill.ru' + image; image = 'https://vkusvill.ru' + image;
}else{ }else{
image = image ? 'https://api.new.local.vkusvill.testin.ru/storage' + image.trim() : void 0; image = image ? 'https://api.new.local.vkusvill.testin.ru/storage' + image.trim() : void 0;
} }
} }
......
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