Hal De 3 år sedan
förälder
incheckning
16a6b7a679
1 ändrade filer med 37 tillägg och 18 borttagningar
  1. 37 18
      app0/cel.py

+ 37 - 18
app0/cel.py

@@ -37,31 +37,50 @@ class CdrEvent:
 class CdrEvents:
   def __init__(self):
     self._events = []
-    self._channels = []
-    self._dstchannels = []
+    self._channels = {}
+    self._dstchannels = {}
     self.start = 0
+    self._waitingchannel = None
     
   def add(self, event):
     if not isinstance(event, CdrEvent):
       event = CdrEvent(event)
     if not self.start:
         self.start = event.calldate
-    if event.channel not in self._channels:
-        self._channels[event.channel] = event
-    if event.dstchannel not in self._dstchannels:
-        self._dstchannels[event.dstchannel] = event.dst
+    if (event.channel.id not in self._channels):
+        self._channels[event.channel.id] = event
+    if (event.dstchannel.id not in self._dstchannels):
+        self._dstchannels[event.dstchannel.id] = event.dst
+    if (self._waitingchannel is not None) and (self._waitingchannel.id == event.channel.id): # if dial event after queue event
+        for e in self._events:
+          if (e.lastapp == 'Queue') and (e.dstchannel.id == event.channel.id):
+            e.duration = (event.calldate-e.calldate).total_seconds() +  event.duration 
+            e.billsec = event.billsec
+        self._waitingchannel = None
     if (event.lastapp == 'Queue'):
+      event.billsec = 0
+      queueevent = event 
       for e in self._events:
-        if (e.lastapp == 'Queue') and (e.uniqueid == event.uniqueid):
-          if (event.disposition == 'ANSWERED'):
-            e.disposition = 'ANSWERED'
-            if event.dstchannel in self._channels:
-              dialevent = self._channels[event.dstchannel]
-              e.duration = e.start-dialevent.start +  dialevent.duration 
-              e.billsec = dialevent.billsec
-          return # if it not fiars queue event - miss it
-    if (event.lastapp == 'Dial' and event.dstchannel in self._dstchannels):
-        event.dst = self._dstchannels[event.dstchannel]
+        if (e.lastapp == 'Queue') and (e.uniqueid == event.uniqueid):#find first queue event
+          queueevent = e
+      if (event.disposition == 'ANSWERED'): #if it answered - fill duration and waitng based on answered dial event
+        queueevent.disposition = 'ANSWERED'
+        queueevent.dstchannel = event.dstchannel
+        if (event.dstchannel.id in self._channels): # if dial event before queue event
+          dialevent = self._channels[event.dstchannel.id]
+          queueevent.duration = (dialevent.calldate-queueevent.calldate).total_seconds() +  dialevent.duration 
+          queueevent.billsec = dialevent.billsec
+        else:
+          self._waitingchannel = event.dstchannel # wait for dial event
+      else: 
+        if queueevent.disposition != 'ANSWERED': #count total queue duration
+          queueevent.duration = (event.calldate-queueevent.calldate).total_seconds() +  event.duration
+      if (event != queueevent):
+        return; # add only forst queue event
+    if (event.lastapp == 'Dial' and event.dstchannel.id in self._dstchannels):
+        event.dst = self._dstchannels[event.dstchannel.id] #get dst from fisrt event with rthis channel. for transfer
+    if (event.lastapp == 'Dial' and event.dstchannel.id in self._channels):
+        event.dst = self._channels[event.dstchannel.id].dst #for transfer to queue
     self.end = event.calldate + td(seconds=event.duration)
     self._events.append(event)
 
@@ -96,9 +115,9 @@ class CdrEvents:
         simple_event = {'start': event.calldate,
             'answered': event.disposition=='ANSWERED',
             'duration': event.billsec,
-            'waiting': event.duration = event.billsec,
+            'waiting': event.duration - event.billsec,
             'application': event.lastapp,
-            'src': event.src,
+            'caller': event.cnum,
             'dst': event.dst,
             'uniqueid': event.uniqueid,
             'file': event.recordingfile}