# Process Layer

> The `src/<Module>/…` paths used throughout this document are drawn from a
> representative CG Mobile customer workspace. Your workspace may use different
> module names, but the folder structure (`DS/`, `BO/`, `LO/`, `PR/`, `UI/`)
> and naming conventions are identical.

## Overview

Processes (PR) orchestrate the application flow by coordinating Business Objects, ListObjects, and UI screens. They define the sequence of actions, decision logic, and data transformations that occur when users interact with the application.

## Process Fundamentals

### Purpose

Processes (PR) serve as the orchestration layer that:

-   Coordinate loading and saving of Business Objects and ListObjects
-   Define navigation flow between screens
-   Implement decision logic and conditional branching
-   Execute business logic methods at the right time
-   Manage process-level state and variables
-   Connect the business layer (BO/LO) to the presentation layer (UI)
-   Handle user actions and events

### Directory Structure

```
src/
├── Call/
│   └── PR/
│       ├── Call_AccountReceivables/
│       │   ├── Call_AccountReceivablesProcess.processflow.xml
│       │   └── Call_AccountReceivablesUI.userinterface.xml
│       └── Call_LoadCall/
│           ├── Call_LoadCallProcess.processflow.xml
│           └── [UI files]
└── Visit/
    └── PR/
        ├── Visit_Info/
        │   ├── Visit_InfoProcess.processflow.xml
        │   └── Visit_InfoUI.userinterface.xml
        └── [other processes]/
```

## Process XML Structure

### Root Element

```xml
<Process
  name="Call::AccountReceivablesProcess"    <!-- Process identifier (namespace::name) -->
  defaultAction="ShowView"                  <!-- First action to execute -->
  schemaVersion="0.0.0.5"                   <!-- Schema version -->
>
```

### Key Elements

| Element            | Description                                      | Required                        |
| ------------------ | ------------------------------------------------ | ------------------------------- |
| `<Entry>`          | Process initialization section                   | No, but functionally required¹  |
| `<ProcessContext>` | Declares variables and parameters                | Yes (inside `<Entry>`)          |
| `<Declarations>`   | Process-level variables (BOs, LOs, simple types) | No                              |
| `<Parameters>`     | Input parameters passed to process               | No                              |
| `<EntryActions>`   | Actions executed on process entry                | Yes (inside `<Entry>`)²         |
| `<Body>`           | Main process actions and flow                    | No, but functionally required¹  |
| `<Actions>`        | Collection of action definitions                 | Yes (inside `<Body>`)           |

> ¹ Per `ProcessFlow.xsd` `ProcessType`, both `<Entry>` and `<Body>` are
> `minOccurs="0"` at the `<Process>` root, but a functioning process needs
> both. When either is present, its required children apply as noted.
>
> ² Per `ProcessFlow.xsd` `EntryType`, `<Entry>` must contain
> `<ProcessContext>` followed by `<EntryActions>` in sequence. Use
> `<EntryActions/>` (self-closing) when there is no work to do on entry.

## Example 1: Simple Process - Call_AccountReceivablesProcess

**Location:** `src/Call/PR/Call_AccountReceivables/Call_AccountReceivablesProcess.processflow.xml`
**Purpose:** Display a list of account receivables
**Complexity:** Minimal (single view action)

### Complete Process XML

```xml
<Process name="Call::AccountReceivablesProcess" defaultAction="ShowView" schemaVersion="0.0.0.5">
  <Entry>
    <ProcessContext>
      <Declarations></Declarations>
      <Parameters>
        <Input name="AccountReceivableList" type="LoAccountReceivables" />
      </Parameters>
    </ProcessContext>
    <EntryActions/>
  </Entry>
  <Body>
    <Actions>
      <Action actionType="VIEW" name="ShowView">
        <UIDescription>Call::AccountReceivablesUI</UIDescription>
        <Events></Events>
      </Action>
    </Actions>
  </Body>
</Process>
```

### Analysis

#### ProcessContext

**Parameters:**

```xml
<Input name="AccountReceivableList" type="LoAccountReceivables" />
```

-   **name:** Variable name accessible via `ProcessContext::AccountReceivableList`
-   **type:** LoAccountReceivables (the ListObject)
-   **Direction:** Input (passed from calling process)

This means the list is loaded _before_ entering this process and passed in as a parameter.

#### Body Actions

**Single VIEW Action:**

```xml
<Action actionType="VIEW" name="ShowView">
  <UIDescription>Call::AccountReceivablesUI</UIDescription>
</Action>
```

-   **actionType:** VIEW (display a UI screen)
-   **name:** ShowView (action identifier)
-   **UIDescription:** References the UI definition file
-   **No events:** No user interaction handlers in this simple example

**Flow:**

```
Process starts
    |
defaultAction="ShowView"
    |
Display Call::AccountReceivablesUI screen
    (UI binds to ProcessContext::AccountReceivableList)
    |
User views list
    |
Process remains active while UI is visible
```

## Example 2: Complex Process with Loading - Visit_InfoProcess

**Location:** `src/Visit/PR/Visit_Info/Visit_InfoProcess.processflow.xml`
**Purpose:** Load and display visit information with retail store details
**Complexity:** Moderate (multiple loads, BO method calls)

### Complete Process XML

```xml
<Process name="Visit::InfoProcess" defaultAction="showVisitInfo" schemaVersion="0.0.0.5">
  <Entry>
    <ProcessContext>
      <Declarations>
        <Declaration name="VisitBo" type="BoVisit" />
        <Declaration name="RetailStoreDetail" type="BoRetailStore" />
        <Declaration name="RetailStoreAddress" type="Object" />
        <Declaration name="CompletedTasks" type="Object" />
        <Declaration name="NotStartedTasks" type="Object" />
        <Declaration name="InProgressTasks" type="Object" />
      </Declarations>
      <Parameters>
        <Input name="VisitPKey" type="DomPKey" />
        <Input name="targetClbStatus" type="String" />
        <Input name="ResponsiblePKey" type="DomPKey" />
      </Parameters>
    </ProcessContext>
    <EntryActions>
      <Action name="loadVisit" actionType="LOAD" type="BoVisit">
        <Parameters>
          <Input name="pKey" value="ProcessContext::VisitPKey" />
          <Input name="referenceUserPKey" value="ProcessContext::ResponsiblePKey" />
        </Parameters>
        <Return name="ProcessContext::VisitBo" />
      </Action>
      <Action actionType="LOAD" name="loadRetailStore" type="BoRetailStore">
        <Parameters>
          <Input name="pKey" value="ProcessContext::VisitBo.StoreId" />
        </Parameters>
        <Return name="ProcessContext::RetailStoreDetail" />
      </Action>
      <Action actionType="LOGIC" name="LoadRetailStoreAddress" call="ProcessContext::RetailStoreDetail.getRetailStoreAddress">
        <Return name="ProcessContext::RetailStoreAddress" />
      </Action>
      <Action actionType="LOGIC" name="LoadCompletedTasks" call="ProcessContext::VisitBo.loadTasksBasedOnStatus">
        <Parameters>
          <Input name="Status" type="Literal" value="Completed" />
          <Input name="Items" value="ProcessContext::VisitBo.loAssessmentTasks" />
        </Parameters>
        <Return name="ProcessContext::CompletedTasks" />
      </Action>
      <Action actionType="LOGIC" name="LoadNotStartedTasks" call="ProcessContext::VisitBo.loadTasksBasedOnStatus">
        <Parameters>
          <Input name="Status" type="Literal" value="NotStarted" />
          <Input name="Items" value="ProcessContext::VisitBo.loAssessmentTasks" />
        </Parameters>
        <Return name="ProcessContext::NotStartedTasks" />
      </Action>
      <Action actionType="LOGIC" name="LoadInProgressTasks" call="ProcessContext::VisitBo.loadTasksBasedOnStatus">
        <Parameters>
          <Input name="Status" type="Literal" value="InProgress" />
          <Input name="Items" value="ProcessContext::VisitBo.loAssessmentTasks" />
        </Parameters>
        <Return name="ProcessContext::InProgressTasks" />
      </Action>
    </EntryActions>
  </Entry>
  <Body>
    <Actions>
      <Action actionType="VIEW" name="showVisitInfo">
        <UIDescription>Visit::InfoUI</UIDescription>
      </Action>
    </Actions>
  </Body>
</Process>
```

### Analysis

#### Declarations (Process Variables)

```xml
<Declaration name="VisitBo" type="BoVisit" />
<Declaration name="RetailStoreDetail" type="BoRetailStore" />
<Declaration name="RetailStoreAddress" type="Object" />
```

**Purpose:** Define process-level variables to hold loaded data
**Access:** Via `ProcessContext::VariableName` throughout the process
**Types:** Can be BOs, LOs, or simple types (String, Object, DomPKey, etc.)

#### EntryActions (Initialization)

**1. Load Visit BO**

```xml
<Action name="loadVisit" actionType="LOAD" type="BoVisit">
  <Parameters>
    <Input name="pKey" value="ProcessContext::VisitPKey" />
  </Parameters>
  <Return name="ProcessContext::VisitBo" />
</Action>
```

-   **actionType:** LOAD (load a Business Object)
-   **type:** BoVisit (which BO to load)
-   **Parameters:** Pass VisitPKey to load specific visit
-   **Return:** Store result in ProcessContext::VisitBo

**2. Load Related Retail Store (Chained LOAD)**

```xml
<Action actionType="LOAD" name="loadRetailStore" type="BoRetailStore">
  <Parameters>
    <Input name="pKey" value="ProcessContext::VisitBo.StoreId" />
  </Parameters>
  <Return name="ProcessContext::RetailStoreDetail" />
</Action>
```

-   Loads BoRetailStore using StoreId from the visit
-   Demonstrates data chaining: first load's result used in second load

**3. Call BO Method**

```xml
<Action actionType="LOGIC" name="LoadRetailStoreAddress" call="ProcessContext::RetailStoreDetail.getRetailStoreAddress">
  <Return name="ProcessContext::RetailStoreAddress" />
</Action>
```

-   **actionType:** LOGIC (execute business logic)
-   **call:** Method on the loaded BO
-   **Return:** Store result in process variable

**Process Flow:**

```
Process starts with parameters (VisitPKey, ResponsiblePKey)
    |
EntryActions execute sequentially:
    1. Load BoVisit by pKey
    2. Load BoRetailStore using Visit's StoreId
    3. Get retail store address from BoRetailStore
    4. Filter completed tasks from Visit's assessment tasks
    5. Filter not-started tasks
    6. Filter in-progress tasks
    |
All data loaded into ProcessContext
    |
defaultAction="showVisitInfo" executes
    |
Display Visit::InfoUI
    (UI binds to ProcessContext::VisitBo, RetailStoreDetail, task collections)
```

## Example 3: Complex Process with Decisions

**Location:** `src/Call/PR/Call_LoadCall/Call_LoadCallProcess.processflow.xml`
**Purpose:** Load a call and handle various start conditions
**Complexity:** High (multiple decisions, validations, conditional branching)

### Process XML (Excerpt)

```xml
<Process name="Call::LoadCallProcess" defaultAction="IsDSD_Decision" schemaVersion="0.0.0.5">
  <Entry>
    <ProcessContext>
      <Declarations>
        <Declaration name="CallBO" type="BoCall" />
        <Declaration name="TimeCardAvailable" type="String" />
      </Declarations>
      <Parameters>
        <Input name="CallPKey" type="String" />
        <Input name="ResponsiblePKey" type="DomPKey" />
        <Input name="ActionName" type="String" />
        <Input name="IsCallFromDSD" type="DomBool" />
        <Input name="CanStartVisit" type="DomBool" />
        <Input name="ShowStartVisitInfo" type="DomBool" />
      </Parameters>
    </ProcessContext>
    <EntryActions>
      <Action name="LoadCallBO" actionType="LOAD" type="BoCall">
        <Parameters>
          <Input name="pKey" value="ProcessContext::CallPKey" />
          <Input name="referenceUserPKey" value="ProcessContext::ResponsiblePKey" />
          <Input name="isCallFromDSD" value="ProcessContext::IsCallFromDSD" />
        </Parameters>
        <Return name="ProcessContext::CallBO" />
      </Action>
    </EntryActions>
  </Entry>
  <Body>
    <Actions>
      <!-- Decision: Is this DSD mode? -->
      <Action name="IsDSD_Decision" actionType="DECISION" parameter="ProcessContext::isCallFromDSD">
        <Case value="true" action="DSDActionDecision" />
        <CaseElse action="CheckActionName" />
      </Action>

      <!-- Decision: What action? -->
      <Action name="CheckActionName" actionType="DECISION" parameter="ProcessContext::ActionName">
        <Case value="Start" action="DSDActionDecision" />
        <CaseElse action="ShouldShowStartVisitInfo" />
      </Action>

      <!-- Confirmation dialog -->
      <Action name="ShowStartVisitInfo" actionType="CONFIRM" confirmType="Ok">
        <Message messageId="StartVisitInfoMessage" />
        <Cases>
          <Case value="Ok" action="DSDActionDecision" />
        </Cases>
      </Action>

      <!-- Validate geo-location -->
      <Action name="ProcessValidationGeoLocationAction" actionType="LOGIC" call="ProcessContext::CallBO.validGeoLocationVisit">
        <Return name="ProcessContext::ValidationLocationResult" />
        <TransitionTo action="ValidateLocationBeforeStart_Decision" />
      </Action>

      <!-- Decision: Location valid? -->
      <Action name="ValidateLocationBeforeStart_Decision" actionType="DECISION" parameter="ProcessContext::ValidationLocationResult">
        <Case value="valid" action="ProcessStartAction" />
        <CaseElse action="SetCanStartVisitButton" />
      </Action>

      <!-- ... more actions ... -->
    </Actions>
  </Body>
</Process>
```

**Process Flow (Simplified):**

```
Load BoCall
    |
IsDSD_Decision
    +-- true --> DSDActionDecision
    +-- false --> CheckActionName
                 +-- "Start" --> DSDActionDecision
                 +-- else --> ShouldShowStartVisitInfo
                              |
                              ShowStartVisitInfoDecision
                              +-- true --> ShowStartVisitInfo (dialog)
                              +-- false --> DSDActionDecision
                                           |
                                           ProcessValidationInProgressAction
                                           |
                                           ValidateInProgressBeforeStart_Decision
                                           +-- false --> ProcessValidationGeoLocationAction
                                           +-- true --> CheckIfTimeCardIsAvailable
```

## Action Types

### Core Action Types

| Action Type    | Purpose                              | Example                                               |
| -------------- | ------------------------------------ | ----------------------------------------------------- |
| **VIEW**       | Display a UI screen                  | `<Action actionType="VIEW" name="ShowView">`          |
| **LOAD**       | Load a Business Object or ListObject | `<Action actionType="LOAD" type="BoVisit">`           |
| **SAVE**       | Save a Business Object or ListObject | `<Action actionType="SAVE" type="BoVisit">`           |
| **LOGIC**      | Execute business logic method        | `<Action actionType="LOGIC" call="BO.method">`        |
| **DECISION**   | Conditional branching                | `<Action actionType="DECISION" parameter="variable">` |
| **CONFIRM**    | Show user confirmation dialog        | `<Action actionType="CONFIRM" confirmType="YesNo">`   |
| **PROCESS**    | Invoke a sub-process                 | `<Action actionType="PROCESS" process="NS::Proc">`    |
| **VALIDATION** | Validate a Business Object           | `<Action actionType="VALIDATION" type="BoVisit">`     |

### Action Type Details

#### VIEW Action

```xml
<Action actionType="VIEW" name="ShowAccountReceivables">
  <UIDescription>Call::AccountReceivablesUI</UIDescription>
  <Events>
    <Event name="itemSelected" action="HandleItemSelected" />
  </Events>
</Action>
```

#### LOAD Action

```xml
<Action name="loadVisit" actionType="LOAD" type="BoVisit">
  <Parameters>
    <Input name="pKey" value="ProcessContext::VisitPKey" />
  </Parameters>
  <Return name="ProcessContext::VisitBo" />
</Action>
```

#### LOGIC Action

```xml
<Action actionType="LOGIC" name="CalculateTotals" call="ProcessContext::LoAccountReceivables.calculateAccountReceivablesForCard">
  <Parameters>
    <Input name="customerPKey" value="ProcessContext::CustomerPKey" />
  </Parameters>
  <Return name="ProcessContext::CalculationResult" />
  <TransitionTo action="ShowResults" />
</Action>
```

#### DECISION Action

```xml
<Action name="CheckStatus" actionType="DECISION" parameter="ProcessContext::VisitBo.status">
  <Case value="Completed" action="ShowCompletedView" />
  <Case value="InProgress" action="ShowInProgressView" />
  <CaseElse action="ShowPlannedView" />
</Action>
```

#### CONFIRM Action

```xml
<Action name="ConfirmDelete" actionType="CONFIRM" confirmType="YesNo">
  <Message messageId="ConfirmDeleteMessage" />
  <Cases>
    <Case value="Yes" action="DeleteItem" />
    <Case value="No" action="CancelDelete" />
  </Cases>
</Action>
```

**confirmType values:**

-   `Ok` - Single OK button
-   `YesNo` - Yes and No buttons
-   `OkCancel` - OK and Cancel buttons

#### VALIDATION Action

```xml
<Action name="ValidateVisit" actionType="VALIDATION" type="BoVisit">
  <Parameters>
    <Input name="object" value="ProcessContext::VisitBo" />
  </Parameters>
  <Return name="ProcessContext::ValidationResult" />
  <TransitionTo action="CheckValidationResult" />
</Action>
```

## Process Context Access

### Accessing Variables

**From Process Actions:**

```xml
<Input name="pKey" value="ProcessContext::VisitPKey" />
```

**From BO Properties:**

```xml
<Input name="pKey" value="ProcessContext::VisitBo.StoreId" />
```

**From LO Methods:**

```xml
<Input name="Items" value="ProcessContext::VisitBo.loAssessmentTasks" />
```

### Variable Scope

```
ProcessContext
+-- Parameters (Input)
|   +-- VisitPKey
|   +-- ResponsiblePKey
|   +-- ActionName
+-- Declarations (Process Variables)
    +-- VisitBo (BoVisit)
    |   +-- .pKey
    |   +-- .name
    |   +-- .status
    |   +-- .loAssessmentTasks (child LO)
    +-- RetailStoreDetail (BoRetailStore)
    +-- CompletedTasks (Object)
```

## Process Lifecycle

### Entry Phase

```
Process invoked with parameters
    |
ProcessContext initialized
    - Declarations created (empty)
    - Parameters populated
    |
EntryActions execute sequentially
    - Load BOs/LOs
    - Call initialization methods
    - Populate process variables
    |
All EntryActions complete
    |
Body actions begin
```

### Body Phase

```
defaultAction executed
    |
Action processes based on type:
    - VIEW: Display UI, wait for events
    - LOAD: Query datasource, populate BO/LO
    - LOGIC: Execute method, store result
    - DECISION: Evaluate, branch to next action
    - CONFIRM: Show dialog, wait for user response
    |
TransitionTo next action (if specified)
    |
Repeat until:
    - VIEW action (process waits)
    - No TransitionTo (process ends)
    - Exit action
```

## Common Process Patterns

### Pattern 1: Simple View Process

**Purpose:** Display a pre-loaded list

```xml
<Process name="Simple::ViewProcess" defaultAction="ShowView">
  <Entry>
    <ProcessContext>
      <Parameters>
        <Input name="DataList" type="LoItems" />
      </Parameters>
    </ProcessContext>
    <EntryActions/>
  </Entry>
  <Body>
    <Actions>
      <Action actionType="VIEW" name="ShowView">
        <UIDescription>Simple::ViewUI</UIDescription>
      </Action>
    </Actions>
  </Body>
</Process>
```

### Pattern 2: Load and View Process

**Purpose:** Load data then display

```xml
<Process name="LoadAndView::Process" defaultAction="ShowView">
  <Entry>
    <ProcessContext>
      <Declarations>
        <Declaration name="DataBO" type="BoData" />
      </Declarations>
      <Parameters>
        <Input name="DataPKey" type="DomPKey" />
      </Parameters>
    </ProcessContext>
    <EntryActions>
      <Action name="LoadData" actionType="LOAD" type="BoData">
        <Parameters>
          <Input name="pKey" value="ProcessContext::DataPKey" />
        </Parameters>
        <Return name="ProcessContext::DataBO" />
      </Action>
    </EntryActions>
  </Entry>
  <Body>
    <Actions>
      <Action actionType="VIEW" name="ShowView">
        <UIDescription>LoadAndView::ViewUI</UIDescription>
      </Action>
    </Actions>
  </Body>
</Process>
```

### Pattern 3: Validation and Save Process

**Purpose:** Validate then save with error handling

```xml
<Body>
  <Actions>
    <Action name="ValidateBO" actionType="VALIDATION" type="BoData">
      <Parameters>
        <Input name="object" value="ProcessContext::DataBO" />
      </Parameters>
      <Return name="ProcessContext::ValidationResult" />
      <TransitionTo action="CheckResult" />
    </Action>

    <Action name="CheckResult" actionType="DECISION" parameter="ProcessContext::ValidationResult.valid">
      <Case value="true" action="SaveBO" />
      <CaseElse action="ShowErrors" />
    </Action>

    <Action name="SaveBO" actionType="SAVE" type="BoData">
      <Parameters>
        <Input name="object" value="ProcessContext::DataBO" />
      </Parameters>
      <TransitionTo action="ShowSuccess" />
    </Action>
  </Actions>
</Body>
```

### Pattern 4: Conditional Loading

**Purpose:** Load different data based on condition

```xml
<Body>
  <Actions>
    <Action name="CheckMode" actionType="DECISION" parameter="ProcessContext::Mode">
      <Case value="Edit" action="LoadForEdit" />
      <Case value="Create" action="CreateNew" />
      <CaseElse action="LoadForView" />
    </Action>

    <Action name="LoadForEdit" actionType="LOAD" type="BoData">
      <Parameters>
        <Input name="pKey" value="ProcessContext::DataPKey" />
      </Parameters>
      <Return name="ProcessContext::DataBO" />
      <TransitionTo action="ShowEditView" />
    </Action>

    <Action name="CreateNew" actionType="CREATE" type="BoData">
      <Return name="ProcessContext::DataBO" />
      <TransitionTo action="ShowEditView" />
    </Action>
  </Actions>
</Body>
```

### Pattern 5: Sub-Process Communication

Invoke another process with `actionType="PROCESS"` and reference the target
process by fully-qualified name via the `process` attribute (`Namespace::Name`).
Inputs are passed via `<Parameters>`, and named outputs come back via
`<ReturnValues>` with each `<Return>` mapping a child variable to a
`ProcessContext::…` slot in the parent.

**Parent Process:**

```xml
<Action actionType="PROCESS" name="OpenChildProcess" process="Child::Process">
  <Parameters>
    <Input name="ParentData" value="ProcessContext::DataBO" />
    <Input name="Mode" value="Edit" type="Literal" />
  </Parameters>
  <ReturnValues>
    <Return name="ProcessContext::ChildResult" value="result" />
  </ReturnValues>
  <TransitionTo action="HandleChildResult" />
</Action>
```

## Event Handling

### UI Events to Process

```xml
<!-- In Process -->
<Action actionType="VIEW" name="ShowList">
  <UIDescription>List::UI</UIDescription>
  <Events>
    <Event name="itemSelected" action="HandleItemSelected" />
  </Events>
</Action>

<Action name="HandleItemSelected" actionType="LOGIC" call="ProcessContext::handleSelection">
  <TransitionTo action="ShowDetails" />
</Action>
```

## Best Practices

### 1. Load Data in EntryActions

Data should be ready before the UI displays:

```xml
<EntryActions>
  <Action name="LoadData" actionType="LOAD" type="BoData">
    <Return name="ProcessContext::DataBO" />
  </Action>
</EntryActions>
```

### 2. Use Descriptive Action Names

**Good:** `LoadCustomerDetails`, `ValidateOrderItems`, `SaveAndClose`
**Bad:** `Action1`, `DoStuff`, `Process`

### 3. Chain Actions Explicitly

```xml
<Action name="Validate" actionType="VALIDATION" type="BoData">
  <TransitionTo action="CheckResult" />
</Action>
```

### 4. Keep Processes Focused

**Good:** One process per screen/workflow
**Bad:** Giant process handling multiple unrelated screens

### 5. Use Declarations for Intermediate Results

```xml
<Declaration name="ValidationResult" type="Object" />
<Declaration name="CalculationTotal" type="DomDecimal" />
```

### 6. Handle Errors Gracefully

```xml
<Action name="CheckValidation" actionType="DECISION" parameter="ProcessContext::ValidationResult.valid">
  <Case value="true" action="SaveBO" />
  <CaseElse action="ShowValidationErrors" />
</Action>
```

## Key Takeaways

1. **Processes orchestrate** the flow between BOs, LOs, and UI
2. **EntryActions** execute sequentially before UI displays
3. **Action types** include VIEW, LOAD, SAVE, LOGIC, DECISION, CONFIRM
4. **ProcessContext** holds all process variables and parameters
5. **DECISION actions** enable conditional branching
6. **LOGIC actions** execute BO/LO methods
7. **TransitionTo** explicitly chains actions together
8. **Parameters** pass data from caller to process
9. **Declarations** define process-level variables
10. **defaultAction** specifies first action to execute

## Files Referenced

| File Path                                                                          | Purpose                |
| ---------------------------------------------------------------------------------- | ---------------------- |
| src/Call/PR/Call_AccountReceivables/Call_AccountReceivablesProcess.processflow.xml | Simple process example |
| src/Visit/PR/Visit_Info/Visit_InfoProcess.processflow.xml                          | Multiple loads example |
| src/Call/PR/Call_LoadCall/Call_LoadCallProcess.processflow.xml                     | Complex decision flow  |

---

_This documentation is maintained by the Modeler CLI plugin and refreshed on workspace upgrade._
