Exemple #1
0
 /**
  * @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;
 }
Exemple #2
0
 /**
  * @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;
 }