@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
116 lines (115 loc) • 4.83 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.processShift = exports.makeShifts = exports.calcBreakSeconds = exports.makePunchMessage = exports.punchTypes = void 0;
var tslib_1 = require("tslib");
var utils_1 = require("@open-tender/utils");
var date_fns_1 = require("date-fns");
exports.punchTypes = {
PUNCH_IN: 'PUNCH_IN',
BREAK_IN: 'BREAK_IN',
BREAK_OUT: 'BREAK_OUT',
PUNCH_OUT: 'PUNCH_OUT'
};
var makePunchMessage = function (employee, punch_type) {
var first_name = employee.first_name;
switch (punch_type) {
case exports.punchTypes.PUNCH_IN:
return "Hi, ".concat(first_name);
case exports.punchTypes.BREAK_OUT:
return "Enjoy your break, ".concat(first_name, "!");
case exports.punchTypes.BREAK_IN:
return "Welcome back, ".concat(first_name, "!");
case exports.punchTypes.PUNCH_OUT:
return "See you next time, ".concat(first_name, "!");
default:
return 'Invalid punch type';
}
};
exports.makePunchMessage = makePunchMessage;
var calcBreakSeconds = function (breaks) {
var chunks = [];
var breaksCopy = tslib_1.__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 + (0, date_fns_1.differenceInSeconds)(breakOut.date, breakIn.date)
: 0;
}, 0);
};
exports.calcBreakSeconds = calcBreakSeconds;
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 = (0, utils_1.isoToDate)(punch.created_at, tz);
var newPunch = tslib_1.__assign(tslib_1.__assign({}, punch), { department: department, date: date });
var lastChunk = chunks[chunks.length - 1];
if (!lastChunk || newPunch.punch_type === exports.punchTypes.PUNCH_IN) {
chunks.push([newPunch]);
}
else {
lastChunk.push(newPunch);
}
});
return chunks.map(function (chunk) {
var _a;
var allBreaks = chunk.filter(function (i) {
return [exports.punchTypes.BREAK_IN, exports.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 === exports.punchTypes.PUNCH_IN; });
var punchOut = chunk.find(function (i) { return i.punch_type === exports.punchTypes.PUNCH_OUT; });
var outDate = punchOut
? punchOut.date
: breakOut
? breakOut.date
: (0, utils_1.currentLocalDate)(tz);
var totalSeconds = punchIn
? (0, date_fns_1.differenceInSeconds)(outDate, punchIn.date)
: 0;
var breakSeconds = (0, exports.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
};
});
};
exports.makeShifts = makeShifts;
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);
};
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 ? (0, utils_1.formatDate)(punchIn.date, 'h:mma', true) : 'n/a';
var outTime = punchOut
? (0, utils_1.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];
};
exports.processShift = processShift;