@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.

Files changed (201) hide show
  1. package/bin/naisys-erp +2 -0
  2. package/client-dist/android-chrome-192x192.png +0 -0
  3. package/client-dist/android-chrome-512x512.png +0 -0
  4. package/client-dist/apple-touch-icon.png +0 -0
  5. package/client-dist/assets/index-45dVo30p.css +1 -0
  6. package/client-dist/assets/index-Dffms7F_.js +168 -0
  7. package/client-dist/assets/naisys-logo-CzoPnn5I.webp +0 -0
  8. package/client-dist/favicon.ico +0 -0
  9. package/client-dist/index.html +42 -0
  10. package/client-dist/site.webmanifest +22 -0
  11. package/dist/api-reference.d.ts +10 -0
  12. package/dist/api-reference.js +101 -0
  13. package/dist/audit.d.ts +5 -0
  14. package/dist/audit.js +14 -0
  15. package/dist/auth-middleware.d.ts +18 -0
  16. package/dist/auth-middleware.js +203 -0
  17. package/dist/dbConfig.d.ts +5 -0
  18. package/dist/dbConfig.js +10 -0
  19. package/dist/erpDb.d.ts +10 -0
  20. package/dist/erpDb.js +34 -0
  21. package/dist/erpServer.d.ts +10 -0
  22. package/dist/erpServer.js +321 -0
  23. package/dist/error-handler.d.ts +7 -0
  24. package/dist/error-handler.js +17 -0
  25. package/dist/generated/prisma/client.d.ts +154 -0
  26. package/dist/generated/prisma/client.js +35 -0
  27. package/dist/generated/prisma/commonInputTypes.d.ts +637 -0
  28. package/dist/generated/prisma/commonInputTypes.js +11 -0
  29. package/dist/generated/prisma/enums.d.ts +59 -0
  30. package/dist/generated/prisma/enums.js +60 -0
  31. package/dist/generated/prisma/internal/class.d.ts +406 -0
  32. package/dist/generated/prisma/internal/class.js +50 -0
  33. package/dist/generated/prisma/internal/prismaNamespace.d.ts +2722 -0
  34. package/dist/generated/prisma/internal/prismaNamespace.js +366 -0
  35. package/dist/generated/prisma/models/Attachment.d.ts +1455 -0
  36. package/dist/generated/prisma/models/Attachment.js +2 -0
  37. package/dist/generated/prisma/models/AuditLog.d.ts +1359 -0
  38. package/dist/generated/prisma/models/AuditLog.js +2 -0
  39. package/dist/generated/prisma/models/Field.d.ts +1880 -0
  40. package/dist/generated/prisma/models/Field.js +2 -0
  41. package/dist/generated/prisma/models/FieldAttachment.d.ts +1245 -0
  42. package/dist/generated/prisma/models/FieldAttachment.js +2 -0
  43. package/dist/generated/prisma/models/FieldRecord.d.ts +1625 -0
  44. package/dist/generated/prisma/models/FieldRecord.js +2 -0
  45. package/dist/generated/prisma/models/FieldSet.d.ts +1577 -0
  46. package/dist/generated/prisma/models/FieldSet.js +2 -0
  47. package/dist/generated/prisma/models/FieldValue.d.ts +1908 -0
  48. package/dist/generated/prisma/models/FieldValue.js +2 -0
  49. package/dist/generated/prisma/models/Item.d.ts +1858 -0
  50. package/dist/generated/prisma/models/Item.js +2 -0
  51. package/dist/generated/prisma/models/ItemInstance.d.ts +1987 -0
  52. package/dist/generated/prisma/models/ItemInstance.js +2 -0
  53. package/dist/generated/prisma/models/LaborTicket.d.ts +1867 -0
  54. package/dist/generated/prisma/models/LaborTicket.js +2 -0
  55. package/dist/generated/prisma/models/Operation.d.ts +2578 -0
  56. package/dist/generated/prisma/models/Operation.js +2 -0
  57. package/dist/generated/prisma/models/OperationDependency.d.ts +1434 -0
  58. package/dist/generated/prisma/models/OperationDependency.js +2 -0
  59. package/dist/generated/prisma/models/OperationFieldRef.d.ts +1539 -0
  60. package/dist/generated/prisma/models/OperationFieldRef.js +2 -0
  61. package/dist/generated/prisma/models/OperationRun.d.ts +2563 -0
  62. package/dist/generated/prisma/models/OperationRun.js +2 -0
  63. package/dist/generated/prisma/models/OperationRunComment.d.ts +1366 -0
  64. package/dist/generated/prisma/models/OperationRunComment.js +2 -0
  65. package/dist/generated/prisma/models/Order.d.ts +1931 -0
  66. package/dist/generated/prisma/models/Order.js +2 -0
  67. package/dist/generated/prisma/models/OrderRevision.d.ts +1962 -0
  68. package/dist/generated/prisma/models/OrderRevision.js +2 -0
  69. package/dist/generated/prisma/models/OrderRun.d.ts +2310 -0
  70. package/dist/generated/prisma/models/OrderRun.js +2 -0
  71. package/dist/generated/prisma/models/SchemaVersion.d.ts +985 -0
  72. package/dist/generated/prisma/models/SchemaVersion.js +2 -0
  73. package/dist/generated/prisma/models/Session.d.ts +1213 -0
  74. package/dist/generated/prisma/models/Session.js +2 -0
  75. package/dist/generated/prisma/models/Step.d.ts +2180 -0
  76. package/dist/generated/prisma/models/Step.js +2 -0
  77. package/dist/generated/prisma/models/StepRun.d.ts +1963 -0
  78. package/dist/generated/prisma/models/StepRun.js +2 -0
  79. package/dist/generated/prisma/models/User.d.ts +11819 -0
  80. package/dist/generated/prisma/models/User.js +2 -0
  81. package/dist/generated/prisma/models/UserPermission.d.ts +1348 -0
  82. package/dist/generated/prisma/models/UserPermission.js +2 -0
  83. package/dist/generated/prisma/models/WorkCenter.d.ts +1657 -0
  84. package/dist/generated/prisma/models/WorkCenter.js +2 -0
  85. package/dist/generated/prisma/models/WorkCenterUser.d.ts +1390 -0
  86. package/dist/generated/prisma/models/WorkCenterUser.js +2 -0
  87. package/dist/generated/prisma/models.d.ts +28 -0
  88. package/dist/generated/prisma/models.js +2 -0
  89. package/dist/hateoas.d.ts +7 -0
  90. package/dist/hateoas.js +61 -0
  91. package/dist/route-helpers.d.ts +318 -0
  92. package/dist/route-helpers.js +220 -0
  93. package/dist/routes/admin.d.ts +3 -0
  94. package/dist/routes/admin.js +147 -0
  95. package/dist/routes/audit.d.ts +3 -0
  96. package/dist/routes/audit.js +36 -0
  97. package/dist/routes/auth.d.ts +3 -0
  98. package/dist/routes/auth.js +112 -0
  99. package/dist/routes/dispatch.d.ts +3 -0
  100. package/dist/routes/dispatch.js +174 -0
  101. package/dist/routes/inventory.d.ts +3 -0
  102. package/dist/routes/inventory.js +70 -0
  103. package/dist/routes/item-fields.d.ts +3 -0
  104. package/dist/routes/item-fields.js +220 -0
  105. package/dist/routes/item-instances.d.ts +3 -0
  106. package/dist/routes/item-instances.js +426 -0
  107. package/dist/routes/items.d.ts +3 -0
  108. package/dist/routes/items.js +252 -0
  109. package/dist/routes/labor-tickets.d.ts +3 -0
  110. package/dist/routes/labor-tickets.js +268 -0
  111. package/dist/routes/operation-dependencies.d.ts +3 -0
  112. package/dist/routes/operation-dependencies.js +170 -0
  113. package/dist/routes/operation-field-refs.d.ts +3 -0
  114. package/dist/routes/operation-field-refs.js +263 -0
  115. package/dist/routes/operation-run-comments.d.ts +3 -0
  116. package/dist/routes/operation-run-comments.js +108 -0
  117. package/dist/routes/operation-run-transitions.d.ts +3 -0
  118. package/dist/routes/operation-run-transitions.js +249 -0
  119. package/dist/routes/operation-runs.d.ts +112 -0
  120. package/dist/routes/operation-runs.js +299 -0
  121. package/dist/routes/operations.d.ts +3 -0
  122. package/dist/routes/operations.js +283 -0
  123. package/dist/routes/order-revision-transitions.d.ts +3 -0
  124. package/dist/routes/order-revision-transitions.js +86 -0
  125. package/dist/routes/order-revisions.d.ts +51 -0
  126. package/dist/routes/order-revisions.js +327 -0
  127. package/dist/routes/order-run-transitions.d.ts +3 -0
  128. package/dist/routes/order-run-transitions.js +215 -0
  129. package/dist/routes/order-runs.d.ts +58 -0
  130. package/dist/routes/order-runs.js +335 -0
  131. package/dist/routes/orders.d.ts +3 -0
  132. package/dist/routes/orders.js +262 -0
  133. package/dist/routes/root.d.ts +3 -0
  134. package/dist/routes/root.js +123 -0
  135. package/dist/routes/schemas.d.ts +3 -0
  136. package/dist/routes/schemas.js +31 -0
  137. package/dist/routes/step-field-attachments.d.ts +3 -0
  138. package/dist/routes/step-field-attachments.js +231 -0
  139. package/dist/routes/step-fields.d.ts +100 -0
  140. package/dist/routes/step-fields.js +315 -0
  141. package/dist/routes/step-run-fields.d.ts +3 -0
  142. package/dist/routes/step-run-fields.js +438 -0
  143. package/dist/routes/step-run-transitions.d.ts +3 -0
  144. package/dist/routes/step-run-transitions.js +113 -0
  145. package/dist/routes/step-runs.d.ts +332 -0
  146. package/dist/routes/step-runs.js +324 -0
  147. package/dist/routes/steps.d.ts +3 -0
  148. package/dist/routes/steps.js +283 -0
  149. package/dist/routes/user-permissions.d.ts +3 -0
  150. package/dist/routes/user-permissions.js +100 -0
  151. package/dist/routes/users.d.ts +57 -0
  152. package/dist/routes/users.js +381 -0
  153. package/dist/routes/work-centers.d.ts +3 -0
  154. package/dist/routes/work-centers.js +280 -0
  155. package/dist/schema-registry.d.ts +3 -0
  156. package/dist/schema-registry.js +45 -0
  157. package/dist/services/attachment-service.d.ts +33 -0
  158. package/dist/services/attachment-service.js +118 -0
  159. package/dist/services/field-ref-service.d.ts +96 -0
  160. package/dist/services/field-ref-service.js +74 -0
  161. package/dist/services/field-service.d.ts +49 -0
  162. package/dist/services/field-service.js +114 -0
  163. package/dist/services/field-value-service.d.ts +61 -0
  164. package/dist/services/field-value-service.js +256 -0
  165. package/dist/services/item-instance-service.d.ts +152 -0
  166. package/dist/services/item-instance-service.js +155 -0
  167. package/dist/services/item-service.d.ts +47 -0
  168. package/dist/services/item-service.js +56 -0
  169. package/dist/services/labor-ticket-service.d.ts +40 -0
  170. package/dist/services/labor-ticket-service.js +148 -0
  171. package/dist/services/log-file-service.d.ts +4 -0
  172. package/dist/services/log-file-service.js +11 -0
  173. package/dist/services/operation-dependency-service.d.ts +33 -0
  174. package/dist/services/operation-dependency-service.js +30 -0
  175. package/dist/services/operation-run-comment-service.d.ts +17 -0
  176. package/dist/services/operation-run-comment-service.js +26 -0
  177. package/dist/services/operation-run-service.d.ts +126 -0
  178. package/dist/services/operation-run-service.js +347 -0
  179. package/dist/services/operation-service.d.ts +47 -0
  180. package/dist/services/operation-service.js +132 -0
  181. package/dist/services/order-revision-service.d.ts +53 -0
  182. package/dist/services/order-revision-service.js +264 -0
  183. package/dist/services/order-run-service.d.ts +138 -0
  184. package/dist/services/order-run-service.js +356 -0
  185. package/dist/services/order-service.d.ts +15 -0
  186. package/dist/services/order-service.js +68 -0
  187. package/dist/services/revision-diff-service.d.ts +3 -0
  188. package/dist/services/revision-diff-service.js +194 -0
  189. package/dist/services/step-run-service.d.ts +172 -0
  190. package/dist/services/step-run-service.js +106 -0
  191. package/dist/services/step-service.d.ts +104 -0
  192. package/dist/services/step-service.js +89 -0
  193. package/dist/services/user-service.d.ts +185 -0
  194. package/dist/services/user-service.js +132 -0
  195. package/dist/services/work-center-service.d.ts +29 -0
  196. package/dist/services/work-center-service.js +106 -0
  197. package/dist/supervisorAuth.d.ts +3 -0
  198. package/dist/supervisorAuth.js +16 -0
  199. package/dist/userService.d.ts +20 -0
  200. package/dist/userService.js +118 -0
  201. package/package.json +69 -0
@@ -0,0 +1,315 @@
1
+ import { BatchCreateFieldSchema, BatchSeqNoCreateResponseSchema, CreateFieldSchema, ErrorResponseSchema, FieldListResponseSchema, FieldSchema, MutateResponseSchema, RevisionStatus, SeqNoCreateResponseSchema, UpdateFieldSchema, } from "@naisys/erp-shared";
2
+ import { z } from "zod/v4";
3
+ import { requirePermission } from "../auth-middleware.js";
4
+ import erpDb from "../erpDb.js";
5
+ import { conflict, notFound } from "../error-handler.js";
6
+ import { API_PREFIX, selfLink } from "../hateoas.js";
7
+ import { calcNextSeqNo, childItemLinks, draftCrudActions, formatAuditFields, mutationResult, resolveActions, resolveStep, } from "../route-helpers.js";
8
+ import { createField, createFields, deleteField, ensureFieldSet, findExistingField, getField, listFields, updateField, } from "../services/field-service.js";
9
+ const ParamsSchema = z.object({
10
+ orderKey: z.string(),
11
+ revNo: z.coerce.number().int(),
12
+ seqNo: z.coerce.number().int(),
13
+ stepSeqNo: z.coerce.number().int(),
14
+ });
15
+ const FieldParamsSchema = z.object({
16
+ orderKey: z.string(),
17
+ revNo: z.coerce.number().int(),
18
+ seqNo: z.coerce.number().int(),
19
+ stepSeqNo: z.coerce.number().int(),
20
+ fieldSeqNo: z.coerce.number().int(),
21
+ });
22
+ const draftCreateDef = {
23
+ rel: "create",
24
+ method: "POST",
25
+ title: "Add Field",
26
+ schema: `${API_PREFIX}/schemas/CreateField`,
27
+ permission: "order_planner",
28
+ disabledWhen: (ctx) => ctx.status !== RevisionStatus.draft
29
+ ? "Can only add fields in draft revisions"
30
+ : null,
31
+ };
32
+ const draftBatchCreateDef = {
33
+ rel: "batch-create",
34
+ path: "/batch",
35
+ method: "POST",
36
+ title: "Add Fields (Batch)",
37
+ schema: `${API_PREFIX}/schemas/BatchCreateField`,
38
+ permission: "order_planner",
39
+ disabledWhen: (ctx) => ctx.status !== RevisionStatus.draft
40
+ ? "Can only add fields in draft revisions"
41
+ : null,
42
+ };
43
+ function fieldListActions(base, revStatus, user) {
44
+ return resolveActions([draftCreateDef, draftBatchCreateDef], `${API_PREFIX}${base}`, { status: revStatus, user });
45
+ }
46
+ export function formatFieldListResponse(orderKey, revNo, opSeqNo, stepSeqNo, revStatus, user, items) {
47
+ const maxSeq = items.length > 0 ? items[items.length - 1].seqNo : 0;
48
+ const base = fieldBasePath(orderKey, revNo, opSeqNo, stepSeqNo);
49
+ return {
50
+ items: items.map((field) => {
51
+ const { _links, ...rest } = formatField(orderKey, revNo, opSeqNo, stepSeqNo, revStatus, user, field);
52
+ return rest;
53
+ }),
54
+ total: items.length,
55
+ nextSeqNo: calcNextSeqNo(maxSeq),
56
+ _links: [selfLink(base)],
57
+ _linkTemplates: [
58
+ {
59
+ rel: "item",
60
+ hrefTemplate: `${API_PREFIX}${fieldBasePath(orderKey, revNo, opSeqNo, stepSeqNo)}/{seqNo}`,
61
+ },
62
+ ],
63
+ _actions: fieldListActions(base, revStatus, user),
64
+ };
65
+ }
66
+ export function fieldBasePath(orderKey, revNo, opSeqNo, stepSeqNo) {
67
+ return `/orders/${orderKey}/revs/${revNo}/ops/${opSeqNo}/steps/${stepSeqNo}/fields`;
68
+ }
69
+ export function formatField(orderKey, revNo, opSeqNo, stepSeqNo, revStatus, user, field) {
70
+ const base = fieldBasePath(orderKey, revNo, opSeqNo, stepSeqNo);
71
+ return {
72
+ id: field.id,
73
+ fieldSetId: field.fieldSetId,
74
+ seqNo: field.seqNo,
75
+ label: field.label,
76
+ type: field.type,
77
+ isArray: field.isArray,
78
+ required: field.required,
79
+ ...formatAuditFields(field),
80
+ _links: childItemLinks(base, field.seqNo, "Fields", `/orders/${orderKey}/revs/${revNo}/ops/${opSeqNo}/steps/${stepSeqNo}`, "Step", "Field"),
81
+ _actions: draftCrudActions(`${API_PREFIX}${base}/${field.seqNo}`, "UpdateField", revStatus, user),
82
+ };
83
+ }
84
+ export default function stepFieldRoutes(fastify) {
85
+ const app = fastify.withTypeProvider();
86
+ // LIST
87
+ app.get("/", {
88
+ schema: {
89
+ description: "List fields for a step",
90
+ tags: ["Step Fields"],
91
+ params: ParamsSchema,
92
+ response: {
93
+ 200: FieldListResponseSchema,
94
+ 404: ErrorResponseSchema,
95
+ },
96
+ },
97
+ handler: async (request, reply) => {
98
+ const { orderKey, revNo, seqNo, stepSeqNo } = request.params;
99
+ const resolved = await resolveStep(orderKey, revNo, seqNo, stepSeqNo);
100
+ if (!resolved) {
101
+ return notFound(reply, "Step not found");
102
+ }
103
+ const items = resolved.step.fieldSetId
104
+ ? await listFields(resolved.step.fieldSetId)
105
+ : [];
106
+ const maxSeq = items.length > 0 ? items[items.length - 1].seqNo : 0;
107
+ const user = request.erpUser;
108
+ const base = fieldBasePath(orderKey, revNo, seqNo, stepSeqNo);
109
+ return {
110
+ items: items.map((field) => {
111
+ const { _links, ...rest } = formatField(orderKey, revNo, seqNo, stepSeqNo, resolved.rev.status, user, field);
112
+ return rest;
113
+ }),
114
+ total: items.length,
115
+ nextSeqNo: calcNextSeqNo(maxSeq),
116
+ _links: [selfLink(base)],
117
+ _linkTemplates: [
118
+ {
119
+ rel: "item",
120
+ hrefTemplate: `${API_PREFIX}${fieldBasePath(orderKey, revNo, seqNo, stepSeqNo)}/{seqNo}`,
121
+ },
122
+ ],
123
+ _actions: fieldListActions(base, resolved.rev.status, user),
124
+ };
125
+ },
126
+ });
127
+ // BATCH CREATE
128
+ app.post("/batch", {
129
+ schema: {
130
+ description: "Create multiple fields for a step in one request",
131
+ tags: ["Step Fields"],
132
+ params: ParamsSchema,
133
+ body: BatchCreateFieldSchema,
134
+ response: {
135
+ 201: BatchSeqNoCreateResponseSchema,
136
+ 404: ErrorResponseSchema,
137
+ 409: ErrorResponseSchema,
138
+ },
139
+ },
140
+ preHandler: requirePermission("order_planner"),
141
+ handler: async (request, reply) => {
142
+ const { orderKey, revNo, seqNo, stepSeqNo } = request.params;
143
+ const { items } = request.body;
144
+ const userId = request.erpUser.id;
145
+ const resolved = await resolveStep(orderKey, revNo, seqNo, stepSeqNo);
146
+ if (!resolved) {
147
+ return notFound(reply, "Step not found");
148
+ }
149
+ if (resolved.rev.status !== RevisionStatus.draft) {
150
+ return conflict(reply, `Cannot add fields to a ${resolved.rev.status} revision`);
151
+ }
152
+ let fieldSetId = resolved.step.fieldSetId;
153
+ if (!fieldSetId) {
154
+ fieldSetId = await ensureFieldSet(null, userId);
155
+ await erpDb.step.update({
156
+ where: { id: resolved.step.id },
157
+ data: { fieldSetId },
158
+ });
159
+ }
160
+ const created = await createFields(fieldSetId, items, userId);
161
+ const full = formatFieldListResponse(orderKey, revNo, seqNo, stepSeqNo, resolved.rev.status, request.erpUser, created);
162
+ reply.status(201);
163
+ return mutationResult(request, reply, full, {
164
+ items: created.map((f) => ({ id: f.id, seqNo: f.seqNo })),
165
+ total: created.length,
166
+ _actions: full._actions,
167
+ });
168
+ },
169
+ });
170
+ // CREATE
171
+ app.post("/", {
172
+ schema: {
173
+ description: "Create a field for a step",
174
+ tags: ["Step Fields"],
175
+ params: ParamsSchema,
176
+ body: CreateFieldSchema,
177
+ response: {
178
+ 201: SeqNoCreateResponseSchema,
179
+ 404: ErrorResponseSchema,
180
+ 409: ErrorResponseSchema,
181
+ },
182
+ },
183
+ preHandler: requirePermission("order_planner"),
184
+ handler: async (request, reply) => {
185
+ const { orderKey, revNo, seqNo, stepSeqNo } = request.params;
186
+ const { seqNo: requestedSeqNo, label, type, isArray, required, } = request.body;
187
+ const userId = request.erpUser.id;
188
+ const resolved = await resolveStep(orderKey, revNo, seqNo, stepSeqNo);
189
+ if (!resolved) {
190
+ return notFound(reply, "Step not found");
191
+ }
192
+ if (resolved.rev.status !== RevisionStatus.draft) {
193
+ return conflict(reply, `Cannot add fields to a ${resolved.rev.status} revision`);
194
+ }
195
+ // Ensure step has a field set
196
+ let fieldSetId = resolved.step.fieldSetId;
197
+ if (!fieldSetId) {
198
+ fieldSetId = await ensureFieldSet(null, userId);
199
+ await erpDb.step.update({
200
+ where: { id: resolved.step.id },
201
+ data: { fieldSetId },
202
+ });
203
+ }
204
+ const field = await createField(fieldSetId, { seqNo: requestedSeqNo, label, type, isArray, required }, userId);
205
+ const full = formatField(orderKey, revNo, seqNo, stepSeqNo, resolved.rev.status, request.erpUser, field);
206
+ reply.status(201);
207
+ return mutationResult(request, reply, full, {
208
+ id: full.id,
209
+ seqNo: full.seqNo,
210
+ _links: full._links,
211
+ _actions: full._actions,
212
+ });
213
+ },
214
+ });
215
+ // GET by fieldSeqNo
216
+ app.get("/:fieldSeqNo", {
217
+ schema: {
218
+ description: "Get a step field by sequence number",
219
+ tags: ["Step Fields"],
220
+ params: FieldParamsSchema,
221
+ response: {
222
+ 200: FieldSchema,
223
+ 404: ErrorResponseSchema,
224
+ },
225
+ },
226
+ handler: async (request, reply) => {
227
+ const { orderKey, revNo, seqNo, stepSeqNo, fieldSeqNo } = request.params;
228
+ const resolved = await resolveStep(orderKey, revNo, seqNo, stepSeqNo);
229
+ if (!resolved) {
230
+ return notFound(reply, "Step not found");
231
+ }
232
+ if (!resolved.step.fieldSetId) {
233
+ return notFound(reply, `Field ${fieldSeqNo} not found`);
234
+ }
235
+ const field = await getField(resolved.step.fieldSetId, fieldSeqNo);
236
+ if (!field) {
237
+ return notFound(reply, `Field ${fieldSeqNo} not found`);
238
+ }
239
+ return formatField(orderKey, revNo, seqNo, stepSeqNo, resolved.rev.status, request.erpUser, field);
240
+ },
241
+ });
242
+ // UPDATE (draft only)
243
+ app.put("/:fieldSeqNo", {
244
+ schema: {
245
+ description: "Update a step field (draft revision only)",
246
+ tags: ["Step Fields"],
247
+ params: FieldParamsSchema,
248
+ body: UpdateFieldSchema,
249
+ response: {
250
+ 200: MutateResponseSchema,
251
+ 404: ErrorResponseSchema,
252
+ 409: ErrorResponseSchema,
253
+ },
254
+ },
255
+ preHandler: requirePermission("order_planner"),
256
+ handler: async (request, reply) => {
257
+ const { orderKey, revNo, seqNo, stepSeqNo, fieldSeqNo } = request.params;
258
+ const { label, type, isArray, required, seqNo: newSeqNo } = request.body;
259
+ const userId = request.erpUser.id;
260
+ const resolved = await resolveStep(orderKey, revNo, seqNo, stepSeqNo);
261
+ if (!resolved) {
262
+ return notFound(reply, "Step not found");
263
+ }
264
+ if (resolved.rev.status !== RevisionStatus.draft) {
265
+ return conflict(reply, `Cannot update fields on a ${resolved.rev.status} revision`);
266
+ }
267
+ if (!resolved.step.fieldSetId) {
268
+ return notFound(reply, `Field ${fieldSeqNo} not found`);
269
+ }
270
+ const existing = await findExistingField(resolved.step.fieldSetId, fieldSeqNo);
271
+ if (!existing) {
272
+ return notFound(reply, `Field ${fieldSeqNo} not found`);
273
+ }
274
+ const field = await updateField(existing.id, { label, type, isArray, required, seqNo: newSeqNo }, userId);
275
+ const full = formatField(orderKey, revNo, seqNo, stepSeqNo, resolved.rev.status, request.erpUser, field);
276
+ return mutationResult(request, reply, full, {
277
+ _actions: full._actions,
278
+ });
279
+ },
280
+ });
281
+ // DELETE (draft only)
282
+ app.delete("/:fieldSeqNo", {
283
+ schema: {
284
+ description: "Delete a step field (draft revision only)",
285
+ tags: ["Step Fields"],
286
+ params: FieldParamsSchema,
287
+ response: {
288
+ 204: z.void(),
289
+ 404: ErrorResponseSchema,
290
+ 409: ErrorResponseSchema,
291
+ },
292
+ },
293
+ preHandler: requirePermission("order_planner"),
294
+ handler: async (request, reply) => {
295
+ const { orderKey, revNo, seqNo, stepSeqNo, fieldSeqNo } = request.params;
296
+ const resolved = await resolveStep(orderKey, revNo, seqNo, stepSeqNo);
297
+ if (!resolved) {
298
+ return notFound(reply, "Step not found");
299
+ }
300
+ if (resolved.rev.status !== RevisionStatus.draft) {
301
+ return conflict(reply, `Cannot delete fields on a ${resolved.rev.status} revision`);
302
+ }
303
+ if (!resolved.step.fieldSetId) {
304
+ return notFound(reply, `Field ${fieldSeqNo} not found`);
305
+ }
306
+ const existing = await findExistingField(resolved.step.fieldSetId, fieldSeqNo);
307
+ if (!existing) {
308
+ return notFound(reply, `Field ${fieldSeqNo} not found`);
309
+ }
310
+ await deleteField(existing.id);
311
+ reply.status(204);
312
+ },
313
+ });
314
+ }
315
+ //# sourceMappingURL=step-fields.js.map
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ export default function stepRunFieldRoutes(fastify: FastifyInstance): void;
3
+ //# sourceMappingURL=step-run-fields.d.ts.map