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
def parse_calls(stat_common, stat_pbx_grouped, userprofile): coming = [] incoming = [] internal = [] for stat_pbx_group in stat_pbx_grouped: call = CallRecord() pbx_incoming = filter( lambda x: x.destination == CallsConstants.INCOMING, stat_pbx_group) if len(pbx_incoming) is not 0: pbx_incoming_call = pbx_incoming[0] pbx_call_same_disp = None if not pbx_incoming_call.disposition in CallsConstants.FAIL_TYPES: pbx_call_same_disp = filter( lambda x: x.disposition == pbx_incoming_call. disposition and not x.destination == CallsConstants. INCOMING, stat_pbx_group)[0] else: pbx_call_same_disp = filter( lambda x: not x.destination == CallsConstants.INCOMING, stat_pbx_group) pbx_call_same_disp = stat_pbx_group[0] if len( pbx_call_same_disp) == 0 else pbx_call_same_disp[0] call.set_params(call_id=pbx_call_same_disp.call_id, clid=pbx_call_same_disp.clid, sip=pbx_call_same_disp.sip, date=pbx_call_same_disp.date, destination=pbx_call_same_disp.destination, disposition=pbx_incoming_call.disposition, bill_seconds=pbx_incoming_call.seconds) else: pbx_call = stat_pbx_group[0] call.set_params(call_id=pbx_call.call_id, clid=pbx_call.clid, sip=pbx_call.sip, date=pbx_call.date, destination=pbx_call.destination, disposition=pbx_call.disposition, bill_seconds=pbx_call.seconds) if PBXDataService.is_number_known(call.clid, userprofile): # звонок исходящий либо внутренний if PBXDataService.is_number_known(call.destination, userprofile): # номер известный - звонок внутренний call.call_type = CallsConstants.INTERNAL if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' internal.append(call) else: # звонок исходящий call.call_type = CallsConstants.COMING if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' coming.append(call) else: # звонок входящий call.call_type = CallsConstants.INCOMING if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' incoming.append(call) return coming + incoming + internal
def parse_calls(stat_common, stat_pbx_grouped, userprofile): coming = [] incoming = [] internal = [] for stat_pbx_group in stat_pbx_grouped: call = CallRecord() pbx_incoming = filter(lambda x: x.destination == CallsConstants.INCOMING, stat_pbx_group) if len(pbx_incoming) is not 0: pbx_incoming_call = pbx_incoming[0] pbx_call_same_disp = None if not pbx_incoming_call.disposition in CallsConstants.FAIL_TYPES: pbx_call_same_disp = filter(lambda x: x.disposition == pbx_incoming_call.disposition and not x.destination == CallsConstants.INCOMING, stat_pbx_group)[0] else: pbx_call_same_disp = filter(lambda x: not x.destination == CallsConstants.INCOMING, stat_pbx_group) pbx_call_same_disp = stat_pbx_group[0] if len(pbx_call_same_disp) == 0 else pbx_call_same_disp[0] call.set_params( call_id=pbx_call_same_disp.call_id, clid=pbx_call_same_disp.clid, sip=pbx_call_same_disp.sip, date=pbx_call_same_disp.date, destination=pbx_call_same_disp.destination, disposition=pbx_incoming_call.disposition, bill_seconds=pbx_incoming_call.seconds ) else: pbx_call = stat_pbx_group[0] call.set_params( call_id=pbx_call.call_id, clid=pbx_call.clid, sip=pbx_call.sip, date=pbx_call.date, destination=pbx_call.destination, disposition=pbx_call.disposition, bill_seconds=pbx_call.seconds ) if PBXDataService.is_number_known(call.clid, userprofile): # звонок исходящий либо внутренний if PBXDataService.is_number_known(call.destination, userprofile): # номер известный - звонок внутренний call.call_type = CallsConstants.INTERNAL if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' internal.append(call) else: # звонок исходящий call.call_type = CallsConstants.COMING if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' coming.append(call) else: # звонок входящий call.call_type = CallsConstants.INCOMING if call.disposition in CallsConstants.FAIL_TYPES: call.destination = '' incoming.append(call) return coming + incoming + internal