/** * @see Billrun_Plugin_Interface_IParser::parseData */ public function parseData($type, $line, Billrun_Parser &$parser) { if ($type != $this->getName()) { return FALSE; } $data = array(); $offset = 0; $data['record_length'] = $this->parseField(substr($line, $offset, 2), array('decimal' => 2)); $offset += 2; $data['record_type'] = $this->parseField(substr($line, $offset, 1), array('bcd_encode' => 1)); $offset += 1; //Billrun_Factory::log()->log("Record_type : {$data['record_type']}",Zend_log::DEBUG); if (isset($this->nsnConfig[$data['record_type']])) { foreach ($this->nsnConfig[$data['record_type']] as $key => $fieldDesc) { if ($fieldDesc) { if (isset($this->nsnConfig['fields'][$fieldDesc])) { $length = intval(current($this->nsnConfig['fields'][$fieldDesc]), 10); $data[$key] = $this->parseField(substr($line, $offset, $length), $this->nsnConfig['fields'][$fieldDesc]); /* if($data['record_type'] == "12") {//DEBUG... Billrun_Factory::log()->log("Data $key : {$data[$key]} , offset: ". dechex($offset),Zend_log::DEBUG); } */ $offset += $length; } else { throw new Exception("Nsn:parse - Couldn't find field: {$fieldDesc} "); } } } $data['urt'] = new MongoDate(Billrun_Util::dateTimeConvertShortToIso((string) (isset($data['charging_start_time']) && $data['charging_start_time'] ? $data['charging_start_time'] : $data['call_reference_time']), date("P", strtotime($data['call_reference_time'])))); } //Use the actual charing time duration instead of the duration that was set by the switch if (isset($data['duration'])) { $data['org_dur'] = $data['duration']; // save the original duration. } if (isset($data['charging_end_time']) && isset($data['charging_start_time']) && (strtotime($data['charging_end_time']) > 0 && strtotime($data['charging_start_time']) > 0)) { $data['duration'] = strtotime($data['charging_end_time']) - strtotime($data['charging_start_time']); } //Remove the "10" in front of the national call with an international prefix // if (isset($data['in_circuit_group_name']) && preg_match("/^RCEL/", $data['in_circuit_group_name']) && strlen($data['called_number']) > 10 && substr($data['called_number'], 0, 2) == "10") { // will fail when in_circuit_group_name is empty / called_number length is exactly 10 if (isset($data['out_circuit_group']) && in_array($data['out_circuit_group'], array('2100', '2101', '2499')) && substr($data['called_number'], 0, 2) == "10") { $data['called_number'] = substr($data['called_number'], 2); } else { if (in_array($data['record_type'], array('30', '31')) && preg_match($this->ild_called_number_regex, $data['called_number'])) { $data['ild_prefix'] = substr($data['called_number'], 0, 3); $data['called_number'] = substr($data['called_number'], 3); } } $parser->setLastParseLength($data['record_length']); //@TODO add unifiom field translation. ('record_opening_time',etc...) return isset($this->nsnConfig[$data['record_type']]) ? $data : false; }
/** * @see Billrun_Plugin_Interface_IParser::parseData */ public function parseData($type, $data, \Billrun_Parser &$parser) { if ($this->getName() != $type) { return FALSE; } $asnObject = Asn_Base::parseASNString($data); $parser->setLastParseLength($asnObject->getDataLength() + self::RECORD_PADDING); $type = $asnObject->getType(); $cdrLine = false; if (isset($this->ggsnConfig[$type])) { $cdrLine = $this->getASNDataByConfig($asnObject, $this->ggsnConfig[$type], $this->ggsnConfig['fields']); if ($cdrLine && !isset($cdrLine['record_type'])) { $cdrLine['record_type'] = $type; } //convert to unified time GMT time. $timeOffset = isset($cdrLine['ms_timezone']) ? $cdrLine['ms_timezone'] : date('P'); $cdrLine['urt'] = new MongoDate(Billrun_Util::dateTimeConvertShortToIso($cdrLine['record_opening_time'], $timeOffset)); if (is_array($cdrLine['rating_group'])) { $fbc_uplink_volume = $fbc_downlink_volume = 0; $cdrLine['org_fbc_uplink_volume'] = $cdrLine['fbc_uplink_volume']; $cdrLine['org_fbc_downlink_volume'] = $cdrLine['fbc_downlink_volume']; $cdrLine['org_rating_group'] = $cdrLine['rating_group']; foreach ($cdrLine['rating_group'] as $key => $rateVal) { if (isset($this->ggsnConfig['rating_groups'][$rateVal])) { $fbc_uplink_volume += $cdrLine['fbc_uplink_volume'][$key]; $fbc_downlink_volume += $cdrLine['fbc_downlink_volume'][$key]; } } $cdrLine['fbc_uplink_volume'] = $fbc_uplink_volume; $cdrLine['fbc_downlink_volume'] = $fbc_downlink_volume; $cdrLine['rating_group'] = 0; } else { if ($cdrLine['rating_group'] == 10) { return false; } } } else { Billrun_Factory::log()->log("couldn't find definition for {$type}", Zend_Log::INFO); } //Billrun_Factory::log()->log($asnObject->getType() . " : " . print_r($cdrLine,1) , Zend_Log::DEBUG); return $cdrLine; }