uaxi-shared-entities 1.0.231 → 1.0.233

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 (36) hide show
  1. package/dist/entities/index.d.ts +3 -0
  2. package/dist/entities/index.d.ts.map +1 -1
  3. package/dist/entities/index.js +3 -0
  4. package/dist/entities/index.js.map +1 -1
  5. package/dist/entities/marketing-campaign.entity.d.ts +51 -0
  6. package/dist/entities/marketing-campaign.entity.d.ts.map +1 -0
  7. package/dist/entities/marketing-campaign.entity.js +143 -0
  8. package/dist/entities/marketing-campaign.entity.js.map +1 -0
  9. package/dist/entities/pickup-bay.entity.d.ts +46 -0
  10. package/dist/entities/pickup-bay.entity.d.ts.map +1 -0
  11. package/dist/entities/pickup-bay.entity.js +130 -0
  12. package/dist/entities/pickup-bay.entity.js.map +1 -0
  13. package/dist/entities/pickup-zone.entity.d.ts +47 -0
  14. package/dist/entities/pickup-zone.entity.d.ts.map +1 -0
  15. package/dist/entities/pickup-zone.entity.js +136 -0
  16. package/dist/entities/pickup-zone.entity.js.map +1 -0
  17. package/dist/enums/geofence.enum.d.ts +3 -1
  18. package/dist/enums/geofence.enum.d.ts.map +1 -1
  19. package/dist/enums/geofence.enum.js +2 -0
  20. package/dist/enums/geofence.enum.js.map +1 -1
  21. package/dist/enums/index.d.ts +1 -0
  22. package/dist/enums/index.d.ts.map +1 -1
  23. package/dist/enums/index.js +1 -0
  24. package/dist/enums/index.js.map +1 -1
  25. package/dist/enums/marketing-campaign.enum.d.ts +7 -0
  26. package/dist/enums/marketing-campaign.enum.d.ts.map +1 -0
  27. package/dist/enums/marketing-campaign.enum.js +11 -0
  28. package/dist/enums/marketing-campaign.enum.js.map +1 -0
  29. package/package.json +1 -1
  30. package/src/entities/index.ts +3 -0
  31. package/src/entities/marketing-campaign.entity.ts +157 -0
  32. package/src/entities/pickup-bay.entity.ts +140 -0
  33. package/src/entities/pickup-zone.entity.ts +149 -0
  34. package/src/enums/geofence.enum.ts +2 -0
  35. package/src/enums/index.ts +1 -0
  36. package/src/enums/marketing-campaign.enum.ts +6 -0
@@ -32,6 +32,8 @@ export * from "./package-location.entity";
32
32
  export * from "./address.entity";
33
33
  export * from "./geofence.entity";
34
34
  export * from "./geofence-level.entity";
35
+ export * from "./pickup-zone.entity";
36
+ export * from "./pickup-bay.entity";
35
37
  export * from "./recent_serch.entity";
36
38
  export * from "./camping_coupons.entity";
37
39
  export * from "./coupon.entity";
@@ -73,6 +75,7 @@ export * from "./cronjob-configuration.entity";
73
75
  export * from "./driver-search-expansion-configuration.entity";
74
76
  export * from "./enterprise-otp-phone.entity";
75
77
  export * from "./news-notification.entity";
78
+ export * from "./marketing-campaign.entity";
76
79
  export * from "./semovi-record.entity";
77
80
  export * from "./semovi-hourly-report.entity";
78
81
  export * from "./semovi-operator-report.entity";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":"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"}
@@ -48,6 +48,8 @@ __exportStar(require("./package-location.entity"), exports);
48
48
  __exportStar(require("./address.entity"), exports);
49
49
  __exportStar(require("./geofence.entity"), exports);
50
50
  __exportStar(require("./geofence-level.entity"), exports);
51
+ __exportStar(require("./pickup-zone.entity"), exports);
52
+ __exportStar(require("./pickup-bay.entity"), exports);
51
53
  __exportStar(require("./recent_serch.entity"), exports);
52
54
  __exportStar(require("./camping_coupons.entity"), exports);
53
55
  __exportStar(require("./coupon.entity"), exports);
@@ -89,6 +91,7 @@ __exportStar(require("./cronjob-configuration.entity"), exports);
89
91
  __exportStar(require("./driver-search-expansion-configuration.entity"), exports);
90
92
  __exportStar(require("./enterprise-otp-phone.entity"), exports);
91
93
  __exportStar(require("./news-notification.entity"), exports);
94
+ __exportStar(require("./marketing-campaign.entity"), exports);
92
95
  __exportStar(require("./semovi-record.entity"), exports);
93
96
  __exportStar(require("./semovi-hourly-report.entity"), exports);
94
97
  __exportStar(require("./semovi-operator-report.entity"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,gDAA8B;AAC9B,uDAAqC;AACrC,mDAAiC;AACjC,uDAAqC;AACrC,mDAAiC;AACjC,iDAA+B;AAC/B,yDAAuC;AACvC,yDAAuC;AACvC,mEAAiD;AACjD,kDAAgC;AAChC,6DAA2C;AAC3C,kDAAgC;AAChC,0EAAwD;AACxD,4DAA0C;AAC1C,6DAA2C;AAC3C,qDAAmC;AACnC,yDAAuC;AACvC,oDAAkC;AAClC,+CAA6B;AAC7B,oDAAkC;AAClC,iDAA+B;AAC/B,gDAA8B;AAC9B,yDAAuC;AACvC,wDAAsC;AACtC,iDAA+B;AAC/B,iEAA+C;AAC/C,gEAA8C;AAC9C,mDAAiC;AACjC,mEAAiD;AACjD,4DAA0C;AAC1C,mDAAiC;AACjC,oDAAkC;AAClC,0DAAwC;AACxC,wDAAsC;AACtC,2DAAyC;AACzC,kDAAgC;AAChC,qEAAmD;AACnD,yDAAuC;AACvC,gEAA8C;AAC9C,4EAA0D;AAC1D,sDAAoC;AACpC,6DAA2C;AAC3C,yDAAuC;AACvC,iEAA+C;AAC/C,kEAAgD;AAChD,qDAAmC;AACnC,4DAA0C;AAC1C,oDAAkC;AAClC,iEAA+C;AAC/C,iEAA+C;AAC/C,+CAA6B;AAC7B,yDAAuC;AACvC,qDAAmC;AACnC,6DAA2C;AAC3C,2DAAyC;AACzC,6DAA2C;AAC3C,kEAAgD;AAChD,4DAA0C;AAC1C,gEAA8C;AAC9C,0DAAwC;AACxC,0DAAwC;AACxC,qDAAmC;AACnC,0DAAwC;AACxC,qEAAmD;AACnD,8DAA4C;AAC5C,uEAAqD;AACrD,uEAAqD;AACrD,wEAAsD;AACtD,qEAAmD;AACnD,gEAA8C;AAC9C,iEAA+C;AAC/C,iFAA+D;AAC/D,gEAA8C;AAC9C,6DAA2C;AAC3C,yDAAuC;AACvC,gEAA8C;AAC9C,kEAAgD;AAChD,mEAAiD;AACjD,gEAA8C;AAC9C,uDAAqC;AACrC,2DAAyC;AACzC,sEAAoD;AACpD,4DAA0C;AAC1C,8DAA4C;AAC5C,+DAA6C;AAC7C,oEAAkD;AAClD,iEAA+C;AAC/C,gEAA8C;AAC9C,yEAAuD;AACvD,gEAA8C;AAC9C,wEAAsD;AACtD,8DAA4C;AAC5C,mEAAiD;AACjD,0EAAwD;AACxD,mEAAiD;AACjD,qEAAmD;AACnD,0EAAwD;AACxD,oEAAkD;AAClD,kEAAgD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,gDAA8B;AAC9B,uDAAqC;AACrC,mDAAiC;AACjC,uDAAqC;AACrC,mDAAiC;AACjC,iDAA+B;AAC/B,yDAAuC;AACvC,yDAAuC;AACvC,mEAAiD;AACjD,kDAAgC;AAChC,6DAA2C;AAC3C,kDAAgC;AAChC,0EAAwD;AACxD,4DAA0C;AAC1C,6DAA2C;AAC3C,qDAAmC;AACnC,yDAAuC;AACvC,oDAAkC;AAClC,+CAA6B;AAC7B,oDAAkC;AAClC,iDAA+B;AAC/B,gDAA8B;AAC9B,yDAAuC;AACvC,wDAAsC;AACtC,iDAA+B;AAC/B,iEAA+C;AAC/C,gEAA8C;AAC9C,mDAAiC;AACjC,mEAAiD;AACjD,4DAA0C;AAC1C,mDAAiC;AACjC,oDAAkC;AAClC,0DAAwC;AACxC,uDAAqC;AACrC,sDAAoC;AACpC,wDAAsC;AACtC,2DAAyC;AACzC,kDAAgC;AAChC,qEAAmD;AACnD,yDAAuC;AACvC,gEAA8C;AAC9C,4EAA0D;AAC1D,sDAAoC;AACpC,6DAA2C;AAC3C,yDAAuC;AACvC,iEAA+C;AAC/C,kEAAgD;AAChD,qDAAmC;AACnC,4DAA0C;AAC1C,oDAAkC;AAClC,iEAA+C;AAC/C,iEAA+C;AAC/C,+CAA6B;AAC7B,yDAAuC;AACvC,qDAAmC;AACnC,6DAA2C;AAC3C,2DAAyC;AACzC,6DAA2C;AAC3C,kEAAgD;AAChD,4DAA0C;AAC1C,gEAA8C;AAC9C,0DAAwC;AACxC,0DAAwC;AACxC,qDAAmC;AACnC,0DAAwC;AACxC,qEAAmD;AACnD,8DAA4C;AAC5C,uEAAqD;AACrD,uEAAqD;AACrD,wEAAsD;AACtD,qEAAmD;AACnD,gEAA8C;AAC9C,iEAA+C;AAC/C,iFAA+D;AAC/D,gEAA8C;AAC9C,6DAA2C;AAC3C,8DAA4C;AAC5C,yDAAuC;AACvC,gEAA8C;AAC9C,kEAAgD;AAChD,mEAAiD;AACjD,gEAA8C;AAC9C,uDAAqC;AACrC,2DAAyC;AACzC,sEAAoD;AACpD,4DAA0C;AAC1C,8DAA4C;AAC5C,+DAA6C;AAC7C,oEAAkD;AAClD,iEAA+C;AAC/C,gEAA8C;AAC9C,yEAAuD;AACvD,gEAA8C;AAC9C,wEAAsD;AACtD,8DAA4C;AAC5C,mEAAiD;AACjD,0EAAwD;AACxD,mEAAiD;AACjD,qEAAmD;AACnD,0EAAwD;AACxD,oEAAkD;AAClD,kEAAgD"}
@@ -0,0 +1,51 @@
1
+ import { Model } from 'sequelize-typescript';
2
+ import { MarketingCampaignStatus } from '../enums/marketing-campaign.enum';
3
+ export interface MarketingCampaignAttributes {
4
+ id: string;
5
+ /** Nombre interno opcional para identificar la campaña en admin. */
6
+ name: string | null;
7
+ /** Título del mensaje (text[0] en Jaxis). */
8
+ title: string;
9
+ /** Cuerpo del mensaje (text[1] en Jaxis). */
10
+ body: string;
11
+ imageUrl: string;
12
+ messageType: string;
13
+ template: string;
14
+ destinations: string[];
15
+ status: MarketingCampaignStatus;
16
+ sentAt: Date | null;
17
+ sendResult: Record<string, unknown> | null;
18
+ metadata: Record<string, unknown> | null;
19
+ createdAt: Date;
20
+ updatedAt: Date;
21
+ deletedAt: Date | null;
22
+ }
23
+ export interface CreateMarketingCampaignData {
24
+ name?: string | null;
25
+ title: string;
26
+ body: string;
27
+ imageUrl: string;
28
+ messageType?: string;
29
+ template?: string;
30
+ destinations: string[];
31
+ status?: MarketingCampaignStatus;
32
+ metadata?: Record<string, unknown> | null;
33
+ }
34
+ export declare class MarketingCampaign extends Model<MarketingCampaignAttributes, CreateMarketingCampaignData> {
35
+ id: string;
36
+ name: string | null;
37
+ title: string;
38
+ body: string;
39
+ imageUrl: string;
40
+ messageType: string;
41
+ template: string;
42
+ destinations: string[];
43
+ status: MarketingCampaignStatus;
44
+ sentAt: Date | null;
45
+ sendResult: Record<string, unknown> | null;
46
+ metadata: Record<string, unknown> | null;
47
+ createdAt: Date;
48
+ updatedAt: Date;
49
+ deletedAt: Date | null;
50
+ }
51
+ //# sourceMappingURL=marketing-campaign.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing-campaign.entity.d.ts","sourceRoot":"","sources":["../../src/entities/marketing-campaign.entity.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,EAGN,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,oEAAoE;IACpE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,uBAAuB,CAAC;IAChC,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,qBAea,iBAAkB,SAAQ,KAAK,CAC1C,2BAA2B,EAC3B,2BAA2B,CAC5B;IAMS,EAAE,EAAE,MAAM,CAAC;IAMnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAMpB,KAAK,EAAE,MAAM,CAAC;IAMd,IAAI,EAAE,MAAM,CAAC;IAOb,QAAQ,EAAE,MAAM,CAAC;IAQjB,WAAW,EAAE,MAAM,CAAC;IAOpB,QAAQ,EAAE,MAAM,CAAC;IAOjB,YAAY,EAAE,MAAM,EAAE,CAAC;IAOvB,MAAM,EAAE,uBAAuB,CAAC;IAOhC,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IAOpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAM3C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAGzC,SAAS,EAAE,IAAI,CAAC;IAGhB,SAAS,EAAE,IAAI,CAAC;IAGhB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ // =============================================
3
+ // MARKETING CAMPAIGN — Mensajes WhatsApp masivos vía Jaxis
4
+ // =============================================
5
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
6
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
7
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
9
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
10
+ };
11
+ var __metadata = (this && this.__metadata) || function (k, v) {
12
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.MarketingCampaign = void 0;
16
+ const sequelize_typescript_1 = require("sequelize-typescript");
17
+ const marketing_campaign_enum_1 = require("../enums/marketing-campaign.enum");
18
+ let MarketingCampaign = class MarketingCampaign extends sequelize_typescript_1.Model {
19
+ };
20
+ exports.MarketingCampaign = MarketingCampaign;
21
+ __decorate([
22
+ (0, sequelize_typescript_1.Column)({
23
+ type: sequelize_typescript_1.DataType.UUID,
24
+ defaultValue: sequelize_typescript_1.DataType.UUIDV4,
25
+ primaryKey: true,
26
+ }),
27
+ __metadata("design:type", String)
28
+ ], MarketingCampaign.prototype, "id", void 0);
29
+ __decorate([
30
+ (0, sequelize_typescript_1.Column)({
31
+ type: sequelize_typescript_1.DataType.STRING(180),
32
+ allowNull: true,
33
+ }),
34
+ __metadata("design:type", Object)
35
+ ], MarketingCampaign.prototype, "name", void 0);
36
+ __decorate([
37
+ (0, sequelize_typescript_1.Column)({
38
+ type: sequelize_typescript_1.DataType.STRING(500),
39
+ allowNull: false,
40
+ }),
41
+ __metadata("design:type", String)
42
+ ], MarketingCampaign.prototype, "title", void 0);
43
+ __decorate([
44
+ (0, sequelize_typescript_1.Column)({
45
+ type: sequelize_typescript_1.DataType.TEXT,
46
+ allowNull: false,
47
+ }),
48
+ __metadata("design:type", String)
49
+ ], MarketingCampaign.prototype, "body", void 0);
50
+ __decorate([
51
+ (0, sequelize_typescript_1.Column)({
52
+ type: sequelize_typescript_1.DataType.TEXT,
53
+ allowNull: false,
54
+ field: 'image_url',
55
+ }),
56
+ __metadata("design:type", String)
57
+ ], MarketingCampaign.prototype, "imageUrl", void 0);
58
+ __decorate([
59
+ (0, sequelize_typescript_1.Column)({
60
+ type: sequelize_typescript_1.DataType.STRING(10),
61
+ allowNull: false,
62
+ defaultValue: 'mk',
63
+ field: 'message_type',
64
+ }),
65
+ __metadata("design:type", String)
66
+ ], MarketingCampaign.prototype, "messageType", void 0);
67
+ __decorate([
68
+ (0, sequelize_typescript_1.Column)({
69
+ type: sequelize_typescript_1.DataType.STRING(10),
70
+ allowNull: false,
71
+ defaultValue: '01',
72
+ }),
73
+ __metadata("design:type", String)
74
+ ], MarketingCampaign.prototype, "template", void 0);
75
+ __decorate([
76
+ (0, sequelize_typescript_1.Column)({
77
+ type: sequelize_typescript_1.DataType.JSONB,
78
+ allowNull: false,
79
+ defaultValue: [],
80
+ }),
81
+ __metadata("design:type", Array)
82
+ ], MarketingCampaign.prototype, "destinations", void 0);
83
+ __decorate([
84
+ (0, sequelize_typescript_1.Column)({
85
+ type: sequelize_typescript_1.DataType.ENUM(...Object.values(marketing_campaign_enum_1.MarketingCampaignStatus)),
86
+ allowNull: false,
87
+ defaultValue: marketing_campaign_enum_1.MarketingCampaignStatus.DRAFT,
88
+ }),
89
+ __metadata("design:type", String)
90
+ ], MarketingCampaign.prototype, "status", void 0);
91
+ __decorate([
92
+ (0, sequelize_typescript_1.Column)({
93
+ type: sequelize_typescript_1.DataType.DATE,
94
+ allowNull: true,
95
+ field: 'sent_at',
96
+ }),
97
+ __metadata("design:type", Object)
98
+ ], MarketingCampaign.prototype, "sentAt", void 0);
99
+ __decorate([
100
+ (0, sequelize_typescript_1.Column)({
101
+ type: sequelize_typescript_1.DataType.JSONB,
102
+ allowNull: true,
103
+ field: 'send_result',
104
+ }),
105
+ __metadata("design:type", Object)
106
+ ], MarketingCampaign.prototype, "sendResult", void 0);
107
+ __decorate([
108
+ (0, sequelize_typescript_1.Column)({
109
+ type: sequelize_typescript_1.DataType.JSONB,
110
+ allowNull: true,
111
+ }),
112
+ __metadata("design:type", Object)
113
+ ], MarketingCampaign.prototype, "metadata", void 0);
114
+ __decorate([
115
+ sequelize_typescript_1.CreatedAt,
116
+ __metadata("design:type", Date)
117
+ ], MarketingCampaign.prototype, "createdAt", void 0);
118
+ __decorate([
119
+ sequelize_typescript_1.UpdatedAt,
120
+ __metadata("design:type", Date)
121
+ ], MarketingCampaign.prototype, "updatedAt", void 0);
122
+ __decorate([
123
+ sequelize_typescript_1.DeletedAt,
124
+ __metadata("design:type", Object)
125
+ ], MarketingCampaign.prototype, "deletedAt", void 0);
126
+ exports.MarketingCampaign = MarketingCampaign = __decorate([
127
+ (0, sequelize_typescript_1.Table)({
128
+ tableName: 'marketing_campaigns',
129
+ timestamps: true,
130
+ paranoid: true,
131
+ indexes: [
132
+ {
133
+ name: 'idx_marketing_campaigns_status',
134
+ fields: ['status'],
135
+ },
136
+ {
137
+ name: 'idx_marketing_campaigns_sent_at',
138
+ fields: ['sentAt'],
139
+ },
140
+ ],
141
+ })
142
+ ], MarketingCampaign);
143
+ //# sourceMappingURL=marketing-campaign.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing-campaign.entity.js","sourceRoot":"","sources":["../../src/entities/marketing-campaign.entity.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,2DAA2D;AAC3D,gDAAgD;;;;;;;;;;;;AAEhD,+DAQ8B;AAC9B,8EAA2E;AAkDpE,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,4BAGtC;CA0FA,CAAA;AA7FY,8CAAiB;AASpB;IALP,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,YAAY,EAAE,+BAAQ,CAAC,MAAM;QAC7B,UAAU,EAAE,IAAI;KACjB,CAAC;;6CACiB;AAMnB;IAJC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;QAC1B,SAAS,EAAE,IAAI;KAChB,CAAC;;+CACkB;AAMpB;IAJC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;QAC1B,SAAS,EAAE,KAAK;KACjB,CAAC;;gDACY;AAMd;IAJC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,KAAK;KACjB,CAAC;;+CACW;AAOb;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,WAAW;KACnB,CAAC;;mDACe;AAQjB;IANC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,IAAI;QAClB,KAAK,EAAE,cAAc;KACtB,CAAC;;sDACkB;AAOpB;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,IAAI;KACnB,CAAC;;mDACe;AAOjB;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,KAAK;QACpB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,EAAE;KACjB,CAAC;;uDACqB;AAOvB;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,iDAAuB,CAAC,CAAC;QAC9D,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,iDAAuB,CAAC,KAAK;KAC5C,CAAC;;iDAC8B;AAOhC;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,SAAS;KACjB,CAAC;;iDACkB;AAOpB;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,KAAK;QACpB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,aAAa;KACrB,CAAC;;qDACyC;AAM3C;IAJC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,KAAK;QACpB,SAAS,EAAE,IAAI;KAChB,CAAC;;mDACuC;AAGzC;IADC,gCAAS;8BACC,IAAI;oDAAC;AAGhB;IADC,gCAAS;8BACC,IAAI;oDAAC;AAGhB;IADC,gCAAS;;oDACa;4BA5FZ,iBAAiB;IAf7B,IAAA,4BAAK,EAAC;QACL,SAAS,EAAE,qBAAqB;QAChC,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,gCAAgC;gBACtC,MAAM,EAAE,CAAC,QAAQ,CAAC;aACnB;YACD;gBACE,IAAI,EAAE,iCAAiC;gBACvC,MAAM,EAAE,CAAC,QAAQ,CAAC;aACnB;SACF;KACF,CAAC;GACW,iBAAiB,CA6F7B"}
@@ -0,0 +1,46 @@
1
+ import { Model } from "sequelize-typescript";
2
+ import { PickupZone } from "./pickup-zone.entity";
3
+ export interface PickupBayAttributes {
4
+ id: string;
5
+ pickupZoneId: string;
6
+ name: string;
7
+ /** Código corto opcional (ej. T1-P3). */
8
+ code: string | null;
9
+ latitude: number;
10
+ longitude: number;
11
+ instructions: string | null;
12
+ sortOrder: number;
13
+ isActive: boolean;
14
+ metadata: Record<string, unknown> | null;
15
+ createdAt: Date;
16
+ updatedAt: Date;
17
+ deletedAt: Date | null;
18
+ }
19
+ export interface CreatePickupBayData {
20
+ pickupZoneId: string;
21
+ name: string;
22
+ code?: string | null;
23
+ latitude: number;
24
+ longitude: number;
25
+ instructions?: string | null;
26
+ sortOrder?: number;
27
+ isActive?: boolean;
28
+ metadata?: Record<string, unknown> | null;
29
+ }
30
+ export declare class PickupBay extends Model<PickupBayAttributes, CreatePickupBayData> {
31
+ id: string;
32
+ pickupZoneId: string;
33
+ pickupZone: PickupZone;
34
+ name: string;
35
+ code: string | null;
36
+ latitude: number;
37
+ longitude: number;
38
+ instructions: string | null;
39
+ sortOrder: number;
40
+ isActive: boolean;
41
+ metadata: Record<string, unknown> | null;
42
+ createdAt: Date;
43
+ updatedAt: Date;
44
+ deletedAt: Date | null;
45
+ }
46
+ //# sourceMappingURL=pickup-bay.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickup-bay.entity.d.ts","sourceRoot":"","sources":["../../src/entities/pickup-bay.entity.ts"],"names":[],"mappings":"AAIA,OAAO,EAOL,KAAK,EAGN,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,qBAea,SAAU,SAAQ,KAAK,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAMpE,EAAE,EAAE,MAAM,CAAC;IAOnB,YAAY,EAAE,MAAM,CAAC;IAGrB,UAAU,EAAE,UAAU,CAAC;IAOvB,IAAI,EAAE,MAAM,CAAC;IAMb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAMpB,QAAQ,EAAE,MAAM,CAAC;IAMjB,SAAS,EAAE,MAAM,CAAC;IAOlB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAO5B,SAAS,EAAE,MAAM,CAAC;IAOlB,QAAQ,EAAE,OAAO,CAAC;IAMlB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAGzC,SAAS,EAAE,IAAI,CAAC;IAGhB,SAAS,EAAE,IAAI,CAAC;IAGhB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ // =============================================
3
+ // PICKUP BAY — Punto de recogida dentro de una PickupZone
4
+ // =============================================
5
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
6
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
7
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
9
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
10
+ };
11
+ var __metadata = (this && this.__metadata) || function (k, v) {
12
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.PickupBay = void 0;
16
+ const sequelize_typescript_1 = require("sequelize-typescript");
17
+ const pickup_zone_entity_1 = require("./pickup-zone.entity");
18
+ let PickupBay = class PickupBay extends sequelize_typescript_1.Model {
19
+ };
20
+ exports.PickupBay = PickupBay;
21
+ __decorate([
22
+ (0, sequelize_typescript_1.Column)({
23
+ type: sequelize_typescript_1.DataType.UUID,
24
+ defaultValue: sequelize_typescript_1.DataType.UUIDV4,
25
+ primaryKey: true,
26
+ }),
27
+ __metadata("design:type", String)
28
+ ], PickupBay.prototype, "id", void 0);
29
+ __decorate([
30
+ (0, sequelize_typescript_1.ForeignKey)(() => pickup_zone_entity_1.PickupZone),
31
+ (0, sequelize_typescript_1.Column)({
32
+ type: sequelize_typescript_1.DataType.UUID,
33
+ allowNull: false,
34
+ }),
35
+ __metadata("design:type", String)
36
+ ], PickupBay.prototype, "pickupZoneId", void 0);
37
+ __decorate([
38
+ (0, sequelize_typescript_1.BelongsTo)(() => pickup_zone_entity_1.PickupZone),
39
+ __metadata("design:type", pickup_zone_entity_1.PickupZone)
40
+ ], PickupBay.prototype, "pickupZone", void 0);
41
+ __decorate([
42
+ (0, sequelize_typescript_1.Column)({
43
+ type: sequelize_typescript_1.DataType.STRING,
44
+ allowNull: false,
45
+ comment: "Etiqueta visible (ej. Terminal 1 - Puerta 3)",
46
+ }),
47
+ __metadata("design:type", String)
48
+ ], PickupBay.prototype, "name", void 0);
49
+ __decorate([
50
+ (0, sequelize_typescript_1.Column)({
51
+ type: sequelize_typescript_1.DataType.STRING(32),
52
+ allowNull: true,
53
+ }),
54
+ __metadata("design:type", Object)
55
+ ], PickupBay.prototype, "code", void 0);
56
+ __decorate([
57
+ (0, sequelize_typescript_1.Column)({
58
+ type: sequelize_typescript_1.DataType.DECIMAL(10, 7),
59
+ allowNull: false,
60
+ }),
61
+ __metadata("design:type", Number)
62
+ ], PickupBay.prototype, "latitude", void 0);
63
+ __decorate([
64
+ (0, sequelize_typescript_1.Column)({
65
+ type: sequelize_typescript_1.DataType.DECIMAL(10, 7),
66
+ allowNull: false,
67
+ }),
68
+ __metadata("design:type", Number)
69
+ ], PickupBay.prototype, "longitude", void 0);
70
+ __decorate([
71
+ (0, sequelize_typescript_1.Column)({
72
+ type: sequelize_typescript_1.DataType.TEXT,
73
+ allowNull: true,
74
+ comment: "Indicaciones para llegar a la bahía",
75
+ }),
76
+ __metadata("design:type", Object)
77
+ ], PickupBay.prototype, "instructions", void 0);
78
+ __decorate([
79
+ (0, sequelize_typescript_1.Column)({
80
+ type: sequelize_typescript_1.DataType.INTEGER,
81
+ allowNull: false,
82
+ defaultValue: 0,
83
+ }),
84
+ __metadata("design:type", Number)
85
+ ], PickupBay.prototype, "sortOrder", void 0);
86
+ __decorate([
87
+ (0, sequelize_typescript_1.Column)({
88
+ type: sequelize_typescript_1.DataType.BOOLEAN,
89
+ allowNull: false,
90
+ defaultValue: true,
91
+ }),
92
+ __metadata("design:type", Boolean)
93
+ ], PickupBay.prototype, "isActive", void 0);
94
+ __decorate([
95
+ (0, sequelize_typescript_1.Column)({
96
+ type: sequelize_typescript_1.DataType.JSONB,
97
+ allowNull: true,
98
+ }),
99
+ __metadata("design:type", Object)
100
+ ], PickupBay.prototype, "metadata", void 0);
101
+ __decorate([
102
+ sequelize_typescript_1.CreatedAt,
103
+ __metadata("design:type", Date)
104
+ ], PickupBay.prototype, "createdAt", void 0);
105
+ __decorate([
106
+ sequelize_typescript_1.UpdatedAt,
107
+ __metadata("design:type", Date)
108
+ ], PickupBay.prototype, "updatedAt", void 0);
109
+ __decorate([
110
+ sequelize_typescript_1.DeletedAt,
111
+ __metadata("design:type", Object)
112
+ ], PickupBay.prototype, "deletedAt", void 0);
113
+ exports.PickupBay = PickupBay = __decorate([
114
+ (0, sequelize_typescript_1.Table)({
115
+ tableName: "pickup_bays",
116
+ timestamps: true,
117
+ paranoid: true,
118
+ indexes: [
119
+ {
120
+ fields: ["pickupZoneId", "sortOrder"],
121
+ name: "pickup_bays_zone_sort_idx",
122
+ },
123
+ {
124
+ fields: ["pickupZoneId", "isActive"],
125
+ name: "pickup_bays_zone_active_idx",
126
+ },
127
+ ],
128
+ })
129
+ ], PickupBay);
130
+ //# sourceMappingURL=pickup-bay.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickup-bay.entity.js","sourceRoot":"","sources":["../../src/entities/pickup-bay.entity.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,0DAA0D;AAC1D,gDAAgD;;;;;;;;;;;;AAEhD,+DAU8B;AAC9B,6DAAkD;AA8C3C,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,4BAA+C;CA8E7E,CAAA;AA9EY,8BAAS;AAMZ;IALP,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,YAAY,EAAE,+BAAQ,CAAC,MAAM;QAC7B,UAAU,EAAE,IAAI;KACjB,CAAC;;qCACiB;AAOnB;IALC,IAAA,iCAAU,EAAC,GAAG,EAAE,CAAC,+BAAU,CAAC;IAC5B,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,KAAK;KACjB,CAAC;;+CACmB;AAGrB;IADC,IAAA,gCAAS,EAAC,GAAG,EAAE,CAAC,+BAAU,CAAC;8BAChB,+BAAU;6CAAC;AAOvB;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,MAAM;QACrB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,8CAA8C;KACxD,CAAC;;uCACW;AAMb;IAJC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,SAAS,EAAE,IAAI;KAChB,CAAC;;uCACkB;AAMpB;IAJC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7B,SAAS,EAAE,KAAK;KACjB,CAAC;;2CACe;AAMjB;IAJC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7B,SAAS,EAAE,KAAK;KACjB,CAAC;;4CACgB;AAOlB;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,qCAAqC;KAC/C,CAAC;;+CAC0B;AAO5B;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,CAAC;KAChB,CAAC;;4CACgB;AAOlB;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,IAAI;KACnB,CAAC;;2CACgB;AAMlB;IAJC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,KAAK;QACpB,SAAS,EAAE,IAAI;KAChB,CAAC;;2CACuC;AAGzC;IADC,gCAAS;8BACC,IAAI;4CAAC;AAGhB;IADC,gCAAS;8BACC,IAAI;4CAAC;AAGhB;IADC,gCAAS;;4CACa;oBA7EZ,SAAS;IAfrB,IAAA,4BAAK,EAAC;QACL,SAAS,EAAE,aAAa;QACxB,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE;YACP;gBACE,MAAM,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC;gBACrC,IAAI,EAAE,2BAA2B;aAClC;YACD;gBACE,MAAM,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC;gBACpC,IAAI,EAAE,6BAA6B;aACpC;SACF;KACF,CAAC;GACW,SAAS,CA8ErB"}
@@ -0,0 +1,47 @@
1
+ import { Model } from "sequelize-typescript";
2
+ import { Geofence } from "./geofence.entity";
3
+ import { PickupBay } from "./pickup-bay.entity";
4
+ import { GeofenceApplyOn } from "../enums";
5
+ export interface PickupZoneAttributes {
6
+ id: string;
7
+ geofenceId: string;
8
+ name: string;
9
+ description: string | null;
10
+ /** Instrucciones visibles para pasajero/conductor (ej. "Selecciona tu bahía"). */
11
+ instructions: string | null;
12
+ isActive: boolean;
13
+ /** Si true, el viaje debe fijar una bahía antes de cotizar/crear. */
14
+ requiresBaySelection: boolean;
15
+ applyOn: GeofenceApplyOn;
16
+ metadata: Record<string, unknown> | null;
17
+ createdAt: Date;
18
+ updatedAt: Date;
19
+ deletedAt: Date | null;
20
+ }
21
+ export interface CreatePickupZoneData {
22
+ geofenceId: string;
23
+ name: string;
24
+ description?: string | null;
25
+ instructions?: string | null;
26
+ isActive?: boolean;
27
+ requiresBaySelection?: boolean;
28
+ applyOn?: GeofenceApplyOn;
29
+ metadata?: Record<string, unknown> | null;
30
+ }
31
+ export declare class PickupZone extends Model<PickupZoneAttributes, CreatePickupZoneData> {
32
+ id: string;
33
+ geofenceId: string;
34
+ geofence: Geofence;
35
+ name: string;
36
+ description: string | null;
37
+ instructions: string | null;
38
+ isActive: boolean;
39
+ requiresBaySelection: boolean;
40
+ applyOn: GeofenceApplyOn;
41
+ metadata: Record<string, unknown> | null;
42
+ bays: PickupBay[];
43
+ createdAt: Date;
44
+ updatedAt: Date;
45
+ deletedAt: Date | null;
46
+ }
47
+ //# sourceMappingURL=pickup-zone.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickup-zone.entity.d.ts","sourceRoot":"","sources":["../../src/entities/pickup-zone.entity.ts"],"names":[],"mappings":"AAOA,OAAO,EAQL,KAAK,EAGN,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kFAAkF;IAClF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,oBAAoB,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,qBAgBa,UAAW,SAAQ,KAAK,CACnC,oBAAoB,EACpB,oBAAoB,CACrB;IAMS,EAAE,EAAE,MAAM,CAAC;IAQnB,UAAU,EAAE,MAAM,CAAC;IAGnB,QAAQ,EAAE,QAAQ,CAAC;IAOnB,IAAI,EAAE,MAAM,CAAC;IAMb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAM3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAO5B,QAAQ,EAAE,OAAO,CAAC;IAQlB,oBAAoB,EAAE,OAAO,CAAC;IAQ9B,OAAO,EAAE,eAAe,CAAC;IAMzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAGzC,IAAI,EAAE,SAAS,EAAE,CAAC;IAGlB,SAAS,EAAE,IAAI,CAAC;IAGhB,SAAS,EAAE,IAAI,CAAC;IAGhB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ // =============================================
3
+ // PICKUP ZONE — Zona con recogida restringida a bahías
4
+ // =============================================
5
+ // Capa operativa sobre un geofence (polígono en `geofences`, típicamente type pickup_hub).
6
+ // La app consultará si un punto cae en la zona y listará las bahías hijas (`PickupBay`).
7
+ // =============================================
8
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
9
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
11
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
12
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
13
+ };
14
+ var __metadata = (this && this.__metadata) || function (k, v) {
15
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.PickupZone = void 0;
19
+ const sequelize_typescript_1 = require("sequelize-typescript");
20
+ const geofence_entity_1 = require("./geofence.entity");
21
+ const pickup_bay_entity_1 = require("./pickup-bay.entity");
22
+ const enums_1 = require("../enums");
23
+ let PickupZone = class PickupZone extends sequelize_typescript_1.Model {
24
+ };
25
+ exports.PickupZone = PickupZone;
26
+ __decorate([
27
+ (0, sequelize_typescript_1.Column)({
28
+ type: sequelize_typescript_1.DataType.UUID,
29
+ defaultValue: sequelize_typescript_1.DataType.UUIDV4,
30
+ primaryKey: true,
31
+ }),
32
+ __metadata("design:type", String)
33
+ ], PickupZone.prototype, "id", void 0);
34
+ __decorate([
35
+ (0, sequelize_typescript_1.ForeignKey)(() => geofence_entity_1.Geofence),
36
+ (0, sequelize_typescript_1.Column)({
37
+ type: sequelize_typescript_1.DataType.UUID,
38
+ allowNull: false,
39
+ comment: "Geocerca poligonal que delimita la zona (geofences.id)",
40
+ }),
41
+ __metadata("design:type", String)
42
+ ], PickupZone.prototype, "geofenceId", void 0);
43
+ __decorate([
44
+ (0, sequelize_typescript_1.BelongsTo)(() => geofence_entity_1.Geofence),
45
+ __metadata("design:type", geofence_entity_1.Geofence)
46
+ ], PickupZone.prototype, "geofence", void 0);
47
+ __decorate([
48
+ (0, sequelize_typescript_1.Column)({
49
+ type: sequelize_typescript_1.DataType.STRING,
50
+ allowNull: false,
51
+ comment: "Nombre visible de la zona (puede diferir del geofence.name)",
52
+ }),
53
+ __metadata("design:type", String)
54
+ ], PickupZone.prototype, "name", void 0);
55
+ __decorate([
56
+ (0, sequelize_typescript_1.Column)({
57
+ type: sequelize_typescript_1.DataType.TEXT,
58
+ allowNull: true,
59
+ }),
60
+ __metadata("design:type", Object)
61
+ ], PickupZone.prototype, "description", void 0);
62
+ __decorate([
63
+ (0, sequelize_typescript_1.Column)({
64
+ type: sequelize_typescript_1.DataType.TEXT,
65
+ allowNull: true,
66
+ }),
67
+ __metadata("design:type", Object)
68
+ ], PickupZone.prototype, "instructions", void 0);
69
+ __decorate([
70
+ (0, sequelize_typescript_1.Column)({
71
+ type: sequelize_typescript_1.DataType.BOOLEAN,
72
+ allowNull: false,
73
+ defaultValue: true,
74
+ }),
75
+ __metadata("design:type", Boolean)
76
+ ], PickupZone.prototype, "isActive", void 0);
77
+ __decorate([
78
+ (0, sequelize_typescript_1.Column)({
79
+ type: sequelize_typescript_1.DataType.BOOLEAN,
80
+ allowNull: false,
81
+ defaultValue: true,
82
+ comment: "Obliga a elegir pickupBayId al solicitar viaje en esta zona",
83
+ }),
84
+ __metadata("design:type", Boolean)
85
+ ], PickupZone.prototype, "requiresBaySelection", void 0);
86
+ __decorate([
87
+ (0, sequelize_typescript_1.Column)({
88
+ type: sequelize_typescript_1.DataType.ENUM(...Object.values(enums_1.GeofenceApplyOn)),
89
+ allowNull: false,
90
+ defaultValue: enums_1.GeofenceApplyOn.PICKUP,
91
+ field: "apply_on",
92
+ }),
93
+ __metadata("design:type", String)
94
+ ], PickupZone.prototype, "applyOn", void 0);
95
+ __decorate([
96
+ (0, sequelize_typescript_1.Column)({
97
+ type: sequelize_typescript_1.DataType.JSONB,
98
+ allowNull: true,
99
+ }),
100
+ __metadata("design:type", Object)
101
+ ], PickupZone.prototype, "metadata", void 0);
102
+ __decorate([
103
+ (0, sequelize_typescript_1.HasMany)(() => pickup_bay_entity_1.PickupBay),
104
+ __metadata("design:type", Array)
105
+ ], PickupZone.prototype, "bays", void 0);
106
+ __decorate([
107
+ sequelize_typescript_1.CreatedAt,
108
+ __metadata("design:type", Date)
109
+ ], PickupZone.prototype, "createdAt", void 0);
110
+ __decorate([
111
+ sequelize_typescript_1.UpdatedAt,
112
+ __metadata("design:type", Date)
113
+ ], PickupZone.prototype, "updatedAt", void 0);
114
+ __decorate([
115
+ sequelize_typescript_1.DeletedAt,
116
+ __metadata("design:type", Object)
117
+ ], PickupZone.prototype, "deletedAt", void 0);
118
+ exports.PickupZone = PickupZone = __decorate([
119
+ (0, sequelize_typescript_1.Table)({
120
+ tableName: "pickup_zones",
121
+ timestamps: true,
122
+ paranoid: true,
123
+ indexes: [
124
+ {
125
+ unique: true,
126
+ fields: ["geofenceId"],
127
+ name: "pickup_zones_geofence_id_unique",
128
+ },
129
+ {
130
+ fields: ["isActive"],
131
+ name: "pickup_zones_is_active_idx",
132
+ },
133
+ ],
134
+ })
135
+ ], PickupZone);
136
+ //# sourceMappingURL=pickup-zone.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickup-zone.entity.js","sourceRoot":"","sources":["../../src/entities/pickup-zone.entity.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,uDAAuD;AACvD,gDAAgD;AAChD,2FAA2F;AAC3F,yFAAyF;AACzF,gDAAgD;;;;;;;;;;;;AAEhD,+DAW8B;AAC9B,uDAA6C;AAC7C,2DAAgD;AAChD,oCAA2C;AA8CpC,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,4BAG/B;CA8EA,CAAA;AAjFY,gCAAU;AASb;IALP,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,YAAY,EAAE,+BAAQ,CAAC,MAAM;QAC7B,UAAU,EAAE,IAAI;KACjB,CAAC;;sCACiB;AAQnB;IANC,IAAA,iCAAU,EAAC,GAAG,EAAE,CAAC,0BAAQ,CAAC;IAC1B,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,wDAAwD;KAClE,CAAC;;8CACiB;AAGnB;IADC,IAAA,gCAAS,EAAC,GAAG,EAAE,CAAC,0BAAQ,CAAC;8BAChB,0BAAQ;4CAAC;AAOnB;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,MAAM;QACrB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,6DAA6D;KACvE,CAAC;;wCACW;AAMb;IAJC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,IAAI;KAChB,CAAC;;+CACyB;AAM3B;IAJC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,IAAI;KAChB,CAAC;;gDAC0B;AAO5B;IALC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,IAAI;KACnB,CAAC;;4CACgB;AAQlB;IANC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,6DAA6D;KACvE,CAAC;;wDAC4B;AAQ9B;IANC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,uBAAe,CAAC,CAAC;QACtD,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,uBAAe,CAAC,MAAM;QACpC,KAAK,EAAE,UAAU;KAClB,CAAC;;2CACuB;AAMzB;IAJC,IAAA,6BAAM,EAAC;QACN,IAAI,EAAE,+BAAQ,CAAC,KAAK;QACpB,SAAS,EAAE,IAAI;KAChB,CAAC;;4CACuC;AAGzC;IADC,IAAA,8BAAO,EAAC,GAAG,EAAE,CAAC,6BAAS,CAAC;;wCACP;AAGlB;IADC,gCAAS;8BACC,IAAI;6CAAC;AAGhB;IADC,gCAAS;8BACC,IAAI;6CAAC;AAGhB;IADC,gCAAS;;6CACa;qBAhFZ,UAAU;IAhBtB,IAAA,4BAAK,EAAC;QACL,SAAS,EAAE,cAAc;QACzB,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE;YACP;gBACE,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,CAAC,YAAY,CAAC;gBACtB,IAAI,EAAE,iCAAiC;aACxC;YACD;gBACE,MAAM,EAAE,CAAC,UAAU,CAAC;gBACpB,IAAI,EAAE,4BAA4B;aACnC;SACF;KACF,CAAC;GACW,UAAU,CAiFtB"}
@@ -9,7 +9,9 @@ export declare enum GeofenceType {
9
9
  RESTRICTED_AREA = "restricted_area",
10
10
  SURGE_ZONE = "surge_zone",
11
11
  /** Geocercas temporales de evento (conciertos, ferias). Factor GE separado de W. */
12
- EVENT = "event"
12
+ EVENT = "event",
13
+ /** Zona con recogida en bahías fijas (aeropuertos, campus). Ver `pickup_zones`. */
14
+ PICKUP_HUB = "pickup_hub"
13
15
  }
14
16
  export declare enum GeofenceApplyOn {
15
17
  PICKUP = "pickup",
@@ -1 +1 @@
1
- {"version":3,"file":"geofence.enum.d.ts","sourceRoot":"","sources":["../../src/enums/geofence.enum.ts"],"names":[],"mappings":"AAIA,oBAAY,YAAY;IACtB,IAAI,SAAS;IACb,YAAY,iBAAiB;IAC7B,OAAO,YAAY;IACnB,eAAe,oBAAoB;IACnC,uEAAuE;IACvE,cAAc,mBAAmB;IACjC,kIAAkI;IAClI,eAAe,oBAAoB;IACnC,UAAU,eAAe;IACzB,oFAAoF;IACpF,KAAK,UAAU;CAChB;AAED,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,WAAW,gBAAgB;IAC3B,IAAI,SAAS;CACd;AAED,oBAAY,mBAAmB;IAC7B,MAAM,WAAW;IACjB,QAAQ,aAAa;CACtB"}
1
+ {"version":3,"file":"geofence.enum.d.ts","sourceRoot":"","sources":["../../src/enums/geofence.enum.ts"],"names":[],"mappings":"AAIA,oBAAY,YAAY;IACtB,IAAI,SAAS;IACb,YAAY,iBAAiB;IAC7B,OAAO,YAAY;IACnB,eAAe,oBAAoB;IACnC,uEAAuE;IACvE,cAAc,mBAAmB;IACjC,kIAAkI;IAClI,eAAe,oBAAoB;IACnC,UAAU,eAAe;IACzB,oFAAoF;IACpF,KAAK,UAAU;IACf,mFAAmF;IACnF,UAAU,eAAe;CAC1B;AAED,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,WAAW,gBAAgB;IAC3B,IAAI,SAAS;CACd;AAED,oBAAY,mBAAmB;IAC7B,MAAM,WAAW;IACjB,QAAQ,aAAa;CACtB"}
@@ -17,6 +17,8 @@ var GeofenceType;
17
17
  GeofenceType["SURGE_ZONE"] = "surge_zone";
18
18
  /** Geocercas temporales de evento (conciertos, ferias). Factor GE separado de W. */
19
19
  GeofenceType["EVENT"] = "event";
20
+ /** Zona con recogida en bahías fijas (aeropuertos, campus). Ver `pickup_zones`. */
21
+ GeofenceType["PICKUP_HUB"] = "pickup_hub";
20
22
  })(GeofenceType || (exports.GeofenceType = GeofenceType = {}));
21
23
  var GeofenceApplyOn;
22
24
  (function (GeofenceApplyOn) {
@@ -1 +1 @@
1
- {"version":3,"file":"geofence.enum.js","sourceRoot":"","sources":["../../src/enums/geofence.enum.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,iBAAiB;AACjB,gDAAgD;;;AAEhD,IAAY,YAYX;AAZD,WAAY,YAAY;IACtB,6BAAa,CAAA;IACb,6CAA6B,CAAA;IAC7B,mCAAmB,CAAA;IACnB,mDAAmC,CAAA;IACnC,uEAAuE;IACvE,iDAAiC,CAAA;IACjC,kIAAkI;IAClI,mDAAmC,CAAA;IACnC,yCAAyB,CAAA;IACzB,oFAAoF;IACpF,+BAAe,CAAA;AACjB,CAAC,EAZW,YAAY,4BAAZ,YAAY,QAYvB;AAED,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,8CAA2B,CAAA;IAC3B,gCAAa,CAAA;AACf,CAAC,EAJW,eAAe,+BAAf,eAAe,QAI1B;AAED,IAAY,mBAGX;AAHD,WAAY,mBAAmB;IAC7B,wCAAiB,CAAA;IACjB,4CAAqB,CAAA;AACvB,CAAC,EAHW,mBAAmB,mCAAnB,mBAAmB,QAG9B"}
1
+ {"version":3,"file":"geofence.enum.js","sourceRoot":"","sources":["../../src/enums/geofence.enum.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,iBAAiB;AACjB,gDAAgD;;;AAEhD,IAAY,YAcX;AAdD,WAAY,YAAY;IACtB,6BAAa,CAAA;IACb,6CAA6B,CAAA;IAC7B,mCAAmB,CAAA;IACnB,mDAAmC,CAAA;IACnC,uEAAuE;IACvE,iDAAiC,CAAA;IACjC,kIAAkI;IAClI,mDAAmC,CAAA;IACnC,yCAAyB,CAAA;IACzB,oFAAoF;IACpF,+BAAe,CAAA;IACf,mFAAmF;IACnF,yCAAyB,CAAA;AAC3B,CAAC,EAdW,YAAY,4BAAZ,YAAY,QAcvB;AAED,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,8CAA2B,CAAA;IAC3B,gCAAa,CAAA;AACf,CAAC,EAJW,eAAe,+BAAf,eAAe,QAI1B;AAED,IAAY,mBAGX;AAHD,WAAY,mBAAmB;IAC7B,wCAAiB,CAAA;IACjB,4CAAqB,CAAA;AACvB,CAAC,EAHW,mBAAmB,mCAAnB,mBAAmB,QAG9B"}
@@ -26,4 +26,5 @@ export * from "./business-trip-link.enum";
26
26
  export * from "./business-recurring-trip.enum";
27
27
  export * from "./fare-calculation-request.enum";
28
28
  export * from "./tip.enum";
29
+ export * from "./marketing-campaign.enum";
29
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enums/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enums/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,YAAY,CAAC;AAC3B,cAAc,2BAA2B,CAAC"}
@@ -45,4 +45,5 @@ __exportStar(require("./business-trip-link.enum"), exports);
45
45
  __exportStar(require("./business-recurring-trip.enum"), exports);
46
46
  __exportStar(require("./fare-calculation-request.enum"), exports);
47
47
  __exportStar(require("./tip.enum"), exports);
48
+ __exportStar(require("./marketing-campaign.enum"), exports);
48
49
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enums/index.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,yBAAyB;AACzB,gDAAgD;;;;;;;;;;;;;;;;AAEhD,8CAA4B;AAC5B,gDAA8B;AAC9B,iDAA+B;AAC/B,8CAA4B;AAC5B,iDAA+B;AAC/B,iDAA+B;AAC/B,gDAA8B;AAC9B,sDAAoC;AACpC,gDAA8B;AAC9B,kDAAgC;AAChC,iDAA+B;AAC/B,uDAAqC;AACrC,0DAAwC;AACxC,2DAAyC;AACzC,yDAAuC;AACvC,yDAAuC;AACvC,8DAA4C;AAC5C,mEAAiD;AACjD,mDAAiC;AACjC,2DAAyC;AACzC,gDAA8B;AAC9B,qDAAmC;AACnC,+CAA6B;AAC7B,+DAA6C;AAC7C,4DAA0C;AAC1C,iEAA+C;AAC/C,kEAAgD;AAChD,6CAA2B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enums/index.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,yBAAyB;AACzB,gDAAgD;;;;;;;;;;;;;;;;AAEhD,8CAA4B;AAC5B,gDAA8B;AAC9B,iDAA+B;AAC/B,8CAA4B;AAC5B,iDAA+B;AAC/B,iDAA+B;AAC/B,gDAA8B;AAC9B,sDAAoC;AACpC,gDAA8B;AAC9B,kDAAgC;AAChC,iDAA+B;AAC/B,uDAAqC;AACrC,0DAAwC;AACxC,2DAAyC;AACzC,yDAAuC;AACvC,yDAAuC;AACvC,8DAA4C;AAC5C,mEAAiD;AACjD,mDAAiC;AACjC,2DAAyC;AACzC,gDAA8B;AAC9B,qDAAmC;AACnC,+CAA6B;AAC7B,+DAA6C;AAC7C,4DAA0C;AAC1C,iEAA+C;AAC/C,kEAAgD;AAChD,6CAA2B;AAC3B,4DAA0C"}
@@ -0,0 +1,7 @@
1
+ export declare enum MarketingCampaignStatus {
2
+ DRAFT = "draft",
3
+ SENDING = "sending",
4
+ SENT = "sent",
5
+ FAILED = "failed"
6
+ }
7
+ //# sourceMappingURL=marketing-campaign.enum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing-campaign.enum.d.ts","sourceRoot":"","sources":["../../src/enums/marketing-campaign.enum.ts"],"names":[],"mappings":"AAAA,oBAAY,uBAAuB;IACjC,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,MAAM,WAAW;CAClB"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MarketingCampaignStatus = void 0;
4
+ var MarketingCampaignStatus;
5
+ (function (MarketingCampaignStatus) {
6
+ MarketingCampaignStatus["DRAFT"] = "draft";
7
+ MarketingCampaignStatus["SENDING"] = "sending";
8
+ MarketingCampaignStatus["SENT"] = "sent";
9
+ MarketingCampaignStatus["FAILED"] = "failed";
10
+ })(MarketingCampaignStatus || (exports.MarketingCampaignStatus = MarketingCampaignStatus = {}));
11
+ //# sourceMappingURL=marketing-campaign.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing-campaign.enum.js","sourceRoot":"","sources":["../../src/enums/marketing-campaign.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,uBAKX;AALD,WAAY,uBAAuB;IACjC,0CAAe,CAAA;IACf,8CAAmB,CAAA;IACnB,wCAAa,CAAA;IACb,4CAAiB,CAAA;AACnB,CAAC,EALW,uBAAuB,uCAAvB,uBAAuB,QAKlC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uaxi-shared-entities",
3
- "version": "1.0.231",
3
+ "version": "1.0.233",
4
4
  "description": "Entidades compartidas para microservicios UAXI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -32,6 +32,8 @@ export * from "./package-location.entity";
32
32
  export * from "./address.entity";
33
33
  export * from "./geofence.entity";
34
34
  export * from "./geofence-level.entity";
35
+ export * from "./pickup-zone.entity";
36
+ export * from "./pickup-bay.entity";
35
37
  export * from "./recent_serch.entity";
36
38
  export * from "./camping_coupons.entity";
37
39
  export * from "./coupon.entity";
@@ -73,6 +75,7 @@ export * from "./cronjob-configuration.entity";
73
75
  export * from "./driver-search-expansion-configuration.entity";
74
76
  export * from "./enterprise-otp-phone.entity";
75
77
  export * from "./news-notification.entity";
78
+ export * from "./marketing-campaign.entity";
76
79
  export * from "./semovi-record.entity";
77
80
  export * from "./semovi-hourly-report.entity";
78
81
  export * from "./semovi-operator-report.entity";
@@ -0,0 +1,157 @@
1
+ // =============================================
2
+ // MARKETING CAMPAIGN — Mensajes WhatsApp masivos vía Jaxis
3
+ // =============================================
4
+
5
+ import {
6
+ Column,
7
+ CreatedAt,
8
+ DataType,
9
+ DeletedAt,
10
+ Model,
11
+ Table,
12
+ UpdatedAt,
13
+ } from 'sequelize-typescript';
14
+ import { MarketingCampaignStatus } from '../enums/marketing-campaign.enum';
15
+
16
+ export interface MarketingCampaignAttributes {
17
+ id: string;
18
+ /** Nombre interno opcional para identificar la campaña en admin. */
19
+ name: string | null;
20
+ /** Título del mensaje (text[0] en Jaxis). */
21
+ title: string;
22
+ /** Cuerpo del mensaje (text[1] en Jaxis). */
23
+ body: string;
24
+ imageUrl: string;
25
+ messageType: string;
26
+ template: string;
27
+ destinations: string[];
28
+ status: MarketingCampaignStatus;
29
+ sentAt: Date | null;
30
+ sendResult: Record<string, unknown> | null;
31
+ metadata: Record<string, unknown> | null;
32
+ createdAt: Date;
33
+ updatedAt: Date;
34
+ deletedAt: Date | null;
35
+ }
36
+
37
+ export interface CreateMarketingCampaignData {
38
+ name?: string | null;
39
+ title: string;
40
+ body: string;
41
+ imageUrl: string;
42
+ messageType?: string;
43
+ template?: string;
44
+ destinations: string[];
45
+ status?: MarketingCampaignStatus;
46
+ metadata?: Record<string, unknown> | null;
47
+ }
48
+
49
+ @Table({
50
+ tableName: 'marketing_campaigns',
51
+ timestamps: true,
52
+ paranoid: true,
53
+ indexes: [
54
+ {
55
+ name: 'idx_marketing_campaigns_status',
56
+ fields: ['status'],
57
+ },
58
+ {
59
+ name: 'idx_marketing_campaigns_sent_at',
60
+ fields: ['sentAt'],
61
+ },
62
+ ],
63
+ })
64
+ export class MarketingCampaign extends Model<
65
+ MarketingCampaignAttributes,
66
+ CreateMarketingCampaignData
67
+ > {
68
+ @Column({
69
+ type: DataType.UUID,
70
+ defaultValue: DataType.UUIDV4,
71
+ primaryKey: true,
72
+ })
73
+ declare id: string;
74
+
75
+ @Column({
76
+ type: DataType.STRING(180),
77
+ allowNull: true,
78
+ })
79
+ name: string | null;
80
+
81
+ @Column({
82
+ type: DataType.STRING(500),
83
+ allowNull: false,
84
+ })
85
+ title: string;
86
+
87
+ @Column({
88
+ type: DataType.TEXT,
89
+ allowNull: false,
90
+ })
91
+ body: string;
92
+
93
+ @Column({
94
+ type: DataType.TEXT,
95
+ allowNull: false,
96
+ field: 'image_url',
97
+ })
98
+ imageUrl: string;
99
+
100
+ @Column({
101
+ type: DataType.STRING(10),
102
+ allowNull: false,
103
+ defaultValue: 'mk',
104
+ field: 'message_type',
105
+ })
106
+ messageType: string;
107
+
108
+ @Column({
109
+ type: DataType.STRING(10),
110
+ allowNull: false,
111
+ defaultValue: '01',
112
+ })
113
+ template: string;
114
+
115
+ @Column({
116
+ type: DataType.JSONB,
117
+ allowNull: false,
118
+ defaultValue: [],
119
+ })
120
+ destinations: string[];
121
+
122
+ @Column({
123
+ type: DataType.ENUM(...Object.values(MarketingCampaignStatus)),
124
+ allowNull: false,
125
+ defaultValue: MarketingCampaignStatus.DRAFT,
126
+ })
127
+ status: MarketingCampaignStatus;
128
+
129
+ @Column({
130
+ type: DataType.DATE,
131
+ allowNull: true,
132
+ field: 'sent_at',
133
+ })
134
+ sentAt: Date | null;
135
+
136
+ @Column({
137
+ type: DataType.JSONB,
138
+ allowNull: true,
139
+ field: 'send_result',
140
+ })
141
+ sendResult: Record<string, unknown> | null;
142
+
143
+ @Column({
144
+ type: DataType.JSONB,
145
+ allowNull: true,
146
+ })
147
+ metadata: Record<string, unknown> | null;
148
+
149
+ @CreatedAt
150
+ createdAt: Date;
151
+
152
+ @UpdatedAt
153
+ updatedAt: Date;
154
+
155
+ @DeletedAt
156
+ deletedAt: Date | null;
157
+ }
@@ -0,0 +1,140 @@
1
+ // =============================================
2
+ // PICKUP BAY — Punto de recogida dentro de una PickupZone
3
+ // =============================================
4
+
5
+ import {
6
+ BelongsTo,
7
+ Column,
8
+ DataType,
9
+ CreatedAt,
10
+ DeletedAt,
11
+ ForeignKey,
12
+ Model,
13
+ Table,
14
+ UpdatedAt,
15
+ } from "sequelize-typescript";
16
+ import { PickupZone } from "./pickup-zone.entity";
17
+
18
+ export interface PickupBayAttributes {
19
+ id: string;
20
+ pickupZoneId: string;
21
+ name: string;
22
+ /** Código corto opcional (ej. T1-P3). */
23
+ code: string | null;
24
+ latitude: number;
25
+ longitude: number;
26
+ instructions: string | null;
27
+ sortOrder: number;
28
+ isActive: boolean;
29
+ metadata: Record<string, unknown> | null;
30
+ createdAt: Date;
31
+ updatedAt: Date;
32
+ deletedAt: Date | null;
33
+ }
34
+
35
+ export interface CreatePickupBayData {
36
+ pickupZoneId: string;
37
+ name: string;
38
+ code?: string | null;
39
+ latitude: number;
40
+ longitude: number;
41
+ instructions?: string | null;
42
+ sortOrder?: number;
43
+ isActive?: boolean;
44
+ metadata?: Record<string, unknown> | null;
45
+ }
46
+
47
+ @Table({
48
+ tableName: "pickup_bays",
49
+ timestamps: true,
50
+ paranoid: true,
51
+ indexes: [
52
+ {
53
+ fields: ["pickupZoneId", "sortOrder"],
54
+ name: "pickup_bays_zone_sort_idx",
55
+ },
56
+ {
57
+ fields: ["pickupZoneId", "isActive"],
58
+ name: "pickup_bays_zone_active_idx",
59
+ },
60
+ ],
61
+ })
62
+ export class PickupBay extends Model<PickupBayAttributes, CreatePickupBayData> {
63
+ @Column({
64
+ type: DataType.UUID,
65
+ defaultValue: DataType.UUIDV4,
66
+ primaryKey: true,
67
+ })
68
+ declare id: string;
69
+
70
+ @ForeignKey(() => PickupZone)
71
+ @Column({
72
+ type: DataType.UUID,
73
+ allowNull: false,
74
+ })
75
+ pickupZoneId: string;
76
+
77
+ @BelongsTo(() => PickupZone)
78
+ pickupZone: PickupZone;
79
+
80
+ @Column({
81
+ type: DataType.STRING,
82
+ allowNull: false,
83
+ comment: "Etiqueta visible (ej. Terminal 1 - Puerta 3)",
84
+ })
85
+ name: string;
86
+
87
+ @Column({
88
+ type: DataType.STRING(32),
89
+ allowNull: true,
90
+ })
91
+ code: string | null;
92
+
93
+ @Column({
94
+ type: DataType.DECIMAL(10, 7),
95
+ allowNull: false,
96
+ })
97
+ latitude: number;
98
+
99
+ @Column({
100
+ type: DataType.DECIMAL(10, 7),
101
+ allowNull: false,
102
+ })
103
+ longitude: number;
104
+
105
+ @Column({
106
+ type: DataType.TEXT,
107
+ allowNull: true,
108
+ comment: "Indicaciones para llegar a la bahía",
109
+ })
110
+ instructions: string | null;
111
+
112
+ @Column({
113
+ type: DataType.INTEGER,
114
+ allowNull: false,
115
+ defaultValue: 0,
116
+ })
117
+ sortOrder: number;
118
+
119
+ @Column({
120
+ type: DataType.BOOLEAN,
121
+ allowNull: false,
122
+ defaultValue: true,
123
+ })
124
+ isActive: boolean;
125
+
126
+ @Column({
127
+ type: DataType.JSONB,
128
+ allowNull: true,
129
+ })
130
+ metadata: Record<string, unknown> | null;
131
+
132
+ @CreatedAt
133
+ createdAt: Date;
134
+
135
+ @UpdatedAt
136
+ updatedAt: Date;
137
+
138
+ @DeletedAt
139
+ deletedAt: Date | null;
140
+ }
@@ -0,0 +1,149 @@
1
+ // =============================================
2
+ // PICKUP ZONE — Zona con recogida restringida a bahías
3
+ // =============================================
4
+ // Capa operativa sobre un geofence (polígono en `geofences`, típicamente type pickup_hub).
5
+ // La app consultará si un punto cae en la zona y listará las bahías hijas (`PickupBay`).
6
+ // =============================================
7
+
8
+ import {
9
+ BelongsTo,
10
+ Column,
11
+ DataType,
12
+ CreatedAt,
13
+ DeletedAt,
14
+ ForeignKey,
15
+ HasMany,
16
+ Model,
17
+ Table,
18
+ UpdatedAt,
19
+ } from "sequelize-typescript";
20
+ import { Geofence } from "./geofence.entity";
21
+ import { PickupBay } from "./pickup-bay.entity";
22
+ import { GeofenceApplyOn } from "../enums";
23
+
24
+ export interface PickupZoneAttributes {
25
+ id: string;
26
+ geofenceId: string;
27
+ name: string;
28
+ description: string | null;
29
+ /** Instrucciones visibles para pasajero/conductor (ej. "Selecciona tu bahía"). */
30
+ instructions: string | null;
31
+ isActive: boolean;
32
+ /** Si true, el viaje debe fijar una bahía antes de cotizar/crear. */
33
+ requiresBaySelection: boolean;
34
+ applyOn: GeofenceApplyOn;
35
+ metadata: Record<string, unknown> | null;
36
+ createdAt: Date;
37
+ updatedAt: Date;
38
+ deletedAt: Date | null;
39
+ }
40
+
41
+ export interface CreatePickupZoneData {
42
+ geofenceId: string;
43
+ name: string;
44
+ description?: string | null;
45
+ instructions?: string | null;
46
+ isActive?: boolean;
47
+ requiresBaySelection?: boolean;
48
+ applyOn?: GeofenceApplyOn;
49
+ metadata?: Record<string, unknown> | null;
50
+ }
51
+
52
+ @Table({
53
+ tableName: "pickup_zones",
54
+ timestamps: true,
55
+ paranoid: true,
56
+ indexes: [
57
+ {
58
+ unique: true,
59
+ fields: ["geofenceId"],
60
+ name: "pickup_zones_geofence_id_unique",
61
+ },
62
+ {
63
+ fields: ["isActive"],
64
+ name: "pickup_zones_is_active_idx",
65
+ },
66
+ ],
67
+ })
68
+ export class PickupZone extends Model<
69
+ PickupZoneAttributes,
70
+ CreatePickupZoneData
71
+ > {
72
+ @Column({
73
+ type: DataType.UUID,
74
+ defaultValue: DataType.UUIDV4,
75
+ primaryKey: true,
76
+ })
77
+ declare id: string;
78
+
79
+ @ForeignKey(() => Geofence)
80
+ @Column({
81
+ type: DataType.UUID,
82
+ allowNull: false,
83
+ comment: "Geocerca poligonal que delimita la zona (geofences.id)",
84
+ })
85
+ geofenceId: string;
86
+
87
+ @BelongsTo(() => Geofence)
88
+ geofence: Geofence;
89
+
90
+ @Column({
91
+ type: DataType.STRING,
92
+ allowNull: false,
93
+ comment: "Nombre visible de la zona (puede diferir del geofence.name)",
94
+ })
95
+ name: string;
96
+
97
+ @Column({
98
+ type: DataType.TEXT,
99
+ allowNull: true,
100
+ })
101
+ description: string | null;
102
+
103
+ @Column({
104
+ type: DataType.TEXT,
105
+ allowNull: true,
106
+ })
107
+ instructions: string | null;
108
+
109
+ @Column({
110
+ type: DataType.BOOLEAN,
111
+ allowNull: false,
112
+ defaultValue: true,
113
+ })
114
+ isActive: boolean;
115
+
116
+ @Column({
117
+ type: DataType.BOOLEAN,
118
+ allowNull: false,
119
+ defaultValue: true,
120
+ comment: "Obliga a elegir pickupBayId al solicitar viaje en esta zona",
121
+ })
122
+ requiresBaySelection: boolean;
123
+
124
+ @Column({
125
+ type: DataType.ENUM(...Object.values(GeofenceApplyOn)),
126
+ allowNull: false,
127
+ defaultValue: GeofenceApplyOn.PICKUP,
128
+ field: "apply_on",
129
+ })
130
+ applyOn: GeofenceApplyOn;
131
+
132
+ @Column({
133
+ type: DataType.JSONB,
134
+ allowNull: true,
135
+ })
136
+ metadata: Record<string, unknown> | null;
137
+
138
+ @HasMany(() => PickupBay)
139
+ bays: PickupBay[];
140
+
141
+ @CreatedAt
142
+ createdAt: Date;
143
+
144
+ @UpdatedAt
145
+ updatedAt: Date;
146
+
147
+ @DeletedAt
148
+ deletedAt: Date | null;
149
+ }
@@ -14,6 +14,8 @@ export enum GeofenceType {
14
14
  SURGE_ZONE = "surge_zone",
15
15
  /** Geocercas temporales de evento (conciertos, ferias). Factor GE separado de W. */
16
16
  EVENT = "event",
17
+ /** Zona con recogida en bahías fijas (aeropuertos, campus). Ver `pickup_zones`. */
18
+ PICKUP_HUB = "pickup_hub",
17
19
  }
18
20
 
19
21
  export enum GeofenceApplyOn {
@@ -30,3 +30,4 @@ export * from "./business-trip-link.enum";
30
30
  export * from "./business-recurring-trip.enum";
31
31
  export * from "./fare-calculation-request.enum";
32
32
  export * from "./tip.enum";
33
+ export * from "./marketing-campaign.enum";
@@ -0,0 +1,6 @@
1
+ export enum MarketingCampaignStatus {
2
+ DRAFT = 'draft',
3
+ SENDING = 'sending',
4
+ SENT = 'sent',
5
+ FAILED = 'failed',
6
+ }