@porulle/core 0.7.0 → 0.9.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 (325) hide show
  1. package/dist/auth/middleware.d.ts.map +1 -1
  2. package/dist/auth/middleware.js +26 -7
  3. package/dist/auth/setup.d.ts.map +1 -1
  4. package/dist/auth/setup.js +8 -5
  5. package/dist/config/defaults.d.ts.map +1 -1
  6. package/dist/config/defaults.js +7 -0
  7. package/dist/config/types.d.ts +26 -1
  8. package/dist/config/types.d.ts.map +1 -1
  9. package/dist/generated/plugin-manifest.d.ts +3 -0
  10. package/dist/generated/plugin-manifest.d.ts.map +1 -1
  11. package/dist/generated/plugin-manifest.js +1 -0
  12. package/dist/hooks/checkout-completion.d.ts.map +1 -1
  13. package/dist/hooks/checkout-completion.js +2 -2
  14. package/dist/hooks/checkout.d.ts.map +1 -1
  15. package/dist/hooks/checkout.js +17 -2
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +1 -0
  19. package/dist/interfaces/rest/index.d.ts.map +1 -1
  20. package/dist/interfaces/rest/index.js +12 -0
  21. package/dist/interfaces/rest/routes/admin/staff.d.ts +12 -0
  22. package/dist/interfaces/rest/routes/admin/staff.d.ts.map +1 -0
  23. package/dist/interfaces/rest/routes/admin/staff.js +206 -0
  24. package/dist/interfaces/rest/routes/analytics.d.ts +5 -0
  25. package/dist/interfaces/rest/routes/analytics.d.ts.map +1 -0
  26. package/dist/interfaces/rest/routes/analytics.js +24 -0
  27. package/dist/interfaces/rest/routes/carts.d.ts.map +1 -1
  28. package/dist/interfaces/rest/routes/carts.js +39 -2
  29. package/dist/interfaces/rest/routes/catalog.d.ts.map +1 -1
  30. package/dist/interfaces/rest/routes/catalog.js +17 -1
  31. package/dist/interfaces/rest/routes/checkout.d.ts +9 -0
  32. package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -1
  33. package/dist/interfaces/rest/routes/checkout.js +97 -21
  34. package/dist/interfaces/rest/routes/documents.d.ts +10 -0
  35. package/dist/interfaces/rest/routes/documents.d.ts.map +1 -0
  36. package/dist/interfaces/rest/routes/documents.js +40 -0
  37. package/dist/interfaces/rest/routes/inventory.d.ts.map +1 -1
  38. package/dist/interfaces/rest/routes/inventory.js +13 -0
  39. package/dist/interfaces/rest/routes/orders.d.ts.map +1 -1
  40. package/dist/interfaces/rest/routes/orders.js +111 -1
  41. package/dist/interfaces/rest/routes/pricing.d.ts.map +1 -1
  42. package/dist/interfaces/rest/routes/pricing.js +36 -1
  43. package/dist/interfaces/rest/routes/settings.d.ts +5 -0
  44. package/dist/interfaces/rest/routes/settings.d.ts.map +1 -0
  45. package/dist/interfaces/rest/routes/settings.js +50 -0
  46. package/dist/interfaces/rest/routes/shipping.d.ts +5 -0
  47. package/dist/interfaces/rest/routes/shipping.d.ts.map +1 -0
  48. package/dist/interfaces/rest/routes/shipping.js +68 -0
  49. package/dist/interfaces/rest/routes/tax.d.ts +5 -0
  50. package/dist/interfaces/rest/routes/tax.d.ts.map +1 -0
  51. package/dist/interfaces/rest/routes/tax.js +68 -0
  52. package/dist/interfaces/rest/schemas/admin-staff.d.ts +899 -0
  53. package/dist/interfaces/rest/schemas/admin-staff.d.ts.map +1 -0
  54. package/dist/interfaces/rest/schemas/admin-staff.js +98 -0
  55. package/dist/interfaces/rest/schemas/analytics.d.ts +252 -0
  56. package/dist/interfaces/rest/schemas/analytics.d.ts.map +1 -0
  57. package/dist/interfaces/rest/schemas/analytics.js +33 -0
  58. package/dist/interfaces/rest/schemas/carts.d.ts +656 -0
  59. package/dist/interfaces/rest/schemas/carts.d.ts.map +1 -1
  60. package/dist/interfaces/rest/schemas/carts.js +38 -0
  61. package/dist/interfaces/rest/schemas/catalog.d.ts +1218 -1
  62. package/dist/interfaces/rest/schemas/catalog.d.ts.map +1 -1
  63. package/dist/interfaces/rest/schemas/catalog.js +48 -0
  64. package/dist/interfaces/rest/schemas/checkout.d.ts +2 -0
  65. package/dist/interfaces/rest/schemas/checkout.d.ts.map +1 -1
  66. package/dist/interfaces/rest/schemas/checkout.js +4 -0
  67. package/dist/interfaces/rest/schemas/customer-portal.d.ts +35 -0
  68. package/dist/interfaces/rest/schemas/customer-portal.d.ts.map +1 -1
  69. package/dist/interfaces/rest/schemas/documents.d.ts +509 -0
  70. package/dist/interfaces/rest/schemas/documents.d.ts.map +1 -0
  71. package/dist/interfaces/rest/schemas/documents.js +65 -0
  72. package/dist/interfaces/rest/schemas/orders.d.ts +3110 -43
  73. package/dist/interfaces/rest/schemas/orders.d.ts.map +1 -1
  74. package/dist/interfaces/rest/schemas/orders.js +234 -1
  75. package/dist/interfaces/rest/schemas/pricing.d.ts +405 -0
  76. package/dist/interfaces/rest/schemas/pricing.d.ts.map +1 -1
  77. package/dist/interfaces/rest/schemas/pricing.js +70 -0
  78. package/dist/interfaces/rest/schemas/responses.d.ts +190 -0
  79. package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -1
  80. package/dist/interfaces/rest/schemas/search.d.ts +17 -0
  81. package/dist/interfaces/rest/schemas/search.d.ts.map +1 -1
  82. package/dist/interfaces/rest/schemas/settings.d.ts +397 -0
  83. package/dist/interfaces/rest/schemas/settings.d.ts.map +1 -0
  84. package/dist/interfaces/rest/schemas/settings.js +79 -0
  85. package/dist/interfaces/rest/schemas/shipping.d.ts +1093 -0
  86. package/dist/interfaces/rest/schemas/shipping.d.ts.map +1 -0
  87. package/dist/interfaces/rest/schemas/shipping.js +146 -0
  88. package/dist/interfaces/rest/schemas/tax.d.ts +1074 -0
  89. package/dist/interfaces/rest/schemas/tax.d.ts.map +1 -0
  90. package/dist/interfaces/rest/schemas/tax.js +132 -0
  91. package/dist/kernel/database/schema.d.ts +4 -0
  92. package/dist/kernel/database/schema.d.ts.map +1 -1
  93. package/dist/kernel/database/schema.js +8 -0
  94. package/dist/kernel/database/scoped-db.d.ts +2 -1
  95. package/dist/kernel/database/scoped-db.d.ts.map +1 -1
  96. package/dist/kernel/database/scoped-db.js +62 -1
  97. package/dist/kernel/hooks/types.d.ts +1 -1
  98. package/dist/kernel/hooks/types.d.ts.map +1 -1
  99. package/dist/kernel/plugin/manifest.d.ts +26 -0
  100. package/dist/kernel/plugin/manifest.d.ts.map +1 -1
  101. package/dist/kernel/plugin/manifest.js +17 -2
  102. package/dist/modules/analytics/drizzle-adapter.d.ts.map +1 -1
  103. package/dist/modules/analytics/drizzle-adapter.js +16 -3
  104. package/dist/modules/analytics/module.d.ts.map +1 -1
  105. package/dist/modules/analytics/module.js +6 -0
  106. package/dist/modules/analytics/reports.d.ts +58 -0
  107. package/dist/modules/analytics/reports.d.ts.map +1 -0
  108. package/dist/modules/analytics/reports.js +249 -0
  109. package/dist/modules/analytics/service.d.ts +10 -0
  110. package/dist/modules/analytics/service.d.ts.map +1 -1
  111. package/dist/modules/analytics/service.js +14 -0
  112. package/dist/modules/cart/repository/index.d.ts +7 -0
  113. package/dist/modules/cart/repository/index.d.ts.map +1 -1
  114. package/dist/modules/cart/repository/index.js +25 -1
  115. package/dist/modules/cart/schema.d.ts +17 -0
  116. package/dist/modules/cart/schema.d.ts.map +1 -1
  117. package/dist/modules/cart/schema.js +2 -0
  118. package/dist/modules/cart/schemas.d.ts +1 -0
  119. package/dist/modules/cart/schemas.d.ts.map +1 -1
  120. package/dist/modules/cart/schemas.js +1 -0
  121. package/dist/modules/cart/service.d.ts +32 -0
  122. package/dist/modules/cart/service.d.ts.map +1 -1
  123. package/dist/modules/cart/service.js +61 -2
  124. package/dist/modules/catalog/entity-service.d.ts +21 -0
  125. package/dist/modules/catalog/entity-service.d.ts.map +1 -1
  126. package/dist/modules/catalog/entity-service.js +166 -5
  127. package/dist/modules/catalog/schema.d.ts +34 -0
  128. package/dist/modules/catalog/schema.d.ts.map +1 -1
  129. package/dist/modules/catalog/schema.js +5 -0
  130. package/dist/modules/catalog/schemas.d.ts +3 -0
  131. package/dist/modules/catalog/schemas.d.ts.map +1 -1
  132. package/dist/modules/catalog/schemas.js +3 -0
  133. package/dist/modules/catalog/service.d.ts +36 -0
  134. package/dist/modules/catalog/service.d.ts.map +1 -1
  135. package/dist/modules/catalog/service.js +6 -0
  136. package/dist/modules/customers/service.d.ts.map +1 -1
  137. package/dist/modules/customers/service.js +6 -0
  138. package/dist/modules/documents/module.d.ts +7 -0
  139. package/dist/modules/documents/module.d.ts.map +1 -0
  140. package/dist/modules/documents/module.js +12 -0
  141. package/dist/modules/documents/pdf.d.ts +25 -0
  142. package/dist/modules/documents/pdf.d.ts.map +1 -0
  143. package/dist/modules/documents/pdf.js +80 -0
  144. package/dist/modules/documents/render.d.ts +32 -0
  145. package/dist/modules/documents/render.d.ts.map +1 -0
  146. package/dist/modules/documents/render.js +190 -0
  147. package/dist/modules/documents/repository/index.d.ts +25 -0
  148. package/dist/modules/documents/repository/index.d.ts.map +1 -0
  149. package/dist/modules/documents/repository/index.js +47 -0
  150. package/dist/modules/documents/schema.d.ts +214 -0
  151. package/dist/modules/documents/schema.d.ts.map +1 -0
  152. package/dist/modules/documents/schema.js +42 -0
  153. package/dist/modules/documents/service.d.ts +51 -0
  154. package/dist/modules/documents/service.d.ts.map +1 -0
  155. package/dist/modules/documents/service.js +119 -0
  156. package/dist/modules/fulfillment/service.d.ts +18 -0
  157. package/dist/modules/fulfillment/service.d.ts.map +1 -1
  158. package/dist/modules/fulfillment/service.js +85 -1
  159. package/dist/modules/orders/repository/index.d.ts +18 -1
  160. package/dist/modules/orders/repository/index.d.ts.map +1 -1
  161. package/dist/modules/orders/repository/index.js +86 -1
  162. package/dist/modules/orders/schema.d.ts +391 -0
  163. package/dist/modules/orders/schema.d.ts.map +1 -1
  164. package/dist/modules/orders/schema.js +56 -1
  165. package/dist/modules/orders/service.d.ts +102 -3
  166. package/dist/modules/orders/service.d.ts.map +1 -1
  167. package/dist/modules/orders/service.js +653 -29
  168. package/dist/modules/orders/stale-order-cleanup.d.ts.map +1 -1
  169. package/dist/modules/orders/stale-order-cleanup.js +13 -1
  170. package/dist/modules/pricing/repository/index.d.ts +5 -0
  171. package/dist/modules/pricing/repository/index.d.ts.map +1 -1
  172. package/dist/modules/pricing/repository/index.js +19 -0
  173. package/dist/modules/pricing/service.d.ts +18 -0
  174. package/dist/modules/pricing/service.d.ts.map +1 -1
  175. package/dist/modules/pricing/service.js +43 -5
  176. package/dist/modules/settings/module.d.ts +6 -0
  177. package/dist/modules/settings/module.d.ts.map +1 -0
  178. package/dist/modules/settings/module.js +11 -0
  179. package/dist/modules/settings/repository/index.d.ts +16 -0
  180. package/dist/modules/settings/repository/index.d.ts.map +1 -0
  181. package/dist/modules/settings/repository/index.js +41 -0
  182. package/dist/modules/settings/schema.d.ts +121 -0
  183. package/dist/modules/settings/schema.d.ts.map +1 -0
  184. package/dist/modules/settings/schema.js +24 -0
  185. package/dist/modules/settings/service.d.ts +26 -0
  186. package/dist/modules/settings/service.d.ts.map +1 -0
  187. package/dist/modules/settings/service.js +51 -0
  188. package/dist/modules/shipping/calculator.d.ts +5 -0
  189. package/dist/modules/shipping/calculator.d.ts.map +1 -1
  190. package/dist/modules/shipping/calculator.js +10 -0
  191. package/dist/modules/shipping/module.d.ts +5 -1
  192. package/dist/modules/shipping/module.d.ts.map +1 -1
  193. package/dist/modules/shipping/module.js +4 -1
  194. package/dist/modules/shipping/repository/index.d.ts +27 -2
  195. package/dist/modules/shipping/repository/index.d.ts.map +1 -1
  196. package/dist/modules/shipping/repository/index.js +105 -1
  197. package/dist/modules/shipping/schema.d.ts +419 -0
  198. package/dist/modules/shipping/schema.d.ts.map +1 -0
  199. package/dist/modules/shipping/schema.js +56 -0
  200. package/dist/modules/shipping/service.d.ts +54 -0
  201. package/dist/modules/shipping/service.d.ts.map +1 -1
  202. package/dist/modules/shipping/service.js +161 -2
  203. package/dist/modules/tax/adapter.d.ts +13 -0
  204. package/dist/modules/tax/adapter.d.ts.map +1 -1
  205. package/dist/modules/tax/module.d.ts +5 -1
  206. package/dist/modules/tax/module.d.ts.map +1 -1
  207. package/dist/modules/tax/module.js +4 -1
  208. package/dist/modules/tax/repository/index.d.ts +38 -2
  209. package/dist/modules/tax/repository/index.d.ts.map +1 -1
  210. package/dist/modules/tax/repository/index.js +138 -1
  211. package/dist/modules/tax/schema.d.ts +355 -0
  212. package/dist/modules/tax/schema.d.ts.map +1 -0
  213. package/dist/modules/tax/schema.js +55 -0
  214. package/dist/modules/tax/service.d.ts +60 -1
  215. package/dist/modules/tax/service.d.ts.map +1 -1
  216. package/dist/modules/tax/service.js +227 -2
  217. package/dist/runtime/kernel-modules.d.ts +15 -2
  218. package/dist/runtime/kernel-modules.d.ts.map +1 -1
  219. package/dist/runtime/kernel-modules.js +4 -0
  220. package/dist/runtime/kernel-types.d.ts +5 -1
  221. package/dist/runtime/kernel-types.d.ts.map +1 -1
  222. package/dist/runtime/kernel-types.js +2 -0
  223. package/dist/runtime/server.js +1 -1
  224. package/dist/test-utils/create-plugin-test-app.d.ts +3 -0
  225. package/dist/test-utils/create-plugin-test-app.d.ts.map +1 -1
  226. package/dist/test-utils/create-plugin-test-app.js +15 -3
  227. package/dist/test-utils/create-test-config.d.ts.map +1 -1
  228. package/dist/test-utils/create-test-config.js +2 -0
  229. package/dist/test-utils/order-test-helpers.d.ts +12 -0
  230. package/dist/test-utils/order-test-helpers.d.ts.map +1 -0
  231. package/dist/test-utils/order-test-helpers.js +18 -0
  232. package/dist/test-utils/rest-api-test-utils.d.ts.map +1 -1
  233. package/dist/test-utils/rest-api-test-utils.js +7 -0
  234. package/dist/test-utils/test-actors.js +1 -1
  235. package/dist/testing.d.ts +1 -0
  236. package/dist/testing.d.ts.map +1 -1
  237. package/dist/testing.js +1 -0
  238. package/package.json +3 -3
  239. package/src/auth/middleware.ts +26 -7
  240. package/src/auth/setup.ts +11 -4
  241. package/src/config/defaults.ts +7 -0
  242. package/src/config/types.ts +26 -1
  243. package/src/generated/plugin-capabilities.d.ts +1 -0
  244. package/src/generated/plugin-manifest.ts +1 -0
  245. package/src/generated/plugin-repositories.d.ts +1 -0
  246. package/src/hooks/checkout-completion.ts +22 -16
  247. package/src/hooks/checkout.ts +36 -11
  248. package/src/index.ts +1 -0
  249. package/src/interfaces/rest/index.ts +12 -0
  250. package/src/interfaces/rest/routes/admin/staff.ts +260 -0
  251. package/src/interfaces/rest/routes/analytics.ts +33 -0
  252. package/src/interfaces/rest/routes/carts.ts +52 -2
  253. package/src/interfaces/rest/routes/catalog.ts +34 -0
  254. package/src/interfaces/rest/routes/checkout.ts +114 -27
  255. package/src/interfaces/rest/routes/documents.ts +61 -0
  256. package/src/interfaces/rest/routes/inventory.ts +14 -0
  257. package/src/interfaces/rest/routes/orders.ts +148 -1
  258. package/src/interfaces/rest/routes/pricing.ts +44 -1
  259. package/src/interfaces/rest/routes/settings.ts +61 -0
  260. package/src/interfaces/rest/routes/shipping.ts +92 -0
  261. package/src/interfaces/rest/routes/tax.ts +90 -0
  262. package/src/interfaces/rest/schemas/admin-staff.ts +110 -0
  263. package/src/interfaces/rest/schemas/analytics.ts +39 -0
  264. package/src/interfaces/rest/schemas/carts.ts +40 -0
  265. package/src/interfaces/rest/schemas/catalog.ts +53 -0
  266. package/src/interfaces/rest/schemas/checkout.ts +4 -0
  267. package/src/interfaces/rest/schemas/documents.ts +72 -0
  268. package/src/interfaces/rest/schemas/orders.ts +258 -1
  269. package/src/interfaces/rest/schemas/pricing.ts +75 -0
  270. package/src/interfaces/rest/schemas/settings.ts +93 -0
  271. package/src/interfaces/rest/schemas/shipping.ts +164 -0
  272. package/src/interfaces/rest/schemas/tax.ts +148 -0
  273. package/src/kernel/database/schema.ts +12 -0
  274. package/src/kernel/database/scoped-db.ts +70 -1
  275. package/src/kernel/hooks/types.ts +1 -0
  276. package/src/kernel/plugin/manifest.ts +41 -2
  277. package/src/modules/analytics/drizzle-adapter.ts +19 -3
  278. package/src/modules/analytics/module.ts +10 -0
  279. package/src/modules/analytics/reports.ts +311 -0
  280. package/src/modules/analytics/service.ts +23 -0
  281. package/src/modules/cart/repository/index.ts +30 -1
  282. package/src/modules/cart/schema.ts +2 -0
  283. package/src/modules/cart/schemas.ts +1 -0
  284. package/src/modules/cart/service.ts +104 -2
  285. package/src/modules/catalog/entity-service.ts +196 -4
  286. package/src/modules/catalog/schema.ts +5 -0
  287. package/src/modules/catalog/schemas.ts +3 -0
  288. package/src/modules/catalog/service.ts +30 -0
  289. package/src/modules/customers/service.ts +6 -0
  290. package/src/modules/documents/module.ts +19 -0
  291. package/src/modules/documents/pdf.ts +101 -0
  292. package/src/modules/documents/render.ts +231 -0
  293. package/src/modules/documents/repository/index.ts +68 -0
  294. package/src/modules/documents/schema.ts +44 -0
  295. package/src/modules/documents/service.ts +176 -0
  296. package/src/modules/fulfillment/service.ts +139 -1
  297. package/src/modules/orders/repository/index.ts +127 -1
  298. package/src/modules/orders/schema.ts +58 -1
  299. package/src/modules/orders/service.ts +1041 -65
  300. package/src/modules/orders/stale-order-cleanup.ts +18 -4
  301. package/src/modules/pricing/repository/index.ts +34 -0
  302. package/src/modules/pricing/service.ts +76 -6
  303. package/src/modules/settings/module.ts +18 -0
  304. package/src/modules/settings/repository/index.ts +59 -0
  305. package/src/modules/settings/schema.ts +25 -0
  306. package/src/modules/settings/service.ts +82 -0
  307. package/src/modules/shipping/calculator.ts +27 -0
  308. package/src/modules/shipping/module.ts +6 -2
  309. package/src/modules/shipping/repository/index.ts +136 -2
  310. package/src/modules/shipping/schema.ts +58 -0
  311. package/src/modules/shipping/service.ts +260 -1
  312. package/src/modules/tax/adapter.ts +9 -0
  313. package/src/modules/tax/module.ts +6 -2
  314. package/src/modules/tax/repository/index.ts +169 -2
  315. package/src/modules/tax/schema.ts +57 -0
  316. package/src/modules/tax/service.ts +313 -2
  317. package/src/runtime/kernel-modules.ts +4 -0
  318. package/src/runtime/kernel-types.ts +6 -0
  319. package/src/runtime/server.ts +1 -1
  320. package/src/test-utils/create-plugin-test-app.ts +17 -4
  321. package/src/test-utils/create-test-config.ts +2 -0
  322. package/src/test-utils/order-test-helpers.ts +26 -0
  323. package/src/test-utils/rest-api-test-utils.ts +7 -0
  324. package/src/test-utils/test-actors.ts +1 -1
  325. package/src/testing.ts +1 -0
@@ -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";
@@ -487,6 +504,23 @@ export declare const orderLineItems: import("drizzle-orm/pg-core").PgTableWithCo
487
504
  identity: undefined;
488
505
  generated: undefined;
489
506
  }, {}, {}>;
507
+ isCustomPrice: import("drizzle-orm/pg-core").PgColumn<{
508
+ name: "is_custom_price";
509
+ tableName: "order_line_items";
510
+ dataType: "boolean";
511
+ columnType: "PgBoolean";
512
+ data: boolean;
513
+ driverParam: boolean;
514
+ notNull: true;
515
+ hasDefault: true;
516
+ isPrimaryKey: false;
517
+ isAutoincrement: false;
518
+ hasRuntimeDefault: false;
519
+ enumValues: undefined;
520
+ baseColumn: never;
521
+ identity: undefined;
522
+ generated: undefined;
523
+ }, {}, {}>;
490
524
  taxAmount: import("drizzle-orm/pg-core").PgColumn<{
491
525
  name: "tax_amount";
492
526
  tableName: "order_line_items";
@@ -521,6 +555,23 @@ export declare const orderLineItems: import("drizzle-orm/pg-core").PgTableWithCo
521
555
  identity: undefined;
522
556
  generated: undefined;
523
557
  }, {}, {}>;
558
+ refundedQuantity: import("drizzle-orm/pg-core").PgColumn<{
559
+ name: "refunded_quantity";
560
+ tableName: "order_line_items";
561
+ dataType: "number";
562
+ columnType: "PgInteger";
563
+ data: number;
564
+ driverParam: string | number;
565
+ notNull: true;
566
+ hasDefault: true;
567
+ isPrimaryKey: false;
568
+ isAutoincrement: false;
569
+ hasRuntimeDefault: false;
570
+ enumValues: undefined;
571
+ baseColumn: never;
572
+ identity: undefined;
573
+ generated: undefined;
574
+ }, {}, {}>;
524
575
  fulfillmentStatus: import("drizzle-orm/pg-core").PgColumn<{
525
576
  name: "fulfillment_status";
526
577
  tableName: "order_line_items";
@@ -560,6 +611,346 @@ export declare const orderLineItems: import("drizzle-orm/pg-core").PgTableWithCo
560
611
  };
561
612
  dialect: "pg";
562
613
  }>;
614
+ /**
615
+ * Line-level refunds (issue #52). One row per refund operation — the ledger
616
+ * behind the daily refund cap and the undo window. `lines` records which
617
+ * line items and quantities the refund covered so undo can restore them.
618
+ */
619
+ export declare const orderRefunds: import("drizzle-orm/pg-core").PgTableWithColumns<{
620
+ name: "order_refunds";
621
+ schema: undefined;
622
+ columns: {
623
+ id: import("drizzle-orm/pg-core").PgColumn<{
624
+ name: "id";
625
+ tableName: "order_refunds";
626
+ dataType: "string";
627
+ columnType: "PgUUID";
628
+ data: string;
629
+ driverParam: string;
630
+ notNull: true;
631
+ hasDefault: true;
632
+ isPrimaryKey: true;
633
+ isAutoincrement: false;
634
+ hasRuntimeDefault: false;
635
+ enumValues: undefined;
636
+ baseColumn: never;
637
+ identity: undefined;
638
+ generated: undefined;
639
+ }, {}, {}>;
640
+ organizationId: import("drizzle-orm/pg-core").PgColumn<{
641
+ name: "organization_id";
642
+ tableName: "order_refunds";
643
+ dataType: "string";
644
+ columnType: "PgText";
645
+ data: string;
646
+ driverParam: string;
647
+ notNull: true;
648
+ hasDefault: false;
649
+ isPrimaryKey: false;
650
+ isAutoincrement: false;
651
+ hasRuntimeDefault: false;
652
+ enumValues: [string, ...string[]];
653
+ baseColumn: never;
654
+ identity: undefined;
655
+ generated: undefined;
656
+ }, {}, {}>;
657
+ orderId: import("drizzle-orm/pg-core").PgColumn<{
658
+ name: "order_id";
659
+ tableName: "order_refunds";
660
+ dataType: "string";
661
+ columnType: "PgUUID";
662
+ data: string;
663
+ driverParam: string;
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
+ amount: import("drizzle-orm/pg-core").PgColumn<{
675
+ name: "amount";
676
+ tableName: "order_refunds";
677
+ dataType: "number";
678
+ columnType: "PgInteger";
679
+ data: number;
680
+ driverParam: string | number;
681
+ notNull: true;
682
+ hasDefault: false;
683
+ isPrimaryKey: false;
684
+ isAutoincrement: false;
685
+ hasRuntimeDefault: false;
686
+ enumValues: undefined;
687
+ baseColumn: never;
688
+ identity: undefined;
689
+ generated: undefined;
690
+ }, {}, {}>;
691
+ reason: import("drizzle-orm/pg-core").PgColumn<{
692
+ name: "reason";
693
+ tableName: "order_refunds";
694
+ dataType: "string";
695
+ columnType: "PgText";
696
+ data: string;
697
+ driverParam: string;
698
+ notNull: false;
699
+ hasDefault: false;
700
+ isPrimaryKey: false;
701
+ isAutoincrement: false;
702
+ hasRuntimeDefault: false;
703
+ enumValues: [string, ...string[]];
704
+ baseColumn: never;
705
+ identity: undefined;
706
+ generated: undefined;
707
+ }, {}, {}>;
708
+ lines: import("drizzle-orm/pg-core").PgColumn<{
709
+ name: "lines";
710
+ tableName: "order_refunds";
711
+ dataType: "json";
712
+ columnType: "PgJsonb";
713
+ data: {
714
+ lineItemId: string;
715
+ quantity: number;
716
+ amount: number;
717
+ }[];
718
+ driverParam: unknown;
719
+ notNull: true;
720
+ hasDefault: false;
721
+ isPrimaryKey: false;
722
+ isAutoincrement: false;
723
+ hasRuntimeDefault: false;
724
+ enumValues: undefined;
725
+ baseColumn: never;
726
+ identity: undefined;
727
+ generated: undefined;
728
+ }, {}, {
729
+ $type: {
730
+ lineItemId: string;
731
+ quantity: number;
732
+ amount: number;
733
+ }[];
734
+ }>;
735
+ performedBy: import("drizzle-orm/pg-core").PgColumn<{
736
+ name: "performed_by";
737
+ tableName: "order_refunds";
738
+ dataType: "string";
739
+ columnType: "PgText";
740
+ data: string;
741
+ driverParam: string;
742
+ notNull: true;
743
+ hasDefault: false;
744
+ isPrimaryKey: false;
745
+ isAutoincrement: false;
746
+ hasRuntimeDefault: false;
747
+ enumValues: [string, ...string[]];
748
+ baseColumn: never;
749
+ identity: undefined;
750
+ generated: undefined;
751
+ }, {}, {}>;
752
+ status: import("drizzle-orm/pg-core").PgColumn<{
753
+ name: "status";
754
+ tableName: "order_refunds";
755
+ dataType: "string";
756
+ columnType: "PgText";
757
+ data: "completed" | "undone";
758
+ driverParam: string;
759
+ notNull: true;
760
+ hasDefault: true;
761
+ isPrimaryKey: false;
762
+ isAutoincrement: false;
763
+ hasRuntimeDefault: false;
764
+ enumValues: ["completed", "undone"];
765
+ baseColumn: never;
766
+ identity: undefined;
767
+ generated: undefined;
768
+ }, {}, {}>;
769
+ undoneAt: import("drizzle-orm/pg-core").PgColumn<{
770
+ name: "undone_at";
771
+ tableName: "order_refunds";
772
+ dataType: "date";
773
+ columnType: "PgTimestamp";
774
+ data: Date;
775
+ driverParam: string;
776
+ notNull: false;
777
+ hasDefault: false;
778
+ isPrimaryKey: false;
779
+ isAutoincrement: false;
780
+ hasRuntimeDefault: false;
781
+ enumValues: undefined;
782
+ baseColumn: never;
783
+ identity: undefined;
784
+ generated: undefined;
785
+ }, {}, {}>;
786
+ undoneBy: import("drizzle-orm/pg-core").PgColumn<{
787
+ name: "undone_by";
788
+ tableName: "order_refunds";
789
+ dataType: "string";
790
+ columnType: "PgText";
791
+ data: string;
792
+ driverParam: string;
793
+ notNull: false;
794
+ hasDefault: false;
795
+ isPrimaryKey: false;
796
+ isAutoincrement: false;
797
+ hasRuntimeDefault: false;
798
+ enumValues: [string, ...string[]];
799
+ baseColumn: never;
800
+ identity: undefined;
801
+ generated: undefined;
802
+ }, {}, {}>;
803
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
804
+ name: "created_at";
805
+ tableName: "order_refunds";
806
+ dataType: "date";
807
+ columnType: "PgTimestamp";
808
+ data: Date;
809
+ driverParam: string;
810
+ notNull: true;
811
+ hasDefault: true;
812
+ isPrimaryKey: false;
813
+ isAutoincrement: false;
814
+ hasRuntimeDefault: false;
815
+ enumValues: undefined;
816
+ baseColumn: never;
817
+ identity: undefined;
818
+ generated: undefined;
819
+ }, {}, {}>;
820
+ };
821
+ dialect: "pg";
822
+ }>;
823
+ /**
824
+ * Operator annotations on orders (issue #56) — "customer will pick up
825
+ * Thursday". Merged into GET /orders/{id}/timeline alongside status history
826
+ * and refund ledger events.
827
+ */
828
+ export declare const orderNotes: import("drizzle-orm/pg-core").PgTableWithColumns<{
829
+ name: "order_notes";
830
+ schema: undefined;
831
+ columns: {
832
+ id: import("drizzle-orm/pg-core").PgColumn<{
833
+ name: "id";
834
+ tableName: "order_notes";
835
+ dataType: "string";
836
+ columnType: "PgUUID";
837
+ data: string;
838
+ driverParam: string;
839
+ notNull: true;
840
+ hasDefault: true;
841
+ isPrimaryKey: true;
842
+ isAutoincrement: false;
843
+ hasRuntimeDefault: false;
844
+ enumValues: undefined;
845
+ baseColumn: never;
846
+ identity: undefined;
847
+ generated: undefined;
848
+ }, {}, {}>;
849
+ organizationId: import("drizzle-orm/pg-core").PgColumn<{
850
+ name: "organization_id";
851
+ tableName: "order_notes";
852
+ dataType: "string";
853
+ columnType: "PgText";
854
+ data: string;
855
+ driverParam: string;
856
+ notNull: true;
857
+ hasDefault: false;
858
+ isPrimaryKey: false;
859
+ isAutoincrement: false;
860
+ hasRuntimeDefault: false;
861
+ enumValues: [string, ...string[]];
862
+ baseColumn: never;
863
+ identity: undefined;
864
+ generated: undefined;
865
+ }, {}, {}>;
866
+ orderId: import("drizzle-orm/pg-core").PgColumn<{
867
+ name: "order_id";
868
+ tableName: "order_notes";
869
+ dataType: "string";
870
+ columnType: "PgUUID";
871
+ data: string;
872
+ driverParam: string;
873
+ notNull: true;
874
+ hasDefault: false;
875
+ isPrimaryKey: false;
876
+ isAutoincrement: false;
877
+ hasRuntimeDefault: false;
878
+ enumValues: undefined;
879
+ baseColumn: never;
880
+ identity: undefined;
881
+ generated: undefined;
882
+ }, {}, {}>;
883
+ author: import("drizzle-orm/pg-core").PgColumn<{
884
+ name: "author";
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
+ body: import("drizzle-orm/pg-core").PgColumn<{
901
+ name: "body";
902
+ tableName: "order_notes";
903
+ dataType: "string";
904
+ columnType: "PgText";
905
+ data: string;
906
+ driverParam: string;
907
+ notNull: true;
908
+ hasDefault: false;
909
+ isPrimaryKey: false;
910
+ isAutoincrement: false;
911
+ hasRuntimeDefault: false;
912
+ enumValues: [string, ...string[]];
913
+ baseColumn: never;
914
+ identity: undefined;
915
+ generated: undefined;
916
+ }, {}, {}>;
917
+ pinned: import("drizzle-orm/pg-core").PgColumn<{
918
+ name: "pinned";
919
+ tableName: "order_notes";
920
+ dataType: "boolean";
921
+ columnType: "PgBoolean";
922
+ data: boolean;
923
+ driverParam: boolean;
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
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
935
+ name: "created_at";
936
+ tableName: "order_notes";
937
+ dataType: "date";
938
+ columnType: "PgTimestamp";
939
+ data: Date;
940
+ driverParam: string;
941
+ notNull: true;
942
+ hasDefault: true;
943
+ isPrimaryKey: false;
944
+ isAutoincrement: false;
945
+ hasRuntimeDefault: false;
946
+ enumValues: undefined;
947
+ baseColumn: never;
948
+ identity: undefined;
949
+ generated: undefined;
950
+ }, {}, {}>;
951
+ };
952
+ dialect: "pg";
953
+ }>;
563
954
  export declare const orderStatusHistory: import("drizzle-orm/pg-core").PgTableWithColumns<{
564
955
  name: "order_status_history";
565
956
  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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BzB,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(),
@@ -41,14 +48,62 @@ export const orderLineItems = pgTable("order_line_items", {
41
48
  quantity: integer("quantity").notNull(),
42
49
  unitPrice: integer("unit_price").notNull(),
43
50
  totalPrice: integer("total_price").notNull(),
51
+ // Price provenance (matches Medusa's `is_custom_price`): true when a staff
52
+ // actor with `orders:manage` supplied an explicit override price rather than
53
+ // the server-derived catalog price. Audit + reporting signal.
54
+ isCustomPrice: boolean("is_custom_price").notNull().default(false),
44
55
  taxAmount: integer("tax_amount").notNull().default(0),
45
56
  discountAmount: integer("discount_amount").notNull().default(0),
57
+ // Units already refunded on this line (issue #52) — line-level refund REST
58
+ // rejects refunds beyond `quantity - refundedQuantity`.
59
+ refundedQuantity: integer("refunded_quantity").notNull().default(0),
46
60
  fulfillmentStatus: text("fulfillment_status").notNull().default("unfulfilled"),
47
61
  metadata: jsonb("metadata").$type().default({}),
48
62
  }, (table) => [
49
63
  index("idx_order_line_items_order_id").on(table.orderId),
50
64
  index("idx_order_line_items_entity_id").on(table.entityId),
51
65
  ]);
66
+ /**
67
+ * Line-level refunds (issue #52). One row per refund operation — the ledger
68
+ * behind the daily refund cap and the undo window. `lines` records which
69
+ * line items and quantities the refund covered so undo can restore them.
70
+ */
71
+ export const orderRefunds = pgTable("order_refunds", {
72
+ id: uuid("id").defaultRandom().primaryKey(),
73
+ organizationId: text("organization_id").notNull().references(() => organization.id, { onDelete: "cascade" }),
74
+ orderId: uuid("order_id")
75
+ .references(() => orders.id, { onDelete: "cascade" })
76
+ .notNull(),
77
+ amount: integer("amount").notNull(),
78
+ reason: text("reason"),
79
+ lines: jsonb("lines").$type().notNull(),
80
+ performedBy: text("performed_by").notNull(),
81
+ status: text("status", { enum: ["completed", "undone"] }).notNull().default("completed"),
82
+ undoneAt: timestamp("undone_at", { withTimezone: true }),
83
+ undoneBy: text("undone_by"),
84
+ createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(),
85
+ }, (table) => [
86
+ index("idx_order_refunds_order_id").on(table.orderId),
87
+ index("idx_order_refunds_org_performed_by").on(table.organizationId, table.performedBy, table.createdAt),
88
+ ]);
89
+ /**
90
+ * Operator annotations on orders (issue #56) — "customer will pick up
91
+ * Thursday". Merged into GET /orders/{id}/timeline alongside status history
92
+ * and refund ledger events.
93
+ */
94
+ export const orderNotes = pgTable("order_notes", {
95
+ id: uuid("id").defaultRandom().primaryKey(),
96
+ organizationId: text("organization_id").notNull().references(() => organization.id, { onDelete: "cascade" }),
97
+ orderId: uuid("order_id")
98
+ .references(() => orders.id, { onDelete: "cascade" })
99
+ .notNull(),
100
+ author: text("author").notNull(),
101
+ body: text("body").notNull(),
102
+ pinned: boolean("pinned").notNull().default(false),
103
+ createdAt: timestamp("created_at", { withTimezone: true }).defaultNow().notNull(),
104
+ }, (table) => [
105
+ index("idx_order_notes_order_id").on(table.orderId),
106
+ ]);
52
107
  export const orderStatusHistory = pgTable("order_status_history", {
53
108
  id: uuid("id").defaultRandom().primaryKey(),
54
109
  orderId: uuid("order_id")
@@ -3,11 +3,13 @@ import type { HookRegistry } from "../../kernel/hooks/registry.js";
3
3
  import { type OrderState, type StateDefinition } from "../../kernel/state-machine/machine.js";
4
4
  import { type Result } from "../../kernel/result.js";
5
5
  import { type Pagination } from "../../utils/pagination.js";
6
- import type { TxContext } from "../../kernel/database/tx-context.js";
6
+ import { type TxContext } from "../../kernel/database/tx-context.js";
7
7
  import type { DatabaseAdapter } from "../../kernel/database/adapter.js";
8
- import { OrdersRepository, type Order, type OrderLineItem, type OrderStatusHistory } from "./repository/index.js";
8
+ import { OrdersRepository, type Order, type OrderLineItem, type OrderNote, type OrderRefund, type OrderStatusHistory } from "./repository/index.js";
9
9
  export interface CreateOrderInput {
10
10
  customerId?: string;
11
+ /** Client-supplied retry key — a repeat create with the same key returns the original order. */
12
+ idempotencyKey?: string | undefined;
11
13
  currency: string;
12
14
  subtotal: number;
13
15
  taxTotal: number;
@@ -75,9 +77,25 @@ export declare class OrderService {
75
77
  private readonly machine;
76
78
  constructor(deps: OrderServiceDeps);
77
79
  private hydrateOrder;
78
- create(input: CreateOrderInput, actor: Actor | null, ctx?: TxContext): Promise<Result<HydratedOrder>>;
80
+ /**
81
+ * Resolve every line item's price with org-integrity + price provenance,
82
+ * mirroring how our forefathers handle this (Vendure: order lines are always
83
+ * server-priced from the variant; Medusa: an admin override is honored but
84
+ * flagged `is_custom_price`). Three modes:
85
+ * - trusted caller (checkout / POS exchange, already server-priced) → prices honored as-is.
86
+ * - actor with `orders:manage` → explicit price honored as a manual override, flagged isCustomPrice.
87
+ * - otherwise → price re-derived server-side from the catalog; client prices ignored.
88
+ * The referenced entity MUST belong to the order's org in every mode.
89
+ */
90
+ private resolveLines;
91
+ create(input: CreateOrderInput, actor: Actor | null, ctx?: TxContext, opts?: {
92
+ trustedPricing?: boolean;
93
+ stockPolicy?: "reserve" | "backorder";
94
+ }): Promise<Result<HydratedOrder>>;
79
95
  getById(id: string, actor: Actor | null, ctx?: TxContext): Promise<Result<HydratedOrder>>;
80
96
  getByNumber(orderNumber: string, actor: Actor | null, ctx?: TxContext): Promise<Result<HydratedOrder>>;
97
+ /** Returns the order previously created with this idempotency key, or null. */
98
+ getByIdempotencyKey(idempotencyKey: string, actor?: Actor | null, ctx?: TxContext): Promise<Result<HydratedOrder | null>>;
81
99
  list(params: ListOrdersParams, actor: Actor | null, ctx?: TxContext): Promise<Result<OrderListResult>>;
82
100
  listByCustomer(customerId: string, params: ListOrdersParams, actor?: Actor | null, ctx?: TxContext): Promise<Result<OrderListResult>>;
83
101
  /**
@@ -108,6 +126,62 @@ export declare class OrderService {
108
126
  refund(orderId: string, actor: Actor | null, reason?: string, ctx?: TxContext, opts?: {
109
127
  amount?: number;
110
128
  }): Promise<Result<HydratedOrder>>;
129
+ private refundPolicies;
130
+ /**
131
+ * Refunds specific line-item quantities (issue #52). Enforces per-line
132
+ * refundable quantity (`quantity - refundedQuantity`), the operator's daily
133
+ * refund cap (`policies.refundDailyCap`, 403 with the cap surfaced), moves
134
+ * money through the payment adapter when the order has a captured payment,
135
+ * and records an auditable `order_refunds` ledger row.
136
+ */
137
+ refundLines(orderId: string, input: {
138
+ lines: Array<{
139
+ lineItemId: string;
140
+ quantity: number;
141
+ }>;
142
+ reason?: string | undefined;
143
+ }, actor: Actor | null, ctx?: TxContext): Promise<Result<{
144
+ order: HydratedOrder;
145
+ refund: OrderRefund;
146
+ }>>;
147
+ /**
148
+ * Undoes a refund within the configured window
149
+ * (`policies.refundUndoWindowMinutes`, default 15). Restores line
150
+ * refundedQuantity and marks the ledger row `undone` — an audited,
151
+ * compensating ledger operation; re-collecting the money (cash back into
152
+ * the drawer) is the operator's side of the exchange.
153
+ */
154
+ undoRefund(orderId: string, refundId: string, actor: Actor | null, ctx?: TxContext): Promise<Result<{
155
+ order: HydratedOrder;
156
+ refund: OrderRefund;
157
+ }>>;
158
+ listRefunds(orderId: string, actor: Actor | null, ctx?: TxContext): Promise<Result<OrderRefund[]>>;
159
+ /** The acting operator's daily refund-cap status (issue #52). */
160
+ refundCapStatus(actor: Actor | null, ctx?: TxContext): Promise<Result<{
161
+ cap: number | null;
162
+ usedToday: number;
163
+ remaining: number | null;
164
+ }>>;
165
+ private requireOrderAccess;
166
+ addNote(orderId: string, input: {
167
+ body: string;
168
+ pinned?: boolean | undefined;
169
+ }, actor: Actor | null, ctx?: TxContext): Promise<Result<OrderNote>>;
170
+ listNotes(orderId: string, actor: Actor | null, ctx?: TxContext): Promise<Result<OrderNote[]>>;
171
+ deleteNote(orderId: string, noteId: string, actor: Actor | null, ctx?: TxContext): Promise<Result<{
172
+ deleted: true;
173
+ }>>;
174
+ /**
175
+ * One merged per-order activity view (issue #56): status history + operator
176
+ * notes + refund ledger events (both directions), newest first.
177
+ */
178
+ timeline(orderId: string, actor: Actor | null, ctx?: TxContext): Promise<Result<Array<{
179
+ type: "status" | "note" | "refund";
180
+ at: Date;
181
+ actor: string;
182
+ summary: string;
183
+ data: Record<string, unknown>;
184
+ }>>>;
111
185
  /**
112
186
  * Capture an authorized payment for an order via the payment adapter and
113
187
  * record the captured amount. Does not transition order status — capture is a
@@ -117,6 +191,31 @@ export declare class OrderService {
117
191
  amount?: number;
118
192
  }, ctx?: TxContext): Promise<Result<HydratedOrder>>;
119
193
  getStatusHistory(orderId: string, actor?: Actor | null, ctx?: TxContext): Promise<Result<OrderStatusHistory[]>>;
194
+ /** Line items may not be edited on terminal or fully-captured orders. */
195
+ private lineItemEditGuard;
196
+ /**
197
+ * Recomputes subtotal/taxTotal/grandTotal from the order's line items
198
+ * (shippingTotal and order-level discountTotal are preserved), persists
199
+ * them, and records an audit entry in the status history.
200
+ */
201
+ private recalcOrderTotals;
202
+ addLineItem(orderId: string, input: {
203
+ entityId: string;
204
+ entityType: string;
205
+ variantId?: string | undefined;
206
+ sku?: string | undefined;
207
+ title: string;
208
+ quantity: number;
209
+ unitPrice: number;
210
+ totalPrice?: number | undefined;
211
+ taxAmount?: number | undefined;
212
+ discountAmount?: number | undefined;
213
+ metadata?: Record<string, unknown> | undefined;
214
+ }, actor: Actor | null, ctx?: TxContext): Promise<Result<HydratedOrder>>;
215
+ updateOrderLineItem(orderId: string, lineItemId: string, patch: {
216
+ quantity: number;
217
+ }, actor: Actor | null, ctx?: TxContext): Promise<Result<HydratedOrder>>;
218
+ removeLineItem(orderId: string, lineItemId: string, actor: Actor | null, ctx?: TxContext): Promise<Result<HydratedOrder>>;
120
219
  updateOrder(orderId: string, data: {
121
220
  placedAt?: Date;
122
221
  metadata?: Record<string, unknown>;