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

831 lines (830 loc) 40 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.checkoutReducer = exports.selectPosCheckTenders = exports.selectPosCheckTotal = exports.selectPosCheckSubtotal = exports.selectPosAmountDue = exports.selectPosPendingDiscounts = exports.selectPosCustomerNameShort = exports.selectPosCustomerName = exports.selectPosCustomer = exports.selectPosCheck = exports.selectPosCheckout = exports.setPhone = exports.setMadeFor = exports.setPoints = exports.setPendingDiscounts = exports.removeCustomer = exports.addCustomer = exports.setTaxExempt = exports.removeTip = exports.addTip = exports.removeTax = exports.addTax = exports.removeDiscount = exports.addDiscount = exports.removeSurcharge = exports.addSurcharge = exports.removeGiftCard = exports.addGiftCard = exports.handleCheckoutError = exports.resetPosCheckError = exports.resetPosCheck = exports.resetPosCheckout = exports.rateOrder = exports.activateGiftCards = exports.voidPosOrder = exports.submitPosOrder = exports.validatePosOrder = exports.addCreditTender = exports.completeChipDNA = exports.identifyCustomer = exports.updateCart = exports.updateTender = exports.removeTender = exports.addTender = exports.addPromoCode = exports.CheckoutActionType = exports.prepareOrder = void 0; var tslib_1 = require("tslib"); var utils_1 = require("@open-tender/utils"); var toolkit_1 = require("@reduxjs/toolkit"); var uuid_1 = require("uuid"); var alerts_1 = require("./alerts"); var notifications_1 = require("./notifications"); var order_1 = require("./order"); var pos_1 = require("./pos"); var types_1 = require("./types"); var initialState = { activating: 'idle', authorizing: 'idle', check: null, completedOrder: null, customer: null, discounts: [], error: null, giftCards: [], identifying: 'idle', isTaxExempt: false, loading: 'idle', madeFor: null, pendingDiscounts: false, phone: null, points: [], removing: 'idle', submitting: 'idle', surcharges: [], taxes: [], tip: null, validating: 'idle', rate: null, rating: 'idle', ratingError: null }; var getAmountDue = function (check) { return check && check.totals ? check.totals.amount_due : null; }; var prepareOrder = function (order, checkout) { var order_uuid = order.orderId, requested_at = order.requestedAt, service_type = order.serviceType, order_type = order.orderType, revenue_center_id = order.revenueCenterId, prep_type = order.prepType, table = order.table, deviceType = order.deviceType; if (!order_uuid) return null; var simpleCart = (0, utils_1.makeSimpleCart)(order.cart); var cart = simpleCart.filter(function (item) { return item; }); if (!revenue_center_id || !order_type || !service_type) { return null; } var customer = checkout.customer, surcharges = checkout.surcharges, discounts = checkout.discounts, taxes = checkout.taxes, tip = checkout.tip, points = checkout.points, made_for = checkout.madeFor, phone = checkout.phone; return { order_uuid: order_uuid, revenue_center_id: revenue_center_id, service_type: service_type, requested_at: requested_at, customer: customer, cart: cart, surcharges: surcharges, discounts: discounts, taxes: taxes, tip: tip || '0.00', points: points, made_for: made_for, phone: phone, prep_type: prep_type, device_type: deviceType, notes_internal: table !== null && table.length > 0 ? "DINE IN -- TABLE ".concat(table) : null }; }; exports.prepareOrder = prepareOrder; var CheckoutActionType; (function (CheckoutActionType) { CheckoutActionType["AddPromoCode"] = "checkout/addPromoCode"; CheckoutActionType["AddTender"] = "checkout/addTender"; CheckoutActionType["RemoveTender"] = "checkout/removeTender"; CheckoutActionType["UpdateTender"] = "checkout/updateTender"; CheckoutActionType["UpdateCart"] = "checkout/updateCart"; CheckoutActionType["IdentifyCustomer"] = "checkout/identifyCustomer"; CheckoutActionType["CompleteChipDNA"] = "checkout/completeChipDNA"; CheckoutActionType["AddCreditTender"] = "checkout/addCreditTender"; CheckoutActionType["ValidatePosOrder"] = "checkout/validatePosOrder"; CheckoutActionType["SubmitPosOrder"] = "checkout/submitPosOrder"; CheckoutActionType["VoidPosOrder"] = "checkout/voidPosOrder"; CheckoutActionType["ActivateGiftCards"] = "checkout/activateGiftCards"; CheckoutActionType["RateOrder"] = "checkout/rateOrder"; })(CheckoutActionType || (exports.CheckoutActionType = CheckoutActionType = {})); exports.addPromoCode = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.AddPromoCode, function (promoCode_1, _a) { return tslib_1.__awaiter(void 0, [promoCode_1, _a], void 0, function (promoCode, _b) { var config, api, err_1; var getState = _b.getState, rejectWithValue = _b.rejectWithValue; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: _c.trys.push([0, 2, , 3]); config = getState().config; api = config.api; return [4 /*yield*/, api.getDiscount(promoCode)]; case 1: return [2 /*return*/, _c.sent()]; case 2: err_1 = _c.sent(); return [2 /*return*/, rejectWithValue(err_1)]; case 3: return [2 /*return*/]; } }); }); }); exports.addTender = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.AddTender, function (tender_1, _a) { return tslib_1.__awaiter(void 0, [tender_1, _a], void 0, function (tender, _b) { var _c, config, order, checkout, orderId, api, hasLoyalty, amountDue, response, amount, card_token, callback, data, err_2; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return tslib_1.__generator(this, function (_d) { switch (_d.label) { case 0: _d.trys.push([0, 5, , 6]); _c = getState(), config = _c.config, order = _c.order, checkout = _c.checkout; orderId = order.orderId; if (!orderId) return [2 /*return*/]; api = config.api; hasLoyalty = config.store ? config.store.has_loyalty : false; amountDue = getAmountDue(checkout.check); return [4 /*yield*/, api.postTender(orderId, tender) // TODO: need to fix this ]; case 1: response = _d.sent(); amount = response.amount; card_token = null; callback = amount === amountDue ? function () { return dispatch((0, exports.submitPosOrder)()); } : function () { return dispatch((0, exports.validatePosOrder)()); }; if (!(hasLoyalty && card_token && !checkout.customer)) return [3 /*break*/, 2]; data = { card_token: card_token }; dispatch((0, exports.identifyCustomer)({ data: data, callback: callback })); return [3 /*break*/, 4]; case 2: return [4 /*yield*/, callback()]; case 3: _d.sent(); _d.label = 4; case 4: return [2 /*return*/, response]; case 5: err_2 = _d.sent(); return [2 /*return*/, rejectWithValue(err_2)]; case 6: return [2 /*return*/]; } }); }); }); exports.removeTender = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.RemoveTender, function (index_1, _a) { return tslib_1.__awaiter(void 0, [index_1, _a], void 0, function (index, _b) { var api, orderId, response, err_3; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: _c.trys.push([0, 2, , 3]); api = getState().config.api; orderId = getState().order.orderId; if (!orderId) return [2 /*return*/]; return [4 /*yield*/, api.postTenderVoid(orderId, index)]; case 1: response = _c.sent(); dispatch((0, exports.validatePosOrder)()); return [2 /*return*/, response]; case 2: err_3 = _c.sent(); return [2 /*return*/, rejectWithValue(err_3)]; case 3: return [2 /*return*/]; } }); }); }); exports.updateTender = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.UpdateTender, function (_1, _a) { return tslib_1.__awaiter(void 0, [_1, _a], void 0, function (_, _b) { var api, orderId, check, tenders, totals, tender, index, amountTender, amountDue, amount, updatedTender, response, err_4; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: _c.trys.push([0, 4, , 5]); api = getState().config.api; orderId = getState().order.orderId; check = getState().checkout.check; if (!orderId || !check) return [2 /*return*/]; tenders = check.tenders, totals = check.totals; tender = tenders.find(function (i) { return i.tender_status === 'AUTHORIZED'; }); if (!tender) return [2 /*return*/]; index = tender.tender_index || 0; amountTender = parseFloat(tender.amount); amountDue = parseFloat(totals.amount_due || '0.00'); amount = amountTender + amountDue; if (!(amount > 0)) return [3 /*break*/, 2]; updatedTender = { tender_type: tender.tender_type, amount: amount.toFixed(2) }; return [4 /*yield*/, api.patchTender(orderId, index, updatedTender)]; case 1: response = _c.sent(); dispatch((0, exports.validatePosOrder)()); return [2 /*return*/, response]; case 2: dispatch((0, exports.removeTender)(index)).then(function () { var msg = 'Order fully discounted. Tender removed.'; dispatch((0, notifications_1.showNotification)(msg)); }); return [2 /*return*/]; case 3: return [3 /*break*/, 5]; case 4: err_4 = _c.sent(); return [2 /*return*/, rejectWithValue(err_4)]; case 5: return [2 /*return*/]; } }); }); }); // TODO: add types exports.updateCart = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.UpdateCart, function (cartErrors_1, _a) { return tslib_1.__awaiter(void 0, [cartErrors_1, _a], void 0, function (cartErrors, _b) { var cart, _i, cartErrors_2, item, itemError, errIndices_1, newCart; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return tslib_1.__generator(this, function (_c) { try { cart = getState().order.cart; if (!cart) return [2 /*return*/]; for (_i = 0, cartErrors_2 = cartErrors; _i < cartErrors_2.length; _i++) { item = cartErrors_2[_i]; itemError = item.id || item.groups || item.options; if (itemError) { dispatch((0, alerts_1.addAlert)(itemError)); } } errIndices_1 = cartErrors.map(function (i) { return i.index; }); newCart = cart.filter(function (_, idx) { return !errIndices_1.includes(idx); }); dispatch((0, order_1.setCart)(newCart)); // not necessary here since validatePosOrder() runs when // error is set to null when updateCart is fulfilled // dispatch(validatePosOrder()) return [2 /*return*/]; } catch (err) { return [2 /*return*/, rejectWithValue(err)]; } return [2 /*return*/]; }); }); }); exports.identifyCustomer = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.IdentifyCustomer, function (_a, _b) { return tslib_1.__awaiter(void 0, [_a, _b], void 0, function (_c, _d) { var api, response, customer, discounts, points, discount, autoDiscounts, err_5, errMsg; var data = _c.data, callback = _c.callback, showError = _c.showError; var dispatch = _d.dispatch, getState = _d.getState, rejectWithValue = _d.rejectWithValue; return tslib_1.__generator(this, function (_e) { switch (_e.label) { case 0: _e.trys.push([0, 7, , 8]); api = getState().config.api; return [4 /*yield*/, api.postIdentifyCustomer(data)]; case 1: response = _e.sent(); customer = response.customer, discounts = response.discounts, points = response.points, discount = response.discount; dispatch((0, exports.addCustomer)(tslib_1.__assign(tslib_1.__assign({}, customer), { discounts: discounts, points: points, discount: discount }))); autoDiscounts = discounts.filter(function (i) { return i.is_auto; }); autoDiscounts.forEach(function (i) { var discountData = { id: i.discount_id, amount: i.amount }; dispatch((0, exports.addDiscount)(discountData)); var msg = "".concat(i.name, " discount applied!"); dispatch((0, notifications_1.showNotification)(msg)); }); if (!(points && parseInt(points) > 0)) return [3 /*break*/, 3]; dispatch((0, exports.setPendingDiscounts)(true)); return [4 /*yield*/, dispatch((0, exports.validatePosOrder)())]; case 2: _e.sent(); return [3 /*break*/, 6]; case 3: if (!discounts.length) return [3 /*break*/, 5]; dispatch((0, exports.setPendingDiscounts)(autoDiscounts.length === 0)); return [4 /*yield*/, dispatch((0, exports.validatePosOrder)())]; case 4: _e.sent(); return [3 /*break*/, 6]; case 5: if (callback) { callback(); } _e.label = 6; case 6: return [2 /*return*/, response]; case 7: err_5 = _e.sent(); if (showError) { errMsg = err_5.status === 404 ? 'Customer not found. Please try again.' : err_5.detail || err_5.message; dispatch((0, alerts_1.addAlert)(errMsg)); } if (callback) { callback(); return [2 /*return*/]; } else { return [2 /*return*/, rejectWithValue(err_5)]; } return [3 /*break*/, 8]; case 8: return [2 /*return*/]; } }); }); }); exports.completeChipDNA = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.CompleteChipDNA, function (card_token_1, _a) { return tslib_1.__awaiter(void 0, [card_token_1, _a], void 0, function (card_token, _b) { var _c, config, checkout, hasLoyalty, data, callback, err_6; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return tslib_1.__generator(this, function (_d) { switch (_d.label) { case 0: _d.trys.push([0, 4, , 5]); _c = getState(), config = _c.config, checkout = _c.checkout; hasLoyalty = config.store ? config.store.has_loyalty : false; if (!(hasLoyalty && card_token && !checkout.customer)) return [3 /*break*/, 1]; data = { card_token: card_token }; callback = function () { return dispatch((0, exports.validatePosOrder)()); }; dispatch((0, exports.identifyCustomer)({ data: data, callback: callback })); return [2 /*return*/]; case 1: return [4 /*yield*/, dispatch((0, exports.validatePosOrder)())]; case 2: return [2 /*return*/, _d.sent()]; case 3: return [3 /*break*/, 5]; case 4: err_6 = _d.sent(); return [2 /*return*/, rejectWithValue(err_6)]; case 5: return [2 /*return*/]; } }); }); }); exports.addCreditTender = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.AddCreditTender, function (data_1, _a) { return tslib_1.__awaiter(void 0, [data_1, _a], void 0, function (data, _b) { var _c, config, order, checkout, orderId, api, amount, tender, card_token, hasLoyalty, data_2, callback, err_7; var _d; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return tslib_1.__generator(this, function (_e) { switch (_e.label) { case 0: _e.trys.push([0, 5, , 6]); _c = getState(), config = _c.config, order = _c.order, checkout = _c.checkout; orderId = order.orderId; if (!orderId) return [2 /*return*/]; api = config.api; amount = getAmountDue(checkout.check); tender = tslib_1.__assign({ tender_type: 'CREDIT', amount: amount }, data); return [4 /*yield*/, api.postCreditTender(orderId, tender)]; case 1: _e.sent(); card_token = null; hasLoyalty = (_d = config.store) === null || _d === void 0 ? void 0 : _d.has_loyalty; if (!(hasLoyalty && card_token && !checkout.customer)) return [3 /*break*/, 2]; data_2 = { card_token: card_token }; callback = function () { return dispatch((0, exports.validatePosOrder)()); }; dispatch((0, exports.identifyCustomer)({ data: data_2, callback: callback })); return [2 /*return*/]; case 2: return [4 /*yield*/, dispatch((0, exports.validatePosOrder)())]; case 3: return [2 /*return*/, _e.sent()]; case 4: return [3 /*break*/, 6]; case 5: err_7 = _e.sent(); return [2 /*return*/, rejectWithValue(err_7)]; case 6: return [2 /*return*/]; } }); }); }); exports.validatePosOrder = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.ValidatePosOrder, function (_1, _a) { return tslib_1.__awaiter(void 0, [_1, _a], void 0, function (_, _b) { var _c, config, order, checkout, preparedOrder, check, submitted, validated_1, toRemove, err_8, errors, fields; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return tslib_1.__generator(this, function (_d) { switch (_d.label) { case 0: _d.trys.push([0, 2, , 3]); _c = getState(), config = _c.config, order = _c.order, checkout = _c.checkout; preparedOrder = (0, exports.prepareOrder)(order, checkout); if (!preparedOrder) return [2 /*return*/]; return [4 /*yield*/, config.api.postOrderValidate(preparedOrder) // remove any submitted discounts that aren't applied ]; case 1: check = _d.sent(); submitted = preparedOrder.discounts; validated_1 = check.discounts.map(function (i) { return i.id; }); toRemove = submitted === null || submitted === void 0 ? void 0 : submitted.filter(function (discount) { return !validated_1.includes(discount.id); }); toRemove === null || toRemove === void 0 ? void 0 : toRemove.forEach(function (discount) { return dispatch((0, exports.removeDiscount)({ id: discount.id, index: discount.index })); }); return [2 /*return*/, check]; case 2: err_8 = _d.sent(); errors = (0, utils_1.handleRespError)(err_8).errors; fields = errors ? Object.keys(errors) : []; if (fields.includes('order_uuid')) { dispatch((0, order_1.setOrderId)((0, uuid_1.v4)())); } return [2 /*return*/, rejectWithValue(err_8)]; case 3: return [2 /*return*/]; } }); }); }); exports.submitPosOrder = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.SubmitPosOrder, function (_1, _a) { return tslib_1.__awaiter(void 0, [_1, _a], void 0, function (_, _b) { var _c, config, order, checkout, preparedOrder, response, err_9, errors, fields; var dispatch = _b.dispatch, getState = _b.getState, rejectWithValue = _b.rejectWithValue; return tslib_1.__generator(this, function (_d) { switch (_d.label) { case 0: _d.trys.push([0, 2, , 3]); _c = getState(), config = _c.config, order = _c.order, checkout = _c.checkout; preparedOrder = (0, exports.prepareOrder)(order, checkout); if (!preparedOrder) return [2 /*return*/]; return [4 /*yield*/, config.api.postOrder(preparedOrder)]; case 1: response = _d.sent(); dispatch((0, pos_1.setLastOrderId)(response.order_uuid || null)); return [2 /*return*/, response]; case 2: err_9 = _d.sent(); errors = (0, utils_1.handleRespError)(err_9).errors; fields = errors ? Object.keys(errors) : []; if (fields.includes('order_uuid')) { dispatch((0, order_1.setOrderId)((0, uuid_1.v4)())); } return [2 /*return*/, rejectWithValue(err_9)]; case 3: return [2 /*return*/]; } }); }); }); exports.voidPosOrder = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.VoidPosOrder, function (_1, _a) { return tslib_1.__awaiter(void 0, [_1, _a], void 0, function (_, _b) { var _c, config, order, checkout, preparedOrder, err_10; var getState = _b.getState, rejectWithValue = _b.rejectWithValue; return tslib_1.__generator(this, function (_d) { switch (_d.label) { case 0: _d.trys.push([0, 2, , 3]); _c = getState(), config = _c.config, order = _c.order, checkout = _c.checkout; preparedOrder = (0, exports.prepareOrder)(order, checkout); if (!preparedOrder) return [2 /*return*/]; return [4 /*yield*/, config.api.deleteOrder(preparedOrder)]; case 1: return [2 /*return*/, _d.sent()]; case 2: err_10 = _d.sent(); return [2 /*return*/, rejectWithValue(err_10)]; case 3: return [2 /*return*/]; } }); }); }); exports.activateGiftCards = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.ActivateGiftCards, function (_1, _a) { return tslib_1.__awaiter(void 0, [_1, _a], void 0, function (_, _b) { var api_1, giftCards, requests, err_11; var getState = _b.getState, rejectWithValue = _b.rejectWithValue; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: _c.trys.push([0, 2, , 3]); api_1 = getState().config.api; giftCards = getState().checkout.giftCards; if (!api_1 || !giftCards.length) { return [2 /*return*/, giftCards]; } requests = giftCards.map(function (data) { return api_1.postGiftCardCredit(data); }); return [4 /*yield*/, Promise.all(requests)]; case 1: return [2 /*return*/, _c.sent()]; case 2: err_11 = _c.sent(); return [2 /*return*/, rejectWithValue(err_11)]; case 3: return [2 /*return*/]; } }); }); }); exports.rateOrder = (0, toolkit_1.createAsyncThunk)(CheckoutActionType.RateOrder, function (_a, _b) { return tslib_1.__awaiter(void 0, [_a, _b], void 0, function (_c, _d) { var api, response, err_12; var orderId = _c.orderId, data = _c.data; var getState = _d.getState, rejectWithValue = _d.rejectWithValue; return tslib_1.__generator(this, function (_e) { switch (_e.label) { case 0: api = getState().config.api; if (!api) return [2 /*return*/]; _e.label = 1; case 1: _e.trys.push([1, 3, , 4]); return [4 /*yield*/, api.rateOrder(orderId, data)]; case 2: response = _e.sent(); return [2 /*return*/, response]; case 3: err_12 = _e.sent(); return [2 /*return*/, rejectWithValue(err_12)]; case 4: return [2 /*return*/]; } }); }); }); var checkoutSlice = (0, toolkit_1.createSlice)({ name: types_1.ReducerType.Checkout, initialState: initialState, reducers: { resetPosCheckout: function () { return initialState; }, resetPosCheck: function (state) { state.check = null; state.loading = 'idle'; state.error = null; }, resetPosCheckError: function (state) { state.loading = 'idle'; state.error = null; }, handleCheckoutError: function (state, action) { var _a = action.payload, key = _a[0], errors = _a[1]; var index = typeof errors === 'string' ? 0 : errors[0].index; var discounts = state.discounts, surcharges = state.surcharges, taxes = state.taxes; switch (key) { case 'discounts': state.discounts = discounts.filter(function (_, idx) { return idx !== index; }); break; case 'surcharges': state.surcharges = surcharges.filter(function (_, idx) { return idx !== index; }); break; case 'taxes': state.taxes = taxes.filter(function (_, idx) { return idx !== index; }); break; default: break; } state.error = null; }, setMadeFor: function (state, action) { state.madeFor = action.payload; }, setPhone: function (state, action) { state.phone = action.payload; }, addGiftCard: function (state, action) { state.giftCards.push(action.payload); }, removeGiftCard: function (state, action) { state.giftCards = state.giftCards.filter(function (i) { return i.code !== action.payload; }); }, addSurcharge: function (state, action) { state.surcharges.push(action.payload); }, removeSurcharge: function (state, action) { var id = action.payload.id; state.surcharges = state.surcharges.filter(function (i) { return i.id !== id; }); }, addDiscount: function (state, action) { state.discounts.push(action.payload); }, removeDiscount: function (state, action) { var id = action.payload.id; var discountIndex = action.payload.index; var discount = state.check ? state.check.discounts.find(function (item) { return item.id === id && item.index === discountIndex; }) : null; if (discount && discount.discount_type === 'LOYALTY') { state.points = []; } else { state.discounts = state.discounts.filter(function (item) { return item.id !== id || (item.id === id && item.index !== undefined && item.index !== discountIndex); }); } }, addTax: function (state, action) { state.taxes.push(action.payload); }, removeTax: function (state, action) { state.taxes = state.taxes.filter(function (i) { return i.id !== action.payload; }); }, addTip: function (state, action) { state.tip = action.payload; }, removeTip: function (state) { state.tip = null; }, setTaxExempt: function (state, action) { state.isTaxExempt = action.payload; }, addCustomer: function (state, action) { state.customer = action.payload; }, removeCustomer: function (state) { state.points = []; state.customer = null; }, setPendingDiscounts: function (state, action) { state.pendingDiscounts = action.payload; }, setPoints: function (state, action) { state.points = action.payload; } }, extraReducers: function (builder) { builder .addCase(exports.addPromoCode.fulfilled, function (state, action) { var discount_id = action.payload.discount_id; state.discounts.push({ id: discount_id }); state.loading = 'idle'; state.error = null; }) .addCase(exports.addPromoCode.pending, function (state) { state.loading = 'pending'; state.authorizing = 'pending'; }) .addCase(exports.addPromoCode.rejected, function (state, action) { state.loading = 'idle'; state.error = action.payload; }) .addCase(exports.addTender.fulfilled, function (state) { state.loading = 'idle'; state.authorizing = 'idle'; state.error = null; }) .addCase(exports.addTender.pending, function (state) { state.loading = 'pending'; state.authorizing = 'pending'; }) .addCase(exports.addTender.rejected, function (state, action) { state.loading = 'idle'; state.authorizing = 'idle'; state.error = action.payload; }) .addCase(exports.removeTender.fulfilled, function (state) { state.loading = 'idle'; state.removing = 'idle'; state.error = null; }) .addCase(exports.removeTender.pending, function (state) { state.loading = 'pending'; state.removing = 'pending'; }) .addCase(exports.removeTender.rejected, function (state, action) { state.loading = 'idle'; state.removing = 'idle'; state.error = action.payload; }) .addCase(exports.updateTender.fulfilled, function (state) { state.loading = 'idle'; state.authorizing = 'idle'; state.error = null; }) .addCase(exports.updateTender.pending, function (state) { state.loading = 'pending'; state.authorizing = 'pending'; }) .addCase(exports.updateTender.rejected, function (state, action) { state.loading = 'idle'; state.authorizing = 'idle'; state.error = action.payload; }) .addCase(exports.updateCart.fulfilled, function (state) { state.error = null; }) // .addCase(updateCart.pending, () => {}) .addCase(exports.updateCart.rejected, function (state, action) { state.error = action.payload; }) .addCase(exports.identifyCustomer.fulfilled, function (state) { state.loading = 'idle'; state.identifying = 'idle'; state.error = null; }) .addCase(exports.identifyCustomer.pending, function (state) { state.loading = 'pending'; state.identifying = 'pending'; }) .addCase(exports.identifyCustomer.rejected, function (state, action) { state.loading = 'idle'; state.identifying = 'idle'; state.error = action.payload; }) .addCase(exports.completeChipDNA.fulfilled, function (state) { state.loading = 'idle'; state.error = null; }) .addCase(exports.completeChipDNA.pending, function (state) { state.loading = 'pending'; }) .addCase(exports.completeChipDNA.rejected, function (state, action) { state.loading = 'idle'; state.error = action.payload; }) .addCase(exports.addCreditTender.fulfilled, function (state) { state.loading = 'idle'; state.error = null; }) .addCase(exports.addCreditTender.pending, function (state) { state.loading = 'pending'; }) .addCase(exports.addCreditTender.rejected, function (state, action) { state.loading = 'idle'; state.error = action.payload; }) .addCase(exports.validatePosOrder.fulfilled, function (state, action) { state.check = action.payload || null; state.loading = 'idle'; state.validating = 'idle'; state.error = null; }) .addCase(exports.validatePosOrder.pending, function (state) { state.loading = 'pending'; state.validating = 'pending'; }) .addCase(exports.validatePosOrder.rejected, function (state, action) { state.loading = 'idle'; state.validating = 'idle'; state.error = action.payload; }) .addCase(exports.submitPosOrder.fulfilled, function (state, action) { if (action.payload) { return tslib_1.__assign(tslib_1.__assign({}, initialState), { completedOrder: action.payload }); } else { state.check = null; state.error = null; state.loading = 'idle'; state.submitting = 'idle'; return; } }) .addCase(exports.submitPosOrder.pending, function (state) { state.loading = 'pending'; state.submitting = 'pending'; }) .addCase(exports.submitPosOrder.rejected, function (state, action) { // state.check = null state.loading = 'idle'; state.submitting = 'idle'; state.error = action.payload; }) .addCase(exports.voidPosOrder.fulfilled, function () { return initialState; }) .addCase(exports.voidPosOrder.pending, function (state) { state.loading = 'pending'; }) .addCase(exports.voidPosOrder.rejected, function () { return initialState; }) .addCase(exports.activateGiftCards.fulfilled, function (state, action) { state.giftCards = action.payload; state.loading = 'idle'; state.activating = 'idle'; state.error = null; }) .addCase(exports.activateGiftCards.pending, function (state) { state.loading = 'pending'; state.activating = 'pending'; }) .addCase(exports.activateGiftCards.rejected, function (state, action) { state.loading = 'idle'; state.activating = 'idle'; state.error = action.payload; }) .addCase(exports.rateOrder.fulfilled, function (state, action) { state.rate = action.payload; state.rating = 'idle'; state.ratingError = null; }) .addCase(exports.rateOrder.pending, function (state) { state.rating = 'pending'; }) .addCase(exports.rateOrder.rejected, function (state, action) { state.rating = 'idle'; state.ratingError = action.payload; }); } }); exports.resetPosCheckout = (_a = checkoutSlice.actions, _a.resetPosCheckout), exports.resetPosCheck = _a.resetPosCheck, exports.resetPosCheckError = _a.resetPosCheckError, exports.handleCheckoutError = _a.handleCheckoutError, exports.addGiftCard = _a.addGiftCard, exports.removeGiftCard = _a.removeGiftCard, exports.addSurcharge = _a.addSurcharge, exports.removeSurcharge = _a.removeSurcharge, exports.addDiscount = _a.addDiscount, exports.removeDiscount = _a.removeDiscount, exports.addTax = _a.addTax, exports.removeTax = _a.removeTax, exports.addTip = _a.addTip, exports.removeTip = _a.removeTip, exports.setTaxExempt = _a.setTaxExempt, exports.addCustomer = _a.addCustomer, exports.removeCustomer = _a.removeCustomer, exports.setPendingDiscounts = _a.setPendingDiscounts, exports.setPoints = _a.setPoints, exports.setMadeFor = _a.setMadeFor, exports.setPhone = _a.setPhone; var selectPosCheckout = function (state) { return state.checkout; }; exports.selectPosCheckout = selectPosCheckout; var selectPosCheck = function (state) { return state.checkout.check; }; exports.selectPosCheck = selectPosCheck; var selectPosCustomer = function (state) { return state.checkout.customer; }; exports.selectPosCustomer = selectPosCustomer; var selectPosCustomerName = function (state) { if (!state.checkout.customer) return null; var _a = state.checkout.customer.customer, first_name = _a.first_name, last_name = _a.last_name; return "".concat(first_name, " ").concat(last_name); }; exports.selectPosCustomerName = selectPosCustomerName; var selectPosCustomerNameShort = function (state) { if (!state.checkout.customer) return null; var _a = state.checkout.customer.customer, first_name = _a.first_name, last_name = _a.last_name; var lastName = (last_name === null || last_name === void 0 ? void 0 : last_name.charAt(0)) || ''; return "".concat(first_name, " ").concat(lastName); }; exports.selectPosCustomerNameShort = selectPosCustomerNameShort; var selectPosPendingDiscounts = function (state) { return state.checkout.pendingDiscounts; }; exports.selectPosPendingDiscounts = selectPosPendingDiscounts; var selectPosAmountDue = function (state) { var check = state.checkout.check; var amountDue = check ? check.totals.amount_due : null; return amountDue || null; }; exports.selectPosAmountDue = selectPosAmountDue; var selectPosCheckSubtotal = function (state) { var check = state.checkout.check; var subtotal = check ? check.totals.subtotal : '0.00'; return subtotal || null; }; exports.selectPosCheckSubtotal = selectPosCheckSubtotal; var selectPosCheckTotal = function (state) { var check = state.checkout.check; var total = check ? check.totals.total : '0.00'; return total || null; }; exports.selectPosCheckTotal = selectPosCheckTotal; var selectPosCheckTenders = function (state) { var check = state.checkout.check; return check ? check.tenders : []; }; exports.selectPosCheckTenders = selectPosCheckTenders; // export const selectPosCheckGiftCardCodes = (state: AppState) => { // const check = state.checkout.check // return check // ? check.tenders // .filter( // i => i.tender_type === 'GIFT_CARD' && i.tender_status === 'AUTHORIZED' // ) // .map(i => (i.gift_card ? i.gift_card.code : null)) // .filter(i => i) // : [] // } exports.checkoutReducer = checkoutSlice.reducer;