@open-tender/store
Version:
A library of hooks, reducers, utility functions, and types for use with Open Tender applications that utilize our in-store POS API
109 lines (108 loc) • 4.36 kB
JavaScript
import { __assign, __spreadArray } from "tslib";
import { currentLocalDate, formatDate, isoToDate } from '@open-tender/utils';
import { differenceInSeconds } from 'date-fns';
export var punchTypes = {
PUNCH_IN: 'PUNCH_IN',
BREAK_IN: 'BREAK_IN',
BREAK_OUT: 'BREAK_OUT',
PUNCH_OUT: 'PUNCH_OUT'
};
export var makePunchMessage = function (employee, punch_type) {
var first_name = employee.first_name;
switch (punch_type) {
case punchTypes.PUNCH_IN:
return "Hi, ".concat(first_name);
case punchTypes.BREAK_OUT:
return "Enjoy your break, ".concat(first_name, "!");
case punchTypes.BREAK_IN:
return "Welcome back, ".concat(first_name, "!");
case punchTypes.PUNCH_OUT:
return "See you next time, ".concat(first_name, "!");
default:
return 'Invalid punch type';
}
};
export var calcBreakSeconds = function (breaks) {
var chunks = [];
var breaksCopy = __spreadArray([], breaks, true);
while (breaksCopy.length > 0) {
chunks.push(breaksCopy.splice(0, 2));
}
return chunks.reduce(function (t, _a) {
var breakIn = _a[0], breakOut = _a[1];
return breakIn && breakOut
? t + differenceInSeconds(breakOut.date, breakIn.date)
: 0;
}, 0);
};
export var makeShifts = function (employee, tz) {
var departments = employee.departments, punches = employee.punches;
if (!punches)
return null;
var chunks = [];
punches.forEach(function (punch) {
var department = departments.find(function (i) { return i.id === punch.department_id; });
if (!punch.created_at)
return;
var date = isoToDate(punch.created_at, tz);
var newPunch = __assign(__assign({}, punch), { department: department, date: date });
var lastChunk = chunks[chunks.length - 1];
if (!lastChunk || newPunch.punch_type === punchTypes.PUNCH_IN) {
chunks.push([newPunch]);
}
else {
lastChunk.push(newPunch);
}
});
return chunks.map(function (chunk) {
var _a;
var allBreaks = chunk.filter(function (i) {
return [punchTypes.BREAK_IN, punchTypes.BREAK_OUT].includes(i.punch_type);
});
var lastBreakOut = (Math.floor(allBreaks.length) / 2) * 2;
var breaks = allBreaks.slice(0, lastBreakOut);
var breakOut = allBreaks.length - breaks.length === 1
? allBreaks[allBreaks.length - 1]
: null;
var punchIn = chunk.find(function (i) { return i.punch_type === punchTypes.PUNCH_IN; });
var punchOut = chunk.find(function (i) { return i.punch_type === punchTypes.PUNCH_OUT; });
var outDate = punchOut
? punchOut.date
: breakOut
? breakOut.date
: currentLocalDate(tz);
var totalSeconds = punchIn
? differenceInSeconds(outDate, punchIn.date)
: 0;
var breakSeconds = calcBreakSeconds(breaks);
var netSeconds = totalSeconds - breakSeconds;
var department = punchIn ? ((_a = punchIn.department) === null || _a === void 0 ? void 0 : _a.name) || 'n/a' : 'n/a';
return {
department: department,
punchIn: punchIn,
punchOut: punchOut,
breaks: breaks,
breakOut: breakOut,
totalSeconds: totalSeconds,
breakSeconds: breakSeconds,
netSeconds: netSeconds
};
});
};
var makeShiftTime = function (seconds) {
var hours = Math.floor(seconds / 3600);
var minutes = ((seconds % 3600) / 60).toFixed(0).padStart(2, '0');
return "".concat(hours, ":").concat(minutes);
};
export var processShift = function (shift) {
var department = shift.department, punchIn = shift.punchIn, punchOut = shift.punchOut, breakOut = shift.breakOut, netSeconds = shift.netSeconds, breakSeconds = shift.breakSeconds;
var inTime = punchIn ? formatDate(punchIn.date, 'h:mma', true) : 'n/a';
var outTime = punchOut
? formatDate(punchOut.date, 'h:mma', true)
: breakOut
? 'On Break'
: 'On Clock';
var onClock = makeShiftTime(netSeconds);
var onBreak = makeShiftTime(breakSeconds);
return [department, inTime, outTime, onClock, onBreak];
};