From 8aeeda48857c2e421248d2f42eb5e0c7336cfeaa Mon Sep 17 00:00:00 2001 From: DanB Date: Tue, 19 Nov 2019 18:18:03 +0100 Subject: [PATCH] EventCost AsRefundIncrements properly handling extra charges --- engine/eventcost.go | 5 +- engine/eventcost_test.go | 283 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 265 insertions(+), 23 deletions(-) diff --git a/engine/eventcost.go b/engine/eventcost.go index 8f6333a36..10d174b09 100644 --- a/engine/eventcost.go +++ b/engine/eventcost.go @@ -293,16 +293,19 @@ func (ec *EventCost) AsRefundIncrements(tor string) (cd *CallDescriptor) { } if ec.Accounting[cIcrm.AccountingID].ExtraChargeID == utils.META_NONE || ec.Accounting[cIcrm.AccountingID].ExtraChargeID == utils.EmptyString { + iIdx++ continue } // extra charges, ie: non-free *voice - extraSmry := ec.AccountSummary.BalanceSummaries.BalanceSummaryWithUUD(ec.Accounting[cIcrm.AccountingID].ExtraChargeID) + extraSmry := ec.AccountSummary.BalanceSummaries.BalanceSummaryWithUUD( + ec.Accounting[ec.Accounting[cIcrm.AccountingID].ExtraChargeID].BalanceUUID) if extraSmry.Type == utils.MONETARY { cd.Increments[iIdx].BalanceInfo.Monetary = &MonetaryInfo{UUID: extraSmry.UUID} } else if NonMonetaryBalances.HasField(blncSmry.Type) { cd.Increments[iIdx].BalanceInfo.Unit = &UnitInfo{UUID: extraSmry.UUID} } } + iIdx++ } } } diff --git a/engine/eventcost_test.go b/engine/eventcost_test.go index 4a46a72a2..aa8f13cfa 100644 --- a/engine/eventcost_test.go +++ b/engine/eventcost_test.go @@ -105,18 +105,19 @@ var testEC = &EventCost{ ID: "dan", BalanceSummaries: []*BalanceSummary{ &BalanceSummary{ - Type: "*monetary", - Value: 50, - Disabled: false}, + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010", + Type: utils.MONETARY, + Value: 50, + }, &BalanceSummary{ - ID: "4b8b53d7-c1a1-4159-b845-4623a00a0165", - Type: "*monetary", - Value: 25, - Disabled: false}, + UUID: "7a54a9e9-d610-4c82-bcb5-a315b9a65010", + Type: utils.MONETARY, + Value: 25, + }, &BalanceSummary{ - Type: "*voice", - Value: 200, - Disabled: false, + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165", + Type: utils.VOICE, + Value: 200, }, }, AllowNegative: false, @@ -157,14 +158,14 @@ var testEC = &EventCost{ }, "44d6c02": &BalanceCharge{ AccountID: "cgrates.org:dan", - BalanceUUID: "7a54a9e9-d610-4c82-bcb5-a315b9a65010", + BalanceUUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165", RatingID: "3cd6425", Units: 1, ExtraChargeID: "188bfa6", }, "3455b83": &BalanceCharge{ AccountID: "cgrates.org:dan", - BalanceUUID: "9d54a9e9-d610-4c82-bcb5-a315b9a65089", + BalanceUUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165", Units: 1, ExtraChargeID: "*none", }, @@ -688,6 +689,242 @@ func TestNewEventCostFromCallCost(t *testing.T) { } } +func TestECAsRefundIncrements(t *testing.T) { + eCD := &CallDescriptor{ + CgrID: "164b0422fdc6a5117031b427439482c6a4f90e41", + RunID: utils.META_DEFAULT, + TOR: utils.VOICE, + TimeStart: time.Date(2017, 1, 9, 16, 18, 21, 0, time.UTC), + TimeEnd: time.Date(2017, 1, 9, 16, 28, 21, 0, time.UTC), + DurationIndex: time.Duration(10 * time.Minute), + } + eCD.Increments = Increments{ + &Increment{ + Duration: time.Duration(0), + Cost: 0.1, + CompressFactor: 1, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0, + CompressFactor: 10, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}}, + }, + &Increment{ + Duration: time.Duration(10 * time.Second), + Cost: 0.01, + CompressFactor: 2, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0.005, + CompressFactor: 30, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}, + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0.01, + CompressFactor: 60, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0.01, + CompressFactor: 60, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0.01, + CompressFactor: 60, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0.01, + CompressFactor: 60, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0, + CompressFactor: 10, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}}, + }, + &Increment{ + Duration: time.Duration(10 * time.Second), + Cost: 0.01, + CompressFactor: 2, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0.005, + CompressFactor: 30, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}, + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0, + CompressFactor: 10, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}}, + }, + &Increment{ + Duration: time.Duration(10 * time.Second), + Cost: 0.01, + CompressFactor: 2, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0.005, + CompressFactor: 30, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}, + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0, + CompressFactor: 10, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}}, + }, + &Increment{ + Duration: time.Duration(10 * time.Second), + Cost: 0.01, + CompressFactor: 2, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0.005, + CompressFactor: 30, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}, + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0, + CompressFactor: 10, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}}, + }, + &Increment{ + Duration: time.Duration(10 * time.Second), + Cost: 0.01, + CompressFactor: 2, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0.005, + CompressFactor: 30, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}, + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0, + CompressFactor: 10, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}}, + }, + &Increment{ + Duration: time.Duration(10 * time.Second), + Cost: 0.01, + CompressFactor: 2, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + &Increment{ + Duration: time.Duration(1 * time.Second), + Cost: 0.005, + CompressFactor: 30, + BalanceInfo: &DebitInfo{ + AccountID: "cgrates.org:dan", + Unit: &UnitInfo{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165"}, + Monetary: &MonetaryInfo{ + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010"}}, + }, + } + + if cd := testEC.Clone().AsRefundIncrements(utils.VOICE); !reflect.DeepEqual(eCD, cd) { + t.Errorf("expecting: %s\n\n, received: %s", utils.ToIJSON(eCD), utils.ToIJSON(cd)) + } +} + func TestECAsCallCost(t *testing.T) { acntSummary := &AccountSummary{ Tenant: "cgrates.org", @@ -2127,7 +2364,7 @@ func TestECSyncKeys(t *testing.T) { &ChargingIncrement{ Usage: time.Duration(1 * time.Second), Cost: 0.005, - AccountingID: "24d6c02", + AccountingID: "44d6c02", CompressFactor: 30, }, }, @@ -2163,7 +2400,7 @@ func TestECSyncKeys(t *testing.T) { &ChargingIncrement{ Usage: time.Duration(1 * time.Second), Cost: 0.005, - AccountingID: "24d6c02", + AccountingID: "44d6c02", CompressFactor: 30, }, }, @@ -2175,15 +2412,17 @@ func TestECSyncKeys(t *testing.T) { ID: "dan", BalanceSummaries: []*BalanceSummary{ &BalanceSummary{ - Type: "*monetary", + UUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010", + Type: utils.MONETARY, Value: 50, Disabled: false}, &BalanceSummary{ - ID: "4b8b53d7-c1a1-4159-b845-4623a00a0165", - Type: "*monetary", + UUID: "7a54a9e9-d610-4c82-bcb5-a315b9a65010", + Type: utils.MONETARY, Value: 25, Disabled: false}, &BalanceSummary{ + UUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165", Type: "*voice", Value: 200, Disabled: false, @@ -2226,16 +2465,16 @@ func TestECSyncKeys(t *testing.T) { BalanceUUID: "8c54a9e9-d610-4c82-bcb5-a315b9a65010", Units: 0.1, }, - "24d6c02": &BalanceCharge{ + "44d6c02": &BalanceCharge{ AccountID: "cgrates.org:dan", - BalanceUUID: "7a54a9e9-d610-4c82-bcb5-a315b9a65010", + BalanceUUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165", RatingID: "3cd6425", Units: 1, ExtraChargeID: "288bfa6", }, "3455b83": &BalanceCharge{ AccountID: "cgrates.org:dan", - BalanceUUID: "9d54a9e9-d610-4c82-bcb5-a315b9a65089", + BalanceUUID: "4b8b53d7-c1a1-4159-b845-4623a00a0165", Units: 1, ExtraChargeID: "*none", }, @@ -2295,9 +2534,9 @@ func TestECAsDataProvider(t *testing.T) { } else if data != "dan" { t.Errorf("Expecting: <%s> \nreceived: <%s>", "data", data) } - if data, err := ecDP.FieldAsInterface([]string{"AccountSummary", "BalanceSummaries[1]", "ID"}); err != nil { + if data, err := ecDP.FieldAsInterface([]string{"AccountSummary", "BalanceSummaries[1]", "UUID"}); err != nil { t.Error(err) - } else if data != "4b8b53d7-c1a1-4159-b845-4623a00a0165" { + } else if data != "7a54a9e9-d610-4c82-bcb5-a315b9a65010" { t.Errorf("Expecting: <%s> \nreceived: <%s>", "4b8b53d7-c1a1-4159-b845-4623a00a0165", data) } if data, err := ecDP.FieldAsInterface([]string{"AccountSummary", "BalanceSummaries[2]", "Type"}); err != nil {