@tmscloud/tbt-knex 0.0.4 → 0.0.6

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.
Files changed (47) hide show
  1. package/dist/dao/driver-tracking/driver-tracking.dao.d.ts +8 -0
  2. package/dist/dao/driver-tracking/driver-tracking.dao.js +25 -1
  3. package/dist/dao/driver-tracking/driver-tracking.dao.js.map +1 -1
  4. package/dist/dao/duty/duty.dao.d.ts +86 -0
  5. package/dist/dao/duty/duty.dao.js +416 -0
  6. package/dist/dao/duty/duty.dao.js.map +1 -0
  7. package/dist/dao/duty-item-progress/duty-item-progress.dao.d.ts +59 -0
  8. package/dist/dao/duty-item-progress/duty-item-progress.dao.js +229 -0
  9. package/dist/dao/duty-item-progress/duty-item-progress.dao.js.map +1 -0
  10. package/dist/dao/duty-template/duty-template.dao.d.ts +66 -0
  11. package/dist/dao/duty-template/duty-template.dao.js +369 -0
  12. package/dist/dao/duty-template/duty-template.dao.js.map +1 -0
  13. package/dist/dao/duty-track/duty-track.dao.d.ts +52 -0
  14. package/dist/dao/duty-track/duty-track.dao.js +259 -0
  15. package/dist/dao/duty-track/duty-track.dao.js.map +1 -0
  16. package/dist/dao/event/event.dao.js +9 -3
  17. package/dist/dao/event/event.dao.js.map +1 -1
  18. package/dist/dao/route/route.dao.d.ts +4 -0
  19. package/dist/dao/route/route.dao.js +18 -0
  20. package/dist/dao/route/route.dao.js.map +1 -1
  21. package/dist/dao/system-setting/system-setting.dao.d.ts +14 -0
  22. package/dist/dao/system-setting/system-setting.dao.js +99 -0
  23. package/dist/dao/system-setting/system-setting.dao.js.map +1 -0
  24. package/dist/dao/trip-track/trip-track.dao.d.ts +7 -0
  25. package/dist/dao/trip-track/trip-track.dao.js +63 -4
  26. package/dist/dao/trip-track/trip-track.dao.js.map +1 -1
  27. package/dist/index.d.ts +10 -0
  28. package/dist/index.js +11 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/interfaces/driver-tracking/driver-tracking.interfaces.d.ts +5 -2
  31. package/dist/interfaces/duty/duty.interfaces.d.ts +48 -0
  32. package/dist/interfaces/duty/duty.interfaces.js +3 -0
  33. package/dist/interfaces/duty/duty.interfaces.js.map +1 -0
  34. package/dist/interfaces/duty-item-progress/duty-item-progress.interfaces.d.ts +30 -0
  35. package/dist/interfaces/duty-item-progress/duty-item-progress.interfaces.js +3 -0
  36. package/dist/interfaces/duty-item-progress/duty-item-progress.interfaces.js.map +1 -0
  37. package/dist/interfaces/duty-template/duty-template.interfaces.d.ts +75 -0
  38. package/dist/interfaces/duty-template/duty-template.interfaces.js +3 -0
  39. package/dist/interfaces/duty-template/duty-template.interfaces.js.map +1 -0
  40. package/dist/interfaces/duty-track/duty-track.interfaces.d.ts +39 -0
  41. package/dist/interfaces/duty-track/duty-track.interfaces.js +3 -0
  42. package/dist/interfaces/duty-track/duty-track.interfaces.js.map +1 -0
  43. package/dist/interfaces/route/route.interfaces.d.ts +1 -0
  44. package/dist/interfaces/system-setting/system-setting.interfaces.d.ts +27 -0
  45. package/dist/interfaces/system-setting/system-setting.interfaces.js +3 -0
  46. package/dist/interfaces/system-setting/system-setting.interfaces.js.map +1 -0
  47. package/package.json +1 -1
@@ -0,0 +1,369 @@
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.DutyTemplateDAO = void 0;
16
+ const KnexConnection_1 = __importDefault(require("../../KnexConnection"));
17
+ class DutyTemplateDAO {
18
+ get knex() {
19
+ if (!this._knex) {
20
+ this._knex = KnexConnection_1.default.getConnection();
21
+ }
22
+ return this._knex;
23
+ }
24
+ /**
25
+ * Parse JSON fields from database results
26
+ */
27
+ parseTemplateJson(template) {
28
+ if (template.event && typeof template.event === "string") {
29
+ template.event = JSON.parse(template.event);
30
+ }
31
+ if (template.creator && typeof template.creator === "string") {
32
+ template.creator = JSON.parse(template.creator);
33
+ }
34
+ return template;
35
+ }
36
+ /**
37
+ * Parse JSON fields for items (route join)
38
+ */
39
+ parseItemJson(item) {
40
+ var _a, _b;
41
+ if (item.route && typeof item.route === "string") {
42
+ item.route = JSON.parse(item.route);
43
+ }
44
+ if (((_a = item.route) === null || _a === void 0 ? void 0 : _a.geojson) && typeof item.route.geojson === "string") {
45
+ item.route.geojson = JSON.parse(item.route.geojson);
46
+ }
47
+ if (((_b = item.route) === null || _b === void 0 ? void 0 : _b.custom_instructions) &&
48
+ typeof item.route.custom_instructions === "string") {
49
+ item.route.custom_instructions = JSON.parse(item.route.custom_instructions);
50
+ }
51
+ return item;
52
+ }
53
+ /**
54
+ * Base query with event and creator joins
55
+ */
56
+ baseQuery() {
57
+ return this.knex("duty_templates as dt")
58
+ .leftJoin("events as e", "dt.event_id", "e.id")
59
+ .leftJoin("users as u", "dt.created_by", "u.id")
60
+ .select("dt.*", this.knex.raw("to_jsonb(e.*) as event"), this.knex.raw(`CASE WHEN u.id IS NOT NULL THEN jsonb_build_object(
61
+ 'id', u.id,
62
+ 'uuid', u.uuid,
63
+ 'email', u.email,
64
+ 'username', u.username,
65
+ 'first_name', u.first_name,
66
+ 'last_name', u.last_name,
67
+ 'role_id', u.role_id,
68
+ 'is_active', u.is_active
69
+ ) ELSE NULL END as creator`));
70
+ }
71
+ /**
72
+ * Get all duty templates with pagination
73
+ */
74
+ getAll() {
75
+ return __awaiter(this, arguments, void 0, function* (page = 1, limit = 10) {
76
+ const offset = (page - 1) * limit;
77
+ const rawData = yield this.baseQuery()
78
+ .where("dt.is_active", true)
79
+ .limit(limit)
80
+ .offset(offset)
81
+ .orderBy("dt.created_at", "desc");
82
+ const data = rawData.map((t) => this.parseTemplateJson(t));
83
+ const totalCountResult = yield this.knex("duty_templates")
84
+ .where("is_active", true)
85
+ .count("* as count")
86
+ .first();
87
+ const totalCount = Number((totalCountResult === null || totalCountResult === void 0 ? void 0 : totalCountResult.count) || 0);
88
+ const count = data.length;
89
+ const totalPages = Math.ceil(totalCount / limit);
90
+ return { success: true, data, page, limit, count, totalCount, totalPages };
91
+ });
92
+ }
93
+ /**
94
+ * Get all duty templates by event ID
95
+ */
96
+ getAllByEventId(eventId_1) {
97
+ return __awaiter(this, arguments, void 0, function* (eventId, page = 1, limit = 10) {
98
+ const offset = (page - 1) * limit;
99
+ const rawData = yield this.baseQuery()
100
+ .where("dt.event_id", eventId)
101
+ .where("dt.is_active", true)
102
+ .limit(limit)
103
+ .offset(offset)
104
+ .orderBy("dt.created_at", "desc");
105
+ const data = rawData.map((t) => this.parseTemplateJson(t));
106
+ const totalCountResult = yield this.knex("duty_templates")
107
+ .where("event_id", eventId)
108
+ .where("is_active", true)
109
+ .count("* as count")
110
+ .first();
111
+ const totalCount = Number((totalCountResult === null || totalCountResult === void 0 ? void 0 : totalCountResult.count) || 0);
112
+ const count = data.length;
113
+ const totalPages = Math.ceil(totalCount / limit);
114
+ return { success: true, data, page, limit, count, totalCount, totalPages };
115
+ });
116
+ }
117
+ /**
118
+ * Get all duty templates by event UUID
119
+ */
120
+ getAllByEventUuid(eventUuid_1) {
121
+ return __awaiter(this, arguments, void 0, function* (eventUuid, page = 1, limit = 10) {
122
+ const offset = (page - 1) * limit;
123
+ const rawData = yield this.baseQuery()
124
+ .where("e.uuid", eventUuid)
125
+ .where("dt.is_active", true)
126
+ .limit(limit)
127
+ .offset(offset)
128
+ .orderBy("dt.created_at", "desc");
129
+ const data = rawData.map((t) => this.parseTemplateJson(t));
130
+ const totalCountResult = yield this.knex("duty_templates as dt")
131
+ .leftJoin("events as e", "dt.event_id", "e.id")
132
+ .where("e.uuid", eventUuid)
133
+ .where("dt.is_active", true)
134
+ .count("* as count")
135
+ .first();
136
+ const totalCount = Number((totalCountResult === null || totalCountResult === void 0 ? void 0 : totalCountResult.count) || 0);
137
+ const count = data.length;
138
+ const totalPages = Math.ceil(totalCount / limit);
139
+ return { success: true, data, page, limit, count, totalCount, totalPages };
140
+ });
141
+ }
142
+ /**
143
+ * Get duty template by ID
144
+ */
145
+ getById(id) {
146
+ return __awaiter(this, void 0, void 0, function* () {
147
+ const result = yield this.baseQuery()
148
+ .where("dt.id", id)
149
+ .where("dt.is_active", true)
150
+ .first();
151
+ return result ? this.parseTemplateJson(result) : null;
152
+ });
153
+ }
154
+ /**
155
+ * Get duty template by UUID
156
+ */
157
+ getByUuid(uuid) {
158
+ return __awaiter(this, void 0, void 0, function* () {
159
+ const result = yield this.baseQuery()
160
+ .where("dt.uuid", uuid)
161
+ .where("dt.is_active", true)
162
+ .first();
163
+ return result ? this.parseTemplateJson(result) : null;
164
+ });
165
+ }
166
+ /**
167
+ * Get duty template by UUID with full details (segments + items)
168
+ */
169
+ getByUuidWithDetails(uuid) {
170
+ return __awaiter(this, void 0, void 0, function* () {
171
+ const template = yield this.getByUuid(uuid);
172
+ if (!template || !template.id)
173
+ return null;
174
+ const segments = yield this.getSegmentsByTemplateId(template.id);
175
+ return Object.assign(Object.assign({}, template), { segments });
176
+ });
177
+ }
178
+ /**
179
+ * Get segments for a template, each with their items (single batch query for items)
180
+ */
181
+ getSegmentsByTemplateId(templateId) {
182
+ return __awaiter(this, void 0, void 0, function* () {
183
+ const segments = yield this.knex("duty_template_segments")
184
+ .select("*")
185
+ .where("duty_template_id", templateId)
186
+ .orderBy("segment_order", "asc");
187
+ if (segments.length === 0)
188
+ return [];
189
+ // Fetch ALL items for all segments in one query
190
+ const segmentIds = segments.map((s) => s.id);
191
+ const rawItems = yield this.knex("duty_template_items as dti")
192
+ .leftJoin("routes as r", "dti.route_id", "r.id")
193
+ .select("dti.*", this.knex.raw("to_jsonb(r.*) as route"))
194
+ .whereIn("dti.segment_id", segmentIds)
195
+ .orderBy("dti.item_order", "asc");
196
+ // Group items by segment_id
197
+ const itemsBySegment = new Map();
198
+ for (const item of rawItems) {
199
+ const parsed = this.parseItemJson(item);
200
+ const segId = item.segment_id;
201
+ if (!itemsBySegment.has(segId)) {
202
+ itemsBySegment.set(segId, []);
203
+ }
204
+ itemsBySegment.get(segId).push(parsed);
205
+ }
206
+ for (const segment of segments) {
207
+ segment.items = itemsBySegment.get(segment.id) || [];
208
+ }
209
+ return segments;
210
+ });
211
+ }
212
+ /**
213
+ * Get items for a segment, with route join for route-type items
214
+ */
215
+ getItemsBySegmentId(segmentId) {
216
+ return __awaiter(this, void 0, void 0, function* () {
217
+ const rawItems = yield this.knex("duty_template_items as dti")
218
+ .leftJoin("routes as r", "dti.route_id", "r.id")
219
+ .select("dti.*", this.knex.raw("to_jsonb(r.*) as route"))
220
+ .where("dti.segment_id", segmentId)
221
+ .orderBy("dti.item_order", "asc");
222
+ return rawItems.map((item) => this.parseItemJson(item));
223
+ });
224
+ }
225
+ /**
226
+ * Create a duty template with optional segments and items (transactional)
227
+ */
228
+ create(data) {
229
+ return __awaiter(this, void 0, void 0, function* () {
230
+ const inserted = yield this.knex.transaction((trx) => __awaiter(this, void 0, void 0, function* () {
231
+ var _a;
232
+ // Create the template
233
+ const [template] = yield trx("duty_templates")
234
+ .insert({
235
+ event_id: data.event_id,
236
+ name: data.name,
237
+ description: data.description || null,
238
+ created_by: data.created_by || null,
239
+ })
240
+ .returning("*");
241
+ // Create segments and items if provided
242
+ if (data.segments && data.segments.length > 0) {
243
+ for (const segmentData of data.segments) {
244
+ const [segment] = yield trx("duty_template_segments")
245
+ .insert({
246
+ duty_template_id: template.id,
247
+ name: (_a = segmentData.name) !== null && _a !== void 0 ? _a : null,
248
+ segment_order: segmentData.segment_order,
249
+ start_time: segmentData.start_time,
250
+ end_time: segmentData.end_time,
251
+ })
252
+ .returning("*");
253
+ if (segmentData.items && segmentData.items.length > 0) {
254
+ const itemRows = segmentData.items.map((item) => {
255
+ var _a, _b, _c, _d, _e;
256
+ return ({
257
+ segment_id: segment.id,
258
+ item_order: item.item_order,
259
+ item_type: item.item_type,
260
+ route_id: (_a = item.route_id) !== null && _a !== void 0 ? _a : null,
261
+ is_repeating: (_b = item.is_repeating) !== null && _b !== void 0 ? _b : false,
262
+ stop_name: (_c = item.stop_name) !== null && _c !== void 0 ? _c : null,
263
+ stop_latitude: (_d = item.stop_latitude) !== null && _d !== void 0 ? _d : null,
264
+ stop_longitude: (_e = item.stop_longitude) !== null && _e !== void 0 ? _e : null,
265
+ });
266
+ });
267
+ yield trx("duty_template_items").insert(itemRows);
268
+ }
269
+ }
270
+ }
271
+ return template;
272
+ }));
273
+ // Re-fetch with joins after transaction is committed
274
+ return this.getById(inserted.id);
275
+ });
276
+ }
277
+ /**
278
+ * Update a duty template by ID (metadata only, not segments)
279
+ */
280
+ update(id, data) {
281
+ return __awaiter(this, void 0, void 0, function* () {
282
+ const updateData = {};
283
+ if (data.name !== undefined)
284
+ updateData.name = data.name;
285
+ if (data.description !== undefined)
286
+ updateData.description = data.description;
287
+ if (data.is_active !== undefined)
288
+ updateData.is_active = data.is_active;
289
+ updateData.updated_at = new Date();
290
+ const [result] = yield this.knex("duty_templates")
291
+ .where("id", id)
292
+ .update(updateData)
293
+ .returning("*");
294
+ return result ? this.getById(result.id) : null;
295
+ });
296
+ }
297
+ /**
298
+ * Replace all segments and items for a template (transactional)
299
+ */
300
+ replaceSegments(templateId, segments) {
301
+ return __awaiter(this, void 0, void 0, function* () {
302
+ yield this.knex.transaction((trx) => __awaiter(this, void 0, void 0, function* () {
303
+ var _a;
304
+ // Get existing segment IDs
305
+ const existingSegments = yield trx("duty_template_segments")
306
+ .select("id")
307
+ .where("duty_template_id", templateId);
308
+ const segmentIds = existingSegments.map((s) => s.id);
309
+ // Delete existing items and segments (cascade would handle items, but be explicit)
310
+ if (segmentIds.length > 0) {
311
+ yield trx("duty_template_items")
312
+ .whereIn("segment_id", segmentIds)
313
+ .delete();
314
+ }
315
+ yield trx("duty_template_segments")
316
+ .where("duty_template_id", templateId)
317
+ .delete();
318
+ // Create new segments and items
319
+ for (const segmentData of segments) {
320
+ const [segment] = yield trx("duty_template_segments")
321
+ .insert({
322
+ duty_template_id: templateId,
323
+ name: (_a = segmentData.name) !== null && _a !== void 0 ? _a : null,
324
+ segment_order: segmentData.segment_order,
325
+ start_time: segmentData.start_time,
326
+ end_time: segmentData.end_time,
327
+ })
328
+ .returning("*");
329
+ if (segmentData.items && segmentData.items.length > 0) {
330
+ const itemRows = segmentData.items.map((item) => {
331
+ var _a, _b, _c, _d, _e;
332
+ return ({
333
+ segment_id: segment.id,
334
+ item_order: item.item_order,
335
+ item_type: item.item_type,
336
+ route_id: (_a = item.route_id) !== null && _a !== void 0 ? _a : null,
337
+ is_repeating: (_b = item.is_repeating) !== null && _b !== void 0 ? _b : false,
338
+ stop_name: (_c = item.stop_name) !== null && _c !== void 0 ? _c : null,
339
+ stop_latitude: (_d = item.stop_latitude) !== null && _d !== void 0 ? _d : null,
340
+ stop_longitude: (_e = item.stop_longitude) !== null && _e !== void 0 ? _e : null,
341
+ });
342
+ });
343
+ yield trx("duty_template_items").insert(itemRows);
344
+ }
345
+ }
346
+ // Update template timestamp
347
+ yield trx("duty_templates")
348
+ .where("id", templateId)
349
+ .update({ updated_at: new Date() });
350
+ }));
351
+ // Re-fetch after transaction is committed
352
+ return this.getSegmentsByTemplateId(templateId);
353
+ });
354
+ }
355
+ /**
356
+ * Delete a duty template by ID (soft delete)
357
+ */
358
+ delete(id) {
359
+ return __awaiter(this, void 0, void 0, function* () {
360
+ const result = yield this.knex("duty_templates").where("id", id).update({
361
+ is_active: false,
362
+ updated_at: new Date(),
363
+ });
364
+ return result > 0;
365
+ });
366
+ }
367
+ }
368
+ exports.DutyTemplateDAO = DutyTemplateDAO;
369
+ //# sourceMappingURL=duty-template.dao.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duty-template.dao.js","sourceRoot":"","sources":["../../../src/dao/duty-template/duty-template.dao.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { IDutyTrack, IDutyTrackCreate } from "../../interfaces/duty-track/duty-track.interfaces";
2
+ import { ITrackPoint, ITrackStatistics } from "../../interfaces/trip-track/trip-track.interfaces";
3
+ export declare class DutyTrackDAO {
4
+ private _knex?;
5
+ private get knex();
6
+ /**
7
+ * Create consolidated duty track
8
+ */
9
+ create(data: IDutyTrackCreate): Promise<IDutyTrack>;
10
+ /**
11
+ * Get track by duty ID
12
+ */
13
+ getByDutyId(dutyId: number): Promise<IDutyTrack | null>;
14
+ /**
15
+ * Get track by UUID
16
+ */
17
+ getByUuid(uuid: string): Promise<IDutyTrack | null>;
18
+ /**
19
+ * Check if a duty already has a consolidated track
20
+ */
21
+ existsForDuty(dutyId: number): Promise<boolean>;
22
+ /**
23
+ * Delete track by duty ID
24
+ */
25
+ deleteByDutyId(dutyId: number): Promise<boolean>;
26
+ /**
27
+ * Consolidate track from granular driver_tracking points.
28
+ * Returns null if zero points provided.
29
+ */
30
+ consolidate(dutyId: number, points: ITrackPoint[]): Promise<IDutyTrack | 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
+ * Consolidate a duty's tracking data in a single transaction:
43
+ * reads raw points, computes stats, inserts track record,
44
+ * deletes granular points, and marks the duty as consolidated.
45
+ * Returns null if there were no tracking points.
46
+ */
47
+ consolidateFromTracking(dutyId: number): Promise<IDutyTrack | null>;
48
+ /**
49
+ * Parse JSONB fields from database result
50
+ */
51
+ private parseJson;
52
+ }