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

BILETPR1.m

Go to the documentation of this file.
  1. BILETPR1 ;IHS/CMI/MWR - PRINT PATIENT LETTERS.; DEC 15, 2011
  1. ;;8.5;IMMUNIZATION;**14**;AUG 01,2017
  1. ;;* MICHAEL REMILLARD, DDS * CIMARRON MEDICAL INFORMATICS, FOR IHS *
  1. ;; BUILD ^TMP WP ARRAY FOR PRINTING LETTERS.
  1. ;; PATCH 10: If no skin tests on record, display explicitly. HISTORY1+190
  1. ;; Display only the most recent three dates of Skin Tests. HISTORY1+209
  1. ;; PATCH 14: Remove "NOS" from forecasted vaccines in letters. FORECAST+41
  1. ;
  1. ;
  1. ;----------
  1. BUILD(BIDFN,BILET,BIDLOC,BIFDT) ;EP
  1. ;---> Build temporary global of populated letter in ^TMP("BILET",$J).
  1. ;---> Parameters:
  1. ; 1 - BIDFN (req) Patient's IEN in VA PATIENT File #2.
  1. ; 2 - BILET (req) IEN of Letter in BI LETTER File.
  1. ; 3 - BIDLOC (opt) Text of Date/Location line.
  1. ; 4 - BIFDT (opt) Forecast Date.
  1. ;
  1. K ^TMP("BILET",$J)
  1. N BILINE,BI31 S BILINE=0,BI31=$C(31)_$C(31)
  1. ;
  1. ;---> Error check.
  1. N BIERR S BIERR=""
  1. D I BIERR]"" D WRITE(.BILINE,BIERR) Q
  1. .I '$G(BIDFN) D ERRCD^BIUTL2(201,.BIERR) Q
  1. .I '$D(^DPT(BIDFN,0)) D ERRCD^BIUTL2(203,.BIERR) Q
  1. .I '$G(BILET) D ERRCD^BIUTL2(609,.BIERR) Q
  1. .I '$D(^BILET(BILET,0)) D ERRCD^BIUTL2(610,.BIERR) Q
  1. .S:'$G(BIFDT) BIFDT=DT
  1. ;
  1. ;---> Get forecast string (BIFORCST) and problem dose string (BIPDSS).
  1. ;---> Pass BIPDSS to HISTORY to mark problem doses with asterisks.
  1. ;---> Pass BIFORCST to FORECAST for display.
  1. N BIFORCST,BIPDSS S BIPDSS=""
  1. D IMMFORC^BIRPC(.BIFORCST,BIDFN,BIFDT,,$G(BIDUZ2),.BIPDSS)
  1. ;---> If Forecast comes first, set BIFF=1
  1. N BIFF S BIFF=$P(^BILET(BILET,0),U,6)
  1. ;
  1. ;---> Retrieve and store sections of letter in WP ^TMP global.
  1. D SECTION(BILET,.BILINE,1)
  1. D
  1. .I BIFF D FORECAST(BILET,.BILINE,BIFORCST,BIFDT) Q
  1. .D HISTORY(BILET,.BILINE,BIDFN,BIPDSS)
  1. D SECTION(BILET,.BILINE,2)
  1. D
  1. .I BIFF D HISTORY(BILET,.BILINE,BIDFN,BIPDSS) Q
  1. .D FORECAST(BILET,.BILINE,BIFORCST,BIFDT)
  1. D SECTION(BILET,.BILINE,3)
  1. D DATELOC(BILET,.BILINE,BIDLOC)
  1. D SECTION(BILET,.BILINE,4)
  1. Q
  1. ;
  1. ;
  1. ;----------
  1. SECTION(BILET,BILINE,BISEC) ;EP
  1. ;---> Store Section of letter in ^TMP("BILET",$J).
  1. ;---> Parameters:
  1. ; 1 - BILET (req) IEN of Letter in BI LETTER File.
  1. ; 2 - BILINE (ret) Last line written into ^TMP array.
  1. ; 3 - BISEC (req) Section of Form Letter to retrieve.
  1. ;
  1. N N S N=0
  1. F S N=$O(^BILET(BILET,BISEC,N)) Q:'N D
  1. .D WRITE(.BILINE,^BILET(BILET,BISEC,N,0))
  1. Q
  1. ;
  1. ;
  1. ;----------
  1. HISTORY(BILET,BILINE,BIDFN,BIPDSS) ;EP
  1. ;---> Retrieve and store Imm History in WP ^TMP global.
  1. ;---> Parameters:
  1. ; 1 - BILET (req) IEN of Letter in BI LETTER File.
  1. ; 2 - BILINE (ret) Last line written into ^TMP array.
  1. ; 3 - BIDFN (req) Patient's IEN in VA PATIENT File #2.
  1. ; 4 - BIPDSS (opt) Returned string of Visit IEN's that are Problem Doses,
  1. ;
  1. ;---> Quit if this Form Letter does not included Imm History.
  1. N BIFORM S BIFORM=$P(^BILET(BILET,0),U,2)
  1. N BINVAL S BINVAL=+$P(^BILET(BILET,0),U,5)
  1. Q:'BIFORM
  1. ;
  1. ;---> If History should be listed by Date, BIFORM=1 or 2;
  1. ;---> If History should be listed by Vaccine, BIFORM=3 or 4.
  1. D WRITE(.BILINE)
  1. D HISTORY1(.BILINE,BIDFN,BIFORM,BINVAL,"BILET",BIPDSS)
  1. D WRITE(.BILINE)
  1. D CONTRAS(.BILINE,BIDFN,"BILET")
  1. D WRITE(.BILINE)
  1. Q
  1. ;
  1. ;
  1. ;----------
  1. HISTORY1(BILINE,BIDFN,BIFORM,BINVAL,BIGBL,BIPDSS,BIHDRS,BINOSK,BILOC,BIMMRF,BIMMLF) ;EP
  1. ;---> Retrieve and store Imm History in WP ^TMP global.
  1. ;---> Parameters:
  1. ; 1 - BILINE (ret) Last line written into ^TMP array.
  1. ; 2 - BIDFN (req) Patient's IEN in VA PATIENT File #2.
  1. ; 3 - BIFORM (opt) 1=List by Date (default), 2=by Date w/Lot#,
  1. ; 3=List by Vaccine, 4=by Vaccine w/Lot#,
  1. ; 5=by Date w/VFC, 6=by Vaccine w/VFC
  1. ; 7=by Date w/Lot & VFC, 8=by Vaccine w/Lot & VFC.
  1. ; 4 - BINVAL (opt) 0=Include Invalid Doses, 1=Exclude Invalid Doses.
  1. ; 5 - BIGBL (opt) ^TMP global node to write to (def="BILET").
  1. ; 6 - BIPDSS (opt) Returned string of Visit IEN's that are
  1. ; Problem Doses, according to ImmServe.
  1. ; 7 - BIHDRS (opt) 0=Print Imm and Skin Subheaders; 1=No Subeaders.
  1. ; 8 - BINOSK (opt) 0=Include Skin Tests, 1=Do not include Skin Tests
  1. ; 2=Include Skin Tests ONLY (NO Immunizations).
  1. ; 9 - BILOC (opt) 1=Add Location in the form: [4-char] for BIFORM 1&2.
  1. ; 10 - BIMMRF (opt) Imms Received Filter array (subscript=CVX's included).
  1. ; 11 - BIMMLF (opt) Lot Number Filter array (subscript=lot number text).
  1. ;
  1. S:$G(BIGBL)="" BIGBL="BILET"
  1. S:$G(BIFORM)="" BIFORM=1 S:$G(BINVAL)="" BINVAL=0
  1. ;
  1. ;---> RPC to gather Imm Hx.
  1. ; BIRETVAL - Return value of valid data from RPC.
  1. ; BIRETERR - Return value (text string) of error from RPC.
  1. ;
  1. N BIDE,BIRETVAL,BIRETERR,I S BIRETVAL=""
  1. ;
  1. ;---> Set BIDE local array for Data Elements to be returned.
  1. ;---> The following are IEN's in ^BIEXPDD(.
  1. ;---> IEN PC DATA
  1. ;---> --- -- ----
  1. ;---> 1 = Visit Type: "I"=Immunization, "S"=Skin Test.
  1. ;---> 4 2 = Vaccine Name, Short.
  1. ;---> 8 3 = Vaccine Components. ;v8.0
  1. ;---> 24 4 = IEN, V File Visit.
  1. ;---> 26 5 = Location (or Outside Location) where Imm was given.
  1. ;---> 27 6 = Vaccine Group.
  1. ;---> 33 7 = Vaccine Lot#, Text.
  1. ;---> 38 8 = Skin Test Result.
  1. ;---> 39 9 = Skin Test Reading.
  1. ;---> 41 10 = Skin Test Name.
  1. ;---> 44 11 = Reaction to Imm, text.
  1. ;---> 56 12 = Date of Visit Fileman format (YYYMMDD).
  1. ;---> 65 13 = Dose Override.
  1. ;---> 69 14 = Vaccine Component CVX Code.
  1. ;---> 77 15 = VFC for this immunization.
  1. ;
  1. ;
  1. F I=4,8,24,26,27,33,38,39,41,44,56,65,69,77 S BIDE(I)=""
  1. D IMMHX^BIRPC(.BIRETVAL,BIDFN,.BIDE,1,0)
  1. ;
  1. ;---> If BIRETERR has a value, store it and quit.
  1. S BIRETERR=$P(BIRETVAL,BI31,2)
  1. I BIRETERR]"" D Q
  1. .D WRITE(.BILINE," "_BIRETERR,BIGBL)
  1. .D WRITE(.BILINE,,BIGBL)
  1. ;
  1. ;---> Set BIHX=to a valid Imm Hx for this patient.
  1. N BIHX S BIHX=$P(BIRETVAL,BI31,1)
  1. ;
  1. ;---> Build Listmanager array from BIHX string.
  1. ;
  1. ;---> List Immunization (and Skin Test) History by Vaccine, and quit.
  1. I (BIFORM=3)!(BIFORM=4) D HISTORY2^BILETPR3(.BILINE,BIHX,BIDFN,BIFORM,BINVAL,BIPDSS) Q
  1. ;
  1. D:$G(BINOSK)'=2 WRITE(.BILINE,,BIGBL)
  1. ;
  1. N BIAR,I,V,Y S V="|"
  1. ;
  1. ;---> List Imm Hx by Date (if call is not for Skin Test ONLY).
  1. ;---> Loop through "^"-pieces of Imm History, getting data.
  1. I $G(BINOSK)'=2 F I=1:1 S Y=$P(BIHX,U,I) Q:Y="" D
  1. .;---> Quit if this is not an Immunization.
  1. .Q:$P(Y,V)'="I"
  1. .;
  1. .;---> Set BIPD=1 if Immserve has a problem with this dose.
  1. .N BIPD S BIPD=$$PDSS^BIUTL8($P(Y,V,4),$P(Y,V,14),$G(BIPDSS))
  1. .;
  1. .;---> Quit if not displaying Invalid Doses (but will display a Forced Valid).
  1. .;Q:((BINVAL=1)&(($P(Y,V,13)&($P(Y,V,13)'=9))!BIPD))
  1. .;
  1. .;---> Do not display if this vaccine is not in the display filter array.
  1. .I $D(BIMMRF) Q:('$D(BIMMRF(+$P(Y,V,14))))
  1. .;
  1. .;---> Do not display if this lot number is not in the display filter array.
  1. .I $D(BIMMLF) Q:('$D(BIMMLF(+$P(Y,V,7))))
  1. .;
  1. .;---> Set Vaccine Name.
  1. .N X S X=$P(Y,V,2)
  1. .;
  1. .;---> Tack on Lot# if specified.
  1. .N BILOT S BILOT=$P(Y,V,7)
  1. .S:((BIFORM=2)&(BILOT]"")) X=X_" (#"_BILOT_")"
  1. .;
  1. .;---> Tack on VFC if specified.
  1. .N BIVFC S BIVFC=$P(Y,V,15)
  1. .S:((BIFORM=5)&(BIVFC>1)) X=X_" (VFC+)"
  1. .;
  1. .;---> Tack on Lot# & VFC if specified.
  1. .I BIFORM=7 D
  1. ..I (BILOT="")&(BIVFC<2) Q
  1. ..S X=X_" ("
  1. ..I BILOT]"" S X=X_"#"_BILOT
  1. ..I (BILOT]"")&(BIVFC>1) S X=X_", "
  1. ..I BIVFC>1 S X=X_"VFC+"
  1. ..S X=X_")"
  1. .;
  1. .;---> Tack on Location if specified.
  1. .S:$G(BILOC) X=X_" ["_$E($P(Y,V,5),1,4)_"]"
  1. .;
  1. .;---> If this Dose has a User Override or is an ImmServe Problem Dose,
  1. .;---> prepend an asterisk and tack the reason on the end.
  1. .D
  1. ..I $P(Y,V,13) D Q
  1. ...;---> But don't display text "Force Valid" ($P(Y,V,13)'=9).
  1. ...S X="*"_X
  1. ...;---> Next line would display Invalid Reason.
  1. ...;I $P(Y,V,13)'=9 S X=X_"-"_$$DOVER^BIUTL8($P(Y,V,13))_"-"
  1. ..;
  1. ..S:BIPD X="*"_X
  1. ..;---> Next line would display Immserve problem.
  1. ..;_"-INVALID--SEE IMMSERVE-"
  1. .;
  1. .;---> If there was a Reaction, tack it on.
  1. .I $P(Y,V,11)]"" S X=X_" Reaction: "_$P(Y,V,11)
  1. .;
  1. .;---> Set this Immunization in the array:
  1. .;---> BIAR(VisitDate,VaccineName,VisitIEN)=VaccineName (Lot#)--Problem Dose
  1. .S BIAR($P(Y,V,12),$P(Y,V,2),$P(Y,V,4))=X
  1. ;
  1. ;---> Build Imm History lines for History Section of Form Letter.
  1. N N S N=0
  1. F S N=$O(BIAR(N)) Q:'N D
  1. .N BIHXLN
  1. .S BIHXLN=$$SLDT2^BIUTL5(N,1)_": "
  1. .N I,M S M=0
  1. .;---> Note: I and J below are counters for inserting ", ".
  1. .F I=1:1 S M=$O(BIAR(N,M)) Q:M="" D
  1. ..N J,P S P=0
  1. ..F J=1:1 S P=$O(BIAR(N,M,P)) Q:'P D
  1. ...N X S X=BIAR(N,M,P)
  1. ...;---> If this line will be too long, write it and start a new line.
  1. ...I $L(BIHXLN_X)>70 D Q
  1. ....D WRITE(.BILINE," "_BIHXLN_",",BIGBL)
  1. ....S BIHXLN=" "_X
  1. ...S BIHXLN=BIHXLN_$S((I>1!(J>1)):", ",1:"")_X
  1. .D:$O(BIAR(0)) WRITE(.BILINE," "_BIHXLN,BIGBL)
  1. ;
  1. ;---> If there are no previous immunizations and this call is NOT for
  1. ;---> Skin Tests ONLY, then store next line.
  1. I '$O(BIAR(0)),$G(BINOSK)'=2 D
  1. .D WRITE(.BILINE," No previous immunizations recorded.",BIGBL)
  1. ;
  1. ;---> Quit if NOT including Skin Tests.
  1. Q:($G(BINOSK))=1
  1. ;
  1. ;---> SKIN TESTS
  1. ;---> PC DATA
  1. ;---> -- ----
  1. ;---> 1 = Visit Type: "I"=Immunization, "S"=Skin Test.
  1. ;---> 4 = V Skin Test File IEN.
  1. ;---> 5 = Location (or Outside Location) where Imm was given.
  1. ;---> 8 = Skin Test Result.
  1. ;---> 9 = Skin Test Reading.
  1. ;---> 10 = Skin Test Name.
  1. ;---> 12 = Date of Visit Fileman format (YYYMMDD).
  1. ;
  1. ;---> List Skin Test History by Date.
  1. ;---> Loop through "^"-pieces of Imm History, getting data.
  1. K BIAR
  1. F I=1:1 S Y=$P(BIHX,U,I) Q:Y="" D
  1. .;---> Quit if this is not a Skin Test.
  1. .Q:$P(Y,V)'="S"
  1. .;---> Set display line for this Skin Test Name and Date.
  1. .S X=$P(Y,V,10),X=$$PAD^BIUTL5(X,12)
  1. .;
  1. .D
  1. ..I $P(Y,V,8)]"" S X=X_$P(Y,V,8) Q
  1. ..I $P(Y,V,9) S X=X_$P(Y,V,9)_" mm" Q
  1. ..S X=X_"Not recorded"
  1. .;
  1. .;---> Set this Skin Test in the array:
  1. .;---> BIAR(VisitDate,SkinTestName,VisitIEN)=Skin Test display line.
  1. .S BIAR($P(Y,V,12),$P(Y,V,10),$P(Y,V,4))=X
  1. ;
  1. ;********** PATCH 10, v8.5, MAY 30,2015, IHS/CMI/MWR
  1. ;---> If no skin tests on record, display that explicitly.
  1. ;Q:'$D(BIAR)
  1. I '$D(BIAR) D Q
  1. .D WRITE(.BILINE)
  1. .S X=" Skin Tests/PPD: None on record" D WRITE(.BILINE,X)
  1. ;**********
  1. ;
  1. ;---> Skin Test Header.
  1. D:$G(BINOSK)'=2 WRITE(.BILINE,,BIGBL)
  1. D:'$G(BIHDRS)
  1. .;S X=" Skin Tests:"
  1. .S X=" Recent Skin Tests:"
  1. .D WRITE(.BILINE,X,BIGBL)
  1. .S X=" -----------------------"
  1. .D WRITE(.BILINE,X,BIGBL)
  1. ;
  1. ;---> Build Skin Test History lines for History Section of Form Letter.
  1. ;
  1. ;********** PATCH 10, v8.5, MAY 30,2015, IHS/CMI/MWR
  1. ;---> Display only the most recent three dates of Skin Tests.
  1. ;
  1. N BIZTEMP
  1. ;
  1. N N S N=0
  1. F S N=$O(BIAR(N)) Q:'N D
  1. .N BIDT
  1. .S BIDT=$$SLDT2^BIUTL5(N,1)
  1. .N I,M S M=0
  1. .F I=1:1 S M=$O(BIAR(N,M)) Q:M="" D
  1. ..N P S P=0
  1. ..F S P=$O(BIAR(N,M,P)) Q:'P D
  1. ...N X S X=BIAR(N,M,P)
  1. ...S X=" "_$S(I=1:BIDT_": ",1:" ")_X
  1. ...;
  1. ...S BIZTEMP(N,M)=X
  1. ...;D WRITE(.BILINE,X,BIGBL)
  1. ;
  1. N N S N=9999999
  1. F I=1:1:4 S N=+$O(BIZTEMP(N),-1) Q:'N
  1. F S N=$O(BIZTEMP(N)) Q:'N D
  1. .N M S M=""
  1. .F S M=$O(BIZTEMP(N,M)) Q:(M="") D
  1. ..D WRITE(.BILINE,BIZTEMP(N,M),BIGBL)
  1. ;**********
  1. ;
  1. Q
  1. ;
  1. ;
  1. ;----------
  1. CONTRAS(BILINE,BIDFN,BIGBL) ;EP
  1. ;---> Retrieve and store Contraindications in WP ^TMP global.
  1. ;---> Parameters:
  1. ; 1 - BILINE (ret) Last line written into ^TMP array.
  1. ; 2 - BIDFN (req) Patient's IEN in VA PATIENT File #2.
  1. ; 3 - BIGBL (opt) ^TMP global node to write to (def="BILET").
  1. ;
  1. S:$G(BIGBL)="" BIGBL="BILET"
  1. N BIRETVAL,BIRETERR,I S BIRETVAL=""
  1. ;
  1. ;---> RPC to retrieve Contraindications.
  1. D CONTRAS^BIRPC5(.BIRETVAL,BIDFN)
  1. ;
  1. ;---> If BIRETERR has a value, display it and quit.
  1. S BIRETERR=$P(BIRETVAL,BI31,2)
  1. I BIRETERR]"" D Q
  1. .D WRITE(.BILINE," "_BIRETERR,BIGBL)
  1. .D WRITE(.BILINE,,BIGBL)
  1. ;
  1. ;---> Set BICONT=to a string of Contraindications for this patient.
  1. N BICONT S BICONT=$P(BIRETVAL,BI31,1)
  1. Q:BICONT=""
  1. ;
  1. ;---> Build Listmanager array from BICONT string.
  1. ;
  1. N J S J=1
  1. F I=1:1 S Y=$P(BICONT,U,I) Q:Y="" D
  1. .;---> Build display line for this Contraindication.
  1. .N V S V="|",X=" "
  1. .S:J X=X_"* Contraindications:",J=0 S X=$$PAD^BIUTL5(X,28)
  1. .;
  1. .;---> Display "Vaccine: Date Reason"
  1. .;---> Quit if Reason is a "Refusal." Also, if it's the first line of Contras
  1. .;---> reset J so that "Contraindications:" header displays on the next one.
  1. .I Y["Refusal" D Q
  1. ..I I=1 S J=1
  1. .S X=X_$P(Y,V,2)_":",X=$$PAD^BIUTL5(X,40)_$P(Y,V,4)
  1. .S X=$$PAD^BIUTL5(X,53)_$P(Y,V,3)
  1. .;---> Set formatted Contraindication line and index in ^TMP.
  1. .D WRITE(.BILINE,X,BIGBL)
  1. Q
  1. ;
  1. ;
  1. ;----------
  1. FORECAST(BILET,BILINE,BIFORCST,BIFDT) ;EP
  1. ;---> Calculate and store Forecast in WP ^TMP global.
  1. ;---> Parameters:
  1. ; 1 - BILET (req) IEN of Letter in BI LETTER File.
  1. ; 2 - BILINE (ret) Last line written into ^TMP array.
  1. ; 3 - BIFORCST (req) Raw forecast string back from call to IMMFORC^BIRPC.
  1. ; 4 - BIFDT (opt) Forecast Date.
  1. ;
  1. ;---> Quit if this Form Letter does not included a Forecast.
  1. Q:'$P(^BILET(BILET,0),U,3)
  1. ;
  1. ;---> If Forecast Date not provided, set it equal to today.
  1. S:'$G(BIFDT) BIFDT=DT
  1. ;
  1. ;---> RPC to gather Immunization History.
  1. ; BIFORCST - Return value of valid data from RPC.
  1. ; BIRETERR - Return value (text string) of error from RPC.
  1. ;
  1. N BIRETERR S BIRETVAL=""
  1. ;
  1. ;---> If BIRETERR has a value, store it and quit.
  1. S BIRETERR=$P(BIFORCST,BI31,2)
  1. I BIRETERR]"" D Q
  1. .D WRITE(.BILINE),WRITE(.BILINE," "_BIRETERR),WRITE(.BILINE)
  1. ;
  1. ;---> Set BIFORC=to the Immunization Forecast for this patient.
  1. N BIFORC,I,V S V="|",BIFORC=$P(BIFORCST,BI31,1)
  1. ;
  1. D WRITE(.BILINE)
  1. ;
  1. ;---> If Forecast Date is not Today, display Forecast Date in letter.
  1. D:BIFDT'=DT
  1. .;---> Set Forecast Date external form for letter text.
  1. .N BIFDT1 S BIFDT1=$$TXDT1^BIUTL5(BIFDT)
  1. .D WRITE(.BILINE," For "_BIFDT1_":")
  1. ;
  1. ;---> Loop through "^"-pieces of Imm Forecast, getting data.
  1. F I=1:1 S Y=$P(BIFORC,U,I) Q:Y="" D
  1. .;
  1. .S Y=$P(Y,V) I +Y&($E(Y,2)="-") S Y=$E(Y,3,99)
  1. .;
  1. .;********** PATCH 14, v8.5, AUG 01,2017, IHS/CMI/MWR
  1. .;---> Remove "NOS" from forecasted vaccines.
  1. .I Y[",NOS" S Y=$P(Y,",NOS")_$P(Y,",NOS",2)
  1. .;**********
  1. .;
  1. .D WRITE(.BILINE," "_$$STRIP^BIUTL5(.Y))
  1. D WRITE(.BILINE)
  1. Q
  1. ;
  1. ;
  1. ;----------
  1. DATELOC(BILET,BILINE,BIDLOC) ;EP
  1. D DATELOC^BILETPR2(BILET,.BILINE,BIDLOC)
  1. Q
  1. ;
  1. ;
  1. ;----------
  1. WRITE(BILINE,BIVAL,BIGBL) ;EP
  1. D WRITE^BILETPR3(.BILINE,$G(BIVAL),$G(BIGBL))
  1. Q