@kernhq/module-inventory 0.2.0 → 0.4.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.
- package/README.md +106 -25
- package/dist/contract/capabilities.d.ts +4 -4
- package/dist/contract/capabilities.d.ts.map +1 -1
- package/dist/contract/capabilities.js +51 -9
- package/dist/contract/capabilities.js.map +1 -1
- package/dist/contract/events.d.ts +43 -0
- package/dist/contract/events.d.ts.map +1 -1
- package/dist/contract/events.js +40 -0
- package/dist/contract/events.js.map +1 -1
- package/dist/contract/index.d.ts +1 -0
- package/dist/contract/index.d.ts.map +1 -1
- package/dist/contract/index.js +1 -0
- package/dist/contract/index.js.map +1 -1
- package/dist/contract/models.d.ts +345 -0
- package/dist/contract/models.d.ts.map +1 -1
- package/dist/contract/models.js +245 -0
- package/dist/contract/models.js.map +1 -1
- package/dist/contract/notifications.d.ts +24 -0
- package/dist/contract/notifications.d.ts.map +1 -0
- package/dist/contract/notifications.js +72 -0
- package/dist/contract/notifications.js.map +1 -0
- package/dist/contract/permissions.d.ts +52 -2
- package/dist/contract/permissions.d.ts.map +1 -1
- package/dist/contract/permissions.js +55 -2
- package/dist/contract/permissions.js.map +1 -1
- package/dist/contract/router.d.ts +1108 -0
- package/dist/contract/router.d.ts.map +1 -1
- package/dist/contract/router.js +253 -1
- package/dist/contract/router.js.map +1 -1
- package/dist/contract/settings.d.ts +2 -0
- package/dist/contract/settings.d.ts.map +1 -1
- package/dist/contract/settings.js +24 -4
- package/dist/contract/settings.js.map +1 -1
- package/dist/server/index.d.ts +8 -4
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +289 -5
- package/dist/server/index.js.map +1 -1
- package/dist/server/jobs.d.ts +48 -0
- package/dist/server/jobs.d.ts.map +1 -0
- package/dist/server/jobs.js +358 -0
- package/dist/server/jobs.js.map +1 -0
- package/dist/server/router.d.ts +1392 -0
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/router.js +385 -7
- package/dist/server/router.js.map +1 -1
- package/dist/server/schema.d.ts +134 -1
- package/dist/server/schema.d.ts.map +1 -1
- package/dist/server/schema.js +169 -4
- package/dist/server/schema.js.map +1 -1
- package/dist/server/services/assets.d.ts +69 -3
- package/dist/server/services/assets.d.ts.map +1 -1
- package/dist/server/services/assets.js +199 -31
- package/dist/server/services/assets.js.map +1 -1
- package/dist/server/services/attachments.d.ts +80 -0
- package/dist/server/services/attachments.d.ts.map +1 -0
- package/dist/server/services/attachments.js +182 -0
- package/dist/server/services/attachments.js.map +1 -0
- package/dist/server/services/audience.d.ts +15 -0
- package/dist/server/services/audience.d.ts.map +1 -0
- package/dist/server/services/audience.js +64 -0
- package/dist/server/services/audience.js.map +1 -0
- package/dist/server/services/categories.d.ts +157 -0
- package/dist/server/services/categories.d.ts.map +1 -0
- package/dist/server/services/categories.js +309 -0
- package/dist/server/services/categories.js.map +1 -0
- package/dist/server/services/cursor.d.ts +68 -0
- package/dist/server/services/cursor.d.ts.map +1 -0
- package/dist/server/services/cursor.js +39 -0
- package/dist/server/services/cursor.js.map +1 -0
- package/dist/server/services/custody.d.ts +175 -0
- package/dist/server/services/custody.d.ts.map +1 -0
- package/dist/server/services/custody.js +367 -0
- package/dist/server/services/custody.js.map +1 -0
- package/dist/server/services/db-errors.d.ts +7 -0
- package/dist/server/services/db-errors.d.ts.map +1 -0
- package/dist/server/services/db-errors.js +32 -0
- package/dist/server/services/db-errors.js.map +1 -0
- package/dist/server/services/index.d.ts +16 -0
- package/dist/server/services/index.d.ts.map +1 -1
- package/dist/server/services/index.js +25 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/members.d.ts +27 -0
- package/dist/server/services/members.d.ts.map +1 -0
- package/dist/server/services/members.js +39 -0
- package/dist/server/services/members.js.map +1 -0
- package/dist/server/services/notify.d.ts +43 -1
- package/dist/server/services/notify.d.ts.map +1 -1
- package/dist/server/services/notify.js +47 -5
- package/dist/server/services/notify.js.map +1 -1
- package/dist/server/services/offboarding.d.ts +70 -0
- package/dist/server/services/offboarding.d.ts.map +1 -0
- package/dist/server/services/offboarding.js +116 -0
- package/dist/server/services/offboarding.js.map +1 -0
- package/dist/server/services/repairs.d.ts +204 -0
- package/dist/server/services/repairs.d.ts.map +1 -0
- package/dist/server/services/repairs.js +476 -0
- package/dist/server/services/repairs.js.map +1 -0
- package/dist/server/services/search.d.ts +85 -0
- package/dist/server/services/search.d.ts.map +1 -0
- package/dist/server/services/search.js +142 -0
- package/dist/server/services/search.js.map +1 -0
- package/dist/server/services/stats.d.ts +42 -0
- package/dist/server/services/stats.d.ts.map +1 -0
- package/dist/server/services/stats.js +80 -0
- package/dist/server/services/stats.js.map +1 -0
- package/dist/server/services/status.d.ts +102 -0
- package/dist/server/services/status.d.ts.map +1 -0
- package/dist/server/services/status.js +71 -0
- package/dist/server/services/status.js.map +1 -0
- package/migrations/0002_custody_and_categories.sql +23 -0
- package/migrations/0003_repairs.sql +23 -0
- package/migrations/0004_platform_surfaces.sql +51 -0
- package/migrations/0005_repair_dates.sql +35 -0
- package/migrations/0006_workspace_registry_read.sql +50 -0
- package/migrations/0007_history_sequence.sql +83 -0
- package/migrations/0008_category_order_unique.sql +71 -0
- package/migrations/meta/0002_snapshot.json +1054 -0
- package/migrations/meta/0003_snapshot.json +1070 -0
- package/migrations/meta/0004_snapshot.json +1130 -0
- package/migrations/meta/0005_snapshot.json +1135 -0
- package/migrations/meta/_journal.json +49 -0
- package/package.json +2 -1
- package/src/client/api-instance.ts +27 -2
- package/src/client/bidi.test.ts +148 -0
- package/src/client/bidi.ts +85 -0
- package/src/client/components/AssetDetailPanel.svelte +614 -0
- package/src/client/components/AssetFormDialog.svelte +71 -22
- package/src/client/components/AssetPhoto.svelte +178 -0
- package/src/client/components/AttachmentsSection.svelte +327 -0
- package/src/client/components/CustodyDialog.svelte +201 -0
- package/src/client/components/RepairDialog.svelte +271 -0
- package/src/client/components/RepairsSection.svelte +318 -0
- package/src/client/components/Timeline.svelte +347 -0
- package/src/client/components/TimelineText.svelte +124 -0
- package/src/client/core-api.ts +71 -0
- package/src/client/custody.test.ts +31 -0
- package/src/client/custody.ts +34 -0
- package/src/client/errors.test.ts +395 -0
- package/src/client/errors.ts +229 -0
- package/src/client/links.test.ts +74 -0
- package/src/client/links.ts +44 -0
- package/src/client/members.test.ts +132 -0
- package/src/client/members.ts +116 -0
- package/src/client/messages.test.ts +127 -0
- package/src/client/messages.ts +1106 -18
- package/src/client/mock.test.ts +465 -1
- package/src/client/mock.ts +1105 -79
- package/src/client/module.ts +73 -1
- package/src/client/pages/AssetsPage.svelte +317 -45
- package/src/client/permissions.ts +7 -0
- package/src/client/price.test.ts +151 -3
- package/src/client/price.ts +155 -11
- package/src/client/query.ts +36 -0
- package/src/client/reorder.test.ts +100 -0
- package/src/client/reorder.ts +79 -0
- package/src/client/repairs.test.ts +38 -0
- package/src/client/repairs.ts +38 -0
- package/src/client/sequence.test.ts +248 -0
- package/src/client/sequence.ts +185 -0
- package/src/client/settings/CategoriesSettings.svelte +746 -0
- package/src/client/settings/GeneralSettings.svelte +0 -0
- package/src/client/status.ts +29 -0
- package/src/client/timeline.test.ts +175 -0
- package/src/client/timeline.ts +206 -0
- package/src/client/widgets/OverviewWidget.svelte +127 -26
- package/src/client/widgets/RepairsWidget.svelte +124 -0
- package/src/contract/capabilities.ts +53 -9
- package/src/contract/events.ts +49 -0
- package/src/contract/index.ts +1 -0
- package/src/contract/models.ts +270 -0
- package/src/contract/notifications.ts +73 -0
- package/src/contract/permissions.ts +55 -2
- package/src/contract/router.ts +284 -1
- package/src/contract/settings.ts +24 -4
- package/src/module.test.ts +217 -4
- package/src/server/index.ts +311 -4
- package/src/server/inventory.int.test.ts +4109 -19
- package/src/server/jobs.ts +444 -0
- package/src/server/migrations.test.ts +253 -2
- package/src/server/router.ts +486 -6
- package/src/server/schema.ts +171 -3
- package/src/server/services/assets.ts +214 -54
- package/src/server/services/attachments.ts +215 -0
- package/src/server/services/audience.ts +77 -0
- package/src/server/services/categories.ts +337 -0
- package/src/server/services/cursor.ts +104 -0
- package/src/server/services/custody.ts +471 -0
- package/src/server/services/db-errors.ts +42 -0
- package/src/server/services/index.ts +34 -1
- package/src/server/services/members.ts +54 -0
- package/src/server/services/notify.ts +52 -7
- package/src/server/services/offboarding.ts +150 -0
- package/src/server/services/repairs.ts +567 -0
- package/src/server/services/search.ts +166 -0
- package/src/server/services/stats.ts +88 -0
- package/src/server/services/status.test.ts +34 -0
- package/src/server/services/status.ts +143 -0
- package/src/client/settings/core-api.ts +0 -32
|
@@ -320,6 +320,1114 @@ export declare const inventoryContract: {
|
|
|
320
320
|
}, z.core.$strip>;
|
|
321
321
|
};
|
|
322
322
|
}>, Record<never, never>>;
|
|
323
|
+
/**
|
|
324
|
+
* The asset's own timeline, newest first.
|
|
325
|
+
*
|
|
326
|
+
* Paged with the same keyset discipline `assets.list` uses and the same cursor codec, because a
|
|
327
|
+
* second bookmark format is a second set of the three bugs the first one had. The bookmark is a
|
|
328
|
+
* row id; the ordering is by id, which for a uuidv7 is the clock and, unlike `created_at`, is
|
|
329
|
+
* unique — two entries written in one transaction (a create and its first custody row) share a
|
|
330
|
+
* timestamp and a page boundary between them would repeat or drop one.
|
|
331
|
+
*
|
|
332
|
+
* Reads on `inventory.asset.view`. See `permissions.ts` for why custody is not gated separately.
|
|
333
|
+
*/
|
|
334
|
+
history: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
335
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
336
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
337
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
338
|
+
assetId: z.ZodUUID;
|
|
339
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
340
|
+
items: z.ZodArray<z.ZodObject<{
|
|
341
|
+
id: z.ZodUUID;
|
|
342
|
+
assetId: z.ZodUUID;
|
|
343
|
+
actorId: z.ZodNullable<z.ZodUUID>;
|
|
344
|
+
action: z.ZodString;
|
|
345
|
+
changes: z.ZodArray<z.ZodObject<{
|
|
346
|
+
field: z.ZodString;
|
|
347
|
+
from: z.ZodUnknown;
|
|
348
|
+
to: z.ZodUnknown;
|
|
349
|
+
}, z.core.$strip>>;
|
|
350
|
+
data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
351
|
+
occurredAt: z.ZodString;
|
|
352
|
+
}, z.core.$strip>>;
|
|
353
|
+
nextCursor: z.ZodNullable<z.ZodString>;
|
|
354
|
+
total: z.ZodOptional<z.ZodNumber>;
|
|
355
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
356
|
+
BAD_REQUEST: {
|
|
357
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
358
|
+
};
|
|
359
|
+
UNAUTHORIZED: {};
|
|
360
|
+
FORBIDDEN: {
|
|
361
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
362
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
363
|
+
}, z.core.$strip>>;
|
|
364
|
+
};
|
|
365
|
+
NOT_FOUND: {};
|
|
366
|
+
CONFLICT: {
|
|
367
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
368
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
369
|
+
}, z.core.$strip>>;
|
|
370
|
+
};
|
|
371
|
+
RATE_LIMITED: {};
|
|
372
|
+
MODULE_DISABLED: {
|
|
373
|
+
data: z.ZodObject<{
|
|
374
|
+
module: z.ZodString;
|
|
375
|
+
}, z.core.$strip>;
|
|
376
|
+
};
|
|
377
|
+
}>, Record<never, never>>;
|
|
378
|
+
};
|
|
379
|
+
/**
|
|
380
|
+
* Who is holding what.
|
|
381
|
+
*
|
|
382
|
+
* Four verbs rather than one, because "hand it to somebody" and "hand it on to somebody else" are
|
|
383
|
+
* different questions with different failure modes: assigning something already out is a mistake
|
|
384
|
+
* worth refusing, and transferring something nobody holds is a different mistake. One procedure
|
|
385
|
+
* taking `userId | null` would answer both by silently doing whatever the row happened to allow.
|
|
386
|
+
*/
|
|
387
|
+
custody: {
|
|
388
|
+
/** Hand a free item to a member. Refuses if somebody already has it — that is `transfer`. */
|
|
389
|
+
assign: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
390
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
391
|
+
assetId: z.ZodUUID;
|
|
392
|
+
userId: z.ZodUUID;
|
|
393
|
+
note: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
394
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
395
|
+
asset: z.ZodObject<{
|
|
396
|
+
id: z.ZodUUID;
|
|
397
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
398
|
+
code: z.ZodString;
|
|
399
|
+
name: z.ZodString;
|
|
400
|
+
description: z.ZodString;
|
|
401
|
+
categoryId: z.ZodNullable<z.ZodUUID>;
|
|
402
|
+
status: z.ZodEnum<{
|
|
403
|
+
in_stock: "in_stock";
|
|
404
|
+
assigned: "assigned";
|
|
405
|
+
reserved: "reserved";
|
|
406
|
+
under_repair: "under_repair";
|
|
407
|
+
lost: "lost";
|
|
408
|
+
retired: "retired";
|
|
409
|
+
}>;
|
|
410
|
+
custodianUserId: z.ZodNullable<z.ZodUUID>;
|
|
411
|
+
custodySince: z.ZodNullable<z.ZodString>;
|
|
412
|
+
serialNumber: z.ZodNullable<z.ZodString>;
|
|
413
|
+
location: z.ZodNullable<z.ZodString>;
|
|
414
|
+
purchasedOn: z.ZodNullable<z.ZodString>;
|
|
415
|
+
purchasedFrom: z.ZodNullable<z.ZodString>;
|
|
416
|
+
priceMinor: z.ZodNullable<z.ZodNumber>;
|
|
417
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
418
|
+
warrantyUntil: z.ZodNullable<z.ZodString>;
|
|
419
|
+
photoFileId: z.ZodNullable<z.ZodUUID>;
|
|
420
|
+
custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
421
|
+
createdAt: z.ZodString;
|
|
422
|
+
updatedAt: z.ZodString;
|
|
423
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
424
|
+
}, z.core.$strip>;
|
|
425
|
+
period: z.ZodNullable<z.ZodObject<{
|
|
426
|
+
id: z.ZodUUID;
|
|
427
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
428
|
+
assetId: z.ZodUUID;
|
|
429
|
+
userId: z.ZodUUID;
|
|
430
|
+
note: z.ZodNullable<z.ZodString>;
|
|
431
|
+
effectiveFrom: z.ZodString;
|
|
432
|
+
effectiveTo: z.ZodNullable<z.ZodString>;
|
|
433
|
+
createdBy: z.ZodNullable<z.ZodUUID>;
|
|
434
|
+
createdAt: z.ZodString;
|
|
435
|
+
}, z.core.$strip>>;
|
|
436
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
437
|
+
BAD_REQUEST: {
|
|
438
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
439
|
+
};
|
|
440
|
+
UNAUTHORIZED: {};
|
|
441
|
+
FORBIDDEN: {
|
|
442
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
443
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
444
|
+
}, z.core.$strip>>;
|
|
445
|
+
};
|
|
446
|
+
NOT_FOUND: {};
|
|
447
|
+
CONFLICT: {
|
|
448
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
449
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
450
|
+
}, z.core.$strip>>;
|
|
451
|
+
};
|
|
452
|
+
RATE_LIMITED: {};
|
|
453
|
+
MODULE_DISABLED: {
|
|
454
|
+
data: z.ZodObject<{
|
|
455
|
+
module: z.ZodString;
|
|
456
|
+
}, z.core.$strip>;
|
|
457
|
+
};
|
|
458
|
+
}>, Record<never, never>>;
|
|
459
|
+
/** Take it back. Closes the open period and puts the asset back in stock. */
|
|
460
|
+
return: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
461
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
462
|
+
assetId: z.ZodUUID;
|
|
463
|
+
note: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
464
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
465
|
+
asset: z.ZodObject<{
|
|
466
|
+
id: z.ZodUUID;
|
|
467
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
468
|
+
code: z.ZodString;
|
|
469
|
+
name: z.ZodString;
|
|
470
|
+
description: z.ZodString;
|
|
471
|
+
categoryId: z.ZodNullable<z.ZodUUID>;
|
|
472
|
+
status: z.ZodEnum<{
|
|
473
|
+
in_stock: "in_stock";
|
|
474
|
+
assigned: "assigned";
|
|
475
|
+
reserved: "reserved";
|
|
476
|
+
under_repair: "under_repair";
|
|
477
|
+
lost: "lost";
|
|
478
|
+
retired: "retired";
|
|
479
|
+
}>;
|
|
480
|
+
custodianUserId: z.ZodNullable<z.ZodUUID>;
|
|
481
|
+
custodySince: z.ZodNullable<z.ZodString>;
|
|
482
|
+
serialNumber: z.ZodNullable<z.ZodString>;
|
|
483
|
+
location: z.ZodNullable<z.ZodString>;
|
|
484
|
+
purchasedOn: z.ZodNullable<z.ZodString>;
|
|
485
|
+
purchasedFrom: z.ZodNullable<z.ZodString>;
|
|
486
|
+
priceMinor: z.ZodNullable<z.ZodNumber>;
|
|
487
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
488
|
+
warrantyUntil: z.ZodNullable<z.ZodString>;
|
|
489
|
+
photoFileId: z.ZodNullable<z.ZodUUID>;
|
|
490
|
+
custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
491
|
+
createdAt: z.ZodString;
|
|
492
|
+
updatedAt: z.ZodString;
|
|
493
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
494
|
+
}, z.core.$strip>;
|
|
495
|
+
period: z.ZodNullable<z.ZodObject<{
|
|
496
|
+
id: z.ZodUUID;
|
|
497
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
498
|
+
assetId: z.ZodUUID;
|
|
499
|
+
userId: z.ZodUUID;
|
|
500
|
+
note: z.ZodNullable<z.ZodString>;
|
|
501
|
+
effectiveFrom: z.ZodString;
|
|
502
|
+
effectiveTo: z.ZodNullable<z.ZodString>;
|
|
503
|
+
createdBy: z.ZodNullable<z.ZodUUID>;
|
|
504
|
+
createdAt: z.ZodString;
|
|
505
|
+
}, z.core.$strip>>;
|
|
506
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
507
|
+
BAD_REQUEST: {
|
|
508
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
509
|
+
};
|
|
510
|
+
UNAUTHORIZED: {};
|
|
511
|
+
FORBIDDEN: {
|
|
512
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
513
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
514
|
+
}, z.core.$strip>>;
|
|
515
|
+
};
|
|
516
|
+
NOT_FOUND: {};
|
|
517
|
+
CONFLICT: {
|
|
518
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
519
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
520
|
+
}, z.core.$strip>>;
|
|
521
|
+
};
|
|
522
|
+
RATE_LIMITED: {};
|
|
523
|
+
MODULE_DISABLED: {
|
|
524
|
+
data: z.ZodObject<{
|
|
525
|
+
module: z.ZodString;
|
|
526
|
+
}, z.core.$strip>;
|
|
527
|
+
};
|
|
528
|
+
}>, Record<never, never>>;
|
|
529
|
+
/**
|
|
530
|
+
* Hand it straight on: one transaction, not a return followed by an assign.
|
|
531
|
+
*
|
|
532
|
+
* Two calls would leave the asset `in_stock` with no custodian in between — visible to anybody
|
|
533
|
+
* reading the list at that moment, and permanently visible in the timeline as a return that
|
|
534
|
+
* nobody performed.
|
|
535
|
+
*/
|
|
536
|
+
transfer: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
537
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
538
|
+
assetId: z.ZodUUID;
|
|
539
|
+
userId: z.ZodUUID;
|
|
540
|
+
note: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
541
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
542
|
+
asset: z.ZodObject<{
|
|
543
|
+
id: z.ZodUUID;
|
|
544
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
545
|
+
code: z.ZodString;
|
|
546
|
+
name: z.ZodString;
|
|
547
|
+
description: z.ZodString;
|
|
548
|
+
categoryId: z.ZodNullable<z.ZodUUID>;
|
|
549
|
+
status: z.ZodEnum<{
|
|
550
|
+
in_stock: "in_stock";
|
|
551
|
+
assigned: "assigned";
|
|
552
|
+
reserved: "reserved";
|
|
553
|
+
under_repair: "under_repair";
|
|
554
|
+
lost: "lost";
|
|
555
|
+
retired: "retired";
|
|
556
|
+
}>;
|
|
557
|
+
custodianUserId: z.ZodNullable<z.ZodUUID>;
|
|
558
|
+
custodySince: z.ZodNullable<z.ZodString>;
|
|
559
|
+
serialNumber: z.ZodNullable<z.ZodString>;
|
|
560
|
+
location: z.ZodNullable<z.ZodString>;
|
|
561
|
+
purchasedOn: z.ZodNullable<z.ZodString>;
|
|
562
|
+
purchasedFrom: z.ZodNullable<z.ZodString>;
|
|
563
|
+
priceMinor: z.ZodNullable<z.ZodNumber>;
|
|
564
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
565
|
+
warrantyUntil: z.ZodNullable<z.ZodString>;
|
|
566
|
+
photoFileId: z.ZodNullable<z.ZodUUID>;
|
|
567
|
+
custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
568
|
+
createdAt: z.ZodString;
|
|
569
|
+
updatedAt: z.ZodString;
|
|
570
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
571
|
+
}, z.core.$strip>;
|
|
572
|
+
period: z.ZodNullable<z.ZodObject<{
|
|
573
|
+
id: z.ZodUUID;
|
|
574
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
575
|
+
assetId: z.ZodUUID;
|
|
576
|
+
userId: z.ZodUUID;
|
|
577
|
+
note: z.ZodNullable<z.ZodString>;
|
|
578
|
+
effectiveFrom: z.ZodString;
|
|
579
|
+
effectiveTo: z.ZodNullable<z.ZodString>;
|
|
580
|
+
createdBy: z.ZodNullable<z.ZodUUID>;
|
|
581
|
+
createdAt: z.ZodString;
|
|
582
|
+
}, z.core.$strip>>;
|
|
583
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
584
|
+
BAD_REQUEST: {
|
|
585
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
586
|
+
};
|
|
587
|
+
UNAUTHORIZED: {};
|
|
588
|
+
FORBIDDEN: {
|
|
589
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
590
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
591
|
+
}, z.core.$strip>>;
|
|
592
|
+
};
|
|
593
|
+
NOT_FOUND: {};
|
|
594
|
+
CONFLICT: {
|
|
595
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
596
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
597
|
+
}, z.core.$strip>>;
|
|
598
|
+
};
|
|
599
|
+
RATE_LIMITED: {};
|
|
600
|
+
MODULE_DISABLED: {
|
|
601
|
+
data: z.ZodObject<{
|
|
602
|
+
module: z.ZodString;
|
|
603
|
+
}, z.core.$strip>;
|
|
604
|
+
};
|
|
605
|
+
}>, Record<never, never>>;
|
|
606
|
+
/**
|
|
607
|
+
* Every period for one asset, newest first — "who had this laptop before me".
|
|
608
|
+
*
|
|
609
|
+
* An array rather than a page, like HR's `employment.history`: the rows are bounded by how many
|
|
610
|
+
* times one item changed hands, which is tens over its life. `limit` caps it rather than
|
|
611
|
+
* paging, so the answer is never unbounded and the caller never has a cursor to keep.
|
|
612
|
+
*/
|
|
613
|
+
history: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
614
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
615
|
+
assetId: z.ZodUUID;
|
|
616
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
617
|
+
}, z.core.$strip>, z.ZodArray<z.ZodObject<{
|
|
618
|
+
id: z.ZodUUID;
|
|
619
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
620
|
+
assetId: z.ZodUUID;
|
|
621
|
+
userId: z.ZodUUID;
|
|
622
|
+
note: z.ZodNullable<z.ZodString>;
|
|
623
|
+
effectiveFrom: z.ZodString;
|
|
624
|
+
effectiveTo: z.ZodNullable<z.ZodString>;
|
|
625
|
+
createdBy: z.ZodNullable<z.ZodUUID>;
|
|
626
|
+
createdAt: z.ZodString;
|
|
627
|
+
}, z.core.$strip>>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
628
|
+
BAD_REQUEST: {
|
|
629
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
630
|
+
};
|
|
631
|
+
UNAUTHORIZED: {};
|
|
632
|
+
FORBIDDEN: {
|
|
633
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
634
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
635
|
+
}, z.core.$strip>>;
|
|
636
|
+
};
|
|
637
|
+
NOT_FOUND: {};
|
|
638
|
+
CONFLICT: {
|
|
639
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
640
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
641
|
+
}, z.core.$strip>>;
|
|
642
|
+
};
|
|
643
|
+
RATE_LIMITED: {};
|
|
644
|
+
MODULE_DISABLED: {
|
|
645
|
+
data: z.ZodObject<{
|
|
646
|
+
module: z.ZodString;
|
|
647
|
+
}, z.core.$strip>;
|
|
648
|
+
};
|
|
649
|
+
}>, Record<never, never>>;
|
|
650
|
+
/**
|
|
651
|
+
* What one person is holding right now.
|
|
652
|
+
*
|
|
653
|
+
* Answered from `assets.custodian_user_id` — denormalised inside the same transaction that
|
|
654
|
+
* writes the period, and indexed — rather than from an open-period join, so the offboarding
|
|
655
|
+
* question ("what does Ada still have?") is one indexed read.
|
|
656
|
+
*/
|
|
657
|
+
byUser: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
658
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
659
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
660
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
661
|
+
userId: z.ZodUUID;
|
|
662
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
663
|
+
items: z.ZodArray<z.ZodObject<{
|
|
664
|
+
id: z.ZodUUID;
|
|
665
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
666
|
+
code: z.ZodString;
|
|
667
|
+
name: z.ZodString;
|
|
668
|
+
description: z.ZodString;
|
|
669
|
+
categoryId: z.ZodNullable<z.ZodUUID>;
|
|
670
|
+
status: z.ZodEnum<{
|
|
671
|
+
in_stock: "in_stock";
|
|
672
|
+
assigned: "assigned";
|
|
673
|
+
reserved: "reserved";
|
|
674
|
+
under_repair: "under_repair";
|
|
675
|
+
lost: "lost";
|
|
676
|
+
retired: "retired";
|
|
677
|
+
}>;
|
|
678
|
+
custodianUserId: z.ZodNullable<z.ZodUUID>;
|
|
679
|
+
custodySince: z.ZodNullable<z.ZodString>;
|
|
680
|
+
serialNumber: z.ZodNullable<z.ZodString>;
|
|
681
|
+
location: z.ZodNullable<z.ZodString>;
|
|
682
|
+
purchasedOn: z.ZodNullable<z.ZodString>;
|
|
683
|
+
purchasedFrom: z.ZodNullable<z.ZodString>;
|
|
684
|
+
priceMinor: z.ZodNullable<z.ZodNumber>;
|
|
685
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
686
|
+
warrantyUntil: z.ZodNullable<z.ZodString>;
|
|
687
|
+
photoFileId: z.ZodNullable<z.ZodUUID>;
|
|
688
|
+
custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
689
|
+
createdAt: z.ZodString;
|
|
690
|
+
updatedAt: z.ZodString;
|
|
691
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
692
|
+
}, z.core.$strip>>;
|
|
693
|
+
nextCursor: z.ZodNullable<z.ZodString>;
|
|
694
|
+
total: z.ZodOptional<z.ZodNumber>;
|
|
695
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
696
|
+
BAD_REQUEST: {
|
|
697
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
698
|
+
};
|
|
699
|
+
UNAUTHORIZED: {};
|
|
700
|
+
FORBIDDEN: {
|
|
701
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
702
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
703
|
+
}, z.core.$strip>>;
|
|
704
|
+
};
|
|
705
|
+
NOT_FOUND: {};
|
|
706
|
+
CONFLICT: {
|
|
707
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
708
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
709
|
+
}, z.core.$strip>>;
|
|
710
|
+
};
|
|
711
|
+
RATE_LIMITED: {};
|
|
712
|
+
MODULE_DISABLED: {
|
|
713
|
+
data: z.ZodObject<{
|
|
714
|
+
module: z.ZodString;
|
|
715
|
+
}, z.core.$strip>;
|
|
716
|
+
};
|
|
717
|
+
}>, Record<never, never>>;
|
|
718
|
+
};
|
|
719
|
+
/**
|
|
720
|
+
* How a workspace groups what it owns.
|
|
721
|
+
*
|
|
722
|
+
* Not paged: a workspace has tens of categories, and every one of them has to be in the picker
|
|
723
|
+
* anyway. A cursor here would be a page boundary in a dropdown.
|
|
724
|
+
*/
|
|
725
|
+
categories: {
|
|
726
|
+
list: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
727
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
728
|
+
archived: z.ZodDefault<z.ZodBoolean>;
|
|
729
|
+
}, z.core.$strip>, z.ZodArray<z.ZodObject<{
|
|
730
|
+
id: z.ZodUUID;
|
|
731
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
732
|
+
name: z.ZodString;
|
|
733
|
+
order: z.ZodNumber;
|
|
734
|
+
createdAt: z.ZodString;
|
|
735
|
+
updatedAt: z.ZodString;
|
|
736
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
737
|
+
}, z.core.$strip>>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
738
|
+
BAD_REQUEST: {
|
|
739
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
740
|
+
};
|
|
741
|
+
UNAUTHORIZED: {};
|
|
742
|
+
FORBIDDEN: {
|
|
743
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
744
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
745
|
+
}, z.core.$strip>>;
|
|
746
|
+
};
|
|
747
|
+
NOT_FOUND: {};
|
|
748
|
+
CONFLICT: {
|
|
749
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
750
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
751
|
+
}, z.core.$strip>>;
|
|
752
|
+
};
|
|
753
|
+
RATE_LIMITED: {};
|
|
754
|
+
MODULE_DISABLED: {
|
|
755
|
+
data: z.ZodObject<{
|
|
756
|
+
module: z.ZodString;
|
|
757
|
+
}, z.core.$strip>;
|
|
758
|
+
};
|
|
759
|
+
}>, Record<never, never>>;
|
|
760
|
+
create: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
761
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
762
|
+
name: z.ZodString;
|
|
763
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
764
|
+
id: z.ZodUUID;
|
|
765
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
766
|
+
name: z.ZodString;
|
|
767
|
+
order: z.ZodNumber;
|
|
768
|
+
createdAt: z.ZodString;
|
|
769
|
+
updatedAt: z.ZodString;
|
|
770
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
771
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
772
|
+
BAD_REQUEST: {
|
|
773
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
774
|
+
};
|
|
775
|
+
UNAUTHORIZED: {};
|
|
776
|
+
FORBIDDEN: {
|
|
777
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
778
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
779
|
+
}, z.core.$strip>>;
|
|
780
|
+
};
|
|
781
|
+
NOT_FOUND: {};
|
|
782
|
+
CONFLICT: {
|
|
783
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
784
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
785
|
+
}, z.core.$strip>>;
|
|
786
|
+
};
|
|
787
|
+
RATE_LIMITED: {};
|
|
788
|
+
MODULE_DISABLED: {
|
|
789
|
+
data: z.ZodObject<{
|
|
790
|
+
module: z.ZodString;
|
|
791
|
+
}, z.core.$strip>;
|
|
792
|
+
};
|
|
793
|
+
}>, Record<never, never>>;
|
|
794
|
+
update: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
795
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
796
|
+
name: z.ZodOptional<z.ZodString>;
|
|
797
|
+
categoryId: z.ZodUUID;
|
|
798
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
799
|
+
id: z.ZodUUID;
|
|
800
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
801
|
+
name: z.ZodString;
|
|
802
|
+
order: z.ZodNumber;
|
|
803
|
+
createdAt: z.ZodString;
|
|
804
|
+
updatedAt: z.ZodString;
|
|
805
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
806
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
807
|
+
BAD_REQUEST: {
|
|
808
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
809
|
+
};
|
|
810
|
+
UNAUTHORIZED: {};
|
|
811
|
+
FORBIDDEN: {
|
|
812
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
813
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
814
|
+
}, z.core.$strip>>;
|
|
815
|
+
};
|
|
816
|
+
NOT_FOUND: {};
|
|
817
|
+
CONFLICT: {
|
|
818
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
819
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
820
|
+
}, z.core.$strip>>;
|
|
821
|
+
};
|
|
822
|
+
RATE_LIMITED: {};
|
|
823
|
+
MODULE_DISABLED: {
|
|
824
|
+
data: z.ZodObject<{
|
|
825
|
+
module: z.ZodString;
|
|
826
|
+
}, z.core.$strip>;
|
|
827
|
+
};
|
|
828
|
+
}>, Record<never, never>>;
|
|
829
|
+
/**
|
|
830
|
+
* Archive, not delete — and the same procedure restores.
|
|
831
|
+
*
|
|
832
|
+
* `assets.category_id` carries no foreign key, so a delete would leave every asset filed under
|
|
833
|
+
* it pointing at nothing: a blank column, and a timeline entry that recorded the move losing
|
|
834
|
+
* the name it recorded. Archiving is reversible and destroys nothing.
|
|
835
|
+
*/
|
|
836
|
+
archive: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
837
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
838
|
+
categoryId: z.ZodUUID;
|
|
839
|
+
archived: z.ZodDefault<z.ZodBoolean>;
|
|
840
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
841
|
+
id: z.ZodUUID;
|
|
842
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
843
|
+
name: z.ZodString;
|
|
844
|
+
order: z.ZodNumber;
|
|
845
|
+
createdAt: z.ZodString;
|
|
846
|
+
updatedAt: z.ZodString;
|
|
847
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
848
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
849
|
+
BAD_REQUEST: {
|
|
850
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
851
|
+
};
|
|
852
|
+
UNAUTHORIZED: {};
|
|
853
|
+
FORBIDDEN: {
|
|
854
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
855
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
856
|
+
}, z.core.$strip>>;
|
|
857
|
+
};
|
|
858
|
+
NOT_FOUND: {};
|
|
859
|
+
CONFLICT: {
|
|
860
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
861
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
862
|
+
}, z.core.$strip>>;
|
|
863
|
+
};
|
|
864
|
+
RATE_LIMITED: {};
|
|
865
|
+
MODULE_DISABLED: {
|
|
866
|
+
data: z.ZodObject<{
|
|
867
|
+
module: z.ZodString;
|
|
868
|
+
}, z.core.$strip>;
|
|
869
|
+
};
|
|
870
|
+
}>, Record<never, never>>;
|
|
871
|
+
/**
|
|
872
|
+
* The whole sequence, in the order somebody put it in — the only thing that writes `order`.
|
|
873
|
+
*
|
|
874
|
+
* **The ids, not positions.** A position number is a database column with a form around it: two
|
|
875
|
+
* categories can hold the same one, nobody thinks about their filing as integers, and the screen
|
|
876
|
+
* that asked for one had to explain how ties break. A list of ids says exactly what the person
|
|
877
|
+
* did, whatever they did it with — a drag, or the move-up and move-down buttons beside it.
|
|
878
|
+
*
|
|
879
|
+
* **It must name every live category the workspace has, exactly once.** A partial list is not
|
|
880
|
+
* treated as "leave the rest alone": somebody added a category in another tab while this page
|
|
881
|
+
* was open, and the ordering in hand no longer describes the workspace. Renumbering what it does
|
|
882
|
+
* name would drop the new one somewhere nobody chose, silently — so the whole call is refused
|
|
883
|
+
* with `inventory.category.order_stale` and the page reloads and asks again. Naming an archived
|
|
884
|
+
* category is the same mistake from the other side and gets the same answer; an id from another
|
|
885
|
+
* workspace is `NOT_FOUND`, exactly as `update` and `archive` answer for one.
|
|
886
|
+
*
|
|
887
|
+
* Answers the live sequence as it now stands, so a caller needs no second read.
|
|
888
|
+
*
|
|
889
|
+
* **The bound is `MAX_LIVE_CATEGORIES`, and it is the same number `create` refuses at.** A bound
|
|
890
|
+
* on this array with nothing enforcing it elsewhere is a silent ceiling: a workspace could grow
|
|
891
|
+
* past it one category at a time and then find that the only procedure that can order them is
|
|
892
|
+
* the one it can no longer call. Held to the same number at the point of creation, the array can
|
|
893
|
+
* always name every live category a workspace is allowed to have.
|
|
894
|
+
*/
|
|
895
|
+
reorder: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
896
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
897
|
+
categoryIds: z.ZodArray<z.ZodUUID>;
|
|
898
|
+
}, z.core.$strip>, z.ZodArray<z.ZodObject<{
|
|
899
|
+
id: z.ZodUUID;
|
|
900
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
901
|
+
name: z.ZodString;
|
|
902
|
+
order: z.ZodNumber;
|
|
903
|
+
createdAt: z.ZodString;
|
|
904
|
+
updatedAt: z.ZodString;
|
|
905
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
906
|
+
}, z.core.$strip>>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
907
|
+
BAD_REQUEST: {
|
|
908
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
909
|
+
};
|
|
910
|
+
UNAUTHORIZED: {};
|
|
911
|
+
FORBIDDEN: {
|
|
912
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
913
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
914
|
+
}, z.core.$strip>>;
|
|
915
|
+
};
|
|
916
|
+
NOT_FOUND: {};
|
|
917
|
+
CONFLICT: {
|
|
918
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
919
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
920
|
+
}, z.core.$strip>>;
|
|
921
|
+
};
|
|
922
|
+
RATE_LIMITED: {};
|
|
923
|
+
MODULE_DISABLED: {
|
|
924
|
+
data: z.ZodObject<{
|
|
925
|
+
module: z.ZodString;
|
|
926
|
+
}, z.core.$strip>;
|
|
927
|
+
};
|
|
928
|
+
}>, Record<never, never>>;
|
|
929
|
+
};
|
|
930
|
+
/**
|
|
931
|
+
* What went away to be fixed.
|
|
932
|
+
*
|
|
933
|
+
* **Behind the `repairs` capability**, which is this module's first switchable one — so every
|
|
934
|
+
* procedure here answers **404** rather than 403 in a workspace that has it off. 403 would say
|
|
935
|
+
* "this exists and you may not have it", which is false for a company that does not record
|
|
936
|
+
* repairs, and it would contradict a panel that has already hidden the tab.
|
|
937
|
+
*
|
|
938
|
+
* Writing takes `inventory.repair.manage`; reading rides `inventory.asset.view`, for the reason
|
|
939
|
+
* custody does — "where is the projector" is the question the register exists to answer.
|
|
940
|
+
*/
|
|
941
|
+
repairs: {
|
|
942
|
+
/**
|
|
943
|
+
* One asset's repairs, or the whole workspace's — the same procedure, because they are the same
|
|
944
|
+
* query with one filter and a second one would be a second thing to keep in step.
|
|
945
|
+
*
|
|
946
|
+
* `open: true` is the "what is away right now" question a dashboard card asks, and it is a
|
|
947
|
+
* filter rather than a procedure of its own for the same reason.
|
|
948
|
+
*
|
|
949
|
+
* Paged, unlike `custody.history`: one asset's repairs are bounded by how often it breaks, but
|
|
950
|
+
* a workspace's are not. Ordered newest-logged first, by row id — a uuidv7 already carries the
|
|
951
|
+
* clock and is unique, where `sent_on` is a date two repairs logged the same day share.
|
|
952
|
+
*/
|
|
953
|
+
list: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
954
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
955
|
+
assetId: z.ZodOptional<z.ZodUUID>;
|
|
956
|
+
open: z.ZodOptional<z.ZodBoolean>;
|
|
957
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
958
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
959
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
960
|
+
items: z.ZodArray<z.ZodObject<{
|
|
961
|
+
id: z.ZodUUID;
|
|
962
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
963
|
+
assetId: z.ZodUUID;
|
|
964
|
+
summary: z.ZodString;
|
|
965
|
+
detail: z.ZodNullable<z.ZodString>;
|
|
966
|
+
vendor: z.ZodNullable<z.ZodString>;
|
|
967
|
+
costMinor: z.ZodNullable<z.ZodNumber>;
|
|
968
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
969
|
+
sentOn: z.ZodString;
|
|
970
|
+
returnedOn: z.ZodNullable<z.ZodString>;
|
|
971
|
+
createdBy: z.ZodNullable<z.ZodUUID>;
|
|
972
|
+
createdAt: z.ZodString;
|
|
973
|
+
updatedAt: z.ZodString;
|
|
974
|
+
assetCode: z.ZodString;
|
|
975
|
+
assetName: z.ZodString;
|
|
976
|
+
}, z.core.$strip>>;
|
|
977
|
+
nextCursor: z.ZodNullable<z.ZodString>;
|
|
978
|
+
total: z.ZodOptional<z.ZodNumber>;
|
|
979
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
980
|
+
BAD_REQUEST: {
|
|
981
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
982
|
+
};
|
|
983
|
+
UNAUTHORIZED: {};
|
|
984
|
+
FORBIDDEN: {
|
|
985
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
986
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
987
|
+
}, z.core.$strip>>;
|
|
988
|
+
};
|
|
989
|
+
NOT_FOUND: {};
|
|
990
|
+
CONFLICT: {
|
|
991
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
992
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
993
|
+
}, z.core.$strip>>;
|
|
994
|
+
};
|
|
995
|
+
RATE_LIMITED: {};
|
|
996
|
+
MODULE_DISABLED: {
|
|
997
|
+
data: z.ZodObject<{
|
|
998
|
+
module: z.ZodString;
|
|
999
|
+
}, z.core.$strip>;
|
|
1000
|
+
};
|
|
1001
|
+
}>, Record<never, never>>;
|
|
1002
|
+
/**
|
|
1003
|
+
* Send it away. Refuses when the item is already at a repairer — one open repair per asset, and
|
|
1004
|
+
* `inventory_repairs_one_open_uq` is what makes that true in the database rather than merely
|
|
1005
|
+
* likely in the service.
|
|
1006
|
+
*
|
|
1007
|
+
* `sentOn` is optional and defaults to today **on the server**: a browser clock is not a fact
|
|
1008
|
+
* this module is willing to record, and the same reasoning already keeps asset tags server-side.
|
|
1009
|
+
*/
|
|
1010
|
+
create: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
1011
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1012
|
+
summary: z.ZodString;
|
|
1013
|
+
detail: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
1014
|
+
vendor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
1015
|
+
costMinor: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
1016
|
+
currency: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
1017
|
+
sentOn: z.ZodOptional<z.ZodISODate>;
|
|
1018
|
+
assetId: z.ZodUUID;
|
|
1019
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
1020
|
+
repair: z.ZodObject<{
|
|
1021
|
+
id: z.ZodUUID;
|
|
1022
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1023
|
+
assetId: z.ZodUUID;
|
|
1024
|
+
summary: z.ZodString;
|
|
1025
|
+
detail: z.ZodNullable<z.ZodString>;
|
|
1026
|
+
vendor: z.ZodNullable<z.ZodString>;
|
|
1027
|
+
costMinor: z.ZodNullable<z.ZodNumber>;
|
|
1028
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
1029
|
+
sentOn: z.ZodString;
|
|
1030
|
+
returnedOn: z.ZodNullable<z.ZodString>;
|
|
1031
|
+
createdBy: z.ZodNullable<z.ZodUUID>;
|
|
1032
|
+
createdAt: z.ZodString;
|
|
1033
|
+
updatedAt: z.ZodString;
|
|
1034
|
+
}, z.core.$strip>;
|
|
1035
|
+
asset: z.ZodObject<{
|
|
1036
|
+
id: z.ZodUUID;
|
|
1037
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1038
|
+
code: z.ZodString;
|
|
1039
|
+
name: z.ZodString;
|
|
1040
|
+
description: z.ZodString;
|
|
1041
|
+
categoryId: z.ZodNullable<z.ZodUUID>;
|
|
1042
|
+
status: z.ZodEnum<{
|
|
1043
|
+
in_stock: "in_stock";
|
|
1044
|
+
assigned: "assigned";
|
|
1045
|
+
reserved: "reserved";
|
|
1046
|
+
under_repair: "under_repair";
|
|
1047
|
+
lost: "lost";
|
|
1048
|
+
retired: "retired";
|
|
1049
|
+
}>;
|
|
1050
|
+
custodianUserId: z.ZodNullable<z.ZodUUID>;
|
|
1051
|
+
custodySince: z.ZodNullable<z.ZodString>;
|
|
1052
|
+
serialNumber: z.ZodNullable<z.ZodString>;
|
|
1053
|
+
location: z.ZodNullable<z.ZodString>;
|
|
1054
|
+
purchasedOn: z.ZodNullable<z.ZodString>;
|
|
1055
|
+
purchasedFrom: z.ZodNullable<z.ZodString>;
|
|
1056
|
+
priceMinor: z.ZodNullable<z.ZodNumber>;
|
|
1057
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
1058
|
+
warrantyUntil: z.ZodNullable<z.ZodString>;
|
|
1059
|
+
photoFileId: z.ZodNullable<z.ZodUUID>;
|
|
1060
|
+
custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
1061
|
+
createdAt: z.ZodString;
|
|
1062
|
+
updatedAt: z.ZodString;
|
|
1063
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
1064
|
+
}, z.core.$strip>;
|
|
1065
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
1066
|
+
BAD_REQUEST: {
|
|
1067
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
1068
|
+
};
|
|
1069
|
+
UNAUTHORIZED: {};
|
|
1070
|
+
FORBIDDEN: {
|
|
1071
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1072
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
1073
|
+
}, z.core.$strip>>;
|
|
1074
|
+
};
|
|
1075
|
+
NOT_FOUND: {};
|
|
1076
|
+
CONFLICT: {
|
|
1077
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1078
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
1079
|
+
}, z.core.$strip>>;
|
|
1080
|
+
};
|
|
1081
|
+
RATE_LIMITED: {};
|
|
1082
|
+
MODULE_DISABLED: {
|
|
1083
|
+
data: z.ZodObject<{
|
|
1084
|
+
module: z.ZodString;
|
|
1085
|
+
}, z.core.$strip>;
|
|
1086
|
+
};
|
|
1087
|
+
}>, Record<never, never>>;
|
|
1088
|
+
/**
|
|
1089
|
+
* Correct what was recorded — a vendor, a cost that arrived with the invoice a week later.
|
|
1090
|
+
*
|
|
1091
|
+
* Deliberately cannot set `returnedOn`: that one column decides whether the asset reads as
|
|
1092
|
+
* `under_repair`, so exactly one procedure moves it and the derived status has one door rather
|
|
1093
|
+
* than two.
|
|
1094
|
+
*/
|
|
1095
|
+
update: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
1096
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1097
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
1098
|
+
detail: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
|
|
1099
|
+
vendor: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
|
|
1100
|
+
costMinor: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodNumber>>>;
|
|
1101
|
+
currency: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
|
|
1102
|
+
sentOn: z.ZodOptional<z.ZodOptional<z.ZodISODate>>;
|
|
1103
|
+
repairId: z.ZodUUID;
|
|
1104
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
1105
|
+
repair: z.ZodObject<{
|
|
1106
|
+
id: z.ZodUUID;
|
|
1107
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1108
|
+
assetId: z.ZodUUID;
|
|
1109
|
+
summary: z.ZodString;
|
|
1110
|
+
detail: z.ZodNullable<z.ZodString>;
|
|
1111
|
+
vendor: z.ZodNullable<z.ZodString>;
|
|
1112
|
+
costMinor: z.ZodNullable<z.ZodNumber>;
|
|
1113
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
1114
|
+
sentOn: z.ZodString;
|
|
1115
|
+
returnedOn: z.ZodNullable<z.ZodString>;
|
|
1116
|
+
createdBy: z.ZodNullable<z.ZodUUID>;
|
|
1117
|
+
createdAt: z.ZodString;
|
|
1118
|
+
updatedAt: z.ZodString;
|
|
1119
|
+
}, z.core.$strip>;
|
|
1120
|
+
asset: z.ZodObject<{
|
|
1121
|
+
id: z.ZodUUID;
|
|
1122
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1123
|
+
code: z.ZodString;
|
|
1124
|
+
name: z.ZodString;
|
|
1125
|
+
description: z.ZodString;
|
|
1126
|
+
categoryId: z.ZodNullable<z.ZodUUID>;
|
|
1127
|
+
status: z.ZodEnum<{
|
|
1128
|
+
in_stock: "in_stock";
|
|
1129
|
+
assigned: "assigned";
|
|
1130
|
+
reserved: "reserved";
|
|
1131
|
+
under_repair: "under_repair";
|
|
1132
|
+
lost: "lost";
|
|
1133
|
+
retired: "retired";
|
|
1134
|
+
}>;
|
|
1135
|
+
custodianUserId: z.ZodNullable<z.ZodUUID>;
|
|
1136
|
+
custodySince: z.ZodNullable<z.ZodString>;
|
|
1137
|
+
serialNumber: z.ZodNullable<z.ZodString>;
|
|
1138
|
+
location: z.ZodNullable<z.ZodString>;
|
|
1139
|
+
purchasedOn: z.ZodNullable<z.ZodString>;
|
|
1140
|
+
purchasedFrom: z.ZodNullable<z.ZodString>;
|
|
1141
|
+
priceMinor: z.ZodNullable<z.ZodNumber>;
|
|
1142
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
1143
|
+
warrantyUntil: z.ZodNullable<z.ZodString>;
|
|
1144
|
+
photoFileId: z.ZodNullable<z.ZodUUID>;
|
|
1145
|
+
custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
1146
|
+
createdAt: z.ZodString;
|
|
1147
|
+
updatedAt: z.ZodString;
|
|
1148
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
1149
|
+
}, z.core.$strip>;
|
|
1150
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
1151
|
+
BAD_REQUEST: {
|
|
1152
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
1153
|
+
};
|
|
1154
|
+
UNAUTHORIZED: {};
|
|
1155
|
+
FORBIDDEN: {
|
|
1156
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1157
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
1158
|
+
}, z.core.$strip>>;
|
|
1159
|
+
};
|
|
1160
|
+
NOT_FOUND: {};
|
|
1161
|
+
CONFLICT: {
|
|
1162
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1163
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
1164
|
+
}, z.core.$strip>>;
|
|
1165
|
+
};
|
|
1166
|
+
RATE_LIMITED: {};
|
|
1167
|
+
MODULE_DISABLED: {
|
|
1168
|
+
data: z.ZodObject<{
|
|
1169
|
+
module: z.ZodString;
|
|
1170
|
+
}, z.core.$strip>;
|
|
1171
|
+
};
|
|
1172
|
+
}>, Record<never, never>>;
|
|
1173
|
+
/**
|
|
1174
|
+
* It came back. Closes the repair and puts the asset back to `assigned` if somebody still holds
|
|
1175
|
+
* it, or `in_stock` if nobody does — never blindly to `in_stock`, which would quietly release
|
|
1176
|
+
* whoever is answerable for it.
|
|
1177
|
+
*
|
|
1178
|
+
* Takes the cost, because that is when the invoice usually arrives.
|
|
1179
|
+
*/
|
|
1180
|
+
complete: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
1181
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1182
|
+
repairId: z.ZodUUID;
|
|
1183
|
+
returnedOn: z.ZodOptional<z.ZodISODate>;
|
|
1184
|
+
costMinor: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
1185
|
+
currency: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
1186
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
1187
|
+
repair: z.ZodObject<{
|
|
1188
|
+
id: z.ZodUUID;
|
|
1189
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1190
|
+
assetId: z.ZodUUID;
|
|
1191
|
+
summary: z.ZodString;
|
|
1192
|
+
detail: z.ZodNullable<z.ZodString>;
|
|
1193
|
+
vendor: z.ZodNullable<z.ZodString>;
|
|
1194
|
+
costMinor: z.ZodNullable<z.ZodNumber>;
|
|
1195
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
1196
|
+
sentOn: z.ZodString;
|
|
1197
|
+
returnedOn: z.ZodNullable<z.ZodString>;
|
|
1198
|
+
createdBy: z.ZodNullable<z.ZodUUID>;
|
|
1199
|
+
createdAt: z.ZodString;
|
|
1200
|
+
updatedAt: z.ZodString;
|
|
1201
|
+
}, z.core.$strip>;
|
|
1202
|
+
asset: z.ZodObject<{
|
|
1203
|
+
id: z.ZodUUID;
|
|
1204
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1205
|
+
code: z.ZodString;
|
|
1206
|
+
name: z.ZodString;
|
|
1207
|
+
description: z.ZodString;
|
|
1208
|
+
categoryId: z.ZodNullable<z.ZodUUID>;
|
|
1209
|
+
status: z.ZodEnum<{
|
|
1210
|
+
in_stock: "in_stock";
|
|
1211
|
+
assigned: "assigned";
|
|
1212
|
+
reserved: "reserved";
|
|
1213
|
+
under_repair: "under_repair";
|
|
1214
|
+
lost: "lost";
|
|
1215
|
+
retired: "retired";
|
|
1216
|
+
}>;
|
|
1217
|
+
custodianUserId: z.ZodNullable<z.ZodUUID>;
|
|
1218
|
+
custodySince: z.ZodNullable<z.ZodString>;
|
|
1219
|
+
serialNumber: z.ZodNullable<z.ZodString>;
|
|
1220
|
+
location: z.ZodNullable<z.ZodString>;
|
|
1221
|
+
purchasedOn: z.ZodNullable<z.ZodString>;
|
|
1222
|
+
purchasedFrom: z.ZodNullable<z.ZodString>;
|
|
1223
|
+
priceMinor: z.ZodNullable<z.ZodNumber>;
|
|
1224
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
1225
|
+
warrantyUntil: z.ZodNullable<z.ZodString>;
|
|
1226
|
+
photoFileId: z.ZodNullable<z.ZodUUID>;
|
|
1227
|
+
custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
1228
|
+
createdAt: z.ZodString;
|
|
1229
|
+
updatedAt: z.ZodString;
|
|
1230
|
+
archivedAt: z.ZodNullable<z.ZodString>;
|
|
1231
|
+
}, z.core.$strip>;
|
|
1232
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
1233
|
+
BAD_REQUEST: {
|
|
1234
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
1235
|
+
};
|
|
1236
|
+
UNAUTHORIZED: {};
|
|
1237
|
+
FORBIDDEN: {
|
|
1238
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1239
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
1240
|
+
}, z.core.$strip>>;
|
|
1241
|
+
};
|
|
1242
|
+
NOT_FOUND: {};
|
|
1243
|
+
CONFLICT: {
|
|
1244
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1245
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
1246
|
+
}, z.core.$strip>>;
|
|
1247
|
+
};
|
|
1248
|
+
RATE_LIMITED: {};
|
|
1249
|
+
MODULE_DISABLED: {
|
|
1250
|
+
data: z.ZodObject<{
|
|
1251
|
+
module: z.ZodString;
|
|
1252
|
+
}, z.core.$strip>;
|
|
1253
|
+
};
|
|
1254
|
+
}>, Record<never, never>>;
|
|
1255
|
+
};
|
|
1256
|
+
/**
|
|
1257
|
+
* Receipts, warranties, manuals — and the asset's photo, which is an `Asset` field rather than one
|
|
1258
|
+
* of these.
|
|
1259
|
+
*
|
|
1260
|
+
* **Behind the `attachments` capability**, so these answer 404 in a workspace that has it off.
|
|
1261
|
+
*
|
|
1262
|
+
* **A module does not upload.** The browser sends the bytes to core's file service and hands this
|
|
1263
|
+
* module the id core gave it; `add` records that this asset has that file. Nothing here streams,
|
|
1264
|
+
* signs or stores anything, and `remove` detaches rather than deleting core's file — the same
|
|
1265
|
+
* bytes may be attached elsewhere, and a module has no standing to destroy another module's row.
|
|
1266
|
+
*/
|
|
1267
|
+
attachments: {
|
|
1268
|
+
/**
|
|
1269
|
+
* Every file on one asset, its repairs' included, each carrying its own `repairId`.
|
|
1270
|
+
*
|
|
1271
|
+
* Not paged and not filtered by repair: one asset's files are bounded and entirely loaded, so
|
|
1272
|
+
* the panel groups them in the browser. That is the one case where filtering client-side is
|
|
1273
|
+
* right, and it is the opposite of what `assets.list` may do.
|
|
1274
|
+
*/
|
|
1275
|
+
list: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
1276
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1277
|
+
assetId: z.ZodUUID;
|
|
1278
|
+
}, z.core.$strip>, z.ZodArray<z.ZodObject<{
|
|
1279
|
+
id: z.ZodUUID;
|
|
1280
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1281
|
+
assetId: z.ZodUUID;
|
|
1282
|
+
repairId: z.ZodNullable<z.ZodUUID>;
|
|
1283
|
+
fileId: z.ZodUUID;
|
|
1284
|
+
name: z.ZodString;
|
|
1285
|
+
mimeType: z.ZodNullable<z.ZodString>;
|
|
1286
|
+
size: z.ZodNullable<z.ZodNumber>;
|
|
1287
|
+
uploadedBy: z.ZodNullable<z.ZodUUID>;
|
|
1288
|
+
createdAt: z.ZodString;
|
|
1289
|
+
}, z.core.$strip>>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
1290
|
+
BAD_REQUEST: {
|
|
1291
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
1292
|
+
};
|
|
1293
|
+
UNAUTHORIZED: {};
|
|
1294
|
+
FORBIDDEN: {
|
|
1295
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1296
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
1297
|
+
}, z.core.$strip>>;
|
|
1298
|
+
};
|
|
1299
|
+
NOT_FOUND: {};
|
|
1300
|
+
CONFLICT: {
|
|
1301
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1302
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
1303
|
+
}, z.core.$strip>>;
|
|
1304
|
+
};
|
|
1305
|
+
RATE_LIMITED: {};
|
|
1306
|
+
MODULE_DISABLED: {
|
|
1307
|
+
data: z.ZodObject<{
|
|
1308
|
+
module: z.ZodString;
|
|
1309
|
+
}, z.core.$strip>;
|
|
1310
|
+
};
|
|
1311
|
+
}>, Record<never, never>>;
|
|
1312
|
+
/** Attach files core already holds. `repairId` files them under one repair instead of the asset. */
|
|
1313
|
+
add: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
1314
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1315
|
+
assetId: z.ZodUUID;
|
|
1316
|
+
fileIds: z.ZodArray<z.ZodUUID>;
|
|
1317
|
+
repairId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
|
|
1318
|
+
}, z.core.$strip>, z.ZodArray<z.ZodObject<{
|
|
1319
|
+
id: z.ZodUUID;
|
|
1320
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1321
|
+
assetId: z.ZodUUID;
|
|
1322
|
+
repairId: z.ZodNullable<z.ZodUUID>;
|
|
1323
|
+
fileId: z.ZodUUID;
|
|
1324
|
+
name: z.ZodString;
|
|
1325
|
+
mimeType: z.ZodNullable<z.ZodString>;
|
|
1326
|
+
size: z.ZodNullable<z.ZodNumber>;
|
|
1327
|
+
uploadedBy: z.ZodNullable<z.ZodUUID>;
|
|
1328
|
+
createdAt: z.ZodString;
|
|
1329
|
+
}, z.core.$strip>>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
1330
|
+
BAD_REQUEST: {
|
|
1331
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
1332
|
+
};
|
|
1333
|
+
UNAUTHORIZED: {};
|
|
1334
|
+
FORBIDDEN: {
|
|
1335
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1336
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
1337
|
+
}, z.core.$strip>>;
|
|
1338
|
+
};
|
|
1339
|
+
NOT_FOUND: {};
|
|
1340
|
+
CONFLICT: {
|
|
1341
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1342
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
1343
|
+
}, z.core.$strip>>;
|
|
1344
|
+
};
|
|
1345
|
+
RATE_LIMITED: {};
|
|
1346
|
+
MODULE_DISABLED: {
|
|
1347
|
+
data: z.ZodObject<{
|
|
1348
|
+
module: z.ZodString;
|
|
1349
|
+
}, z.core.$strip>;
|
|
1350
|
+
};
|
|
1351
|
+
}>, Record<never, never>>;
|
|
1352
|
+
/** Answers with the id it detached, so a client can drop exactly that row without re-reading. */
|
|
1353
|
+
remove: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
1354
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1355
|
+
attachmentId: z.ZodUUID;
|
|
1356
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
1357
|
+
id: z.ZodUUID;
|
|
1358
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
1359
|
+
BAD_REQUEST: {
|
|
1360
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
1361
|
+
};
|
|
1362
|
+
UNAUTHORIZED: {};
|
|
1363
|
+
FORBIDDEN: {
|
|
1364
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1365
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
1366
|
+
}, z.core.$strip>>;
|
|
1367
|
+
};
|
|
1368
|
+
NOT_FOUND: {};
|
|
1369
|
+
CONFLICT: {
|
|
1370
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1371
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
1372
|
+
}, z.core.$strip>>;
|
|
1373
|
+
};
|
|
1374
|
+
RATE_LIMITED: {};
|
|
1375
|
+
MODULE_DISABLED: {
|
|
1376
|
+
data: z.ZodObject<{
|
|
1377
|
+
module: z.ZodString;
|
|
1378
|
+
}, z.core.$strip>;
|
|
1379
|
+
};
|
|
1380
|
+
}>, Record<never, never>>;
|
|
1381
|
+
};
|
|
1382
|
+
/**
|
|
1383
|
+
* The register in numbers.
|
|
1384
|
+
*
|
|
1385
|
+
* One procedure rather than a `total` on `assets.list`, because they answer different questions:
|
|
1386
|
+
* a list's total describes the filter you asked for, and this describes the workspace. The assets
|
|
1387
|
+
* page needs both — "showing 50 of 214" is two numbers from two places.
|
|
1388
|
+
*
|
|
1389
|
+
* Not behind a capability: it counts assets, which is `core`. `outForRepair` comes back null
|
|
1390
|
+
* rather than 0 where `repairs` is off — see `InventoryStats`.
|
|
1391
|
+
*/
|
|
1392
|
+
stats: {
|
|
1393
|
+
summary: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
|
|
1394
|
+
workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
|
|
1395
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
1396
|
+
total: z.ZodNumber;
|
|
1397
|
+
archived: z.ZodNumber;
|
|
1398
|
+
byStatus: z.ZodRecord<z.ZodEnum<{
|
|
1399
|
+
in_stock: "in_stock";
|
|
1400
|
+
assigned: "assigned";
|
|
1401
|
+
reserved: "reserved";
|
|
1402
|
+
under_repair: "under_repair";
|
|
1403
|
+
lost: "lost";
|
|
1404
|
+
retired: "retired";
|
|
1405
|
+
}>, z.ZodNumber>;
|
|
1406
|
+
outForRepair: z.ZodNullable<z.ZodNumber>;
|
|
1407
|
+
unassigned: z.ZodNumber;
|
|
1408
|
+
}, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
|
|
1409
|
+
BAD_REQUEST: {
|
|
1410
|
+
data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
1411
|
+
};
|
|
1412
|
+
UNAUTHORIZED: {};
|
|
1413
|
+
FORBIDDEN: {
|
|
1414
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1415
|
+
permission: z.ZodOptional<z.ZodString>;
|
|
1416
|
+
}, z.core.$strip>>;
|
|
1417
|
+
};
|
|
1418
|
+
NOT_FOUND: {};
|
|
1419
|
+
CONFLICT: {
|
|
1420
|
+
data: z.ZodOptional<z.ZodObject<{
|
|
1421
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
1422
|
+
}, z.core.$strip>>;
|
|
1423
|
+
};
|
|
1424
|
+
RATE_LIMITED: {};
|
|
1425
|
+
MODULE_DISABLED: {
|
|
1426
|
+
data: z.ZodObject<{
|
|
1427
|
+
module: z.ZodString;
|
|
1428
|
+
}, z.core.$strip>;
|
|
1429
|
+
};
|
|
1430
|
+
}>, Record<never, never>>;
|
|
323
1431
|
};
|
|
324
1432
|
};
|
|
325
1433
|
export type InventoryContract = typeof inventoryContract;
|