@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
JavaScript
"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;