diff --git a/apier/v2/cdrs_mysql_local_test.go b/apier/v2/cdrs_mysql_local_test.go index 8b49fdd49..b998fc0c5 100644 --- a/apier/v2/cdrs_mysql_local_test.go +++ b/apier/v2/cdrs_mysql_local_test.go @@ -159,28 +159,28 @@ func TestV2CdrsMysqlGetCdrs(t *testing.T) { t.Error("Unexpected number of CDRs returned: ", len(reply)) } // CDRs with errors - req = utils.RpcCdrsFilter{CostStart: utils.Float64Pointer(-1.0), CostEnd: utils.Float64Pointer(0.0)} + req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(-1.0), MaxCost: utils.Float64Pointer(0.0)} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { t.Error("Unexpected number of CDRs returned: ", reply) } // CDRs Rated - req = utils.RpcCdrsFilter{CostStart: utils.Float64Pointer(-1.0)} + req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(-1.0)} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 3 { t.Error("Unexpected number of CDRs returned: ", reply) } // CDRs non rated OR SkipRated - req = utils.RpcCdrsFilter{CostEnd: utils.Float64Pointer(-1.0)} + req = utils.RpcCdrsFilter{MaxCost: utils.Float64Pointer(-1.0)} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", reply) } // Skip Errors - req = utils.RpcCdrsFilter{CostStart: utils.Float64Pointer(0.0), CostEnd: utils.Float64Pointer(-1.0)} + req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(0.0), MaxCost: utils.Float64Pointer(-1.0)} if err := cdrsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { diff --git a/apier/v2/cdrs_psql_local_test.go b/apier/v2/cdrs_psql_local_test.go index 3af774eee..93056b383 100644 --- a/apier/v2/cdrs_psql_local_test.go +++ b/apier/v2/cdrs_psql_local_test.go @@ -157,28 +157,28 @@ func TestV2CdrsPsqlGetCdrs(t *testing.T) { t.Error("Unexpected number of CDRs returned: ", len(reply)) } // CDRs with errors - req = utils.RpcCdrsFilter{CostStart: utils.Float64Pointer(-1.0), CostEnd: utils.Float64Pointer(0.0)} + req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(-1.0), MaxCost: utils.Float64Pointer(0.0)} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { t.Error("Unexpected number of CDRs returned: ", reply) } // CDRs Rated - req = utils.RpcCdrsFilter{CostStart: utils.Float64Pointer(-1.0)} + req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(-1.0)} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 3 { t.Error("Unexpected number of CDRs returned: ", reply) } // CDRs non rated OR SkipRated - req = utils.RpcCdrsFilter{CostEnd: utils.Float64Pointer(-1.0)} + req = utils.RpcCdrsFilter{MaxCost: utils.Float64Pointer(-1.0)} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { t.Error("Unexpected number of CDRs returned: ", reply) } // Skip Errors - req = utils.RpcCdrsFilter{CostStart: utils.Float64Pointer(0.0), CostEnd: utils.Float64Pointer(-1.0)} + req = utils.RpcCdrsFilter{MinCost: utils.Float64Pointer(0.0), MaxCost: utils.Float64Pointer(-1.0)} if err := cdrsPsqlRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { diff --git a/engine/cdrs.go b/engine/cdrs.go index 497835f9f..1087d78ed 100644 --- a/engine/cdrs.go +++ b/engine/cdrs.go @@ -114,7 +114,7 @@ func (self *CdrServer) RateCdrs(cgrIds, runIds, tors, cdrHosts, cdrSources, reqT ReqTypes: reqTypes, Directions: directions, Tenants: tenants, Categories: categories, Accounts: accounts, Subjects: subjects, DestPrefixes: destPrefixes, RatedAccounts: ratedAccounts, RatedSubjects: ratedSubjects, OrderIdStart: orderIdStart, OrderIdEnd: orderIdEnd, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, - CostStart: costStart, CostEnd: costEnd}) + MinCost: costStart, MaxCost: costEnd}) if err != nil { return err } diff --git a/engine/storage_mysql_local_test.go b/engine/storage_mysql_local_test.go index 399f2d290..e152069ee 100644 --- a/engine/storage_mysql_local_test.go +++ b/engine/storage_mysql_local_test.go @@ -761,7 +761,7 @@ func TestMySQLGetStoredCdrs(t *testing.T) { } // Filter on ignoreRated var orderIdStart, orderIdEnd int64 // Capture also orderIds for the next test - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CostEnd: utils.Float64Pointer(0.0)}); err != nil { + if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{MaxCost: utils.Float64Pointer(0.0)}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) @@ -801,6 +801,24 @@ func TestMySQLGetStoredCdrs(t *testing.T) { } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } + // Filter on minPdd + if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{MinPdd: utils.Float64Pointer(3)}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 3 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on maxPdd + if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{MaxPdd: utils.Float64Pointer(3)}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 5 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on minPdd, maxPdd + if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{MinPdd: utils.Float64Pointer(3), MaxPdd: utils.Float64Pointer(5)}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 3 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } // Combined filter if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{ReqTypes: []string{utils.META_RATED}, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { t.Error(err.Error()) diff --git a/engine/storage_psql_local_test.go b/engine/storage_psql_local_test.go index 420fceb1e..aa5911692 100644 --- a/engine/storage_psql_local_test.go +++ b/engine/storage_psql_local_test.go @@ -432,22 +432,23 @@ func TestPSQLSetCdr(t *testing.T) { } cgrCdr1 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa1", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: utils.META_RATED, utils.DIRECTION: "*out", utils.TENANT: "cgrates.org", utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-08T08:42:20Z", - utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "10s", "field_extr1": "val_extr1", "fieldextr2": "valextr2", utils.CDRSOURCE: TEST_SQL} + utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "10s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", utils.CDRSOURCE: TEST_SQL} + cgrCdr2 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa2", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: utils.META_PREPAID, utils.DIRECTION: "*out", utils.TENANT: "cgrates.org", utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-08T08:42:22Z", - utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "20", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} + utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "20", utils.PDD: "7s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} cgrCdr3 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa3", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: utils.META_RATED, utils.DIRECTION: "*out", utils.TENANT: "cgrates.org", utils.CATEGORY: "premium_call", utils.ACCOUNT: "1002", utils.SUBJECT: "1002", utils.DESTINATION: "1001", utils.SETUP_TIME: "2013-11-07T08:42:24Z", - utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "60s", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} + utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "60s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} cgrCdr4 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa4", utils.CDRHOST: "192.168.1.2", utils.REQTYPE: utils.META_PSEUDOPREPAID, utils.DIRECTION: "*out", utils.TENANT: "itsyscom.com", utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "+4986517174964", utils.SETUP_TIME: "2013-11-07T08:42:21Z", - utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "1m2s", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} + utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "1m2s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} cgrCdr5 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa5", utils.CDRHOST: "192.168.1.2", utils.REQTYPE: utils.META_POSTPAID, utils.DIRECTION: "*out", utils.TENANT: "itsyscom.com", utils.CATEGORY: "call", utils.ACCOUNT: "1002", utils.SUBJECT: "1002", utils.DESTINATION: "+4986517174963", utils.SETUP_TIME: "2013-11-07T08:42:25Z", - utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "15s", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} + utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "15s", utils.PDD: "7s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL} for _, cdr := range []*CgrCdr{cgrCdr1, cgrCdr2, cgrCdr3, cgrCdr4, cgrCdr5} { if err := psqlDb.SetCdr(cdr.AsStoredCdr()); err != nil { @@ -457,19 +458,22 @@ func TestPSQLSetCdr(t *testing.T) { strCdr1 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} strCdr1.CgrId = utils.Sha1(strCdr1.AccId, strCdr1.SetupTime.String()) strCdr2 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb2", CdrHost: "192.168.1.2", CdrSource: "UNKNOWN2", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(12) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Usage: time.Duration(12) * time.Second, Pdd: time.Duration(4) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, MediationRunId: utils.DEFAULT_RUNID, Cost: 0.201} strCdr2.CgrId = utils.Sha1(strCdr2.AccId, strCdr2.SetupTime.String()) strCdr3 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb3", CdrHost: "192.168.1.1", CdrSource: TEST_SQL, ReqType: utils.META_RATED, Direction: "*out", Tenant: "itsyscom.com", Category: "call", Account: "1002", Subject: "1000", Destination: "+4986517174963", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} strCdr3.CgrId = utils.Sha1(strCdr3.AccId, strCdr3.SetupTime.String()) @@ -531,19 +535,22 @@ func TestPSQLSetRatedCdr(t *testing.T) { strCdr1 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201} strCdr1.CgrId = utils.Sha1(strCdr1.AccId, strCdr1.SetupTime.String()) strCdr2 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb2", CdrHost: "192.168.1.2", CdrSource: "UNKNOWN", ReqType: utils.META_PREPAID, Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(12) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Usage: time.Duration(12) * time.Second, Pdd: time.Duration(7) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, MediationRunId: utils.DEFAULT_RUNID, Cost: 0.201} strCdr2.CgrId = utils.Sha1(strCdr2.AccId, strCdr2.SetupTime.String()) strCdr3 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb3", CdrHost: "192.168.1.1", CdrSource: TEST_SQL, ReqType: utils.META_RATED, Direction: "*out", Tenant: "itsyscom.com", Category: "call", Account: "1002", Subject: "1002", Destination: "+4986517174964", SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC), - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, + Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1", + ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, MediationRunId: "wholesale_run", Cost: 1.201} strCdr3.CgrId = utils.Sha1(strCdr3.AccId, strCdr3.SetupTime.String()) @@ -753,7 +760,7 @@ func TestPSQLGetStoredCdrs(t *testing.T) { } // Filter on ignoreRated var orderIdStart, orderIdEnd int64 // Capture also orderIds for the next test - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CostEnd: utils.Float64Pointer(0.0)}); err != nil { + if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{MaxCost: utils.Float64Pointer(0.0)}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 5 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) @@ -793,6 +800,24 @@ func TestPSQLGetStoredCdrs(t *testing.T) { } else if len(storedCdrs) != 2 { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } + // Filter on minPdd + if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{MinPdd: utils.Float64Pointer(3)}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 3 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on maxPdd + if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{MaxPdd: utils.Float64Pointer(3)}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 5 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } + // Filter on minPdd, maxPdd + if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{MinPdd: utils.Float64Pointer(3), MaxPdd: utils.Float64Pointer(5)}); err != nil { + t.Error(err.Error()) + } else if len(storedCdrs) != 3 { + t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) + } // Combined filter if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{ReqTypes: []string{utils.META_RATED}, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}); err != nil { t.Error(err.Error()) diff --git a/engine/storage_sql.go b/engine/storage_sql.go index e37a37f77..b80902e04 100644 --- a/engine/storage_sql.go +++ b/engine/storage_sql.go @@ -1068,35 +1068,49 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, } q = q.Where(tblName+".updated_at < ?", qryFltr.UpdatedAtEnd) } - if qryFltr.UsageStart != nil { + if qryFltr.MinUsage != nil { tblName := utils.TBL_CDRS_PRIMARY if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } - q = q.Where(tblName+".usage >= ?", qryFltr.UsageStart) + q = q.Where(tblName+".usage >= ?", qryFltr.MinUsage) } - if qryFltr.UsageEnd != nil { + if qryFltr.MaxUsage != nil { tblName := utils.TBL_CDRS_PRIMARY if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } - q = q.Where(tblName+".usage < ?", qryFltr.UsageEnd) + q = q.Where(tblName+".usage < ?", qryFltr.MaxUsage) + } + if qryFltr.MinPdd != nil { + tblName := utils.TBL_CDRS_PRIMARY + if qryFltr.FilterOnRated { + tblName = utils.TBL_RATED_CDRS + } + q = q.Where(tblName+".pdd >= ?", qryFltr.MinPdd) + } + if qryFltr.MaxPdd != nil { + tblName := utils.TBL_CDRS_PRIMARY + if qryFltr.FilterOnRated { + tblName = utils.TBL_RATED_CDRS + } + q = q.Where(tblName+".pdd < ?", qryFltr.MaxPdd) } - if qryFltr.CostStart != nil { - if qryFltr.CostEnd == nil { - q = q.Where(utils.TBL_RATED_CDRS+".cost >= ?", *qryFltr.CostStart) - } else if *qryFltr.CostStart == 0.0 && *qryFltr.CostEnd == -1.0 { // Special case when we want to skip errors + if qryFltr.MinCost != nil { + if qryFltr.MaxCost == nil { + q = q.Where(utils.TBL_RATED_CDRS+".cost >= ?", *qryFltr.MinCost) + } else if *qryFltr.MinCost == 0.0 && *qryFltr.MaxCost == -1.0 { // Special case when we want to skip errors q = q.Where(fmt.Sprintf("( %s.cost IS NULL OR %s.cost >= 0.0 )", utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS)) } else { - q = q.Where(utils.TBL_RATED_CDRS+".cost >= ?", *qryFltr.CostStart) - q = q.Where(utils.TBL_RATED_CDRS+".cost < ?", *qryFltr.CostEnd) + q = q.Where(utils.TBL_RATED_CDRS+".cost >= ?", *qryFltr.MinCost) + q = q.Where(utils.TBL_RATED_CDRS+".cost < ?", *qryFltr.MaxCost) } - } else if qryFltr.CostEnd != nil { - if *qryFltr.CostEnd == -1.0 { // Non-rated CDRs + } else if qryFltr.MaxCost != nil { + if *qryFltr.MaxCost == -1.0 { // Non-rated CDRs q = q.Where(utils.TBL_RATED_CDRS + ".cost IS NULL") // Need to include it otherwise all CDRs will be returned - } else { // Above limited CDRs, since costStart is empty, make sure we query also NULL cost - q = q.Where(fmt.Sprintf("( %s.cost IS NULL OR %s.cost < %f )", utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, *qryFltr.CostEnd)) + } else { // Above limited CDRs, since MinCost is empty, make sure we query also NULL cost + q = q.Where(fmt.Sprintf("( %s.cost IS NULL OR %s.cost < %f )", utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, *qryFltr.MaxCost)) } } if qryFltr.Paginator.Limit != nil { diff --git a/utils/apitpdata.go b/utils/apitpdata.go index 595ae348a..f25a015b3 100644 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -742,10 +742,10 @@ func (self *AttrExpFileCdrs) AsCdrsFilter() (*CdrsFilter, error) { } } if self.SkipRated { - cdrFltr.CostEnd = Float64Pointer(-1.0) + cdrFltr.MaxCost = Float64Pointer(-1.0) } else if self.SkipRated { - cdrFltr.CostStart = Float64Pointer(0.0) - cdrFltr.CostEnd = Float64Pointer(-1.0) + cdrFltr.MinCost = Float64Pointer(0.0) + cdrFltr.MaxCost = Float64Pointer(-1.0) } return cdrFltr, nil } @@ -818,10 +818,10 @@ func (self *AttrGetCdrs) AsCdrsFilter() (*CdrsFilter, error) { } } if self.SkipRated { - cdrFltr.CostEnd = Float64Pointer(-1.0) + cdrFltr.MaxCost = Float64Pointer(-1.0) } else if self.SkipRated { - cdrFltr.CostStart = Float64Pointer(0.0) - cdrFltr.CostEnd = Float64Pointer(-1.0) + cdrFltr.MinCost = Float64Pointer(0.0) + cdrFltr.MaxCost = Float64Pointer(-1.0) } return cdrFltr, nil } @@ -959,10 +959,12 @@ type CdrsFilter struct { CreatedAtEnd *time.Time // End interval, smaller than UpdatedAtStart *time.Time // Start of interval, bigger or equal than configured UpdatedAtEnd *time.Time // End interval, smaller than - UsageStart *float64 // Start of the usage interval (>=) - UsageEnd *float64 // End of the usage interval (<) - CostStart *float64 // Start of the cost interval (>=) - CostEnd *float64 // End of the usage interval (<) + MinUsage *float64 // Start of the usage interval (>=) + MaxUsage *float64 // End of the usage interval (<) + MinPdd *float64 // Start of the pdd interval (>=) + MaxPdd *float64 // End of the pdd interval (<) + MinCost *float64 // Start of the cost interval (>=) + MaxCost *float64 // End of the usage interval (<) FilterOnRated bool // Do not consider rated CDRs but raw one Count bool // If true count the items instead of returning data Paginator @@ -1016,10 +1018,12 @@ type RpcCdrsFilter struct { CreatedAtEnd string // End interval, smaller than UpdatedAtStart string // Start of interval, bigger or equal than configured UpdatedAtEnd string // End interval, smaller than - UsageStart *float64 // Start of the usage interval (>=) - UsageEnd *float64 // End of the usage interval (<) - CostStart *float64 // Start of the cost interval (>=) - CostEnd *float64 // End of the usage interval (<) + MinUsage *float64 // Start of the usage interval (>=) + MaxUsage *float64 // End of the usage interval (<) + MinPdd *float64 // Start of the pdd interval (>=) + MaxPdd *float64 // End of the pdd interval (<) + MinCost *float64 // Start of the cost interval (>=) + MaxCost *float64 // End of the usage interval (<) FilterOnRated bool // Do not consider derived CDRs but original one Paginator // Add pagination } @@ -1064,10 +1068,12 @@ func (self *RpcCdrsFilter) AsCdrsFilter() (*CdrsFilter, error) { NotExtraFields: self.NotExtraFields, OrderIdStart: self.OrderIdStart, OrderIdEnd: self.OrderIdEnd, - UsageStart: self.UsageStart, - UsageEnd: self.UsageEnd, - CostStart: self.CostStart, - CostEnd: self.CostEnd, + MinUsage: self.MinUsage, + MaxUsage: self.MaxUsage, + MinPdd: self.MinPdd, + MaxPdd: self.MaxPdd, + MinCost: self.MinCost, + MaxCost: self.MaxCost, FilterOnRated: self.FilterOnRated, Paginator: self.Paginator, }