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 -}