# recalcmob.awk

# /*
# *************************************************************************
# **									*
# **	Copyright (C) 1992-2010 Trans-Mit Pty. Ltd. Melbourne Australia	*
# **	This software may not be loaned, resold, changed or copied	*
# **	in any way without the express written permission of author	*
# **	and Trans-Mit Pty. Ltd., Australia.				*
# **									*
# *************************************************************************
# **
# **	$Header: /usr/local/lib/cake/RCS/rcshead,v 1.10 2004/01/07 02:42:19 root Exp $
# **	$Author: root $
# **	$Date: 2004/01/07 02:42:19 $
# **	$Locker:  $
# **
# *************************************************************************
# */

function trim(s)
{
	if ( substr(s,1,4) == "-nan" )
		return ""
	sub(/^[ \t]*/,"",s)
	sub(/[ \t]*$/,"",s)
	return s
}

function clip(s)
{
	sub(/[ \t]*$/,"",s)
	return s
}


function fixforfname(s)
{
	gsub(/\//,"+",s)
	return s
}


function datecmp(date1,date2)
{
	dd1 = 0 + substr(date1,1,2)
	mm1 = 0 + substr(date1,4,2)
	yyyy1 = 0 + substr(date1,7,4)
	dd2 = 0 + substr(date2,1,2)
	mm2 = 0 + substr(date2,4,2)
	yyyy2 = 0 + substr(date2,7,4)
	d1 = (yyyy1 * 10000) + (mm1 * 100) + dd1
	d2 = (yyyy2 * 10000) + (mm2 * 100) + dd2
	return (d1 - d2)
}


#----------------------------------------------------------


function ld_mobconf(mobconffile) {
	printf("ld_mobconf(%s)\n", mobconffile)
	while ( (getline aline < mobconffile) > 0 ) {
		split(aline, a_arr, "|")
		printf("aline=%s\n", aline)
		f = 0

		# from getSIDMAINTconf
		recordno = trim(a_arr[++f])
		mobconf_mobile = trim(a_arr[++f])
		sidmainttype = trim(a_arr[++f])
		mobconf_sdate = trim(a_arr[++f])
		mobconf_edate = trim(a_arr[++f])
		directoryID = trim(a_arr[++f])
		grid = fixforfname(trim(a_arr[++f]))
		datatype = trim(a_arr[++f])
		serviceproviderdir = trim(a_arr[++f])
		carriercode = trim(a_arr[++f])
		grname1 = trim(a_arr[++f])
		grname3 = fixforfname(trim(a_arr[++f]))
		surname = trim(a_arr[++f])
		firstname = trim(a_arr[++f])
		manufacturer = trim(a_arr[++f])
		model = trim(a_arr[++f])
		servicetype = trim(a_arr[++f])
		genfld4 = trim(a_arr[++f])

		dataplan = genfld4

		confmobile_arr[mobconf_mobile] = 1
		mobile_to_carriercode_arr[mobconf_mobile] = carriercode
		mobile_to_dataplan_arr[mobconf_mobile] = dataplan
		mobile_to_sdate_arr[mobconf_mobile] = mobconf_sdate
		mobile_to_edate_arr[mobconf_mobile] = mobconf_edate

		#print "mobile_to_dataplan_arr[" mobconf_mobile "] = " mobile_to_dataplan_arr[mobconf_mobile]
	}
	close(mobconffile)
}


function ld_chargecat(chargecatfile) {
	printf("ld_chargecat(%s)\n", chargecatfile)
	while ( (getline aline < chargecatfile) > 0 ) {
		split(aline, a_arr, "|")
		#printf("aline=%s\n", aline)
		f = 0
		chargecatid = trim(a_arr[++f])
		chargecat = trim(a_arr[++f])
		importdatatypeid = trim(a_arr[++f])
		carriercode = trim(a_arr[++f])
		rectype = trim(a_arr[++f])
		chargeclasstype = trim(a_arr[++f])
		globalroaming = toupper(trim(a_arr[++f]))

		Ctag = carriercode "|" rectype "|" chargeclasstype

		carriercode_rectype_chargeclass_to_chargecat[Ctag] = chargecat

		#print "carriercode_rectype_chargeclass_to_chargecat[" Ctag "] = " carriercode_rectype_chargeclass_to_chargecat[Ctag]

		carriercode_rectype_chargeclass_to_globalroaming[carriercode "|" rectype "|" chargeclasstype] = cwglobalroaming1

	}
	close(chargecatfile)
}


function ld_dataplan(dataplanfile) {
	printf("ld_dataplan(%s)\n", dataplanfile)
	while ( (getline aline < dataplanfile) > 0 ) {
		split(aline, a_arr, "|")
		#printf("aline=%s\n", aline)
		f = 0
		dataplan = trim(a_arr[++f])
		chargecat = trim(a_arr[++f])
		monthlyfee = trim(a_arr[++f])
		centspermeg = trim(a_arr[++f])
		centspermin = trim(a_arr[++f])
		centsflagfall = trim(a_arr[++f])
		markup = trim(a_arr[++f])

		dataplan_chargecat_arr[dataplan "|" chargecat] = 1
		#print "dataplan_chargecat_arr[" dataplan "|" chargecat "]=[" dataplan_chargecat_arr[dataplan "|" chargecat] "]"

		dataplan_chargecat_to_monthlyfee_arr[dataplan "|" chargecat] = monthlyfee
		dataplan_chargecat_to_centspermeg_arr[dataplan "|" chargecat] = centspermeg
		dataplan_chargecat_to_centspermin_arr[dataplan "|" chargecat] = centspermin
		dataplan_chargecat_to_centsflagfall_arr[dataplan "|" chargecat] = centsflagfall
		dataplan_chargecat_to_markup_arr[dataplan "|" chargecat] = markup
	}
	close(dataplanfile)
}


#----------------------------------------------------------

function init_servicenumber(servicenumber)
{
	if ( servicenumber_arr[servicenumber] == 1 )
		return
	servicenumber_arr[servicenumber] = 1
	# init totals
	callcounttotal_arr[servicenumber] = 0
	renttotal_arr[servicenumber] = 0.0
	rent_discount_arr[servicenumber] = 0.0
	calltotal_arr[servicenumber] = 0.0
	call_discount_arr[servicenumber] = 0.0
	othertotal_arr[servicenumber] = 0.0
	other_discount_arr[servicenumber] = 0.0

	info_renttotal_arr[servicenumber] = 0.0
	info_rent_discount_arr[servicenumber] = 0.0
	info_calltotal_arr[servicenumber] = 0.0
	info_call_discount_arr[servicenumber] = 0.0
	info_othertotal_arr[servicenumber] = 0.0
	info_other_discount_arr[servicenumber] = 0.0

	internet_arr[servicenumber] = 0
	internet_count_arr[servicenumber] = 0
	internet_kbytes_arr[servicenumber] = 0
	internet_charges_arr[servicenumber] = 0.0
}

#---------------------------------

function finish_mobile(servicenumber)
{
	if ( servicenumber == "" )
		return

	#-------------
	# calculate and output CHARGE_DESC other total
	# with the monthly acces fee

	mobsdate = mobile_to_sdate_arr[servicenumber]
	mobedate = mobile_to_edate_arr[servicenumber]

	prsdate = SDATE
	predate = EDATE
	if ( datecmp(mobsdate,SDATE) > 0  )
		prsdate = mobsdate
	if ( mobedate != "" && datecmp(mobedate,EDATE) < 0 )
		predate = mobedate
	prdays = 1 + (0 + substr(predate,1,2)) - (0 + substr(prsdate,1,2))
	monthdays = 0 + substr(EDATE,1,2)

	#print "calc. prorata SDATE=" SDATE " EDATE= " EDATE
	#print "           mobsdate=" mobsdate " mobedate=[" mobedate "]"
	#print "                prsdate=" prsdate " predate=" predate
	#print "                prdays=" prdays
	#print "                monthdays=" monthdays

	accessfee = 0.0
	monthlyfee = 0.0
	dataplan = mobile_to_dataplan_arr[servicenumber]
	chargecat = "all"
	if ( dataplan_chargecat_arr[dataplan "|" chargecat] == 1 ) {
		monthlyfee = dataplan_chargecat_to_monthlyfee_arr[dataplan "|" chargecat]
		accessfee = 0 + sprintf("%0.5f", monthlyfee * prdays / monthdays)
		#if ( dataplan == "VND1" && accessfee != 15.0 )
		#	print "dataplan= " dataplan " accessfee=[" accessfee "]"
	}
	
	rectype = "CHARGE_DESC"
	#recclass = "OTHER"
	# 24/2/10 store Monlty Access Fee as RENT (not OTHER)
	recclass = "RENT"

	sdate_str = ""
	btxt_stime_str = ""
	btxt_origin = "RENTRECALC"	# mark as recalc total
	btxt_destination = "Monthly Access Fee"
	btxt_dialled = total_from_to
	btxt_rate = ""
	dursecs = 0
	oldcost = oldcost_arr[servicenumber "|" rectype "|" recclass]
	newcost = 0.0 + accessfee

	#if ( newcost >= 0 ) {	# cost is not negative
	#	othertotal_arr[servicenumber] += newcost
	#}
	#else {				# cost is negative
	#	other_discount_arr[servicenumber] += newcost
	#}
	if ( newcost >= 0 ) {	# cost is not negative
		renttotal_arr[servicenumber] += newcost
	}
	else {				# cost is negative
		rentdiscount_arr[servicenumber] += newcost
	}

	if ( newcost != 0 ) {
		newoutrec()
	}


	#-------------
	# calculate and output CHARGE_DESC call total

	rectype = "CHARGE_DESC"
	recclass = "CALL"

	callcounttotal = callcounttotal_arr[servicenumber]
	calltotal = calltotal_arr[servicenumber]

	# rjs 26/3/2010 back to separate internet 
	#callcounttotal += internet_count_arr[servicenumber]
	#calltotal += internet_charges_arr[servicenumber]

	sdate_str = ""
	btxt_stime_str = ""
	btxt_origin = "CDRRECALC"	# mark as recalc total
	btxt_destination = "Call Charges (not incl. discount/internet)"
	btxt_dialled = total_from_to
	btxt_rate = ""
	# get from CDR totals
	dursecs = callcounttotal	# total call count
	oldcost = oldcost_arr[servicenumber "|" "CHARGE_DESC|CALL_CDR"]
	newcost = calltotal

	# call total
	if ( newcost != 0 ) {
		newoutrec()
	}

	## add to call totals above
	# rjs 26/3/2010 back to separate internet 
	#------------
	# internet CALL/DATA charges
	if ( internet_arr[servicenumber] == 1 ) {
		# output internet access
		rectype = "CHARGE_DESC"
		recclass = "CALL"
	
		sdate_str = ""
		btxt_stime_str = ""
		btxt_origin = "INTERNETRECALC"	# mark as recalc total
		btxt_destination = "Internet Data " internet_kbytes_arr[servicenumber] "Kb"
		btxt_dialled = total_from_to
		btxt_rate = internet_kbytes_arr[servicenumber]
		dursecs = internet_count_arr[servicenumber] 	# total count
		oldcost = oldcost_arr[servicenumber "|" "CHARGE_DESC|CALL_INTERNET"]
		newcost = 0.0 + internet_charges_arr[servicenumber]
		newoutrec()
	}

	#-------------
	# CALL_TOTAL (not including discounts)
	rectype = "CHARGE_DESC_INFO"
	recclass = "CALL_TOTAL"

	callcounttotal = callcounttotal_arr[servicenumber]

	calltotal = calltotal_arr[servicenumber]
	calltotal += info_calltotal_arr[servicenumber]

	sdate_str = ""
	btxt_stime_str = ""
	btxt_origin = "RECALC"
	btxt_destination = "Call Charges (not incl. discount/internet)"
	btxt_dialled = total_from_to
	btxt_rate = ""
	# get from CDR totals
	dursecs = callcounttotal	# total call count
	oldcost = oldcost_arr[servicenumber "|" rectype "|" recclass]
	newcost = calltotal

	# call total
	if ( newcost != 0 ) {
		newoutrec()
	}

	####################################
	# call discount

	rectype = "CHARGE_DESC_INFO"
	recclass = "CALL_DISCOUNT"

	call_discount = call_discount_arr[servicenumber]
	call_discount += info_call_discount_arr[servicenumber]

	sdate_str = ""
	btxt_stime_str = ""
	btxt_origin = "RECALC"
	btxt_destination = "Call Usage Discount"
	btxt_dialled = total_from_to
	btxt_rate = ""
	dursecs = 0
	oldcost = oldcost_arr[servicenumber "|" rectype "|" recclass]
	newcost = 0.0 + call_discount
	# call discount
	if ( newcost != 0 ) {
		newoutrec()
	}


	####################################
	# output recurring discount
	rectype = "CHARGE_DESC_INFO"
	recclass = "RECURRING_DISCOUNT"

	recurring_discount = rent_discount_arr[servicenumber]
	recurring_discount += info_rent_discount_arr[servicenumber]

	sdate_str = ""
	btxt_stime_str = ""
	btxt_origin = "RECALC"
	btxt_destination = "Recurring Discount (not incl. call discount)"
	btxt_dialled = total_from_to
	btxt_rate = ""
	dursecs = 0
	oldcost = oldcost_arr[servicenumber "|" rectype "|" recclass]
	newcost = 0.0 + recurring_discount
	# recurring_discount
	if ( newcost != 0 ) {
		newoutrec()
	}

	####################################
	# calculate and output adjustment
	rectype = "CHARGE_DESC_INFO"
	recclass = "ADJUSTMENT"

	call_discount = call_discount_arr[servicenumber]
	call_discount += info_call_discount_arr[servicenumber]

	# rjs 26/3/2010 adjustment should not include other discounts
	#other_discount = other_discount_arr[servicenumber]
	#other_discount += info_other_discount_arr[servicenumber]

	#adjustment = recurring_discount + call_discount + other_discount
	adjustment = recurring_discount + call_discount

	sdate_str = ""
	btxt_stime_str = ""
	btxt_origin = "RECALC"
	btxt_destination = "Total Adjustment (incl. call discount)"
	btxt_dialled = total_from_to
	btxt_rate = ""
	dursecs = 0
	oldcost = oldcost_arr[servicenumber "|" rectype "|" recclass]
	newcost = 0.0 + adjustment
	# adjustment
	if ( newcost != 0 ) {
		newoutrec()
	}

	####################################
	# calculate and output call recurring
	rectype = "CHARGE_DESC_INFO"
	recclass = "RECURRING"

	recurring = renttotal_arr[servicenumber]
	recurring += info_renttotal_arr[servicenumber]

	sdate_str = ""
	btxt_stime_str = ""
	btxt_origin = "RECALC"
	btxt_destination = "Recurring Charges"
	btxt_dialled = total_from_to
	btxt_rate = ""
	dursecs = 0
	oldcost = oldcost_arr[servicenumber "|" rectype "|" recclass]
	newcost = 0.0 + recurring
	# recurring cost
	if ( newcost != 0 ) {
		newoutrec()
	}


	####################################
	# output internet access
	if ( internet_arr[servicenumber] == 1 ) {
		# output internet access
		rectype = "CHARGE_DESC_INFO"
		recclass = "INTERNET"

		sdate_str = ""
		btxt_stime_str = ""
		btxt_origin = "RECALC"
		btxt_destination = "Internet Data " internet_kbytes_arr[servicenumber] "Kb"
		btxt_dialled = total_from_to
		btxt_rate = internet_kbytes_arr[servicenumber]
		dursecs = 0
		oldcost = oldcost_arr[servicenumber "|" rectype "|" recclass]
		newcost = 0.0 + internet_charges_arr[servicenumber]
		newoutrec()
	}


	####################################

	# do carrier totals
	bill_callcounttotal += callcounttotal_arr[servicenumber]
	bill_total_cost += renttotal_arr[servicenumber] + rent_discount_arr[servicenumber] + calltotal_arr[servicenumber] + call_discount_arr[servicenumber] + othertotal_arr[servicenumber] + other_discount_arr[servicenumber]
}


#----------------------------------------------------------

function recalc_cdr_cost()
{
	newcost = costinclgst

	chargecat = recclass
	if ( dataplan_chargecat_arr[dataplan "|" chargecat] != 1 ) {
		chargecat = "all"
		# no data plan found
		if ( dataplan_chargecat_arr[dataplan "|" chargecat] != 1 )
			return newcost
	}

	centspermeg = dataplan_chargecat_to_centspermeg_arr[dataplan "|" chargecat]
	centspermin = dataplan_chargecat_to_centspermin_arr[dataplan "|" chargecat]
	centsflagfall = dataplan_chargecat_to_centsflagfall_arr[dataplan "|" chargecat]
	markup = dataplan_chargecat_to_markup_arr[dataplan "|" chargecat]

	#print "centspermeg=[" centspermeg "]"
	#print "centspermin=[" centspermin "]"
	#print "centsflagfall=[" centsflagfall "]"
	#print "markup=[" markup "]"


	if ( internet ) {	# Data
		if ( centspermeg != "" )
			newcost = sprintf("%0.5f", (kbytes / 1024) * centspermeg / 100)
	}
	else {			# Call
		if ( centspermin != "" )
			newcost = sprintf("%0.5f", dursecs * (centspermin / 60))
	}

	if ( centsflagfall != "" )
		newcost = sprintf("%0.5f", newcost + (centsflagfall / 100))

	if ( markup != "" )
		newcost = sprintf("%0.5f", newcost + (markup * (newcost / 100)))

	return newcost
}


#----------------------------------------------------------

function newoutrec()
{
	printf("%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%d|%0.5f|%0.5f|\n", datasrcid, servicenumber, carrier, rectype, recclass, billperiod, sdate_str, btxt_stime_str, btxt_origin, btxt_destination, btxt_dialled, btxt_rate, dursecs, oldcost,newcost) >outfile
}

#----------------------------------------------------------

BEGIN {
	ld_mobconf(mobconffile)
	ld_chargecat(chargecatfile)
	ld_dataplan(dataplanfile)

	billmm = 0 + substr(MMYYYY,1,2)
	billyyyy = 0 + substr(MMYYYY,3,4)

	bill_callcounttotal = 0
	bill_total_cost = 0.0

	#bill_total_to = sprintf("%02d/%02d/%04d", dd, mm, yyyy)
	bill_total_to = billperiod
	bill_total_from = ""
	total_from_to = bill_total_from " to " bill_total_to
}

{
	f = 0
	datasrcid = $(++f)
	servicenumber = $(++f)
	carrier = $(++f)
	rectype = $(++f)
	recclass = $(++f)
	billperiod = $(++f)
	sdate_str = $(++f)
	btxt_stime_str = $(++f)
	btxt_origin = $(++f)
	btxt_destination = $(++f)
	btxt_dialled = $(++f)
	btxt_rate = $(++f)
	dursecs = $(++f)
	costinclgst = $(++f)

	oldcost = costinclgst
	newcost = oldcost

	if ( rectype == "CHARGE_DESC" ) {
		if ( recclass == "RENT" ) {
			# store for redone CHARGE_DESC_INFO totals
			if ( newcost >= 0 )	# cost is not negative
				info_renttotal_arr[servicenumber] += newcost
			else				# cost is negative
				info_rent_discount_arr[servicenumber] += newcost
		}
		if ( recclass == "CALL" ) {
			# marked from CDR call total
			if ( btxt_origin == "CDR" ) {
				oldcost_arr[servicenumber "|" "CHARGE_DESC|CALL_CDR"] = oldcost
				next		# bill total will be redone
			}
			# marked from CDR internet total
			if ( btxt_origin == "INTERNET" ) {
				oldcost_arr[servicenumber "|" "CHARGE_DESC|CALL_INTERNET"] = oldcost
				next		# bill total will be redone
			}

			# store for redone CHARGE_DESC_INFO totals
			if ( newcost >= 0 )	# cost is not negative
				info_calltotal_arr[servicenumber] += newcost
			else				# cost is negative
				info_call_discount_arr[servicenumber] += newcost
			}
		if ( recclass == "OTHER" ) {
			# store for redone CHARGE_DESC_INFO totals
			if ( newcost >= 0 )	# cost is not negative
				info_othertotal_arr[servicenumber] += newcost
			else				# cost is negative
				info_other_discount_arr[servicenumber] += newcost
		}

		newoutrec()
		next
	}

	if ( rectype == "CHARGE_DESC_INFO" ) {
		if ( recclass == "CALL_TOTAL" ) {
			oldcost_arr[servicenumber "|" rectype "|" recclass] = oldcost
			next
		}
		if ( recclass == "CALL_DISCOUNT" ) {
			oldcost_arr[servicenumber "|" rectype "|" recclass] = oldcost
			next
		}
		if ( recclass == "RECURRING_DISCOUNT" ) {
			oldcost_arr[servicenumber "|" rectype "|" recclass] = oldcost
			next
		}
		if ( recclass == "ADJUSTMENT" ) {
			oldcost_arr[servicenumber "|" rectype "|" recclass] = oldcost
			next
		}
		if ( recclass == "RECURRING" ) {
			oldcost_arr[servicenumber "|" rectype "|" recclass] = oldcost
			next
		}
		if ( recclass == "INTERNET" ) {
			oldcost_arr[servicenumber "|" rectype "|" recclass] = oldcost
			next
		}
		if ( recclass == "TOTAL" ) {
			oldcost_arr[servicenumber "|" rectype "|" recclass] = oldcost
			next			# bill total will be redone
		}
	}

	init_servicenumber(servicenumber)

	kbytes = 0
	internet = 0
	match(btxt_dialled,/[0-9]+[kK][bB]/)
	if ( RSTART > 0 ) {
		internet = 1
		internet_arr[servicenumber] = 1
		++internet_count_arr[servicenumber]
		kbytes = 0 + substr(btxt_dialled,RSTART,RLENGTH - 2)
		internet_kbytes_arr[servicenumber] += kbytes
	}

	carriercode = mobile_to_carriercode_arr[servicenumber]
	dataplan = mobile_to_dataplan_arr[servicenumber]
	chargecat = carriercode_rectype_chargeclass_to_chargecat[carriercode "|" rectype "|" recclass]
	globalroaming = carriercode_rectype_chargeclass_to_globalroaming[carriercode "|" rectype "|" recclass]


#310|Mobile Commerce|3|o|CDR|HOR-F||
#308|Mobile International|3|o|CDR|XX||
#313|Mobile Messaging|3|o|CDR|F-SMC||
#316|Mobile National|3|o|CDR|MOBCL M S||
#312|Mobile Onnet|3|o|CDR|YY||
#301|Mobile Call|3|o|CHARGE_DESC|CALL||
#302|Mobile Other|3|o|CHARGE_DESC|OTHER||
#300|Mobile Rent|3|o|CHARGE_DESC|RENT||
#304|Mobile Adjustment|3|o|CHARGE_DESC_INFO|ADJUSTMENT||
#305|Mobile Call Discount|3|o|CHARGE_DESC_INFO|CALL_DISCOUNT||
#306|Mobile Call Total|3|o|CHARGE_DESC_INFO|CALL_TOTAL||
#303|Mobile Recurring|3|o|CHARGE_DESC_INFO|RECURRING||
#307|Mobile Recurring Discount|3|o|CHARGE_DESC_INFO|RECURRING_DISCOUNT||
#383|Mobile Other|5|t|CDR|OTHC||

	if ( rectype == "CDR" ) {

		# rjs 11/1/10 SMSMO cost is in F-SMS call summary
		if ( recclass == "SMSMO" ) {
			newoutrec()
			next
		}

		newcost = recalc_cdr_cost()
		print "recalcmob: mobile=[" servicenumber "]" "  dataplan=[" dataplan "]" "  old=" costinclgst "  new=" newcost

		#VolumeMB = ""
		#if ( internet == 1 )
		#	VolumeMB = sprintf("%0.5f", (kbytes / 1024))
		#btxt_origin = btxt_origin " (" VolumeMB "/" costinclgst "/" dataplan ":" newcost  ")"

		if ( internet == 1 ) {	# redo data totals
			internet_charges_arr[servicenumber] += newcost
		}
		else {			# redo call charges
			# call total not incl. discount must be calculated
			if ( costinclgst >= 0 ) {	# cost is not negative
				calltotal_arr[servicenumber] += newcost
			}
			else {				# cost is negative
				call_discount_arr[servicenumber] += newcost
			}

			# add cdr call count
			++callcounttotal_arr[servicenumber]
		}

	}

	newoutrec()
}


END {
	for ( servicenumber in servicenumber_arr ) {
		finish_mobile(servicenumber)
	}

	#------------------------------------
	# Bill Total
	# total cost / account number / invoice number
	servicenumber = "ALL"
	rectype = "CHARGE_DESC_INFO"
	recclass = "TOTAL"
	sdate_str = bill_total_to
	btxt_stime_str = ""
	btxt_origin = bill_total_account_number
	btxt_destination = "Total Cost"
	btxt_dialled = total_from_to
	btxt_rate = bill_total_invoice_number
	dursecs = bill_callcounttotal
	oldcost = oldcost_arr[servicenumber "|" rectype "|" recclass]
	newcost = costinclgst
	newoutrec()
}