MA – Global Property Computation

Mass Appraisal Global Property Computation

Purpose

The purpose of the Global Computation is to provide values for all Govern system columns for a given record of the table MA_MASTER and given records of table MA_SITE.
The ultimate goal of this compute is to provide property values for all the CAMA components of a property (Land, Misc., Cost of Buildings, Income, MRA…).
Values are sub totaled by site number (MA_SITE) and then added up in the MA_MASTER record of each parcel.

Important Notes RE: the Computation

  • Auto Select Unique Code

When only one code is available and the Auto Select Unique Code option is selected, that code is used for the compute. This applies regardless of what the user has previously selected.
It applies, for example, if the code is changed in GNA, after the user set the code on the form. The update is made when either the property record is opened and resaved or the Mass Appraisal Compute batch process is run.

  • Is Required

If you select the Is Required option for a code after the user has created property records, you must verify that a code is selected for those records. Otherwise, an error is raised and the compute fails

Parameters

The following System Registry Parameters are used in the computation and are year based.
Section Name ‘Mass Appraisal’

  • TRANS_TO_TAX = “Mass Appraisal”, “Automatically Transfer To Tax” = (‘yes’ or ‘no’)
  • USE_PP = “Mass Appraisal”, “PP Assessment Data” = (‘yes’ or ‘no’)
  • CALC_INC_DEC = “Mass Appraisal”, “Include Increase / Decrease In Compute” = (‘yes’ or ‘no’)
  • USE_EXEMPTIONS = “Mass Appraisal”, “Use Exemptions” = (‘yes’ or ‘no’)
  • MULTIPLE_APP = “Mass Appraisal”, “multiple appraisal” = (‘yes’ or ‘no’)
  • ASSMT_RATE = Registry by year -“Assessment Equalization Rate”, default is 100. (Custom for the state of PA)
  • MIN_APPR = Registry by year -“Minimum Appraised Value”, default 0

The following parameters are no longer used (deprecated)

  • “Mass Appraisal”, “Force Compute All Bldg Seq.” = (‘yes’ or ‘no’)

General Parameters

  • MA_PARM_MAROUND.ROUNDING_CODE = “appval”
  • MA_PARM_MULTDIST
  • TX_PARM_EXEMPT

 

Tables Used (Available for the expressions)

The following tables are used in the computation and their attributes can be included in the expressions.
Tables updated by the process:

  • MA_LK_EXEMPTIONS
  • MA_MASTER
  • MA_SITE
  • TX_RE_ASSESSMENT
  • TX_EXEMPTIONS

Tables used for read only:

  • MA_BUILDINGS
  • MA_INCOME
  • MA_LAND
  • MA_LINKS_PERCENT
  • MA_MISC_STRUCTURES
  • MA_MRA
  • MA_OVERRIDE
  • PP_ASSESSMENT (See Roadmap)

Step 1 – Prepare and Initialize Data

For this step we read MA_MASTER and we load all MA_SITE records into an array or collection and we reset all computed columns to zero. In all subsequent steps, it is assume that when we compute a value for a MA_SITE column that we perform the operation in memory and then we save all MA_SITES records only once in a subsequent step. Note: If MA_MASTER.HISTORY_ONLY = -1 we do not compute when called from a batch compute. We ignore this column setting when called after a record saved.

We save the current appraised value into a variable (prior appraised value) to be used in step 13.
Every columns updated by this process need to be recorded in the audit trail. (to be validated)

The following columns are set to 0 in both MA_MASTER and MA_SITE:

  • LAND_VALUE
  • LAND_AG_VALUE
  • MISC_VALUE
  • BLDG_VALUE
  • INC_GRM_VALUE
  • INC_DIR_VALUE
  • MRA_VALUE
  • PP_VALUE
  • CAMA_VALUE
  • TOTAL_VALUE (MA_SITE ONLY)
  • APPRAISED_VALUE (MA_MASTER ONLY)
  • LK_LAND_VALUE
  • LK_LAND_AG_VALUE
  • LK_MISC_VALUE
  • LK_BLDG_VALUE
  • LK_INC_GRM_VALUE
  • LK_INC_DIR_VALUE
  • LK_MRA_VALUE
  • LK_COMP_VALUE (MA_MASTER ONLY)
  • PP_LK_VALUE
  • INCOME_LAND_AMT
  • MRA_LAND_AMT
  • INCOME_BLDG_AMT
  • MRA_BLDG_AMT
  • INCOME_MISC_AMT
  • MRA_MISC_AMT

We load all MA_INCOME records into an array or collection and we reset the columns listed below to zero. In all subsequent steps, it is assume that when we update a value for a MA_INCOME column that we perform the operation in memory and then we save all MA_INCOME records only once in a subsequent step.

  • LAND_VALUE
  • BLDG_VALUE
  • MISC_VALUE

We load all MA_MRA records into an array or collection and we reset the columns listed below to zero. In all subsequent steps, it is assume that when we update a value for a MA_MRA column that we perform the operation in memory and then we save all MA_MRA records only once in a subsequent step.

  • LAND_VALUE
  • BLDG_VALUE
  • MISC_VALUE

 

Step 2 – Process the Land Records

In this step, we read all MA_LAND records and compute the MA_SITE totals based on the MA_LAND.SITE_NO = MA_SITE.SITE_NO.

  • MA_SITE.LAND_VALUE = sum of MA_LAND.TOTAL_VALUE or MA_LAND. TOTAL_VALUE_OVERRIDE if MA_LAND.OVERRIDE = -1.
  • MA_SITE.LAND_AG_VALUE = sum of MA_LAND.TOTAL_VALUE_AG or MA_LAND. TOTAL_VALUE_AG_OVERRIDE if MA_LAND.AG_OVERRIDE = -1.
  • If MA_LAND.INC_INCOME = -1 then ADD MA_LAND.TOTAL_VALUE or MA_LAND.TOTAL_VALUE_OVERRIDE if MA_LAND.OVERRIDE = -1 to MA_INCOME.LAND_VALUE where MA_INCOME.INCOME_ID = MA_LAND.INC_ID.
  • If MA_LAND.INC_MRA = -1 then ADD MA_LAND.TOTAL_VALUE or MA_LAND.TOTAL_VALUE_OVERRIDE if MA_LAND.OVERRIDE = -1 to MA_MRA.LAND_VALUE where MA_MRA.MRA_ID = MA_LAND.MRA_ID.

If USE_EXEMPTIONS = “yes” then

  • Read all ma_lk_exemptions records associated with each land records to compute the tax exemptions. ma_lk_exemptions.TABLE_TYPE = “land”, ma_lk_exemptions.KEY_ID = MA_LAND.LAND_ID, ma_lk_exemptions.P_ID = MA_LAND.P_ID, ma_lk_exemptions.YEAR_ID = MA_LAND.YEAR_ID, ma_lk_exemptions.FROZEN_ID = MA_LAND.FROZEN_ID, ma_lk_exemptions.KEY_SEQ = 0
  • For each ma_lk_exemptions record, calculate the allowed exemption ALLOWED_EX by using multiplying ma_lk_exemptions.PERCENTAGE (Use 100 if greater than 100 and update ma_lk_exemptions.PERCENTAGE accordingly) by the land value (MA_LAND.TOTAL_VALUE or MA_LAND. TOTAL_VALUE_OVERRIDE if MA_LAND.OVERRIDE = -1)
  • For each ma_lk_exemptions record, find TX_PARM_EXEMPT by using ma_lk_exemptions.EXEMPTION_NO to retrieve TX_PARM_EXEMPT. EXEMPTION_NO. If TX_PARM_EXEMPT.PCT_AMT = ‘a’ then PARM_EX = TX_PARM_EXEMPT.EXEMPT_VALUE else if TX_PARM_EXEMPT.PCT_AMT = ‘p’ then PARM_EX = TX_PARM_EXEMPT.EXEMPT_VALUE * ALLOWED_EX / 100 else PARM_EX = 0
  • If PARM_EX > ALLOWED_EX then PARM_EX = ALLOWED_EX.
  • If PARM_EX > TX_PARM_EXEMPT.LIMIT_AMOUNT then PARM_EX = TX_PARM_EXEMPT.LIMIT_AMOUNT.
  • Update ma_lk_exemptions, set ma_lk_exemptions.AMOUNT = PARM_EX, ma_lk_exemptions.LAST_MODIF_UID = current user, ma_lk_exemptions.LAST_MODIF_DATE = date & time.

 

Step 3 – Process the Building Records

In this step, we read all MA_BUILDINGS records and compute the MA_SITE total based on the MA_BUILDINGS.SITE_NO = MA_SITE.SITE_NO.

  • MA_SITE. BLDG_VALUE = sum of MA_BUILDINGS.TOTAL_VALUE or MA_BUILDINGS. TOTAL_VALUE_OVERRIDE if MA_BUILDINGS.OVERRIDE = -1.
  • If MA_BUILDINGS.INC_INCOME = -1 then ADD MA_BUILDINGS.TOTAL_VALUE or MA_BUILDINGS.TOTAL_VALUE_OVERRIDE if MA_BUILDINGS.OVERRIDE = -1 to MA_INCOME.BLDG_VALUE where MA_INCOME.INCOME_ID = MA_BUILDINGS.INC_ID.
  • If MA_BUILDINGS.INC_MRA = -1 then ADD MA_BUILDINGS.TOTAL_VALUE or MA_BUILDINGS.TOTAL_VALUE_OVERRIDE if MA_BUILDINGS.OVERRIDE = -1 to MA_MRA.BLDG_VALUE where MA_MRA.MRA_ID = MA_BUILDINGS.MRA_ID.

If USE_EXEMPTIONS = “yes” then

  • Read all ma_lk_exemptions records associated with each building records to compute the tax exemptions. ma_lk_exemptions.TABLE_TYPE = “bldg”, ma_lk_exemptions.KEY_ID = MA_BUILDINGS.BLDG_ID, ma_lk_exemptions.P_ID = MA_BUILDINGS.P_ID, ma_lk_exemptions.YEAR_ID = MA_BUILDINGS.YEAR_ID, ma_lk_exemptions.FROZEN_ID = MA_BUILDINGS.FROZEN_ID, ma_lk_exemptions.KEY_SEQ = MA_BUILDINGS.BLDG_SEQ
  • For each ma_lk_exemptions record, calculate the allowed exemption ALLOWED_EX by using multiplying ma_lk_exemptions.PERCENTAGE (Use 100 if greater than 100 and update ma_lk_exemptions.PERCENTAGE accordingly) by the building value (MA_BUILDINGS.TOTAL_VALUE or MA_BUILDINGS. TOTAL_VALUE_OVERRIDE if MA_BUILDINGS.OVERRIDE = -1)
  • For each ma_lk_exemptions record, find TX_PARM_EXEMPT by using ma_lk_exemptions.EXEMPTION_NO to retrieve TX_PARM_EXEMPT. EXEMPTION_NO. If TX_PARM_EXEMPT.PCT_AMT = ‘a’ then PARM_EX = TX_PARM_EXEMPT.EXEMPT_VALUE else if TX_PARM_EXEMPT.PCT_AMT = ‘p’ then PARM_EX = TX_PARM_EXEMPT.EXEMPT_VALUE * ALLOWED_EX / 100 else PARM_EX = 0
  • If PARM_EX > ALLOWED_EX then PARM_EX = ALLOWED_EX.
  • If PARM_EX > TX_PARM_EXEMPT.LIMIT_AMOUNT then PARM_EX = TX_PARM_EXEMPT.LIMIT_AMOUNT.
  • Update ma_lk_exemptions, set ma_lk_exemptions.AMOUNT = PARM_EX, ma_lk_exemptions.LAST_MODIF_UID = current user, ma_lk_exemptions.LAST_MODIF_DATE = date & time.

 

Step 4 – Process the Miscellaneous Structure Records

(see roadmap)
In this step we read all MA_MISC_STRUCTURES records and compute the MA_SITE total based on the MA_MISC_STRUCTURES.SITE_NO = MA_SITE.SITE_NO.

  • MA_SITE. MISC_VALUE = sum of MA_MISC_STRUCTURES.TOTAL_VALUE or MA_MISC_STRUCTURES. TOTAL_VALUE_OVERRIDE if MA_MISC_STRUCTURES.OVERRIDE = -1.
  • If MA_MISC_STRUCTURES.INC_INCOME = -1 then ADD MA_MISC_STRUCTURES.TOTAL_VALUE or MA_MISC_STRUCTURES.TOTAL_VALUE_OVERRIDE if MA_MISC_STRUCTURES.OVERRIDE = -1 to MA_INCOME.MISC_VALUE where MA_INCOME.INCOME_ID = MA_MISC_STRUCTURES.INC_ID.
  • If MA_MISC_STRUCTURES.INC_MRA = -1 then ADD MA_MISC_STRUCTURES.TOTAL_VALUE or MA_MISC_STRUCTURES.TOTAL_VALUE_OVERRIDE if MA_MISC_STRUCTURES.OVERRIDE = -1 to MA_MRA.MISC_VALUE where MA_MRA.MRA_ID = MA_MISC_STRUCTURES.MRA_ID.

If USE_EXEMPTIONS = “yes” then
Read all ma_lk_exemptions records associated with each building records to compute the tax exemptions. ma_lk_exemptions.TABLE_TYPE = “misc”, ma_lk_exemptions.KEY_ID = MA_MISC_STRUCTURES.MISC_ID, ma_lk_exemptions.P_ID = MA_MISC_STRUCTURES.P_ID, ma_lk_exemptions.YEAR_ID = MA_MISC_STRUCTURES.YEAR_ID, ma_lk_exemptions.FROZEN_ID = MA_MISC_STRUCTURES.FROZEN_ID, ma_lk_exemptions.KEY_SEQ = 0

  • For each ma_lk_exemptions record, calculate the allowed exemption ALLOWED_EX by using multiplying ma_lk_exemptions.PERCENTAGE (Use 100 if greater than 100 and update ma_lk_exemptions.PERCENTAGE accordingly) by the building value (MA_MISC_STRUCTURES.TOTAL_VALUE or MA_MISC_STRUCTURES. TOTAL_VALUE_OVERRIDE if MA_MISC_STRUCTURES.OVERRIDE = -1)

 

  • For each ma_lk_exemptions record, find TX_PARM_EXEMPT by using ma_lk_exemptions.EXEMPTION_NO to retrieve TX_PARM_EXEMPT. EXEMPTION_NO. If TX_PARM_EXEMPT.PCT_AMT = ‘a’ then PARM_EX = TX_PARM_EXEMPT.EXEMPT_VALUE else if TX_PARM_EXEMPT.PCT_AMT = ‘p’ then PARM_EX = TX_PARM_EXEMPT.EXEMPT_VALUE * ALLOWED_EX / 100 else PARM_EX = 0
  • If PARM_EX > ALLOWED_EX then PARM_EX = ALLOWED_EX.
  • If PARM_EX > TX_PARM_EXEMPT.LIMIT_AMOUNT then PARM_EX = TX_PARM_EXEMPT.LIMIT_AMOUNT.
  • Update ma_lk_exemptions, set ma_lk_exemptions.AMOUNT = PARM_EX, ma_lk_exemptions.LAST_MODIF_UID = current user, ma_lk_exemptions.LAST_MODIF_DATE = date & time.

Step 5 – Process the Income Records

In this step we read all MA_INCOME records (from the loaded array) and compute the MA_SITE totals based on the MA_INCOME.SITE_NO = MA_SITE.SITE_NO.

  • MA_SITE.INCOME_GRM_VALUE = [ sum of MA_INCOME.NET_GRM or MA_INCOME. NET_GRM_OVERRIDE if MA_INCOME.OVERRIDE_GRM = -1]
  • If MA_SITE.INCOME_GRM_VALUE <> 0 then
    • MA_SITE.INCOME_GRM_VALUE = MA_SITE.INCOME_GRM_VALUE +[ sum of MA_INCOME.LAND_VALUE or MA_INCOME.LAND_VALUE_OVERRIDE if MA_INCOME.LAND_OVERRIDE = -1] + [ sum of MA_INCOME.BLDG_VALUE or MA_INCOME.BLDG_VALUE_OVERRIDE if MA_INCOME.BLDG_OVERRIDE = -1] + [ sum of MA_INCOME.MISC_VALUE or MA_INCOME.MISC_VALUE_OVERRIDE if MA_INCOME.MISC_OVERRIDE = -1]
  • MA_SITE.INCOME_DIR_VALUE = [ sum of MA_INCOME.NET_DIR or MA_INCOME.NET_DIR_OVERRIDE if MA_INCOME.OVERRIDE_DIR = -1 ]
  • If MA_SITE.INCOME_DIR_VALUE <> 0 then
    • MA_SITE.INCOME_DIR_VALUE = MA_SITE.INCOME_DIR_VALUE + [ sum of MA_INCOME.LAND_VALUE or MA_INCOME.LAND_VALUE_OVERRIDE if MA_INCOME.LAND_OVERRIDE = -1] + [ sum of MA_INCOME.BLDG_VALUE or MA_INCOME.BLDG_VALUE_OVERRIDE if MA_INCOME.BLDG_OVERRIDE = -1] + [ sum of MA_INCOME.MISC_VALUE or MA_INCOME.MISC_VALUE_OVERRIDE if MA_INCOME.MISC_OVERRIDE = -1]

If USE_EXEMPTIONS = “yes” and ( MA_MASTER.METHOD_IN_USE = “3” or = “4” ) then

  • Read all ma_lk_exemptions records associated with each land records to compute the tax exemptions. ma_lk_exemptions.TABLE_TYPE = “inc”, ma_lk_exemptions.KEY_ID = MA_INCOME.INCOME_ID, ma_lk_exemptions.P_ID = MA_INCOME.P_ID, ma_lk_exemptions.YEAR_ID = MA_INCOME.YEAR_ID, ma_lk_exemptions.FROZEN_ID = MA_INCOME.FROZEN_ID, ma_lk_exemptions.KEY_SEQ = 0
  • IF MA_MASTER.METHOD_IN_USE = “3” then For each ma_lk_exemptions record, calculate the allowed exemption ALLOWED_EX by using multiplying ma_lk_exemptions.PERCENTAGE (Use 100 if greater than 100 and update ma_lk_exemptions.PERCENTAGE accordingly) by the income dir value (MA_ INCOME.NET_DIR or MA_INCOME.NET_DIR_OVERRIDE if MA_INCOME.OVERRIDE_DIR = -1)
  • IF MA_MASTER.METHOD_IN_USE = “4” then For each ma_lk_exemptions record, calculate the allowed exemption ALLOWED_EX by using multiplying ma_lk_exemptions.PERCENTAGE (Use 100 if greater than 100 and update ma_lk_exemptions.PERCENTAGE accordingly) by the income grm value (MA_ INCOME.NET_GRM or MA_INCOME.NET_GRM_OVERRIDE if MA_INCOME.OVERRIDE_GRM = -1)
  • For each ma_lk_exemptions record, find TX_PARM_EXEMPT by using ma_lk_exemptions.EXEMPTION_NO to retrieve TX_PARM_EXEMPT. EXEMPTION_NO. If TX_PARM_EXEMPT.PCT_AMT = ‘a’ then PARM_EX = TX_PARM_EXEMPT.EXEMPT_VALUE else if TX_PARM_EXEMPT.PCT_AMT = ‘p’ then PARM_EX = TX_PARM_EXEMPT.EXEMPT_VALUE * ALLOWED_EX / 100 else PARM_EX = 0
  • If PARM_EX > ALLOWED_EX then PARM_EX = ALLOWED_EX.
  • If PARM_EX > TX_PARM_EXEMPT.LIMIT_AMOUNT then PARM_EX = TX_PARM_EXEMPT.LIMIT_AMOUNT.
  • Update ma_lk_exemptions, set ma_lk_exemptions.AMOUNT = PARM_EX, ma_lk_exemptions.LAST_MODIF_UID = current user, ma_lk_exemptions.LAST_MODIF_DATE = date & time.

Save the Income array changes back to database.

Step 6 – Process the MRA Records

In this step we read all MA_MRA records (from the loaded array) and compute the MA_SITE total based on the MA_MRA.SITE_NO = MA_SITE.SITE_NO.

  • MA_SITE.MRA_VALUE = [ sum of MA_MRA.TOTAL_VALUE or MA_MRA.TOTAL_VALUE_OVERRIDE if MA_MRA.OVERRIDE = -1]
  • MA_SITE.MRA_VALUE = MA_SITE.MRA_VALUE + [ sum of MA_MRA.LAND_VALUE or MA_MRA.LAND_VALUE_OVERRIDE if MA_MRA.LAND_OVERRIDE = -1] + [ sum of MA_MRA.BLDG_VALUE or MA_MRA.BLDG_VALUE_OVERRIDE if MA_MRA.BLDG_OVERRIDE = -1] + [ sum of MA_MRA.MISC_VALUE or MA_MRA.MISC_VALUE_OVERRIDE if MA_MRA.MISC_OVERRIDE = -1]

Save the MRA array changes back to database.

Step 7 – Process Personal Property Records

In this step we Process the personal property records (VB6: pv_load_pp)

Perform this step only if USE_PP = “yes”
Read all PP_ASSESSMENT records and compute the MA_SITE total based on the PP_ASSESSMENT.SITE_NO = MA_SITE.SITE_NO.

  • MA_SITE.PP_VALUE = [ sum of PP_ASSESSMENT.VA_AP_TOTAL ]

 

Step 8 – Process the Linked Records

A parcel can receive values from other parcels or provide a portion of its value to others. Contrary to the VB6 version, we will only load the values provided by other parcels and it is assumed the parcels that are providing the values have been previously computed.
If possible, if the parcels to be loaded have a MA_MASTER.MODIF_STAMP set to NULL, we should be calling this compute (recursive call) for these parcels prior to complete this step. (to be verified)

IMPORTANT: A parcel cannot receive and provide a value at the same time. Parcels having the MA_MASTER.exclude_from_roll = <> 0 are providing values to other parcels and therefore we should not further perform this step.
However we need to reset the modif stamps to all linked parcels by performing the following SQL Query.

1. update ma_master set MODIF_STAMP =nullwhere year_id =(current parcel year id) and frozen_id =(current parcel frozen id) and p_id =(select malk.p_id from MA_LINKS_PERCENT malk, PC_PARCEL_LINKS lktype where malk.LINK_ID = lktype.LINK_ID and malk.P_ID = lktype.P_ID and year_id =(current parcel year id) and frozen_id =(current parcel frozen id) and MASTER_PID =-1 and malk.p_id <>(current parcel P_ID)andexists(select 0 from PC_PARCEL_LINKS pclk where pclk.LINK_ID = malk.LINK_ID and(MASTER_PID = 0 or master_PID isNULL)and P_ID =(current parcel P_ID)))

2. update ma_master set MODIF_STAMP =nullwhere year_id =(current parcel year id)and frozen_id =(current parcel frozen id) and p_id <>(current parcel P_ID)andexists(select 0 from MA_LINKS_PERCENT where p_id = ma_master.p_id and year_id = ma_master.year_id and frozen_id = ma_master.frozen_id and LINK_ID =(select link_id from PC_PARCEL_LINKS where MASTER_PID =-1 and p_id =(current parcel P_ID)))

MA_MASTER.exclude_from_roll = -1 – The parcel provides all types of values to other parcels

MA_MASTER.exclude_from_roll = 1 – The parcel provides only a land value to other parcels (to be validated)
MA_MASTER.exclude_from_roll = 2 – The parcel provides only a misc. and a building value to other parcels.

101-ma-compute-Global-UI-ParcelLinking2.png
Click on the image to enlarge

A merge occurs when several parcels are giving their values to a master parcel.
In the example above P_ID = 1 is the master parcel and P_ID = 2,3,4,5 are providing their full values to P_ID = 1. P_ID is included in the roll while the other P_ID’s are excluded.
The PERCENT_LINK on non-master parcels determine whether it is a merge or a split.
For a split, the PERCENT_LINK will contain a value from 1 to 100.
Section 1) below is for a merge and section 2) is for a split.

101-ma-compute-Global-UI-ParcelLinking2.png
Click on the image to enlarge

A split occurs when one parcel is giving its value to a group of parcels. In the example above P_ID = 1 is the master parcel and P_ID = 2,3,4,5 are receiving a portion of P_ID = 1 value. The exclude from roll value determines the type of value to be distributed (land, building, all).

The remaining section is for MA_MASTER.exclude_from_roll = 0 (or null).

Parcels Excluded from Role

1) We execute a query that returns all parcels excluded from the roll that contributes 100% of their values to the current parcel

  • select p_id, percent_of_total, value_on from MA_LINKS_PERCENT malk, PC_PARCEL_LK_TYPE lktype where malk.LINK_ID = lktype.LINK_ID and year_id =(current parcel year id) and frozen_id =(current parcel frozen id) and p_id <>(current parcel P_ID)andand malk.LINK_ID =(select link_id from PC_PARCEL_LINKS where MASTER_PID =-1 and P_ID =(current parcel P_ID))

For each record we load all MA_SITE records and we match the MA_SITE.SITE_DESC with the ones for the current parcel. If no MA_SITE records match the SITE_DESC we then create a new empty site, with a SITE_NO = max (site_no) +1 of the current_parcel and SITE_DESC = the site description from the read record.

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0 or = 1
    • then Current parcel MA_SITE. LK_LAND_VALUE = Current parcel MA_SITE.LK_LAND_VALUE + read link record MA_SITE.LAND_VALUE or MA_SITE.LAND_VALUE_OVERRIDE if MA_SITE.LAND_OVERRIDE = -1

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0 or = 1
    • then Current parcel MA_SITE. LK_LAND_AG_VALUE = Current parcel MA_SITE.LK_LAND_AG_VALUE + read link record MA_SITE.LAND_AG_VALUE or MA_SITE.LAND_AG_VALUE_OVERRIDE if MA_SITE.LAND_AG_OVERRIDE = -1

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0 or = 2
    • then Current parcel MA_SITE. LK_MISC_VALUE = Current parcel MA_SITE.LK_MISC_VALUE + read link record MA_SITE.MISC_VALUE or MA_SITE.MISC_VALUE_OVERRIDE if MA_SITE.MISC_OVERRIDE = -1

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0 or = 2
    • then Current parcel MA_SITE. LK_BLDG_VALUE = Current parcel MA_SITE.LK_BLDG_VALUE + read link record MA_SITE.BLDG_VALUE or MA_SITE.BLDG_VALUE_OVERRIDE if MA_SITE.BLDG_OVERRIDE = -1

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0
    • then Current parcel MA_SITE.LK_INC_GRM_VALUE = Current parcel MA_SITE. LK_INC_GRM_VALUE + read link record MA_SITE.INCOME_GRM_VALUE or MA_SITE.INCOME_GRM_VALUE_OVERRIDE if MA_SITE.INC_GRM_OVERRIDE = -1

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0
    • then Current parcel MA_SITE.LK_INC_DIR_VALUE = Current parcel MA_SITE. LK_INC_DIR_VALUE + read link record MA_SITE.INCOME_DIR_VALUE or MA_SITE.INCOME_DIR_VALUE_OVERRIDE if MA_SITE.INC_DIR_OVERRIDE = -1

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0
    • then Current parcel MA_SITE.LK_MRA_VALUE = Current parcel MA_SITE.LK_MRA_VALUE + read link record MA_SITE.MRA_VALUE or MA_SITE.MRA_VALUE_OVERRIDE if MA_SITE.MRA_OVERRIDE = -1

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0
    • then Current parcel MA_SITE.PP_LK_VALUE = Current parcel MA_SITE.PP_LK_VALUE + read link record MA_SITE.PP_VALUE or MA_SITE.PP_VALUE_OVERRIDE if MA_SITE.PP_OVERRIDE = -1

We also load the linked comparable sales value for MA_MASTER.

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0
    • then Current parcel MA_MASTER.LK_COMP_VALUE = read link record MA_MASTER.COMP_SALES_VALUE

 

Parcels Contributing a portion of their value

2) We execute a query that returns all parcels excluded from the roll that contributes for a portion of their values to the current parcel

  • select LINK_ID, percent_of_total from MA_LINKS_PERCENT where year_id =(current parcel year id) and frozen_id = (current parcel frozen id) and p_id = (current parcel P_ID) and percent_of_total isnotnull

For each record found we find all the site records for the parcel providing the value to be pro-rated by the value of percent_of_total.

  • select p_id, value_on from PC_PARCEL_LK_TYPE lktype , PC_PARCEL_LINKS pclk where pclk.LINK_ID = lktype.LINK_ID and MASTER_PID =-1 and lktype.LINK_ID = link id from the current record

We then load all MA_SITE records for the found record and we match the MA_SITE.SITE_DESC with the ones for the current parcel. If no MA_SITE records match the SITE_DESC we then create a new empty site, with a SITE_NO = max (site_no) +1 of the current_parcel and SITE_DESC = the site description from the read record.

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0 or = 1
    • then Current parcel MA_SITE. LK_LAND_VALUE = Current parcel MA_SITE.LK_LAND_VALUE + ( read link record MA_SITE.LAND_VALUE or MA_SITE.LAND_VALUE_OVERRIDE if MA_SITE.LAND_OVERRIDE = -1 ) * MA_LINKS_PERCENT.PERCENT_OF_TOTAL / 100.

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0 or = 1
    • then Current parcel MA_SITE. LK_LAND_AG_VALUE = Current parcel MA_SITE.LK_LAND_AG_VALUE + ( read link record MA_SITE.LAND_AG_VALUE or MA_SITE.LAND_AG_VALUE_OVERRIDE if MA_SITE.LAND_AG_OVERRIDE = -1 ) * MA_LINKS_PERCENT.PERCENT_OF_TOTAL / 100.

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0 or = 2
    • then Current parcel MA_SITE. LK_MISC_VALUE = Current parcel MA_SITE.LK_MISC_VALUE + ( read link record MA_SITE.MISC_VALUE or MA_SITE.MISC_VALUE_OVERRIDE if MA_SITE.MISC_OVERRIDE = -1 ) * MA_LINKS_PERCENT.PERCENT_OF_TOTAL / 100.

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0 or = 2
    • then Current parcel MA_SITE. LK_BLDG_VALUE = Current parcel MA_SITE.LK_BLDG_VALUE + ( read link record MA_SITE.BLDG_VALUE or MA_SITE.BLDG_VALUE_OVERRIDE if MA_SITE.BLDG_OVERRIDE = -1 ) * MA_LINKS_PERCENT.PERCENT_OF_TOTAL / 100.

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0
    • then Current parcel MA_SITE. LK_INC_GRM_VALUE = Current parcel MA_SITE. LK_INC_GRM_VALUE + ( read link record MA_SITE.INCOME_GRM_VALUE or MA_SITE.INCOME_GRM_VALUE_OVERRIDE if MA_SITE.INC_GRM_OVERRIDE = -1 ) * MA_LINKS_PERCENT.PERCENT_OF_TOTAL / 100.

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0
    • then Current parcel MA_SITE. LK_INC_DIR_VALUE = Current parcel MA_SITE. LK_INC_DIR_VALUE + ( read link record MA_SITE.INCOME_DIR_VALUE or MA_SITE.INCOME_DIR_VALUE_OVERRIDE if MA_SITE.INC_DIR_OVERRIDE = -1 ) * MA_LINKS_PERCENT.PERCENT_OF_TOTAL / 100.

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0
    • then Current parcel MA_SITE. LK_MRA_VALUE = Current parcel MA_SITE.LK_MRA_VALUE + (read link record MA_SITE.MRA_VALUE or MA_SITE.MRA_VALUE_OVERRIDE if MA_SITE.MRA_OVERRIDE = -1 ) * MA_LINKS_PERCENT.PERCENT_OF_TOTAL / 100.

 

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0
    • then Current parcel MA_SITE.PP_LK_VALUE = Current parcel MA_SITE.PP_LK_VALUE + ( read link record MA_SITE.PP_VALUE or MA_SITE.PP_VALUE_OVERRIDE if MA_SITE.PP_OVERRIDE = -1 ) * MA_LINKS_PERCENT.PERCENT_OF_TOTAL / 100.

We also load the linked comparable sales value for MA_MASTER

  • If PC_PARCEL_LK_TYPE.VALUE_ON = 0 then Current parcel MA_MASTER.LK_COMP_VALUE = read link record MA_MASTER.COMP_SALES_VALUE * MA_LINKS_PERCENT.PERCENT_OF_TOTAL / 100.

 

Linked Values Rounding

MA_SITE.LK_LAND_VALUE is rounded based on the MA_PARM_MAROUND information (code = ‘land’).

For example, if the rounding value is 1000, and the total value is 45678 then the value is 46000. If the rounding value was 100 then it would have been 45700. The default is always to 0 decimal.

  • MA_SITE.LK_LAND_AG_VALUE is rounded based on the MA_PARM_MAROUND information (code = ‘land’).
  • MA_SITE.LK_MISC_VALUE is rounded based on the MA_PARM_MAROUND information (code = ‘misc’).
  • MA_SITE.LK_BLDG_VALUE is rounded based on the MA_PARM_MAROUND information (code = ‘bldg’).
  • MA_SITE. LK_INC_GRM_VALUE is rounded based on the MA_PARM_MAROUND information (code = ‘inc’).
  • MA_SITE. LK_INC_DIR_VALUE is rounded based on the MA_PARM_MAROUND information (code = ‘inc’).
  • MA_SITE. LK_MRA_VALUE is rounded based on the MA_PARM_MAROUND information (code = ‘mra’).
  • MA_SITE.PP_LK_VALUE is rounded to 0 decimal.
  • MA_SITE. LK_COMP_VALUE is rounded based on the MA_PARM_MAROUND information (code = ‘compval’).

 

Step 9 – Compute the Individual Site Values

In this step, we compute the individual values for the MA_SITE records

Compute Site Values

  • MA_SITE.LAND_VALUE = MA_SITE.LAND_VALUE + MA_SITE.LK_LAND_VALUE
  • MA_SITE.BLDG_VALUE = MA_SITE.BLDG_VALUE + MA_SITE.LK_BLDG_VALUE
  • MA_SITE.MISC_VALUE = MA_SITE.MISC_VALUE + MA_SITE.LK_MISC_VALUE
  • MA_SITE. PP_VALUE = MA_SITE. PP_VALUE + MA_SITE. PP_LK_VALUE

 

  • MA_SITE. INC_DIR_VALUE = MA_SITE. INC_DIR_VALUE + MA_SITE.LK_INC_DIR_VALUE + (MA_SITE.INCOME_LAND_AMT or MA_SITE.INCOME_LAND_OV is not null) + (MA_SITE.INCOME_BLDG_AMT + or MA_SITE.INCOME _BLDG_OV is not null) + (MA_SITE.INCOME_MISC_AMT or MA_SITE.INCOME_MISC_OV is not null)

 

  • MA_SITE. INC_GRM_VALUE = MA_SITE. INC_GRM_VALUE + MA_SITE.LK_INC_GRM_VALUE + (MA_SITE.INCOME_LAND_AMT or MA_SITE.INCOME_LAND_OV is not null) + (MA_SITE.INCOME_BLDG_AMT + or MA_SITE.INCOME _BLDG_OV is not null) + (MA_SITE.INCOME_MISC_AMT or MA_SITE.INCOME_MISC_OV is not null)

 

  • MA_SITE. MRA_VALUE = MA_SITE. MRA_VALUE + MA_SITE. LK_MRA_VALUE + (MA_SITE.MRA_LAND_AMT or MA_SITE.MRA_LAND_OV is not null) + (MA_SITE.MRA_BLDG_AMT + or MA_SITE.MRA_BLDG_OV is not null) + (MA_SITE.MRA_MISC_AMT or MA_SITE.MRA_MISC_OV is not null)

 

Adjust Building Value for Building Residual Method (6)

The method in use = 6 is for the building residual method, where the total value is stored in the building value.
We must re-adjust the building so that when we add back the land, misc and building to compute the CAMA value the sum equal the current building value.
By convention, a residual building value can never be 0 for an improved property, so if the residual value is 0 we set it to 100.

  • If MA_MASTER.METHOD_IN_USE = “6”
    • then MA_SITE.BLDG_VALUE = MA_SITE. BLDG_VALUE – MA_SITE_LAND_VALUE – MA_SITE.MISC_VALUE
    • If MA_SITE.BLDG_VALUE < 0 If MA_SITE.MISC_VALUE > 0
      • then Add MA_SITE.BLDG_VALUE to MA_SITE.MISC_VALUE
      • then MA_SITE.BLDG_VALUE = 100
    • If MA_SITE.MISC_VALUE < 0
      • then MA_SITE_LAND_VALUE = MA_SITE_LAND_VALUE + MA_SITE.MISC_VALUE
      • then MA_SITE.MISC_VALUE = 0
      • Else
        • Add MA_SITE.BLDG_VALUE to MA_SITE.LAND_VALUE
        • MA_SITE.BLDG_VALUE = 100

Set Site CAMA Value

  • MA_SITE.CAMA_VALUE = (MA_SITE.LAND_VALUE or MA_SITE.LAND_VALUE_OVERRIDE when MA_SITE.LAND_OVERRIDE = -1) + (MA_SITE.BLDG_VALUE or MA_SITE.BLDG_VALUE_OVERRIDE when MA_SITE.BLDG_OVERRIDE = -1) + (MA_SITE.MISC_VALUE or MA_SITE.MISC_VALUE_OVERRIDE when MA_SITE.MISC_OVERRIDE = -1) + (MA_SITE.PP_VALUE or MA_SITE.PP_VALUE_OVERRIDE when MA_SITE.PP_OVERRIDE = -1)

 

Step 10 – Compute the Total Site Value

In this step we compute the total value for the MA_SITE records

  • If MA_MASTER.EXCLUDE_FROM_ROLL = -1 or MA_MASTER.METHOD_IN_USE = 2
    • then MA_SITE.TOTAL_VALUE = 0 go to step 11

Case MA_MASTER.METHOD_IN_USE
Cost (method 1,6 or 7)
Case “1”, “6” or “7” valuation using the cost technique

  • If MA_MASTER.EXCLUDE_FROM_ROLL <> 1
    • then we include the land value in the total
    • If the method is use is “7” then we use the ag land instead of the land
      • Add the land value to MA_SITE.TOTAL_VALUE. The land value is either MA_SITE.LAND_AG_VALUE or MA_SITE.LAND_AG_VALUE_OVERRIDE when MA_SITE.LAND_AG_OVERRIDE = -1
    • Else
      • Add the land value to MA_SITE.TOTAL_VALUE. The land value is either MA_SITE.LAND_VALUE or MA_SITE.LAND_VALUE_OVERRIDE when MA_SITE.LAND_OVERRIDE = -1

 

  • If MA_MASTER.EXCLUDE_FROM_ROLL <> 2
    • then we include the misc and bldg value in the total
    • Add the bldg value to MA_SITE.TOTAL_VALUE. The bldg value is either MA_SITE.BLDG_VALUE or MA_SITE.BLDG_VALUE_OVERRIDE when MA_SITE.BLDG_OVERRIDE = -1
    • Add the misc. value to MA_SITE.TOTAL_VALUE. The misc. value is either MA_SITE.MISC_VALUE or MA_SITE.MISC_VALUE_OVERRIDE when MA_SITE.MISC_OVERRIDE = -1
    • Add the pp value to MA_SITE.TOTAL_VALUE. The pp value is either MA_SITE. PP_VALUE or MA_SITE.PP_VALUE_OVERRIDE when MA_SITE.PP_OVERRIDE = -1

Comparable Sales (method 2)
Case “2” valuation by comparable sales

  • MA_SITE.TOTAL_VALUE = 0

Income (method 3 or 9)
Case “3” or “9” valuation by income dir
Method 9 is now the same as method 3 since it is now possible to add the land values to the income value.

  • MA_SITE.TOTAL_VALUE = MA_SITE. INC_DIR_VALUE or MA_SITE.INC_DIR_VALUE_OVERRIDE when MA_SITE. INC_DIR_OVERRIDE = -1

Case “4” valuation by income grm

  • MA_SITE.TOTAL_VALUE = MA_SITE. INC_GRM_VALUE or MA_SITE.INC_GRM_VALUE_OVERRIDE when MA_SITE. INC_GRM_OVERRIDE = -1

Correlated Values (method 5)
Case “5” correlated values
See correlated values section below.

MRA (method = 8)
Case “8” valuation by mra

  • MA_SITE.TOTAL_VALUE = MA_SITE. MRA_VALUE or MA_SITE.MRA_VALUE_OVERRIDE when MA_SITE. MRA_OVERRIDE = -1

Land Only (method L)
Case “L” valuation by land only

  • If MA_MASTER.EXCLUDE_FROM_ROLL <> 1
    • Then we include the land value in the total
    • Add the land value to MA_SITE.TOTAL_VALUE. The land value is either (MA_SITE.LAND_VALUE + MA_SITE.LK_LAND_VALUE) or MA_SITE.LAND_VALUE_OVERRIDE when MA_SITE.LAND_OVERRIDE = -1

 

Step 11 – Compute the Property CAMA value

In this step, we compute the CAMA value for the MA_MASTER record.

Add all MA_SITE to MA_MASTER:

  • LAND_VALUE
  • LAND_AG_VALUE
  • MISC_VALUE, BLDG_VALUE
  • INC_GRM_VALUE
  • INC_DIR_VALUE
  • MRA_VALUE, PP_VALUE
  • CAMA_VALUE
  • LK_LAND_VALUE
  • LK_LAND_AG_VALUE
  • LK_MISC_VALUE
  • LK_BLDG_VALUE
  • LK_INC_GRM_VALUE
  • LK_INC_DIR_VALUE
  • LK_MRA_VALUE
  • PP_LK_VALUE
  • INCOME_LAND_AMT
  • MRA_LAND_AMT
  • INCOME_BLDG_AMT
  • MRA_BLDG_AMT
  • INCOME_MISC_AMT
  • MRA_MISC_AMT

Add all MA_SITE.TOTAL_VALUE TO MA_MASTER.APPRAISED_VALUE

  • If MA_MASTER.METHOD_IN_USE = “2” and MA_MASTER.EXCLUDE_FROM_ROLL <> -1
    • then MA_MASTER.APPRAISED_VALUE = MA_MASTER_COMP_SALES_VALUE (See Roadmap, not part of this document)

Round MA_MASTER.APPRAISED_VALUE based on the MA_PARM_MAROUND information (code = ‘appval’).

  • If MIN_APP > MA_MASTER. APPRAISED_VALUE
    • then MA_MASTER. APPRAISED_VALUE = MIN_APP

 

Step 12 – Compute the OVERRIDE value

In this step we override the CAMA value based on MA_OVERRIDE record.

We get the MA_OVERRIDE record. If no record found we go to step 13.

Check override year is valid

  • If the (MA_MASTER.YEAR_ID >= MA_OVERRIDE.STARTING_YEAR or MA_OVERRIDE.STARTING_YEAR is NULL) and (MA_MASTER.YEAR_ID <= MA_OVERRIDE.ENDING_YEAR or MA_OVERRIDE.ENDING_YEAR is null)
    • else we go to step 13

Land

  • If MA_OVERRIDE.LAND_VALUE is not NULL
    • then If MA_MASTER.EXCLUDE_FROM_ROLL <> -1 and <> 1 and MA_MASTER.METHOD_IN_USE = “1”, “6”, “L”
      • then
        • MA_MASTER.APPRAISED_VALUE = MA_MASTER.APPRAISED_VALUE – MA_MASTER.LAND_VALUE + MA_OVERRIDE.LAND_VALUE
        • MA_MASTER.LAND_VALUE = MA_OVERRIDE.LAND_VALUE

 

  • If MA_OVERRIDE.LAND_AG_VALUE is not NULL
    • then If MA_MASTER.EXCLUDE_FROM_ROLL <> -1 and <> 1 and MA_MASTER.METHOD_IN_USE = “7”
      • then
        • MA_MASTER.APPRAISED_VALUE = MA_MASTER.APPRAISED_VALUE – MA_MASTER.LAND_AG_VALUE + MA_OVERRIDE.LAND_AG_VALUE
        • MA_MASTER.LAND_AG_VALUE = MA_OVERRIDE.LAND_AG_VALUE

Miscellaneous Structures

  • If MA_OVERRIDE.MISC_VALUE is not NULL
  • then If MA_MASTER.EXCLUDE_FROM_ROLL <> -1 and <> 2 and MA_MASTER.METHOD_IN_USE = “1”, “6”, “7”
    • then
      • MA_MASTER.APPRAISED_VALUE = MA_MASTER.APPRAISED_VALUE – MA_MASTER.MISC_VALUE + MA_OVERRIDE.MISC_VALUE
      • MA_MASTER.MISC_VALUE = MA_OVERRIDE.MISC_VALUE

Buildings

  • If MA_OVERRIDE.BLDG_VALUE is not NULL
  • then If MA_MASTER.EXCLUDE_FROM_ROLL <> -1 and <> 2 and MA_MASTER.METHOD_IN_USE = “1”, “6”, “7”
    • then
      • MA_MASTER.APPRAISED_VALUE = MA_MASTER.APPRAISED_VALUE – MA_MASTER.BLDG_VALUE + MA_OVERRIDE.BLDG_VALUE
      • MA_MASTER.BLDG_VALUE = MA_OVERRIDE.BLDG_VALUE

Income

  • If MA_OVERRIDE.INCOME_DIR_VALUE is not NULL
  • then If MA_MASTER.EXCLUDE_FROM_ROLL <> -1 and MA_MASTER.METHOD_IN_USE = “3”, “9”
    • then
      • MA_MASTER.APPRAISED_VALUE = MA_MASTER.APPRAISED_VALUE – MA_MASTER. INCOME_DIR_VALUE + MA_OVERRIDE. INCOME_DIR_VALUE
      • MA_MASTER.INCOME_DIR_VALUE = MA_OVERRIDE. INCOME_DIR_VALUE

 

  • If MA_OVERRIDE. INCOME_GRM_VALUE is not NULL
  • then If MA_MASTER.EXCLUDE_FROM_ROLL <> -1 and MA_MASTER.METHOD_IN_USE = “4”
    • then
      • MA_MASTER.APPRAISED_VALUE = MA_MASTER.APPRAISED_VALUE – MA_MASTER. INCOME_GRM_VALUE + MA_OVERRIDE. INCOME_GRM_VALUE
      • MA_MASTER.INCOME_GRM_VALUE = MA_OVERRIDE.INCOME_GRM_VALUE

Comparable Sales

  • If MA_OVERRIDE.COMP_SALES_VALUE is not NULL
  • then If MA_MASTER.EXCLUDE_FROM_ROLL <> -1 and MA_MASTER.METHOD_IN_USE = “2”
    • then
      • MA_MASTER.APPRAISED_VALUE = MA_MASTER.APPRAISED_VALUE – MA_MASTER.COMP_SALES _VALUE + MA_OVERRIDE. COMP_SALES_VALUE
      • MA_MASTER.COMP_SALES_VALUE = MA_OVERRIDE.COMP_SALES_VALUE

Correlated Values

  • If MA_MASTER.EXCLUDE_FROM_ROLL <> -1 and MA_MASTER.METHOD_IN_USE = “5”
  • then
    • See correlated values section below

 

Step 13 – Update Last Value & Date

In this step we check if the appraised value as changed, and if so we move it to the last value column.

  • If prior appraised value (step 1) <> MA_MASTER.APPRAISED_VALUE
  • Then
    • MA_MASTER.LAST_VALUE = prior appraised value
    • MA_MASTER.LAST_VALUE_DATE = now

 

Step 14 – Compute Equalization Changes

In this step we compute the equalization change.
NOTES:

  • This routine was custom to Winnipeg but going forward this way of computing the equalization will be the standard.
  • We might have to review this for NY state, as they keep the increase and decrease in a separate column.
  • We are slightly changing the Winnipeg routine to keep the physical and equalization change in the increase column if positive and decrease column if negative.

This step is only performed on MA_MASTER.FROZEN_ID = 0 and if CALC_INC_DEC = “yes”

  • MA_MASTER(Current).LAST_YEAR_VALUE= 0
  • MA_MASTER(Current).EQUALIZATION_INC= 0
  • MA_MASTER(Current).PHYSICAL_INC= 0
  • MA_MASTER(Current).EQUALIZATION_DEC = 0
  • MA_MASTER(Current).PHYSICAL_DEC = 0

curCurrentYearVal = MA_MASTER(Current).APPRAISED_VALUE

Get a dataset (called MA_MASTER – Prior Year dataset) for MA_MASTER
where the year_id is = MA_MASTER(Current).YEAR_ID -1 and MA_MASTER(Prior Year dataset).FROZEN_ID > -32766 and < 1 ORDER BY FROZEN_ID.

  • If Not MA_MASTER(Prior Year dataset).EOF ….. Then (Process only if there is at least one record for last year)
    • (The first record is always the smallest frozen record which contains the last value finalized)
    • MA_MASTER(Current).LAST_YEAR_VALUE= MA_MASTER(Prior Year dataset).APPRAISED_VALUE
    • If Not IsNull(MA_MASTER(Prior Year dataset).APPRAISED_VALUE) Then curLastYearOriginalVal = MA_MASTER(Prior Year dataset).APPRAISED_VALUE

 

    • dtValueFinalizedDate = ‘1/1/2000’ (We initialize to Jan 1, 2000)

 

    • If Not IsNull(MA_MASTER(Prior Year dataset).appraised_date) Then dtValueFinalizedDate = MA_MASTER(Prior Year dataset).appraised_date

 

    • If MA_MASTER(Prior Year dataset).frozen_id < 0 Then move to the last MA_MASTER(Prior Year dataset) record ‘ the last record is always frozen 0

 

    • If Not IsNull(MA_MASTER(Prior Year dataset).APPRAISED_VALUE) Then curLastYearVal = MA_MASTER(Prior Year dataset).APPRAISED_VALUE

Get a dataset (called MA_MASTER(Current Year dataset) for MA_MASTER
where the year_id is = MA_MASTER(Current).YEAR_ID and MA_MASTER(Current Year dataset).FROZEN_ID > -32766 and < 0 ORDER BY FROZEN_ID

curOriginalVal = curCurrentYearVal

Do Until MA_MASTER(Current Year dataset).EOF Or booCurrentOriginalFound

  • booCurrentOriginalFound = True

 

  • If curLastYearOriginalVal = curLastYearVal Then (If no change found in prior year we need to compare using the original current year (-1)

Move to the last record of MA_MASTER(Current Year dataset)
booCurrentOriginalFound = False

  • If Not IsNull(MA_MASTER(Current Year dataset).appraised_date) Then
    • If MA_MASTER(Current Year dataset).appraised_date > dtValueFinalizedDate Then ( If we have a date greater than the prior year value date then we need to read the prior record)

booCurrentOriginalFound = False

  • If Not IsNull(MA_MASTER(Current Year dataset).APPRAISED_VALUE) And booCurrentOriginalFound = False Then

curOriginalVal = MA_MASTER(Current Year dataset).APPRAISED_VALUE

  • Move to the next record of MA_MASTER(Current Year dataset)

Loop

If we don’t have a prior year and the original current year = current value then all changes are considered physical

  • If curLastYearVal = 0 And curLastYearOriginalVal = 0 And curCurrentYearVal = curOriginalVal
    • Then MA_MASTER(Current).PHYSICAL_INC= curCurrentYearVal
    • Else
      • MA_MASTER(Current).PHYSICAL_INC= curCurrentYearVal – curOriginalVal + curLastYearVal – curLastYearOriginalVal
      • MA_MASTER(Current).EQUALIZATION_INC= curCurrentYearVal – curLastYearOriginalVal – MA_MASTER(Current).physical_inc
      • If MA_MASTER(Current).physical_inc < 0
        • then
          • MA_MASTER(Current).physical_dec = MA_MASTER(Current).physical_inc * -1
          • MA_MASTER(Current).physical_inc = 0

 

      • If MA_MASTER(Current). EQUALIZATION_INC < 0
        • then
          • MA_MASTER(Current). EQUALIZATION_DEC = MA_MASTER(Current). EQUALIZATION_INC * -1
          • MA_MASTER(Current). EQUALIZATION_INC = 0

 

Step 15 – Transfer to Tax

This step will be added on the batch program to transfer values is completed – see roadmap
In this step we transfer the appraised values to the Real Property Tax
(VB6: pv_audit_and_transfer_to_tax)

  • If TRANS_TO_TAX = “yes” we perform this step.
    • Otherwise the compute is completed.

 

Correlated Value Logic

This section relates to prior reference in this document when MA_MASTER.METHOD_IN_USE = ‘5’

IF MA_MASTER.OVERRIDE_PCT_DIST is NULL or = 0
then
(We load the distribution percentages)

  • MA_MASTER.pct_cama_value = 0
  • MA_MASTER.pct_sale_value = 0
  • MA_MASTER.pct_inc_dir_value = 0
  • MA_MASTER.pct_inc_grm_value = 0
  • MA_MASTER.pct_mra_value = 0

Get the MA_PARM_MULTDIST using the CAMA parameter logic (Jurisdiction, neighborhood…) and the value of PC_LEGAL_INFO.CLASS for MA_PARM_MULTDIST.PUSE_CODE

If the following parameter values are NULL consider them to be 0.

  • MA_MASTER.pct_cama_value = MA_PARM_MULTDIST.cama_pct
  • MA_MASTER.pct_sale_value = MA_PARM_MULTDIST.SALE_pct
  • MA_MASTER.pct_inc_dir_value = MA_PARM_MULTDIST.INC_DIR_pct
  • MA_MASTER.pct_inc_grm_value = MA_PARM_MULTDIST.INC_GRM_pct
  • MA_MASTER.pct_mra_value = MA_PARM_MULTDIST.MRA_pct

IF MA_PARM_MULTDIST.MULTIDIST_EXPRESSION is not null
then

  • MA_MASTER.APPRAISED_VALUE = evaluated expression
  • No further processing is required

Compute the MA_MASTER_APPRAISED_VALUE =

  • (MA_MASTER.CAMA_VALUE * MA_MASTER.pct_cama_value / 100) +
  • (MA_MASTER.COMP_SALES_VALUE * MA_MASTER.pct_SALE_value / 100) +
  • (MA_MASTER.INCOME_DIR_VALUE * MA_MASTER.pct_INC_DIR_value / 100) +
  • (MA_MASTER.INCOME_GRM_VALUE * MA_MASTER.pct_INC_GRM_value / 100) +
  • (MA_MASTER.MRA_VALUE * MA_MASTER.pct_MRA_value / 100)

 

 

101-ma-compute-Global

 

0 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 5 (0 votes, average: 0.00 out of 5)
You need to be a registered member to rate this.
Loading...

 

MA – Income Computation

Mass Appraisal (MA) Income Computation

[In Development]

Overview

Purpose

The purpose of the Income Computation is to provide values for the Govern system columns for a given record of the table MA_INCOME (prior version MA_INC_INFO is now merged into it).
The ultimate goal of this compute is to provide a DIR (Direct Income Revenue/CAP) value and GRM (Gross Revenue Multiplier) value. Conceptually the DIR or GRM value is calculated with a rent rate multiplied by a number of rent units. This initial income value is then adjusted based on income quality, the vacancy, shortfall adjustments, other income, defined expenses, MA_SITE adjustments (see the Site adjustment specification document).

The income value is either an economic income value (default, we have up to 5 economic models), an actual value depending on the income model code (actual_economical).
It is always stored in MA_INCOME.NET_DIR and MA_INCOME.NET_GRM.

Important Notes Regarding the Computation

Auto Select Unique Code

When only one code is available and the Auto Select Unique Code option is selected, that code is used for the compute. This applies regardless of what the user has previously selected.

It applies, for example, if the code is changed in GNA, after the user set the code on the form. The update is made when either the property record is opened and resaved or the Mass Appraisal Compute batch process is run.

Is Required

If you select the Is Required option for a code after the user has created property records, you must verify that a code is selected for those records. Otherwise, an error is raised and the compute fails.

Registry and Constant

The following parameters are used for the setup and/or impact the lookup of codes or value computation.

  • PROPERTY_TYPE_FROM_PC_LEGAL = (‘yes’ or ‘no’) If no, it will use the income property type defined with the cat or model? (validate).
  • EXP_BY_CATEGORY = “Mass Appraisal”, “Associate Inc Expense to Category” = (‘yes’ or ‘no’)
  • EXP_BY_CATEGORY _EFFECTIVE = “Mass Appraisal”, “Associate Inc Expense to Category Year Effective” = smallInt (default global year_id)

Abandoned in version 6.1

  • COMPATIBILITY_INCOME_COMPUTE= “Mass Appraisal”, “Compatibility INC Compute” = (‘yes’ or ‘no’)
  • COMPATIBILITY_INCOME_COMPUTE_EFFECTIVE = “Mass Appraisal”, “Compatibility INC Compute Year Effective” = smallInt

Table Used and available for the expressions

Income Tables & Fields

  • MA_INCOME
  • MA_INCOME.CATEGORY_CODE -> MA_PARM_INCOME.CATEGORY_CODE
  • MA_INCOME.USED_AS_CODE -> MA_PARM_INCOME.CATEGORY_CODE
  • MA_INCOME.INCOME_GROUP -> MA_PARM_INCOME.INCOME_GROUP
  • MA_INCOME_DETAIL
NOTE: All economic model values base on parameters (MA_PARM_INCOME)

 

All fields below based on income model chosen in MA_INCOME

  • MA_INCOME.DIR_RATE -> MA_PARM_INCOME.DIR_RATE_EXPRESSION_x(e1,e2,e3,e4,e5)
  • MA_INCOME.GRM_RATE -> MA_PARM_INCOME.GRM_RATE_EXPRESSION_x(…)
  • MA_INCOME.RENT_UNIT_TYPE -> MA_PARM_INCOME.RENT_UNIT_TYPE ?? (validate)
  • MA_INCOME.GROSS_RENT_RATE -> MA_PARM_INCOME.GROSS_RENT_RATE_EXPRESSION _x(….)
  • MA_INCOME.VACANCT_PCT -> MA_PARM_INCOME.VACANCT_PCT_EXPRESSION_x(….)
  • MA_INCOME.OTHER_INCOME -> MA_PARM_INCOME.OTHER_INCOME_PCT_EXPRESSION_x(….)
  • MA_INCOME.SHORTFALL_PCT -> MA_PARM_INCOME.SHORTFALL_PCT_EXPRESSION_x(….)

Use property type from legal or define for income

  • MA_INCOME.P_ID -> PC_LEGAL_INFO.P_ID (Only if PROPERTY_TYPE_FROM_PC_LEGAL = “yes” and MA_PARM_INCOME.PROPERTY_TYPE is NULL)

Income Table Categories

  • MA_TABLES.TABLE_CATEGORY = “inc” and TABLE_TYPE=’income’ (income category)
  • MA_TABLES.TABLE_CATEGORY = “inc” and TABLE_TYPE=’incqua’ (income quality)
  • MA_TABLES.TABLE_CATEGORY = “inc” and TABLE_TYPE=’incadj’ (income overall adjustment)
  • MA_TABLES.TABLE_CATEGORY = “inc” and TABLE_TYPE=’incexp’ (income expense)
  • MA_TABLES.TABLE_CATEGORY = “inc” and TABLE_TYPE=’incitem’ (income rental detail adjustment)
  • MA_INCOME.YEAR_ID -> MA_MODIF_STAMP.YEAR_ID

Rounding

  • MA_PARM_MAROUND.ROUNDING_CODE = “inc” (income rounding)

 

System Columns (Calculated Fields)

The following system columns cannot be used in expressions stored in the MA_PARM tables nor should they be editable:
Income Fields

Rental dir_rate grm_rate
rent_unit_type rent_net_units
Gross Rent gross_rent_percent gross_rent_rate gross_rent_value
Income Quality inc_quality_pct inc_quality_unit inc_quality_value
Vacancy vacancy_pct vacancy_unit vacancy_value
Other Income other_income
Shortfall shortfall_pct shortfall_value
Room Occupancy % rm_occupancy_pct
Percent Unit Value
Expenses room_exp_pct room_exp_unit room_exp_value
food_exp_pct food_exp_unit food_exp_value
telecom_exp_pct telecom_exp_unit telecom_exp_value
dept_exp_pct dept_exp_unit dept_exp_value
other_exp_pct other_exp_unit other_exp_value
fixed_exp_pct fixed_exp_unit fixed_exp_value
operating_ex_pct operating_ex_unit operating_ex_value
replace_exp_pct replace_exp_unit replace_exp_value
misc_exp_pct misc_exp_unit misc_exp_value
taxes_exp_pct taxes_exp_unit taxes_exp_value
ffe_exp_pct ffe_exp_unit ffe_exp_value
Net Rental net_percent net_unit net_value
Overall Adjustment overall_adj_pct overall_adj_unit overall_adj_value
Gross Effective gross_effective
Gross Income income_dir income_grm
Net Income net_dir net_grm
Site Adjustment site_adj_pct site_adj_unit site_adj_value
Final Adjustment final_adj_dir final_adj_grm

 

Lookup Group

Many of the parameters used in the income computation depend on a lookup group. All the lookup groups are stored in the table MA_LOOKUP_GROUP and can be can be of the following types:

  • By neighborhood, By property type, By income neighborhood, By jurisdiction, By jurisdiction AND neighborhood, By jurisdiction AND income neighborhood

Look-Up Group Example:
We have an income record for the year 2015 with CATEGORY_CODE = “2212”. We want to get the income category information which is defined in the table MA_PARM_INCOME where the primary key is CATEGORY_CODE, YEAR_ID and LOOKUP_GROUP. We already have the year and the category code (2015 and “2212”) but we now need the lookup group.
Next we go to the table MA_LOOKUP_GROUP and get all the records with TABLE_NAME=”income”[1], YEAR_ID=2015 and CAMA_CODE=”2212”.
In our example, this lookup group is By jurisdiction and neighborhood so it will look like this:
LOOKUP_GROUP JURISDICTION NBHD
0 Null Null
1 31572 Null
2 31572 015
3 31572 016
4 31513 Null
5 31513 012
Here are some possible scenarios depending on the jurisdiction and neighborhood for the income record:

  • If Jurisdiction=31572 and Nbhd=015, then Lookup_Group=2
  • If Jurisdiction=31572 and Nbhd=020, then Lookup_Group=1
  • If Jurisdiction=45875 and Nbhd=015, then Lookup_Group=0

Properties required to get the lookup group

  • Jurisdiction:Use PC_PARCEL.JURISDICTION based on MA_INCOME.P_ID = PC_PARCEL.P_ID.
  • Neighborhood and Income neighborhood: Use PC_AREA.NBHD and PC_AREA.INC_NBHD based MA_INCOME.P_ID = PC_AREA.P_ID and MA_INCOME.FROZEN_ID = PC_AREA.FROZEN_ID.
  • Property type: Use MA_PARM_INCOME.PROPERTY_TYPE based on MA_INCOME.CATEGORY_CODE = MA_PARM_INCOME.CATEGORY_CODE and MA_INCOME.YEAR_ID = MA_PARM_INCOME.YEAR_ID. If no information is found in MA_PARM_INCOME then we’ll use a blank property type (15 spaces). This is a table that depends itself on a lookup group. If the lookup group is By property type then for the purpose of the lookup we must use the PROPERTY_TYPE defined in PC_LEGAL_INFO.PROPERTY_TYPE.

[1] The table name changes for each type of parameter; in the case of adjustments defined in MA_TABLE, we use MA_TABLE.TABLE_NAME

Step 1 – Get Income Parameters

Get the income parameter based on MA_INCOME.USED_AS_CODE or CATEGORY_CODE and economic income model MA_INCOME.ACTUAL_ECONOMICAL.

 

Step 2 – Get Income Percentage & Rate

The percentage is established by getting MA_PARM_INCOME based on income model MA_INCOME.ACTUAL_ECONOMICAL (1, 2, 3, 4, 5)

  • MA_INCOME.DIR_RATE = DIR_RATE_EXPRESSION_x
  • MA_INCOME.GRM_RATE = GRM_RATE_EXPRESSION_x
  • MA_INCOME.RENT_UNIT_TYPE = RENT_UNIT_TYPE
  • MA_INCOME.GROSS_RENT_RATE = GROSS_RENT_RATE_EXPRESSION_x
  • MA_INCOME.VACANCY_PCT = VACANCY_PCT_EXPRESSION_x
  • MA_INCOME.OTHER_INCOME = OTHER_INCOME_PCT_EXPRESSION_x

Get the expenses from parameter (by percent, by unit or by value ORDER)

  • MA_INCOME.ROOM_EXP_PCT = ROOM_EXP_PCT_EXPRESSION_x | MA_INCOME.ROOM_EXP_UNIT = ROOM_EXP_UNIT_EXPRESSION_x | MA_INCOME.ROOM_EXP.VALUE = ROOM_EXP_VALUE_EXPRESSION_x
  • MA_INCOME.FOOD_EXP_PCT = FOOD_EXP_PCT_EXPRESSION_x | MA_INCOME.FOOD_EXP_UNIT = FOOD_EXP_UNIT_EXPRESSION_x | MA_INCOME.FOOD_EXP.VALUE = FOOD_EXP_VALUE_EXPRESSION_x
  • MA_INCOME.TELECOM_EXP_PCT = TELECOM_EXP_PCT_EXPRESSION_x | MA_INCOME.TELECOM_EXP_UNIT = TELECOM_EXP_UNIT_EXPRESSION_x | MA_INCOME.TELECOM_EXP.VALUE = TELECOM_EXP_VALUE_EXPRESSION_x
  • MA_INCOME.DEPT_EXP_PCT = DEPT_EXP_PCT_EXPRESSION_x | MA_INCOME.DEPT_EXP_UNIT = DEPT_EXP_UNIT_EXPRESSION_x | MA_INCOME.DEPT_EXP.VALUE = DEPT_EXP_VALUE_EXPRESSION_x
  • MA_INCOME.OTHER_EXP_PCT = OTHER_EXP_PCT_EXPRESSION_x | MA_INCOME.OTHER_EXP_UNIT = OTHER_EXP_UNIT_EXPRESSION_x | MA_INCOME.OTHER_EXP.VALUE = OTHER_EXP_VALUE_EXPRESSION_x
  • MA_INCOME.FIXED_EXP_PCT = FIXED_EXP_PCT_EXPRESSION_x | MA_INCOME.FIXED_EXP_UNIT = FIXED_EXP_UNIT_EXPRESSION_x | MA_INCOME.FIXED_EXP.VALUE = FIXED_EXP_VALUE_EXPRESSION_x
  • MA_INCOME.OPERATING_EX_PCT = OPERATING_E_PCT_EXPRESSION_x | MA_INCOME. OPERATING_EX_UNIT = OPERATING_E_UNIT_EXPRESSION_x | MA_INCOME. OPERATING_EX.VALUE = OPERATING_E_VALUE_EXPRESSION_x
  • MA_INCOME.REPLACE_EXP_PCT = REPLACE_EXP_PCT_EXPRESSION_x | MA_INCOME.REPLACE_EXP_UNIT = REPLACE_EXP_UNIT_EXPRESSION_x | MA_INCOME.REPLACE_EXP.VALUE = REPLACE_EXP_VALUE_EXPRESSION_x
  • MA_INCOME.MISC_EXP_PCT = MISC_EXP_PCT_EXPRESSION_x | MA_INCOME.MISC_EXP_UNIT = MISC_EXP_UNIT_EXPRESSION_x | MA_INCOME.MISC_EXP.VALUE = MISC_EXP_VALUE_EXPRESSION_x
  • MA_INCOME.TAXES_EXP_PCT = TAXES_EXP_PCT_EXPRESSION_x | MA_INCOME.TAXES_EXP_UNIT = TAXES_EXP_UNIT_EXPRESSION_x | MA_INCOME.TAXES_EXP.VALUE = TAXES_EXP_VALUE_EXPRESSION_x
  • MA_INCOME.FFE_EXP_PCT = FFE_EXP_PCT_EXPRESSION_x | MA_INCOME.FFE_EXP_UNIT = FFE_EXP_UNIT_EXPRESSION_x | MA_INCOME.FFE_EXP.VALUE = FFE_EXP_VALUE_EXPRESSION_x

 

Step 3 – Initialize Values

Set all computed value fields to zero (VB6 : pv_set_to_zero_inc_info, pv_reset_rent)(ResetSystemFields, ResetRentalDetailFields)

Set to zero all system fields (calculated fields) in MA_INCOME

 

Step 4 – Income Rental Detail Calculation

Income detail calculation is also based on income model. The gross rent rate (MA_INCOME_DETAIL.GROSS_RENT_RATE) is taken from MA_PARM_INC_SUBCAT.RENT_RATE_EXPRESSION_x when model is economic model or user entered when model is actual. If no rate defined in sub category parameter, gross rent rate will be taken from income parameter MA_PARM_INCOME.GROSS_RENT_RATE_EXPRESSION_x

If Room Occupancy Percent is defined and rental type =’room’, we will use Room Occupancy Percent, otherwise, the percent is taken from gross_rent_percent.

  • MA_INCOME_DETAIL. RENT_NET_UNITS= MA_INCOME_DETAIL. RENT_UNITS* gross rent percent/100
  • MA_INCOME_DETAIL. GROSS_RENT_VALUE= MA_INCOME_DETAIL. RENT_NET_UNITS* gross rent rate
  • If MA_INCOME_DETAIL. RATE_PERIOD=’m’ (monthly rate) then
    • MA_INCOME_DETAIL. GROSS_RENT_VALUE*12
  • If MA_INCOME_DETAIL. RATE_PERIOD=’d’ (daily rate) then
    • MA_INCOME_DETAIL. GROSS_RENT_VALUE*365

If income rental detail record is the vacant record and has a number of vacant months then

  • MA_INCOME_DETAIL. GROSS_RENT_VALUE =MA_INCOME_DETAIL. GROSS_RENT_VALUE/12

*number of vacant months

 

Step 5 – Compute Rental Detail Adjustments

The income rental detail adjustment are defined as all MA_TABLES records having a TABLE_TYPE = “incitem” AND INC_ITEM_CODE = “a”.

NOTE:
Auto Select Unique Code
When only one code is available and the Auto Select Unique Code option is selected, that code is used for the compute. This applies regardless of what the user has previously selected.
It applies, for example, if the code is changed in GNA, after the user set the code on the form. The update is made when either the property record is opened and resaved or the Mass Appraisal Compute batch process is run.

Is Required
If you select the Is Required option for a code after the user has created property records, you must verify that a code is selected for those records. Otherwise, an error is raised and the compute fails.

a) Calculate the Adjustment Value [VA]
For each adjustment we calculate the adjustment value MA_INCOME_DETAIL.(MA_TABLES.COLUMN_NAME)_VA
If no code [CD] is recorded in the income detail record entered, the value is set to NULL

  • MA_INCOME_DETAIL.(MA_TABLES.COLUMN_NAME)_CD is null
  • Then MA_INCOME_DETAIL.(MA_TABLES.COLUMN_NAME)_VA is set to NULL

If a code [CD] is recorded, the expression is evaluated (computed) and stored in the value [VA]

  • MA_INCOME_DETAIL.(MA_TABLES.COLUMN_NAME)_VA = evaluated from the expression in MA_PARM_INCITEM.EXPRESSION

b) Perform the adjustment by selecting ( all non nulls MA_INCOME_DETAIL.(column)_VA for MA_TABLES.INC_ITEM_CODE = “a”. where MA_INCOME_DETAIL.(column)_OV = 0 ) OR selecting ( all non nulls MA_INCOME_DETAIL.(column)_OV_VALUE for MA_TABLES.INC_ITEM_CODE = “a” where MA_INCOME_DETAIL.(column)_OV = -1 )

There are 4 MATHS sign +,-,X,/ and 2 kinds of values a (amount), p (percentage) [PCT_AMT] We take the starting gross rent value previously calculated MA_INCOME_DETAIL.GROSS_RENT_VALUE and we apply every adjustment to it.
Adjustments are cumulative.

Case MATHS = ‘+’

  • If PCT_AMT = ‘a’ then we add MA_INCOME_DETAIL.(column_name)_VA to the value (GROSS_RENT_VALUE)
  • If PCT_AMT = ‘p’ then we first apply the percentage represented by MA_INCOME_DETAIL.(column_name)_VA to the value (GROSS_RENT_VALUE) and then we add the result to the value. Example gross rent value = 10 MA_INCOME_DETAIL.BEDS_VA = 5 then (10 X 5%) + 10 = 10.50

Case MATHS = ‘-’

  • If PCT_AMT = ‘a’ then we subtract MA_INCOME_DETAIL.(column_name)_VA to the value (GROSS_RENT_VALUE)
  • If PCT_AMT = ‘p’ then we first apply the percentage represented by MA_INCOME_DETAIL.(column_name)_VA to the value (GROSS_RENT_VALUE) and then we subtract the result to the value. Example gross rent rate = 10 MA_INCOME_DETAIL.BEDS_VA = 5 then (10 X 5%) + 10 = 9.50

Case MATHS = ‘X’

  • If PCT_AMT = ‘a’ then we multiply MA_INCOME_DETAIL.(column_name)_VA to the value (GROSS_RENT_VALUE).
  • If PCT_AMT = ‘p’ then we multiply by the percentage represented by MA_INCOME_DETAIL.(column_name)_VA to the value (GROSS_RENT_VALUE) . Example gross rent value = 10 MA_INCOME_DETAIL.BEDS_VA = 90 then (10 X 90%) = 9

Case MATHS = ‘/’

  • If PCT_AMT = ‘a’ then we divide the value (GROSS_RENT_VALUE) by MA_INCOME_DETAIL.(column_name)_VA
  • If PCT_AMT = ‘p’ then we divide the value (GROSS_RENT_VALUE) by the percentage represented by MA_INCOME_DETAIL.(column_name)_VA to. Example gross rent value = 10 MA_INCOME_DETAIL.BEDS_VA = 90 then (10 / 90%) = 11.11111

Business Rule

    • If MATHS or PCT_AMT are null then no operation is performed. (validate)

c) Process the Features

  • The income rental detail features are defined as all MA_TABLES records having a TABLE_TYPE = “incitem” AND INC_ITEM_CODE = “f”.

Business Rule

    • If MA_INCOME_DETAIL.(column)_CD is numeric then we move it to MA_INCOME_DETAIL.(column)_VA otherwise we set MA_INCOME_DETAIL.(column)_VA to NULL. (validate if new Expression applied to income features)

 

Step 6 – Summarize by Rental Type

Grouping income detail revenue by rental type (VB6 : pv_compute_income_detailActual, pv_compute_income_detailEconomic)(ApplyIncomeSubCategoryByRentalType)
Fields to compute based on rental type (room, food, telecom, dept, other) defined in MA_PARM_INC_SUBCAT (RENTAL_TYPE)

  • MA_INCOME.(rental type)_RENT_PCT=sum of all MA_INCOME_DETAIL.GROSS_RENT_PCT
  • MA_INCOME.(rental type)_RENT_UN=sum of all MA_INCOME_DETAIL.RENT_NET_UNITS
  • MA_INCOME.(rental type)_RENT_VAL=sum of all MA_INCOME_DETAIL.GROSS_RENT_VALUE
  • MA_INCOME.(rental type)_RENT_RATE =sum of all MA_INCOME_DETAIL.GROSS_RENT_RATE

 

Step 7 – Compute Income Gross Revenue

Set income revenue value (VB6 : pv_compute_income_detailActual, pv_compute_income_detailEconomic) (ApplyIncomeSubCategoryValuesToIncome)

  • MA_INCOME.GROSS_RENT_VALUE=sum of all MA_INCOME_DETAIL.GROSS_RENT_VALUE
  • MA_INCOME. RENT_UNITS= sum of MA_INCOME_DETAIL. RENT_UNITS (excluded other income)
  • MA_INCOME. RENT_NET_UNITS= sum of MA_INCOME_DETAIL. RENT_NET_UNITS (excluded other income and vacant without vacant rate)
  • MA_INCOME.GROSS_RENT_VALUE= sum of MA_INCOME_DETAIL.GROSS_RENT_ECO (excluded other income)
  • MA_INCOME.GROSS_RENT_RATE= MA_INCOME.GROSS_RENT_VALUE/ MA_INCOME. RENT_NET_UNITS
  • MA_INCOME.GROSS_RENT_PERCENT= MA_INCOME. RENT_NET_UNITS / MA_INCOME. RENT_UNITS*100
  • MA_INCOME.OTHER_INCOME=sum of MA_INCOME_DETAIL.GROSS_RENT_ECO if flagged as other income in sub category parameter.

The vacancy is populated from parameter for economic models, otherwise we take it from sum of vacancy from income detail.

  • MA_INCOME.VACANCY_VALUE= (MA_INCOME.GROSS_RENT_VALUE/ MA_INCOME.VACANCY_PCT)/100
  • MA_INCOME.VACANCY_UNIT= MA_INCOME.VACANCY_VALUE/ MA_INCOME.GROSS_RENT_RATE
  • MA_INCOME.VACANCY_UNIT=sum of MA_INCOME_DETAIL.RENT_NET_UNITS
  • MA_INCOME.VACANCY_VALUE=sum of MA_INCOME_DETAIL.GROSS_RENT_VALUE
  • MA_INCOME.VACANCY_PCT= (MA_INCOME.VACANCY_UNIT/ MA_INCOME.RENT_NET_UNITS)*100

The Short Fall adjustment is added. The short fall will occur after the calculation of vacancy. This adjustment is populated from parameter.

  • MA_INCOME_SHORTFALL_PCT=MA_PARM_INCOME.SHORTFALL_RATE_EXPRESSION (1, 2, 3, 4, 5)
  • MA_INCOME.SHORTFALL_VALUE = MA_INCOME_SHORTFALL_PCT * MA_INCOME.VACANCY_VALUE

 

Step 8 – Quality Adjustment

Set the value of the quality adjustment (Govern for Windows: pv_compute_quality_adj)(SetQualityAdjustment)
NOTE: Is Required
If you select the Is Required option for a code after the user has created property records, you must verify that a code is selected for those records. Otherwise, an error is raised and the compute fails.
The income quality is defined in MA_PARM_INCQUA records having a QUA_CODE = MA_INCOME.INCOME_QUALITY.

  • MA_INCOME.INC_QUALITY_VALUE = (GROSS_RENT_VALUE/100*evaluated from the expression in MA_PARM_INCQUA.PERCENTAGE_EXPRESSION)-GROSS_RENT_VALUE
  • MA_INCOME.INC_QUALITY_UNIT= INC_QUALITY_VALUE/GROSS_RENT_RATE
  • MA_INCOME.INC_QUALITY_PCT= INC_QUALITY_VALUE*100/GROSS_RENT_VALUE

Total adjustment = GROSS_RENT_VALUE + INC_QUALITY_VALUE

 

Step 9 – Compute Vacancy and Loss

(VB6 : pv_compute_vacancy_loss)(SetVacancyLossAdjustment)
If EXPENSE_BY=’p’ then

  • VACANCY_UNIT=RENT_NET_UNITS*VACANCY_PCT/100
  • VACANCY_VALUE=total adjustment* VACANCY_PCT/100

If EXPENSE_BY=’u’ then

  • VACANCY_VALUE= VACANCY_UNIT * GROSS_RENT_RATE
  • VACANCY_PCT= VACANCY_UNIT*100/RENT_NET_UNITS

Else

  • VACANCY_UNIT=VACANCY_VALUE/GROSS_RENT_RATE
  • VACANCY_PCT=VACANCY_UNIT*100/RENT_NET_UNITS

Step 10 – Compute the Effective Gross for Income Record

(VB6: pv_compute_effective_gross)(CalculateEffectiveGross)
The MA_INCOME.OTHER_INCOME is calculated only for economic models = GROSS_RENT_VALUE * other income percent/100

  • MA_INCOME.GROSS_EFFECTIVE=total adjustment – VACANCY_VALUE – SHORTFALL_VALUE + OTHER_INCOME

 

Step 11 – Compute economic values or expenses

(VB6: pv_compute_economic, pv_reset_expense) (CalculateExpenses) VALIDATE STEP
For departmental expenses:
If ROOM_EXP_PCT<>0 then

  • ROOM_EXP_UNIT= ROOM_EXP_PCT*ROOM_RENT_UN/100

If ROOM_EXP_UNIT<>0 AND ROOM_RENT_UN<>0 then

  • ROOM_EXP_PCT= ROOM_EXP_UNIT/ROOM_RENT_UN *100
  • ROOM_EXP_VALUE=ROOM_EXP_PCT*ROOM_RENT_VAL/100
  • Repeat the same calculation are based on ROOM expenses for all expenses below:
    • FOOD_EXP_UNIT, FOOD_EXP_PCT, FOOD_EXP_VALUE, TELECOM_EXP_UNIT, TELECOM_EXP_PCT, TELECOM_EXP_VALUE, DEPT_EXP_UNIT,
    • DEPT_EXP_PCT, DEPT_EXP_VALUE, OTHER_EXP_UNIT, OTHER_EXP_PCT, OTHER_EXP_VALUE

For undistributed expenses:
If FIXED_EXP_PCT <> then

  • FIXED_EXP_UNIT=FIXED_EXP_PCT*RENT_NET_UNITS/100

If FIXED_EXPENSE_UNIT <>0 AND RENT_NET_UNITS<>0 then

  • FIXED_EXP_PCT=FIXED_EXPENSE_UNIT/RENT_NET_UNITS*100
  • FIXED_EXP_VALUE=FIXED_EXP_PCT*GROSS_EFFECTIVE/100

If the option ‘Undistributed Expenses Calculation without Departmental Expenses’ is checked, the effective gross will be subtracted by all Departmental expenses values. (parm)

The product from that equation is then used to calculate the Undistributed Expenses.

  • Gross effective=GROSS_EFFECTIVE-(ROOM_EXP_VALUE+FOOD_EXP_VALUE+TELECOM_EXP_VALUE+DEPT_EXP_VALUE+ OTHER_EXP_VALUE)

For fixed expenses

  • FIXED_EXP_VALUE=FIXED_EXP_PCT*gross effective subtracted departmental expenses/100
  • Repeat the same calculation are based on FIXED expenses for all expenses below:
    • OPERATING_EX_UNIT, OPERATING_EX_PCT, OPERATING_EX_VALUE
    • REPLACE_EXP_UNIT, REPLACE_EXP_PCT, REPLACE_EXP_VALUE
    • MISC_EXP_UNIT, MISC_EXP_PCT, MISC_EXP_VALUE
    • TAXES_EXP_UNIT, TAXES_EXP_PCT, TAXES_EXP_VALUE

For FFE expenses

  • If FFE_EXP_PCT <> then
    • FFE_EXP_UNIT=FFE_EXP_PCT*ROOM_RENT_UN/100
  • If FFE_EXPENSE_UNIT <>0 AND ROOM_RENT_UN <>0 then
    • FFE_EXP_PCT=FFE_EXPENSE_UNIT/ ROOM_RENT_UN *100
  • FFE_EXP_VALUE=FFE_EXP_PCT*GROSS_EFFECTIVE/100

 

Step 12 – Compute Income Expenses

(VB6 : pv_compute_added_field).
We process all expenses (The income expenses are defined as all MA_TABLES records having a TABLE_TYPE = “incexp”)

1) If MA_INCOME.(column)_EB”) (expense_by)=’p’ then

  • For expenses=room, food, telecom, dept and other:
    • MA_INCOME.(column)_VL = MA_INCOME.(column)_PC* MA_INCOME.(MA_PARM_INCOME.INCOME_APPLY_TO = apply to)_RENT_VAL (MA_PARM_INCOME.INCOME_APPLY_TO =droom, dfood, dtelecom, ddept, dother excepted the first character, apply to=room, food, telecom, dept, other)

If option ‘Rate Unite in Income Expense’ is ‘Yes’ then

  • MA_INCOME.(column)_UN = MA_INCOME.(column)_VL /
  • MA_INCOME.(apply to)_RENT_UN

Else

  • MA_INCOME.(column)_UN = MA_INCOME.(column)_PC *
  • MA_INCOME.(apply to)_RENT_UN /100

If the option ‘Undistributed Expenses Calculation without Departmental Expenses’ is checked,
The effective gross will be subtracted by all Departmental expenses values. The product from that equation is then used to calculate the Undistributed Expenses.

  • Gross effective=GROSS_EFFECTIVE-(ROOM_EXP_VALUE+ FOOD_EXP_VALUE+ TELECOM_EXP_VALUE+ DEPT_EXP_VALUE+ OTHER_EXP_VALUE)

For other expenses (Undistributed expenses and furniture/fixture/equipment)
MA_INCOME.(column)_VL = MA_INCOME.(column)_PC * Gross Effective / 100
If option ‘Rate Unite in Income Expense’ is ‘Yes’ then

  • MA_INCOME.(column)_UN = MA_INCOME.(column)_VL / MA_INCOME.RENT_NET_UNITS

Else

  • MA_INCOME.(column)_UN = MA_INCOME.(column)_PC *
  • MA_INCOME.RENT_NET_UNITS / 100

2) If MA_INCOME.(column)_EB”) (expense_by)=’u’ then
For expenses=room, food, telecom, dept and other:
If option ‘Rate Unite in Income Expense’ is ‘Yes’ then

  • MA_INCOME.(column)_VL = MA_INCOME.(column)_UN *
  • MA_INCOME.(apply to “_RENT_UN”)
  • MA_INCOME.(column)_PC = MA_INCOME.(column)_UN * 100 /
  • MA_INCOME.(apply to & “_RENT_UN”)

Else

  • MA_INCOME.(column)_VL = MA_INCOME.(column)_UN *
  • MA_INCOME.(apply to & “_RENT_RATE”)
  • MA_INCOME.(column)_PC = MA_INCOME.(column)_UN * 100 /
  • MA_INCOME.(apply to & “_RENT_UN)

For Undistributed Expenses
If the option ‘Undistributed Expenses Calculation without Departmental Expenses’ is checked, the effective gross will be subtracted by all Departmental expenses values. The product from that equation is then used to calculate the Undistributed Expenses.

  • Gross effective=GROSS_EFFECTIVE-(ROOM_EXP_VALUE+ FOOD_EXP_VALUE+ TELECOM_EXP_VALUE+ DEPT_EXP_VALUE+ OTHER_EXP_VALUE)

For other expenses,
If option ‘Rate Unite in Income Expense’ is ‘Yes’ then

  • MA_INCOME.(column)_VL = MA_INCOME.(column)_UN * MA_INCOME.RENT_NET_UNITS
  • MA_INCOME.(column)_PC = MA_INCOME.(column)_VL * 100 / Gross Effective

else

  • MA_INCOME.(column)_VL = MA_INCOME.(column)_UN *
  • MA_INCOME.GROSS_RENT_RATE
  • MA_INCOME.(column)_PC = MA_INCOME.(column)_UN * 100 /
  • MA_INCOME.RENT_NET_UNITS

3) If MA_INCOME.(column)_EB”) (expense_by)=’g’ then
For expenses=room, food, telecom, dept and other:
If option ‘Rate Unite in Income Expense’ is ‘Yes’ then

  • MA_INCOME.(column)_UN = MA_INCOME.(column)_VL /
  • MA_INCOME.(apply to & “_RENT_UN”)
  • MA_INCOME.(column)_PC = MA_INCOME.(column)_VL * 100 /
  • MA_INCOME.(apply to & “_RENT_VAL)

Else

  • MA_INCOME.(column)_UN = MA_INCOME.(column)_VL /
  • MA_INCOME.(apply to & “_RENT_RATE)
  • MA_INCOME.(column)_PC = MA_INCOME.(column)_VL * 100 /
  • MA_INCOME.(apply to & “_RENT_VAL)

For other expenses,
If option ‘Rate Unite in Income Expense’ is ‘Yes’ then

  • MA_INCOME.(column)_UN = MA_INCOME.(column)_VL / MA_INCOME.RENT_NET_UNITS
  • MA_INCOME.(column)_PC = MA_INCOME.(column)_VL * 100 / Gross Effective

else

  • MA_INCOME.(column)_UN = MA_INCOME.(column)_VL / MA_INCOME.GROSS_RENT_RATE
  • MA_INCOME.(column)_PC = MA_INCOME.(column)_VL * 100 / Gross Effective

If income model is Actual then
For each type of MA_PARM_INCOME.INCOME_APPLY_TO (droom, dfood, dtelecom, ddept, dother, fix, ope, rep, misc, tax, ffe):

droom: MA_INCOME.ROOM_EXP_PCT= SUM of MA_INCOME.(column)_PC
MA_INCOME.ROOM_EXP_UNIT = SUM of MA_INCOME.(column)_UN
MA_INCOME.ROOM_EXP_VALUE = SUM of MA_INCOME.(column)_VL

dfood: MA_INCOME.FOOD_EXP_PCT= SUM of MA_INCOME.(column)_PC
MA_INCOME.FOOD_EXP_UNIT = SUM of MA_INCOME.(column)_UN
MA_INCOME.FOOD_EXP_VALUE = SUM of MA_INCOME.(column)_VL

dtelecom: MA_INCOME.TELECOM_EXP_PCT= SUM of MA_INCOME.(column)_PC
MA_INCOME.TELECOM_EXP_UNIT = SUM of MA_INCOME.(column)_UN
MA_INCOME.TELECOM_EXP_VALUE = SUM of MA_INCOME.(column)_VL

ddept: MA_INCOME.DEPT_EXP_PCT= SUM of MA_INCOME.(column)_PC
MA_INCOME.DEPT_EXP_UNIT = SUM of MA_INCOME.(column)_UN
MA_INCOME.DEPT_EXP_VALUE = SUM of MA_INCOME.(column)_VL

dother: MA_INCOME.OTHER_EXP_PCT= SUM of MA_INCOME.(column)_PC
MA_INCOME.OTHER_EXP_UNIT = SUM of MA_INCOME.(column)_UN
MA_INCOME.OTHER_EXP_VALUE = SUM of MA_INCOME.(column)_VL

fix: MA_INCOME.FIXED_EXP_PCT= SUM of MA_INCOME.(column)_PC
MA_INCOME.FIXED_EXP_UNIT = SUM of MA_INCOME.(column)_UN
MA_INCOME.FIXED_EXP_VALUE = SUM of MA_INCOME.(column)_VL

ope: MA_INCOME.OPERATING_EXP_PCT= SUM of MA_INCOME.(column)_PC
MA_INCOME.OPERATING_EXP_UNIT = SUM of MA_INCOME.(column)_UN
MA_INCOME.OPERATING_EXP_VALUE = SUM of MA_INCOME.(column)_VL

rep: MA_INCOME.REPLACE_EXP_PCT= SUM of MA_INCOME.(column)_PC
MA_INCOME.REPLACE_EXP_UNIT = SUM of MA_INCOME.(column)_UN
MA_INCOME.REPLACE_EXP_VALUE = SUM of MA_INCOME.(column)_VL

misc: MA_INCOME.MISC_EXP_PCT= SUM of MA_INCOME.(column)_PC
MA_INCOME.MISC_EXP_UNIT = SUM of MA_INCOME.(column)_UN
MA_INCOME.MISC_EXP_VALUE = SUM of MA_INCOME.(column)_VL

tax: MA_INCOME.TAXES_EXP_PCT= SUM of MA_INCOME.(column)_PC
MA_INCOME.TAXES_EXP_UNIT = SUM of MA_INCOME.(column)_UN
MA_INCOME.TAXES_EXP_VALUE = SUM of MA_INCOME.(column)_VL

ffe: MA_INCOME.FFE_EXP_PCT= SUM of MA_INCOME.(column)_PC
MA_INCOME.FFE_EXP_UNIT = SUM of MA_INCOME.(column)_UN
MA_INCOME.FFE_EXP_VALUE = SUM of MA_INCOME.(column)_VL

 

Step 13 – Compute the Total Gross and Net By Percent

(VB6 : pv_compute_exp_to_net) (CalculateTotalValue)

  • total expense percent = (ROOM_EXP_PCT+FOOD_EXP_PCT+TELECOM_EXP_PCT+DEPT_EXP_PCT+OTHER_EXP_PCT+FFE_EXP_PCT+FIXED_EXP_PCT+OPERATING_EX_PCT+REPLACE_EXP_PCT+ MISC_EXP_PCT+TAXES_EXP_PCT)
  • total expense unit = (ROOM_EXP_UNIT+FOOD_EXP_UNIT+TELECOM_EXP_UNIT+DEPT_EXP_UNIT+OTHER_EXP_UNIT+FFE_EXP_UNIT+FIXED_EXP_UNIT+OPERATING_EX_UNIT+REPLACE_EXP_UNIT+ MISC_EXP_UNIT+TAXES_EXP_UNIT)
  • total expense value = (ROOM_EXP_VALUE+FOOD_EXP_VALUE+TELECOM_EXP_VALUE+DEPT_EXP_VALUE+OTHER_EXP_VALUE+FFE_EXP_VALUE+FIXED_EXP_VALUE+OPERATING_EX_VALUE+REPLACE_EXP_VALUE+ MISC_EXP_VALUE+TAXES_EXP_VALUE) rounded with no decimal, or take override value
    • total expense value = (ROOM_EXP_VA_OV+FOOD_EXP_VA_OV+TELECOM_EXP_VA_OV+DEPT_EXP_VA_OV+OTHER_EXP_VA_OV+FFE_EXP_VA_OV+FIXED_EXP_VA_OV+OPERATING_EX_VA_OV+REPLACE_EXP_VA_OV+ MISC_EXP_VA_OV+TAXES_EXP_VA_OV)

MA_INCOME.NET_PCT = 100 – total expense percent
MA_INCOME.OVERALL_ADJ_PCT = total expense percent

MA_INCOME.NET_UNIT = MA_INCOME.RENT_NET_UNITS – total expense unit
MA_INCOME.OVERALL_ADJ_UNIT = total expense unit

MA_INCOME.OVERALL_ADJ_VALUE = total expense value

MA_INCOME.NET_VALUE = MA_INCOME.GROSS_EFFECTIVE – MA_INCOME.OVERALL_ADJ_VALUE+ MA_INCOME.FINAL_ADJ

 

Step 14 – Compute the Site Adjustment for this Record

(Govern for Windows: pv_compute_site) (ApplySiteAdjustment)
Site adjustment is based on the value of MA_INCOME.SITE_NO
Note: Is Required
If you select the Is Required option for a code after the user has created property records, you must verify that a code is selected for those records. Otherwise, an error is raised and the compute fails.
The income quality is defined in MA_PARM_INCQUA records having a QUA_CODE = MA_INCOME.INCOME_QUALITY.

The adjustment (MA_INCOME.SITE_ADJ_VALUE) is calculated as
(MA_INCOME.NET_VALUE * MA_SITE.ADJ_INC_PERCENT / 100) + MA_SITE.ADJ_INC_AMOUNT

MA_INCOME.SITE_ADJ_UNIT is calculated as MA_INCOME.SITE_ADJ_VALUE
MA_INCOME.GROSS_RENT_RATE

MA_INCOME.SITE_ADJ_PCT is calculated as MA_INCOME.SITE_ADJ_VALUE
MA_INCOME.GROSS_RENT_VALUE * 100

The site adjustment (MA_INCOME.SITE_ADJ_VALUE) is added to the MA_INCOME.NET_VALUE.

 

Step 15 – Compute DIR and GRM Value

(VB6 : pv_compute_dir_grm) (CalculateGrmDirValues)

MA_INCOME.INCOME_DIR = (MA_INCOME.NET_VALUE + MA_INCOME.SITE_ADJ_VALUE) * 100
MA_INCOME.DIR_RATE

MA_INCOME.INCOME_GRM = (MA_INCOME.GROSS_EFFECTIVE + MA_INCOME.SITE_ADJ_VALUE) *
MA_INCOME.GRM_RATE

MA_INCOME.INCOME_DIR and MA_INCOME.INCOME_GRM could not be a negative amount. If so, it must be equal to 0

 

Step 16 – Compute net dir and grm (apply overall adjustment)

(VB6 : pv_compute_overall_adj) (ApplyOverallAdjsutment)
The overall adjustment is defined in MA_TABLES record having a TABLE_TYPE = “incadj”.
If no record found then

  • MA_INCOME.NET_DIR = MA_INCOME.INCOME_DIR
  • MA_INCOME.NET_GRM = MA_INCOME.INCOME_GRM

Else
The adjustment factoris an evaluated expression, if not defined, set to 100

  • MA_INCOME.NET_DIR = MA_INCOME.INCOME_DIR / 100 * adjustment factor
  • MA_INCOME.NET_GRM = MA_INCOME.INCOME_GRM / 100 * adjustment factor

If MA_INCOME.NB_UNITS (multiplier) > 1 then

  • MA_INCOME.NET_DIR = MA_INCOME.NET_DIR * multiplier
  • MA_INCOME.NET_GRM = MA_INCOME.NET_DIR * multiplier

 

Step 17 – Compute final dir and grm (apply final adjustment)

(VB6 : pv_round_dir_grm).
The final adjustment is calculated only if MA_INCOME.FINAL_ADJ_GRM_PCT is not NULL.[1] MA_INCOME.FINAL_GRM_ADJ = MA_INCOME.NET_GRM * MA_INCOME.FINAL_ADJ_GRM_PCT / 100
MA_INCOME.NET_GRM = MA_INCOME.NET_GRM + MA_INCOME.FINAL_ADJ_GRM

The final adjustment is calculated only if MA_INCOME.FINAL_ADJ_DIR_PCT is not NULL.[2] MA_INCOME.FINAL_DIR_ADJ = MA_INCOME.NET_DIR * MA_INCOME.FINAL_ADJ_DIR_PCT / 100
MA_INCOME.NET_DIR = MA_INCOME.NET_DIR + MA_INCOME.FINAL_ADJ_DIR

[1] A value of zero reset both the final_adj and final_adj_percent to NULL
[2] A value of zero reset both the final_adj and final_adj_percent to NULL

 

Step 18 – Final values rounding

(VB6 : pv_round_dir_grm) (RoundFinalValues)

MA_INCOME.NET_DIR, MA_INCOME_NET_GRM are rounded based on the MA_PARM_MAROUND information (code = ‘inc’).
For example, if the rounding value is 1000, and the net value is 45678 then the value is 46000. If the rounding value was 100 then it would have been 45700.

 

Step 19 – Set the modif stamp

Sets the modif stamp for the computed record (VB6 : compute_income).

We set MA_INCOME.MODIF_STAMP = MA_MODIF_STAMP.INC_STAMP if not null, otherwise we use the current date/time.

 

 

101-ma-compute-INCOME

 

0 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 5 (0 votes, average: 0.00 out of 5)
You need to be a registered member to rate this.
Loading...

MA – Income Fields

Mass Appraisal Income Fields

TABLE MA_INCOME

Fields used for
Rental dir_rate grm_rate
rent_unit_type rent_net_units
Gross Rent gross_rent_percent gross_rent_rate gross_rent_value
Income Quality inc_quality_pct inc_quality_unit inc_quality_value
Vacancy vacancy_pct vacancy_unit vacancy_value
Other Income other_income
Shortfall shortfall_pct shortfall_value
Room Occupancy % rm_occupancy_pct
Expenses room_exp_pct room_exp_unit room_exp_value
food_exp_pct food_exp_unit food_exp_value
telecom_exp_pct telecom_exp_unit telecom_exp_value
dept_exp_pct dept_exp_unit dept_exp_value
other_exp_pct other_exp_unit other_exp_value
fixed_exp_pct fixed_exp_unit fixed_exp_value
operating_ex_pct operating_ex_unit operating_ex_value
replace_exp_pct replace_exp_unit replace_exp_value
misc_exp_pct misc_exp_unit misc_exp_value
taxes_exp_pct taxes_exp_unit taxes_exp_value
ffe_exp_pct ffe_exp_unit ffe_exp_value
Net Rental net_percent net_unit net_value
Overall Adjustment overall_adj_pct overall_adj_unit overall_adj_value
Gross Effective gross_effective
Gross Income income_dir income_grm
Net Income net_dir net_grm
Site Adjustment site_adj_pct site_adj_unit site_adj_value
Final Adjustment final_adj_dir final_adj_grm

 

 

101-ma-compute-incomefields

 

0 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 5 (0 votes, average: 0.00 out of 5)
You need to be a registered member to rate this.
Loading...

MA – Land Value Computation

CAMA Land Value Computation

(Under Review)

Overview

The purpose of the Land Computation is to provide values for the Govern system columns for a given record of the table MA_LAND .
The ultimate goal of this compute is to provide a land value. Conceptually the land value is made of a rate multiplied by a number of units (see the Land dimension specification document). This initial land value is then adjusted based on the defined adjustments (MA_PARM_LANDADJT), neighborhood adjustments (MA_PARM_NBHD), MA_SITE adjustments (see the Site adjustment specification document) and some user entered adjustments (MA_LAND).

The land value is either a market land value (default) or an agricultural value depending on the land use code (MA_PARM_LANDUSE) and it was always stored in MA_LAND.TOTAL_VALUE.

NOTE: At some point for PEI, there has been a requirement to produce both the market value and the agricultural value from the same LAND record for some custom process. This is why we now have a column MA_LAND.TOTAL_VALUE_AG. This is a bit confusing because the total land agricultural value is always the sum of all MA_LAND.TOTAL_VALUE for the records having a MA_LAND.LUSE_CODE of type agricultural and the MA_LAND.TOTAL_VALUE_AG is not used anywhere in the system except for a custom process that updates some mixed used values in MA_MASTER.

Govern for Windows class name : GvObjLand (MALand.cls)

Important Notes RE: the Computation

  • Auto Select Unique Code

When only one code is available and the Auto Select Unique Code option is selected, that code is used for the compute. This applies regardless of what the user has previously selected. It applies, for example, if the code is changed in GNA, after the user set the code on the form. The update is made when either the property record is opened and resaved or the Mass Appraisal Compute batch process is run.

  • Is Required

If you select the Is Required option for a code after the user has created property records, you must verify that a code is selected for those records. Otherwise, an error is raised and the compute fails

Parameters

Registry and Constant

  • SF_IN_ACRE = 43560 ‘ number of square feet in 1 acre
  • SM_IN_ACRE = 4046. 85642 ‘ number of square meter in 1 acre
  • FEET_IN_METER = 3.2808399 ‘ number of feet in 1 meter

 

  • ADJ_BY_LAND_USE = “Mass Appraisal”, “Associate Ladjt to Luse” = (‘yes’ or ‘no’)
  • ADJ_BY_LAND_SCHEDULE = “Mass Appraisal”, “Associate Ladjt to Landschd” = (‘yes’ or ‘no’)
  • ADJ_BY_LAND _EFFECTIVE = “Mass Appraisal”, “Associate Ladjt to Luse Year Effective” = smallInt (default global year_id)

 

  • ALLOW_NEGATIVE_VAL = “Mass Appraisal”, “Allow Negative Value” = (‘yes’ or ‘no’)
  • COMPUTE_ADJ_BY_SEQ = “Mass Appraisal”, “Compute By Sequence” = (‘yes’ or ‘no’)
  • COMPUTE_ADJ_BY_SEQ _EFFECTIVE = “Mass Appraisal”, “Compute By Sequence Year Effective” = smallInt
  • CUMULATIVE_LAND_RATE = “Mass Appraisal”, “Cumulative Land Rate” = (‘yes’ or ‘no’)
  • FULL_SCALE_FORMAT = “Mass Appraisal”, “Land SF to Acres Full Precision” = (‘yes’ or ‘no’)
  • PROPERTY_TYPE_FROM_PC_LEGAL = “Mass Appraisal”, “property type from pc_legal_info” = (‘yes’ or ‘no’)
  • SKIP_RATE_INTERPOLATION = “Mass Appraisal”, “Skip Rates Interpolation for Land” = (‘yes’ or ‘no’)

New in version 6.1

  • RATE_NB_DIGITS = “Mass Appraisal”, “Land Rate Nb Digits” = smallInt – default to 2
  • LAND_AG_MARKET_SAME_RECORD = “Mass Appraisal”, “Land Rate Nb Digits” = (‘yes’ or ‘no’)

Deprecated (Abandoned in version 6+)

  • “Mass Appraisal”, “Compatibility SE Compute”
  • “Mass Appraisal”, “Compatibility SE Compute Year Effective”

 

Table Used (Available for the expressions)

  • MA_LAND. LUSE_CODE -> MA_PARM_LANDUSE.LUSE_CODE
  • MA_LAND. LUSE_CODE -> MA_PARM_LADJT_LUSE.LUSE_CODE
  • MA_LAND. RATE_SCHEDULE -> MA_PARM_LANDSCHD.SCHEDULE_CODE
  • MA_LAND. RATE_SCHEDULE -> MA_PARM_LDJT_SCHD.SCHEDULE_CODE
  • MA_LAND. RATE_SCHEDULE -> MA_PARM_LANDRATE.SCHEDULE_CODE
  • MA_LAND. PLOT_USE-> MA_PARM_PLOT_USE.PLOT_USE (SAMA Only)
  • MA_LAND.P_ID -> PC_LEGAL_INFO.P_ID (Only if PROPERTY_TYPE_FROM_PC_LEGAL = “yes” and MA_PARM_LANDUSE.PROPERTY_TYPE is NULL)
  • MA_LAND.P_ID -> PC_AREA.P_ID
  • PC_AREA.NBHD -> MA_PARM_NBHD.NBHD_CODE
  • MA_LAND.P_ID -> MA_VALUE_AUDIT.REF_ID
  • MA_TABLES.TABLE_CATEGORY = “land”
  • MA_PARM_MAROUND.ROUNDING_CODE = “land”
  • MA_LAND.YEAR_ID -> MA_MODIF_STAMP.YEAR_ID

 

MA_LAND SYSTEM COLUMNS

The following system columns cannot be used in expressions stored in the MA_PARM tables nor should they be editable.

  • total_value
  • total_value_ag
  • units_price
  • units_price_ag
  • adj_total
  • site_adj_total
  • nbhd_adj_total
  • final_adj

 

Lookup groups

Many of the parameters used in the land computation depend on a lookup group. All the lookup groups are stored in the table MA_LOOKUP_GROUP and can be can be of the following types:

  • By neighborhood
  • By property type
  • By income neighborhood
  • By jurisdiction
  • By jurisdiction AND neighborhood
  • By jurisdiction AND income neighborhood

Example:
We have a land record for the year 2015 with LUSE_CODE = “2212”. We want to get the land schedule information which is defined in the table MA_PARM_LANDSCHD where the primary key is SCHEDULE_CODE, YEAR_ID and LOOKUP_GROUP. We already have the year and the schedule code (2015 and “2212”) but we now need the lookup group.Next we go to the table MA_LOOKUP_GROUP and get all the records with TABLE_NAME=”landschd” , YEAR_ID=2015 and CAMA_CODE=”2212”. In our example, this lookup group is By jurisdiction and neighborhood so it will look like this:
LOOKUP_GROUP JURISDICTION NBHD

  • 0 Null Null
  • 1 31572 Null
  • 2 31572 015
  • 3 31572 016
  • 4 31513 Null
  • 5 31513 012

Here are some possible scenarios depending on the jurisdiction and neighborhood for the land record:

  • If Jurisdiction=31572 and Nbhd=015, then Lookup_Group=2
  • If Jurisdiction=31572 and Nbhd=020, then Lookup_Group=1
  • If Jurisdiction=45875 and Nbhd=015, then Lookup_Group=0

Properties required to get the lookup group

  • Jurisdiction: Use PC_PARCEL.JURISDICTION based on MA_LAND.P_ID = PC_PARCEL.P_ID.
  • Neighborhood and Income neighborhood: Use PC_AREA.NBHD and PC_AREA.INC_NBHD based MA_LAND.P_ID = PC_AREA.P_ID and _MA_LAND.FROZEN_ID = PC_AREA.FROZEN_ID.
  • Property type: Use MA_PARM_LANDUSE.PROPERTY_TYPE based on MA_LAND.LUSE_CODE = MA_PARM_LANDUSE.LUSE_CODE and MA_LAND.YEAR_ID = MA_PARM_LANDUSE.YEAR_ID. If no information is found in MA_PARM_LANDUSE then we’ll use a blank property type (15 spaces). This is a table that depends itself on a lookup group. If the lookup group is By property type then for the purpose of the lookup we must use the PROPERTY_TYPE defined in PC_LEGAL_INFO.PROPERTY_TYPE.

 

Agricultural and Non-agricultural

The land record contains 2 fields for which an agricultural version exists: UNITS_PRICE/UNITS_PRICE_AG and TOTAL_VALUE/TOTAL_VALUE_AG.
There are 4 flags in the system that drive how these fields are calculated:

1. LAND_AG_MARKET_SAME_RECORD in SY_REGISTRY. When ‘yes’, this means that we need to calculate both the non-agricultural and the agricultural values. The field MA_PARM_LANDSCHD.FIXED_RATE_VAL_AG will be used as the base unit price for UNITS_PRICE_AG in this case.

2. MA_PARM_LANDSCHD.APPLY_RATE_ADJ_AG. This flag is only taken into account when LAND_AG_MARKET_SAME_RECORD is ‘yes’. When true (-1), this means that all the rate adjustments must be applied to UNITS_PRICE_AG.

3. MA_PARM_LANDSCHD.APPLY_LAND_ADJ_AG. This flag is only taken into account when LAND_AG_MARKET_SAME_RECORD is ‘yes’. When true (-1), this means that all the total value adjustments must be applied to TOTAL_VALUE_AG.

4. MA_PARM_LANDUSE.AGRICULTURAL. When true (-1), at the end of the compute if UNITS_PRICE_AG is null or 0 then we move the value from UNITS_PRICE to UNITS_PRICE_AG and we set UNITS_PRICE to null. We do the same for TOTAL_VALUE/TOTAL_VALUE_AG.

Computation Errors

In case of errors during the computation process (for example, parameters not configured), all the system columns must be set to 0 and no timestamp should be attached to the land record.

Compute Logic

STEP 1 – Units Calculation

Units calculation (VB6 : pv_init_compute)
The units’ type is determined by getting MA_PARM_ LANDSCHD.

a) If MA_PARM_LANDSCHD.UNITS_TYPE is not NULL then MA_LAND.UNITS_TYPE = MA_PARM_LANDSCHD.UNITS_TYPE

b) If MA_LAND.UNITS_TYPE is null then MA_LAND.UNITS_TYPE = MA_LAND_LOT_UNITS_TYPE

c) MA_LAND_UNITS is calculated based on the value of MA_LAND.UNITS_TYPE (SY table “LUNIT1”)

  • a. Case “f”, “e”, “m” then MA_LAND.UNITS = MA_LAND.FRONTAGE
  • b. Case “a”
    • Case MA_LAND.LOT_UNITS_TYPE = “sf”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE * SF_IN_ACRE
    • Case MA_LAND.LOT_UNITS_TYPE = “sm”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE / SM_IN_ACRE
    • Case MA_LAND.LOT_UNITS_TYPE “h”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE * 10000 / SM_IN_ACRE
    • Case else
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE
  • c. Case “sf”
    • Case MA_LAND.LOT_UNITS_TYPE = “a”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE * SF_IN_ACRE
    • Case MA_LAND.LOT_UNITS_TYPE = “sm”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE * FEET_IN_METER * FEET_IN_METER
    • Case MA_LAND.LOT_UNITS_TYPE “h”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE * 10000 * FEET_IN_METER * FEET_IN_METER
    • Case else
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE
  • d. Case “sm”
    • Case MA_LAND.LOT_UNITS_TYPE = “a”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE * SM_IN_ACRE
    • Case MA_LAND.LOT_UNITS_TYPE = “sf”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE / (FEET_IN_METER * FEET_IN_METER)
    • Case MA_LAND.LOT_UNITS_TYPE “h”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE * 10000
    • Case else
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE
  • e. Case “h”
    • Case MA_LAND.LOT_UNITS_TYPE = “a”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE * SM_IN_ACRE / 10000
    • Case MA_LAND.LOT_UNITS_TYPE = “sf”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE / ( FEET_IN_METER * FEET_IN_METER * 10000 )
    • Case MA_LAND.LOT_UNITS_TYPE “sm”
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE / 10000
    • Case else
      • MA_LAND.UNITS = MA_LAND.LOT_SIZE
  • f. Case “d”
    • MA_LAND.UNITS = MA_LAND.DEPTH
  • g. Case else
    • If Ma_LAND.UNITS is null or 0 then MA_LAND.UNITS = MA_LAND.LOT_SIZE

d) ROUND MA_LAND.UNITS (4 decimals if FULL_SCALE_FORMAT = ‘no’ or 15 decimals if FULL_SCALE_FORMAT = ‘yes’)

STEP 2 – Base Rate Calculation

Base rate calculation (VB6 : pv_init_base_rate)

a) Fixed Rate

The rate is established by getting MA_PARM_ LANDSCHD.

  • If MA_PARM_LANDSCHD.FIXED_RATE = -1 then
    • MA_LAND.UNITS_PRICE = FIXED_RATE_VALUE or evaluated from the expression in FIXED_RATE_EXPRESSION

b) Cumulative Land Rate

If CUMULATIVE_LAND_RATE = “Yes” and MA_PARM_ LANDSCHD.FIXED_RATE <> -1
IF number of MA_PARM_LANDRATE records <= 1 then @subject_to_nbhd_min_max = TRUE

  • MA_LAND.UNITS_PRICE = weighted sum of all unit price found in MA_PARM_LANDRATE up to MA_LAND.UNITS.

Example: MA_LAND.UNITS = 5000
MA_PARM_LANDRATE has 4 records
UP_TO_UNITS | RATE
2000 25
4000 20
6000 15
999999 5
MA_LAND.UNITS_PRICE = ( (2000 X 25) + (2000 X 20) + (1000 X 15)) / 5000 = 21

c) Non Cumulative LANDRATE

If CUMULATIVE_LAND_RATE = “No” and MA_PARM_ LANDSCHD.FIXED_RATE <> -1

  • If SKIP_RATE_INTERPOLATION = “Yes”
    • MA_LAND.UNITS_PRICE = first rate found in MA_PARM_LANDRATE that is greater than MA_LAND.UNITS.

Example: MA_LAND.UNITS = 5000
MA_PARM_LANDRATE has 4 records
UP_TO_UNITS | RATE
2000 25
4000 20
6000 15
999999 5
MA_LAND.UNITS_PRICE = 15

STEP 3 – Base Rate Calculation (Interpolation = No)

If SKIP_RATE_INTERPOLATION = “No”

  • MA_LAND.UNITS_PRICE = rate proration between UP_TO_UNITS in MA_PARM_LANDRATE based MA_LAND.UNITS.

Example: MA_LAND.UNITS = 5000
MA_PARM_LANDRATE has 4 records
UP_TO_UNITS | RATE
2000 25
4000 20
6000 15
999999 5
MA_LAND.UNITS_PRICE = ( ( (5000 – 4000)) * 20 + ( (6000 – 5000) * 15) ) / 2000 = 17.5
NOTE: If MA_LAND.UNITS <= 2000 then the rate is 25.

Format Land Unit Price

MA_LAND_UNITS_PRICE is formatted according to RATE_NB_DIGITS

STEP 4 – Agricultural Rate Calculation

This step is required only if LAND_AG_MARKET_SAME_RECORD = “yes”
MA_LAND.UNITS_PRICE_AG = MA_PARM_ LANDSCHD.FIXED_RATE_VAL_AG or evaluated from the expression in MA_PARM_ LANDSCHD.FIXED_RATE_EXPRESSION_AG
MA_LAND.UNITS_PRICE_AG is formatted according to RATE_NB_DIGITS

STEP 5 – Process Land Adjustment Features

Set the value of MA_LAND.(column)_AM for features (VB6 : pv_compute_adjustment)
We process all features (The land features are defined as all MA_TABLES records having a TABLE_TYPE = “landadjt” AND LANDADJT_CODE = “f”)

  • If MA_LAND.(column)_CD is numeric
    • then we move it to MA_LAND.(column)_AM otherwise we set MA_LAND.(column)_AM to NULL.

STEP 6 – Adjusted Rate Calculation

Adjusted rate calculation (VB6 : pv_compute_adjt_rate)
The land adjustments are defined as all MA_TABLES records having a TABLE_TYPE = “landadjt” AND LANDADJT_CODE = “r”. (rate adjustment)
Note: if MA_PARM_LANDSCHD.APPLY_RATE_ADJ_AG = -1 then the same adjustments for MA_LAND_UNITS_PRICE applies to MA_LAND_UNITS_PRICE_AG.

IF ADJ_BY_LAND_USE = “yes” AND ADJ_BY_LAND _EFFECTIVE <= MA_LAND.YEAR_ID then all rate adjustments are filtered by the MA_LAND. LUSE_CODE using the MA_PARM_LADJT_LUSE table
IF ADJ_BY_LAND_SCHEDULE = “yes” AND ADJ_BY_LAND _EFFECTIVE <= MA_LAND.YEAR_ID then all rate adjustments are filtered by the MA_LAND. RATE_SCHEDULE using the MA_PARM_LADJT_SCHD table.

a) Get Adjustment Amount (AM)

For each adjustment we evaluate MA_LAND.(MA_TABLES.COLUMN_NAME)_AM for the adjustment
MA_LAND.(MA_TABLES.COLUMN_NAME)_AM is set to NULL if MA_LAND.(MA_TABLES.COLUMN_NAME)_CD is null
MA_LAND.(MA_TABLES.COLUMN_NAME)_AM = MA_LAND.(MA_TABLES.COLUMN_NAME)_CD if MA_TABLES.TABLE_NAME is NULL or empty or only = to spaces and _CD is numeric
MA_LAND.(MA_TABLES.COLUMN_NAME)_AM = MA_PARM_LANDADJT.ADJUSTMENT or evaluated from the expression in MA_PARM_LANDADJT.ADJUSTMENT_EXPRESSION

b) Perform Average Calculation

We perform the average calculation of MA_LAND.(MA_TABLES.COLUMN_NAME)_AM by selecting all MA_TABLES.LANDADJT_AVG = -1
The average is performed and stored on the column pointed by LANDADJT_LINK_COLUMNNAME
based on the number of entries.. All the other columns are set to NULL.

Example: MA_TABLES has 5 land adjustment rates and MA_LAND has the following values
MA_LAND.ADJ10_AM = 7
MA_LAND.ADJ20_AM = 5
MA_LAND.ADJ30_AM = 8.5
MA_LAND.ADJ40_AM = 3
MA_LAND.ADJ50_AM = 9.5

COMPUTATION_SEQ | COLUMN_NAME | LANDADJT_AVG | LANDADJT_LINK_COLUMNNAME
10 ADJ10 NULL NULL
20 ADJ20 -1 10
30 ADJ30 NULL NULL
40 ADJ40 -1 10
50 ADJ50 -1 30
Average is calculated as (7+5+3)/3 = 5 so the result will be stored in MA_LAND.ADJ10_AM
Average is calculated as (8.5+9.5)/2 = 9 so the result will be stored in MA_LAND.ADJ30_AM
After this step the values are
MA_LAND.ADJ10_AM = 5, MA_LAND.ADJ20_AM = NULL, MA_LAND.ADJ30_AM = 9, MA_LAND.ADJ40_AM = NULL, MA_LAND.ADJ50_AM = NULL

c) Perform Link Calculation

We perform the link calculation of MA_LAND.(MA_TABLES.COLUMN_NAME)_AM by selecting all MA_TABLES.LANDADJT_LINK = -1
The link operation is based on the MA_TABLES.MATHS operator (+,-,X,/) AND MA_TABLES.PCT_AMT and is performed and stored on the column pointed by
LANDADJT_LINK_COLUMNNAME
based on the number of entries.. All the other columns are set to NULL.

Example: MA_TABLES has 5 land adjustment rates and MA_LAND has the following values
MA_LAND.ADJ10_AM = 8
MA_LAND.ADJ20_AM = 2
MA_LAND.ADJ30_AM = 6
MA_LAND.ADJ40_AM = 0.6
MA_LAND.ADJ50_AM = 3

COMPUTATION_SEQ | COLUMN_NAME | LANDADJT_LINK |
LANDADJT_LINK_COLUMNNAME
| MATHS | PCT_AMT
10 ADJ10 NULL NULL X p
20 ADJ20 -1 10 + a
30 ADJ30 NULL NULL + a
40 ADJ40 -1 10 X a
50 ADJ50 -1 30 – a
First Link is calculated as (8+2) X 0.6 = 6 so the result will be stored in MA_LAND.ADJ10_AM

Second link is calculated as 6-3 = 3 so the result will be stored in MA_LAND.ADJ30_AM
MA_LAND.ADJ10_AM = 6
MA_LAND.ADJ20_AM = NULL
MA_LAND.ADJ30_AM = 3
MA_LAND.ADJ40_AM = NULL
MA_LAND.ADJ50_AM = NULL

d) Perform Group Calculation

We perform the groups calculation of MA_LAND.(MA_TABLES.COLUMN_NAME)_AM by selecting all MA_TABLES.LANDADJT_GROUP NOT NULL
The goal of the group rate calculation is to come up with one rate adjustment for all groups.
The resulting rate adjustment is stored on the first entry having a group. Conceptually, the system process each entry in a group to come up with a group total. The final value is the average of all group totals

Example MA_TABLES has 6 land adjustment rates that have groups and MA_LAND has the following values
MA_LAND.ADJ10_AM = 1
MA_LAND.ADJ20_AM = 2
MA_LAND.ADJ30_AM = 3
MA_LAND.ADJ40_AM = 4
MA_LAND.ADJ50_AM = 5
MA_LAND.ADJ50_AM = 6

COMPUTATION_SEQ | COLUMN_NAME | LANDADJT_GROUP | MATHS | PCT_AMT
10 ADJ10 100 + a
20 ADJ20 100 + a
30 ADJ30 100 X a
40 ADJ40 200 + a
50 ADJ50 200 X a
60 ADJ60 200 + a

First group is calculated as (1+2) X 3= 6
Second group (4X5) + 6 = 26
Group average is performed (26+6) /2 = 16 so the result will be stored in MA_LAND.ADJ10_AM.
NOTE: The MATHS operator is ignored for the first amount of each group.

MA_LAND.ADJ10_AM = 16
MA_LAND.ADJ20_AM = NULL
MA_LAND.ADJ30_AM = NULL
MA_LAND.ADJ40_AM = NULL
MA_LAND.ADJ50_AM = NULL
MA_LAND.ADJ60_AM = NULL.

e) Perform Rate Adjustment

We perform the rate adjustment by selecting ( all non nulls MA_LAND.(column)_AM for MA_TABLES.LANDADJT_CODE = “r”
where MA_LAND.(column)_OV = 0 ) OR selecting ( all non nulls MA_LAND.(column)_OV_VALUE for MA_TABLES.LANDADJT_CODE = “r”.where MA_LAND.(column)_OV = -1 )

There are 4 MATHS sign +,-,X,/ and 2 PCT_AMT values a (amount), p (percentage).
We take the starting rate previously calculated MA_LAND.UNITS_PRICE (and possibly MA_LAND_UNITS_PRICE_AG) and we apply every rate adjustment to it. Adjustments are cumulative.
Case MATHS = ‘+’

  • If PCT_AMT = ‘a’ then we add MA_LAND.(column_name)_AM to the rate (UNITS_PRICE)
  • If PCT_AMT = ‘p’ then we first apply the percentage represented by MA_LAND.(column_name)_AM to the rate (UNITS_PRICE) and then we add the result to the rate. Example rate = 10 MA_LAND.ADJ10_AM = 5 then (10 X 5%) + 10 = 10.50

Case MATHS = ‘-’

  • If PCT_AMT = ‘a’ then we subtract MA_LAND.(column_name)_AM to the rate (UNITS_PRICE)
  • If PCT_AMT = ‘p’ then we first apply the percentage represented by MA_LAND.(column_name)_AM to the rate (UNITS_PRICE) and then we subtract the result to the rate. Example rate = 10 MA_LAND.ADJ10_AM = 5 then (10 X 5%) + 10 = 9.50

Case MATHS = ‘X’

  • If PCT_AMT = ‘a’ then we multiply MA_LAND.(column_name)_AM to the rate (UNITS_PRICE).
  • If PCT_AMT = ‘p’ then we multiply by the percentage represented by MA_LAND.(column_name)_AM to the rate (UNITS_PRICE) . Example rate = 10 MA_LAND.ADJ10_AM = 90 then (10 X 90%) = 9

Case MATHS = ‘/’

  • If PCT_AMT = ‘a’ then we divide the rate (UNITS_PRICE) by MA_LAND.(column_name)_AM
  • If PCT_AMT = ‘p’ then we divide the rate (UNITS_PRICE) by the percentage represented by MA_LAND.(column_name)_AM to. Example rate = 10 MA_LAND.ADJ10_AM = 90 then (10 / 90%) = 11.11111

If MATHS or PCT_AMT are null then no operation is performed.

STEP 7 – Initial Value calculation

Initial total value evaluated (VB6 : pv_init_compute)

MA_LAND.TOTAL_VALUE = MA_LAND.UNITS X MA_LAND.UNITS_PRICE

  • IF MA_LAND.TOTAL_VALUE < 0 and ALLOW_NEGATIVE_VAL = ‘no’
    • then MA_LAND.TOTAL_VALUE = 0
  • if LAND_AG_MARKET_SAME_RECORD = “yes”
    • then MA_LAND.TOTAL_VALUE_AG = MA_LAND.UNITS X MA_LAND.UNITS_PRICE_AG
  • IF MA_LAND.TOTAL_VALUE_AG < 0 and ALLOW_NEGATIVE_VAL = ‘no’
    • then MA_LAND.TOTAL_VALUE_AG = 0

STEP 8 – Compute Land Adjustments

Compute Land Adjustments MA_LAND.ADJ_TOTAL (VB6 : pv_compute_adjustment, pv_set_added_fields)
Similar to the logic of Step 5, we compute all adjustments based on MA_TABLES.LANDADJT_CODE = ‘a’.
The land adjustments are defined as all MA_TABLES records having a TABLE_TYPE = “landadjt” AND LANDADJT_CODE = “a”.

  • IF ADJ_BY_LAND_USE = “yes” AND ADJ_BY_LAND _EFFECTIVE <= MA_LAND.YEAR_ID
    • then all adjustments are filtered by the MA_LAND. LUSE_CODE using the MA_PARM_LADJT_LUSE table
  • IF ADJ_BY_LAND_SCHEDULE = “yes” AND ADJ_BY_LAND _EFFECTIVE <= MA_LAND.YEAR_ID
    • then all adjustments are filtered by the MA_LAND. RATE_SCHEDULE using the MA_PARM_LDJT_SCHD table.

a) For each adjustment we evaluate MA_LAND.(MA_TABLES.COLUMN_NAME)_AM for the adjustment
MA_LAND.(MA_TABLES.COLUMN_NAME)_AM is set to NULL if MA_LAND.(MA_TABLES.COLUMN_NAME)_CD is null
MA_LAND.(MA_TABLES.COLUMN_NAME)_AM = MA_LAND.(MA_TABLES.COLUMN_NAME)_CD if MA_TABLES.TABLE_NAME is NULL or empty or only = to spaces and _CD is numeric.

The MA_PARM_LANDADJT records are filtered by the various lookup_seq columns and by the up_to_units. The up_to_units value is based on the value of MA_TABLES.APPLY_TO.
Case ‘d’ MA_LAND.DEPTH
Case ‘f’ MA_LAND.FRONTAGE
Case ‘u’ MA_LAND.UNITS

  • MA_LAND.(MA_TABLES.COLUMN_NAME)_AM = MA_PARM_LANDADJT.ADJUSTMENT or evaluated from the expression in MA_PARM_LANDADJT.ADJUSTMENT_EXPRESSION

b) We perform the average calculation exactly like Step 5b.

c) We perform the link calculation exactly like Step 5c.

d) We perform the land adjustment similar to step 5e by selecting all non nulls MA_LAND.(column)_AM (when MA_LAND.(column)_OV = 0) OR MA_LAND.(column)_OV_VALUE (when MA_LAND.(column)_OV = -1) for MA_TABLES.LANDADJT_CODE = “a”, except that instead of using the UNITS_PRICE we use MA_LAND.TOTAL_VALUE or MA_LAND.TOTAL_VALUE_AG and we store the result in MA_LAND.ADJ_TOTAL or MA_LAND.ADJ_TOTAL_AG

e) We add the result of step d into the total value for both market and agricultural.

MA_LAND.TOTAL_VALUE = MA_LAND.TOTAL_VALUE + MA_LAND.ADJ_TOTAL

MA_LAND.TOTAL_VALUE_AG = MA_LAND.TOTAL_VALUE_AG + MA_LAND.ADJ_TOTAL_AG

STEP 9 – Compute Site Adjustments

Compute Site Adjustment MA_LAND.SITE_ADJ_TOTAL (VB6 : pv_get_siteadjt).
Business rules

  • Site adjustment is based on the value of MA_LAND.SITE_NO and should be skipped if NULL. (cannot be null in 6.1)
  • Site adjustments are only calculated for the market value (not for the AG) portion.
  • The total site adjustment cannot produce a negative value if ALLOW_NEGATIVE_VAL = ‘no’

Adjustment Total

  • The adjustment (MA_LAND.SITE_ADJ_TOTAL ) is calculated as ( MA_LAND.TOTAL_VALUE * MA_SITE.ADJ_LAND_PERCENT / 100) + MA_SITE.ADJ_LAND_AMOUNT
  • The site adjustment is added to the MA_LAND.TOTAL_VALUE.

 

STEP 10 – Compute Neighborhood Adjustment

Compute Neighborhood Adjustment MA_LAND.NBHD_ADJ_TOTAL and Apply Minimum and Maximum land value for a neighborhood
[under review] All – Neighborhood Parm Table
The Neighborhood adjustment (MA_PARM_NBHD) is based on the property type and on jurisdiction (new).
Registry Parameters
– The total site adjustment cannot produce a negative value if ALLOW_NEGATIVE_VAL = ‘no’ – to be validated
– If CUMULATIVE_LAND_RATE = “yes”
Property Type Determination
The property type is the same that is defined in the Lookup group section at the beginning of this document. (to be validated)
The property type is defined in MA_PARM_LANDUSE.PROPERTY_TYPE or If NULL and PROPERTY_TYPE_FROM_PC_LEGAL = “yes” then we define the property type as PC_LEGAL_INFO.PROPERTY_TYPE.
If the property type is blank (15 spaces) and PROPERTY_TYPE_FROM_PC_LEGAL = “yes” then for the purposes of this step we use the property type defined in PC_LEGAL_INFO.PROPERTY_TYPE.
Neighborhood Table Lookup
IF no record found for a given property type then we search the MA_PARM_NBHD table with a blank property type (15 spaces).
– The neighborhood adjustment is only calculated for the market value (not for the AG) portion.
– The total site adjustment cannot produce a negative value if ALLOW_NEGATIVE_VAL = ‘no’ – to be validated
– The land factor is either MA_PARM_NBHD.LAND_FACTOR or an evaluated expression
Neighborhood Adjustment (compute)
The neighborhood adjustment is MA_LAND.NBHD_ADJ_TOTAL is calculated as MA_LAND.TOTAL_VALUE * land factor / 100
The nbhd adjustment is added to the MA_LAND.TOTAL_VALUE.
Apply Neighborhood Minimum and Maximums
If CUMULATIVE_LAND_RATE = “yes” and MA_LAND.ADJ_TOTAL is NULL and @subject_to_nbhd_min_max = TRUE
then
– If MA_LAND.TOTAL_VALUE < MA_PARM_NBHD.LAND_MINIMUM then MA_LAND.TOTAL_VALUE = MA_PARM_NBHD.LAND_MINIMUM
– If MA_LAND.TOTAL_VALUE > MA_PARM_NBHD.LAND_MAXIMUM then MA_LAND.TOTAL_VALUE = MA_PARM_NBHD.LAND_MAXIMUM

STEP 11 – Compute Final Adjustment

Compute final adjustment (VB6 : pv_override).
The final adjustment is calculated only if MA_LAND.FINAL_ADJ_PERCENT is not NULL.

  • MA_LAND.FINAL_ADJ = MA_LAND.TOTAL_VALUE * MA_LAND.FINAL_ADJ_PERCENT / 100
  • MA_LAND.TOTAL_VALUE = MA_LAND.TOTAL_VALUE + MA_LAND.FINAL_ADJ

 

STEP 12 – Rounding

Compute the final rounded value (VB6 : pv_override, pv_round_value).
MA_LAND.TOTAL_VALUE is rounded based on the MA_PARM_MAROUND information (code = ‘land’).
For example, if the rounding value is 1000, and the total value is 45678 then the value is 46000. If the rounding value was 100 then it would have been 45700.
Compute Logic – STEP 13

STEP 13 – Agricultural Processing

If MA_LAND.UNITS_PRICE_AG is null or 0 AND MA_PARM_LANDUSE.AGRICULTURAL = -1, then we move the value from MA_LAND.UNITS_PRICE to MA_LAND.UNITS_PRICE_AG and we set MA_LAND.UNITS_PRICE to null.

The same is done for the fields MA_LAND.TOTAL_VALUE and MA_LAND.TOTAL_VALUE_AG.

STEP 14 – Set the Modification Stamp

Step 14 – Set the modif stamp for the computed record (VB6 : compute_land).
We set MA_LAND.MODIF_STAMP = MA_MODIF_STAMP.LAND_STAMP if not null, otherwise we use the current date/time.

 

 

101-ma-compute-Land

 

0 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 5 (0 votes, average: 0.00 out of 5)
You need to be a registered member to rate this.
Loading...

MA – Site Value Computation

Site Value Computation

General

Purpose

The purpose of the Site compute is to determine the site adjustment value to be used by all components (land, misc, bldg.) associated with a site no.
This compute should always be the FIRST one called after a save and should always be executed immediately from the client PC even if the daemon option is turned on.
Developers, see R&D Documentation SITE COMPUTATION report.
Registry and Parameters

Tables

  • MA_TABLES -> table_type = ‘site’
  • MA_TABLES.TABLE_NAME -> MA_PARM_SITE.TABLE_NAME
  • MA_PARM_SITE
  • MA_SITE
    • MA_SITE. XXXX_CD -> MA_PARM_SITE.SITE_CODE
    • MA_TABLES.TABLE_NAME -> MA_PARM_SITE.TABLE_NAME

Site Description Field

  • MA_SITE.SITE_DESC

 

System Columns/Calculated Fields

The following system columns cannot be used in expressions stored in the MA_PARM tables nor should they be editable.

Values Override Values (new) Linked Values Adjustment Amount Adjustment Percent
[LAND_VALUE] [LAND_VALUE_OVERRIDE] [LK_LAND_VALUE] [ADJ_LAND_AMOUNT] [ADJ_LAND_PERCENT]
[LAND_AG_VALUE] [LAND_AG_VALUE_OVERRIDE] [LK_LAND_AG_VALUE] [ADJ_BLDG_AMOUNT] [ADJ_BLDG_PERCENT]
[MISC_VALUE] [MISC_VALUE_OVERRIDE] [LK_MISC_VALUE] [ADJ_MISC_AMOUNT] [ADJ_MISC_PERCENT]
[BLDG_VALUE] [BLDG_VALUE_OVERRIDE] [LK_BLDG_VALUE] [ADJ_INC_AMOUNT] [ADJ_INC_PERCENT]
[INCOME_GRM_VALUE] [INCOME_GRM_VALUE_OVERRIDE] [LK_INCOME_GRM_VALUE]
[INCOME_DIR_VALUE] [INCOME_DIR_VALUE_OVERRIDE] [LK_INCOME_DIR_VALUE] +ALL the XXX_VA columns created
[MRA_VALUE] new 10.8 [MRA_VALUE_OVERRIDE] [LK_MRA_VALUE] (user defined adj.)
[PP_VALUE] new 6.1 [PP_VALUE_OVERRIDE] [LK_PP_VALUE]
[CAMA_VALUE] ?
[TOTAL_VALUE] none (to verify)

 

Computation

STEP 1 Compute Individual Adjustment

Compute the individual adjustment values (XXX_VA columns) for each adjustment type
(VB6: pv_compute_adjustment, pv_set_added_fields, pv_set_adj, pv_set_record_value)

a- Set Default Values and Parameters

Find all MA_TABLES site adjustment and then find MA_PARM_SITE based on the XXX_CD column and MA_TABLES table_name information.
MA_SITE.XXX_VA = MA_PARM_SITE.ADJUSTMENT or evaluated from the expression in MA_PARM_SITE.ADJT_EXPRESSION
The MA_SITE.XXX_VA is then used based on MA_TABLES.SITE_LB_CODE value, MA_TABLES.MATHS and MA_TABLES.PCT_AMT.

Set Default Values
The default value is set for

  • MA_TABLES.SITE_LB_CODE is ‘a’
  • MA_TABLES.MATHS is ‘+’ for PCT_AMT = ‘a’ and ‘X’ for PCT_AMT = ‘p’
  • ADJ_LAND_AMOUNT, ADJ_BLDG_AMOUNT, ADJ_MISC_AMOUNT and ADJ_INC_AMOUNT = 0
  • ADJ_LAND_PERCENT, ADJ_BLDG_PERCENT, ADJ_MISC_PERCENT and ADJ_INC_PERCENT = 100

Check if Value or Override Value
Determines if the VA (value) or the OV_VALUE will be calculated
For each MA_SITE.XXX columns we do

  • If MA_SITE.XXX_OV = -1
    • Then AMOUNT = MA_SITE.XXX_OV_VALUE
    • Else AMOUNT = MA_SITE.XXX_VA

b- Compute Land Adjustment
If MA_TABLES.SITE_LB_CODE = ‘a’ or MA_TABLES.SITE_LB_CODE = ‘l’ then

  • ADJ_LAND_AMOUNT = ADJ_LAND_AMOUNT + VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘+’
  • ADJ_LAND_AMOUNT = ADJ_LAND_AMOUNT – VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘-’
  • ADJ_LAND_AMOUNT = ADJ_LAND_AMOUNT X VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘X’
  • ADJ_LAND_AMOUNT = ADJ_LAND_AMOUNT / VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘/’
  • ADJ_LAND_PERCENT = ADJ_LAND_PERCENT + VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘+’
  • ADJ_LAND_PERCENT = ADJ_LAND_PERCENT – VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘-’
  • ADJ_LAND_PERCENT = ADJ_LAND_PERCENT X VALUE / 100 if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘X’
  • ADJ_LAND_PERCENT = ADJ_LAND_PERCENT X 100 / VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘/’

 

c- Compute Building Adjustment

If MA_TABLES.SITE_LB_CODE = ‘a’ or MA_TABLES.SITE_LB_CODE = ‘b’ then

  • ADJ_BLDG_AMOUNT = ADJ_BLDG_AMOUNT + VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘+’
  • ADJ_BLDG_AMOUNT = ADJ_BLDG_AMOUNT – VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘-’
  • ADJ_BLDG_AMOUNT = ADJ_BLDG_AMOUNT X VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘X’
  • ADJ_BLDG_AMOUNT = ADJ_BLDG_AMOUNT / VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘/’
  • ADJ_BLDG_PERCENT = ADJ_BLDG_PERCENT + VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘+’
  • ADJ_BLDG_PERCENT = ADJ_BLDG_PERCENT – VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘-’
  • ADJ_BLDG_PERCENT = ADJ_BLDG_PERCENT X VALUE / 100 if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘X’
  • ADJ_BLDG_PERCENT = ADJ_BLDG_PERCENT X 100 / VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘/’

 

d- Compute Misc. Structures Adjustment

If MA_TABLES.SITE_LB_CODE = ‘a’ or MA_TABLES.SITE_LB_CODE = ‘m’ then

  • ADJ_MISC_AMOUNT = ADJ_MISC_AMOUNT + VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘+’
  • ADJ_MISC_AMOUNT = ADJ_MISC_AMOUNT – VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘-’
  • ADJ_MISC_AMOUNT = ADJ_MISC_AMOUNT X VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘X’
  • ADJ_MISC_AMOUNT = ADJ_MISC_AMOUNT / VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘/’
  • ADJ_MISC_PERCENT = ADJ_MISC_PERCENT + VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘+’
  • ADJ_MISC_PERCENT = ADJ_MISC_PERCENT – VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘-’
  • ADJ_MISC_PERCENT = ADJ_MISC_PERCENT X VALUE / 100 if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘X’
  • ADJ_MISC_PERCENT = ADJ_MISC_PERCENT X 100 / VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘/’

 

e- Compute Income Adjustment

If MA_TABLES.SITE_LB_CODE = ‘a’ or MA_TABLES.SITE_LB_CODE = ‘i’ then

  • ADJ_INC_AMOUNT = ADJ_INC_AMOUNT + VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘+’
  • ADJ_INC_AMOUNT = ADJ_INC_AMOUNT – VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘-’
  • ADJ_INC_AMOUNT = ADJ_INC_AMOUNT X VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘X’
  • ADJ_INC_AMOUNT = ADJ_INC_AMOUNT / VALUE if PCT_AMT = ‘a’ and MA_TABLES.MATHS is ‘/’
  • ADJ_INC_PERCENT = ADJ_INC_PERCENT + VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘+’
  • ADJ_INC_PERCENT = ADJ_INC_PERCENT – VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘-’
  • ADJ_INC_PERCENT = ADJ_INC_PERCENT X VALUE / 100 if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘X’
  • ADJ_INC_PERCENT = ADJ_INC_PERCENT X 100 / VALUE if PCT_AMT = ‘p’ and MA_TABLES.MATHS is ‘/’

 

STEP 2 Set to null (backward compatibility)

We set the following MA_SITE fields to NULL (for backward compatibility)

  • ADJ_LAND_AMOUNT if = 0 and ADJ_LAND_PERCENT If = 100
  • ADJ_BLDG_AMOUNT if = 0 and ADJ_BLDG_PERCENT if = 100
  • ADJ_MISC_AMOUNT if = 0 and ADJ_MISC_PERCENT if = 100
  • ADJ_INC_AMOUNT if = 0 and ADJ_INC_PERCENT if = 100

 

STEP 3 Compute Site Values

After all elements have been computed (Land, Buildings, …) we will need to take the values and bring them back to the sites values (Final Steps)

 

STEP 4 Set Modif Stamp

Modification Stamp

After any Change in MA_TABLE for table Type ‘Sites” or MA_PARM_SITE

  • We will need to update MA_MODIF_STAMP.ALL_STAMP to Date.Now
  • We will need to update MA_MODIF_STAMP.SITE_STAMP to Date.Now

COMPUTATION PREREQUISITES

To be verified

Changes in Tables

When changes occur in MA_TABLE for table type ‘Sites’ or to MA_PARM_SITE, the following must be done.

Site Entity
After any changes to MA_TABLE for table Type ‘Sites”

  • We will need to make sure all site adjustment columns are created as an attribute in the “Site Entity”, attribute type of System Expression.

Expressions

After any changes to MA_TABLE for table Type ‘Sites” we will need to SET the system expressions for the following fields based on the rules defined in step 1

  • ADJ_LAND_AMOUNT and ADJ_LAND_PERCENT
  • ADJ_BLDG_AMOUNT and ADJ_BLDG_PERCENT
  • ADJ_MISC_AMOUNT and ADJ_MISC_PERCENT
  • ADJ_INC_AMOUNT and ADJ_INC_PERCENT

o First if no site adjustment are defined for a field for a year it should return NULL (validate)

  • Ex: Case(2015, ((attr@SiteADJ001 + attr@SiteADJ002) * attr@SiteADJ003) – attr@SiteADJ004 , 2016, attr@SiteADJ001 + attr@SiteADJ002 + attr@SiteADJ003, NULL)

Site Entity Expressions (no longer needed)

  • After any Change in MA_PARM_SITE we need to rebuild the system expression in the “Site Entity” attribute for the current site (validate)
  • Ex for SiteADJ001_VA:
    • Case(SiteADJ001_CD
    • ‘001’, 1000,
    • ‘002’, 2000,
    • ‘003’, 3000,
    • NULL)
  • Ex for SiteADJ001_VA (with NBDH):
    • Case(attr@SiteADJ001_CD
    • ‘001’, Case(attr@NBDH,‘res’, 1000, ‘com’, 1500, 750),
    • ‘002’, Case(attr@NBDH, ‘res’, 2000, ‘com’, 2500, 1750),
    • ‘003’, Case(attr@NBDH, ‘res’, 3000, ‘com’, 3500, 250),
    • NULL)

 

 

101-ma-compute-Site

 

0 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 5 (0 votes, average: 0.00 out of 5)
You need to be a registered member to rate this.
Loading...

 

101-ma-compute

Mass Appraisal Computation

Release 6.1

Overview

The following documentation is for version 6.1 only. For more detail information, see the Mass Appraisal Product Map by section (Land, Building, etc.) that includes the form, parameters and the compute.
For direct access to the parameters, see the Govern Administrator (GNA) system Product Map under Application Parameters, Mass Appraisal.

Appraisal Value Computation

GENERAL SPECIFICATION
101-ma-Specification Valuation Methods Specifications
MA Tables Rules Validation Tables
MA Values Rules
MA Modif Stamp
MA Compute Entity Configuration
MA Tables Business Rules
MA Valuation Business Rules
MA Modification Stamps
MA Compute Entity Setup
For Business Analysts and System Administrators
TECHNICAL INFORMATION
Parameter Tables Summary Info
Tables & Codes Specification
Grouping Specification
MA Parameters Tables – Summary Info
MA Tables & Codes – Specification
MA Groups
For Developers and Technical Users
All Module Diagrams
Mass Appraisal (pdf)
Database Model page (Visio Diagrams)
Mass Appraisal Visio diagram
COMPUTATION DETAILS
101-ma-compute-Property Global Property Value
101-ma-compute-Site Site Adjustments
101-ma-compute-LandUnits Land Units (Dimension)
101-ma-compute-Land Land Value
101-ma-compute-Bldg Building Value
101-ma-compute-Income Income Value
101-ma-compute-MRA MRA Value
101-ma-compute-PP Personal Property Appraisal Value
SEE ALSO
101-std-bp-001 Evaluate Expressions
101-ma-bp-002 Batch Compute
101-ma-bp-005 Batch Compute of Sales Data
101-ma-fea-001 Action Button – Force Full Property Compute

 

Adjustment Computation Order

Here’s the order in which the different types of adjustments are applied for the Land and the BSE compute independent of the sequence:

Land compute
1) f – Feature
2) r – Rate adjustments
3) a – Adjustment

Building Structural Elements (BSE) compute
1) m – Area adjustment
2) s – Area size override
3) r – Rate adjustment
4) a – CAMA adjustments
5) q – Quality points
6) t – Overall adjustments
7) o – Depreciation override
8) d – Depreciation ítem AND e – Depreciation table override
9) g – Global adjustments

Controller Properties

A miscellaneous property parameter is available in most of the Mass Appraisal Components Forms.

Different properties are available:
ComputeExecuteCondition
This property can be set to TRUE or FALSE.
Behavior when set to:

  • FALSE
    • Standard Setup- Recomputes the current and child records as well as the MA_SITE and MA_MASTER (to update the new component value and linked values such as Income)
  • TRUE
    • Special Cases – Recomputes ALL component records (buildings, land, etc.) and the MA_SITE(s) and MA_MASTER for the property. For instance, special land records may impact the value of all lands. If this is the case, the parameter can be set to true using an expression to set it when these land types are present.

 

 

101-ma-compute

 

0 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 5 (0 votes, average: 0.00 out of 5)
You need to be a registered member to rate this.
Loading...

MA – Module Configuration

CAMA Mass Appraisal Module Configuration

[Page in development]

Getting Started

Before Getting Started

– Review legislation, land management and property control business rules – INPUT
– Determine classification of property assessment, exemption, liabilities and tax revenue allocation – OUTPUT
– For each class, establish appraisal valuation method (cost, market, income…), timeline and business rules – PROCESS
– For each class and valuation method, establish component (land, bldg, misc…) data requirements and dependencies (included in building, included in total income, excluded from role…)
– Revisit requirements (the real requirements), property valuation techniques and fair value determination

Environment Configuration

– Define Deployment Environments (stage, test, uat, production)
– Setup Organization (departments, profiles, users, roles, security)
– Install System Options, 3rd Party (Apex, SSRS..), Services (Scheduler, Batch…)

THE BASICS – General Appraisal & Modeling

Overall Components

  • Appraisal Methods: SYSTEM Validation Table MAMETHOD
  • Jurisdictions, Legal Property Type, Area Property Use
  • Neighborhood: MA Tables Single Entry Table NBHD
  • Rounding: MA Tables Single Entry Table MAROUND
  • Adjustments

Table Structure

Most Mass Appraisal tables can be define by a Group Type (MALKGROUP) such as Neighborhoods, Jurisdictions, Jurisdiction AND Neighborhood, etc.

  • The following tables are used to build group types:
    • Jurisdiction: User Table JURISD (USER Validation Table – Mass Appraisal)
    • Property Type: User Table PROPTYPE (Regular Table )
    • Neighborhood: User Table NBHD (MA Tables Single Entry Table)
    • Income Neighborhood: INCNBHD

Some combinations include Up-to-Units:

  • Look up types by AREA TOTALS: MALOOKUP
  • Look up types by AREA TYPES and total: SYSTEM table MALOOK1

Some combinations include Matrix, Linked or Averaged ltems:

  • Matrix are used to create a multi-dimension rate or adjustment table. EX: Table Look-up by Property Type, Ext Wall Material 1, Ext.Wall Material 2 = Quality Point Look-up
  • Tables can be Linked, Averaged or Grouped
    • Example: Wall 1 = 10.00 , Wall 2 = 11.00
      • Wall Quality Point or Rate Adjustment = 10.50
    • Example: Wall 1 = 10.00, Wall 2 = 11.00, Wall 3= (minus) -2.00
      • Wall Quality Point or Rate Adjustment = 19.00

Land

General Parameters
Land Unit Type

  • Lot Size Unit Type (SYSTEM Validation Table LUNIT) used in Property Control and Mass Appraisal
  • MA Land Unit Type 1 (SYSTEM Validation Table LUNIT1) used in Mass Appraisal
  • Linear Unit Type 2 (SYSTEM Validation Table LUNIT2) used in Mass Appraisal and Property Control

Land Use Code
Land Rate Schedule
Land Adjustments

Building

Property Control Links

  • Owner Types
  • Occupant Types
  • Other Building Linking Type

Building Classification

  • Building Use (Single MA Table BLDGUSE)
  • Building Model (USER Table MODEL)
  • Building Sub-Model OCCUPANCY (USER Table SUBMODEL)

Building Area

  • Area Types (USER validation AREATYPE) ex:porch, living, garage…
  • Area Codes (Single MA Table DRAWING) ex: basement , basement finished ,enclosed porch, garage heated, carport, overhang…)
  • Area Floors (USER validation table DRAWF)

Depreciation

Miscellaneous Structures

-General Parameters
-Miscellaneous Use
-Units

Income

-General Parameters
-Rental Detail
-Expenses

Comparable Sales

-General Parameters
-Comparable Elements

Fair Market (MRA)

The following General Parameters impact MRA:

MRA Models – The Models need to be created before the Elements as they assigned when creating Elements.

MRA Elements – For each MRA Element, you need to specify to which MRA Models

Application Parameters

General Parameters

Tables

BSE Templages

Other

Comparable Sales

 

 

101-ma-config

 

0 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 50 votes, average: 0.00 out of 5 (0 votes, average: 0.00 out of 5)
You need to be a registered member to rate this.
Loading...