| 1 | QACMAIL1 ;ERC/WASHCIOFO-Send data to reposititory ;11/29/99 | 
|---|
| 2 | ;;2.0;Patient Representative;**4,14,15,17**;07/25/1995 | 
|---|
| 3 | ;continuation routine - contains looping code, assigns variables | 
|---|
| 4 | ;and stuffs values into temporary global ^TMP("QAC MAIL",$J,linecount) | 
|---|
| 5 | ; | 
|---|
| 6 | ENV ;environment check - to ensure that the Mailman patch creating | 
|---|
| 7 | ;domain has beem installed. | 
|---|
| 8 | N QACQ,QACE,ZPDQUIT | 
|---|
| 9 | S QACQ="Q-PSS.MED.VA.GOV" | 
|---|
| 10 | Q:$$FIND1^DIC(4.2,,"QX",QACQ,"B",,"QACE") | 
|---|
| 11 | W !!?5,$C(7),"**** Installation of this patch requires that domain " | 
|---|
| 12 | W !?10,QACQ," be defined." | 
|---|
| 13 | S XPDQUIT=1 | 
|---|
| 14 | W !!!?5,"Refer to patch XM*999*133 for domain definition information." | 
|---|
| 15 | W !?15,"<Patch QAC*2.0*4 installation aborted!>",!! | 
|---|
| 16 | Q | 
|---|
| 17 | LOOP ; | 
|---|
| 18 | ;loop through file 745.1 looking for entries edited | 
|---|
| 19 | ;since the previous rollup that have at least one issue code. | 
|---|
| 20 | N QACD,QACDD,QACJ,QACLAST,QACOUNT | 
|---|
| 21 | S QACJ=0 | 
|---|
| 22 | S QACLAST=$P($G(^QA(740,1,"QAC")),U,4) | 
|---|
| 23 | ;(DBIA #3061 for lookup of value of QAC LAST RECORD in file #740) | 
|---|
| 24 | S QACOUNT=0 | 
|---|
| 25 | F  S QACJ=$O(^QA(745.1,"F",3,QACJ)) Q:QACJ'>0!($G(QACOUNT)>700)  D WORK | 
|---|
| 26 | I $G(QACLAST)'>0 D | 
|---|
| 27 | . ;if QACLAST'>0, need to run rollup for the first time from 10/01/99 | 
|---|
| 28 | . S QACD=$O(^QA(745.1,"D",2991000)) Q:QACD'>0  D | 
|---|
| 29 | . . S QACJ=$O(^QA(745.1,"D",QACD,QACJ)) Q:QACJ'>0  S QACJ=QACJ-1 D | 
|---|
| 30 | . . . F  S QACJ=$O(^QA(745.1,QACJ)) Q:QACJ'>0!($G(QACOUNT)>700)  D WORK | 
|---|
| 31 | S DIE="^QA(740,",DA=1,DR="753////^S X=QACLAST" | 
|---|
| 32 | D ^DIE K DA,DIE,DR | 
|---|
| 33 | Q | 
|---|
| 34 | WORK ; | 
|---|
| 35 | D NODE0 | 
|---|
| 36 | S QACLAST=QACJ | 
|---|
| 37 | S QACOUNT=QACOUNT+1 | 
|---|
| 38 | S DIE="^QA(745.1,",DA=QACJ,DR="41///@" D ^DIE K DA,DIE,DR | 
|---|
| 39 | Q | 
|---|
| 40 | DATA ; Set data into local variables and then into ^TMP global for | 
|---|
| 41 | ; inclusion in mail message. | 
|---|
| 42 | N QACNODE2,QACNODE7 | 
|---|
| 43 | N QACK,QACL,QACM,QACN | 
|---|
| 44 | N QACCOM,QACDAT,QACDATE,QACDAYS,QACDISC,QACDIV,QACDOB,QACELIG,QACISSC | 
|---|
| 45 | N QACLSAT,QACMADE,QACNO,QACPGV,QACPSRV,QACRDAT,QACRDATE,QACROC | 
|---|
| 46 | N QACSEAT,QACSEX,QACSSN,QACSTAT,QACTST | 
|---|
| 47 | ;if record was previously rejected and is now closed set Roll-up status | 
|---|
| 48 | ;to "0" (call ROLL(0)) - if still open but has IC call ROLL(2) | 
|---|
| 49 | ;if record previously sent but "open", but is now closed, call ROLL(0) | 
|---|
| 50 | N QACNOT | 
|---|
| 51 | S QACROC=$P($G(QACNODE0),U) | 
|---|
| 52 | I $G(QACNODE0)]"" D | 
|---|
| 53 | . I $P($G(QACNODE0),U,3)]"" D | 
|---|
| 54 | . . S QACSSN=$P(VADM(2),U) ;SSN | 
|---|
| 55 | . . S QACDOB=$P(VADM(3),U) ;DOB | 
|---|
| 56 | . . I $G(QACDOB) D  ;Austin wanted dates in MMDDYYYY | 
|---|
| 57 | . . . S QACDOB=$P($$FMTHL7^XLFDT(QACDOB),"-") | 
|---|
| 58 | . . . S QACDOB=$E(QACDOB,5,8)_$E(QACDOB,1,4) | 
|---|
| 59 | . . S QACSEX=$P(VADM(5),U) | 
|---|
| 60 | . S QACDATE=$P(QACNODE0,U,2) ;date of contact | 
|---|
| 61 | . I $G(QACDATE) D | 
|---|
| 62 | . . S QACDATE=$P($$FMTHL7^XLFDT(QACDATE),"-") | 
|---|
| 63 | . . S QACDATE=$E(QACDATE,5,8)_$E(QACDATE,1,4) | 
|---|
| 64 | . S QACPSRV=$P($G(QACNODE0),U,14) ;period of service | 
|---|
| 65 | . S QACPGV=$P($G(QACNODE0),U,15) ;Persian Gulf vet? | 
|---|
| 66 | . S QACDIV="" | 
|---|
| 67 | . I $P($G(QACNODE0),U,16)]"" D DIV16 | 
|---|
| 68 | . ;S QACDIV=$E(QACDIV,1,30) | 
|---|
| 69 | . I $G(QACDIV)["Unknown" S QACDIV="" | 
|---|
| 70 | . S QACELIG=$S($P($G(QACNODE0),U,4)]"":$O(^DIC(8,"B",$P($G(QACNODE0),U,4),0)),1:"UNK") ;eligibility | 
|---|
| 71 | . S QACMADE=$P(QACNODE0,U,10) | 
|---|
| 72 | NODE2 ; set variables for node 2 | 
|---|
| 73 | S QACNODE2=$G(^QA(745.1,QACJ,2)) | 
|---|
| 74 | I QACNODE2]"" S QACTST=$P($G(QACNODE2),U,2) ;treatment status | 
|---|
| 75 | S QACINTAP=$P($G(QACNODE2),U,7) ;Internal Appeal | 
|---|
| 76 | NODE3 ;issue code info | 
|---|
| 77 | S QACK=0 | 
|---|
| 78 | F  S QACK=$O(^QA(745.1,QACJ,3,QACK)) Q:QACK'>0  D | 
|---|
| 79 | . S QACISSC(QACK)=$P(^QA(745.2,^QA(745.1,QACJ,3,QACK,0),0),U) | 
|---|
| 80 | . I $P($G(^QA(745.1,QACJ,3,QACK,3,0)),U,3)'>0 S QACDISC(QACK,1)=QACISSC(QACK)_"^" | 
|---|
| 81 | . S QACL=0 | 
|---|
| 82 | . F  S QACL=$O(^QA(745.1,QACJ,3,QACK,3,QACL)) Q:QACL'>0  D | 
|---|
| 83 | . . ;get code for discipline | 
|---|
| 84 | . . N QACTEMP,QACTMP | 
|---|
| 85 | . . S QACTMP=$P($G(^QA(745.1,QACJ,3,QACK,3,QACL,0)),U,2) | 
|---|
| 86 | . . S QACTEMP=$S($G(QACTMP)]"":$P($G(^QA(745.5,QACTMP,0)),U),1:"") | 
|---|
| 87 | . . S QACDISC(QACK,QACL)=QACISSC(QACK)_"^"_$G(QACTEMP) | 
|---|
| 88 | NODE7 ;set variables for node 7 | 
|---|
| 89 | S QACNODE7=$G(^QA(745.1,QACJ,7)) I $G(QACNODE7)]"" D | 
|---|
| 90 | . S QACSTAT=$P($G(QACNODE7),U,2) ;status | 
|---|
| 91 | . S QACRDATE=$P(QACNODE7,U) ;resolution date | 
|---|
| 92 | . I $G(QACRDATE) D | 
|---|
| 93 | . . S QACRDATE=$P($$FMTHL7^XLFDT(QACRDATE),"-") | 
|---|
| 94 | . . S QACRDATE=$E(QACRDATE,5,8)_$E(QACRDATE,1,4) | 
|---|
| 95 | . S QACDAYS=$P($G(QACNODE7),U,4) ;days to resolution | 
|---|
| 96 | NODE8 ; set variables for employee multiple | 
|---|
| 97 | N QACC | 
|---|
| 98 | S QACC=0 | 
|---|
| 99 | K QACEM,QACEMP | 
|---|
| 100 | F  S QACC=$O(^QA(745.1,QACJ,8,QACC)) Q:QACC'>0  D | 
|---|
| 101 | . S QACEM=^QA(745.1,QACJ,8,QACC,0) Q:QACEM'>0 | 
|---|
| 102 | . S QACEM=$P($G(^VA(200,QACEM,0)),U) | 
|---|
| 103 | . I $G(QACEM)]"" S QACEMP(QACJ,QACC)=QACEM | 
|---|
| 104 | NODE12 ; set variables for source(s) of contact multiple | 
|---|
| 105 | N QACD,QACSOR,QACSR | 
|---|
| 106 | S QACD=0 | 
|---|
| 107 | F  S QACD=$O(^QA(745.1,QACJ,12,QACD)) Q:QACD'>0  D | 
|---|
| 108 | . S QACSR=^QA(745.1,QACJ,12,QACD,0) Q:QACSR']"" | 
|---|
| 109 | . I $G(QACSR)]"" S QACSOR(QACJ,QACD)=QACSR | 
|---|
| 110 | STUFF ; Stuff variables into ^TMP global for use in ^XMD | 
|---|
| 111 | ;      field delimiter = "^" | 
|---|
| 112 | ;       line delimiter = "&" | 
|---|
| 113 | ;     record delimiter = "$" | 
|---|
| 114 | ;    message delimiter = "#" | 
|---|
| 115 | N QACJJ,QACKK,QACLL | 
|---|
| 116 | S QACRCNT=QACRCNT+1 | 
|---|
| 117 | ;check message size - need to ensure message < 32000 | 
|---|
| 118 | I $G(QACTCNT)>29000 D NEWMSG^QACMAIL0 | 
|---|
| 119 | X QACINC | 
|---|
| 120 | S ^TMP("QAC MAIL",$J,QACLCNT)=$G(QACROC)_"^ROC^"_$G(QACDATE)_"^"_$G(QACSSN)_"^"_$G(QACSEX)_"^"_$G(QACDOB)_"^"_$G(QACSTAT)_"^"_$G(QACRDATE)_"^"_$G(QACTST)_"^"_$G(QACPSRV) | 
|---|
| 121 | S ^TMP("QAC MAIL",$J,QACLCNT)=^TMP("QAC MAIL",$J,QACLCNT)_"^"_$G(QACPGV)_"^"_$G(QACDIV)_"^"_$G(QACDAYS)_"^"_$G(QACELIG)_"^"_$G(QACMADE)_"^"_$G(QACVISN)_"^"_$G(QACINTAP)_"&" | 
|---|
| 122 | STFFISSC ;stuff issue code values into ^TMP | 
|---|
| 123 | ;using "~" as an Issue Code delimiter | 
|---|
| 124 | N QACCHCNT | 
|---|
| 125 | S (QACJJ,QACKK)=0 | 
|---|
| 126 | I $O(QACISSC(0))'>0 Q | 
|---|
| 127 | X QACINC S ^TMP("QAC MAIL",$J,QACLCNT)=$G(QACROC)_"^ISSC^" | 
|---|
| 128 | F  S QACJJ=$O(QACDISC(QACJJ)) Q:QACJJ'>0  D | 
|---|
| 129 | . S QACKK=0 | 
|---|
| 130 | . F  S QACKK=$O(QACDISC(QACJJ,QACKK)) Q:QACKK'>0  D | 
|---|
| 131 | . . N QACLIN,QACLINE | 
|---|
| 132 | . . S QACLINE=QACDISC(QACJJ,QACKK) | 
|---|
| 133 | . . ; adding employee(s) to each issue code.  In future employee (and | 
|---|
| 134 | . . ; location) will be associated with Issue Code - code will change | 
|---|
| 135 | . . ; here.  For now, location will be represented by "" in last piece | 
|---|
| 136 | . . ; There will be one IC, one Disc., one location and one employee | 
|---|
| 137 | . . ; separated by "^", and each 4 field set separated by "~" | 
|---|
| 138 | . . S (QACE,QACCHCNT)=0 | 
|---|
| 139 | . . I $O(QACEMP(0))'>0 S ^TMP("QAC MAIL",$J,QACLCNT)=^TMP("QAC MAIL",$J,QACLCNT)_QACLINE_"^^~" | 
|---|
| 140 | . . F  S QACE=$O(QACEMP(QACJ,QACE)) Q:QACE'>0  D | 
|---|
| 141 | . . . S QACLIN=QACLINE_"^"_$G(QACEMP(QACJ,QACE))_"^~" ;space for loc | 
|---|
| 142 | . . . I $L(QACLIN)+$L(^TMP("QAC MAIL",$J,QACLCNT))>200 D | 
|---|
| 143 | . . . . X QACINC | 
|---|
| 144 | . . . . S ^TMP("QAC MAIL",$J,QACLCNT)="" | 
|---|
| 145 | . . . S ^TMP("QAC MAIL",$J,QACLCNT)=^TMP("QAC MAIL",$J,QACLCNT)_QACLIN | 
|---|
| 146 | . . . S QACLIN="" | 
|---|
| 147 | S ^TMP("QAC MAIL",$J,QACLCNT)=^TMP("QAC MAIL",$J,QACLCNT)_"&" | 
|---|
| 148 | STFFSOUR ;stuff values for source(s) of contact into ^TMP | 
|---|
| 149 | X QACINC | 
|---|
| 150 | S ^TMP("QAC MAIL",$J,QACLCNT)=$G(QACROC)_"^SOUR" | 
|---|
| 151 | N QACF | 
|---|
| 152 | S QACF=0 | 
|---|
| 153 | F  S QACF=$O(QACSOR(QACJ,QACF)) Q:QACF'>0  D | 
|---|
| 154 | . S ^TMP("QAC MAIL",$J,QACLCNT)=^TMP("QAC MAIL",$J,QACLCNT)_"^"_$G(QACSOR(QACJ,QACF)) | 
|---|
| 155 | S ^TMP("QAC MAIL",$J,QACLCNT)=^TMP("QAC MAIL",$J,QACLCNT)_"$" | 
|---|
| 156 | Q | 
|---|
| 157 | NODE0 ;set values from zero node | 
|---|
| 158 | N DFN,QACNAME,QACNODE0,QACNOFLG,VADM | 
|---|
| 159 | S QACNODE0=^QA(745.1,QACJ,0) | 
|---|
| 160 | I $P($G(QACNODE0),U,3)]"" D | 
|---|
| 161 | . S DFN=$P(QACNODE0,U,3) | 
|---|
| 162 | . D ^VADPT | 
|---|
| 163 | S QACNAME=$S($G(VADM(1))]"":VADM(1),1:"No Patient Involved") | 
|---|
| 164 | ;If no issue code count record and go to next entry. | 
|---|
| 165 | I $P($G(^QA(745.1,QACJ,3,0)),U,3)<1 D | 
|---|
| 166 | . S QACNOCNT=$G(QACNOCNT)+1,QACNOT=1 | 
|---|
| 167 | . ;D ROLL^QACMAIL0(1) ;sets Roll-Up Status to rejected | 
|---|
| 168 | . Q | 
|---|
| 169 | I $G(QACNOT)=1 S QACNOT=0 Q | 
|---|
| 170 | D DATA | 
|---|
| 171 | Q | 
|---|
| 172 | LOOP1 ;post-install to check previously rejected records (see if they now | 
|---|
| 173 | ;have Issue Codes) and to get any records since last run of the | 
|---|
| 174 | ;rollup.  for QAC*2*17.  will set these records to a Rollup Status | 
|---|
| 175 | ;of 3, which means they will be transmitted with the next run. | 
|---|
| 176 | N QACF,QACJ | 
|---|
| 177 | F QACF=1,2 S QACJ=0 D | 
|---|
| 178 | . F  S QACJ=$O(^QA(745.1,"F",QACF,QACJ)) Q:QACJ'>0  D | 
|---|
| 179 | . . I $P($G(^QA(745.1,QACJ,3,0)),U,3)'>0 D DIE("@") Q | 
|---|
| 180 | . . D DIE(3) | 
|---|
| 181 | S QACJ=$P(^QA(740,1,"QAC"),U,4) | 
|---|
| 182 | I $G(QACJ)']"" Q | 
|---|
| 183 | F  S QACJ=$O(^QA(745.1,QACJ)) Q:QACJ'>0  D | 
|---|
| 184 | . D DIE(3) | 
|---|
| 185 | Q | 
|---|
| 186 | DIE(QACE) ; | 
|---|
| 187 | S DIE="^QA(745.1,",DA=QACJ,DR="41///^S X=QACE" | 
|---|
| 188 | D ^DIE | 
|---|
| 189 | K DA,DIE,DR,QACE | 
|---|
| 190 | Q | 
|---|
| 191 | DIV16 ;division field, #37 | 
|---|
| 192 | S QACNO=$P($G(QACNODE0),U,16) | 
|---|
| 193 | ;D INST^QACUTL0(QACNO,.QACDIV) | 
|---|
| 194 | S QACDIV=$P($G(^DIC(4,QACNO,99)),U) | 
|---|
| 195 | Q | 
|---|