UNPKG

tw-shift-schedule

Version:
1,137 lines (1,074 loc) 33.1 kB
const tape = require('tape') const Schedule = require('../src/schedule') const validate = require('../src/validate') const moment = require('moment') const { same } = require('./util') // d(0, 8) == 2018-01-01 00:00:00 - 2018-01-01 08:00:00 tape('正常工時 - 不加班', function (t) { let schedule = Schedule.fromTime([ d(0, 8), d(1, 8), d(2, 8), d(3, 8), d(4, 8) ]) same( t, validate(schedule), [] ) t.end() }) tape('正常工時 - 加班', function (t) { let schedule = Schedule.fromTime([ d(0, 12), d(1, 12), d(2, 12), d(3, 12), d(4, 12), d(5, 12) ]) same( t, validate(schedule), [] ) t.end() }) tape('正常工時 - 違法 - 缺例假', function (t) { let schedule = Schedule.fromTime([ d(0, 12), d(1, 12), d(2, 12), d(3, 12), d(4, 12), d(5, 12), d(6, 12) ]) same( t, validate(schedule), [ { type: 'error', msg: '每週至少要有一個例假', offset: 8640, time: moment('2018-01-07T08:00:00.000') } ] ) t.end() }) tape('正常工時 - 違法 - 一個月加班超過上限', function (t) { let schedule = Schedule.fromTime([ d(0, 12), d(1, 12), d(2, 12), d(3, 12), d(4, 12), d(5, 12), // 休一天 d(7, 12), d(8, 12), d(9, 12), d(10, 12), d(11, 12), d(12, 12), // 休一天 d(14, 12), d(15, 12), d(16, 12), d(17, 12), d(18, 12), d(19, 12), // 休一天 d(21, 12), d(22, 12), d(23, 12), d(24, 12), d(25, 12), d(26, 12), // 休一天 d(28, 12), d(29, 12), d(30, 12), d(31, 12), d(32, 12), d(33, 12) ]) same( t, validate(schedule), [ { type: 'error', offset: 0, msg: '單月加班時數超過上限', time: moment('2018-01-01T08:00:00.000'), value: 128 } ] ) t.end() }) tape('正常工時 - 違法 - 第一個月合法,第二個月加班超過上限', function (t) { let schedule = Schedule.fromTime([ d(0, 8), d(1, 8), d(2, 8), d(3, 8), d(4, 8), d(5, 8), // 休一天 d(7, 8), d(8, 8), d(9, 8), d(10, 8), d(11, 8), d(12, 8), // 休一天 d(14, 8), d(15, 8), d(16, 8), d(17, 8), d(18, 8), d(19, 8), // 休一天 d(21, 8), d(22, 8), d(23, 8), d(24, 8), d(25, 8), d(26, 8), // 休一天 d(28, 12), d(29, 12), d(30, 12), d(31, 12), d(32, 12), d(33, 12), // 休一天 d(35, 12), d(36, 12), d(37, 12), d(38, 12), d(39, 12), d(40, 12), // 休一天 d(42, 12), d(43, 12), d(44, 12), d(45, 12), d(46, 12), d(47, 12), // 休一天 d(49, 12), d(50, 12), d(51, 12), d(52, 12), d(53, 12), d(54, 12) ]) same( t, validate(schedule), [ { type: 'error', offset: 44640, msg: '單月加班時數超過上限', time: moment('2018-02-01T08:00:00.000'), value: 96 } ] ) t.end() }) tape('正常工時 - 違法 - 第一個月跟第二個月加班都超過上限', function (t) { let schedule = Schedule.fromTime([ d(0, 12), d(1, 12), d(2, 12), d(3, 12), d(4, 12), d(5, 12), // 休一天 d(7, 12), d(8, 12), d(9, 12), d(10, 12), d(11, 12), d(12, 12), // 休一天 d(14, 12), d(15, 12), d(16, 12), d(17, 12), d(18, 12), d(19, 12), // 休一天 d(21, 12), d(22, 12), d(23, 12), d(24, 12), d(25, 12), d(26, 12), // 休一天 d(28, 12), d(29, 12), d(30, 12), d(31, 12), d(32, 12), d(33, 12), // 休一天 d(35, 12), d(36, 12), d(37, 12), d(38, 12), d(39, 12), d(40, 12), // 休一天 d(42, 12), d(43, 12), d(44, 12), d(45, 12), d(46, 12), d(47, 12), // 休一天 d(49, 12), d(50, 12), d(51, 12), d(52, 12), d(53, 12), d(54, 12) ]) same( t, validate(schedule), [ { type: 'error', offset: 0, msg: '單月加班時數超過上限', time: moment('2018-01-01T08:00:00.000'), value: 128 }, { type: 'error', offset: 44640, msg: '單月加班時數超過上限', time: moment('2018-02-01T08:00:00.000'), value: 96 } ] ) t.end() }) tape('雙週變形工時 - 長度不足', function (t) { let schedule = Schedule.fromTime([d(0, 12)]) same( t, validate(schedule, { transformed: validate.transformed.two_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' } ] ) t.end() }) tape('雙週變形工時 - 違法 - 單一工時時段超過 12 小時', function (t) { let schedule = Schedule.fromTime([d(0, 13)]) same( t, validate(schedule, { transformed: validate.transformed.two_week }), [ { type: 'error', msg: '工時違法', offset: 0, time: moment('2018-01-01T08:00:00.000') }, { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' } ] ) t.end() }) tape('雙週變形工時 - 違法 - 連續工作超過六日', function (t) { let schedule = Schedule.fromTime([ d(0, 12), d(1, 12), d(2, 12), d(3, 12), d(4, 12), d(5, 12), d(6, 12) ]) same( t, validate(schedule, { transformed: validate.transformed.two_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' }, { type: 'error', msg: '連續工作超過六日', offset: 8640, time: moment('2018-01-07T08:00:00.000') } ] ) t.end() }) tape('雙週變形工時 - 空班加班,不超過加班上限', function (t) { let schedule = Schedule.fromTime([ d(0, 10), d(1, 10), d(2, 10), d(3, 10), d(4, 8), // 休兩天 d(7, 10), d(8, 10), d(9, 10), d(10, 10), d(11, 8), // 休兩天 d(14, 10), d(15, 10), d(16, 10), d(17, 10), d(18, 8), // 休兩天 d(21, 10), d(22, 10), d(23, 10), d(24, 10), d(25, 8), // 休兩天 d(28, 10), d(29, 10), d(30, 10), d(31, 10), d(32, 8) ]) same( t, validate(schedule, { transformed: validate.transformed.two_week }), [] ) t.end() }) tape('雙週變形工時 - 違法 - 空班加班,超過單月加班上限', function (t) { let schedule = Schedule.fromTime([ d(0, 12), d(1, 12), d(2, 12), d(3, 12), d(4, 12), // 休兩天 d(7, 12), d(8, 12), d(9, 12), d(10, 12), d(11, 12), // 休兩天 d(14, 12), d(15, 12), d(16, 12), d(17, 12), d(18, 12), // 休兩天 d(21, 12), d(22, 12), d(23, 12), d(24, 12), d(25, 12), // 休兩天 d(28, 12), d(29, 12), d(30, 12), d(31, 12), d(32, 12) ]) same( t, validate(schedule, { transformed: validate.transformed.two_week }), [ { type: 'error', offset: 0, msg: '單月加班時數超過上限', time: moment('2018-01-01T08:00:00.000'), value: 80 } ] ) t.end() }) tape('雙週變形工時 - 違法 - 第一個月與第二個月都超過加班上限', function (t) { let schedule = Schedule.fromTime([ d(0, 12), d(1, 12), d(2, 12), d(3, 12), d(4, 12), // 休兩天 d(7, 12), d(8, 12), d(9, 12), d(10, 12), d(11, 12), // 休兩天 d(14, 12), d(15, 12), d(16, 12), d(17, 12), d(18, 12), // 休兩天 d(21, 12), d(22, 12), d(23, 12), d(24, 12), d(25, 12), // 休兩天 d(28, 12), d(29, 12), d(30, 12), d(31, 12), d(32, 12), // 休兩天 d(35, 12), d(36, 12), d(37, 12), d(38, 12), d(39, 12), // 休兩天 d(42, 12), d(43, 12), d(44, 12), d(45, 12), d(46, 12), // 休兩天 d(49, 12), d(50, 12), d(51, 12), d(52, 12), d(53, 12), d(54, 12), // 休一天 d(56, 12), d(57, 12), d(58, 12), d(59, 12), d(60, 12) ]) same( t, validate(schedule, { transformed: validate.transformed.two_week }), [ { type: 'error', offset: 0, msg: '單月加班時數超過上限', time: moment('2018-01-01T08:00:00.000'), value: 80 }, { type: 'error', offset: 44640, msg: '單月加班時數超過上限', time: moment('2018-02-01T08:00:00.000'), value: 92 } ] ) t.end() }) tape('雙週變形工時 - 違法 - 第一個月合法,第二個月超過加班上限', function (t) { let schedule = Schedule.fromTime([ d(0, 12), d(1, 12), d(2, 12), d(3, 12), // 休三天 d(7, 12), d(8, 12), d(9, 12), d(10, 12), // 休三天 d(14, 12), d(15, 12), d(16, 12), d(17, 12), // 休三天 d(21, 12), d(22, 12), d(23, 12), d(24, 12), // 休三天 d(28, 12), d(29, 12), d(30, 12), d(31, 12), d(32, 12), // 休兩天 d(35, 12), d(36, 12), d(37, 12), d(38, 12), d(39, 12), // 休兩天 d(42, 12), d(43, 12), d(44, 12), d(45, 12), d(46, 12), // 休兩天 d(49, 12), d(50, 12), d(51, 12), d(52, 12), d(53, 12), d(54, 12), // 休一天 d(56, 12), d(57, 12), d(58, 12), d(59, 12), d(60, 12) ]) same( t, validate(schedule, { transformed: validate.transformed.two_week }), [ { type: 'error', offset: 44640, msg: '單月加班時數超過上限', time: moment('2018-02-01T08:00:00.000'), value: 92 } ] ) t.end() }) tape('雙週變形工時 - 合法加班', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 12:00:00'], ['2018-01-02 00:00:00', '2018-01-02 12:00:00'], ['2018-01-03 00:00:00', '2018-01-03 12:00:00'], ['2018-01-04 00:00:00', '2018-01-04 12:00:00'], ['2018-01-05 00:00:00', '2018-01-05 12:00:00'], // 休兩天 ['2018-01-08 00:00:00', '2018-01-08 12:00:00'], ['2018-01-09 00:00:00', '2018-01-09 12:00:00'], ['2018-01-10 00:00:00', '2018-01-10 12:00:00'], ['2018-01-11 00:00:00', '2018-01-11 12:00:00'], ['2018-01-12 00:00:00', '2018-01-12 12:00:00'], // 休兩天 ['2018-01-15 00:00:00', '2018-01-15 12:00:00'], ['2018-01-16 00:00:00', '2018-01-16 12:00:00'], ['2018-01-17 00:00:00', '2018-01-17 12:00:00'], ['2018-01-18 00:00:00', '2018-01-18 12:00:00'], ['2018-01-19 00:00:00', '2018-01-19 12:00:00'] ]) same( t, validate(schedule, { transformed: validate.transformed.two_week }), [] ) t.end() }) tape('雙週變形工時 - 將一天工時挪移到其他天的基本情境', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 10:00:00'], ['2018-01-02 00:00:00', '2018-01-02 10:00:00'], ['2018-01-03 00:00:00', '2018-01-03 10:00:00'], ['2018-01-04 00:00:00', '2018-01-04 10:00:00'], // 休三天 ['2018-01-08 00:00:00', '2018-01-08 10:00:00'], ['2018-01-09 00:00:00', '2018-01-09 10:00:00'], ['2018-01-10 00:00:00', '2018-01-10 10:00:00'], ['2018-01-11 00:00:00', '2018-01-11 10:00:00'], // 休三天 ['2018-01-15 00:00:00', '2018-01-15 10:00:00'], ['2018-01-16 00:00:00', '2018-01-16 10:00:00'], ['2018-01-17 00:00:00', '2018-01-17 10:00:00'], ['2018-01-18 00:00:00', '2018-01-18 10:00:00'] ]) same( t, validate(schedule, { transformed: validate.transformed.two_week }), [] ) t.end() }) tape('四週變形工時 - 長度不足', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 12:00:00'] ]) same( t, validate(schedule, { transformed: validate.transformed.four_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' } ] ) t.end() }) tape('四週變形工時 - 違法 - 單一班超過 12 小時', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 13:00:00'] ]) same( t, validate(schedule, { transformed: validate.transformed.four_week }), [ { type: 'error', msg: '工時違法', offset: 0, time: moment('2018-01-01T00:00:00.000') }, { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' } ] ) t.end() }) tape('四週變形工時 - 違法 - 單一班超過 12 小時 - 中間有休息', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 06:00:00'], ['2018-01-01 07:00:00', '2018-01-01 14:00:00'] ]) same( t, validate(schedule, { transformed: validate.transformed.four_week }), [ { type: 'error', msg: '工時違法', offset: 420, time: moment('2018-01-01T07:00:00.000') }, { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' } ] ) t.end() }) tape('四週變形工時 - 合法', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 12:00:00'], ['2018-01-02 00:00:00', '2018-01-02 12:00:00'], ['2018-01-03 00:00:00', '2018-01-03 12:00:00'], ['2018-01-04 00:00:00', '2018-01-04 12:00:00'], // 三天空班 // 五天例假 + 休息日 ['2018-01-13 00:00:00', '2018-01-13 12:00:00'], ['2018-01-14 00:00:00', '2018-01-14 12:00:00'], // ['2018-01-15 00:00:00', '2018-01-15 12:00:00'], ['2018-01-16 00:00:00', '2018-01-16 12:00:00'], ['2018-01-17 00:00:00', '2018-01-17 12:00:00'], ['2018-01-18 00:00:00', '2018-01-18 12:00:00'], ['2018-01-19 00:00:00', '2018-01-19 12:00:00'], ['2018-01-20 00:00:00', '2018-01-20 12:00:00'], ['2018-01-21 00:00:00', '2018-01-21 12:00:00'], // 休息一天 + 空班一天 ['2018-01-23 00:00:00', '2018-01-23 12:00:00'], ['2018-01-24 00:00:00', '2018-01-24 12:00:00'], ['2018-01-25 00:00:00', '2018-01-25 12:00:00'], ['2018-01-26 00:00:00', '2018-01-26 12:00:00'] // 休一天 ]) same( t, validate(schedule, { transformed: validate.transformed.four_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' } ] ) t.end() }) tape('四週變形工時 - 合法連上 24 天', function (t) { let schedule = Schedule.fromTime([ // TODO: Schedule.fromTime 無法處理週期的起始是休假日的狀況,所以這邊把一天放到第一天,標記週期的開始 ['2018-01-01 00:00:00', '2018-01-01 08:00:00'], // 兩天例假 ['2018-01-04 00:00:00', '2018-01-04 08:00:00'], ['2018-01-05 00:00:00', '2018-01-05 08:00:00'], ['2018-01-06 00:00:00', '2018-01-06 08:00:00'], ['2018-01-07 00:00:00', '2018-01-07 08:00:00'], // ['2018-01-08 00:00:00', '2018-01-08 08:00:00'], ['2018-01-09 00:00:00', '2018-01-09 08:00:00'], ['2018-01-10 00:00:00', '2018-01-10 08:00:00'], ['2018-01-11 00:00:00', '2018-01-11 08:00:00'], ['2018-01-12 00:00:00', '2018-01-12 08:00:00'], ['2018-01-13 00:00:00', '2018-01-13 08:00:00'], ['2018-01-14 00:00:00', '2018-01-14 08:00:00'], // ['2018-01-15 00:00:00', '2018-01-15 08:00:00'], ['2018-01-16 00:00:00', '2018-01-16 08:00:00'], ['2018-01-17 00:00:00', '2018-01-17 08:00:00'], ['2018-01-18 00:00:00', '2018-01-18 08:00:00'], ['2018-01-19 00:00:00', '2018-01-19 08:00:00'], ['2018-01-20 00:00:00', '2018-01-20 08:00:00'], ['2018-01-21 00:00:00', '2018-01-21 08:00:00'], // ['2018-01-22 00:00:00', '2018-01-22 08:00:00'], ['2018-01-23 00:00:00', '2018-01-23 08:00:00'], ['2018-01-24 00:00:00', '2018-01-24 08:00:00'], ['2018-01-25 00:00:00', '2018-01-25 08:00:00'], ['2018-01-26 00:00:00', '2018-01-26 08:00:00'] // 兩天例假 ]) same( t, validate(schedule, { transformed: validate.transformed.four_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' } ] ) t.end() }) tape('四週變形工時 - 四周內空班日都在加班', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 08:00:00'], ['2018-01-02 00:00:00', '2018-01-02 08:00:00'], // 兩天例假 ['2018-01-06 00:00:00', '2018-01-06 08:00:00'], ['2018-01-07 00:00:00', '2018-01-07 08:00:00'], // ['2018-01-08 00:00:00', '2018-01-08 08:00:00'], ['2018-01-09 00:00:00', '2018-01-09 08:00:00'], ['2018-01-10 00:00:00', '2018-01-10 08:00:00'], ['2018-01-11 00:00:00', '2018-01-11 08:00:00'], ['2018-01-12 00:00:00', '2018-01-12 08:00:00'], ['2018-01-13 00:00:00', '2018-01-13 08:00:00'], ['2018-01-14 00:00:00', '2018-01-14 08:00:00'], // ['2018-01-15 00:00:00', '2018-01-15 08:00:00'], ['2018-01-16 00:00:00', '2018-01-16 08:00:00'], ['2018-01-17 00:00:00', '2018-01-17 08:00:00'], ['2018-01-18 00:00:00', '2018-01-18 08:00:00'], ['2018-01-19 00:00:00', '2018-01-19 08:00:00'], ['2018-01-20 00:00:00', '2018-01-20 08:00:00'], ['2018-01-21 00:00:00', '2018-01-21 08:00:00'], // ['2018-01-23 00:00:00', '2018-01-23 08:00:00'], ['2018-01-24 00:00:00', '2018-01-24 08:00:00'], ['2018-01-25 00:00:00', '2018-01-25 08:00:00'] // 四天例假 ]) same( t, validate(schedule, { transformed: validate.transformed.four_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' } ] ) t.end() }) tape('四週變形工時 - 違法 - 兩周內例假不足', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 08:00:00'], ['2018-01-02 00:00:00', '2018-01-02 08:00:00'], ['2018-01-03 00:00:00', '2018-01-03 08:00:00'], ['2018-01-04 00:00:00', '2018-01-04 08:00:00'], ['2018-01-05 00:00:00', '2018-01-05 08:00:00'], ['2018-01-06 00:00:00', '2018-01-06 08:00:00'], ['2018-01-07 00:00:00', '2018-01-07 08:00:00'], // ['2018-01-08 00:00:00', '2018-01-08 08:00:00'], ['2018-01-09 00:00:00', '2018-01-09 08:00:00'], ['2018-01-10 00:00:00', '2018-01-10 08:00:00'], ['2018-01-11 00:00:00', '2018-01-11 08:00:00'], ['2018-01-12 00:00:00', '2018-01-12 08:00:00'], ['2018-01-13 00:00:00', '2018-01-13 08:00:00'], ['2018-01-14 00:00:00', '2018-01-14 08:00:00'], // ['2018-01-15 00:00:00', '2018-01-15 08:00:00'], ['2018-01-16 00:00:00', '2018-01-16 08:00:00'], ['2018-01-17 00:00:00', '2018-01-17 08:00:00'], ['2018-01-18 00:00:00', '2018-01-18 08:00:00'], ['2018-01-19 00:00:00', '2018-01-19 08:00:00'], ['2018-01-20 00:00:00', '2018-01-20 08:00:00'], ['2018-01-21 00:00:00', '2018-01-21 08:00:00'], // ['2018-01-23 00:00:00', '2018-01-23 08:00:00'], ['2018-01-24 00:00:00', '2018-01-24 08:00:00'], ['2018-01-25 00:00:00', '2018-01-25 08:00:00'] // 四天例假 ]) same( t, validate(schedule, { transformed: validate.transformed.four_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' }, { type: 'error', msg: '每兩週內應有兩個例假', offset: 18720, time: moment('2018-01-14T00:00:00.000') } ] ) t.end() }) tape('四週變形工時 - 違法 - 單月加班超過上限', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 12:00:00'], ['2018-01-02 00:00:00', '2018-01-02 12:00:00'], // 兩天例假 ['2018-01-06 00:00:00', '2018-01-06 12:00:00'], ['2018-01-07 00:00:00', '2018-01-07 12:00:00'], // ['2018-01-08 00:00:00', '2018-01-08 12:00:00'], ['2018-01-09 00:00:00', '2018-01-09 12:00:00'], ['2018-01-10 00:00:00', '2018-01-10 12:00:00'], ['2018-01-11 00:00:00', '2018-01-11 12:00:00'], ['2018-01-12 00:00:00', '2018-01-12 12:00:00'], ['2018-01-13 00:00:00', '2018-01-13 12:00:00'], ['2018-01-14 00:00:00', '2018-01-14 12:00:00'], // ['2018-01-15 00:00:00', '2018-01-15 12:00:00'], ['2018-01-16 00:00:00', '2018-01-16 12:00:00'], ['2018-01-17 00:00:00', '2018-01-17 12:00:00'], ['2018-01-18 00:00:00', '2018-01-18 12:00:00'], ['2018-01-19 00:00:00', '2018-01-19 12:00:00'], ['2018-01-20 00:00:00', '2018-01-20 12:00:00'], ['2018-01-21 00:00:00', '2018-01-21 12:00:00'], // ['2018-01-23 00:00:00', '2018-01-23 12:00:00'], ['2018-01-24 00:00:00', '2018-01-24 12:00:00'], ['2018-01-25 00:00:00', '2018-01-25 12:00:00'] // 四天例假 ]) same( t, validate(schedule, { transformed: validate.transformed.four_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' }, { type: 'error', offset: 0, msg: '單月加班時數超過上限', time: moment('2018-01-01T00:00:00.000'), value: 92 } ] ) t.end() }) tape('八週變形工時 - 長度不足', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 12:00:00'] ]) same( t, validate(schedule, { transformed: validate.transformed.eight_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' } ] ) t.end() }) tape('八週變形工時 - 合法不加班', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 10:00:00'], ['2018-01-02 00:00:00', '2018-01-02 10:00:00'], ['2018-01-03 00:00:00', '2018-01-03 10:00:00'], ['2018-01-04 00:00:00', '2018-01-04 10:00:00'], ['2018-01-05 00:00:00', '2018-01-05 10:00:00'], ['2018-01-06 00:00:00', '2018-01-06 10:00:00'], // 休一天 ['2018-01-08 00:00:00', '2018-01-08 10:00:00'], ['2018-01-09 00:00:00', '2018-01-09 10:00:00'], ['2018-01-10 00:00:00', '2018-01-10 10:00:00'], ['2018-01-11 00:00:00', '2018-01-11 10:00:00'], ['2018-01-12 00:00:00', '2018-01-12 10:00:00'], ['2018-01-13 00:00:00', '2018-01-13 10:00:00'], // 休一天 ['2018-01-15 00:00:00', '2018-01-15 10:00:00'], ['2018-01-16 00:00:00', '2018-01-16 10:00:00'], ['2018-01-17 00:00:00', '2018-01-17 10:00:00'], ['2018-01-18 00:00:00', '2018-01-18 10:00:00'], ['2018-01-19 00:00:00', '2018-01-19 10:00:00'], ['2018-01-20 00:00:00', '2018-01-20 10:00:00'], // 休一天 ['2018-01-22 00:00:00', '2018-01-22 10:00:00'], ['2018-01-23 00:00:00', '2018-01-23 10:00:00'], ['2018-01-24 00:00:00', '2018-01-24 10:00:00'], ['2018-01-25 00:00:00', '2018-01-25 10:00:00'], ['2018-01-26 00:00:00', '2018-01-26 10:00:00'], ['2018-01-27 00:00:00', '2018-01-27 10:00:00'], // 休一天 ['2018-01-29 00:00:00', '2018-01-29 10:00:00'], ['2018-01-30 00:00:00', '2018-01-30 10:00:00'], ['2018-01-31 00:00:00', '2018-01-31 10:00:00'], ['2018-02-01 00:00:00', '2018-02-01 10:00:00'], ['2018-02-02 00:00:00', '2018-02-02 10:00:00'], ['2018-02-03 00:00:00', '2018-02-03 10:00:00'], // 休一天 ['2018-02-05 00:00:00', '2018-02-05 10:00:00'], ['2018-02-06 00:00:00', '2018-02-06 10:00:00'], ['2018-02-07 00:00:00', '2018-02-07 10:00:00'], ['2018-02-08 00:00:00', '2018-02-08 10:00:00'], ['2018-02-09 00:00:00', '2018-02-09 10:00:00'], ['2018-02-10 00:00:00', '2018-02-10 10:00:00'], // 休一天 ['2018-02-12 00:00:00', '2018-02-12 10:00:00'], ['2018-02-13 00:00:00', '2018-02-13 10:00:00'], ['2018-02-14 00:00:00', '2018-02-14 10:00:00'], ['2018-02-15 00:00:00', '2018-02-15 10:00:00'], // 休 10 天 ['2018-02-26 00:00:00', '2018-02-26 10:00:00'] ]) same( t, validate(schedule, { transformed: validate.transformed.eight_week }), [] ) t.end() }) tape('八週變形工時 - 違法 - 單一工時時段不合法', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 13:00:00'] ]) same( t, validate(schedule, { transformed: validate.transformed.eight_week }), [ { type: 'error', msg: '工時違法', offset: 0, time: moment('2018-01-01T00:00:00.000') }, { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' } ] ) t.end() }) tape('八週變形工時 - 違法 - 連續工作超過六日', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 12:00:00'], ['2018-01-02 00:00:00', '2018-01-02 12:00:00'], ['2018-01-03 00:00:00', '2018-01-03 12:00:00'], ['2018-01-04 00:00:00', '2018-01-04 12:00:00'], ['2018-01-05 00:00:00', '2018-01-05 12:00:00'], ['2018-01-06 00:00:00', '2018-01-06 12:00:00'], ['2018-01-07 00:00:00', '2018-01-07 12:00:00'] ]) same( t, validate(schedule, { transformed: validate.transformed.eight_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' }, { type: 'error', msg: '連續工作超過六日', offset: 8640, time: moment('2018-01-07T00:00:00.000') } ] ) t.end() }) tape('八週變形工時 - 合法加班', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 10:00:00'], ['2018-01-02 00:00:00', '2018-01-02 10:00:00'], ['2018-01-03 00:00:00', '2018-01-03 10:00:00'], ['2018-01-04 00:00:00', '2018-01-04 10:00:00'], ['2018-01-05 00:00:00', '2018-01-05 10:00:00'], ['2018-01-06 00:00:00', '2018-01-06 10:00:00'], // 休一天 ['2018-01-08 00:00:00', '2018-01-08 10:00:00'], ['2018-01-09 00:00:00', '2018-01-09 10:00:00'], ['2018-01-10 00:00:00', '2018-01-10 10:00:00'], ['2018-01-11 00:00:00', '2018-01-11 10:00:00'], ['2018-01-12 00:00:00', '2018-01-12 10:00:00'], ['2018-01-13 00:00:00', '2018-01-13 10:00:00'], // 休一天 ['2018-01-15 00:00:00', '2018-01-15 10:00:00'], ['2018-01-16 00:00:00', '2018-01-16 10:00:00'], ['2018-01-17 00:00:00', '2018-01-17 10:00:00'], ['2018-01-18 00:00:00', '2018-01-18 10:00:00'], ['2018-01-19 00:00:00', '2018-01-19 10:00:00'], ['2018-01-20 00:00:00', '2018-01-20 10:00:00'], // 休一天 ['2018-01-22 00:00:00', '2018-01-22 10:00:00'], ['2018-01-23 00:00:00', '2018-01-23 10:00:00'], ['2018-01-24 00:00:00', '2018-01-24 10:00:00'], ['2018-01-25 00:00:00', '2018-01-25 10:00:00'], ['2018-01-26 00:00:00', '2018-01-26 10:00:00'], ['2018-01-27 00:00:00', '2018-01-27 10:00:00'], // 休一天 ['2018-01-29 00:00:00', '2018-01-29 10:00:00'], ['2018-01-30 00:00:00', '2018-01-30 10:00:00'], ['2018-01-31 00:00:00', '2018-01-31 10:00:00'], ['2018-02-01 00:00:00', '2018-02-01 10:00:00'], ['2018-02-02 00:00:00', '2018-02-02 10:00:00'], ['2018-02-03 00:00:00', '2018-02-03 10:00:00'], // 休一天 ['2018-02-05 00:00:00', '2018-02-05 10:00:00'], ['2018-02-06 00:00:00', '2018-02-06 10:00:00'], ['2018-02-07 00:00:00', '2018-02-07 10:00:00'], ['2018-02-08 00:00:00', '2018-02-08 10:00:00'], ['2018-02-09 00:00:00', '2018-02-09 10:00:00'], ['2018-02-10 00:00:00', '2018-02-10 10:00:00'], // 休一天 ['2018-02-12 00:00:00', '2018-02-12 10:00:00'], ['2018-02-13 00:00:00', '2018-02-13 10:00:00'], ['2018-02-14 00:00:00', '2018-02-14 10:00:00'], ['2018-02-15 00:00:00', '2018-02-15 10:00:00'] // 休 10 天 ]) same( t, validate(schedule, { transformed: validate.transformed.eight_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' } ] ) t.end() }) tape('八週變形工時 - 違法 - 休息日都在加班 - 超過加班上限', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 10:00:00'], ['2018-01-02 00:00:00', '2018-01-02 10:00:00'], ['2018-01-03 00:00:00', '2018-01-03 10:00:00'], ['2018-01-04 00:00:00', '2018-01-04 10:00:00'], ['2018-01-05 00:00:00', '2018-01-05 10:00:00'], ['2018-01-06 00:00:00', '2018-01-06 10:00:00'], // 休一天 ['2018-01-08 00:00:00', '2018-01-08 10:00:00'], ['2018-01-09 00:00:00', '2018-01-09 10:00:00'], ['2018-01-10 00:00:00', '2018-01-10 10:00:00'], ['2018-01-11 00:00:00', '2018-01-11 10:00:00'], ['2018-01-12 00:00:00', '2018-01-12 10:00:00'], ['2018-01-13 00:00:00', '2018-01-13 10:00:00'], // 休一天 ['2018-01-15 00:00:00', '2018-01-15 10:00:00'], ['2018-01-16 00:00:00', '2018-01-16 10:00:00'], ['2018-01-17 00:00:00', '2018-01-17 10:00:00'], ['2018-01-18 00:00:00', '2018-01-18 10:00:00'], ['2018-01-19 00:00:00', '2018-01-19 10:00:00'], ['2018-01-20 00:00:00', '2018-01-20 10:00:00'], // 休一天 ['2018-01-22 00:00:00', '2018-01-22 10:00:00'], ['2018-01-23 00:00:00', '2018-01-23 10:00:00'], ['2018-01-24 00:00:00', '2018-01-24 10:00:00'], ['2018-01-25 00:00:00', '2018-01-25 10:00:00'], ['2018-01-26 00:00:00', '2018-01-26 10:00:00'], ['2018-01-27 00:00:00', '2018-01-27 10:00:00'], // 休一天 ['2018-01-29 00:00:00', '2018-01-29 10:00:00'], ['2018-01-30 00:00:00', '2018-01-30 10:00:00'], ['2018-01-31 00:00:00', '2018-01-31 10:00:00'], ['2018-02-01 00:00:00', '2018-02-01 10:00:00'], ['2018-02-02 00:00:00', '2018-02-02 10:00:00'], ['2018-02-03 00:00:00', '2018-02-03 10:00:00'], // 休一天 ['2018-02-05 00:00:00', '2018-02-05 10:00:00'], ['2018-02-06 00:00:00', '2018-02-06 10:00:00'], ['2018-02-07 00:00:00', '2018-02-07 10:00:00'], ['2018-02-08 00:00:00', '2018-02-08 10:00:00'], ['2018-02-09 00:00:00', '2018-02-09 10:00:00'], ['2018-02-10 00:00:00', '2018-02-10 10:00:00'], // 休一天 ['2018-02-12 00:00:00', '2018-02-12 10:00:00'], ['2018-02-13 00:00:00', '2018-02-13 10:00:00'], ['2018-02-14 00:00:00', '2018-02-14 10:00:00'], ['2018-02-15 00:00:00', '2018-02-15 10:00:00'], ['2018-02-16 00:00:00', '2018-02-16 10:00:00'], ['2018-02-17 00:00:00', '2018-02-17 10:00:00'], // 休 1 天 ['2018-02-19 00:00:00', '2018-02-19 10:00:00'], ['2018-02-20 00:00:00', '2018-02-20 10:00:00'], ['2018-02-21 00:00:00', '2018-02-21 10:00:00'], ['2018-02-22 00:00:00', '2018-02-22 10:00:00'], ['2018-02-23 00:00:00', '2018-02-23 10:00:00'], ['2018-02-24 00:00:00', '2018-02-24 10:00:00'] ]) same( t, validate(schedule, { transformed: validate.transformed.eight_week }), [ { type: 'warning', msg: '班表不完整,無法正確檢驗變形工時' }, { type: 'error', offset: 0, msg: '單月加班時數超過上限', time: moment('2018-01-01T00:00:00.000'), value: 160 } ] ) t.end() }) tape('八週變形工時 - 合法班表範例 - 不加班', function (t) { let schedule = Schedule.fromTime([ ['2018-01-01 00:00:00', '2018-01-01 08:00:00'], ['2018-01-02 00:00:00', '2018-01-02 08:00:00'], ['2018-01-03 00:00:00', '2018-01-03 08:00:00'], ['2018-01-04 00:00:00', '2018-01-04 08:00:00'], ['2018-01-05 00:00:00', '2018-01-05 08:00:00'], ['2018-01-06 00:00:00', '2018-01-06 08:00:00'], // 休一天 ['2018-01-08 00:00:00', '2018-01-08 08:00:00'], ['2018-01-09 00:00:00', '2018-01-09 08:00:00'], ['2018-01-10 00:00:00', '2018-01-10 08:00:00'], ['2018-01-11 00:00:00', '2018-01-11 08:00:00'], ['2018-01-12 00:00:00', '2018-01-12 08:00:00'], ['2018-01-13 00:00:00', '2018-01-13 08:00:00'], // 休一天 ['2018-01-15 00:00:00', '2018-01-15 08:00:00'], ['2018-01-16 00:00:00', '2018-01-16 08:00:00'], ['2018-01-17 00:00:00', '2018-01-17 08:00:00'], ['2018-01-18 00:00:00', '2018-01-18 08:00:00'], ['2018-01-19 00:00:00', '2018-01-19 08:00:00'], ['2018-01-20 00:00:00', '2018-01-20 08:00:00'], // 休一天 ['2018-01-22 00:00:00', '2018-01-22 08:00:00'], ['2018-01-23 00:00:00', '2018-01-23 08:00:00'], ['2018-01-24 00:00:00', '2018-01-24 08:00:00'], ['2018-01-25 00:00:00', '2018-01-25 08:00:00'], ['2018-01-26 00:00:00', '2018-01-26 08:00:00'], ['2018-01-27 00:00:00', '2018-01-27 08:00:00'], // 休一天 ['2018-01-29 00:00:00', '2018-01-29 08:00:00'], ['2018-01-30 00:00:00', '2018-01-30 08:00:00'], ['2018-01-31 00:00:00', '2018-01-31 08:00:00'], ['2018-02-01 00:00:00', '2018-02-01 08:00:00'], ['2018-02-02 00:00:00', '2018-02-02 08:00:00'], ['2018-02-03 00:00:00', '2018-02-03 08:00:00'], // 休一天 ['2018-02-05 00:00:00', '2018-02-05 08:00:00'], ['2018-02-06 00:00:00', '2018-02-06 08:00:00'], ['2018-02-07 00:00:00', '2018-02-07 08:00:00'], ['2018-02-08 00:00:00', '2018-02-08 08:00:00'], ['2018-02-09 00:00:00', '2018-02-09 08:00:00'], ['2018-02-10 00:00:00', '2018-02-10 08:00:00'], // 休一天 ['2018-02-12 00:00:00', '2018-02-12 08:00:00'], ['2018-02-13 00:00:00', '2018-02-13 08:00:00'], ['2018-02-14 00:00:00', '2018-02-14 08:00:00'], ['2018-02-15 00:00:00', '2018-02-15 08:00:00'], // 休 08 天 ['2018-02-26 00:00:00', '2018-02-26 08:00:00'] ]) same( t, validate(schedule, { transformed: validate.transformed.eight_week }), [] ) t.end() }) function d (dOffset, h) { let start = moment('2018-01-01 08:00:00') let format = 'YYYY-MM-DD HH:mm:ss' return [ start.clone().add(dOffset, 'days').format(format), start.clone().add(dOffset, 'days').add(h, 'hours').format(format) ] }