· 9 years ago · Nov 15, 2016, 06:52 AM
1#!/usr/bin/env node
2'use strict';
3
4var Steppy = require('twostep').Steppy,
5 _= require('underscore'),
6 db = require('../db'),
7 mysql = require('mysql'),
8 async = require('async'),
9 config = require('../config')('development'),
10 translit = require('transliteration'),
11 generatePassword = require('password-generator'),
12 helpers = require('../utils/helpers'),
13 //rs = require('randomstring'),
14 dict = require('../utils/helpers/resumeDictionaries'),
15 striptags = require('striptags'),
16 moment = require('moment');
17
18var noVacancy = 0,
19 yesVacancy = 0;
20
21var conn = mysql.createConnection({
22 host : 'localhost',
23 user : 'root',
24 password : 'root',
25 database : 'skillbook'
26});
27
28
29var schedule = {
30 'Полный рабочий день': 'fullday_work',
31 'Сменный': 'shift_work',
32 'Ðеполный рабочий день': 'not_fullday_work',
33 'Свободный': 'free_work',
34 'СкользÑщий': 'flexible_shedule',
35 'Гибкий': 'flexible_shedule'
36}
37
38var employment = {
39 'ПоÑтоÑннаÑ': 'full_employment',
40 'РазоваÑ': 'one_time_employment',
41 'ÐадомнаÑ': 'home_employment',
42 'По ÑовмеÑтительÑтву': 'combine_employment',
43 'СезоннаÑ': 'temporary_job',
44 'ВременнаÑ': 'temporary_job',
45 'Стажировки Ð´Ð»Ñ Ñтудентов': 'traineeship'
46}
47
48var experience = {
49 0 : 'null_experience',
50 1 : '1to3years',
51 2 : '3to5years',
52 3 : 'over5years'
53}
54
55conn.connect();
56
57function migrateVacancy(vacancy, organization, callback) {
58 var newVacancy;
59 Steppy(
60 function() {
61
62 var s = _(dict.schedule).filter(function(sch) {
63 return sch.sysName === schedule[vacancy.schedule]
64 });
65
66 var e = _(dict.employment).filter(function(emp) {
67 return emp.sysName === employment[vacancy.employment]
68 });
69
70 var edu = _(dict.education).filter(function(level) {
71 return level.name === vacancy.edulevel;
72 });
73
74 var exp = _(dict.experience).filter(function(exp) {
75 return exp.sysName === experience[vacancy.experience];
76 });
77
78 newVacancy = {
79 name: vacancy.position,
80 salary: vacancy.salary,
81 placesCount: vacancy.vaccount? vacancy.vaccount: 1,
82 duties: striptags(vacancy.mainduties),
83 schedule: s.length? s[0] : {},
84 employment: e.length? e[0] : {},
85 education: edu.length? edu[0]: {},
86 experience: exp.length? exp[0]: {},
87 organization: _(organization).pick('_id', 'name'),
88 createDate: moment(vacancy.pubdate).valueOf(),
89 updateDate: moment(vacancy.pubdate).valueOf(),
90 isPublished: true,
91 isDraft: false
92 }
93
94 //console.log('vacancy.pubdate>>> ', vacancy.pubdate);
95 var regex = new RegExp('.*' + vacancy.city + '.*');
96 db.dictionaries.find({dictName: 'cities', fullName: regex}).toArray(this.slot());
97 },
98 function(err, cities) {
99 //console.log('cities>>> ', cities);
100 if (cities.length) {
101 newVacancy.city = cities;
102 }
103 //console.log('newVacancy>>> ', newVacancy);
104 db.vacancies.find({
105 name: newVacancy.name,
106 'organization._id': organization._id
107 }).toArray(this.slot());
108 },
109 function(err, vacancies) {
110 var slot = this.slot();
111
112 if(!vacancies.length) {
113 ++noVacancy
114 console.log("no vacancy", noVacancy);
115
116 // console.log('insert new vacancy>>> ', newVacancy.name);
117 db.vacancies.insertOne(newVacancy, slot)
118 } else {
119 // console.log('update vacancy>>> ', newVacancy.name);
120 ++yesVacancy
121 console.log("yes vacancy", yesVacancy);
122 db.vacancies.updateOne(
123 {
124 name: newVacancy.name,
125 'organization._id': organization._id
126 },
127 {$set: newVacancy},
128 slot
129 )
130 }
131 },
132 function(err, insertRes) {
133 //console.log('insertRes>>> ', insertRes);
134 callback(err, null);
135 }
136 )
137}
138
139function migrateVacancies(organization, callback) {
140 console.log("organization", organization);
141 Steppy(
142 function() {
143
144// ЗдеÑÑŒ ваканÑии фильтруютÑÑ Ð¿Ð¾ организации и здеÑÑŒ коÑÑк
145
146 conn.query('select vac.position, vac.pubdate as pubdate, edu.name as edulevel, vac.salary as salary, vac.experience as experience,'
147 ' vac.number as vaccount, vac.mainduties, sh.name as schedule, cit.name as city,'+
148 ' emp.name as employer, empt.name as employment from modx_vacancies_vacancies as vac' +
149 ' join modx_vacancies_employers as emp on emp.id = vac.employer_id ' + // emp.name as employer еÑли здеÑÑŒ 0 то терÑем ваканÑию
150 ' join modx_vacancies_cities as cit on cit.id = vac.city_id ' +
151 ' join modx_vacancies_employments as empt on empt.id = vac.employment_id ' + // empt.name as employment_id еÑли здеÑÑŒ 0 то терÑем ваканÑию
152 ' join modx_vacancies_educationlevels as edu on edu.id = vac.educationlevel_id ' + // edu.name as edulevel еÑли здеÑÑŒ 0 то терÑем ваканÑию
153 'join modx_vacancies_scheduletypes as sh on sh.id = vac.scheduletype_id where vac.employer_id = ' + organization.oldId, this.slot()); // sh.name as schedule еÑли здеÑÑŒ 0 то терÑем ваканÑию
154 },
155 function(err, vacancies) {
156 //console.log("query result", vacancies);
157 console.log("wtf", vacancies.length);
158 async.eachSeries(vacancies, function(vacancy, cb) {
159 migrateVacancy(vacancy, organization, cb);
160 }, this.slot())
161 },
162 function(err, res) {
163 callback(err, res);
164 }
165 )
166}
167
168
169function insertOrUpdateEmployer(employer, callback) {
170 var sysName,
171 authUser,
172 organization,
173 account;
174
175 Steppy(
176 function() {
177 sysName = employer.name;
178 sysName = translit.transliterate(sysName.replace(/\s/g, '_'));
179 sysName = sysName.replace(/[^a-zA-Z_]/g, '');
180 sysName = sysName.toLowerCase();
181
182 var newPassword = generatePassword(6, false);
183
184 var md5 = helpers.makePassword(sysName);
185
186 var sum = _.reduce(md5, function(a, b) {
187 return ('' + a).charCodeAt(0) + ('' + b).charCodeAt(0);
188 })
189
190 var email = sysName.substr(sysName.length - 3) + md5.substr(md5.length - 6) + sum;
191
192 email = email.toLowerCase() + '@' + (email[0] < 'n' ? 'mail.ru': 'yandex.ru');
193
194 var newPasswordHash = helpers.makePassword(newPassword);
195
196 authUser = {
197 firstName: 'organizationFirst',
198 lastName: 'organizationLast',
199 middleName: 'organizationMiddle',
200 fullName: sysName,
201 email: email,
202 passwordOpen: newPassword,
203 password: newPasswordHash
204 }
205 organization = {
206 name: employer.name,
207 sysName: sysName,
208 oldId: employer.id,
209 approved: true
210 }
211
212 db.authUsers.find(
213 {
214 email: authUser.email,
215 firstName: 'organizationFirst'
216 }
217 ).toArray(this.slot())
218 },
219 function(err, authUsers) {
220 var slot = this.slot();
221
222 if(!authUsers.length) {
223 //console.log('insert authUser; ', authUser.email,
224 //authUser.passwordOpen, organization.name, organization.sysName);
225 db.authUsers.insertOne(authUser, slot)
226 } else {
227 //console.log('update authUser; ', authUser.email,
228 //authUser.passwordOpen, organization.name, organization.sysName);
229
230 db.authUsers.updateOne(
231 {email: authUser.email},
232 {$set: authUser},
233 slot
234 )
235 }
236 },
237 function(err, authUserRes) {
238 db.organizations.find({sysName: organization.sysName}).toArray(this.slot());
239 },
240 function(err, organizations) {
241 var slot = this.slot()
242 if(!organizations.length) {
243 //console.log('insert organization; ', organization.name, organization.sysName);
244 db.organizations.insertOne(organization, slot)
245 } else {
246 //console.log('update organization; ', organization.name, organization.sysName);
247 db.organizations.updateOne(
248 {sysName: organization.sysName},
249 {$set: organization},
250 slot
251 )
252 }
253 },
254 function(err, upRes) {
255 db.organizations.findOne({sysName: organization.sysName}, this.slot());
256 },
257 function(err, dborganization) {
258 this.pass(dborganization);
259 db.authUsers.findOne({email: authUser.email}, this.slot())
260 },
261 function(err, dborganization, authUser) {
262 //console.log(dborganization);
263 account = {
264 role: 'employer',
265 structures: {
266 organization: _(dborganization).pick('_id', 'name'),
267 },
268 email: authUser.email,
269 data: {},
270 authUserId: authUser._id
271 }
272 db.accounts.find({authUserId: account.authUserId}).toArray(this.slot());
273 },
274 function(err, accounts) {
275 var slot = this.slot();
276
277 if(!accounts.length) {
278 //console.log('insert account>>> ', account.email);
279 db.accounts.insertOne(account, slot)
280 } else {
281 //console.log('update account>>> ', account.email);
282 db.accounts.updateOne(
283 {authUserId: account.authUserId},
284 {$set: account},
285 slot
286 )
287 }
288 },
289 function(err, accRes) {
290
291 db.organizations.findOne({sysName: organization.sysName}, this.slot());
292 },
293 function(err, dborganization) {
294 migrateVacancies(dborganization, this.slot());
295 },
296 function(err, res) {
297 callback(err, res);
298 }
299 )
300}
301
302Steppy(
303 function() {
304 db.init({config: config.mongodb}, this.slot());
305 },
306 function(err, connRes) {
307 conn.query('select* from modx_vacancies_employers', this.slot());
308 },
309 function(err, employers) {
310 console.log("first mysql query", employers.length);
311
312 async.eachSeries(employers, function(employer, cb) {
313 insertOrUpdateEmployer(employer, cb);
314 }, this.slot())
315 },
316 function(err, res) {
317 if(err) {
318 throw err;
319 }
320 process.exit();
321 }
322)