@routebot/constants 0.3.65 → 0.3.67
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/constants/constants.js
CHANGED
|
@@ -10,6 +10,11 @@ const USER_TYPES = {
|
|
|
10
10
|
SCHOOL_PARENT: "2",
|
|
11
11
|
PERSONEL: "10",
|
|
12
12
|
ADMIN: "1000",
|
|
13
|
+
// POI (Point of Interest) — NOT a real person/app user. A lightweight reusable "place"
|
|
14
|
+
// (hotel, park, venue) used as an ordered stop inside a Tour service. Has no phone/
|
|
15
|
+
// relations and is excluded from all normal user/personel/parent listings.
|
|
16
|
+
// See: backend/modules/tour-builder/.
|
|
17
|
+
POI: "POI",
|
|
13
18
|
};
|
|
14
19
|
|
|
15
20
|
const CLIENT_ROLES = {
|
|
@@ -6,6 +6,10 @@ const SERVICE_TYPES = {
|
|
|
6
6
|
TRANSFER_PERSONEL: "TRANSFER_PERSONEL", // happens 1 time, date required
|
|
7
7
|
TRANSFER_STUDENT: "TRANSFER_STUDENT", // happens 1 time, date required
|
|
8
8
|
TRANSFER_RANDOM: "TRANSFER_RANDOM", // happens 1 time, date required
|
|
9
|
+
// TOUR — one-time, place-to-place trip authored via the Tour Builder. Stored as a
|
|
10
|
+
// PersonelService (school = destination/venue, users = ordered POI stops, routeType =
|
|
11
|
+
// PICK_UP). Distinct serviceType keeps tours out of the other personel/transfer tabs.
|
|
12
|
+
TOUR: "TOUR", // happens 1 time, date required
|
|
9
13
|
};
|
|
10
14
|
|
|
11
15
|
const ROUTE_TYPES = {
|
|
@@ -36,10 +36,13 @@ const ARVENTO_ALARM_TYPES = {
|
|
|
36
36
|
};
|
|
37
37
|
|
|
38
38
|
const TELEMETRY_VEHICLE_STATUS = {
|
|
39
|
-
OFFLINE: "OFFLINE", // Son snapshot yok veya çok eski
|
|
40
|
-
IDLE: "IDLE", //
|
|
39
|
+
OFFLINE: "OFFLINE", // Son snapshot yok veya çok eski (cihaz veri göndermiyor — kontaktan bağımsız)
|
|
40
|
+
IDLE: "IDLE", // (eski) hareketsiz — artık görüntüde IDLING/PARKED'e ayrıştırılır
|
|
41
41
|
MOVING: "MOVING", // Hareket halinde
|
|
42
42
|
ALARMED: "ALARMED", // Son snapshot'ta alarm var
|
|
43
|
+
// Görüntü durumları (taze snapshot'ta kontaktan türetilir; kalıcı SAKLANMAZ):
|
|
44
|
+
IDLING: "IDLING", // Kontak açık, hareketsiz (rölantide)
|
|
45
|
+
PARKED: "PARKED", // Kontak kapalı, cihaz online
|
|
43
46
|
};
|
|
44
47
|
|
|
45
48
|
const TELEMETRY_THRESHOLDS = {
|
|
@@ -49,7 +52,7 @@ const TELEMETRY_THRESHOLDS = {
|
|
|
49
52
|
ARVENTO_POLL_PERIOD_SECONDS: 30, // backend cron - Arvento min period
|
|
50
53
|
ARVENTO_DAILY_QUOTA: 100000, // request/day/user
|
|
51
54
|
ARVENTO_PER_METHOD_COOLDOWN_SECONDS: 30,
|
|
52
|
-
SNAPSHOT_FRESHNESS_SECONDS:
|
|
55
|
+
SNAPSHOT_FRESHNESS_SECONDS: 3600, // bu sürenin üstünde olan snapshot "stale" - 1 saat
|
|
53
56
|
|
|
54
57
|
// --- Servissiz/izinsiz kullanım uyarısı (§20.1) ---
|
|
55
58
|
// Servis başlangıç/bitiş penceresine eklenen tampon (dk). Şoför servise giderken/dönerken
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Tour Builder — shared constants + pure helpers used across backend, frontend and
|
|
2
|
+
// (implicitly) mobile. Keeping the tour stop-ordering logic here is the SINGLE source of
|
|
3
|
+
// truth so the operator's arrangement (web), the persisted order (backend) and the driver's
|
|
4
|
+
// view (mobile) never diverge.
|
|
5
|
+
//
|
|
6
|
+
// Data model recap (see backend/modules/tour-builder/):
|
|
7
|
+
// A Tour is a standard PersonelService with:
|
|
8
|
+
// - serviceType = SERVICE_TYPES.TOUR
|
|
9
|
+
// - routeType = TOUR_ROUTE_TYPE (PICK_UP): collect guests at each stop, arrive at anchor
|
|
10
|
+
// - school = the anchor / final destination (a venue School record)
|
|
11
|
+
// - users = ordered POI stops (usertype: USER_TYPES.POI)
|
|
12
|
+
// - usersdetails = [{ user, transfertime }] carrying the optional per-stop pickup time
|
|
13
|
+
//
|
|
14
|
+
// Mobile (backend/modules/mobile/driver/driver.mobile.controller.js) sorts a personel
|
|
15
|
+
// service's passengers by `transfertime` ascending (timed first, untimed keep order).
|
|
16
|
+
// `orderTourStops` below replicates that EXACT rule so the web preview matches mobile.
|
|
17
|
+
|
|
18
|
+
// Tours are modeled as PICK_UP so that:
|
|
19
|
+
// 1) the anchor (venue) is the final navigation destination, and
|
|
20
|
+
// 2) per-stop pickup times are shown to the driver (mobile shows transfertime on PICK_UP only).
|
|
21
|
+
const TOUR_ROUTE_TYPE = "PICK_UP";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Validates an "HH:mm" (24h) time string. Empty/invalid → false.
|
|
25
|
+
* @param {string} value
|
|
26
|
+
* @returns {boolean}
|
|
27
|
+
*/
|
|
28
|
+
function isValidTourStopTime(value) {
|
|
29
|
+
if (typeof value !== "string") return false;
|
|
30
|
+
return /^([01]\d|2[0-3]):([0-5]\d)$/.test(value.trim());
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Orders tour stops the same way mobile does: stops WITH a valid transfertime come first
|
|
35
|
+
* (ascending by time), stops WITHOUT a time keep their original relative order and go last.
|
|
36
|
+
* The sort is STABLE (insertion index tie-breaker). Pure + side-effect free.
|
|
37
|
+
*
|
|
38
|
+
* @template T
|
|
39
|
+
* @param {T[]} stops - objects exposing a `transfertime` string
|
|
40
|
+
* @returns {T[]} a new, ordered array (input is not mutated)
|
|
41
|
+
*/
|
|
42
|
+
function orderTourStops(stops) {
|
|
43
|
+
if (!Array.isArray(stops)) return [];
|
|
44
|
+
|
|
45
|
+
return stops
|
|
46
|
+
.map((stop, index) => ({ stop, index }))
|
|
47
|
+
.sort((a, b) => {
|
|
48
|
+
const validA = isValidTourStopTime(a.stop && a.stop.transfertime);
|
|
49
|
+
const validB = isValidTourStopTime(b.stop && b.stop.transfertime);
|
|
50
|
+
|
|
51
|
+
if (validA && validB) {
|
|
52
|
+
const compared = a.stop.transfertime.localeCompare(b.stop.transfertime);
|
|
53
|
+
return compared !== 0 ? compared : a.index - b.index;
|
|
54
|
+
}
|
|
55
|
+
if (validA && !validB) return -1;
|
|
56
|
+
if (!validA && validB) return 1;
|
|
57
|
+
return a.index - b.index;
|
|
58
|
+
})
|
|
59
|
+
.map((entry) => entry.stop);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
module.exports = {
|
|
63
|
+
TOUR_ROUTE_TYPE,
|
|
64
|
+
isValidTourStopTime,
|
|
65
|
+
orderTourStops,
|
|
66
|
+
};
|
package/index.js
CHANGED
|
@@ -5,6 +5,7 @@ module.exports = {
|
|
|
5
5
|
...require("./constants/company.constants.js"),
|
|
6
6
|
...require("./constants/process.constants.js"),
|
|
7
7
|
...require("./constants/service.constants.js"),
|
|
8
|
+
...require("./constants/tour.constants.js"),
|
|
8
9
|
...require("./constants/sms.constants.js"),
|
|
9
10
|
...require("./constants/stock.constants.js"),
|
|
10
11
|
...require("./constants/maps.constants.js"),
|