mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-13 19:56:38 +05:00
SMG refund cases handling
This commit is contained in:
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user