Skip to main content

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:

  1. Verify all components are available
  2. Assemble 100 widgets
  3. Track component consumption
  4. Record finished goods production
  5. 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:

  1. Reduce production quantity: Assemble only 95 units (matches motor availability)
  2. Wait for components: Delay assembly until motors arrive
  3. Partial assembly: Assemble 95 now, 5 later
  4. 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:

  1. Validate BOM: Verify BOM exists and is active
  2. Explode Components: Calculate actual requirements (95 units)
  3. Create Transaction: Assembly transaction with details
  4. Add Component Lines: One line per component (consumption)
  5. Add Production Line: One line for finished goods (production)
  6. Commit Transaction: Save to database
  7. Dispatch Events: Trigger inventory updates
  8. 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

  1. BOM Exists: Parent item must have active BOM
  2. BOM Active: BOM cannot be archived
  3. Quantity Positive: Production quantity must be > 0
  4. Location Operational: Assembly location must be operational
  5. Components Stockable: All components must be stockable items
  6. Components Active: All components must be active

Assembly-Time Validations

  1. Component Availability: Sufficient inventory for all components
  2. Negative Stock Check: If not allowed, prevent negative inventory
  3. Location Tracking: If required, ensure location specified
  4. 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

Last Updated: 2025-10-24 | Status: Active | Version: 1.0