Skip to content

Placement Document Generation Flow

This flow describes how documents are generated in Salesforce for the placement workflow.

sequenceDiagram
    participant HM as Hiring Manager
    participant Worker
    participant Cruits
    participant SF as Salesforce

    Note over HM,Worker: Offer Phase
    HM->>Worker: Send offer
    Worker->>Cruits: Accept offer

    Note over Cruits,SF: Entity Creation & Sync
    Cruits->>Cruits: Create Placement
    Cruits->>Cruits: Create Employment Contract

    Cruits->>SF: Sync Placement to SF
    SF->>Cruits: Return Placement.salesforce_ref

    Cruits->>SF: Sync Employment Contract to SF
    SF->>Cruits: Return EmploymentContract.salesforce_ref

    Note over Cruits,SF: Document Generation (async, sequential per entity)

    par Placement + Worker Documents
        Note over Cruits,SF: After Placement gets salesforce_ref
        Cruits->>SF: Generate Uitzendbevestiging (Apex)
        SF->>SF: Create document from template
        Cruits->>Cruits: Create GeneratedPlacementDocument (empty file)

        Cruits->>SF: Generate Uitzendbevestiging DRAFT (Apex)
        SF->>SF: Create document from template
        Cruits->>Cruits: Create GeneratedPlacementDocument (empty file)

        Cruits->>SF: Generate Codeofconduct (Apex)
        SF->>SF: Create document from template
        Cruits->>Cruits: Create GeneratedContactDocument (empty file)

        Cruits->>SF: Generate ABU_Fair_Employment_Code (Apex)
        SF->>SF: Create document from template
        Cruits->>Cruits: Create GeneratedContactDocument (empty file)
    and Employment Contract Documents
        Note over Cruits,SF: After Employment Contract gets salesforce_ref
        Cruits->>SF: Generate Arbeidscontract fase A ZUB (Apex)
        SF->>SF: Create document from template
        Cruits->>Cruits: Create GeneratedEmploymentContractDocument (empty file)
    end

    Note over Cruits,SF: Manual Document Upload (later)
    HM->>SF: Download generated PDFs
    HM->>Cruits: Upload files via Django Admin
    Cruits->>Cruits: Set is_present_locally = True

Key Points

  1. Placement created → EmploymentContract created (via hook)
  2. Placement syncs to SF → gets salesforce_ref → Triggers document generation
  3. EmploymentContract syncs to SF → gets salesforce_ref → Triggers document generation
  4. Document generation happens in 2 parallel flows:
  5. Placement flow (after Placement gets salesforce_ref):
    • generate_placement_and_worker_documents() task starts
    • Calls generate_placement_documents() - generates 2 placement documents sequentially
    • Calls generate_worker_documents() - generates 2 worker documents sequentially
  6. Employment Contract flow (after EmploymentContract gets salesforce_ref):
    • generate_employment_contract_documents() task starts
    • Generates 1 employment contract document
  7. Sequential API calls: Each document type generates via separate Apex REST API call
  8. Each API call creates one document in Salesforce
  9. DB records created with empty file fields and is_present_locally=False
  10. Admin manually downloads from SF and uploads to Django later
  11. File upload sets is_present_locally=True

Document Types

Placement Documents

  • Uitzendbevestiging - Placement confirmation
  • Uitzendbevestiging DRAFT - Draft placement confirmation

Employment Contract Documents

  • Arbeidscontract fase A ZUB - Employment contract phase A

Worker Documents

  • Codeofconduct - Code of conduct
  • ABU_Fair_Employment_Code - ABU Fair Employment Code