def test_genera_entrante_incompleta(self): generador = GeneradorDeLlamadaLogs() generador.generar_log(self.entrante, False, 'ABANDON', '123', self.agente1, bridge_wait_time=5) logs_generados = LlamadaLog.objects.filter(campana_id=self.entrante.id) eventos_esperados = set(('ENTERQUEUE', 'ABANDON')) self.assertEqual(self.set_de_eventos(logs_generados), eventos_esperados) enterqueue = logs_generados.get(event='ENTERQUEUE') self.assertEqual(enterqueue.campana_id, self.entrante.id) self.assertEqual(enterqueue.tipo_campana, self.entrante.type) self.assertEqual(enterqueue.tipo_llamada, self.entrante.type) self.assertEqual(enterqueue.contacto_id, -1) self.assertEqual(enterqueue.agente_id, -1) self.assertEqual(enterqueue.bridge_wait_time, -1) self.assertEqual(enterqueue.duracion_llamada, -1) self.assertEqual(enterqueue.archivo_grabacion, '') abandon = logs_generados.get(event='ABANDON') self.assertEqual(abandon.campana_id, self.entrante.id) self.assertEqual(abandon.tipo_campana, self.entrante.type) self.assertEqual(abandon.tipo_llamada, self.entrante.type) self.assertEqual(abandon.contacto_id, -1) self.assertEqual(abandon.agente_id, -1) self.assertEqual(abandon.bridge_wait_time, 5) self.assertEqual(abandon.duracion_llamada, -1) self.assertEqual(abandon.archivo_grabacion, '')
def test_devuelve_correctamente_no_contactacion(self): """ este test testea todos los resultados las cantidad de los no contactdos chequeando que devuelva correctamente """ contactos = self.campana.bd_contacto.contactos.all() generador = GeneradorDeLlamadaLogs() cant_llamados = 100 for _ in range(0, cant_llamados): contacto = random.choice(contactos) estado = random.choice(self.estados) generador.generar_log(self.campana, False, estado, contacto.telefono, self.agente, contacto) cantidades = {} for estado in self.estados: cantidades[EstadisticasContactacion.MAP_ESTADO_ID[estado]] = 0 no_llamados = cant_llamados for contacto in contactos: logs = LlamadaLog.objects.filter( contacto_id=contacto.id).order_by('-id') if logs: log = logs[0] self.assertIn(log.event, self.estados) cantidades[EstadisticasContactacion.MAP_ESTADO_ID[ log.event]] += 1 no_llamados -= 1 estadisticas = EstadisticasContactacion() no_contactados = estadisticas.obtener_cantidad_no_contactados( self.campana) for key, value in no_contactados.items(): self.assertEqual(cantidades[key], value.cantidad)
def test_genera_preview_incompleta(self): generador = GeneradorDeLlamadaLogs() generador.generar_log(self.preview, False, 'BUSY', '123', self.agente1, self.contacto_p, bridge_wait_time=5) logs_generados = LlamadaLog.objects.filter(campana_id=self.preview.id) eventos_esperados = set(('DIAL', 'BUSY')) self.assertEqual(self.set_de_eventos(logs_generados), eventos_esperados) dial = logs_generados.get(event='DIAL') self.assertEqual(dial.campana_id, self.preview.id) self.assertEqual(dial.tipo_campana, self.preview.type) self.assertEqual(dial.tipo_llamada, self.preview.type) self.assertEqual(dial.agente_id, self.agente1.id) busy = logs_generados.get(event='BUSY') self.assertEqual(busy.campana_id, self.preview.id) self.assertEqual(busy.tipo_campana, self.preview.type) self.assertEqual(busy.tipo_llamada, self.preview.type) self.assertEqual(busy.bridge_wait_time, 5)
def test_genera_dialer_manual_incompleta(self): generador = GeneradorDeLlamadaLogs() generador.generar_log(self.dialer, True, 'BUSY', '123', self.agente1, bridge_wait_time=5) logs_generados = LlamadaLog.objects.filter(campana_id=self.dialer.id) eventos_esperados = set(('DIAL', 'BUSY')) self.assertEqual(self.set_de_eventos(logs_generados), eventos_esperados) dial = logs_generados.get(event='DIAL') self.assertEqual(dial.campana_id, self.dialer.id) self.assertEqual(dial.tipo_campana, self.dialer.type) self.assertEqual(dial.tipo_llamada, Campana.TYPE_MANUAL) self.assertEqual(dial.agente_id, self.agente1.id) busy = logs_generados.get(event='BUSY') self.assertEqual(busy.campana_id, self.dialer.id) self.assertEqual(busy.tipo_campana, self.dialer.type) self.assertEqual(busy.tipo_llamada, Campana.TYPE_MANUAL) self.assertEqual(busy.agente_id, self.agente1.id) self.assertEqual(busy.bridge_wait_time, 5)
def test_llamadas_de_tipo_por_fecha(self): tipo = str(Campana.TYPE_ENTRANTE) campana = self.entrante generador = GeneradorDeLlamadaLogs() for i in range(5): generador.generar_log(campana, False, 'COMPLETEOUTNUM', '123', self.agente1, bridge_wait_time=4, time=self.durante) for i in range(3): generador.generar_log(campana, False, 'COMPLETEAGENT', '123', self.agente1, bridge_wait_time=6) str_ayer = self.durante.strftime('%d-%m-%Y') str_hoy = self.hasta.strftime('%d-%m-%Y') self.hasta = fecha_hora_local(now()) reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) self.assertIn(tipo, reporte.estadisticas_por_fecha['llamadas_por_tipo']) self.assertIn( str_ayer, reporte.estadisticas_por_fecha['llamadas_por_tipo'][tipo]) self.assertIn( str_hoy, reporte.estadisticas_por_fecha['llamadas_por_tipo'][tipo]) datos_ayer = reporte.estadisticas_por_fecha['llamadas_por_tipo'][tipo][ str_ayer] datos_hoy = reporte.estadisticas_por_fecha['llamadas_por_tipo'][tipo][ str_hoy] self.assertEqual(datos_ayer['atendidas'], 5) self.assertEqual(datos_ayer['total'], 5) self.assertEqual(datos_hoy['atendidas'], 3) self.assertEqual(datos_hoy['total'], 3) self.assertIn( tipo, reporte.estadisticas_por_fecha['tipos_de_llamada_por_campana']) tipos_por_campana = reporte.estadisticas_por_fecha[ 'tipos_de_llamada_por_campana'][tipo] self.assertIn(str_ayer, tipos_por_campana[self.entrante.id]) self.assertIn(str_hoy, tipos_por_campana[self.entrante.id]) datos_ayer = tipos_por_campana[self.entrante.id][str_ayer] datos_hoy = tipos_por_campana[self.entrante.id][str_hoy] self.assertEqual(datos_ayer['atendidas'], 5) self.assertEqual(datos_ayer['recibidas'], 5) self.assertEqual(datos_ayer['t_espera_conexion'], 4) self.assertEqual(datos_hoy['atendidas'], 3) self.assertEqual(datos_hoy['recibidas'], 3) self.assertEqual(datos_hoy['t_espera_conexion'], 6)
def test_obtiene_contactos_no_llamados_campana_activas(self): reciclador = RecicladorContactosCampanaDIALER() contactos = self.campana_2.bd_contacto.contactos.all() generador = GeneradorDeLlamadaLogs() cant_llamados = 20 # Al ser una campana activa puede haber contactos no llamados, por lo tanto # solo llamamos a 20 de 100 contactos for i in range(0, cant_llamados): contacto = contactos[i] estado = random.choice(self.estados) generador.generar_log(self.campana_2, False, estado, contacto.telefono, None, contacto) contactos_no_llamados = reciclador._obtener_contactos_no_llamados( self.campana_2) self.assertEqual(len(contactos_no_llamados), 80)
def test_genera_entrante_completa(self): generador = GeneradorDeLlamadaLogs() generador.generar_log(self.entrante, False, 'COMPLETEAGENT', '123', self.agente1, bridge_wait_time=5, duracion_llamada=44, archivo_grabacion='archi') logs_generados = LlamadaLog.objects.filter(campana_id=self.entrante.id) eventos_esperados = set(('ENTERQUEUE', 'CONNECT', 'COMPLETEAGENT')) self.assertEqual(self.set_de_eventos(logs_generados), eventos_esperados) enterqueue = logs_generados.get(event='ENTERQUEUE') self.assertEqual(enterqueue.campana_id, self.entrante.id) self.assertEqual(enterqueue.tipo_campana, self.entrante.type) self.assertEqual(enterqueue.tipo_llamada, self.entrante.type) self.assertEqual(enterqueue.contacto_id, -1) self.assertEqual(enterqueue.agente_id, -1) self.assertEqual(enterqueue.bridge_wait_time, -1) self.assertEqual(enterqueue.duracion_llamada, -1) self.assertEqual(enterqueue.archivo_grabacion, '') connect = logs_generados.get(event='CONNECT') self.assertEqual(connect.campana_id, self.entrante.id) self.assertEqual(connect.tipo_campana, self.entrante.type) self.assertEqual(connect.tipo_llamada, self.entrante.type) self.assertEqual(connect.agente_id, self.agente1.id) self.assertEqual(connect.contacto_id, -1) self.assertEqual(connect.bridge_wait_time, 5) self.assertEqual(connect.duracion_llamada, -1) self.assertEqual(connect.archivo_grabacion, '') complete = logs_generados.get(event='COMPLETEAGENT') self.assertEqual(complete.campana_id, self.entrante.id) self.assertEqual(complete.tipo_campana, self.entrante.type) self.assertEqual(complete.tipo_llamada, self.entrante.type) self.assertEqual(complete.agente_id, self.agente1.id) self.assertEqual(complete.contacto_id, -1) self.assertEqual(complete.bridge_wait_time, 5) self.assertEqual(complete.duracion_llamada, 44) self.assertEqual(complete.archivo_grabacion, 'archi')
def _generar_llamadas_y_calificaciones(self, estados): contactos = self.campana.bd_contacto.contactos.all() opciones_calificacion = self.campana.opciones_calificacion.all() generador = GeneradorDeLlamadaLogs() for contacto in contactos: contactacion = random.choice([ 'contacta_califica', 'contacta_no_califica', 'no_contacta', 'no_llama' ]) if contactacion == 'contacta_califica': generador.generar_log(self.campana, False, 'COMPLETEOUTNUM', contacto.telefono, self.agente, contacto, 1, 1) opcion_calificacion = random.choice(opciones_calificacion) self.crear_calificacion_cliente(self.agente, contacto, opcion_calificacion) if contactacion == 'contacta_no_califica': generador.generar_log(self.campana, False, 'COMPLETEOUTNUM', contacto.telefono, self.agente, contacto, 1, 1) if contactacion == 'no_contacta': estado = random.choice(estados) generador.generar_log(self.campana, False, estado, contacto.telefono, None, contacto) if contactacion == 'no_llama': pass
def test_genera_preview_completa(self): generador = GeneradorDeLlamadaLogs() generador.generar_log(self.preview, False, 'COMPLETEAGENT', '123', self.agente1, self.contacto_p, bridge_wait_time=5, duracion_llamada=44, archivo_grabacion='archi') logs_generados = LlamadaLog.objects.filter(campana_id=self.preview.id) eventos_esperados = set(('DIAL', 'ANSWER', 'COMPLETEAGENT')) self.assertEqual(self.set_de_eventos(logs_generados), eventos_esperados) dial = logs_generados.get(event='DIAL') self.assertEqual(dial.campana_id, self.preview.id) self.assertEqual(dial.tipo_campana, self.preview.type) self.assertEqual(dial.tipo_llamada, self.preview.type) self.assertEqual(dial.agente_id, self.agente1.id) self.assertEqual(dial.contacto_id, self.contacto_p.id) answer = logs_generados.get(event='ANSWER') self.assertEqual(answer.campana_id, self.preview.id) self.assertEqual(answer.tipo_campana, self.preview.type) self.assertEqual(answer.tipo_llamada, self.preview.type) self.assertEqual(answer.agente_id, self.agente1.id) self.assertEqual(answer.contacto_id, self.contacto_p.id) self.assertEqual(answer.bridge_wait_time, 5) complete = logs_generados.get(event='COMPLETEAGENT') self.assertEqual(complete.campana_id, self.preview.id) self.assertEqual(complete.tipo_campana, self.preview.type) self.assertEqual(complete.tipo_llamada, self.preview.type) self.assertEqual(complete.agente_id, self.agente1.id) self.assertEqual(complete.contacto_id, self.contacto_p.id) self.assertEqual(complete.bridge_wait_time, 5) self.assertEqual(complete.duracion_llamada, 44) self.assertEqual(complete.archivo_grabacion, 'archi')
def test_genera_dialer_manual_completa(self): generador = GeneradorDeLlamadaLogs() generador.generar_log(self.dialer, True, 'COMPLETEOUTNUM', '123', self.agente1, bridge_wait_time=5, duracion_llamada=44, archivo_grabacion='archi') logs_generados = LlamadaLog.objects.filter(campana_id=self.dialer.id) eventos_esperados = set(('DIAL', 'ANSWER', 'COMPLETEOUTNUM')) self.assertEqual(self.set_de_eventos(logs_generados), eventos_esperados) dial = logs_generados.get(event='DIAL') self.assertEqual(dial.campana_id, self.dialer.id) self.assertEqual(dial.tipo_campana, self.dialer.type) self.assertEqual(dial.tipo_llamada, Campana.TYPE_MANUAL) self.assertEqual(dial.agente_id, self.agente1.id) answer = logs_generados.get(event='ANSWER') self.assertEqual(answer.campana_id, self.dialer.id) self.assertEqual(answer.tipo_campana, self.dialer.type) self.assertEqual(answer.tipo_llamada, Campana.TYPE_MANUAL) self.assertEqual(answer.agente_id, self.agente1.id) self.assertEqual(answer.bridge_wait_time, 5) complete = logs_generados.get(event='COMPLETEOUTNUM') self.assertEqual(complete.campana_id, self.dialer.id) self.assertEqual(complete.tipo_campana, self.dialer.type) self.assertEqual(complete.tipo_llamada, Campana.TYPE_MANUAL) self.assertEqual(complete.agente_id, self.agente1.id) self.assertEqual(complete.bridge_wait_time, 5) self.assertEqual(complete.duracion_llamada, 44) self.assertEqual(complete.archivo_grabacion, 'archi')
class ReporteDeLLamadasSalientesDeSupervisionTest(TestCase): def setUp(self): super(ReporteDeLLamadasSalientesDeSupervisionTest, self).setUp() self.generador = GeneradorDeLlamadaLogs() self.supervisor = SupervisorProfileFactory() self.agente1 = AgenteProfileFactory() self.manual = CampanaFactory.create(type=Campana.TYPE_MANUAL, nombre='camp-manual-1', estado=Campana.ESTADO_ACTIVA, supervisors=[self.supervisor.user]) self.opcion_calificacion_m1 = OpcionCalificacionFactory( campana=self.manual, tipo=OpcionCalificacion.GESTION) self.preview = CampanaFactory.create( type=Campana.TYPE_PREVIEW, nombre='camp-preview-1', estado=Campana.ESTADO_ACTIVA, supervisors=[self.supervisor.user]) self.opcion_calificacion_p1 = OpcionCalificacionFactory( campana=self.preview, tipo=OpcionCalificacion.GESTION) # Campañas que no deben estar en los reportes por no ser del supervisor self.manual2 = CampanaFactory.create(type=Campana.TYPE_MANUAL, nombre='camp-manual-2', estado=Campana.ESTADO_ACTIVA) self.preview2 = CampanaFactory.create(type=Campana.TYPE_PREVIEW, nombre='camp-preview-2', estado=Campana.ESTADO_ACTIVA) # Campañas que no deben estar en los reportes por no ser MANUAL o PREVIEW self.dialer = CampanaFactory.create(type=Campana.TYPE_DIALER, nombre='camp-dialer-1', estado=Campana.ESTADO_ACTIVA, supervisors=[self.supervisor.user]) self.opcion_calificacion_d1 = OpcionCalificacionFactory( campana=self.dialer, tipo=OpcionCalificacion.GESTION) self.dialer2 = CampanaFactory.create(type=Campana.TYPE_DIALER, nombre='camp-dialer-2', estado=Campana.ESTADO_ACTIVA) def test_reporte_vacio(self): reporte = ReporteDeLLamadasSalientesDeSupervision() for id_campana in [self.manual.id, self.dialer.id, self.preview.id]: self.assertNotIn(id_campana, reporte.estadisticas) self.assertNotIn(self.manual2.id, reporte.estadisticas) self.assertNotIn(self.dialer2.id, reporte.estadisticas) self.assertNotIn(self.preview2.id, reporte.estadisticas) def test_contabiliza_efectuadas_conectadas(self): self.generador.generar_log(self.manual, False, 'COMPLETEAGENT', '35100001111', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) self.generador.generar_log(self.preview, False, 'COMPLETEAGENT', '35100001112', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) self.generador.generar_log(self.preview, False, 'COMPLETEAGENT', '35100001113', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) # No contabiliza dialers self.generador.generar_log(self.dialer, True, 'COMPLETEAGENT', '35100001113', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) reporte = ReporteDeLLamadasSalientesDeSupervision() self.assertEqual(reporte.estadisticas[self.manual.id]['efectuadas'], 1) self.assertEqual(reporte.estadisticas[self.manual.id]['conectadas'], 1) self.assertEqual(reporte.estadisticas[self.manual.id]['no_conectadas'], 0) self.assertEqual(reporte.estadisticas[self.manual.id]['gestiones'], 0) self.assertEqual(reporte.estadisticas[self.preview.id]['efectuadas'], 2) self.assertEqual(reporte.estadisticas[self.preview.id]['conectadas'], 2) self.assertEqual( reporte.estadisticas[self.preview.id]['no_conectadas'], 0) self.assertEqual(reporte.estadisticas[self.preview.id]['gestiones'], 0) self.assertNotIn(self.dialer.id, reporte.estadisticas) def test_contabiliza_efectuadas_no_conectadas(self): self.generador.generar_log(self.manual, False, 'BUSY', '35100001111', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) self.generador.generar_log(self.preview, False, 'NOANSWER', '35100001112', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) self.generador.generar_log(self.preview, False, 'BLACKLIST', '35100001113', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) # No contabiliza Dialers self.generador.generar_log(self.dialer, True, 'CONGESTION', '35100001113', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) reporte = ReporteDeLLamadasSalientesDeSupervision() self.assertEqual(reporte.estadisticas[self.manual.id]['efectuadas'], 1) self.assertEqual(reporte.estadisticas[self.manual.id]['conectadas'], 0) self.assertEqual(reporte.estadisticas[self.manual.id]['no_conectadas'], 1) self.assertEqual(reporte.estadisticas[self.manual.id]['gestiones'], 0) self.assertEqual(reporte.estadisticas[self.preview.id]['efectuadas'], 2) self.assertEqual(reporte.estadisticas[self.preview.id]['conectadas'], 0) self.assertEqual( reporte.estadisticas[self.preview.id]['no_conectadas'], 2) self.assertEqual(reporte.estadisticas[self.preview.id]['gestiones'], 0) self.assertNotIn(self.dialer.id, reporte.estadisticas) def test_contabiliza_gestiones(self): CalificacionClienteFactory( opcion_calificacion=self.opcion_calificacion_m1, agente=self.agente1) CalificacionClienteFactory( opcion_calificacion=self.opcion_calificacion_p1, agente=self.agente1) CalificacionClienteFactory( opcion_calificacion=self.opcion_calificacion_d1, agente=self.agente1) reporte = ReporteDeLLamadasSalientesDeSupervision() self.assertNotIn(self.dialer.id, reporte.estadisticas) for id_campana in [self.manual.id, self.preview.id]: self.assertIn(id_campana, reporte.estadisticas) self.assertEqual(reporte.estadisticas[id_campana]['efectuadas'], 0) self.assertEqual(reporte.estadisticas[id_campana]['conectadas'], 0) self.assertEqual(reporte.estadisticas[id_campana]['no_conectadas'], 0) self.assertEqual(reporte.estadisticas[id_campana]['gestiones'], 1) def test_supervision_saliente_redis_family(self): CalificacionClienteFactory( opcion_calificacion=self.opcion_calificacion_m1, agente=self.agente1) CalificacionClienteFactory( opcion_calificacion=self.opcion_calificacion_d1, agente=self.agente1) CalificacionClienteFactory( opcion_calificacion=self.opcion_calificacion_p1, agente=self.agente1) reporte = ReporteDeLLamadasSalientesDeSupervision() redis_saliente = ReporteLlamadasSalienteFamily() self.assertEqual(len(reporte.estadisticas.keys()), 2) for id_campana in [self.manual.id, self.preview.id]: self.assertIn(id_campana, reporte.estadisticas) datos_redis = redis_saliente._create_dict( reporte.estadisticas[id_campana]) self.assertEqual(datos_redis['NOMBRE'], reporte.estadisticas[id_campana]['nombre']) self.assertEqual(datos_redis['ESTADISTICAS'], json.dumps(reporte.estadisticas[id_campana]))
class ReporteDeLLamadasEntrantesDeSupervisionTest(OMLBaseTest): PWD = u'admin123' def setUp(self): super(ReporteDeLLamadasEntrantesDeSupervisionTest, self).setUp() self.generador = GeneradorDeLlamadaLogs() self.agente1 = self.crear_agente_profile() self.agente2 = self.crear_agente_profile() self.entrante1 = CampanaFactory.create(type=Campana.TYPE_ENTRANTE, nombre='camp-entrante-1', estado=Campana.ESTADO_ACTIVA) self.opcion_calificacion = OpcionCalificacionFactory( campana=self.entrante1, tipo=OpcionCalificacion.GESTION) # Campaña que no debe estar en los reportes por no ser del supervisor self.entrante2 = CampanaFactory.create(type=Campana.TYPE_ENTRANTE, nombre='camp-entrante-2', estado=Campana.ESTADO_ACTIVA) self.queue = QueueFactory.create(campana=self.entrante1) @patch.object(ReporteDeLLamadasEntrantesDeSupervision, '_obtener_llamadas_en_espera_raw') def test_contabiliza_expiradas(self, _obtener_llamadas_en_espera_raw): self.generador.generar_log(self.entrante1, False, 'EXITWITHTIMEOUT', '35100001111', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=-1, archivo_grabacion='', time=None) reporte = ReporteDeLLamadasEntrantesDeSupervision() self.assertEqual( reporte.estadisticas[self.entrante1.id]['llamadas_atendidas'], 0) self.assertEqual( reporte.estadisticas[self.entrante1.id]['llamadas_expiradas'], 1) self.assertEqual( reporte.estadisticas[self.entrante1.id]['llamadas_abandonadas'], 0) self.assertEqual(reporte.estadisticas[self.entrante1.id]['gestiones'], 0) @patch.object(ReporteDeLLamadasEntrantesDeSupervision, '_obtener_llamadas_en_espera_raw') def test_contabiliza_gestiones(self, _obtener_llamadas_en_espera_raw): self.generador.generar_log(self.entrante1, False, 'COMPLETEAGENT', '35100001111', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) CalificacionClienteFactory( opcion_calificacion=self.opcion_calificacion, agente=self.agente1) reporte = ReporteDeLLamadasEntrantesDeSupervision() self.assertEqual( reporte.estadisticas[self.entrante1.id]['llamadas_atendidas'], 1) self.assertEqual( reporte.estadisticas[self.entrante1.id]['llamadas_expiradas'], 0) self.assertEqual( reporte.estadisticas[self.entrante1.id]['llamadas_abandonadas'], 0) self.assertEqual(reporte.estadisticas[self.entrante1.id]['gestiones'], 1) @patch.object(ReporteDeLLamadasEntrantesDeSupervision, '_obtener_llamadas_en_espera_raw') def test_contabiliza_promedio_tiempo_espera( self, _obtener_llamadas_en_espera_raw): callid_call1 = 1 callid_call2 = 2 self.generador.generar_log(self.entrante1, False, 'COMPLETEAGENT', '35100001111', agente=self.agente1, contacto=None, bridge_wait_time=3, duracion_llamada=10, archivo_grabacion='', time=None, callid=callid_call1) self.generador.generar_log(self.entrante1, False, 'COMPLETEOUTNUM', '35100001112', agente=self.agente1, contacto=None, bridge_wait_time=7, duracion_llamada=10, archivo_grabacion='', time=None, callid=callid_call1) self.generador.generar_log(self.entrante2, False, 'COMPLETEAGENT', '3510000117', agente=self.agente1, contacto=None, bridge_wait_time=4, duracion_llamada=10, archivo_grabacion='', time=None, callid=callid_call2) self.generador.generar_log(self.entrante2, False, 'COMPLETEAGENT', '35100001110', agente=self.agente1, contacto=None, bridge_wait_time=8, duracion_llamada=10, archivo_grabacion='', time=None, callid=callid_call2) reporte = ReporteDeLLamadasEntrantesDeSupervision() estadisticas = reporte.estadisticas self.assertEqual( estadisticas[self.entrante1.pk]['tiempo_acumulado_espera'], 10) self.assertEqual( estadisticas[self.entrante2.pk]['tiempo_acumulado_espera'], 12) @patch.object(ReporteDeLLamadasEntrantesDeSupervision, '_obtener_llamadas_en_espera_raw') def test_contabilizar_promedio_llamadas_abandonadas( self, _obtener_llamadas_en_espera_raw): self.generador.generar_log(self.entrante1, False, 'ABANDON', '35100001111', agente=self.agente1, contacto=None, bridge_wait_time=5, duracion_llamada=10, archivo_grabacion='', time=None) LlamadaLogFactory(tipo_campana=Campana.TYPE_ENTRANTE, tipo_llamada=LlamadaLog.LLAMADA_ENTRANTE, campana_id=self.entrante1.pk, event='ABANDONWEL', bridge_wait_time=2) reporte = ReporteDeLLamadasEntrantesDeSupervision() estadisticas = reporte.estadisticas self.assertEqual( estadisticas[self.entrante1.pk]['tiempo_acumulado_abandonadas'], 7) @patch.object(ReporteDeLLamadasEntrantesDeSupervision, '_obtener_llamadas_en_espera_raw') def test_reporte_vacio(self, _obtener_llamadas_en_espera_raw): reporte = ReporteDeLLamadasEntrantesDeSupervision() self.assertNotIn(self.entrante1.id, reporte.estadisticas) self.assertNotIn(self.entrante2.id, reporte.estadisticas) @patch.object(ReporteDeLLamadasEntrantesDeSupervision, '_obtener_llamadas_en_espera_raw') def test_contabiliza_atendidas(self, _obtener_llamadas_en_espera_raw): self.generador.generar_log(self.entrante1, False, 'COMPLETEAGENT', '35100001111', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) # No debe contar esta manual self.generador.generar_log(self.entrante1, True, 'COMPLETEAGENT', '35100001112', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) reporte = ReporteDeLLamadasEntrantesDeSupervision() self.assertEqual( reporte.estadisticas[self.entrante1.id]['llamadas_atendidas'], 1) self.assertEqual( reporte.estadisticas[self.entrante1.id]['llamadas_expiradas'], 0) self.assertEqual( reporte.estadisticas[self.entrante1.id]['llamadas_abandonadas'], 0) self.assertEqual(reporte.estadisticas[self.entrante1.id]['gestiones'], 0) def _generar_ami_response_llamadas_espera(self, campana_entrante): return ( 'Event: QueueEntry\r\nQueue: {0}_{1}\r\nMax: 5\r\nStrategy: ' 'rrmemory\r\nCalls: 0\r\nHoldtime: 0\r\nTalkTime: 0\r\n' 'Completed: 0\r\nAbandoned: 0\r\n' 'ServiceLevel: 30\r\nServicelevelPerf: 0.0\r\nServicelevelPerf2: 0.0\r\n' 'Weight: 0\r\n' 'ActionID: d9555aefdc48-00000001\r\n\r\nEvent: QueueStatusComplete\r\nActionID: ' 'd9555aefdc48-00000001\r\n' 'EventList: Complete\r\nListItems: 31\r\n').format( campana_entrante.id, campana_entrante.nombre) @patch.object(ReporteDeLLamadasEntrantesDeSupervision, '_obtener_llamadas_en_espera_raw') def test_contabilizar_llamadas_en_espera(self, _obtener_llamadas_en_espera_raw): self.generador.generar_log(self.entrante1, False, 'COMPLETEAGENT', '35100001111', agente=self.agente1, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) _obtener_llamadas_en_espera_raw.return_value = self._generar_ami_response_llamadas_espera( self.entrante1) reporte = ReporteDeLLamadasEntrantesDeSupervision() estadisticas = reporte.estadisticas self.assertEqual(estadisticas[self.entrante1.pk]['llamadas_en_espera'], 1)
class DashboardAgenteTests(OMLBaseTest): PWD = u'admin123' def setUp(self): self.usuario_admin_supervisor = UserFactory(is_staff=True, is_supervisor=True) self.usuario_admin_supervisor.set_password(self.PWD) self.usuario_admin_supervisor.save() super(DashboardAgenteTests, self).setUp() self.agente_profile = self.crear_agente_profile() self.campana_activa = CampanaFactory.create( estado=Campana.ESTADO_ACTIVA, type=Campana.TYPE_PREVIEW) self.generador = GeneradorDeLlamadaLogs() def test_se_muestran_estadisticas_del_dia_actual(self): ayer = now() - timedelta(days=1) self.generador.generar_log(self.campana_activa, False, 'COMPLETEAGENT', '35100001111', agente=self.agente_profile, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=ayer) self.generador.generar_log(self.campana_activa, False, 'COMPLETEOUTNUM', '35100001112', agente=self.agente_profile, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=None) reporte = ReporteEstadisticasDiariaAgente() logs_agente_reporte = reporte.estadisticas[ self.agente_profile.pk]['logs'] self.assertEqual(len(logs_agente_reporte), 1) def test_se_muestran_las_ultimas_10_llamadas(self): numero_llamada_excluida = '3510000111' ahora = now() self.generador.generar_log(self.campana_activa, False, 'COMPLETEAGENT', numero_llamada_excluida, agente=self.agente_profile, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=ahora) for i in range(1, 11): time_llamada = ahora + timedelta(minutes=i) self.generador.generar_log(self.campana_activa, False, 'COMPLETEAGENT', '35100213121', agente=self.agente_profile, contacto=None, bridge_wait_time=-1, duracion_llamada=10, archivo_grabacion='', time=time_llamada) reporte = ReporteEstadisticasDiariaAgente() reporte_agente = reporte.estadisticas[self.agente_profile.pk] llamada_excluida_encontrada = False for log in reporte_agente['logs']: if log['phone'] == numero_llamada_excluida: llamada_excluida_encontrada = True self.assertFalse(llamada_excluida_encontrada) def test_se_muestra_el_tiempo_de_sesion_correctamente(self): horas_sesion = 1 tiempo_inicial = now() ActividadAgenteLogFactory.create(event='UNPAUSEALL', agente_id=self.agente_profile.id, time=tiempo_inicial) tiempo_removemember_1 = tiempo_inicial + timedelta(microseconds=20000) ActividadAgenteLogFactory.create(event='REMOVEMEMBER', agente_id=self.agente_profile.id, time=tiempo_removemember_1) tiempo_addmember = tiempo_removemember_1 + timedelta(microseconds=3000) ActividadAgenteLogFactory.create(time=tiempo_addmember, event='ADDMEMBER', agente_id=self.agente_profile.id, pausa_id='') tiempo_removemember_2 = tiempo_addmember + timedelta( hours=horas_sesion) ActividadAgenteLogFactory.create(time=tiempo_removemember_2, event='REMOVEMEMBER', agente_id=self.agente_profile.id, pausa_id='') reporte = ReporteEstadisticasDiariaAgente() reporte_agente = reporte.estadisticas[self.agente_profile.pk] self.assertEqual(reporte_agente['tiempos'].sesion, timedelta(hours=horas_sesion)) def test_se_muestran_los_tiempos_de_pausa_correctamente(self): horas_sesion = 1 tiempo_inicial = now() pausa1 = PausaFactory(tipo=Pausa.TIPO_PRODUCTIVA) pausa2 = PausaFactory(tipo=Pausa.TIPO_RECREATIVA) ActividadAgenteLogFactory.create(event='UNPAUSEALL', agente_id=self.agente_profile.id, time=tiempo_inicial) tiempo_removemember_1 = tiempo_inicial + timedelta(microseconds=20000) ActividadAgenteLogFactory.create(event='REMOVEMEMBER', agente_id=self.agente_profile.id, time=tiempo_removemember_1) tiempo_addmember = tiempo_removemember_1 + timedelta(microseconds=3000) ActividadAgenteLogFactory.create(time=tiempo_addmember, event='ADDMEMBER', agente_id=self.agente_profile.id, pausa_id='') tiempo_inicio_pausa_1 = tiempo_addmember + timedelta(minutes=2) ActividadAgenteLogFactory.create(time=tiempo_inicio_pausa_1, event='PAUSEALL', agente_id=self.agente_profile.id, pausa_id=pausa1.id) tiempo_final_pausa_1 = tiempo_inicio_pausa_1 + timedelta(minutes=2) ActividadAgenteLogFactory.create(time=tiempo_final_pausa_1, event='UNPAUSEALL', agente_id=self.agente_profile.id, pausa_id=pausa1.id) tiempo_inicio_pausa_2 = tiempo_final_pausa_1 + timedelta(minutes=2) ActividadAgenteLogFactory.create(time=tiempo_inicio_pausa_2, event='PAUSEALL', agente_id=self.agente_profile.id, pausa_id=pausa2.id) tiempo_final_pausa_2 = tiempo_inicio_pausa_2 + timedelta(minutes=2) ActividadAgenteLogFactory.create(time=tiempo_final_pausa_2, event='UNPAUSEALL', agente_id=self.agente_profile.id, pausa_id=pausa2.id) tiempo_removemember_2 = tiempo_final_pausa_2 + timedelta( hours=horas_sesion) ActividadAgenteLogFactory.create(time=tiempo_removemember_2, event='REMOVEMEMBER', agente_id=self.agente_profile.id, pausa_id='') reporte = ReporteEstadisticasDiariaAgente() reporte_agente = reporte.estadisticas[self.agente_profile.pk] self.assertEqual(reporte_agente['tiempos'].pausa, timedelta(minutes=4)) self.assertEqual(reporte_agente['tiempos'].pausa_recreativa, timedelta(minutes=2))
def test_incremental_llamada_dialer(self): tipo = str(Campana.TYPE_DIALER) campana = self.dialer generador = GeneradorDeLlamadaLogs() # Genero una llamada DIALER que termina en BUSY generador.generar_log(campana, False, 'BUSY', '123', self.agente1, bridge_wait_time=5) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas self.assertEqual(estadisticas['total_llamadas_procesadas'], 1) por_tipo = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo['total'], 1) self.assertEqual(por_tipo['atendidas'], 0) self.assertEqual(por_tipo['no_atendidas'], 1) self.assertEqual(por_tipo['perdidas'], 0) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 1) self.assertEqual(llamadas['manuales'], 0) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['efectuadas'], 1) self.assertEqual(tipos[campana.id]['atendidas'], 0) self.assertEqual(tipos[campana.id]['conectadas'], 0) self.assertEqual(tipos[campana.id]['expiradas'], 0) self.assertEqual(tipos[campana.id]['abandonadas'], 0) self.assertEqual(tipos[campana.id]['t_espera_conexion'], 0) self.assertEqual(tipos[campana.id]['t_espera_atencion'], 0) self.assertEqual(tipos[campana.id]['t_abandono'], 0) # Genero una llamada DIALER que termina en ABANDON generador.generar_log(campana, False, 'ABANDON', '123', self.agente1, bridge_wait_time=5) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas self.assertEqual(estadisticas['total_llamadas_procesadas'], 2) por_tipo = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo['total'], 2) self.assertEqual(por_tipo['atendidas'], 1) self.assertEqual(por_tipo['no_atendidas'], 1) self.assertEqual(por_tipo['perdidas'], 1) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 2) self.assertEqual(llamadas['manuales'], 0) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['efectuadas'], 2) self.assertEqual(tipos[campana.id]['atendidas'], 1) self.assertEqual(tipos[campana.id]['conectadas'], 0) self.assertEqual(tipos[campana.id]['expiradas'], 0) self.assertEqual(tipos[campana.id]['abandonadas'], 1) self.assertEqual(tipos[campana.id]['t_espera_conexion'], 0) self.assertEqual(tipos[campana.id]['t_espera_atencion'], 5) self.assertEqual(tipos[campana.id]['t_abandono'], 5) # Genero una llamada DIALER que termina en EXITWITHTIMEOUT generador.generar_log(campana, False, 'EXITWITHTIMEOUT', '123', self.agente1, bridge_wait_time=4) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas self.assertEqual(estadisticas['total_llamadas_procesadas'], 3) por_tipo = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo['total'], 3) self.assertEqual(por_tipo['atendidas'], 2) self.assertEqual(por_tipo['no_atendidas'], 1) self.assertEqual(por_tipo['perdidas'], 2) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 3) self.assertEqual(llamadas['manuales'], 0) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['efectuadas'], 3) self.assertEqual(tipos[campana.id]['atendidas'], 2) self.assertEqual(tipos[campana.id]['conectadas'], 0) self.assertEqual(tipos[campana.id]['expiradas'], 1) self.assertEqual(tipos[campana.id]['abandonadas'], 1) self.assertEqual(tipos[campana.id]['t_espera_conexion'], 0) self.assertEqual(tipos[campana.id]['t_espera_atencion'], 4.5) self.assertEqual(tipos[campana.id]['t_abandono'], 5) # Genero dos llamadas DIALER que terminan en COMPLETEAGENT y COMPLETEOUTNUM generador.generar_log(campana, False, 'COMPLETEAGENT', '123', self.agente1, bridge_wait_time=8, duracion_llamada=18) generador.generar_log(campana, False, 'COMPLETEOUTNUM', '123', self.agente1, bridge_wait_time=10, duracion_llamada=22) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas self.assertEqual(estadisticas['total_llamadas_procesadas'], 5) por_tipo = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo['total'], 5) self.assertEqual(por_tipo['atendidas'], 4) self.assertEqual(por_tipo['no_atendidas'], 1) self.assertEqual(por_tipo['perdidas'], 2) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 5) self.assertEqual(llamadas['manuales'], 0) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['efectuadas'], 5) self.assertEqual(tipos[campana.id]['atendidas'], 4) self.assertEqual(tipos[campana.id]['conectadas'], 2) self.assertEqual(tipos[campana.id]['expiradas'], 1) self.assertEqual(tipos[campana.id]['abandonadas'], 1) self.assertEqual(tipos[campana.id]['t_espera_conexion'], 9) self.assertEqual(tipos[campana.id]['t_espera_atencion'], 6.75) self.assertEqual(tipos[campana.id]['t_abandono'], 5) # Genero llamadas dialer Manuales CANCEL, COMPLETEOUTNUM generador.generar_log(campana, True, 'CANCEL', '123', self.agente1, bridge_wait_time=4) generador.generar_log(campana, True, 'COMPLETEOUTNUM', '123', self.agente1, bridge_wait_time=8, duracion_llamada=30) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas self.assertEqual(estadisticas['total_llamadas_procesadas'], 7) por_tipo_dialer = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo_dialer['total'], 5) self.assertEqual(por_tipo_dialer['atendidas'], 4) self.assertEqual(por_tipo_dialer['no_atendidas'], 1) self.assertEqual(por_tipo_dialer['perdidas'], 2) por_tipo_manual = estadisticas['llamadas_por_tipo'][str( Campana.TYPE_MANUAL)] self.assertEqual(por_tipo_manual['total'], 2) self.assertEqual(por_tipo_manual['conectadas'], 1) self.assertEqual(por_tipo_manual['no_conectadas'], 1) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 7) self.assertEqual(llamadas['manuales'], 2) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['efectuadas'], 5) self.assertEqual(tipos[campana.id]['atendidas'], 4) self.assertEqual(tipos[campana.id]['conectadas'], 2) self.assertEqual(tipos[campana.id]['expiradas'], 1) self.assertEqual(tipos[campana.id]['abandonadas'], 1) self.assertEqual(tipos[campana.id]['t_espera_conexion'], 9) self.assertEqual(tipos[campana.id]['t_espera_atencion'], 6.75) self.assertEqual(tipos[campana.id]['t_abandono'], 5) self.assertEqual(tipos[campana.id]['efectuadas_manuales'], 2) self.assertEqual(tipos[campana.id]['conectadas_manuales'], 1) self.assertEqual(tipos[campana.id]['no_conectadas_manuales'], 1) self.assertEqual(tipos[campana.id]['t_espera_conexion_manuales'], 6)
def test_genera_dialer_completa_completeagent(self): generador = GeneradorDeLlamadaLogs() generador.generar_log(self.dialer, False, 'COMPLETEAGENT', '123', self.agente1, self.contacto_d, bridge_wait_time=5, duracion_llamada=44, archivo_grabacion='archi') logs_generados = LlamadaLog.objects.filter(campana_id=self.dialer.id) eventos_esperados = set( ('DIAL', 'ANSWER', 'COMPLETEAGENT', 'ENTERQUEUE', 'CONNECT')) self.assertEqual(self.set_de_eventos(logs_generados), eventos_esperados) # Pata Dialer dial = logs_generados.get(event='DIAL') self.assertEqual(dial.campana_id, self.dialer.id) self.assertEqual(dial.tipo_campana, self.dialer.type) self.assertEqual(dial.tipo_llamada, self.dialer.type) self.assertEqual(dial.agente_id, -1) self.assertEqual(dial.contacto_id, self.contacto_d.id) answer = logs_generados.get(event='ANSWER') self.assertEqual(answer.campana_id, self.dialer.id) self.assertEqual(answer.tipo_campana, self.dialer.type) self.assertEqual(answer.tipo_llamada, self.dialer.type) self.assertEqual(answer.agente_id, -1) self.assertEqual(answer.contacto_id, self.contacto_d.id) self.assertEqual(answer.bridge_wait_time, 5) complete_dial = logs_generados.get(event='COMPLETEAGENT', agente_id=-1) self.assertEqual(complete_dial.campana_id, self.dialer.id) self.assertEqual(complete_dial.tipo_campana, self.dialer.type) self.assertEqual(complete_dial.tipo_llamada, self.dialer.type) self.assertEqual(complete_dial.agente_id, -1) self.assertEqual(complete_dial.contacto_id, self.contacto_d.id) self.assertEqual(complete_dial.bridge_wait_time, 5) self.assertEqual(complete_dial.duracion_llamada, 44) self.assertEqual(complete_dial.archivo_grabacion, '') # Pata Agente enterqueue = logs_generados.get(event='ENTERQUEUE') self.assertEqual(enterqueue.campana_id, self.dialer.id) self.assertEqual(enterqueue.tipo_campana, self.dialer.type) self.assertEqual(enterqueue.tipo_llamada, self.dialer.type) self.assertEqual(enterqueue.contacto_id, self.contacto_d.id) self.assertEqual(enterqueue.agente_id, -1) self.assertEqual(enterqueue.bridge_wait_time, -1) self.assertEqual(enterqueue.duracion_llamada, -1) self.assertEqual(enterqueue.archivo_grabacion, '') connect = logs_generados.get(event='CONNECT') self.assertEqual(connect.campana_id, self.dialer.id) self.assertEqual(connect.tipo_campana, self.dialer.type) self.assertEqual(connect.tipo_llamada, self.dialer.type) self.assertEqual(connect.agente_id, self.agente1.id) self.assertEqual(connect.contacto_id, self.contacto_d.id) self.assertEqual(connect.bridge_wait_time, 5) self.assertEqual(connect.duracion_llamada, -1) self.assertEqual(connect.archivo_grabacion, '') complete = logs_generados.get(event='COMPLETEAGENT', agente_id=self.agente1.id) self.assertEqual(complete.campana_id, self.dialer.id) self.assertEqual(complete.tipo_campana, self.dialer.type) self.assertEqual(complete.tipo_llamada, self.dialer.type) self.assertEqual(complete.agente_id, self.agente1.id) self.assertEqual(complete.contacto_id, self.contacto_d.id) self.assertEqual(complete.bridge_wait_time, 5) self.assertEqual(complete.duracion_llamada, 44) self.assertEqual(complete.archivo_grabacion, 'archi')
def test_genera_dialer_incompleta_por_exitwithtimeout(self): generador = GeneradorDeLlamadaLogs() generador.generar_log(self.dialer, False, 'EXITWITHTIMEOUT', '123', self.agente1, self.contacto_d, bridge_wait_time=5, duracion_llamada=44) logs_generados = LlamadaLog.objects.filter(campana_id=self.dialer.id) # ASUMO que al ser EXITWITHTIMEOUT, la pata dial detecta que el agente terminó la conexión eventos_esperados = set(('DIAL', 'ANSWER', 'COMPLETEAGENT', 'ENTERQUEUE', 'EXITWITHTIMEOUT')) self.assertEqual(self.set_de_eventos(logs_generados), eventos_esperados) dial = logs_generados.get(event='DIAL') self.assertEqual(dial.campana_id, self.dialer.id) self.assertEqual(dial.tipo_campana, self.dialer.type) self.assertEqual(dial.tipo_llamada, self.dialer.type) self.assertEqual(dial.agente_id, -1) self.assertEqual(dial.contacto_id, self.contacto_d.id) self.assertEqual(dial.numero_marcado, '123') answer = logs_generados.get(event='ANSWER') self.assertEqual(answer.campana_id, self.dialer.id) self.assertEqual(answer.tipo_campana, self.dialer.type) self.assertEqual(answer.tipo_llamada, self.dialer.type) self.assertEqual(answer.agente_id, -1) self.assertEqual(answer.contacto_id, self.contacto_d.id) self.assertEqual(answer.bridge_wait_time, 5) complete = logs_generados.get(event='COMPLETEAGENT', agente_id=-1) self.assertEqual(complete.campana_id, self.dialer.id) self.assertEqual(complete.tipo_campana, self.dialer.type) self.assertEqual(complete.tipo_llamada, self.dialer.type) self.assertEqual(complete.contacto_id, self.contacto_d.id) self.assertEqual(complete.bridge_wait_time, 5) self.assertEqual(complete.duracion_llamada, 44) self.assertEqual(complete.archivo_grabacion, '') enterqueue = logs_generados.get(event='ENTERQUEUE') self.assertEqual(enterqueue.campana_id, self.dialer.id) self.assertEqual(enterqueue.tipo_campana, self.dialer.type) self.assertEqual(enterqueue.tipo_llamada, self.dialer.type) self.assertEqual(enterqueue.contacto_id, self.contacto_d.id) self.assertEqual(enterqueue.agente_id, -1) self.assertEqual(enterqueue.bridge_wait_time, -1) self.assertEqual(enterqueue.duracion_llamada, -1) self.assertEqual(enterqueue.archivo_grabacion, '') abandon = logs_generados.get(event='EXITWITHTIMEOUT') self.assertEqual(abandon.campana_id, self.dialer.id) self.assertEqual(abandon.tipo_campana, self.dialer.type) self.assertEqual(abandon.tipo_llamada, self.dialer.type) self.assertEqual(abandon.contacto_id, self.contacto_d.id) self.assertEqual(abandon.agente_id, -1) self.assertEqual(abandon.bridge_wait_time, 5) self.assertEqual(abandon.duracion_llamada, -1) self.assertEqual(abandon.archivo_grabacion, '')
class BaseTestDeReportes(TestCase): PWD = 'admin123' GESTION = 'Gestión' CALIFICACION_NOMBRE = "calificacion_nombre" DURACION_LLAMADA = 80 def setUp(self): self.usuario_admin_supervisor = UserFactory(is_staff=True, is_supervisor=True) self.usuario_admin_supervisor.set_password(self.PWD) self.usuario_admin_supervisor.save() self.agente_profile = AgenteProfileFactory.create( user=self.usuario_admin_supervisor) self.nombre_calificacion = NombreCalificacionFactory.create( nombre=self.CALIFICACION_NOMBRE) self.nombre_calificacion_gestion = NombreCalificacionFactory.create( nombre=self.GESTION) self.campana_activa = CampanaFactory.create( estado=Campana.ESTADO_ACTIVA, type=Campana.TYPE_PREVIEW) self.contacto_calificado_gestion = ContactoFactory( bd_contacto=self.campana_activa.bd_contacto) self.contacto_calificado_no_accion = ContactoFactory( bd_contacto=self.campana_activa.bd_contacto) self.contacto_no_atendido = ContactoFactory( bd_contacto=self.campana_activa.bd_contacto) self.contacto_no_calificado = ContactoFactory( bd_contacto=self.campana_activa.bd_contacto) self.opcion_calificacion_gestion = OpcionCalificacionFactory.create( campana=self.campana_activa, nombre=self.nombre_calificacion_gestion.nombre, tipo=OpcionCalificacion.GESTION) self.opcion_calificacion_noaccion = OpcionCalificacionFactory.create( campana=self.campana_activa, nombre=self.nombre_calificacion.nombre, tipo=OpcionCalificacion.NO_ACCION) self.telefono1 = self.contacto_calificado_gestion.telefono self.telefono2 = self.contacto_calificado_no_accion.telefono self.telefono3 = self.contacto_no_atendido.telefono self.telefono4 = self.contacto_no_calificado.telefono self.generador_log_llamadas = GeneradorDeLlamadaLogs() self.generador_log_llamadas.generar_log( self.campana_activa, False, 'COMPLETEAGENT', self.telefono1, agente=self.agente_profile, contacto=self.contacto_calificado_gestion, duracion_llamada=self.DURACION_LLAMADA, callid=1) self.generador_log_llamadas.generar_log( self.campana_activa, False, 'COMPLETEAGENT', self.telefono2, agente=self.agente_profile, contacto=self.contacto_calificado_no_accion, duracion_llamada=self.DURACION_LLAMADA, callid=2) self.generador_log_llamadas.generar_log( self.campana_activa, True, 'NOANSWER', self.telefono3, agente=self.agente_profile, contacto=self.contacto_no_atendido, callid=3) self.generador_log_llamadas.generar_log( self.campana_activa, True, 'COMPLETEOUTNUM', self.telefono4, agente=self.agente_profile, contacto=self.contacto_no_calificado, duracion_llamada=0, callid=4) callid_gestion = LlamadaLog.objects.get( contacto_id=self.contacto_calificado_gestion.pk, event='COMPLETEAGENT').callid callid_no_accion = LlamadaLog.objects.get( contacto_id=self.contacto_calificado_no_accion.pk, event='COMPLETEAGENT').callid self.calif_gestion = CalificacionClienteFactory.create( opcion_calificacion=self.opcion_calificacion_gestion, agente=self.agente_profile, contacto=self.contacto_calificado_gestion, callid=callid_gestion) self.calif_no_accion = CalificacionClienteFactory.create( opcion_calificacion=self.opcion_calificacion_noaccion, agente=self.agente_profile, contacto=self.contacto_calificado_no_accion, callid=callid_no_accion) CalificacionCliente.history.all().update( history_change_reason='calificacion') self.client.login(username=self.usuario_admin_supervisor.username, password=self.PWD)
def test_incremental_llamada_preview(self): tipo = str(Campana.TYPE_PREVIEW) campana = self.preview generador = GeneradorDeLlamadaLogs() # Genero una llamada preview que termina en BUSY generador.generar_log(campana, False, 'BUSY', '123', self.agente1, bridge_wait_time=5) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas self.assertEqual(estadisticas['total_llamadas_procesadas'], 1) por_tipo = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo['total'], 1) self.assertEqual(por_tipo['conectadas'], 0) self.assertEqual(por_tipo['no_conectadas'], 1) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 1) self.assertEqual(llamadas['manuales'], 0) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['t_espera_conexion'], 5) self.assertEqual(tipos[campana.id]['efectuadas'], 1) self.assertEqual(tipos[campana.id]['conectadas'], 0) self.assertEqual(tipos[campana.id]['no_conectadas'], 1) # Genero una llamada preview que termina en COMPLETEAGENT y otra en COMPLETEOUTNUM generador.generar_log(campana, False, 'COMPLETEAGENT', '1234', self.agente1, bridge_wait_time=4, duracion_llamada=20) generador.generar_log(campana, False, 'COMPLETEOUTNUM', '1234', self.agente1, bridge_wait_time=6, duracion_llamada=40) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas self.assertEqual(estadisticas['total_llamadas_procesadas'], 3) por_tipo = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo['total'], 3) self.assertEqual(por_tipo['conectadas'], 2) self.assertEqual(por_tipo['no_conectadas'], 1) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 3) self.assertEqual(llamadas['manuales'], 0) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['t_espera_conexion'], 5) self.assertEqual(tipos[campana.id]['efectuadas'], 3) self.assertEqual(tipos[campana.id]['conectadas'], 2) self.assertEqual(tipos[campana.id]['no_conectadas'], 1) # Genero llamadas preview manuales que terminan en BUSY y en COMPLETEOUTNUM generador.generar_log(campana, True, 'BUSY', '1234', self.agente1, bridge_wait_time=4) generador.generar_log(campana, True, 'COMPLETEOUTNUM', '1234', self.agente1, bridge_wait_time=8, duracion_llamada=40) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas self.assertEqual(estadisticas['total_llamadas_procesadas'], 5) por_tipo_preview = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo_preview['total'], 3) self.assertEqual(por_tipo_preview['conectadas'], 2) self.assertEqual(por_tipo_preview['no_conectadas'], 1) por_tipo_manual = estadisticas['llamadas_por_tipo'][str( Campana.TYPE_MANUAL)] self.assertEqual(por_tipo_manual['total'], 2) self.assertEqual(por_tipo_manual['conectadas'], 1) self.assertEqual(por_tipo_manual['no_conectadas'], 1) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 5) self.assertEqual(llamadas['manuales'], 2) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['t_espera_conexion'], 5.4) self.assertEqual(tipos[campana.id]['efectuadas'], 5) self.assertEqual(tipos[campana.id]['conectadas'], 3) self.assertEqual(tipos[campana.id]['no_conectadas'], 2) self.assertEqual(tipos[campana.id]['efectuadas_manuales'], 2) self.assertEqual(tipos[campana.id]['conectadas_manuales'], 1) self.assertEqual(tipos[campana.id]['no_conectadas_manuales'], 1) self.assertEqual(tipos[campana.id]['t_espera_conexion_manuales'], 6)
def test_incremental_llamada_entrante(self): tipo = str(Campana.TYPE_ENTRANTE) campana = self.entrante generador = GeneradorDeLlamadaLogs() # Genero una llamada ENTRANTE que termina en ABANDON generador.generar_log(campana, False, 'ABANDON', '123', self.agente1, bridge_wait_time=5) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas self.assertEqual(estadisticas['total_llamadas_procesadas'], 1) por_tipo = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo['total'], 1) self.assertEqual(por_tipo['atendidas'], 0) self.assertEqual(por_tipo['expiradas'], 0) self.assertEqual(por_tipo['abandonadas'], 1) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 1) self.assertEqual(llamadas['manuales'], 0) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['recibidas'], 1) self.assertEqual(tipos[campana.id]['atendidas'], 0) self.assertEqual(tipos[campana.id]['expiradas'], 0) self.assertEqual(tipos[campana.id]['abandonadas'], 1) self.assertEqual(tipos[campana.id]['t_espera_conexion'], 0) self.assertEqual(tipos[campana.id]['t_abandono'], 5) # Genero una llamada ENTRANTE que termina en EXITWITHTIMEOUT generador.generar_log(campana, False, 'EXITWITHTIMEOUT', '123', self.agente1, bridge_wait_time=6) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas self.assertEqual(estadisticas['total_llamadas_procesadas'], 2) por_tipo = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo['total'], 2) self.assertEqual(por_tipo['atendidas'], 0) self.assertEqual(por_tipo['expiradas'], 1) self.assertEqual(por_tipo['abandonadas'], 1) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 2) self.assertEqual(llamadas['manuales'], 0) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['recibidas'], 2) self.assertEqual(tipos[campana.id]['atendidas'], 0) self.assertEqual(tipos[campana.id]['expiradas'], 1) self.assertEqual(tipos[campana.id]['abandonadas'], 1) self.assertEqual(tipos[campana.id]['t_espera_conexion'], 0) self.assertEqual(tipos[campana.id]['t_abandono'], 5) # Genero una llamada ENTRANTE que termina en COMPLETEOUTNUM generador.generar_log(campana, False, 'COMPLETEOUTNUM', '123', self.agente1, bridge_wait_time=7, duracion_llamada=30) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas self.assertEqual(estadisticas['total_llamadas_procesadas'], 3) por_tipo = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo['total'], 3) self.assertEqual(por_tipo['atendidas'], 1) self.assertEqual(por_tipo['expiradas'], 1) self.assertEqual(por_tipo['abandonadas'], 1) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 3) self.assertEqual(llamadas['manuales'], 0) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['recibidas'], 3) self.assertEqual(tipos[campana.id]['atendidas'], 1) self.assertEqual(tipos[campana.id]['expiradas'], 1) self.assertEqual(tipos[campana.id]['abandonadas'], 1) self.assertEqual(tipos[campana.id]['t_espera_conexion'], 7) self.assertEqual(tipos[campana.id]['t_abandono'], 5) # Genero llamadas diaer manuales CANCEL, COMPLETEOUTNUM generador.generar_log(campana, True, 'CANCEL', '123', self.agente1, bridge_wait_time=5) generador.generar_log(campana, True, 'COMPLETEOUTNUM', '123', self.agente1, bridge_wait_time=7, duracion_llamada=30) self.hasta = now() reporte = ReporteDeLlamadas(self.desde, self.hasta, True, self.supervisor.user) estadisticas = reporte.estadisticas por_tipo_entrante = estadisticas['llamadas_por_tipo'][tipo] self.assertEqual(por_tipo_entrante['total'], 3) self.assertEqual(por_tipo_entrante['atendidas'], 1) self.assertEqual(por_tipo_entrante['expiradas'], 1) self.assertEqual(por_tipo_entrante['abandonadas'], 1) por_tipo_manual = estadisticas['llamadas_por_tipo'][str( Campana.TYPE_MANUAL)] self.assertEqual(por_tipo_manual['total'], 2) self.assertEqual(por_tipo_manual['conectadas'], 1) self.assertEqual(por_tipo_manual['no_conectadas'], 1) llamadas = estadisticas['llamadas_por_campana'][campana.id] self.assertEqual(llamadas['total'], 5) self.assertEqual(llamadas['manuales'], 2) tipos = estadisticas['tipos_de_llamada_por_campana'][tipo] self.assertEqual(tipos[campana.id]['recibidas'], 3) self.assertEqual(tipos[campana.id]['atendidas'], 1) self.assertEqual(tipos[campana.id]['expiradas'], 1) self.assertEqual(tipos[campana.id]['abandonadas'], 1) self.assertEqual(tipos[campana.id]['t_espera_conexion'], 7) self.assertEqual(tipos[campana.id]['t_abandono'], 5) self.assertEqual(tipos[campana.id]['efectuadas_manuales'], 2) self.assertEqual(tipos[campana.id]['conectadas_manuales'], 1) self.assertEqual(tipos[campana.id]['no_conectadas_manuales'], 1) self.assertEqual(tipos[campana.id]['t_espera_conexion_manuales'], 6)