@axova/shared 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/CONFIGURATION_GUIDE.md +1 -0
  2. package/README.md +384 -0
  3. package/SCHEMA_ORGANIZATION.md +209 -0
  4. package/dist/configs/index.d.ts +85 -0
  5. package/dist/configs/index.js +555 -0
  6. package/dist/events/kafka.d.ts +40 -0
  7. package/dist/events/kafka.js +311 -0
  8. package/dist/index.d.ts +13 -0
  9. package/dist/index.js +41 -0
  10. package/dist/interfaces/customer-events.d.ts +85 -0
  11. package/dist/interfaces/customer-events.js +2 -0
  12. package/dist/interfaces/inventory-events.d.ts +453 -0
  13. package/dist/interfaces/inventory-events.js +3 -0
  14. package/dist/interfaces/inventory-types.d.ts +894 -0
  15. package/dist/interfaces/inventory-types.js +3 -0
  16. package/dist/interfaces/order-events.d.ts +320 -0
  17. package/dist/interfaces/order-events.js +3 -0
  18. package/dist/lib/auditLogger.d.ts +162 -0
  19. package/dist/lib/auditLogger.js +626 -0
  20. package/dist/lib/authOrganization.d.ts +24 -0
  21. package/dist/lib/authOrganization.js +110 -0
  22. package/dist/lib/db.d.ts +6 -0
  23. package/dist/lib/db.js +88 -0
  24. package/dist/middleware/serviceAuth.d.ts +60 -0
  25. package/dist/middleware/serviceAuth.js +272 -0
  26. package/dist/middleware/storeOwnership.d.ts +15 -0
  27. package/dist/middleware/storeOwnership.js +156 -0
  28. package/dist/middleware/storeValidationMiddleware.d.ts +44 -0
  29. package/dist/middleware/storeValidationMiddleware.js +180 -0
  30. package/dist/middleware/userAuth.d.ts +27 -0
  31. package/dist/middleware/userAuth.js +218 -0
  32. package/dist/schemas/admin/admin-schema.d.ts +741 -0
  33. package/dist/schemas/admin/admin-schema.js +111 -0
  34. package/dist/schemas/ai-moderation/ai-moderation-schema.d.ts +648 -0
  35. package/dist/schemas/ai-moderation/ai-moderation-schema.js +88 -0
  36. package/dist/schemas/common/common-schemas.d.ts +436 -0
  37. package/dist/schemas/common/common-schemas.js +94 -0
  38. package/dist/schemas/compliance/compliance-schema.d.ts +3388 -0
  39. package/dist/schemas/compliance/compliance-schema.js +472 -0
  40. package/dist/schemas/compliance/kyc-schema.d.ts +2642 -0
  41. package/dist/schemas/compliance/kyc-schema.js +361 -0
  42. package/dist/schemas/customer/customer-schema.d.ts +2727 -0
  43. package/dist/schemas/customer/customer-schema.js +399 -0
  44. package/dist/schemas/index.d.ts +27 -0
  45. package/dist/schemas/index.js +138 -0
  46. package/dist/schemas/inventory/inventory-tables.d.ts +9476 -0
  47. package/dist/schemas/inventory/inventory-tables.js +1470 -0
  48. package/dist/schemas/inventory/lot-tables.d.ts +3281 -0
  49. package/dist/schemas/inventory/lot-tables.js +608 -0
  50. package/dist/schemas/order/order-schema.d.ts +5825 -0
  51. package/dist/schemas/order/order-schema.js +954 -0
  52. package/dist/schemas/product/discount-relations.d.ts +15 -0
  53. package/dist/schemas/product/discount-relations.js +34 -0
  54. package/dist/schemas/product/discount-schema.d.ts +1975 -0
  55. package/dist/schemas/product/discount-schema.js +297 -0
  56. package/dist/schemas/product/product-relations.d.ts +41 -0
  57. package/dist/schemas/product/product-relations.js +133 -0
  58. package/dist/schemas/product/product-schema.d.ts +4544 -0
  59. package/dist/schemas/product/product-schema.js +671 -0
  60. package/dist/schemas/store/store-audit-schema.d.ts +4135 -0
  61. package/dist/schemas/store/store-audit-schema.js +556 -0
  62. package/dist/schemas/store/store-schema.d.ts +3100 -0
  63. package/dist/schemas/store/store-schema.js +381 -0
  64. package/dist/schemas/store/store-settings-schema.d.ts +665 -0
  65. package/dist/schemas/store/store-settings-schema.js +141 -0
  66. package/dist/schemas/types.d.ts +50 -0
  67. package/dist/schemas/types.js +3 -0
  68. package/dist/types/events.d.ts +2396 -0
  69. package/dist/types/events.js +505 -0
  70. package/dist/utils/errorHandler.d.ts +12 -0
  71. package/dist/utils/errorHandler.js +36 -0
  72. package/dist/utils/subdomain.d.ts +6 -0
  73. package/dist/utils/subdomain.js +20 -0
  74. package/nul +8 -0
  75. package/package.json +43 -0
  76. package/src/configs/index.ts +654 -0
  77. package/src/events/kafka.ts +429 -0
  78. package/src/index.ts +26 -0
  79. package/src/interfaces/customer-events.ts +106 -0
  80. package/src/interfaces/inventory-events.ts +545 -0
  81. package/src/interfaces/inventory-types.ts +1004 -0
  82. package/src/interfaces/order-events.ts +381 -0
  83. package/src/lib/auditLogger.ts +1117 -0
  84. package/src/lib/authOrganization.ts +153 -0
  85. package/src/lib/db.ts +64 -0
  86. package/src/middleware/serviceAuth.ts +328 -0
  87. package/src/middleware/storeOwnership.ts +199 -0
  88. package/src/middleware/storeValidationMiddleware.ts +247 -0
  89. package/src/middleware/userAuth.ts +248 -0
  90. package/src/schemas/admin/admin-schema.ts +208 -0
  91. package/src/schemas/ai-moderation/ai-moderation-schema.ts +180 -0
  92. package/src/schemas/common/common-schemas.ts +108 -0
  93. package/src/schemas/compliance/compliance-schema.ts +927 -0
  94. package/src/schemas/compliance/kyc-schema.ts +649 -0
  95. package/src/schemas/customer/customer-schema.ts +576 -0
  96. package/src/schemas/index.ts +189 -0
  97. package/src/schemas/inventory/inventory-tables.ts +1927 -0
  98. package/src/schemas/inventory/lot-tables.ts +799 -0
  99. package/src/schemas/order/order-schema.ts +1400 -0
  100. package/src/schemas/product/discount-relations.ts +44 -0
  101. package/src/schemas/product/discount-schema.ts +464 -0
  102. package/src/schemas/product/product-relations.ts +187 -0
  103. package/src/schemas/product/product-schema.ts +955 -0
  104. package/src/schemas/store/ethiopian_business_api.md.resolved +212 -0
  105. package/src/schemas/store/store-audit-schema.ts +1257 -0
  106. package/src/schemas/store/store-schema.ts +661 -0
  107. package/src/schemas/store/store-settings-schema.ts +231 -0
  108. package/src/schemas/types.ts +67 -0
  109. package/src/types/events.ts +646 -0
  110. package/src/utils/errorHandler.ts +44 -0
  111. package/src/utils/subdomain.ts +19 -0
  112. package/tsconfig.json +21 -0
@@ -0,0 +1,671 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wholesalePricingTiers = exports.productAnalytics = exports.productReviews = exports.productCategories = exports.productImages = exports.productCollections = exports.collections = exports.productVariants = exports.products = exports.salesChannelEnum = exports.variantOptionTypeEnum = exports.discountTypeEnum = exports.collectionTypeEnum = exports.fulfillmentServiceEnum = exports.inventoryPolicyEnum = exports.productTypeEnum = exports.productStatusEnum = void 0;
4
+ const cuid2_1 = require("@paralleldrive/cuid2");
5
+ const pg_core_1 = require("drizzle-orm/pg-core");
6
+ // =====================================================
7
+ // ENUMS
8
+ // =====================================================
9
+ exports.productStatusEnum = (0, pg_core_1.pgEnum)("product_status", [
10
+ "DRAFT",
11
+ "ACTIVE",
12
+ "INACTIVE",
13
+ "ARCHIVED",
14
+ "OUT_OF_STOCK",
15
+ ]);
16
+ exports.productTypeEnum = (0, pg_core_1.pgEnum)("product_type", [
17
+ "PHYSICAL",
18
+ "DIGITAL",
19
+ "SERVICE",
20
+ "SUBSCRIPTION",
21
+ "BUNDLE",
22
+ "WHOLESALE",
23
+ ]);
24
+ exports.inventoryPolicyEnum = (0, pg_core_1.pgEnum)("inventory_policy", [
25
+ "TRACK", // Track inventory
26
+ "CONTINUE", // Continue selling when out of stock
27
+ "DENY", // Stop selling when out of stock
28
+ ]);
29
+ exports.fulfillmentServiceEnum = (0, pg_core_1.pgEnum)("fulfillment_service", [
30
+ "MANUAL",
31
+ "AUTOMATED",
32
+ "THIRD_PARTY",
33
+ "DROPSHIPPING",
34
+ ]);
35
+ exports.collectionTypeEnum = (0, pg_core_1.pgEnum)("collection_type", [
36
+ "MANUAL", // Manually curated
37
+ "AUTOMATIC", // Rule-based automatic
38
+ "SMART", // AI-powered smart collections
39
+ ]);
40
+ exports.discountTypeEnum = (0, pg_core_1.pgEnum)("discount_type", [
41
+ "PERCENTAGE",
42
+ "FIXED_AMOUNT",
43
+ "FREE_SHIPPING",
44
+ "BOGO", // Buy one get one
45
+ ]);
46
+ exports.variantOptionTypeEnum = (0, pg_core_1.pgEnum)("variant_option_type", [
47
+ "COLOR",
48
+ "SIZE",
49
+ "MATERIAL",
50
+ "STYLE",
51
+ "WEIGHT",
52
+ "VOLUME",
53
+ "CUSTOM",
54
+ ]);
55
+ exports.salesChannelEnum = (0, pg_core_1.pgEnum)("sales_channel", [
56
+ "POS",
57
+ "MARKETPLACE",
58
+ "STOREFRONT",
59
+ ]);
60
+ // =====================================================
61
+ // CORE PRODUCT TABLE
62
+ // =====================================================
63
+ exports.products = (0, pg_core_1.pgTable)("products", {
64
+ id: (0, pg_core_1.text)("id")
65
+ .primaryKey()
66
+ .$defaultFn(() => (0, cuid2_1.createId)()),
67
+ storeId: (0, pg_core_1.text)("store_id").notNull(),
68
+ // Basic Information
69
+ title: (0, pg_core_1.varchar)("title", { length: 255 }).notNull(),
70
+ description: (0, pg_core_1.text)("description"),
71
+ shortDescription: (0, pg_core_1.varchar)("short_description", { length: 500 }),
72
+ handle: (0, pg_core_1.varchar)("handle", { length: 255 }).notNull(), // URL-friendly slug
73
+ // Product Classification
74
+ productType: (0, exports.productTypeEnum)("product_type").notNull().default("PHYSICAL"),
75
+ vendor: (0, pg_core_1.varchar)("vendor", { length: 255 }),
76
+ supplierId: (0, pg_core_1.text)("supplier_id"),
77
+ category: (0, pg_core_1.varchar)("category", { length: 255 }),
78
+ subcategory: (0, pg_core_1.varchar)("subcategory", { length: 255 }),
79
+ tags: (0, pg_core_1.jsonb)("tags").$type().default([]),
80
+ // Product Specifics
81
+ features: (0, pg_core_1.jsonb)("features").$type().default([]),
82
+ specifications: (0, pg_core_1.jsonb)("specifications")
83
+ .$type()
84
+ .default([]),
85
+ // Additional Product Fields
86
+ unitOfMeasure: (0, pg_core_1.varchar)("unit_of_measure", { length: 50 }), // e.g., "piece", "kg", "liter", "box"
87
+ countryOfOrigin: (0, pg_core_1.varchar)("country_of_origin", { length: 100 }), // Country where product is manufactured
88
+ hsCode: (0, pg_core_1.varchar)("hs_code", { length: 20 }), // Harmonized System code for customs
89
+ returnable: (0, pg_core_1.boolean)("returnable").notNull().default(true), // Whether product can be returned
90
+ weightUnit: (0, pg_core_1.varchar)("weight_unit", { length: 10 }).default("kg"), // kg, lb, oz, g
91
+ // Status and Visibility
92
+ status: (0, exports.productStatusEnum)("status").notNull().default("DRAFT"),
93
+ isPublished: (0, pg_core_1.boolean)("is_published").notNull().default(false),
94
+ publishedAt: (0, pg_core_1.timestamp)("published_at", { withTimezone: true }),
95
+ isFeatured: (0, pg_core_1.boolean)("is_featured").notNull().default(false),
96
+ // Sales Channels - Control where product is available
97
+ salesChannels: (0, pg_core_1.jsonb)("sales_channels")
98
+ .$type()
99
+ .notNull()
100
+ .default(["POS", "MARKETPLACE", "STOREFRONT"]),
101
+ // Advanced Sales Channel Configuration
102
+ salesChannelConfig: (0, pg_core_1.jsonb)("sales_channel_config")
103
+ .$type()
104
+ .default({}),
105
+ // Pricing (in cents for precision)
106
+ basePrice: (0, pg_core_1.decimal)("base_price", { precision: 12, scale: 2 }).notNull(),
107
+ compareAtPrice: (0, pg_core_1.decimal)("compare_at_price", { precision: 12, scale: 2 }),
108
+ costPerItem: (0, pg_core_1.decimal)("cost_per_item", { precision: 12, scale: 2 }),
109
+ // Wholesale Pricing
110
+ wholesalePrice: (0, pg_core_1.decimal)("wholesale_price", { precision: 12, scale: 2 }),
111
+ minWholesaleQuantity: (0, pg_core_1.integer)("min_wholesale_quantity").default(1),
112
+ maxWholesaleQuantity: (0, pg_core_1.integer)("max_wholesale_quantity"),
113
+ wholesaleEnabled: (0, pg_core_1.boolean)("wholesale_enabled").notNull().default(false),
114
+ // Inventory Management
115
+ inventoryPolicy: (0, exports.inventoryPolicyEnum)("inventory_policy")
116
+ .notNull()
117
+ .default("TRACK"),
118
+ inventoryQuantity: (0, pg_core_1.integer)("inventory_quantity").notNull().default(0),
119
+ inventoryTrackingEnabled: (0, pg_core_1.boolean)("inventory_tracking_enabled")
120
+ .notNull()
121
+ .default(true),
122
+ trackStock: (0, pg_core_1.boolean)("track_stock").notNull().default(false),
123
+ stockLocationId: (0, pg_core_1.text)("stock_location_id"), // POS location or warehouse ID
124
+ stockLocationType: (0, pg_core_1.varchar)("stock_location_type", { length: 20 }), // "POS" or "WAREHOUSE"
125
+ lowStockThreshold: (0, pg_core_1.integer)("low_stock_threshold").default(10),
126
+ allowBackorders: (0, pg_core_1.boolean)("allow_backorders").notNull().default(false),
127
+ // Advanced Inventory Tracking Features
128
+ autoReorder: (0, pg_core_1.boolean)("auto_reorder").notNull().default(false), // Automatic reorder when stock is low
129
+ batchTracking: (0, pg_core_1.boolean)("batch_tracking").notNull().default(false), // Track products by batch/lot number
130
+ serialTracking: (0, pg_core_1.boolean)("serial_tracking").notNull().default(false), // Track individual serial numbers
131
+ expiryTracking: (0, pg_core_1.boolean)("expiry_tracking").notNull().default(false), // Track expiry dates
132
+ // Physical Properties
133
+ weight: (0, pg_core_1.decimal)("weight", { precision: 8, scale: 3 }), // in kg
134
+ dimensions: (0, pg_core_1.jsonb)("dimensions").$type(),
135
+ // Shipping and Fulfillment
136
+ requiresShipping: (0, pg_core_1.boolean)("requires_shipping").notNull().default(true),
137
+ fulfillmentService: (0, exports.fulfillmentServiceEnum)("fulfillment_service")
138
+ .notNull()
139
+ .default("MANUAL"),
140
+ shippingClass: (0, pg_core_1.varchar)("shipping_class", { length: 100 }),
141
+ // SEO and Marketing
142
+ seoTitle: (0, pg_core_1.varchar)("seo_title", { length: 255 }),
143
+ seoDescription: (0, pg_core_1.varchar)("seo_description", { length: 500 }),
144
+ seoKeywords: (0, pg_core_1.jsonb)("seo_keywords").$type().default([]),
145
+ metaFields: (0, pg_core_1.jsonb)("meta_fields")
146
+ .$type()
147
+ .default({}),
148
+ // Advanced Features
149
+ customFields: (0, pg_core_1.jsonb)("custom_fields")
150
+ .$type()
151
+ .default({}),
152
+ variantOptions: (0, pg_core_1.jsonb)("variant_options")
153
+ .$type()
154
+ .default([]),
155
+ // Analytics and Performance
156
+ totalViews: (0, pg_core_1.integer)("total_views").notNull().default(0),
157
+ totalSales: (0, pg_core_1.integer)("total_sales").notNull().default(0),
158
+ totalRevenue: (0, pg_core_1.decimal)("total_revenue", { precision: 12, scale: 2 })
159
+ .notNull()
160
+ .default("0"),
161
+ conversionRate: (0, pg_core_1.decimal)("conversion_rate", { precision: 5, scale: 4 }),
162
+ averageRating: (0, pg_core_1.decimal)("average_rating", { precision: 3, scale: 2 }),
163
+ reviewCount: (0, pg_core_1.integer)("review_count").notNull().default(0),
164
+ // Timestamps
165
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
166
+ .defaultNow()
167
+ .notNull(),
168
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
169
+ .defaultNow()
170
+ .notNull(),
171
+ deletedAt: (0, pg_core_1.timestamp)("deleted_at", { withTimezone: true }),
172
+ }, (table) => ({
173
+ // Performance indexes
174
+ storeIdIndex: (0, pg_core_1.index)("idx_products_store_id").on(table.storeId),
175
+ handleUniquePerStore: (0, pg_core_1.unique)("idx_products_handle_store_unique").on(table.storeId, table.handle),
176
+ statusIndex: (0, pg_core_1.index)("idx_products_status").on(table.status),
177
+ publishedIndex: (0, pg_core_1.index)("idx_products_published").on(table.isPublished, table.publishedAt),
178
+ featuredIndex: (0, pg_core_1.index)("idx_products_featured").on(table.isFeatured),
179
+ categoryIndex: (0, pg_core_1.index)("idx_products_category").on(table.category),
180
+ vendorIndex: (0, pg_core_1.index)("idx_products_vendor").on(table.vendor),
181
+ // Analytics indexes
182
+ salesIndex: (0, pg_core_1.index)("idx_products_sales").on(table.totalSales),
183
+ revenueIndex: (0, pg_core_1.index)("idx_products_revenue").on(table.totalRevenue),
184
+ ratingIndex: (0, pg_core_1.index)("idx_products_rating").on(table.averageRating),
185
+ // Search indexes
186
+ titleIndex: (0, pg_core_1.index)("idx_products_title").on(table.title),
187
+ fullTextSearch: (0, pg_core_1.index)("idx_products_search").on(table.title, table.description, table.tags),
188
+ // Inventory indexes
189
+ inventoryIndex: (0, pg_core_1.index)("idx_products_inventory").on(table.inventoryQuantity),
190
+ lowStockIndex: (0, pg_core_1.index)("idx_products_low_stock").on(table.inventoryQuantity, table.lowStockThreshold),
191
+ trackStockIndex: (0, pg_core_1.index)("idx_products_track_stock").on(table.trackStock),
192
+ stockLocationIndex: (0, pg_core_1.index)("idx_products_stock_location").on(table.stockLocationId, table.stockLocationType),
193
+ // Sales channel index
194
+ salesChannelsIndex: (0, pg_core_1.index)("idx_products_sales_channels").on(table.salesChannels),
195
+ }));
196
+ // =====================================================
197
+ // PRODUCT VARIANTS TABLE
198
+ // =====================================================
199
+ exports.productVariants = (0, pg_core_1.pgTable)("product_variants", {
200
+ id: (0, pg_core_1.text)("id")
201
+ .primaryKey()
202
+ .$defaultFn(() => (0, cuid2_1.createId)()),
203
+ productId: (0, pg_core_1.text)("product_id")
204
+ .notNull()
205
+ .references(() => exports.products.id, { onDelete: "cascade" }),
206
+ storeId: (0, pg_core_1.text)("store_id").notNull(),
207
+ // Variant Identification
208
+ title: (0, pg_core_1.varchar)("title", { length: 255 }).notNull(),
209
+ compareAtPrice: (0, pg_core_1.decimal)("compare_at_price", { precision: 12, scale: 2 }),
210
+ // Pricing (in cents)
211
+ price: (0, pg_core_1.decimal)("price", { precision: 12, scale: 2 }).notNull(),
212
+ costPerItem: (0, pg_core_1.decimal)("cost_per_item", { precision: 12, scale: 2 }),
213
+ // Inventory
214
+ inventoryQuantity: (0, pg_core_1.integer)("inventory_quantity").notNull().default(0),
215
+ inventoryItemId: (0, pg_core_1.text)("inventory_item_id"), // Reference to inventory system
216
+ fulfillmentService: (0, exports.fulfillmentServiceEnum)("fulfillment_service")
217
+ .notNull()
218
+ .default("MANUAL"),
219
+ // Physical Properties
220
+ weight: (0, pg_core_1.decimal)("weight", { precision: 8, scale: 3 }),
221
+ dimensions: (0, pg_core_1.jsonb)("dimensions").$type(),
222
+ // Variant Options (e.g., color: red, size: large)
223
+ option1: (0, pg_core_1.varchar)("option1", { length: 255 }),
224
+ option2: (0, pg_core_1.varchar)("option2", { length: 255 }),
225
+ option3: (0, pg_core_1.varchar)("option3", { length: 255 }),
226
+ optionValues: (0, pg_core_1.jsonb)("option_values")
227
+ .$type()
228
+ .default({}),
229
+ // Status and Availability
230
+ availableForSale: (0, pg_core_1.boolean)("available_for_sale").notNull().default(true),
231
+ requiresShipping: (0, pg_core_1.boolean)("requires_shipping").notNull().default(true),
232
+ // Sales Channels - Control where variant is available (inherits from product if not set)
233
+ salesChannels: (0, pg_core_1.jsonb)("sales_channels")
234
+ .$type()
235
+ .default(["POS", "MARKETPLACE", "STOREFRONT"]),
236
+ // Media
237
+ imageId: (0, pg_core_1.text)("image_id"), // Primary image for this variant
238
+ imageUrl: (0, pg_core_1.varchar)("image_url", { length: 500 }),
239
+ imageAltText: (0, pg_core_1.varchar)("image_alt_text", { length: 255 }),
240
+ // Advanced Features
241
+ customFields: (0, pg_core_1.jsonb)("custom_fields")
242
+ .$type()
243
+ .default({}),
244
+ taxCode: (0, pg_core_1.varchar)("tax_code", { length: 50 }),
245
+ // Analytics
246
+ totalSales: (0, pg_core_1.integer)("total_sales").notNull().default(0),
247
+ totalRevenue: (0, pg_core_1.decimal)("total_revenue", { precision: 12, scale: 2 })
248
+ .notNull()
249
+ .default("0"),
250
+ // Position for ordering
251
+ position: (0, pg_core_1.integer)("position").notNull().default(0),
252
+ // Timestamps
253
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
254
+ .defaultNow()
255
+ .notNull(),
256
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
257
+ .defaultNow()
258
+ .notNull(),
259
+ }, (table) => ({
260
+ // Performance indexes
261
+ productIdIndex: (0, pg_core_1.index)("idx_variants_product_id").on(table.productId),
262
+ storeIdIndex: (0, pg_core_1.index)("idx_variants_store_id").on(table.storeId),
263
+ priceIndex: (0, pg_core_1.index)("idx_variants_price").on(table.price),
264
+ inventoryIndex: (0, pg_core_1.index)("idx_variants_inventory").on(table.inventoryQuantity),
265
+ availableIndex: (0, pg_core_1.index)("idx_variants_available").on(table.availableForSale),
266
+ positionIndex: (0, pg_core_1.index)("idx_variants_position").on(table.productId, table.position),
267
+ // Option indexes for filtering
268
+ option1Index: (0, pg_core_1.index)("idx_variants_option1").on(table.option1),
269
+ option2Index: (0, pg_core_1.index)("idx_variants_option2").on(table.option2),
270
+ option3Index: (0, pg_core_1.index)("idx_variants_option3").on(table.option3),
271
+ // Sales channel index
272
+ salesChannelsIndex: (0, pg_core_1.index)("idx_variants_sales_channels").on(table.salesChannels),
273
+ }));
274
+ // =====================================================
275
+ // COLLECTIONS TABLE
276
+ // =====================================================
277
+ exports.collections = (0, pg_core_1.pgTable)("collections", {
278
+ id: (0, pg_core_1.text)("id")
279
+ .primaryKey()
280
+ .$defaultFn(() => (0, cuid2_1.createId)()),
281
+ storeId: (0, pg_core_1.text)("store_id").notNull(),
282
+ // Basic Information
283
+ title: (0, pg_core_1.varchar)("title", { length: 255 }).notNull(),
284
+ description: (0, pg_core_1.text)("description"),
285
+ handle: (0, pg_core_1.varchar)("handle", { length: 255 }).notNull(),
286
+ // Collection Type and Rules
287
+ collectionType: (0, exports.collectionTypeEnum)("collection_type")
288
+ .notNull()
289
+ .default("MANUAL"),
290
+ rules: (0, pg_core_1.jsonb)("rules")
291
+ .$type()
292
+ .default([]),
293
+ // SEO and Marketing
294
+ seoTitle: (0, pg_core_1.varchar)("seo_title", { length: 255 }),
295
+ seoDescription: (0, pg_core_1.varchar)("seo_description", { length: 500 }),
296
+ seoKeywords: (0, pg_core_1.jsonb)("seo_keywords").$type().default([]),
297
+ // Media
298
+ imageUrl: (0, pg_core_1.varchar)("image_url", { length: 500 }),
299
+ imageAltText: (0, pg_core_1.varchar)("image_alt_text", { length: 255 }),
300
+ // Display and Sorting
301
+ sortOrder: (0, pg_core_1.varchar)("sort_order", { length: 50 }).default("manual"), // manual, best-selling, created, price-asc, price-desc
302
+ isPublished: (0, pg_core_1.boolean)("is_published").notNull().default(false),
303
+ publishedAt: (0, pg_core_1.timestamp)("published_at", { withTimezone: true }),
304
+ // Advanced Features
305
+ customFields: (0, pg_core_1.jsonb)("custom_fields")
306
+ .$type()
307
+ .default({}),
308
+ templateSuffix: (0, pg_core_1.varchar)("template_suffix", { length: 100 }),
309
+ // Analytics
310
+ totalProducts: (0, pg_core_1.integer)("total_products").notNull().default(0),
311
+ totalViews: (0, pg_core_1.integer)("total_views").notNull().default(0),
312
+ // Timestamps
313
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
314
+ .defaultNow()
315
+ .notNull(),
316
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
317
+ .defaultNow()
318
+ .notNull(),
319
+ }, (table) => ({
320
+ // Performance indexes
321
+ storeIdIndex: (0, pg_core_1.index)("idx_collections_store_id").on(table.storeId),
322
+ handleUniquePerStore: (0, pg_core_1.unique)("idx_collections_handle_store_unique").on(table.storeId, table.handle),
323
+ typeIndex: (0, pg_core_1.index)("idx_collections_type").on(table.collectionType),
324
+ publishedIndex: (0, pg_core_1.index)("idx_collections_published").on(table.isPublished, table.publishedAt),
325
+ titleIndex: (0, pg_core_1.index)("idx_collections_title").on(table.title),
326
+ }));
327
+ // =====================================================
328
+ // PRODUCT COLLECTIONS JUNCTION TABLE
329
+ // =====================================================
330
+ exports.productCollections = (0, pg_core_1.pgTable)("product_collections", {
331
+ id: (0, pg_core_1.text)("id")
332
+ .primaryKey()
333
+ .$defaultFn(() => (0, cuid2_1.createId)()),
334
+ productId: (0, pg_core_1.text)("product_id")
335
+ .notNull()
336
+ .references(() => exports.products.id, { onDelete: "cascade" }),
337
+ collectionId: (0, pg_core_1.text)("collection_id")
338
+ .notNull()
339
+ .references(() => exports.collections.id, { onDelete: "cascade" }),
340
+ position: (0, pg_core_1.integer)("position").notNull().default(0),
341
+ isManuallyAdded: (0, pg_core_1.boolean)("is_manually_added").notNull().default(false),
342
+ // Timestamps
343
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
344
+ .defaultNow()
345
+ .notNull(),
346
+ }, (table) => ({
347
+ // Unique constraint to prevent duplicates
348
+ productCollectionUnique: (0, pg_core_1.unique)("idx_product_collection_unique").on(table.productId, table.collectionId),
349
+ productIdIndex: (0, pg_core_1.index)("idx_product_collections_product").on(table.productId),
350
+ collectionIdIndex: (0, pg_core_1.index)("idx_product_collections_collection").on(table.collectionId),
351
+ positionIndex: (0, pg_core_1.index)("idx_product_collections_position").on(table.collectionId, table.position),
352
+ }));
353
+ // =====================================================
354
+ // PRODUCT IMAGES TABLE
355
+ // =====================================================
356
+ exports.productImages = (0, pg_core_1.pgTable)("product_images", {
357
+ id: (0, pg_core_1.text)("id")
358
+ .primaryKey()
359
+ .$defaultFn(() => (0, cuid2_1.createId)()),
360
+ productId: (0, pg_core_1.text)("product_id")
361
+ .notNull()
362
+ .references(() => exports.products.id, { onDelete: "cascade" }),
363
+ variantId: (0, pg_core_1.text)("variant_id").references(() => exports.productVariants.id, {
364
+ onDelete: "set null",
365
+ }),
366
+ // Image Information
367
+ url: (0, pg_core_1.varchar)("url", { length: 500 }).notNull(),
368
+ altText: (0, pg_core_1.varchar)("alt_text", { length: 255 }),
369
+ width: (0, pg_core_1.integer)("width"),
370
+ height: (0, pg_core_1.integer)("height"),
371
+ size: (0, pg_core_1.integer)("size"), // File size in bytes
372
+ // Image Variants (different sizes)
373
+ thumbnailUrl: (0, pg_core_1.varchar)("thumbnail_url", { length: 500 }),
374
+ mediumUrl: (0, pg_core_1.varchar)("medium_url", { length: 500 }),
375
+ largeUrl: (0, pg_core_1.varchar)("large_url", { length: 500 }),
376
+ // Metadata
377
+ filename: (0, pg_core_1.varchar)("filename", { length: 255 }),
378
+ contentType: (0, pg_core_1.varchar)("content_type", { length: 100 }),
379
+ position: (0, pg_core_1.integer)("position").notNull().default(0),
380
+ // Advanced Features
381
+ isMain: (0, pg_core_1.boolean)("is_main").notNull().default(false),
382
+ customFields: (0, pg_core_1.jsonb)("custom_fields")
383
+ .$type()
384
+ .default({}),
385
+ // Timestamps
386
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
387
+ .defaultNow()
388
+ .notNull(),
389
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
390
+ .defaultNow()
391
+ .notNull(),
392
+ }, (table) => ({
393
+ // Performance indexes
394
+ productIdIndex: (0, pg_core_1.index)("idx_product_images_product").on(table.productId),
395
+ variantIdIndex: (0, pg_core_1.index)("idx_product_images_variant").on(table.variantId),
396
+ positionIndex: (0, pg_core_1.index)("idx_product_images_position").on(table.productId, table.position),
397
+ mainImageIndex: (0, pg_core_1.index)("idx_product_images_main").on(table.productId, table.isMain),
398
+ }));
399
+ // =====================================================
400
+ // PRODUCT CATEGORIES TABLE
401
+ // =====================================================
402
+ exports.productCategories = (0, pg_core_1.pgTable)("product_categories", {
403
+ id: (0, pg_core_1.text)("id")
404
+ .primaryKey()
405
+ .$defaultFn(() => (0, cuid2_1.createId)()),
406
+ storeId: (0, pg_core_1.text)("store_id").notNull(),
407
+ // Category Information
408
+ name: (0, pg_core_1.varchar)("name", { length: 255 }).notNull(),
409
+ description: (0, pg_core_1.text)("description"),
410
+ handle: (0, pg_core_1.varchar)("handle", { length: 255 }).notNull(),
411
+ // Hierarchy
412
+ parentId: (0, pg_core_1.text)("parent_id"),
413
+ level: (0, pg_core_1.integer)("level").notNull().default(0),
414
+ path: (0, pg_core_1.varchar)("path", { length: 1000 }), // e.g., /electronics/phones/smartphones
415
+ // Display
416
+ imageUrl: (0, pg_core_1.varchar)("image_url", { length: 500 }),
417
+ iconUrl: (0, pg_core_1.varchar)("icon_url", { length: 500 }),
418
+ position: (0, pg_core_1.integer)("position").notNull().default(0),
419
+ isVisible: (0, pg_core_1.boolean)("is_visible").notNull().default(true),
420
+ // SEO
421
+ seoTitle: (0, pg_core_1.varchar)("seo_title", { length: 255 }),
422
+ seoDescription: (0, pg_core_1.varchar)("seo_description", { length: 500 }),
423
+ // Analytics
424
+ productCount: (0, pg_core_1.integer)("product_count").notNull().default(0),
425
+ // Timestamps
426
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
427
+ .defaultNow()
428
+ .notNull(),
429
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
430
+ .defaultNow()
431
+ .notNull(),
432
+ }, (table) => ({
433
+ // Performance indexes
434
+ storeIdIndex: (0, pg_core_1.index)("idx_categories_store_id").on(table.storeId),
435
+ handleUniquePerStore: (0, pg_core_1.unique)("idx_categories_handle_store_unique").on(table.storeId, table.handle),
436
+ parentIdIndex: (0, pg_core_1.index)("idx_categories_parent").on(table.parentId),
437
+ levelIndex: (0, pg_core_1.index)("idx_categories_level").on(table.level),
438
+ visibleIndex: (0, pg_core_1.index)("idx_categories_visible").on(table.isVisible),
439
+ positionIndex: (0, pg_core_1.index)("idx_categories_position").on(table.parentId, table.position),
440
+ }));
441
+ // =====================================================
442
+ // PRODUCT REVIEWS TABLE
443
+ // =====================================================
444
+ exports.productReviews = (0, pg_core_1.pgTable)("product_reviews", {
445
+ id: (0, pg_core_1.text)("id")
446
+ .primaryKey()
447
+ .$defaultFn(() => (0, cuid2_1.createId)()),
448
+ productId: (0, pg_core_1.text)("product_id")
449
+ .notNull()
450
+ .references(() => exports.products.id, { onDelete: "cascade" }),
451
+ variantId: (0, pg_core_1.text)("variant_id").references(() => exports.productVariants.id, {
452
+ onDelete: "set null",
453
+ }),
454
+ storeId: (0, pg_core_1.text)("store_id").notNull(),
455
+ // Review Information
456
+ customerId: (0, pg_core_1.text)("customer_id"), // Customer who wrote the review
457
+ customerName: (0, pg_core_1.varchar)("customer_name", { length: 255 }),
458
+ customerEmail: (0, pg_core_1.varchar)("customer_email", { length: 255 }),
459
+ // Review Content
460
+ title: (0, pg_core_1.varchar)("title", { length: 255 }),
461
+ content: (0, pg_core_1.text)("content").notNull(),
462
+ rating: (0, pg_core_1.integer)("rating").notNull(), // 1-5 scale
463
+ // Status and Moderation
464
+ status: (0, pg_core_1.varchar)("status", { length: 50 }).notNull().default("pending"), // pending, approved, rejected
465
+ isVerifiedPurchase: (0, pg_core_1.boolean)("is_verified_purchase")
466
+ .notNull()
467
+ .default(false),
468
+ isRecommended: (0, pg_core_1.boolean)("is_recommended"),
469
+ // Helpfulness
470
+ helpfulCount: (0, pg_core_1.integer)("helpful_count").notNull().default(0),
471
+ unhelpfulCount: (0, pg_core_1.integer)("unhelpful_count").notNull().default(0),
472
+ // Metadata
473
+ reviewSource: (0, pg_core_1.varchar)("review_source", { length: 100 }), // web, mobile, import
474
+ ipAddress: (0, pg_core_1.varchar)("ip_address", { length: 45 }),
475
+ userAgent: (0, pg_core_1.varchar)("user_agent", { length: 500 }),
476
+ // Timestamps
477
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
478
+ .defaultNow()
479
+ .notNull(),
480
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
481
+ .defaultNow()
482
+ .notNull(),
483
+ moderatedAt: (0, pg_core_1.timestamp)("moderated_at", { withTimezone: true }),
484
+ }, (table) => ({
485
+ // Performance indexes
486
+ productIdIndex: (0, pg_core_1.index)("idx_reviews_product").on(table.productId),
487
+ storeIdIndex: (0, pg_core_1.index)("idx_reviews_store").on(table.storeId),
488
+ customerIdIndex: (0, pg_core_1.index)("idx_reviews_customer").on(table.customerId),
489
+ statusIndex: (0, pg_core_1.index)("idx_reviews_status").on(table.status),
490
+ ratingIndex: (0, pg_core_1.index)("idx_reviews_rating").on(table.rating),
491
+ verifiedIndex: (0, pg_core_1.index)("idx_reviews_verified").on(table.isVerifiedPurchase),
492
+ createdAtIndex: (0, pg_core_1.index)("idx_reviews_created").on(table.createdAt),
493
+ }));
494
+ // =====================================================
495
+ // PRODUCT ANALYTICS TABLE
496
+ // =====================================================
497
+ exports.productAnalytics = (0, pg_core_1.pgTable)("product_analytics", {
498
+ id: (0, pg_core_1.text)("id")
499
+ .primaryKey()
500
+ .$defaultFn(() => (0, cuid2_1.createId)()),
501
+ productId: (0, pg_core_1.text)("product_id")
502
+ .notNull()
503
+ .references(() => exports.products.id, { onDelete: "cascade" }),
504
+ storeId: (0, pg_core_1.text)("store_id").notNull(),
505
+ // Time-based metrics
506
+ date: (0, pg_core_1.timestamp)("date", { withTimezone: true }).notNull(),
507
+ hour: (0, pg_core_1.integer)("hour"), // 0-23 for hourly analytics
508
+ // Traffic Metrics
509
+ views: (0, pg_core_1.integer)("views").notNull().default(0),
510
+ uniqueViews: (0, pg_core_1.integer)("unique_views").notNull().default(0),
511
+ sessions: (0, pg_core_1.integer)("sessions").notNull().default(0),
512
+ bounceRate: (0, pg_core_1.decimal)("bounce_rate", { precision: 5, scale: 4 }),
513
+ // Conversion Metrics
514
+ addToCarts: (0, pg_core_1.integer)("add_to_carts").notNull().default(0),
515
+ purchases: (0, pg_core_1.integer)("purchases").notNull().default(0),
516
+ revenue: (0, pg_core_1.decimal)("revenue", { precision: 12, scale: 2 })
517
+ .notNull()
518
+ .default("0"),
519
+ conversionRate: (0, pg_core_1.decimal)("conversion_rate", { precision: 5, scale: 4 }),
520
+ // Engagement Metrics
521
+ averageTimeOnPage: (0, pg_core_1.integer)("average_time_on_page"), // in seconds
522
+ clickThroughRate: (0, pg_core_1.decimal)("click_through_rate", { precision: 5, scale: 4 }),
523
+ shareCount: (0, pg_core_1.integer)("share_count").notNull().default(0),
524
+ wishlistAdds: (0, pg_core_1.integer)("wishlist_adds").notNull().default(0),
525
+ // Search and Discovery
526
+ searchImpressions: (0, pg_core_1.integer)("search_impressions").notNull().default(0),
527
+ searchClicks: (0, pg_core_1.integer)("search_clicks").notNull().default(0),
528
+ searchRanking: (0, pg_core_1.decimal)("search_ranking", { precision: 8, scale: 4 }),
529
+ // Geographic and Device Data
530
+ topCountries: (0, pg_core_1.jsonb)("top_countries")
531
+ .$type()
532
+ .default([]),
533
+ topDevices: (0, pg_core_1.jsonb)("top_devices")
534
+ .$type()
535
+ .default([]),
536
+ // Timestamps
537
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
538
+ .defaultNow()
539
+ .notNull(),
540
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
541
+ .defaultNow()
542
+ .notNull(),
543
+ }, (table) => ({
544
+ // Performance indexes for analytics queries
545
+ productDateIndex: (0, pg_core_1.index)("idx_analytics_product_date").on(table.productId, table.date),
546
+ storeIdIndex: (0, pg_core_1.index)("idx_analytics_store").on(table.storeId),
547
+ dateIndex: (0, pg_core_1.index)("idx_analytics_date").on(table.date),
548
+ hourlyIndex: (0, pg_core_1.index)("idx_analytics_hourly").on(table.productId, table.date, table.hour),
549
+ viewsIndex: (0, pg_core_1.index)("idx_analytics_views").on(table.views),
550
+ revenueIndex: (0, pg_core_1.index)("idx_analytics_revenue").on(table.revenue),
551
+ conversionIndex: (0, pg_core_1.index)("idx_analytics_conversion").on(table.conversionRate),
552
+ }));
553
+ // =====================================================
554
+ // WHOLESALE PRICING TIERS TABLE
555
+ // =====================================================
556
+ exports.wholesalePricingTiers = (0, pg_core_1.pgTable)("wholesale_pricing_tiers", {
557
+ id: (0, pg_core_1.text)("id")
558
+ .primaryKey()
559
+ .$defaultFn(() => (0, cuid2_1.createId)()),
560
+ productId: (0, pg_core_1.text)("product_id")
561
+ .notNull()
562
+ .references(() => exports.products.id, { onDelete: "cascade" }),
563
+ variantId: (0, pg_core_1.text)("variant_id").references(() => exports.productVariants.id, {
564
+ onDelete: "cascade",
565
+ }),
566
+ storeId: (0, pg_core_1.text)("store_id").notNull(),
567
+ // Tier Information
568
+ tierName: (0, pg_core_1.varchar)("tier_name", { length: 100 }).notNull(),
569
+ tierDescription: (0, pg_core_1.text)("tier_description"),
570
+ tierPriority: (0, pg_core_1.integer)("tier_priority").notNull().default(0), // Higher priority = applied first
571
+ minQuantity: (0, pg_core_1.integer)("min_quantity").notNull(),
572
+ maxQuantity: (0, pg_core_1.integer)("max_quantity"),
573
+ price: (0, pg_core_1.decimal)("price", { precision: 12, scale: 2 }).notNull(),
574
+ discountPercentage: (0, pg_core_1.decimal)("discount_percentage", {
575
+ precision: 5,
576
+ scale: 2,
577
+ }),
578
+ // Enhanced Tier Conditions
579
+ customerType: (0, pg_core_1.varchar)("customer_type", { length: 50 }), // "RETAILER", "DISTRIBUTOR", "RESELLER", "VIP"
580
+ customerTags: (0, pg_core_1.jsonb)("customer_tags").$type().default([]), // Additional customer segmentation
581
+ region: (0, pg_core_1.varchar)("region", { length: 100 }),
582
+ country: (0, pg_core_1.varchar)("country", { length: 50 }),
583
+ currency: (0, pg_core_1.varchar)("currency", { length: 3 }).default("USD"),
584
+ minimumOrderValue: (0, pg_core_1.decimal)("minimum_order_value", {
585
+ precision: 12,
586
+ scale: 2,
587
+ }),
588
+ // Advanced Pricing Features
589
+ bulkDiscountType: (0, pg_core_1.varchar)("bulk_discount_type", { length: 20 }).default("PERCENTAGE"), // PERCENTAGE, FIXED_AMOUNT, TIERED
590
+ compoundDiscount: (0, pg_core_1.boolean)("compound_discount").notNull().default(false), // Can be combined with other discounts
591
+ exclusiveDiscount: (0, pg_core_1.boolean)("exclusive_discount").notNull().default(false), // Cannot be combined
592
+ maxDiscountAmount: (0, pg_core_1.decimal)("max_discount_amount", {
593
+ precision: 12,
594
+ scale: 2,
595
+ }),
596
+ // Validity and Scheduling
597
+ validFrom: (0, pg_core_1.timestamp)("valid_from", { withTimezone: true }),
598
+ validTo: (0, pg_core_1.timestamp)("valid_to", { withTimezone: true }),
599
+ isActive: (0, pg_core_1.boolean)("is_active").notNull().default(true),
600
+ isScheduled: (0, pg_core_1.boolean)("is_scheduled").notNull().default(false),
601
+ scheduleStart: (0, pg_core_1.timestamp)("schedule_start", { withTimezone: true }),
602
+ scheduleEnd: (0, pg_core_1.timestamp)("schedule_end", { withTimezone: true }),
603
+ // Additional Features
604
+ freeShipping: (0, pg_core_1.boolean)("free_shipping").notNull().default(false),
605
+ freeShippingThreshold: (0, pg_core_1.decimal)("free_shipping_threshold", {
606
+ precision: 12,
607
+ scale: 2,
608
+ }),
609
+ expeditedShipping: (0, pg_core_1.boolean)("expedited_shipping").notNull().default(false),
610
+ dropShippingEnabled: (0, pg_core_1.boolean)("drop_shipping_enabled")
611
+ .notNull()
612
+ .default(false),
613
+ // Payment Terms
614
+ paymentTerms: (0, pg_core_1.varchar)("payment_terms", { length: 50 }), // "NET_30", "NET_60", "COD", "PREPAID"
615
+ earlyPaymentDiscount: (0, pg_core_1.decimal)("early_payment_discount", {
616
+ precision: 5,
617
+ scale: 2,
618
+ }),
619
+ latePaymentPenalty: (0, pg_core_1.decimal)("late_payment_penalty", {
620
+ precision: 5,
621
+ scale: 2,
622
+ }),
623
+ // Inventory and Fulfillment
624
+ reservedInventory: (0, pg_core_1.integer)("reserved_inventory").default(0),
625
+ autoReplenishment: (0, pg_core_1.boolean)("auto_replenishment").notNull().default(false),
626
+ replenishmentThreshold: (0, pg_core_1.integer)("replenishment_threshold"),
627
+ leadTimedays: (0, pg_core_1.integer)("lead_time_days").default(0),
628
+ // Analytics and Tracking
629
+ totalOrdersCount: (0, pg_core_1.integer)("total_orders_count").notNull().default(0),
630
+ totalRevenue: (0, pg_core_1.decimal)("total_revenue", { precision: 12, scale: 2 })
631
+ .notNull()
632
+ .default("0"),
633
+ averageOrderValue: (0, pg_core_1.decimal)("average_order_value", {
634
+ precision: 12,
635
+ scale: 2,
636
+ }),
637
+ lastUsedAt: (0, pg_core_1.timestamp)("last_used_at", { withTimezone: true }),
638
+ // Custom Fields and Metadata
639
+ customFields: (0, pg_core_1.jsonb)("custom_fields")
640
+ .$type()
641
+ .default({}),
642
+ internalNotes: (0, pg_core_1.text)("internal_notes"),
643
+ customerVisibleNotes: (0, pg_core_1.text)("customer_visible_notes"),
644
+ // Timestamps
645
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
646
+ .defaultNow()
647
+ .notNull(),
648
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
649
+ .defaultNow()
650
+ .notNull(),
651
+ }, (table) => ({
652
+ // Performance indexes
653
+ productIdIndex: (0, pg_core_1.index)("idx_wholesale_tiers_product").on(table.productId),
654
+ variantIdIndex: (0, pg_core_1.index)("idx_wholesale_tiers_variant").on(table.variantId),
655
+ storeIdIndex: (0, pg_core_1.index)("idx_wholesale_tiers_store").on(table.storeId),
656
+ quantityIndex: (0, pg_core_1.index)("idx_wholesale_tiers_quantity").on(table.minQuantity, table.maxQuantity),
657
+ customerTypeIndex: (0, pg_core_1.index)("idx_wholesale_tiers_customer_type").on(table.customerType),
658
+ activeIndex: (0, pg_core_1.index)("idx_wholesale_tiers_active").on(table.isActive),
659
+ validityIndex: (0, pg_core_1.index)("idx_wholesale_tiers_validity").on(table.validFrom, table.validTo),
660
+ // Enhanced indexes for new features
661
+ priorityIndex: (0, pg_core_1.index)("idx_wholesale_tiers_priority").on(table.tierPriority),
662
+ scheduledIndex: (0, pg_core_1.index)("idx_wholesale_tiers_scheduled").on(table.isScheduled, table.scheduleStart, table.scheduleEnd),
663
+ regionIndex: (0, pg_core_1.index)("idx_wholesale_tiers_region").on(table.region),
664
+ countryIndex: (0, pg_core_1.index)("idx_wholesale_tiers_country").on(table.country),
665
+ paymentTermsIndex: (0, pg_core_1.index)("idx_wholesale_tiers_payment_terms").on(table.paymentTerms),
666
+ revenueIndex: (0, pg_core_1.index)("idx_wholesale_tiers_revenue").on(table.totalRevenue),
667
+ lastUsedIndex: (0, pg_core_1.index)("idx_wholesale_tiers_last_used").on(table.lastUsedAt),
668
+ // Composite indexes for complex queries
669
+ activeScheduleIndex: (0, pg_core_1.index)("idx_wholesale_tiers_active_schedule").on(table.isActive, table.isScheduled, table.scheduleStart),
670
+ customerLocationIndex: (0, pg_core_1.index)("idx_wholesale_tiers_customer_location").on(table.customerType, table.region, table.country),
671
+ }));