SMG refund cases handling

This commit is contained in:
DanB
2017-03-09 18:48:34 +01:00
parent e1b772b714
commit 47dfa5af91
3 changed files with 45 additions and 21 deletions

View File

@@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package general_tests
import (
"encoding/json"
"net/rpc"
"net/rpc/jsonrpc"
"path"
@@ -198,17 +199,33 @@ func TestSMGa1ITDataSession1(t *testing.T) {
} else if rpl != utils.OK {
t.Errorf("Received reply: %s", rpl)
}
/*
var cdrs []*engine.ExternalCDR
req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}}
if err := smgA1rpc.Call("ApierV2.GetCdrs", req, &cdrs); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if len(cdrs) != 1 {
t.Error("Unexpected number of CDRs returned: ", len(cdrs))
} else {
if cdrs[0].Usage != "60" {
t.Errorf("Unexpected CDR Usage received, cdr: %v %+v ", cdrs[0].Usage, cdrs[0])
}
var cdrs []*engine.ExternalCDR
req := utils.RPCCDRsFilter{RunIDs: []string{utils.META_DEFAULT}}
if err := smgA1rpc.Call("ApierV2.GetCdrs", req, &cdrs); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if len(cdrs) != 1 {
t.Error("Unexpected number of CDRs returned: ", len(cdrs))
} else {
if cdrs[0].Usage != "2202800" {
t.Errorf("Unexpected CDR Usage received, cdr: %+v ", cdrs[0])
}
*/
var cc engine.CallCost
if err := json.Unmarshal([]byte(cdrs[0].CostDetails), &cc); err != nil {
t.Error(err)
}
if len(cc.Timespans) != 3 {
t.Errorf("Unexpected number of timespans: %+v", cc.Timespans)
}
if cc.RatedUsage != 2202800 {
t.Errorf("RatingUsage expected: %f received %f, callcost: %+v ", 2202800.0, cc.RatedUsage, cc)
}
}
expBalance := float64(10000000000 - 2202800) // initial - total usage
var acnt *engine.Account
if err := smgA1rpc.Call("ApierV2.GetAccount",
&utils.AttrGetAccount{Tenant: "cgrates.org", Account: "rpdata1"}, &acnt); err != nil {
t.Error(err)
} else if acnt.BalanceMap[utils.DATA].GetTotalValue() != expBalance { // We expect 11.5 since we have added in the previous test 1.5
t.Errorf("Expecting: %f, received: %f", expBalance, acnt.BalanceMap[utils.DATA].GetTotalValue())
}
}

View File

@@ -82,8 +82,6 @@ func (self *SMGSession) debitLoop(debitInterval time.Duration) {
// Attempts to debit a duration, returns maximum duration which can be debitted or error
func (self *SMGSession) debit(dur time.Duration, lastUsed *time.Duration) (time.Duration, error) {
//utils.Logger.Debug(fmt.Sprintf("### SMGSession.debit, dur: %f, lastUsed: %v, ExtraDuration: %f, lastUsage: %f, lastDebit: %f, totalUsage: %f",
// dur.Seconds(), lastUsed, self.ExtraDuration.Seconds(), self.LastUsage.Seconds(), self.LastDebit.Seconds(), self.TotalUsage.Seconds()))
requestedDuration := dur
if lastUsed != nil {
self.ExtraDuration = self.LastDebit - *lastUsed
@@ -111,7 +109,7 @@ func (self *SMGSession) debit(dur time.Duration, lastUsed *time.Duration) (time.
self.CD.TimeEnd = self.CD.TimeStart.Add(dur)
self.CD.DurationIndex += dur
cc := &engine.CallCost{}
if err := self.rals.Call("Responder.MaxDebit", self.CD, cc); err != nil {
if err := self.rals.Call("Responder.MaxDebit", self.CD, cc); err != nil || cc.GetDuration() == 0 {
self.LastUsage = 0
self.LastDebit = 0
return 0, err
@@ -221,12 +219,21 @@ func (self *SMGSession) mergeCCs() {
// Session has ended, check debits and refund the extra charged duration
func (self *SMGSession) close(endTime time.Time) (err error) {
if len(self.CallCosts) != 0 { // We have had at least one cost calculation
self.mergeCCs()
chargedEndTime := self.CallCosts[0].GetEndTime()
if endTime.After(chargedEndTime) { // we did not charge enough, make a debit here
_, err = self.debit(endTime.Sub(chargedEndTime), nil)
self.mergeCCs() // merge again so we can store the right value in db
chargedEndTime := self.CallCosts[len(self.CallCosts)-1].GetEndTime()
if endTime.After(chargedEndTime) { // we did not charge enough, make a manual debit here
extraDur := endTime.Sub(chargedEndTime)
if self.CD.LoopIndex > 0 {
self.CD.TimeStart = self.CD.TimeEnd
}
self.CD.TimeEnd = self.CD.TimeStart.Add(extraDur)
self.CD.DurationIndex += extraDur
cc := &engine.CallCost{}
if err = self.rals.Call("Responder.Debit", self.CD, cc); err == nil {
self.CallCosts = append(self.CallCosts, cc)
self.mergeCCs() // merge again so we can store the right value in db
}
} else {
self.mergeCCs()
err = self.refund(chargedEndTime.Sub(endTime))
}
}

View File

@@ -151,7 +151,7 @@ func TestSMGBiRPCSessionAutomaticDisconnects(t *testing.T) {
if err = smgBiRPC.Call("SMGenericV1.TerminateSession", smgEv, &rpl); err != nil || rpl != utils.OK {
t.Error(err)
}
time.Sleep(time.Duration(50 * time.Millisecond)) // Give time for debits to occur
time.Sleep(time.Duration(100 * time.Millisecond)) // Give time for debits to occur
if err := smgRPC.Call("ApierV2.GetAccount", attrGetAcnt, &acnt); err != nil {
t.Error(err)
} else if acnt.BalanceMap[utils.VOICE].GetTotalValue() != 0 {