Assembly Workflow - End-to-End Process
Overview
The Assembly Workflow is a complete end-to-end business process for manufacturing finished goods from component items using a Bill of Materials (BOM). This process involves component explosion, availability checking, component consumption, and finished goods production with complete audit trail.
Business Context
Manufacturing Scenario:
A company manufactures widgets. Each widget requires:
- 1 Steel Frame
- 1 Motor
- 8 Bolts (M10)
- 0.5 Liters of Paint
- 1 Packaging Box
The production manager needs to:
- Verify all components are available
- Assemble 100 widgets
- Track component consumption
- Record finished goods production
- Maintain complete audit trail
Process Participants
- Production Manager: Initiates assembly
- System: Validates availability, creates transactions
- BOM: Defines component requirements
- Inventory: Tracks component consumption and production
- Audit Trail: Records all operations
Complete Workflow
Phase 1: Preparation
Phase 2: Availability Check
Phase 3: Assembly Execution
Detailed Steps
Step 1: Load BOM and Calculate Requirements
Purpose: Understand what components are needed
GET /api/boms/{bomId}
Response:
{
"id": "bom-widget-001",
"name": "Standard Widget Assembly",
"parentItemId": "widget-001-id",
"lines": [
{
"componentItemId": "steel-frame-id",
"componentItemName": "Steel Frame",
"quantity": 1.0,
"unitSymbol": "EA"
},
{
"componentItemId": "motor-id",
"componentItemName": "Motor",
"quantity": 1.0,
"unitSymbol": "EA"
},
{
"componentItemId": "bolt-m10-id",
"componentItemName": "Bolt M10",
"quantity": 8.0,
"unitSymbol": "EA"
},
{
"componentItemId": "paint-id",
"componentItemName": "Paint - Blue",
"quantity": 0.5,
"unitSymbol": "L"
},
{
"componentItemId": "packaging-id",
"componentItemName": "Packaging Box",
"quantity": 1.0,
"unitSymbol": "EA"
}
]
}
Calculation (for 100 units):
Steel Frame: 1.0 × 100 = 100 EA
Motor: 1.0 × 100 = 100 EA
Bolt M10: 8.0 × 100 = 800 EA
Paint: 0.5 × 100 = 50 L
Packaging: 1.0 × 100 = 100 EA
Step 2: Check Component Availability
Purpose: Verify sufficient inventory exists
GET /api/inventory/available?itemId={steel-frame-id}&locationId={production-location-id}
For each component:
{
"itemId": "steel-frame-id",
"itemNumber": "RM-STEEL-001",
"itemName": "Steel Frame",
"locationId": "production-location-id",
"locationName": "Production Floor",
"availableQuantity": 150.0,
"unitSymbol": "EA",
"unitName": "Each"
}
Availability Check:
Component Required Available Status
Steel Frame 100 EA 150 EA ✓ OK (50 spare)
Motor 100 EA 95 EA ✗ SHORT (5 needed)
Bolt M10 800 EA 1000 EA ✓ OK (200 spare)
Paint 50 L 60 L ✓ OK (10 spare)
Packaging 100 EA 100 EA ✓ OK (exact)
Result: Cannot proceed - Motor shortage of 5 units
Step 3a: Handle Shortage (if any)
Options:
- Reduce production quantity: Assemble only 95 units (matches motor availability)
- Wait for components: Delay assembly until motors arrive
- Partial assembly: Assemble 95 now, 5 later
- Substitute: Use alternate motor (if BOM allows)
Decision: Reduce production to 95 units
Step 3b: Execute Assembly
Purpose: Create assembly transaction and update inventory
POST /api/assembly/assemble
Content-Type: application/json
Request:
{
"bomId": "bom-widget-001",
"producedItemId": "widget-001-id",
"producedQuantity": 95.0,
"producedUnitOfMeasureId": "unit-each-id",
"assemblyLocationId": "production-location-id",
"transactionDate": "2025-01-24T10:00:00Z",
"reason": "Production run #2025-001 - Standard widget manufacturing"
}
System Processing:
- Validate BOM: Verify BOM exists and is active
- Explode Components: Calculate actual requirements (95 units)
- Create Transaction: Assembly transaction with details
- Add Component Lines: One line per component (consumption)
- Add Production Line: One line for finished goods (production)
- Commit Transaction: Save to database
- Dispatch Events: Trigger inventory updates
- Update Inventory: Consume components, produce finished goods
Step 4: Inventory Updates
Component Consumption (decreases):
Steel Frame: -95 EA (150 → 55)
Motor: -95 EA (95 → 0)
Bolt M10: -760 EA (1000 → 240)
Paint: -47.5 L (60 → 12.5)
Packaging: -95 EA (100 → 5)
Finished Goods Production (increases):
Widget: +95 EA (0 → 95)
Step 5: Audit Trail
Transaction Record Created:
{
"id": "transaction-20250124-001",
"transactionType": "Assembly",
"transactionDate": "2025-01-24T10:00:00Z",
"reason": "Production run #2025-001",
"assemblyDetails": {
"bomId": "bom-widget-001",
"bomName": "Standard Widget Assembly",
"producedItemId": "widget-001-id",
"producedItemNumber": "WIDGET-001",
"producedQuantity": 95.0,
"assemblyLocationId": "production-location-id"
},
"lines": [
{
"itemId": "steel-frame-id",
"quantity": -95.0,
"unitSymbol": "EA",
"direction": "Consumed"
},
{
"itemId": "motor-id",
"quantity": -95.0,
"unitSymbol": "EA",
"direction": "Consumed"
},
{
"itemId": "bolt-m10-id",
"quantity": -760.0,
"unitSymbol": "EA",
"direction": "Consumed"
},
{
"itemId": "paint-id",
"quantity": -47.5,
"unitSymbol": "L",
"direction": "Consumed"
},
{
"itemId": "packaging-id",
"quantity": -95.0,
"unitSymbol": "EA",
"direction": "Consumed"
},
{
"itemId": "widget-001-id",
"quantity": 95.0,
"unitSymbol": "EA",
"direction": "Produced"
}
],
"createdBy": "production.manager@company.com",
"createdDate": "2025-01-24T10:00:00Z"
}
Business Validations
Pre-Assembly Validations
- BOM Exists: Parent item must have active BOM
- BOM Active: BOM cannot be archived
- Quantity Positive: Production quantity must be > 0
- Location Operational: Assembly location must be operational
- Components Stockable: All components must be stockable items
- Components Active: All components must be active
Assembly-Time Validations
- Component Availability: Sufficient inventory for all components
- Negative Stock Check: If not allowed, prevent negative inventory
- Location Tracking: If required, ensure location specified
- Unit Compatibility: Component units match item unit class
Error Scenarios
Scenario 1: Insufficient Components
Problem: Not enough motor inventory (need 100, have 95)
System Response:
{
"error": "Insufficient inventory",
"details": [
{
"componentId": "motor-id",
"componentName": "Motor",
"required": 100.0,
"available": 95.0,
"shortage": 5.0,
"unitSymbol": "EA"
}
],
"suggestions": [
"Reduce production quantity to 95 units",
"Wait for motor delivery",
"Transfer motors from another location"
]
}
Scenario 2: BOM Not Found
Problem: Parent item doesn't have BOM defined
System Response:
{
"error": "BOM not found",
"message": "No Bill of Materials found for item 'WIDGET-001'",
"action": "Create BOM before attempting assembly"
}
Scenario 3: Archived BOM
Problem: BOM was archived
System Response:
{
"error": "BOM inactive",
"message": "BOM 'Standard Widget Assembly' is archived and cannot be used",
"action": "Unarchive BOM or create new BOM"
}
User Interface Considerations
Assembly Screen Layout
┌─────────────────────────────────────────────────────────┐
│ Assembly: Premium Widget │
├─────────────────────────────────────────────────────────┤
│ Production Quantity: [100] EA │
│ Assembly Location: [Production Floor ▼] │
│ Reason: [Production run #2025-001] │
├─────────────────────────────────────────────────────────┤
│ Component Requirements: │
│ │
│ Component Required Available Status │
│ ─────────────────────────────────────────────────── │
│ Steel Frame 100 EA 150 EA ✓ OK │
│ Motor 100 EA 95 EA ✗ SHORT (-5) │
│ Bolt M10 800 EA 1000 EA ✓ OK │
│ Paint 50 L 60 L ✓ OK │
│ Packaging 100 EA 100 EA ✓ OK │
│ │
│ [✗] Cannot assemble: Motor shortage of 5 units │
│ │
│ Suggestions: │
│ • Reduce production to 95 units │
│ • Transfer 5 motors from Warehouse B │
│ • Wait for motor delivery (ETA: tomorrow) │
│ │
│ [Cancel] [Check Other Locations] [Assemble 95] │
└─────────────────────────────────────────────────────────┘
Integration Points
With BOM Module
- BOM Definition: Provides component requirements
- Component Explosion: Calculates material needs
- BOM Validation: Ensures BOM is valid and active
With Inventory Module
- Availability Check: Verifies component inventory
- Consumption Tracking: Decreases component quantities
- Production Tracking: Increases finished goods quantities
- Multi-Location Support: Can source from multiple locations
With Transaction Module
- Transaction Creation: Creates immutable assembly record
- Audit Trail: Complete history of what, when, who, why
- Event Generation: Triggers reactive inventory updates
With Finance Module (Future)
- Cost Calculation: Standard cost based on components
- GL Posting: WIP to Finished Goods journal entries
- Variance Analysis: Actual vs standard cost differences
Best Practices
1. Always Check Availability First
// Don't submit assembly without checking
async function initiateAssembly(bomId, quantity) {
// 1. Get BOM
const bom = await getBOM(bomId);
// 2. Calculate requirements
const requirements = explode(bom, quantity);
// 3. Check availability
const availability = await checkAvailability(requirements);
// 4. Only proceed if all available
if (availability.allAvailable) {
await submitAssembly(bomId, quantity);
} else {
showShortageReport(availability.shortages);
}
}
2. Provide Clear Feedback
- Show component requirements clearly
- Highlight shortages prominently
- Offer actionable suggestions
- Display real-time availability
3. Handle Partial Availability
- Allow production quantity adjustment
- Suggest alternate locations
- Support split assemblies
- Track partial completions
4. Maintain Audit Trail
- Record reason for assembly
- Capture production run numbers
- Link to work orders (if applicable)
- Track operator/manager
Performance Considerations
Large BOMs (Many Components)
- Load BOM with all components in single query
- Check availability in parallel for all components
- Use batch inventory updates
- Cache BOM data when possible
High-Volume Production
- Support batch assembly operations
- Queue assembly transactions
- Process inventory updates asynchronously
- Use optimistic concurrency control
Related Documentation
- BOM Aggregate - BOM structure
- Transaction Aggregate - Assembly transactions
- Assembly API - API endpoints
- BOM API - BOM management
Last Updated: 2025-10-24 | Status: Active | Version: 1.0