medusa-plugin-tracing 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/.medusa/server/medusa-config.d.ts +1 -0
  2. package/.medusa/server/medusa-config.js +23 -0
  3. package/.medusa/server/src/admin/index.js +6576 -0
  4. package/.medusa/server/src/admin/index.mjs +6574 -0
  5. package/.medusa/server/src/api/admin/invalidation-reasons/[id]/route.d.ts +5 -0
  6. package/.medusa/server/src/api/admin/invalidation-reasons/[id]/route.js +34 -0
  7. package/.medusa/server/src/api/admin/invalidation-reasons/route.d.ts +5 -0
  8. package/.medusa/server/src/api/admin/invalidation-reasons/route.js +37 -0
  9. package/.medusa/server/src/api/admin/serial-numbers/[id]/route.d.ts +5 -0
  10. package/.medusa/server/src/api/admin/serial-numbers/[id]/route.js +34 -0
  11. package/.medusa/server/src/api/admin/serial-numbers/route.d.ts +5 -0
  12. package/.medusa/server/src/api/admin/serial-numbers/route.js +40 -0
  13. package/.medusa/server/src/api/admin/stock-lots/[id]/route.d.ts +5 -0
  14. package/.medusa/server/src/api/admin/stock-lots/[id]/route.js +39 -0
  15. package/.medusa/server/src/api/admin/stock-lots/[id]/serial-numbers/route.d.ts +2 -0
  16. package/.medusa/server/src/api/admin/stock-lots/[id]/serial-numbers/route.js +21 -0
  17. package/.medusa/server/src/api/admin/stock-lots/disable/route.d.ts +3 -0
  18. package/.medusa/server/src/api/admin/stock-lots/disable/route.js +16 -0
  19. package/.medusa/server/src/api/admin/stock-lots/enable/route.d.ts +3 -0
  20. package/.medusa/server/src/api/admin/stock-lots/enable/route.js +16 -0
  21. package/.medusa/server/src/api/admin/stock-lots/route.d.ts +5 -0
  22. package/.medusa/server/src/api/admin/stock-lots/route.js +43 -0
  23. package/.medusa/server/src/api/middlewares.d.ts +2 -0
  24. package/.medusa/server/src/api/middlewares.js +149 -0
  25. package/.medusa/server/src/api/validators.d.ts +316 -0
  26. package/.medusa/server/src/api/validators.js +128 -0
  27. package/.medusa/server/src/links/inventory-item-stock-lot.d.ts +2 -0
  28. package/.medusa/server/src/links/inventory-item-stock-lot.js +18 -0
  29. package/.medusa/server/src/links/order-serial-number.d.ts +2 -0
  30. package/.medusa/server/src/links/order-serial-number.js +18 -0
  31. package/.medusa/server/src/links/serial-number-order.d.ts +2 -0
  32. package/.medusa/server/src/links/serial-number-order.js +15 -0
  33. package/.medusa/server/src/links/stock-location-stock-lot.d.ts +2 -0
  34. package/.medusa/server/src/links/stock-location-stock-lot.js +18 -0
  35. package/.medusa/server/src/links/stock-lot-inventory-item.d.ts +2 -0
  36. package/.medusa/server/src/links/stock-lot-inventory-item.js +15 -0
  37. package/.medusa/server/src/links/stock-lot-stock-location.d.ts +2 -0
  38. package/.medusa/server/src/links/stock-lot-stock-location.js +15 -0
  39. package/.medusa/server/src/modules/tracing/index.d.ts +50 -0
  40. package/.medusa/server/src/modules/tracing/index.js +25 -0
  41. package/.medusa/server/src/modules/tracing/migrations/Migration20260409171919.d.ts +5 -0
  42. package/.medusa/server/src/modules/tracing/migrations/Migration20260409171919.js +29 -0
  43. package/.medusa/server/src/modules/tracing/models/invalidation-reason.d.ts +25 -0
  44. package/.medusa/server/src/modules/tracing/models/invalidation-reason.js +14 -0
  45. package/.medusa/server/src/modules/tracing/models/serial-number.d.ts +30 -0
  46. package/.medusa/server/src/modules/tracing/models/serial-number.js +23 -0
  47. package/.medusa/server/src/modules/tracing/models/stock-lot-activity.d.ts +1 -0
  48. package/.medusa/server/src/modules/tracing/models/stock-lot-activity.js +3 -0
  49. package/.medusa/server/src/modules/tracing/models/stock-lot.d.ts +30 -0
  50. package/.medusa/server/src/modules/tracing/models/stock-lot.js +20 -0
  51. package/.medusa/server/src/modules/tracing/service.d.ts +109 -0
  52. package/.medusa/server/src/modules/tracing/service.js +52 -0
  53. package/.medusa/server/src/subscribers/fulfillment-created.d.ts +8 -0
  54. package/.medusa/server/src/subscribers/fulfillment-created.js +52 -0
  55. package/.medusa/server/src/workflows/tracing/adjust-stock-order.d.ts +7 -0
  56. package/.medusa/server/src/workflows/tracing/adjust-stock-order.js +47 -0
  57. package/.medusa/server/src/workflows/tracing/create-stock-lot.d.ts +45 -0
  58. package/.medusa/server/src/workflows/tracing/create-stock-lot.js +34 -0
  59. package/.medusa/server/src/workflows/tracing/delete-stock-lot.d.ts +38 -0
  60. package/.medusa/server/src/workflows/tracing/delete-stock-lot.js +36 -0
  61. package/.medusa/server/src/workflows/tracing/steps/assign-from-stock-lot.d.ts +1 -0
  62. package/.medusa/server/src/workflows/tracing/steps/assign-from-stock-lot.js +48 -0
  63. package/.medusa/server/src/workflows/tracing/steps/assign-serial-number.d.ts +1 -0
  64. package/.medusa/server/src/workflows/tracing/steps/assign-serial-number.js +3 -0
  65. package/.medusa/server/src/workflows/tracing/steps/invalidate-serial-number.d.ts +1 -0
  66. package/.medusa/server/src/workflows/tracing/steps/invalidate-serial-number.js +3 -0
  67. package/.medusa/server/src/workflows/tracing/steps/return-to-stock-lot.d.ts +1 -0
  68. package/.medusa/server/src/workflows/tracing/steps/return-to-stock-lot.js +3 -0
  69. package/.medusa/server/src/workflows/tracing/update-stock-lot.d.ts +46 -0
  70. package/.medusa/server/src/workflows/tracing/update-stock-lot.js +42 -0
  71. package/LICENSE +21 -0
  72. package/README.md +52 -0
  73. package/package.json +89 -0
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.TRACING_MODULE = void 0;
18
+ const utils_1 = require("@medusajs/framework/utils");
19
+ const service_1 = require("./service");
20
+ exports.TRACING_MODULE = 'tracing';
21
+ exports.default = (0, utils_1.Module)(exports.TRACING_MODULE, {
22
+ service: service_1.TracingService
23
+ });
24
+ __exportStar(require("./service"), exports);
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90cmFjaW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQWtEO0FBQ2xELHVDQUEwQztBQUU3QixRQUFBLGNBQWMsR0FBRyxTQUFTLENBQUE7QUFFdkMsa0JBQWUsSUFBQSxjQUFNLEVBQUMsc0JBQWMsRUFBRTtJQUNyQyxPQUFPLEVBQUUsd0JBQWM7Q0FDdkIsQ0FBQyxDQUFBO0FBRUYsNENBQXlCIn0=
@@ -0,0 +1,5 @@
1
+ import { Migration } from "@medusajs/framework/mikro-orm/migrations";
2
+ export declare class Migration20260409171919 extends Migration {
3
+ up(): Promise<void>;
4
+ down(): Promise<void>;
5
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260409171919 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260409171919 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "invalidation_reason" ("id" text not null, "value" text not null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "invalidation_reason_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_invalidation_reason_deleted_at" ON "invalidation_reason" ("deleted_at") WHERE deleted_at IS NULL;`);
9
+ this.addSql(`create table if not exists "stock_lot" ("id" text not null, "inventory_item_id" text not null, "stock_location_id" text not null, "lot_number" text not null, "description" text null, "enabled" boolean not null default true, "initial_quantity" integer not null, "stocked_quantity" integer not null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "stock_lot_pkey" primary key ("id"));`);
10
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_stock_lot_deleted_at" ON "stock_lot" ("deleted_at") WHERE deleted_at IS NULL;`);
11
+ this.addSql(`create table if not exists "serial_number" ("id" text not null, "order_id" text not null, "value" text not null, "invalidated" boolean not null default false, "invalidation_reason_id" text null, "stock_lot_id" text not null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "serial_number_pkey" primary key ("id"));`);
12
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_serial_number_invalidation_reason_id" ON "serial_number" ("invalidation_reason_id") WHERE deleted_at IS NULL;`);
13
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_serial_number_stock_lot_id" ON "serial_number" ("stock_lot_id") WHERE deleted_at IS NULL;`);
14
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_serial_number_deleted_at" ON "serial_number" ("deleted_at") WHERE deleted_at IS NULL;`);
15
+ this.addSql(`alter table if exists "serial_number" drop constraint if exists "serial_number_invalidation_reason_id_foreign";`);
16
+ this.addSql(`alter table if exists "serial_number" add constraint "serial_number_invalidation_reason_id_foreign" foreign key ("invalidation_reason_id") references "invalidation_reason" ("id") on update cascade on delete set null;`);
17
+ this.addSql(`alter table if exists "serial_number" drop constraint if exists "serial_number_stock_lot_id_foreign";`);
18
+ this.addSql(`alter table if exists "serial_number" add constraint "serial_number_stock_lot_id_foreign" foreign key ("stock_lot_id") references "stock_lot" ("id") on update cascade;`);
19
+ }
20
+ async down() {
21
+ this.addSql(`alter table if exists "serial_number" drop constraint if exists "serial_number_invalidation_reason_id_foreign";`);
22
+ this.addSql(`alter table if exists "serial_number" drop constraint if exists "serial_number_stock_lot_id_foreign";`);
23
+ this.addSql(`drop table if exists "invalidation_reason" cascade;`);
24
+ this.addSql(`drop table if exists "stock_lot" cascade;`);
25
+ this.addSql(`drop table if exists "serial_number" cascade;`);
26
+ }
27
+ }
28
+ exports.Migration20260409171919 = Migration20260409171919;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA0MDkxNzE5MTkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy90cmFjaW5nL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNjA0MDkxNzE5MTkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFFM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLGlUQUFpVCxDQUFDLENBQUM7UUFDL1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtSUFBbUksQ0FBQyxDQUFDO1FBRWpKLElBQUksQ0FBQyxNQUFNLENBQUMsb2ZBQW9mLENBQUMsQ0FBQztRQUNsZ0IsSUFBSSxDQUFDLE1BQU0sQ0FBQywrR0FBK0csQ0FBQyxDQUFDO1FBRTdILElBQUksQ0FBQyxNQUFNLENBQUMsK2FBQSthLENBQUMsQ0FBQztRQUM3YixJQUFJLENBQUMsTUFBTSxDQUFDLCtJQUErSSxDQUFDLENBQUM7UUFDN0osSUFBSSxDQUFDLE1BQU0sQ0FBQywySEFBMkgsQ0FBQyxDQUFDO1FBQ3pJLElBQUksQ0FBQyxNQUFNLENBQUMsdUhBQXVILENBQUMsQ0FBQztRQUVySSxJQUFJLENBQUMsTUFBTSxDQUFDLGlIQUFpSCxDQUFDLENBQUM7UUFDL0gsSUFBSSxDQUFDLE1BQU0sQ0FBQywwTkFBME4sQ0FBQyxDQUFDO1FBQ3hPLElBQUksQ0FBQyxNQUFNLENBQUMsdUdBQXVHLENBQUMsQ0FBQztRQUNySCxJQUFJLENBQUMsTUFBTSxDQUFDLHlLQUF5SyxDQUFDLENBQUM7SUFDekwsQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsaUhBQWlILENBQUMsQ0FBQztRQUUvSCxJQUFJLENBQUMsTUFBTSxDQUFDLHVHQUF1RyxDQUFDLENBQUM7UUFFckgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsTUFBTSxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztDQUVGO0FBaENELDBEQWdDQyJ9
@@ -0,0 +1,25 @@
1
+ export declare const InvalidationReason: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
2
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
3
+ value: import("@medusajs/framework/utils").TextProperty;
4
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
5
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
6
+ order_id: import("@medusajs/framework/utils").TextProperty;
7
+ value: import("@medusajs/framework/utils").TextProperty;
8
+ invalidated: import("@medusajs/framework/utils").BooleanProperty;
9
+ invalidation_reason: import("@medusajs/framework/utils").RelationNullableModifier<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "invalidation_reason">, import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "invalidation_reason">, undefined>, true>;
10
+ stock_lot: import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
11
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
12
+ inventory_item_id: import("@medusajs/framework/utils").TextProperty;
13
+ stock_location_id: import("@medusajs/framework/utils").TextProperty;
14
+ lot_number: import("@medusajs/framework/utils").TextProperty;
15
+ description: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
16
+ enabled: import("@medusajs/framework/utils").BooleanProperty;
17
+ initial_quantity: import("@medusajs/framework/utils").NumberProperty;
18
+ stocked_quantity: import("@medusajs/framework/utils").NumberProperty;
19
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
20
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
21
+ }>, "stock_lot">, undefined>;
22
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
23
+ }>, "serial_number">>;
24
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
25
+ }>, "invalidation_reason">;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InvalidationReason = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const serial_number_1 = require("./serial-number");
6
+ exports.InvalidationReason = utils_1.model.define('invalidation_reason', {
7
+ id: utils_1.model.id().primaryKey(),
8
+ value: utils_1.model.text(),
9
+ serial_numbers: utils_1.model.hasMany(() => serial_number_1.SerialNumber, {
10
+ mappedBy: 'invalidation_reason'
11
+ }),
12
+ metadata: utils_1.model.json().nullable()
13
+ });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52YWxpZGF0aW9uLXJlYXNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3RyYWNpbmcvbW9kZWxzL2ludmFsaWRhdGlvbi1yZWFzb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWlEO0FBQ2pELG1EQUE4QztBQUVqQyxRQUFBLGtCQUFrQixHQUFHLGFBQUssQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUU7SUFDckUsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsS0FBSyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDbkIsY0FBYyxFQUFFLGFBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsNEJBQVksRUFBRTtRQUNqRCxRQUFRLEVBQUUscUJBQXFCO0tBQy9CLENBQUM7SUFDRixRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUNqQyxDQUFDLENBQUEifQ==
@@ -0,0 +1,30 @@
1
+ export declare const SerialNumber: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
2
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
3
+ order_id: import("@medusajs/framework/utils").TextProperty;
4
+ value: import("@medusajs/framework/utils").TextProperty;
5
+ invalidated: import("@medusajs/framework/utils").BooleanProperty;
6
+ invalidation_reason: import("@medusajs/framework/utils").RelationNullableModifier<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
7
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
8
+ value: import("@medusajs/framework/utils").TextProperty;
9
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
10
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
11
+ }>, "invalidation_reason">, import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
12
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
13
+ value: import("@medusajs/framework/utils").TextProperty;
14
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
15
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
16
+ }>, "invalidation_reason">, undefined>, true>;
17
+ stock_lot: import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
18
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
19
+ inventory_item_id: import("@medusajs/framework/utils").TextProperty;
20
+ stock_location_id: import("@medusajs/framework/utils").TextProperty;
21
+ lot_number: import("@medusajs/framework/utils").TextProperty;
22
+ description: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
23
+ enabled: import("@medusajs/framework/utils").BooleanProperty;
24
+ initial_quantity: import("@medusajs/framework/utils").NumberProperty;
25
+ stocked_quantity: import("@medusajs/framework/utils").NumberProperty;
26
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
27
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
28
+ }>, "stock_lot">, undefined>;
29
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
30
+ }>, "serial_number">;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SerialNumber = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const stock_lot_1 = require("./stock-lot");
6
+ const invalidation_reason_1 = require("./invalidation-reason");
7
+ exports.SerialNumber = utils_1.model.define('serial_number', {
8
+ id: utils_1.model.id().primaryKey(),
9
+ order_id: utils_1.model.text(),
10
+ value: utils_1.model.text(),
11
+ invalidated: utils_1.model.boolean().default(false),
12
+ invalidation_reason: utils_1.model
13
+ .belongsTo(() => invalidation_reason_1.InvalidationReason, {
14
+ mappedBy: 'serial_numbers'
15
+ })
16
+ .nullable(),
17
+ stock_lot: utils_1.model.belongsTo(() => stock_lot_1.StockLot, {
18
+ mappedBy: 'serial_numbers'
19
+ }),
20
+ // stock_lot_id is automatially added by Medusa
21
+ metadata: utils_1.model.json().nullable()
22
+ });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsLW51bWJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3RyYWNpbmcvbW9kZWxzL3NlcmlhbC1udW1iZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWlEO0FBQ2pELDJDQUFzQztBQUN0QywrREFBMEQ7QUFFN0MsUUFBQSxZQUFZLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUU7SUFDekQsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsUUFBUSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDdEIsS0FBSyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDbkIsV0FBVyxFQUFFLGFBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzNDLG1CQUFtQixFQUFFLGFBQUs7U0FDeEIsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLHdDQUFrQixFQUFFO1FBQ3BDLFFBQVEsRUFBRSxnQkFBZ0I7S0FDMUIsQ0FBQztTQUNELFFBQVEsRUFBRTtJQUNaLFNBQVMsRUFBRSxhQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFRLEVBQUU7UUFDMUMsUUFBUSxFQUFFLGdCQUFnQjtLQUMxQixDQUFDO0lBQ0YsK0NBQStDO0lBQy9DLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ2pDLENBQUMsQ0FBQSJ9
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2stbG90LWFjdGl2aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvdHJhY2luZy9tb2RlbHMvc3RvY2stbG90LWFjdGl2aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,30 @@
1
+ export declare const StockLot: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
2
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
3
+ inventory_item_id: import("@medusajs/framework/utils").TextProperty;
4
+ stock_location_id: import("@medusajs/framework/utils").TextProperty;
5
+ lot_number: import("@medusajs/framework/utils").TextProperty;
6
+ description: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
7
+ enabled: import("@medusajs/framework/utils").BooleanProperty;
8
+ initial_quantity: import("@medusajs/framework/utils").NumberProperty;
9
+ stocked_quantity: import("@medusajs/framework/utils").NumberProperty;
10
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
11
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
12
+ order_id: import("@medusajs/framework/utils").TextProperty;
13
+ value: import("@medusajs/framework/utils").TextProperty;
14
+ invalidated: import("@medusajs/framework/utils").BooleanProperty;
15
+ invalidation_reason: import("@medusajs/framework/utils").RelationNullableModifier<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
16
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
17
+ value: import("@medusajs/framework/utils").TextProperty;
18
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
19
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
20
+ }>, "invalidation_reason">, import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
21
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
22
+ value: import("@medusajs/framework/utils").TextProperty;
23
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
24
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
25
+ }>, "invalidation_reason">, undefined>, true>;
26
+ stock_lot: import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "stock_lot">, undefined>;
27
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
28
+ }>, "serial_number">>;
29
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
30
+ }>, "stock_lot">;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StockLot = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const serial_number_1 = require("./serial-number");
6
+ exports.StockLot = utils_1.model.define('stock_lot', {
7
+ id: utils_1.model.id().primaryKey(),
8
+ inventory_item_id: utils_1.model.text(), // references InventoryItem
9
+ stock_location_id: utils_1.model.text(), // references StockLocation
10
+ lot_number: utils_1.model.text(),
11
+ description: utils_1.model.text().nullable(),
12
+ enabled: utils_1.model.boolean().default(true),
13
+ initial_quantity: utils_1.model.number(),
14
+ stocked_quantity: utils_1.model.number(),
15
+ serial_numbers: utils_1.model.hasMany(() => serial_number_1.SerialNumber, {
16
+ mappedBy: 'stock_lot'
17
+ }),
18
+ metadata: utils_1.model.json().nullable()
19
+ });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2stbG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvdHJhY2luZy9tb2RlbHMvc3RvY2stbG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUFpRDtBQUNqRCxtREFBOEM7QUFFakMsUUFBQSxRQUFRLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7SUFDakQsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsaUJBQWlCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxFQUFFLDJCQUEyQjtJQUM1RCxpQkFBaUIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsMkJBQTJCO0lBQzVELFVBQVUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3hCLFdBQVcsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3BDLE9BQU8sRUFBRSxhQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUN0QyxnQkFBZ0IsRUFBRSxhQUFLLENBQUMsTUFBTSxFQUFFO0lBQ2hDLGdCQUFnQixFQUFFLGFBQUssQ0FBQyxNQUFNLEVBQUU7SUFDaEMsY0FBYyxFQUFFLGFBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsNEJBQVksRUFBRTtRQUNqRCxRQUFRLEVBQUUsV0FBVztLQUNyQixDQUFDO0lBQ0YsUUFBUSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDakMsQ0FBQyxDQUFBIn0=
@@ -0,0 +1,109 @@
1
+ import { InferTypeOf, Logger } from '@medusajs/framework/types';
2
+ import { StockLot } from './models/stock-lot';
3
+ type StockLotType = InferTypeOf<typeof StockLot>;
4
+ declare const TracingService_base: import("@medusajs/framework/utils").MedusaServiceReturnType<import("@medusajs/framework/utils").ModelConfigurationsToConfigTemplate<{
5
+ readonly StockLot: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
6
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
7
+ inventory_item_id: import("@medusajs/framework/utils").TextProperty;
8
+ stock_location_id: import("@medusajs/framework/utils").TextProperty;
9
+ lot_number: import("@medusajs/framework/utils").TextProperty;
10
+ description: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
11
+ enabled: import("@medusajs/framework/utils").BooleanProperty;
12
+ initial_quantity: import("@medusajs/framework/utils").NumberProperty;
13
+ stocked_quantity: import("@medusajs/framework/utils").NumberProperty;
14
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
15
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
16
+ order_id: import("@medusajs/framework/utils").TextProperty;
17
+ value: import("@medusajs/framework/utils").TextProperty;
18
+ invalidated: import("@medusajs/framework/utils").BooleanProperty;
19
+ invalidation_reason: import("@medusajs/framework/utils").RelationNullableModifier<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
20
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
21
+ value: import("@medusajs/framework/utils").TextProperty;
22
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
23
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
24
+ }>, "invalidation_reason">, import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
25
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
26
+ value: import("@medusajs/framework/utils").TextProperty;
27
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
28
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
29
+ }>, "invalidation_reason">, undefined>, true>;
30
+ stock_lot: import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "stock_lot">, undefined>;
31
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
32
+ }>, "serial_number">>;
33
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
34
+ }>, "stock_lot">;
35
+ readonly SerialNumber: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
36
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
37
+ order_id: import("@medusajs/framework/utils").TextProperty;
38
+ value: import("@medusajs/framework/utils").TextProperty;
39
+ invalidated: import("@medusajs/framework/utils").BooleanProperty;
40
+ invalidation_reason: import("@medusajs/framework/utils").RelationNullableModifier<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
41
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
42
+ value: import("@medusajs/framework/utils").TextProperty;
43
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
44
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
45
+ }>, "invalidation_reason">, import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
46
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
47
+ value: import("@medusajs/framework/utils").TextProperty;
48
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
49
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
50
+ }>, "invalidation_reason">, undefined>, true>;
51
+ stock_lot: import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
52
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
53
+ inventory_item_id: import("@medusajs/framework/utils").TextProperty;
54
+ stock_location_id: import("@medusajs/framework/utils").TextProperty;
55
+ lot_number: import("@medusajs/framework/utils").TextProperty;
56
+ description: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
57
+ enabled: import("@medusajs/framework/utils").BooleanProperty;
58
+ initial_quantity: import("@medusajs/framework/utils").NumberProperty;
59
+ stocked_quantity: import("@medusajs/framework/utils").NumberProperty;
60
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
61
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
62
+ }>, "stock_lot">, undefined>;
63
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
64
+ }>, "serial_number">;
65
+ readonly InvalidationReason: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
66
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
67
+ value: import("@medusajs/framework/utils").TextProperty;
68
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
69
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
70
+ order_id: import("@medusajs/framework/utils").TextProperty;
71
+ value: import("@medusajs/framework/utils").TextProperty;
72
+ invalidated: import("@medusajs/framework/utils").BooleanProperty;
73
+ invalidation_reason: import("@medusajs/framework/utils").RelationNullableModifier<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "invalidation_reason">, import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "invalidation_reason">, undefined>, true>;
74
+ stock_lot: import("@medusajs/framework/utils").BelongsTo<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
75
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
76
+ inventory_item_id: import("@medusajs/framework/utils").TextProperty;
77
+ stock_location_id: import("@medusajs/framework/utils").TextProperty;
78
+ lot_number: import("@medusajs/framework/utils").TextProperty;
79
+ description: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
80
+ enabled: import("@medusajs/framework/utils").BooleanProperty;
81
+ initial_quantity: import("@medusajs/framework/utils").NumberProperty;
82
+ stocked_quantity: import("@medusajs/framework/utils").NumberProperty;
83
+ serial_numbers: import("@medusajs/framework/utils").HasMany<() => import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "serial_number">>;
84
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
85
+ }>, "stock_lot">, undefined>;
86
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
87
+ }>, "serial_number">>;
88
+ metadata: import("@medusajs/framework/utils").NullableModifier<Record<string, unknown>, import("@medusajs/framework/utils").JSONProperty>;
89
+ }>, "invalidation_reason">;
90
+ }>>;
91
+ export declare class TracingService extends TracingService_base {
92
+ protected logger_: Logger;
93
+ constructor(container: {
94
+ logger: Logger;
95
+ }, _options?: any);
96
+ /**
97
+ * Finds the first available lot for a given inventory item and location.
98
+ * "Available" means stocked_quantity > reserved_quantity.
99
+ * Ordered by expiry_date ascending (FIFO/FEFO logic).
100
+ */
101
+ findFirstAvailable(inventoryItemId: string, stockLocationId: string): Promise<StockLotType | null>;
102
+ /**
103
+ * Adjusts the stocked_quantity of a lot by the given adjustment value.
104
+ * Pass a negative value to subtract (e.g., on fulfillment).
105
+ * Pass a positive value to add (e.g., on receiving new stock).
106
+ */
107
+ adjustLotQuantity(lotId: string, adjustment: number): Promise<StockLotType>;
108
+ }
109
+ export {};
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TracingService = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const stock_lot_1 = require("./models/stock-lot");
6
+ const serial_number_1 = require("./models/serial-number");
7
+ const invalidation_reason_1 = require("./models/invalidation-reason");
8
+ class TracingService extends (0, utils_1.MedusaService)({
9
+ StockLot: stock_lot_1.StockLot,
10
+ SerialNumber: serial_number_1.SerialNumber,
11
+ InvalidationReason: invalidation_reason_1.InvalidationReason
12
+ }) {
13
+ constructor(container, _options) {
14
+ super(...arguments);
15
+ this.logger_ = container.logger;
16
+ }
17
+ /**
18
+ * Finds the first available lot for a given inventory item and location.
19
+ * "Available" means stocked_quantity > reserved_quantity.
20
+ * Ordered by expiry_date ascending (FIFO/FEFO logic).
21
+ */
22
+ async findFirstAvailable(inventoryItemId, stockLocationId) {
23
+ const [lots] = await this.listAndCountStockLots({
24
+ inventory_item_id: inventoryItemId,
25
+ stock_location_id: stockLocationId
26
+ }, {
27
+ order: { created_at: 'ASC' }
28
+ });
29
+ // Return the first lot where available quantity > 0
30
+ const availableLot = lots.find(lot => lot.stocked_quantity > 0);
31
+ return availableLot ?? null;
32
+ }
33
+ /**
34
+ * Adjusts the stocked_quantity of a lot by the given adjustment value.
35
+ * Pass a negative value to subtract (e.g., on fulfillment).
36
+ * Pass a positive value to add (e.g., on receiving new stock).
37
+ */
38
+ async adjustLotQuantity(lotId, adjustment) {
39
+ const [lot] = await this.listStockLots({ id: lotId });
40
+ if (!lot) {
41
+ throw new Error(`StockLot with id ${lotId} not found`);
42
+ }
43
+ const updatedLot = await this.updateStockLots({
44
+ id: lotId,
45
+ stocked_quantity: lot.stocked_quantity + adjustment
46
+ });
47
+ this.logger_.info(`Adjusted lot ${lotId} quantity by ${adjustment}. New stocked quantity: ${updatedLot.stocked_quantity}`);
48
+ return updatedLot;
49
+ }
50
+ }
51
+ exports.TracingService = TracingService;
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3RyYWNpbmcvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBeUQ7QUFFekQsa0RBQTZDO0FBQzdDLDBEQUFxRDtBQUNyRCxzRUFBaUU7QUFJakUsTUFBYSxjQUFlLFNBQVEsSUFBQSxxQkFBYSxFQUFDO0lBQ2pELFFBQVEsRUFBUixvQkFBUTtJQUNSLFlBQVksRUFBWiw0QkFBWTtJQUNaLGtCQUFrQixFQUFsQix3Q0FBa0I7Q0FDbEIsQ0FBQztJQUdELFlBQVksU0FBNkIsRUFBRSxRQUFjO1FBQ3hELEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFBO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQTtJQUNoQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxrQkFBa0IsQ0FDdkIsZUFBdUIsRUFDdkIsZUFBdUI7UUFFdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUM5QztZQUNDLGlCQUFpQixFQUFFLGVBQWU7WUFDbEMsaUJBQWlCLEVBQUUsZUFBZTtTQUNsQyxFQUNEO1lBQ0MsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtTQUM1QixDQUNELENBQUE7UUFFRCxvREFBb0Q7UUFDcEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUUvRCxPQUFPLFlBQVksSUFBSSxJQUFJLENBQUE7SUFDNUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBYSxFQUFFLFVBQWtCO1FBQ3hELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUVyRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixLQUFLLFlBQVksQ0FBQyxDQUFBO1FBQ3ZELENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDN0MsRUFBRSxFQUFFLEtBQUs7WUFDVCxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsVUFBVTtTQUNuRCxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDaEIsZ0JBQWdCLEtBQUssZ0JBQWdCLFVBQVUsMkJBQTRCLFVBQWtCLENBQUMsZ0JBQWdCLEVBQUUsQ0FDaEgsQ0FBQTtRQUNELE9BQU8sVUFBMEIsQ0FBQTtJQUNsQyxDQUFDO0NBQ0Q7QUExREQsd0NBMERDIn0=
@@ -0,0 +1,8 @@
1
+ import { SubscriberArgs, type SubscriberConfig } from '@medusajs/framework';
2
+ type FulfillmentCreatedData = {
3
+ order_id: string;
4
+ fulfillment_id: string;
5
+ };
6
+ export default function fulfillmentCreatedHandler({ event: { data }, container, }: SubscriberArgs<FulfillmentCreatedData>): Promise<void>;
7
+ export declare const config: SubscriberConfig;
8
+ export {};
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = fulfillmentCreatedHandler;
5
+ const crypto_1 = require("crypto");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const tracing_1 = require("../modules/tracing");
8
+ async function fulfillmentCreatedHandler({ event: { data }, container, }) {
9
+ const tracingService = container.resolve(tracing_1.TRACING_MODULE);
10
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
11
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
12
+ const { data: fulfillments } = await query.graph({
13
+ entity: 'fulfillment',
14
+ fields: ['id', 'location_id', 'items.*'],
15
+ filters: { id: data.fulfillment_id }
16
+ });
17
+ const fulfillment = fulfillments[0];
18
+ if (!fulfillment) {
19
+ logger.warn(`tracing: fulfillment ${data.fulfillment_id} not found — skipping stock lot tracking`);
20
+ return;
21
+ }
22
+ const managedItems = fulfillment.items.filter((item) => !!item.inventory_item_id);
23
+ if (!managedItems.length)
24
+ return;
25
+ const orderId = data.order_id;
26
+ for (const item of managedItems) {
27
+ try {
28
+ const lot = await tracingService.findFirstAvailable(item.inventory_item_id, fulfillment.location_id);
29
+ if (!lot) {
30
+ logger.warn(`tracing: no stock lot available for inventory item ${item.inventory_item_id} ` +
31
+ `at location ${fulfillment.location_id} — skipping lot tracking for fulfillment ${fulfillment.id}`);
32
+ continue;
33
+ }
34
+ await tracingService.adjustLotQuantity(lot.id, -item.quantity);
35
+ if (orderId) {
36
+ await Promise.all(Array.from({ length: item.quantity }, () => tracingService.createSerialNumbers({
37
+ order_id: orderId,
38
+ value: (0, crypto_1.randomUUID)(),
39
+ stock_lot_id: lot.id
40
+ })));
41
+ }
42
+ }
43
+ catch (error) {
44
+ logger.error(`tracing: failed to process stock lot for inventory item ${item.inventory_item_id} ` +
45
+ `in fulfillment ${fulfillment.id}: ${error.message}`);
46
+ }
47
+ }
48
+ }
49
+ exports.config = {
50
+ event: 'order.fulfillment_created',
51
+ };
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsZmlsbG1lbnQtY3JlYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9mdWxmaWxsbWVudC1jcmVhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVdBLDRDQTREQztBQXZFRCxtQ0FBbUM7QUFFbkMscURBQXFFO0FBQ3JFLGdEQUFtRDtBQVFwQyxLQUFLLFVBQVUseUJBQXlCLENBQUMsRUFDdkQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQUMrQjtJQUN4QyxNQUFNLGNBQWMsR0FBbUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyx3QkFBYyxDQUFDLENBQUE7SUFDeEUsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsRSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWhFLE1BQU0sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ2hELE1BQU0sRUFBRSxhQUFhO1FBQ3JCLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDO1FBQ3hDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFO0tBQ3BDLENBQUMsQ0FBQTtJQUVGLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNuQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLGNBQWMsMENBQTBDLENBQUMsQ0FBQTtRQUNsRyxPQUFNO0lBQ1AsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFDdEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNO1FBQUUsT0FBTTtJQUVoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFBO0lBRTdCLEtBQUssTUFBTSxJQUFJLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDO1lBQ0osTUFBTSxHQUFHLEdBQUcsTUFBTSxjQUFjLENBQUMsa0JBQWtCLENBQ2xELElBQUksQ0FBQyxpQkFBa0IsRUFDdkIsV0FBVyxDQUFDLFdBQVcsQ0FDdkIsQ0FBQTtZQUVELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVixNQUFNLENBQUMsSUFBSSxDQUNWLHNEQUFzRCxJQUFJLENBQUMsaUJBQWlCLEdBQUc7b0JBQy9FLGVBQWUsV0FBVyxDQUFDLFdBQVcsNENBQTRDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FDbEcsQ0FBQTtnQkFDRCxTQUFRO1lBQ1QsQ0FBQztZQUVELE1BQU0sY0FBYyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7WUFFOUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDYixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUMxQyxjQUFjLENBQUMsbUJBQW1CLENBQUM7b0JBQ2xDLFFBQVEsRUFBRSxPQUFPO29CQUNqQixLQUFLLEVBQUUsSUFBQSxtQkFBVSxHQUFFO29CQUNuQixZQUFZLEVBQUUsR0FBRyxDQUFDLEVBQUU7aUJBQ2IsQ0FBQyxDQUNULENBQ0QsQ0FBQTtZQUNGLENBQUM7UUFDRixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsS0FBSyxDQUNYLDJEQUEyRCxJQUFJLENBQUMsaUJBQWlCLEdBQUc7Z0JBQ3BGLGtCQUFrQixXQUFXLENBQUMsRUFBRSxLQUFNLEtBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FDL0QsQ0FBQTtRQUNGLENBQUM7SUFDRixDQUFDO0FBQ0YsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN2QyxLQUFLLEVBQUUsMkJBQTJCO0NBQ2xDLENBQUEifQ==
@@ -0,0 +1,7 @@
1
+ type AdjustStockOrderWorkflowInput = {
2
+ order_id: string;
3
+ };
4
+ export declare const adjustStockOrderWorkflow: import("@medusajs/framework/workflows-sdk").ReturnWorkflow<AdjustStockOrderWorkflowInput, {
5
+ order_id: string;
6
+ }, []>;
7
+ export {};
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.adjustStockOrderWorkflow = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const tracing_1 = require("../../modules/tracing");
6
+ const adjustStockLotStep = (0, workflows_sdk_1.createStep)('adjust-stock-lot', async ({ order_id }, { container }) => {
7
+ const tracingService = container.resolve(tracing_1.TRACING_MODULE);
8
+ const query = container.resolve('query');
9
+ const { data: orders } = await query.graph({
10
+ entity: 'order',
11
+ fields: [
12
+ 'id',
13
+ 'items.*',
14
+ 'items.variant.*',
15
+ 'items.variant.inventory.*',
16
+ 'items.variant.inventory.location_levels.*'
17
+ ],
18
+ filters: { id: order_id }
19
+ });
20
+ const order = orders[0];
21
+ if (order.items && order.items.length > 0) {
22
+ for (const item of order.items) {
23
+ if (!item?.variant || !item?.variant.inventory)
24
+ continue;
25
+ for (const inv of item.variant?.inventory ?? []) {
26
+ if (!inv?.id)
27
+ continue;
28
+ for (const locLevel of inv?.location_levels ?? []) {
29
+ if (!locLevel?.location_id)
30
+ continue;
31
+ // Find the first available lot for this inventory item + location
32
+ const lot = await tracingService.findFirstAvailable(inv.id, locLevel.location_id);
33
+ if (!lot)
34
+ continue;
35
+ // Adjust the lot's reserved quantity
36
+ await tracingService.adjustLotQuantity(lot.id, -item.quantity);
37
+ }
38
+ }
39
+ }
40
+ }
41
+ return new workflows_sdk_1.StepResponse({ order_id });
42
+ });
43
+ exports.adjustStockOrderWorkflow = (0, workflows_sdk_1.createWorkflow)('adjust-stock-order', ({ order_id }) => {
44
+ const result = adjustStockLotStep({ order_id });
45
+ return new workflows_sdk_1.WorkflowResponse(result);
46
+ });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRqdXN0LXN0b2NrLW9yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy90cmFjaW5nL2FkanVzdC1zdG9jay1vcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFLMEM7QUFDMUMsbURBQXNEO0FBT3RELE1BQU0sa0JBQWtCLEdBQUcsSUFBQSwwQkFBVSxFQUNwQyxrQkFBa0IsRUFDbEIsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUEyQixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUM5RCxNQUFNLGNBQWMsR0FBbUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyx3QkFBYyxDQUFDLENBQUE7SUFFeEUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMxQyxNQUFNLEVBQUUsT0FBTztRQUNmLE1BQU0sRUFBRTtZQUNQLElBQUk7WUFDSixTQUFTO1lBQ1QsaUJBQWlCO1lBQ2pCLDJCQUEyQjtZQUMzQiwyQ0FBMkM7U0FDM0M7UUFDRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFO0tBQ3pCLENBQUMsQ0FBQTtJQUNGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUV2QixJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0MsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQUUsU0FBUTtZQUN4RCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQUUsU0FBUTtnQkFDdEIsS0FBSyxNQUFNLFFBQVEsSUFBSSxHQUFHLEVBQUUsZUFBZSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNuRCxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVc7d0JBQUUsU0FBUTtvQkFDcEMsa0VBQWtFO29CQUNsRSxNQUFNLEdBQUcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtvQkFDakYsSUFBSSxDQUFDLEdBQUc7d0JBQUUsU0FBUTtvQkFDbEIscUNBQXFDO29CQUNyQyxNQUFNLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUMvRCxDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7SUFDRixDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0FBQ3RDLENBQUMsQ0FDRCxDQUFBO0FBTVksUUFBQSx3QkFBd0IsR0FBRyxJQUFBLDhCQUFjLEVBQ3JELG9CQUFvQixFQUNwQixDQUFDLEVBQUUsUUFBUSxFQUFpQyxFQUFFLEVBQUU7SUFDL0MsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNwQyxDQUFDLENBQ0QsQ0FBQSJ9
@@ -0,0 +1,45 @@
1
+ export declare const createStockLotWorkflow: import("@medusajs/framework/workflows-sdk").ReturnWorkflow<{
2
+ inventory_item_id: string;
3
+ stock_location_id: string;
4
+ enabled: boolean;
5
+ lot_number: string;
6
+ description?: string | null | undefined;
7
+ initial_quantity?: number | undefined;
8
+ stocked_quantity?: number | undefined;
9
+ metadata?: Record<string, unknown> | null | undefined;
10
+ }, {
11
+ id: string;
12
+ inventory_item_id: string;
13
+ stock_location_id: string;
14
+ lot_number: string;
15
+ description: string | null;
16
+ enabled: boolean;
17
+ initial_quantity: number;
18
+ stocked_quantity: number;
19
+ serial_numbers: {
20
+ id: string;
21
+ order_id: string;
22
+ value: string;
23
+ invalidated: boolean;
24
+ invalidation_reason: {
25
+ id: string;
26
+ value: string;
27
+ serial_numbers: /*elided*/ any[];
28
+ metadata: Record<string, unknown> | null;
29
+ created_at: Date;
30
+ updated_at: Date;
31
+ deleted_at: Date | null;
32
+ };
33
+ stock_lot: /*elided*/ any;
34
+ metadata: Record<string, unknown> | null;
35
+ created_at: Date;
36
+ updated_at: Date;
37
+ deleted_at: Date | null;
38
+ invalidation_reason_id: string | null;
39
+ stock_lot_id: string;
40
+ }[];
41
+ metadata: Record<string, unknown> | null;
42
+ created_at: Date;
43
+ updated_at: Date;
44
+ deleted_at: Date | null;
45
+ }, []>;