---
title: SAIF.Business.Policy.Correspondence business rules
summary: Enumerated business rules for correspondence, endorsements, output documents, and imaging behavior.
status: draft
owner: Technical Writer
last_reviewed: 2026-07-31
library: SAIF.Business.Policy.Correspondence
reference_type: package
---

# SAIF.Business.Policy.Correspondence business rules

This page captures the business rules enforced by the local source code and the documented Oracle procedure used by this library.

## BR-001: Only endorsement-coded correspondence is returned

| Field | Value |
| --- | --- |
| **Statement** | An endorsement retrieval path only returns `ENDORSEMENT` rows whose `ENDORSE_CODE` row has `CORRESPOND_TYPE_CODE = ''E''`. |
| **Trigger** | Single-item or collection endorsement retrieval. |
| **Enforcement** | `clsEndorsement.Criteria.RetrieveSQL`; `clsEndorsementCollection.Criteria.RetrieveSQL`. |
| **Outcome** | Non-endorsement correspondence is excluded from endorsement APIs. |
| **Confidence** | Verified |
| **Tables** | [ENDORSEMENT](database-tables.md#endorsement), [ENDORSE_CODE](database-tables.md#endorse_code) |
| **SQL** | [SQL-013](sql/SQL-013-saif-business-policy-correspondence.md), [SQL-014](sql/SQL-014-saif-business-policy-correspondence.md), [SQL-015](sql/SQL-015-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsEndorsement.vb`; `Business\SAIF.Business.Policy.Correspondence\clsEndorsementCollection.vb` |

---

## BR-002: Policy-period filters bind only for period-scoped retrieval

| Field | Value |
| --- | --- |
| **Statement** | Period effective and expiration date parameters are bound only when the collection criteria uses `RetrievalTypes.ByPolicyPeriod`. |
| **Trigger** | Collection retrieval by policy or by policy period. |
| **Enforcement** | `clsCorrespondenceCollection.BeforeRetrieve`; `clsEndorsementCollection.BeforeRetrieve`. |
| **Outcome** | Policy-wide retrieval binds only `:PolicyNumber`; period-scoped retrieval adds period parameters. |
| **Confidence** | Verified |
| **Tables** | [POLICY_PERIOD](database-tables.md#policy_period), [ENDORSEMENT](database-tables.md#endorsement) |
| **SQL** | [SQL-015](sql/SQL-015-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceCollection.vb`; `Business\SAIF.Business.Policy.Correspondence\clsEndorsementCollection.vb` |

---

## BR-003: Policy-period membership depends on source-system rules

| Field | Value |
| --- | --- |
| **Statement** | For non-Guidewire periods the collection uses overlap logic; for `source_system_code = ''GW''` it requires an exact `policy_period_eff_date` match. |
| **Trigger** | Endorsement collection retrieval in `ByPolicyPeriod` mode. |
| **Enforcement** | `clsEndorsementCollection.Criteria.RetrieveSQL`. |
| **Outcome** | Different source systems produce different period-membership filters. |
| **Confidence** | Verified |
| **Tables** | [POLICY_PERIOD](database-tables.md#policy_period), [ENDORSEMENT](database-tables.md#endorsement) |
| **SQL** | [SQL-015](sql/SQL-015-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsEndorsementCollection.vb` |

---

## BR-004: Endorsements require a policy-period effective date

| Field | Value |
| --- | --- |
| **Statement** | An endorsement cannot be valid without `PolicyPeriodEffectiveDate`. |
| **Trigger** | Validation of `clsEndorsement`. |
| **Enforcement** | `clsEndorsement.AddBusinessRules` using `CommonBusinessRules.DateRequired`. |
| **Outcome** | Validation adds the message `Error: Policy Period Effective Date is required.` |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsEndorsement.vb` |

---

## BR-005: Agency-delivered output documents add an agency-delivery flag

| Field | Value |
| --- | --- |
| **Statement** | The agency-delivered insert path binds `in_agency_delivery_flag = ''Y''`; the standard path does not. |
| **Trigger** | Output-document insert request construction. |
| **Enforcement** | `clsOutputDocumentInserter.InsertAgencyDeliveredOutputDocument` and private `InsertOutputDocument`. |
| **Outcome** | The stored procedure can distinguish agency-delivered documents from the standard path. |
| **Confidence** | Verified |
| **Tables** | [OUTPUT_DOCUMENT](database-tables.md#output_document), [POLICY_OUTPUT_DOCUMENT](database-tables.md#policy_output_document) |
| **SQL** | [SQL-004](sql/SQL-004-saif-business-policy-correspondence.md) |
| **Stored procedure** | [`pk73343_output_document`](procedures/pk73343_output_document.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsOutputDocumentInserter.vb` |

---

## BR-006: New correspondence uses the Endorsement_Seq sequence

| Field | Value |
| --- | --- |
| **Statement** | Every newly created correspondence or endorsement receives its key from `GetNextSeqNum("Endorsement_Seq")`. |
| **Trigger** | Business-object create path. |
| **Enforcement** | `clsCorrespondence.Create`. |
| **Outcome** | The new object is stamped with a sequence number before the caller receives it. |
| **Confidence** | Verified |
| **Tables** | [ENDORSEMENT](database-tables.md#endorsement) |
| **SQL** | [SQL-001](sql/SQL-001-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondence.vb` |

---

## BR-007: Create stamps audit fields from the data portal

| Field | Value |
| --- | --- |
| **Statement** | Create user, create date, and correspondence date come from `IDataPortalInfo`, not the client clock. |
| **Trigger** | Business-object create path. |
| **Enforcement** | `clsCorrespondence.Create`. |
| **Outcome** | Audit fields are server-sourced and consistent with the active portal context. |
| **Confidence** | Verified |
| **Tables** | [ENDORSEMENT](database-tables.md#endorsement) |
| **SQL** | [SQL-001](sql/SQL-001-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondence.vb` |

---

## BR-008: Correspondence retrieval switches between two key shapes

| Field | Value |
| --- | --- |
| **Statement** | Retrieval uses sequence number when one is present; otherwise it uses policy number, policy-period effective date, and correspondence code. |
| **Trigger** | `GetCorrespondence` or `GetInformationPage` criteria evaluation. |
| **Enforcement** | `clsCorrespondence.BeforeRetrieve`; `clsCorrespondence.Criteria.RetrieveSQL`. |
| **Outcome** | The same API supports direct key lookup and information-page lookup. |
| **Confidence** | Verified |
| **Tables** | [ENDORSEMENT](database-tables.md#endorsement), [OUTPUT_LOG](database-tables.md#output_log) |
| **SQL** | [SQL-005](sql/SQL-005-saif-business-policy-correspondence.md), [SQL-006](sql/SQL-006-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondence.vb` |

---

## BR-009: Information-page retrieval always uses code P401

| Field | Value |
| --- | --- |
| **Statement** | The information-page factory always retrieves correspondence code `P401`. |
| **Trigger** | `clsCorrespondence.GetInformationPage`. |
| **Enforcement** | `INFORMATIONPAGE` constant and `GetInformationPage` factory. |
| **Outcome** | Information pages use a fixed correspondence-code contract. |
| **Confidence** | Verified |
| **Tables** | [ENDORSEMENT](database-tables.md#endorsement) |
| **SQL** | [SQL-006](sql/SQL-006-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondence.vb` |

---

## BR-010: Transaction-pending endorsement loads reuse a pre-fetched code collection

| Field | Value |
| --- | --- |
| **Statement** | When a portal transaction is pending, collection loading passes a shared correspondence-code collection into each child object. |
| **Trigger** | Endorsement collection hydration inside an open transaction. |
| **Enforcement** | `clsEndorsementCollection.AfterRetrieve`. |
| **Outcome** | Nested code lookups are avoided while the transaction is still open. |
| **Confidence** | Verified |
| **Tables** | [ENDORSE_CODE](database-tables.md#endorse_code) |
| **SQL** | [SQL-009](sql/SQL-009-saif-business-policy-correspondence.md), [SQL-014](sql/SQL-014-saif-business-policy-correspondence.md), [SQL-015](sql/SQL-015-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsEndorsementCollection.vb`; `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceCode.vb` |

---

## BR-011: Collection save applies edits before framework persistence

| Field | Value |
| --- | --- |
| **Statement** | Collection `Save()` overrides call `ApplyEdit()` before delegating to the framework save pipeline. |
| **Trigger** | Save of correspondence, detail, or endorsement collections. |
| **Enforcement** | `clsCorrespondenceCollection.Save`; `clsCorrespondenceDetailCollection.Save`; `clsEndorsementCollection.Save`. |
| **Outcome** | The active edit scope is committed before child persistence starts. |
| **Confidence** | Verified |
| **Tables** | [ENDORSEMENT](database-tables.md#endorsement), [POLICY_CORRESPOND_DATA](database-tables.md#policy_correspond_data) |
| **SQL** | [SQL-002](sql/SQL-002-saif-business-policy-correspondence.md), [SQL-012](sql/SQL-012-saif-business-policy-correspondence.md), [SQL-016](sql/SQL-016-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceCollection.vb`; `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceDetailCollection.vb`; `Business\SAIF.Business.Policy.Correspondence\clsEndorsementCollection.vb` |

---

## BR-012: Insert and update must affect exactly one row

| Field | Value |
| --- | --- |
| **Statement** | A correspondence insert or update is treated as failed unless the request reports `RowsAffected = 1`. |
| **Trigger** | Post-insert and post-update processing. |
| **Enforcement** | `clsCorrespondence.AfterInsert`; `clsCorrespondence.AfterUpdate`. |
| **Outcome** | The object records `InsertError` or DB-contention errors instead of marking itself old. |
| **Confidence** | Verified |
| **Tables** | [ENDORSEMENT](database-tables.md#endorsement) |
| **SQL** | [SQL-002](sql/SQL-002-saif-business-policy-correspondence.md), [SQL-016](sql/SQL-016-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondence.vb` |

---

## BR-013: Updates enforce optimistic concurrency by update date

| Field | Value |
| --- | --- |
| **Statement** | `BeforeUpdate` binds the pre-change `UPDATE_DATE` as `:LastUpdateDate` and restamps `UpdateUser` and `UpdateDate` from the portal. |
| **Trigger** | Correspondence update. |
| **Enforcement** | `clsCorrespondence.BeforeUpdate`. |
| **Outcome** | Concurrent updates are detected through the `WHERE UPDATE_DATE = :LastUpdateDate` predicate. |
| **Confidence** | Verified |
| **Tables** | [ENDORSEMENT](database-tables.md#endorsement) |
| **SQL** | [SQL-016](sql/SQL-016-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondence.vb` |

---

## BR-014: Correspondence does not expose create-SQL or delete-SQL criteria

| Field | Value |
| --- | --- |
| **Statement** | The criteria object throws `InvalidSQLProperty` for `CreateSQL` and `DeleteSQL`. |
| **Trigger** | Any consumer that tries to use unsupported criteria properties. |
| **Enforcement** | `clsCorrespondence.Criteria.CreateSQL`; `clsCorrespondence.Criteria.DeleteSQL`; related collection/detail criteria. |
| **Outcome** | The library only supports framework create via `GetNextSeqNum` and does not support row deletion. |
| **Confidence** | Verified |
| **Tables** | [ENDORSEMENT](database-tables.md#endorsement) |
| **SQL** | [SQL-001](sql/SQL-001-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondence.vb`; `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceCollection.vb`; `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceDetail.vb`; `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceDetailCollection.vb` |

---

## BR-015: Imaging reconciliation skips empty image lists

| Field | Value |
| --- | --- |
| **Statement** | The Imaging API is not called when no endorsement in the collection currently carries an image sequence number. |
| **Trigger** | `ClearImageSequenceNumbersForDeletedImages`. |
| **Enforcement** | `clsEndorsementCollection.ClearImageSequenceNumbersForDeletedImages`. |
| **Outcome** | The method returns without creating an API request. |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsEndorsementCollection.vb` |

---

## BR-016: Missing images reset local image sequence numbers to zero

| Field | Value |
| --- | --- |
| **Statement** | If the Imaging API response does not include a locally stored image ID, the endorsement image sequence number is reset to `0`. |
| **Trigger** | Imaging reconciliation after the API returns the surviving images. |
| **Enforcement** | `clsEndorsementCollection.ClearImageSequenceNumbersForDeletedImages`. |
| **Outcome** | Stale image references are cleared from in-memory correspondence objects. |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsEndorsementCollection.vb` |

---

## BR-017: Correspondence details are read-only through this library

| Field | Value |
| --- | --- |
| **Statement** | Live `InsertSQL`, `UpdateSQL`, and `DeleteSQL` paths for `POLICY_CORRESPOND_DATA` are disabled. |
| **Trigger** | Any attempt to persist detail rows through the criteria object. |
| **Enforcement** | `clsCorrespondenceDetail.Criteria` throws `InvalidSQLProperty` for mutating SQL properties. |
| **Outcome** | The library exposes detail rows for read/display only. |
| **Confidence** | Verified |
| **Tables** | [POLICY_CORRESPOND_DATA](database-tables.md#policy_correspond_data), [CORRESPOND_DATA_ELEMENT](database-tables.md#correspond_data_element) |
| **SQL** | [SQL-011](sql/SQL-011-saif-business-policy-correspondence.md), [SQL-012](sql/SQL-012-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceDetail.vb`; `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceDetailCollection.vb` |

---

## BR-018: Correspondence requires non-zero primary identifiers

| Field | Value |
| --- | --- |
| **Statement** | A correspondence item is invalid when the correspondence sequence number or policy number is zero. |
| **Trigger** | Validation of `clsCorrespondence`. |
| **Enforcement** | `clsCorrespondence.AddBusinessRules` using `CommonBusinessRules.NonZeroDecimalRequired`. |
| **Outcome** | Validation reports either `Error: Correspondence does not exist.` or `Error: Policy Number is required.` |
| **Confidence** | Verified |
| **Tables** | [ENDORSEMENT](database-tables.md#endorsement) |
| **SQL** | [SQL-002](sql/SQL-002-saif-business-policy-correspondence.md), [SQL-016](sql/SQL-016-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondence.vb` |

---

## BR-019: Correspondence codes must exist in ENDORSE_CODE

| Field | Value |
| --- | --- |
| **Statement** | A correspondence is only valid when its code resolves in the lazily loaded `ENDORSE_CODE` collection. |
| **Trigger** | Validation of `CorrespondenceCode`. |
| **Enforcement** | `clsCorrespondence.ValidCorrespondenceCode`. |
| **Outcome** | Validation reports `Error: Code is not valid.` when the code lookup returns nothing. |
| **Confidence** | Verified |
| **Tables** | [ENDORSE_CODE](database-tables.md#endorse_code) |
| **SQL** | [SQL-008](sql/SQL-008-saif-business-policy-correspondence.md), [SQL-009](sql/SQL-009-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondence.vb`; `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceCode.vb` |

---

## BR-020: Exemption endorsements use a fixed code set

| Field | Value |
| --- | --- |
| **Statement** | Only codes `380`, `381`, `382`, `383`, `384`, and `385` classify as exemption endorsements. |
| **Trigger** | Exemption classification check. |
| **Enforcement** | `clsEndorsement.IsExemptionEndorsement`. |
| **Outcome** | Callers can branch on exemption-specific endorsement behavior. |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsEndorsement.vb` |

---

## BR-021: Personal-election endorsements use a fixed code set

| Field | Value |
| --- | --- |
| **Statement** | Personal-election classification is limited to the `314*`, `315`, and `31501` code set defined in `clsEndorsement`. |
| **Trigger** | Personal-election classification check. |
| **Enforcement** | `clsEndorsement.IsPersonalElectionEndorsement`. |
| **Outcome** | Callers can identify the personal-election endorsement family through a shared helper. |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsEndorsement.vb` |

---

## BR-022: Longshore endorsements use a fixed code set

| Field | Value |
| --- | --- |
| **Statement** | Only codes `420` and `423` classify as longshore endorsements. |
| **Trigger** | Longshore classification check. |
| **Enforcement** | `clsEndorsement.IsLongshoreEndorsement`. |
| **Outcome** | Callers can branch on longshore-specific behavior. |
| **Confidence** | Verified |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsEndorsement.vb` |

---

## BR-023: Correspondence descriptions resolve through the code collection cache

| Field | Value |
| --- | --- |
| **Statement** | The correspondence description property reads `ENDORSE_CODE` metadata through `clsCodeCollection.GetCodeCollection(...)`. |
| **Trigger** | First access to `CorrespondenceCodes` or `CorrespondenceDescription`. |
| **Enforcement** | `clsCorrespondence.CorrespondenceCodes`; `clsCorrespondence.CorrespondenceDescription`. |
| **Outcome** | Descriptions and validation share the same cached code-table source. |
| **Confidence** | Verified |
| **Tables** | [ENDORSE_CODE](database-tables.md#endorse_code) |
| **SQL** | [SQL-008](sql/SQL-008-saif-business-policy-correspondence.md), [SQL-009](sql/SQL-009-saif-business-policy-correspondence.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsCorrespondence.vb` |

---

## BR-024: Explicit release dates override the computed document date

| Field | Value |
| --- | --- |
| **Statement** | The output-document package stores the caller-supplied release date as the document create date when one is provided. |
| **Trigger** | Stored-procedure execution with `in_release_date` populated. |
| **Enforcement** | `pk73343_output_document.insert_policy_output_document`. |
| **Outcome** | `OUTPUT_DOCUMENT.DOCUMENT_CREATE_DATE` uses the explicit date instead of `get_document_date()`. |
| **Confidence** | Verified |
| **Tables** | [OUTPUT_DOCUMENT](database-tables.md#output_document) |
| **SQL** | [SQL-004](sql/SQL-004-saif-business-policy-correspondence.md) |
| **Stored procedure** | [`pk73343_output_document`](procedures/pk73343_output_document.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsOutputDocumentInserter.vb` |

---

## BR-025: Non-agency-viewable output documents release immediately

| Field | Value |
| --- | --- |
| **Statement** | A document type with `AGENCY_VIEW_FLAG = ''N''` is stored in released status. |
| **Trigger** | Stored-procedure document-type lookup. |
| **Enforcement** | `pk73343_output_document.insert_policy_output_document`. |
| **Outcome** | `POLICY_OUTPUT_DOCUMENT.DOCUMENT_STATUS_CODE` is `RELE`. |
| **Confidence** | Verified |
| **Tables** | [OUTPUT_DOCUMENT_TYPE_CODE](database-tables.md#output_document_type_code), [POLICY_OUTPUT_DOCUMENT](database-tables.md#policy_output_document) |
| **SQL** | [SQL-004](sql/SQL-004-saif-business-policy-correspondence.md) |
| **Stored procedure** | [`pk73343_output_document`](procedures/pk73343_output_document.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsOutputDocumentInserter.vb` |

---

## BR-026: Held output documents require both agency visibility and hold flag

| Field | Value |
| --- | --- |
| **Statement** | Agency-viewable documents requested with `in_hold_flag = ''Y''` are stored in held status. |
| **Trigger** | Stored-procedure status derivation. |
| **Enforcement** | `pk73343_output_document.insert_policy_output_document`. |
| **Outcome** | `POLICY_OUTPUT_DOCUMENT.DOCUMENT_STATUS_CODE` is `HELD`. |
| **Confidence** | Verified |
| **Tables** | [POLICY_OUTPUT_DOCUMENT](database-tables.md#policy_output_document) |
| **SQL** | [SQL-004](sql/SQL-004-saif-business-policy-correspondence.md) |
| **Stored procedure** | [`pk73343_output_document`](procedures/pk73343_output_document.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsOutputDocumentInserter.vb` |

---

## BR-027: Agency-viewable non-held documents start pending

| Field | Value |
| --- | --- |
| **Statement** | Agency-viewable documents without the hold flag are stored in pending status. |
| **Trigger** | Stored-procedure status derivation. |
| **Enforcement** | `pk73343_output_document.insert_policy_output_document`. |
| **Outcome** | `POLICY_OUTPUT_DOCUMENT.DOCUMENT_STATUS_CODE` is `PEND`. |
| **Confidence** | Verified |
| **Tables** | [POLICY_OUTPUT_DOCUMENT](database-tables.md#policy_output_document) |
| **SQL** | [SQL-004](sql/SQL-004-saif-business-policy-correspondence.md) |
| **Stored procedure** | [`pk73343_output_document`](procedures/pk73343_output_document.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsOutputDocumentInserter.vb` |

---

## BR-028: Zero agency and agent numbers are normalized to NULL

| Field | Value |
| --- | --- |
| **Statement** | The output-document package stores zero agency or agent numbers as `NULL` rather than persisting zero. |
| **Trigger** | Stored-procedure policy-link insert. |
| **Enforcement** | `pk73343_output_document.insert_policy_output_document`. |
| **Outcome** | `POLICY_OUTPUT_DOCUMENT.AGENCY_SEQ_NUM` and `AGENT_NUM` are nullable output values. |
| **Confidence** | Verified |
| **Tables** | [POLICY_OUTPUT_DOCUMENT](database-tables.md#policy_output_document) |
| **SQL** | [SQL-004](sql/SQL-004-saif-business-policy-correspondence.md) |
| **Stored procedure** | [`pk73343_output_document`](procedures/pk73343_output_document.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsOutputDocumentInserter.vb` |

---

## BR-029: Release dates are set only for released policy-output rows

| Field | Value |
| --- | --- |
| **Statement** | The stored procedure populates `RELEASE_DATE` only when the derived document status is `RELE`. |
| **Trigger** | Stored-procedure policy-link insert. |
| **Enforcement** | `pk73343_output_document.insert_policy_output_document`. |
| **Outcome** | Held and pending rows keep a null release date. |
| **Confidence** | Verified |
| **Tables** | [POLICY_OUTPUT_DOCUMENT](database-tables.md#policy_output_document) |
| **SQL** | [SQL-004](sql/SQL-004-saif-business-policy-correspondence.md) |
| **Stored procedure** | [`pk73343_output_document`](procedures/pk73343_output_document.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsOutputDocumentInserter.vb` |

---

## BR-030: The standard output-document overload defaults to non-agency delivery

| Field | Value |
| --- | --- |
| **Statement** | The 11-argument insert path always delegates with `in_agency_delivery_flag = ''N''`, `in_endorse_seq_num = NULL`, and `in_task_user = NULL`. |
| **Trigger** | Use of `InsertOutputDocument`. |
| **Enforcement** | `clsOutputDocumentInserter.InsertOutputDocument` and the package overload it targets. |
| **Outcome** | Standard callers create non-agency-delivered policy output documents. |
| **Confidence** | Verified |
| **Tables** | [OUTPUT_DOCUMENT](database-tables.md#output_document), [POLICY_OUTPUT_DOCUMENT](database-tables.md#policy_output_document) |
| **SQL** | [SQL-004](sql/SQL-004-saif-business-policy-correspondence.md) |
| **Stored procedure** | [`pk73343_output_document`](procedures/pk73343_output_document.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsOutputDocumentInserter.vb` |

---

## BR-031: The agency-delivered overload passes the delivery flag through unchanged

| Field | Value |
| --- | --- |
| **Statement** | The 12-argument insert path preserves the agency-delivery flag while still defaulting endorsement and task-user values to null. |
| **Trigger** | Use of `InsertAgencyDeliveredOutputDocument`. |
| **Enforcement** | `clsOutputDocumentInserter.InsertAgencyDeliveredOutputDocument` and the package overload it targets. |
| **Outcome** | Agency-delivered policy output documents carry an explicit delivery marker. |
| **Confidence** | Verified |
| **Tables** | [OUTPUT_DOCUMENT](database-tables.md#output_document), [POLICY_OUTPUT_DOCUMENT](database-tables.md#policy_output_document) |
| **SQL** | [SQL-004](sql/SQL-004-saif-business-policy-correspondence.md) |
| **Stored procedure** | [`pk73343_output_document`](procedures/pk73343_output_document.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsOutputDocumentInserter.vb` |

---

## BR-032: The output-document procedure raises a standard SAIF error on exception

| Field | Value |
| --- | --- |
| **Statement** | The package traps `WHEN OTHERS` and re-raises a standard SAIF error with the call arguments and `SQLERRM`. |
| **Trigger** | Any unhandled database exception during output-document insertion. |
| **Enforcement** | `pk73343_output_document.insert_policy_output_document`. |
| **Outcome** | The procedure does not fail silently; it raises a standardized error payload. |
| **Confidence** | Verified |
| **Tables** | [OUTPUT_DOCUMENT](database-tables.md#output_document), [POLICY_OUTPUT_DOCUMENT](database-tables.md#policy_output_document) |
| **SQL** | [SQL-004](sql/SQL-004-saif-business-policy-correspondence.md) |
| **Stored procedure** | [`pk73343_output_document`](procedures/pk73343_output_document.md) |
| **Source** | `Business\SAIF.Business.Policy.Correspondence\clsOutputDocumentInserter.vb` |

---

## Inherited business rules

Rules in this section originate from documented BOF framework classes and are enforced through inherited behavior.

### From `clsBusinessBase` (`SAIF.Framework.Core`)

#### INH-001: BOF rules manager executes registered validation handlers

| Field | Value |
| --- | --- |
| **Statement** | Every `clsBusinessBase`-derived object owns a `clsRulesManager` that executes registered rule handlers and records broken rules.† |
| **Trigger** | Property setters or save paths invoke framework rule evaluation. |
| **Enforcement** | Inherited `clsBusinessBase.Rules` / `Rules.CheckRules(...)` behavior. |
| **Outcome** | Validation state is surfaced consistently across derived business objects. |
| **Confidence** | Verified |
| **Origin** | `SAIF.Framework.Core` — `clsBusinessBase` |
| **Source** | Retrieved from dependency documentation via Legends CLI |

---

### From `clsBusinessCollectionBase` (`SAIF.Framework.Core`)

#### INH-002: BOF collections surface broken-rule state through IDataErrorInfo

| Field | Value |
| --- | --- |
| **Statement** | `clsBusinessCollectionBase` exposes collection-level broken-rule state through `IDataErrorInfo`.† |
| **Trigger** | Child validation failures or aggregate collection errors. |
| **Enforcement** | Inherited `Error` and indexer members on the framework collection base class. |
| **Outcome** | UI and calling code can read collection error state without iterating every child item manually. |
| **Confidence** | Verified |
| **Origin** | `SAIF.Framework.Core` — `clsBusinessCollectionBase` |
| **Source** | Retrieved from dependency documentation via Legends CLI |


## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Operations and processes](operations-processes.md)
- [Database tables](database-tables.md)
- [SQL catalog](sql/index.md)
- [Configuration](configuration.md)
- [API reference](api/index.md)


> **Note:** Statements marked with * were inferred from code structure, naming conventions, or
> contextual evidence where direct confirmation was not available in source artifacts. Statements
> marked with ** could not be confirmed; treat as unknown until verified.
> Statements marked with † are derived from dependency library documentation via the Legends CLI.

## Sources
- `Business\SAIF.Business.Policy.Correspondence\clsCorrespondence.vb`
- `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceCode.vb`
- `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceCollection.vb`
- `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceDetail.vb`
- `Business\SAIF.Business.Policy.Correspondence\clsCorrespondenceDetailCollection.vb`
- `Business\SAIF.Business.Policy.Correspondence\clsEndorsement.vb`
- `Business\SAIF.Business.Policy.Correspondence\clsEndorsementCollection.vb`
- `Business\SAIF.Business.Policy.Correspondence\clsOutputDocumentInserter.vb`
