# 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() }