@porulle/core 0.7.0 → 0.8.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 (289) hide show
  1. package/dist/auth/setup.d.ts.map +1 -1
  2. package/dist/auth/setup.js +1 -0
  3. package/dist/config/defaults.d.ts.map +1 -1
  4. package/dist/config/defaults.js +5 -0
  5. package/dist/config/types.d.ts +17 -1
  6. package/dist/config/types.d.ts.map +1 -1
  7. package/dist/generated/plugin-manifest.d.ts +3 -0
  8. package/dist/generated/plugin-manifest.d.ts.map +1 -1
  9. package/dist/generated/plugin-manifest.js +1 -0
  10. package/dist/hooks/checkout.d.ts.map +1 -1
  11. package/dist/hooks/checkout.js +16 -1
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -0
  15. package/dist/interfaces/rest/index.d.ts.map +1 -1
  16. package/dist/interfaces/rest/index.js +12 -0
  17. package/dist/interfaces/rest/routes/admin/staff.d.ts +12 -0
  18. package/dist/interfaces/rest/routes/admin/staff.d.ts.map +1 -0
  19. package/dist/interfaces/rest/routes/admin/staff.js +172 -0
  20. package/dist/interfaces/rest/routes/analytics.d.ts +5 -0
  21. package/dist/interfaces/rest/routes/analytics.d.ts.map +1 -0
  22. package/dist/interfaces/rest/routes/analytics.js +24 -0
  23. package/dist/interfaces/rest/routes/carts.d.ts.map +1 -1
  24. package/dist/interfaces/rest/routes/carts.js +39 -2
  25. package/dist/interfaces/rest/routes/catalog.d.ts.map +1 -1
  26. package/dist/interfaces/rest/routes/catalog.js +17 -1
  27. package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -1
  28. package/dist/interfaces/rest/routes/checkout.js +17 -0
  29. package/dist/interfaces/rest/routes/documents.d.ts +10 -0
  30. package/dist/interfaces/rest/routes/documents.d.ts.map +1 -0
  31. package/dist/interfaces/rest/routes/documents.js +40 -0
  32. package/dist/interfaces/rest/routes/orders.d.ts.map +1 -1
  33. package/dist/interfaces/rest/routes/orders.js +98 -1
  34. package/dist/interfaces/rest/routes/pricing.d.ts.map +1 -1
  35. package/dist/interfaces/rest/routes/pricing.js +36 -1
  36. package/dist/interfaces/rest/routes/settings.d.ts +5 -0
  37. package/dist/interfaces/rest/routes/settings.d.ts.map +1 -0
  38. package/dist/interfaces/rest/routes/settings.js +50 -0
  39. package/dist/interfaces/rest/routes/shipping.d.ts +5 -0
  40. package/dist/interfaces/rest/routes/shipping.d.ts.map +1 -0
  41. package/dist/interfaces/rest/routes/shipping.js +68 -0
  42. package/dist/interfaces/rest/routes/tax.d.ts +5 -0
  43. package/dist/interfaces/rest/routes/tax.d.ts.map +1 -0
  44. package/dist/interfaces/rest/routes/tax.js +68 -0
  45. package/dist/interfaces/rest/schemas/admin-staff.d.ts +899 -0
  46. package/dist/interfaces/rest/schemas/admin-staff.d.ts.map +1 -0
  47. package/dist/interfaces/rest/schemas/admin-staff.js +98 -0
  48. package/dist/interfaces/rest/schemas/analytics.d.ts +252 -0
  49. package/dist/interfaces/rest/schemas/analytics.d.ts.map +1 -0
  50. package/dist/interfaces/rest/schemas/analytics.js +33 -0
  51. package/dist/interfaces/rest/schemas/carts.d.ts +656 -0
  52. package/dist/interfaces/rest/schemas/carts.d.ts.map +1 -1
  53. package/dist/interfaces/rest/schemas/carts.js +38 -0
  54. package/dist/interfaces/rest/schemas/catalog.d.ts +1218 -1
  55. package/dist/interfaces/rest/schemas/catalog.d.ts.map +1 -1
  56. package/dist/interfaces/rest/schemas/catalog.js +48 -0
  57. package/dist/interfaces/rest/schemas/checkout.d.ts +2 -0
  58. package/dist/interfaces/rest/schemas/checkout.d.ts.map +1 -1
  59. package/dist/interfaces/rest/schemas/checkout.js +4 -0
  60. package/dist/interfaces/rest/schemas/customer-portal.d.ts +35 -0
  61. package/dist/interfaces/rest/schemas/customer-portal.d.ts.map +1 -1
  62. package/dist/interfaces/rest/schemas/documents.d.ts +509 -0
  63. package/dist/interfaces/rest/schemas/documents.d.ts.map +1 -0
  64. package/dist/interfaces/rest/schemas/documents.js +65 -0
  65. package/dist/interfaces/rest/schemas/orders.d.ts +3110 -43
  66. package/dist/interfaces/rest/schemas/orders.d.ts.map +1 -1
  67. package/dist/interfaces/rest/schemas/orders.js +233 -0
  68. package/dist/interfaces/rest/schemas/pricing.d.ts +405 -0
  69. package/dist/interfaces/rest/schemas/pricing.d.ts.map +1 -1
  70. package/dist/interfaces/rest/schemas/pricing.js +70 -0
  71. package/dist/interfaces/rest/schemas/responses.d.ts +156 -0
  72. package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -1
  73. package/dist/interfaces/rest/schemas/search.d.ts +17 -0
  74. package/dist/interfaces/rest/schemas/search.d.ts.map +1 -1
  75. package/dist/interfaces/rest/schemas/settings.d.ts +397 -0
  76. package/dist/interfaces/rest/schemas/settings.d.ts.map +1 -0
  77. package/dist/interfaces/rest/schemas/settings.js +79 -0
  78. package/dist/interfaces/rest/schemas/shipping.d.ts +1093 -0
  79. package/dist/interfaces/rest/schemas/shipping.d.ts.map +1 -0
  80. package/dist/interfaces/rest/schemas/shipping.js +146 -0
  81. package/dist/interfaces/rest/schemas/tax.d.ts +1074 -0
  82. package/dist/interfaces/rest/schemas/tax.d.ts.map +1 -0
  83. package/dist/interfaces/rest/schemas/tax.js +132 -0
  84. package/dist/kernel/database/schema.d.ts +4 -0
  85. package/dist/kernel/database/schema.d.ts.map +1 -1
  86. package/dist/kernel/database/schema.js +8 -0
  87. package/dist/kernel/hooks/types.d.ts +1 -1
  88. package/dist/kernel/hooks/types.d.ts.map +1 -1
  89. package/dist/kernel/plugin/manifest.d.ts +23 -0
  90. package/dist/kernel/plugin/manifest.d.ts.map +1 -1
  91. package/dist/kernel/plugin/manifest.js +17 -2
  92. package/dist/modules/analytics/module.d.ts.map +1 -1
  93. package/dist/modules/analytics/module.js +6 -0
  94. package/dist/modules/analytics/reports.d.ts +58 -0
  95. package/dist/modules/analytics/reports.d.ts.map +1 -0
  96. package/dist/modules/analytics/reports.js +249 -0
  97. package/dist/modules/analytics/service.d.ts +10 -0
  98. package/dist/modules/analytics/service.d.ts.map +1 -1
  99. package/dist/modules/analytics/service.js +14 -0
  100. package/dist/modules/cart/repository/index.d.ts +7 -0
  101. package/dist/modules/cart/repository/index.d.ts.map +1 -1
  102. package/dist/modules/cart/repository/index.js +25 -1
  103. package/dist/modules/cart/schema.d.ts +17 -0
  104. package/dist/modules/cart/schema.d.ts.map +1 -1
  105. package/dist/modules/cart/schema.js +2 -0
  106. package/dist/modules/cart/schemas.d.ts +1 -0
  107. package/dist/modules/cart/schemas.d.ts.map +1 -1
  108. package/dist/modules/cart/schemas.js +1 -0
  109. package/dist/modules/cart/service.d.ts +32 -0
  110. package/dist/modules/cart/service.d.ts.map +1 -1
  111. package/dist/modules/cart/service.js +58 -0
  112. package/dist/modules/catalog/entity-service.d.ts +21 -0
  113. package/dist/modules/catalog/entity-service.d.ts.map +1 -1
  114. package/dist/modules/catalog/entity-service.js +132 -3
  115. package/dist/modules/catalog/schema.d.ts +34 -0
  116. package/dist/modules/catalog/schema.d.ts.map +1 -1
  117. package/dist/modules/catalog/schema.js +5 -0
  118. package/dist/modules/catalog/schemas.d.ts +3 -0
  119. package/dist/modules/catalog/schemas.d.ts.map +1 -1
  120. package/dist/modules/catalog/schemas.js +3 -0
  121. package/dist/modules/catalog/service.d.ts +36 -0
  122. package/dist/modules/catalog/service.d.ts.map +1 -1
  123. package/dist/modules/catalog/service.js +6 -0
  124. package/dist/modules/documents/module.d.ts +7 -0
  125. package/dist/modules/documents/module.d.ts.map +1 -0
  126. package/dist/modules/documents/module.js +12 -0
  127. package/dist/modules/documents/pdf.d.ts +25 -0
  128. package/dist/modules/documents/pdf.d.ts.map +1 -0
  129. package/dist/modules/documents/pdf.js +80 -0
  130. package/dist/modules/documents/render.d.ts +32 -0
  131. package/dist/modules/documents/render.d.ts.map +1 -0
  132. package/dist/modules/documents/render.js +190 -0
  133. package/dist/modules/documents/repository/index.d.ts +25 -0
  134. package/dist/modules/documents/repository/index.d.ts.map +1 -0
  135. package/dist/modules/documents/repository/index.js +47 -0
  136. package/dist/modules/documents/schema.d.ts +214 -0
  137. package/dist/modules/documents/schema.d.ts.map +1 -0
  138. package/dist/modules/documents/schema.js +42 -0
  139. package/dist/modules/documents/service.d.ts +51 -0
  140. package/dist/modules/documents/service.d.ts.map +1 -0
  141. package/dist/modules/documents/service.js +119 -0
  142. package/dist/modules/fulfillment/service.d.ts +18 -0
  143. package/dist/modules/fulfillment/service.d.ts.map +1 -1
  144. package/dist/modules/fulfillment/service.js +85 -1
  145. package/dist/modules/orders/repository/index.d.ts +18 -1
  146. package/dist/modules/orders/repository/index.d.ts.map +1 -1
  147. package/dist/modules/orders/repository/index.js +86 -1
  148. package/dist/modules/orders/schema.d.ts +374 -0
  149. package/dist/modules/orders/schema.d.ts.map +1 -1
  150. package/dist/modules/orders/schema.js +52 -1
  151. package/dist/modules/orders/service.d.ts +86 -1
  152. package/dist/modules/orders/service.d.ts.map +1 -1
  153. package/dist/modules/orders/service.js +447 -20
  154. package/dist/modules/pricing/repository/index.d.ts +5 -0
  155. package/dist/modules/pricing/repository/index.d.ts.map +1 -1
  156. package/dist/modules/pricing/repository/index.js +19 -0
  157. package/dist/modules/pricing/service.d.ts +18 -0
  158. package/dist/modules/pricing/service.d.ts.map +1 -1
  159. package/dist/modules/pricing/service.js +38 -0
  160. package/dist/modules/settings/module.d.ts +6 -0
  161. package/dist/modules/settings/module.d.ts.map +1 -0
  162. package/dist/modules/settings/module.js +11 -0
  163. package/dist/modules/settings/repository/index.d.ts +16 -0
  164. package/dist/modules/settings/repository/index.d.ts.map +1 -0
  165. package/dist/modules/settings/repository/index.js +41 -0
  166. package/dist/modules/settings/schema.d.ts +121 -0
  167. package/dist/modules/settings/schema.d.ts.map +1 -0
  168. package/dist/modules/settings/schema.js +24 -0
  169. package/dist/modules/settings/service.d.ts +26 -0
  170. package/dist/modules/settings/service.d.ts.map +1 -0
  171. package/dist/modules/settings/service.js +51 -0
  172. package/dist/modules/shipping/calculator.d.ts +5 -0
  173. package/dist/modules/shipping/calculator.d.ts.map +1 -1
  174. package/dist/modules/shipping/calculator.js +10 -0
  175. package/dist/modules/shipping/module.d.ts +5 -1
  176. package/dist/modules/shipping/module.d.ts.map +1 -1
  177. package/dist/modules/shipping/module.js +4 -1
  178. package/dist/modules/shipping/repository/index.d.ts +27 -2
  179. package/dist/modules/shipping/repository/index.d.ts.map +1 -1
  180. package/dist/modules/shipping/repository/index.js +105 -1
  181. package/dist/modules/shipping/schema.d.ts +419 -0
  182. package/dist/modules/shipping/schema.d.ts.map +1 -0
  183. package/dist/modules/shipping/schema.js +56 -0
  184. package/dist/modules/shipping/service.d.ts +54 -0
  185. package/dist/modules/shipping/service.d.ts.map +1 -1
  186. package/dist/modules/shipping/service.js +161 -2
  187. package/dist/modules/tax/adapter.d.ts +13 -0
  188. package/dist/modules/tax/adapter.d.ts.map +1 -1
  189. package/dist/modules/tax/module.d.ts +5 -1
  190. package/dist/modules/tax/module.d.ts.map +1 -1
  191. package/dist/modules/tax/module.js +4 -1
  192. package/dist/modules/tax/repository/index.d.ts +38 -2
  193. package/dist/modules/tax/repository/index.d.ts.map +1 -1
  194. package/dist/modules/tax/repository/index.js +138 -1
  195. package/dist/modules/tax/schema.d.ts +355 -0
  196. package/dist/modules/tax/schema.d.ts.map +1 -0
  197. package/dist/modules/tax/schema.js +55 -0
  198. package/dist/modules/tax/service.d.ts +60 -1
  199. package/dist/modules/tax/service.d.ts.map +1 -1
  200. package/dist/modules/tax/service.js +227 -2
  201. package/dist/runtime/kernel-modules.d.ts +15 -2
  202. package/dist/runtime/kernel-modules.d.ts.map +1 -1
  203. package/dist/runtime/kernel-modules.js +4 -0
  204. package/dist/runtime/kernel-types.d.ts +5 -1
  205. package/dist/runtime/kernel-types.d.ts.map +1 -1
  206. package/dist/runtime/kernel-types.js +2 -0
  207. package/dist/runtime/server.js +1 -1
  208. package/dist/test-utils/create-plugin-test-app.d.ts +3 -0
  209. package/dist/test-utils/create-plugin-test-app.d.ts.map +1 -1
  210. package/dist/test-utils/create-plugin-test-app.js +15 -3
  211. package/dist/test-utils/rest-api-test-utils.d.ts.map +1 -1
  212. package/dist/test-utils/rest-api-test-utils.js +6 -0
  213. package/package.json +3 -3
  214. package/src/auth/setup.ts +1 -0
  215. package/src/config/defaults.ts +5 -0
  216. package/src/config/types.ts +17 -1
  217. package/src/generated/plugin-capabilities.d.ts +1 -0
  218. package/src/generated/plugin-manifest.ts +1 -0
  219. package/src/generated/plugin-repositories.d.ts +1 -0
  220. package/src/hooks/checkout.ts +25 -3
  221. package/src/index.ts +1 -0
  222. package/src/interfaces/rest/index.ts +12 -0
  223. package/src/interfaces/rest/routes/admin/staff.ts +218 -0
  224. package/src/interfaces/rest/routes/analytics.ts +33 -0
  225. package/src/interfaces/rest/routes/carts.ts +52 -2
  226. package/src/interfaces/rest/routes/catalog.ts +34 -0
  227. package/src/interfaces/rest/routes/checkout.ts +22 -0
  228. package/src/interfaces/rest/routes/documents.ts +61 -0
  229. package/src/interfaces/rest/routes/orders.ts +137 -1
  230. package/src/interfaces/rest/routes/pricing.ts +44 -1
  231. package/src/interfaces/rest/routes/settings.ts +61 -0
  232. package/src/interfaces/rest/routes/shipping.ts +92 -0
  233. package/src/interfaces/rest/routes/tax.ts +90 -0
  234. package/src/interfaces/rest/schemas/admin-staff.ts +110 -0
  235. package/src/interfaces/rest/schemas/analytics.ts +39 -0
  236. package/src/interfaces/rest/schemas/carts.ts +40 -0
  237. package/src/interfaces/rest/schemas/catalog.ts +53 -0
  238. package/src/interfaces/rest/schemas/checkout.ts +4 -0
  239. package/src/interfaces/rest/schemas/documents.ts +72 -0
  240. package/src/interfaces/rest/schemas/orders.ts +257 -0
  241. package/src/interfaces/rest/schemas/pricing.ts +75 -0
  242. package/src/interfaces/rest/schemas/settings.ts +93 -0
  243. package/src/interfaces/rest/schemas/shipping.ts +164 -0
  244. package/src/interfaces/rest/schemas/tax.ts +148 -0
  245. package/src/kernel/database/schema.ts +12 -0
  246. package/src/kernel/hooks/types.ts +1 -0
  247. package/src/kernel/plugin/manifest.ts +38 -2
  248. package/src/modules/analytics/module.ts +10 -0
  249. package/src/modules/analytics/reports.ts +311 -0
  250. package/src/modules/analytics/service.ts +23 -0
  251. package/src/modules/cart/repository/index.ts +30 -1
  252. package/src/modules/cart/schema.ts +2 -0
  253. package/src/modules/cart/schemas.ts +1 -0
  254. package/src/modules/cart/service.ts +101 -0
  255. package/src/modules/catalog/entity-service.ts +168 -3
  256. package/src/modules/catalog/schema.ts +5 -0
  257. package/src/modules/catalog/schemas.ts +3 -0
  258. package/src/modules/catalog/service.ts +30 -0
  259. package/src/modules/documents/module.ts +19 -0
  260. package/src/modules/documents/pdf.ts +101 -0
  261. package/src/modules/documents/render.ts +231 -0
  262. package/src/modules/documents/repository/index.ts +68 -0
  263. package/src/modules/documents/schema.ts +44 -0
  264. package/src/modules/documents/service.ts +176 -0
  265. package/src/modules/fulfillment/service.ts +139 -1
  266. package/src/modules/orders/repository/index.ts +127 -1
  267. package/src/modules/orders/schema.ts +54 -1
  268. package/src/modules/orders/service.ts +654 -22
  269. package/src/modules/pricing/repository/index.ts +34 -0
  270. package/src/modules/pricing/service.ts +71 -0
  271. package/src/modules/settings/module.ts +18 -0
  272. package/src/modules/settings/repository/index.ts +59 -0
  273. package/src/modules/settings/schema.ts +25 -0
  274. package/src/modules/settings/service.ts +82 -0
  275. package/src/modules/shipping/calculator.ts +27 -0
  276. package/src/modules/shipping/module.ts +6 -2
  277. package/src/modules/shipping/repository/index.ts +136 -2
  278. package/src/modules/shipping/schema.ts +58 -0
  279. package/src/modules/shipping/service.ts +260 -1
  280. package/src/modules/tax/adapter.ts +9 -0
  281. package/src/modules/tax/module.ts +6 -2
  282. package/src/modules/tax/repository/index.ts +169 -2
  283. package/src/modules/tax/schema.ts +57 -0
  284. package/src/modules/tax/service.ts +313 -2
  285. package/src/runtime/kernel-modules.ts +4 -0
  286. package/src/runtime/kernel-types.ts +6 -0
  287. package/src/runtime/server.ts +1 -1
  288. package/src/test-utils/create-plugin-test-app.ts +17 -4
  289. package/src/test-utils/rest-api-test-utils.ts +6 -0
@@ -1,5 +1,5 @@
1
1
  import { eq, and, or, gte, lte, desc, sql } from "drizzle-orm";
2
- import { orders, orderLineItems, orderStatusHistory } from "../schema.js";
2
+ import { orders, orderLineItems, orderNotes, orderRefunds, orderStatusHistory } from "../schema.js";
3
3
  import { customers } from "../../customers/schema.js";
4
4
  /**
5
5
  * OrdersRepository provides type-safe database operations for orders.
@@ -106,6 +106,14 @@ export class OrdersRepository {
106
106
  }
107
107
  return query;
108
108
  }
109
+ async findByIdempotencyKey(orgId, idempotencyKey, ctx) {
110
+ const db = this.getDb(ctx);
111
+ const rows = await db
112
+ .select()
113
+ .from(orders)
114
+ .where(and(eq(orders.organizationId, orgId), eq(orders.idempotencyKey, idempotencyKey)));
115
+ return rows[0];
116
+ }
109
117
  async create(data, ctx) {
110
118
  const db = this.getDb(ctx);
111
119
  const rows = await db.insert(orders).values(data).returning();
@@ -223,6 +231,83 @@ export class OrdersRepository {
223
231
  return { order, lineItems };
224
232
  }
225
233
  // ─────────────────────────────────────────────────────────────────────────────
234
+ // Line-level refunds (issue #52)
235
+ // ─────────────────────────────────────────────────────────────────────────────
236
+ async createRefund(data, ctx) {
237
+ const db = this.getDb(ctx);
238
+ const rows = await db.insert(orderRefunds).values(data).returning();
239
+ return rows[0];
240
+ }
241
+ async findRefundById(orgId, id, ctx) {
242
+ const db = this.getDb(ctx);
243
+ const rows = await db
244
+ .select()
245
+ .from(orderRefunds)
246
+ .where(and(eq(orderRefunds.organizationId, orgId), eq(orderRefunds.id, id)));
247
+ return rows[0];
248
+ }
249
+ async findRefundsByOrderId(orderId, ctx) {
250
+ const db = this.getDb(ctx);
251
+ return db
252
+ .select()
253
+ .from(orderRefunds)
254
+ .where(eq(orderRefunds.orderId, orderId))
255
+ .orderBy(desc(orderRefunds.createdAt));
256
+ }
257
+ async markRefundUndone(id, undoneBy, ctx) {
258
+ const db = this.getDb(ctx);
259
+ const rows = await db
260
+ .update(orderRefunds)
261
+ .set({ status: "undone", undoneAt: new Date(), undoneBy })
262
+ .where(and(eq(orderRefunds.id, id), eq(orderRefunds.status, "completed")))
263
+ .returning();
264
+ return rows[0];
265
+ }
266
+ /**
267
+ * Sum of completed refunds performed by an operator for the local calendar
268
+ * day in the given timezone — the daily-cap accounting query.
269
+ */
270
+ async sumRefundsByOperatorToday(orgId, performedBy, timezone, ctx) {
271
+ const db = this.getDb(ctx);
272
+ const result = await db.execute(sql `
273
+ SELECT COALESCE(sum(amount), 0)::int AS "total"
274
+ FROM order_refunds
275
+ WHERE organization_id = ${orgId}
276
+ AND performed_by = ${performedBy}
277
+ AND status = 'completed'
278
+ AND (created_at AT TIME ZONE ${timezone})::date = (now() AT TIME ZONE ${timezone})::date
279
+ `);
280
+ const rows = Array.isArray(result)
281
+ ? result
282
+ : (result.rows ?? []);
283
+ const total = rows[0]?.total;
284
+ return typeof total === "bigint" ? Number(total) : (total ?? 0);
285
+ }
286
+ // ─────────────────────────────────────────────────────────────────────────────
287
+ // Order notes (issue #56)
288
+ // ─────────────────────────────────────────────────────────────────────────────
289
+ async createNote(data, ctx) {
290
+ const db = this.getDb(ctx);
291
+ const rows = await db.insert(orderNotes).values(data).returning();
292
+ return rows[0];
293
+ }
294
+ async findNotesByOrderId(orderId, ctx) {
295
+ const db = this.getDb(ctx);
296
+ return db
297
+ .select()
298
+ .from(orderNotes)
299
+ .where(eq(orderNotes.orderId, orderId))
300
+ .orderBy(desc(orderNotes.pinned), desc(orderNotes.createdAt));
301
+ }
302
+ async deleteNote(orgId, orderId, noteId, ctx) {
303
+ const db = this.getDb(ctx);
304
+ const rows = await db
305
+ .delete(orderNotes)
306
+ .where(and(eq(orderNotes.id, noteId), eq(orderNotes.orderId, orderId), eq(orderNotes.organizationId, orgId)))
307
+ .returning();
308
+ return rows.length > 0;
309
+ }
310
+ // ─────────────────────────────────────────────────────────────────────────────
226
311
  // Order Number Generation
227
312
  // ─────────────────────────────────────────────────────────────────────────────
228
313
  async getNextOrderNumber(ctx) {
@@ -240,6 +240,23 @@ export declare const orders: import("drizzle-orm/pg-core").PgTableWithColumns<{
240
240
  identity: undefined;
241
241
  generated: undefined;
242
242
  }, {}, {}>;
243
+ idempotencyKey: import("drizzle-orm/pg-core").PgColumn<{
244
+ name: "idempotency_key";
245
+ tableName: "orders";
246
+ dataType: "string";
247
+ columnType: "PgText";
248
+ data: string;
249
+ driverParam: string;
250
+ notNull: false;
251
+ hasDefault: false;
252
+ isPrimaryKey: false;
253
+ isAutoincrement: false;
254
+ hasRuntimeDefault: false;
255
+ enumValues: [string, ...string[]];
256
+ baseColumn: never;
257
+ identity: undefined;
258
+ generated: undefined;
259
+ }, {}, {}>;
243
260
  metadata: import("drizzle-orm/pg-core").PgColumn<{
244
261
  name: "metadata";
245
262
  tableName: "orders";
@@ -521,6 +538,23 @@ export declare const orderLineItems: import("drizzle-orm/pg-core").PgTableWithCo
521
538
  identity: undefined;
522
539
  generated: undefined;
523
540
  }, {}, {}>;
541
+ refundedQuantity: import("drizzle-orm/pg-core").PgColumn<{
542
+ name: "refunded_quantity";
543
+ tableName: "order_line_items";
544
+ dataType: "number";
545
+ columnType: "PgInteger";
546
+ data: number;
547
+ driverParam: string | number;
548
+ notNull: true;
549
+ hasDefault: true;
550
+ isPrimaryKey: false;
551
+ isAutoincrement: false;
552
+ hasRuntimeDefault: false;
553
+ enumValues: undefined;
554
+ baseColumn: never;
555
+ identity: undefined;
556
+ generated: undefined;
557
+ }, {}, {}>;
524
558
  fulfillmentStatus: import("drizzle-orm/pg-core").PgColumn<{
525
559
  name: "fulfillment_status";
526
560
  tableName: "order_line_items";
@@ -560,6 +594,346 @@ export declare const orderLineItems: import("drizzle-orm/pg-core").PgTableWithCo
560
594
  };
561
595
  dialect: "pg";
562
596
  }>;
597
+ /**
598
+ * Line-level refunds (issue #52). One row per refund operation — the ledger
599
+ * behind the daily refund cap and the undo window. `lines` records which
600
+ * line items and quantities the refund covered so undo can restore them.
601
+ */
602
+ export declare const orderRefunds: import("drizzle-orm/pg-core").PgTableWithColumns<{
603
+ name: "order_refunds";
604
+ schema: undefined;
605
+ columns: {
606
+ id: import("drizzle-orm/pg-core").PgColumn<{
607
+ name: "id";
608
+ tableName: "order_refunds";
609
+ dataType: "string";
610
+ columnType: "PgUUID";
611
+ data: string;
612
+ driverParam: string;
613
+ notNull: true;
614
+ hasDefault: true;
615
+ isPrimaryKey: true;
616
+ isAutoincrement: false;
617
+ hasRuntimeDefault: false;
618
+ enumValues: undefined;
619
+ baseColumn: never;
620
+ identity: undefined;
621
+ generated: undefined;
622
+ }, {}, {}>;
623
+ organizationId: import("drizzle-orm/pg-core").PgColumn<{
624
+ name: "organization_id";
625
+ tableName: "order_refunds";
626
+ dataType: "string";
627
+ columnType: "PgText";
628
+ data: string;
629
+ driverParam: string;
630
+ notNull: true;
631
+ hasDefault: false;
632
+ isPrimaryKey: false;
633
+ isAutoincrement: false;
634
+ hasRuntimeDefault: false;
635
+ enumValues: [string, ...string[]];
636
+ baseColumn: never;
637
+ identity: undefined;
638
+ generated: undefined;
639
+ }, {}, {}>;
640
+ orderId: import("drizzle-orm/pg-core").PgColumn<{
641
+ name: "order_id";
642
+ tableName: "order_refunds";
643
+ dataType: "string";
644
+ columnType: "PgUUID";
645
+ data: string;
646
+ driverParam: string;
647
+ notNull: true;
648
+ hasDefault: false;
649
+ isPrimaryKey: false;
650
+ isAutoincrement: false;
651
+ hasRuntimeDefault: false;
652
+ enumValues: undefined;
653
+ baseColumn: never;
654
+ identity: undefined;
655
+ generated: undefined;
656
+ }, {}, {}>;
657
+ amount: import("drizzle-orm/pg-core").PgColumn<{
658
+ name: "amount";
659
+ tableName: "order_refunds";
660
+ dataType: "number";
661
+ columnType: "PgInteger";
662
+ data: number;
663
+ driverParam: string | number;
664
+ notNull: true;
665
+ hasDefault: false;
666
+ isPrimaryKey: false;
667
+ isAutoincrement: false;
668
+ hasRuntimeDefault: false;
669
+ enumValues: undefined;
670
+ baseColumn: never;
671
+ identity: undefined;
672
+ generated: undefined;
673
+ }, {}, {}>;
674
+ reason: import("drizzle-orm/pg-core").PgColumn<{
675
+ name: "reason";
676
+ tableName: "order_refunds";
677
+ dataType: "string";
678
+ columnType: "PgText";
679
+ data: string;
680
+ driverParam: string;
681
+ notNull: false;
682
+ hasDefault: false;
683
+ isPrimaryKey: false;
684
+ isAutoincrement: false;
685
+ hasRuntimeDefault: false;
686
+ enumValues: [string, ...string[]];
687
+ baseColumn: never;
688
+ identity: undefined;
689
+ generated: undefined;
690
+ }, {}, {}>;
691
+ lines: import("drizzle-orm/pg-core").PgColumn<{
692
+ name: "lines";
693
+ tableName: "order_refunds";
694
+ dataType: "json";
695
+ columnType: "PgJsonb";
696
+ data: {
697
+ lineItemId: string;
698
+ quantity: number;
699
+ amount: number;
700
+ }[];
701
+ driverParam: unknown;
702
+ notNull: true;
703
+ hasDefault: false;
704
+ isPrimaryKey: false;
705
+ isAutoincrement: false;
706
+ hasRuntimeDefault: false;
707
+ enumValues: undefined;
708
+ baseColumn: never;
709
+ identity: undefined;
710
+ generated: undefined;
711
+ }, {}, {
712
+ $type: {
713
+ lineItemId: string;
714
+ quantity: number;
715
+ amount: number;
716
+ }[];
717
+ }>;
718
+ performedBy: import("drizzle-orm/pg-core").PgColumn<{
719
+ name: "performed_by";
720
+ tableName: "order_refunds";
721
+ dataType: "string";
722
+ columnType: "PgText";
723
+ data: string;
724
+ driverParam: string;
725
+ notNull: true;
726
+ hasDefault: false;
727
+ isPrimaryKey: false;
728
+ isAutoincrement: false;
729
+ hasRuntimeDefault: false;
730
+ enumValues: [string, ...string[]];
731
+ baseColumn: never;
732
+ identity: undefined;
733
+ generated: undefined;
734
+ }, {}, {}>;
735
+ status: import("drizzle-orm/pg-core").PgColumn<{
736
+ name: "status";
737
+ tableName: "order_refunds";
738
+ dataType: "string";
739
+ columnType: "PgText";
740
+ data: "completed" | "undone";
741
+ driverParam: string;
742
+ notNull: true;
743
+ hasDefault: true;
744
+ isPrimaryKey: false;
745
+ isAutoincrement: false;
746
+ hasRuntimeDefault: false;
747
+ enumValues: ["completed", "undone"];
748
+ baseColumn: never;
749
+ identity: undefined;
750
+ generated: undefined;
751
+ }, {}, {}>;
752
+ undoneAt: import("drizzle-orm/pg-core").PgColumn<{
753
+ name: "undone_at";
754
+ tableName: "order_refunds";
755
+ dataType: "date";
756
+ columnType: "PgTimestamp";
757
+ data: Date;
758
+ driverParam: string;
759
+ notNull: false;
760
+ hasDefault: false;
761
+ isPrimaryKey: false;
762
+ isAutoincrement: false;
763
+ hasRuntimeDefault: false;
764
+ enumValues: undefined;
765
+ baseColumn: never;
766
+ identity: undefined;
767
+ generated: undefined;
768
+ }, {}, {}>;
769
+ undoneBy: import("drizzle-orm/pg-core").PgColumn<{
770
+ name: "undone_by";
771
+ tableName: "order_refunds";
772
+ dataType: "string";
773
+ columnType: "PgText";
774
+ data: string;
775
+ driverParam: string;
776
+ notNull: false;
777
+ hasDefault: false;
778
+ isPrimaryKey: false;
779
+ isAutoincrement: false;
780
+ hasRuntimeDefault: false;
781
+ enumValues: [string, ...string[]];
782
+ baseColumn: never;
783
+ identity: undefined;
784
+ generated: undefined;
785
+ }, {}, {}>;
786
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
787
+ name: "created_at";
788
+ tableName: "order_refunds";
789
+ dataType: "date";
790
+ columnType: "PgTimestamp";
791
+ data: Date;
792
+ driverParam: string;
793
+ notNull: true;
794
+ hasDefault: true;
795
+ isPrimaryKey: false;
796
+ isAutoincrement: false;
797
+ hasRuntimeDefault: false;
798
+ enumValues: undefined;
799
+ baseColumn: never;
800
+ identity: undefined;
801
+ generated: undefined;
802
+ }, {}, {}>;
803
+ };
804
+ dialect: "pg";
805
+ }>;
806
+ /**
807
+ * Operator annotations on orders (issue #56) — "customer will pick up
808
+ * Thursday". Merged into GET /orders/{id}/timeline alongside status history
809
+ * and refund ledger events.
810
+ */
811
+ export declare const orderNotes: import("drizzle-orm/pg-core").PgTableWithColumns<{
812
+ name: "order_notes";
813
+ schema: undefined;
814
+ columns: {
815
+ id: import("drizzle-orm/pg-core").PgColumn<{
816
+ name: "id";
817
+ tableName: "order_notes";
818
+ dataType: "string";
819
+ columnType: "PgUUID";
820
+ data: string;
821
+ driverParam: string;
822
+ notNull: true;
823
+ hasDefault: true;
824
+ isPrimaryKey: true;
825
+ isAutoincrement: false;
826
+ hasRuntimeDefault: false;
827
+ enumValues: undefined;
828
+ baseColumn: never;
829
+ identity: undefined;
830
+ generated: undefined;
831
+ }, {}, {}>;
832
+ organizationId: import("drizzle-orm/pg-core").PgColumn<{
833
+ name: "organization_id";
834
+ tableName: "order_notes";
835
+ dataType: "string";
836
+ columnType: "PgText";
837
+ data: string;
838
+ driverParam: string;
839
+ notNull: true;
840
+ hasDefault: false;
841
+ isPrimaryKey: false;
842
+ isAutoincrement: false;
843
+ hasRuntimeDefault: false;
844
+ enumValues: [string, ...string[]];
845
+ baseColumn: never;
846
+ identity: undefined;
847
+ generated: undefined;
848
+ }, {}, {}>;
849
+ orderId: import("drizzle-orm/pg-core").PgColumn<{
850
+ name: "order_id";
851
+ tableName: "order_notes";
852
+ dataType: "string";
853
+ columnType: "PgUUID";
854
+ data: string;
855
+ driverParam: string;
856
+ notNull: true;
857
+ hasDefault: false;
858
+ isPrimaryKey: false;
859
+ isAutoincrement: false;
860
+ hasRuntimeDefault: false;
861
+ enumValues: undefined;
862
+ baseColumn: never;
863
+ identity: undefined;
864
+ generated: undefined;
865
+ }, {}, {}>;
866
+ author: import("drizzle-orm/pg-core").PgColumn<{
867
+ name: "author";
868
+ tableName: "order_notes";
869
+ dataType: "string";
870
+ columnType: "PgText";
871
+ data: string;
872
+ driverParam: string;
873
+ notNull: true;
874
+ hasDefault: false;
875
+ isPrimaryKey: false;
876
+ isAutoincrement: false;
877
+ hasRuntimeDefault: false;
878
+ enumValues: [string, ...string[]];
879
+ baseColumn: never;
880
+ identity: undefined;
881
+ generated: undefined;
882
+ }, {}, {}>;
883
+ body: import("drizzle-orm/pg-core").PgColumn<{
884
+ name: "body";
885
+ tableName: "order_notes";
886
+ dataType: "string";
887
+ columnType: "PgText";
888
+ data: string;
889
+ driverParam: string;
890
+ notNull: true;
891
+ hasDefault: false;
892
+ isPrimaryKey: false;
893
+ isAutoincrement: false;
894
+ hasRuntimeDefault: false;
895
+ enumValues: [string, ...string[]];
896
+ baseColumn: never;
897
+ identity: undefined;
898
+ generated: undefined;
899
+ }, {}, {}>;
900
+ pinned: import("drizzle-orm/pg-core").PgColumn<{
901
+ name: "pinned";
902
+ tableName: "order_notes";
903
+ dataType: "boolean";
904
+ columnType: "PgBoolean";
905
+ data: boolean;
906
+ driverParam: boolean;
907
+ notNull: true;
908
+ hasDefault: true;
909
+ isPrimaryKey: false;
910
+ isAutoincrement: false;
911
+ hasRuntimeDefault: false;
912
+ enumValues: undefined;
913
+ baseColumn: never;
914
+ identity: undefined;
915
+ generated: undefined;
916
+ }, {}, {}>;
917
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
918
+ name: "created_at";
919
+ tableName: "order_notes";
920
+ dataType: "date";
921
+ columnType: "PgTimestamp";
922
+ data: Date;
923
+ driverParam: string;
924
+ notNull: true;
925
+ hasDefault: true;
926
+ isPrimaryKey: false;
927
+ isAutoincrement: false;
928
+ hasRuntimeDefault: false;
929
+ enumValues: undefined;
930
+ baseColumn: never;
931
+ identity: undefined;
932
+ generated: undefined;
933
+ }, {}, {}>;
934
+ };
935
+ dialect: "pg";
936
+ }>;
563
937
  export declare const orderStatusHistory: import("drizzle-orm/pg-core").PgTableWithColumns<{
564
938
  name: "order_status_history";
565
939
  schema: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/modules/orders/schema.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BhB,CAAC;AAEJ,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBzB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY7B,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/modules/orders/schema.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgChB,CAAC;AAEJ,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBzB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAQyB,MAAM;0BAAY,MAAM;wBAAU,MAAM;;;;;;;;;;;;;;4BAAxC,MAAM;0BAAY,MAAM;wBAAU,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASxF,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYrB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY7B,CAAC"}
@@ -1,4 +1,5 @@
1
- import { index, integer, jsonb, pgTable, text, timestamp, uniqueIndex, uuid } from "drizzle-orm/pg-core";
1
+ import { sql } from "drizzle-orm";
2
+ import { boolean, index, integer, jsonb, pgTable, text, timestamp, uniqueIndex, uuid } from "drizzle-orm/pg-core";
2
3
  import { organization } from "../../auth/auth-schema.js";
3
4
  import { sellableEntities, variants } from "../catalog/schema.js";
4
5
  export const orders = pgTable("orders", {
@@ -16,6 +17,9 @@ export const orders = pgTable("orders", {
16
17
  amountCaptured: integer("amount_captured"),
17
18
  paymentIntentId: text("payment_intent_id"),
18
19
  paymentMethodId: text("payment_method_id"),
20
+ // Client-supplied key making order creation safely retryable (offline POS
21
+ // queues, network retries) — replays return the original order.
22
+ idempotencyKey: text("idempotency_key"),
19
23
  metadata: jsonb("metadata").$type().default({}),
20
24
  placedAt: timestamp("placed_at", { withTimezone: true }).defaultNow().notNull(),
21
25
  fulfilledAt: timestamp("fulfilled_at", { withTimezone: true }),
@@ -27,6 +31,9 @@ export const orders = pgTable("orders", {
27
31
  customerIdIdx: index("idx_orders_customer_id").on(table.customerId),
28
32
  placedAtIdx: index("idx_orders_placed_at").on(table.placedAt),
29
33
  paymentIntentIdx: index("idx_orders_payment_intent").on(table.paymentIntentId),
34
+ orgIdempotencyKeyUnique: uniqueIndex("orders_org_idempotency_key_unique")
35
+ .on(table.organizationId, table.idempotencyKey)
36
+ .where(sql `idempotency_key IS NOT NULL`),
30
37
  }));
31
38
  export const orderLineItems = pgTable("order_line_items", {
32
39
  id: uuid("id").defaultRandom().primaryKey(),
@@ -43,12 +50,56 @@ export const orderLineItems = pgTable("order_line_items", {
43
50
  totalPrice: integer("total_price").notNull(),
44
51
  taxAmount: integer("tax_amount").notNull().default(0),
45
52
  discountAmount: integer("discount_amount").notNull().default(0),
53
+ // Units already refunded on this line (issue #52) — line-level refund REST
54
+ // rejects refunds beyond `quantity - refundedQuantity`.
55
+ refundedQuantity: integer("refunded_quantity").notNull().default(0),
46
56
  fulfillmentStatus: text("fulfillment_status").notNull().default("unfulfilled"),
47
57
  metadata: jsonb("metadata").$type().default({}),
48
58
  }, (table) => [
49
59
  index("idx_order_line_items_order_id").on(table.orderId),
50
60
  index("idx_order_line_items_entity_id").on(table.entityId),
51
61
  ]);
62
+ /**
63
+ * Line-level refunds (issue #52). One row per refund operation — the ledger
64
+ * behind the daily refund cap and the undo window. `lines` records which
65
+ * line items and quantities the refund covered so undo can restore them.
66
+ */
67
+ export const orderRefunds = pgTable("order_refunds", {
68
+ id: uuid("id").defaultRandom().primaryKey(),
69
+ organizationId: text("organization_id").notNull().references(() => organization.id, { onDelete: "cascade" }),
70
+ orderId: uuid("order_id")
71
+ .references(() => orders.id, { onDelete: "cascade" })
72
+ .notNull(),
73
+ amount: integer("amount").notNull(),
74
+ reason: text("reason"),
75
+ lines: jsonb("lines").$type().notNull(),
76
+ performedBy: text("performed_by").notNull(),
77
+ status: text("status", { enum: ["completed", "undone"] }).notNull().default("completed"),
78
+ undoneAt: timestamp("undone_at", { withTimezone: true }),
79
+ undoneBy: text("undone_by"),
80
+ createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(),
81
+ }, (table) => [
82
+ index("idx_order_refunds_order_id").on(table.orderId),
83
+ index("idx_order_refunds_org_performed_by").on(table.organizationId, table.performedBy, table.createdAt),
84
+ ]);
85
+ /**
86
+ * Operator annotations on orders (issue #56) — "customer will pick up
87
+ * Thursday". Merged into GET /orders/{id}/timeline alongside status history
88
+ * and refund ledger events.
89
+ */
90
+ export const orderNotes = pgTable("order_notes", {
91
+ id: uuid("id").defaultRandom().primaryKey(),
92
+ organizationId: text("organization_id").notNull().references(() => organization.id, { onDelete: "cascade" }),
93
+ orderId: uuid("order_id")
94
+ .references(() => orders.id, { onDelete: "cascade" })
95
+ .notNull(),
96
+ author: text("author").notNull(),
97
+ body: text("body").notNull(),
98
+ pinned: boolean("pinned").notNull().default(false),
99
+ createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(),
100
+ }, (table) => [
101
+ index("idx_order_notes_order_id").on(table.orderId),
102
+ ]);
52
103
  export const orderStatusHistory = pgTable("order_status_history", {
53
104
  id: uuid("id").defaultRandom().primaryKey(),
54
105
  orderId: uuid("order_id")