@darkpos/pricing 1.0.4 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc +8 -10
- package/README.md +108 -4
- package/__TEST__/item.test.js +265 -34
- package/__TEST__/modifier/calculate.test.js +73 -0
- package/__TEST__/modifier/getAvailablePromotionsOrSubscriptions.test.js +81 -0
- package/__TEST__/modifier/getMatchTagsModifiers.test.js +109 -0
- package/__TEST__/modifier/getModifierIndex.test.js +40 -0
- package/__TEST__/modifier/getRecommendedModifiers.test.js +17 -0
- package/__TEST__/modifier/hasAllTags.test.js +25 -0
- package/__TEST__/modifier/hasAttribute.test.js +47 -0
- package/__TEST__/modifier/hasMatchTags.test.js +56 -0
- package/__TEST__/modifier/hasNoTags.test.js +21 -0
- package/__TEST__/modifier/mocks/toggleModifier_no1.json +13440 -0
- package/__TEST__/modifier/mocks/toggleModifier_no2.json +13438 -0
- package/__TEST__/modifier/mocks/toggleModifier_no3.json +13598 -0
- package/__TEST__/modifier/sort.test.js +41 -0
- package/__TEST__/order.test.js +147 -74
- package/index.js +1 -9
- package/lib/constants/Modifier/Attributes.js +9 -0
- package/lib/constants/Modifier/Compute.js +15 -0
- package/lib/constants/Modifier/Types.js +7 -0
- package/lib/constants/Modifier/index.js +9 -0
- package/lib/constants/Status.js +39 -0
- package/lib/constants/index.js +7 -0
- package/lib/index.js +38 -0
- package/lib/item/addIndirectModifier.js +55 -0
- package/lib/item/calculate.js +108 -0
- package/lib/item/create.js +35 -0
- package/lib/item/filterByDirectModifiers.js +13 -0
- package/lib/item/findOriginalItem.js +8 -0
- package/lib/item/getBalanceToPay.js +12 -0
- package/lib/item/getDepartmentModifiers.js +5 -0
- package/lib/item/getDiscountModifiers.js +7 -0
- package/lib/item/getItemModifiers.js +16 -0
- package/lib/item/getItemModifiersDescription.js +22 -0
- package/lib/item/getItemPrice.js +57 -0
- package/lib/item/getItemsTotalPaid.js +9 -0
- package/lib/item/getItemsTotalPieces.js +7 -0
- package/lib/item/getNotIncludedModifiers.js +11 -0
- package/lib/item/getParentItem.js +5 -0
- package/lib/item/getPendingIndex.js +5 -0
- package/lib/item/getTotal.js +8 -0
- package/lib/item/getTotalPieces.js +7 -0
- package/lib/item/getTotals.js +25 -0
- package/lib/item/hasCreateSubscription.js +7 -0
- package/lib/item/hasModifier.js +15 -0
- package/lib/item/hasModifierWithValue.js +11 -0
- package/lib/item/hasModifiers.js +9 -0
- package/lib/item/hasSubscription.js +5 -0
- package/lib/item/index.js +80 -4
- package/lib/item/isParentIncluded.js +4 -0
- package/lib/item/isRelatedItem.js +4 -0
- package/lib/item/isSelected.js +13 -0
- package/lib/item/openRecommendationDialog.js +4 -0
- package/lib/item/removeModifier.js +84 -0
- package/lib/item/removeModifierById.js +8 -0
- package/lib/item/removeModifiers.js +14 -0
- package/lib/modifier/addFile.js +19 -0
- package/lib/modifier/addImage.js +18 -0
- package/lib/modifier/calculate.js +43 -0
- package/lib/modifier/contains.js +5 -0
- package/lib/modifier/convertMenuModifiers.js +5 -0
- package/lib/modifier/create.js +44 -0
- package/lib/modifier/createAmountOverrideModifier.js +20 -0
- package/lib/modifier/createCreditModifier.js +32 -0
- package/lib/modifier/createDiscountModifier.js +25 -0
- package/lib/modifier/createGroupValuesModifier.js +29 -0
- package/lib/modifier/createIndirectModifier.js +42 -0
- package/lib/modifier/createSubscriptionModifier.js +19 -0
- package/lib/modifier/displayAsCard.js +9 -0
- package/lib/modifier/displayAsChips.js +9 -0
- package/lib/modifier/displayAsList.js +9 -0
- package/lib/modifier/duplicate.js +12 -0
- package/lib/modifier/enableAutoPopup.js +9 -0
- package/lib/modifier/filterByRequiredModifiers.js +4 -0
- package/lib/modifier/findById.js +7 -0
- package/lib/modifier/findByPaymentMethod.js +10 -0
- package/lib/modifier/findByPaymentType.js +10 -0
- package/lib/modifier/getAvailablePromotions.js +5 -0
- package/lib/modifier/getAvailablePromotionsOrSubscriptions.js +15 -0
- package/lib/modifier/getAvailableSubscriptions.js +5 -0
- package/lib/modifier/getByAttribute.js +6 -0
- package/lib/modifier/getCreditModifier.js +6 -0
- package/lib/modifier/getDefaultModifiers.js +4 -0
- package/lib/modifier/getDepartmentMaxItems.js +10 -0
- package/lib/modifier/getDepartmentModifiers.js +11 -0
- package/lib/modifier/getDescription.js +6 -0
- package/lib/modifier/getDescriptions.js +9 -0
- package/lib/modifier/getDirectModifiers.js +5 -0
- package/lib/modifier/getDiscountModifiers.js +7 -0
- package/lib/modifier/getEntityModifiers.js +11 -0
- package/lib/modifier/getEntityPromotions.js +11 -0
- package/lib/modifier/getExtendedTags.js +14 -0
- package/lib/modifier/getFiles.js +5 -0
- package/lib/modifier/getGroupModifiers.js +9 -0
- package/lib/modifier/getGroupOfItemsModifiers.js +4 -0
- package/lib/modifier/getGroupRelatedModifiers.js +26 -0
- package/lib/modifier/getImages.js +5 -0
- package/lib/modifier/getInheritedModifiers.js +30 -0
- package/lib/modifier/getItemModifiers.js +39 -0
- package/lib/modifier/getLaundryModifiers.js +9 -0
- package/lib/modifier/getMatchTagsModifiers.js +9 -0
- package/lib/modifier/getModifierIndex.js +14 -0
- package/lib/modifier/getPreferences.js +24 -0
- package/lib/modifier/getPromotionModifiers.js +5 -0
- package/lib/modifier/getPromptMessage.js +6 -0
- package/lib/modifier/getProperty.js +11 -0
- package/lib/modifier/getRecommendedModifiers.js +7 -0
- package/lib/modifier/getRelatedModifiers.js +10 -0
- package/lib/modifier/getRequiredModifiers.js +4 -0
- package/lib/modifier/getSelectedValues.js +7 -0
- package/lib/modifier/getService.js +5 -0
- package/lib/modifier/getSplittedModifiers.js +30 -0
- package/lib/modifier/getStarchModifier.js +9 -0
- package/lib/modifier/getSubscriptionItem.js +12 -0
- package/lib/modifier/getSubscriptionModifiers.js +5 -0
- package/lib/modifier/getSuggestion.js +9 -0
- package/lib/modifier/getUnhiddenModifiers.js +9 -0
- package/lib/modifier/getUsingCount.js +11 -0
- package/lib/modifier/hasAddModifiers.js +5 -0
- package/lib/modifier/hasAllTag.js +12 -0
- package/lib/modifier/hasAttribute.js +8 -0
- package/lib/modifier/hasAttributes.js +19 -0
- package/lib/modifier/hasCreateSubscription.js +10 -0
- package/lib/modifier/hasDisplayPrompt.js +9 -0
- package/lib/modifier/hasMatchTags.js +27 -0
- package/lib/modifier/hasModifier.js +12 -0
- package/lib/modifier/hasNoTags.js +9 -0
- package/lib/modifier/hasRelatedItems.js +8 -0
- package/lib/modifier/includePiecesInQuantity.js +10 -0
- package/lib/modifier/includesInGroup.js +9 -0
- package/lib/modifier/index.js +240 -6
- package/lib/modifier/isAmountOverride.js +7 -0
- package/lib/modifier/isAvailablePromotion.js +23 -0
- package/lib/modifier/isAvailableSubscription.js +28 -0
- package/lib/modifier/isCompact.js +12 -0
- package/lib/modifier/isCredit.js +6 -0
- package/lib/modifier/isCustomerTagsExtend.js +9 -0
- package/lib/modifier/isDefault.js +4 -0
- package/lib/modifier/isDepartment.js +6 -0
- package/lib/modifier/isDirect.js +6 -0
- package/lib/modifier/isDiscount.js +6 -0
- package/lib/modifier/isEditable.js +10 -0
- package/lib/modifier/isGratuity.js +6 -0
- package/lib/modifier/isGroupOfItems.js +12 -0
- package/lib/modifier/isGroupOfModifiers.js +12 -0
- package/lib/modifier/isGroupOfValues.js +13 -0
- package/lib/modifier/isHidden.js +4 -0
- package/lib/modifier/isIncluded.js +4 -0
- package/lib/modifier/isManual.js +9 -0
- package/lib/modifier/isMultiplier.js +11 -0
- package/lib/modifier/isOverride.js +6 -0
- package/lib/modifier/isPaymentMethods.js +8 -0
- package/lib/modifier/isPaymentTypes.js +8 -0
- package/lib/modifier/isPreferences.js +8 -0
- package/lib/modifier/isPriceOverride.js +7 -0
- package/lib/modifier/isPromotion.js +6 -0
- package/lib/modifier/isQuantityOverride.js +7 -0
- package/lib/modifier/isRemoveModifier.js +4 -0
- package/lib/modifier/isRequired.js +4 -0
- package/lib/modifier/isRequiredAndOverride.js +4 -0
- package/lib/modifier/isService.js +9 -0
- package/lib/modifier/isSingleValue.js +9 -0
- package/lib/modifier/isSubscription.js +6 -0
- package/lib/modifier/isTrackUsageSubscription.js +5 -0
- package/lib/modifier/isValueSelected.js +7 -0
- package/lib/modifier/purifyModifiers.js +15 -0
- package/lib/modifier/sort.js +35 -0
- package/lib/order/addCreditModifier.js +27 -0
- package/lib/order/addDiscountModifier.js +9 -0
- package/lib/order/addItem.js +292 -0
- package/lib/order/addItemModifier.js +214 -0
- package/lib/order/addModifier.js +9 -0
- package/lib/order/addModifierToAllItems.js +16 -0
- package/lib/order/addNote.js +25 -0
- package/lib/order/addTable.js +11 -0
- package/lib/order/calculate.js +105 -0
- package/lib/order/calculateDue.js +15 -0
- package/lib/order/calculateOrdersDue.js +26 -0
- package/lib/order/canSplit.js +4 -0
- package/lib/order/changeEndDate.js +15 -0
- package/lib/order/changeLocation.js +20 -0
- package/lib/order/changeStartDate.js +14 -0
- package/lib/order/combineSubOrders.js +14 -0
- package/lib/order/containsSerial.js +5 -0
- package/lib/order/create.js +67 -0
- package/lib/order/createParent.js +9 -0
- package/lib/order/duplicateItem.js +16 -0
- package/lib/order/findItemIndex.js +6 -0
- package/lib/order/getAppliedCredit.js +5 -0
- package/lib/order/getBalance.js +9 -0
- package/lib/order/getCustomer.js +4 -0
- package/lib/order/getCustomerStoreCredit.js +14 -0
- package/lib/order/getCustomerSubscriptions.js +8 -0
- package/lib/order/getCustomerSubscriptionsByItem.js +14 -0
- package/lib/order/getDepartmentModifiers.js +9 -0
- package/lib/order/getEndDate.js +4 -0
- package/lib/order/getItemByItemId.js +6 -0
- package/lib/order/getItemIndex.js +9 -0
- package/lib/order/getItemsToPay.js +17 -0
- package/lib/order/getMenuItemsByCustomer.js +19 -0
- package/lib/order/getNumberOfItems.js +10 -0
- package/lib/order/getOrdersPieces.js +10 -0
- package/lib/order/getPendingItemIndex.js +5 -0
- package/lib/order/getRelatedItems.js +11 -0
- package/lib/order/getSameItems.js +19 -0
- package/lib/order/getScheduleByCustomer.js +20 -0
- package/lib/order/getScreenCustomerNotes.js +12 -0
- package/lib/order/getSelectedItem.js +6 -0
- package/lib/order/getStartDate.js +4 -0
- package/lib/order/getTip.js +10 -0
- package/lib/order/getTotalPieces.js +17 -0
- package/lib/order/getTotals.js +28 -0
- package/lib/order/hasAggregate.js +20 -0
- package/lib/order/hasItem.js +7 -0
- package/lib/order/hasRemainingSubscription.js +67 -0
- package/lib/order/hold.js +12 -0
- package/lib/order/index.js +164 -4
- package/lib/order/isDetailed.js +4 -0
- package/lib/order/isHold.js +4 -0
- package/lib/order/isNew.js +4 -0
- package/lib/order/isOpen.js +4 -0
- package/lib/order/isParent.js +7 -0
- package/lib/order/merge.js +96 -0
- package/lib/order/open.js +11 -0
- package/lib/order/pickEndDate.js +70 -0
- package/lib/order/removeApplyModifier.js +24 -0
- package/lib/order/removeDiscountModifier.js +16 -0
- package/lib/order/removeItem.js +55 -0
- package/lib/order/removeItemByIndex.js +5 -0
- package/lib/order/removeItemModifier.js +69 -0
- package/lib/order/removeModifier.js +21 -0
- package/lib/order/removeModifierByAttribute.js +23 -0
- package/lib/order/removeModifiersWithPaymentMethods.js +29 -0
- package/lib/order/removeModifiersWithPaymentTypes.js +27 -0
- package/lib/order/setCustomer.js +50 -0
- package/lib/order/splitByDepartments.js +151 -0
- package/lib/order/toggleModifier.js +9 -0
- package/lib/order/updateItem.js +8 -0
- package/lib/order/updateItemQuantity.js +35 -0
- package/lib/order/void.js +11 -0
- package/package.json +17 -15
- package/__TEST__/modifier.test.js +0 -126
- package/lib/item/actions.js +0 -140
- package/lib/modifier/actions.js +0 -172
- package/lib/modifier/constants.js +0 -46
- package/lib/order/actions.js +0 -47
- package/lib/utils/defaultPrices.js +0 -10
- package/lib/utils/helpers.js +0 -26
- package/lib/utils/index.js +0 -9
- package/lib/utils/math.js +0 -71
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module.exports = ({ settings, _, moment }) => {
|
|
2
|
+
const timezone = _.get(settings, 'localization.timezone', 'America/New_York');
|
|
3
|
+
const isInSchedule = (each, date) => {
|
|
4
|
+
const isoWeekday = moment(date).tz(timezone).isoWeekday();
|
|
5
|
+
let check = false;
|
|
6
|
+
if (each.day !== undefined && each.day !== null)
|
|
7
|
+
check = String(each.day) === String(isoWeekday === 7 ? 0 : isoWeekday);
|
|
8
|
+
|
|
9
|
+
if (each.date)
|
|
10
|
+
check =
|
|
11
|
+
moment(date).startOf('day').tz(timezone).format('YYYYMMDD') ===
|
|
12
|
+
moment(each.date).startOf('day').tz(timezone).format('YYYYMMDD');
|
|
13
|
+
return check;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const checkStoreSchedule = date => {
|
|
17
|
+
const schedule = _.get(settings, 'schedule', {});
|
|
18
|
+
const { close = [] } = schedule;
|
|
19
|
+
|
|
20
|
+
if (close.length) return !close.find(each => isInSchedule(each, date));
|
|
21
|
+
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
24
|
+
return function pickEndDate(schedule = {}, skip = 0, date = undefined) {
|
|
25
|
+
const {
|
|
26
|
+
addDays = 1,
|
|
27
|
+
hour,
|
|
28
|
+
minute,
|
|
29
|
+
skipDays = [],
|
|
30
|
+
cutHour,
|
|
31
|
+
cutDay = 1,
|
|
32
|
+
} = schedule;
|
|
33
|
+
let days = skip || Number(addDays);
|
|
34
|
+
|
|
35
|
+
const todayTimezone = moment().tz(timezone);
|
|
36
|
+
const dateTimezone = date || todayTimezone;
|
|
37
|
+
|
|
38
|
+
if (
|
|
39
|
+
!skip &&
|
|
40
|
+
!date &&
|
|
41
|
+
cutHour &&
|
|
42
|
+
todayTimezone.isAfter(moment(schedule.cutHour, 'hh:mm:ss').tz(timezone))
|
|
43
|
+
) {
|
|
44
|
+
console.log('cut day applied');
|
|
45
|
+
days += cutDay;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const endDate = dateTimezone.add(Number(days), 'days');
|
|
49
|
+
console.log('check date => ', endDate.format());
|
|
50
|
+
|
|
51
|
+
const isoWeekday = endDate.isoWeekday();
|
|
52
|
+
console.log('isoWeekday => ', isoWeekday);
|
|
53
|
+
|
|
54
|
+
if (skipDays && skipDays.includes(isoWeekday === 7 ? 0 : isoWeekday)) {
|
|
55
|
+
console.log('check next day: in Skip days');
|
|
56
|
+
return pickEndDate(schedule, 1, endDate);
|
|
57
|
+
}
|
|
58
|
+
if (!checkStoreSchedule(endDate)) {
|
|
59
|
+
console.log('check next day: in Close days');
|
|
60
|
+
return pickEndDate(schedule, 1, endDate);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (hour !== undefined) endDate.set('hour', hour);
|
|
64
|
+
if (minute !== undefined) endDate.set('minute', minute);
|
|
65
|
+
endDate.set('second', 0);
|
|
66
|
+
|
|
67
|
+
console.log('final date in local', endDate.format());
|
|
68
|
+
return moment.utc(endDate).format();
|
|
69
|
+
};
|
|
70
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module.exports = ({ actions }) =>
|
|
2
|
+
function removeApplyModifier({
|
|
3
|
+
order,
|
|
4
|
+
attribute,
|
|
5
|
+
modifier,
|
|
6
|
+
applyItems = true,
|
|
7
|
+
}) {
|
|
8
|
+
if (!order) return order;
|
|
9
|
+
let newOrder = { ...order };
|
|
10
|
+
|
|
11
|
+
if (attribute) {
|
|
12
|
+
newOrder = actions.removeModifierByAttribute({
|
|
13
|
+
order,
|
|
14
|
+
attribute,
|
|
15
|
+
applyItems,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (modifier) {
|
|
20
|
+
newOrder = actions.addModifier({ order: newOrder, modifier });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return newOrder;
|
|
24
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module.exports = ({ modifierActions, itemActions }) =>
|
|
2
|
+
function removeDiscountModifiers(order) {
|
|
3
|
+
if (!order || !Array.isArray(order.modifiers)) return order;
|
|
4
|
+
const nextOrder = { ...order };
|
|
5
|
+
let { modifiers, items } = nextOrder;
|
|
6
|
+
const discountModifiers = modifiers.filter(modifierActions.isDiscount);
|
|
7
|
+
modifiers = modifiers.filter(each => !modifierActions.isDiscount(each));
|
|
8
|
+
if (items)
|
|
9
|
+
items = items.map(each =>
|
|
10
|
+
itemActions.removeModifiers({
|
|
11
|
+
item: each,
|
|
12
|
+
modifiers: discountModifiers,
|
|
13
|
+
})
|
|
14
|
+
);
|
|
15
|
+
return { ...order, modifiers, items };
|
|
16
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module.exports = ({ actions, _, itemActions }) => {
|
|
2
|
+
const updateRelatedItems = (items, parentId) =>
|
|
3
|
+
items.map(each => {
|
|
4
|
+
const item = { ...each };
|
|
5
|
+
if (item.properties && item.properties.parentId === parentId)
|
|
6
|
+
item.properties.includeParent = false;
|
|
7
|
+
return item;
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
return function removeItem({ order, item, checkQuantity, hard = true }) {
|
|
11
|
+
if (!item) return order;
|
|
12
|
+
|
|
13
|
+
const orderItemIdx = actions.getItemIndex({ order, item });
|
|
14
|
+
if (orderItemIdx < 0) return order;
|
|
15
|
+
|
|
16
|
+
let { items } = order;
|
|
17
|
+
const orderItem = items[orderItemIdx];
|
|
18
|
+
const relatedItems = actions.getRelatedItems({ order, item });
|
|
19
|
+
const hasRelatedItem = !_.isEmpty(relatedItems);
|
|
20
|
+
|
|
21
|
+
if (!hard || hasRelatedItem) {
|
|
22
|
+
items[orderItemIdx] = { ...orderItem, price: 0, modifiers: [] };
|
|
23
|
+
if (hasRelatedItem) {
|
|
24
|
+
items = updateRelatedItems(items, item._id);
|
|
25
|
+
// console.log('Update related items ...', items);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Decrease the quantity
|
|
29
|
+
else if (
|
|
30
|
+
checkQuantity &&
|
|
31
|
+
items[orderItemIdx] &&
|
|
32
|
+
items[orderItemIdx].quantity > 1
|
|
33
|
+
)
|
|
34
|
+
items[orderItemIdx] = { ...orderItem, quantity: orderItem.quantity - 1 };
|
|
35
|
+
// Remove
|
|
36
|
+
else items.splice(orderItemIdx, 1);
|
|
37
|
+
|
|
38
|
+
// if it is the last relatedItem
|
|
39
|
+
if (
|
|
40
|
+
itemActions.isRelatedItem(item) &&
|
|
41
|
+
!itemActions.isParentIncluded(item)
|
|
42
|
+
) {
|
|
43
|
+
const parent = itemActions.getParentItem(items, orderItem);
|
|
44
|
+
const parentIndex = actions.getItemIndex({ order, item: parent });
|
|
45
|
+
const siblings = actions.getRelatedItems({ order, item: parent });
|
|
46
|
+
// console.log('Removing parent item ...');
|
|
47
|
+
if (siblings <= 1) items.splice(parentIndex, 1);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
...order,
|
|
52
|
+
items,
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module.exports = ({ actions, modifierActions, itemActions, utils, _ }) => {
|
|
2
|
+
const { math } = utils;
|
|
3
|
+
|
|
4
|
+
const getPrice = ({ item, modifier }) => {
|
|
5
|
+
const amount =
|
|
6
|
+
(modifier && modifier.compute && modifier.compute.amount) || 0;
|
|
7
|
+
const { price = 0 } = item;
|
|
8
|
+
if (modifierActions.isMultiplier(modifier)) return math.mul(price, amount);
|
|
9
|
+
return amount;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const removeModifier = ({ item, modifier, originalItem }) => {
|
|
13
|
+
const nextItem = { ...item, modifiers: [] };
|
|
14
|
+
|
|
15
|
+
nextItem.modifiers = item.modifiers.filter(
|
|
16
|
+
each => (each.modifierId || each._id) !== modifier._id
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
if (modifierActions.isAmountOverride(modifier))
|
|
20
|
+
return {
|
|
21
|
+
...originalItem,
|
|
22
|
+
...nextItem,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
if (modifierActions.isPriceOverride(modifier))
|
|
26
|
+
nextItem.price = getPrice({ modifier, item: nextItem });
|
|
27
|
+
|
|
28
|
+
if (modifierActions.isQuantityOverride(modifier)) nextItem.quantity = 1;
|
|
29
|
+
|
|
30
|
+
return nextItem;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
return function removeItemModifier({
|
|
34
|
+
order: orderProp,
|
|
35
|
+
modifier,
|
|
36
|
+
itemIndex,
|
|
37
|
+
cache,
|
|
38
|
+
}) {
|
|
39
|
+
const order = _.cloneDeep(orderProp);
|
|
40
|
+
if (!order || itemIndex < 0 || !modifier) return order;
|
|
41
|
+
|
|
42
|
+
let item = actions.getSelectedItem({ order, itemIndex });
|
|
43
|
+
const customer = actions.getCustomer(order);
|
|
44
|
+
const originalItem = cache.items.find(_item => _item._id === item.itemId);
|
|
45
|
+
const contains = modifierActions.contains(item.modifiers, modifier);
|
|
46
|
+
|
|
47
|
+
if (!contains) return order;
|
|
48
|
+
if (
|
|
49
|
+
modifierActions.isGroupOfValues(modifier) ||
|
|
50
|
+
modifierActions.isRequiredAndOverride(modifier)
|
|
51
|
+
)
|
|
52
|
+
return order;
|
|
53
|
+
|
|
54
|
+
// Remove
|
|
55
|
+
item = removeModifier({
|
|
56
|
+
item,
|
|
57
|
+
modifier,
|
|
58
|
+
originalItem,
|
|
59
|
+
});
|
|
60
|
+
item.price = itemActions.getItemPrice({
|
|
61
|
+
item,
|
|
62
|
+
cache,
|
|
63
|
+
customer,
|
|
64
|
+
});
|
|
65
|
+
order.items[itemIndex] = item;
|
|
66
|
+
|
|
67
|
+
return order;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module.exports = ({ modifierActions, itemActions }) =>
|
|
2
|
+
function removeModifier({ order, modifier }) {
|
|
3
|
+
if (!order || !modifier) return order;
|
|
4
|
+
|
|
5
|
+
const index = modifierActions.getModifierIndex({
|
|
6
|
+
entity: order,
|
|
7
|
+
modifier,
|
|
8
|
+
});
|
|
9
|
+
const nextOrder = { ...order };
|
|
10
|
+
|
|
11
|
+
if (index > -1) {
|
|
12
|
+
const { items, modifiers } = nextOrder;
|
|
13
|
+
if (items)
|
|
14
|
+
nextOrder.items = items.map(each =>
|
|
15
|
+
itemActions.removeModifier({ item: each, modifier: modifiers[index] })
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
nextOrder.modifiers.splice(index, 1);
|
|
19
|
+
}
|
|
20
|
+
return nextOrder;
|
|
21
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module.exports = ({ modifierActions }) =>
|
|
2
|
+
function removeModifierByAttribute({ order, attribute, applyItems = false }) {
|
|
3
|
+
if (!order || !attribute) return order;
|
|
4
|
+
if (!Array.isArray(order.modifiers)) return order;
|
|
5
|
+
|
|
6
|
+
const newOrder = { ...order };
|
|
7
|
+
newOrder.modifiers = order.modifiers.filter(
|
|
8
|
+
each => !modifierActions.hasAttribute(each, attribute)
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
if (applyItems && Array.isArray(order.items)) {
|
|
12
|
+
newOrder.items = order.items.map(item => {
|
|
13
|
+
if (!Array.isArray(item.modifiers)) return item;
|
|
14
|
+
return {
|
|
15
|
+
...item,
|
|
16
|
+
modifiers: item.modifiers.filter(
|
|
17
|
+
each => !modifierActions.hasAttribute(each, attribute)
|
|
18
|
+
),
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
return newOrder;
|
|
23
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module.exports = () => {
|
|
2
|
+
const hasPaymentMethods = modifier =>
|
|
3
|
+
modifier.conditions &&
|
|
4
|
+
Array.isArray(modifier.conditions.paymentMethods) &&
|
|
5
|
+
modifier.conditions.paymentMethods.length;
|
|
6
|
+
|
|
7
|
+
return function removeModifiersWithPaymentMethods({
|
|
8
|
+
order,
|
|
9
|
+
applyItems = false,
|
|
10
|
+
}) {
|
|
11
|
+
if (!order || !Array.isArray(order.modifiers)) return order;
|
|
12
|
+
|
|
13
|
+
const newOrder = { ...order };
|
|
14
|
+
newOrder.modifiers = order.modifiers.filter(
|
|
15
|
+
each => !hasPaymentMethods(each)
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
if (applyItems && Array.isArray(order.items)) {
|
|
19
|
+
newOrder.items = order.items.map(item => {
|
|
20
|
+
if (!Array.isArray(item.modifiers)) return item;
|
|
21
|
+
return {
|
|
22
|
+
...item,
|
|
23
|
+
modifiers: item.modifiers.filter(each => !hasPaymentMethods(each)),
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return newOrder;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module.exports = () => {
|
|
2
|
+
const hasPaymentTypes = modifier =>
|
|
3
|
+
modifier.conditions &&
|
|
4
|
+
Array.isArray(modifier.conditions.paymentTypes) &&
|
|
5
|
+
modifier.conditions.paymentTypes.length;
|
|
6
|
+
|
|
7
|
+
return function removeModifiersWithPaymentTypes({
|
|
8
|
+
order,
|
|
9
|
+
applyItems = false,
|
|
10
|
+
}) {
|
|
11
|
+
if (!order || !Array.isArray(order.modifiers)) return order;
|
|
12
|
+
|
|
13
|
+
const newOrder = { ...order };
|
|
14
|
+
newOrder.modifiers = order.modifiers.filter(each => !hasPaymentTypes(each));
|
|
15
|
+
|
|
16
|
+
if (applyItems && Array.isArray(order.items)) {
|
|
17
|
+
newOrder.items = order.items.map(item => {
|
|
18
|
+
if (!Array.isArray(item.modifiers)) return item;
|
|
19
|
+
return {
|
|
20
|
+
...item,
|
|
21
|
+
modifiers: item.modifiers.filter(each => !hasPaymentTypes(each)),
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return newOrder;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module.exports = ({ itemActions, modifierActions, _ }) => {
|
|
2
|
+
const getTags = customer =>
|
|
3
|
+
(customer.tags || []).map(tag => tag.toLowerCase());
|
|
4
|
+
|
|
5
|
+
return function setCustomer({ order, customer, cache }) {
|
|
6
|
+
if (!order) return null;
|
|
7
|
+
// if (!customer) return { ...order, customer: null };
|
|
8
|
+
|
|
9
|
+
const { items = [] } = order;
|
|
10
|
+
const tags = customer ? getTags(customer) : ['default'];
|
|
11
|
+
|
|
12
|
+
const nextOrder = _.cloneDeep(order);
|
|
13
|
+
if (customer) {
|
|
14
|
+
nextOrder.customer = {
|
|
15
|
+
..._.cloneDeep(customer),
|
|
16
|
+
isEmbedded: true,
|
|
17
|
+
tags,
|
|
18
|
+
};
|
|
19
|
+
} else nextOrder.customer = null;
|
|
20
|
+
|
|
21
|
+
if (!items.length) return nextOrder;
|
|
22
|
+
|
|
23
|
+
nextOrder.items = items.map(item => {
|
|
24
|
+
const originalItem = itemActions.findOriginalItem({ item, cache });
|
|
25
|
+
if (!originalItem) return item;
|
|
26
|
+
|
|
27
|
+
const newModifiers = modifierActions.getMatchTagsModifiers({
|
|
28
|
+
entity: customer,
|
|
29
|
+
modifiers: item.modifiers,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const price = itemActions.getItemPrice({
|
|
33
|
+
item,
|
|
34
|
+
customer,
|
|
35
|
+
cache,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const newItem = {
|
|
39
|
+
...originalItem,
|
|
40
|
+
...item,
|
|
41
|
+
modifiers: newModifiers,
|
|
42
|
+
price,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
return newItem;
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
return nextOrder;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
module.exports = ({
|
|
2
|
+
utils,
|
|
3
|
+
_,
|
|
4
|
+
itemActions,
|
|
5
|
+
modifierActions,
|
|
6
|
+
actions,
|
|
7
|
+
settings,
|
|
8
|
+
}) => {
|
|
9
|
+
const orderSettings = _.get(settings, 'order');
|
|
10
|
+
const { date, math, helpers } = utils;
|
|
11
|
+
const noteDefaults = {
|
|
12
|
+
message: '',
|
|
13
|
+
attributes: [],
|
|
14
|
+
date: date.toISOString(),
|
|
15
|
+
user: null,
|
|
16
|
+
url: '',
|
|
17
|
+
__typename: 'Note',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const getSplitModifiers = (modifiers, totalOriginOrder, totalSplitedOrder) =>
|
|
21
|
+
modifiers.map(each => {
|
|
22
|
+
const modifier = { ...each };
|
|
23
|
+
if (modifier.type === 'fixed' && modifier.amount) {
|
|
24
|
+
const amount = totalOriginOrder
|
|
25
|
+
? math.div(
|
|
26
|
+
math.mul(modifier.amount, totalSplitedOrder || 0),
|
|
27
|
+
totalOriginOrder
|
|
28
|
+
)
|
|
29
|
+
: 0;
|
|
30
|
+
return {
|
|
31
|
+
...modifier,
|
|
32
|
+
_id: helpers.getObjectID(),
|
|
33
|
+
amount,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return modifier;
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const joinItemQuantity = orders =>
|
|
40
|
+
orders.map(order => {
|
|
41
|
+
const items = order.items.reduce((arr, item) => {
|
|
42
|
+
const _items = arr;
|
|
43
|
+
const index = _items.findIndex(each => {
|
|
44
|
+
const preSubs = modifierActions.getSubscriptionModifiers(
|
|
45
|
+
each.modifiers
|
|
46
|
+
);
|
|
47
|
+
const curSubs = modifierActions.getSubscriptionModifiers(
|
|
48
|
+
item.modifiers
|
|
49
|
+
);
|
|
50
|
+
return (
|
|
51
|
+
each.itemId === item.itemId &&
|
|
52
|
+
((!each.serial && !item.serial) || each.serial === item.serial) &&
|
|
53
|
+
((preSubs.length < 1 && curSubs.length < 1) ||
|
|
54
|
+
(preSubs.length > 0 && curSubs.length > 0))
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
if (index !== -1)
|
|
58
|
+
_items[index] = {
|
|
59
|
+
..._items[index],
|
|
60
|
+
quantity: _items[index].quantity + item.quantity,
|
|
61
|
+
};
|
|
62
|
+
else _items.push(item);
|
|
63
|
+
return _items;
|
|
64
|
+
}, []);
|
|
65
|
+
return { ...order, items };
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const getOrder =
|
|
69
|
+
({ order, name }) =>
|
|
70
|
+
(items, index) => {
|
|
71
|
+
let displayId = '';
|
|
72
|
+
if (orderSettings.allowSuborder)
|
|
73
|
+
displayId = `${order.displayId}-${index}`;
|
|
74
|
+
else if (index === 1) displayId = order.displayId;
|
|
75
|
+
return {
|
|
76
|
+
...order,
|
|
77
|
+
_id: helpers.getObjectID(),
|
|
78
|
+
displayId,
|
|
79
|
+
discount: 0,
|
|
80
|
+
tax: 0,
|
|
81
|
+
parentId: orderSettings.allowSuborder ? order._id : null,
|
|
82
|
+
items,
|
|
83
|
+
modifiers: [],
|
|
84
|
+
notes: [
|
|
85
|
+
...(order.notes || []),
|
|
86
|
+
{
|
|
87
|
+
...noteDefaults,
|
|
88
|
+
message: `Split from ${order.displayId}, for department ${name}`,
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const getDepartmentName = item => {
|
|
95
|
+
const deps = itemActions.getDepartmentModifiers(item);
|
|
96
|
+
return (deps.length && deps[0].name) || 'other';
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
return function splitByDepartments(order) {
|
|
100
|
+
const { items } = order;
|
|
101
|
+
const itemsByDepartments = _.groupBy(items, getDepartmentName);
|
|
102
|
+
const orders = Object.entries(itemsByDepartments);
|
|
103
|
+
let splitOrders = [];
|
|
104
|
+
|
|
105
|
+
orders.forEach(each => {
|
|
106
|
+
const [name, newItems] = each;
|
|
107
|
+
const create = getOrder({ order, name });
|
|
108
|
+
// Assuming there is one department in the item
|
|
109
|
+
const department = itemActions.getDepartmentModifiers(newItems[0])[0];
|
|
110
|
+
const departmentName = getDepartmentName(newItems[0]);
|
|
111
|
+
const maxItems = modifierActions.getDepartmentMaxItems(department);
|
|
112
|
+
|
|
113
|
+
if (
|
|
114
|
+
department &&
|
|
115
|
+
maxItems &&
|
|
116
|
+
itemActions.getItemsTotalPieces(newItems) > maxItems
|
|
117
|
+
) {
|
|
118
|
+
newItems.forEach(newItem => {
|
|
119
|
+
for (let j = 0; j < newItem.quantity; j += 1) {
|
|
120
|
+
const item = {
|
|
121
|
+
...newItem,
|
|
122
|
+
quantity: 1,
|
|
123
|
+
_id: helpers.getObjectID(),
|
|
124
|
+
};
|
|
125
|
+
const totalPieces = itemActions.getItemTotalPieces(item);
|
|
126
|
+
const index = splitOrders.findIndex(
|
|
127
|
+
newOrder =>
|
|
128
|
+
newOrder.items &&
|
|
129
|
+
itemActions.getItemsTotalPieces(newOrder.items) + totalPieces <=
|
|
130
|
+
maxItems &&
|
|
131
|
+
departmentName === getDepartmentName(newOrder.items[0])
|
|
132
|
+
);
|
|
133
|
+
if (index > -1) splitOrders[index].items.push(item);
|
|
134
|
+
else splitOrders.push(create([item], splitOrders.length + 1));
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
} else splitOrders.push(create(newItems, splitOrders.length + 1));
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
splitOrders = joinItemQuantity(splitOrders);
|
|
141
|
+
|
|
142
|
+
return splitOrders.map(each => {
|
|
143
|
+
const { subTotal } = actions.calculate(each);
|
|
144
|
+
const newOrder = {
|
|
145
|
+
...each,
|
|
146
|
+
modifiers: getSplitModifiers(order.modifiers, order.subTotal, subTotal),
|
|
147
|
+
};
|
|
148
|
+
return actions.calculate(newOrder);
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
module.exports = ({ actions, modifierActions }) =>
|
|
2
|
+
function toggleModifier({ order, modifier }) {
|
|
3
|
+
if (!order || !modifier) return order;
|
|
4
|
+
|
|
5
|
+
if (modifierActions.hasModifier({ entity: order, modifier })) {
|
|
6
|
+
return actions.removeModifier({ order, modifier });
|
|
7
|
+
}
|
|
8
|
+
return actions.addModifier({ order, modifier });
|
|
9
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
module.exports = ({ _ }) =>
|
|
2
|
+
function updateItem({ order, itemIndex, item }) {
|
|
3
|
+
const updatedOrder = _.cloneDeep(order);
|
|
4
|
+
if (!order || !order.items || order.items.length < itemIndex)
|
|
5
|
+
return updatedOrder;
|
|
6
|
+
updatedOrder.items[itemIndex] = item;
|
|
7
|
+
return updatedOrder;
|
|
8
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module.exports = ({ actions, settings, _ }) => {
|
|
2
|
+
const orderSettings = _.get(settings, 'order');
|
|
3
|
+
return function updateItemQuantity({
|
|
4
|
+
order,
|
|
5
|
+
quantity,
|
|
6
|
+
itemIndex,
|
|
7
|
+
reset,
|
|
8
|
+
cache,
|
|
9
|
+
}) {
|
|
10
|
+
const item = actions.getSelectedItem({ order, itemIndex });
|
|
11
|
+
const isBefore = orderSettings.useKeypadOnItemAdd === 'before';
|
|
12
|
+
|
|
13
|
+
if ((!isBefore && item) || (item && item.isPending)) {
|
|
14
|
+
const updatedQuantity = reset
|
|
15
|
+
? quantity
|
|
16
|
+
: parseInt(`${item.quantity}${quantity}`, 10);
|
|
17
|
+
return actions.addItem({
|
|
18
|
+
order,
|
|
19
|
+
item,
|
|
20
|
+
itemIndex,
|
|
21
|
+
cache,
|
|
22
|
+
overridenQuantity: updatedQuantity,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (isBefore) {
|
|
26
|
+
return actions.addItem({
|
|
27
|
+
order,
|
|
28
|
+
item: { isPending: true },
|
|
29
|
+
cache,
|
|
30
|
+
overridenQuantity: quantity,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return order;
|
|
34
|
+
};
|
|
35
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@darkpos/pricing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "Pricing calculator",
|
|
5
5
|
"author": "Dark POS",
|
|
6
6
|
"license": "ISC",
|
|
@@ -11,27 +11,29 @@
|
|
|
11
11
|
},
|
|
12
12
|
"main": "index.js",
|
|
13
13
|
"scripts": {
|
|
14
|
-
"test": "jest --runInBand --detectOpenHandles --logHeapUsage --verbose --forceExit ./__TEST__"
|
|
14
|
+
"test": "jest --runInBand --detectOpenHandles --logHeapUsage --verbose --forceExit ./__TEST__",
|
|
15
|
+
"lint": "eslint --quiet --fix lib/"
|
|
15
16
|
},
|
|
16
17
|
"publishConfig": {
|
|
17
18
|
"access": "public"
|
|
18
19
|
},
|
|
19
20
|
"dependencies": {
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
21
|
+
"@darkpos/utils": "1.0.8",
|
|
22
|
+
"lodash": "^4.17.21",
|
|
23
|
+
"moment-timezone": "^0.5.34"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
|
-
"eslint": "^
|
|
26
|
-
"eslint-config-airbnb": "^
|
|
27
|
-
"eslint-config-airbnb-base": "^
|
|
28
|
-
"eslint-config-prettier": "^
|
|
29
|
-
"eslint-plugin-
|
|
30
|
-
"eslint-plugin-
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
26
|
+
"eslint": "^8.2.0",
|
|
27
|
+
"eslint-config-airbnb": "^19.0.4",
|
|
28
|
+
"eslint-config-airbnb-base": "^15.0.0",
|
|
29
|
+
"eslint-config-prettier": "^8.5.0",
|
|
30
|
+
"eslint-plugin-import": "^2.26.0",
|
|
31
|
+
"eslint-plugin-jest": "^26.5.3",
|
|
32
|
+
"eslint-plugin-prettier": "^4.0.0",
|
|
33
|
+
"jest": "^28.1.1",
|
|
34
|
+
"prettier": "^2.7.0",
|
|
35
|
+
"supertest": "^6.2.3",
|
|
34
36
|
"supervisor": "^0.12.0"
|
|
35
37
|
},
|
|
36
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "1c4565d3c097c833093794654d8adc18e37767b9"
|
|
37
39
|
}
|