whitelabel-db 1.2.8 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -26,6 +26,9 @@ export { Collection, CollectionStatus } from './models/Collection';
26
26
  export { CollectionItem, CollectionType } from './models/CollectionItem';
27
27
  export { CollectionItemCustomField } from './models/CollectionItemCustomField';
28
28
  export { DeletedHotel } from './models/DeletedHotel';
29
+ export { LoyaltyProgram } from './models/LoyaltyProgram';
30
+ export { LoyaltyProgramTier } from './models/LoyaltyProgramTier';
31
+ export { BookingLoyaltyRecord } from './models/BookingLoyaltyRecord';
29
32
  export { LiteApiClient, HotelsRequest, AvailabilityResult, FullRateAvailabilityResult, RoomType, Rate, PrebookRateRequest, PrebookRate, CheckoutRequest, BookingInfo, CancelBooking, } from './libs/liteapi';
30
33
  export { LiteApiClientV3, HotelsRequestV3, AvailabilityResultV3, FullRateAvailabilityResultV3, RoomTypeV3, RateV3, PrebookRateRequestV3, PrebookRateV3, CheckoutRequestV3, BookingInfoV3, CancelBookingV3, BookedRoomV3, OccupancyV3, GuestV3, GuestBookingV3, PromoCodeRequest, PromoCodeResponse, EsimplyPackage, Addon, AddonResponse, GetHotelRequestV3, HotelDataV3, HotelImageV3, CheckinCheckoutTimesV3, LocationV3, FacilityV3, RoomV3, BedTypeV3, RoomAmenityV3, RoomPhotoV3, PolicyV3, AccessibilityV3, AccessibilityAttributesV3, AccessibilityDisabilitiesV3, AccessibilityDisabilityScoresV3, SentimentAnalysisV3, SentimentCategoryV3, SemanticSearchRequestV3, SemanticSearchHotelV3, ConversationalHotelRequestV3, ConversationalHotelResponseV3, } from './libs/liteapiv3';
31
34
  export { LiteApiUser, LiteApiUserRequest } from './libs/liteapiuser';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LiteApiUser = exports.LiteApiClientV3 = exports.LiteApiClient = exports.DeletedHotel = exports.CollectionItemCustomField = exports.CollectionType = exports.CollectionItem = exports.CollectionStatus = exports.Collection = exports.Creator = exports.AmenityTranslation = exports.RoomAmenity = exports.Amenity = exports.FacilityTranslation = exports.HotelFacility = exports.Facility = exports.AnalyticsSummary = exports.HotelRate = exports.Feedback = exports.Referral = exports.HotelAccessibility = exports.Guest = exports.HotelTranslation = exports.Role = exports.Booking = exports.Project = exports.User = exports.Hotel = exports.Country = exports.City = exports.Agency = exports.runMigrations = exports.connect = void 0;
3
+ exports.LiteApiUser = exports.LiteApiClientV3 = exports.LiteApiClient = exports.BookingLoyaltyRecord = exports.LoyaltyProgramTier = exports.LoyaltyProgram = exports.DeletedHotel = exports.CollectionItemCustomField = exports.CollectionType = exports.CollectionItem = exports.CollectionStatus = exports.Collection = exports.Creator = exports.AmenityTranslation = exports.RoomAmenity = exports.Amenity = exports.FacilityTranslation = exports.HotelFacility = exports.Facility = exports.AnalyticsSummary = exports.HotelRate = exports.Feedback = exports.Referral = exports.HotelAccessibility = exports.Guest = exports.HotelTranslation = exports.Role = exports.Booking = exports.Project = exports.User = exports.Hotel = exports.Country = exports.City = exports.Agency = exports.runMigrations = exports.connect = void 0;
4
4
  var database_1 = require("./libs/database");
5
5
  Object.defineProperty(exports, "connect", { enumerable: true, get: function () { return database_1.connect; } });
6
6
  var migration_1 = require("./libs/migration");
@@ -61,6 +61,13 @@ var CollectionItemCustomField_1 = require("./models/CollectionItemCustomField");
61
61
  Object.defineProperty(exports, "CollectionItemCustomField", { enumerable: true, get: function () { return CollectionItemCustomField_1.CollectionItemCustomField; } });
62
62
  var DeletedHotel_1 = require("./models/DeletedHotel");
63
63
  Object.defineProperty(exports, "DeletedHotel", { enumerable: true, get: function () { return DeletedHotel_1.DeletedHotel; } });
64
+ // Loyalty Program models
65
+ var LoyaltyProgram_1 = require("./models/LoyaltyProgram");
66
+ Object.defineProperty(exports, "LoyaltyProgram", { enumerable: true, get: function () { return LoyaltyProgram_1.LoyaltyProgram; } });
67
+ var LoyaltyProgramTier_1 = require("./models/LoyaltyProgramTier");
68
+ Object.defineProperty(exports, "LoyaltyProgramTier", { enumerable: true, get: function () { return LoyaltyProgramTier_1.LoyaltyProgramTier; } });
69
+ var BookingLoyaltyRecord_1 = require("./models/BookingLoyaltyRecord");
70
+ Object.defineProperty(exports, "BookingLoyaltyRecord", { enumerable: true, get: function () { return BookingLoyaltyRecord_1.BookingLoyaltyRecord; } });
64
71
  var liteapi_1 = require("./libs/liteapi");
65
72
  Object.defineProperty(exports, "LiteApiClient", { enumerable: true, get: function () { return liteapi_1.LiteApiClient; } });
66
73
  var liteapiv3_1 = require("./libs/liteapiv3");
@@ -37,6 +37,9 @@ const Collection_1 = require("../models/Collection");
37
37
  const CollectionItem_1 = require("../models/CollectionItem");
38
38
  const CollectionItemCustomField_1 = require("../models/CollectionItemCustomField");
39
39
  const DeletedHotel_1 = require("../models/DeletedHotel");
40
+ const LoyaltyProgram_1 = require("../models/LoyaltyProgram");
41
+ const LoyaltyProgramTier_1 = require("../models/LoyaltyProgramTier");
42
+ const BookingLoyaltyRecord_1 = require("../models/BookingLoyaltyRecord");
40
43
  const migration_1 = require("./migration");
41
44
  const connect = (connectionDetails) => __awaiter(void 0, void 0, void 0, function* () {
42
45
  const connection = new sequelize_typescript_1.Sequelize({
@@ -73,6 +76,9 @@ const connect = (connectionDetails) => __awaiter(void 0, void 0, void 0, functio
73
76
  CollectionItem_1.CollectionItem,
74
77
  CollectionItemCustomField_1.CollectionItemCustomField,
75
78
  DeletedHotel_1.DeletedHotel,
79
+ LoyaltyProgram_1.LoyaltyProgram,
80
+ LoyaltyProgramTier_1.LoyaltyProgramTier,
81
+ BookingLoyaltyRecord_1.BookingLoyaltyRecord,
76
82
  ],
77
83
  });
78
84
  try {
@@ -0,0 +1,3 @@
1
+ import { QueryInterface } from 'sequelize';
2
+ export declare const up: (queryInterface: QueryInterface) => Promise<void>;
3
+ export declare const down: (queryInterface: QueryInterface) => Promise<void>;
@@ -0,0 +1,70 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.down = exports.up = void 0;
13
+ const sequelize_1 = require("sequelize");
14
+ const up = (queryInterface) => __awaiter(void 0, void 0, void 0, function* () {
15
+ try {
16
+ // Change pointsEarned from INTEGER to DECIMAL(12, 2)
17
+ yield queryInterface.changeColumn('booking_loyalty_record', 'pointsEarned', {
18
+ type: sequelize_1.DataTypes.DECIMAL(12, 2),
19
+ allowNull: true,
20
+ });
21
+ // Change pointsBurned from INTEGER to DECIMAL(12, 2)
22
+ yield queryInterface.changeColumn('booking_loyalty_record', 'pointsBurned', {
23
+ type: sequelize_1.DataTypes.DECIMAL(12, 2),
24
+ allowNull: false,
25
+ defaultValue: 0,
26
+ });
27
+ // Add tierId column
28
+ yield queryInterface.addColumn('booking_loyalty_record', 'tierId', {
29
+ type: sequelize_1.DataTypes.UUID,
30
+ allowNull: true,
31
+ references: {
32
+ model: 'loyalty_program_tier',
33
+ key: 'id',
34
+ },
35
+ });
36
+ // Add index on tierId
37
+ yield queryInterface.addIndex('booking_loyalty_record', ['tierId'], {
38
+ name: 'idx_booking_loyalty_record_tier_id',
39
+ });
40
+ console.log('booking_loyalty_record updated successfully.');
41
+ }
42
+ catch (error) {
43
+ console.error('Error in migration:', error.message);
44
+ }
45
+ });
46
+ exports.up = up;
47
+ const down = (queryInterface) => __awaiter(void 0, void 0, void 0, function* () {
48
+ try {
49
+ // Remove index on tierId
50
+ yield queryInterface.removeIndex('booking_loyalty_record', 'idx_booking_loyalty_record_tier_id');
51
+ // Remove tierId column
52
+ yield queryInterface.removeColumn('booking_loyalty_record', 'tierId');
53
+ // Revert pointsBurned to INTEGER
54
+ yield queryInterface.changeColumn('booking_loyalty_record', 'pointsBurned', {
55
+ type: sequelize_1.DataTypes.INTEGER,
56
+ allowNull: false,
57
+ defaultValue: 0,
58
+ });
59
+ // Revert pointsEarned to INTEGER
60
+ yield queryInterface.changeColumn('booking_loyalty_record', 'pointsEarned', {
61
+ type: sequelize_1.DataTypes.INTEGER,
62
+ allowNull: true,
63
+ });
64
+ console.log('booking_loyalty_record rollback successful.');
65
+ }
66
+ catch (error) {
67
+ console.error('Error in rollback:', error.message);
68
+ }
69
+ });
70
+ exports.down = down;
@@ -0,0 +1,23 @@
1
+ import { Model } from 'sequelize-typescript';
2
+ import { Booking } from './Booking';
3
+ import { LoyaltyProgram } from './LoyaltyProgram';
4
+ import { LoyaltyProgramTier, EarnRule } from './LoyaltyProgramTier';
5
+ export declare class BookingLoyaltyRecord extends Model<Partial<BookingLoyaltyRecord>> {
6
+ id: string;
7
+ bookingId: string;
8
+ booking?: Booking;
9
+ loyaltyProgramId: string;
10
+ loyaltyProgram?: LoyaltyProgram;
11
+ tierId?: string;
12
+ tier?: LoyaltyProgramTier;
13
+ membershipIdentifier?: string;
14
+ tierAtBooking?: string;
15
+ pointsEarned?: number;
16
+ pointsBurned: number;
17
+ earnRuleApplied?: EarnRule;
18
+ calculationMethod?: 'partner' | 'wl';
19
+ earnMultiplier?: number;
20
+ partnerResponse?: object;
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ }
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.BookingLoyaltyRecord = void 0;
13
+ const sequelize_typescript_1 = require("sequelize-typescript");
14
+ const Booking_1 = require("./Booking");
15
+ const LoyaltyProgram_1 = require("./LoyaltyProgram");
16
+ const LoyaltyProgramTier_1 = require("./LoyaltyProgramTier");
17
+ let BookingLoyaltyRecord = class BookingLoyaltyRecord extends sequelize_typescript_1.Model {
18
+ };
19
+ exports.BookingLoyaltyRecord = BookingLoyaltyRecord;
20
+ __decorate([
21
+ (0, sequelize_typescript_1.IsUUID)(4),
22
+ sequelize_typescript_1.PrimaryKey,
23
+ (0, sequelize_typescript_1.Column)({
24
+ type: sequelize_typescript_1.DataType.UUID,
25
+ defaultValue: sequelize_typescript_1.DataType.UUIDV4,
26
+ }),
27
+ __metadata("design:type", String)
28
+ ], BookingLoyaltyRecord.prototype, "id", void 0);
29
+ __decorate([
30
+ (0, sequelize_typescript_1.ForeignKey)(() => Booking_1.Booking),
31
+ sequelize_typescript_1.Index,
32
+ (0, sequelize_typescript_1.Column)({
33
+ type: sequelize_typescript_1.DataType.UUID,
34
+ allowNull: false,
35
+ comment: 'Foreign key to booking table',
36
+ }),
37
+ __metadata("design:type", String)
38
+ ], BookingLoyaltyRecord.prototype, "bookingId", void 0);
39
+ __decorate([
40
+ (0, sequelize_typescript_1.BelongsTo)(() => Booking_1.Booking),
41
+ __metadata("design:type", Booking_1.Booking)
42
+ ], BookingLoyaltyRecord.prototype, "booking", void 0);
43
+ __decorate([
44
+ (0, sequelize_typescript_1.ForeignKey)(() => LoyaltyProgram_1.LoyaltyProgram),
45
+ sequelize_typescript_1.Index,
46
+ (0, sequelize_typescript_1.Column)({
47
+ type: sequelize_typescript_1.DataType.UUID,
48
+ allowNull: false,
49
+ }),
50
+ __metadata("design:type", String)
51
+ ], BookingLoyaltyRecord.prototype, "loyaltyProgramId", void 0);
52
+ __decorate([
53
+ (0, sequelize_typescript_1.BelongsTo)(() => LoyaltyProgram_1.LoyaltyProgram),
54
+ __metadata("design:type", LoyaltyProgram_1.LoyaltyProgram)
55
+ ], BookingLoyaltyRecord.prototype, "loyaltyProgram", void 0);
56
+ __decorate([
57
+ (0, sequelize_typescript_1.ForeignKey)(() => LoyaltyProgramTier_1.LoyaltyProgramTier),
58
+ sequelize_typescript_1.Index,
59
+ (0, sequelize_typescript_1.Column)({
60
+ type: sequelize_typescript_1.DataType.UUID,
61
+ allowNull: true,
62
+ comment: 'Foreign key to loyalty program tier',
63
+ }),
64
+ __metadata("design:type", String)
65
+ ], BookingLoyaltyRecord.prototype, "tierId", void 0);
66
+ __decorate([
67
+ (0, sequelize_typescript_1.BelongsTo)(() => LoyaltyProgramTier_1.LoyaltyProgramTier),
68
+ __metadata("design:type", LoyaltyProgramTier_1.LoyaltyProgramTier)
69
+ ], BookingLoyaltyRecord.prototype, "tier", void 0);
70
+ __decorate([
71
+ (0, sequelize_typescript_1.Column)({
72
+ type: sequelize_typescript_1.DataType.STRING,
73
+ allowNull: true,
74
+ comment: 'Membership number supplied at booking',
75
+ }),
76
+ __metadata("design:type", String)
77
+ ], BookingLoyaltyRecord.prototype, "membershipIdentifier", void 0);
78
+ __decorate([
79
+ (0, sequelize_typescript_1.Column)({
80
+ type: sequelize_typescript_1.DataType.STRING,
81
+ allowNull: true,
82
+ comment: 'Tier returned by partner at booking (optional)',
83
+ }),
84
+ __metadata("design:type", String)
85
+ ], BookingLoyaltyRecord.prototype, "tierAtBooking", void 0);
86
+ __decorate([
87
+ (0, sequelize_typescript_1.Column)({
88
+ type: sequelize_typescript_1.DataType.DECIMAL(12, 2),
89
+ allowNull: true,
90
+ comment: 'Final points awarded (from partner or WL calc)',
91
+ }),
92
+ __metadata("design:type", Number)
93
+ ], BookingLoyaltyRecord.prototype, "pointsEarned", void 0);
94
+ __decorate([
95
+ (0, sequelize_typescript_1.Column)({
96
+ type: sequelize_typescript_1.DataType.DECIMAL(12, 2),
97
+ allowNull: false,
98
+ defaultValue: 0,
99
+ comment: 'Future: points burned for this booking',
100
+ }),
101
+ __metadata("design:type", Number)
102
+ ], BookingLoyaltyRecord.prototype, "pointsBurned", void 0);
103
+ __decorate([
104
+ (0, sequelize_typescript_1.Column)({
105
+ type: sequelize_typescript_1.DataType.JSONB,
106
+ allowNull: true,
107
+ comment: 'Snapshot of the earnRule used (includes tier overrides)',
108
+ }),
109
+ __metadata("design:type", Object)
110
+ ], BookingLoyaltyRecord.prototype, "earnRuleApplied", void 0);
111
+ __decorate([
112
+ (0, sequelize_typescript_1.Column)({
113
+ type: sequelize_typescript_1.DataType.STRING,
114
+ allowNull: true,
115
+ comment: 'Indicates whether pointsEarned came from "partner" or "wl"',
116
+ }),
117
+ __metadata("design:type", String)
118
+ ], BookingLoyaltyRecord.prototype, "calculationMethod", void 0);
119
+ __decorate([
120
+ (0, sequelize_typescript_1.Column)({
121
+ type: sequelize_typescript_1.DataType.DECIMAL(10, 4),
122
+ allowNull: true,
123
+ comment: 'Legacy multiplier (kept for backward compat)',
124
+ }),
125
+ __metadata("design:type", Number)
126
+ ], BookingLoyaltyRecord.prototype, "earnMultiplier", void 0);
127
+ __decorate([
128
+ (0, sequelize_typescript_1.Column)({
129
+ type: sequelize_typescript_1.DataType.JSONB,
130
+ allowNull: true,
131
+ comment: 'Raw partner API response',
132
+ }),
133
+ __metadata("design:type", Object)
134
+ ], BookingLoyaltyRecord.prototype, "partnerResponse", void 0);
135
+ __decorate([
136
+ (0, sequelize_typescript_1.Column)({
137
+ type: sequelize_typescript_1.DataType.DATE,
138
+ allowNull: false,
139
+ defaultValue: sequelize_typescript_1.DataType.NOW,
140
+ }),
141
+ __metadata("design:type", Date)
142
+ ], BookingLoyaltyRecord.prototype, "createdAt", void 0);
143
+ __decorate([
144
+ (0, sequelize_typescript_1.Column)({
145
+ type: sequelize_typescript_1.DataType.DATE,
146
+ allowNull: false,
147
+ defaultValue: sequelize_typescript_1.DataType.NOW,
148
+ }),
149
+ __metadata("design:type", Date)
150
+ ], BookingLoyaltyRecord.prototype, "updatedAt", void 0);
151
+ exports.BookingLoyaltyRecord = BookingLoyaltyRecord = __decorate([
152
+ (0, sequelize_typescript_1.Table)({
153
+ tableName: 'booking_loyalty_record',
154
+ indexes: [
155
+ {
156
+ fields: ['bookingId'],
157
+ name: 'idx_booking_loyalty_record_booking_id',
158
+ },
159
+ {
160
+ fields: ['loyaltyProgramId'],
161
+ name: 'idx_booking_loyalty_record_program_id',
162
+ },
163
+ {
164
+ fields: ['tierId'],
165
+ name: 'idx_booking_loyalty_record_tier_id',
166
+ },
167
+ ],
168
+ })
169
+ ], BookingLoyaltyRecord);
@@ -0,0 +1,23 @@
1
+ import { Model } from 'sequelize-typescript';
2
+ import { Project } from './Project';
3
+ import { LoyaltyProgramTier } from './LoyaltyProgramTier';
4
+ import { BookingLoyaltyRecord } from './BookingLoyaltyRecord';
5
+ export declare class LoyaltyProgram extends Model<Partial<LoyaltyProgram>> {
6
+ id: string;
7
+ projectId: string;
8
+ project?: Project;
9
+ name: string;
10
+ rewardType?: string;
11
+ validationMethod?: string;
12
+ minTransactionValue?: number;
13
+ rewardValueCurrency?: number;
14
+ rewardCurrency?: string;
15
+ rewardValuePoints?: number;
16
+ pointsAccrualTiming?: string;
17
+ settings?: object;
18
+ appearance?: object;
19
+ tiers?: LoyaltyProgramTier[];
20
+ bookingLoyaltyRecords?: BookingLoyaltyRecord[];
21
+ createdAt: Date;
22
+ updatedAt: Date;
23
+ }
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.LoyaltyProgram = void 0;
13
+ const sequelize_typescript_1 = require("sequelize-typescript");
14
+ const Project_1 = require("./Project");
15
+ const LoyaltyProgramTier_1 = require("./LoyaltyProgramTier");
16
+ const BookingLoyaltyRecord_1 = require("./BookingLoyaltyRecord");
17
+ let LoyaltyProgram = class LoyaltyProgram extends sequelize_typescript_1.Model {
18
+ };
19
+ exports.LoyaltyProgram = LoyaltyProgram;
20
+ __decorate([
21
+ (0, sequelize_typescript_1.IsUUID)(4),
22
+ sequelize_typescript_1.PrimaryKey,
23
+ (0, sequelize_typescript_1.Column)({
24
+ type: sequelize_typescript_1.DataType.UUID,
25
+ defaultValue: sequelize_typescript_1.DataType.UUIDV4,
26
+ }),
27
+ __metadata("design:type", String)
28
+ ], LoyaltyProgram.prototype, "id", void 0);
29
+ __decorate([
30
+ (0, sequelize_typescript_1.ForeignKey)(() => Project_1.Project),
31
+ sequelize_typescript_1.Index,
32
+ (0, sequelize_typescript_1.Column)({
33
+ type: sequelize_typescript_1.DataType.UUID,
34
+ allowNull: false,
35
+ }),
36
+ __metadata("design:type", String)
37
+ ], LoyaltyProgram.prototype, "projectId", void 0);
38
+ __decorate([
39
+ (0, sequelize_typescript_1.BelongsTo)(() => Project_1.Project),
40
+ __metadata("design:type", Project_1.Project)
41
+ ], LoyaltyProgram.prototype, "project", void 0);
42
+ __decorate([
43
+ (0, sequelize_typescript_1.Column)({
44
+ type: sequelize_typescript_1.DataType.STRING,
45
+ allowNull: false,
46
+ }),
47
+ __metadata("design:type", String)
48
+ ], LoyaltyProgram.prototype, "name", void 0);
49
+ __decorate([
50
+ (0, sequelize_typescript_1.Column)({
51
+ type: sequelize_typescript_1.DataType.STRING,
52
+ allowNull: true,
53
+ }),
54
+ __metadata("design:type", String)
55
+ ], LoyaltyProgram.prototype, "rewardType", void 0);
56
+ __decorate([
57
+ (0, sequelize_typescript_1.Column)({
58
+ type: sequelize_typescript_1.DataType.STRING,
59
+ allowNull: true,
60
+ }),
61
+ __metadata("design:type", String)
62
+ ], LoyaltyProgram.prototype, "validationMethod", void 0);
63
+ __decorate([
64
+ (0, sequelize_typescript_1.Column)({
65
+ type: sequelize_typescript_1.DataType.DECIMAL(20, 2),
66
+ allowNull: true,
67
+ }),
68
+ __metadata("design:type", Number)
69
+ ], LoyaltyProgram.prototype, "minTransactionValue", void 0);
70
+ __decorate([
71
+ (0, sequelize_typescript_1.Column)({
72
+ type: sequelize_typescript_1.DataType.DECIMAL(20, 2),
73
+ allowNull: true,
74
+ comment: 'Program-level currency unit per point',
75
+ }),
76
+ __metadata("design:type", Number)
77
+ ], LoyaltyProgram.prototype, "rewardValueCurrency", void 0);
78
+ __decorate([
79
+ (0, sequelize_typescript_1.Column)({
80
+ type: sequelize_typescript_1.DataType.STRING,
81
+ allowNull: true,
82
+ }),
83
+ __metadata("design:type", String)
84
+ ], LoyaltyProgram.prototype, "rewardCurrency", void 0);
85
+ __decorate([
86
+ (0, sequelize_typescript_1.Column)({
87
+ type: sequelize_typescript_1.DataType.INTEGER,
88
+ allowNull: true,
89
+ comment: 'Program-level points per unit',
90
+ }),
91
+ __metadata("design:type", Number)
92
+ ], LoyaltyProgram.prototype, "rewardValuePoints", void 0);
93
+ __decorate([
94
+ (0, sequelize_typescript_1.Column)({
95
+ type: sequelize_typescript_1.DataType.STRING,
96
+ allowNull: true,
97
+ }),
98
+ __metadata("design:type", String)
99
+ ], LoyaltyProgram.prototype, "pointsAccrualTiming", void 0);
100
+ __decorate([
101
+ (0, sequelize_typescript_1.Column)({
102
+ type: sequelize_typescript_1.DataType.JSONB,
103
+ allowNull: true,
104
+ }),
105
+ __metadata("design:type", Object)
106
+ ], LoyaltyProgram.prototype, "settings", 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
+ ], LoyaltyProgram.prototype, "appearance", void 0);
114
+ __decorate([
115
+ (0, sequelize_typescript_1.HasMany)(() => LoyaltyProgramTier_1.LoyaltyProgramTier),
116
+ __metadata("design:type", Array)
117
+ ], LoyaltyProgram.prototype, "tiers", void 0);
118
+ __decorate([
119
+ (0, sequelize_typescript_1.HasMany)(() => BookingLoyaltyRecord_1.BookingLoyaltyRecord),
120
+ __metadata("design:type", Array)
121
+ ], LoyaltyProgram.prototype, "bookingLoyaltyRecords", void 0);
122
+ __decorate([
123
+ (0, sequelize_typescript_1.Column)({
124
+ type: sequelize_typescript_1.DataType.DATE,
125
+ allowNull: false,
126
+ defaultValue: sequelize_typescript_1.DataType.NOW,
127
+ }),
128
+ __metadata("design:type", Date)
129
+ ], LoyaltyProgram.prototype, "createdAt", void 0);
130
+ __decorate([
131
+ (0, sequelize_typescript_1.Column)({
132
+ type: sequelize_typescript_1.DataType.DATE,
133
+ allowNull: false,
134
+ defaultValue: sequelize_typescript_1.DataType.NOW,
135
+ }),
136
+ __metadata("design:type", Date)
137
+ ], LoyaltyProgram.prototype, "updatedAt", void 0);
138
+ exports.LoyaltyProgram = LoyaltyProgram = __decorate([
139
+ (0, sequelize_typescript_1.Table)({
140
+ tableName: 'loyalty_program',
141
+ })
142
+ ], LoyaltyProgram);
@@ -0,0 +1,26 @@
1
+ import { Model } from 'sequelize-typescript';
2
+ import { LoyaltyProgram } from './LoyaltyProgram';
3
+ export interface EarnRule {
4
+ type: 'multiplier' | 'static' | 'additive' | 'combined' | 'tierValueOverride';
5
+ multiplier?: number;
6
+ staticPoints?: number;
7
+ additivePoints?: number;
8
+ tierRewardValueCurrency?: number;
9
+ tierRewardValuePoints?: number;
10
+ }
11
+ export declare class LoyaltyProgramTier extends Model<Partial<LoyaltyProgramTier>> {
12
+ id: string;
13
+ programId: string;
14
+ program?: LoyaltyProgram;
15
+ name: string;
16
+ description?: string;
17
+ pointsRequired?: number;
18
+ nightsStayedRequired?: number;
19
+ bookingsCompletedRequired?: number;
20
+ earnRule?: EarnRule;
21
+ icon?: string;
22
+ color?: string;
23
+ displayOrder: number;
24
+ createdAt: Date;
25
+ updatedAt: Date;
26
+ }
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.LoyaltyProgramTier = void 0;
13
+ const sequelize_typescript_1 = require("sequelize-typescript");
14
+ const LoyaltyProgram_1 = require("./LoyaltyProgram");
15
+ let LoyaltyProgramTier = class LoyaltyProgramTier extends sequelize_typescript_1.Model {
16
+ };
17
+ exports.LoyaltyProgramTier = LoyaltyProgramTier;
18
+ __decorate([
19
+ (0, sequelize_typescript_1.IsUUID)(4),
20
+ sequelize_typescript_1.PrimaryKey,
21
+ (0, sequelize_typescript_1.Column)({
22
+ type: sequelize_typescript_1.DataType.UUID,
23
+ defaultValue: sequelize_typescript_1.DataType.UUIDV4,
24
+ }),
25
+ __metadata("design:type", String)
26
+ ], LoyaltyProgramTier.prototype, "id", void 0);
27
+ __decorate([
28
+ (0, sequelize_typescript_1.ForeignKey)(() => LoyaltyProgram_1.LoyaltyProgram),
29
+ sequelize_typescript_1.Index,
30
+ (0, sequelize_typescript_1.Column)({
31
+ type: sequelize_typescript_1.DataType.UUID,
32
+ allowNull: false,
33
+ }),
34
+ __metadata("design:type", String)
35
+ ], LoyaltyProgramTier.prototype, "programId", void 0);
36
+ __decorate([
37
+ (0, sequelize_typescript_1.BelongsTo)(() => LoyaltyProgram_1.LoyaltyProgram),
38
+ __metadata("design:type", LoyaltyProgram_1.LoyaltyProgram)
39
+ ], LoyaltyProgramTier.prototype, "program", void 0);
40
+ __decorate([
41
+ (0, sequelize_typescript_1.Column)({
42
+ type: sequelize_typescript_1.DataType.STRING,
43
+ allowNull: false,
44
+ }),
45
+ __metadata("design:type", String)
46
+ ], LoyaltyProgramTier.prototype, "name", void 0);
47
+ __decorate([
48
+ (0, sequelize_typescript_1.Column)({
49
+ type: sequelize_typescript_1.DataType.TEXT,
50
+ allowNull: true,
51
+ }),
52
+ __metadata("design:type", String)
53
+ ], LoyaltyProgramTier.prototype, "description", void 0);
54
+ __decorate([
55
+ (0, sequelize_typescript_1.Column)({
56
+ type: sequelize_typescript_1.DataType.INTEGER,
57
+ allowNull: true,
58
+ comment: 'Display-only qualification rule',
59
+ }),
60
+ __metadata("design:type", Number)
61
+ ], LoyaltyProgramTier.prototype, "pointsRequired", void 0);
62
+ __decorate([
63
+ (0, sequelize_typescript_1.Column)({
64
+ type: sequelize_typescript_1.DataType.INTEGER,
65
+ allowNull: true,
66
+ comment: 'Display-only qualification rule',
67
+ }),
68
+ __metadata("design:type", Number)
69
+ ], LoyaltyProgramTier.prototype, "nightsStayedRequired", void 0);
70
+ __decorate([
71
+ (0, sequelize_typescript_1.Column)({
72
+ type: sequelize_typescript_1.DataType.INTEGER,
73
+ allowNull: true,
74
+ comment: 'Display-only qualification rule',
75
+ }),
76
+ __metadata("design:type", Number)
77
+ ], LoyaltyProgramTier.prototype, "bookingsCompletedRequired", void 0);
78
+ __decorate([
79
+ (0, sequelize_typescript_1.Column)({
80
+ type: sequelize_typescript_1.DataType.JSONB,
81
+ allowNull: true,
82
+ comment: 'Tier-level earn rules with optional overrides (type: multiplier|static|additive|combined|tierValueOverride)',
83
+ }),
84
+ __metadata("design:type", Object)
85
+ ], LoyaltyProgramTier.prototype, "earnRule", void 0);
86
+ __decorate([
87
+ (0, sequelize_typescript_1.Column)({
88
+ type: sequelize_typescript_1.DataType.STRING,
89
+ allowNull: true,
90
+ }),
91
+ __metadata("design:type", String)
92
+ ], LoyaltyProgramTier.prototype, "icon", void 0);
93
+ __decorate([
94
+ (0, sequelize_typescript_1.Column)({
95
+ type: sequelize_typescript_1.DataType.STRING,
96
+ allowNull: true,
97
+ }),
98
+ __metadata("design:type", String)
99
+ ], LoyaltyProgramTier.prototype, "color", void 0);
100
+ __decorate([
101
+ (0, sequelize_typescript_1.Column)({
102
+ type: sequelize_typescript_1.DataType.INTEGER,
103
+ allowNull: false,
104
+ defaultValue: 0,
105
+ }),
106
+ __metadata("design:type", Number)
107
+ ], LoyaltyProgramTier.prototype, "displayOrder", void 0);
108
+ __decorate([
109
+ (0, sequelize_typescript_1.Column)({
110
+ type: sequelize_typescript_1.DataType.DATE,
111
+ allowNull: false,
112
+ defaultValue: sequelize_typescript_1.DataType.NOW,
113
+ }),
114
+ __metadata("design:type", Date)
115
+ ], LoyaltyProgramTier.prototype, "createdAt", void 0);
116
+ __decorate([
117
+ (0, sequelize_typescript_1.Column)({
118
+ type: sequelize_typescript_1.DataType.DATE,
119
+ allowNull: false,
120
+ defaultValue: sequelize_typescript_1.DataType.NOW,
121
+ }),
122
+ __metadata("design:type", Date)
123
+ ], LoyaltyProgramTier.prototype, "updatedAt", void 0);
124
+ exports.LoyaltyProgramTier = LoyaltyProgramTier = __decorate([
125
+ (0, sequelize_typescript_1.Table)({
126
+ tableName: 'loyalty_program_tier',
127
+ indexes: [
128
+ {
129
+ fields: ['programId', 'displayOrder'],
130
+ name: 'idx_loyalty_program_tier_program_display_order',
131
+ },
132
+ ],
133
+ })
134
+ ], LoyaltyProgramTier);
@@ -5,6 +5,7 @@ import { LiteApiClientV3 } from '../libs/liteapiv3';
5
5
  import { Booking } from './Booking';
6
6
  import { Creator } from './Creator';
7
7
  import { Collection } from './Collection';
8
+ import { LoyaltyProgram } from './LoyaltyProgram';
8
9
  export declare class Project extends Model<Partial<Project>> {
9
10
  id: string;
10
11
  name: string;
@@ -19,6 +20,7 @@ export declare class Project extends Model<Partial<Project>> {
19
20
  bookings?: Booking[];
20
21
  creators?: Creator[];
21
22
  collections?: Collection[];
23
+ loyaltyPrograms?: LoyaltyProgram[];
22
24
  preferences?: object;
23
25
  appearance?: object;
24
26
  isActive?: boolean;
@@ -21,6 +21,7 @@ const liteapiv3_1 = require("../libs/liteapiv3");
21
21
  const Booking_1 = require("./Booking");
22
22
  const Creator_1 = require("./Creator");
23
23
  const Collection_1 = require("./Collection");
24
+ const LoyaltyProgram_1 = require("./LoyaltyProgram");
24
25
  const clients = {};
25
26
  const clientV3 = {};
26
27
  const defaultLiteApiEnvironment = process.env.COPILOT_ENVIRONMENT_NAME === 'production' ? 'production' : 'dev';
@@ -155,6 +156,10 @@ __decorate([
155
156
  (0, sequelize_typescript_1.HasMany)(() => Collection_1.Collection),
156
157
  __metadata("design:type", Array)
157
158
  ], Project.prototype, "collections", void 0);
159
+ __decorate([
160
+ (0, sequelize_typescript_1.HasMany)(() => LoyaltyProgram_1.LoyaltyProgram),
161
+ __metadata("design:type", Array)
162
+ ], Project.prototype, "loyaltyPrograms", void 0);
158
163
  __decorate([
159
164
  (0, sequelize_typescript_1.Column)({
160
165
  type: sequelize_typescript_1.DataType.JSONB,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whitelabel-db",
3
- "version": "1.2.8",
3
+ "version": "1.3.1",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",