﻿---
title: "PolicyOutputDocumentExtensions"
summary: API reference for PolicyOutputDocumentExtensions
status: draft
owner: SAIF.Core documentation team
last_reviewed: 2026-09-24
library: SAIF.Data.NHibernate
reference_type: package
---


# PolicyOutputDocumentExtensions

`PolicyOutputDocumentExtensions` is a static class of `IQueryable<PolicyOutputDocument>` filter extension methods, composed by [PolicyOutputDocumentRepository](PolicyOutputDocumentRepository.md) to build its agency-viewability, status, and scoping queries. Each method appends exactly one `Where` clause and returns the query unchanged for further chaining, so callers build compound filters by chaining calls (e.g. `Query().AgencyViewable().Released().ForPolicyOrAccount()`); this pattern duplicates equivalent filter logic that exists in SAIF.Data's own `PolicyOutputDocumentExtensions` ([SDN-BR-061](../../business-rules.md#sdn-br-061-agencies-see-only-released%2C-agency-viewable-documents), `saif-data-nhibernate-analysis.md`).

## Purpose
- Provide composable, single-purpose `IQueryable<PolicyOutputDocument>` filters for document status (`Released`/`Held`/`Pending`/`HeldAndPending`), agency visibility (`AgencyViewable`/`AgencyInboxViewable`/`AgencyDeleted`/`NotAgencyDeleted`/`NonViewed`), and scoping (policy, agency, producer, parent policy, category, relationship type, document types, release/document date), used by `PolicyOutputDocumentRepository` to assemble its agency-facing queries.

## Context
- Namespace: `SAIF.Data.NHibernate.Repositories.OutputDocuments`
- Assembly/package: `SAIF.Data.NHibernate` (ships inside the `SAIF.SAIFCode.Core` NuGet package)
- Static class; all members are extension methods on `IQueryable<PolicyOutputDocument>` and return `IQueryable<PolicyOutputDocument>` for chaining. No base class or interface.

## Public members
| Member | Signature | Purpose |
| --- | --- | --- |
| ForPolicy | `public static IQueryable<PolicyOutputDocument> ForPolicy(this IQueryable<PolicyOutputDocument> query, long policyNumber)` | Filters to documents whose `Policy.PolicyNumber` equals `policyNumber`. |
| Released | `public static IQueryable<PolicyOutputDocument> Released(this IQueryable<PolicyOutputDocument> query)` | Filters to documents whose `DocumentStatus.Code` equals `DocumentStatusCode.ReleasedDocumentStatusCode` ([SDN-BR-061](../../business-rules.md#sdn-br-061-agencies-see-only-released%2C-agency-viewable-documents)). |
| AgencyViewable | `public static IQueryable<PolicyOutputDocument> AgencyViewable(this IQueryable<PolicyOutputDocument> query)` | Filters to documents whose `OutputDocument.DocumentType.IsAgencyViewable` is `true` ([SDN-BR-061](../../business-rules.md#sdn-br-061-agencies-see-only-released%2C-agency-viewable-documents)). |
| AgencyInboxViewable | `public static IQueryable<PolicyOutputDocument> AgencyInboxViewable(this IQueryable<PolicyOutputDocument> query)` | Filters to documents whose `OutputDocument.DocumentType.IsAgencyInboxViewable` is `true` ([SDN-BR-061](../../business-rules.md#sdn-br-061-agencies-see-only-released%2C-agency-viewable-documents)). |
| Held | `public static IQueryable<PolicyOutputDocument> Held(this IQueryable<PolicyOutputDocument> query)` | Filters to documents whose `DocumentStatus.Code` equals `DocumentStatusCode.HeldDocumentStatusCode`. |
| Pending | `public static IQueryable<PolicyOutputDocument> Pending(this IQueryable<PolicyOutputDocument> query)` | Filters to documents whose `DocumentStatus.Code` equals `DocumentStatusCode.PendingDocumentStatusCode`. |
| HeldAndPending | `public static IQueryable<PolicyOutputDocument> HeldAndPending(this IQueryable<PolicyOutputDocument> query)` | Filters to documents whose `DocumentStatus.Code` is either `HeldDocumentStatusCode` or `PendingDocumentStatusCode`. |
| ForAgency | `public static IQueryable<PolicyOutputDocument> ForAgency(this IQueryable<PolicyOutputDocument> query, long agencyId)` | Filters to documents whose `AgencyId` equals `agencyId`. |
| AgencyDeleted | `public static IQueryable<PolicyOutputDocument> AgencyDeleted(this IQueryable<PolicyOutputDocument> query)` | Filters to documents whose `AgencyDeleteDate` is not null, i.e. documents the agency has marked deleted ([SDN-BR-060](../../business-rules.md#sdn-br-060-agency-inbox%3A-unread-%3D-not-viewed-and-not-agency-deleted)). |
| NotAgencyDeleted | `public static IQueryable<PolicyOutputDocument> NotAgencyDeleted(this IQueryable<PolicyOutputDocument> query)` | Filters to documents whose `AgencyDeleteDate` is null, i.e. not agency-deleted ([SDN-BR-060](../../business-rules.md#sdn-br-060-agency-inbox%3A-unread-%3D-not-viewed-and-not-agency-deleted)). |
| ReleasedOnOrAfter | `public static IQueryable<PolicyOutputDocument> ReleasedOnOrAfter(this IQueryable<PolicyOutputDocument> query, DateTime date)` | Filters to documents whose `ReleaseDate` is greater than or equal to `date`. |
| ForProducer | `public static IQueryable<PolicyOutputDocument> ForProducer(this IQueryable<PolicyOutputDocument> query, long producerId)` | Filters to documents whose `AgentId` equals `producerId`. |
| NonViewed | `public static IQueryable<PolicyOutputDocument> NonViewed(this IQueryable<PolicyOutputDocument> query)` | Filters to documents whose `AgencyViewed` is `false`, i.e. not yet viewed by the agency ([SDN-BR-060](../../business-rules.md#sdn-br-060-agency-inbox%3A-unread-%3D-not-viewed-and-not-agency-deleted)). |
| ForCategory | `public static IQueryable<PolicyOutputDocument> ForCategory(this IQueryable<PolicyOutputDocument> query, string documentCategory)` | Returns `query` unfiltered if `documentCategory` is null/whitespace or equals `"ALL"`; otherwise filters to documents whose `OutputDocument.DocumentType.DocumentCategory.Code` equals `documentCategory` ([SDN-BR-062](../../business-rules.md#sdn-br-062-category-%22all%22-or-blank-means-no-filter)). |
| ForParentPolicy | `public static IQueryable<PolicyOutputDocument> ForParentPolicy(this IQueryable<PolicyOutputDocument> query, long parentPolicyNumber)` | Filters to documents whose `Policy.RelationshipPolicy.PolicyNumber` equals `parentPolicyNumber` **and** whose own `Policy.PolicyNumber` differs from that relationship policy number — i.e. true child policies only, excluding the parent policy's own documents. |
| ForRelationshipType | `public static IQueryable<PolicyOutputDocument> ForRelationshipType(this IQueryable<PolicyOutputDocument> query, string relationshipType)` | Returns `query` unfiltered if `relationshipType` is null/whitespace; otherwise filters to documents whose `Policy.Relationship.Code` equals `relationshipType`. |
| ForDocumentTypes | `public static IQueryable<PolicyOutputDocument> ForDocumentTypes(this IQueryable<PolicyOutputDocument> query, string documentType)` | Filters to documents whose `OutputDocument.DocumentType.Code` is contained within the caller-supplied `documentType` string (a reversed `Contains` check: `documentType.Contains(p.OutputDocument.DocumentType.Code)`), intended for a delimited list of allowed type codes passed as a single string*. |
| ForReleaseDate | `public static IQueryable<PolicyOutputDocument> ForReleaseDate(this IQueryable<PolicyOutputDocument> query, DateTime releaseDate)` | Filters to documents whose `ReleaseDate` equals `releaseDate` exactly. |
| ForDocumentDate | `public static IQueryable<PolicyOutputDocument> ForDocumentDate(this IQueryable<PolicyOutputDocument> query, DateTime documentDate)` | Filters to documents whose `OutputDocument.DocumentDate` equals `documentDate` exactly. |

## Behavioral notes
- Every method is a single `.Where()` clause with no side effects; none execute the query themselves — materialization (`ToList()`/`Any()`) happens in the calling repository method.
- `ForDocumentTypes` uses `documentType.Contains(p.OutputDocument.DocumentType.Code)` — the containment check runs with the *document type code* as the needle and the caller-supplied `documentType` string as the haystack, which only behaves as a "type is in this delimited list" filter if `documentType` is a concatenation of type codes with no separator collisions; a single exact type code passed here would still match via substring containment, which can over-match if one code is a substring of another*.
- `ForCategory` and `ForRelationshipType` both use the "blank means unfiltered" sentinel convention, but `ForCategory` additionally special-cases the literal string `"ALL"` while `ForRelationshipType` does not ([SDN-BR-062](../../business-rules.md#sdn-br-062-category-%22all%22-or-blank-means-no-filter)).

## Constraints and usage notes
- These filters assume `IQueryable<PolicyOutputDocument>` navigation properties (`Policy`, `OutputDocument`, `DocumentStatus`, etc.) translate to SQL via NHibernate LINQ; calling them against an already-materialized `IEnumerable` would evaluate correctly but without SQL-side filtering, which the source does not do (all callers chain them directly on `Query()`/`EagerLoadQuery()` results before materializing)*.

> **Note:** Statements marked with `†` are derived from dependency library
> documentation via the Legends CLI. Statements marked with `*` were inferred
> from code structure or contextual evidence. Statements marked with `**` could
> not be confirmed; treat as unknown until verified.

## Related documentation
- [Index](../../index.md)
- [Overview](../../overview.md)
- [Architecture](../../architecture.md)
- [Dependencies](../../dependencies.md)
- [Operations and processes](../../operations-processes.md)
- [Business rules](../../business-rules.md)
- [Database tables](../../database-tables.md)
- [SQL catalog](../../sql/index.md)
- [Procedures](../../procedures/index.md)
- [Security and authorization](../../security-authorization.md)
- [API reference](../index.md)

## Sources
- `Data/SAIF.Data.NHibernate/Repositories/OutputDocuments/PolicyOutputDocumentRepository.cs`
