diff --git a/apier/v1/apier_it_test.go b/apier/v1/apier_it_test.go index c33445a81..136729664 100644 --- a/apier/v1/apier_it_test.go +++ b/apier/v1/apier_it_test.go @@ -1354,11 +1354,11 @@ func TestApierMaxDebitInexistentAcnt(t *testing.T) { func TestApierCdrServer(t *testing.T) { httpClient := new(http.Client) - cdrForm1 := url.Values{utils.ACCID: []string{"dsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{utils.META_RATED}, utils.DIRECTION: []string{"*out"}, + cdrForm1 := url.Values{utils.ACCID: []string{"dsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{utils.META_RATED}, utils.TENANT: []string{"cgrates.org"}, utils.CATEGORY: []string{"call"}, utils.ACCOUNT: []string{"1001"}, utils.SUBJECT: []string{"1001"}, utils.DESTINATION: []string{"1002"}, utils.SETUP_TIME: []string{"2013-11-07T08:42:22Z"}, utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, utils.USAGE: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} - cdrForm2 := url.Values{utils.ACCID: []string{"adsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{utils.META_RATED}, utils.DIRECTION: []string{"*out"}, + cdrForm2 := url.Values{utils.ACCID: []string{"adsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{utils.META_RATED}, utils.TENANT: []string{"cgrates.org"}, utils.CATEGORY: []string{"call"}, utils.ACCOUNT: []string{"1001"}, utils.SUBJECT: []string{"1001"}, utils.DESTINATION: []string{"1002"}, utils.SETUP_TIME: []string{"2013-11-07T08:42:23Z"}, utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, utils.USAGE: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} diff --git a/apier/v1/costs.go b/apier/v1/costs.go index b006e94e1..37e93c4c0 100644 --- a/apier/v1/costs.go +++ b/apier/v1/costs.go @@ -34,7 +34,7 @@ type AttrGetDataCost struct { } func (apier *ApierV1) GetDataCost(attrs AttrGetDataCost, reply *engine.DataCost) error { - usageAsDuration := time.Duration(attrs.Usage) * time.Second // Convert to seconds to match the loaded rates + usageAsDuration := time.Duration(attrs.Usage) * time.Nanosecond // Convert to seconds to match the loaded rates cd := &engine.CallDescriptor{ Direction: attrs.Direction, Category: attrs.Category, diff --git a/data/tariffplans/test/a1/Rates.csv b/data/tariffplans/test/a1/Rates.csv index aa04963f7..c4fbab57e 100644 --- a/data/tariffplans/test/a1/Rates.csv +++ b/data/tariffplans/test/a1/Rates.csv @@ -1 +1,2 @@ +#Id,ConnectFee,Rate,RateUnit,RateIncrement,GroupIntervalStart RT_DATA1,0,0.0,1048576,10240,0 diff --git a/engine/cdr.go b/engine/cdr.go index 243ae8046..ab987f5d3 100644 --- a/engine/cdr.go +++ b/engine/cdr.go @@ -803,7 +803,6 @@ func NewCDRFromSQL(cdrSql *CDRsql) (cdr *CDR, err error) { cdr.SetupTime = cdrSql.SetupTime cdr.AnswerTime = cdrSql.AnswerTime cdr.Usage = time.Duration(cdrSql.Usage) - cdr.CostSource = cdrSql.CostSource cdr.Cost = cdrSql.Cost cdr.ExtraInfo = cdrSql.ExtraInfo @@ -813,7 +812,7 @@ func NewCDRFromSQL(cdrSql *CDRsql) (cdr *CDR, err error) { } } if cdrSql.CostDetails != "" { - if err = json.Unmarshal([]byte(cdrSql.CostDetails), cdr.CostDetails); err != nil { + if err = json.Unmarshal([]byte(cdrSql.CostDetails), &cdr.CostDetails); err != nil { return nil, err } } diff --git a/engine/storage_cdrs_it_test.go b/engine/storage_cdrs_it_test.go index 912fdc408..46b1fe5ff 100644 --- a/engine/storage_cdrs_it_test.go +++ b/engine/storage_cdrs_it_test.go @@ -574,13 +574,6 @@ func testGetCDRs(cfg *config.CGRConfig) error { } else if len(CDRs) != 6 { return fmt.Errorf("testGetCDRs #35, unexpected number of CDRs returned: %+v", CDRs) } - - // Filter on direction - if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Directions: []string{utils.OUT}}, false); err != nil { - return fmt.Errorf("testGetCDRs #36 err: %v", err) - } else if len(CDRs) != 10 { - return fmt.Errorf("testGetCDRs #37, unexpected number of CDRs returned: %+v", CDRs) - } // Filter on Tenant if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Tenants: []string{"itsyscom.com"}}, false); err != nil { return fmt.Errorf("testGetCDRs #38 err: %v", err) @@ -661,7 +654,7 @@ func testGetCDRs(cfg *config.CGRConfig) error { return fmt.Errorf("testGetCDRs #63, unexpected number of CDRs returned: %+v", CDRs) } // Filter on MinUsage - if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MinUsage: "125"}, false); err != nil { + if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MinUsage: "125s"}, false); err != nil { return fmt.Errorf("testGetCDRs #64, err: %v", err) } else if len(CDRs) != 2 { return fmt.Errorf("testGetCDRs #65, unexpected number of CDRs returned: %d", len(CDRs)) @@ -718,24 +711,6 @@ func testGetCDRs(cfg *config.CGRConfig) error { } else if len(CDRs) != 2 { return fmt.Errorf("testGetCDRs #77, unexpected number of CDRs returned: %+v", CDRs) } - // Filter on MinPDD - if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MinPDD: "20ms"}, false); err != nil { - return fmt.Errorf("testGetCDRs #78, err: %v", err) - } else if len(CDRs) != 7 { - return fmt.Errorf("testGetCDRs #79, unexpected number of CDRs returned: %+v", CDRs) - } - // Filter on maxPdd - if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MaxPDD: "1s"}, false); err != nil { - return fmt.Errorf("testGetCDRs #80, err: %v", err) - } else if len(CDRs) != 8 { - return fmt.Errorf("testGetCDRs #81, unexpected number of CDRs returned: %+v", CDRs) - } - // Filter on minPdd, maxPdd - if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MinPDD: "10ms", MaxPDD: "1s"}, false); err != nil { - return fmt.Errorf("testGetCDRs #82, err: %v", err) - } else if len(CDRs) != 6 { - return fmt.Errorf("testGetCDRs #83, unexpected number of CDRs returned: %+v", CDRs) - } // Combined filter if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{RequestTypes: []string{utils.META_RATED}, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}, false); err != nil { return fmt.Errorf("testGetCDRs #84, err: %v", err) diff --git a/engine/storage_mongo_stordb.go b/engine/storage_mongo_stordb.go index 3169e154a..f21ede633 100755 --- a/engine/storage_mongo_stordb.go +++ b/engine/storage_mongo_stordb.go @@ -982,21 +982,7 @@ func (ms *MongoStorage) cleanEmptyFilters(filters bson.M) { // _, err := col(utils.CDRsTBL).UpdateAll(bson.M{CGRIDLow: bson.M{"$in": cgrIds}}, bson.M{"$set": bson.M{"deleted_at": time.Now()}}) func (ms *MongoStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR, int64, error) { - var minPDD, maxPDD, minUsage, maxUsage *time.Duration - if len(qryFltr.MinPDD) != 0 { - if parsed, err := utils.ParseDurationWithNanosecs(qryFltr.MinPDD); err != nil { - return nil, 0, err - } else { - minPDD = &parsed - } - } - if len(qryFltr.MaxPDD) != 0 { - if parsed, err := utils.ParseDurationWithNanosecs(qryFltr.MaxPDD); err != nil { - return nil, 0, err - } else { - maxPDD = &parsed - } - } + var minUsage, maxUsage *time.Duration if len(qryFltr.MinUsage) != 0 { if parsed, err := utils.ParseDurationWithNanosecs(qryFltr.MinUsage); err != nil { return nil, 0, err @@ -1012,26 +998,22 @@ func (ms *MongoStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR, } } filters := bson.M{ - CGRIDLow: bson.M{"$in": qryFltr.CGRIDs, "$nin": qryFltr.NotCGRIDs}, - RunIDLow: bson.M{"$in": qryFltr.RunIDs, "$nin": qryFltr.NotRunIDs}, - OrderIDLow: bson.M{"$gte": qryFltr.OrderIDStart, "$lt": qryFltr.OrderIDEnd}, - ToRLow: bson.M{"$in": qryFltr.ToRs, "$nin": qryFltr.NotToRs}, - CDRHostLow: bson.M{"$in": qryFltr.OriginHosts, "$nin": qryFltr.NotOriginHosts}, - CDRSourceLow: bson.M{"$in": qryFltr.Sources, "$nin": qryFltr.NotSources}, - RequestTypeLow: bson.M{"$in": qryFltr.RequestTypes, "$nin": qryFltr.NotRequestTypes}, - DirectionLow: bson.M{"$in": qryFltr.Directions, "$nin": qryFltr.NotDirections}, - TenantLow: bson.M{"$in": qryFltr.Tenants, "$nin": qryFltr.NotTenants}, - CategoryLow: bson.M{"$in": qryFltr.Categories, "$nin": qryFltr.NotCategories}, - AccountLow: bson.M{"$in": qryFltr.Accounts, "$nin": qryFltr.NotAccounts}, - SubjectLow: bson.M{"$in": qryFltr.Subjects, "$nin": qryFltr.NotSubjects}, - SupplierLow: bson.M{"$in": qryFltr.Suppliers, "$nin": qryFltr.NotSuppliers}, - DisconnectCauseLow: bson.M{"$in": qryFltr.DisconnectCauses, "$nin": qryFltr.NotDisconnectCauses}, - SetupTimeLow: bson.M{"$gte": qryFltr.SetupTimeStart, "$lt": qryFltr.SetupTimeEnd}, - AnswerTimeLow: bson.M{"$gte": qryFltr.AnswerTimeStart, "$lt": qryFltr.AnswerTimeEnd}, - CreatedAtLow: bson.M{"$gte": qryFltr.CreatedAtStart, "$lt": qryFltr.CreatedAtEnd}, - UpdatedAtLow: bson.M{"$gte": qryFltr.UpdatedAtStart, "$lt": qryFltr.UpdatedAtEnd}, - UsageLow: bson.M{"$gte": minUsage, "$lt": maxUsage}, - PDDLow: bson.M{"$gte": minPDD, "$lt": maxPDD}, + CGRIDLow: bson.M{"$in": qryFltr.CGRIDs, "$nin": qryFltr.NotCGRIDs}, + RunIDLow: bson.M{"$in": qryFltr.RunIDs, "$nin": qryFltr.NotRunIDs}, + OrderIDLow: bson.M{"$gte": qryFltr.OrderIDStart, "$lt": qryFltr.OrderIDEnd}, + ToRLow: bson.M{"$in": qryFltr.ToRs, "$nin": qryFltr.NotToRs}, + CDRHostLow: bson.M{"$in": qryFltr.OriginHosts, "$nin": qryFltr.NotOriginHosts}, + CDRSourceLow: bson.M{"$in": qryFltr.Sources, "$nin": qryFltr.NotSources}, + RequestTypeLow: bson.M{"$in": qryFltr.RequestTypes, "$nin": qryFltr.NotRequestTypes}, + TenantLow: bson.M{"$in": qryFltr.Tenants, "$nin": qryFltr.NotTenants}, + CategoryLow: bson.M{"$in": qryFltr.Categories, "$nin": qryFltr.NotCategories}, + AccountLow: bson.M{"$in": qryFltr.Accounts, "$nin": qryFltr.NotAccounts}, + SubjectLow: bson.M{"$in": qryFltr.Subjects, "$nin": qryFltr.NotSubjects}, + SetupTimeLow: bson.M{"$gte": qryFltr.SetupTimeStart, "$lt": qryFltr.SetupTimeEnd}, + AnswerTimeLow: bson.M{"$gte": qryFltr.AnswerTimeStart, "$lt": qryFltr.AnswerTimeEnd}, + CreatedAtLow: bson.M{"$gte": qryFltr.CreatedAtStart, "$lt": qryFltr.CreatedAtEnd}, + UpdatedAtLow: bson.M{"$gte": qryFltr.UpdatedAtStart, "$lt": qryFltr.UpdatedAtEnd}, + UsageLow: bson.M{"$gte": minUsage, "$lt": maxUsage}, //CostDetailsLow + "." + AccountLow: bson.M{"$in": qryFltr.RatedAccounts, "$nin": qryFltr.NotRatedAccounts}, //CostDetailsLow + "." + SubjectLow: bson.M{"$in": qryFltr.RatedSubjects, "$nin": qryFltr.NotRatedSubjects}, } diff --git a/engine/storage_sql.go b/engine/storage_sql.go index 13e1d4dd2..d1df9cedd 100755 --- a/engine/storage_sql.go +++ b/engine/storage_sql.go @@ -817,12 +817,6 @@ func (self *SQLStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR, if len(qryFltr.NotRequestTypes) != 0 { q = q.Where("request_type not in (?)", qryFltr.NotRequestTypes) } - if len(qryFltr.Directions) != 0 { - q = q.Where("direction in (?)", qryFltr.Directions) - } - if len(qryFltr.NotDirections) != 0 { - q = q.Where("direction not in (?)", qryFltr.NotDirections) - } if len(qryFltr.Tenants) != 0 { q = q.Where("tenant in (?)", qryFltr.Tenants) } @@ -869,18 +863,6 @@ func (self *SQLStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR, qIds.WriteString(" )") q = q.Where(qIds.String()) } - if len(qryFltr.Suppliers) != 0 { - q = q.Where("supplier in (?)", qryFltr.Subjects) - } - if len(qryFltr.NotSuppliers) != 0 { - q = q.Where("supplier not in (?)", qryFltr.NotSubjects) - } - if len(qryFltr.DisconnectCauses) != 0 { - q = q.Where("disconnect_cause in (?)", qryFltr.DisconnectCauses) - } - if len(qryFltr.NotDisconnectCauses) != 0 { - q = q.Where("disconnect_cause not in (?)", qryFltr.NotDisconnectCauses) - } if len(qryFltr.Costs) != 0 { q = q.Where(utils.CDRsTBL+".cost in (?)", qryFltr.Costs) } @@ -974,22 +956,6 @@ func (self *SQLStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR, } } - if len(qryFltr.MinPDD) != 0 { - if minPDD, err := utils.ParseDurationWithNanosecs(qryFltr.MinPDD); err != nil { - return nil, 0, err - } else { - q = q.Where("pdd >= ?", minPDD.Nanoseconds()) - } - - } - if len(qryFltr.MaxPDD) != 0 { - if maxPDD, err := utils.ParseDurationWithNanosecs(qryFltr.MaxPDD); err != nil { - return nil, 0, err - } else { - q = q.Where("pdd < ?", maxPDD.Nanoseconds()) - } - } - if qryFltr.MinCost != nil { if qryFltr.MaxCost == nil { q = q.Where("cost >= ?", *qryFltr.MinCost) diff --git a/utils/apitpdata.go b/utils/apitpdata.go index 402201db9..a53f77b9a 100755 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -736,7 +736,6 @@ type AttrExpFileCdrs struct { CdrHosts []string // If provided, it will filter cdrhost CdrSources []string // If provided, it will filter cdrsource ReqTypes []string // If provided, it will fiter reqtype - Directions []string // If provided, it will fiter direction Tenants []string // If provided, it will filter tenant Categories []string // If provided, it will filter çategory Accounts []string // If provided, it will filter account @@ -761,7 +760,6 @@ func (self *AttrExpFileCdrs) AsCDRsFilter(timezone string) (*CDRsFilter, error) OriginHosts: self.CdrHosts, Sources: self.CdrSources, RequestTypes: self.ReqTypes, - Directions: self.Directions, Tenants: self.Tenants, Categories: self.Categories, Accounts: self.Accounts, @@ -835,7 +833,6 @@ func (self *AttrGetCdrs) AsCDRsFilter(timezone string) (*CDRsFilter, error) { OriginHosts: self.CdrHosts, Sources: self.CdrSources, RequestTypes: self.ReqTypes, - Directions: self.Directions, Tenants: self.Tenants, Categories: self.Categories, Accounts: self.Accounts, @@ -879,7 +876,6 @@ type AttrRateCdrs struct { CdrHosts []string // If provided, it will filter cdrhost CdrSources []string // If provided, it will filter cdrsource ReqTypes []string // If provided, it will fiter reqtype - Directions []string // If provided, it will fiter direction Tenants []string // If provided, it will filter tenant Categories []string // If provided, it will filter çategory Accounts []string // If provided, it will filter account @@ -902,7 +898,6 @@ func (attrRateCDRs *AttrRateCdrs) AsCDRsFilter(timezone string) (*CDRsFilter, er Sources: attrRateCDRs.CdrSources, ToRs: attrRateCDRs.TORs, RequestTypes: attrRateCDRs.ReqTypes, - Directions: attrRateCDRs.Directions, Tenants: attrRateCDRs.Tenants, Categories: attrRateCDRs.Categories, Accounts: attrRateCDRs.Accounts, @@ -1013,8 +1008,6 @@ type CDRsFilter struct { NotToRs []string // Filter specific TORs out RequestTypes []string // If provided, it will fiter reqtype NotRequestTypes []string // Filter out specific request types - Directions []string // If provided, it will fiter direction - NotDirections []string // Filter out specific directions Tenants []string // If provided, it will filter tenant NotTenants []string // If provided, it will filter tenant Categories []string // If provided, it will filter çategory @@ -1025,10 +1018,6 @@ type CDRsFilter struct { NotSubjects []string // Filter out specific subjects DestinationPrefixes []string // If provided, it will filter on destination prefix NotDestinationPrefixes []string // Filter out specific destination prefixes - Suppliers []string // If provided, it will filter the supplier - NotSuppliers []string // Filter out specific suppliers - DisconnectCauses []string // Filter for disconnect Cause - NotDisconnectCauses []string // Filter out specific disconnect causes Costs []float64 // Query based on costs specified NotCosts []float64 // Filter out specific costs out from result ExtraFields map[string]string // Query based on extra fields content @@ -1045,8 +1034,6 @@ type CDRsFilter struct { UpdatedAtEnd *time.Time // End interval, smaller than MinUsage string // Start of the usage interval (>=) MaxUsage string // End of the usage interval (<) - MinPDD string // Start of the pdd interval (>=) - MaxPDD string // End of the pdd interval (<) MinCost *float64 // Start of the cost interval (>=) MaxCost *float64 // End of the usage interval (<) Unscoped bool // Include soft-deleted records in results @@ -1069,8 +1056,6 @@ type RPCCDRsFilter struct { NotToRs []string // Filter specific TORs out RequestTypes []string // If provided, it will fiter reqtype NotRequestTypes []string // Filter out specific request types - Directions []string // If provided, it will fiter direction - NotDirections []string // Filter out specific directions Tenants []string // If provided, it will filter tenant NotTenants []string // If provided, it will filter tenant Categories []string // If provided, it will filter çategory @@ -1081,10 +1066,6 @@ type RPCCDRsFilter struct { NotSubjects []string // Filter out specific subjects DestinationPrefixes []string // If provided, it will filter on destination prefix NotDestinationPrefixes []string // Filter out specific destination prefixes - Suppliers []string // If provided, it will filter the supplier - NotSuppliers []string // Filter out specific suppliers - DisconnectCauses []string // Filter for disconnect Cause - NotDisconnectCauses []string // Filter out specific disconnect causes Costs []float64 // Query based on costs specified NotCosts []float64 // Filter out specific costs out from result ExtraFields map[string]string // Query based on extra fields content @@ -1101,8 +1082,6 @@ type RPCCDRsFilter struct { UpdatedAtEnd string // End interval, smaller than MinUsage string // Start of the usage interval (>=) MaxUsage string // End of the usage interval (<) - MinPDD string // Start of the pdd interval (>=) - MaxPDD string // End of the pdd interval (<) MinCost *float64 // Start of the cost interval (>=) MaxCost *float64 // End of the usage interval (<) Paginator // Add pagination @@ -1122,8 +1101,6 @@ func (self *RPCCDRsFilter) AsCDRsFilter(timezone string) (*CDRsFilter, error) { NotSources: self.NotSources, RequestTypes: self.RequestTypes, NotRequestTypes: self.NotRequestTypes, - Directions: self.Directions, - NotDirections: self.NotDirections, Tenants: self.Tenants, NotTenants: self.NotTenants, Categories: self.Categories, @@ -1134,23 +1111,17 @@ func (self *RPCCDRsFilter) AsCDRsFilter(timezone string) (*CDRsFilter, error) { NotSubjects: self.NotSubjects, DestinationPrefixes: self.DestinationPrefixes, NotDestinationPrefixes: self.NotDestinationPrefixes, - Suppliers: self.Suppliers, - NotSuppliers: self.NotSuppliers, - DisconnectCauses: self.DisconnectCauses, - NotDisconnectCauses: self.NotDisconnectCauses, - Costs: self.Costs, - NotCosts: self.NotCosts, - ExtraFields: self.ExtraFields, - NotExtraFields: self.NotExtraFields, - OrderIDStart: self.OrderIDStart, - OrderIDEnd: self.OrderIDEnd, - MinUsage: self.MinUsage, - MaxUsage: self.MaxUsage, - MinPDD: self.MinPDD, - MaxPDD: self.MaxPDD, - MinCost: self.MinCost, - MaxCost: self.MaxCost, - Paginator: self.Paginator, + Costs: self.Costs, + NotCosts: self.NotCosts, + ExtraFields: self.ExtraFields, + NotExtraFields: self.NotExtraFields, + OrderIDStart: self.OrderIDStart, + OrderIDEnd: self.OrderIDEnd, + MinUsage: self.MinUsage, + MaxUsage: self.MaxUsage, + MinCost: self.MinCost, + MaxCost: self.MaxCost, + Paginator: self.Paginator, } if len(self.SetupTimeStart) != 0 { if sTimeStart, err := ParseTimeDetectLayout(self.SetupTimeStart, timezone); err != nil {