General Purpose
The purpose of the Building Computation is to provide values of all the Govern’s system columns for a given record of the table MA_BUILDINGS_XX. The ultimate goal of this compute is to provide a building value (the cost for a building structural elements) based on building’s physical characteristics (called structural elements). [VB6 class name: GvObjCostComp OF:MACostComp.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
General Parameters (SY REGISTRY by YEAR)
- QP_ROUNDING = “Mass Appraisal”, “Quality Point Rounding” = (‘yes’ or ‘no’)
- QP_DECIMAL = “Mass Appraisal”, “Quality Point Decimal”
- USE_BASE_AREA_FOR_LOOKUP = “Mass Appraisal”, “Bldg Lookup By Base Area” = (‘yes’ or ‘no’)
- ROUND_UP_AREA = “Mass Appraisal”, “Round Up Area” = (‘yes’ or ‘no’)
- EFFECTIVE_LIVING = “Mass Appraisal”, “Effective = Living” = (‘yes’ or ‘no’)
- “Mass Appraisal”, “Size Adjt Method”
- CAMA_ADJ_DECIMAL = “Mass Appraisal”, “Cama Adjustment Decimal”
- “Mass Appraisal”, “Size Adjt. Decimal”
- SE_BY_MODELS = “Mass Appraisal”, “Associate SE to models” = (‘yes’ or ‘no’)
- SE_BY_MODELS_YEAR = “Mass Appraisal”, “Associate SE to models Year Effective”
- SQUARE_ROOT = “Mass Appraisal”, “Area In Square Root” = (‘yes’ or ‘no’)
- “Mass Appraisal”, “Property Type From pc_legal_info” = (‘yes’ or ‘no’)
- USE_METRIC = “General”, “use metric” = (‘yes’ or ‘no’)
- SIZE_ADJ_METHOD = “Mass Appraisal”, “Size Adjt Method” = (‘1’ or ‘2’)
- SIZE_ADJ_DECIMAL = “Mass Appraisal”, “Size Adjt. Decimal” default 3
- PROPERTY_TYPE_FROM_PC_LEGAL = “Mass Appraisal”, “property type from pc_legal_info” = (‘yes’ or ‘no’)
Parameters discontinued in Govern OpenFroms 6.1.
- “Mass Appraisal”, “Compatibility SE Compute”
- “Mass Appraisal”, “Compatibility SE Compute Year Effective”
- “Mass Appraisal”, “Optimize Computation Speed”
- “Mass Appraisal”, “Round by Drawing Code”
- “Mass Appraisal”, “Skip Rates Interpolation”
Changed Parameters
- DEPR_BASE_YEAR=Year value (ex:2015), “Depreciation Year” should now be using the registry by year under “Mass Appraisal”
Tables and Fields
Tables
- MA_BUILDINGS (includes old MA_BLDG_INFO)
- MA_BLDG_AREA_YEAR (replaces old MA_BLDG_AREA)
- PC_AREA.NBHD NOTE: At a minimum the PROPERTY_TYPE column has to be available to the building context, but ideally all columns of PC_LEGAL_INFO (to validate)
- PC_LEGAL_INFO.PROPERTY_TYPE (same NOTE)
- MA_BUILDINGS. BLDG_ID + BLDG_SEQ -> PC_LK_PARCEL_BLDG.P_ID
- PC_LK_PARCEL_BLDG.P_ID -> PC_AREA.P_ID
- PC_AREA.NBHD -> MA_PARM_NBHD.NBHD_CODE
- MA_BUILDINGS.BLDG_USE_CODE -> MA_PARM_BLDGUSE.BUSE_CODE
- MA_BUILDINGS.SUBMODEL_CODE -> MA_PARM_SUBMODEL.SUBMODEL_CODE
- MA_BUILDINGS.BLDG_MODEL_CODE -> MA_PARM_DRAWING.BLDG_MODEL_CODE MA_BUILDINGS.SUBMODEL_CODE -> MA_PARM_DRAWING.SUBMODEL_CODE
- MA_BUILDINGS.BLDG_MODEL_CODE -> MA_PARM_SE_MODELS.BLDG_MODEL_CODE
- MA_BLDG_AREA_YEAR. AREA_CODE-> MA_PARM_DRAWING.BLDG_AREA_CODE
- MA_BUILDINGS.YEAR_ID -> MA_MODIF_STAMP.YEAR_ID
Parameter Tables
- MA_TABLES.TABLE_CATEGORY = “bldg”
- MA_PARM_MAROUND.ROUNDING_CODE = “bldg” for the building value
- MA_PARM_MAROUND.ROUNDING_CODE = “area” for the areas (building dimensions)
- MA_PARM_MAROUND.ROUNDING_CODE = “look” for the areas used in lookups
Calculated Fields
The following system columns cannot be used in expressions stored in the MA_PARM tables nor should they be editable.
- TOTAL_BASE
- TOTAL_ACTUAL
- TOTAL_EFFECTIVE
- TOTAL_LIVING_AREA
- TOTAL_HEATED
- TOTAL_PERIMETER
- TOTAL_RCN
- TOTAL_RCNLD
- TOTAL_VALUE
- SITE_ADJ_TOTAL
- NBHD_ADJ_TOTAL
- FINAL_ADJ
Lookup Group
Many of the parameters used in the building 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
- By jurisdiction AND property type
Look-up Group Example
We have a building record for the year 2015 with BLDG_USE_CODE = “45”. We want to get a BSE element which is defined in the table MA_PARM_SETAB where the table name is “EXTWALL” and the primary key contains the SE_CODE and LOOKUP_GROUP. We already have the YEAR_ID and the SE_CODE ( “45”) but now we need the lookup group.
Next, we go to the table MA_LOOKUP_GROUP and get all the records with TABLE_NAME=”EXTWALL”, YEAR_ID=2015 and CAMA_CODE=”45”. 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
The following information is required to use 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_BLDGUSE.PROPERTY_TYPE based on MA_BUILDINGS.BLDG_USE_CODE = MA_PARM_BLDGUSE.BUSE_CODE and MA_BUILDINGS.YEAR_ID = MA_PARM_BLDGUSE.YEAR_ID. If no information is found in MA_PARM_BLDGUSE 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.
Step 1 – Compute the areas
For each record in MA_BLDG_AREA_YEAR, based on the field BASE_AREA, using the percent values from MA_PARM_DRAWING (by searching with the AREA_CODE and lookup by MODEL/SUBMODEL if used):
a) Calculate the areas
Calculate the actual, effective, heated and perimeter area.
- MA_BUILDINGS.TOTAL_BASE = the total of all MA_BLDG_AREA_YEAR.BASE_AREA
- MA_BLDG_AREA_YEAR.EFFECTIVE_AREA = MA_BLDG_AREA_YEAR.BASE_AREA * Expression content [MA_PARM_DRAWING. EXPRESSION] * Expression content [MA_PARM_DRAWING.EFFECTIVE_EXPESSION] / 10000
- If USE_METRIC we round to 1 decimal otherwise we round to 0 decimal
- MA_BLDG_AREA_YEAR.ACTUAL_AREA = MA_BLDG_AREA_YEAR.BASE_AREA * Expression content [MA_PARM_DRAWING. EXPRESSION] / 100
- If USE_METRIC we round to 1 decimal otherwise we round to 0 decimal. MA_BUILDINGS.TOTAL_ACTUAL = the total of all MA_BLDG_AREA_YEAR.ACTUAL_AREA
- MA_BLDG_AREA_YEAR.LIVING_AREA = MA_BLDG_AREA_YEAR.ACTUAL_AREA
- if MA_PARM_DRAWING.LIVING_AREA = -1 otherwise = 0
- MA_BUILDINGS. TOTAL_LIVING _AREA = the total of all MA_BLDG_AREA_YEAR. LIVING _AREA
- If EFFECTIVE_LIVING = “yes” then
- MA_BUILDINGS.TOTAL_EFFECTIVE = the total of all MA_BLDG_AREA_YEAR. LIVING _AREA
- MA_BLDG_AREA_YEAR.HEATED_AREA = MA_BLDG_AREA_YEAR.ACTUAL_AREA
- if MA_PARM_DRAWING.HEATED = “yes” = MA_BLDG_AREA_YEAR.ACTUAL_AREA * MA_BLDG_AREA_YEAR.PERCENT_HEATED
- if MA_PARM_DRAWING.HEATED = “partial” or = 0 if MA_PARM_DRAWING.HEATED = “no” MA_BUILDINGS. TOTAL_HEATED = the total of all MA_BLDG_AREA_YEAR. HEATED_AREA
- MA_BUILDINGS. TOTAL_PERIMETER = the total of all MA_BLDG_AREA_YEAR. PERIMETER
b) Cumulate the building areas by type
This steps cumulates the areas by area type (i.e. Basement, Garage, Porch, 1st Floor … Attic, etc.). The Building Drawing Table Option By Area Type must be turned on where each drawing code can be associated to an area type. When none define, the Area Type ‘E’ Effective is used by default. When the Drawing Area Code Option Do not xxxx is turned on, the area is not added to the Effective or Area Type totals (i.e. for perimeter consideration only).
- Cumulate the values in a collection by MA_PARM_DRAWING.AREA_TYPE (if NULL use the default ‘e’) if MA_PARM_DRAWING.EX_FROM_LOOKUP = 0 or NULL.
- The collection is indexed by AREA_TYPE and contains the following variables:
- TOTAL_EFFECTIVE = sum of all MA_BLDG_AREA_YEAR.EFFECTIVE_AREA per AREA_TYPE
- TOTAL_FOR_LOOKUP = sum of all MA_BLDG_AREA_YEAR.EFFECTIVE_AREA per AREA_TYPE if USE_BASE_AREA_FOR_LOOKUP = “no” else sum of all MA_BLDG_AREA_YEAR.ACTUAL_AREA per AREA_TYPE if USE_BASE_AREA_FOR_LOOKUP = “yes”
- TOTAL_RATE = 0 (will be use in the next steps)
- TOTAL_VALUE = 0 (will be use in the next steps
c) Add the areas to TOTAL for Lookup
Cumulate the values of all TOTAL_FOR_LOOKUP into a variable GRAND_TOTAL_FOR_LOOKUP for use later in the compute.
Step 2 – Round and Update Areas
Round and update area fields in MA_BUILDING (see Rounding Table)
a) Rounding by Area type
- Round each element of the collection created in step 1 for TOTAL_EFFECTIVE by using MA_PARM_MAROUND.ROUNDING_CODE = “area” and evaluating the Expression content [MA_PARM_ROUNDING.ROUND_TO_EXPESSION]. The rounding is performed by dividing TOTAL_EFFECTIVE by the ROUNDING_VALUE, by adding 0.4999999999999 if ROUND_UP_AREA = “yes”, by formatting the result to no decimal and then by multiplying back by the rounding value. If SQUARE_ROOT = “yes” then do a square root on TOTAL_EFFECTIVE.
b) Rounding by Total
- Round each element of the collection created in step 1 for TOTAL_FOR_LOOKUP by using MA_PARM_MAROUND.ROUNDING_CODE = “look” and evaluating the Expression content [MA_PARM_ROUNDING.ROUND_TO_EXPESSION]. The rounding is performed by dividing TOTAL_FOR_LOOKUP by the ROUNDING_VALUE, by adding 0.4999999999999 if ROUND_UP_AREA = “yes”, by formatting the result to no decimal and then by multiplying back by the rounding value. If SQUARE_ROOT = “yes” then do a square root on TOTAL_FOR_LOOKUP.
c) Grand Total Rounding
- Round GRAND_TOTAL_FOR_LOOKUP by using MA_PARM_MAROUND.ROUNDING_CODE = “look” and evaluating the Expression content [MA_PARM_ROUNDING.ROUND_TO_EXPESSION]. The rounding is performed by dividing TOTAL_EFFECTIVE by the ROUNDING_VALUE, by adding 0.4999999999999 if ROUND_UP_AREA = “yes”, by formatting the result to no decimal and then by multiplying back by the rounding value. If SQUARE_ROOT = “yes” then do a square root on GRAND_TOTAL_FOR_LOOKUP.
Step 3 – Get Initial Building Rate Information
Building Area Rate
Get Building Rate Setup
Check Rate Setup and get the initial rate from the building use code and the default property type. To do so, need to get one record from MA_TABLES for table_type = ‘bldguse’ to see if there is a lookup by:
- bldg_model (field setab_use_model = -1)
- submodel (field setab_submodel = -1)
- units (field use_units = -1)
Get Property Type
- PROPERTY_TYPE = MA_PARM_BLGUSE.PROPERTY_TYPE
- If PROPERTY_TYPE is NULL then get the property type from PC_LEGAL_INFO.
Get Initial Rate
The rate is established by getting MA_PARM_BLGUSE or MA_PARM_BRATE if the units are used).
The rate will be associated with the TOTAL_RATE collection created in step 2 based on MA_PARM_SE_AREA.AREA_TYPE. If no records found, use ‘e’ (Effective area) as AREA_TYPE.
Fixed Rate
- If MA_TABLES.USE_UNITS is False, then get the rate from MA_PARM_BLGUSE by searching with MA_BUILDINGS.BLDG_MODEL_CODE and with MA_BUILDINGS.SUBMODEL_CODE– depending on the lookup found above. The rate is evaluated from an expression and stored in TOTAL_RATE of every elements in the collection indexed by AREA_TYPE.
Rate by Unit
- If the MA_TABLES. USE_UNITS is True, than get a pro-rated rate form MA_PARM_BRATE by searching with MA_BUILDINGS.BLDG_MODEL_CODE and with MA_BUILDINGS.SUBMODEL_CODE – depending on the lookup found above. The Up_to_units area information (TOTAL_FOR_LOOKUP) is prorated based on the collection indexed by AREA_TYPE (Up_to_units >= TOTAL_FOR_LOOKUP) AND the value of AREA_TYPE for each entry found in MA_PARM_SE_AREA . The rate is evaluated from an expression and stored in TOTAL_RATE for the selected elements in the collection indexed by AREA_TYPE.
Building Use Depreciation Table
We need to store the depreciation table and the maximum depreciation percentage into variables for use later in the depreciation step (step 18).
- DEPR_TABLE = MA_PARM_BLGUSE.DEPR_TABLE.
- MAX_ DEPR_PCT = MA_PARM_BLGUSE.MAX_ DEPR_PCT.
Building Rate by Area Units Example
When MA_TABLES. USE_UNITS is True
Collection contains:
AREA_TYPE TOTAL_FOR_LOOKUP TOTAL_RATE
b 1000 0
l 2000 0
MA_TABLES has:
TABLE_NAME COMPUTATION_SEQ SETAB_USE_MODEL SETAB_SUBMODEL SETAB_USE_UNITS
bldguse 0 0 0 -1
MA_PARM_SE_AREA has :
COMPUTATION_SEQ AREA_TYPE
0 b
0 l
MA_PARM_BRATE has:
BUSE_CODE UP_TO_UNITS RATE
ms0001a 1000 20.50
ms0001a 3000 18.50
ms0001a 9999999 10.00
The collection will contain:
AREA_TYPE TOTAL_FOR_LOOKUP TOTAL_RATE
b 1000 20.5
l 2000 19.5 (pro-rated)
Step 4 – Structural Elements Values Calculation
This step gets and calculates all building structural elements that apply.It computes or evaluates all the XXX_VA, XXX_V2 columns based on the corresponding value of XXX_CD.
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
Structural elements can be associated to:
- Property type
- SE models (based on the registry SE_BY_MODELS and SE_BY_MODELS_YEAR which determines the effective year)
Structural Elements in MA TABLE
Get all the structural elements records from MA_TABLE for the year, having TABLE_TYPE = ‘setab’ AND MA_TABLES.setab_rd_code <> ‘h’.
- If they are associated to the SE models then join with the table MA_PARM_SE_MODELS and filter on MA_BUILDINGS.BLDG_MODEL_CODE,
- if not then use PROPERTY_TYPE (Step 3) that match MA_TABLES.PROPERTY_TYPE or MA_TABLES.PROPERTY_TYPE = NULL.
Computation Sequence
The records will be ordered by COMPUTATION_SEQ.
* Use this set of records within the steps below *
Query Sample if Associated to SE Models
- SELECT ma_tables.* FROM ma_tables, ma_parm_se_models WHERE ma_tables.year_id = ma_parm_se_models.year_id AND ma_tables.column_name = ma_parm_se_models.column_name AND ma_tables.computation_seq = ma_parm_se_models.computation_seq AND table_type = ‘setab’ AND setab_rd_code <> ‘h’ AND ma_tables.year_id = 2015 AND bldg_model_code = ‘ms0009’ ORDER BY ma_tables.computation_seq
MA Building Records Calculation
Each of the records will be treated separately, in order to find the value to be updated in MA_BUILDINGS for the corresponding XXX_VA field of the MA_TABLE.COLUMN_NAME, using the XXX_CD field value set in MA_BUILDINGS.
a) No Table Name
If there is no MA_TABLES.TABLE_NAME and the value into the corresponding _CD field is numeric, it will be transferred into the _VA field, otherwise XXX_VA is set to NULL.
b) No Table Name and Setab Col 11 = -1
If there is no MA_TABLES.TABLE_NAME and MA_TABLES.SETAB_COL_11 = -1 then XXX_V2 is set to NULL.
The next sub steps are only performed when there is a MA_TABLES.TABLE_NAME
c) Get MA_PARM_SETAB
Based on:
- bldg_model_code (if MA_TABLES.setab_use_model = -1 – lookup by model)
- submodel_code (if MA_TABLES.setab_submodel = -1 – lookup by submodel)
- matrix_code (if MA_TABLES.setab_use_matrix = -1 – then retrieve another MA_TABLES record that will provide the MA_TABLES.COLUMN_NAME based on MA_TABLES.COMPUTATION_SEQ = MA_TABLES.setab_seq_pointer.
- The matrix code value is found in MA_BUILDINGS.XXX_CD based on the retrieved MA_TABLES.COLUMN_NAME or in MA_BUILDINGS.XXX_VA if MA_TABLES.lookup_on_value = -1.
- matrix_code2 (if MA_TABLES.setab_use_matrix = -1 – then use MA_TABLES.COMPUTATION_SEQ = MA_TABLES.setab_seq_pointer2.
- matrix_code3 (if MA_TABLES.setab_use_matrix = -1 – then use MA_TABLES.COMPUTATION_SEQ = MA_TABLES.setab_seq_pointer3.
- with up_to_units (if MA_TABLES.setab_area_lookup is set – lookup using the area collection, there are 3 area lookup types: a, p, t
- ‘t’ (Grand Total) : use GRAND_TOTAL_FOR_LOOKUP
- ‘a’ or ‘p’ : use the collection TOTAL_FOR_LOOKUP using AREA_TYPE = entry with the greater TOTAL_FOR_LOOKUP value in MA_PARM_se_area
- ‘p’ : apply the percentage entered into the XXX_PC corresponding column in MA_BUILDINGS in order to reduce area if MA_TABLES.setab_col_3 = -1.
- NOTE: If XXX_PC contains 50 then TOTAL_FOR_LOOKUP is 2000 then we use 1000 (50% of 2000).
- Rates are always pro-rated between the UP_TO_UNITS as per example in step 3.
d) Evaluate MA_PARM_SETAB Expression
Evaluate the expression of MA_PARM_SETAB and store it in XXX_VA.
e) Rate Adjustment / Depreciation
If the Element Category of the record is Rate Adjustment (MA_TABLES.setab_rd_code = “r”)
AND there is a Depreciation Table set (field MA_PARM_SETAB.depr_table) then depreciation will be applied on the value (XXX_VA) as per below:
- a. We get the DEPR_PCT
- i. We determine the Appraisal base year APPR_BASE (registry DEPR_BASE_YEAR) using the current MA_TABLE.YEAR_ID
- ii. MA_PARM_DEPR.TABLE_NAME = MA_PARM_SETAB.DEPR_TABLE
- iii. We evaluate the MA_PARM_DEPR.NUMBER_OF_YEARS = FORMAT (APPR_BASE – MA_BUILDINGS.EYB to ‘000’). If negative we use 0. If MA_BUILDINGS.EYB is NULL we use MA_BUILDINGS.YEAR_BUILT.
- iv. We evaluate the expression MA_PARM_DEPR.EXPRESSION
- v. If MA_PARM_DEPR.EXPRESSION > MA_PARM_SETAB.max_depr_pct then the DEPR_PCT is MA_PARM_SETAB.max_depr_pct
- b. We set the XXX_VA Value XXX_VA = XXX_VA * (100 – DEPR_PCT) / 100
f) Apply % to the Value
If a percentage is entered into the _PC corresponding column in MA_BUILDINGS (when MA_TABLES.setab_col_3 = “-1”) then apply the % (XXX_PC) to the value (XXX_VA).
g) Set MA_BUILDINGS.xxx_V2
If MA_TABLES.setab_col_11 = -1, Then
MA_BUILDINGS.XXX_V2″ = MA_PARM_SETAB.base_value.
Step 5 – Round and Compute Average
This step computes the average for all structural elements having equal consecutive MA_TABLE.TABLE_NAME with different MA_TABLE.COLUMN_NAME.
We exclude from this step all MA_TABLE.setab_col_3 = -1 or MA_TABLE.no_average = -1
- Simply divide XXX_VA by the entry count and round to:
- Case MA_TABLE.setab_rd_code
- Case ‘q’ – IF QP_ROUNDING = ‘yes’ then round to QP_DECIMAL
- Case ‘a’, ‘t’ – Round to CAMA_ADJ_DECIMAL
- Case else Round to 2 digits.
If MA_TABLES.setab_col_11 = -1 Then perform the same logic for XXX_V2.
Example
MA_BUILDINGS
A1_VA= 16.445 A2_VA=20.555 A3_VA=2
MA_TABLES
COMPUTATION_SEQ TABLE_NAME COLUMN_NAME SETAB_COL_3
23 WALL A1 0
24 WALL A2 0
25 WALL A3 0
Results
A1_VA=16.445/3=5.48
A2_VA=20.555/3=6.85
A3_VA=2/3=0.67
Step 6 – Round and Compute Link
This step computes the linked values for all structural elements having MA_TABLES.setab_lk_pointer not NULL)
a) Loop in reverse order, from the last record to the first.
b) Depending on the field MA_TABLES.MATHS of each element having a link, its _VA field will be added, subtracted or multiplied to the _VA field of the linked computation sequence. For multiplication, if the MA_TABLES.PCT_AMT field is ‘p’ than the result will also be divided by 100 (Percent)
c) Set the value of XXX_VA to null
d) Case MA_TABLE.setab_rd_code
- Case ‘q’ – IF QP_ROUNDING = ‘yes’ then round to QP_DECIMAL
- Case ‘a’, ‘t’ then Round to CAMA_ADJ_DECIMAL
- Case else then Round to 2 digits.
If MA_TABLES.setab_col_11 = -1 Then perform the same logic for XXX_V2.
Example
MA_BUILDINGS
A1_VA= 8 A2_VA=4
MA_TABLES
COMPUTATION_SEQ TABLE_NAME COLUMN_NAME MATH setab_lk_pointer (verify)
26 QUAL A1 X NULL
27 QMOD A2 + 27
A1_VA = 12
A2_VA = NULL
Step 7 – Adjust Areas
Scan the records of MA_TABLE and adjust the areas in the area collection (EFFECTIVE_AREA) for all entries MA_TABLES.setab_rd_code = “m”
Use the same logic as in STEP4 to select the MA_TABLES records.
Update the area collection (EFFECTIVE_AREA) by AREA_TYPE for all entries found in MA_PARM_se_area compute the EFFECTIVE_AREA collection.
if MA_PARM_se_area has no record found then use ‘e’.
- Depending on MATHS, cumulate or multiply the value from column_VA to the EFFECTIVE_AREA collection based on MA_PARM_se_area .area_type
- If the _V2 column is used, cumulate also the value from column_V2
Step 8 – Override Areas
Scan the records of MA_TABLE and override the areas in the area collection (EFFECTIVE_AREA) for all entries MA_TABLES.setab_rd_code = “s”
Use the same logic as in STEP4 to select the MA_TABLES records.
If MA_PARM_se_area has no record found then use ‘e’.
- For all entries found in MA_PARM_SE_AREA move the XXX_VA to the corresponding EFFECTIVE_AREAcollection.
Step 9 – Adjust Rates
Scan the records of MA_TABLE and adjust the rates in the rate collection (TOTAL_RATE) for all entries MA_TABLES.setab_rd_code = “r” (VB6 : pv_scan_ma_table, pv_set_rate_tab)
Use the same logic as in STEP4 to select the MA_TABLES records.
Update the rate collection (TOTAL_RATE) by AREA_TYPE for all entries found in MA_PARM_se_area compute the TOTAL_RATEcollection.
- if MA_PARM_se_area .AREA_TYPE = “e” (Effective Area) or no record found, then, depending on MATHS, cumulate or multiply the value from column_VA to all the areas within the collection, otherwise apply it only to the area_type corresponding to the area set in MA_PARM_se_area.
- If the _V2 column is used, cumulate the value from column_V2Into a variable (grand_total_amount_adj_add) used below for CAMA adjustments.
Step 10 – Compute Size Adjustment
Compute the size adjustment variable (Govern for Windows: pv_compute_size_adjt).
A size adjustment is an adjustment to the rate based on the value of the TOTAL_EFFECTIVE collection.
Notes
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.
1. Get the MA_PARM_SIZEADJT entry for MA_BUILDINGS.BLDG_MODEL_CODE
2. If a record is not found then there is no size adjustment. Go to step 11.
3. If MA_PARM_SIZEADJT.SETAB_AREA_TYPE is NULL or = ‘e’ then we use MA_BUILDINGS.TOTAL_EFFECTIVE as the area value for the next sub steps, otherwise we use the TOTAL_EFFECTIVE collection item that match the area type. If the area value is 0 we go to step 11.
4. We evaluate the expression in MA_PARM_SIZEADJT.EXPRESSION and if the result is not zero then we set this value into MA_BUILDINGS.SIZE_ADJUSTMENTS and go to sub step 8.
5. if SIZE_ADJ_METHOD is Method 1 then the size adjustment is:
- MA_BUILDINGS.SIZE_ADJUSTMENTS = ( MA_PARM_SIZEADJT.building_size * MA_PARM_SIZEADJT.land_bldg_ratio / area_value) + (1 – MA_PARM_SIZEADJT.land_bldg_ratio)
- If MA_BUILDINGS.SIZE_ADJUSTMENTS < MA_PARM_SIZEADJT.MINIMUM_RATIO then we reset the size adjustment to the minimum.
- If MA_BUILDINGS.SIZE_ADJUSTMENTS > MA_PARM_SIZEADJT.MAXIMUM_RATIO then we reset the size adjustment to the maximum.
6. if SIZE_ADJ_METHOD is Method 2 then the size adjustment is:
- If the area value < MA_PARM_SIZEADJT.MINIMUM_RATIO then we reset the area value to the minimum.
- If the area value > MA_PARM_SIZEADJT.MAXIMUM_RATIO then we reset the area value to the maximum.
- MA_BUILDINGS.SIZE_ADJUSTMENTS = (area_value – MA_PARM_SIZEADJT.building_size) * MA_PARM_SIZEADJT.land_bldg_ratio
7. We round the size adjustments to the number of decimal positions as per the SIZE_ADJ_DECIMAL value.
8. If the size adjustment is for area type NULL or ‘e’ then we apply the following logic to ALL elements of the collection. If SIZE_ADJ_METHOD is Method 1 we multiply the rounded size adjustment by the rate found in the TOTAL_RATE collection for the current area_type. elseif SIZE_ADJ_METHOD is Method 2 we add the rounded size adjustment to the rate found in the TOTAL_RATE collection for the current area_type.
Step 11 – Compute Initial Value
In this step we compute an initial value for each items in the collection (VB6 : pv_compute_area_rate).
- For each item in the area collection do TOTAL_VALUE = TOTAL_EFFECTIVE * TOTAL_RATE
Step 12 – Adjust the Total Value (CAMA Adjustment)
- Scan the records of MA_TABLE and adjust the total value in the area collection (TOTAL_VALUE) for all entries MA_TABLES.setab_rd_code = “a”
- Use the same logic as in STEP4 to select the MA_TABLES records.
- If there are no records in MA_PARM_se_area or if MA_PARM_se_area.area_type = “e” then the adjustments are applied for all entries in the collection except for a Special Case (see below)
- Depending on MATHS and PCT_AMT, cumulate or multiply the value from column_VA into the collection array TOTAL_VALUE.
- If the _V2 column is used, cumulate also the value from column_V2into TOTAL_VALUE, independently of the MATHS.
Special Case:
If there are no records in MA_PARM_se_area OR if MA_PARM_se_area.area_type = “e”
AND also the MATHS is + or – and the PCT_AMT is ‘a’ (Amount), the adjustment will be applied only once, as following:
- The value from column_VA will be cumulated into grand_total_amount_adj_add (and not into the collection array TOTAL_VALUE)
- If the _V2 column is used, cumulate also the value from column_V2 into grand_total_amount_adj_add.
Step 13 – Compute the initial building value
The INITIAL_BLDG_VALUE is computed by adding all TOTAL_VALUE from the area collection.
- Add grand_total_amount_adj_add (step 9) to INITIAL_BLDG_VALUE.
Step 14 – Compute the Quality Points
Quality points is a special type of adjustment that is a percentage that adjust the total value.
Scan the records of MA_TABLE for all entries MA_TABLES.setab_rd_code = “q”
Use the same logic as in STEP4 to select the MA_TABLES records.
- Depending on MATHS (+ or – only), cumulate all the values of column_VA into MA_BUILDINGS.QUALITY_POINTS.
- If MA_BUILDINGS.QUALITY_POINTS = 0 then set it to NULL and do not compute the adjustment below.
- INITIAL_BLDG_VALUE = INITIAL_BLDG_VALUE * MA_BUILDINGS.QUALITY_POINTS / 100.
Step 15 – Compute Overall Adjustment
Overall adjustments are used to to modify the total value of a building according to user-defined criteria such as number of rooms or number
of fireplaces.
Scan the records of MA_TABLE and adjust the INITIAL_BLDG_VALUE for all entries MA_TABLES.setab_rd_code = “t”
Use the same logic as in STEP4 to select the MA_TABLES records.
- Depending on MATHS and PCT_AMT, cumulate or multiply the value from column_VA into INITIAL_BLDG_VALUE.
- If the _V2 column is used, cumulate also the value from column_V2into INITIAL_BLDG_VALUE, independently of the MATHS.
Step 16 – Compute the Effective Rate
The effective rate is calculated based on the building value divided by the area.
- If SQUARE_ROOT = “yes” then
- MA_BUILDINGS.effective_rate = INITIAL_BLDG_VALUE / Square root of (MA_BUILDINGS.total_effective)
- Else
- MA_BUILDINGS.effective_rate = INITIAL_BLDG_VALUE / MA_BUILDINGS.total_effective
Format the result to 2 decimal positions.
Step 17 – Compute RCN (Replacement Cost New)
The RCN value is the total value prior to depreciation.
- If MA_BUILDINGS.nb_units > 1 then
- MA_BUILDING.TOTAL_RCN = INITIAL_BLDG_VALUE * MA_BUILDINGS.nb_units
- Else
- MA_BUILDING.TOTAL_RCN = INITIAL_BLDG_VALUE.
Format the result to 0 decimal positions.
Step 18 – Get Depreciation
The goal of this step is to find the depreciation table to be used in step 19.
Scan the records of MA_TABLE for all depreciation types of structural elements.
Use the same logic as in STEP4 to select the MA_TABLES records.
The processing is specific to each Category MA_TABLES.setab_rd_code:
Depreciation (MA_TABLES.setab_rd_code = “d”)
Standard
- DEPR_TABLE = MA_PARM_SETAB.DEPR_TABLE if not null and not set by type ‘e’.
- MAX_ DEPR_PCT = MA_PARM_SETAB.MAX_ DEPR_PCT if not null.
Depreciation Override
- If Depreciation Override (MA_TABLES.setab_rd_code = “o”), then:
- MA_BUILDINGS.total_depr_pct = column_VA.
- MA_BUILDINGS.total_RCNLD = MA_BUILDINGS.total_RCN * (100 -MA_BUILDINGS.total_depr_pct) / 100.
- NOTE: There should be only one record with this Category, otherwise only the first value will used.
Format the result to 0 decimal positions.
Depreciation Table Override
- If Depreciation Table Override (MA_TABLES.setab_rd_code = “e”), then
- DEPR_TABLE = MA_PARM_SETAB.DEPR_TABLE if not null and not set by type ‘e’.
Step 19 – Compute Base Depreciation Percentage
The goal of this step is to compute the base depreciation percentage
We determine the Appraisal base year APPR_BASE (registry DEPR_BASE_YEAR) using the current MA_TABLE.YEAR_ID
- MA_PARM_DEPR.TABLE_NAME = DEPR_TABLE
- We evaluate the MA_PARM_DEPR.NUMBER_OF_YEARS = FORMAT (APPR_BASE – MA_BUILDINGS.EYB to ‘000’).
- If negative we use 0. If MA_BUILDINGS.EYB is NULL we use MA_BUILDINGS.YEAR_BUILT.
- We evaluate the expression MA_PARM_DEPR.EXPRESSION as DEPR_PCT
Step 20 – Adjust Depreciation
The goal of this step is to apply the depreciation adjustment,
Scan the records of MA_TABLE for the depreciation types ‘d’ of structural elements.
Use the same logic as in STEP4 to select the MA_TABLES records.
Depreciation (MA_TABLES.setab_rd_code = “d”)
- If Non-Cumulative (MA_TABLES.no_cumulative = “-1”) keep the (column_VA) into an array called DEPR_ARRAY, to be applied later in this step.
- NOTE: When the non-cumulative column is set, then PCT_AMT = ‘p’ and MATHS = ‘x’ (set by GNA), so we don’t need to check these values.
- Otherwise
- If MATHS = ‘x’ (Multiplier)
- if the PCT_AMT = ‘a’ (Amount), multiply with the value: depr_pct = depr_pct * column_VA
- if the PCT_AMT = ‘p’ (Percentage), multiply with the value and divide by 100: depr_pct = depr_pct * column_VA / 100
- If MATHS = ‘+’ (Plus) OR ‘-’ (Minus). Add OR subtract the value from column_VA:
- if the PCT_AMT = ‘a’ (Amount), add/subtract to the value:depr_pct = depr_pct +/- column_VA
- if the PCT_AMT = ‘p’ (Percentage), add/subtract to the value and divide by 100: depr_pct = depr_pct +/- (DEPR_PCT * column_VA / 100)
Once all code processed compute the non-cumulative depreciations
NON_DEPR_AMOUNT = MA_BUILDINGS.total_RCN * (100 – depr_pct) / 100.
For each element of the DEPR_ARRAY
- NON_DEPR_AMOUNT = NON_DEPR_AMOUNT – (NON_DEPR_AMOUNT * DEPR_ARRAY(x) / 100)
MA_BUILDINGS.total_depr_pct = 100 – (NON_DEPR_AMOUNT * 100 / MA_BUILDINGS.total_RCN) formatted to 2 decimal positions.
MA_BUILDINGS.total_RCNLD = NON_DEPR_AMOUNT formatted to 0 decimals.
MA_ BUILDINGS.TOTAL_VALUE = NON_DEPR_AMOUNT formatted to 0 decimals.
Step 21 – Compute Site Adjustment
Compute Site Adjustment MA_BUILDINGS.SITE_ADJ_TOTAL
See the site adjustment computation specs document. We will have to decide whether or not we call the site object before completing this step.
Site adjustment is based on the value of MA_BUILDINGS.SITE_NO and should be skipped if NULL (Should not occur as site is mandatory in 6.1)
The total site adjustment cannot produce a negative value if Allow_Negative_Value=False.
The adjustment (MA_BUILDINGS.SITE_ADJ_TOTAL) is calculated as (MA_BUILDINGS.total_RCNLD * MA_SITE.ADJ_BLDG_PERCENT / 100) + MA_SITE.ADJ_BLDG_AMOUNT.
The site adjustment is added to the MA_ BUILDINGS.TOTAL_VALUE.
Step 22 – Compute Neighborhood Adjustment
Compute Neighborhood Adjustment in MA_ BUILDINGS.NBHD_ADJ_TOTAL.
Property Type
The Neighborhood adjustment (MA_PARM_NBHD) is based on the property type (see the section on property type at the beginning of this document).
If NULL and PROPERTY_TYPE_FROM_PC_LEGAL = “yes” then we define the property type as PC_LEGAL_INFO.PROPERTY_TYPE.
IF no record found for a given property type then we search the MA_PARM_NBHD table with a blank property type (15 spaces).
Adjustment
- The adjustment (MA_BUILDINGS.NBHD_ADJ_TOTAL) is calculated as (MA_BUILDINGS.TOTAL_VALUE * evaluated expression MA_PARM_NBHD.BLDG_EXPRESSION / 100)
- The nbhd adjustment is added to the MA_ BUILDINGS.TOTAL_VALUE. This value cannot produce a negative value if Allow_Negative_Value=False.
Step 23 – Compute Global Adjustment
The goal of this step is to apply a global adjustment. This is an adjustment that is applied after the depreciation is calculated.
Scan the records of MA_TABLE for the global adjustments types ‘g’ of structural elements
Use the same logic as in STEP4 to select the MA_TABLES records.
Read all Global adjustments (MA_TABLES.setab_rd_code = “g”) and for each record:
- Note: The type ‘g’ only support PCT_AMT = ‘p’ and MATHS = ‘x’ (set by GNA), so we don’t need to check these values.
If no records are found then continue to step 24.
Once all records ‘g’ are read:
- MA_BUILDINGS.TOTAL_VALUE = MAF_VALUE
Step 24 – Compute Final Adjustment
The goal of this step is to calculate the final adjustment
The final adjustment is calculated only if MA_BUILDINGS.FINAL_ADJ_PERCENT is not NULL.
-
- Note: A value of zero reset both the final_adj and final_adj_percent to NULL
- MA_BUILDINGS.FINAL_ADJ = MA_BUILDINGS.TOTAL_VALUE * MA_BUILDINGS.FINAL_ADJ_PERCENT / 100
- MA_BUILDINGS.TOTAL_VALUE = MA_BUILDINGS.TOTAL_VALUE + MA_BUILDINGS.FINAL_ADJ.
Step 25 – Compute the Final Rounded Value
The goal of this step is to compute the final rounded value.
- MA_BUILDINGS.TOTAL_VALUE is rounded based on the MA_PARM_MAROUND information (code = ‘bldg’).
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.
Step 26 – Set the Modification Stamp
The goal of this step is to identify that the building value has been computed.
- MA_BUILDINGS.MODIF_STAMP = MA_MODIF_STAMP.BLDG_STAMP if not null, otherwise we use the current date/time.