Commit d1b5b124 authored by Johannes Bill's avatar Johannes Bill

after cb refactor

parent 6a15bb8f
...@@ -3,240 +3,260 @@ var Holidays = require('./holidays'); ...@@ -3,240 +3,260 @@ var Holidays = require('./holidays');
var now = new Date(); var now = new Date();
var holidaysGetter = {}; var holidaysGetter = {};
var epochSpan = testEpochSpan();
var startYear;
var endYear;
function setEpocheSpan(_epocheSpan) {
epochSpan = _epocheSpan;
startYear = epochSpan[0].getFullYear();
endYear = epochSpan[1].getFullYear();
for(var year = startYear; year <= endYear; year++) {
if(!holidaysGetter[year])
holidaysGetter[year] = new Holidays(year);
}
}
function testEpochSpan() { function wrapper(_epochSpan) {
var _epochStart = new Date(); var epochSpan;
_epochStart = new Date(_epochStart.getFullYear(), _epochStart.getMonth(), _epochStart.getDate()); var startYear;
_epochStart.setDate(_epochStart.getDate() - 30); var endYear;
var _epochEnd = new Date(_epochStart.getTime() + 130 * 24 * 3600000); setEpocheSpan(_epochSpan);
return [_epochStart, _epochEnd];
} function setEpocheSpan(newEpochSpan) {
epochSpan = newEpochSpan;
startYear = epochSpan[0].getFullYear();
endYear = epochSpan[1].getFullYear();
for(var year = startYear; year <= endYear; year++) {
if(!holidaysGetter[year])
holidaysGetter[year] = new Holidays(year);
}
}
function calculateOpeningHours(json) { function calculateOpeningHours(json, plz, cb) {
var includeString = "810a6deb-46f2-4fa8-b779-bb5c2a6b5577"; var includeString = "810a6deb-46f2-4fa8-b779-bb5c2a6b5577";
var excludeString = "bb74c170-b06f-4d2b-ab88-2f6bf9ce8068"; var excludeString = "bb74c170-b06f-4d2b-ab88-2f6bf9ce8068";
var jsonIncl = json[includeString]; var jsonIncl = json[includeString];
var jsonExcl = json[excludeString]; var jsonExcl = json[excludeString];
if (!jsonIncl) {
throw new Error('no openinghours model found');
}
var resultIncl = []; if (!jsonIncl) {
var resultExcl = []; return cb(new Error('no openinghours model found'));
var holidayIncl = []; }
var data, option, key; var resultIncl = [];
for (key in jsonIncl) { var resultExcl = [];
data = jsonIncl[key]; var holidayIncl = [];
option = getOption(data);
if (option == "holiday") var data, option, key;
holidayIncl = holidayIncl.concat(getHolidays(data)); try {
for (key in jsonIncl) {
data = jsonIncl[key];
option = getOption(data);
if (option == "holiday")
holidayIncl = holidayIncl.concat(getHolidays(data));
// else if (option == "vacation") { // else if (option == "vacation") {
// resultExcl.push(getOpeningHours(data, option)); // resultExcl.push(getOpeningHours(data, option));
// } // }
else else
resultIncl.push(getOpeningHours(data, option)); resultIncl.push(getOpeningHours(data, option));
} }
if (jsonExcl) { if (jsonExcl) {
for (key in jsonExcl) { for (key in jsonExcl) {
data = jsonExcl[key]; data = jsonExcl[key];
option = getOption(data); option = getOption(data);
resultExcl.push(getOpeningHours(data, option)); resultExcl.push(getOpeningHours(data, option));
}
resultExcl = tmUtils.orOp(resultExcl);
}
}
catch (err) {
return cb(err);
} }
resultExcl = tmUtils.orOp(resultExcl);
}
var allHolidays = getAllHolidays(); getAllHolidays(plz, function (err, allHolidays) {
if (err)
return cb(err);
allHolidays = tmUtils.andOp(allHolidays, [epochSpan]); allHolidays = tmUtils.andOp(allHolidays, [epochSpan]);
holidayIncl = tmUtils.andOp(holidayIncl, [epochSpan]); holidayIncl = tmUtils.andOp(holidayIncl, [epochSpan]);
resultIncl = tmUtils.orOp(resultIncl); resultIncl = tmUtils.orOp(resultIncl);
resultIncl = tmUtils.andNotOp(resultIncl, allHolidays); resultIncl = tmUtils.andNotOp(resultIncl, allHolidays);
resultIncl = tmUtils.orOp([resultIncl, holidayIncl]); resultIncl = tmUtils.orOp([resultIncl, holidayIncl]);
var result = resultIncl; var result = resultIncl;
if (jsonExcl) if (jsonExcl)
result = tmUtils.andNotOp(resultIncl, resultExcl); result = tmUtils.andNotOp(resultIncl, resultExcl);
cb(null, result);
});
return result;
}
function getDaySpan(data) {
var dayoption = parseInt(data["dayoption"]["0"]);
if (dayoption < 7) return [dayoption, dayoption];
switch (dayoption) {
case 7:
return [0, 0];
case 8:
return [0, 7];
case 9:
return [1, 5];
case 10:
return [1, 6];
default:
throw new Error("Invalid day option: " + dayoption);
} }
}
function parseTime(time) { function getDaySpan(data) {
var split = time.split(":"); var dayoption = parseInt(data["dayoption"]["0"]);
return { if (dayoption < 7) return [dayoption, dayoption];
h: parseInt(split[0]) || 0, switch (dayoption) {
m: parseInt(split[1]) || 0 case 7:
return [0, 0];
case 8:
return [0, 7];
case 9:
return [1, 5];
case 10:
return [1, 6];
default:
throw new Error("Invalid day option: " + dayoption);
}
} }
}
function parseTime(time) {
var split = time.split(":");
return {
h: parseInt(split[0]) || 0,
m: parseInt(split[1]) || 0
}
}
function parseDate(date, year, addOneDay) {
if (date.length == 0)
return null;
var _year; function parseDate(date, year, addOneDay) {
var split = date.split("."); if (date.length == 0)
var month = parseInt(split[1]) - 1; return null;
var day = parseInt(split[0]) + (addOneDay ? 1 : 0);
if(split.length === 3) {
_year = parseInt(split[2]);
}
if(!_year)
_year = year;
return new Date(_year, month, day); var _year;
} var split = date.split(".");
var month = parseInt(split[1]) - 1;
var day = parseInt(split[0]) + (addOneDay ? 1 : 0);
if (split.length === 3) {
_year = parseInt(split[2]);
}
if (!_year)
_year = year;
function getHolidays(data) { return new Date(_year, month, day);
var option = data["option"]["0"];
if (option != "holiday") {
throw new Error('not holiday: ' + option);
} }
var timeSpan = getTimeSpan(data); function getHolidays(data) {
var holidayId = data["holidayoption"][0]; var option = data["option"]["0"];
if (option != "holiday") {
throw new Error('not holiday: ' + option);
}
var timeSpan = getTimeSpan(data);
var holidayId = data["holidayoption"][0];
var days = [];
for (var year = startYear; year <= endYear; year++) {
days = days.concat(holidaysGetter[year].getHoliday(holidayId));
}
var days = []; var intervals = days.map(function (date) {
for(var year = startYear; year <= endYear; year++) { return tmUtils.singleDay(date, timeSpan);
days = days.concat(holidaysGetter[year].getHoliday(holidayId)); });
tmUtils.sort(intervals);
return intervals;
} }
var intervals = days.map(function (date) { function getAllHolidays(plz, cb) {
return tmUtils.singleDay(date, timeSpan); var days = [];
}); var cnt = endYear - startYear + 1;
tmUtils.sort(intervals);
return intervals; function _cb(err, result) {
} if (err) return cb(err);
days = days.concat(result);
cnt--;
if (cnt === 0) {
var intervals = days.map(function (date) {
return tmUtils.singleDay(date);
});
tmUtils.sort(intervals);
cb(null, intervals);
}
}
function getAllHolidays() { for (var year = startYear; year <= endYear; year++) {
var days = []; holidaysGetter[year].getAllHolidays(plz, _cb);
for(var year = startYear; year <= endYear; year++) { }
days = days.concat(holidaysGetter[year].getAllHolidays());
} }
var intervals = days.map(function (date) {
return tmUtils.singleDay(date);
});
tmUtils.sort(intervals);
return intervals;
}
function getDateSpan(data) { function getDateSpan(data) {
var startDate = parseDate(data["opening_day_from"], now.getFullYear()); var startDate = parseDate(data["opening_day_from"], now.getFullYear());
var endDate = parseDate(data["opening_day_to"], now.getFullYear(), true); var endDate = parseDate(data["opening_day_to"], now.getFullYear(), true);
if(!startDate) if (!startDate)
startDate = epochSpan[0]; startDate = epochSpan[0];
if(!endDate) if (!endDate)
endDate = epochSpan[1]; endDate = epochSpan[1];
//TODO: jahreswechsel beruecksichtigen //TODO: jahreswechsel beruecksichtigen
return [startDate, endDate]; return [startDate, endDate];
} }
function getTimeSpan(data) { function getTimeSpan(data) {
return [parseTime(data["opening_from"]), parseTime(data["opening_to"])]; return [parseTime(data["opening_from"]), parseTime(data["opening_to"])];
} }
function getOption(data) { function getOption(data) {
return data["option"][0]; return data["option"][0];
} }
function getOpeningHours(data, option) { function getOpeningHours(data, option) {
option = option || getOption(data); option = option || getOption(data);
switch (option) { switch (option) {
case "default": case "default":
return getOpeningHoursDefault(data); return getOpeningHoursDefault(data);
case "season": case "season":
return getOpeningHoursSeason(data); return getOpeningHoursSeason(data);
case "repeatable": case "repeatable":
return getOpeningHoursRepeatable(data); return getOpeningHoursRepeatable(data);
case "vacation": case "vacation":
return getOpeningHoursVacation(data); return getOpeningHoursVacation(data);
case "": case "":
return []; return [];
default: default:
throw new Error("option not supported: " + option); throw new Error("option not supported: " + option);
return []; return [];
}
} }
}
function getOpeningHoursDefault(data) { function getOpeningHoursDefault(data) {
var daySpan = getDaySpan(data); var daySpan = getDaySpan(data);
var timeSpan = getTimeSpan(data); var timeSpan = getTimeSpan(data);
return tmUtils.standardFromTillDay(daySpan, timeSpan, epochSpan, epochSpan, 7); return tmUtils.standardFromTillDay(daySpan, timeSpan, epochSpan, epochSpan, 7);
} }
function getOpeningHoursSeason(data) { function getOpeningHoursSeason(data) {
var daySpan = getDaySpan(data); var daySpan = getDaySpan(data);
var timeSpan = getTimeSpan(data); var timeSpan = getTimeSpan(data);
var dateSpan = getDateSpan(data); var dateSpan = getDateSpan(data);
return tmUtils.standardFromTillDay(daySpan, timeSpan, dateSpan, epochSpan, 7); return tmUtils.standardFromTillDay(daySpan, timeSpan, dateSpan, epochSpan, 7);
} }
function getOpeningHoursVacation(data) { function getOpeningHoursVacation(data) {
var dateSpan = getDateSpan(data); var dateSpan = getDateSpan(data);
return tmUtils.dateSpan(dateSpan); return tmUtils.dateSpan(dateSpan);
} }
function getOpeningHoursRepeatable(data) { function getOpeningHoursRepeatable(data) {
var daySpan = getDaySpan(data); var daySpan = getDaySpan(data);
var timeSpan = getTimeSpan(data); var timeSpan = getTimeSpan(data);
var dateSpan = getDateSpan(data); var dateSpan = getDateSpan(data);
var repeatOption = parseInt(data["repeatoption"]["0"]); var repeatOption = parseInt(data["repeatoption"]["0"]);
var noInMonth; var noInMonth;
if (repeatOption <= 4) noInMonth = repeatOption; if (repeatOption <= 4) noInMonth = repeatOption;
else if (repeatOption == 30) noInMonth = -1; else if (repeatOption == 30) noInMonth = -1;
if (noInMonth) if (noInMonth)
return tmUtils.cyclicFromTillDay(daySpan, noInMonth, timeSpan, dateSpan, epochSpan); return tmUtils.cyclicFromTillDay(daySpan, noInMonth, timeSpan, dateSpan, epochSpan);
else { else {
switch (repeatOption) { switch (repeatOption) {
case 14: case 14:
case 21: case 21:
case 28: case 28:
return tmUtils.standardFromTillDay(daySpan, timeSpan, dateSpan, epochSpan, repeatOption); return tmUtils.standardFromTillDay(daySpan, timeSpan, dateSpan, epochSpan, repeatOption);
default: default:
throw new Error("invalid repeatoption"); throw new Error("invalid repeatoption");
}
} }
} }
return {
getData: calculateOpeningHours,
setEpocheSpan: setEpocheSpan
};
} }
module.exports = wrapper;
module.exports.getData = calculateOpeningHours;
module.exports.setEpocheSpan = setEpocheSpan;
...@@ -60,46 +60,55 @@ function Holidays(year) { ...@@ -60,46 +60,55 @@ function Holidays(year) {
var holidays = getFixedHolidays(fixedHolidays); var holidays = getFixedHolidays(fixedHolidays);
holidays = getVariableHolidaysMap(variableOffsets, holidays); holidays = getVariableHolidaysMap(variableOffsets, holidays);
function plzToBlnd(plz) { function plzToBlnd(plz, cb) {
} }
function isAugsburg(plz) { function isAugsburg(plz, cb) {
} }
function getHolidayKeys(plz, kath, cb) { function isKath(plz, cb) {
//remove }
function getHolidayKeys(plz, cb) {
//TODO: remove
var keys = Object.keys(holidays); var keys = Object.keys(holidays);
return keys; return cb(null, keys);
//\remove //\remove
var blnd = plzToBlnd(plz); var blnd = plzToBlnd(plz);
var isAugsburg = isAugsburg(plz); var isAugsburg = isAugsburg(plz);
var isKath = isKath(plz);
var keys = holidayMapping['sureHolidays']; var keys = holidayMapping['sureHolidays'];
assert(isAugsburg && blnd == 'BY'); assert(isAugsburg == (blnd == 'BY'));
var blndMap = holidayMapping['region'][blnd]; var blndMap = holidayMapping['region'][blnd];
if (blndMap) { if (blndMap) {
keys.concat(blndMap['default']); keys.concat(blndMap['default']);
if (kath && blndMap['kath']) if (blndMap['kath'] && isKath)
keys.concat(blndMap['kath']); keys.concat(blndMap['kath']);
if (isAugsburg && blndMap['augsburg']) if (blndMap['augsburg'] && isAugsburg)
keys.concat(blndMap['augsburg']); keys.concat(blndMap['augsburg']);
} }
cb(null, keys); cb(null, keys);
} }
this.getAllHolidays = function (plz, kath) { this.getAllHolidays = function (plz, cb) {
var keys = getHolidayKeys(plz, kath); getHolidayKeys(plz, function (err, keys) {
var result = [];
for (var i = 0; i < keys.length; i++) { if(err)
var key = keys[i]; return cb(err);
var elem = holidays[key]; var result = [];
if(elem) for (var i = 0; i < keys.length; i++) {
result.push(elem); var key = keys[i];
} var elem = holidays[key];
return result; if (elem)
result.push(elem);
}
cb(err, result);
});
}; };
this.getHoliday = function (id) { this.getHoliday = function (id) {
......
var http = require('http'); var http = require('http');
var hostname= "127.0.0.1";
var port= 3001;
var headers = {
"Content-Type": "application/json"
};
var path = '/api/postleitzahlen/findone/?filter[where][plz]=93047'; var path = '/api/postleitzahlen/findone/?filter[where][plz]=93047';
var headers = {}; function request(path, cb) {
headers["Content-Type"] = "application/json"; var options = {
hostname: hostname,
port: port,
path: path,
method: 'GET',
headers: headers
};
var callback = function (response) {
console.log('bla');
var str = '';
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function () {
cb(null, str);
});
};
var req = http.request(options, callback);
req.on("error", function (err) {
cb(err);
});
var options = { req.end();
hostname: "127.0.0.1", }
port: 3000,
path: path,
method: 'GET',
headers: headers
};
var callback = function (response) {
console.log('bla');
var str = '';
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function () {
console.log(str);
});
};
var req = http.request(options, callback);
req.on("error", function (error) {
console.error(error);
});
req.end();
function getBundesland(plz, cb) {
}
function getKatholisch(plz, cb) {
}
...@@ -3,13 +3,14 @@ var dateArray = require('../lib/dateArray'); ...@@ -3,13 +3,14 @@ var dateArray = require('../lib/dateArray');
describe("dateArray" ,function() { describe("dateArray" ,function() {
describe("calculateOpeningHours", function() { describe("calculateOpeningHours", function() {
it("should equal", function() { it("should equal", function(done) {
var data = require('./testData/testHof.json'); var data = require('./testData/testHof.json');
var epocheSpan = [new Date(2014,0,1), new Date(2015,0,1)]; var epocheSpan = [new Date(2014,0,1), new Date(2015,0,1)];
dateArray.setEpocheSpan(epocheSpan); dateArray(epocheSpan).getData(data, 93047, function(err, oHours) {
var oHours =dateArray.getData(data); var result = JSON.stringify(oHours);
var result = JSON.stringify(oHours); expect(result).to.equal(require('./testData/testHofResult.json')['data']);
expect(result).to.equal(require('./testData/testHofResult.json')['data']); done();
});
}) })
}) })
}); });
\ No newline at end of file
...@@ -5,19 +5,20 @@ var dateView = require('../lib/dateView'); ...@@ -5,19 +5,20 @@ var dateView = require('../lib/dateView');
describe("dateView" ,function() { describe("dateView" ,function() {
describe("calculateOpeningHours", function() { describe("calculateOpeningHours", function() {
it("should equal", function() { it("should equal", function(done) {
var data = require('./testData/testHof.json'); var data = require('./testData/testHof.json');
var now = new Date(2014, 4, 1); var now = new Date(2014, 4, 1);
var epocheSpan = dateView.getPropperEpochSpan(now); var epocheSpan = dateView.getPropperEpochSpan(now);
dateArray.setEpocheSpan(epocheSpan); dateArray(epocheSpan).getData(data, 93047, function(err, oHours) {
var oHours =dateArray.getData(data); var view = dateView.getView(oHours, now);
var view = dateView.getView(oHours, now); console.log(view);
console.log(view); var viewRef = fs.readFileSync(__dirname + '/testData/testHofView.html', {
var viewRef = fs.readFileSync(__dirname + '/testData/testHofView.html', { encoding: "utf8"
encoding: "utf8" });
expect(view).to.equal(viewRef);
done();
}); });
expect(view).to.equal(viewRef);
}) })
}) })
}); });
\ No newline at end of file
var mysql = require('mysql'); var mysql = require('mysql');
var dateArray = require('../lib/dateArray'); var dateArray = require('../lib/dateArray');
var dateView = require('../lib/dateView'); var dateView = require('../lib/dateView');
var plz = 93047;
var connection = mysql.createConnection({ var connection = mysql.createConnection({
host: 'localhost', host: 'localhost',
...@@ -11,32 +12,37 @@ var connection = mysql.createConnection({ ...@@ -11,32 +12,37 @@ var connection = mysql.createConnection({
connection.connect(); connection.connect();
module.exports.getData = function(now, cb) { module.exports.getData = function (now, cb) {
var epocheSpan = dateView.getPropperEpochSpan(now); var epocheSpan = dateView.getPropperEpochSpan(now);
// console.log(now); // console.log(now);
// console.log(epocheSpan); // console.log(epocheSpan);
dateArray.setEpocheSpan(epocheSpan); // dateArray.setEpocheSpan(epocheSpan);
connection.query('SELECT name, elements FROM cms_zoo_item WHERE type = "company"', function(err, rows) { connection.query('SELECT name, elements FROM cms_zoo_item WHERE type = "company"', function (err, rows) {
var result = []; var result = [];
var cnt = 0; var cnt = 0;
var iters = rows.length;
for (var i = 0; i < rows.length; i++) { for (var i = 0; i < rows.length; i++) {
var obj = JSON.parse(rows[i].elements); var obj = JSON.parse(rows[i].elements);
var name = rows[i].name; (function() {
try { var name = rows[i].name;
var data = dateArray.getData(obj); dateArray(epocheSpan).getData(obj, plz, function (err, data) {
if (data.length > 0) { if(err) {
cnt++; console.log(name, err);
var view = dateView.getView(data, now); }
result.push('<div class="name">'+name+"</div> "+view);
} else if (data.length > 0) {
} cnt++;
catch (err) { var view = dateView.getView(data, now);
} result.push('<div class="name">' + name + "</div> " + view);
}
if (--iters == 0) {
console.log("Count: %d", cnt);
cb(result.join('<br>'));
}
});
})();
} }
console.log("Count: %d", cnt);
cb(result.join('<br>'));
}); });
}; };
......
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