UNPKG

schedulejs

Version:

Schedule tasks, meetings, appointments, etc

123 lines (107 loc) 7.08 kB
var schedule = require('../../index'), later = require('later'), p = later.parse.text, should = require('should'); // Note: this test is dependent on PST timezone describe.skip('Example: Elevator reservations', function() { it('should produce correct reservations', function() { // Step 1: Define our reservations (tasks) var reservations = [ {name: 'Joe', length: 4, availability: 'after 12:00'}, {name: 'Mike', length: 2}, {name: 'Frank', length: 8}, {name: 'John', length: 3, availability: 'on Thurs and Fri'}, {name: 'Peter', length: 1, availability: 'before 10:00am'}, {name: 'Sam', length: 2}, {name: 'Alan', length: 2}, {name: 'James', length: 8}, {name: 'Steve', length: 1, availability: 'after 12:00 and before 1:00pm'}, {name: 'Mark', length: 2}, {name: 'Alex', length: 8} ]; // Step 2: Define our elevators (resources) var elevators = [ {name: 'E1', availability: 'every weekday after 8:00am and before 4:00pm'}, {name: 'E2', availability: 'every weekday after 8:00am and before 4:00pm'} ]; // Step 3: Tasks aren't in the right format, need to create a generator var t = schedule.tasks() .id(function(d) { return d.name; }) // our length is in hours, convert to minutes .duration(function(d) { return d.length * 60; }) // use later.parse.text to parse text into a usable schedule .available(function(d) { return d.availability ? p(d.availability) : undefined; }) // prioritize our reservations on first come first serve .priority(function(d, i) { return 100 - i; }) // elevator reservations have to be contiguous .minSchedule(function(d) { return d.length * 60; }) // assume that only one elevator is available for reservations to start .resources(['E1']); var tasks = t(reservations); // Step 4: Resources aren't in the right format, need to create a generator var r = schedule.resources() .id(function(d) { return d.name; }) .available(function(d) { return d.availability ? p(d.availability) : undefined; }); var resources = r(elevators); // Step 5: Pick a start date for the schedule and set correct timezone var start = new Date(2013, 2, 21); schedule.date.localTime(); // Step 6: Create the schedule var s = schedule.create(tasks, resources, null, start); s.scheduledTasks.Joe.earlyStart.should.eql((new Date(2013,2,21,12,0,0)).getTime()); s.scheduledTasks.Joe.earlyFinish.should.eql((new Date(2013,2,21,16,0,0)).getTime()); s.scheduledTasks.Mike.earlyStart.should.eql((new Date(2013,2,21,8,0,0)).getTime()); s.scheduledTasks.Mike.earlyFinish.should.eql((new Date(2013,2,21,10,0,0)).getTime()); s.scheduledTasks.Frank.earlyStart.should.eql((new Date(2013,2,22,8,0,0)).getTime()); s.scheduledTasks.Frank.earlyFinish.should.eql((new Date(2013,2,22,16,0,0)).getTime()); s.scheduledTasks.John.earlyStart.should.eql((new Date(2013,2,28,8,0,0)).getTime()); s.scheduledTasks.John.earlyFinish.should.eql((new Date(2013,2,28,11,0,0)).getTime()); s.scheduledTasks.Peter.earlyStart.should.eql((new Date(2013,2,25,8,0,0)).getTime()); s.scheduledTasks.Peter.earlyFinish.should.eql((new Date(2013,2,25,9,0,0)).getTime()); s.scheduledTasks.Sam.earlyStart.should.eql((new Date(2013,2,21,10,0,0)).getTime()); s.scheduledTasks.Sam.earlyFinish.should.eql((new Date(2013,2,21,12,0,0)).getTime()); s.scheduledTasks.Alan.earlyStart.should.eql((new Date(2013,2,25,9,0,0)).getTime()); s.scheduledTasks.Alan.earlyFinish.should.eql((new Date(2013,2,25,11,0,0)).getTime()); s.scheduledTasks.James.earlyStart.should.eql((new Date(2013,2,26,8,0,0)).getTime()); s.scheduledTasks.James.earlyFinish.should.eql((new Date(2013,2,26,16,0,0)).getTime()); s.scheduledTasks.Steve.earlyStart.should.eql((new Date(2013,2,25,12,0,0)).getTime()); s.scheduledTasks.Steve.earlyFinish.should.eql((new Date(2013,2,25,13,0,0)).getTime()); s.scheduledTasks.Mark.earlyStart.should.eql((new Date(2013,2,25,13,0,0)).getTime()); s.scheduledTasks.Mark.earlyFinish.should.eql((new Date(2013,2,25,15,0,0)).getTime()); s.scheduledTasks.Alex.earlyStart.should.eql((new Date(2013,2,27,8,0,0)).getTime()); s.scheduledTasks.Alex.earlyFinish.should.eql((new Date(2013,2,27,16,0,0)).getTime()); // check out how long completing our tasks took s.start.should.eql((new Date(2013,2,21,8,0,0)).getTime()); s.end.should.eql((new Date(2013,2,28,11,0,0)).getTime()); // It took from 3/21 at 8am until 3/28 at 11am to complete the tasks // lets see what happens if we add in a second elevator t = t.resources([['E1', 'E2']]); // nested array means OR tasks = t(reservations); s = schedule.create(tasks, resources, null, start); s.scheduledTasks.Joe.earlyStart.should.eql((new Date(2013,2,21,12,0,0)).getTime()); s.scheduledTasks.Joe.earlyFinish.should.eql((new Date(2013,2,21,16,0,0)).getTime()); s.scheduledTasks.Mike.earlyStart.should.eql((new Date(2013,2,21,8,0,0)).getTime()); s.scheduledTasks.Mike.earlyFinish.should.eql((new Date(2013,2,21,10,0,0)).getTime()); s.scheduledTasks.Frank.earlyStart.should.eql((new Date(2013,2,21,8,0,0)).getTime()); s.scheduledTasks.Frank.earlyFinish.should.eql((new Date(2013,2,21,16,0,0)).getTime()); s.scheduledTasks.John.earlyStart.should.eql((new Date(2013,2,22,8,0,0)).getTime()); s.scheduledTasks.John.earlyFinish.should.eql((new Date(2013,2,22,11,0,0)).getTime()); s.scheduledTasks.Peter.earlyStart.should.eql((new Date(2013,2,22,8,0,0)).getTime()); s.scheduledTasks.Peter.earlyFinish.should.eql((new Date(2013,2,22,9,0,0)).getTime()); s.scheduledTasks.Sam.earlyStart.should.eql((new Date(2013,2,21,10,0,0)).getTime()); s.scheduledTasks.Sam.earlyFinish.should.eql((new Date(2013,2,21,12,0,0)).getTime()); s.scheduledTasks.Alan.earlyStart.should.eql((new Date(2013,2,22,9,0,0)).getTime()); s.scheduledTasks.Alan.earlyFinish.should.eql((new Date(2013,2,22,11,0,0)).getTime()); s.scheduledTasks.James.earlyStart.should.eql((new Date(2013,2,25,8,0,0)).getTime()); s.scheduledTasks.James.earlyFinish.should.eql((new Date(2013,2,25,16,0,0)).getTime()); s.scheduledTasks.Steve.earlyStart.should.eql((new Date(2013,2,22,12,0,0)).getTime()); s.scheduledTasks.Steve.earlyFinish.should.eql((new Date(2013,2,22,13,0,0)).getTime()); s.scheduledTasks.Mark.earlyStart.should.eql((new Date(2013,2,22,11,0,0)).getTime()); s.scheduledTasks.Mark.earlyFinish.should.eql((new Date(2013,2,22,13,0,0)).getTime()); s.scheduledTasks.Alex.earlyStart.should.eql((new Date(2013,2,25,8,0,0)).getTime()); s.scheduledTasks.Alex.earlyFinish.should.eql((new Date(2013,2,25,16,0,0)).getTime()); // now we can end on 3/25 s.start.should.eql((new Date(2013,2,21,8,0,0)).getTime()); s.end.should.eql((new Date(2013,2,25,16,0,0)).getTime()); }); });