UNPKG

tw-shift-schedule

Version:
84 lines (67 loc) 1.79 kB
// generate shift schedule from punch time var moment = require('moment') function Schedule (header, body) { this.header = header this.body = body } Schedule.fromTime = function (punches, opts) { var body = '' var header = {} if (!opts) opts = {} if (!opts.format) opts.format = moment.ISO_8601 var start = moment(punches[0][0], opts.format) header.start = start punches.forEach((p, i) => { var start = moment(p[0], opts.format) if (opts.before) { start.subtract(parseTimeOpt(opts.before)) } var end = moment(p[1], opts.format) if (opts.after) { end.add(parseTimeOpt(opts.after)) } if (i > 0) { var restDuration = moment.duration( start.diff(moment(punches[i - 1][1], opts.format)) ).asMinutes() for (var j = 0; j < restDuration; j++) { body += '.' } } var duration = moment.duration(end.diff(start)).asMinutes() for (var k = 0; k < duration; k++) { body += 'x' } }) let s = new Schedule(header, body) s.start = header.start return s } Schedule.load = function (data) { if (!data.includes('\n--\n')) { // no header return new Schedule({}, data) } var parts = data.split('\n--\n').map(p => p.trim()) var header = parts[0] var body = parts[1] header = header.split('\n').map(h => h.split('=').map(x => x.trim())).reduce((sum, h) => { sum[h[0]] = h[1] return sum }, {}) return new Schedule(header, body) } Schedule.prototype.toString = function () { var data = '' for (var k in this.header) { data += `${k}=${this.header[k]}\n` } data += '--\n' data += this.body return data } module.exports = Schedule function parseTimeOpt (opt) { var o = opt.split(' ') return moment.duration(+o[0], o[1]) }