@voyantjs/pricing 0.28.1 → 0.28.3
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-option-rules.d.ts","sourceRoot":"","sources":["../src/service-option-rules.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service-option-rules.d.ts","sourceRoot":"","sources":["../src/service-option-rules.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAiBjE,OAAO,KAAK,EACV,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,yBAAyB,EACzB,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,uBAAuB,EACvB,0BAA0B,EAC1B,8BAA8B,EAC9B,8BAA8B,EAC9B,yBAAyB,EAC1B,MAAM,qBAAqB,CAAA;AAG5B,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BhC;AAED,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;UAG9E;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,kBAAkB,EACtB,IAAI,EAAE,0BAA0B;;;;;;;;;;;;;;;;;;;;;;UAIjC;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,0BAA0B;;;;;;;;;;;;;;;;;;;;;;UAsBjC;AAED,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;UAM7E;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,4BAA4B;;;;;;;;;;;;;;;;;;;;;;GA0BpC;AAED,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;UAOlF;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,kBAAkB,EACtB,IAAI,EAAE,8BAA8B;;;;;;;;;;;;;;;;;UAerC;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,8BAA8B;;;;;;;;;;;;;;;;;UAQrC;AAED,wBAAsB,yBAAyB,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;UAMjF;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,4BAA4B;;;;;;;;;;;;;;;;;;;GAuBpC;AAED,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;UAOlF;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,kBAAkB,EACtB,IAAI,EAAE,8BAA8B;;;;;;;;;;;;;;UAIrC;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,8BAA8B;;;;;;;;;;;;;;UAQrC;AAED,wBAAsB,yBAAyB,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;UAMjF;AAED,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,uBAAuB;;;;;;;;;;;;;;;;GAoB/F;AAED,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;UAG7E;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,kBAAkB,EACtB,IAAI,EAAE,yBAAyB;;;;;;;;;;;UAIhC;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,yBAAyB;;;;;;;;;;;UAQhC;AAED,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;UAM5E"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
import { RequestValidationError } from "@voyantjs/hono";
|
|
1
2
|
import { and, asc, desc, eq, sql } from "drizzle-orm";
|
|
2
3
|
import { optionPriceRules, optionStartTimeRules, optionUnitPriceRules, optionUnitTiers, } from "./schema.js";
|
|
4
|
+
// A `per_booking` rule produces a single flat amount for the whole booking;
|
|
5
|
+
// per-unit prices implicitly assume a per-unit (or per-person) multiplier.
|
|
6
|
+
// The two are contradictory — see #482.
|
|
7
|
+
const PER_BOOKING_REJECTS_UNIT_PRICES_MESSAGE = "Rules with pricingMode = 'per_booking' cannot carry per-unit prices. " +
|
|
8
|
+
"Use pricingMode = 'per_person' or 'starting_from' for unit-priced rules, " +
|
|
9
|
+
"or remove the unit prices to keep this rule a flat per-booking amount.";
|
|
3
10
|
import { paginate } from "./service-shared.js";
|
|
4
11
|
export async function listOptionPriceRules(db, query) {
|
|
5
12
|
const conditions = [];
|
|
@@ -36,6 +43,19 @@ export async function createOptionPriceRule(db, data) {
|
|
|
36
43
|
return row ?? null;
|
|
37
44
|
}
|
|
38
45
|
export async function updateOptionPriceRule(db, id, data) {
|
|
46
|
+
if (data.pricingMode === "per_booking") {
|
|
47
|
+
const [countRow] = await db
|
|
48
|
+
.select({ count: sql `count(*)::int` })
|
|
49
|
+
.from(optionUnitPriceRules)
|
|
50
|
+
.where(eq(optionUnitPriceRules.optionPriceRuleId, id));
|
|
51
|
+
const unitPriceCount = countRow?.count ?? 0;
|
|
52
|
+
if (unitPriceCount > 0) {
|
|
53
|
+
throw new RequestValidationError(PER_BOOKING_REJECTS_UNIT_PRICES_MESSAGE, {
|
|
54
|
+
ruleId: id,
|
|
55
|
+
unitPriceCount,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
39
59
|
const [row] = await db
|
|
40
60
|
.update(optionPriceRules)
|
|
41
61
|
.set({ ...data, updatedAt: new Date() })
|
|
@@ -82,6 +102,16 @@ export async function getOptionUnitPriceRuleById(db, id) {
|
|
|
82
102
|
return row ?? null;
|
|
83
103
|
}
|
|
84
104
|
export async function createOptionUnitPriceRule(db, data) {
|
|
105
|
+
const [parent] = await db
|
|
106
|
+
.select({ pricingMode: optionPriceRules.pricingMode })
|
|
107
|
+
.from(optionPriceRules)
|
|
108
|
+
.where(eq(optionPriceRules.id, data.optionPriceRuleId))
|
|
109
|
+
.limit(1);
|
|
110
|
+
if (parent?.pricingMode === "per_booking") {
|
|
111
|
+
throw new RequestValidationError(PER_BOOKING_REJECTS_UNIT_PRICES_MESSAGE, {
|
|
112
|
+
ruleId: data.optionPriceRuleId,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
85
115
|
const [row] = await db.insert(optionUnitPriceRules).values(data).returning();
|
|
86
116
|
return row ?? null;
|
|
87
117
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyantjs/pricing",
|
|
3
|
-
"version": "0.28.
|
|
3
|
+
"version": "0.28.3",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -40,16 +40,16 @@
|
|
|
40
40
|
"hono": "^4.12.10",
|
|
41
41
|
"rrule": "^2.8.1",
|
|
42
42
|
"zod": "^4.3.6",
|
|
43
|
-
"@voyantjs/availability": "0.28.
|
|
44
|
-
"@voyantjs/core": "0.28.
|
|
45
|
-
"@voyantjs/db": "0.28.
|
|
46
|
-
"@voyantjs/hono": "0.28.
|
|
47
|
-
"@voyantjs/products": "0.28.
|
|
43
|
+
"@voyantjs/availability": "0.28.3",
|
|
44
|
+
"@voyantjs/core": "0.28.3",
|
|
45
|
+
"@voyantjs/db": "0.28.3",
|
|
46
|
+
"@voyantjs/hono": "0.28.3",
|
|
47
|
+
"@voyantjs/products": "0.28.3"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"typescript": "^6.0.2",
|
|
51
|
-
"@voyantjs/extras": "0.28.
|
|
52
|
-
"@voyantjs/facilities": "0.28.
|
|
51
|
+
"@voyantjs/extras": "0.28.3",
|
|
52
|
+
"@voyantjs/facilities": "0.28.3",
|
|
53
53
|
"@voyantjs/voyant-typescript-config": "0.1.0"
|
|
54
54
|
},
|
|
55
55
|
"files": [
|