dienstplancreator git · main
Dienstplan (roster) creator, PHP/JS web app
JavaScript 50% PHP 40.5% CSS 8.5%git clone https://git.christianimmanuel.de/web-tools/dienstplancreator.gitwget https://git.christianimmanuel.de/web-tools/dienstplancreator/archive/dienstplancreator.tar.gzjs/fixdata.js raw
// FIX FILE_DATA -->
fixPersonShift = () => {
getShiftPeriod = (person_id, day_id, roster) => {
if (typeof roster === "undefined") roster = ROSTER
let day = roster[day_id].data
let period = []
day.forEach((data, time_id) => {
if (typeof data.person === "undefined") return
if (data.person.indexOf(person_id) !== -1) period.push(data.time)
})
return period
}
ROSTER_ALL.forEach((roster, roster_id) => {
if (roster.length === 0) return
delete roster.times
delete roster.timestart
delete roster.timeend
if ( typeof roster.person === "undefined" ) return
getTI = (time, data) => { return data.map((e) => {return e.time}).indexOf(time)}
roster.person.forEach((person, person_id) => {
delete person.hours_assigned
delete person.breaks_total
if (typeof person.shifts !== "undefined") return
roster.roster.forEach((day, day_id) => {
let period = getShiftPeriod(person_id, day_id, roster.roster)
if (typeof person.shifts === "undefined") person.shifts = []
if (period.length === 0) return
let dd = day.data
let start = period[0]
ROSTER_ALL[roster_id].person[person_id].shifts.push({day: day_id, start: getTI(period[0], dd), end: getTI(period[period.length-1], dd)})
})
})
roster.roster.forEach(day => {
day.data.forEach(data => {
delete data.person
})
})
roster.d = roster.date
roster.t = roster.timestep
roster.r = structuredClone(roster.roster)
roster.p = structuredClone(roster.person)
roster.s = roster.datestart
delete roster.roster
delete roster.person
delete roster.date
delete roster.timestep
delete roster.datestart
roster.r.forEach(roster => {
roster.n = roster.name
roster.d = roster.data
delete roster.name
delete roster.data
roster.d.forEach(data => {
data.t = data.time
data.a = data.amount
delete data.time
delete data.amount
})
})
roster.p.forEach((person) => {
person.n = person.name
person.h = person.hours
person.d = person.department
person.f = structuredClone(person.freedays)
person.p = person.preferred
person.s = structuredClone(person.shifts)
delete person.name
delete person.hours
delete person.department
delete person.freedays
delete person.preferred
delete person.shifts
person.s.forEach(shift => {
shift.d = shift.day
shift.s = shift.start
shift.e = shift.end
delete shift.day
delete shift.start
delete shift.end
})
})
})
}
fixShiftFromIdToTime = () => {
ROSTER_ALL.forEach((data, data_id) => {
let person = data.p
person.forEach((person, person_id) => {
person.s.forEach(shift => {
shift.s = data.r[0].d[shift.s].t
shift.e = data.r[0].d[shift.e].t
})
})
})
}
fixRosterPreVersion = () => {
ROSTER_ALL = structuredClone(DATA)
fixPersonShift()
fixShiftFromIdToTime()
}
fixVersionAddBreakday = () => {
ROSTER_ALL = structuredClone(DATA.a)
ROSTER_ALL.forEach(ra => { ra.b = [DAYBREAK_1, DAYBREAK_2] })
}
fixVersionNewDatabase = () => {
let PERSONS_ALL = []
ROSTER_ALL = DATA.a
ROSTER_ALL.forEach((ra, ra_id) => {
let shifts_all = DATA.a[ra_id].s = []
ra.p.forEach((pe, pe_id) => {
let shifts = pe.s
let person = PERSONS_ALL.filter(a => {return a.n === pe.n })[0]
let p_id = pe_id
if (typeof person !== "undefined") { p_id = person.id }
shifts.forEach(shift => {
let s_d_id = shifts_all.map(function(e) { return e.d; }).indexOf(shift.d);
if (s_d_id === -1) {
shifts_all.push({d: shift.d, s: []})
s_d_id = shifts_all.length-1
}
let s_d = shifts_all[s_d_id].s
delete shift.d
shift.p = p_id
s_d.push(shift)
})
if (typeof person === "undefined") {
let ill = (typeof pe.i === "undefined") ? [] : pe.i
PERSONS_ALL.push({id: pe_id, a: ROSTER_ALL[0].d, r: false, n: pe.n, h: pe.h, d: pe.d, f: pe.f, i: ill, v: pe.v, c: []})
}
})
})
//ROSTER_ALL.forEach(all => { delete all.p })
DATA.p = PERSONS_ALL
DATA.v = 1.2
}
fixVersionAddMpaToPerson = () => {
DATA.p.forEach(person => {person.m = []; DAYS.forEach(d => person.m.push(0))})
}
fixVersionAddDataSort = () => {
DATA.s = ["name", "name"]
}
fixVersionAddDataSortUpDown = () => {
DATA.s = [[`${DATA.s[0].substring(0, 1)}-d`], [`${DATA.s[1].substring(0, 1)}-d`]]
}
fixVersionPersonDepartmentToFloat = () => {
DATA.p.forEach(person => {person.d = parseFloat(person.d)})
}
fixVersionAddDataZoom = () => {
DATA.z = 100
}
fixVersionAddDataDepartment = () => {
DATA.d = structuredClone(DEPARTMENTS)
DATA.n = [{t: "Freie Tage", a: "Frei"}, {t: "mpA", a: "MPA"}]
}
fixVersionAddDataBetterment = () => {
DATA.p.forEach(person => {person.b = []})
}
fixVersionAddDataRenames = () => {
DATA.n.push({t: "Krank", a: "Krank"})
DATA.n.push({t: "Weiterbildung", a: "W"})
DATA.n.push({t: "Urlaub", a: "Urlaub"})
}
fixVersionRemoveDateRosterPerson = () => {
DATA.a.forEach(data => {
delete data.p
})
}
fixVersionAddDatePersonOvertime = () => {
DATA.a.forEach(data => {setPersonOvertime(data.d)})
}
fixVersionAddDatePersonOvertimeFixMpaFreeDay = () => {
DATA.a.forEach(data => {setPersonOvertime(data.d)})
}
fixVersionAddDataPrintMode = () => {
DATA.m = 0
}
fixVersionAddBettermentsHours = () => {
DATA.p.forEach(person => {
person.b.forEach(b => b.push(parseFloat(person.h/DAYS.length.toFixed(2))))
})
}
fixVersionAddMissingPersonR = () => {
DATA.p.forEach(person => {
if (typeof person.r === "undefined") {person.r = false}
})
}
fixVersionDataRosterTime = () => {
DATA.a.sort((a, b) => {return getDateOfISOWeek(a.d) - getDateOfISOWeek(b.d)})
DATA.a.forEach(a => {a.c = []})
let data_r = DATA.a[0].r
DATA.a.forEach((data, data_id) => {
let days = []
let step = data.t
let change = false
data.r.forEach((roster, d_id) => {
let times = roster.d
amount = structuredClone(roster.d.map(d => d.a))
if ((data_id === 0) || (JSON.stringify(times) !== JSON.stringify(DATA.a[data_id-1].r[d_id].d) )) {
DATA.a[data_id].c.push({k: "d_"+d_id, s: times[0].t, e: times[times.length-1].t, a: amount})
}
})
})
DATA.a.forEach(a => {delete a.r})
}
fixVersionAddDataClosingTime = () => {
DATA.x = []
}
fixVersionDataOvertimeToFixed = () => {
DATA.a.forEach(data => {
if (data.s.map(a => a.s).filter(a => a.length > 0).length === 0) {data.o = []; return}
setPersonOvertime(data.d)
})
}
fixVersionDataSortToSetting = () => {
let sort = structuredClone(DATA.s)
DATA.s = [{s: [[...sort[0]], [...sort[1]]]}]
}
fixVersionDataAddPrintZoom = () => {
DATA.s.push({z: [100, 78]})
}
fixVersionDataEditableToR = () => {
DATA.a.forEach(data => { if (typeof data.e !== "undefined") {let e = structuredClone(data.e); data.e = {r: [...e]}}})
}
fixVersionDataAddEditable = () => {
DATA.a.forEach(data =>{if (typeof data.e === "undefined") {data.e = {}}})
}
fixVersionDataFixOvertimes = () => {
DATA.a.forEach(data =>{
data.o.forEach(overtime => setPersonIdOvertime(overtime.p, data.d))
})
}
fixVersionDataRemovePersonR = () => {
DATA.p.forEach(p => {delete p.r})
}
fixVersionDataAddPersonShiftSetting = () => {
DATA.p.forEach(p => {
p.c.push({d: p.a, k: "sa", v: [{d: 0, a: undefined}, {d: 1, a: undefined}, {d: 2, a: undefined}, {d: 3, a: undefined}, {d: 4, a: undefined} ]})
let sf_0 = p.f.indexOf(0); if (sf_0 === -1) {sf_0 = false} else {sf_0 = true}
let sf_1 = p.f.indexOf(1); if (sf_1 === -1) {sf_1 = false} else {sf_1 = true}
let sf_2 = p.f.indexOf(2); if (sf_2 === -1) {sf_2 = false} else {sf_2 = true}
let sf_3 = p.f.indexOf(3); if (sf_3 === -1) {sf_3 = false} else {sf_3 = true}
let sf_4 = p.f.indexOf(4); if (sf_4 === -1) {sf_4 = false} else {sf_4 = true}
let sl_0 = p.f.indexOf(0); if (sl_0 === -1) {sl_0 = undefined} else {sl_0 = 1}
let sl_1 = p.f.indexOf(1); if (sl_1 === -1) {sl_1 = undefined} else {sl_1 = 1}
let sl_2 = p.f.indexOf(2); if (sl_2 === -1) {sl_2 = undefined} else {sl_2 = 1}
let sl_3 = p.f.indexOf(3); if (sl_3 === -1) {sl_3 = undefined} else {sl_3 = 1}
let sl_4 = p.f.indexOf(4); if (sl_4 === -1) {sl_4 = undefined} else {sl_4 = 1}
p.c.push({d: p.a, k: "sl", v: [{d: 0, l: sl_0}, {d: 1, l: sl_1}, {d: 2, l: sl_2}, {d: 3, l: sl_3}, {d: 4, l: sl_4} ]})
p.c.push({d: p.a, k: "sf", v: [{d: 0, f: sf_0}, {d: 1, f: sf_1}, {d: 2, f: sf_2}, {d: 3, f: sf_3}, {d: 4, f: sf_4} ]})
p.c.forEach(c => {
if (c.k === "f") {
let sf_values = getActivePersonById(p.id, c.d)
let new_sf = []
let new_sl = []
DAYS.forEach((day, day_id) => {
if (c.v.indexOf(day_id) > -1) {
new_sf.push({d: day_id, f: true})
new_sl.push({d: day_id, l: 1})
} else {
new_sf.push({d: day_id, f: false})
new_sl.push({d: day_id, l: undefined})
}
})
c.k = "sf"
c.v = structuredClone(new_sf)
let check_sl = p.c.filter(sl => {return sl.d === c.d && sl.k === "sl"})[0]
if (typeof check_sl !== "undefined") {
check_sl.v = structuredClone(new_sl)
} else p.c.push({d: c.d, k: "sl", v: structuredClone(new_sl)})
}
})
delete p.f
})
DATA.n.splice(0, 1)
DATA.l = structuredClone(SHIFT_LABELS)
}
fixVersionData22To224 = () => {
fixVersionDataRemovePersonR()
fixVersionDataAddPersonShiftSetting()
fixVersionDataOvertimeToFixed()
fixVersionDataFixOvertimes()
}
fixVersionDataTo224 = () => {
fixVersionDataRemovePersonR()
fixVersionDataAddPersonShiftSetting()
fixVersionDataFixOvertimes()
}
fixVersionDataAddDisplayOvertime = () => {
DATA.s.push({d: [{k: "overtime", v: false}]})
}
fixVersionDataAddDisplayEditableWeek = () => {
DATA.s.filter(s => {return s.d})[0].d.push({k: "editable-cell", v: true})
DATA.s.filter(s => {return s.d})[0].d.push({k: "editable-row", v: false})
}
fixVersionDataAddClosingTimeX = () => {
DATA.x.forEach(data => data.d.forEach(d => d.x = false))
}
fixVersionDataRemoveEmptyShiftInfo = () => {
DATA.a.forEach(a => {
if (typeof a.i !== "undefined") {
let new_i = []
a.i.forEach(i => {if (i.t.length > 0) new_i.push(i)})
a.i = new_i
}
})
}
fixVersionDataFixUnsetSf = () => {
DATA.p.forEach(person => {
person.c.forEach(change => {
if (change.k === "sf") {
change.v.forEach(v => {if (typeof v.f === "undefined") {v.f = false}})
}
})
})
}
fixVersionDataEditableRowBottom = () => {
DATA.s[2].d.push({k: 'editable-row-bottom', v: false})
}
fixVersionDataMergeClosingtime = () => {
let all = []
DATA.x.forEach(x => x.d.forEach(d => all.push(d)))
DATA.x = structuredClone(all)
}
fixVersionDataSetClosingtimeId = () => {
DATA.x.forEach((x, x_id) => {x.id = x_id})
}
fixYWTo7 = (yw) => {return yw.length === 6 ? (yw.substring(0,5)+"0"+yw.substring(5)) : yw}
fixVersionDataSetYearWeekTo7 = () => {
DATA.a.forEach(a => { a.d = fixYWTo7(a.d) })
DATA.p.forEach(p => {
p.a = fixYWTo7(p.a)
p.c.forEach(c => c.d = fixYWTo7(c.d))
})
}
fixVersionDataNewRosterChangeValue = () => {
DATA.rc = []
DATA.a.forEach(a => {a.c.forEach(c => {c.k = parseFloat(c.k.slice(-1)); c.d = a.d; DATA.rc.push(c)}); delete a.c})
//DATA.a.forEach(a => {a.c.forEach(c => {c.k = parseFloat(c.k.slice(-1))} )})
//DATA.rs = []
//let d_id = -1
//DATA.a.forEach(a => {a.s.forEach(s => s.s.forEach(d => {d_id = d_id+1; d.id = d_id; d.d = a.d; d.k = s.d; DATA.rs.push(d)})); delete a.s})
DATA.a.forEach(a => {
let new_s = []
a.s.forEach(d => {
let new_sd = []
d.s.forEach(s => new_sd.push(s))
new_s.push(new_sd)
})
a.s = new_s
})
}
fixVersionDataNewSettingsValues = () => {
DATA.sd = DATA.s[0].s[0]
DATA.sw = DATA.s[0].s[1]
DATA.zh = DATA.s[1].z[0]
DATA.zv = DATA.s[1].z[1]
DATA.so = DATA.s[2].d[0].v
DATA.secr = DATA.s[2].d[1].v
DATA.sert = DATA.s[2].d[2].v
DATA.serb = DATA.s[2].d[3].v
delete DATA.s
DATA.n.forEach((n, n_id) => n.id = n_id)
DATA.a.forEach(a => {let er = []; a.e?.c?.forEach((r, r_id) => er.push({k: r.p.toString(), v: r.t})); if (er.length > 0) {a.ecr = er; delete a.e.c} })
DATA.a.forEach(a => {let rt = []; a.e?.r?.forEach((r, r_id) => rt.push({k: r_id.toString(), v: r})); if (rt.length > 0) {a.ert = rt; delete a.e.r} })
DATA.a.forEach(a => {let rb = []; a.e?.rb?.forEach((r, r_id) => rb.push({k: r_id.toString(), v: r})); if (rb.length > 0) {a.erb = rb; delete a.e.rb} })
DATA.a.forEach(a => {delete a.e})
DATA.l.forEach(l => {l.id = l.i; delete l.i})
let dep = [{id: 0, v: ""}]
DATA.d.forEach((d, id) => dep.push({id: id+1, v: d}))
DATA.d = dep
DATA.p.forEach(p => { p.c = p.c.sort((a,b) => a.d.localeCompare(b.d)) })
DATA.p.forEach(p => {p.d = p.d+1; p.c.forEach(c => {if (c.k === "d") {c.v = c.v+1}})})
DATA.p.forEach(p => {
let old_sl
let sl
let r_ids = []
p.c.forEach((c, c_id) => {
if (c.k === "sl") {
old_sl = structuredClone(sl); sl = structuredClone(c.v);
if (old_sl && JSON.stringify(sl) !== JSON.stringify(old_sl)) {
old_sl.forEach(osl => {
if (osl.l) {
!c.v.find(cc => cc.d === osl.d).l && (c.v.find(cc => cc.d === osl.d).l = false)
}
})
}
old_sl && JSON.stringify(sl) === JSON.stringify(old_sl) && r_ids.push(c_id)
old_sl && (c.v = c.v.filter(v => typeof v.l !== "undefined"))
}
})
r_ids.length > 0 && (p.c = p.c.filter((c, c_id) => r_ids.indexOf(c_id) === -1))
})
DATA.p.forEach(p => {
let old_sl
let sl
let r_ids = []
p.c.forEach((c, c_id) => {
if (c.k === "sf") {
c.v.forEach(v => !v.f && (delete v.f))
}
})
p.c.forEach((c, c_id) => {
if (c.k === "sf") {
old_sl = structuredClone(sl); sl = structuredClone(c.v);
if (old_sl && JSON.stringify(sl) !== JSON.stringify(old_sl)) {
old_sl.forEach(osl => {
if (osl.f) {
!c.v.find(cc => cc.d === osl.d).f && (c.v.find(cc => cc.d === osl.d).f = false)
}
})
}
old_sl && JSON.stringify(sl) === JSON.stringify(old_sl) && r_ids.push(c_id)
old_sl && (c.v = c.v.filter(v => typeof v.f !== "undefined"))
}
})
r_ids.length > 0 && (p.c = p.c.filter((c, c_id) => r_ids.indexOf(c_id) === -1))
})
DATA.p.forEach(p => {
let old_sl
let sl
let r_ids = []
p.c.forEach((c, c_id) => {
if (c.k === "sa") {
old_sl = structuredClone(sl); sl = structuredClone(c.v);
if (old_sl && JSON.stringify(sl) !== JSON.stringify(old_sl)) {
old_sl.forEach(osl => {
if (osl.a) {
!c.v.find(cc => cc.d === osl.d).a && (c.v.find(cc => cc.d === osl.d).a = false)
}
})
}
old_sl && JSON.stringify(sl) === JSON.stringify(old_sl) && r_ids.push(c_id)
old_sl && (c.v = c.v.filter(v => typeof v.a !== "undefined"))
}
})
r_ids.length > 0 && (p.c = p.c.filter((c, c_id) => r_ids.indexOf(c_id) === -1))
})
DATA.p.forEach(p => { p.c.sort((a,b) => b.d.localeCompare(a.d))})
DATA.p.forEach(p => { p.c.filter(c => c.k === "m").forEach(c => {let new_v = []; c.v.forEach((v, v_id) => new_v.push({d: v_id, v: v}) ); c.v = new_v }) })
DATA.p.forEach(p => {
let old_m = [{d: 0, v: 0}, {d: 1, v: 0}, {d: 2, v: 0}, {d: 3, v: 0}, {d: 4, v: 0} ]
let new_m
p.c.filter(c => c.k === "m").forEach(c => {
c.v = c.v.filter(v => v.v !== old_m.find(o => o.d === v.d).v)
c.v.forEach(v => old_m.find(o => o.d === v.d).v = v.v)
})
})
DATA.p.forEach(p => { p.c = p.c.filter(c => c.v.length > 0)})
DATA.pc = []
DATA.p.forEach(p => {
p.c.forEach(c => {
c.k === "sl" && c.v.forEach(v => {v.v = v.l; delete v.l; !v.v && (v.v = false)})
c.k === "sf" && c.v.forEach(v => {v.v = v.f; delete v.f; !v.v && (v.v = false)})
c.k === "sa" && c.v.forEach(v => {v.v = v.a; delete v.a; !v.v && (v.v = false)})
})
p.c.forEach(c => {
if ((c.k === "sl") || (c.k === "sa") || (c.k === "sf") || (c.k === "m")) {
c.v.forEach(v => DATA.pc.push({p: p.id, d: c.d, t: v.d, k: c.k, v: v.v}))
} else { DATA.pc.push({p: p.id, d: c.d, k: c.k, v: c.v})}
})
delete p.c
})
DATA.rc.sort((a,b) => a.d.localeCompare(b.d))
let oldest_yw = DATA.pc.map(c => c.d).sort((a,b) => a.localeCompare(b))[0]
DATA.pc = DATA.pc.filter(c => `${c.d}-${c.k}-${c.v}` !== `${oldest_yw}-sl-false` )
DATA.pc = DATA.pc.filter(c => `${c.d}-${c.k}-${c.v}` !== `${oldest_yw}-sf-false` )
DATA.pc = DATA.pc.filter(c => `${c.d}-${c.k}-${c.v}` !== `${oldest_yw}-sa-false` )
/*DATA.pc.filter(c => c.k === "sl").forEach(c => {
let free = DATA.pc.find(cf => cf.d === c.d && cf.k === "sf" && cf.t === c.t)?.v || false
c.f = free
})
DATA.pc = DATA.pc.filter(c => c.k !== "sf")*/
DATA.a.forEach(a => {
let new_o = []
a.o.forEach(o => new_o.push([o.p, o.o]))
a.o = new_o
})
}
fixDataByVersion = (DATA) => {
if (typeof dbGet_settings_version() === "undefined") { fixRosterPreVersion(); dbSet_settings_version(1); VERSION = 1;}
if (dbGet_settings_version() === 1) { fixVersionAddBreakday(); dbSet_settings_version(1.1); VERSION = 1.1;}
if (dbGet_settings_version() === 1.1) { fixVersionNewDatabase(); dbSet_settings_version(1.2); VERSION = 1.2;}
if (dbGet_settings_version() === 1.2) { fixVersionAddMpaToPerson(); dbSet_settings_version(1.3); VERSION = 1.3;}
if (dbGet_settings_version() === 1.3) { fixVersionAddDataSort(); dbSet_settings_version(1.4); VERSION = 1.4;}
if (dbGet_settings_version() === 1.4) { fixVersionAddDataSortUpDown(); fixVersionPersonDepartmentToFloat(); dbSet_settings_version(1.5); VERSION = 1.5;}
if (dbGet_settings_version() === 1.5) { fixVersionAddDataZoom(); fixVersionPersonDepartmentToFloat(); dbSet_settings_version(1.6); VERSION = 1.6;}
if (dbGet_settings_version() === 1.6) { fixVersionAddDataDepartment(); dbSet_settings_version(1.7); VERSION = 1.7;}
if (dbGet_settings_version() === 1.7) { fixVersionAddDataBetterment(); dbSet_settings_version(1.8); VERSION = 1.8;}
if (dbGet_settings_version() === 1.8) { fixVersionAddDataRenames(); dbSet_settings_version(1.9); VERSION = 1.9;}
if (dbGet_settings_version() === 1.9) { fixVersionRemoveDateRosterPerson(); dbSet_settings_version(1.11); VERSION = 1.11;}
if (dbGet_settings_version() === 1.11) { fixVersionAddDatePersonOvertime(); dbSet_settings_version(1.12); VERSION = 1.12;}
if (dbGet_settings_version() === 1.12) { fixVersionAddDatePersonOvertimeFixMpaFreeDay(); dbSet_settings_version(1.13); VERSION = 1.13;}
if (dbGet_settings_version() === 1.13) { fixVersionAddDataPrintMode(); dbSet_settings_version(1.14); VERSION = 1.14;}
if (dbGet_settings_version() === 1.14) { fixVersionAddBettermentsHours(); dbSet_settings_version(1.15); VERSION = 1.15;}
if (dbGet_settings_version() === 1.15) { fixVersionAddMissingPersonR(); dbSet_settings_version(1.16); VERSION = 1.16;}
if (dbGet_settings_version() === 1.16) { fixVersionDataRosterTime(); dbSet_settings_version(1.17); VERSION = 1.17;}
if (dbGet_settings_version() === 1.17) { fixVersionAddDataClosingTime(); dbSet_settings_version(1.18); VERSION = 1.18;}
if (dbGet_settings_version() === 1.18) { fixVersionDataOvertimeToFixed(); dbSet_settings_version(1.19); VERSION = 1.19;}
if (dbGet_settings_version() === 1.19) { fixVersionDataSortToSetting(); fixVersionDataAddPrintZoom(); dbSet_settings_version(1.21); VERSION = 1.21;}
if ((dbGet_settings_version() === 1.21) || (dbGet_settings_version() === 2.1)) { fixVersionDataEditableToR(); fixVersionDataAddEditable(); dbSet_settings_version(2.2); VERSION = 2.2;}
if (dbGet_settings_version() === 2.2) { fixVersionData22To224(); dbSet_settings_version(2.24); VERSION = 2.24;}
if (dbGet_settings_version() === 2.21) { fixVersionDataTo224(); dbSet_settings_version(2.24); VERSION = 2.24;}
if (dbGet_settings_version() === 2.22) { fixVersionDataRemovePersonR(); dbSet_settings_version(2.23); VERSION = 2.23;}
if (dbGet_settings_version() === 2.23) { fixVersionDataAddPersonShiftSetting(); dbSet_settings_version(2.24); VERSION = 2.24;}
if (dbGet_settings_version() === 2.24) { fixVersionDataAddDisplayOvertime(); dbSet_settings_version(2.25); VERSION = 2.25;}
if (dbGet_settings_version() === 2.25) { fixVersionDataAddDisplayEditableWeek(); dbSet_settings_version(2.26); VERSION = 2.26;}
if (dbGet_settings_version() === 2.26) { fixVersionDataAddClosingTimeX(); dbSet_settings_version(2.27); VERSION = 2.27;}
if (dbGet_settings_version() === 2.27) { fixVersionDataRemoveEmptyShiftInfo(); dbSet_settings_version(2.28); VERSION = 2.28;}
if (dbGet_settings_version() === 2.28) { fixVersionDataFixUnsetSf(); dbSet_settings_version(2.29); VERSION = 2.29;}
if (dbGet_settings_version() === 2.29) { fixVersionDataEditableRowBottom(); dbSet_settings_version(2.3); VERSION = 2.3;}
if (dbGet_settings_version() === 2.3) { fixVersionDataMergeClosingtime(); dbSet_settings_version(2.31); VERSION = 2.31;}
if (dbGet_settings_version() === 2.31) { fixVersionDataSetClosingtimeId(); dbSet_settings_version(2.32); VERSION = 2.32;}
if (dbGet_settings_version() === 2.32) { fixVersionDataSetYearWeekTo7(); dbSet_settings_version(2.33); VERSION = 2.33;}
if (dbGet_settings_version() === 2.33) { fixVersionDataNewRosterChangeValue(); dbSet_settings_version(2.34); VERSION = 2.34;}
if (dbGet_settings_version() === 2.34) { fixVersionDataNewSettingsValues(); dbSet_settings_version(2.35); VERSION = 2.35;}
}
// <-- FIX FILE_DATA