YTSC19Y ;SLC/KCM - Score Modified C19-YRS ; 3/25/22 2:02pm
 ;;5.01;MENTAL HEALTH;**233**;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
 ;
 I YSTRNG=1 D SCORESV
 I YSTRNG=2 D
 . N SCORES,QANDA,N
 . D LDSCORES^YTSCORE(.YSDATA,.YS) ; puts score into ^TMP($J,"YSCOR",2)
 . D REPORT(.SCORES,.QANDA)
 . S N=$O(YSDATA(""),-1) ; get last node
 . S YSDATA(N+1)="7771^9999;1^"_SCORES
 . S YSDATA(N+2)="7772^9999;1^"_QANDA
 Q
 ;
SCORESV ; calculate the score
 ; expects YSDATA from DLLSTR (YSDATA from LOADANSW^YTSCORE,SCALEG^YTQAPI3)
 N QSTN,SYMNOW,SYMPRE,DISNOW,DISPRE,OTHSYM,ALLNOW,ALLPRE
 D BLDQSTN(.QSTN)
 S SYMNOW(1)=$$HIGHEST(.QSTN,"8979,8981,8983,8985")
 S SYMPRE(1)=$$HIGHEST(.QSTN,"8980,8982,8984,8986")
 S SYMNOW(2)=$$HIGHEST(.QSTN,"8987,8989")
 S SYMPRE(2)=$$HIGHEST(.QSTN,"8988,8990")
 S SYMNOW(3)=$G(QSTN(8991))
 S SYMPRE(3)=$G(QSTN(8992))
 S SYMNOW(4)=$$HIGHEST(.QSTN,"8993,8995")
 S SYMPRE(4)=$$HIGHEST(.QSTN,"8994,8996")
 S SYMNOW(5)=$$HIGHEST(.QSTN,"8997,8999,9001,9003,9005")
 S SYMPRE(5)=$$HIGHEST(.QSTN,"8998,9000,9002,9004,9006")
 S SYMNOW(6)=$$HIGHEST(.QSTN,"9007,9009,9011")
 S SYMPRE(6)=$$HIGHEST(.QSTN,"9008,9010,9012")
 S SYMNOW(7)=$$HIGHEST(.QSTN,"9013,9015")
 S SYMPRE(7)=$$HIGHEST(.QSTN,"9014,9016")
 S SYMNOW(8)=$G(QSTN(9017))
 S SYMPRE(8)=$G(QSTN(9018))
 S SYMNOW(9)=$$HIGHEST(.QSTN,"9019,9021,9023,9025,9027")
 S SYMPRE(9)=$$HIGHEST(.QSTN,"9020,9022,9024,9026,9028")
 S SYMNOW(10)=$G(QSTN(9029))
 S SYMPRE(10)=$G(QSTN(9030))
 S SYMNOW=0 F I=1:1:10 S SYMNOW=SYMNOW+SYMNOW(I)
 S SYMPRE=0 F I=1:1:10 S SYMPRE=SYMPRE+SYMPRE(I)
 S DISNOW=$$SUM(.QSTN,"9031,9033,9035,9037,9039")
 S DISPRE=$$SUM(.QSTN,"9032,9034,9036,9038,9040")
 I $G(QSTN(9041))="Left blank by the user." S OTHSYM=0 I 1
 E  S OTHSYM=$$CHKCNT(9041,$G(QSTN(9041)))
 S ALLNOW=$G(QSTN(9043)) ; <-- these aren't CID values
 S ALLPRE=$G(QSTN(9044))
 ;
 ; set scores into ^TMP($J,"YSCOR",n)=scaleName=score {rawScore^tScore}
 K ^TMP($J,"YSCOR")
 I $D(^TMP($J,"YSG",1)),^TMP($J,"YSG",1)="[ERROR]" D  Q  ;-->out
 . S ^TMP($J,"YSCOR",1)="[ERROR]"
 . S ^TMP($J,"YSCOR",2)="No Scale found for ADMIN"
 ;
 N I,J,SCLID,SCLNM
 S ^TMP($J,"YSCOR",1)="[DATA]"
 S I=2,J=1 F  S I=$O(^TMP($J,"YSG",I)) Q:'I  D
 . S SCLID=+$P(^TMP($J,"YSG",I),"=",2)
 . S SCLNM=$P(^TMP($J,"YSG",I),U,4)
 . S J=J+1
 . I SCLID=1495 S ^TMP($J,"YSCOR",J)=SCLNM_"="_SYMNOW
 . I SCLID=1496 S ^TMP($J,"YSCOR",J)=SCLNM_"="_SYMPRE
 . I SCLID=1497 S ^TMP($J,"YSCOR",J)=SCLNM_"="_DISNOW
 . I SCLID=1498 S ^TMP($J,"YSCOR",J)=SCLNM_"="_DISPRE
 . I SCLID=1499 S ^TMP($J,"YSCOR",J)=SCLNM_"="_ALLNOW
 . I SCLID=1500 S ^TMP($J,"YSCOR",J)=SCLNM_"="_ALLPRE
 . I SCLID=1485 S ^TMP($J,"YSCOR",J)=SCLNM_"="_OTHSYM
 Q
HIGHEST(QSTN,LIST) ; return highest value in LIST
 N I,HIGH,SKIPS,QID
 S HIGH=0,SKIPS=0
 F I=1:1:$L(LIST,",") S QID=$P(LIST,",",I) D
 . I '$D(QSTN(QID))!($G(QSTN(QID))="") S SKIPS=SKIPS+1 QUIT
 . I QSTN(QID)>HIGH S HIGH=QSTN(QID)
 Q HIGH
 ;
SUM(QSTN,LIST) ; return sum for questions in LIST
 N I,QID,SUM
 S SUM=0 F I=1:1:$L(LIST,",") S QID=$P(LIST,",",I) D
 . I $G(QSTN(QID)) S SUM=SUM+QSTN(QID)
 Q SUM
 ;
CHKCNT(QID,VAL) ; return the number of items checked for question
 N CLST,CNT,I
 D BLDCHKS(.CLST,QID)
 S (CNT,I)=0 F  S I=$O(CLST(I)) Q:'I  I VAL[CLST(I) S CNT=CNT+1
 Q CNT
 ;
BLDCHKS(CLST,QID) ; build list of checklist items for QID into .CLST
 N CTYP,SEQ,CID,X
 K CLST ; make sure list is clear
 S CTYP=$P($G(^YTT(601.72,QID,2)),U,3)
 S SEQ=0 F  S SEQ=$O(^YTT(601.751,"AC",CTYP,SEQ)) Q:'SEQ  D
 . S CID=0 F  S CID=$O(^YTT(601.751,"AC",CTYP,SEQ,CID)) Q:'CID  D
 . . S X=$G(^YTT(601.75,CID,1)),CLST(SEQ)=X
 Q
BLDQSTN(QSTN) ; build list of questions and response values in .QSTN
 ; expects YSDATA,YSTRNG from DLLSTR
 N I,CID,QID
 S I=2 F  S I=$O(YSDATA(I)) Q:'I  D
 . S CID=$P(YSDATA(I),U,3),QID=$P(YSDATA(I),U)
 . I CID=1155!(CID=1156)!(CID=1157) Q  ; don't include skipped questions
 . I CID=5548,(YSTRNG=1) Q             ; don't include "Don't Know" for score
 . I $P($G(^YTT(601.72,QID,2)),U,2)'=1 D  QUIT
 . . S QSTN(QID)=$G(QSTN(QID))_$P(YSDATA(I),U,3)
 . S QSTN(QID)=$P($G(^YTT(601.75,CID,0)),U,2)
 Q
REPORT(SCORES,QANDA) ; build the scoring display for the report
 ; expects ^TMP($J,"YSCOR",...) and ^TMP($J,"YSG") from DLLSTR
 ;         YSDATA from DLLSTR
 N BLANKS,QSTN
 D BLDQSTN(.QSTN)
 S $P(BLANKS," ",81)=""
 S SCORES=$$BLDSCR()
 S QANDA=$$BLDQA()
 Q
BLDSCR() ; build the scoring block
 ; expects ^TMP($J,"YSCOR") from DLLSTR
 N I,NAME,VALUE,SYMNOW,SYMPRE,DISNOW,DISPRE,OTHSYM,ALLNOW,ALLPRE,X
 S I=0 F  S I=$O(^TMP($J,"YSCOR",I)) Q:'I  D
 . S NAME=$P(^TMP($J,"YSCOR",I),"=")
 . S VALUE=$P(^TMP($J,"YSCOR",I),"=",2)
 . I NAME="Symptom Severity Now" S SYMNOW=VALUE
 . I NAME="Symptom Severity Pre-COVID" S SYMPRE=VALUE
 . I NAME="Functional Disability Now" S DISNOW=VALUE
 . I NAME="Functional Disability Pre-COVID" S DISPRE=VALUE
 . I NAME="Additional Symptoms" S OTHSYM=VALUE
 . I NAME="Overall Health Now" S ALLNOW=VALUE
 . I NAME="Overall Health Pre-COVID" S ALLPRE=VALUE
 S X=""
 S X=X_"|                         Now  Pre-COVID"
 S X=X_"|                         ---  ---------"
 S X=X_"|      Symptom Severity:"_$$SCRTXT(SYMNOW,SYMPRE)
 S X=X_"| Functional Disability:"_$$SCRTXT(DISNOW,DISPRE)
 S X=X_"|   Additional Symptoms:"_$$SCRTXT(OTHSYM,"")
 S X=X_"|        Overall Health:"_$$SCRTXT(ALLNOW,ALLPRE)
 Q X
 ;
SCRTXT(NOW,PRE) ; return score string
 Q "  "_$J(NOW,3)_"    "_$J(PRE,3)
 ;
BLDQA() ; Build questions & answers
 ; expects QSTN, BLANKS from REPORT
 N I,TEXT,X,XC,WTEXT,WINDENT,WNOW,WPRE
 S WTEXT=56,WINDENT=8
 S WNOW=$L("Moderate")+2
 S WPRE=$L("Don't Know")
 S TEXT="" F I=1:1 S X=$P($T(RPTQA+I),";;",2,99) Q:X="zzzzz"  D
 . ; handle text, wp and checklists first
 . I X=9045 D  QUIT                              ; text
 . . S TEXT=TEXT_"|18a)  Occupation: "_$G(QSTN(+X))
 . I X=9041!(X=9046) D  QUIT                     ; checklist
 . . I '$L($G(QSTN(+X))) S TEXT=TEXT_"|" QUIT
 . . N CLST,J
 . . D BLDCHKS(.CLST,X)                          ; all checkbox items
 . . S J=0 F  S J=$O(CLST(J)) Q:'J  I QSTN(+X)[CLST(J) D
 . . . S TEXT=TEXT_$$WRAP(CLST(J),76,$E(BLANKS,1,WINDENT))
 . I X=9042!(X=9047)!(X=9048) D  QUIT            ; wp text
 . . I '$L($G(QSTN(+X))) S TEXT=TEXT_"|" QUIT
 . . S TEXT=TEXT_$$WRAP(QSTN(+X),76,$E(BLANKS,1,WINDENT))
 . ; handle question / answer text               ; now/pre responses
 . S NOW=$P(X,U,2),PRE=$P(X,U,3)
 . I NOW="",(PRE="") S TEXT=TEXT_"|"_$P(X,U) I 1
 . E  S TEXT=TEXT_"|"_$E($P(X,U)_BLANKS,1,WTEXT)
 . I $L(NOW) S TEXT=TEXT_$E($$ANSTXT(NOW)_BLANKS,1,WNOW)
 . I $L(PRE) S TEXT=TEXT_$$ANSTXT(PRE)
 Q TEXT
 ;
ANSTXT(QID) ; return text for answer to question
 ; expects QSTN from REPORT > BLDQA
 I QID'=+QID Q QID                      ; non-numeric, just return text
 I QID=9043 Q $J($G(QSTN(QID)),2)       ; actual value (range question)
 I QID=9044 Q "   "_$J($G(QSTN(QID)),2)
 I '$D(QSTN(QID)) Q "SKIPPED"
 I $G(QSTN(QID))=0 Q "None"
 I $G(QSTN(QID))=1 Q "Mild"
 I $G(QSTN(QID))=2 Q "Moderate"
 I $G(QSTN(QID))=3 Q "Severe"
 I $G(QSTN(QID))=4 Q "Don't Know"
 Q "??"
 ;
WRAP(IN,MAX,PRE) ; Return with | and spacing in correct place
 N I,J,L,OUT,PAR,TXT,WORD
 S OUT="",TXT="",L=0
 F I=1:1:$L(IN,"|") S PAR=$P(IN,"|",I) D
 . S L=L+1,OUT(L)=PRE_$P(PAR," ")
 . F J=2:1:$L(PAR," ") S WORD=$P(PAR," ",J) D
 . . I ($L(OUT(L))+$L(WORD)+1)<MAX S OUT(L)=OUT(L)_" "_WORD I 1
 . . E  S L=L+1,OUT(L)=PRE_WORD
 S L=0 F  S L=$O(OUT(L)) Q:'L  S TXT=TXT_"|"_OUT(L)
 Q TXT
 ;
RPTQA ; Questions & Answers for Report
 ;;Questions and Answers:
 ;;
 ;;SYMPTOM SEVERITY^Now^Pre-COVID
 ;;  ^---^---------
 ;;Breathlessness
 ;;1a)  Breathlessness: At rest^8979^8980
 ;;1b)  Breathlessness: Changing position e.g. from^8981^8982
 ;;     lying to sitting or sitting to lying
 ;;1c)  Breathlessness: On dressing yourself^8983^8984
 ;;1d)  Breathlessness: On walking up a flight of stairs^8985^8986
 ;;
 ;;Cough/ throat sensitivity/ voice change
 ;;2a)  Cough / throat sensitivity^8987^8988
 ;;2b)  Change of voice^8989^8990
 ;;
 ;;Fatigue (tiredness not improved by rest)
 ;;3)   Fatigue levels in your usual activities^8991^8992
 ;;
 ;;Smell / taste
 ;;4a)  Altered smell^8993^8994
 ;;4b)  Altered taste^8995^8996
 ;;
 ;;Pain / discomfort
 ;;5a)  Chest pain^8997^8998
 ;;5b)  Joint pain^8999^9000
 ;;5c)  Muscle pain^9001^9002
 ;;5d)  Headache^9003^9004
 ;;5e)  Abdominal pain^9005^9006
 ;;
 ;;Cognition
 ;;6a)  Problems with concentration^9007^9008
 ;;6b)  Problems with memory^9009^9010
 ;;6c)  Problems with planning^9011^9012
 ;;
 ;;Palpitations / dizziness
 ;;7a)  Palpitations in certain positions, activity or^9013^9014
 ;;     at rest
 ;;7b)  Dizziness in certain positions, activity or at^9015^9016
 ;;     rest
 ;;
 ;;Post-exertional malaise (worsening of symptoms)
 ;; 8)  Crashing or relapse hours or days after physical,^9017^9018
 ;;     cognitive or emotional exertion
 ;;
 ;;Anxiety / mood
 ;;9a)  Feeling anxious^9019^9020
 ;;9b)  Feeling depressed^9021^9022
 ;;9c)  Having unwanted memories of your illness or^9023^9024
 ;;     time in hospital
 ;;9d)  Having unpleasant dreams about your illness or^9025^9026
 ;;     time in hospital
 ;;9e)  Trying to avoid thoughts or feelings about your^9027^9028
 ;;     illness or time in hospital
 ;;
 ;;Sleep
 ;;10)  Sleep problems, such as difficulty falling^9029^9030
 ;;     asleep, staying asleep or oversleeping
 ;;
 ;;
 ;;FUNCTIONAL ABILITY
 ;;
 ;;Communication
 ;;11)  Difficulty with communication / word finding^9031^9032
 ;;     difficulty / understanding others
 ;;
 ;;
 ;;Walking or moving around
 ;;12)  Difficulties with walking or moving around^9033^9034
 ;;
 ;;Personal Care
 ;;13)  Difficulties with personal tasks such as using^9035^9036
 ;;     the toilet or getting washed and dressed
 ;;
 ;;Other activities of Daily Living^9037^9038
 ;;14)  Difficulty doing wider activities, such as
 ;;     household work, leisure/sporting activities,
 ;;     paid/unpaid work, study or shopping
 ;;
 ;;Social Role
 ;;15)  Problems with socializing / interacting with^9039^9040
 ;;     friends* or caring for dependents
 ;;     *related to your illness and not due to social
 ;;     distancing / lockdown measures
 ;;    
 ;;
 ;;OTHER SYMPTOMS
 ;;
 ;;16a)  Please select any of the following symptoms you have experienced 
 ;;      since your illness in the last 7 days. Please also select any 
 ;;      previous problems that have worsened for you following your illness.
 ;;9041
 ;;16b)  Other symptoms - free text
 ;;9042
 ;;
 ;;
 ;;OVERALL HEALTH^Now^Pre-COVID
 ;;  ^---^---------
 ;;17a)  How good or bad is your health overall in the^9043^9044
 ;;      last 7 days?
 ;;
 ;;
 ;;EMPLOYMENT
 ;;
 ;;9045
 ;;18b)  Has your COVID-19 illness affected your work??
 ;;9046
 ;;18c)  Any other comments/concerns
 ;;9047
 ;;
 ;;
 ;;PARTNER / FAMILY / CAREGIVER PERSPECTIVE
 ;;
 ;;19)   This is space for your partner, family or caregiver to add anything
 ;;      from their perspective:
 ;;9048
 ;;zzzzz
 ;
TESTSCR(YSAD) ; Test scoring routine
 N YS,YSDATA
 S YS("AD")=YSAD,YS("CODE")="C19-YRS"
 D LOADANSW^YTSCORE(.YSDATA,.YS)
 D SCALEG^YTQAPI3(.YSDATA,.YS)
 D DLLSTR(.YSDATA,.YS,1)
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HYTSC19Y   11713     printed  Sep 23, 2025@19:55:36                                                                                                                                                                                                    Page 2
YTSC19Y   ;SLC/KCM - Score Modified C19-YRS ; 3/25/22 2:02pm
 +1       ;;5.01;MENTAL HEALTH;**233**;Dec 30, 1994;Build 13
 +2       ;
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        IF YSTRNG=1
               DO SCORESV
 +10       IF YSTRNG=2
               Begin DoDot:1
 +11               NEW SCORES,QANDA,N
 +12      ; puts score into ^TMP($J,"YSCOR",2)
                   DO LDSCORES^YTSCORE(.YSDATA,.YS)
 +13               DO REPORT(.SCORES,.QANDA)
 +14      ; get last node
                   SET N=$ORDER(YSDATA(""),-1)
 +15               SET YSDATA(N+1)="7771^9999;1^"_SCORES
 +16               SET YSDATA(N+2)="7772^9999;1^"_QANDA
               End DoDot:1
 +17       QUIT 
 +18      ;
SCORESV   ; calculate the score
 +1       ; expects YSDATA from DLLSTR (YSDATA from LOADANSW^YTSCORE,SCALEG^YTQAPI3)
 +2        NEW QSTN,SYMNOW,SYMPRE,DISNOW,DISPRE,OTHSYM,ALLNOW,ALLPRE
 +3        DO BLDQSTN(.QSTN)
 +4        SET SYMNOW(1)=$$HIGHEST(.QSTN,"8979,8981,8983,8985")
 +5        SET SYMPRE(1)=$$HIGHEST(.QSTN,"8980,8982,8984,8986")
 +6        SET SYMNOW(2)=$$HIGHEST(.QSTN,"8987,8989")
 +7        SET SYMPRE(2)=$$HIGHEST(.QSTN,"8988,8990")
 +8        SET SYMNOW(3)=$GET(QSTN(8991))
 +9        SET SYMPRE(3)=$GET(QSTN(8992))
 +10       SET SYMNOW(4)=$$HIGHEST(.QSTN,"8993,8995")
 +11       SET SYMPRE(4)=$$HIGHEST(.QSTN,"8994,8996")
 +12       SET SYMNOW(5)=$$HIGHEST(.QSTN,"8997,8999,9001,9003,9005")
 +13       SET SYMPRE(5)=$$HIGHEST(.QSTN,"8998,9000,9002,9004,9006")
 +14       SET SYMNOW(6)=$$HIGHEST(.QSTN,"9007,9009,9011")
 +15       SET SYMPRE(6)=$$HIGHEST(.QSTN,"9008,9010,9012")
 +16       SET SYMNOW(7)=$$HIGHEST(.QSTN,"9013,9015")
 +17       SET SYMPRE(7)=$$HIGHEST(.QSTN,"9014,9016")
 +18       SET SYMNOW(8)=$GET(QSTN(9017))
 +19       SET SYMPRE(8)=$GET(QSTN(9018))
 +20       SET SYMNOW(9)=$$HIGHEST(.QSTN,"9019,9021,9023,9025,9027")
 +21       SET SYMPRE(9)=$$HIGHEST(.QSTN,"9020,9022,9024,9026,9028")
 +22       SET SYMNOW(10)=$GET(QSTN(9029))
 +23       SET SYMPRE(10)=$GET(QSTN(9030))
 +24       SET SYMNOW=0
           FOR I=1:1:10
               SET SYMNOW=SYMNOW+SYMNOW(I)
 +25       SET SYMPRE=0
           FOR I=1:1:10
               SET SYMPRE=SYMPRE+SYMPRE(I)
 +26       SET DISNOW=$$SUM(.QSTN,"9031,9033,9035,9037,9039")
 +27       SET DISPRE=$$SUM(.QSTN,"9032,9034,9036,9038,9040")
 +28       IF $GET(QSTN(9041))="Left blank by the user."
               SET OTHSYM=0
               IF 1
 +29      IF '$TEST
               SET OTHSYM=$$CHKCNT(9041,$GET(QSTN(9041)))
 +30      ; <-- these aren't CID values
           SET ALLNOW=$GET(QSTN(9043))
 +31       SET ALLPRE=$GET(QSTN(9044))
 +32      ;
 +33      ; set scores into ^TMP($J,"YSCOR",n)=scaleName=score {rawScore^tScore}
 +34       KILL ^TMP($JOB,"YSCOR")
 +35      ;-->out
           IF $DATA(^TMP($JOB,"YSG",1))
               IF ^TMP($JOB,"YSG",1)="[ERROR]"
                   Begin DoDot:1
 +36                   SET ^TMP($JOB,"YSCOR",1)="[ERROR]"
 +37                   SET ^TMP($JOB,"YSCOR",2)="No Scale found for ADMIN"
                   End DoDot:1
                   QUIT 
 +38      ;
 +39       NEW I,J,SCLID,SCLNM
 +40       SET ^TMP($JOB,"YSCOR",1)="[DATA]"
 +41       SET I=2
           SET J=1
           FOR 
               SET I=$ORDER(^TMP($JOB,"YSG",I))
               if 'I
                   QUIT 
               Begin DoDot:1
 +42               SET SCLID=+$PIECE(^TMP($JOB,"YSG",I),"=",2)
 +43               SET SCLNM=$PIECE(^TMP($JOB,"YSG",I),U,4)
 +44               SET J=J+1
 +45               IF SCLID=1495
                       SET ^TMP($JOB,"YSCOR",J)=SCLNM_"="_SYMNOW
 +46               IF SCLID=1496
                       SET ^TMP($JOB,"YSCOR",J)=SCLNM_"="_SYMPRE
 +47               IF SCLID=1497
                       SET ^TMP($JOB,"YSCOR",J)=SCLNM_"="_DISNOW
 +48               IF SCLID=1498
                       SET ^TMP($JOB,"YSCOR",J)=SCLNM_"="_DISPRE
 +49               IF SCLID=1499
                       SET ^TMP($JOB,"YSCOR",J)=SCLNM_"="_ALLNOW
 +50               IF SCLID=1500
                       SET ^TMP($JOB,"YSCOR",J)=SCLNM_"="_ALLPRE
 +51               IF SCLID=1485
                       SET ^TMP($JOB,"YSCOR",J)=SCLNM_"="_OTHSYM
               End DoDot:1
 +52       QUIT 
HIGHEST(QSTN,LIST) ; return highest value in LIST
 +1        NEW I,HIGH,SKIPS,QID
 +2        SET HIGH=0
           SET SKIPS=0
 +3        FOR I=1:1:$LENGTH(LIST,",")
               SET QID=$PIECE(LIST,",",I)
               Begin DoDot:1
 +4                IF '$DATA(QSTN(QID))!($GET(QSTN(QID))="")
                       SET SKIPS=SKIPS+1
                       QUIT 
 +5                IF QSTN(QID)>HIGH
                       SET HIGH=QSTN(QID)
               End DoDot:1
 +6        QUIT HIGH
 +7       ;
SUM(QSTN,LIST) ; return sum for questions in LIST
 +1        NEW I,QID,SUM
 +2        SET SUM=0
           FOR I=1:1:$LENGTH(LIST,",")
               SET QID=$PIECE(LIST,",",I)
               Begin DoDot:1
 +3                IF $GET(QSTN(QID))
                       SET SUM=SUM+QSTN(QID)
               End DoDot:1
 +4        QUIT SUM
 +5       ;
CHKCNT(QID,VAL) ; return the number of items checked for question
 +1        NEW CLST,CNT,I
 +2        DO BLDCHKS(.CLST,QID)
 +3        SET (CNT,I)=0
           FOR 
               SET I=$ORDER(CLST(I))
               if 'I
                   QUIT 
               IF VAL[CLST(I)
                   SET CNT=CNT+1
 +4        QUIT CNT
 +5       ;
BLDCHKS(CLST,QID) ; build list of checklist items for QID into .CLST
 +1        NEW CTYP,SEQ,CID,X
 +2       ; make sure list is clear
           KILL CLST
 +3        SET CTYP=$PIECE($GET(^YTT(601.72,QID,2)),U,3)
 +4        SET SEQ=0
           FOR 
               SET SEQ=$ORDER(^YTT(601.751,"AC",CTYP,SEQ))
               if 'SEQ
                   QUIT 
               Begin DoDot:1
 +5                SET CID=0
                   FOR 
                       SET CID=$ORDER(^YTT(601.751,"AC",CTYP,SEQ,CID))
                       if 'CID
                           QUIT 
                       Begin DoDot:2
 +6                        SET X=$GET(^YTT(601.75,CID,1))
                           SET CLST(SEQ)=X
                       End DoDot:2
               End DoDot:1
 +7        QUIT 
BLDQSTN(QSTN) ; build list of questions and response values in .QSTN
 +1       ; expects YSDATA,YSTRNG from DLLSTR
 +2        NEW I,CID,QID
 +3        SET I=2
           FOR 
               SET I=$ORDER(YSDATA(I))
               if 'I
                   QUIT 
               Begin DoDot:1
 +4                SET CID=$PIECE(YSDATA(I),U,3)
                   SET QID=$PIECE(YSDATA(I),U)
 +5       ; don't include skipped questions
                   IF CID=1155!(CID=1156)!(CID=1157)
                       QUIT 
 +6       ; don't include "Don't Know" for score
                   IF CID=5548
                       IF (YSTRNG=1)
                           QUIT 
 +7                IF $PIECE($GET(^YTT(601.72,QID,2)),U,2)'=1
                       Begin DoDot:2
 +8                        SET QSTN(QID)=$GET(QSTN(QID))_$PIECE(YSDATA(I),U,3)
                       End DoDot:2
                       QUIT 
 +9                SET QSTN(QID)=$PIECE($GET(^YTT(601.75,CID,0)),U,2)
               End DoDot:1
 +10       QUIT 
REPORT(SCORES,QANDA) ; build the scoring display for the report
 +1       ; expects ^TMP($J,"YSCOR",...) and ^TMP($J,"YSG") from DLLSTR
 +2       ;         YSDATA from DLLSTR
 +3        NEW BLANKS,QSTN
 +4        DO BLDQSTN(.QSTN)
 +5        SET $PIECE(BLANKS," ",81)=""
 +6        SET SCORES=$$BLDSCR()
 +7        SET QANDA=$$BLDQA()
 +8        QUIT 
BLDSCR()  ; build the scoring block
 +1       ; expects ^TMP($J,"YSCOR") from DLLSTR
 +2        NEW I,NAME,VALUE,SYMNOW,SYMPRE,DISNOW,DISPRE,OTHSYM,ALLNOW,ALLPRE,X
 +3        SET I=0
           FOR 
               SET I=$ORDER(^TMP($JOB,"YSCOR",I))
               if 'I
                   QUIT 
               Begin DoDot:1
 +4                SET NAME=$PIECE(^TMP($JOB,"YSCOR",I),"=")
 +5                SET VALUE=$PIECE(^TMP($JOB,"YSCOR",I),"=",2)
 +6                IF NAME="Symptom Severity Now"
                       SET SYMNOW=VALUE
 +7                IF NAME="Symptom Severity Pre-COVID"
                       SET SYMPRE=VALUE
 +8                IF NAME="Functional Disability Now"
                       SET DISNOW=VALUE
 +9                IF NAME="Functional Disability Pre-COVID"
                       SET DISPRE=VALUE
 +10               IF NAME="Additional Symptoms"
                       SET OTHSYM=VALUE
 +11               IF NAME="Overall Health Now"
                       SET ALLNOW=VALUE
 +12               IF NAME="Overall Health Pre-COVID"
                       SET ALLPRE=VALUE
               End DoDot:1
 +13       SET X=""
 +14       SET X=X_"|                         Now  Pre-COVID"
 +15       SET X=X_"|                         ---  ---------"
 +16       SET X=X_"|      Symptom Severity:"_$$SCRTXT(SYMNOW,SYMPRE)
 +17       SET X=X_"| Functional Disability:"_$$SCRTXT(DISNOW,DISPRE)
 +18       SET X=X_"|   Additional Symptoms:"_$$SCRTXT(OTHSYM,"")
 +19       SET X=X_"|        Overall Health:"_$$SCRTXT(ALLNOW,ALLPRE)
 +20       QUIT X
 +21      ;
SCRTXT(NOW,PRE) ; return score string
 +1        QUIT "  "_$JUSTIFY(NOW,3)_"    "_$JUSTIFY(PRE,3)
 +2       ;
BLDQA()   ; Build questions & answers
 +1       ; expects QSTN, BLANKS from REPORT
 +2        NEW I,TEXT,X,XC,WTEXT,WINDENT,WNOW,WPRE
 +3        SET WTEXT=56
           SET WINDENT=8
 +4        SET WNOW=$LENGTH("Moderate")+2
 +5        SET WPRE=$LENGTH("Don't Know")
 +6        SET TEXT=""
           FOR I=1:1
               SET X=$PIECE($TEXT(RPTQA+I),";;",2,99)
               if X="zzzzz"
                   QUIT 
               Begin DoDot:1
 +7       ; handle text, wp and checklists first
 +8       ; text
                   IF X=9045
                       Begin DoDot:2
 +9                        SET TEXT=TEXT_"|18a)  Occupation: "_$GET(QSTN(+X))
                       End DoDot:2
                       QUIT 
 +10      ; checklist
                   IF X=9041!(X=9046)
                       Begin DoDot:2
 +11                       IF '$LENGTH($GET(QSTN(+X)))
                               SET TEXT=TEXT_"|"
                               QUIT 
 +12                       NEW CLST,J
 +13      ; all checkbox items
                           DO BLDCHKS(.CLST,X)
 +14                       SET J=0
                           FOR 
                               SET J=$ORDER(CLST(J))
                               if 'J
                                   QUIT 
                               IF QSTN(+X)[CLST(J)
                                   Begin DoDot:3
 +15                                   SET TEXT=TEXT_$$WRAP(CLST(J),76,$EXTRACT(BLANKS,1,WINDENT))
                                   End DoDot:3
                       End DoDot:2
                       QUIT 
 +16      ; wp text
                   IF X=9042!(X=9047)!(X=9048)
                       Begin DoDot:2
 +17                       IF '$LENGTH($GET(QSTN(+X)))
                               SET TEXT=TEXT_"|"
                               QUIT 
 +18                       SET TEXT=TEXT_$$WRAP(QSTN(+X),76,$EXTRACT(BLANKS,1,WINDENT))
                       End DoDot:2
                       QUIT 
 +19      ; handle question / answer text               ; now/pre responses
 +20               SET NOW=$PIECE(X,U,2)
                   SET PRE=$PIECE(X,U,3)
 +21               IF NOW=""
                       IF (PRE="")
                           SET TEXT=TEXT_"|"_$PIECE(X,U)
                           IF 1
 +22              IF '$TEST
                       SET TEXT=TEXT_"|"_$EXTRACT($PIECE(X,U)_BLANKS,1,WTEXT)
 +23               IF $LENGTH(NOW)
                       SET TEXT=TEXT_$EXTRACT($$ANSTXT(NOW)_BLANKS,1,WNOW)
 +24               IF $LENGTH(PRE)
                       SET TEXT=TEXT_$$ANSTXT(PRE)
               End DoDot:1
 +25       QUIT TEXT
 +26      ;
ANSTXT(QID) ; return text for answer to question
 +1       ; expects QSTN from REPORT > BLDQA
 +2       ; non-numeric, just return text
           IF QID'=+QID
               QUIT QID
 +3       ; actual value (range question)
           IF QID=9043
               QUIT $JUSTIFY($GET(QSTN(QID)),2)
 +4        IF QID=9044
               QUIT "   "_$JUSTIFY($GET(QSTN(QID)),2)
 +5        IF '$DATA(QSTN(QID))
               QUIT "SKIPPED"
 +6        IF $GET(QSTN(QID))=0
               QUIT "None"
 +7        IF $GET(QSTN(QID))=1
               QUIT "Mild"
 +8        IF $GET(QSTN(QID))=2
               QUIT "Moderate"
 +9        IF $GET(QSTN(QID))=3
               QUIT "Severe"
 +10       IF $GET(QSTN(QID))=4
               QUIT "Don't Know"
 +11       QUIT "??"
 +12      ;
WRAP(IN,MAX,PRE) ; Return with | and spacing in correct place
 +1        NEW I,J,L,OUT,PAR,TXT,WORD
 +2        SET OUT=""
           SET TXT=""
           SET L=0
 +3        FOR I=1:1:$LENGTH(IN,"|")
               SET PAR=$PIECE(IN,"|",I)
               Begin DoDot:1
 +4                SET L=L+1
                   SET OUT(L)=PRE_$PIECE(PAR," ")
 +5                FOR J=2:1:$LENGTH(PAR," ")
                       SET WORD=$PIECE(PAR," ",J)
                       Begin DoDot:2
 +6                        IF ($LENGTH(OUT(L))+$LENGTH(WORD)+1)<MAX
                               SET OUT(L)=OUT(L)_" "_WORD
                               IF 1
 +7                       IF '$TEST
                               SET L=L+1
                               SET OUT(L)=PRE_WORD
                       End DoDot:2
               End DoDot:1
 +8        SET L=0
           FOR 
               SET L=$ORDER(OUT(L))
               if 'L
                   QUIT 
               SET TXT=TXT_"|"_OUT(L)
 +9        QUIT TXT
 +10      ;
RPTQA     ; Questions & Answers for Report
 +1       ;;Questions and Answers:
 +2       ;;
 +3       ;;SYMPTOM SEVERITY^Now^Pre-COVID
 +4       ;;  ^---^---------
 +5       ;;Breathlessness
 +6       ;;1a)  Breathlessness: At rest^8979^8980
 +7       ;;1b)  Breathlessness: Changing position e.g. from^8981^8982
 +8       ;;     lying to sitting or sitting to lying
 +9       ;;1c)  Breathlessness: On dressing yourself^8983^8984
 +10      ;;1d)  Breathlessness: On walking up a flight of stairs^8985^8986
 +11      ;;
 +12      ;;Cough/ throat sensitivity/ voice change
 +13      ;;2a)  Cough / throat sensitivity^8987^8988
 +14      ;;2b)  Change of voice^8989^8990
 +15      ;;
 +16      ;;Fatigue (tiredness not improved by rest)
 +17      ;;3)   Fatigue levels in your usual activities^8991^8992
 +18      ;;
 +19      ;;Smell / taste
 +20      ;;4a)  Altered smell^8993^8994
 +21      ;;4b)  Altered taste^8995^8996
 +22      ;;
 +23      ;;Pain / discomfort
 +24      ;;5a)  Chest pain^8997^8998
 +25      ;;5b)  Joint pain^8999^9000
 +26      ;;5c)  Muscle pain^9001^9002
 +27      ;;5d)  Headache^9003^9004
 +28      ;;5e)  Abdominal pain^9005^9006
 +29      ;;
 +30      ;;Cognition
 +31      ;;6a)  Problems with concentration^9007^9008
 +32      ;;6b)  Problems with memory^9009^9010
 +33      ;;6c)  Problems with planning^9011^9012
 +34      ;;
 +35      ;;Palpitations / dizziness
 +36      ;;7a)  Palpitations in certain positions, activity or^9013^9014
 +37      ;;     at rest
 +38      ;;7b)  Dizziness in certain positions, activity or at^9015^9016
 +39      ;;     rest
 +40      ;;
 +41      ;;Post-exertional malaise (worsening of symptoms)
 +42      ;; 8)  Crashing or relapse hours or days after physical,^9017^9018
 +43      ;;     cognitive or emotional exertion
 +44      ;;
 +45      ;;Anxiety / mood
 +46      ;;9a)  Feeling anxious^9019^9020
 +47      ;;9b)  Feeling depressed^9021^9022
 +48      ;;9c)  Having unwanted memories of your illness or^9023^9024
 +49      ;;     time in hospital
 +50      ;;9d)  Having unpleasant dreams about your illness or^9025^9026
 +51      ;;     time in hospital
 +52      ;;9e)  Trying to avoid thoughts or feelings about your^9027^9028
 +53      ;;     illness or time in hospital
 +54      ;;
 +55      ;;Sleep
 +56      ;;10)  Sleep problems, such as difficulty falling^9029^9030
 +57      ;;     asleep, staying asleep or oversleeping
 +58      ;;
 +59      ;;
 +60      ;;FUNCTIONAL ABILITY
 +61      ;;
 +62      ;;Communication
 +63      ;;11)  Difficulty with communication / word finding^9031^9032
 +64      ;;     difficulty / understanding others
 +65      ;;
 +66      ;;
 +67      ;;Walking or moving around
 +68      ;;12)  Difficulties with walking or moving around^9033^9034
 +69      ;;
 +70      ;;Personal Care
 +71      ;;13)  Difficulties with personal tasks such as using^9035^9036
 +72      ;;     the toilet or getting washed and dressed
 +73      ;;
 +74      ;;Other activities of Daily Living^9037^9038
 +75      ;;14)  Difficulty doing wider activities, such as
 +76      ;;     household work, leisure/sporting activities,
 +77      ;;     paid/unpaid work, study or shopping
 +78      ;;
 +79      ;;Social Role
 +80      ;;15)  Problems with socializing / interacting with^9039^9040
 +81      ;;     friends* or caring for dependents
 +82      ;;     *related to your illness and not due to social
 +83      ;;     distancing / lockdown measures
 +84      ;;    
 +85      ;;
 +86      ;;OTHER SYMPTOMS
 +87      ;;
 +88      ;;16a)  Please select any of the following symptoms you have experienced 
 +89      ;;      since your illness in the last 7 days. Please also select any 
 +90      ;;      previous problems that have worsened for you following your illness.
 +91      ;;9041
 +92      ;;16b)  Other symptoms - free text
 +93      ;;9042
 +94      ;;
 +95      ;;
 +96      ;;OVERALL HEALTH^Now^Pre-COVID
 +97      ;;  ^---^---------
 +98      ;;17a)  How good or bad is your health overall in the^9043^9044
 +99      ;;      last 7 days?
 +100     ;;
 +101     ;;
 +102     ;;EMPLOYMENT
 +103     ;;
 +104     ;;9045
 +105     ;;18b)  Has your COVID-19 illness affected your work??
 +106     ;;9046
 +107     ;;18c)  Any other comments/concerns
 +108     ;;9047
 +109     ;;
 +110     ;;
 +111     ;;PARTNER / FAMILY / CAREGIVER PERSPECTIVE
 +112     ;;
 +113     ;;19)   This is space for your partner, family or caregiver to add anything
 +114     ;;      from their perspective:
 +115     ;;9048
 +116     ;;zzzzz
 +117     ;
TESTSCR(YSAD) ; Test scoring routine
 +1        NEW YS,YSDATA
 +2        SET YS("AD")=YSAD
           SET YS("CODE")="C19-YRS"
 +3        DO LOADANSW^YTSCORE(.YSDATA,.YS)
 +4        DO SCALEG^YTQAPI3(.YSDATA,.YS)
 +5        DO DLLSTR(.YSDATA,.YS,1)
 +6        QUIT