UNPKG

@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
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]; };