@routebot/constants 0.3.67 → 0.3.70
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.
|
@@ -17,6 +17,9 @@ const COMPANY_FEATURES = {
|
|
|
17
17
|
WEBSITE_NOTIFICATIONS: "websiteNotifications",
|
|
18
18
|
BILLING: "billing",
|
|
19
19
|
UETDS: "uetds",
|
|
20
|
+
// Opt-in "bundled" student routes (students from multiple schools in one route). Default OFF
|
|
21
|
+
// for every plan; enabled per-company via company.features override. See: bundled-route module.
|
|
22
|
+
BUNDLED_STUDENT_ROUTES: "bundledStudentRoutes",
|
|
20
23
|
};
|
|
21
24
|
|
|
22
25
|
module.exports = {
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Personal mobile login codes (SMS-less countries, e.g. US).
|
|
2
|
+
// Alphabet is intentionally restricted for easy typing across keyboards/locales:
|
|
3
|
+
// - No I, L, O, 0, 1 (ambiguous when read aloud / transcribed)
|
|
4
|
+
// - No Q, W (missing or awkward on many non-English layouts)
|
|
5
|
+
const LOGIN_CODE_ALPHABET = "ABCDEFGHJKMNPRSTUVYZ23456789";
|
|
6
|
+
const LOGIN_CODE_LENGTH = 8;
|
|
7
|
+
|
|
8
|
+
const LOGIN_CODE_PATTERN = new RegExp(`^[${LOGIN_CODE_ALPHABET}]{${LOGIN_CODE_LENGTH}}$`);
|
|
9
|
+
|
|
10
|
+
const normalizeLoginCode = (input) => {
|
|
11
|
+
const upper = (input || "").toString().toUpperCase();
|
|
12
|
+
let out = "";
|
|
13
|
+
for (const ch of upper) {
|
|
14
|
+
if (LOGIN_CODE_ALPHABET.includes(ch)) {
|
|
15
|
+
out += ch;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const isValidLoginCode = (code) => {
|
|
22
|
+
if (code == null || code === "") return true;
|
|
23
|
+
return LOGIN_CODE_PATTERN.test(code);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
module.exports = {
|
|
27
|
+
LOGIN_CODE_ALPHABET,
|
|
28
|
+
LOGIN_CODE_LENGTH,
|
|
29
|
+
LOGIN_CODE_PATTERN,
|
|
30
|
+
normalizeLoginCode,
|
|
31
|
+
isValidLoginCode,
|
|
32
|
+
};
|
|
@@ -166,6 +166,7 @@ const PLAN_FEATURES = {
|
|
|
166
166
|
[COMPANY_FEATURES.WEBSITE_NOTIFICATIONS]: false,
|
|
167
167
|
[COMPANY_FEATURES.BILLING]: false,
|
|
168
168
|
[COMPANY_FEATURES.UETDS]: false,
|
|
169
|
+
[COMPANY_FEATURES.BUNDLED_STUDENT_ROUTES]: false,
|
|
169
170
|
},
|
|
170
171
|
|
|
171
172
|
[PLANS.FREE]: {
|
|
@@ -179,6 +180,7 @@ const PLAN_FEATURES = {
|
|
|
179
180
|
[COMPANY_FEATURES.WEBSITE_NOTIFICATIONS]: false,
|
|
180
181
|
[COMPANY_FEATURES.BILLING]: false,
|
|
181
182
|
[COMPANY_FEATURES.UETDS]: false,
|
|
183
|
+
[COMPANY_FEATURES.BUNDLED_STUDENT_ROUTES]: false,
|
|
182
184
|
},
|
|
183
185
|
[PLANS.STARTER]: {
|
|
184
186
|
[COMPANY_FEATURES.ACCOUNTING]: false,
|
|
@@ -191,6 +193,7 @@ const PLAN_FEATURES = {
|
|
|
191
193
|
[COMPANY_FEATURES.WEBSITE_NOTIFICATIONS]: false,
|
|
192
194
|
[COMPANY_FEATURES.BILLING]: false,
|
|
193
195
|
[COMPANY_FEATURES.UETDS]: false,
|
|
196
|
+
[COMPANY_FEATURES.BUNDLED_STUDENT_ROUTES]: false,
|
|
194
197
|
},
|
|
195
198
|
[PLANS.PRO]: {
|
|
196
199
|
[COMPANY_FEATURES.ACCOUNTING]: false,
|
|
@@ -203,6 +206,7 @@ const PLAN_FEATURES = {
|
|
|
203
206
|
[COMPANY_FEATURES.WEBSITE_NOTIFICATIONS]: false,
|
|
204
207
|
[COMPANY_FEATURES.BILLING]: false,
|
|
205
208
|
[COMPANY_FEATURES.UETDS]: false,
|
|
209
|
+
[COMPANY_FEATURES.BUNDLED_STUDENT_ROUTES]: false,
|
|
206
210
|
},
|
|
207
211
|
[PLANS.BUSINESS]: {
|
|
208
212
|
[COMPANY_FEATURES.ACCOUNTING]: false,
|
|
@@ -215,6 +219,7 @@ const PLAN_FEATURES = {
|
|
|
215
219
|
[COMPANY_FEATURES.WEBSITE_NOTIFICATIONS]: false,
|
|
216
220
|
[COMPANY_FEATURES.BILLING]: false,
|
|
217
221
|
[COMPANY_FEATURES.UETDS]: false,
|
|
222
|
+
[COMPANY_FEATURES.BUNDLED_STUDENT_ROUTES]: false,
|
|
218
223
|
},
|
|
219
224
|
[PLANS.ENTERPRISE]: {
|
|
220
225
|
[COMPANY_FEATURES.ACCOUNTING]: false,
|
|
@@ -227,6 +232,7 @@ const PLAN_FEATURES = {
|
|
|
227
232
|
[COMPANY_FEATURES.WEBSITE_NOTIFICATIONS]: false,
|
|
228
233
|
[COMPANY_FEATURES.BILLING]: false,
|
|
229
234
|
[COMPANY_FEATURES.UETDS]: false,
|
|
235
|
+
[COMPANY_FEATURES.BUNDLED_STUDENT_ROUTES]: false,
|
|
230
236
|
},
|
|
231
237
|
[PLANS.UNLIMITED]: {
|
|
232
238
|
[COMPANY_FEATURES.ACCOUNTING]: false,
|
|
@@ -239,6 +245,7 @@ const PLAN_FEATURES = {
|
|
|
239
245
|
[COMPANY_FEATURES.WEBSITE_NOTIFICATIONS]: false,
|
|
240
246
|
[COMPANY_FEATURES.BILLING]: false,
|
|
241
247
|
[COMPANY_FEATURES.UETDS]: false,
|
|
248
|
+
[COMPANY_FEATURES.BUNDLED_STUDENT_ROUTES]: false,
|
|
242
249
|
},
|
|
243
250
|
};
|
|
244
251
|
|
|
@@ -10,6 +10,13 @@ const SERVICE_TYPES = {
|
|
|
10
10
|
// PersonelService (school = destination/venue, users = ordered POI stops, routeType =
|
|
11
11
|
// PICK_UP). Distinct serviceType keeps tours out of the other personel/transfer tabs.
|
|
12
12
|
TOUR: "TOUR", // happens 1 time, date required
|
|
13
|
+
// BUNDLED_STUDENT — a student service that carries students from MULTIPLE schools in one
|
|
14
|
+
// route (opt-in, feature-gated per company). Stored as a VehicleRoute (same collection);
|
|
15
|
+
// `school` stays a required nominal anchor, `schools[]` lists the served institutions, and
|
|
16
|
+
// each passenger's real drop/pick target comes from its own `student.school`. Distinct
|
|
17
|
+
// serviceType keeps these out of the standard student-services tab and out of the
|
|
18
|
+
// single-school arrival geofence. See: backend/modules/bundled-route/.
|
|
19
|
+
BUNDLED_STUDENT: "BUNDLED_STUDENT",
|
|
13
20
|
};
|
|
14
21
|
|
|
15
22
|
const ROUTE_TYPES = {
|
package/index.js
CHANGED