Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: YTQRRPT

YTQRRPT.m

Go to the documentation of this file.
  1. YTQRRPT ;SLC/LLH - Report Builder ; 08/13/2018
  1. ;;5.01;MENTAL HEALTH;**130,141,172,218**;Dec 30, 1994;Build 9
  1. ;
  1. ; Reference to DIQ in ICR #2056
  1. ; Reference to VADPT in ICR #10061
  1. ; Reference to XLFDT in ICR #10103
  1. ; Reference to XLFNAME in ICR #3065
  1. ; Reference to XLFSTR in ICR #10104
  1. ;
  1. BLDRPT(RESULTS,ADMIN,MAXWIDTH) ;
  1. N ADATA,ANS,INST,LP,PDATA,RPT,RSTR,SCL,SWAP,YSDATA,YS,TSTNM
  1. I '$D(^YTT(601.84,ADMIN,0)) D SETERROR^YTQRUTL(404,"Not Found: "_ADMIN) Q
  1. S INST=$P(^YTT(601.84,ADMIN,0),U,3)
  1. I $P($G(^YTT(601.71,INST,8)),U,3)="Y" D QUIT ; call legacy report
  1. . N I,J
  1. . S YS("AD")=ADMIN
  1. . D LEGACY^YTQAPI8(.YSDATA,.YS)
  1. . ; only have 1 empty line at the top
  1. . S I=0 F S I=$O(^TMP("YSDATA",$J,1,I)) Q:'I Q:$L(^TMP("YSDATA",$J,1,I))
  1. . S I=I-2,J=0 F S I=$O(^TMP("YSDATA",$J,1,I)) Q:'I S J=J+1,RESULTS(J)=^(I)
  1. ; continue here if not legacy report
  1. I '$D(^YTT(601.93,"C",INST)) D SETERROR^YTQRUTL(404,"Not Found: "_INST) Q
  1. S RPT=$O(^YTT(601.93,"C",INST,"")) I '$G(RPT) D SETERROR^YTQRUTL(404,"Not Found: "_INST) Q
  1. S YS("AD")=ADMIN
  1. S TSTNM=$P($G(^YTT(601.71,$P(^YTT(601.84,ADMIN,0),U,3),0)),U)
  1. K ^TMP($J)
  1. D ADMINFO(.ADATA,ADMIN) ;get Administration information
  1. D PATINFO(.PDATA,ADATA("DFN")) ;get Patient demographic information
  1. D SWAPIT ;load report variables with data
  1. D GETSCORE^YTQAPI8(.YSDATA,.YS) ;get scale scores
  1. D SETSCL ;put in array to swap values
  1. D ALLANS^YTQAPI2(.YSDATA,.YS) ;get answers
  1. D SWAPANS ;load report answer vars with data
  1. D LOADTLT(.RSTR,RPT) ;load the report template
  1. I '$D(RSTR) D SETERROR^YTQRUTL(404,"Not Found: "_RPT) Q
  1. I $P(^YTT(601.71,+$P(^YTT(601.93,RPT,0),U,2),0),U)="AUDC" D VARYAUDC(.RSTR,ADMIN)
  1. D GETDATA ;insert the data from the answer vars
  1. I $G(MAXWIDTH)>1 D WRAPTLT(.RSTR,MAXWIDTH) ; wrap for progress notes
  1. ;Loop back through completed array to replace "|" (line feeds) with a blank line with a space
  1. D FIXP(.RSTR,.RESULTS)
  1. Q
  1. LOADTLT(TLT,RPT) ; Load template for RPT into .TLT split by "|" chars
  1. ; resulting TLT array uses $C(10) to represent line breaks
  1. N LP,LN,LF,FRAG,X,START,END
  1. S LF=$C(10),LN=0,FRAG=" "
  1. S LP=0 F S LP=$O(^YTT(601.93,RPT,1,LP)) Q:'LP D
  1. . S X=^YTT(601.93,RPT,1,LP,0)
  1. . I LP=1 S X=$$RMVDOTS(X) ; drop initial dots, linefeeds
  1. . I X["$~" S X=$P(X,"$~"),LP=9999999 ; $~ marks end of report
  1. . S START=0 F S END=$F(X,"|",START) D Q:'START
  1. . . I END D Q
  1. . . . S LN=LN+1
  1. . . . S TLT(LN)=FRAG_$E(X,START,END-2)_LF
  1. . . . S FRAG=" ",START=END
  1. . . E D
  1. . . . S FRAG=FRAG_$E(X,START,$L(X))
  1. . . . S START=0
  1. I $L(FRAG) S LN=LN+1,TLT(LN)=FRAG_LF
  1. Q
  1. RMVDOTS(X) ; Return X with the initial line feed / dots removed
  1. N I,FVC S FVC=0 F I=1:1 D Q:FVC
  1. . Q:$E(X,I)="|" Q:$E(X,I)=" " Q:$E(X,I)="."
  1. . S FVC=I
  1. F I=FVC:-1:0 Q:$E(X,I)="|"
  1. Q $E(X,I+1,$L(X))
  1. ;
  1. WRAPTLT(TLT,MAX) ; Wrap lines in TLT that are >WIDTH by adding $C(10)
  1. N I
  1. S I=0 F S I=$O(TLT(I)) Q:'I I $L(TLT(I))'<MAX S TLT(I)=$$WRAP(TLT(I),MAX)
  1. Q
  1. FIXP(RSTR,RESULTS) ;
  1. N LP,LN,LF,FRAG,START,END
  1. S LN=0,LF=$C(10),FRAG=""
  1. S LP=0 F S LP=$O(RSTR(LP)) Q:'LP D
  1. . S START=0 F S END=$F(RSTR(LP),LF,START) D Q:'START
  1. . . I END D Q
  1. . . . S LN=LN+1
  1. . . . S RESULTS(LN)=FRAG_$E(RSTR(LP),START,END-2)
  1. . . . I RESULTS(LN)="." S RESULTS(LN)=" "
  1. . . . S FRAG="",START=END
  1. . . E D
  1. . . . S FRAG=FRAG_$E(RSTR(LP),START,$L(RSTR(LP)))
  1. . . . S START=0
  1. Q
  1. GETDATA ;
  1. N LP
  1. S LP=0 F S LP=$O(RSTR(LP)) Q:'LP S RSTR(LP)=$$REPLACE^XLFSTR(RSTR(LP),.SWAP)
  1. Q
  1. ADMINFO(ADATA,ADMIN) ;
  1. N CLIN,DATA,MYNAME
  1. S DATA=^YTT(601.84,ADMIN,0)
  1. S CLIN=$$GET1^DIQ(601.84,ADMIN_",",5,"I")
  1. S MYNAME("FILE")=200
  1. S MYNAME("FIELD")=.01
  1. S MYNAME("IENS")=CLIN_","
  1. S ADATA("DFN")=$P($G(^YTT(601.84,ADMIN,0)),U,2)
  1. S ADATA("DATE")=$$FMTE^XLFDT($P($G(^YTT(601.84,ADMIN,0)),U,4),"5DZ")
  1. S ADATA("ORDERED")=$$NAMEFMT^XLFNAME(.MYNAME,"F","MCXc") ;Ordered by
  1. S ADATA("LOC")=$$TITLE^XLFSTR($$GET1^DIQ(601.84,ADMIN_",",13)) ;Location
  1. Q
  1. PATINFO(PDATA,DFN) ;
  1. N MYNAME,DOB
  1. I '$G(DFN) Q
  1. S MYNAME("FILE")=2
  1. S MYNAME("FIELD")=.01
  1. S MYNAME("IENS")=DFN_","
  1. S PDATA("NM")=$$NAMEFMT^XLFNAME(.MYNAME,"F","MCXc")
  1. D DEM^VADPT
  1. S PDATA("SSN")="xxx-xx-"_VA("BID")
  1. S DOB=$P(VADM(3),U,2),$E(DOB,2,3)=$$LOW^XLFSTR($E(DOB,2,3))
  1. S PDATA("DOB")=DOB
  1. S PDATA("AGE")=$P(VADM(4),U)
  1. I $L($P($G(VADM(14,5)),U,2)) D
  1. . S PDATA("GENDER")=$P(VADM(14,5),U)
  1. E D
  1. . S PDATA("GENDER")=$$SENTENCE^XLFSTR($P(VADM(5),U,2))
  1. D KVA^VADPT
  1. Q
  1. SWAPIT ;
  1. N LP,TXT
  1. F LP=1:1 S TXT=$T(SWAP+LP) Q:TXT["zzzzz" S SWAP($P(TXT,";;",2))=@($P(TXT,";;",3))
  1. S SWAP("<.DLL_String.>")="Complex Instrument"
  1. Q
  1. SWAP ;
  1. ;;<.Date_Given.>;ADATA("DATE")
  1. ;;<.Staff_Ordered_By.>;ADATA("ORDERED")
  1. ;;<.Location.>;ADATA("LOC")
  1. ;;<.Patient_Name_Last_First.>;PDATA("NM")
  1. ;;<.Patient_SSN.>;PDATA("SSN")
  1. ;;<.Patient_Date_Of_Birth.>;PDATA("DOB")
  1. ;;<.Patient_Age.>;PDATA("AGE")
  1. ;;<.Patient_Gender.>;PDATA("GENDER")
  1. ;;zzzzz
  1. Q
  1. SWAPANS ;
  1. N QSTN,SEQ,ANS,ANSID,LP,STR,MAX,X
  1. I '$D(YSDATA)!($G(YSDATA(1))'="[DATA]") Q
  1. S MAX=$S($G(MAXWIDTH):MAXWIDTH,1:80)
  1. F QSTN=7771:1:7787 S SWAP("<*Answer_"_QSTN_"*>")="" ; default for computed
  1. S LP=2 F S LP=$O(YSDATA(LP)) Q:'LP D
  1. . S QSTN=$P(YSDATA(LP),U),SEQ=$P(YSDATA(LP),U,2),ANS=$P(YSDATA(LP),U,3)
  1. . S ANSID="<*Answer_"_QSTN_"*>"
  1. . I ANS["|" S ANS=$$FMTANS(ANS) ; replace "|" chars with LF_" "
  1. . ; <*Answer_999999999999*> is the DLL string (special code for MMPI-2-RF)
  1. . I QSTN=999999999999 S SWAP(ANSID)=$S(TSTNM="MMPI-2-RF":$TR(ANS,":","|"),1:ANS) Q
  1. . ; text answers (and 7771:7787) have ";" in the sequence
  1. . I SEQ[";" S SWAP(ANSID)=$G(SWAP(ANSID))_ANS Q
  1. . ; capitalize skipped, special text for AUDC
  1. . I ANS=1155 S SWAP(ANSID)="SKIPPED" Q
  1. . I ANS=1156 D Q
  1. . . I TSTNM="AUDC" S SWAP(ANSID)="Not asked (patient reports no drinking in past year)" I 1
  1. . . E S SWAP(ANSID)="Not asked (due to responses to other questions)"
  1. . I ANS=1157 S SWAP(ANSID)="Skipped, but required" Q
  1. . ; get text for multiple choice questions
  1. . I $P($G(^YTT(601.72,QSTN,2)),U,2)=1 S SWAP(ANSID)=$P($G(^YTT(601.75,ANS,1)),U) Q
  1. . ; unanswered date question
  1. . I ANS="12/30/1899" S SWAP(ANSID)="" Q
  1. . ; bad data answer
  1. . I ANS="[BAD DATA]" S SWAP(ANSID)="Not Specified" Q
  1. . ; otherwise
  1. . S SWAP(ANSID)=ANS
  1. ;
  1. ; loop thru SWAP array & make sure all responses wrapped to MAX chars
  1. S X="<*" F S X=$O(SWAP(X)) Q:'$L(X) Q:$E(X,1,2)'="<*" D
  1. . I $L(SWAP(X))'>MAX Q ; already under max chars
  1. . I X="<*Answer_999999999999*>" Q ; DLLStr already wrapped
  1. . S SWAP(X)=$$WRAP(SWAP(X),MAX) ; wrap by adding | chars
  1. Q
  1. FMTANS(ANS) ; return answer string with $C(10))_" " for "|" chars
  1. N SWITCH S SWITCH("|")=$C(10)_" "
  1. Q $$REPLACE^XLFSTR(ANS,.SWITCH)
  1. ;
  1. SETSCL ;
  1. N LP,STR
  1. I '$D(^TMP($J,"YSCOR")) Q
  1. F LP=2:1 Q:('$D(^TMP($J,"YSCOR",LP)))!($G(^TMP($J,"YSCOR",1))="[ERROR]") D
  1. .S STR=$G(^TMP($J,"YSCOR",LP))
  1. .S SWAP("<-"_$P(STR,"=")_"->")=$P($P(STR,"=",2),U) ; use raw score
  1. Q
  1. WRAP(TX,MAX) ; If length of TX > MAX, wrap by adding $C(10)
  1. N OUT,I,J,X,Y,YNEW,LF
  1. S LF=$C(10)
  1. F I=1:1:$L(TX,LF) S X=$P(TX,LF,I) D
  1. . I $L(X)'>MAX D ADDOUT(X) QUIT
  1. . S Y=""
  1. . F J=1:1:$L(X," ") D
  1. . . S YNEW=Y_$S(J=1:"",1:" ")_$P(X," ",J)
  1. . . I $L(YNEW)>MAX D ADDOUT(Y) S Y=$P(X," ",J) I 1
  1. . . E S Y=YNEW
  1. . D ADDOUT(Y) ; add any remaining
  1. S X="",I=0 F S I=$O(OUT(I)) Q:'I S X=X_$S(I=1:"",1:LF)_OUT(I)
  1. Q X
  1. ;
  1. ADDOUT(S) ; add string to out array (expects OUT)
  1. S OUT=+$G(OUT)+1,OUT(OUT)=S
  1. Q
  1. ;
  1. ; special for AUDC -- hope to come up with a more general solution
  1. ;
  1. VARYAUDC(TLT,ADMIN) ; modify .TLT for AUDC based on patient sex
  1. N DFN,I,DONE,X1,X2,ENSRC
  1. S DFN=+$P($G(^YTT(601.84,ADMIN,0)),U,2) QUIT:'DFN
  1. I $P($G(^DPT(DFN,0)),U,2)'="F" QUIT ; only change if female
  1. S ENSRC=+$P($G(^YTT(601.84,ADMIN,0)),U,13) Q:'ENSRC ; not from MHA
  1. ; looking for the 3rd question, so start checked at about line 8
  1. S DONE=0,I=8 F S I=$O(TLT(I)) Q:'I D Q:DONE
  1. . I TLT(I)'["six or more" QUIT
  1. . S X1=$P(TLT(I),"six or more"),X2=$P(TLT(I),"six or more",2)
  1. . S TLT(I)=X1_"4 or more"_X2,DONE=1
  1. Q