# # ITSV GmbH # CCDB - Command and Control Database # # FILE: dquermfile_loadCuCCCallStat.txt # DESCRIPTION: DQUERY definition for CCDB DQUERY "loadCuCCCallStat" # @querytitle CuCC Statistiken aus managed File nach CCSERVSTAT laden @querydescription lädt CuCC-Anruf-Statistiken (MS,WS) @group SVCLSLSTATSTAT @attributenames mfileid:cucccallstatmfileid,filedatatype:string @querytype function @function seqtrans.seqtrans @input_mode MFILE @resultobject_options.expandall true @debug false @init.aexpression proc: { if (!this.protocol) this.protocol = new Array(); if (!this.connectionBundle) { this.connectionBundle = new db.ConnectionBundle(); } this.cucc = require("./cucc.js")(logger,"seqtrans_tsteps_loadCuCCCallStat",prefs); this.ccservstat_insert_sql = "insert into CCSERVSTAT(accPeriodType,datum,eventCategory,eventNumber,eventTime,eventType,eventUnit,jahr,kw,loadMfileId,monat,serviceName,tag) "+ "values(::accPeriodType::,::datum::,::eventCategory::,::eventNumber::,::eventTime::,::eventType::,::eventUnit::,::jahr::,::kw::,::loadMfileId::,::monat::,::serviceName::,::tag::)"; this.ccservstat_insert_sqlparams = "accPeriodType,datum,eventCategory,eventNumber,eventTime,eventType,eventUnit,jahr,kw,loadMfileId,monat,serviceName,tag"; switch (this.query.filedatatype) { case "Call": case "Email": case "Cat": break; default: this.errcoll.collect(null,"Illegal filedatatype \""+this.query.filedatatype+"\"",this.query); break proc; } this.filedatatype = this.query.filedatatype; this.filedatatypes = { Call: { file_columns: [ "Datum","Ankommend","Angenommen","Verloren","VerlorenKl10","AngenommenImSL", "durchGSZ","maxGSZ","GSZgesamt","durchWarteZeit","maxWarteZeit","handledCallRate", "serviceLevel","durchNBZ","NBZgesamt" ], startline: 6, endexpression: "((typeof(lba[0])==\"string\") && (lba[0].startsWith(\"Total:\")))", headersInFirstLine: false }, Email: { file_columns: [ "Datum","Ankommend","AngenommenImSL","serviceLevel" ], startline: 8, endexpression: "((typeof(lba[0])==\"string\") && (lba[0].startsWith(\"Summe:\")))", headersInFirstLine: false }, Cat: { file_columns: [ "Kategorietext","Anzahl" ], startline: 9, endexpression: null, headersInFirstLine: false } }; this.filetypecontrols = this.filedatatypes[this.filedatatype]; this.input_options = this.input_options || {}; this.input_options.startline = this.filetypecontrols.startline; this.input_options.colnames = this.filetypecontrols.file_columns.join(","); this.input_options.endexpression = this.filetypecontrols.endexpression; this.input_options.headersInFirstLine = this.filetypecontrols.headersInFirstLine; this.cucc.loadCategoryTree(this,this); } @setup.qexpression this.ppush([this.phead("setup"),"query","input_option",aux.objTxt(this.query.input_options,99,999999)]); this.ppush([this.phead("setup"),"mfileinfo",aux.objTxt(this.mfileinfo)]); proc: { this.gld = { mfileid: this.mfileinfo.mfileid }; this.mfileattributes = this.mfileinfo.mfileattributes; if (!this.mfileattributes.state) { this.errcoll.collect(null,"Error in loadCuCCStatRecord: mfile has no valid state attribute",this.mfileinfo); break proc; } if (this.mfileattributes.state!="to_load") { logger.error("Error in loadCuCCStatRecord: mfile attribute \"state\" should be \"to_load\", but is \""+this.mfileattributes.state+"\""); this.errcoll.collect(null,"Error in loadCuCCStatRecord: mfile attribute \"state\" should be \"to_load\", but is \""+this.mfileattributes.state+"\"",this.mfileinfo); break proc; } this.nfs = this.mfileinfo.mfilename.split("_"); if (this.nfs.length<4) { this.errcoll.collect(null,"Error in loadCuCCCallStat: mfilename has less than 4 fields",this.mfileinfo); break proc; } this.ppush([this.phead("loadCuCCCallStat.setup"),"","nfs",aux.objTxt(this.nfs)]); switch (this.nfs[0]) { case "WS": if (this.nfs.length<5) { this.errcoll.collect(null,"Error in loadCuCCCallStat: acc period is weekly but too few fields in filename",this.mfileinfo); break proc; } this.gld.accpertype = "weekly"; this.gld.jahr = this.nfs[3]; if (!this.nfs[4]) { this.errcoll.collect(null,"Error in loadCuCCStatRecord: acc period is weekly but week field is not given",this.mfileinfo); break proc; } if (!this.nfs[4].startsWith("KW")) { this.errcoll.collect(null,"Error in loadCuCCCallStat: acc period is weekly but week field does not start with KW",this.mfileinfo); break proc; } this.gld.monat = null; this.gld.kw = this.nfs[4].substr(2,2); break; case "MS": this.gld.accpertype = "monthly"; this.gld.accper = this.nfs[3].split("."); this.gld.jahr = this.gld.accper[0]; this.gld.monat = this.gld.accper[1]; this.gld.kw = null; break; default: this.errcoll.collect(null,"Error in loadCuCCCallStat: illegal accounting period marker '"+this.nfs[0]+"'",this.mfileinfo); break proc; } this.ppush([this.phead("loadCuCCCallStat.setup"),"","gld",aux.objTxt(this.gld)]); this.gld.service = this.nfs[2]; if (this.gld.service=="SV-Clearing") this.gld.service = "SV-Clearingsystem"; this.gld.eventtype = this.nfs[1]; if (this.gld.eventtype=="Mails") this.gld.eventtype = "Email"; this.load_options = { info: "dummy load options as base for missing_categories", missing_categories: null}; this.ppush([this.phead("setup"),"","load_options",aux.objTxt(this.load_options)]); } @final.aexpression this.ppush([this.phead("final"),"aexpression","load_options",aux.objTxt(this.load_options)]); this.result = new aux.Result({resulttype: 'object', resultobject: { messages: new Array(), protocol: this.protocol}}); this.mfileattributes.state = "loaded"; mfile.setMfileAttributes(this.mfileinfo.mfileid,this.mfileattributes, function(err,result) { if (err) { this.errcoll.collect(err,"Error setting loaded MFILE attribute state to \"loaded\"",result); return; } this.result.resultobject.messages.push("set state of MFILE "+this.mfileinfo.mfileid+" to \"loaded\""); if (this.load_options.missing_categories) { this.cucc.saveMissingCategories(this,this.load_options.missing_categories, function(err,result) { if (err) { this.errcoll.collect(err,"Error saving missing categories",result); return; } this.result.resultobject.messages.push("Saved missing categories"); this.result.resultobject.misscatsaveres = result; this(); }.bind(this)); } else { this(); } }.bind(this)); ~query.tsteps # # loadCuCCCallStat_tsteps # # this sequence of tsteps will be invoked for each record in the input dataset for loading CuCC call statistics data files # CuCC call statistics datafiles are either monthly or weekly statistic files # each record contains 13 counters for one day in the time period # # # # <>: # qexpression this.recordinfo = { mfileinfo: this.mfileinfo, filedatatype: this.filedatatype, recnum: this.recnum, cdata: this.cdata, input_options: this.input_options }; this.ppush([this.phead("recnum="),"","",this.recnum]); # # <>: determine appropriate sequence from filedatatype # if (this.filedatatype=='Call') goto create_Call_records # # <>: # if (this.filedatatype=='Email') goto create_Email_records # # <>: # if (this.filedatatype=='Cat') goto create_Cat_records # # <>: if we came here, there's an error in the file data type # qexpression this.errcoll.collect(null,"Error in loadCuCCCallStat: illegal file data type \""+this.filedatatype+"\"",this.gld); # # <>: create_Call_records: create the CCSERVSTAT records for one cucccallstat record, prepare common fields # create_Call_records: qexpression this.ppush([this.phead("Call_records"),"","CDATA",aux.objTxt(this.cdata)]); this.idata = aux.deepCopy(this.cdata); this.idata.handledCallRate = aux.parseDimensionedNumber(this.idata.handledCallRate); this.idata.serviceLevel = aux.parseDimensionedNumber(this.idata.serviceLevel); this.cdata = {}; this.cdata.serviceName = this.gld.service; this.cdata.accPeriodType = this.gld.accpertype; this.cdata.loadMfileId = this.gld.mfileid; this.cdata.jahr = this.gld.jahr; this.cdata.monat = this.gld.monat; this.cdata.kw = this.gld.kw; this.cdata.tag = 0; this.cdata.eventType = this.gld.eventtype; this.cdata.datum = this.idata.Datum; this.cdata.eventCategory = ""; this.cdata.eventUnit = ""; this.cdata.eventNumber = null; this.cdata.eventTime = null; # # <>: create "Ankommend" # pre_qexpression this.cdata.eventCategory = "Ankommend"; this.cdata.eventUnit = "Anrufe"; this.cdata.eventNumber = this.idata.Ankommend; this.cdata.eventTime = null; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "Angenommen" # pre_qexpression this.cdata.eventCategory = "Angenommen"; this.cdata.eventUnit = "Anrufe"; this.cdata.eventNumber = this.idata.Angenommen; this.cdata.eventTime = null; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "Verloren" # pre_qexpression this.cdata.eventCategory = "Verloren"; this.cdata.eventUnit = "Anrufe"; this.cdata.eventNumber = this.idata.Verloren; this.cdata.eventTime = null; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "VerlorenKl10" # pre_qexpression this.cdata.eventCategory = "VerlorenKl10"; this.cdata.eventUnit = "Anrufe"; this.cdata.eventNumber = this.idata.VerlorenKl10; this.cdata.eventTime = null; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "AngenommenImSL" # pre_qexpression this.cdata.eventCategory = "AngenommenImSL"; this.cdata.eventUnit = "Anrufe"; this.cdata.eventNumber = this.idata.AngenommenImSL; this.cdata.eventTime = null; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "durchGSZ" # pre_qexpression this.cdata.eventCategory = "durchGSZ"; this.cdata.eventUnit = "Zeit"; this.cdata.eventNumber = null; this.cdata.eventTime = this.idata.durchGSZ; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "maxGSZ" # pre_qexpression this.cdata.eventCategory = "maxGSZ"; this.cdata.eventUnit = "Zeit"; this.cdata.eventNumber = null; this.cdata.eventTime = this.idata.maxGSZ; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "durchWarteZeit" # pre_qexpression this.cdata.eventCategory = "durchWarteZeit"; this.cdata.eventUnit = "Zeit"; this.cdata.eventNumber = null; this.cdata.eventTime = this.idata.durchWarteZeit; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "maxWarteZeit" # pre_qexpression this.cdata.eventCategory = "maxWarteZeit"; this.cdata.eventUnit = "Zeit"; this.cdata.eventNumber = null; this.cdata.eventTime = this.idata.maxWarteZeit; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "handledCallRate" # pre_qexpression this.cdata.eventCategory = "handledCallRate"; this.cdata.eventUnit = "Ratio"; this.cdata.eventNumber = this.idata.handledCallRate; this.cdata.eventTime = null; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "serviceLevel" # pre_qexpression this.cdata.eventCategory = "serviceLevel"; this.cdata.eventUnit = "Ratio"; this.cdata.eventNumber = this.idata.serviceLevel; this.cdata.eventTime = null; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "durchNBZ" # pre_qexpression this.cdata.eventCategory = "durchNBZ"; this.cdata.eventUnit = "Zeit"; this.cdata.eventNumber = null; this.cdata.eventTime = this.idata.durchNBZ; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "NBZgesamt" # pre_qexpression this.cdata.eventCategory = "NBZgesamt"; this.cdata.eventUnit = "Zeit"; this.cdata.eventNumber = null; this.cdata.eventTime = this.idata.NBZgesamt; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: all callstat fields processed # end # # <>: create_Email_records: create the CCSERVSTAT records for one cuccemailstat record, prepare common fields # label create_Email_records qexpression this.idata = aux.deepCopy(this.cdata); this.cdata = {}; this.idata.serviceLevel = aux.parseDimensionedNumber(this.idata.serviceLevel); this.cdata.serviceName = this.gld.service; this.cdata.accPeriodType = this.gld.accpertype; this.cdata.loadMfileId = this.gld.mfileid; this.cdata.jahr = this.gld.jahr; this.cdata.monat = this.gld.monat; this.cdata.kw = this.gld.kw; this.cdata.tag = null; this.cdata.eventType = this.gld.eventtype; this.cdata.datum = this.idata.Datum; this.cdata.eventCategory = ""; this.cdata.eventUnit = ""; this.cdata.eventNumber = null; this.cdata.eventTime = null; # # <>: create "Eingegangen" # pre_qexpression this.cdata.eventCategory = "Eingegangen"; this.cdata.eventUnit = "Emails"; this.cdata.eventNumber = this.idata.Eingegangen; this.cdata.eventTime = null; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "BearbeitetImSL" # pre_qexpression this.cdata.eventCategory = "BearbeitetImSL"; this.cdata.eventUnit = "Emails"; this.cdata.eventNumber = this.idata.BearbeitetImSL; this.cdata.eventTime = null; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ # # <>: create "ServiceLevel" # pre_qexpression this.cdata.eventCategory = "ServiceLevel"; this.cdata.eventUnit = "ServiceLevel"; this.cdata.eventNumber = this.idata.ServiceLevel; this.cdata.eventTime = null; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ end # # <>: create_Cat_records: create the CCSERVSTAT records for one cuccCat record, prepare common fields # label create_Cat_records qexpression this.idata = aux.deepCopy(this.cdata); this.cdata = {}; this.cdata.serviceName = this.gld.service; this.cdata.accPeriodType = this.gld.accpretype; this.cdata.loadMfileId = this.gld.mfileid; this.cdata.jahr = this.gld.jahr; this.cdata.monat = this.gld.monat; this.cdata.kw = this.gld.kw; this.cdata.tag = null; this.cdata.eventType = this.gld.eventtype; this.cdata.datum = this.idata.Datum; this.cdata.eventCategory = ""; this.cdata.eventUnit = ""; this.cdata.eventNumber = null; this.cdata.eventTime = null; # # <>: create "Anzahl" # pre_qexpression this.cdata.eventCategory = this.cucc.categorizeCatText(this,this.idata.Kategorietext); this.cdata.eventUnit = "AnzahlKontakte"; this.cdata.eventNumber = this.idata.Anzahl; this.cdata.eventTime = null; sql @@ccservstat_insert_sql@@ sqlparams @@ccservstat_insert_sqlparams@@ end