---
title: "pk82001_claim stored procedure documentation"
summary: "Analysis of Oracle package/procedure including business rules and operations."
status: draft
owner: "SAIF"
last_reviewed: "2026-07-24"
source_schema: "`WCIS_DBA`"
source_name: "pk82001_claim"
source_type: "`Package`"
oracle_status: "found"
library: SAIF.Business
reference_type: package
---

# pk82001_claim

## Overview

| Field | Value |
| --- | --- |
| **Schema** | `WCIS_DBA` |
| **Type** | `Package` |
| **Database** | Oracle |
| **Calling libraries** | `SAIF.Business` |
| **Calling classes** | `ClaimServices` |

## Purpose

Claim-address package that resolves person mailing or payment addresses using date-sensitive fallback logic.

## Procedures / Methods

### getPersonAddress_GW

| Field | Value |
| --- | --- |
| **Returns** | A `REF CURSOR` recordset containing the resolved address fields, or an empty cursor when no qualifying address exists. |
| **Called by** | `ClaimServices.GetBeneficiaryAddresses`, `ClaimServices.GetWorkerAddress` |

**Description:** Resolves person mailing, payment, guardian, and home addresses using staged person-address rows plus fallback rules.

#### Parameters

| Parameter | Direction | Type | Default | Description |
| --- | --- | --- | --- | --- |
| `recordset` | OUT | person_address_cursor_GW | — | Result cursor returned to the caller. |
| `inPersonID` | IN | NUMBER | — | Person identifier used by the package. |
| `inAddrType` | IN | VARCHAR2 | — | Requested address type code. |
| `inDate` | IN | VARCHAR2 | — | Effective date used by the package. |
| `inRunId` | IN | VARCHAR2 | — | Run identifier used to read staged person-address rows. |

## Business Rules

Rules extracted from this procedure's verified logic:

| Rule ID | Rule | Condition | Action |
| --- | --- | --- | --- |
| [PROC-RULE-005](../business-rules.md#proc-rule-005-the-procedure-uses-the-caller-supplied-date-when-one-is-provided) | The procedure uses the caller-supplied date when one is provided. | `inDate IS NOT NULL`. | Convert `inDate` with `TO_DATE(inDate, 'MM/DD/YYYY')` and assign it to `v_date`. |
| [PROC-RULE-006](../business-rules.md#proc-rule-006-default-correspondence-address-lookup-falls-back-from-guardian-to-mailing-to-home-address) | Default correspondence address lookup falls back from guardian to mailing to home address. | `inAddrType = '1'`. | Test address existence for `G`, then `M`, then `H`, and use the first qualifying type. |
| [PROC-RULE-007](../business-rules.md#proc-rule-007-default-payment-address-lookup-falls-back-from-guardian-to-payment-to-mailing-to-home-address) | Default payment address lookup falls back from guardian to payment to mailing to home address. | `inAddrType = '2'`. | Test address existence for `G`, then `P`, then `M`, then `H`, and use the first qualifying type. |
| [PROC-RULE-008](../business-rules.md#proc-rule-008-explicit-payment-requests-only-use-payment-addresses) | Explicit payment requests only use payment addresses. | `inAddrType = 'P'` and the payment address exists. | Select address type `P`. |
| [PROC-RULE-009](../business-rules.md#proc-rule-009-other-requests-use-the-requested-address-type-directly) | Other requests use the requested address type directly. | `inAddrType` is not `1`, `2`, or `P`, and `typeAddressExists_GW` returns true. | Keep the requested address type as `v_addresstypefound`. |
| [PROC-RULE-010](../business-rules.md#proc-rule-010-guardian-correspondence-resolves-the-guardian-mailing-address-and-inserts-a-for-line-for-the-worker-beneficiary) | Guardian correspondence resolves the guardian mailing address and inserts a `For:` line for the worker/beneficiary. | `v_addrtype = 'G'` after address selection. | Resolve the guardian `person_id`, switch the address code to `M`, shift address lines, and populate `v_address_line1` with `For: <name>`. |
| [PROC-RULE-011](../business-rules.md#proc-rule-011-deceased-people-are-addressed-as-estates) | Deceased people are addressed as estates. | `pra.death_date` is not null in the address lookup row. | Prefix the person name with `Estate of`. |
| [PROC-RULE-012](../business-rules.md#proc-rule-012-blank-address-lines-are-compacted-upward-to-eliminate-gaps) | Blank address lines are compacted upward to eliminate gaps. | Any of `v_address_line1` through `v_address_line4` is blank while later lines contain data. | Shift lower address lines into the first available blank slot. |
| [PROC-RULE-013](../business-rules.md#proc-rule-013-addressee-salutation-is-gender-based) | Addressee salutation is gender-based. | `v_gender = 'M'`, `v_gender = 'F'`, or any other value. | Set `v_addressee` to `Mr.`, `Ms.`, or `M.` plus the last name. |
| [PROC-RULE-014](../business-rules.md#proc-rule-014-an-address-is-valid-only-when-it-has-a-person-name-two-populated-address-lines-and-either-foreign-address-status-or-a-city-state-pair) | An address is valid only when it has a person name, two populated address lines, and either foreign-address status or a city/state pair. | `v_person_name`, `v_address_line1`, and `v_address_line2` are nonblank, plus `v_foreign_address_flag = 'Y'` or both `v_city_name` and `v_state_code` are nonblank. | Set `v_isvalidaddress` to `Y`. |
| [PROC-RULE-015](../business-rules.md#proc-rule-015-requests-with-no-qualifying-address-return-no-rows) | Requests with no qualifying address return no rows. | `v_addresstypefound <> v_addrtype`. | Open the `DUAL` cursor with `WHERE v_EMPTY = 'Y'` to return an empty result set. |

> These rules are documented in [business-rules.md](../business-rules.md).

## Operations

Operations and processes implemented in this procedure:

| Operation | Description | Trigger |
| --- | --- | --- |
| OP-005 | Evaluates address availability through `typeAddressExists_GW` using payment, date, and latest-timestamp filters. | Each address-type fallback branch calls the helper. |
| OP-006 | Resolves the guardian `person_id` when guardian correspondence is selected. | Guardian address path (`v_addrtype = 'G'`). |
| OP-007 | Selects the latest qualifying person-address row and computes the returned name and address fields. | A qualifying address type is found. |
| OP-008 | Loads the worker/beneficiary name for guardian mailings and shifts address lines to insert the `For:` line. | Guardian address path (`v_addrtype = 'G'`). |
| OP-009 | Returns the assembled address data through a cursor backed by `DUAL`. | `v_addresstypefound = v_addrtype`. |
| OP-010 | Returns an empty cursor when no qualifying address is available. | `v_addresstypefound <> v_addrtype`. |

> These operations are also listed in [operations-processes.md](../operations-processes.md).

## Source Code

<details>
<summary>PL/SQL package specification</summary>

```sql
PROCEDURE getPersonAddress_GW(recordset OUT person_address_cursor_GW ,
           inPersonID IN NUMBER,
           inAddrType IN VARCHAR2,
           inDate IN VARCHAR2,
           inRunId IN VARCHAR2);
```

</details>

<details>
<summary>PL/SQL package/procedure body</summary>

```sql
PROCEDURE getPersonAddress_GW(recordset OUT person_address_cursor_GW,
           inPersonID IN NUMBER,
           inAddrType IN VARCHAR2,
           inDate IN VARCHAR2,
           inRunId IN VARCHAR2
          )
AS

-- recordset ws area
v_isvalidaddress         VARCHAR2(1);
v_person_name             VARCHAR2(50);
v_address_line1             VARCHAR2(40);
v_address_line2            VARCHAR2(40);
v_address_line3            VARCHAR2(40);
v_address_line4             VARCHAR2(40);
v_address_line5             VARCHAR2(40);
v_updater_mailid         VARCHAR2(30);
v_bank_acct_id           VARCHAR2(50);
v_update_timestamp        CHAR(26);
v_addressee             VARCHAR2(50);

-- switches and flags
v_pay_flag                    VARCHAR2(1) := 'Y';
v_eff_date_flag           VARCHAR2(1) := 'Y';
v_max_ts_flag             VARCHAR2(1) := 'Y';
v_addresstypefound        VARCHAR2(1) := 'N';
v_empty                    VARCHAR2(1) := 'N';

-- misc variables
v_addrtype                 VARCHAR2(1);
v_date                    DATE := SYSDATE;
v_address_code            VARCHAR2(1);
v_person_id                NUMBER;
v_guardian_name            VARCHAR2(50);
v_last_name             VARCHAR2(50);
v_gender                VARCHAR2(1);
v_city_name             VARCHAR2(60);
v_state_code            VARCHAR2(2);
v_foreign_address_flag  VARCHAR2(1);
v_zip_code              VARCHAR2(5);
v_zip_code_ext          VARCHAR2(4);
v_first_name            VARCHAR2(50);
v_middle_name           VARCHAR2(50) ;
v_name_extension_code   VARCHAR2(5) ;
v_country_code          VARCHAR2(10) ;

BEGIN
   --Use the parameter date if passed otherwise use defaulted
   --system date
   IF inDate IS NOT NULL THEN
         v_date := TO_DATE(inDate, 'MM/DD/YYYY');
   END IF;

   CASE inAddrType
           --Request is for default correspondence address
           WHEN '1' THEN
             v_addrtype          := 'G';
                v_pay_flag          := 'A';
             v_max_ts_flag          := 'Y';
             v_eff_date_flag      := 'A';
             IF typeAddressExists_GW(inPersonID,inRunId,
                                    v_addrtype,
                                  v_pay_flag,
                                  v_max_ts_flag,
                                  v_eff_date_flag,
                                  v_date) THEN
                v_addresstypefound := 'G';
             ELSE
                 v_addrtype := 'M';
                IF typeAddressExists_GW(inPersonID,inRunId,
                                       v_addrtype,
                                     v_pay_flag,
                                     v_max_ts_flag,
                                     v_eff_date_flag,
                                     v_date) THEN
                   v_addresstypefound := 'M';
                ELSE
                   v_addrtype := 'H';
                   IF typeAddressExists_GW(inPersonID,inRunId,
                                       v_addrtype,
                                     v_pay_flag,
                                     v_max_ts_flag,
                                     v_eff_date_flag,
                                     v_date) THEN
                         v_addresstypefound := 'H';
                   END IF;
                END IF;
             END IF;
        --Request is for default payment address
        WHEN '2' THEN
             v_addrtype           := 'G';
             v_pay_flag         := 'Y';
             v_eff_date_flag     := 'A';
             v_max_ts_flag         := 'Y';
             IF typeAddressExists_GW(inPersonID,inRunId,
                                    v_addrtype,
                                  v_pay_flag,
                                  v_max_ts_flag,
                                  v_eff_date_flag,
                                  v_date) THEN
                v_addresstypefound := 'G';
             ELSE
                 v_addrtype           := 'P';
                v_pay_flag             := 'A';
                v_eff_date_flag   := 'Y';
                v_max_ts_flag     := 'A';
                IF typeAddressExists_GW(inPersonID,inRunId,
                                       v_addrtype,
                                     v_pay_flag,
                                     v_max_ts_flag,
                                     v_eff_date_flag,
                                     v_date) THEN
                   v_addresstypefound := 'P';
                ELSE
                   v_addrtype          := 'M';
                   v_pay_flag           := 'A';
                   v_eff_date_flag      := 'A';
                   v_max_ts_flag      := 'Y';
                   IF typeAddressExists_GW(inPersonID,inRunId,
                                          v_addrtype,
                                        v_pay_flag,
                                        v_max_ts_flag,
                                        v_eff_date_flag,
                                        v_date) THEN
                         v_addresstypefound := 'M';
                   ELSE
                         v_addrtype         := 'H';
                      v_pay_flag         := 'A';
                         v_eff_date_flag     := 'A';
                         v_max_ts_flag     := 'Y';
                      IF typeAddressExists_GW(inPersonID,inRunId,
                                             v_addrtype,
                                           v_pay_flag,
                                           v_max_ts_flag,
                                           v_eff_date_flag,
                                           v_date) THEN
                         v_addresstypefound := 'H';
                         END IF;
                   END IF;
                 END IF;
             END IF;
           --Request is for payment address
        WHEN 'P' THEN
             v_addrtype          := 'P';
             v_pay_flag          := 'A';
             v_eff_date_flag   := 'Y';
             v_max_ts_flag        := 'A';
             IF typeAddressExists_GW(inPersonID,inRunId,
                                    v_addrtype,
                                  v_pay_flag,
                                  v_max_ts_flag,
                                  v_eff_date_flag,
                                  v_date) THEN
                v_addresstypefound := 'P';
             END IF;
        --Request is for home, mailing or guardian address
        ELSE
             v_addrtype        := inaddrtype;
             v_pay_flag           := 'A';
             v_eff_date_flag   := 'A';
             v_max_ts_flag        := 'Y';
             IF typeAddressExists_GW(inPersonID,inRunId,
                                    v_addrtype,
                                  v_pay_flag,
                                  v_max_ts_flag,
                                  v_eff_date_flag,
                                  v_date) THEN
                v_addresstypefound := v_addrtype;
             END IF;
    END CASE;

    --If the default or requested address type was found
    --continue processing for either guardian address or
    --worker/beneficiary address
    IF v_addresstypefound = v_addrtype THEN
        v_person_id    := inPersonID;
        v_address_code := v_addrtype;
        IF v_addrtype = 'G' THEN
           v_address_code := 'M';
              SELECT per.person_id
                INTO v_person_id
                 FROM CLM_DBA.TEMP_DATA_PERSON_ADDRESS per
                 WHERE per.person_id   = inPersonID
                 AND per.run_id = inRunId
                 AND per.person_code   = 'G';
        END IF;

            SELECT DECODE(pra.death_date, NULL, RTRIM(pra.primary_first_name) || ' ' ||
               DECODE(pra.primary_middle_name,'',NULL,' ',NULL,
               SUBSTR(pra.primary_middle_name,1,1) || ' ') || RTRIM(pra.primary_last_name) || ' ' || RTRIM(pra.primary_name_extension_code),
           'Estate of ' || RTRIM(pra.primary_first_name) || ' ' ||
          DECODE(pra.primary_middle_name,'',NULL,' ',NULL,
          SUBSTR(pra.primary_middle_name,1,1) || ' ') || RTRIM(pra.primary_last_name) || ' ' || RTRIM(pra.primary_name_extension_code)) AS person_name,
           trim(pra.address_line1) address_line1,
           trim(pra.address_line2) address_line2,
           trim(pra.address_line3) address_line3,
           DECODE(pra.foreign_address_flag,'Y', pra.address_line4,
            trim(pra.city_name) || ', ' || trim(pra.STATE_CODE) || ' ' || Decode(trim(pra.ZIP_CODE), '0', '', trim(to_char(pra.ZIP_CODE, 'FM00000')))
            || DECODE(TRIM(pra.zip_code_ext),NULL,'',' ','','','','-' || pra.zip_code_ext))  address_line4,
           pra.update_user,
           pra.direct_deposit_bank_acct_id,
           pra.update_date,
           pra.GENDER_CODE,
           RTRIM(pra.primary_last_name),
           trim(pra.city_name),
           trim(pra.state_code),
           pra.foreign_address_flag,
           pra.zip_code,
           pra.zip_code_ext,
           pra.primary_first_name,
           pra.primary_middle_name,
           pra.primary_name_extension_code,
           pra.country_code
          INTO v_person_name,
           v_address_line1,
           v_address_line2,
           v_address_line3,
           v_address_line4,
           v_updater_mailid,
           v_bank_acct_id,
           v_update_timestamp,
           v_gender,
           v_last_name,
           v_city_name,
           v_state_code,
           v_foreign_address_flag,
           v_zip_code,
           v_zip_code_ext,
           v_first_name,
           v_middle_name,
           v_name_extension_code,
           v_country_code
          FROM
           CLM_DBA.TEMP_DATA_PERSON_ADDRESS pra
         WHERE pra.person_id     = v_person_id
            AND  pra.run_id = inRunId
           AND pra.ADDRESS_CODE  = v_address_code
           AND (RTRIM(pra.address_line1) > ' '
                  OR RTRIM(pra.address_line2) > ' '
                OR RTRIM(pra.address_line3) > ' '
                 OR RTRIM(pra.address_line4) > ' '
               OR RTRIM(pra.city_name) > ' ')
           AND (pra.update_date   =
             (SELECT MAX(pra2.update_date)
                FROM CLM_DBA.TEMP_DATA_PERSON_ADDRESS pra2
               WHERE pra2.person_id     = v_person_id
                 AND pra.run_id = inRunId
                 AND pra2.ADDRESS_CODE  = v_address_code)
                  OR v_max_ts_flag = 'A')
                 AND (pra.payment_flag_code = 'Y'
                     OR v_pay_flag = 'A')
                  AND (((v_date BETWEEN pra.eff_date
                       AND pra.exp_Date )
                          OR (v_date >= pra.eff_date
                         AND pra.exp_Date IS NULL)
                            OR v_eff_date_flag = 'A'));

     --If the address retrieval was for guardian, then perform
     --a separate retrieval for the beneficiary/worker name
     IF v_addrtype = 'G' THEN
         v_address_line5 := v_address_line4;
        v_address_line4 := v_address_line3;
        v_address_line3 := v_address_line2;
        v_address_line2 := v_address_line1;
        v_bank_acct_id  := '';
            SELECT 'For: ' || RTRIM(per.primary_first_name) || ' ' ||
        DECODE(per.primary_middle_name,'',NULL,' ',NULL,
        SUBSTR(per.primary_middle_name,1,1) || ' ') || RTRIM(per.primary_last_name) || ' ' || RTRIM(per.primary_name_extension_code) AS person_name
          INTO v_address_line1
          FROM CLM_DBA.TEMP_DATA_PERSON_ADDRESS per
            WHERE per.person_id     = inPersonID
            AND per.run_id = inRunId;
     END IF;

     --This routine is to bump up non-blank address lines into blank ones
     IF v_address_line1 IS NULL OR v_address_line1 = '' THEN
         IF v_address_line2 > ' ' THEN
           v_address_line1 := v_address_line2;
           v_address_line2 := v_address_line3;
           v_address_line3 := v_address_line4;
           v_address_line4 := v_address_line5;
           v_address_line5 := '';
           ELSE
           IF v_address_line3 > ' ' THEN
                 v_address_line1 := v_address_line3;
                 v_address_line2 := v_address_line4;
                 v_address_line3 := v_address_line5;
              v_address_line4 := '';
                 v_address_line5 := '';
              ELSE
              IF v_address_line4 > ' ' THEN
                 v_address_line1 := v_address_line4;
                 v_address_line2 := v_address_line5;
                   v_address_line3 := '';
                   v_address_line4 := '';
                   v_address_line5 := '';
                   ELSE
                   IF v_address_line5 > ' ' THEN
                     v_address_line1 := v_address_line5;
                    v_address_line2 := '';
                     v_address_line3 := '';
                     v_address_line4 := '';
                     v_address_line5 := '';
                   END IF;
                 END IF;
           END IF;
        END IF;
     END IF;

     IF v_address_line2 IS NULL OR v_address_line2 = '' THEN
         IF v_address_line3 > ' ' THEN
           v_address_line2 := v_address_line3;
           v_address_line3 := v_address_line4;
           v_address_line4 := v_address_line5;
           v_address_line5 := '';
           ELSE
           IF v_address_line4 > ' ' THEN
              v_address_line2 := v_address_line4;
              v_address_line3 := v_address_line5;
              v_address_line4 := '';
              v_address_line5 := '';
              ELSE
              IF v_address_line5 > ' ' THEN
                 v_address_line2 := v_address_line5;
                 v_address_line3 := '';
                 v_address_line4 := '';
                 v_address_line5 := '';
              END IF;
           END IF;
        END IF;
     END IF;

     IF v_address_line3 IS NULL OR v_address_line3 = '' THEN
        IF v_address_line4 > ' ' THEN
           v_address_line3 := v_address_line4;
           v_address_line4 := v_address_line5;
           v_address_line5 := '';
           ELSE
           IF v_address_line5 > ' ' THEN
                 v_address_line3 := v_address_line5;
              v_address_line4 := '';
              v_address_line5 := '';
           END IF;
        END IF;
     END IF;

     IF v_address_line4 IS NULL OR v_address_line4 = '' THEN
        IF v_address_line5 > ' ' THEN
           v_address_line4 := v_address_line5;
           v_address_line5 := '';
        END IF;
     END IF;
     CASE v_gender
      WHEN 'M' THEN v_addressee := 'Mr. '  || v_last_name;
      WHEN 'F' THEN v_addressee := 'Ms. ' || v_last_name;
      ELSE v_addressee := 'M. '  || v_last_name;
     END CASE;
  END IF;

     --Create the recordset to be returned
     --Note: the column names must match the .net dataset columns
     -- address line 1 and 2 are checked since the city/state zip line counts as 1 address line
  v_isvalidaddress := 'N';
  IF v_person_name > ' ' and v_address_line1 > ' ' and v_address_line2 > ' ' then
     IF v_foreign_address_flag = 'Y' then
         v_isvalidaddress := 'Y';
     ELSE
     IF v_city_name > ' ' and v_state_code > ' ' then
         v_isvalidaddress := 'Y';
     END IF;
     END IF;
  END IF;
  IF v_addresstypefound = v_addrtype THEN
     OPEN recordset FOR SELECT
         v_isvalidaddress AS isvalidaddress,
         v_person_name AS person_name,
         v_address_line1 AS address_line1,
         v_address_line2 AS address_line2,
         v_address_line3 AS address_line3,
         v_address_line4 AS address_line4,
         v_address_line5 AS address_line5,
         v_updater_mailid AS updater_mailid,
         v_bank_acct_id AS bank_acct_id,
         v_update_timestamp AS update_timestamp,
         v_addressee AS addressee,
         v_foreign_address_flag as isforeignaddress,
         v_city_name AS city,
         v_state_code AS state_code,
         v_zip_code AS zip_code,
         v_zip_code_ext AS zip_code_ext,
         v_first_name as first_name,
         v_middle_name as middle_name,
         v_name_extension_code as name_extension_code,
         v_last_name as last_name,
         v_country_code as country_code
         FROM dual;
  ELSE
    OPEN recordset FOR SELECT
         v_isvalidaddress AS isvalidaddress,
         v_person_name AS person_name,
         v_address_line1 AS address_line1,
         v_address_line2 AS address_line2,
         v_address_line3 AS address_line3,
         v_address_line4 AS address_line4,
         v_address_line5 AS address_line5,
         v_updater_mailid AS updater_mailid,
         v_bank_acct_id AS bank_acct_id,
         v_update_timestamp AS update_timestamp,
         v_addressee AS addressee,
         v_foreign_address_flag as isforeignaddress,
         v_city_name AS city,
         v_state_code AS state_code,
         v_zip_code AS zip_code,
         v_zip_code_ext AS zip_code_ext,
         v_first_name as first_name,
         v_middle_name as middle_name,
         v_name_extension_code as name_extension_code,
         v_last_name as last_name,
         v_country_code as country_code
         FROM dual
         WHERE v_EMPTY = 'Y';
   END IF;

END getPersonAddress_GW;

FUNCTION typeAddressExists_GW(inPersonID IN NUMBER,inRunId IN VARCHAR2,
                  inAddressType IN VARCHAR2,
                inPayFlag IN VARCHAR2,
                inMaxTSFlag IN VARCHAR2,
                inEffDtFlag IN VARCHAR2,
                inDate IN DATE := SYSDATE)
                RETURN BOOLEAN
AS
v_address_code        VARCHAR2(1);
v_date                DATE := SYSDATE;
v_cnt                 NUMBER := 0;
BEGIN

--Used the parameter date if passed otherwise
--use the defaulted system date
IF inDate IS NOT NULL THEN
   v_date := inDate;
END IF;

--The guardian's id must first be obtained from the person table
--by matching on the worker id and person code of 'G''
IF inAddressType = 'G' THEN
   v_address_code := 'M';
   SELECT COUNT(*)
    INTO v_cnt
    FROM
         CLM_DBA.TEMP_DATA_PERSON_ADDRESS pra
   WHERE pra.worker_id = inPersonId
     AND pra.person_code   = 'G'
        AND pra.run_id = inRunId
     AND pra.ADDRESS_CODE  = v_address_code
     AND (RTRIM(pra.address_line1) > ' '
          OR RTRIM(pra.address_line2) > ' '
          OR RTRIM(pra.address_line3) > ' '
          OR RTRIM(pra.address_line4) > ' '
          OR RTRIM(pra.city_name) > ' ')
     AND (pra.update_date   =
          (SELECT MAX(pra2.update_date)
             FROM
                   CLM_DBA.TEMP_DATA_PERSON_ADDRESS pra2
            WHERE pra2.person_id = inPersonId
              AND pra2.person_code   = 'G'
                AND pra2.run_id = inRunId
              AND pra2.ADDRESS_CODE  = v_address_code)
                  OR  inMaxTSFlag = 'A')
               AND (pra.payment_flag_code = 'Y'
                  OR  inPayFlag = 'A')
               AND ((v_date BETWEEN pra.eff_date
                      AND pra.exp_Date )
                      OR (v_date >= pra.eff_date
                          AND  pra.exp_date IS NULL)
                        OR  inEffDTFlag = 'A');

ELSE

--otherwise don't need to select from person table
v_address_code := inAddressType;
SELECT COUNT(*)
    INTO v_cnt
    FROM CLM_DBA.TEMP_DATA_PERSON_ADDRESS pra
   WHERE pra.person_id     = inPersonId
     AND pra.run_id = InRunid
     AND pra.ADDRESS_CODE  = v_address_code
     AND (RTRIM(pra.address_line1) > ' '
          OR RTRIM(pra.address_line2) > ' '
          OR RTRIM(pra.address_line3) > ' '
          OR RTRIM(pra.address_line4) > ' '
          OR RTRIM(pra.city_name) > ' ')
     AND (pra.update_date   =
          (SELECT MAX(pra2.update_date)
             FROM CLM_DBA.TEMP_DATA_PERSON_ADDRESS pra2
            WHERE pra2.person_id     = inPersonId
              AND pra2.run_id = inRunId
              AND pra2.ADDRESS_CODE  = v_address_code)
              OR  inMaxTSFlag = 'A')
     AND (pra.payment_flag_code = 'Y'
            OR  inPayFlag = 'A')
     AND (((v_date BETWEEN pra.eff_date
                      AND pra.exp_Date )
          OR (v_date >= pra.eff_date
                AND  pra.exp_date IS NULL))
          OR  inEffDTFlag = 'A');
END IF;

IF v_cnt > 0 THEN
  RETURN TRUE;
  ELSE
  RETURN FALSE;
END IF;

END typeAddressExists_GW;
```

</details>

## Related Documentation
- [Procedure catalog](index.md)
- [Business rules](../business-rules.md)
- [Operations and processes](../operations-processes.md)
- [SQL catalog](../sql/index.md)

## Sources
- `Business\SAIF.Business\ClaimServices.vb`
