SAIF.Business.View.Policy business rules¶
This page captures business rules enforced by this library.
BR-VP-001 Policy number must be valid before retrieve¶
| Field | Value |
|---|---|
| Statement | A policy number must be valid before a policy retrieve is executed. |
| Trigger | Retrieving policy data |
| Enforcement | clsPolicyData.vb — ValidPolicyNum business rule (RuleData clsThrdpartySettlement01) |
| Outcome | Rule violation message "Error: Invalid policy number." and the retrieve is not performed |
| SQL | SQL-010 |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
BR-VP-002 Non-employer account number must not be zero¶
| Field | Value |
|---|---|
| Statement | A non-employer account number must not be zero. |
| Trigger | Retrieving a non-employer account |
| Enforcement | clsNonEmployerAccount.vb — IsValidAccountNumber |
| Outcome | Invalid account is rejected |
| SQL | SQL-006 |
| Source | SAIF.Business.View.Policy/clsNonEmployerAccount.vb |
BR-VP-003 Secure policy requires AD authorization¶
| Field | Value |
|---|---|
| Statement | A policy flagged with the SAIF secure policy code may only be viewed by users authorized for the SAIFpolicyInfo Active Directory resource. |
| Trigger | Policy authorization check |
| Enforcement | clsPolicySecurity.vb — IsPolicyValidForUser (~line 174) |
| Outcome | Access denied when not authorized |
| Source | SAIF.Business.View.Policy/clsPolicySecurity.vb |
BR-VP-004 Invalid or zero policy number is never valid¶
| Field | Value |
|---|---|
| Statement | An invalid or zero policy number is never valid for any user. |
| Trigger | Policy authorization check |
| Enforcement | clsPolicySecurity.vb — IsPolicyValidForUser |
| Outcome | Access denied |
| Source | SAIF.Business.View.Policy/clsPolicySecurity.vb |
BR-VP-005 Access granted per user-access-level matrix¶
| Field | Value |
|---|---|
| Statement | Access to a policy is granted according to the user access level matrix (SAIF employee, auditor, loss control, agent, group, policyholder, quick file user). |
| Trigger | Policy authorization check |
| Enforcement | clsPolicySecurity.vb — IsPolicyValidForUser, ConvertUserTypeToUserAccessLevel |
| Outcome | Access granted or denied per user type |
| SQL | SQL-023, SQL-024, SQL-025, SQL-026, SQL-027, SQL-028 |
| Source | SAIF.Business.View.Policy/clsPolicySecurity.vb |
BR-VP-006 Auditor 60-day access window¶
| Field | Value |
|---|---|
| Statement | An auditor may access a policy only within a 60-day window around the cancellation/completion date of the audit. |
| Trigger | Auditor authorization check |
| Enforcement | clsPolicySecurity.vb — CanAuditorAccessPolicy |
| Outcome | Access denied outside the window |
| Tables | PA_AUDIT, PA_AUDITOR, PA_POLICY_PERIOD |
| SQL | SQL-024 |
| Source | SAIF.Business.View.Policy/clsPolicySecurity.vb |
BR-VP-007 Loss control prefix match¶
| Field | Value |
|---|---|
| Statement | A loss control consultant may access a policy when the assigned consultant's user name matches the consultant prefix stored on the policy, truncated at the % character. |
| Trigger | Loss control authorization check |
| Enforcement | clsPolicySecurity.vb — IsPolicyValidForUser |
| Outcome | Access granted on prefix match |
| SQL | SQL-031 |
| Source | SAIF.Business.View.Policy/clsPolicySecurity.vb |
BR-VP-008 Demo loss control matched on UserIdName¶
| Field | Value |
|---|---|
| Statement | Demo loss control users are matched on UserIdName instead of UserName. |
| Trigger | Loss control authorization check for a demo user |
| Enforcement | clsPolicySecurity.vb — IsPolicyValidForUser |
| Outcome | Demo user matched against the demo identity |
| Source | SAIF.Business.View.Policy/clsPolicySecurity.vb |
BR-VP-009 Fallback to parent-policy authorization¶
| Field | Value |
|---|---|
| Statement | If a user is not authorized for a policy directly, authorization is re-evaluated against the policy's parent policy. |
| Trigger | Policy authorization check fails directly |
| Enforcement | clsPolicySecurity.vb — IsPolicyValidForParentPolicy |
| Outcome | Access may still be granted through the parent |
| SQL | SQL-013 |
| Source | SAIF.Business.View.Policy/clsPolicySecurity.vb |
BR-VP-010 Demo users see masked data¶
| Field | Value |
|---|---|
| Statement | Demo users see masked policy, address, agency and team member data. |
| Trigger | Retrieving data while the current user is a demo user type |
| Enforcement | clsPolicyData.vb, clsPolicyAddress.vb, clsAgency.vb, clsTeamAssignment.vb — MaskData using clsConstants.DataMaskingConstants |
| Outcome | Sensitive values replaced with masking constants |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
BR-VP-011 Policy always affiliated with itself¶
| Field | Value |
|---|---|
| Statement | A policy is always at least affiliated with itself. |
| Trigger | Building the affiliated policy list |
| Enforcement | clsPolicyData.vb — affiliate list logic |
| Outcome | The source policy is always present in the affiliate list |
| SQL | SQL-001 |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
BR-VP-012 Affiliated policy list filtered by agentagency¶
| Field | Value |
|---|---|
| Statement | The affiliated policy list is filtered by the requesting agent or agency. |
| Trigger | Building the affiliated policy list for an agent user |
| Enforcement | clsPolicyData.vb — affiliate list logic |
| Outcome | Only affiliated policies belonging to the agent/agency remain |
| SQL | SQL-001, SQL-014 |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
BR-VP-013 DisplayAffiliatedPolices matrix controls display¶
| Field | Value |
|---|---|
| Statement | Whether affiliated policies are displayed is determined by the DisplayAffiliatedPolices user-type matrix. |
| Trigger | Requesting affiliated policies |
| Enforcement | clsPolicyData.vb — DisplayAffiliatedPolices (lines ~234-275) |
| Outcome | Affiliated policies shown or suppressed |
| SQL | SQL-014 |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
BR-VP-014 Source policy excluded from associations by default¶
| Field | Value |
|---|---|
| Statement | The source policy is excluded from an association list unless the caller explicitly requests its inclusion. |
| Trigger | Building a policy association list |
| Enforcement | PolicyAssociations.vb — GetPolicyAssociationList (IncludeSourcePolicy) |
| Outcome | Source policy omitted by default |
| Tables | POLICY_RELATIONSHIP, POLICY |
| SQL | SQL-034 |
| Source | SAIF.Business.View.Policy/PolicyAssociations.vb |
BR-VP-015 Preferred association type overrides derived type¶
| Field | Value |
|---|---|
| Statement | When a preferred association type is supplied it overrides the association type otherwise derived for the policy. |
| Trigger | Building association headers |
| Enforcement | Associations/clsPolicyAssociationFactory.vb — clsPolicyHeaderAssociationFactory |
| Outcome | Preferred type is used |
| SQL | SQL-004 |
| Source | SAIF.Business.View.Policy/Associations/clsPolicyAssociationFactory.vb |
BR-VP-016 Market type mapping¶
| Field | Value |
|---|---|
| Statement | A market type of VOL is Voluntary; any other market type is Assigned Risk. |
| Trigger | Mapping policy data after retrieve |
| Enforcement | clsPolicyData.vb (lines ~443-457) |
| Outcome | Market type display value set |
| SQL | SQL-010 |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
BR-VP-017 Future cancel date only for Pending Cancellation¶
| Field | Value |
|---|---|
| Statement | A future cancel date is only populated when the policy status is Pending Cancellation. |
| Trigger | Reading the future cancel date |
| Enforcement | clsPolicyData.vb — GetFutureCancelDate (lines ~643-760) |
| Outcome | Date returned only for pending cancellation, otherwise unset |
| Tables | CANCELLATION |
| SQL | SQL-015, SQL-020 |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
BR-VP-018 Currentrenewal period selection¶
| Field | Value |
|---|---|
| Statement | A policy period is the current period when its status is "Open" and the renewal period when its status is "Renew". |
| Trigger | Selecting the current or renewal period |
| Enforcement | clsPolicyData.vb — isCurrentPolicyPeriod, isRenewalPolicyPeriod (lines ~1425-1505) |
| Outcome | Corresponding period is selected |
| SQL | SQL-022 |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
BR-VP-019 Latest printed information-page period¶
| Field | Value |
|---|---|
| Statement | The latest policy period with a printed information page is selected by scanning the periods in order. |
| Trigger | Requesting the latest printed information page period |
| Enforcement | clsPolicyData.vb — GetLatestPolicyPeriodInfoPagePrinted |
| Outcome | Most recent qualifying period returned |
| SQL | SQL-017, SQL-022 |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
BR-VP-020 Association type is secured when security group set¶
| Field | Value |
|---|---|
| Statement | An association type is a secured type when its security group name is not blank. |
| Trigger | Evaluating an association type |
| Enforcement | Associations/clsAssociationTypeCode.vb — AssociationTypeExtensions.IsSecuredType |
| Outcome | Type treated as secured |
| Tables | ASSOCIATION_TYPE_CODE |
| SQL | SQL-005 |
| Source | SAIF.Business.View.Policy/Associations/clsAssociationTypeCode.vb |
BR-VP-021 Association category prefix classification¶
| Field | Value |
|---|---|
| Statement | Association categories are identified by prefix: MR is a manual relationship and PR is a policy relationship; manual categories use the prefix "M". |
| Trigger | Classifying an association type code |
| Enforcement | Associations/clsAssociationTypeCode.vb — category constants and ToAssociationCategoryPrefixCode |
| Outcome | Association classified as manual or policy relationship |
| SQL | SQL-005 |
| Source | SAIF.Business.View.Policy/Associations/clsAssociationTypeCode.vb |
BR-VP-022 Team member email address derivation¶
| Field | Value |
|---|---|
| Statement | A team member's email address is derived from the assigned unit: SERVIC, SCLC and SAFETYSERVICES produce an @saif.com address; non-SAIF members are resolved by external client lookup; all other, inactive or blank entries produce an empty address. |
| Trigger | Initialising a team assignment |
| Enforcement | clsTeamAssignment.vb — InitializeEmailAddress, InitializeEmailAddressUsingSystemUser |
| Outcome | Email address set or left empty |
| SQL | SQL-029, SQL-030 |
| Source | SAIF.Business.View.Policy/clsTeamAssignment.vb |
BR-VP-023 Login date on or before 2000-01-01 is never logged in¶
| Field | Value |
|---|---|
| Statement | A login date on or before 1 January 2000 is treated as "never logged in". |
| Trigger | Reading policyholder login dates |
| Enforcement | clsPolicyData.vb — login date properties |
| Outcome | Date treated as no login |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
BR-VP-024 Default association dates¶
| Field | Value |
|---|---|
| Statement | When association dates are not supplied, the endorsement/combination date defaults to the data source date and the combined policy period date defaults to the maximum policy period effective date. |
| Trigger | Retrieving associations without explicit dates |
| Enforcement | PolicyAssociations.vb — GetPolicyAssociationList, GetMaxPolicyEffectiveDate |
| Outcome | Default dates applied to the query |
| Tables | POLICY_PERIOD |
| SQL | SQL-034, SQL-035 |
| Source | SAIF.Business.View.Policy/PolicyAssociations.vb |
BR-VP-025 Missing agency row records a No data found error¶
| Field | Value |
|---|---|
| Statement | When no agency row is returned for a policy, a "No data found" error message is added to the object. |
| Trigger | Retrieving agency data |
| Enforcement | clsAgency.vb — AfterRetrieve (AddErrorMessage("NoDataFoundError", "No data found")) |
| Outcome | Error message recorded on the business object |
| SQL | SQL-002 |
| Source | SAIF.Business.View.Policy/clsAgency.vb |
BR-VP-026 Detail-read failure does not fail overall retrieve¶
| Field | Value |
|---|---|
| Statement | Failure to read policy detail does not fail the overall policy retrieve. |
| Trigger | Lazy reading policy detail |
| Enforcement | clsPolicyData.vb — LazyRead(PolicyDetail) |
| Outcome | Exception swallowed; detail fields remain unset |
| SQL | SQL-011 |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
BR-VP-027 CreateInsertUpdateDelete SQL are invalid¶
| Field | Value |
|---|---|
| Statement | The create, insert, update and delete SQL properties of this library's criteria are not valid operations. |
| Trigger | Any attempt to persist through these business objects |
| Enforcement | All Criteria classes in SAIF.Business.View.Policy |
| Outcome | Empty statement returned or ApplicationException(clsConstants.Messages.InvalidSQLProperty) thrown |
| Source | SAIF.Business.View.Policy/clsPolicyData.vb |
Stored procedure business rules¶
Rules sourced from Oracle and SQL Server stored procedures referenced by this library.
| Rule ID | Rule | Source | Link |
|---|---|---|---|
| PR-BVP-001 | Cancel-status derivation is dispatched on the policy status group | sp72268_get_cancel_status |
Details |
| PR-BVP-002 | Cancelled policies use the full cancel-status precedence chain | sp72268_get_cancel_status |
Details |
| PR-BVP-003 | A policy is Judgment status when a judgment legal action is open | sp72268_get_cancel_status |
Details |
| PR-BVP-004 | A policy is Lien status when an open lien legal action exists | sp72268_get_cancel_status |
Details |
| PR-BVP-005 | A policy is Defaulted when the demand response indicates default | sp72268_get_cancel_status |
Details |
| PR-BVP-006 | A policy is Demanded when a demand exists with no response recorded | sp72268_get_cancel_status |
Details |
| PR-BVP-007 | A policy is Pending Audit when a physical audit is outstanding before cancellation | sp72268_get_cancel_status |
Details |
| PR-BVP-008 | A policy is Pending PR when an audit is outstanding but is not a physical audit | sp72268_get_cancel_status |
Details |
| PR-BVP-009 | A cancelled policy carrying a balance is reported as Closed with Balance | sp72268_get_cancel_status |
Details |
| PR-BVP-010 | Application-status policies not owned by WCIS are reported as saifQuote |
sp72268_get_cancel_status |
Details |
| PR-BVP-011 | Unhandled errors are surfaced as an application error, not silently swallowed | sp72268_get_cancel_status |
Details |
| PR-BVP-012 | Coverage-bound indicator is delegated to the shared bound check | sp73089_get_policy_bound_flag |
Details |
| PR-BVP-013 | Information-page printed indicator is delegated to sp72253_info_page_printed |
SP72347_INFO_PAGE_PRINTED_YN |
Details |
| PR-BVP-014 | Unhandled errors are surfaced as an application error | SP72347_INFO_PAGE_PRINTED_YN |
Details |
| PR-BVP-015 | External client identity is sourced from system_user_contractor, replacing the legacy net_registrant source |
sp73341_external_client_lookup |
Details |
| PR-BVP-016 | A lookup miss yields NULL rather than an error | sp73341_external_client_lookup |
Details |
| PR-BVP-017 | Monetary header values are null-safe | pk73094_policy_data.getpolicy |
Details |
| PR-BVP-018 | Cancel status on the policy header is always the shared derivation, never a stored column | pk73094_policy_data.getpolicy |
Details |
| PR-BVP-019 | SIC code is deliberately not returned by this view | pk73094_policy_data.getpolicy |
Details |
| PR-BVP-020 | The "best" policy for an account is chosen by a fixed ranking | pk73094_policy_data.get_account_name |
Details |
| PR-BVP-021 | A null account number yields no name | pk73094_policy_data.get_account_name |
Details |
| PR-BVP-022 | Affiliate type defaults to non-affiliated | pk72846_view_policy.getpolicyaffiliatetype |
Details |
| PR-BVP-023 | Policyholder-user callers get PHP affiliation resolved first | pk72846_view_policy.getpolicyaffiliatetype |
Details |
| PR-BVP-024 | Wrap-up and leasing relationships are classified parent vs member by self-reference | pk72846_view_policy.getpolicyaffiliatetype |
Details |
| PR-BVP-025 | Sub-account and out-of-region relationships use the same self-reference test | pk72846_view_policy.getpolicyaffiliatetype |
Details |
| PR-BVP-026 | Combination-rated policies are classified from the rate account | pk72846_view_policy.getpolicyaffiliatetype |
Details |
| PR-BVP-027 | Minimum-premium combo membership is resolved from the latest combo period | pk72846_view_policy.getpolicyaffiliatetype |
Details |
| PR-BVP-028 | Parent policy is resolved from the affiliate type | pk72846_view_policy.getparentpolicy |
Details |
| PR-BVP-029 | A policy that is not a member is its own parent | pk72846_view_policy.getparentpolicy |
Details |
| PR-BVP-030 | Flat-cancelled and prospect periods never participate in gap calculation | pk72846_view_policy.getgaps |
Details |
| PR-BVP-031 | Coverage gaps combine computed gaps with explicitly recorded gaps | pk72846_view_policy.getgaps |
Details |
| PR-BVP-032 | Claim address requests fall back to the policy address when no current claim location exists | pk72846_view_policy.getpolicyaddress |
Details |
| PR-BVP-033 | A missing contact first name displays as Policyholder |
pk72846_view_policy.getpolicyaddress |
Details |
| PR-BVP-034 | Only currently effective locations are returned, most recent first | pk72846_view_policy.getpolicyaddress |
Details |
| PR-BVP-035 | Zero means "return every period" | pk72846_view_policy.getpolicyperiods |
Details |
| PR-BVP-036 | Rating values are masked unless the information page has printed | pk72846_view_policy.getpolicyperiods |
Details |
| PR-BVP-037 | Tentatively rated plans are flagged with an asterisk | pk72846_view_policy.getpolicyperiods |
Details |
| PR-BVP-038 | Only screen-ordered team rows are returned for a policy | pk72846_view_policy.team_assign_query |
Details |
| PR-BVP-039 | Agent of record is resolved through the commission authorization package and excludes agent zero | pk72846_view_policy.team_assign_query |
Details |
| PR-BVP-040 | Agency phone falls back to the location phone when no statement address sequence exists | pk72846_view_policy.team_assign_query |
Details |
| PR-BVP-041 | Waiver presence is a count over waiver detail | Pk82033_ThirdParty.get_policy_waiver_count |
Details |
| PR-BVP-042 | Employer-liability limits resolve through a six-branch precedence union | coveragelimits_pkg.getSpecificLimitsForPolicyNum |
Details |
| PR-BVP-043 | Limit amounts are returned pre-formatted for display | coveragelimits_pkg.getSpecificLimitsForPolicyNum |
Details |
| PR-BVP-044 | Group membership evaluation reads uncommitted data by design | cp_policy_in_group |
Details |
| PR-BVP-045 | The query variant is selected by how the supplied group id is registered | cp_policy_in_group |
Details |
| PR-BVP-046 | Group parents are excluded from group evaluation | cp_policy_in_group |
Details |
| PR-BVP-047 | Only the most recent covered policy period participates | cp_policy_in_group |
Details |
| PR-BVP-048 | A non-zero count means the policy is in the group | cp_policy_in_group |
Details |
| PR-BVP-049 | The report date is normalised to a date without time | cp_claimprofile_get_group_policy_list |
Details |
| PR-BVP-050 | A policy period qualifies if it is the most recent covered period, or the last period in the group still within the report window | cp_claimprofile_get_group_policy_list |
Details |
| PR-BVP-051 | Only active policies with unexpired group membership are listed | cp_claimprofile_get_group_policy_list |
Details |
| PR-BVP-052 | The placeholder chapter code NC is not shown to users |
cp_claimprofile_get_group_policy_list |
Details |
| PR-BVP-053 | The loss-control filter supports wildcard matching | cp_claimprofile_get_sc_book |
Details |
| PR-BVP-054 | Flat-cancelled periods are excluded from the safety-consultant book | cp_claimprofile_get_sc_book |
Details |
| PR-BVP-055 | Only active policies with an assigned loss-control consultant are listed | cp_claimprofile_get_sc_book |
Details |
| PR-BVP-056 | The list combines active policies and policies closed within the last five years | cp_get_agent_online_policy_list |
Details |
| PR-BVP-057 | @ForAgency switches the identifier between agency and agent |
cp_get_agent_online_policy_list |
Details |
| PR-BVP-058 | Rate information is viewable only for the policy's own rate account or an in-book rate account | cp_get_agent_online_policy_list |
Details |
| PR-BVP-059 | Sales plan is derived from the policy plan description | cp_get_agent_online_policy_list |
Details |
| PR-BVP-060 | A policy in status 3 is flagged as pending cancel |
cp_get_agent_online_policy_list |
Details |
| PR-BVP-061 | Current certificates flag reflects existence of certificate detail rows | cp_get_agent_online_policy_list |
Details |
| PR-BVP-062 | Group name is shown only for unexpired group memberships | cp_get_agent_online_policy_list |
Details |
| PR-BVP-063 | Only one active, non-test registrant is returned — the most recently updated | cp_external_client_lookup |
Details |
| PR-BVP-064 | All association types grouped into one category must resolve to a single source procedure | clsAssociationTypeCode (dynamic dispatch) |
Details |
Notes¶
- All 35 SQL statements in this library are Read-only; there are zero Create/Insert/Update/Delete statements, consistent with BR-VP-027.
- 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.
Related documentation¶
- Index
- Overview
- Architecture
- Dependencies
- Configuration
- Operations and processes
- Security and authorization
- Database tables
- SQL catalog
- Procedures
- API reference
Sources¶
SAIF.Business.View.Policy/clsPolicyData.vbSAIF.Business.View.Policy/clsPolicySecurity.vbSAIF.Business.View.Policy/clsPolicyPeriod.vbSAIF.Business.View.Policy/clsTeamAssignment.vbSAIF.Business.View.Policy/clsTeamAssignmentCollection.vbSAIF.Business.View.Policy/Associations/clsPolicyAssociation.vbSAIF.Business.View.Policy/clsPolicySecurity.vbSAIF.Business.View.Policy/clsPolicyData.vbSAIF.Business.View.Policy/clsTeamAssignment.vbSAIF.Business.View.Policy/clsTeamAssignmentCollection.vbSAIF.Business.View.Policy/app.configSAIF.Business.View.Policy/Web.config