---
title: New claim intake and adjuster assignment
summary: Batch-processes newly reported claims and open recovery cases, assigning recovery adjusters by policy or claim-number range and generating the initial review/follow-up task for each.
status: draft
owner: SAIF
last_reviewed: 2026-07-30
library: SAIF.Business.Claim.ThirdParty
reference_type: package
operation_id: OP-TP-09
trigger: clsThirdPartyNewClaim.NewThirdPartyNewClaim(runDate).Save() / clsClaimActivityManager.NewClaimActivityManager(runDate).Save()
---

# New claim intake and adjuster assignment

This operation was identified through source tracing and is not present in the prior flat-format documentation. `clsThirdPartyNewClaim` is a batch job that scans newly reported claims for a run date, skips claims that already have a third-party case, assigns a recovery adjuster via `clsAdjusterAssignment`, creates the case, and schedules an initial "Review new claim" task. `clsClaimActivityManager` is a related batch job that generates a follow-up task on already-open recovery cases based on a caller-supplied task code, text, and assignee.

| Field | Value |
| --- | --- |
| **Operation ID** | OP-TP-09 |
| **Trigger** | `clsThirdPartyNewClaim.NewThirdPartyNewClaim(dataPortal, runDate).Save()`; `clsClaimActivityManager.NewClaimActivityManager(dataPortal, runDate).Save()` |
| **Inputs** | Run date; new-claim list rows (claim ID, claim number, policy number, date of injury, security/conflict flags); open-case list rows with caller-supplied task code, text, assignee, and case sequence number |
| **Outputs** | New `THRDPARTY_CASE` rows with an assigned adjuster; new `THRDPARTY_TASK` rows ("Review new claim" or caller-supplied); a running count of successfully processed records; per-record error messages for duplicates or save failures |
| **Primary components** | `clsThirdPartyNewClaim.processRecords`, `clsAdjusterAssignment.AssignAdjuster`, `clsAdjusterAssignment.CheckForCase`, `clsClaimActivityManager.ProcessOpenCases` |
| **Entry point** | `Business\SAIF.Business.Claim.ThirdParty\clsThirdPartyNewClaim.vb` |

## Steps

1. **Retrieve the new-claim list** for a run date ([SQL-041](../sql/sql-041-pk82033_thirdparty-new_claim_list.md)), yielding a collection of `clsThirdPartyNewClaim` candidate rows each carrying claim security information via `SetClaimSecurity`.
2. **For each candidate claim, check for an existing case.** `clsAdjusterAssignment.CheckForCase` issues a direct inline-SQL scalar count against `THRDPARTY_CASE` filtered by claim ID.*
   - If a case already exists: record a "Duplicate" error message and skip the claim; no case or task is created.
3. **Determine adjuster confidentiality.** If the claim's security info indicates a conflict or an exposure situation, the claim is treated as confidential/secured for assignment purposes.
4. **Assign a recovery adjuster (`AssignAdjuster`):**
   - If the claim is secured/confidential: the adjuster is forced to a designated conflict-adjuster code, and the matching user name is looked up from the claim-assignment range list ([BR-034](../business-rules.md#br-034-new-claim-adjuster-assignment-follows-a-policy-match-then-claim-number-range-then-conflict-override-precedence)).
   - Otherwise, the assignment first attempts a **policy-level match**: if the claim's policy number appears in the policy-assignment list, that policy's designated adjuster and user name are used ([BR-034](../business-rules.md#br-034-new-claim-adjuster-assignment-follows-a-policy-match-then-claim-number-range-then-conflict-override-precedence)).
   - If no policy match is found, the assignment falls back to a **claim-number-range match**: the last two digits of the claim number are compared against low/high bounds in the claim-assignment range list, and the first matching range's adjuster and user name are used ([BR-034](../business-rules.md#br-034-new-claim-adjuster-assignment-follows-a-policy-match-then-claim-number-range-then-conflict-override-precedence)).
   - If still no match and at least one range entry exists, the **last-iterated range entry** is used as a fallback default.*
   - If an adjuster code was resolved but no user name, a final pass re-scans the claim-assignment list by adjuster code to backfill the user name.*
5. **Create the third-party case.** A new `clsThirdPartyCase` is instantiated for the claim ID and date of injury, with `ThrdpartyAdjusterCode` set to the assigned adjuster (see [Maintain recovery case](maintain-recovery-case.md) for case-level validation rules).
   - If the case is not savable (fails its own business rules): a "SaveError" message is recorded and no task is created.
6. **Save the case, then create the initial review task.** A new `clsThirdpartyTask` is created with task code `NOTIC`, text "Review new claim", the assigned user name, and a due date supplied by the run's criteria object (see [Manage notes and tasks](manage-notes-and-tasks.md) for task validation rules).
   - If the task is not savable: a "TaskError" message is recorded (the case has already been saved at this point).
   - If the task is savable: it is saved and the batch's processed-record count is incremented.
7. **Retrieve the open-case list** for a run date ([SQL-042](../sql/sql-042-pk82033_thirdparty-open_case_list.md)), yielding `clsClaimActivityManager` rows each carrying a case sequence number and caller-supplied task code/text/assignee.
8. **Generate a follow-up task on each open case (`ProcessOpenCases`).** A new `clsThirdpartyTask` is created against the case's sequence number with a due date of tomorrow, the supplied user name, task code, and task text.
   - If the task is savable: it is saved and the batch's processed-record count is incremented.
   - If the task is not savable: the record is silently skipped — no error message is recorded, unlike the new-claim intake path.*

## Process flow

```mermaid
flowchart TD
	Start([Batch run for run date]) --> NewList[Retrieve new claim list]
	NewList --> Dup{Case already<br>exists for claim?}
	Dup -->|Yes| DupErr([Error: Duplicate])
	Dup -->|No| Secured{Conflict or<br>exposure flagged?}
	Secured -->|Yes| Conflict[Assign conflict<br>adjuster code]
	Secured -->|No| PolicyMatch{Policy number<br>matches assignment list?}
	PolicyMatch -->|Yes| PolicyAssign[Assign policy's adjuster]
	PolicyMatch -->|No| RangeMatch{Claim number last-2-digits<br>within a range?}
	RangeMatch -->|Yes| RangeAssign[Assign range's adjuster]
	RangeMatch -->|No| DefaultAssign[Fall back to last<br>range entry, if any]
	Conflict --> CreateCase[Create THRDPARTY_CASE<br>with assigned adjuster]
	PolicyAssign --> CreateCase
	RangeAssign --> CreateCase
	DefaultAssign --> CreateCase
	CreateCase --> Savable{Case savable?}
	Savable -->|No| SaveErr([Error: SaveError])
	Savable -->|Yes| SaveCase[Save case]
	SaveCase --> CreateTask[Create NOTIC review task]
	CreateTask --> TaskSavable{Task savable?}
	TaskSavable -->|No| TaskErr([Error: TaskError])
	TaskSavable -->|Yes| SaveTask([Save task,<br>increment record count])

	OpenList([Retrieve open case list]) --> NewFollowup[Create follow-up task<br>due tomorrow]
	NewFollowup --> FollowSavable{Task savable?}
	FollowSavable -->|No| Skip([Skipped silently])
	FollowSavable -->|Yes| SaveFollowup([Save task,<br>increment record count])
```

## Failure and edge-case behavior

- `CheckForCase` uses an inline, hand-built SQL string (`Select count(*) from thrdparty_case where claim_id = :claimId`) rather than a cataloged stored procedure, so it is not represented in the SQL catalog as a named entry.*
- The "fall back to last range entry" behavior in `AssignAdjuster` (step 4) means an unmatched claim number silently receives whatever adjuster happened to be last in the range collection, rather than failing or defaulting to an explicit "unassigned" adjuster.*
- If case creation fails (`SaveError`), the batch does not attempt to create the review task at all, so a failed case never produces an orphan task.
- If task creation fails after a successful case save (`TaskError`), the case remains persisted without its initial review task — the record count is not incremented and the failure is only visible via the recorded error message.
- `clsClaimActivityManager.ProcessOpenCases` has no error-message path for a failed task save, unlike the otherwise-analogous new-claim intake flow — a failed follow-up task is simply not counted and leaves no diagnostic trail.*
- Both batch jobs rely on the constructing criteria's `runDate`/`taskDate` for due-date calculation rather than deriving it independently, so caller-supplied dates directly control task scheduling.*

> **Note:** Statements marked with `*` were inferred from code structure, naming
> conventions, or contextual evidence where direct confirmation was not available
> in source artifacts.

## Related documentation

- [Operations and processes](../operations-processes.md)
- [Business rules](../business-rules.md)
- [SQL catalog](../sql/index.md)
- [Database tables](../database-tables.md)

## Sources

- `Business\SAIF.Business.Claim.ThirdParty\clsThirdPartyNewClaim.vb`
- `Business\SAIF.Business.Claim.ThirdParty\clsClaimActivityManager.vb`
- `Business\SAIF.Business.Claim.ThirdParty\clsAdjusterAssignment.vb`
