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
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
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
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
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)
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)
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 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