picker-db 3.4.0

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 (43) hide show
  1. package/.editorconfig +8 -0
  2. package/.eslintignore +9 -0
  3. package/.eslintrc.json +35 -0
  4. package/.nvmrc +1 -0
  5. package/.vscode/settings.json +11 -0
  6. package/README.md +21 -0
  7. package/bitbucket-pipelines.yml +24 -0
  8. package/constants.js +420 -0
  9. package/index.js +5 -0
  10. package/lib/Logger/index.js +45 -0
  11. package/lib/Mongo/index.js +126 -0
  12. package/modules/picker/index.js +259 -0
  13. package/modules/picker/models/identityCounter.js +15 -0
  14. package/modules/picker/models/index.js +50 -0
  15. package/modules/picker/schemas/address.js +74 -0
  16. package/modules/picker/schemas/adminSetting.js +125 -0
  17. package/modules/picker/schemas/balanceTransaction.js +132 -0
  18. package/modules/picker/schemas/bill.js +70 -0
  19. package/modules/picker/schemas/bookingProduct.js +50 -0
  20. package/modules/picker/schemas/bookings.js +699 -0
  21. package/modules/picker/schemas/business.js +231 -0
  22. package/modules/picker/schemas/businessCategory.js +61 -0
  23. package/modules/picker/schemas/customer.js +28 -0
  24. package/modules/picker/schemas/driver.js +162 -0
  25. package/modules/picker/schemas/fareSettings.js +122 -0
  26. package/modules/picker/schemas/fraudBooking.js +21 -0
  27. package/modules/picker/schemas/identityCounter.js +10 -0
  28. package/modules/picker/schemas/kmRange.js +27 -0
  29. package/modules/picker/schemas/massDelivery.js +119 -0
  30. package/modules/picker/schemas/notification.js +76 -0
  31. package/modules/picker/schemas/paymentezCustomer.js +41 -0
  32. package/modules/picker/schemas/paymentezTransaction.js +67 -0
  33. package/modules/picker/schemas/preference.js +40 -0
  34. package/modules/picker/schemas/pricingDetails.js +90 -0
  35. package/modules/picker/schemas/referralUsage.js +33 -0
  36. package/modules/picker/schemas/region.js +75 -0
  37. package/modules/picker/schemas/review.js +42 -0
  38. package/modules/picker/schemas/session.js +25 -0
  39. package/modules/picker/schemas/superRegion.js +41 -0
  40. package/modules/picker/schemas/user.js +337 -0
  41. package/package.json +29 -0
  42. package/playground/testConnection.js +24 -0
  43. package/playground/testService.js +27 -0
@@ -0,0 +1,699 @@
1
+ const { VEHICLE_TYPES, PAYMENT_METHODS, BOOKING_TYPES, BOOKING_STATUS } = require("../../../constants");
2
+ const { DEVICE_TYPES } = require("../../../constants").USER;
3
+
4
+ const PricingDetailsSchema = require("./pricingDetails");
5
+ const ProductSchema = require("./bookingProduct");
6
+ const { getModel } = require("../models/identityCounter");
7
+
8
+ const ALLOWED_STATUSES = [
9
+ BOOKING_STATUS.PENDING.INDEX,
10
+ BOOKING_STATUS.ACCEPTED.INDEX,
11
+ BOOKING_STATUS.ARRIVED_AT_PICKUP.INDEX,
12
+ BOOKING_STATUS.WAY_TO_DELIVER.INDEX,
13
+ BOOKING_STATUS.ARRIVED_AT_DELIVERY.INDEX,
14
+ BOOKING_STATUS.COMPLETED.INDEX,
15
+ BOOKING_STATUS.CANCELLED_BY_ADMIN.INDEX,
16
+ BOOKING_STATUS.CANCELLED.INDEX,
17
+ BOOKING_STATUS.CANCELLED_BY_DRIVER.INDEX,
18
+ BOOKING_STATUS.REJECTED_BY_DRIVER.INDEX,
19
+ BOOKING_STATUS.CANCELLED_REQUEST.INDEX,
20
+ BOOKING_STATUS.NOT_FOUND.INDEX,
21
+ BOOKING_STATUS.NOT_DELIVERED.INDEX,
22
+ BOOKING_STATUS.ON_DECK.INDEX,
23
+ BOOKING_STATUS.READY_FOR_PICKUP.INDEX,
24
+ BOOKING_STATUS.CANCELLED_BY_BUSINESS.INDEX,
25
+ BOOKING_STATUS.REJECTED_BY_BUSINESS.INDEX,
26
+ BOOKING_STATUS.PAYMENT_FAILED.INDEX,
27
+ BOOKING_STATUS.CANCELLED_BY_DELIVERY_PROVIDER.INDEX,
28
+ BOOKING_STATUS.PROVIDER_NOT_FOUND.INDEX,
29
+ BOOKING_STATUS.RETURNING.INDEX,
30
+ BOOKING_STATUS.RETURNED.INDEX,
31
+ BOOKING_STATUS.RETURNED_TO_PICKUP.INDEX,
32
+ ];
33
+
34
+ const ALLOWED_STATUS_TEXTS = [
35
+ BOOKING_STATUS.PENDING.TEXT,
36
+ BOOKING_STATUS.ACCEPTED.TEXT,
37
+ BOOKING_STATUS.ARRIVED_AT_PICKUP.TEXT,
38
+ BOOKING_STATUS.WAY_TO_DELIVER.TEXT,
39
+ BOOKING_STATUS.ARRIVED_AT_DELIVERY.TEXT,
40
+ BOOKING_STATUS.COMPLETED.TEXT,
41
+ BOOKING_STATUS.CANCELLED_BY_ADMIN.TEXT,
42
+ BOOKING_STATUS.CANCELLED.TEXT,
43
+ BOOKING_STATUS.CANCELLED_BY_DRIVER.TEXT,
44
+ BOOKING_STATUS.REJECTED_BY_DRIVER.TEXT,
45
+ BOOKING_STATUS.CANCELLED_REQUEST.TEXT,
46
+ BOOKING_STATUS.NOT_FOUND.TEXT,
47
+ BOOKING_STATUS.NOT_DELIVERED.TEXT,
48
+ BOOKING_STATUS.ON_DECK.TEXT,
49
+ BOOKING_STATUS.READY_FOR_PICKUP.TEXT,
50
+ BOOKING_STATUS.CANCELLED_BY_BUSINESS.TEXT,
51
+ BOOKING_STATUS.REJECTED_BY_BUSINESS.TEXT,
52
+ BOOKING_STATUS.PAYMENT_FAILED.TEXT,
53
+ BOOKING_STATUS.CANCELLED_BY_DELIVERY_PROVIDER.TEXT,
54
+ BOOKING_STATUS.PROVIDER_NOT_FOUND.TEXT,
55
+ BOOKING_STATUS.RETURNING.TEXT,
56
+ BOOKING_STATUS.RETURNED.TEXT,
57
+ BOOKING_STATUS.RETURNED_TO_PICKUP.TEXT,
58
+ ];
59
+
60
+ /** @param {import("mongoose")} connection */
61
+ module.exports = (connection) => {
62
+ const IdentityCounterModel = getModel(connection);
63
+ // #region Internal Schemas
64
+ const orderLogs = new connection.base.Schema({
65
+ orderAmount: { type: Number },
66
+ status: {
67
+ type: Number,
68
+ required: true,
69
+ enum: [
70
+ BOOKING_STATUS.AMOUNT_REQUESTED.INDEX,
71
+ BOOKING_STATUS.AMOUNT_ACCEPTED.INDEX,
72
+ BOOKING_STATUS.AMOUNT_REJECTED.INDEX,
73
+ ],
74
+ },
75
+ statusText: {
76
+ type: String,
77
+ required: true,
78
+ enum: [
79
+ BOOKING_STATUS.AMOUNT_REQUESTED.TEXT,
80
+ BOOKING_STATUS.AMOUNT_ACCEPTED.TEXT,
81
+ BOOKING_STATUS.AMOUNT_REJECTED.TEXT,
82
+ ],
83
+ },
84
+ timeStamp: { type: Date, required: true },
85
+ paymentMethod: {
86
+ type: String,
87
+ required: true,
88
+ enum: [
89
+ PAYMENT_METHODS.CARD.TEXT,
90
+ PAYMENT_METHODS.CASH.TEXT,
91
+ ],
92
+ },
93
+ });
94
+
95
+ const bookingLogs = new connection.base.Schema({
96
+ timeStamp: {
97
+ type: Date,
98
+ required: true,
99
+ },
100
+ previousStatus: {
101
+ type: Number,
102
+ required: true,
103
+ enum: ALLOWED_STATUSES,
104
+ },
105
+ previousStatusText: {
106
+ type: String,
107
+ required: true,
108
+ enum: ALLOWED_STATUS_TEXTS,
109
+ },
110
+ newStatus: {
111
+ type: Number,
112
+ required: true,
113
+ enum: ALLOWED_STATUSES,
114
+ },
115
+ newStatusText: {
116
+ type: String,
117
+ required: true,
118
+ enum: ALLOWED_STATUS_TEXTS,
119
+ },
120
+ }, { _id: false });
121
+ // #endregion Internal Schemas
122
+
123
+ const BookingSchema = new connection.base.Schema({
124
+ bookingNumericId: {
125
+ type: Number,
126
+ index: true,
127
+ },
128
+ // #region Business Info
129
+ business: {
130
+ type: connection.base.Schema.ObjectId,
131
+ ref: "User",
132
+ },
133
+ businessName: {
134
+ type: String,
135
+ },
136
+ businessImage: {
137
+ thumbnail: { type: String, default: null },
138
+ original: { type: String, default: null },
139
+ },
140
+ businessMobile: {
141
+ type: String,
142
+ default: null,
143
+ },
144
+ businessTag: {
145
+ type: String,
146
+ default: null,
147
+ },
148
+ businessUniqueID: {
149
+ type: String,
150
+ },
151
+ // #endregion Business Info
152
+ // #region WS info
153
+ workspaceID: {
154
+ type: connection.base.Schema.ObjectId,
155
+ default: null,
156
+ index: true,
157
+ sparse: true,
158
+ },
159
+ workspaceName: {
160
+ type: String,
161
+ },
162
+ // #endregion
163
+ // #region Customer Info
164
+ customer: {
165
+ type: connection.base.Schema.ObjectId,
166
+ ref: "User",
167
+ required: true,
168
+ },
169
+ customerName: {
170
+ type: String,
171
+ index: true,
172
+ required: true,
173
+ },
174
+ customerMobile: {
175
+ type: String,
176
+ required: true,
177
+ trim: true,
178
+ index: true,
179
+ },
180
+ customerImage: {
181
+ thumbnail: { type: String, default: null },
182
+ original: { type: String, default: null },
183
+ },
184
+ customerEmail: {
185
+ type: String,
186
+ default: null,
187
+ },
188
+ completedCustomerBookings: {
189
+ type: Number,
190
+ },
191
+ oneSignalId: {
192
+ type: String,
193
+ },
194
+ realPhone: {
195
+ type: String,
196
+ },
197
+ realPosition: {
198
+ type: {
199
+ type: String,
200
+ default: "Point",
201
+ },
202
+ coordinates: [Number],
203
+ },
204
+ customerDeviceType: {
205
+ type: String,
206
+ enum: [
207
+ DEVICE_TYPES.IOS,
208
+ DEVICE_TYPES.ANDROID,
209
+ DEVICE_TYPES.WEB,
210
+ null,
211
+ ],
212
+ },
213
+ // #endregion Customer Info
214
+ // #region Driver Info
215
+ driver: {
216
+ type: connection.base.Schema.ObjectId,
217
+ ref: "User",
218
+ default: null,
219
+ },
220
+ driverName: {
221
+ type: String,
222
+ index: true,
223
+ sparse: true,
224
+ default: null,
225
+ },
226
+ driverMobile: {
227
+ type: String,
228
+ index: true,
229
+ sparse: true,
230
+ default: null,
231
+ },
232
+ driverImage: {
233
+ thumbnail: { type: String, default: null },
234
+ original: { type: String, default: null },
235
+ },
236
+ driverEmail: {
237
+ type: String,
238
+ default: null,
239
+ },
240
+ driverTag: {
241
+ type: String,
242
+ default: null,
243
+ },
244
+ driverLocationOnAccept: {
245
+ type: { type: String, default: "Point" },
246
+ coordinates: [Number],
247
+ },
248
+ customerSegment: {
249
+ type: String,
250
+ default: null,
251
+ },
252
+ driverAccountingType: { type: String },
253
+ // #endregion Driver Info
254
+ // #region Delivery location Info
255
+ deliveryCity: {
256
+ type: String,
257
+ default: null,
258
+ },
259
+ deliveryState: {
260
+ type: String,
261
+ default: null,
262
+ },
263
+ deliveryZipCode: {
264
+ type: String,
265
+ default: null,
266
+ },
267
+ deliveryAddress: {
268
+ type: String,
269
+ default: null,
270
+ },
271
+ deliveryCoordinates: {
272
+ type: { type: String, default: "Point" },
273
+ coordinates: [Number],
274
+ },
275
+ deliveryReferences: {
276
+ type: String,
277
+ },
278
+ // #endregion Delivery location Info
279
+ // #region Pickup location Info
280
+ pickupCity: {
281
+ type: String,
282
+ default: null,
283
+ },
284
+ pickupState: {
285
+ type: String,
286
+ default: null,
287
+ },
288
+ pickupZipCode: {
289
+ type: String,
290
+ default: null,
291
+ },
292
+ pickupAddress: {
293
+ type: String,
294
+ default: "",
295
+ },
296
+ pickupCoordinates: {
297
+ type: { type: String, default: "Point" },
298
+ coordinates: [Number],
299
+ },
300
+ pickupReferences: {
301
+ type: String,
302
+ },
303
+ // #endregion Pickup location Info
304
+ pickupDateTimeFrom: { type: Date },
305
+ pickupDateTimeTo: { type: Date },
306
+ bookingCompletionDateTime: { type: Date },
307
+ // #region Vehicle Info
308
+ vehicleNumber: { type: String },
309
+ vehicleModelName: { type: String },
310
+ vehicleColor: {
311
+ type: String,
312
+ default: null,
313
+ },
314
+ vehicleYear: { type: Number },
315
+ carType: {
316
+ type: Number,
317
+ enum: [
318
+ VEHICLE_TYPES.LITE.INDEX,
319
+ VEHICLE_TYPES.BIKE.INDEX,
320
+ ],
321
+ index: true,
322
+ },
323
+ carName: {
324
+ type: String,
325
+ enum: [
326
+ VEHICLE_TYPES.LITE.TEXT,
327
+ VEHICLE_TYPES.BIKE.TEXT,
328
+ ],
329
+ },
330
+ // #endregion Vehicle Info
331
+ // #region Payment Info
332
+ paymentMethod: {
333
+ type: String,
334
+ required: true,
335
+ enum: [
336
+ PAYMENT_METHODS.CARD.TEXT,
337
+ PAYMENT_METHODS.CASH.TEXT,
338
+ PAYMENT_METHODS.BILLING_CARD.TEXT,
339
+ PAYMENT_METHODS.BILLING_TRANSFER.TEXT,
340
+ ],
341
+ },
342
+ paymentMethodCode: {
343
+ type: Number,
344
+ required: false,
345
+ enum: [
346
+ PAYMENT_METHODS.CARD.INDEX,
347
+ PAYMENT_METHODS.CASH.INDEX,
348
+ PAYMENT_METHODS.BILLING_CARD.INDEX,
349
+ PAYMENT_METHODS.BILLING_TRANSFER.INDEX,
350
+ ],
351
+ },
352
+ transactionDetails: {
353
+ itemCharge: {
354
+ type: connection.base.Schema.ObjectId,
355
+ ref: "PaymentezTransaction",
356
+ default: null,
357
+ },
358
+ deliveryCharge: {
359
+ type: connection.base.Schema.ObjectId,
360
+ ref: "PaymentezTransaction",
361
+ default: null,
362
+ },
363
+ cancellationCharge: {
364
+ type: connection.base.Schema.ObjectId,
365
+ ref: "PaymentezTransaction",
366
+ default: null,
367
+ },
368
+ donationCharge: {
369
+ type: connection.base.Schema.ObjectId,
370
+ ref: "PaymentezTransaction",
371
+ default: null,
372
+ },
373
+ tipCharge: {
374
+ type: connection.base.Schema.ObjectId,
375
+ ref: "PaymentezTransaction",
376
+ default: null,
377
+ },
378
+ },
379
+ corporateID: { type: String, index: true },
380
+ corporateChargeStatus: {
381
+ type: String,
382
+ default: "PENDING",
383
+ },
384
+ refunds: [
385
+ {
386
+ amount: { type: Number, min: 0 },
387
+ user: { type: connection.base.Schema.ObjectId, ref: "User" },
388
+ date: { type: Date },
389
+ type: { type: String },
390
+ },
391
+ ],
392
+ // #endregion Payment Info
393
+ bookingType: {
394
+ type: Number,
395
+ enum: [
396
+ BOOKING_TYPES.PICKUP_AND_DELIVER.INDEX,
397
+ BOOKING_TYPES.BUY_AND_DELIVER.INDEX,
398
+ BOOKING_TYPES.MARKETPLACE.INDEX,
399
+ BOOKING_TYPES.SHOP_ORDER.INDEX,
400
+ BOOKING_TYPES.CORPORATE.INDEX,
401
+ BOOKING_TYPES.WHITE_LABEL.INDEX,
402
+ BOOKING_TYPES.MASS_DELIVERY.INDEX,
403
+ ],
404
+ index: true,
405
+ },
406
+ typeText: {
407
+ type: String,
408
+ enum: [
409
+ BOOKING_TYPES.PICKUP_AND_DELIVER.TEXT,
410
+ BOOKING_TYPES.BUY_AND_DELIVER.TEXT,
411
+ BOOKING_TYPES.MARKETPLACE.TEXT,
412
+ BOOKING_TYPES.SHOP_ORDER.TEXT,
413
+ BOOKING_TYPES.CORPORATE.TEXT,
414
+ BOOKING_TYPES.WHITE_LABEL.TEXT,
415
+ BOOKING_TYPES.MASS_DELIVERY.TEXT,
416
+ ],
417
+ },
418
+ bookingDate: {
419
+ type: Date,
420
+ default: Date.now,
421
+ },
422
+ bookingNotes: {
423
+ type: String,
424
+ default: null,
425
+ },
426
+ currentStatus: {
427
+ type: Number,
428
+ index: true,
429
+ default: BOOKING_STATUS.PENDING.INDEX,
430
+ },
431
+ statusText: {
432
+ type: String,
433
+ default: BOOKING_STATUS.PENDING.TEXT,
434
+ },
435
+ statusUpdates: { type: [bookingLogs] },
436
+ deliveryProvider: {
437
+ type: String,
438
+ },
439
+ trackingLink: {
440
+ type: String,
441
+ },
442
+ isLaterBooking: {
443
+ type: Boolean,
444
+ default: false,
445
+ },
446
+ isRated: {
447
+ type: Boolean,
448
+ default: false,
449
+ },
450
+ promoApplied: {
451
+ type: connection.base.Schema.ObjectId,
452
+ ref: "Promo",
453
+ },
454
+ smrToken: {
455
+ type: String,
456
+ index: true,
457
+ sparse: true,
458
+ unique: true,
459
+ },
460
+ isArrivingSoon: {
461
+ type: Boolean,
462
+ default: false,
463
+ },
464
+ isPossibleFraud: {
465
+ type: Boolean,
466
+ },
467
+ sendInvoice: {
468
+ type: Boolean,
469
+ default: true,
470
+ },
471
+ chatType: {
472
+ type: String,
473
+ default: "OLD",
474
+ },
475
+ massDeliveryID: {
476
+ type: connection.base.Schema.ObjectId,
477
+ ref: "MassDelivery",
478
+ index: true,
479
+ sparse: true,
480
+ default: null,
481
+ },
482
+ // #region Pricing Info
483
+ priceBreakUp: {
484
+ notificationCharge: { type: Number, default: 0 },
485
+ baseFare: { type: Number, default: 0 },
486
+ perKmCharge: { type: Number, default: 0 },
487
+ perMinCharge: { type: Number, default: 0 },
488
+ orderAmount: { type: Number, default: 0 },
489
+ driverPayment: { type: Number, default: 0 },
490
+ companyPayment: { type: Number, default: 0 },
491
+ businessPayment: { type: Number, default: 0 },
492
+ extraPayment: { type: Number, default: 0 },
493
+ receivedByDriver: { type: Number, default: 0 },
494
+ receivedByBusiness: { type: Number, default: 0 },
495
+ promoDiscount: { type: Number, default: 0 },
496
+ referralDiscount: { type: Number, default: 0 },
497
+ comission: { type: Number, default: 0 },
498
+ donation: { type: Number, default: 0 },
499
+ tip: { type: Number, default: 0 },
500
+ taxCharges: { type: Number, default: 0, min: 0 },
501
+ workBalance: { type: Number, default: 0 },
502
+ shopOrderRecharge: { type: Number, default: 0 },
503
+ driverExtraCommission: { type: Number, default: 0 },
504
+ companyPaymentBusiness: { type: Number, default: 0 },
505
+ companyPaymentDriver: { type: Number, default: 0 },
506
+ providerFee: { type: Number, min: 0 },
507
+ providerFeeNoMarkup: { type: Number, min: 0 },
508
+ },
509
+ pendingAmount: {
510
+ type: Number,
511
+ default: 0,
512
+ },
513
+ deliveryFee: {
514
+ type: Number,
515
+ default: 0,
516
+ },
517
+ orderAmount: {
518
+ type: Number,
519
+ default: 0,
520
+ },
521
+ ServiceAmount: {
522
+ type: Number,
523
+ default: 0,
524
+ },
525
+ totalPay: {
526
+ type: Number,
527
+ default: 0,
528
+ },
529
+ totalAmount: {
530
+ type: Number,
531
+ default: 0,
532
+ },
533
+ pricingDetails: PricingDetailsSchema(connection),
534
+ // #endregion Pricing Info
535
+ // #region Distance Info
536
+ distanceTravelled: {
537
+ type: Number,
538
+ default: 0,
539
+ },
540
+ distanceBreakUp: {
541
+ realDistance: {
542
+ type: Number,
543
+ default: 0,
544
+ },
545
+ billedDistance: {
546
+ type: Number,
547
+ default: 0,
548
+ },
549
+ baseDistance: {
550
+ type: Number,
551
+ default: 0,
552
+ },
553
+ extraDistance: {
554
+ type: Number,
555
+ default: 0,
556
+ },
557
+ },
558
+ regionID: {
559
+ type: connection.base.Schema.ObjectId,
560
+ ref: "Region",
561
+ default: null,
562
+ index: true,
563
+ sparse: true,
564
+ },
565
+ superRegionID: {
566
+ type: connection.base.Schema.ObjectId,
567
+ ref: "SuperRegion",
568
+ default: null,
569
+ index: true,
570
+ sparse: true,
571
+ },
572
+ // #endregion Distance Info
573
+ // #region Time info
574
+ isTimeStarted: {
575
+ type: Boolean,
576
+ default: false,
577
+ },
578
+ lastTimeCalculation: { type: Date },
579
+ totalTime: {
580
+ type: Number,
581
+ default: 0,
582
+ },
583
+ // #endregion Time info
584
+ // #region Cancellation Info
585
+ cancelReasonByDriver: { type: String },
586
+ cancelReasonByCustomer: { type: String },
587
+ cancelReasonByServiceProvider: { type: String },
588
+ cancellationDate: { type: Date },
589
+ maximumCancellationDate: {
590
+ default: new Date(),
591
+ type: Date,
592
+ },
593
+ // #endregion Cancellation Info
594
+ // #region Order Info
595
+ products: [ProductSchema(connection)],
596
+ productReferencesImages: [{
597
+ thumbnail: { type: String, default: null },
598
+ original: { type: String, default: null },
599
+ }],
600
+ orderUpdates: {
601
+ type: [orderLogs],
602
+ select: true,
603
+ },
604
+ moneyRequested: {
605
+ type: Boolean,
606
+ default: false,
607
+ },
608
+ moneyAccepted: {
609
+ type: Boolean,
610
+ default: false,
611
+ },
612
+ orderReceived: {
613
+ type: Boolean,
614
+ default: false,
615
+ },
616
+ requestedAmount: {
617
+ type: Number,
618
+ default: 0,
619
+ },
620
+ recentlyRequestedAmount: {
621
+ type: Number,
622
+ default: 0,
623
+ },
624
+ bidTotal: {
625
+ type: Number,
626
+ default: 0,
627
+ },
628
+ bidAccepted: {
629
+ type: Boolean,
630
+ default: false,
631
+ },
632
+ bidProcessing: {
633
+ type: Boolean,
634
+ default: false,
635
+ },
636
+ bidResponded: {
637
+ type: Boolean,
638
+ default: false,
639
+ },
640
+ minimumDriverCash: {
641
+ type: Number,
642
+ default: 0,
643
+ min: 0,
644
+ },
645
+ // #endregion Order Info
646
+ reassignationWarningSent: {
647
+ type: Boolean,
648
+ },
649
+ externalOrderId: {
650
+ type: String,
651
+ },
652
+ estimatedTimeToPointA: {
653
+ type: Number,
654
+ required: false,
655
+ },
656
+ estimatedTimeToPointB: {
657
+ type: Number,
658
+ required: false,
659
+ },
660
+ origin: {
661
+ type: String,
662
+ },
663
+ fromExternalCredentials: {
664
+ type: Boolean,
665
+ default: false,
666
+ },
667
+ proofOfDelivery: {
668
+ type: String,
669
+ },
670
+ smrSentVia: [String],
671
+ cookTime: {
672
+ type: Number,
673
+ min: 0,
674
+ }, // In milliseconds
675
+ isActive: {
676
+ type: Boolean,
677
+ default: true,
678
+ },
679
+ }, { timestamps: true });
680
+
681
+ BookingSchema.pre("save", function (next) {
682
+ if (!this.isNew) {
683
+ return next();
684
+ }
685
+ const doc = this;
686
+ const query = { model: "Bookings" };
687
+ const update = { $inc: { count: 1 } };
688
+ const options = { new: true };
689
+ IdentityCounterModel.findOneAndUpdate(query, update, options, function (error, counter) {
690
+ if (error) {
691
+ return next(error);
692
+ }
693
+ doc.bookingNumericId = counter.count;
694
+ next();
695
+ });
696
+ });
697
+
698
+ return BookingSchema;
699
+ };