Example #1
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
	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