(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
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.
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.