// Stops the debit loop func (s *Session) Close(ev engine.Event) error { close(s.stopDebit) // Close the channel so all the sessionRuns listening will be notified if _, err := ev.GetEndTime(utils.META_DEFAULT, s.sessionManager.Timezone()); err != nil { utils.Logger.Err("Error parsing event stop time.") for idx := range s.sessionRuns { s.sessionRuns[idx].CallDescriptor.TimeEnd = s.sessionRuns[idx].CallDescriptor.TimeStart.Add(s.sessionRuns[idx].CallDescriptor.DurationIndex) } } // Costs refunds for _, sr := range s.SessionRuns() { if len(sr.CallCosts) == 0 { continue // why would we have 0 callcosts } //utils.Logger.Debug(fmt.Sprintf("ALL CALLCOSTS: %s", utils.ToJSON(sr.CallCosts))) lastCC := sr.CallCosts[len(sr.CallCosts)-1] lastCC.Timespans.Decompress() // put credit back startTime, err := ev.GetAnswerTime(sr.DerivedCharger.AnswerTimeField, s.sessionManager.Timezone()) if err != nil { utils.Logger.Crit("Error parsing prepaid call start time from event") return err } duration, err := ev.GetDuration(sr.DerivedCharger.UsageField) if err != nil { utils.Logger.Crit(fmt.Sprintf("Error parsing call duration from event: %s", err.Error())) return err } hangupTime := startTime.Add(duration) //utils.Logger.Debug(fmt.Sprintf("BEFORE REFUND: %s", utils.ToJSON(lastCC))) err = s.Refund(lastCC, hangupTime) //utils.Logger.Debug(fmt.Sprintf("AFTER REFUND: %s", utils.ToJSON(lastCC))) if err != nil { return err } } go s.SaveOperations() return nil }