@tmscloud/tbt-knex 0.0.2 → 0.0.4

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.
@@ -0,0 +1,49 @@
1
+ import { ITripTrack, ITripTrackCreate, ITrackPoint, ITrackStatistics, IConsolidatedTripHistory, IConsolidatedTripFilters } from "../../interfaces/trip-track/trip-track.interfaces";
2
+ import { IDataPaginator } from "../../d.types";
3
+ export declare class TripTrackDAO {
4
+ private _knex?;
5
+ private get knex();
6
+ /**
7
+ * Create consolidated trip track
8
+ */
9
+ create(data: ITripTrackCreate): Promise<ITripTrack>;
10
+ /**
11
+ * Get track by trip ID
12
+ */
13
+ getByTripId(tripId: number): Promise<ITripTrack | null>;
14
+ /**
15
+ * Get track by UUID
16
+ */
17
+ getByUuid(uuid: string): Promise<ITripTrack | null>;
18
+ /**
19
+ * Check if a trip already has a consolidated track
20
+ */
21
+ existsForTrip(tripId: number): Promise<boolean>;
22
+ /**
23
+ * Delete track by trip ID
24
+ */
25
+ deleteByTripId(tripId: number): Promise<boolean>;
26
+ /**
27
+ * Consolidate track from granular driver_tracking points.
28
+ * Returns null if zero points provided (no trip_track record created).
29
+ */
30
+ consolidate(tripId: number, points: ITrackPoint[]): Promise<ITripTrack | null>;
31
+ /**
32
+ * Compute statistics from track points (single-pass)
33
+ */
34
+ computeStatistics(points: ITrackPoint[]): ITrackStatistics;
35
+ /**
36
+ * Calculate distance between two coordinates using Haversine formula.
37
+ * Returns distance in kilometers.
38
+ */
39
+ private calculateDistance;
40
+ private toRad;
41
+ /**
42
+ * Get consolidated trip history with filters and pagination
43
+ */
44
+ getConsolidatedHistory(filters: IConsolidatedTripFilters, page: number, limit: number): Promise<IDataPaginator<IConsolidatedTripHistory>>;
45
+ /**
46
+ * Parse JSONB fields from database result
47
+ */
48
+ private parseJson;
49
+ }
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.TripTrackDAO = void 0;
16
+ const KnexConnection_1 = __importDefault(require("../../KnexConnection"));
17
+ class TripTrackDAO {
18
+ get knex() {
19
+ if (!this._knex) {
20
+ this._knex = KnexConnection_1.default.getConnection();
21
+ }
22
+ return this._knex;
23
+ }
24
+ /**
25
+ * Create consolidated trip track
26
+ */
27
+ create(data) {
28
+ return __awaiter(this, void 0, void 0, function* () {
29
+ const [created] = yield this.knex("trip_track")
30
+ .insert({
31
+ trip_id: data.trip_id,
32
+ track_data: JSON.stringify(data.track_data),
33
+ max_speed: data.max_speed,
34
+ max_altitude: data.max_altitude,
35
+ total_distance: data.total_distance,
36
+ total_points: data.total_points,
37
+ start_coords: data.start_coords
38
+ ? JSON.stringify(data.start_coords)
39
+ : null,
40
+ end_coords: data.end_coords ? JSON.stringify(data.end_coords) : null,
41
+ duration_seconds: data.duration_seconds,
42
+ })
43
+ .returning("*");
44
+ return this.parseJson(created);
45
+ });
46
+ }
47
+ /**
48
+ * Get track by trip ID
49
+ */
50
+ getByTripId(tripId) {
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ const result = yield this.knex("trip_track")
53
+ .where("trip_id", tripId)
54
+ .first();
55
+ if (!result)
56
+ return null;
57
+ return this.parseJson(result);
58
+ });
59
+ }
60
+ /**
61
+ * Get track by UUID
62
+ */
63
+ getByUuid(uuid) {
64
+ return __awaiter(this, void 0, void 0, function* () {
65
+ const result = yield this.knex("trip_track").where("uuid", uuid).first();
66
+ if (!result)
67
+ return null;
68
+ return this.parseJson(result);
69
+ });
70
+ }
71
+ /**
72
+ * Check if a trip already has a consolidated track
73
+ */
74
+ existsForTrip(tripId) {
75
+ return __awaiter(this, void 0, void 0, function* () {
76
+ const result = yield this.knex("trip_track")
77
+ .where("trip_id", tripId)
78
+ .count("id as count")
79
+ .first();
80
+ return Number((result === null || result === void 0 ? void 0 : result.count) || 0) > 0;
81
+ });
82
+ }
83
+ /**
84
+ * Delete track by trip ID
85
+ */
86
+ deleteByTripId(tripId) {
87
+ return __awaiter(this, void 0, void 0, function* () {
88
+ const deleted = yield this.knex("trip_track")
89
+ .where("trip_id", tripId)
90
+ .delete();
91
+ return deleted > 0;
92
+ });
93
+ }
94
+ /**
95
+ * Consolidate track from granular driver_tracking points.
96
+ * Returns null if zero points provided (no trip_track record created).
97
+ */
98
+ consolidate(tripId, points) {
99
+ return __awaiter(this, void 0, void 0, function* () {
100
+ if (points.length === 0) {
101
+ return null;
102
+ }
103
+ const stats = this.computeStatistics(points);
104
+ return this.create(Object.assign({ trip_id: tripId, track_data: points }, stats));
105
+ });
106
+ }
107
+ /**
108
+ * Compute statistics from track points (single-pass)
109
+ */
110
+ computeStatistics(points) {
111
+ if (points.length === 0) {
112
+ return {
113
+ max_speed: null,
114
+ max_altitude: null,
115
+ total_distance: null,
116
+ total_points: 0,
117
+ start_coords: null,
118
+ end_coords: null,
119
+ duration_seconds: null,
120
+ };
121
+ }
122
+ let maxSpeed = null;
123
+ let maxAltitude = null;
124
+ let totalDistance = 0;
125
+ for (let i = 0; i < points.length; i++) {
126
+ const point = points[i];
127
+ if (point.speed !== null) {
128
+ if (maxSpeed === null || point.speed > maxSpeed) {
129
+ maxSpeed = point.speed;
130
+ }
131
+ }
132
+ if (point.altitude !== null) {
133
+ if (maxAltitude === null || point.altitude > maxAltitude) {
134
+ maxAltitude = point.altitude;
135
+ }
136
+ }
137
+ if (i > 0) {
138
+ const prevPoint = points[i - 1];
139
+ totalDistance += this.calculateDistance(prevPoint.lat, prevPoint.lng, point.lat, point.lng);
140
+ }
141
+ }
142
+ const startCoords = { lat: points[0].lat, lng: points[0].lng };
143
+ const endCoords = {
144
+ lat: points[points.length - 1].lat,
145
+ lng: points[points.length - 1].lng,
146
+ };
147
+ // Duration from first to last track point
148
+ let durationSeconds = null;
149
+ const firstTime = new Date(points[0].recorded_at).getTime();
150
+ const lastTime = new Date(points[points.length - 1].recorded_at).getTime();
151
+ if (!isNaN(firstTime) && !isNaN(lastTime)) {
152
+ durationSeconds = Math.round((lastTime - firstTime) / 1000);
153
+ }
154
+ return {
155
+ max_speed: maxSpeed,
156
+ max_altitude: maxAltitude,
157
+ total_distance: Math.round(totalDistance * 100) / 100,
158
+ total_points: points.length,
159
+ start_coords: startCoords,
160
+ end_coords: endCoords,
161
+ duration_seconds: durationSeconds,
162
+ };
163
+ }
164
+ /**
165
+ * Calculate distance between two coordinates using Haversine formula.
166
+ * Returns distance in kilometers.
167
+ */
168
+ calculateDistance(lat1, lon1, lat2, lon2) {
169
+ const R = 6371; // Earth's radius in kilometers
170
+ const dLat = this.toRad(lat2 - lat1);
171
+ const dLon = this.toRad(lon2 - lon1);
172
+ const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
173
+ Math.cos(this.toRad(lat1)) *
174
+ Math.cos(this.toRad(lat2)) *
175
+ Math.sin(dLon / 2) *
176
+ Math.sin(dLon / 2);
177
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
178
+ return R * c;
179
+ }
180
+ toRad(deg) {
181
+ return deg * (Math.PI / 180);
182
+ }
183
+ /**
184
+ * Get consolidated trip history with filters and pagination
185
+ */
186
+ getConsolidatedHistory(filters, page, limit) {
187
+ return __awaiter(this, void 0, void 0, function* () {
188
+ const offset = (page - 1) * limit;
189
+ const query = this.knex("trip_track as tt")
190
+ .join("trips as t", "tt.trip_id", "t.id")
191
+ .join("users as u", "t.user_id", "u.id")
192
+ .leftJoin("route_assignments as ra", "t.assignment_id", "ra.id")
193
+ .leftJoin("routes as r", "ra.route_id", "r.id")
194
+ .where("t.tracking_status", "consolidated")
195
+ .select("t.uuid as trip_uuid", this.knex.raw(`jsonb_build_object('uuid', u.uuid, 'email', u.email, 'username', u.username, 'first_name', u.first_name, 'last_name', u.last_name) as "user"`), "ra.uuid as assignment_uuid", "r.uuid as route_uuid", "r.name as route_name", "t.actual_start as started_at", "t.actual_end as ended_at", "tt.total_points", "tt.total_distance", "tt.duration_seconds", "tt.max_speed");
196
+ if (filters.user_id) {
197
+ query.where("t.user_id", filters.user_id);
198
+ }
199
+ if (filters.from_date) {
200
+ query.where("t.actual_start", ">=", filters.from_date);
201
+ }
202
+ if (filters.to_date) {
203
+ query.where("t.actual_start", "<=", filters.to_date + " 23:59:59");
204
+ }
205
+ if (filters.trip_uuid) {
206
+ query.whereRaw("t.uuid::text ilike ?", [`%${filters.trip_uuid}%`]);
207
+ }
208
+ const countResult = yield query
209
+ .clone()
210
+ .clearSelect()
211
+ .clearOrder()
212
+ .count("tt.id as count")
213
+ .first();
214
+ const totalCount = Number((countResult === null || countResult === void 0 ? void 0 : countResult.count) || 0);
215
+ const totalPages = Math.ceil(totalCount / limit);
216
+ const data = yield query
217
+ .clone()
218
+ .orderBy("t.actual_start", "desc")
219
+ .limit(limit)
220
+ .offset(offset);
221
+ // Parse numeric fields
222
+ const parsed = data.map((row) => (Object.assign(Object.assign({}, row), { user: typeof row.user === "string" ? JSON.parse(row.user) : row.user, total_points: Number(row.total_points), total_distance: row.total_distance !== null ? Number(row.total_distance) : null, duration_seconds: row.duration_seconds !== null ? Number(row.duration_seconds) : null, max_speed: row.max_speed !== null ? Number(row.max_speed) : null })));
223
+ return {
224
+ success: true,
225
+ data: parsed,
226
+ page,
227
+ limit,
228
+ count: parsed.length,
229
+ totalCount,
230
+ totalPages,
231
+ };
232
+ });
233
+ }
234
+ /**
235
+ * Parse JSONB fields from database result
236
+ */
237
+ parseJson(row) {
238
+ return Object.assign(Object.assign({}, row), { track_data: typeof row.track_data === "string"
239
+ ? JSON.parse(row.track_data)
240
+ : row.track_data, start_coords: row.start_coords
241
+ ? typeof row.start_coords === "string"
242
+ ? JSON.parse(row.start_coords)
243
+ : row.start_coords
244
+ : null, end_coords: row.end_coords
245
+ ? typeof row.end_coords === "string"
246
+ ? JSON.parse(row.end_coords)
247
+ : row.end_coords
248
+ : null, max_speed: row.max_speed !== null ? Number(row.max_speed) : null, max_altitude: row.max_altitude !== null ? Number(row.max_altitude) : null, total_distance: row.total_distance !== null ? Number(row.total_distance) : null });
249
+ }
250
+ }
251
+ exports.TripTrackDAO = TripTrackDAO;
252
+ //# sourceMappingURL=trip-track.dao.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trip-track.dao.js","sourceRoot":"","sources":["../../../src/dao/trip-track/trip-track.dao.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,21 +1,21 @@
1
1
  export { DriverTrackingDAO } from "./dao/driver-tracking/driver-tracking.dao";
2
2
  export { EventDAO } from "./dao/event/event.dao";
3
- export { GPSLocationDAO } from "./dao/gps-location/gps-location.dao";
4
3
  export { RoleDAO } from "./dao/role/role.dao";
5
4
  export { RouteDAO } from "./dao/route/route.dao";
6
5
  export { RouteAssignmentDAO } from "./dao/route-assignment/route-assignment.dao";
7
6
  export { SundaysPackageVersionDAO } from "./dao/sundays-package-version/sundays-package-version.dao";
8
7
  export { TripDAO } from "./dao/trip/trip.dao";
8
+ export { TripTrackDAO } from "./dao/trip-track/trip-track.dao";
9
9
  export { UserDAO } from "./dao/user/user.dao";
10
10
  export { IDataPaginator } from "./d.types";
11
- export { IDriverTracking, IDriverTrackingCreate, IDriverTrackingBatchCreate, ITrackingPoint, ITrackingMetadata, IActiveDriver, ITrackingSession, ITrackingFilters, } from "./interfaces/driver-tracking/driver-tracking.interfaces";
11
+ export { IDriverTracking, IDriverTrackingBatchCreate, ITrackingPointInput, ITrackingMetadata, IActiveDriver, ITrackingSession, ITrackingFilters, } from "./interfaces/driver-tracking/driver-tracking.interfaces";
12
12
  export { IEvent, IEventCreate, IEventUpdate, } from "./interfaces/event/event.interfaces";
13
- export { IGPSLocation, IGPSLocationWithDistance, ITripLocationSummary, } from "./interfaces/gps-location/gps-location.interfaces";
14
13
  export { IRole } from "./interfaces/role/role.interfaces";
15
14
  export { IRoute, IRouteInstruction } from "./interfaces/route/route.interfaces";
16
15
  export { IRouteAssignment } from "./interfaces/route-assignment/route-assignment.interfaces";
17
16
  export { ISundaysPackageVersion } from "./interfaces/sundays-package-version/sundays-package-version.interfaces";
18
17
  export { ITrip, ITripStop, ITripWithStops, } from "./interfaces/trip/trip.interfaces";
18
+ export { ITripTrack, ITripTrackCreate, ITrackPoint, ITrackStatistics, TrackingStatus, IConsolidatedTripHistory, IConsolidatedTripFilters, } from "./interfaces/trip-track/trip-track.interfaces";
19
19
  export { IUser, IUserSafe, IRefreshToken, } from "./interfaces/user/user.interfaces";
20
20
  import KnexManager from "./KnexConnection";
21
21
  export { KnexManager };
package/dist/index.js CHANGED
@@ -3,14 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.KnexManager = exports.UserDAO = exports.TripDAO = exports.SundaysPackageVersionDAO = exports.RouteAssignmentDAO = exports.RouteDAO = exports.RoleDAO = exports.GPSLocationDAO = exports.EventDAO = exports.DriverTrackingDAO = void 0;
6
+ exports.KnexManager = exports.UserDAO = exports.TripTrackDAO = exports.TripDAO = exports.SundaysPackageVersionDAO = exports.RouteAssignmentDAO = exports.RouteDAO = exports.RoleDAO = exports.EventDAO = exports.DriverTrackingDAO = void 0;
7
7
  // DAOs
8
8
  var driver_tracking_dao_1 = require("./dao/driver-tracking/driver-tracking.dao");
9
9
  Object.defineProperty(exports, "DriverTrackingDAO", { enumerable: true, get: function () { return driver_tracking_dao_1.DriverTrackingDAO; } });
10
10
  var event_dao_1 = require("./dao/event/event.dao");
11
11
  Object.defineProperty(exports, "EventDAO", { enumerable: true, get: function () { return event_dao_1.EventDAO; } });
12
- var gps_location_dao_1 = require("./dao/gps-location/gps-location.dao");
13
- Object.defineProperty(exports, "GPSLocationDAO", { enumerable: true, get: function () { return gps_location_dao_1.GPSLocationDAO; } });
14
12
  var role_dao_1 = require("./dao/role/role.dao");
15
13
  Object.defineProperty(exports, "RoleDAO", { enumerable: true, get: function () { return role_dao_1.RoleDAO; } });
16
14
  var route_dao_1 = require("./dao/route/route.dao");
@@ -21,6 +19,8 @@ var sundays_package_version_dao_1 = require("./dao/sundays-package-version/sunda
21
19
  Object.defineProperty(exports, "SundaysPackageVersionDAO", { enumerable: true, get: function () { return sundays_package_version_dao_1.SundaysPackageVersionDAO; } });
22
20
  var trip_dao_1 = require("./dao/trip/trip.dao");
23
21
  Object.defineProperty(exports, "TripDAO", { enumerable: true, get: function () { return trip_dao_1.TripDAO; } });
22
+ var trip_track_dao_1 = require("./dao/trip-track/trip-track.dao");
23
+ Object.defineProperty(exports, "TripTrackDAO", { enumerable: true, get: function () { return trip_track_dao_1.TripTrackDAO; } });
24
24
  var user_dao_1 = require("./dao/user/user.dao");
25
25
  Object.defineProperty(exports, "UserDAO", { enumerable: true, get: function () { return user_dao_1.UserDAO; } });
26
26
  const KnexConnection_1 = __importDefault(require("./KnexConnection"));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO;AACP,iFAA8E;AAArE,wHAAA,iBAAiB,OAAA;AAC1B,mDAAiD;AAAxC,qGAAA,QAAQ,OAAA;AACjB,wEAAqE;AAA5D,kHAAA,cAAc,OAAA;AACvB,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAChB,mDAAiD;AAAxC,qGAAA,QAAQ,OAAA;AACjB,oFAAiF;AAAxE,0HAAA,kBAAkB,OAAA;AAC3B,yGAAqG;AAA5F,uIAAA,wBAAwB,OAAA;AACjC,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAChB,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAuChB,sEAA2C;AAClC,sBADF,wBAAW,CACE"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO;AACP,iFAA8E;AAArE,wHAAA,iBAAiB,OAAA;AAC1B,mDAAiD;AAAxC,qGAAA,QAAQ,OAAA;AACjB,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAChB,mDAAiD;AAAxC,qGAAA,QAAQ,OAAA;AACjB,oFAAiF;AAAxE,0HAAA,kBAAkB,OAAA;AAC3B,yGAAqG;AAA5F,uIAAA,wBAAwB,OAAA;AACjC,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAChB,kEAA+D;AAAtD,8GAAA,YAAY,OAAA;AACrB,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AA0ChB,sEAA2C;AAClC,sBADF,wBAAW,CACE"}
@@ -1,10 +1,8 @@
1
- import { IUserSafe } from "../user/user.interfaces";
2
- import { IRouteAssignment } from "../route-assignment/route-assignment.interfaces";
3
- import { IRoute } from "../route/route.interfaces";
4
1
  export interface IDriverTracking {
5
2
  id?: number;
6
3
  uuid?: string;
7
4
  user_id: number;
5
+ trip_id: number;
8
6
  assignment_id?: number | null;
9
7
  route_id?: number | null;
10
8
  session_id: string;
@@ -19,9 +17,7 @@ export interface IDriverTracking {
19
17
  metadata?: ITrackingMetadata | null;
20
18
  created_at?: Date | string;
21
19
  updated_at?: Date | string;
22
- user?: IUserSafe;
23
- assignment?: IRouteAssignment;
24
- route?: IRoute;
20
+ user?: any;
25
21
  }
26
22
  export interface ITrackingMetadata {
27
23
  battery_level?: number;
@@ -31,72 +27,55 @@ export interface ITrackingMetadata {
31
27
  device_model?: string;
32
28
  os_version?: string;
33
29
  }
34
- export interface IDriverTrackingCreate {
30
+ export interface IDriverTrackingBatchCreate {
35
31
  user_id: number;
32
+ trip_id: number;
36
33
  assignment_id?: number | null;
37
34
  route_id?: number | null;
38
35
  session_id: string;
39
- latitude: number;
40
- longitude: number;
41
- accuracy?: number | null;
42
- altitude?: number | null;
43
- speed?: number | null;
44
- heading?: number | null;
45
- recorded_at: Date | string;
46
- is_navigating?: boolean;
47
- metadata?: ITrackingMetadata | null;
48
- }
49
- export interface IDriverTrackingBatchCreate {
50
- session_id: string;
51
- assignment_id?: number | null;
52
- route_id?: number | null;
53
- points: ITrackingPoint[];
36
+ points: ITrackingPointInput[];
54
37
  }
55
- export interface ITrackingPoint {
38
+ export interface ITrackingPointInput {
56
39
  latitude: number;
57
40
  longitude: number;
58
41
  accuracy?: number | null;
59
42
  altitude?: number | null;
60
43
  speed?: number | null;
61
44
  heading?: number | null;
62
- recorded_at: Date | string;
45
+ recorded_at: string;
63
46
  metadata?: ITrackingMetadata | null;
64
47
  }
65
48
  export interface IActiveDriver {
66
- user_id: number;
67
- user?: IUserSafe;
49
+ user: any;
68
50
  session_id: string;
69
- assignment_id?: number | null;
70
- assignment?: IRouteAssignment;
51
+ trip_uuid: string;
52
+ assignment_uuid?: string | null;
53
+ route_uuid?: string | null;
71
54
  current_location: {
72
55
  latitude: number;
73
56
  longitude: number;
74
- heading?: number | null;
75
- speed?: number | null;
76
- recorded_at: Date | string;
57
+ heading: number | null;
58
+ speed: number | null;
59
+ recorded_at: string;
77
60
  };
78
- is_navigating: boolean;
79
61
  }
80
62
  export interface ITrackingSession {
81
63
  session_id: string;
82
- user_id: number;
83
- user?: IUserSafe;
84
- assignment_id?: number | null;
85
- assignment?: IRouteAssignment;
86
- route_id?: number | null;
87
- route?: IRoute;
88
- started_at: Date | string;
89
- ended_at?: Date | string;
64
+ user: any;
65
+ trip_uuid: string;
66
+ assignment_uuid?: string | null;
67
+ route_uuid?: string | null;
68
+ started_at: string;
69
+ ended_at?: string;
90
70
  total_points: number;
91
- total_distance_km?: number;
92
- duration_seconds?: number;
93
71
  }
94
72
  export interface ITrackingFilters {
95
73
  user_id?: number;
74
+ trip_id?: number;
96
75
  assignment_id?: number;
97
76
  route_id?: number;
98
77
  session_id?: string;
99
- from_date?: Date | string;
100
- to_date?: Date | string;
78
+ from_date?: string;
79
+ to_date?: string;
101
80
  is_navigating?: boolean;
102
81
  }
@@ -1,6 +1,7 @@
1
1
  import { IRoute } from "../route/route.interfaces";
2
2
  import { IUser } from "../user/user.interfaces";
3
3
  import { IRouteAssignment } from "../route-assignment/route-assignment.interfaces";
4
+ import { TrackingStatus } from "../trip-track/trip-track.interfaces";
4
5
  export interface ITrip {
5
6
  id?: number;
6
7
  uuid?: string;
@@ -12,6 +13,7 @@ export interface ITrip {
12
13
  actual_start?: Date | string;
13
14
  actual_end?: Date | string;
14
15
  status: "pending" | "in_progress" | "completed" | "cancelled";
16
+ tracking_status?: TrackingStatus;
15
17
  manifest_data?: any;
16
18
  distance_traveled?: number;
17
19
  duration_minutes?: number;
@@ -0,0 +1,82 @@
1
+ export interface ITrackPoint {
2
+ lat: number;
3
+ lng: number;
4
+ altitude: number | null;
5
+ speed: number | null;
6
+ heading: number | null;
7
+ accuracy: number | null;
8
+ recorded_at: string;
9
+ }
10
+ export interface ITrackStatistics {
11
+ max_speed: number | null;
12
+ max_altitude: number | null;
13
+ total_distance: number | null;
14
+ total_points: number;
15
+ start_coords: {
16
+ lat: number;
17
+ lng: number;
18
+ } | null;
19
+ end_coords: {
20
+ lat: number;
21
+ lng: number;
22
+ } | null;
23
+ duration_seconds: number | null;
24
+ }
25
+ export interface ITripTrack {
26
+ id?: number;
27
+ uuid?: string;
28
+ trip_id: number;
29
+ track_data: ITrackPoint[];
30
+ max_speed: number | null;
31
+ max_altitude: number | null;
32
+ total_distance: number | null;
33
+ total_points: number;
34
+ start_coords: {
35
+ lat: number;
36
+ lng: number;
37
+ } | null;
38
+ end_coords: {
39
+ lat: number;
40
+ lng: number;
41
+ } | null;
42
+ duration_seconds: number | null;
43
+ created_at?: string;
44
+ updated_at?: string;
45
+ }
46
+ export interface ITripTrackCreate {
47
+ trip_id: number;
48
+ track_data: ITrackPoint[];
49
+ max_speed: number | null;
50
+ max_altitude: number | null;
51
+ total_distance: number | null;
52
+ total_points: number;
53
+ start_coords: {
54
+ lat: number;
55
+ lng: number;
56
+ } | null;
57
+ end_coords: {
58
+ lat: number;
59
+ lng: number;
60
+ } | null;
61
+ duration_seconds: number | null;
62
+ }
63
+ export type TrackingStatus = "none" | "tracking" | "syncing" | "consolidated";
64
+ export interface IConsolidatedTripHistory {
65
+ trip_uuid: string;
66
+ user: any;
67
+ assignment_uuid: string | null;
68
+ route_uuid: string | null;
69
+ route_name: string | null;
70
+ started_at: string | null;
71
+ ended_at: string | null;
72
+ total_points: number;
73
+ total_distance: number | null;
74
+ duration_seconds: number | null;
75
+ max_speed: number | null;
76
+ }
77
+ export interface IConsolidatedTripFilters {
78
+ user_id?: number;
79
+ from_date?: string;
80
+ to_date?: string;
81
+ trip_uuid?: string;
82
+ }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=gps-location.interfaces.js.map
3
+ //# sourceMappingURL=trip-track.interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trip-track.interfaces.js","sourceRoot":"","sources":["../../../src/interfaces/trip-track/trip-track.interfaces.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tmscloud/tbt-knex",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "TBT Database Access Layer",
5
5
  "main": "dist/index.js",
6
6
  "publishConfig": {