From b27daa074bbfa9461991954911c721042d8fe4ef Mon Sep 17 00:00:00 2001 From: DanB Date: Fri, 5 Jun 2015 18:56:55 +0200 Subject: [PATCH] Adding PDD to storDb, renaming CdrsFilter.FilterOnDerived -> CdrsFilter.FilterOnRated, added storDb store-restore CDR tests --- data/storage/mysql/create_cdrs_tables.sql | 2 + data/storage/postgres/create_cdrs_tables.sql | 2 + engine/models.go | 2 + engine/storage_mysql.go | 3 +- engine/storage_mysql_local_test.go | 101 ++++++++++++++++--- engine/storage_postgres.go | 4 +- engine/storage_psql_local_test.go | 79 ++++++++++++++- engine/storage_sql.go | 74 +++++++------- general_tests/tutorial_fs_calls_test.go | 2 +- general_tests/tutorial_kam_calls_test.go | 2 +- general_tests/tutorial_osips_calls_test.go | 2 +- utils/apitpdata.go | 6 +- 12 files changed, 222 insertions(+), 57 deletions(-) diff --git a/data/storage/mysql/create_cdrs_tables.sql b/data/storage/mysql/create_cdrs_tables.sql index 7755fb6ba..3b6bfa9b6 100644 --- a/data/storage/mysql/create_cdrs_tables.sql +++ b/data/storage/mysql/create_cdrs_tables.sql @@ -21,6 +21,7 @@ CREATE TABLE cdrs_primary ( setup_time datetime NOT NULL, answer_time datetime NOT NULL, `usage` DECIMAL(30,9) NOT NULL, + pdd DECIMAL(12,9) NOT NULL, supplier varchar(128) NOT NULL, disconnect_cause varchar(64) NOT NULL, created_at TIMESTAMP, @@ -93,6 +94,7 @@ CREATE TABLE `rated_cdrs` ( setup_time datetime NOT NULL, answer_time datetime NOT NULL, `usage` DECIMAL(30,9) NOT NULL, + pdd DECIMAL(12,9) NOT NULL, supplier varchar(128) NOT NULL, disconnect_cause varchar(64) NOT NULL, cost DECIMAL(20,4) DEFAULT NULL, diff --git a/data/storage/postgres/create_cdrs_tables.sql b/data/storage/postgres/create_cdrs_tables.sql index 25c2abada..ecd6960eb 100644 --- a/data/storage/postgres/create_cdrs_tables.sql +++ b/data/storage/postgres/create_cdrs_tables.sql @@ -21,6 +21,7 @@ CREATE TABLE cdrs_primary ( setup_time TIMESTAMP NOT NULL, answer_time TIMESTAMP NOT NULL, usage NUMERIC(30,9) NOT NULL, + pdd NUMERIC(12,9) NOT NULL, supplier VARCHAR(128) NOT NULL, disconnect_cause VARCHAR(64) NOT NULL, created_at TIMESTAMP, @@ -89,6 +90,7 @@ CREATE TABLE rated_cdrs ( setup_time TIMESTAMP NOT NULL, answer_time TIMESTAMP NOT NULL, usage NUMERIC(30,9) NOT NULL, + pdd NUMERIC(12,9) NOT NULL, supplier VARCHAR(128) NOT NULL, disconnect_cause VARCHAR(64) NOT NULL, cost NUMERIC(20,4) DEFAULT NULL, diff --git a/engine/models.go b/engine/models.go index 141173559..3c606ac9a 100644 --- a/engine/models.go +++ b/engine/models.go @@ -303,6 +303,7 @@ type TblCdrsPrimary struct { SetupTime time.Time AnswerTime time.Time Usage float64 + Pdd float64 Supplier string DisconnectCause string CreatedAt time.Time @@ -362,6 +363,7 @@ type TblRatedCdr struct { SetupTime time.Time AnswerTime time.Time Usage float64 + Pdd float64 Supplier string DisconnectCause string Cost float64 diff --git a/engine/storage_mysql.go b/engine/storage_mysql.go index d7aad5e32..b2f19ed0d 100644 --- a/engine/storage_mysql.go +++ b/engine/storage_mysql.go @@ -106,7 +106,7 @@ func (self *MySQLStorage) LogCallCost(cgrid, source, runid string, cc *CallCost) } func (self *MySQLStorage) SetRatedCdr(storedCdr *StoredCdr) (err error) { - _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO %s (cgrid,runid,reqtype,direction,tenant,category,account,subject,destination,setup_time,answer_time,`usage`,supplier,disconnect_cause,cost,extra_info,created_at) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',%v,'%s','%s',%f,'%s','%s') ON DUPLICATE KEY UPDATE reqtype=values(reqtype),direction=values(direction),tenant=values(tenant),category=values(category),account=values(account),subject=values(subject),destination=values(destination),setup_time=values(setup_time),answer_time=values(answer_time),`usage`=values(`usage`),cost=values(cost),supplier=values(supplier),disconnect_cause=values(disconnect_cause),extra_info=values(extra_info), updated_at='%s'", + _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO %s (cgrid,runid,reqtype,direction,tenant,category,account,subject,destination,setup_time,answer_time,`usage`,pdd,supplier,disconnect_cause,cost,extra_info,created_at) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',%v,%v,'%s','%s',%f,'%s','%s') ON DUPLICATE KEY UPDATE reqtype=values(reqtype),direction=values(direction),tenant=values(tenant),category=values(category),account=values(account),subject=values(subject),destination=values(destination),setup_time=values(setup_time),answer_time=values(answer_time),`usage`=values(`usage`),pdd=values(pdd),cost=values(cost),supplier=values(supplier),disconnect_cause=values(disconnect_cause),extra_info=values(extra_info), updated_at='%s'", utils.TBL_RATED_CDRS, storedCdr.CgrId, storedCdr.MediationRunId, @@ -120,6 +120,7 @@ func (self *MySQLStorage) SetRatedCdr(storedCdr *StoredCdr) (err error) { storedCdr.SetupTime, storedCdr.AnswerTime, storedCdr.Usage.Seconds(), + storedCdr.Pdd.Seconds(), storedCdr.Supplier, storedCdr.DisconnectCause, storedCdr.Cost, diff --git a/engine/storage_mysql_local_test.go b/engine/storage_mysql_local_test.go index e90951310..399f2d290 100644 --- a/engine/storage_mysql_local_test.go +++ b/engine/storage_mysql_local_test.go @@ -433,23 +433,23 @@ func TestMySQLSetCdr(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", utils.SUPPLIER: "SUPPL1", "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", utils.SUPPLIER: "SUPPL1", "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", utils.SUPPLIER: "SUPPL1", "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", utils.SUPPLIER: "SUPPL1", "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", utils.SUPPLIER: "SUPPL1", "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 := mysqlDb.SetCdr(cdr.AsStoredCdr()); err != nil { @@ -459,21 +459,21 @@ func TestMySQLSetCdr(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, Supplier: "SUPPL1", + 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, Supplier: "SUPPL1", + 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, Supplier: "SUPPL1", + 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()) @@ -492,21 +492,21 @@ func TestMySQLSetRatedCdr(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, Supplier: "SUPPL1", + 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, Supplier: "SUPPL1", + 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, Supplier: "SUPPL1", + 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()) @@ -808,7 +808,7 @@ func TestMySQLGetStoredCdrs(t *testing.T) { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on ignoreDerived - if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnDerived: true}); err != nil { + if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnRated: true}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 0 { // ToDo: Recheck this value t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) @@ -850,3 +850,80 @@ func TestMySQLRemStoredCdrs(t *testing.T) { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } } + +// Make sure that what we get is what we set +func TestMySQLStoreRestoreCdr(t *testing.T) { + if !*testLocal { + return + } + strCdr := &StoredCdr{TOR: utils.VOICE, AccId: "ccc1", CdrHost: "192.168.1.1", CdrSource: "TEST_CDR", 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, 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} + strCdr.CgrId = utils.Sha1(strCdr.AccId, strCdr.SetupTime.String()) + if err := mysqlDb.SetCdr(strCdr); err != nil { + t.Error(err.Error()) + } + if err := mysqlDb.SetRatedCdr(strCdr); err != nil { + t.Error(err.Error()) + } + // Check RawCdr + if rcvCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}}); err != nil { + t.Error(err.Error()) + } else if len(rcvCdrs) != 1 { + t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs) + } else { + rcvCdr := rcvCdrs[0] + if strCdr.CgrId != rcvCdr.CgrId || + strCdr.TOR != rcvCdr.TOR || + strCdr.AccId != rcvCdr.AccId || + strCdr.CdrHost != rcvCdr.CdrHost || + strCdr.ReqType != rcvCdr.ReqType || + strCdr.Direction != rcvCdr.Direction || + strCdr.Tenant != rcvCdr.Tenant || + strCdr.Category != rcvCdr.Category || + strCdr.Account != rcvCdr.Account || + strCdr.Subject != rcvCdr.Subject || + strCdr.Destination != rcvCdr.Destination || + !strCdr.SetupTime.Equal(rcvCdr.SetupTime) || + !strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || + strCdr.Usage != rcvCdr.Usage || + strCdr.Pdd != rcvCdr.Pdd || + strCdr.Supplier != rcvCdr.Supplier || + strCdr.DisconnectCause != rcvCdr.DisconnectCause || + !reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) { + t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvCdrs[0]) + } + } + // Check RatedCdr + if rcvCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}, FilterOnRated: true}); err != nil { + t.Error(err.Error()) + } else if len(rcvCdrs) != 1 { + t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs) + } else { + rcvCdr := rcvCdrs[0] + if strCdr.CgrId != rcvCdr.CgrId || + strCdr.TOR != rcvCdr.TOR || + strCdr.AccId != rcvCdr.AccId || + strCdr.CdrHost != rcvCdr.CdrHost || + strCdr.ReqType != rcvCdr.ReqType || + strCdr.Direction != rcvCdr.Direction || + strCdr.Tenant != rcvCdr.Tenant || + strCdr.Category != rcvCdr.Category || + strCdr.Account != rcvCdr.Account || + strCdr.Subject != rcvCdr.Subject || + strCdr.Destination != rcvCdr.Destination || + //!strCdr.SetupTime.Equal(rcvCdr.SetupTime) || // FixMe + //!strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || // FixMe + strCdr.Usage != rcvCdr.Usage || + strCdr.Pdd != rcvCdr.Pdd || + strCdr.Supplier != rcvCdr.Supplier || + strCdr.DisconnectCause != rcvCdr.DisconnectCause || + strCdr.Cost != rcvCdr.Cost || + !reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) { + t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvCdrs[0]) + } + } +} diff --git a/engine/storage_postgres.go b/engine/storage_postgres.go index 3c7b6c324..e91ac6161 100644 --- a/engine/storage_postgres.go +++ b/engine/storage_postgres.go @@ -138,6 +138,7 @@ func (self *PostgresStorage) SetRatedCdr(cdr *StoredCdr) (err error) { SetupTime: cdr.SetupTime, AnswerTime: cdr.AnswerTime, Usage: cdr.Usage.Seconds(), + Pdd: cdr.Pdd.Seconds(), Supplier: cdr.Supplier, DisconnectCause: cdr.DisconnectCause, Cost: cdr.Cost, @@ -149,7 +150,8 @@ func (self *PostgresStorage) SetRatedCdr(cdr *StoredCdr) (err error) { tx = self.db.Begin() updated := tx.Model(TblRatedCdr{}).Where(&TblRatedCdr{Cgrid: cdr.CgrId, Runid: cdr.MediationRunId}).Updates(&TblRatedCdr{Reqtype: cdr.ReqType, Direction: cdr.Direction, Tenant: cdr.Tenant, Category: cdr.Category, Account: cdr.Account, Subject: cdr.Subject, Destination: cdr.Destination, - SetupTime: cdr.SetupTime, AnswerTime: cdr.AnswerTime, Usage: cdr.Usage.Seconds(), Supplier: cdr.Supplier, DisconnectCause: cdr.DisconnectCause, Cost: cdr.Cost, ExtraInfo: cdr.ExtraInfo, + SetupTime: cdr.SetupTime, AnswerTime: cdr.AnswerTime, Usage: cdr.Usage.Seconds(), Pdd: cdr.Pdd.Seconds(), Supplier: cdr.Supplier, DisconnectCause: cdr.DisconnectCause, + Cost: cdr.Cost, ExtraInfo: cdr.ExtraInfo, UpdatedAt: time.Now()}) if updated.Error != nil { tx.Rollback() diff --git a/engine/storage_psql_local_test.go b/engine/storage_psql_local_test.go index 04f18b52c..420fceb1e 100644 --- a/engine/storage_psql_local_test.go +++ b/engine/storage_psql_local_test.go @@ -800,7 +800,7 @@ func TestPSQLGetStoredCdrs(t *testing.T) { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } // Filter on ignoreDerived - if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnDerived: true}); err != nil { + if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnRated: true}); err != nil { t.Error(err.Error()) } else if len(storedCdrs) != 0 { // ToDo: Recheck this value t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) @@ -842,3 +842,80 @@ func TestPSQLRemStoredCdrs(t *testing.T) { t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs) } } + +// Make sure that what we get is what we set +func TestPSQLStoreRestoreCdr(t *testing.T) { + if !*testLocal { + return + } + strCdr := &StoredCdr{TOR: utils.VOICE, AccId: "ccc1", CdrHost: "192.168.1.1", CdrSource: "TEST_CDR", 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, 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} + strCdr.CgrId = utils.Sha1(strCdr.AccId, strCdr.SetupTime.String()) + if err := psqlDb.SetCdr(strCdr); err != nil { + t.Error(err.Error()) + } + if err := psqlDb.SetRatedCdr(strCdr); err != nil { + t.Error(err.Error()) + } + // Check RawCdr + if rcvCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}}); err != nil { + t.Error(err.Error()) + } else if len(rcvCdrs) != 1 { + t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs) + } else { + rcvCdr := rcvCdrs[0] + if strCdr.CgrId != rcvCdr.CgrId || + strCdr.TOR != rcvCdr.TOR || + strCdr.AccId != rcvCdr.AccId || + strCdr.CdrHost != rcvCdr.CdrHost || + strCdr.ReqType != rcvCdr.ReqType || + strCdr.Direction != rcvCdr.Direction || + strCdr.Tenant != rcvCdr.Tenant || + strCdr.Category != rcvCdr.Category || + strCdr.Account != rcvCdr.Account || + strCdr.Subject != rcvCdr.Subject || + strCdr.Destination != rcvCdr.Destination || + !strCdr.SetupTime.Equal(rcvCdr.SetupTime) || + !strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || + strCdr.Usage != rcvCdr.Usage || + strCdr.Pdd != rcvCdr.Pdd || + strCdr.Supplier != rcvCdr.Supplier || + strCdr.DisconnectCause != rcvCdr.DisconnectCause || + !reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) { + t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvCdrs[0]) + } + } + // Check RatedCdr + if rcvCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}, FilterOnRated: true}); err != nil { + t.Error(err.Error()) + } else if len(rcvCdrs) != 1 { + t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs) + } else { + rcvCdr := rcvCdrs[0] + if strCdr.CgrId != rcvCdr.CgrId || + strCdr.TOR != rcvCdr.TOR || + strCdr.AccId != rcvCdr.AccId || + strCdr.CdrHost != rcvCdr.CdrHost || + strCdr.ReqType != rcvCdr.ReqType || + strCdr.Direction != rcvCdr.Direction || + strCdr.Tenant != rcvCdr.Tenant || + strCdr.Category != rcvCdr.Category || + strCdr.Account != rcvCdr.Account || + strCdr.Subject != rcvCdr.Subject || + strCdr.Destination != rcvCdr.Destination || + //!strCdr.SetupTime.Equal(rcvCdr.SetupTime) || // FixMe + //!strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || // FixMe + strCdr.Usage != rcvCdr.Usage || + strCdr.Pdd != rcvCdr.Pdd || + strCdr.Supplier != rcvCdr.Supplier || + strCdr.DisconnectCause != rcvCdr.DisconnectCause || + strCdr.Cost != rcvCdr.Cost || + !reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) { + t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvCdrs[0]) + } + } +} diff --git a/engine/storage_sql.go b/engine/storage_sql.go index f53487fd8..e37a37f77 100644 --- a/engine/storage_sql.go +++ b/engine/storage_sql.go @@ -742,6 +742,7 @@ func (self *SQLStorage) SetCdr(cdr *StoredCdr) error { SetupTime: cdr.SetupTime, AnswerTime: cdr.AnswerTime, Usage: cdr.Usage.Seconds(), + Pdd: cdr.Pdd.Seconds(), Supplier: cdr.Supplier, DisconnectCause: cdr.DisconnectCause, CreatedAt: time.Now()}) @@ -766,16 +767,16 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, var cdrs []*StoredCdr // Select string var selectStr string - if qryFltr.FilterOnDerived { // We use different tables to query account data in case of derived - selectStr = fmt.Sprintf("%s.cgrid,%s.id,%s.tor,%s.accid,%s.cdrhost,%s.cdrsource,%s.reqtype,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.setup_time,%s.answer_time,%s.usage,%s.supplier,%s.disconnect_cause,%s.extra_fields,%s.runid,%s.cost,%s.tor,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.cost,%s.timespans", - utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, + if qryFltr.FilterOnRated { // We use different tables to query account data in case of derived + selectStr = fmt.Sprintf("%s.cgrid,%s.id,%s.tor,%s.accid,%s.cdrhost,%s.cdrsource,%s.reqtype,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.setup_time,%s.answer_time,%s.usage,%s.pdd,%s.supplier,%s.disconnect_cause,%s.extra_fields,%s.runid,%s.cost,%s.tor,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.cost,%s.timespans", + utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_CDRS_EXTRA, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS) } else { - selectStr = fmt.Sprintf("%s.cgrid,%s.id,%s.tor,%s.accid,%s.cdrhost,%s.cdrsource,%s.reqtype,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.setup_time,%s.answer_time,%s.usage,%s.supplier,%s.disconnect_cause,%s.extra_fields,%s.runid,%s.cost,%s.tor,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.cost,%s.timespans", - utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, + selectStr = fmt.Sprintf("%s.cgrid,%s.id,%s.tor,%s.accid,%s.cdrhost,%s.cdrsource,%s.reqtype,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.setup_time,%s.answer_time,%s.usage,%s.pdd,%s.supplier,%s.disconnect_cause,%s.extra_fields,%s.runid,%s.cost,%s.tor,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.cost,%s.timespans", utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, + utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_EXTRA, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS) @@ -821,91 +822,91 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, } if len(qryFltr.ReqTypes) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".reqtype in (?)", qryFltr.ReqTypes) } if len(qryFltr.NotReqTypes) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".reqtype not in (?)", qryFltr.NotReqTypes) } if len(qryFltr.Directions) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".direction in (?)", qryFltr.Directions) } if len(qryFltr.NotDirections) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".direction not in (?)", qryFltr.NotDirections) } if len(qryFltr.Tenants) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".tenant in (?)", qryFltr.Tenants) } if len(qryFltr.NotTenants) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".tenant not in (?)", qryFltr.NotTenants) } if len(qryFltr.Categories) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".category in (?)", qryFltr.Categories) } if len(qryFltr.NotCategories) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".category not in (?)", qryFltr.NotCategories) } if len(qryFltr.Accounts) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".account in (?)", qryFltr.Accounts) } if len(qryFltr.NotAccounts) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".account not in (?)", qryFltr.NotAccounts) } if len(qryFltr.Subjects) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".subject in (?)", qryFltr.Subjects) } if len(qryFltr.NotSubjects) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".subject not in (?)", qryFltr.NotSubjects) } if len(qryFltr.DestPrefixes) != 0 { // A bit ugly but still more readable than scopes provided by gorm tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } qIds := bytes.NewBufferString("(") @@ -920,7 +921,7 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, } if len(qryFltr.NotDestPrefixes) != 0 { // A bit ugly but still more readable than scopes provided by gorm tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } qIds := bytes.NewBufferString("(") @@ -935,28 +936,28 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, } if len(qryFltr.Suppliers) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".supplier in (?)", qryFltr.Subjects) } if len(qryFltr.NotSuppliers) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".supplier not in (?)", qryFltr.NotSubjects) } if len(qryFltr.DisconnectCauses) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".disconnect_cause in (?)", qryFltr.DisconnectCauses) } if len(qryFltr.NotDisconnectCauses) != 0 { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".disconnect_cause not in (?)", qryFltr.NotDisconnectCauses) @@ -1013,70 +1014,70 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, } if qryFltr.SetupTimeStart != nil { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".setup_time >= ?", qryFltr.SetupTimeStart) } if qryFltr.SetupTimeEnd != nil { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".setup_time < ?", qryFltr.SetupTimeEnd) } if qryFltr.AnswerTimeStart != nil && !qryFltr.AnswerTimeStart.IsZero() { // With IsZero we keep backwards compatible with ApierV1 tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".answer_time >= ?", qryFltr.AnswerTimeStart) } if qryFltr.AnswerTimeEnd != nil && !qryFltr.AnswerTimeEnd.IsZero() { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".answer_time < ?", qryFltr.AnswerTimeEnd) } if qryFltr.CreatedAtStart != nil && !qryFltr.CreatedAtStart.IsZero() { // With IsZero we keep backwards compatible with ApierV1 tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".created_at >= ?", qryFltr.CreatedAtStart) } if qryFltr.CreatedAtEnd != nil && !qryFltr.CreatedAtEnd.IsZero() { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".created_at < ?", qryFltr.CreatedAtEnd) } if qryFltr.UpdatedAtStart != nil && !qryFltr.UpdatedAtStart.IsZero() { // With IsZero we keep backwards compatible with ApierV1 tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".updated_at >= ?", qryFltr.UpdatedAtStart) } if qryFltr.UpdatedAtEnd != nil && !qryFltr.UpdatedAtEnd.IsZero() { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".updated_at < ?", qryFltr.UpdatedAtEnd) } if qryFltr.UsageStart != nil { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".usage >= ?", qryFltr.UsageStart) } if qryFltr.UsageEnd != nil { tblName := utils.TBL_CDRS_PRIMARY - if qryFltr.FilterOnDerived { + if qryFltr.FilterOnRated { tblName = utils.TBL_RATED_CDRS } q = q.Where(tblName+".usage < ?", qryFltr.UsageEnd) @@ -1124,11 +1125,11 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, var extraFields, ccTimespansBytes []byte var setupTime, answerTime mysql.NullTime var orderid int64 - var usage, cost, ccCost sql.NullFloat64 + var usage, pdd, cost, ccCost sql.NullFloat64 var extraFieldsMp map[string]string var ccTimespans TimeSpans if err := rows.Scan(&cgrid, &orderid, &tor, &accid, &cdrhost, &cdrsrc, &reqtype, &direction, &tenant, &category, &account, &subject, &destination, - &setupTime, &answerTime, &usage, &ccSupplier, &ccDisconnectCause, + &setupTime, &answerTime, &usage, &pdd, &ccSupplier, &ccDisconnectCause, &extraFields, &runid, &cost, &ccTor, &ccDirection, &ccTenant, &ccCategory, &ccAccount, &ccSubject, &ccDestination, &ccCost, &ccTimespansBytes); err != nil { return nil, 0, err } @@ -1143,11 +1144,12 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr, } } usageDur, _ := time.ParseDuration(strconv.FormatFloat(usage.Float64, 'f', -1, 64) + "s") + pddDur, _ := time.ParseDuration(strconv.FormatFloat(pdd.Float64, 'f', -1, 64) + "s") storCdr := &StoredCdr{ CgrId: cgrid.String, OrderId: orderid, TOR: tor.String, AccId: accid.String, CdrHost: cdrhost.String, CdrSource: cdrsrc.String, ReqType: reqtype.String, Direction: direction.String, Tenant: tenant.String, Category: category.String, Account: account.String, Subject: subject.String, Destination: destination.String, - SetupTime: setupTime.Time, AnswerTime: answerTime.Time, Usage: usageDur, Supplier: ccSupplier.String, DisconnectCause: ccDisconnectCause.String, + SetupTime: setupTime.Time, AnswerTime: answerTime.Time, Usage: usageDur, Pdd: pddDur, Supplier: ccSupplier.String, DisconnectCause: ccDisconnectCause.String, ExtraFields: extraFieldsMp, MediationRunId: runid.String, RatedAccount: ccAccount.String, RatedSubject: ccSubject.String, Cost: cost.Float64, } if ccTimespans != nil { diff --git a/general_tests/tutorial_fs_calls_test.go b/general_tests/tutorial_fs_calls_test.go index 2fb87c528..06a80a599 100644 --- a/general_tests/tutorial_fs_calls_test.go +++ b/general_tests/tutorial_fs_calls_test.go @@ -292,7 +292,7 @@ func TestTutFsCallsCdrs(t *testing.T) { t.Errorf("Unexpected Usage for CDR: %+v", reply[0]) } } - req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnDerived: true} + req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnRated: true} if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { diff --git a/general_tests/tutorial_kam_calls_test.go b/general_tests/tutorial_kam_calls_test.go index 3136dcc22..bda5f3b2a 100644 --- a/general_tests/tutorial_kam_calls_test.go +++ b/general_tests/tutorial_kam_calls_test.go @@ -380,7 +380,7 @@ func TestTutKamCallsCdrs(t *testing.T) { t.Errorf("Unexpected Supplier for CDR: %+v", reply[0]) } } - req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnDerived: true} + req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnRated: true} if err := tutKamCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 2 { diff --git a/general_tests/tutorial_osips_calls_test.go b/general_tests/tutorial_osips_calls_test.go index 4849ad386..d48b74265 100644 --- a/general_tests/tutorial_osips_calls_test.go +++ b/general_tests/tutorial_osips_calls_test.go @@ -290,7 +290,7 @@ func TestTutOsipsCallsCdrs(t *testing.T) { t.Errorf("Unexpected Usage for CDR: %+v", reply[0]) } } - req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnDerived: true} + req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnRated: true} if err := tutOsipsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil { t.Error("Unexpected error: ", err.Error()) } else if len(reply) != 1 { diff --git a/utils/apitpdata.go b/utils/apitpdata.go index 6e429a8e8..595ae348a 100644 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -963,7 +963,7 @@ type CdrsFilter struct { UsageEnd *float64 // End of the usage interval (<) CostStart *float64 // Start of the cost interval (>=) CostEnd *float64 // End of the usage interval (<) - FilterOnDerived bool // Do not consider derived CDRs but original one + FilterOnRated bool // Do not consider rated CDRs but raw one Count bool // If true count the items instead of returning data Paginator } @@ -1020,7 +1020,7 @@ type RpcCdrsFilter struct { UsageEnd *float64 // End of the usage interval (<) CostStart *float64 // Start of the cost interval (>=) CostEnd *float64 // End of the usage interval (<) - FilterOnDerived bool // Do not consider derived CDRs but original one + FilterOnRated bool // Do not consider derived CDRs but original one Paginator // Add pagination } @@ -1068,7 +1068,7 @@ func (self *RpcCdrsFilter) AsCdrsFilter() (*CdrsFilter, error) { UsageEnd: self.UsageEnd, CostStart: self.CostStart, CostEnd: self.CostEnd, - FilterOnDerived: self.FilterOnDerived, + FilterOnRated: self.FilterOnRated, Paginator: self.Paginator, } if len(self.SetupTimeStart) != 0 {