tw-shift-schedule
Version:
1,137 lines (1,074 loc) • 33.1 kB
JavaScript
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)
]
}