Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Mike Lewis on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

CDR Internal Calls... Again. 3

Status
Not open for further replies.

Brutus82

MIS
Nov 25, 2008
111
US
I am trying to get our 61C, MDR2000, OTM to report internal calls. Sorry guys I’ve looked at every post here on internal call reporting with no luck. Here’s what I have:

• Every phone has ICDA, CNDA in cls
• I have “Internal Calls (Ext->Ext): Yes” set on MDR2000
• OTM external call reporting works perfect.
• When “Collecting” in OTM I don’t see any D to D “Internal” calls
• OTM has a huge C drive so plenty room to handle internal calls

I’ve done my research before posting this however I’m still at a loss as to why OTM can’t see Internal calls… help!!
 
Don't use OTM but I think external calls need to have billing set up to register, do you have anything set up for internal, even if it is $0?
 
Yes I tried setting Internal calls to a "Test" costing sheet with all zero amounts with no luck. It seems like I'm missing a setting on our 61C because during the Collecting process in the Data tab I never see any “D to D” calls only “T to D” and “D to T” calls.
 
Also I've reset both the MDR2000 and our OTM server with no luck.
 
Do you have the ICDR package 108 although as you say it allows you to add in the profiles ICDA ?

LD 22
REQ PRT
TYPE PKG

Cheers!!
 
Thanks for responding SL1M1,

No but I do have this in there:
ICDR 108
 
Doh! Sorry I read your post too fast, yes I do have that in LD 22
 
Thanks GHTROUT,

I kind of thought that same thing after reading more posts here. Unfortunately the Costing in OTM's Telecom Billing System is only seeing Ext(D) to Trunk(T) and Trunk(T) to Ext(D) no Internal(L) calls.

Is it possible the MDR2000 collecting script "mdr2000.col" is filtering out Internal calls? I looked at it in notepad but nothing stands out to me but I'm no expert though.
 
Other than ICDA being set in cls for all phones is there any other settings on the switch side that would prevent internal CDR from being sent to the MDR-2000?
 
This is a long shot, but look at the phone TN for CLS CDMA or CDMD. You want CDMA, if either exists.

Another long shot is the FCDR prompt in LD17 PARM. Toggling that from OLD to NEW (or NEW to OLD) may have some effect.

--
Nortel Resources at GHTROUT.com
--
 
I tried toggling FCDR to NEW, then OLD, then NEW again with no luck. I also tried your suggestion of adding CDMA to two extensions and making calls to each other with no luck. Thanks for the suggestions though GHTROUT!

Well I've narrowed it down to one of three things: It's not leaving the switch, it's not leaving the MDR2000 buffer, or OTM is not pulling or interpreting internal CDR correctly... other than that we're good! hehe
 
I would be hooking up a PC with terminal emulation right onto the PBX CDR CTY port...the serial port from the PBX. That will prove whether or not the record is being generated. The buffer box and the application all have their own say in what is shown to you. The PBX does not have any bias against any type of call record :)

--
Nortel Resources at GHTROUT.com
--
 
Ok doing the following in the MDR2000 I can see the "L" records with ext to ext (Internal) calls listed so I know it's getting to our OTM... or at least that the MDR2000 is seeing it.

M2K> Mode --> MDR BCD
M2K> Open Link (Enter)

L 088 00 DN5129 DN4770 03/01 11:40:11 00:00:10.0
& 012.0.02.09
& 000

L 089 00 DN5436 DN1711 03/01 11:40:19 00:00:24.0
& 004.1.12.06 004.0.02.09
& 000
 
Have you double checked your reporting filter in the OTM/TM to be sure that your filter is not blocking what you are seeing?
I have several customers tracking internal calls with no trouble by adding ICDA in CLS but they use DBA and not the MDDR2000.
 
This is probably where the problem exists. This is the "Collection Script" file
(mdr2000.col) thats used by OTM to pull CDR from our MDR2000. Is there anything
here that could be causing the trouble?




;*******************************************************************************
; Script file for the Data Script Engine to process MDR-2000 records.
; Created 19-APR-98 by MGR
;*******************************************************************************
;
; 16-NOV-00 Modification to support 'Jimmy Chip'. MGR
; 16-JAN-01 Including MDR2KE.INC file to support Ethernet communications. RT
;
;[End of Revision History]

;*******************************************************************************
; INCLUDE LANGUAGE FILES
;*******************************************************************************

Include LNGFILE(COMMON)
Include LNGFILE(MDR)

;*******************************************************************************
; INCLUDE STATUS.INC - Includes constants for sending status information.
;*******************************************************************************

INCLUDE STATUS.INC

;*******************************************************************************
; INCLUDE CONNECT.COM - Includes routines for communications - serial or file.
;*******************************************************************************

INCLUDE CONNECT.CON

;*******************************************************************************
; INCLUDE COLLECT.INC - Includes common CDR handling routines.
;*******************************************************************************

INCLUDE COLLECT.INC

;*******************************************************************************
; INCLUDE MDR2KE.INC - Includes routines for ETHERNET communications.
;*******************************************************************************

INCLUDE MDR2KE.INC

;*******************************************************************************
; ZeroStrip removes preceding zeroes in from of the ID's. This will reset
; the ID to the format before the MDR-2000 added zeroes.
;*******************************************************************************
routine ZeroStrip
begin
loop
let ZeroChar$ = copy(ID$, 2, 1)
if ZeroChar$ <> '0' then Exit
let ZeroChar$ = copy(ID$, 1, 1)
let ID$ = ZeroChar$ + copy(ID$, 3, 255)
endloop

; Do not strip all the zeros if there are only zeros (e.g. A000)
let CheckLength = Length(ID$)
if CheckLength = 1 then
let ID$ = ID$ + '0'
end

;*******************************************************************************
; Converts an MDR-2000 format CDR record to the new delimited format.
; The routine takes MDRRecord$ as the input and produces a converted record
; in the variable CDRRecord$.
;*******************************************************************************
routine ConvertCDRRecord
begin
Do GetSequenceNumber
let ID$ = copy(MDRRecord$, 7, 8)
Do ZeroStrip
let OrigID$ = ID$

let ID$ = copy(MDRRecord$, 15, 8)
Do ZeroStrip
let TermID$ = ID$

let CDRDate$ = copy(MDRRecord$, 23,2) + '/' + copy(MDRRecord$, 25, 2)
let CDRYear$ = CDRDate$
Do GetCDRYear
let CDRDate$ = CDRDate$ + '/' + CDRYear$

let CDRTime$ = copy(MDRRecord$, 27,2) + ':' + copy(MDRRecord$, 29,2) + ':00'

let Duration$ = copy(MDRRecord$, 31, 2)+':'+copy(MDRRecord$, 33, 2)
let Duration$ = Duration$ + ':' + copy(MDRRecord$, 35, 2)

; Get all the digit information from the CDR record.
; The MDR-2000 places all the additional call information into the CDR
; record in the digits field and identifies it using character ID's.
let M2KData$ = copy(MDRRecord$, 43, 255)

; Retrieve the Authorization code from the call.
let CheckPos = pos('A', M2KData$, FALSE)
if CheckPos <> 0 then
begin
loop
let M2KTemp$ = copy(M2KData$, 1, CheckPos-1)
let M2KTemp$ = M2KTemp$ + copy(M2KData$, CheckPos+1, 255)
let M2KData$ = M2KTemp$
let M2KChar$ = copy(M2KData$, CheckPos, 1)
if (M2KChar$ < '0') or (M2KChar$ > '9') then Exit
let AuthCode$ = AuthCode$ + M2KChar$
endloop
end

; Retrieve the Account code from the call.
let CheckPos = pos('#', M2KData$, FALSE)
if CheckPos <> 0 then
begin
loop
let M2KTemp$ = copy(M2KData$, 1, CheckPos-1)
let M2KTemp$ = M2KTemp$ + copy(M2KData$, CheckPos+1, 255)
let M2KData$ = M2KTemp$
let M2KChar$ = copy(M2KData$, CheckPos, 1)
; Special edit for "Jimmy Chip" to allow special codes prefixed by a 'T'.
; Refer to JMM or MGR or CS for further information.
if (M2KChar$ <> 'T') then
if (M2KChar$ < '0') or (M2KChar$ > '9') then Exit
let AcctCode$ = AcctCode$ + M2KChar$
endloop
end

; The ring time will always preceed the digits dialled if it is available.
let CheckPos = pos('T', M2KData$, FALSE)
if CheckPos <> 0 then
begin
let RingTime$ = copy(M2KData$, CheckPos+1, 3)
let M2KData$ = copy(M2KData$, CheckPos+4, 255)
end

; Retrieve the digits dialled from the call.
loop
let M2KDataLength = Length(M2KData$)
if M2KDataLength = 0 then Exit
let M2KChar$ = copy(M2KData$, 1, 1)
if (M2KChar$ < '0') or (M2KChar$ > '9') then Exit
let Digits$ = Digits$ + M2KChar$
let M2KData$ = copy(M2KData$, 2, 255)
endloop

; Retrieve the Calling Line ID from the call.
let CheckPos = pos('D', M2KData$, FALSE)
if CheckPos <> 0 then
begin
loop
let M2KTemp$ = copy(M2KData$, 1, CheckPos-1)
let M2KTemp$ = M2KTemp$ + copy(M2KData$, CheckPos+1, 255)
let M2KData$ = M2KTemp$
let M2KChar$ = copy(M2KData$, CheckPos, 1)
if (M2KChar$ < '0') or (M2KChar$ > '9') then Exit
let CLID$ = CLID$ + M2KChar$
endloop
end

loop
let CheckPos = pos('I', M2KData$, FALSE)
if CheckPos = 0 then Exit
let M2KChar$ = copy(M2KData$, CheckPos+1, 1)
; Get the Hold Time information.
if M2KChar$ = '0' then
begin
let HoldTime$ = copy(M2KData$, CheckPos+2, 3)
let M2KTemp$ = copy(M2KData$, 1, CheckPos-1)
let M2KTemp$ = M2KTemp$ + copy(M2KData$, CheckPos+1, 255)
let M2KData$ = M2KTemp$
end
; Get the 100 hour duration digits.
if M2KChar$ = '1' then
begin
let ExDuration$ = copy(M2KData$, CheckPos+2, 3)
let M2KTemp$ = copy(M2KData$, 1, CheckPos-1)
let M2KTemp$ = M2KTemp$ + copy(M2KData$, CheckPos+1, 255)
let M2KData$ = M2KTemp$
; Append 100 hour duration digits in front of the hours.
let Duration$ = ExDuration$ + Duration$
end
endloop

let DNIS$ = ''
if DNISInAccountCode! then
begin
let DNIS$ = AcctCode$
let AcctCode$ = ''
end

let Pulses$ = ''
let AnswerSupervision$ = ''

Do BuildCDRRecord
end

;*******************************************************************************
;Retrieves an MDR-2000 record from the specified data source.
;*******************************************************************************
routine GetMDR2000Record
begin
let Valid! = FALSE
let TimeOut! = FALSE
if ConnectionType$ = 'FILE' then
begin
GetFileData(FileName$, CRLF$, 0, MDRRecord$, TimeOut!)
let Valid! = TRUE
end
else if ConnectionType$ = 'ETHERNET' then
begin
Do GetEthernetData
let Valid! = TRUE
end
else
GetMDRRec(CtrlType$,M2KType,CollectCmd$,MDRRecord$,Valid!)

let DataRecord$ = MDRRecord$
Do PutBackupFile
end

;*******************************************************************************
;*******************************************************************************
routine MDR2000Collect
begin
let Valid! = FALSE
let CtrlType$ = chr(22)
let M2KType = 3
let CollectCMD$ = 'XT'
let MDR2000Error = 0
let MDR2000MaxRetries = 5
let MDR2000Retries = 0
let MDR2000TotalRetries = 0

if (ConnectionType$ = 'FILE') or (ConnectionType$ = 'ETHERNET') then
let Valid! = true
else
GetMDRType(CtrlType$,M2KType,Valid!)

; if not Valid! then ; Error getting the buffer type.
; let MDR2000Error = 1

; If cannot determine the type then default to a CTRL-V type 3 buffer.
if not Valid! then
begin
let Valid! = TRUE
let CtrlType$ = chr(22)
let M2KType = 3
end

if MDR2000Error = 0 then
begin
if (ConnectionType$ <> 'FILE') and (ConnectionType$ <> 'ETHERNET') then
begin
delay(1000)
sendln(CtrlType$+'DB')
if not WaitFor('HE',3) then
let MDR2000Error = 2 ; Error establishing connection.
end
end

if MDR2000Error = 0 then
begin
delay(500)

; The following line should only be uncommented when testing a buffer
; and a reset to the start of the record list needs to be done.
; This is used when a buffer is not CLRed at the end and a recollection
; of test data needs to be done.
; sendln(CtrlType$+'BE')

let PreviousRecord$ = '$$$$$$$$$$$$$' ; Set to dummy value.
Do InitCDRVariables

let RealTimeCount = 0
println(MDR_COLLECT$)
SendStatus(STAT_OK, MDR_COLLECT$, Result!)

; ******************************************
; Start Loop for Real-Time Collection
; ******************************************
loop
; ***************************************
; Start Loop for Collection
; ***************************************
loop ; Loop Start for Record Collection.
Do ResetCDRVariables
if Cancel_Flag! then Exit

Do GetMDR2000Record
if TimeOut! then Exit

if (MDRRecord$ = '') then
begin
; There is an error sometimes in real-time collection where the buffer
; does not respond to the collect command from time to time.
; This is a temporary fix during troubleshooting and is in place to
; work around the problem. MGR 07-JUL-99
let Valid! = true
end

if (MDRRecord$ = PreviousRecord$) or (not Valid!) then
begin
inc(MDR2000Retries)
inc(MDR2000TotalRetries)
if MDR2000Retries > MDR2000MaxRetries then
begin
let MDR2000Error = 3
Exit
end

end
else ; Record is OK.
begin
let MDR2000Retries = 0
let CheckPos = pos('END', MDRRecord$, true)
if CheckPos > 0 then Exit

; Reset real-time display counter.
let RealTimeCount = 0

let PreviousRecord$ = MDRRecord$
let TypeCheck$ = copy(MDRRecord$, 7, 1)
if TypeCheck$ = 'I' then
begin
let CDRRecord$ = 'IMG,'+MDRRecord$
Do SendCDRRecord
end
else
begin
; Send MDRRecord$ in and get CDRRecord$ out.
Do ConvertCDRRecord
Do SendCDRRecord
end

if ConnectionType$ <> 'FILE' then
begin
if ConnectionType$ = 'ETHERNET' then
Do Ethernet_SendOK
else
SendLn(CtrlType$+'OK')
end
end
endloop ; EndLoop for Record Collection.

if Cancel_Flag! then Exit
if not RealTime! then Exit
if MDR2000Error <> 0 then Exit

if ConnectionType$ = 'ETHERNET' then
begin
Do Ethernet_SendClear
; If can't Clear MDR-2000e buffer
if not ClearFound! then
let Cancel_Flag! = TRUE
end
else
begin
; *****************************************************
; If in Real-Time mode then the records must be deleted
; through each loop of the script.
; *****************************************************
SendLn(CtrlType$ + 'CL')
if not EXWaitFor('CLR',3) then
begin
println(MDR_ERRRTCLR$)
SendStatus(STAT_ERROR, MDR_ERRRTCLR$, Result!)
let Cancel_Flag! = TRUE
end
end
; *****************************************************
; To avoid the MDR2000Error = 3 check the PreviousRecord$
; must be reset. The buffer will say 'END' continuously.
; Therefore there will be a match of MDRRecord and
; PreviousRecord resuting in retries when the buffer is
; empty eventually causing an error.
; *****************************************************
let PreviousRecord$ = '$$$$$$$$$$$$$$$'

; *****************************************************
; Display a tick in the DataScr message window when
; waiting in real-time so that there is an indication
; that the script is still running.
; *****************************************************
inc(RealTimeCount)
if (RealTimeCount = 1) then
PrintLn(MDR_RTWAIT$)
else
Print('.')
if (RealTimeCount = 50) then
let RealTimeCount = 0

; *****************************************************
; Do not want to hit the buffer with too many commands
; when running real-time mode. Therefore, only attempt
; a collection every x number of milliseconds.
; *****************************************************
delay(7000)

endloop ; EndLoop for Real-Time collection.

if ConnectionType$ <> 'FILE' then
begin
if ConnectionType$ = 'ETHERNET' then
Do Ethernet_SendClear
else
begin
; *****************************************************
; The lines below can be removed so that once records
; are collected from the buffer they are not deleted.
; *****************************************************
SendLn(CtrlType$ + 'CL')
if not EXWaitFor('CLR',3) then
begin
println(MDR_ERRCLR$)
SendStatus(STAT_ERROR, MDR_ERRCLR$, Result!);
end
end
end
end
if MDR2000Error = 1 then
let MDR2000Error$ = MDR_ERRBUFTYP$
if MDR2000Error = 2 then
let MDR2000Error$ = MDR_ERRHELLO$
if MDR2000Error = 3 then
let MDR2000Error$ = MDR_ERRRECS$

if MDR2000Error <> 0 then
begin
println(MDR2000Error$)
SendStatus(STAT_ABORT, MDR2000Error$, Result!)
end
end


;******************************** Main Routine *************************
;*************************************************************************
;*************************************************************************
;

println(MDR_START$)
SendStatus(STAT_OK, MDR_START$, Result!);

let DNISInAccountCode! = FALSE

Do InitiateConnection

if not ConnectionError! then
if not Cancel_Flag! then
Do MDR2000Collect

Do TerminateConnection

if ConnectionError! then
SendStatus(STAT_ERROR, MDR_ERRCNCT$, Result!)
if Cancel_Flag! then
SendStatus(STAT_CANCEL, SCR_CANCEL$, Result!)

println(MDR_CLOSE$)
SendStatus(STAT_OK, MDR_CLOSE$, Result!)
delay(1000)
 
In the MDR 2000 I think I remember there being a minimum Digit field that if set for, say 7 digits, will discard all records of calls below that number, ie all internal 4 digit calls. Have you checked the set up of the MDR? I think "0" would accept all calls.
 
Thank You, Thank You!!! It was the "Minimum Digits" on the MDR2000 that was set to 4, I changed it to 0 and we now see Internal calls.

THANK YOU trvlr1, SL1M1, GHTROUT, jaxuser for all your time and efforts... and especially your patience!!
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top