@naisys/erp 3.0.0-beta.3
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.
Potentially problematic release.
This version of @naisys/erp might be problematic. Click here for more details.
- package/bin/naisys-erp +2 -0
- package/client-dist/android-chrome-192x192.png +0 -0
- package/client-dist/android-chrome-512x512.png +0 -0
- package/client-dist/apple-touch-icon.png +0 -0
- package/client-dist/assets/index-45dVo30p.css +1 -0
- package/client-dist/assets/index-Dffms7F_.js +168 -0
- package/client-dist/assets/naisys-logo-CzoPnn5I.webp +0 -0
- package/client-dist/favicon.ico +0 -0
- package/client-dist/index.html +42 -0
- package/client-dist/site.webmanifest +22 -0
- package/dist/api-reference.d.ts +10 -0
- package/dist/api-reference.js +101 -0
- package/dist/audit.d.ts +5 -0
- package/dist/audit.js +14 -0
- package/dist/auth-middleware.d.ts +18 -0
- package/dist/auth-middleware.js +203 -0
- package/dist/dbConfig.d.ts +5 -0
- package/dist/dbConfig.js +10 -0
- package/dist/erpDb.d.ts +10 -0
- package/dist/erpDb.js +34 -0
- package/dist/erpServer.d.ts +10 -0
- package/dist/erpServer.js +321 -0
- package/dist/error-handler.d.ts +7 -0
- package/dist/error-handler.js +17 -0
- package/dist/generated/prisma/client.d.ts +154 -0
- package/dist/generated/prisma/client.js +35 -0
- package/dist/generated/prisma/commonInputTypes.d.ts +637 -0
- package/dist/generated/prisma/commonInputTypes.js +11 -0
- package/dist/generated/prisma/enums.d.ts +59 -0
- package/dist/generated/prisma/enums.js +60 -0
- package/dist/generated/prisma/internal/class.d.ts +406 -0
- package/dist/generated/prisma/internal/class.js +50 -0
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +2722 -0
- package/dist/generated/prisma/internal/prismaNamespace.js +366 -0
- package/dist/generated/prisma/models/Attachment.d.ts +1455 -0
- package/dist/generated/prisma/models/Attachment.js +2 -0
- package/dist/generated/prisma/models/AuditLog.d.ts +1359 -0
- package/dist/generated/prisma/models/AuditLog.js +2 -0
- package/dist/generated/prisma/models/Field.d.ts +1880 -0
- package/dist/generated/prisma/models/Field.js +2 -0
- package/dist/generated/prisma/models/FieldAttachment.d.ts +1245 -0
- package/dist/generated/prisma/models/FieldAttachment.js +2 -0
- package/dist/generated/prisma/models/FieldRecord.d.ts +1625 -0
- package/dist/generated/prisma/models/FieldRecord.js +2 -0
- package/dist/generated/prisma/models/FieldSet.d.ts +1577 -0
- package/dist/generated/prisma/models/FieldSet.js +2 -0
- package/dist/generated/prisma/models/FieldValue.d.ts +1908 -0
- package/dist/generated/prisma/models/FieldValue.js +2 -0
- package/dist/generated/prisma/models/Item.d.ts +1858 -0
- package/dist/generated/prisma/models/Item.js +2 -0
- package/dist/generated/prisma/models/ItemInstance.d.ts +1987 -0
- package/dist/generated/prisma/models/ItemInstance.js +2 -0
- package/dist/generated/prisma/models/LaborTicket.d.ts +1867 -0
- package/dist/generated/prisma/models/LaborTicket.js +2 -0
- package/dist/generated/prisma/models/Operation.d.ts +2578 -0
- package/dist/generated/prisma/models/Operation.js +2 -0
- package/dist/generated/prisma/models/OperationDependency.d.ts +1434 -0
- package/dist/generated/prisma/models/OperationDependency.js +2 -0
- package/dist/generated/prisma/models/OperationFieldRef.d.ts +1539 -0
- package/dist/generated/prisma/models/OperationFieldRef.js +2 -0
- package/dist/generated/prisma/models/OperationRun.d.ts +2563 -0
- package/dist/generated/prisma/models/OperationRun.js +2 -0
- package/dist/generated/prisma/models/OperationRunComment.d.ts +1366 -0
- package/dist/generated/prisma/models/OperationRunComment.js +2 -0
- package/dist/generated/prisma/models/Order.d.ts +1931 -0
- package/dist/generated/prisma/models/Order.js +2 -0
- package/dist/generated/prisma/models/OrderRevision.d.ts +1962 -0
- package/dist/generated/prisma/models/OrderRevision.js +2 -0
- package/dist/generated/prisma/models/OrderRun.d.ts +2310 -0
- package/dist/generated/prisma/models/OrderRun.js +2 -0
- package/dist/generated/prisma/models/SchemaVersion.d.ts +985 -0
- package/dist/generated/prisma/models/SchemaVersion.js +2 -0
- package/dist/generated/prisma/models/Session.d.ts +1213 -0
- package/dist/generated/prisma/models/Session.js +2 -0
- package/dist/generated/prisma/models/Step.d.ts +2180 -0
- package/dist/generated/prisma/models/Step.js +2 -0
- package/dist/generated/prisma/models/StepRun.d.ts +1963 -0
- package/dist/generated/prisma/models/StepRun.js +2 -0
- package/dist/generated/prisma/models/User.d.ts +11819 -0
- package/dist/generated/prisma/models/User.js +2 -0
- package/dist/generated/prisma/models/UserPermission.d.ts +1348 -0
- package/dist/generated/prisma/models/UserPermission.js +2 -0
- package/dist/generated/prisma/models/WorkCenter.d.ts +1657 -0
- package/dist/generated/prisma/models/WorkCenter.js +2 -0
- package/dist/generated/prisma/models/WorkCenterUser.d.ts +1390 -0
- package/dist/generated/prisma/models/WorkCenterUser.js +2 -0
- package/dist/generated/prisma/models.d.ts +28 -0
- package/dist/generated/prisma/models.js +2 -0
- package/dist/hateoas.d.ts +7 -0
- package/dist/hateoas.js +61 -0
- package/dist/route-helpers.d.ts +318 -0
- package/dist/route-helpers.js +220 -0
- package/dist/routes/admin.d.ts +3 -0
- package/dist/routes/admin.js +147 -0
- package/dist/routes/audit.d.ts +3 -0
- package/dist/routes/audit.js +36 -0
- package/dist/routes/auth.d.ts +3 -0
- package/dist/routes/auth.js +112 -0
- package/dist/routes/dispatch.d.ts +3 -0
- package/dist/routes/dispatch.js +174 -0
- package/dist/routes/inventory.d.ts +3 -0
- package/dist/routes/inventory.js +70 -0
- package/dist/routes/item-fields.d.ts +3 -0
- package/dist/routes/item-fields.js +220 -0
- package/dist/routes/item-instances.d.ts +3 -0
- package/dist/routes/item-instances.js +426 -0
- package/dist/routes/items.d.ts +3 -0
- package/dist/routes/items.js +252 -0
- package/dist/routes/labor-tickets.d.ts +3 -0
- package/dist/routes/labor-tickets.js +268 -0
- package/dist/routes/operation-dependencies.d.ts +3 -0
- package/dist/routes/operation-dependencies.js +170 -0
- package/dist/routes/operation-field-refs.d.ts +3 -0
- package/dist/routes/operation-field-refs.js +263 -0
- package/dist/routes/operation-run-comments.d.ts +3 -0
- package/dist/routes/operation-run-comments.js +108 -0
- package/dist/routes/operation-run-transitions.d.ts +3 -0
- package/dist/routes/operation-run-transitions.js +249 -0
- package/dist/routes/operation-runs.d.ts +112 -0
- package/dist/routes/operation-runs.js +299 -0
- package/dist/routes/operations.d.ts +3 -0
- package/dist/routes/operations.js +283 -0
- package/dist/routes/order-revision-transitions.d.ts +3 -0
- package/dist/routes/order-revision-transitions.js +86 -0
- package/dist/routes/order-revisions.d.ts +51 -0
- package/dist/routes/order-revisions.js +327 -0
- package/dist/routes/order-run-transitions.d.ts +3 -0
- package/dist/routes/order-run-transitions.js +215 -0
- package/dist/routes/order-runs.d.ts +58 -0
- package/dist/routes/order-runs.js +335 -0
- package/dist/routes/orders.d.ts +3 -0
- package/dist/routes/orders.js +262 -0
- package/dist/routes/root.d.ts +3 -0
- package/dist/routes/root.js +123 -0
- package/dist/routes/schemas.d.ts +3 -0
- package/dist/routes/schemas.js +31 -0
- package/dist/routes/step-field-attachments.d.ts +3 -0
- package/dist/routes/step-field-attachments.js +231 -0
- package/dist/routes/step-fields.d.ts +100 -0
- package/dist/routes/step-fields.js +315 -0
- package/dist/routes/step-run-fields.d.ts +3 -0
- package/dist/routes/step-run-fields.js +438 -0
- package/dist/routes/step-run-transitions.d.ts +3 -0
- package/dist/routes/step-run-transitions.js +113 -0
- package/dist/routes/step-runs.d.ts +332 -0
- package/dist/routes/step-runs.js +324 -0
- package/dist/routes/steps.d.ts +3 -0
- package/dist/routes/steps.js +283 -0
- package/dist/routes/user-permissions.d.ts +3 -0
- package/dist/routes/user-permissions.js +100 -0
- package/dist/routes/users.d.ts +57 -0
- package/dist/routes/users.js +381 -0
- package/dist/routes/work-centers.d.ts +3 -0
- package/dist/routes/work-centers.js +280 -0
- package/dist/schema-registry.d.ts +3 -0
- package/dist/schema-registry.js +45 -0
- package/dist/services/attachment-service.d.ts +33 -0
- package/dist/services/attachment-service.js +118 -0
- package/dist/services/field-ref-service.d.ts +96 -0
- package/dist/services/field-ref-service.js +74 -0
- package/dist/services/field-service.d.ts +49 -0
- package/dist/services/field-service.js +114 -0
- package/dist/services/field-value-service.d.ts +61 -0
- package/dist/services/field-value-service.js +256 -0
- package/dist/services/item-instance-service.d.ts +152 -0
- package/dist/services/item-instance-service.js +155 -0
- package/dist/services/item-service.d.ts +47 -0
- package/dist/services/item-service.js +56 -0
- package/dist/services/labor-ticket-service.d.ts +40 -0
- package/dist/services/labor-ticket-service.js +148 -0
- package/dist/services/log-file-service.d.ts +4 -0
- package/dist/services/log-file-service.js +11 -0
- package/dist/services/operation-dependency-service.d.ts +33 -0
- package/dist/services/operation-dependency-service.js +30 -0
- package/dist/services/operation-run-comment-service.d.ts +17 -0
- package/dist/services/operation-run-comment-service.js +26 -0
- package/dist/services/operation-run-service.d.ts +126 -0
- package/dist/services/operation-run-service.js +347 -0
- package/dist/services/operation-service.d.ts +47 -0
- package/dist/services/operation-service.js +132 -0
- package/dist/services/order-revision-service.d.ts +53 -0
- package/dist/services/order-revision-service.js +264 -0
- package/dist/services/order-run-service.d.ts +138 -0
- package/dist/services/order-run-service.js +356 -0
- package/dist/services/order-service.d.ts +15 -0
- package/dist/services/order-service.js +68 -0
- package/dist/services/revision-diff-service.d.ts +3 -0
- package/dist/services/revision-diff-service.js +194 -0
- package/dist/services/step-run-service.d.ts +172 -0
- package/dist/services/step-run-service.js +106 -0
- package/dist/services/step-service.d.ts +104 -0
- package/dist/services/step-service.js +89 -0
- package/dist/services/user-service.d.ts +185 -0
- package/dist/services/user-service.js +132 -0
- package/dist/services/work-center-service.d.ts +29 -0
- package/dist/services/work-center-service.js +106 -0
- package/dist/supervisorAuth.d.ts +3 -0
- package/dist/supervisorAuth.js +16 -0
- package/dist/userService.d.ts +20 -0
- package/dist/userService.js +118 -0
- package/package.json +69 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type * from './models/Order.js';
|
|
2
|
+
export type * from './models/OrderRevision.js';
|
|
3
|
+
export type * from './models/Operation.js';
|
|
4
|
+
export type * from './models/OperationFieldRef.js';
|
|
5
|
+
export type * from './models/OperationDependency.js';
|
|
6
|
+
export type * from './models/WorkCenter.js';
|
|
7
|
+
export type * from './models/WorkCenterUser.js';
|
|
8
|
+
export type * from './models/FieldSet.js';
|
|
9
|
+
export type * from './models/FieldRecord.js';
|
|
10
|
+
export type * from './models/Field.js';
|
|
11
|
+
export type * from './models/Step.js';
|
|
12
|
+
export type * from './models/OrderRun.js';
|
|
13
|
+
export type * from './models/OperationRun.js';
|
|
14
|
+
export type * from './models/StepRun.js';
|
|
15
|
+
export type * from './models/FieldValue.js';
|
|
16
|
+
export type * from './models/Item.js';
|
|
17
|
+
export type * from './models/ItemInstance.js';
|
|
18
|
+
export type * from './models/User.js';
|
|
19
|
+
export type * from './models/UserPermission.js';
|
|
20
|
+
export type * from './models/Session.js';
|
|
21
|
+
export type * from './models/SchemaVersion.js';
|
|
22
|
+
export type * from './models/LaborTicket.js';
|
|
23
|
+
export type * from './models/AuditLog.js';
|
|
24
|
+
export type * from './models/Attachment.js';
|
|
25
|
+
export type * from './models/FieldAttachment.js';
|
|
26
|
+
export type * from './models/OperationRunComment.js';
|
|
27
|
+
export type * from './commonInputTypes.js';
|
|
28
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { HateoasLink } from "@naisys/common";
|
|
2
|
+
export declare const API_PREFIX = "/api/erp";
|
|
3
|
+
export declare function selfLink(path: string, title?: string): HateoasLink;
|
|
4
|
+
export declare function collectionLink(resource: string): HateoasLink;
|
|
5
|
+
export declare function schemaLink(schemaName: string): HateoasLink;
|
|
6
|
+
export declare function paginationLinks(basePath: string, page: number, pageSize: number, total: number, filters?: Record<string, string | undefined>): HateoasLink[];
|
|
7
|
+
//# sourceMappingURL=hateoas.d.ts.map
|
package/dist/hateoas.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export const API_PREFIX = "/api/erp";
|
|
2
|
+
export function selfLink(path, title) {
|
|
3
|
+
return { rel: "self", href: `${API_PREFIX}${path}`, title };
|
|
4
|
+
}
|
|
5
|
+
export function collectionLink(resource) {
|
|
6
|
+
return {
|
|
7
|
+
rel: "collection",
|
|
8
|
+
href: `${API_PREFIX}/${resource}`,
|
|
9
|
+
title: resource,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function schemaLink(schemaName) {
|
|
13
|
+
return {
|
|
14
|
+
rel: "schema",
|
|
15
|
+
href: `${API_PREFIX}/schemas/${schemaName}`,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function buildQuery(page, pageSize, filters) {
|
|
19
|
+
const params = new URLSearchParams();
|
|
20
|
+
params.set("page", String(page));
|
|
21
|
+
params.set("pageSize", String(pageSize));
|
|
22
|
+
if (filters) {
|
|
23
|
+
for (const [key, value] of Object.entries(filters)) {
|
|
24
|
+
if (value !== undefined)
|
|
25
|
+
params.set(key, value);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return params.toString();
|
|
29
|
+
}
|
|
30
|
+
export function paginationLinks(basePath, page, pageSize, total, filters) {
|
|
31
|
+
const fullPath = `${API_PREFIX}/${basePath}`;
|
|
32
|
+
const totalPages = Math.ceil(total / pageSize);
|
|
33
|
+
const links = [
|
|
34
|
+
{
|
|
35
|
+
rel: "self",
|
|
36
|
+
href: `${fullPath}?${buildQuery(page, pageSize, filters)}`,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
rel: "first",
|
|
40
|
+
href: `${fullPath}?${buildQuery(1, pageSize, filters)}`,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
rel: "last",
|
|
44
|
+
href: `${fullPath}?${buildQuery(Math.max(1, totalPages), pageSize, filters)}`,
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
if (page > 1) {
|
|
48
|
+
links.push({
|
|
49
|
+
rel: "prev",
|
|
50
|
+
href: `${fullPath}?${buildQuery(page - 1, pageSize, filters)}`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (page < totalPages) {
|
|
54
|
+
links.push({
|
|
55
|
+
rel: "next",
|
|
56
|
+
href: `${fullPath}?${buildQuery(page + 1, pageSize, filters)}`,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return links;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=hateoas.js.map
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import type { HateoasAction, HateoasLink } from "@naisys/common";
|
|
2
|
+
import { type ActionDef as ActionDefBase, permGate } from "@naisys/common";
|
|
3
|
+
import { type ErpPermission } from "@naisys/erp-shared";
|
|
4
|
+
import type { FastifyReply, FastifyRequest } from "fastify";
|
|
5
|
+
import type { ErpUser } from "./auth-middleware.js";
|
|
6
|
+
/**
|
|
7
|
+
* Returns true when the caller wants the full entity in the mutation response.
|
|
8
|
+
* UI clients send `Prefer: return=representation`; agents get the slim default.
|
|
9
|
+
*/
|
|
10
|
+
export declare function wantsFullResponse(request: FastifyRequest): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Override Fastify's schema-driven serializer so every field in the
|
|
13
|
+
* response object is emitted (not just the ones in the slim schema).
|
|
14
|
+
*/
|
|
15
|
+
export declare function useFullSerializer(reply: FastifyReply): void;
|
|
16
|
+
/**
|
|
17
|
+
* Return `slim` by default, or `full` when the caller sends
|
|
18
|
+
* `Prefer: return=representation`.
|
|
19
|
+
*
|
|
20
|
+
* For full responses we override the serializer so that Fastify
|
|
21
|
+
* emits all fields instead of stripping them down to the (slim)
|
|
22
|
+
* response schema.
|
|
23
|
+
*/
|
|
24
|
+
export declare function mutationResult<TFull, TSlim>(request: FastifyRequest, reply: FastifyReply, full: TFull, slim: TSlim): TFull | TSlim;
|
|
25
|
+
export declare const includeUsers: {
|
|
26
|
+
readonly createdBy: {
|
|
27
|
+
readonly select: {
|
|
28
|
+
readonly username: true;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
readonly updatedBy: {
|
|
32
|
+
readonly select: {
|
|
33
|
+
readonly username: true;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export type WithAuditUsers = {
|
|
38
|
+
createdAt: Date;
|
|
39
|
+
createdBy: {
|
|
40
|
+
username: string;
|
|
41
|
+
};
|
|
42
|
+
updatedAt: Date;
|
|
43
|
+
updatedBy: {
|
|
44
|
+
username: string;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
export declare function formatAuditFields(item: WithAuditUsers): {
|
|
48
|
+
createdAt: string;
|
|
49
|
+
createdBy: string;
|
|
50
|
+
updatedAt: string;
|
|
51
|
+
updatedBy: string;
|
|
52
|
+
};
|
|
53
|
+
export declare function formatDate(d: Date | null): string | null;
|
|
54
|
+
export declare function calcNextSeqNo(currentMax: number): number;
|
|
55
|
+
export declare function childItemLinks(basePath: string, itemKey: string | number, collectionTitle: string, parentPath: string, parentTitle: string, schemaName: string, parentRel?: string): HateoasLink[];
|
|
56
|
+
export { permGate };
|
|
57
|
+
export interface ActionDef<T> extends Omit<ActionDefBase<T>, "permission"> {
|
|
58
|
+
permission?: ErpPermission;
|
|
59
|
+
}
|
|
60
|
+
export declare function resolveActions<T extends {
|
|
61
|
+
user: ErpUser | undefined;
|
|
62
|
+
}>(defs: ActionDef<T>[], baseHref: string, ctx: T): HateoasAction[];
|
|
63
|
+
export declare function draftCrudActions(href: string, updateSchemaName: string, revStatus: string, user: ErpUser | undefined): HateoasAction[];
|
|
64
|
+
export declare function checkOrderRunStarted(status: string): string | null;
|
|
65
|
+
export declare function checkOpRunInProgress(status: string): string | null;
|
|
66
|
+
/**
|
|
67
|
+
* If the operation has a work center, check that the user is assigned to it.
|
|
68
|
+
* Returns an error message or null if access is allowed.
|
|
69
|
+
*/
|
|
70
|
+
export declare function checkWorkCenterAccess(operationId: number, user: ErpUser): Promise<string | null>;
|
|
71
|
+
export declare function resolveOrder(orderKey: string): Promise<{
|
|
72
|
+
description: string;
|
|
73
|
+
createdAt: Date;
|
|
74
|
+
id: number;
|
|
75
|
+
updatedAt: Date;
|
|
76
|
+
key: string;
|
|
77
|
+
status: import("./generated/prisma/enums.js").OrderStatus;
|
|
78
|
+
createdById: number;
|
|
79
|
+
updatedById: number;
|
|
80
|
+
itemId: number | null;
|
|
81
|
+
} | null>;
|
|
82
|
+
export declare function resolveRevision(orderKey: string, revNo: number): Promise<{
|
|
83
|
+
order: {
|
|
84
|
+
description: string;
|
|
85
|
+
createdAt: Date;
|
|
86
|
+
id: number;
|
|
87
|
+
updatedAt: Date;
|
|
88
|
+
key: string;
|
|
89
|
+
status: import("./generated/prisma/enums.js").OrderStatus;
|
|
90
|
+
createdById: number;
|
|
91
|
+
updatedById: number;
|
|
92
|
+
itemId: number | null;
|
|
93
|
+
};
|
|
94
|
+
rev: {
|
|
95
|
+
description: string;
|
|
96
|
+
createdAt: Date;
|
|
97
|
+
id: number;
|
|
98
|
+
updatedAt: Date;
|
|
99
|
+
status: import("./generated/prisma/enums.js").RevisionStatus;
|
|
100
|
+
changeSummary: string | null;
|
|
101
|
+
revNo: number;
|
|
102
|
+
createdById: number;
|
|
103
|
+
updatedById: number;
|
|
104
|
+
orderId: number;
|
|
105
|
+
};
|
|
106
|
+
} | null>;
|
|
107
|
+
export declare function resolveOperation(orderKey: string, revNo: number, opSeqNo: number): Promise<{
|
|
108
|
+
operation: {
|
|
109
|
+
title: string;
|
|
110
|
+
description: string;
|
|
111
|
+
createdAt: Date;
|
|
112
|
+
id: number;
|
|
113
|
+
updatedAt: Date;
|
|
114
|
+
seqNo: number;
|
|
115
|
+
orderRevId: number;
|
|
116
|
+
workCenterId: number | null;
|
|
117
|
+
createdById: number;
|
|
118
|
+
updatedById: number;
|
|
119
|
+
};
|
|
120
|
+
order: {
|
|
121
|
+
description: string;
|
|
122
|
+
createdAt: Date;
|
|
123
|
+
id: number;
|
|
124
|
+
updatedAt: Date;
|
|
125
|
+
key: string;
|
|
126
|
+
status: import("./generated/prisma/enums.js").OrderStatus;
|
|
127
|
+
createdById: number;
|
|
128
|
+
updatedById: number;
|
|
129
|
+
itemId: number | null;
|
|
130
|
+
};
|
|
131
|
+
rev: {
|
|
132
|
+
description: string;
|
|
133
|
+
createdAt: Date;
|
|
134
|
+
id: number;
|
|
135
|
+
updatedAt: Date;
|
|
136
|
+
status: import("./generated/prisma/enums.js").RevisionStatus;
|
|
137
|
+
changeSummary: string | null;
|
|
138
|
+
revNo: number;
|
|
139
|
+
createdById: number;
|
|
140
|
+
updatedById: number;
|
|
141
|
+
orderId: number;
|
|
142
|
+
};
|
|
143
|
+
} | null>;
|
|
144
|
+
export declare function resolveStep(orderKey: string, revNo: number, opSeqNo: number, stepSeqNo: number): Promise<{
|
|
145
|
+
step: {
|
|
146
|
+
title: string;
|
|
147
|
+
operationId: number;
|
|
148
|
+
createdAt: Date;
|
|
149
|
+
id: number;
|
|
150
|
+
updatedAt: Date;
|
|
151
|
+
seqNo: number;
|
|
152
|
+
instructions: string;
|
|
153
|
+
multiSet: boolean;
|
|
154
|
+
createdById: number;
|
|
155
|
+
updatedById: number;
|
|
156
|
+
fieldSetId: number | null;
|
|
157
|
+
};
|
|
158
|
+
operation: {
|
|
159
|
+
title: string;
|
|
160
|
+
description: string;
|
|
161
|
+
createdAt: Date;
|
|
162
|
+
id: number;
|
|
163
|
+
updatedAt: Date;
|
|
164
|
+
seqNo: number;
|
|
165
|
+
orderRevId: number;
|
|
166
|
+
workCenterId: number | null;
|
|
167
|
+
createdById: number;
|
|
168
|
+
updatedById: number;
|
|
169
|
+
};
|
|
170
|
+
order: {
|
|
171
|
+
description: string;
|
|
172
|
+
createdAt: Date;
|
|
173
|
+
id: number;
|
|
174
|
+
updatedAt: Date;
|
|
175
|
+
key: string;
|
|
176
|
+
status: import("./generated/prisma/enums.js").OrderStatus;
|
|
177
|
+
createdById: number;
|
|
178
|
+
updatedById: number;
|
|
179
|
+
itemId: number | null;
|
|
180
|
+
};
|
|
181
|
+
rev: {
|
|
182
|
+
description: string;
|
|
183
|
+
createdAt: Date;
|
|
184
|
+
id: number;
|
|
185
|
+
updatedAt: Date;
|
|
186
|
+
status: import("./generated/prisma/enums.js").RevisionStatus;
|
|
187
|
+
changeSummary: string | null;
|
|
188
|
+
revNo: number;
|
|
189
|
+
createdById: number;
|
|
190
|
+
updatedById: number;
|
|
191
|
+
orderId: number;
|
|
192
|
+
};
|
|
193
|
+
} | null>;
|
|
194
|
+
export declare function resolveOrderRun(orderKey: string, runNo: number): Promise<{
|
|
195
|
+
order: {
|
|
196
|
+
description: string;
|
|
197
|
+
createdAt: Date;
|
|
198
|
+
id: number;
|
|
199
|
+
updatedAt: Date;
|
|
200
|
+
key: string;
|
|
201
|
+
status: import("./generated/prisma/enums.js").OrderStatus;
|
|
202
|
+
createdById: number;
|
|
203
|
+
updatedById: number;
|
|
204
|
+
itemId: number | null;
|
|
205
|
+
};
|
|
206
|
+
run: {
|
|
207
|
+
createdAt: Date;
|
|
208
|
+
id: number;
|
|
209
|
+
updatedAt: Date;
|
|
210
|
+
status: import("./generated/prisma/enums.js").OrderRunStatus;
|
|
211
|
+
priority: import("./generated/prisma/enums.js").OrderRunPriority;
|
|
212
|
+
dueAt: string | null;
|
|
213
|
+
releaseNote: string | null;
|
|
214
|
+
orderRevId: number;
|
|
215
|
+
createdById: number;
|
|
216
|
+
updatedById: number;
|
|
217
|
+
orderId: number;
|
|
218
|
+
runNo: number;
|
|
219
|
+
cost: number | null;
|
|
220
|
+
};
|
|
221
|
+
} | null>;
|
|
222
|
+
export declare function resolveOpRun(orderKey: string, runNo: number, seqNo: number): Promise<{
|
|
223
|
+
opRun: {
|
|
224
|
+
operationId: number;
|
|
225
|
+
createdAt: Date;
|
|
226
|
+
id: number;
|
|
227
|
+
updatedAt: Date;
|
|
228
|
+
orderRunId: number;
|
|
229
|
+
status: import("./generated/prisma/enums.js").OperationRunStatus;
|
|
230
|
+
assignedToId: number | null;
|
|
231
|
+
createdById: number;
|
|
232
|
+
updatedById: number;
|
|
233
|
+
cost: number | null;
|
|
234
|
+
statusNote: string | null;
|
|
235
|
+
completedAt: Date | null;
|
|
236
|
+
};
|
|
237
|
+
order: {
|
|
238
|
+
description: string;
|
|
239
|
+
createdAt: Date;
|
|
240
|
+
id: number;
|
|
241
|
+
updatedAt: Date;
|
|
242
|
+
key: string;
|
|
243
|
+
status: import("./generated/prisma/enums.js").OrderStatus;
|
|
244
|
+
createdById: number;
|
|
245
|
+
updatedById: number;
|
|
246
|
+
itemId: number | null;
|
|
247
|
+
};
|
|
248
|
+
run: {
|
|
249
|
+
createdAt: Date;
|
|
250
|
+
id: number;
|
|
251
|
+
updatedAt: Date;
|
|
252
|
+
status: import("./generated/prisma/enums.js").OrderRunStatus;
|
|
253
|
+
priority: import("./generated/prisma/enums.js").OrderRunPriority;
|
|
254
|
+
dueAt: string | null;
|
|
255
|
+
releaseNote: string | null;
|
|
256
|
+
orderRevId: number;
|
|
257
|
+
createdById: number;
|
|
258
|
+
updatedById: number;
|
|
259
|
+
orderId: number;
|
|
260
|
+
runNo: number;
|
|
261
|
+
cost: number | null;
|
|
262
|
+
};
|
|
263
|
+
} | null>;
|
|
264
|
+
export declare function resolveStepRun(orderKey: string, runNo: number, seqNo: number, stepSeqNo: number): Promise<{
|
|
265
|
+
stepRun: {
|
|
266
|
+
createdAt: Date;
|
|
267
|
+
id: number;
|
|
268
|
+
updatedAt: Date;
|
|
269
|
+
createdById: number;
|
|
270
|
+
updatedById: number;
|
|
271
|
+
statusNote: string | null;
|
|
272
|
+
completed: boolean;
|
|
273
|
+
operationRunId: number;
|
|
274
|
+
stepId: number;
|
|
275
|
+
fieldRecordId: number | null;
|
|
276
|
+
};
|
|
277
|
+
opRun: {
|
|
278
|
+
operationId: number;
|
|
279
|
+
createdAt: Date;
|
|
280
|
+
id: number;
|
|
281
|
+
updatedAt: Date;
|
|
282
|
+
orderRunId: number;
|
|
283
|
+
status: import("./generated/prisma/enums.js").OperationRunStatus;
|
|
284
|
+
assignedToId: number | null;
|
|
285
|
+
createdById: number;
|
|
286
|
+
updatedById: number;
|
|
287
|
+
cost: number | null;
|
|
288
|
+
statusNote: string | null;
|
|
289
|
+
completedAt: Date | null;
|
|
290
|
+
};
|
|
291
|
+
order: {
|
|
292
|
+
description: string;
|
|
293
|
+
createdAt: Date;
|
|
294
|
+
id: number;
|
|
295
|
+
updatedAt: Date;
|
|
296
|
+
key: string;
|
|
297
|
+
status: import("./generated/prisma/enums.js").OrderStatus;
|
|
298
|
+
createdById: number;
|
|
299
|
+
updatedById: number;
|
|
300
|
+
itemId: number | null;
|
|
301
|
+
};
|
|
302
|
+
run: {
|
|
303
|
+
createdAt: Date;
|
|
304
|
+
id: number;
|
|
305
|
+
updatedAt: Date;
|
|
306
|
+
status: import("./generated/prisma/enums.js").OrderRunStatus;
|
|
307
|
+
priority: import("./generated/prisma/enums.js").OrderRunPriority;
|
|
308
|
+
dueAt: string | null;
|
|
309
|
+
releaseNote: string | null;
|
|
310
|
+
orderRevId: number;
|
|
311
|
+
createdById: number;
|
|
312
|
+
updatedById: number;
|
|
313
|
+
orderId: number;
|
|
314
|
+
runNo: number;
|
|
315
|
+
cost: number | null;
|
|
316
|
+
};
|
|
317
|
+
} | null>;
|
|
318
|
+
//# sourceMappingURL=route-helpers.d.ts.map
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { permGate, resolveActions as resolveActionsBase, } from "@naisys/common";
|
|
2
|
+
import { OperationRunStatus, OrderRunStatus, RevisionStatus, } from "@naisys/erp-shared";
|
|
3
|
+
import { hasPermission } from "./auth-middleware.js";
|
|
4
|
+
import erpDb from "./erpDb.js";
|
|
5
|
+
import { API_PREFIX, schemaLink, selfLink } from "./hateoas.js";
|
|
6
|
+
// --- Prefer: return=representation (RFC 7240) ---
|
|
7
|
+
/**
|
|
8
|
+
* Returns true when the caller wants the full entity in the mutation response.
|
|
9
|
+
* UI clients send `Prefer: return=representation`; agents get the slim default.
|
|
10
|
+
*/
|
|
11
|
+
export function wantsFullResponse(request) {
|
|
12
|
+
const prefer = request.headers["prefer"];
|
|
13
|
+
return typeof prefer === "string" && prefer.includes("return=representation");
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Override Fastify's schema-driven serializer so every field in the
|
|
17
|
+
* response object is emitted (not just the ones in the slim schema).
|
|
18
|
+
*/
|
|
19
|
+
export function useFullSerializer(reply) {
|
|
20
|
+
reply.header("content-type", "application/json; charset=utf-8");
|
|
21
|
+
reply.serializer(JSON.stringify);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Return `slim` by default, or `full` when the caller sends
|
|
25
|
+
* `Prefer: return=representation`.
|
|
26
|
+
*
|
|
27
|
+
* For full responses we override the serializer so that Fastify
|
|
28
|
+
* emits all fields instead of stripping them down to the (slim)
|
|
29
|
+
* response schema.
|
|
30
|
+
*/
|
|
31
|
+
export function mutationResult(request, reply, full, slim) {
|
|
32
|
+
if (wantsFullResponse(request)) {
|
|
33
|
+
useFullSerializer(reply);
|
|
34
|
+
return full;
|
|
35
|
+
}
|
|
36
|
+
return slim;
|
|
37
|
+
}
|
|
38
|
+
// --- Shared Prisma include for audit user fields ---
|
|
39
|
+
export const includeUsers = {
|
|
40
|
+
createdBy: { select: { username: true } },
|
|
41
|
+
updatedBy: { select: { username: true } },
|
|
42
|
+
};
|
|
43
|
+
// --- Formatting helpers ---
|
|
44
|
+
export function formatAuditFields(item) {
|
|
45
|
+
return {
|
|
46
|
+
createdAt: item.createdAt.toISOString(),
|
|
47
|
+
createdBy: item.createdBy.username,
|
|
48
|
+
updatedAt: item.updatedAt.toISOString(),
|
|
49
|
+
updatedBy: item.updatedBy.username,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function formatDate(d) {
|
|
53
|
+
return d ? d.toISOString() : null;
|
|
54
|
+
}
|
|
55
|
+
export function calcNextSeqNo(currentMax) {
|
|
56
|
+
return Math.ceil((currentMax + 1) / 10) * 10;
|
|
57
|
+
}
|
|
58
|
+
// --- HATEOAS helpers ---
|
|
59
|
+
export function childItemLinks(basePath, itemKey, collectionTitle, parentPath, parentTitle, schemaName, parentRel = "parent") {
|
|
60
|
+
return [
|
|
61
|
+
selfLink(`${basePath}/${itemKey}`),
|
|
62
|
+
{
|
|
63
|
+
rel: "collection",
|
|
64
|
+
href: `${API_PREFIX}${basePath}`,
|
|
65
|
+
title: collectionTitle,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
rel: parentRel,
|
|
69
|
+
href: `${API_PREFIX}${parentPath}`,
|
|
70
|
+
title: parentTitle,
|
|
71
|
+
},
|
|
72
|
+
schemaLink(schemaName),
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
// --- Declarative action resolver (wraps @naisys/common with ERP permission types) ---
|
|
76
|
+
export { permGate };
|
|
77
|
+
export function resolveActions(defs, baseHref, ctx) {
|
|
78
|
+
return resolveActionsBase(defs, baseHref, ctx, (perm) => hasPermission(ctx.user, perm));
|
|
79
|
+
}
|
|
80
|
+
export function draftCrudActions(href, updateSchemaName, revStatus, user) {
|
|
81
|
+
return resolveActions([
|
|
82
|
+
{
|
|
83
|
+
rel: "update",
|
|
84
|
+
method: "PUT",
|
|
85
|
+
title: "Update",
|
|
86
|
+
schema: `${API_PREFIX}/schemas/${updateSchemaName}`,
|
|
87
|
+
permission: "order_planner",
|
|
88
|
+
disabledWhen: (ctx) => ctx.status !== RevisionStatus.draft
|
|
89
|
+
? "Can only edit in draft revisions"
|
|
90
|
+
: null,
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
rel: "delete",
|
|
94
|
+
method: "DELETE",
|
|
95
|
+
title: "Delete",
|
|
96
|
+
permission: "order_planner",
|
|
97
|
+
statuses: [RevisionStatus.draft],
|
|
98
|
+
hideWithoutPermission: true,
|
|
99
|
+
},
|
|
100
|
+
], href, { status: revStatus, user });
|
|
101
|
+
}
|
|
102
|
+
// --- Status guards (return error message or null) ---
|
|
103
|
+
export function checkOrderRunStarted(status) {
|
|
104
|
+
return status !== OrderRunStatus.started
|
|
105
|
+
? `Order run is not started (status: ${status})`
|
|
106
|
+
: null;
|
|
107
|
+
}
|
|
108
|
+
export function checkOpRunInProgress(status) {
|
|
109
|
+
return status !== OperationRunStatus.in_progress
|
|
110
|
+
? `Operation run is not in_progress (status: ${status})`
|
|
111
|
+
: null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* If the operation has a work center, check that the user is assigned to it.
|
|
115
|
+
* Returns an error message or null if access is allowed.
|
|
116
|
+
*/
|
|
117
|
+
export async function checkWorkCenterAccess(operationId, user) {
|
|
118
|
+
if (hasPermission(user, "erp_admin"))
|
|
119
|
+
return null;
|
|
120
|
+
const operation = await erpDb.operation.findUnique({
|
|
121
|
+
where: { id: operationId },
|
|
122
|
+
select: {
|
|
123
|
+
workCenter: {
|
|
124
|
+
select: {
|
|
125
|
+
key: true,
|
|
126
|
+
userAssignments: {
|
|
127
|
+
where: { userId: user.id },
|
|
128
|
+
select: { userId: true },
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
if (!operation?.workCenter)
|
|
135
|
+
return null; // no work center = open to all
|
|
136
|
+
if (operation.workCenter.userAssignments.length > 0)
|
|
137
|
+
return null;
|
|
138
|
+
return `You are not assigned to work center '${operation.workCenter.key}'`;
|
|
139
|
+
}
|
|
140
|
+
// --- Resolution chains ---
|
|
141
|
+
export async function resolveOrder(orderKey) {
|
|
142
|
+
return erpDb.order.findUnique({ where: { key: orderKey } });
|
|
143
|
+
}
|
|
144
|
+
export async function resolveRevision(orderKey, revNo) {
|
|
145
|
+
const order = await resolveOrder(orderKey);
|
|
146
|
+
if (!order)
|
|
147
|
+
return null;
|
|
148
|
+
const rev = await erpDb.orderRevision.findFirst({
|
|
149
|
+
where: { orderId: order.id, revNo },
|
|
150
|
+
});
|
|
151
|
+
if (!rev)
|
|
152
|
+
return null;
|
|
153
|
+
return { order, rev };
|
|
154
|
+
}
|
|
155
|
+
export async function resolveOperation(orderKey, revNo, opSeqNo) {
|
|
156
|
+
const result = await resolveRevision(orderKey, revNo);
|
|
157
|
+
if (!result)
|
|
158
|
+
return null;
|
|
159
|
+
const operation = await erpDb.operation.findFirst({
|
|
160
|
+
where: { orderRevId: result.rev.id, seqNo: opSeqNo },
|
|
161
|
+
});
|
|
162
|
+
if (!operation)
|
|
163
|
+
return null;
|
|
164
|
+
return { ...result, operation };
|
|
165
|
+
}
|
|
166
|
+
export async function resolveStep(orderKey, revNo, opSeqNo, stepSeqNo) {
|
|
167
|
+
const result = await resolveOperation(orderKey, revNo, opSeqNo);
|
|
168
|
+
if (!result)
|
|
169
|
+
return null;
|
|
170
|
+
const step = await erpDb.step.findFirst({
|
|
171
|
+
where: { operationId: result.operation.id, seqNo: stepSeqNo },
|
|
172
|
+
});
|
|
173
|
+
if (!step)
|
|
174
|
+
return null;
|
|
175
|
+
return { ...result, step };
|
|
176
|
+
}
|
|
177
|
+
export async function resolveOrderRun(orderKey, runNo) {
|
|
178
|
+
const order = await resolveOrder(orderKey);
|
|
179
|
+
if (!order)
|
|
180
|
+
return null;
|
|
181
|
+
const run = await erpDb.orderRun.findUnique({
|
|
182
|
+
where: { orderId_runNo: { orderId: order.id, runNo } },
|
|
183
|
+
});
|
|
184
|
+
if (!run)
|
|
185
|
+
return null;
|
|
186
|
+
return { order, run };
|
|
187
|
+
}
|
|
188
|
+
export async function resolveOpRun(orderKey, runNo, seqNo) {
|
|
189
|
+
const result = await resolveOrderRun(orderKey, runNo);
|
|
190
|
+
if (!result)
|
|
191
|
+
return null;
|
|
192
|
+
const operation = await erpDb.operation.findFirst({
|
|
193
|
+
where: { orderRevId: result.run.orderRevId, seqNo },
|
|
194
|
+
});
|
|
195
|
+
if (!operation)
|
|
196
|
+
return null;
|
|
197
|
+
const opRun = await erpDb.operationRun.findUnique({
|
|
198
|
+
where: {
|
|
199
|
+
orderRunId_operationId: {
|
|
200
|
+
orderRunId: result.run.id,
|
|
201
|
+
operationId: operation.id,
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
if (!opRun)
|
|
206
|
+
return null;
|
|
207
|
+
return { ...result, opRun };
|
|
208
|
+
}
|
|
209
|
+
export async function resolveStepRun(orderKey, runNo, seqNo, stepSeqNo) {
|
|
210
|
+
const result = await resolveOpRun(orderKey, runNo, seqNo);
|
|
211
|
+
if (!result)
|
|
212
|
+
return null;
|
|
213
|
+
const stepRun = await erpDb.stepRun.findFirst({
|
|
214
|
+
where: { operationRunId: result.opRun.id, step: { seqNo: stepSeqNo } },
|
|
215
|
+
});
|
|
216
|
+
if (!stepRun)
|
|
217
|
+
return null;
|
|
218
|
+
return { ...result, stepRun };
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=route-helpers.js.map
|