Exemple #1
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;
    }