YTSNSI ;BAL/KTL - Report for NSI FOR TBI ;Mar 27, 2025@08:59:02
 ;;5.01;MENTAL HEALTH;**255**;Dec 30, 1994;Build 13
 ;
 ;
DLLSTR(YSDATA,YS,YSTRNG) ; compute scores or report text based on YSTRNG
 ; input
 ;   YSDATA(2)=adminId^patientDFN^instrumentName^dateGiven^isComplete
 ;   YSDATA(2+n)=questionId^sequence^choiceId
 ;   YS("AD")=adminId
 ;   YSTRNG=1 for score, 2 for report
 ; output if YSTRNG=1: ^TMP($J,"YSCOR",n)=scaleId=score
 ; output if YSTRNG=2: append special "answers" to YSDATA
 ;
 N YSN,YSTEXT
 ;
 I YSTRNG=1 D BYKEY^YTSCORE(.YSDATA)  ; just use "regular" scoring
 ;
 I YSTRNG=2 D
 . N SCOREVAL,N
 . D LDSCORES^YTSCORE(.YSDATA,.YS) ; puts score into ^TMP($J,"YSCOR",2)
 . D REPORT
 Q
 ;
REPORT ; build the numerical answer array for the report
 ; expects ^TMP($J,"YSCOR",...) and ^TMP($J,"YSG") from DLLSTR
 ;         YSDATA from DLLSTR
 ; Question IEN = 9567-9588
 ; Answer array = 7771-7781
 N YTI,YTRAW,YTCNT,YTCHC,YTQUE,YTANS,TMPYS,II
 N YSTEXT
 S YTRAW=0,YTCNT=0
 S YTI=$O(YSDATA(""),-1)
 S II=2 F  S II=$O(YSDATA(II)) Q:'II  D
 . S YTQUE=$P(YSDATA(II),U)
 . S YTCHC=$P(YSDATA(II),U,3)
 . S YSTEXT=$G(^YTT(601.75,YTCHC,1))
 . S YTANS=YTQUE-1796  ;e.g. 9567-1796=7771
 . I (YTCHC=1155)!(YTCHC=1156)!(YTCHC=1157) D  Q  ; N/A or skipped
 .. S YTI=YTI+1,TMPYS(YTI)=YTANS_"^9999;1^"_$S(YTCHC=1155:"Skipped",YTCHC=1156:"Not asked (due to responses on other questions)",1:"Missing")
 . S YSTEXT=$$WRAP(YSTEXT,70,"     ")
 . S YTI=YTI+1,TMPYS(YTI)=YTANS_"^9999;1^"_YSTEXT
 M YSDATA=TMPYS
 Q
 ;
WRAP(TX,MAX,IND) ; If length of TX > MAX, wrap by adding LF and INDent
 N OUT,I,J,X,Y,YNEW,LF
 S LF="|"
 F I=1:1:$L(TX,LF) S X=$P(TX,LF,I) D
 . I $L(X)'>MAX D ADDOUT(X) QUIT
 . S Y=""
 . F J=1:1:$L(X," ") D
 . . S YNEW=Y_$S(J=1:"",1:" ")_$P(X," ",J)
 . . I $L(YNEW)>MAX D ADDOUT(Y) S Y=$P(X," ",J) I 1
 . . E  S Y=YNEW
 . D ADDOUT(Y) ; add any remaining
 S X="",I=0 F  S I=$O(OUT(I)) Q:'I  S X=X_$S(I=1:"",1:LF_IND)_OUT(I)
 Q X
 ;
ADDOUT(S) ; add string to out array (expects OUT)
 S OUT=+$G(OUT)+1,OUT(OUT)=S
 Q
 ;
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HYTSNSI   2086     printed  Sep 23, 2025@19:56:36                                                                                                                                                                                                      Page 2
YTSNSI    ;BAL/KTL - Report for NSI FOR TBI ;Mar 27, 2025@08:59:02
 +1       ;;5.01;MENTAL HEALTH;**255**;Dec 30, 1994;Build 13
 +2       ;
 +3       ;
DLLSTR(YSDATA,YS,YSTRNG) ; compute scores or report text based on YSTRNG
 +1       ; input
 +2       ;   YSDATA(2)=adminId^patientDFN^instrumentName^dateGiven^isComplete
 +3       ;   YSDATA(2+n)=questionId^sequence^choiceId
 +4       ;   YS("AD")=adminId
 +5       ;   YSTRNG=1 for score, 2 for report
 +6       ; output if YSTRNG=1: ^TMP($J,"YSCOR",n)=scaleId=score
 +7       ; output if YSTRNG=2: append special "answers" to YSDATA
 +8       ;
 +9        NEW YSN,YSTEXT
 +10      ;
 +11      ; just use "regular" scoring
           IF YSTRNG=1
               DO BYKEY^YTSCORE(.YSDATA)
 +12      ;
 +13       IF YSTRNG=2
               Begin DoDot:1
 +14               NEW SCOREVAL,N
 +15      ; puts score into ^TMP($J,"YSCOR",2)
                   DO LDSCORES^YTSCORE(.YSDATA,.YS)
 +16               DO REPORT
               End DoDot:1
 +17       QUIT 
 +18      ;
REPORT    ; build the numerical answer array for the report
 +1       ; expects ^TMP($J,"YSCOR",...) and ^TMP($J,"YSG") from DLLSTR
 +2       ;         YSDATA from DLLSTR
 +3       ; Question IEN = 9567-9588
 +4       ; Answer array = 7771-7781
 +5        NEW YTI,YTRAW,YTCNT,YTCHC,YTQUE,YTANS,TMPYS,II
 +6        NEW YSTEXT
 +7        SET YTRAW=0
           SET YTCNT=0
 +8        SET YTI=$ORDER(YSDATA(""),-1)
 +9        SET II=2
           FOR 
               SET II=$ORDER(YSDATA(II))
               if 'II
                   QUIT 
               Begin DoDot:1
 +10               SET YTQUE=$PIECE(YSDATA(II),U)
 +11               SET YTCHC=$PIECE(YSDATA(II),U,3)
 +12               SET YSTEXT=$GET(^YTT(601.75,YTCHC,1))
 +13      ;e.g. 9567-1796=7771
                   SET YTANS=YTQUE-1796
 +14      ; N/A or skipped
                   IF (YTCHC=1155)!(YTCHC=1156)!(YTCHC=1157)
                       Begin DoDot:2
 +15                       SET YTI=YTI+1
                           SET TMPYS(YTI)=YTANS_"^9999;1^"_$SELECT(YTCHC=1155:"Skipped",YTCHC=1156:"Not asked (due to responses on other questions)",1:"Missing")
                       End DoDot:2
                       QUIT 
 +16               SET YSTEXT=$$WRAP(YSTEXT,70,"     ")
 +17               SET YTI=YTI+1
                   SET TMPYS(YTI)=YTANS_"^9999;1^"_YSTEXT
               End DoDot:1
 +18       MERGE YSDATA=TMPYS
 +19       QUIT 
 +20      ;
WRAP(TX,MAX,IND) ; If length of TX > MAX, wrap by adding LF and INDent
 +1        NEW OUT,I,J,X,Y,YNEW,LF
 +2        SET LF="|"
 +3        FOR I=1:1:$LENGTH(TX,LF)
               SET X=$PIECE(TX,LF,I)
               Begin DoDot:1
 +4                IF $LENGTH(X)'>MAX
                       DO ADDOUT(X)
                       QUIT 
 +5                SET Y=""
 +6                FOR J=1:1:$LENGTH(X," ")
                       Begin DoDot:2
 +7                        SET YNEW=Y_$SELECT(J=1:"",1:" ")_$PIECE(X," ",J)
 +8                        IF $LENGTH(YNEW)>MAX
                               DO ADDOUT(Y)
                               SET Y=$PIECE(X," ",J)
                               IF 1
 +9                       IF '$TEST
                               SET Y=YNEW
                       End DoDot:2
 +10      ; add any remaining
                   DO ADDOUT(Y)
               End DoDot:1
 +11       SET X=""
           SET I=0
           FOR 
               SET I=$ORDER(OUT(I))
               if 'I
                   QUIT 
               SET X=X_$SELECT(I=1:"",1:LF_IND)_OUT(I)
 +12       QUIT X
 +13      ;
ADDOUT(S) ; add string to out array (expects OUT)
 +1        SET OUT=+$GET(OUT)+1
           SET OUT(OUT)=S
 +2        QUIT 
 +3       ;