@happyvertical/smrt-manufacturing 0.53.4 → 0.53.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/AGENTS.md +58 -7
  2. package/README.md +228 -4
  3. package/agents/multilevel-and-runs.md +28 -0
  4. package/dist/collections/AssemblyCollection.d.ts +15 -0
  5. package/dist/collections/AssemblyCollection.d.ts.map +1 -0
  6. package/dist/collections/OperationCollection.d.ts +20 -0
  7. package/dist/collections/OperationCollection.d.ts.map +1 -0
  8. package/dist/collections/ProductionRunCollection.d.ts +15 -0
  9. package/dist/collections/ProductionRunCollection.d.ts.map +1 -0
  10. package/dist/collections/ProductionRunCompletionCollection.d.ts +14 -0
  11. package/dist/collections/ProductionRunCompletionCollection.d.ts.map +1 -0
  12. package/dist/collections/RoutingStepCollection.d.ts +15 -0
  13. package/dist/collections/RoutingStepCollection.d.ts.map +1 -0
  14. package/dist/collections/index.d.ts +5 -0
  15. package/dist/collections/index.d.ts.map +1 -1
  16. package/dist/index.d.ts +23 -5
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +1660 -42
  19. package/dist/index.js.map +1 -1
  20. package/dist/manifest.json +1910 -161
  21. package/dist/models/Assembly.d.ts +62 -0
  22. package/dist/models/Assembly.d.ts.map +1 -0
  23. package/dist/models/BillOfMaterials.d.ts +12 -4
  24. package/dist/models/BillOfMaterials.d.ts.map +1 -1
  25. package/dist/models/BomLine.d.ts +11 -5
  26. package/dist/models/BomLine.d.ts.map +1 -1
  27. package/dist/models/Operation.d.ts +59 -0
  28. package/dist/models/Operation.d.ts.map +1 -0
  29. package/dist/models/ProductionRun.d.ts +67 -0
  30. package/dist/models/ProductionRun.d.ts.map +1 -0
  31. package/dist/models/ProductionRunCompletion.d.ts +36 -0
  32. package/dist/models/ProductionRunCompletion.d.ts.map +1 -0
  33. package/dist/models/RoutingStep.d.ts +46 -0
  34. package/dist/models/RoutingStep.d.ts.map +1 -0
  35. package/dist/models/index.d.ts +5 -0
  36. package/dist/models/index.d.ts.map +1 -1
  37. package/dist/operation-types.d.ts +108 -0
  38. package/dist/operation-types.d.ts.map +1 -0
  39. package/dist/production-run-types.d.ts +100 -0
  40. package/dist/production-run-types.d.ts.map +1 -0
  41. package/dist/quantity.d.ts +36 -0
  42. package/dist/quantity.d.ts.map +1 -0
  43. package/dist/services/AssemblyService.d.ts +222 -0
  44. package/dist/services/AssemblyService.d.ts.map +1 -0
  45. package/dist/services/BomService.d.ts +108 -5
  46. package/dist/services/BomService.d.ts.map +1 -1
  47. package/dist/services/OperationService.d.ts +48 -0
  48. package/dist/services/OperationService.d.ts.map +1 -0
  49. package/dist/services/ProductionRunService.d.ts +123 -0
  50. package/dist/services/ProductionRunService.d.ts.map +1 -0
  51. package/dist/services/ProductionService.d.ts +11 -0
  52. package/dist/services/ProductionService.d.ts.map +1 -1
  53. package/dist/services/RoutingService.d.ts +50 -0
  54. package/dist/services/RoutingService.d.ts.map +1 -0
  55. package/dist/services/index.d.ts +5 -0
  56. package/dist/services/index.d.ts.map +1 -1
  57. package/dist/services/structure-walk.d.ts +77 -0
  58. package/dist/services/structure-walk.d.ts.map +1 -0
  59. package/dist/smrt-knowledge.json +1771 -207
  60. package/dist/svelte/components/AssemblyForm.svelte +69 -0
  61. package/dist/svelte/components/AssemblyForm.svelte.d.ts +38 -0
  62. package/dist/svelte/components/AssemblyForm.svelte.d.ts.map +1 -0
  63. package/dist/svelte/components/AssemblyList.svelte +229 -0
  64. package/dist/svelte/components/AssemblyList.svelte.d.ts +28 -0
  65. package/dist/svelte/components/AssemblyList.svelte.d.ts.map +1 -0
  66. package/dist/svelte/components/BomEditor.svelte +575 -0
  67. package/dist/svelte/components/BomEditor.svelte.d.ts +29 -0
  68. package/dist/svelte/components/BomEditor.svelte.d.ts.map +1 -0
  69. package/dist/svelte/components/BomStructureTree.svelte +164 -0
  70. package/dist/svelte/components/BomStructureTree.svelte.d.ts +16 -0
  71. package/dist/svelte/components/BomStructureTree.svelte.d.ts.map +1 -0
  72. package/dist/svelte/components/OperationForm.svelte +258 -0
  73. package/dist/svelte/components/OperationForm.svelte.d.ts +17 -0
  74. package/dist/svelte/components/OperationForm.svelte.d.ts.map +1 -0
  75. package/dist/svelte/components/OperationList.svelte +170 -0
  76. package/dist/svelte/components/OperationList.svelte.d.ts +17 -0
  77. package/dist/svelte/components/OperationList.svelte.d.ts.map +1 -0
  78. package/dist/svelte/components/ProductionRunList.svelte +213 -0
  79. package/dist/svelte/components/ProductionRunList.svelte.d.ts +18 -0
  80. package/dist/svelte/components/ProductionRunList.svelte.d.ts.map +1 -0
  81. package/dist/svelte/components/RequirementsTree.svelte +125 -0
  82. package/dist/svelte/components/RequirementsTree.svelte.d.ts +13 -0
  83. package/dist/svelte/components/RequirementsTree.svelte.d.ts.map +1 -0
  84. package/dist/svelte/components/RequirementsTreeLevel.svelte +120 -0
  85. package/dist/svelte/components/RequirementsTreeLevel.svelte.d.ts +12 -0
  86. package/dist/svelte/components/RequirementsTreeLevel.svelte.d.ts.map +1 -0
  87. package/dist/svelte/i18n.d.ts +119 -0
  88. package/dist/svelte/i18n.d.ts.map +1 -0
  89. package/dist/svelte/i18n.js +119 -0
  90. package/dist/svelte/index.d.ts +33 -0
  91. package/dist/svelte/index.d.ts.map +1 -0
  92. package/dist/svelte/index.js +34 -0
  93. package/dist/svelte/types.d.ts +257 -0
  94. package/dist/svelte/types.d.ts.map +1 -0
  95. package/dist/svelte/types.js +249 -0
  96. package/dist/tenant-scope.d.ts +25 -0
  97. package/dist/tenant-scope.d.ts.map +1 -0
  98. package/dist/types.d.ts +207 -3
  99. package/dist/types.d.ts.map +1 -1
  100. package/dist/types.js +13 -1
  101. package/dist/types.js.map +1 -1
  102. package/dist/ui.d.ts +17 -0
  103. package/dist/ui.d.ts.map +1 -0
  104. package/dist/ui.js +94 -0
  105. package/dist/ui.js.map +1 -0
  106. package/package.json +41 -11
@@ -0,0 +1,119 @@
1
+ import { defineMessages } from '@happyvertical/smrt-ui/i18n';
2
+ /**
3
+ * Message catalog for the manufacturing components. Keys are
4
+ * `manufacturing.<component>.<key>`.
5
+ */
6
+ export const M = defineMessages({
7
+ 'manufacturing.operation_list.caption': 'Operations',
8
+ 'manufacturing.operation_list.empty': 'No operations',
9
+ 'manufacturing.operation_list.code': 'Code',
10
+ 'manufacturing.operation_list.name': 'Name',
11
+ 'manufacturing.operation_list.category': 'Category',
12
+ 'manufacturing.operation_list.status': 'Status',
13
+ 'manufacturing.operation_list.actions': 'Actions',
14
+ 'manufacturing.operation_list.active': 'Active',
15
+ 'manufacturing.operation_list.retired': 'Retired',
16
+ 'manufacturing.operation_list.none': 'None',
17
+ 'manufacturing.operation_list.select_aria': 'Edit operation: {name}',
18
+ 'manufacturing.operation_list.retire': 'Retire',
19
+ 'manufacturing.operation_list.retire_aria': 'Retire operation: {name}',
20
+ 'manufacturing.operation_list.reinstate': 'Reinstate',
21
+ 'manufacturing.operation_list.reinstate_aria': 'Reinstate operation: {name}',
22
+ 'manufacturing.operation_form.code': 'Code',
23
+ 'manufacturing.operation_form.code_edit_help': 'The code cannot be changed.',
24
+ 'manufacturing.operation_form.name': 'Name',
25
+ 'manufacturing.operation_form.category': 'Category',
26
+ 'manufacturing.operation_form.category_help': 'Optional. Groups operations in lists.',
27
+ 'manufacturing.operation_form.qualification': 'Required qualification',
28
+ 'manufacturing.operation_form.qualification_help': 'Optional. The id of the qualification a worker needs to start this operation.',
29
+ 'manufacturing.operation_form.submit_add': 'Add operation',
30
+ 'manufacturing.operation_form.submit_edit': 'Save changes',
31
+ 'manufacturing.operation_form.saving': 'Saving...',
32
+ 'manufacturing.operation_form.cancel': 'Cancel',
33
+ 'manufacturing.operation_form.error_code': 'Enter a code.',
34
+ 'manufacturing.operation_form.error_name': 'Enter a name.',
35
+ 'manufacturing.assembly_list.caption': 'Assemblies',
36
+ 'manufacturing.assembly_list.empty': 'No assemblies',
37
+ 'manufacturing.assembly_list.name': 'Name',
38
+ 'manufacturing.assembly_list.assembly': 'Assembly',
39
+ 'manufacturing.assembly_list.unnamed': 'Unnamed assembly',
40
+ 'manufacturing.assembly_list.part_reference': 'Part reference',
41
+ 'manufacturing.assembly_list.sku': 'SKU',
42
+ 'manufacturing.assembly_list.price': 'Price',
43
+ 'manufacturing.assembly_list.labour': 'Labour',
44
+ 'manufacturing.assembly_list.bill': 'Bill of materials',
45
+ 'manufacturing.assembly_list.select_aria': 'Open assembly: {name}',
46
+ 'manufacturing.assembly_list.none': 'None',
47
+ 'manufacturing.assembly_list.bill_active': 'Version {version}',
48
+ 'manufacturing.assembly_list.bill_missing': 'No active bill',
49
+ 'manufacturing.labour.minutes': '{minutes} min',
50
+ 'manufacturing.labour.hours_minutes': '{hours} h {minutes} min',
51
+ 'manufacturing.labour.not_estimated': 'Not estimated',
52
+ 'manufacturing.kind.assembly': 'Sub-assembly',
53
+ 'manufacturing.kind.material': 'Material',
54
+ 'manufacturing.kind.bought': 'Bought item',
55
+ 'manufacturing.kind.missing': 'Missing',
56
+ 'manufacturing.bom_editor.caption': 'Bill of materials',
57
+ 'manufacturing.bom_editor.empty': 'This bill has no lines yet',
58
+ 'manufacturing.bom_editor.component': 'Component',
59
+ 'manufacturing.bom_editor.kind': 'Kind',
60
+ 'manufacturing.bom_editor.qty_per_unit': 'Quantity per unit',
61
+ 'manufacturing.bom_editor.uom': 'Unit',
62
+ 'manufacturing.bom_editor.waste_percent': 'Waste %',
63
+ 'manufacturing.bom_editor.actions': 'Actions',
64
+ 'manufacturing.bom_editor.qty_aria': 'Quantity per unit for {component}',
65
+ 'manufacturing.bom_editor.uom_aria': 'Unit for {component}',
66
+ 'manufacturing.bom_editor.waste_aria': 'Waste percent for {component}',
67
+ 'manufacturing.bom_editor.save': 'Save',
68
+ 'manufacturing.bom_editor.save_aria': 'Save line: {component}',
69
+ 'manufacturing.bom_editor.remove': 'Remove',
70
+ 'manufacturing.bom_editor.remove_aria': 'Remove line: {component}',
71
+ 'manufacturing.bom_editor.has_bill': 'Has its own bill',
72
+ 'manufacturing.bom_editor.no_bill': 'No active bill',
73
+ 'manufacturing.bom_editor.show_bill': 'Show bill',
74
+ 'manufacturing.bom_editor.hide_bill': 'Hide bill',
75
+ 'manufacturing.bom_editor.show_bill_aria': 'Show the bill of {component}',
76
+ 'manufacturing.bom_editor.hide_bill_aria': 'Hide the bill of {component}',
77
+ 'manufacturing.bom_editor.sub_bill_label': 'Bill of {component}',
78
+ 'manufacturing.bom_editor.loading': 'Loading bill…',
79
+ 'manufacturing.bom_editor.load_failed': 'The bill could not be loaded',
80
+ 'manufacturing.bom_editor.add_heading': 'Add a line',
81
+ 'manufacturing.bom_editor.choose_component': 'Choose a component',
82
+ 'manufacturing.bom_editor.add': 'Add line',
83
+ 'manufacturing.bom_editor.error_component': 'Choose a component.',
84
+ 'manufacturing.bom_editor.error_qty': 'Enter a quantity greater than zero.',
85
+ 'manufacturing.bom_editor.error_uom': 'Enter a unit.',
86
+ 'manufacturing.bom_editor.error_waste': 'Enter a waste percent of zero or more.',
87
+ 'manufacturing.production_run_list.caption': 'Production runs',
88
+ 'manufacturing.production_run_list.empty': 'No production runs',
89
+ 'manufacturing.production_run_list.build': 'Build',
90
+ 'manufacturing.production_run_list.progress': 'Progress',
91
+ 'manufacturing.production_run_list.status': 'Status',
92
+ 'manufacturing.production_run_list.report': 'Report completion',
93
+ 'manufacturing.production_run_list.progress_value': '{completed} of {target} done',
94
+ 'manufacturing.production_run_list.qty_aria': 'Quantity completed for {label}',
95
+ 'manufacturing.production_run_list.submit': 'Report',
96
+ 'manufacturing.production_run_list.submit_aria': 'Report a completion for {label}',
97
+ 'manufacturing.production_run_list.error_qty': 'Enter a quantity greater than zero.',
98
+ 'manufacturing.production_run_list.error_too_many': 'Only {remaining} left to build.',
99
+ 'manufacturing.production_run_list.error_failed': 'The completion could not be recorded.',
100
+ 'manufacturing.production_run_status.planned': 'Planned',
101
+ 'manufacturing.production_run_status.in_progress': 'In progress',
102
+ 'manufacturing.production_run_status.done': 'Done',
103
+ 'manufacturing.production_run_status.cancelled': 'Cancelled',
104
+ 'manufacturing.requirements.label': 'Requirements',
105
+ 'manufacturing.requirements.sub_label': 'Building {component} takes',
106
+ 'manufacturing.requirements.required': 'Required: {qty} {uom}',
107
+ 'manufacturing.requirements.available': 'Available: {qty}',
108
+ 'manufacturing.requirements.short': 'Short: {qty}',
109
+ 'manufacturing.requirements.covered': 'Covered',
110
+ 'manufacturing.requirements.buildable': 'Can be built from its bill',
111
+ 'manufacturing.requirements.no_bill': 'No active bill',
112
+ 'manufacturing.requirements.totals_caption': 'Totals',
113
+ 'manufacturing.requirements.component': 'Component',
114
+ 'manufacturing.requirements.total_required': 'Required',
115
+ 'manufacturing.requirements.uom': 'Unit',
116
+ 'manufacturing.requirements.total_short': 'Short',
117
+ 'manufacturing.requirements.empty': 'Nothing is required',
118
+ 'manufacturing.requirements.unnamed': 'Unknown component',
119
+ });
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @happyvertical/smrt-manufacturing/svelte
3
+ *
4
+ * Props-driven Svelte 5 surfaces: the managed list of operations (a list with
5
+ * retire and reinstate, and a form), and assemblies (a list, a policy-driven
6
+ * form, and a bill-of-materials editor whose sub-assemblies expand to their own
7
+ * bills), production runs with their progress and completion reporting, and
8
+ * the read-only exploded requirements of a bill. Hosts load data through the
9
+ * package services and collections and pass plain view objects.
10
+ * Auto-registers components with ModuleUIRegistry on import.
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ import type { ComponentProps } from 'svelte';
15
+ import AssemblyForm from './components/AssemblyForm.svelte';
16
+ import AssemblyList from './components/AssemblyList.svelte';
17
+ import BomEditor from './components/BomEditor.svelte';
18
+ import BomStructureTree from './components/BomStructureTree.svelte';
19
+ import OperationForm from './components/OperationForm.svelte';
20
+ import OperationList from './components/OperationList.svelte';
21
+ import ProductionRunList from './components/ProductionRunList.svelte';
22
+ import RequirementsTree from './components/RequirementsTree.svelte';
23
+ export { AssemblyForm, AssemblyList, BomEditor, BomStructureTree, OperationForm, OperationList, ProductionRunList, RequirementsTree, };
24
+ export type AssemblyFormProps = ComponentProps<typeof AssemblyForm>;
25
+ export type AssemblyListProps = ComponentProps<typeof AssemblyList>;
26
+ export type BomEditorProps = ComponentProps<typeof BomEditor>;
27
+ export type BomStructureTreeProps = ComponentProps<typeof BomStructureTree>;
28
+ export type OperationFormProps = ComponentProps<typeof OperationForm>;
29
+ export type OperationListProps = ComponentProps<typeof OperationList>;
30
+ export type ProductionRunListProps = ComponentProps<typeof ProductionRunList>;
31
+ export type RequirementsTreeProps = ComponentProps<typeof RequirementsTree>;
32
+ export { type AssemblyView, type BomComponentOption, type BomEditorLine, type BomLineDraft, type BomLineDraftField, type BomLineInput, type BomLineValidation, type CompletionQtyValidation, type ComponentKind, componentKindLabelKey, isProductionRunOpen, type OperationFormDraft, type OperationFormField, type OperationFormInitial, type OperationFormValidation, type OperationFormValues, type OperationView, operationStatusBadgeKey, type ProductionRunStatus, type ProductionRunView, productionRunStatusLabelKey, productionRunStatusTone, type RequirementLineView, type RequirementTotalView, splitLabourMinutes, toAssemblyView, toBomEditorLine, toBomEditorLines, toProductionRunView, toRequirementTotals, toRequirementTree, validateBomLineInput, validateCompletionQty, validateOperationForm, } from './types.js';
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,YAAY,MAAM,kCAAkC,CAAC;AAC5D,OAAO,YAAY,MAAM,kCAAkC,CAAC;AAC5D,OAAO,SAAS,MAAM,+BAA+B,CAAC;AACtD,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AACpE,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,iBAAiB,MAAM,uCAAuC,CAAC;AACtE,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AAEpE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AACpE,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AACpE,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9D,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE5E,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,aAAa,CAAC,CAAC;AACtE,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,aAAa,CAAC,CAAC;AACtE,MAAM,MAAM,sBAAsB,GAAG,cAAc,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9E,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE5E,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,uBAAuB,EACvB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,2BAA2B,EAC3B,uBAAuB,EACvB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @happyvertical/smrt-manufacturing/svelte
3
+ *
4
+ * Props-driven Svelte 5 surfaces: the managed list of operations (a list with
5
+ * retire and reinstate, and a form), and assemblies (a list, a policy-driven
6
+ * form, and a bill-of-materials editor whose sub-assemblies expand to their own
7
+ * bills), production runs with their progress and completion reporting, and
8
+ * the read-only exploded requirements of a bill. Hosts load data through the
9
+ * package services and collections and pass plain view objects.
10
+ * Auto-registers components with ModuleUIRegistry on import.
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ import { ModuleUIRegistry } from '@happyvertical/smrt-ui/registry';
15
+ import { MANUFACTURING_MODULE_META } from '../ui.js';
16
+ import AssemblyForm from './components/AssemblyForm.svelte';
17
+ import AssemblyList from './components/AssemblyList.svelte';
18
+ import BomEditor from './components/BomEditor.svelte';
19
+ import BomStructureTree from './components/BomStructureTree.svelte';
20
+ import OperationForm from './components/OperationForm.svelte';
21
+ import OperationList from './components/OperationList.svelte';
22
+ import ProductionRunList from './components/ProductionRunList.svelte';
23
+ import RequirementsTree from './components/RequirementsTree.svelte';
24
+ export { AssemblyForm, AssemblyList, BomEditor, BomStructureTree, OperationForm, OperationList, ProductionRunList, RequirementsTree, };
25
+ export { componentKindLabelKey, isProductionRunOpen, operationStatusBadgeKey, productionRunStatusLabelKey, productionRunStatusTone, splitLabourMinutes, toAssemblyView, toBomEditorLine, toBomEditorLines, toProductionRunView, toRequirementTotals, toRequirementTree, validateBomLineInput, validateCompletionQty, validateOperationForm, } from './types.js';
26
+ // Auto-register with ModuleUIRegistry
27
+ ModuleUIRegistry.registerModule(MANUFACTURING_MODULE_META);
28
+ ModuleUIRegistry.register('@happyvertical/smrt-manufacturing', 'operation-list', OperationList);
29
+ ModuleUIRegistry.register('@happyvertical/smrt-manufacturing', 'operation-form', OperationForm);
30
+ ModuleUIRegistry.register('@happyvertical/smrt-manufacturing', 'assembly-list', AssemblyList);
31
+ ModuleUIRegistry.register('@happyvertical/smrt-manufacturing', 'assembly-form', AssemblyForm);
32
+ ModuleUIRegistry.register('@happyvertical/smrt-manufacturing', 'bom-editor', BomEditor);
33
+ ModuleUIRegistry.register('@happyvertical/smrt-manufacturing', 'production-run-list', ProductionRunList);
34
+ ModuleUIRegistry.register('@happyvertical/smrt-manufacturing', 'requirements-tree', RequirementsTree);
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Serializable view types and pure helpers for the manufacturing components.
3
+ *
4
+ * Components take plain view objects (not model instances) so hosts can pass
5
+ * data across the server/client boundary.
6
+ */
7
+ import type { Assembly } from '../models/Assembly.js';
8
+ import type { ProductionRun, ProductionRunStatus } from '../models/ProductionRun.js';
9
+ import type { BillStructure, BillStructureLine, ComponentKind } from '../services/AssemblyService.js';
10
+ import type { Explosion, RequirementsPlan } from '../types.js';
11
+ /** One row of `OperationList`; an `Operation` satisfies it. */
12
+ export interface OperationView {
13
+ /** The `Operation` id. */
14
+ id: string;
15
+ code: string;
16
+ name: string;
17
+ category: string;
18
+ isActive: boolean;
19
+ /** Plain string id of the required qualification; empty or omitted for none. */
20
+ requiredQualificationId?: string | null;
21
+ }
22
+ /** Existing values passed to `OperationForm` when editing. */
23
+ export interface OperationFormInitial {
24
+ code: string;
25
+ name: string;
26
+ category: string;
27
+ requiredQualificationId: string | null;
28
+ }
29
+ /**
30
+ * What `OperationForm` hands to `onsubmit`; values are trimmed. A host maps a
31
+ * new operation onto `OperationService.define`, and an edit onto `rename` and
32
+ * `update` for the values that differ (the code never changes).
33
+ */
34
+ export interface OperationFormValues {
35
+ code: string;
36
+ name: string;
37
+ category: string;
38
+ requiredQualificationId: string;
39
+ }
40
+ /** A field `validateOperationForm` can reject. */
41
+ export type OperationFormField = 'code' | 'name';
42
+ /** Result of {@link validateOperationForm}. */
43
+ export type OperationFormValidation = {
44
+ ok: true;
45
+ values: OperationFormValues;
46
+ } | {
47
+ ok: false;
48
+ invalid: OperationFormField[];
49
+ };
50
+ /** The raw text `OperationForm` collects, before trimming and checks. */
51
+ export interface OperationFormDraft {
52
+ code: string;
53
+ name: string;
54
+ category: string;
55
+ requiredQualificationId: string;
56
+ }
57
+ /** Map an operation's state onto `StatusBadge` default color-scheme keys. */
58
+ export declare function operationStatusBadgeKey(isActive: boolean): string;
59
+ /** Trim a form draft and check the required fields: code and name. */
60
+ export declare function validateOperationForm(draft: Readonly<Partial<OperationFormDraft>>): OperationFormValidation;
61
+ export type { ComponentKind };
62
+ /** One row of {@link AssemblyList}. */
63
+ export interface AssemblyView {
64
+ /** The assembly id. */
65
+ id: string;
66
+ /** Display name. */
67
+ name: string;
68
+ /** The organization's drawing or part number; empty when none. */
69
+ partReference: string;
70
+ /** Codes of the assembly's SKUs, in the host's order. */
71
+ skuCodes: string[];
72
+ /** Catalog price in integer minor units (cents). */
73
+ price: number;
74
+ /** Labour to build one unit, in minutes; `0` when not estimated. */
75
+ estimatedLabourMinutes: number;
76
+ /** Version of the active bill, or `null` when the assembly has none. */
77
+ activeBomVersion: number | null;
78
+ }
79
+ /**
80
+ * Build an {@link AssemblyView} from an `Assembly` plus the facts the list
81
+ * shows that live on its neighbours: its SKU codes and its active bill.
82
+ */
83
+ export declare function toAssemblyView(assembly: Pick<Assembly, 'id' | 'name' | 'partReference' | 'price' | 'estimatedLabourMinutes'>, related?: {
84
+ skuCodes?: readonly string[];
85
+ activeBomVersion?: number | null;
86
+ }): AssemblyView;
87
+ /** One line of {@link BomEditor}. */
88
+ export interface BomEditorLine {
89
+ /** The bill line id. */
90
+ id: string;
91
+ /** The component SKU the line consumes. */
92
+ componentSkuId: string;
93
+ /** The component's product name, or its SKU code when that is unknown. */
94
+ componentName: string;
95
+ /** The component's SKU code; empty when the SKU is missing. */
96
+ skuCode: string;
97
+ /** What the component is. */
98
+ kind: ComponentKind;
99
+ /** Quantity per produced unit, before waste. */
100
+ qtyPerUnit: number;
101
+ /** Unit of measure. */
102
+ uom: string;
103
+ /** Expected waste, in percent. */
104
+ wastePercent: number;
105
+ /** Free-form notes. */
106
+ notes: string;
107
+ /**
108
+ * For a sub-assembly, the id of its own active bill; `null` when it has
109
+ * none, and for every other kind.
110
+ */
111
+ subBomId: string | null;
112
+ }
113
+ /** Adapt one resolved bill line for {@link BomEditor}. */
114
+ export declare function toBomEditorLine(entry: BillStructureLine): BomEditorLine;
115
+ /**
116
+ * Adapt a whole bill from `AssemblyService.getBillStructure` for
117
+ * {@link BomEditor}, keeping its line order.
118
+ */
119
+ export declare function toBomEditorLines(structure: BillStructure): BomEditorLine[];
120
+ /** A component the editor offers when adding a line. */
121
+ export interface BomComponentOption {
122
+ /** The component SKU id. */
123
+ skuId: string;
124
+ /** Text shown in the chooser, e.g. `Side panel (SP-100)`. */
125
+ label: string;
126
+ }
127
+ /** A bill line as the editor submits it, checked and trimmed. */
128
+ export interface BomLineDraft {
129
+ /** The component SKU id. */
130
+ componentSkuId: string;
131
+ /** Quantity per produced unit, greater than zero. */
132
+ qtyPerUnit: number;
133
+ /** Unit of measure, never empty. */
134
+ uom: string;
135
+ /** Expected waste in percent, zero or more. */
136
+ wastePercent: number;
137
+ }
138
+ /** A field of {@link BomLineDraft} that can fail validation. */
139
+ export type BomLineDraftField = keyof BomLineDraft;
140
+ /** The editor's raw input for one line, before validation. */
141
+ export interface BomLineInput {
142
+ /** Chosen component SKU id; empty when none is chosen. */
143
+ componentSkuId: string;
144
+ /** Quantity as typed. */
145
+ qtyPerUnit: string | number;
146
+ /** Unit as typed. */
147
+ uom: string;
148
+ /** Waste percent as typed; empty means zero. */
149
+ wastePercent: string | number;
150
+ }
151
+ /** The outcome of {@link validateBomLineInput}. */
152
+ export type BomLineValidation = {
153
+ ok: true;
154
+ value: BomLineDraft;
155
+ } | {
156
+ ok: false;
157
+ invalid: BomLineDraftField[];
158
+ };
159
+ /**
160
+ * Check one line's input: a component must be chosen, the quantity must be a
161
+ * number greater than zero, the unit must not be empty, and the waste percent
162
+ * must be a number of zero or more (empty counts as zero).
163
+ */
164
+ export declare function validateBomLineInput(input: BomLineInput): BomLineValidation;
165
+ /** The message key naming a {@link ComponentKind} in words. */
166
+ export declare function componentKindLabelKey(kind: ComponentKind): "manufacturing.kind.assembly" | "manufacturing.kind.material" | "manufacturing.kind.bought" | "manufacturing.kind.missing";
167
+ /** Split a labour estimate into whole hours and the remaining minutes. */
168
+ export declare function splitLabourMinutes(minutes: number): {
169
+ hours: number;
170
+ minutes: number;
171
+ };
172
+ export type { ProductionRunStatus };
173
+ /** One row of `ProductionRunList`. */
174
+ export interface ProductionRunView {
175
+ /** The run id. */
176
+ id: string;
177
+ /** What is being built, as the host names it (an assembly's name, say). */
178
+ label: string;
179
+ /** Units to build. */
180
+ targetQty: number;
181
+ /** Units reported done. */
182
+ completedQty: number;
183
+ /** The run's status. */
184
+ status: ProductionRunStatus;
185
+ }
186
+ /** Adapt a `ProductionRun` to a {@link ProductionRunView}, with the host's label. */
187
+ export declare function toProductionRunView(run: Pick<ProductionRun, 'id' | 'targetQty' | 'completedQty' | 'status'>, label: string): ProductionRunView;
188
+ /** The message key naming a run status in words. */
189
+ export declare function productionRunStatusLabelKey(status: ProductionRunStatus): "manufacturing.production_run_status.planned" | "manufacturing.production_run_status.in_progress" | "manufacturing.production_run_status.done" | "manufacturing.production_run_status.cancelled";
190
+ /** The `StatusBadge` tone for a run status. */
191
+ export declare function productionRunStatusTone(status: ProductionRunStatus): 'neutral' | 'info' | 'success' | 'warning';
192
+ /** `true` while a run can still take completions. */
193
+ export declare function isProductionRunOpen(status: ProductionRunStatus): boolean;
194
+ /** Result of {@link validateCompletionQty}. */
195
+ export type CompletionQtyValidation = {
196
+ ok: true;
197
+ qty: number;
198
+ } | {
199
+ ok: false;
200
+ reason: 'invalid' | 'too_many';
201
+ };
202
+ /**
203
+ * Check a typed completion quantity against what the run has left (the
204
+ * service checks again under its lock).
205
+ */
206
+ export declare function validateCompletionQty(raw: string, run: Pick<ProductionRunView, 'targetQty' | 'completedQty'>): CompletionQtyValidation;
207
+ /** One line of `RequirementsTree`, with the lines of its bill when opened. */
208
+ export interface RequirementLineView {
209
+ /** Unique within the tree: the bills above it plus the line id. */
210
+ key: string;
211
+ /** 1 for the top bill's lines. */
212
+ level: number;
213
+ /** Component name; empty when it cannot be resolved. */
214
+ name: string;
215
+ /** Component SKU code; empty when unknown. */
216
+ skuCode: string;
217
+ /** What the component is. */
218
+ kind: ComponentKind;
219
+ /** Quantity required for the run (net of stock in a plan). */
220
+ required: number;
221
+ /** The line's unit. */
222
+ uom: string;
223
+ /** Unallocated available stock; `null` for a gross explosion. */
224
+ available: number | null;
225
+ /** How much is short; `null` for a gross explosion. */
226
+ short: number | null;
227
+ /** A sub-assembly with an active bill. */
228
+ buildable: boolean;
229
+ /** The lines of this sub-assembly's bill that were walked. */
230
+ children: RequirementLineView[];
231
+ }
232
+ /** One row of the totals table of `RequirementsTree`. */
233
+ export interface RequirementTotalView {
234
+ /** The component SKU. */
235
+ componentSkuId: string;
236
+ /** Component name; empty when it cannot be resolved. */
237
+ name: string;
238
+ /** Component SKU code; empty when unknown. */
239
+ skuCode: string;
240
+ /** Total required, summed over the lines not opened. */
241
+ required: number;
242
+ /** The first line's unit. */
243
+ uom: string;
244
+ /** Total short; `null` for a gross explosion. */
245
+ short: number | null;
246
+ }
247
+ /**
248
+ * Nest the depth-first lines of an {@link Explosion} or a
249
+ * {@link RequirementsPlan} for `RequirementsTree`.
250
+ */
251
+ export declare function toRequirementTree(source: Pick<Explosion | RequirementsPlan, 'lines'>): RequirementLineView[];
252
+ /**
253
+ * The totals of an {@link Explosion} or a {@link RequirementsPlan}: every line
254
+ * not opened, summed per component SKU (first unit kept).
255
+ */
256
+ export declare function toRequirementTotals(source: Pick<Explosion | RequirementsPlan, 'lines'>): RequirementTotalView[];
257
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/svelte/types.ts"],"names":[],"mappings":"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"}