Calculate benefit based on location, union and rate changes
QUESTION: How can I compute a monthly benefit using rates based on the eligible location and eligible unions where employees work. Not all location/union combinations are eligible to participate in the plan. Benefit service is only earned at eligible locations with eligible union. Any employee can change jobs and locations at any time. The collective bargaining agreement is made at locations individually; so unions may have different benefit rates at different locations. The rates are used prospectively. Below are three charts which show:
The company's locations and dates joining the plan. | |||
Location; | Code | Eligible? | Effective Date |
Minneapolis, MN | 700 | yes | 3/1/1953 |
St Paul, MN | 701 | yes | 3/1/1965 |
Minnetonka, MN | 702 | no | |
Bloomington, MN | 703 | yes | 3/1/1965 |
Maple Grove, MN | 704 | no | |
Woodbury, MN | 705 | no | |
Annandale, MN | 706 | yes | 5/1/1990 |
Waconia, MN | 707 | no | |
Hastings, MN | 900 | yes | 1/1/2018 |
Code | Employment Event |
1 | Hire |
2 | Termination |
3 | Rehire |
4 | Leave of absence - personal |
5 | Return from leave |
6 | Leave of absence - medical |
7 | Leave of absence - paternal/maternal |
8 | Layoff |
9 | Return from Layoff |
Location | Effective date | Union | Benefit rate | Union | Benefit rate |
Hastings, MN | 1/1/2018 | UGW | 25.00 |
Location | Effective date | Union | Benefit rate | Union | Benefit rate |
Annandale, MN | 5/1/1990 | IAM | 23.50 | ||
1/1/1995 | IAM | 25.00 | IBEW | 24.00 | |
TWU | 25.00 | ||||
1/1/2000 | AFL_CIO | 25.00 | IAM | 27.00 | |
IBEW | 25.00 | TWU | 27.00 | ||
UAW | 25.00 | UGW | 28.00 | ||
1/1/2006 | AFL_CIO | 26.50 | IAM | 27.50 | |
IBEW | 29.00 | TWU | 29.00 | ||
UAW | 25.00 | UGM | 27.00 | ||
1/1/2012 | AFL_CIO | 29.50 | IAM | 28.00 | |
IBEW | 31.00 | TWU | 31.50 | ||
UAW | 25.00 | UGW | 30.25 | ||
1/1/2018 | AFL-CIO | 31.50 | IAM | 29.50 | |
IBEW | 33.00 | TWU | 33.50 | ||
UAW | 31.50 | UGW | 33.00 |
Location | Effective date | Union | Benefit rate | Union | Benefit rate |
Bloomington, MN | 3/1/1965 | IAM | 23.50 | ||
1/1/1969 | IAM | 25.00 | IBEW | 24.00 | |
TWU | 25.00 | ||||
3/1/1975 | IAM | 28.00 | IBEW | 24.50 | |
TWU | 26.75 | ||||
4/1/1981 | IAM | 29.25 | IBEW | 25.75 | |
TWU | 27.00 | UAW | 24.00 | ||
UGW | 25.00 | ||||
1/1/1989 | IAM | 31.25 | IBEW | 26.75 | |
TWU | 29.75 | UAW | 25.75 | ||
UGW | 26.25 | ||||
1/1/1995 | IAM | 33.00 | IBEW | 29.00 | |
TWU | 31.25 | UAW | 27.25 | ||
UGW | 29.00 | ||||
1/1/2000 | AFL_CIO | 25.00 | IAM | 34.00 | |
IBEW | 31.25 | TWU | 32.25 | ||
UAW | 29.00 | UGW | 29.50 | ||
1/1/2006 | AFL_CIO | 26.50 | IAM | 35.75 | |
IBEW | 32.00 | TWU | 34.00 | ||
UAW | 31.25 | UGW | 30.00 | ||
1/1/2012 | AFL_CIO | 29.50 | IAM | 36.00 | |
IBEW | 33.50 | TWU | 34.50 | ||
UAW | 32.00 | UGW | 31.50 | ||
1/1/2018 | AFL-CIO | 31.50 | IAM | 37.50 | |
IBEW | 34.75 | TWU | 35.50 | ||
UAW | 33.50 | UGW | 33.00 |
Location | Effective date | Union | Benefit rate | Union | Benefit rate |
Minneapolis, MN | 3/1/1965 | TWU | 10.00 | ||
1/1/1969 | TWU | 12.75 | |||
1/1/1976 | TWU | 14.00 | UAW | 14.00 | |
4/1/1981 | TWU | 15.75 | UAW | 17.00 | |
1/1/1989 | TWU | 17.00 | UAW | 19.50 | |
1/1/1995 | TWU | 20.00 | UAW | 20.00 | |
1/1/2000 | TWU | 21.75 | UAW | 20.00 | |
1/1/2006 | TWU | 24.75 | UAW | 25.00 | |
1/1/2012 | TWU | 27.00 | UAW | 27.50 | |
1/1/2018 | TWU | 30.00 | UAW | 30.00 |
ANSWER: Develop an Accrual Definition that uses an array of benefit values representing the member's "history" of benefit values to compute the total benefit. The history of values will include zero (0) for the period of non-eligible service. The steps are:
Your csv file may look like:
L_dt := #START Locations &
U_dt := #START Unions &
B_dt := "rates?" #GETTABVAL (3) &
; build the array:
12 #ARRAY (L_dt, L_dt, U_dt U_dt, B_dt, B_dt)
Check the box to replace all values, whether or not missing.
d1_dt := #START all_Relevant_Rate_dt &
d2_dt := 1 #START all_Relevant_Rate_dt & ; the next relevant date
da_dt := (d1_dt <> d2_dt) * d1_dt & ; disregard dates that are the same
db_dt := da_dt #dateminus 1d & ; get the previous day
; build the array:
12 #ARRAY (da_dt, da_dt, db_dt, db_dt)
Check the box to replace all values, whether or not missing.
d_dt := All_elevant_dt &
L := d_dt #GETASOF Locations &
U := d_dt #GETASOF Unions &
"rates" #GETTABVAL (l, U, d_dt)