Esempio n. 1
0
    def group_stat_pbx(stat_pbx):
        """
		Filter stat_pbx calls
		:param stat_pbx: List of calls
		:return: List of filtered calls
		"""
        result = []
        key_date_val = None
        key_sip_val = None
        group = []
        for s in stat_pbx:
            if not key_date_val:
                # init key_date_val
                key_date_val = s.date
            if not key_sip_val:
                # init key_sip_val
                key_sip_val = s.sip
            if (s.sip == key_sip_val and CommonService.is_dates_equals(
                    key_date_val, s.date, True)) or not group:
                # add to group if values are equals
                group.append(s)
            else:
                result.append(group)
                # set current call as the first group item
                group = [s]
                # update key values
                key_date_val = s.date
                key_sip_val = s.sip
            if s == stat_pbx[-1] and group:
                # add last group
                result.append(group)
        return result
Esempio n. 2
0
	def group_stat_pbx(stat_pbx):
		"""
		Filter stat_pbx calls
		:param stat_pbx: List of calls
		:return: List of filtered calls
		"""
		result = []
		key_date_val = None
		key_sip_val = None
		group = []
		for s in stat_pbx:
			if not key_date_val:
				# init key_date_val
				key_date_val = s.date
			if not key_sip_val:
				# init key_sip_val
				key_sip_val = s.sip
			if (s.sip == key_sip_val and CommonService.is_dates_equals(key_date_val, s.date, True)) or not group:
				# add to group if values are equals
				group.append(s)
			else:
				result.append(group)
				# set current call as the first group item
				group = [s]
				# update key values
				key_date_val = s.date
				key_sip_val = s.sip
			if s == stat_pbx[-1] and group:
				# add last group
				result.append(group)
		return result
Esempio n. 3
0
    def parse_other(stat_common, stat_pbx_typed, userprofile):

        parsed = []

        for spt in stat_pbx_typed:

            call = CallRecord()

            call_common = filter(
                lambda x: CommonService.is_dates_equals(
                    x.date, spt.date, True), stat_common)

            if len(call_common) > 0:
                call_common = call_common[0]
                call = spt
                call.set_params(description=call_common.description,
                                bill_seconds=call_common.bill_seconds,
                                cost=call_common.cost,
                                bill_cost=call_common.bill_cost,
                                currency=call_common.currency)
                parsed.append(call)
                call_common.merged = True
                spt.merged = True
            else:
                if len(str(spt.sip)) == 3 and len(str(spt.destination)) == 3:
                    spt.call_type = CallsConstants.INTERNAL
                call = spt
                spt.merged = True
                parsed.append(call)

        return parsed
Esempio n. 4
0
	def parse_other(stat_common, stat_pbx_typed, userprofile):

		parsed = []

		for spt in stat_pbx_typed:

			call = CallRecord()

			call_common = filter(lambda x: CommonService.is_dates_equals(x.date, spt.date, True), stat_common)

			if len(call_common) > 0:
				call_common = call_common[0]
				call = spt
				call.set_params(
					description=call_common.description,
					bill_seconds=call_common.bill_seconds,
					cost=call_common.cost,
					bill_cost=call_common.bill_cost,
					currency=call_common.currency
				)
				parsed.append(call)
				call_common.merged = True
				spt.merged = True
			else:
				if len(str(spt.sip)) == 3 and len(str(spt.destination)) == 3:
					spt.call_type = CallsConstants.INTERNAL
				call = spt
				spt.merged = True
				parsed.append(call)

		return parsed
Esempio n. 5
0
	def find_in_pbx_typed(common_call, pbx_typed, with_seconds=True):
		"""
		Find suitable call in pbx_typed by date
		:param common_call:
		:param pbx_typed:
		:return:
		"""
		calls = filter(lambda x: CommonService.is_dates_equals(x.date, common_call.date, with_seconds), pbx_typed)
		if len(calls) == 1:
			return calls[0]

		return None
	def test_is_dates_equals(self):
		"""
		Test for is_dates_equals
		"""
		date = datetime.datetime(2015, 10, 30, 20, 0, 0)

		# Dates are the same
		date2 = datetime.datetime(2015, 10, 30, 20, 0, 0)
		self.assertEquals(CommonService.is_dates_equals(date, date2, False), True)

		# The first date is less in 1 min
		date3 = datetime.datetime(2015, 10, 30, 20, 1, 0)
		self.assertEquals(CommonService.is_dates_equals(date, date3, False), True)

		# The first date is less in 2 min
		date4 = datetime.datetime(2015, 10, 30, 20, 2, 0)
		self.assertEquals(CommonService.is_dates_equals(date, date4, False), False)

		# The first date is less in 1 hour
		date5 = datetime.datetime(2015, 10, 30, 21, 0, 0)
		self.assertEquals(CommonService.is_dates_equals(date, date5, False), False)

		# Comparison with seconds
		date6 = datetime.datetime(2015, 10, 30, 20, 0, 3)
		self.assertEquals(CommonService.is_dates_equals(date, date6, True), True)

		# Comparison with seconds
		date7 = datetime.datetime(2015, 10, 30, 20, 0, 4)
		self.assertEquals(CommonService.is_dates_equals(date, date7, True), False)
Esempio n. 7
0
    def test_is_dates_equals(self):
        """
		Test for is_dates_equals
		"""
        date = datetime.datetime(2015, 10, 30, 20, 0, 0)

        # Dates are the same
        date2 = datetime.datetime(2015, 10, 30, 20, 0, 0)
        self.assertEquals(CommonService.is_dates_equals(date, date2, False),
                          True)

        # The first date is less in 1 min
        date3 = datetime.datetime(2015, 10, 30, 20, 1, 0)
        self.assertEquals(CommonService.is_dates_equals(date, date3, False),
                          True)

        # The first date is less in 2 min
        date4 = datetime.datetime(2015, 10, 30, 20, 2, 0)
        self.assertEquals(CommonService.is_dates_equals(date, date4, False),
                          False)

        # The first date is less in 1 hour
        date5 = datetime.datetime(2015, 10, 30, 21, 0, 0)
        self.assertEquals(CommonService.is_dates_equals(date, date5, False),
                          False)

        # Comparison with seconds
        date6 = datetime.datetime(2015, 10, 30, 20, 0, 3)
        self.assertEquals(CommonService.is_dates_equals(date, date6, True),
                          True)

        # Comparison with seconds
        date7 = datetime.datetime(2015, 10, 30, 20, 0, 4)
        self.assertEquals(CommonService.is_dates_equals(date, date7, True),
                          False)
Esempio n. 8
0
    def find_in_pbx_typed(common_call, pbx_typed, with_seconds=True):
        """
		Find suitable call in pbx_typed by date
		:param common_call:
		:param pbx_typed:
		:return:
		"""
        calls = filter(
            lambda x: CommonService.is_dates_equals(x.date, common_call.date,
                                                    with_seconds), pbx_typed)
        if len(calls) == 1:
            return calls[0]

        return None
Esempio n. 9
0
    def merge(stat_common, stat_pbx_typed, userprofile):

        merged = []

        # Находим строку вида АТС - Номер А
        pbx_caller_calls = filter(
            lambda x: str(x.caller) == userprofile.profile_phone_number and
            not PBXDataService.is_number_known(x.destination, userprofile),
            stat_common)
        # начинаем проверку не является ли она калбеком
        for pcc in pbx_caller_calls:

            call = CallRecord()

            # Если ей нет соответствия во второй таблице, значит двустрочный калбек
            # Второй вид двустрочного калбека, это у которого вторая строка имеет вид Номер А - Номер Б
            second_row = filter(
                lambda x: str(x.caller) == str(pcc.destination) and
                CommonService.is_dates_equals(x.date, pcc.date, False),
                stat_common)

            if len(second_row) == 1:
                # страка может иметь соответствующий входящий во второй таблице, может не иметь.
                # Если имеет, то записи должны упоминатся номера  А и Б
                second_row = second_row[0]
                pbx_call = PBXDataService.find_in_pbx_typed(
                    second_row,
                    filter(lambda x: x.call_type == 'incoming',
                           stat_pbx_typed), False)
                if pbx_call:
                    call = pbx_call
                    call.set_params(clid=second_row.destination,
                                    destination=pbx_call.clid,
                                    description=pcc.description,
                                    bill_seconds=pcc.bill_seconds,
                                    cost=pcc.cost + second_row.cost,
                                    bill_cost=pcc.bill_cost +
                                    second_row.bill_cost,
                                    currency=pcc.currency,
                                    sip=second_row.destination,
                                    disposition=pcc.disposition)
                    pbx_call.merged = True
                else:
                    call.set_params(call_id=pcc.call_id,
                                    clid=pcc.sip,
                                    sip=second_row.destination,
                                    date=pcc.date,
                                    destination=pcc.destination,
                                    disposition=pcc.disposition,
                                    description=pcc.description,
                                    bill_seconds=pcc.bill_seconds,
                                    cost=pcc.cost + second_row.cost,
                                    bill_cost=pcc.bill_cost +
                                    second_row.bill_cost,
                                    currency=pcc.currency)
                call.call_type = CallsConstants.COMING
                call.is_callback = True
                pcc.merged = True
                second_row.merged = True
                merged.append(call)
                continue

            # При первом варианте: двустрочный калбек. Он бывает двух видов в котором вторая строка(фактически она первая)
            # имеет вид АТС - Номер Б, находим её.
            second_row = filter(
                lambda x: str(x.caller) == str(userprofile.profile_phone_number
                                               ) and CommonService.
                is_dates_equals(x.date, pcc.date, False) and not str(
                    x.destination) == str(pcc.destination), stat_common)

            if len(second_row) == 1:
                # Ей должна соответствовать запись о входящем звонке в которой содержится номер А.
                # Если это так - значит всё это колбек(исходящий)
                second_row = second_row[0]
                pbx_call = PBXDataService.find_in_pbx_typed(
                    second_row,
                    filter(lambda x: x.call_type == 'incoming',
                           stat_pbx_typed), False)
                if pbx_call:
                    call = pbx_call
                    call.call_type = CallsConstants.COMING
                    call.set_params(sip=second_row.destination,
                                    destination=pcc.destination,
                                    description=pcc.description,
                                    bill_seconds=pcc.bill_seconds,
                                    cost=pcc.cost + second_row.cost,
                                    bill_cost=pcc.bill_cost +
                                    second_row.bill_cost,
                                    currency=pcc.currency,
                                    disposition=pcc.disposition)
                    call.is_callback = True
                    merged.append(call)
                    pcc.merged = True
                    pbx_call.merged = True
                    continue

            # искаем однострочный
            pbx_call = PBXDataService.find_in_pbx_typed(
                pcc, filter(lambda x: x.call_type == 'coming', stat_pbx_typed))
            if pbx_call:
                # Если соответствие есть - и это исходящий, значит это не калбек, а обычный исходящий звонок.
                call = pbx_call
                call.call_type = CallsConstants.COMING
                call.set_params(disposition=pcc.disposition,
                                description=pcc.description,
                                bill_seconds=pcc.bill_seconds,
                                cost=pcc.cost,
                                bill_cost=pcc.bill_cost,
                                currency=pcc.currency)
                merged.append(call)
                pcc.merged = True
                pbx_call.merged = True
                continue

            pbx_call = PBXDataService.find_in_pbx_typed(
                pcc, filter(lambda x: x.call_type == 'incoming',
                            stat_pbx_typed), False)
            if pbx_call:
                # Если соответствие есть, это входящий. значит однострочный калбек.
                call = pbx_call
                call.call_type = CallsConstants.COMING
                call.set_params(disposition=pcc.disposition,
                                destination=pcc.destination,
                                sip=pbx_call.destination,
                                clid=pbx_call.destination,
                                description=pcc.description,
                                bill_seconds=pcc.bill_seconds,
                                cost=pcc.cost,
                                bill_cost=pcc.bill_cost,
                                currency=pcc.currency)
                call.is_callback = True
                merged.append(call)
                pcc.merged = True
                pbx_call.merged = True
                continue

        return merged
Esempio n. 10
0
	def merge(stat_common, stat_pbx_typed, userprofile):

		merged = []

		# Находим строку вида АТС - Номер А
		pbx_caller_calls = filter(lambda x: str(x.caller) == userprofile.profile_phone_number
		                                    and not PBXDataService.is_number_known(x.destination, userprofile), stat_common)
		# начинаем проверку не является ли она калбеком
		for pcc in pbx_caller_calls:

			call = CallRecord()

			# Если ей нет соответствия во второй таблице, значит двустрочный калбек
			# Второй вид двустрочного калбека, это у которого вторая строка имеет вид Номер А - Номер Б
			second_row = filter(lambda x: str(x.caller) == str(pcc.destination) and CommonService.is_dates_equals(x.date, pcc.date, False), stat_common)

			if len(second_row) == 1:
				# страка может иметь соответствующий входящий во второй таблице, может не иметь.
				# Если имеет, то записи должны упоминатся номера  А и Б
				second_row = second_row[0]
				pbx_call = PBXDataService.find_in_pbx_typed(second_row, filter(lambda x: x.call_type == 'incoming', stat_pbx_typed), False)
				if pbx_call:
					call = pbx_call
					call.set_params(
						clid=second_row.destination,
						destination=pbx_call.clid,
						description=pcc.description,
						bill_seconds=pcc.bill_seconds,
						cost=pcc.cost + second_row.cost,
						bill_cost=pcc.bill_cost + second_row.bill_cost,
						currency=pcc.currency,
						sip=second_row.destination,
						disposition=pcc.disposition
					)
					pbx_call.merged = True
				else:
					call.set_params(
						call_id=pcc.call_id,
						clid=pcc.sip,
						sip=second_row.destination,
						date=pcc.date,
						destination=pcc.destination,
						disposition=pcc.disposition,

						description=pcc.description,
						bill_seconds=pcc.bill_seconds,
						cost=pcc.cost + second_row.cost,
						bill_cost=pcc.bill_cost + second_row.bill_cost,
						currency=pcc.currency
					)
				call.call_type = CallsConstants.COMING
				call.is_callback = True
				pcc.merged = True
				second_row.merged = True
				merged.append(call)
				continue

			# При первом варианте: двустрочный калбек. Он бывает двух видов в котором вторая строка(фактически она первая)
			# имеет вид АТС - Номер Б, находим её.
			second_row = filter(lambda x: str(x.caller) == str(userprofile.profile_phone_number)
			                              and CommonService.is_dates_equals(x.date, pcc.date, False)
			                              and not str(x.destination) == str(pcc.destination), stat_common)

			if len(second_row) == 1:
				# Ей должна соответствовать запись о входящем звонке в которой содержится номер А.
				# Если это так - значит всё это колбек(исходящий)
				second_row = second_row[0]
				pbx_call = PBXDataService.find_in_pbx_typed(second_row, filter(lambda x: x.call_type == 'incoming', stat_pbx_typed), False)
				if pbx_call:
					call = pbx_call
					call.call_type = CallsConstants.COMING
					call.set_params(
						sip=second_row.destination,
						destination=pcc.destination,
						description=pcc.description,
						bill_seconds=pcc.bill_seconds,
						cost=pcc.cost + second_row.cost,
						bill_cost=pcc.bill_cost + second_row.bill_cost,
						currency=pcc.currency,
						disposition=pcc.disposition
					)
					call.is_callback = True
					merged.append(call)
					pcc.merged = True
					pbx_call.merged = True
					continue

			# искаем однострочный
			pbx_call = PBXDataService.find_in_pbx_typed(pcc, filter(lambda x: x.call_type == 'coming', stat_pbx_typed))
			if pbx_call:
				# Если соответствие есть - и это исходящий, значит это не калбек, а обычный исходящий звонок.
				call = pbx_call
				call.call_type = CallsConstants.COMING
				call.set_params(
					disposition=pcc.disposition,
					description=pcc.description,
					bill_seconds=pcc.bill_seconds,
					cost=pcc.cost,
					bill_cost=pcc.bill_cost,
					currency=pcc.currency
				)
				merged.append(call)
				pcc.merged = True
				pbx_call.merged = True
				continue

			pbx_call = PBXDataService.find_in_pbx_typed(pcc, filter(lambda x: x.call_type == 'incoming', stat_pbx_typed), False)
			if pbx_call:
				# Если соответствие есть, это входящий. значит однострочный калбек.
				call = pbx_call
				call.call_type = CallsConstants.COMING
				call.set_params(
					disposition=pcc.disposition,
					destination=pcc.destination,
					sip=pbx_call.destination,
					clid=pbx_call.destination,
					description=pcc.description,
					bill_seconds=pcc.bill_seconds,
					cost=pcc.cost,
					bill_cost=pcc.bill_cost,
					currency=pcc.currency
				)
				call.is_callback = True
				merged.append(call)
				pcc.merged = True
				pbx_call.merged = True
				continue

		return merged