diff --git a/cmd/cgr-balancer/cgr-balanncer.go b/cmd/cgr-balancer/cgr-balanncer.go
index 4b6784586..4545111c4 100644
--- a/cmd/cgr-balancer/cgr-balanncer.go
+++ b/cmd/cgr-balancer/cgr-balanncer.go
@@ -21,9 +21,9 @@ package main
import (
"errors"
"flag"
- "github.com/rif/cgrates/sessionmanager"
- "github.com/rif/cgrates/timespans"
- "github.com/rif/cgrates/balancer"
+ "github.com/cgrates/cgrates/sessionmanager"
+ "github.com/cgrates/cgrates/timespans"
+ "github.com/cgrates/cgrates/balancer"
"log"
"runtime"
"time"
diff --git a/cmd/cgr-balancer/http_responder.go b/cmd/cgr-balancer/http_responder.go
index f4393cf7f..f015ef25d 100644
--- a/cmd/cgr-balancer/http_responder.go
+++ b/cmd/cgr-balancer/http_responder.go
@@ -19,7 +19,7 @@ package main
import (
"encoding/json"
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/timespans"
"log"
"net/http"
"strconv"
diff --git a/cmd/cgr-balancer/jsonrpc_responder.go b/cmd/cgr-balancer/jsonrpc_responder.go
index 49225cc1d..3d78395cc 100644
--- a/cmd/cgr-balancer/jsonrpc_responder.go
+++ b/cmd/cgr-balancer/jsonrpc_responder.go
@@ -19,7 +19,7 @@ package main
import (
"fmt"
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/timespans"
"log"
"net"
"net/rpc"
diff --git a/cmd/cgr-console/cgr-console.go b/cmd/cgr-console/cgr-console.go
index 149416ad8..81a631a3e 100644
--- a/cmd/cgr-console/cgr-console.go
+++ b/cmd/cgr-console/cgr-console.go
@@ -20,7 +20,7 @@ package main
import (
"flag"
"fmt"
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/timespans"
"log"
"net/rpc/jsonrpc"
"os"
diff --git a/cmd/cgr-loader/budgets.go b/cmd/cgr-loader/budgets.go
index eb2e07957..3874b7f81 100644
--- a/cmd/cgr-loader/budgets.go
+++ b/cmd/cgr-loader/budgets.go
@@ -18,9 +18,9 @@ along with this program. If not, see
package main
import (
+ "encoding/csv"
"log"
"os"
- "encoding/csv"
)
var (
diff --git a/cmd/cgr-loader/cgr-loader.go b/cmd/cgr-loader/cgr-loader.go
index 50706465e..b788ebf48 100644
--- a/cmd/cgr-loader/cgr-loader.go
+++ b/cmd/cgr-loader/cgr-loader.go
@@ -31,7 +31,8 @@ var (
weekdaysFn = flag.String("weekdays", "WeekDays.csv", "Week days file")
destinationsFn = flag.String("destinations", "Destinations.csv", "Destinations file")
ratesFn = flag.String("rates", "Rates.csv", "Rates file")
- ratestimingFn = flag.String("ratestiming", "RatesTiming.csv", "Rates timing file")
+ timingsFn = flag.String("timings", "Timings.csv", "Timings file")
+ ratestimingsFn = flag.String("ratestimings", "RatesTimings.csv", "Rates timings file")
ratingprofilesFn = flag.String("ratingprofiles", "RatingProfiles.csv", "Rating profiles file")
volumediscountsFn = flag.String("volumediscounts", "VolumeDiscounts.csv", "Volume discounts file")
volumeratesFn = flag.String("volumerates", "VolumeRates.csv", "Volume rates file")
@@ -49,7 +50,8 @@ func main() {
loadDataSeries()
loadDestinations()
loadRates()
- loadRatesTiming()
+ loadTimings()
+ loadRatesTimings()
loadRatingProfiles()
loadVolumeDicounts()
loadVolumeRates()
diff --git a/cmd/cgr-loader/helpers.go b/cmd/cgr-loader/helpers.go
index e0b3f3dd0..eb509b7f4 100644
--- a/cmd/cgr-loader/helpers.go
+++ b/cmd/cgr-loader/helpers.go
@@ -19,9 +19,9 @@ along with this program. If not, see
package main
import (
+ "github.com/cgrates/cgrates/timespans"
"log"
"strconv"
- "github.com/rif/cgrates/timespans"
)
type Rate struct {
@@ -60,27 +60,39 @@ func NewRate(destinationsTag, connectFee, price, billingUnit, weight string) (r
return
}
-type RateTiming struct {
- RatesTag, MonthsTag, MonthDaysTag, WeekDaysTag, StartTime string
+type Timing struct {
+ MonthsTag, MonthDaysTag, WeekDaysTag, StartTime string
}
-func NewRateTiming(ratesTag, monthsTag, monthDaysTag, weekDaysTag, startTime string) (rt *RateTiming) {
+func NewTiming(timeingInfo ...string) (rt *Timing) {
rt = &RateTiming{
- RatesTag: ratesTag,
- MonthsTag: monthsTag,
- MonthDaysTag: monthDaysTag,
- WeekDaysTag: weekDaysTag,
- StartTime: startTime,
+ MonthsTag: timeingInfo[0],
+ MonthDaysTag: timeingInfo[1],
+ WeekDaysTag: timeingInfo[2],
+ StartTime: timeingInfo[3],
+ }
+ return
+}
+
+type RateTiming struct {
+ RatesTag string
+ timing *Timing
+}
+
+func NewRateTiming(ratesTag string, timing *Timing) (rt *RateTiming) {
+ rt = &RateTiming{
+ RatesTag: ratesTag,
+ timing: timing,
}
return
}
func (rt *RateTiming) GetInterval(r *Rate) (i *timespans.Interval) {
i = ×pans.Interval{
- Months: timespans.Months(months[rt.MonthsTag]),
- MonthDays: timespans.MonthDays(monthdays[rt.MonthDaysTag]),
- WeekDays: timespans.WeekDays(weekdays[rt.WeekDaysTag]),
- StartTime: rt.StartTime,
+ Months: timespans.Months(months[rt.timing.MonthsTag]),
+ MonthDays: timespans.MonthDays(monthdays[rt.timing.MonthDaysTag]),
+ WeekDays: timespans.WeekDays(weekdays[rt.timing.WeekDaysTag]),
+ StartTime: rt.timing.StartTime,
ConnectFee: r.ConnectFee,
Price: r.Price,
BillingUnit: r.BillingUnit,
diff --git a/cmd/cgr-loader/rates.go b/cmd/cgr-loader/rates.go
index 75fdf6717..ac41efbd8 100644
--- a/cmd/cgr-loader/rates.go
+++ b/cmd/cgr-loader/rates.go
@@ -18,10 +18,10 @@ along with this program. If not, see
package main
import (
- "github.com/rif/cgrates/timespans"
+ "encoding/csv"
+ "github.com/cgrates/cgrates/timespans"
"log"
"os"
- "encoding/csv"
"time"
)
@@ -31,7 +31,8 @@ var (
weekdays = make(map[string][]time.Weekday)
destinations = make(map[string][]string)
rates = make(map[string][]*Rate)
- ratesTiming = make(map[string][]*RateTiming)
+ timings = make(map[string][]*Timing)
+ ratesTimings = make(map[string][]*RateTiming)
ratingProfiles = make(map[string][]*timespans.CallDescriptor)
)
@@ -148,10 +149,10 @@ func loadRates() {
}
}
-func loadRatesTiming() {
- fp, err := os.Open(*ratestimingFn)
+func loadTiming() {
+ fp, err := os.Open(*timingsFn)
if err != nil {
- log.Printf("Could not open rates file: %v", err)
+ log.Printf("Could not open timings file: %v", err)
return
}
defer fp.Close()
@@ -164,8 +165,8 @@ func loadRatesTiming() {
continue
}
- rt := NewRateTiming(record[1], record[2], record[3], record[4], record[5])
- ratesTiming[tag] = append(ratesTiming[tag], rt)
+ t := NewTiming(rates[1:]...)
+ timings[tag] = append(timings[tag], t)
log.Print(tag)
for _, i := range ratesTiming[tag] {
@@ -174,6 +175,39 @@ func loadRatesTiming() {
}
}
+func loadRatesTiming() {
+ fp, err := os.Open(*ratestimingsFn)
+ if err != nil {
+ log.Printf("Could not open rates timings file: %v", err)
+ return
+ }
+ defer fp.Close()
+ csvReader := csv.NewReader(fp)
+ csvReader.Comma = sep
+ for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() {
+ tag := record[0]
+ if tag == "Tag" {
+ // skip header line
+ continue
+ }
+
+ ts, exists := timings[record[2]]
+ if !exists {
+ log.Printf("Could not get timing for tag %v", record[2])
+ continue
+ }
+
+ for _, t := range ts {
+ rt := NewRateTiming(record[1], t)
+ ratesTiming[tag] = append(ratesTiming[tag], rt)
+ }
+ log.Print(tag)
+ for _, i := range ratesTiming[tag] {
+ log.Print(i)
+ }
+ }
+}
+
func loadRatingProfiles() {
fp, err := os.Open(*ratingprofilesFn)
if err != nil {
diff --git a/cmd/cgr-mediator/cgr-mediator.go b/cmd/cgr-mediator/cgr-mediator.go
index 7aeec7226..2e2a3dbc5 100644
--- a/cmd/cgr-mediator/cgr-mediator.go
+++ b/cmd/cgr-mediator/cgr-mediator.go
@@ -25,7 +25,7 @@ import (
"flag"
"fmt"
_ "github.com/bmizerany/pq"
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/timespans"
"log"
"net/rpc/jsonrpc"
"os"
diff --git a/cmd/cgr-rater/cgr-rater.go b/cmd/cgr-rater/cgr-rater.go
index 060e2db66..1d91697a4 100644
--- a/cmd/cgr-rater/cgr-rater.go
+++ b/cmd/cgr-rater/cgr-rater.go
@@ -21,8 +21,8 @@ package main
import (
"flag"
"fmt"
- "github.com/rif/cgrates/sessionmanager"
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/sessionmanager"
+ "github.com/cgrates/cgrates/timespans"
"log"
"net"
"net/rpc"
diff --git a/cmd/cgr-rater/registration.go b/cmd/cgr-rater/registration.go
index fd7d4ac18..9f8bacd8f 100644
--- a/cmd/cgr-rater/registration.go
+++ b/cmd/cgr-rater/registration.go
@@ -19,7 +19,7 @@ along with this program. If not, see
package main
import (
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/timespans"
"log"
"net/rpc"
"os"
diff --git a/cmd/cgr-sessionmanager/cgr-sessionmanager.go b/cmd/cgr-sessionmanager/cgr-sessionmanager.go
index 80a2e664e..26cf71e78 100644
--- a/cmd/cgr-sessionmanager/cgr-sessionmanager.go
+++ b/cmd/cgr-sessionmanager/cgr-sessionmanager.go
@@ -20,8 +20,8 @@ package main
import (
"flag"
- "github.com/rif/cgrates/sessionmanager"
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/sessionmanager"
+ "github.com/cgrates/cgrates/timespans"
"log"
"net/rpc/jsonrpc"
)
diff --git a/cmd/stress/cgr-balancerstress/cgr-balancerstress.go b/cmd/stress/cgr-balancerstress/cgr-balancerstress.go
index c86e7ed7e..8813f4897 100644
--- a/cmd/stress/cgr-balancerstress/cgr-balancerstress.go
+++ b/cmd/stress/cgr-balancerstress/cgr-balancerstress.go
@@ -19,7 +19,7 @@ package main
import (
"flag"
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/timespans"
"log"
"net/rpc"
"net/rpc/jsonrpc"
diff --git a/cmd/stress/cgr-raterstress/cgr-raterstress.go b/cmd/stress/cgr-raterstress/cgr-raterstress.go
index 7aff0454a..bca38e3fc 100644
--- a/cmd/stress/cgr-raterstress/cgr-raterstress.go
+++ b/cmd/stress/cgr-raterstress/cgr-raterstress.go
@@ -18,7 +18,7 @@ along with this program. If not, see
package main
import (
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/timespans"
"log"
"net/rpc/jsonrpc"
"time"
diff --git a/cmd/stress/cgr-spansstress/cgr-spansstress.go b/cmd/stress/cgr-spansstress/cgr-spansstress.go
index 93347abde..796214695 100644
--- a/cmd/stress/cgr-spansstress/cgr-spansstress.go
+++ b/cmd/stress/cgr-spansstress/cgr-spansstress.go
@@ -19,7 +19,7 @@ package main
import (
"flag"
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/timespans"
"log"
"os"
"runtime/pprof"
diff --git a/sessionmanager/postgreslogger.go b/sessionmanager/postgreslogger.go
index f17cb808f..d2d6ad12d 100644
--- a/sessionmanager/postgreslogger.go
+++ b/sessionmanager/postgreslogger.go
@@ -23,7 +23,7 @@ import (
"encoding/json"
"fmt"
_ "github.com/bmizerany/pq"
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/timespans"
"log"
)
diff --git a/sessionmanager/session.go b/sessionmanager/session.go
index d98336d47..ac993d1ee 100644
--- a/sessionmanager/session.go
+++ b/sessionmanager/session.go
@@ -20,7 +20,7 @@ package sessionmanager
import (
"fmt"
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/timespans"
"log"
"time"
)
diff --git a/sessionmanager/sessiondelegate.go b/sessionmanager/sessiondelegate.go
index aac6fb3f8..8b42ee364 100644
--- a/sessionmanager/sessiondelegate.go
+++ b/sessionmanager/sessiondelegate.go
@@ -19,9 +19,9 @@ along with this program. If not, see
package sessionmanager
import (
- "github.com/rif/cgrates/timespans"
+ "github.com/cgrates/cgrates/timespans"
"log"
- "github.com/rif/cgrates/balancer"
+ "github.com/cgrates/cgrates/balancer"
"net/rpc"
"time"
)
diff --git a/timespans/calldesc.go b/timespans/calldesc.go
index 006f1076c..ac38b38af 100644
--- a/timespans/calldesc.go
+++ b/timespans/calldesc.go
@@ -288,7 +288,7 @@ func (cd *CallDescriptor) GetMaxSessionTime() (seconds float64, err error) {
return -1, nil
} else {
userBudget.mux.RLock()
- availableCredit = userBudget.Credit
+ availableCredit = userBudget.BalanceMap[CREDIT]
availableSeconds, _ = userBudget.getSecondsForPrefix(cd.storageGetter, cd.DestinationPrefix)
userBudget.mux.RUnlock()
}
diff --git a/timespans/tariff_plans.go b/timespans/tariff_plans.go
index 68a362461..34368f5dd 100644
--- a/timespans/tariff_plans.go
+++ b/timespans/tariff_plans.go
@@ -24,14 +24,19 @@ import (
"strings"
)
+const (
+ CREDIT = "CREDIT"
+ SMS = "SMS"
+ TRAFFIC = "TRAFFIC"
+)
+
/*
Structure describing a tariff plan's number of bonus items. It is uset to restore
these numbers to the user budget every month.
*/
type TariffPlan struct {
Id string
- SmsCredit float64
- Traffic float64
+ balanceMap map[string]float64
Bonuses []*Bonus
MinuteBuckets []*MinuteBucket
VolumeDiscountThresholds []*VolumeDiscount
diff --git a/timespans/userbudget.go b/timespans/userbudget.go
index 59a99c1de..73a117ff0 100644
--- a/timespans/userbudget.go
+++ b/timespans/userbudget.go
@@ -36,12 +36,10 @@ Structure conatining information about user's credit (minutes, cents, sms...).'
*/
type UserBudget struct {
Id string
- Type string // prepaid/postpaid
- Credit float64
- SmsCredit float64
- Traffic float64
- OutboundVolumes []*Volume
- InboundVolumes []*Volume
+ Type string // prepaid-postpaid
+ BalanceMap map[string]float64
+ OutboundVolumes []*TrafficVolume
+ InboundVolumes []*TrafficVolume
ResetDayOfTheMonth int
TariffPlanId string
tariffPlan *TariffPlan
@@ -325,4 +323,4 @@ func (ub *UserBudget) resetUserBudget(sg StorageGetter) (err error) {
err = sg.SetUserBudget(ub)
}
return
-}
+}
\ No newline at end of file
diff --git a/timespans/volumediscounts.go b/timespans/volumediscounts.go
index 130988963..dbb02a6d3 100644
--- a/timespans/volumediscounts.go
+++ b/timespans/volumediscounts.go
@@ -19,13 +19,22 @@ along with this program. If not, see
package timespans
import (
- //"log"
+//"log"
)
+// Amount of a trafic of a certain type (TOR)
+type TrafficVolume struct {
+ TOR string
+ Units float64
+ DestinationId string
+}
+
+// Volume discount to be applyed after the Units are reached
+// in a certain time period.
type VolumeDiscount struct {
TOR string
DestinationsId string
- VolumeUnits float64
+ Units float64
AbsoulteValue float64 // either this or the procentage below
DiscountProcentage float64 // use only one
Weight float64
@@ -41,26 +50,23 @@ func (vd *VolumeDiscount) getDestination(storage StorageGetter) (dest *Destinati
return vd.destination
}
-type Volume struct {
- TOR string
- Units float64
- DestinationId string
-}
-
/*
Structure to be filled for each tariff plan with the bonus value for received calls minutes.
*/
-type InboundBonus struct {
- TOR string
- InboundUnits float64
- MonetaryUnits, SMSUnits, TrafficUnits float64
- MinuteBucket *MinuteBucket
+type Bonus struct {
+ Direction string
+ TOR string
+ Units float64
+ balanceMap map[string]float64
+ MinuteBuckets []*MinuteBucket
+ DestinationsId string
+ destination *Destination
}
/*
Serializes the tariff plan for the storage. Used for key-value storages.
*/
-func (rcb *InboundBonus) store() (result string) {
+func (rcb *Bonus) store() (result string) {
result += strconv.FormatFloat(rcb.Credit, 'f', -1, 64) + ","
result += strconv.FormatFloat(rcb.SmsCredit, 'f', -1, 64) + ","
result += strconv.FormatFloat(rcb.Traffic, 'f', -1, 64)
@@ -74,7 +80,7 @@ func (rcb *InboundBonus) store() (result string) {
/*
De-serializes the tariff plan for the storage. Used for key-value storages.
*/
-func (rcb *RecivedCallBonus) restore(input string) {
+func (rcb *Bonus) restore(input string) {
elements := strings.Split(input, ",")
rcb.Credit, _ = strconv.ParseFloat(elements[0], 64)
rcb.SmsCredit, _ = strconv.ParseFloat(elements[1], 64)
@@ -84,12 +90,3 @@ func (rcb *RecivedCallBonus) restore(input string) {
rcb.MinuteBucket.restore(elements[3])
}
}
-
-type OutboundBonus struct {
- TOR string
- OutboundUnits float64
- DestinationsId string
- destination *Destination
- MonetaryUnits, SMSUnits, TrafficUnits float64
- MinuteBucket *MinuteBucket
-}