In each tran code, the user has the ability to choose from many different penalty and interest calculation methods.  These letters enable GovCollect to calculate in different methods.

Be sure and watch the Setting up Penalty and Interest videos to learn more.

A user can setup 2 separate penalties and 1 interest method PER tran code.

PENALTY 1 SELECTED METHOD IS USED FOR PENALTY 1 AND THE DESIRED STYLE OF INTEREST.  For example if you want MONTHLY Interest, then you would select M in the penalty 1 type field and that will tell the Interest to be applied monthly.

The most common methods are:
P - Flat one time charged penalty based upon the amount in the NORMAL field on a CHARGE.
B -  Flat one time charged penalty based upon the amount in the GROSS field on a CHARGE. (Balance)
M - Monthly

The list below describes some custom codes that can be used and the calculation behind each code.

Penalty Type 2 = "N"

tranctl->pen2_days <= days .and. effdate > tran->date_past

Monthly starting on date becoming past due and days expired

Changes to the first of the month therafter

Formula:

Penalty = (((TRAN->DISCOUNT + TRAN->NORMAL) * (Months Count * (TRANCTL->PEN2_P_A) / 12)))

Penalty Maximum = (((TRAN->DISCOUNT + TRAN->NORMAL) * ((TRANCTL->PEN2_MAX))))

Penalty Type 2 = "n"

tranctl->pen2_days <= days .and. effdate > tran->date_past

Monthly starting on date becoming past due and days expired

Stays on that date each month therafter

Formula:

Penalty = (((TRAN->DISCOUNT + TRAN->NORMAL) * (Months Count * (TRANCTL->PEN2_P_A) / 12)))

Penalty Maximum = (((TRAN->DISCOUNT + TRAN->NORMAL) * ((TRANCTL->PEN2_MAX))))

Penalty Type 2 = "O"

tranctl->pen2_days <= days .and. effdate > tran->date_past

Monthly starting on date becoming past due and days expired

No Day of Month

Formula:

Penalty = (((TRAN->DISCOUNT + TRAN->NORMAL - TRAN->PAYMENT) * (Months Count * (TRANCTL->PEN2_P_A) / 12)))

Penalty  Maximum = (((TRAN->DISCOUNT + TRAN->NORMAL - TRAN->PAYMENT) * ((TRANCTL->PEN2_MAX))))

Penalty Type 2 = "Q"

tranctl->pen2_days <= days .and. effdate > tran->date_past

Monthly starting on date becoming past due and days expired

No Day of Month

Formula:

Penalty = ((((TRAN->DISCOUNT + TRAN->NORMAL - TRAN->PAYMENT) / 12) * (Months Count * (TRANCTL->PEN2_P_A) / 12)))

Penalty Maximum = ((((TRAN->DISCOUNT + TRAN->NORMAL - TRAN->PAYMENT) / 12) * ((TRANCTL->PEN2_MAX))))

Penalty Type 1 = "L"

tranctl->int_days <= days .and. effdate > tran->date_past

Monthly starting on date becoming past due and days expired

No Day of Month

Formula:

Interest = (((TRAN->USAGE) * (MD_count * (PROPERTY->INTEREST_RATE) / 12)))

If Interest is greater than (TRAN->NORMAL + (TRAN->ADJUSTMENT * -1))

Interest = Interest - (TRAN->NORMAL + (TRAN->ADJUSTMENT * -1))

Penalty Type 1 = "M"

tranctl->int_days <= days .and. effdate > tran->date_past

Monthly starting on date becoming past due and days expired

Changes to the first of the month therafter

Formula:

Interest = (((TRAN->DISCOUNT + TRAN->NORMAL) * (MD_count * (TRANCTL->INT_RATE) / 12)))

Penalty Type 1 = "m"

tranctl->int_days <= days .and. effdate > tran->date_past

Monthly starting on date becoming past due and days expired

Stays on that date each month therafter

Formula:

Interest = (((TRAN->DISCOUNT + TRAN->NORMAL) * (MD_count * (TRANCTL->INT_RATE) / 12)))

Penalty Type 1 = "H"

tranctl->int_days <= days .and. effdate > tran->date_past

Monthly starting on date becoming past due and days expired

Stays on that date each month therafter

Formula:

Interest = (((TRAN->DISCOUNT + TRAN->NORMAL - TRAN->PAYMENT) * (MD_count * (TRANCTL->INT_RATE) / 12)))

Penalty Type 1 = "D" (Double)

tranctl->int_days <= days .and. effdate > tran->date_past

Monthly starting on date becoming past due and days expired

No Day of Month

Formula:

Interest = (((TRAN->DISCOUNT + TRAN->NORMAL + TRAN->PENALTY - TRAN->PAYMENT) * (MD_count * (TRANCTL->INT_RATE) / 12)))

Penalty Type 2 = "T" (Texas)

Montgomery Alabama Discount

On tran code setup in tranctl

LG4 = True

Montgomery Alabama Penalty

On tran code setup in tranctl

LG5 = true and effdate > tran->date_past and tran->pen1_tc = empty

Special V code for Virginia Christiansburg

/////////////////////////////////////////////////////////////////////////////////

//Virginia

/////////////////////////////////////////////////////////////////////////////////

IF TRANCTL->PEN2_TYPE = "V"

MD_s_month = month(TRAN->DATE_DUE + (TRANCTL->PEN2_DAYS - 1))

md_s_date = tran->date_due + (tranctl->pen2_days - 1)

md_s_day = day(md_s_date)

md_s_year = year(md_s_date)

md_a_date = md_s_date

md_count = 0

days_gap = days - tranctl->pen2_days

//  ?"S Date ",md_s_date,"  A Date ",md_a_date

//  ?"Gap ",days_gap," ",md_s_date + days_gap

for md = 0 to days_gap  //calculate gap in months

md_s_date = md_s_date + 1

if md_s_date >= md_a_date

md_count++

md_s_month++

if md_s_month > 12

md_s_month = 01

md_s_year++

endif

xDate = ltrim(str(md_s_month))

xDate += "/"

//xDate += "01"

xDate += ltrim(str(md_s_day))

xDate += "/"

xDate += ltrim(str(md_s_year))

md_a_date = ctod(xDate)

//  ?"S Date ",md_s_date,"  A Date ",md_a_date

endif

next

//  ?"S Date ",md_s_date,"  A Date ",md_a_date

//  ?"Months "+md_count

vAmount = (TRAN->DISCOUNT + TRAN->NORMAL) * .10

if md_count > 1

md_count--

vAmount += (((TRAN->DISCOUNT + TRAN->NORMAL) * (MD_count * (TRANCTL->PEN2_P_A) / 12)))

endif

replace tran->penalty with vAmount

PEN_MAX = (((TRAN->DISCOUNT + TRAN->NORMAL) * ((TRANCTL->PEN2_MAX))))

if tran->penalty > pen_max

replace tran->penalty with pen_max

endif

if tranctl->pen2_min > 0 and tran->penalty < tranctl->pen2_min

replace tran->penalty with tranctl->pen2_min

endif

if tran->penalty > tran->normal

replace tran->penalty with tran->normal

endif

endif

/////////////////////////////////////////////////////////////////////////////////////////