Beispiel #1
0
    function normalize($save="",$table="") {
        if (!$table) $table = $this->CDRS->table;

        if ($this->CDRS->CSCODE && $CarrierInfo = $this->CDRS->CDRTool['normalize']['CS_CODES'][$this->CDRS->CSCODE]) {
            // We found a carrier so we set the BillingId
            $this->BillingId          = $CarrierInfo[BillingPartyId];
        }

        if ($save) {

            if (!$this->id) {
                return 0;
            }

            $query  ="";
            $query1 ="";
            $query2 ="";

            if ($this->CDRS->normalizedField) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s='1' ",addslashes($this->CDRS->normalizedField));
                $mongo_field = array_search($this->CDRS->normalizedField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = 1;
            }

            if ($this->CDRS->BillingPartyIdField && $this->BillingPartyId) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->BillingPartyIdField),addslashes($this->BillingPartyId));
                $mongo_field = array_search($this->CDRS->BillingPartyIdField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->BillingPartyId;
            }

            if (strlen($this->durationNormalized) && $this->durationNormalized != $this->duration) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s ='%s' ",addslashes($this->CDRS->durationField),addslashes($this->durationNormalized));
                $this->duration=$this->durationNormalized;
                $mongo_field = array_search($this->CDRS->durationField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = intval($this->durationNormalized);
            } else {
                $mongo_field = array_search($this->CDRS->durationField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = intval($this->duration);
            }

            if ($this->CDRS->DestinationIdField) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->DestinationIdField),addslashes($this->DestinationId));
                $mongo_field = array_search($this->CDRS->DestinationIdField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->DestinationId;
            }

            if ($this->CDRS->ResellerIdField) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->ResellerIdField),addslashes($this->ResellerId));
                $mongo_field = array_search($this->CDRS->ResellerIdField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->ResellerId;
            }

            if ($this->usernameNormalized && $this->usernameNormalized!=$this->username) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->usernameField),addslashes($this->usernameNormalized));
                $mongo_field = array_search($this->CDRS->usernameField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->usernameNormalized;
            }

            if ($this->aNumberNormalized && $this->aNumberNormalized!=$this->aNumber) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->aNumberField),addslashes($this->aNumberNormalized));
                $this->aNumber=$this->aNumberNormalized;
                $mongo_field = array_search($this->CDRS->aNumberField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->aNumberNormalized;
            }

            if ($this->CDRS->applicationField && $this->applicationNormalized) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->applicationField), addslashes($this->applicationNormalized));
                $this->application=$this->applicationNormalized;
                $mongo_field = array_search($this->CDRS->applicationField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->applicationNormalized;
            }

            if ($this->CDRS->flowField && $this->flow) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->flowField),addslashes($this->flow));
                $mongo_field = array_search($this->CDRS->flowField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->flow;
            }

            if ($this->domainNormalized && $this->domainNormalized != $this->domain) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->domainField),addslashes($this->domainNormalized));
                $this->domainNumber=$this->domainNormalized;
                $this->domain=$this->domainNormalized;
                $mongo_field = array_search($this->CDRS->domainField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->domainNormalized;
            }

            if ($this->cNumberNormalized && $this->cNumberNormalized!=$this->cNumber) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->cNumberField),addslashes($this->cNumberNormalized));
                $this->cNumber=$this->cNumberNormalized;
                $mongo_field = array_search($this->CDRS->cNumberField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->cNumberNormalized;
            }

            if ($this->CDRS->BillingIdField && $this->BillingId) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->BillingIdField),addslashes($this->BillingId));
                $mongo_field = array_search($this->CDRS->BillingIdField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->BillingId;
            }

            if ($this->CDRS->RemoteAddressField && $this->RemoteAddressNormalized && $this->RemoteAddressNormalized!= $this->RemoteAddress) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->RemoteAddressField),addslashes($this->RemoteAddressNormalized));
                $mongo_field = array_search($this->CDRS->RemoteAddressField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->RemoteAddressNormalized;
            }

            if ($this->CDRS->CanonicalURIField && $this->CanonicalURINormalized && $this->CanonicalURINormalized!= $this->CanonicalURI) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->CanonicalURIField),addslashes($this->CanonicalURINormalized));
                $mongo_field = array_search($this->CDRS->CanonicalURIField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->CanonicalURINormalized;
            }

            if ($this->stopTimeNormalized) {
                if ($updatedFields) $query .= ", ";
                $updatedFields++;
                $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->stopTimeField),addslashes($this->stopTimeNormalized));
                $mongo_field = array_search($this->CDRS->stopTimeField, $this->CDRS->CDRFields);
                $this->mongo_cdr[$mongo_field] = $this->stopTimeNormalized;
            }

            if ($this->CDRS->ratingEnabled && ($this->duration || $this->application == 'message')) {

                if ($this->DestinationId) {
                    $Rate    = new Rate($this->CDRS->rating_settings, $this->CDRS->cdrtool);

                    if ($this->application == 'message') {
                        $RateDictionary=array(
                                              'callId'          => $this->callId,
                                              'timestamp'       => $this->timestamp,
                                              'duration'        => $this->duration,
                                              'DestinationId'   => $this->DestinationId,
                                              'BillingPartyId'  => $this->BillingPartyId,
                                              'ResellerId'      => $this->ResellerId,
                                              'domain'          => $this->domain,
                                              'gateway'         => $this->gateway,
                                              'RatingTables'    => $this->CDRS->RatingTables,
                                              'aNumber'         => $this->aNumber,
                                              'cNumber'         => $this->cNumber
                                              );

                        $Rate->calculateMessage($RateDictionary);
                    } else {
                        $RateDictionary=array(
                                              'callId'          => $this->callId,
                                              'timestamp'       => $this->timestamp,
                                              'duration'        => $this->duration,
                                              'DestinationId'   => $this->DestinationId,
                                              'inputTraffic'    => $this->inputTraffic,
                                              'outputTraffic'   => $this->outputTraffic,
                                              'BillingPartyId'  => $this->BillingPartyId,
                                              'ResellerId'      => $this->ResellerId,
                                              'domain'          => $this->domain,
                                              'gateway'         => $this->gateway,
                                              'RatingTables'    => $this->CDRS->RatingTables,
                                              'aNumber'         => $this->aNumber,
                                              'cNumber'         => $this->cNumber,
                                              'ENUMtld'         => $this->ENUMtld,
                                              'application'     => $this->application
                                              );

                        $Rate->calculateAudio($RateDictionary);
                    }

                    $this->pricePrint   = $Rate->pricePrint;
                    $this->price        = $Rate->price;
                    $this->rateInfo     = $Rate->rateInfo;
                    $this->rateDuration = $Rate->duration;

                    if ($Rate->broken_rate) {
                        $this->broken_rate=true;
                    }
                } else {
                    $this->rateInfo='';
                    $this->pricePrint='';
                    $this->price='';
                }

                if ($this->CDRS->priceField) {
                    if ($updatedFields) $query .= ", ";
                    $updatedFields++;
                    $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->priceField),addslashes($this->pricePrint));
                    $mongo_field = array_search($this->CDRS->priceField, $this->CDRS->CDRFields);
                    $this->mongo_cdr[$mongo_field] = floatval($this->pricePrint);

                    if ($this->CDRS->rateField ) {
                        if ($updatedFields) $query .= ", ";
                        $updatedFields++;
                        $query.=sprintf(" %s = '%s' ",addslashes($this->CDRS->rateField),addslashes($this->rateInfo));
                        $mongo_field = array_search($this->CDRS->rateField, $this->CDRS->CDRFields);
                        $this->mongo_cdr[$mongo_field] = $this->rateInfo;
                    }
                }
            }

            $query1 = sprintf("update %s set %s where %s = '%s'",addslashes($table),$query,addslashes($this->idField),addslashes($this->id));
            dprint($query1);

            #TODO remove me, I am used to temporary sync mysql data with mongo data
            if ($this->CDRS->mongo_table) {
                $mongo_field = array_search($this->idField, $this->CDRS->CDRFields);
                try {
                    $this->CDRS->mongo_table->update(array($mongo_field => $this->id), $this->mongo_cdr, array("upsert" => true));
                } catch (MongoException $e) {
                    printf("Caught Mongo exception: %s", $e->getMessage());
                } catch (Exception $e) {
                    printf("Caught exception: %s", $e->getMessage());
                }
            }

            if ($updatedFields) {
                if ($this->CDRS->CDRdb1->query($query1)) {
                    if ($this->CDRS->CDRdb1->affected_rows()) {
                        if ( $this->isBillingPartyLocal() && $table == "radacct".date('Ym')) {
                                // cache usage only if current month

                                $_traffic=($this->inputTraffic+$this->outputTraffic)/2;
                                $_usage=array('calls'    => 1,
                                              'duration' => $this->duration,
                                              'cost'     => $this->price,
                                              'cost_today' => $this->price,
                                              'traffic'  => $_traffic
                                             );

                                $this->cacheQuotaUsage($_usage);
                        }

                    } else {

                        if (preg_match("/^(\w+)(\d{4})(\d{2})$/",$table,$m)) {
                            $previousTable=$m[1].date('Ym', mktime(0, 0, 0, $m[3]-1, "01", $m[2]));
                            $query2 = sprintf("update %s set %s where %s = '%s'",addslashes($previousTable),$query,addslashes($this->idField),addslashes($this->id));

                            if ($this->CDRS->CDRdb1->query($query2)) {
                                if ($this->CDRS->CDRdb1->affected_rows()) {
                                    if ( $this->isBillingPartyLocal() && $previousTable == "radacct".date('Ym')) {
                                            // cache usage only if current month

                                            $_traffic=($this->inputTraffic+$this->outputTraffic)/2;
                                            $_usage=array('calls'    => 1,
                                                          'duration' => $this->duration,
                                                          'cost'     => $this->price,
                                                          'cost_today' => $this->price,
                                                          'traffic'  => $_traffic
                                                          );
                                            $this->cacheQuotaUsage($_usage);
                                    }
                                }
                            } else {
                                $log=sprintf ("Database error: %s (%s)",$this->CDRS->CDRdb1->Error,$this->CDRS->CDRdb1->Errno);
                                syslog(LOG_NOTICE, $log);
                                print($log);
                                return 0;
                            }

                        }

                    }

                    return 1;
                } else {
                    $log=sprintf ("Database error for query %s: %s (%s)",$query1,$this->CDRS->CDRdb1->Error,$this->CDRS->CDRdb1->Errno);
                    syslog(LOG_NOTICE, $log);
                    print($log);
                    return 0;
                }
            }

        } else {
            if ($this->CDRS->BillingPartyIdField && $CarrierInfo['BillingPartyId']) {
                $this->domain = $CarrierInfo['BillingDomain'];
            }

            if ($this->usernameNormalized && $this->usernameNormalized!=$this->username) {
                $this->username=$this->usernameNormalized;
            }

            if ($this->aNumberNormalized && $this->aNumberNormalized!=$this->aNumber) {
                $this->aNumber=$this->aNumberNormalized;
            }

            if ($this->domainNormalized && $this->domainNormalized != $this->domain) {
                $this->domainNumber=$this->domainNormalized;
            }

            if ($this->cNumberNormalized && $this->cNumberNormalized!=$this->cNumber) {
                $this->cNumber=$this->cNumberNormalized;
            }

            if ($this->CDRS->RemoteAddressField && $this->RemoteAddressNormalized && $this->RemoteAddressNormalized!= $this->RemoteAddress) {
                $this->RemoteAddress=$this->RemoteAddressNormalized;
            }
        }
        return 1;
    }
Beispiel #2
0
    function getActivePrepaidSessions($active_sessions, $current_balance, $BillingPartyId, $exceptSessions=array()) {
        $this->parallel_calls=array();
        $this->remaining_balance=$current_balance;

        $ongoing_rates=array();

        foreach (array_keys($active_sessions) as $_session) {
            if (in_array($_session,$exceptSessions)) {
                /*
                $log = sprintf ("Ongoing prepaid session %s for %s updated",
                $_session,
                $BillingPartyId
                );
                syslog(LOG_NOTICE, $log);
                */
                continue;
            }

            $Rate_session = new Rate($this->settings, $this->db);

            $passed_time=time()-$active_sessions[$_session]['timestamp'];

            $active_sessions[$_session]['passed_time']=$passed_time;

            $RateDictionary_session=array(
                                  'duration'        => $passed_time,
                                  'callId'          => $_session,
                                  'timestamp'       => $active_sessions[$_session]['timestamp'],
                                  'DestinationId'   => $active_sessions[$_session]['DestinationId'],
                                  'region'          => $active_sessions[$_session]['region'],
                                  'domain'          => $active_sessions[$_session]['domain'],
                                  'BillingPartyId'  => $active_sessions[$_session]['BillingPartyId'],
                                  'ENUMtld'         => $active_sessions[$_session]['ENUMtld'],
                                  'RatingTables'    => $this->CDRS->RatingTables
                                  );

            $Rate_session->calculateAudio($RateDictionary_session);

            $log = sprintf ("Active sessions %s for %s to %s: duration=%s, price=%s ",
            $_session,
            $BillingPartyId,
            $active_sessions[$_session]['Destination'],
            $passed_time,
            $Rate_session->price
            );
            syslog(LOG_NOTICE, $log);

            $ongoing_rates[$_session] = array(
                                               'duration'    => $passed_time,
                                               'price'       => $Rate_session->price
                                              );
        }

        if (count($ongoing_rates)) {
            // calculate the virtual balance of the user at this moment in time
            $due_balance=0;
            foreach (array_keys($ongoing_rates) as $_o) {
                $due_balance = $due_balance + $ongoing_rates[$_o]['price'];
            }

            $this->remaining_balance = $this->remaining_balance-$due_balance;

            $log = sprintf ("Balance for %s having %d active sessions: database=%s, due=%s, real=%s",$BillingPartyId,count($ongoing_rates),sprintf("%0.4f",$current_balance),sprintf("%0.4f",$due_balance),sprintf("%0.4f",$this->remaining_balance));
            syslog(LOG_NOTICE, $log);
        }

        foreach (array_keys($active_sessions) as $_session) {
            if (in_array($_session,$exceptSessions)) {
                continue;
            }

            $RateDictionary_session=array(
                                  'callId'          => $_session,
                                  'timestamp'       => time(),
                                  'Balance'         => $this->remaining_balance,
                                  'DestinationId'   => $active_sessions[$_session]['DestinationId'],
                                  'region'          => $active_sessions[$_session]['region'],
                                  'domain'          => $active_sessions[$_session]['domain'],
                                  'BillingPartyId'  => $active_sessions[$_session]['BillingPartyId'],
                                  'ENUMtld'         => $active_sessions[$_session]['ENUMtld'],
                                  'RatingTables'    => $this->CDRS->RatingTables,
                                  'skipConnectCost' => true
                                  );

            if ($active_sessions[$_session]['duration']) {
                $RateDictionary_session['duration'] = $active_sessions[$_session]['duration']-$active_sessions[$_session]['passed_time'];
            }

            $Rate = new Rate($this->settings, $this->db);
            $_maxduration = round($Rate->MaxSessionTime($RateDictionary_session));

            $log = sprintf("Remaining duration for active session %s of %s to destination %s having balance=%s is %s",
            $_session,
            $BillingPartyId,
            $active_sessions[$_session]['DestinationId'],
            $this->remaining_balance,
            $_maxduration);
            syslog(LOG_NOTICE, $log);

            if ($_maxduration > 0) {
                $this->parallel_calls[$_session]=array('remainingBalancePerSecond' => $this->remaining_balance/$_maxduration);
            } else {
                /*
                $log = sprintf ("Maxduration for session %s of %s will be negative",$_session,$active_sessions[$_session]['BillingPartyId']);
                syslog(LOG_NOTICE, $log);
                */
            }
        }

        return 1;
    }