diff --git a/apier/tprates.go b/apier/tprates.go
index 3499f048e..eeb0a4724 100644
--- a/apier/tprates.go
+++ b/apier/tprates.go
@@ -26,8 +26,6 @@ import (
"github.com/cgrates/cgrates/utils"
)
-
-
// Creates a new rate within a tariff plan
func (self *Apier) SetTPRate(attrs utils.TPRate, reply *string) error {
if missing := utils.MissingStructFields(&attrs, []string{"TPid", "RateId", "ConnectFee", "RateSlots"}); len(missing) != 0 {
@@ -38,7 +36,7 @@ func (self *Apier) SetTPRate(attrs utils.TPRate, reply *string) error {
} else if exists {
return errors.New(utils.ERR_DUPLICATE)
}
- if err := self.StorDb.SetTPRate(&attrs); err!=nil {
+ if err := self.StorDb.SetTPRate(&attrs); err != nil {
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
}
*reply = "OK"
@@ -46,7 +44,7 @@ func (self *Apier) SetTPRate(attrs utils.TPRate, reply *string) error {
}
type AttrGetTPRate struct {
- TPid string // Tariff plan id
+ TPid string // Tariff plan id
RateId string // Rate id
}
diff --git a/docs/api_rates.rst b/docs/api_rates.rst
new file mode 100644
index 000000000..a2ddd6779
--- /dev/null
+++ b/docs/api_rates.rst
@@ -0,0 +1,230 @@
+Apier.SetTPRate
++++++++++++++++++
+
+Creates a new rate within a tariff plan.
+
+**Request**:
+
+ Data:
+ ::
+
+ type TPRate struct {
+ TPid string // Tariff plan id
+ RateId string // Rate id
+ RateSlots []RateSlot // One or more RateSlots
+ }
+
+ type RateSlot struct {
+ ConnectFee float64 // ConnectFee applied once the call is answered
+ Rate float64 // Rate applied
+ RatedUnits int // Number of billing units this rate applies to
+ RateIncrements int // This rate will apply in increments of duration
+ Weight float64 // Rate's priority when dealing with grouped rates
+ }
+
+ Mandatory parameters: ``[]string{"TPid", "RateId", "ConnectFee", "RateSlots"}``
+
+ *JSON sample*:
+ ::
+
+ {
+ "id": 0,
+ "method": "Apier.SetTPRate",
+ "params": [
+ {
+ "RateId": "SAMPLE_RATE_4",
+ "RateSlots": [
+ {
+ "ConnectFee": 0,
+ "Rate": 1.2,
+ "RateIncrements": 1,
+ "RatedUnits": 60,
+ "Weight": 10
+ },
+ {
+ "ConnectFee": 0,
+ "Rate": 2.2,
+ "RateIncrements": 1,
+ "RatedUnits": 60,
+ "Weight": 20
+ }
+ ],
+ "TPid": "SAMPLE_TP"
+ }
+ ]
+ }
+
+**Reply**:
+
+ Data:
+ ::
+
+ string
+
+ Possible answers:
+ ``OK`` - Success.
+
+ *JSON sample*:
+ ::
+
+ {
+ "error": null,
+ "id": 0,
+ "result": "OK"
+ }
+
+**Errors**:
+
+ ``MANDATORY_IE_MISSING`` - Mandatory parameter missing from request.
+
+ ``SERVER_ERROR`` - Server error occurred.
+
+ ``DUPLICATE`` - The specified combination of TPid/RateId already exists in StorDb.
+
+
+Apier.GetTPRate
++++++++++++++++
+
+Queries specific rate on tariff plan.
+
+**Request**:
+
+ Data:
+ ::
+
+ type AttrGetTPRate struct {
+ TPid string // Tariff plan id
+ RateId string // Rate id
+ }
+
+ Mandatory parameters: ``[]string{"TPid", "RateId"}``
+
+ *JSON sample*:
+ ::
+
+ {
+ "id": 1,
+ "method": "Apier.GetTPRate",
+ "params": [
+ {
+ "RateId": "SAMPLE_RATE_4",
+ "TPid": "SAMPLE_TP"
+ }
+ ]
+ }
+
+**Reply**:
+
+ Data:
+ ::
+
+ type TPRate struct {
+ TPid string // Tariff plan id
+ RateId string // Rate id
+ RateSlots []RateSlot // One or more RateSlots
+ }
+
+ type RateSlot struct {
+ ConnectFee float64 // ConnectFee applied once the call is answered
+ Rate float64 // Rate applied
+ RatedUnits int // Number of billing units this rate applies to
+ RateIncrements int // This rate will apply in increments of duration
+ Weight float64 // Rate's priority when dealing with grouped rates
+ }
+
+ *JSON sample*:
+ ::
+
+ {
+ "error": null,
+ "id": 1,
+ "result": {
+ "RateId": "SAMPLE_RATE_4",
+ "RateSlots": [
+ {
+ "ConnectFee": 0,
+ "Rate": 1.2,
+ "RateIncrements": 1,
+ "RatedUnits": 60,
+ "Weight": 10
+ },
+ {
+ "ConnectFee": 0,
+ "Rate": 2.2,
+ "RateIncrements": 1,
+ "RatedUnits": 60,
+ "Weight": 20
+ }
+ ],
+ "TPid": "SAMPLE_TP"
+ }
+ }
+**Errors**:
+
+ ``MANDATORY_IE_MISSING`` - Mandatory parameter missing from request.
+
+ ``SERVER_ERROR`` - Server error occurred.
+
+ ``NOT_FOUND`` - Requested rate id not found.
+
+
+Apier.GetTPRateIds
++++++++++++++++++++++++++
+
+Queries rate identities on tariff plan.
+
+**Request**:
+
+ Data:
+ ::
+
+ type AttrGetTPRateIds struct {
+ TPid string // Tariff plan id
+ }
+
+ Mandatory parameters: ``[]string{"TPid"}``
+
+ *JSON sample*:
+ ::
+
+ {
+ "id": 1,
+ "method": "Apier.GetTPRateIds",
+ "params": [
+ {
+ "TPid": "SAMPLE_TP"
+ }
+ ]
+ }
+
+**Reply**:
+
+ Data:
+ ::
+
+ []string
+
+ *JSON sample*:
+ ::
+
+ {
+ "error": null,
+ "id": 1,
+ "result": [
+ "SAMPLE_RATE_1",
+ "SAMPLE_RATE_2",
+ "SAMPLE_RATE_3",
+ "SAMPLE_RATE_4"
+ ]
+ }
+
+**Errors**:
+
+ ``MANDATORY_IE_MISSING`` - Mandatory parameter missing from request.
+
+ ``SERVER_ERROR`` - Server error occurred.
+
+ ``NOT_FOUND`` - Requested tariff plan not found.
+
+
+
diff --git a/docs/api_tptimings.rst b/docs/api_tptimings.rst
index c1cb60754..86ae29049 100644
--- a/docs/api_tptimings.rst
+++ b/docs/api_tptimings.rst
@@ -64,7 +64,7 @@ Creates a new timing within a tariff plan.
``SERVER_ERROR`` - Server error occurred.
- ``DUPLICATE`` - The specified combination of TPid/DestinationId already exists in StorDb.
+ ``DUPLICATE`` - The specified combination of TPid/TimingId already exists in StorDb.
Apier.GetTPTiming
@@ -136,10 +136,10 @@ Queries specific Timing on tariff plan.
``SERVER_ERROR`` - Server error occurred.
- ``NOT_FOUND`` - Requested destination id not found.
+ ``NOT_FOUND`` - Requested timing id not found.
-Apier.GetTPDestinationIds
+Apier.GetTPTimingIds
+++++++++++++++++++++++++
Queries timing identities on tariff plan.
@@ -149,11 +149,11 @@ Queries timing identities on tariff plan.
Data:
::
- type AttrGetTPDestinationIds struct {
+ type AttrGetTPTimingIds struct {
TPid string // Tariff plan id
}
- Required parameters: ``[]string{"TPid"}``
+ Mandatory parameters: ``[]string{"TPid"}``
*JSON sample*:
::
diff --git a/docs/apicalls.rst b/docs/apicalls.rst
index bfa0376df..dbc830444 100644
--- a/docs/apicalls.rst
+++ b/docs/apicalls.rst
@@ -149,13 +149,13 @@ Timings
api_tptimings
-SetTPRate
+Rates
+~~~~~~~
-GetTPRate
+.. toctree::
+ :maxdepth: 2
-DeleteTPRate
-
-GetAllTPRates
+ api_tprates
GetTPRateTiming
diff --git a/mediator/fsfilecsvcdr.go b/mediator/fsfilecsvcdr.go
index 7a30c11de..213c280b4 100644
--- a/mediator/fsfilecsvcdr.go
+++ b/mediator/fsfilecsvcdr.go
@@ -19,32 +19,31 @@ along with this program. If not, see
package mediator
import (
- "time"
- "strconv"
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/utils"
+ "strconv"
+ "time"
)
type FScsvCDR struct {
- rowData []string // The original row extracted form csv file
+ rowData []string // The original row extracted form csv file
accIdIdx,
- subjectIdx,
- reqtypeIdx,
- directionIdx,
- tenantIdx,
- torIdx,
- accountIdx,
- destinationIdx,
- answerTimeIdx,
- durationIdx int // Field indexes
- cgrCfg *config.CGRConfig // CGR Config instance
+ subjectIdx,
+ reqtypeIdx,
+ directionIdx,
+ tenantIdx,
+ torIdx,
+ accountIdx,
+ destinationIdx,
+ answerTimeIdx,
+ durationIdx int // Field indexes
+ cgrCfg *config.CGRConfig // CGR Config instance
}
-
-func NewFScsvCDR(cdrRow []string, accIdIdx, subjectIdx, reqtypeIdx, directionIdx, tenantIdx, torIdx,
- accountIdx, destinationIdx, answerTimeIdx, durationIdx int, cfg *config.CGRConfig ) (*FScsvCDR, error) {
- fscdr := FScsvCDR{ cdrRow, accIdIdx, subjectIdx, reqtypeIdx, directionIdx, tenantIdx,
- torIdx, accountIdx, destinationIdx, answerTimeIdx, durationIdx, cfg }
+func NewFScsvCDR(cdrRow []string, accIdIdx, subjectIdx, reqtypeIdx, directionIdx, tenantIdx, torIdx,
+ accountIdx, destinationIdx, answerTimeIdx, durationIdx int, cfg *config.CGRConfig) (*FScsvCDR, error) {
+ fscdr := FScsvCDR{cdrRow, accIdIdx, subjectIdx, reqtypeIdx, directionIdx, tenantIdx,
+ torIdx, accountIdx, destinationIdx, answerTimeIdx, durationIdx, cfg}
return &fscdr, nil
}
@@ -111,11 +110,3 @@ func (self *FScsvCDR) GetFallbackSubj() string {
func (self *FScsvCDR) GetExtraFields() map[string]string {
return nil
}
-
-
-
-
-
-
-
-
diff --git a/mediator/mediator.go b/mediator/mediator.go
index 97da70047..ff7fc7a73 100644
--- a/mediator/mediator.go
+++ b/mediator/mediator.go
@@ -19,13 +19,13 @@ along with this program. If not, see
package mediator
import (
- "errors"
"bufio"
"encoding/csv"
+ "errors"
"flag"
"fmt"
- "github.com/cgrates/cgrates/rater"
"github.com/cgrates/cgrates/config"
+ "github.com/cgrates/cgrates/rater"
"github.com/cgrates/cgrates/utils"
"github.com/howeyc/fsnotify"
"os"
@@ -35,14 +35,14 @@ import (
"time"
)
-func NewMediator( connector rater.Connector, storDb rater.DataStorage, cfg *config.CGRConfig) (m *Mediator, err error) {
+func NewMediator(connector rater.Connector, storDb rater.DataStorage, cfg *config.CGRConfig) (m *Mediator, err error) {
m = &Mediator{
connector: connector,
- storDb: storDb,
- cgrCfg: cfg,
+ storDb: storDb,
+ cgrCfg: cfg,
}
- m.fieldNames = make( map[string][]string )
- m.fieldIdxs = make( map[string][]int )
+ m.fieldNames = make(map[string][]string)
+ m.fieldIdxs = make(map[string][]int)
// Load config fields
if errLoad := m.loadConfig(); errLoad != nil {
return nil, errLoad
@@ -51,14 +51,14 @@ func NewMediator( connector rater.Connector, storDb rater.DataStorage, cfg *conf
}
type Mediator struct {
- connector rater.Connector
- storDb rater.DataStorage
- cgrCfg *config.CGRConfig
- cdrInDir, cdrOutDir string
- accIdField string
- accIdIdx int // Populated only for csv files where we have no names but indexes for the fields
- fieldNames map[string][]string
- fieldIdxs map[string][]int // Populated only for csv files where we have no names but indexes for the fields
+ connector rater.Connector
+ storDb rater.DataStorage
+ cgrCfg *config.CGRConfig
+ cdrInDir, cdrOutDir string
+ accIdField string
+ accIdIdx int // Populated only for csv files where we have no names but indexes for the fields
+ fieldNames map[string][]string
+ fieldIdxs map[string][]int // Populated only for csv files where we have no names but indexes for the fields
}
/*
@@ -77,8 +77,8 @@ Method logic:
*/
func (self *Mediator) loadConfig() error {
fieldKeys := []string{"subject", "reqtype", "direction", "tenant", "tor", "account", "destination", "time_start", "duration"}
- cfgVals := [][]string{self.cgrCfg.MediatorSubjectFields, self.cgrCfg.MediatorReqTypeFields, self.cgrCfg.MediatorDirectionFields,
- self.cgrCfg.MediatorTenantFields, self.cgrCfg.MediatorTORFields, self.cgrCfg.MediatorAccountFields, self.cgrCfg.MediatorDestFields,
+ cfgVals := [][]string{self.cgrCfg.MediatorSubjectFields, self.cgrCfg.MediatorReqTypeFields, self.cgrCfg.MediatorDirectionFields,
+ self.cgrCfg.MediatorTenantFields, self.cgrCfg.MediatorTORFields, self.cgrCfg.MediatorAccountFields, self.cgrCfg.MediatorDestFields,
self.cgrCfg.MediatorTimeAnswerFields, self.cgrCfg.MediatorDurationFields}
refIdx := 0 // Subject becomes reference for our checks
@@ -87,7 +87,7 @@ func (self *Mediator) loadConfig() error {
}
// All other configured fields must match the length of reference fields
for iCfgVal := range cfgVals {
- if ( len(cfgVals[refIdx])!=len(cfgVals[iCfgVal]) ) {
+ if len(cfgVals[refIdx]) != len(cfgVals[iCfgVal]) {
// Make sure we have everywhere the length of reference key (subject)
return errors.New("Inconsistent lenght of mediator fields.")
}
@@ -122,7 +122,7 @@ func (self *Mediator) loadConfig() error {
for idx, key := range fieldKeys {
self.fieldNames[key] = cfgVals[idx]
if self.cgrCfg.MediatorCDRType == utils.FSCDR_FILE_CSV { // Special case when field names represent indexes of their location in file
- self.fieldIdxs[key] = make( []int, len(cfgVals[idx]) )
+ self.fieldIdxs[key] = make([]int, len(cfgVals[idx]))
for iStr, cfgStr := range cfgVals[idx] {
if self.fieldIdxs[key][iStr], errConv = strconv.Atoi(cfgStr); errConv != nil {
return fmt.Errorf("All mediator index members (%s) must be ints", key)
@@ -134,8 +134,6 @@ func (self *Mediator) loadConfig() error {
return nil
}
-
-
// Watch the specified folder for file moves and parse the files on events
func (self *Mediator) TrackCDRFiles() (err error) {
watcher, err := fsnotify.NewWatcher()
@@ -173,7 +171,7 @@ func (self *Mediator) getCostsFromDB(cdr utils.CDR) (cc *rater.CallCost, err err
// Retrive the cost from rater
func (self *Mediator) getCostsFromRater(cdr utils.CDR) (*rater.CallCost, error) {
cc := &rater.CallCost{}
- d, err := time.ParseDuration(strconv.FormatInt(cdr.GetDuration(),10) + "s")
+ d, err := time.ParseDuration(strconv.FormatInt(cdr.GetDuration(), 10) + "s")
if err != nil {
return nil, err
}
@@ -193,7 +191,7 @@ func (self *Mediator) getCostsFromRater(cdr utils.CDR) (*rater.CallCost, error)
Destination: cdr.GetDestination(),
TimeStart: t1,
TimeEnd: t1.Add(d)}
- if cdr.GetReqType()== utils.PSEUDOPREPAID {
+ if cdr.GetReqType() == utils.PSEUDOPREPAID {
err = self.connector.Debit(cd, cc)
} else {
err = self.connector.GetCost(cd, cc)
@@ -207,7 +205,6 @@ func (self *Mediator) getCostsFromRater(cdr utils.CDR) (*rater.CallCost, error)
return cc, nil
}
-
// Parse the files and get cost for every record
func (self *Mediator) MediateCSVCDR(cdrfn string) (err error) {
flag.Parse()
@@ -230,29 +227,29 @@ func (self *Mediator) MediateCSVCDR(cdrfn string) (err error) {
for record, ok := csvReader.Read(); ok == nil; record, ok = csvReader.Read() {
//t, _ := time.Parse("2006-01-02 15:04:05", record[5])
var cc *rater.CallCost
-
+
for runIdx := range self.fieldIdxs["subject"] { // Query costs for every run index given by subject
- csvCDR, errCDR := NewFScsvCDR( record, self.accIdIdx,
- self.fieldIdxs["subject"][runIdx],
- self.fieldIdxs["reqtype"][runIdx],
- self.fieldIdxs["direction"][runIdx],
- self.fieldIdxs["tenant"][runIdx],
- self.fieldIdxs["tor"][runIdx],
- self.fieldIdxs["account"][runIdx],
- self.fieldIdxs["destination"][runIdx],
- self.fieldIdxs["answer_time"][runIdx],
- self.fieldIdxs["duration"][runIdx],
- self.cgrCfg)
+ csvCDR, errCDR := NewFScsvCDR(record, self.accIdIdx,
+ self.fieldIdxs["subject"][runIdx],
+ self.fieldIdxs["reqtype"][runIdx],
+ self.fieldIdxs["direction"][runIdx],
+ self.fieldIdxs["tenant"][runIdx],
+ self.fieldIdxs["tor"][runIdx],
+ self.fieldIdxs["account"][runIdx],
+ self.fieldIdxs["destination"][runIdx],
+ self.fieldIdxs["answer_time"][runIdx],
+ self.fieldIdxs["duration"][runIdx],
+ self.cgrCfg)
if errCDR != nil {
- rater.Logger.Err(fmt.Sprintf(" Could not calculate price for accid: <%s>, err: <%s>",
+ rater.Logger.Err(fmt.Sprintf(" Could not calculate price for accid: <%s>, err: <%s>",
record[self.accIdIdx], errCDR.Error()))
}
- var errCost error
- if (csvCDR.GetReqType()==utils.PREPAID || csvCDR.GetReqType()==utils.POSTPAID){
+ var errCost error
+ if csvCDR.GetReqType() == utils.PREPAID || csvCDR.GetReqType() == utils.POSTPAID {
// Should be previously calculated and stored in DB
- cc, errCost = self.getCostsFromDB( csvCDR )
+ cc, errCost = self.getCostsFromDB(csvCDR)
} else {
- cc, errCost = self.getCostsFromRater( csvCDR )
+ cc, errCost = self.getCostsFromRater(csvCDR)
}
cost := "-1"
if errCost != nil || cc == nil {
@@ -271,12 +268,12 @@ func (self *Mediator) MediateCSVCDR(cdrfn string) (err error) {
func (self *Mediator) MediateDBCDR(cdr utils.CDR, db rater.DataStorage) error {
var cc *rater.CallCost
- var errCost error
- if (cdr.GetReqType()==utils.PREPAID || cdr.GetReqType()==utils.POSTPAID){
+ var errCost error
+ if cdr.GetReqType() == utils.PREPAID || cdr.GetReqType() == utils.POSTPAID {
// Should be previously calculated and stored in DB
- cc, errCost = self.getCostsFromDB( cdr )
+ cc, errCost = self.getCostsFromDB(cdr)
} else {
- cc, errCost = self.getCostsFromRater( cdr )
+ cc, errCost = self.getCostsFromRater(cdr)
}
cost := "-1"
if errCost != nil || cc == nil {
@@ -287,4 +284,3 @@ func (self *Mediator) MediateDBCDR(cdr utils.CDR, db rater.DataStorage) error {
}
return self.storDb.SetRatedCdr(cdr, cc)
}
-
diff --git a/mediator/mediator_test.go b/mediator/mediator_test.go
index a37db7185..c8b84dd89 100644
--- a/mediator/mediator_test.go
+++ b/mediator/mediator_test.go
@@ -1,7 +1,7 @@
package mediator
import (
- //"testing"
+//"testing"
)
/*
diff --git a/rater/actions_test.go b/rater/actions_test.go
index d0477f4e3..ed091d19e 100644
--- a/rater/actions_test.go
+++ b/rater/actions_test.go
@@ -690,7 +690,6 @@ func TestActionResetCounterCREDIT(t *testing.T) {
}
}
-
func TestActionTriggerLogging(t *testing.T) {
at := &ActionTrigger{
Id: "some_uuid",
diff --git a/rater/dateseries.go b/rater/dateseries.go
index 04dcaa581..0be0a2200 100644
--- a/rater/dateseries.go
+++ b/rater/dateseries.go
@@ -19,12 +19,12 @@ along with this program. If not, see
package rater
import (
+ "fmt"
+ "reflect"
"sort"
"strconv"
"strings"
"time"
- "fmt"
- "reflect"
)
// Defines years days series
@@ -73,7 +73,7 @@ func (ys *Years) Parse(input, sep string) {
}
}
-func (ys Years) Serialize( sep string ) string {
+func (ys Years) Serialize(sep string) string {
if len(ys) == 0 {
return "*all"
}
@@ -89,7 +89,7 @@ func (ys Years) Serialize( sep string ) string {
}
var allMonths []time.Month = []time.Month{time.January, time.February, time.March, time.April, time.May, time.June,
- time.July, time.August, time.September, time.October, time.November, time.December}
+ time.July, time.August, time.September, time.October, time.November, time.December}
// Defines months series
type Months []time.Month
@@ -141,11 +141,11 @@ func (m *Months) Parse(input, sep string) {
}
// Dumps the months in a serialized string, similar to the one parsed
-func (m Months) Serialize( sep string ) string {
+func (m Months) Serialize(sep string) string {
if len(m) == 0 {
return "*none"
}
- if reflect.DeepEqual( m, Months(allMonths) ) {
+ if reflect.DeepEqual(m, Months(allMonths)) {
return "*all"
}
var mStr string
@@ -159,7 +159,6 @@ func (m Months) Serialize( sep string ) string {
return mStr
}
-
var allMonthDays []int = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}
// Defines month days series
@@ -211,7 +210,7 @@ func (md *MonthDays) Parse(input, sep string) {
}
// Dumps the month days in a serialized string, similar to the one parsed
-func (md MonthDays) Serialize( sep string ) string {
+func (md MonthDays) Serialize(sep string) string {
if len(md) == 0 {
return "*none"
}
@@ -230,6 +229,7 @@ func (md MonthDays) Serialize( sep string ) string {
}
var allWeekDays []time.Weekday = []time.Weekday{time.Monday, time.Tuesday, time.Wednesday, time.Thursday, time.Friday, time.Saturday, time.Sunday}
+
// Defines week days series
type WeekDays []time.Weekday
@@ -278,11 +278,11 @@ func (wd *WeekDays) Parse(input, sep string) {
}
// Dumps the week days in a serialized string, similar to the one parsed
-func (wd WeekDays) Serialize( sep string ) string {
+func (wd WeekDays) Serialize(sep string) string {
if len(wd) == 0 {
return "*none"
}
- if reflect.DeepEqual( wd, WeekDays(allWeekDays) ) {
+ if reflect.DeepEqual(wd, WeekDays(allWeekDays)) {
return "*all"
}
var wdStr string
diff --git a/rater/dateseries_test.go b/rater/dateseries_test.go
index aab47860b..d19a99055 100644
--- a/rater/dateseries_test.go
+++ b/rater/dateseries_test.go
@@ -77,7 +77,7 @@ func TestYearsSerialize(t *testing.T) {
if expectString2 != yString2 {
t.Errorf("Expected: %s, got: %s", expectString2, yString2)
}
- ys3 := &Years{2013,2014,2015}
+ ys3 := &Years{2013, 2014, 2015}
yString3 := ys3.Serialize(";")
expectString3 := "2013;2014;2015"
if expectString3 != yString3 {
@@ -104,7 +104,7 @@ func TestMonthsSerialize(t *testing.T) {
if expectString2 != mString2 {
t.Errorf("Expected: %s, got: %s", expectString2, mString2)
}
- mths3 := &Months{time.January,time.December}
+ mths3 := &Months{time.January, time.December}
mString3 := mths3.Serialize(";")
expectString3 := "1;12"
if expectString3 != mString3 {
@@ -131,7 +131,7 @@ func TestMonthDaysSerialize(t *testing.T) {
if expectString2 != mdsString2 {
t.Errorf("Expected: %s, got: %s", expectString2, mdsString2)
}
- mds3 := &MonthDays{1,2,3,4,5}
+ mds3 := &MonthDays{1, 2, 3, 4, 5}
mdsString3 := mds3.Serialize(";")
expectString3 := "1;2;3;4;5"
if expectString3 != mdsString3 {
@@ -158,11 +158,10 @@ func TestWeekDaysSerialize(t *testing.T) {
if expectString2 != wdsString2 {
t.Errorf("Expected: %s, got: %s", expectString2, wdsString2)
}
- wds3 := &WeekDays{time.Monday, time.Saturday,time.Sunday}
+ wds3 := &WeekDays{time.Monday, time.Saturday, time.Sunday}
wdsString3 := wds3.Serialize(";")
expectString3 := "1;6;0"
if expectString3 != wdsString3 {
t.Errorf("Expected: %s, got: %s", expectString3, wdsString3)
}
}
-
diff --git a/rater/loader_helpers.go b/rater/loader_helpers.go
index cc156f817..b874029a2 100644
--- a/rater/loader_helpers.go
+++ b/rater/loader_helpers.go
@@ -43,7 +43,7 @@ type TPLoader interface {
}
type Rate struct {
- Tag string
+ Tag string
ConnectFee, Price, PricedUnits, RateIncrements, Weight float64
}
@@ -79,7 +79,7 @@ func NewRate(tag, connectFee, price, pricedUnits, rateIncrements, weight string)
Price: p,
PricedUnits: pu,
RateIncrements: ri,
- Weight: wght,
+ Weight: wght,
}
return
}
@@ -92,7 +92,7 @@ type DestinationRate struct {
}
type Timing struct {
- Id string
+ Id string
Years Years
Months Months
MonthDays MonthDays
diff --git a/rater/storage_mongo.go b/rater/storage_mongo.go
index d3a38c560..b8519cb00 100644
--- a/rater/storage_mongo.go
+++ b/rater/storage_mongo.go
@@ -148,8 +148,8 @@ func (ms *MongoStorage) SetDestination(dest *Destination) error {
}
func (ms *MongoStorage) GetTPIds() ([]string, error) {
- return nil, errors.New(utils.ERR_NOT_IMPLEMENTED)
-}
+ return nil, errors.New(utils.ERR_NOT_IMPLEMENTED)
+}
func (ms *MongoStorage) SetTPTiming(tpid string, tm *Timing) error {
return errors.New(utils.ERR_NOT_IMPLEMENTED)
diff --git a/rater/storage_redis.go b/rater/storage_redis.go
index 470abe699..3bdc78242 100644
--- a/rater/storage_redis.go
+++ b/rater/storage_redis.go
@@ -103,7 +103,7 @@ func (rs *RedisStorage) SetDestination(dest *Destination) (err error) {
}
func (rs *RedisStorage) GetTPIds() ([]string, error) {
- return nil, errors.New(utils.ERR_NOT_IMPLEMENTED)
+ return nil, errors.New(utils.ERR_NOT_IMPLEMENTED)
}
func (rs *RedisStorage) SetTPTiming(tpid string, tm *Timing) error {
diff --git a/rater/storage_sql.go b/rater/storage_sql.go
index 232f91ddf..d0468f0df 100644
--- a/rater/storage_sql.go
+++ b/rater/storage_sql.go
@@ -83,8 +83,8 @@ func (self *SQLStorage) GetTPIds() ([]string, error) {
func (self *SQLStorage) SetTPTiming(tpid string, tm *Timing) error {
if _, err := self.Db.Exec(fmt.Sprintf("INSERT INTO %s (tpid, tag, years, months, month_days, week_days, time) VALUES('%s','%s','%s','%s','%s','%s','%s')",
utils.TBL_TP_TIMINGS, tpid, tm.Id, tm.Years.Serialize(";"), tm.Months.Serialize(";"), tm.MonthDays.Serialize(";"),
- tm.WeekDays.Serialize(";"), tm.StartTime )); err != nil {
- return err
+ tm.WeekDays.Serialize(";"), tm.StartTime)); err != nil {
+ return err
}
return nil
}
@@ -100,15 +100,15 @@ func (self *SQLStorage) ExistsTPTiming(tpid, tmId string) (bool, error) {
func (self *SQLStorage) GetTPTiming(tpid, tmId string) (*Timing, error) {
var years, months, monthDays, weekDays, time string
- err := self.Db.QueryRow(fmt.Sprintf("SELECT years, months, month_days, week_days, time FROM %s WHERE tpid='%s' AND tag='%s' LIMIT 1",
- utils.TBL_TP_TIMINGS, tpid, tmId)).Scan(&years,&months,&monthDays,&weekDays,&time)
+ err := self.Db.QueryRow(fmt.Sprintf("SELECT years, months, month_days, week_days, time FROM %s WHERE tpid='%s' AND tag='%s' LIMIT 1",
+ utils.TBL_TP_TIMINGS, tpid, tmId)).Scan(&years, &months, &monthDays, &weekDays, &time)
switch {
case err == sql.ErrNoRows:
- return nil,nil
- case err!=nil:
+ return nil, nil
+ case err != nil:
return nil, err
}
- return NewTiming( tmId, years, months, monthDays, weekDays, time ), nil
+ return NewTiming(tmId, years, months, monthDays, weekDays, time), nil
}
func (self *SQLStorage) GetTPTimingIds(tpid string) ([]string, error) {
@@ -211,8 +211,8 @@ func (self *SQLStorage) ExistsTPRate(tpid, rtId string) (bool, error) {
func (self *SQLStorage) SetTPRate(rt *utils.TPRate) error {
for _, rtSlot := range rt.RateSlots {
- if _, err := self.Db.Exec(fmt.Sprintf("INSERT INTO %s (tpid, tag, connect_fee, rate, rated_units, rate_increments, weight) VALUES ('%s', '%s', %f, %f, %d, %d, %f)",
- utils.TBL_TP_RATES, rt.TPid, rt.RateId, rtSlot.ConnectFee, rtSlot.Rate, rtSlot.RatedUnits, rtSlot.RateIncrements,
+ if _, err := self.Db.Exec(fmt.Sprintf("INSERT INTO %s (tpid, tag, connect_fee, rate, rated_units, rate_increments, weight) VALUES ('%s', '%s', %f, %f, %d, %d, %f)",
+ utils.TBL_TP_RATES, rt.TPid, rt.RateId, rtSlot.ConnectFee, rtSlot.Rate, rtSlot.RatedUnits, rtSlot.RateIncrements,
rtSlot.Weight)); err != nil {
return err
}
@@ -226,7 +226,7 @@ func (self *SQLStorage) GetTPRate(tpid, rtId string) (*utils.TPRate, error) {
return nil, err
}
defer rows.Close()
- rt := &utils.TPRate{TPid: tpid, RateId:rtId}
+ rt := &utils.TPRate{TPid: tpid, RateId: rtId}
i := 0
for rows.Next() {
i++ //Keep here a reference so we know we got at least one prefix
diff --git a/rater/timespans.go b/rater/timespans.go
index 48ccfe8fa..61ef8655f 100644
--- a/rater/timespans.go
+++ b/rater/timespans.go
@@ -108,7 +108,7 @@ The interval will attach itself to the timespan that overlaps the interval.
*/
func (ts *TimeSpan) SplitByInterval(i *Interval) (nts *TimeSpan) {
//Logger.Debug("here: ", ts, " +++ ", i)
- // if the span is not in interval return nil
+ // if the span is not in interval return nil
if !(i.Contains(ts.TimeStart) || i.Contains(ts.TimeEnd)) {
//Logger.Debug("Not in interval")
return
diff --git a/utils/coreutils.go b/utils/coreutils.go
index 3e7d5f8d3..dadc6b3e7 100644
--- a/utils/coreutils.go
+++ b/utils/coreutils.go
@@ -19,10 +19,10 @@ along with this program. If not, see
package utils
import (
- "crypto/sha1"
- "fmt"
- "encoding/hex"
"crypto/rand"
+ "crypto/sha1"
+ "encoding/hex"
+ "fmt"
"strconv"
"time"
)
diff --git a/utils/data_tprates.go b/utils/data_tprates.go
index 0547ef334..5a41757cc 100644
--- a/utils/data_tprates.go
+++ b/utils/data_tprates.go
@@ -20,17 +20,16 @@ package utils
// This file deals with tp_rates data definition
-
type TPRate struct {
- TPid string // Tariff plan id
- RateId string // Rate id
- RateSlots []RateSlot // One or more RateSlots
+ TPid string // Tariff plan id
+ RateId string // Rate id
+ RateSlots []RateSlot // One or more RateSlots
}
type RateSlot struct {
ConnectFee float64 // ConnectFee applied once the call is answered
- Rate float64 // Rate applied
- RatedUnits int // Number of billing units this rate applies to
- RateIncrements int // This rate will apply in increments of duration
- Weight float64 // Rate's priority when dealing with grouped rates
+ Rate float64 // Rate applied
+ RatedUnits int // Number of billing units this rate applies to
+ RateIncrements int // This rate will apply in increments of duration
+ Weight float64 // Rate's priority when dealing with grouped rates
}
diff --git a/utils/map.go b/utils/map.go
index 6dd371188..94aab386d 100644
--- a/utils/map.go
+++ b/utils/map.go
@@ -16,7 +16,6 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see
*/
-
package utils
// Converts map[string]string into map[string]interface{}
diff --git a/utils/slice.go b/utils/slice.go
index 7bc6c017e..d31026767 100644
--- a/utils/slice.go
+++ b/utils/slice.go
@@ -16,7 +16,6 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see
*/
-
package utils
import (
diff --git a/utils/struct.go b/utils/struct.go
index 172115f74..1e095937f 100644
--- a/utils/struct.go
+++ b/utils/struct.go
@@ -105,4 +105,3 @@ func UpdateStructWithStrMap(s interface{}, m map[string]string) []string {
}
return notMatched
}
-
diff --git a/utils/utils_test.go b/utils/utils_test.go
index e1518d52c..6b7ec3fcd 100644
--- a/utils/utils_test.go
+++ b/utils/utils_test.go
@@ -34,8 +34,8 @@ func TestFirstNonEmpty(t *testing.T) {
}
func TestUUID(t *testing.T) {
- uuid := GenUUID()
- if len(uuid) == 0 {
- t.Fatalf("GenUUID error %s", uuid)
- }
+ uuid := GenUUID()
+ if len(uuid) == 0 {
+ t.Fatalf("GenUUID error %s", uuid)
+ }
}