WVUTL11 ;ISP/RFR - TERATOGENIC DRUGS UTILITY FUNCTIONS;Dec 01, 2020@12:32
;;1.0;WOMEN'S HEALTH;**24,26**;Sep 30, 1998;Build 624
Q
BC(WVDFN,WVDT) ;Return patient's likelihood of becoming pregnant
; when on prescription contraceptives
; DT^DILF (IA #2054): This component converts a user-formatted date into FileMan date format
; DATA^PSS50 (IA #4533): This component returns DRUG file (#50) data
; OCL^PSOORRL (IA #2400): This component returns all medications for a patient in a date range
; INPUT: WVDFN - IEN from PATIENT file #2
; WVDT - Date to use as today's date
; OUTPUT: 1 - HIGH, 2 - LOW
N WV100,WV465,WVCODE,WVDATE,WVRX,WVDRUG,WVRISK,WVON,WVNODE,X1,X2,X,%H
N BDT1,DRG,EXDT,FL,I,IEN,II,ITFN,J,LSTDS,LSTFD,LSTRD,MDR,MIG,MR,PSBDT,PSEDT,PSOR,RX0,RX2,RX3,SC,SCH,SG,ST,ST0,STA,TFN,TRM
S X1=WVDT,X2=-100 D C^%DTC S WV100=X ; Oldest dispense date for patient to be low risk
S X1=WVDT,X2=-465 D C^%DTC S WV465=X ; Start date for search
D ITEMLIST^PXRMAPI("","VA-WH HIRISK CONTRACEPTIVES GROUP","P","WVLIST")
D OCL^PSOORRL(WVDFN,WV465,WVDT)
M ^TMP("WVPS",$J)=^TMP("PS",$J) K ^TMP("PS",$J)
S WVRISK=1
S WVON="" F S WVON=$O(^TMP("WVPS",$J,WVON)) Q:WVON=""!($G(WVRISK)=2) D
.S WVNODE=$G(^TMP("WVPS",$J,WVON,0)) Q:WVNODE=""
.;CLINIC MEDICATIONS ARE EXPIRED WHEN GIVEN, ACTIVE WHEN FINISHED
.Q:$P(WVNODE,U)[";I"&($P(WVNODE,U,9)'="EXPIRED")
.S WVDATE=$S($P(WVNODE,U)[";O":$P(WVNODE,U,10),$P(WVNODE,U)[";I":$P(WVNODE,U,4),1:0)
.I WVDATE>=WV100 D OEL^PSOORRL(WVDFN,$P(WVNODE,U)) F WVDRUG=1:1:$G(^TMP("PS",$J,"DD",0)) D
..S WVDRUG(1)=$P($G(^TMP("PS",$J,"DD",WVDRUG,0)),U)
..D DATA^PSS50(WVDRUG(1),"","","","","WVTDPD")
..I $D(^TMP($J,"WVLIST","VA-WH HIRISK CONTRACEPTIVES GROUP","P",$P($G(^TMP($J,"WVTDPD",WVDRUG(1),20)),U)_";PSNDF(50.6,")) S WVRISK=2
..I $D(^TMP($J,"WVLIST","VA-WH HIRISK CONTRACEPTIVES GROUP","P",$P($G(^TMP($J,"WVTDPD",WVDRUG(1),25)),U)_";PS(50.605,")) S WVRISK=2
..I $D(^TMP($J,"WVLIST","VA-WH HIRISK CONTRACEPTIVES GROUP","P",$P($G(^TMP($J,"WVTDPD",WVDRUG(1),22)),U)_";PSNDF(50.68,")) S WVRISK=2
..I $D(^TMP($J,"WVLIST","VA-WH HIRISK CONTRACEPTIVES GROUP","P",WVDRUG(1)_";PSDRUG(")) S WVRISK=2
K ^TMP($J,"WVTDPD"),^TMP($J,"WVLIST"),^TMP("PS",$J),^TMP("WVPS",$J)
Q WVRISK
COBP(WVDFN,WVPIEN) ;Determine patient's likelihood of becomming pregnant
; INPUT: WVDFN - IEN from PATIENT file #2
; WVPIEN - IEN in PREGNANCY STATUSES sub-file #790.05
; OUTPUT: -1 - Error (message text in second caret piece)
; 0 - Unknown risk of pregnancy
; 1 - High risk of pregnancy
; 2 - Low risk of pregnancy
N WVRETURN,WVIEN,WVERR,WVRISK
S WVRETURN=0
S WVIEN=0 F S WVIEN=$O(^WV(790,WVDFN,4,WVPIEN,3,WVIEN)) Q:'WVIEN!($G(WVERR)) D
.N WVCONT
.S WVCONT=$P($G(^WV(790,WVDFN,4,WVPIEN,3,WVIEN,0)),U)
.S WVRISK(1)=$$MOA(WVCONT,WVDFN)
.I WVRISK(1)=-1 S WVERR=$P($G(^WV(791,WVCONT,0)),U) Q
.I $G(WVRISK)="" S WVRISK=WVRISK(1)
.I $G(WVRISK)'="",WVRISK(1)>WVRISK S WVRISK=WVRISK(1)
.K WVRISK(1)
I $G(WVERR)'="" S WVRETURN=-1_U_"Unknown pregnancy risk for "_WVERR
I $G(WVERR)="",$G(WVRISK)'="" S WVRETURN=WVRISK
Q WVRETURN
FMERROR(WVRESULT) ;RETURN FILEMAN ERROR MESSAGE AS STRING
N WVITM,WVERRTXT,WVERRNUM,WVERRORS
S WVERRNUM=0 F S WVERRNUM=$O(WVRESULT("DIERR",WVERRNUM)) Q:'+WVERRNUM D
.Q:$D(WVERRORS($G(WVRESULT("DIERR",WVERRNUM))))
.S WVITM=0 F S WVITM=$O(WVRESULT("DIERR",WVERRNUM,"TEXT",WVITM)) Q:WVITM="" D
..S WVERRTXT=$S($G(WVERRTXT)'="":WVERRTXT_" ",1:"")_WVRESULT("DIERR",WVERRNUM,"TEXT",WVITM)
.S WVERRORS=$G(WVRESULT("DIERR",WVERRNUM))
.I WVERRORS'="" S WVERRORS(WVERRORS)=""
Q $G(WVERRTXT)
ISREG(WVDFN) ;DETERMINE IF PATIENT IS REGISTERED
; INPUT: WVDFN - IEN IN WV PATIENT FILE [REQUIRED]
; OUTPUT: $$ISREG - 1: PATIENT IS/WAS SUCCESSFULLY REGISTERED
; 0^MESSAGE: PATIENT IS/WAS NOT SUCCESSFULLY REGISTERED
N WVNPFLAG
I $G(WVDFN)'?1.N D Q WVNPFLAG
.S WVNPFLAG=0_U_"Invalid patient identifier: """_$G(WVDFN)_"""."
I '$D(^WV(790,WVDFN)) D Q WVNPFLAG
.I "^f^F^"'[(U_$P($G(^DPT(WVDFN,0)),U,2)_U) S WVNPFLAG=0_U_"The specified patient is not a female." Q
.N WVERRADD,WVEXTRA
.I $D(^WV(790.02,DUZ(2),0))=1 D AUTOADD^WVPATE(WVDFN,DUZ(2),.WVERRADD)
.I $D(^WV(790.02,DUZ(2),0))'=1 S WVEXTRA=" and the "_$$GET1^DIQ(4,DUZ(2)_",",.01)_" institution is not configured in the Women's Health package",WVERRADD=0
.I +$G(WVERRADD)>0 S WVNPFLAG=1
.E S WVNPFLAG=0_U_"The specified patient is not in the WV PATIENT file"_$G(WVEXTRA)_"."
Q 1
VISITIEN(WVDFN,WVVSTR) ;RETURN VISIT FILE IEN GIVEN TIU VSTRING
S WVDFN=+$G(WVDFN),WVVSTR=$G(WVVSTR)
I ('WVDFN)!('$D(^DPT(WVDFN))) Q 0
I WVVSTR'?1.N1";"7N.1".".N1";"1U Q 0
N WVDT
S WVDT=+$P(WVVSTR,";",2),WVDT=(9999999-$P(WVDT,"."))_"."_$P(WVDT,".",2)
I $P(WVDT,".",2)="" S WVDT=$P(WVDT,".")
Q +$O(^AUPNVSIT("AA",WVDFN,WVDT,0))
VSTRING(WVIEN) ;RETURN TIU VSTRING GIVEN VISIT FILE IEN
S WVIEN=+$G(WVIEN)
Q:'WVIEN ""
N VSIT0
S VSIT0=$G(^AUPNVSIT(WVIEN,0))
Q +$P(VSIT0,U,22)_";"_+$P(VSIT0,U)_";"_$P(VSIT0,U,7)
ISPREG(WVDFN,WVSDATE,WVEDATE,WVCDE) ;DETERMINES IF PATIENT WAS PREGNANT ON DATE OR IN
; DATE RANGE
;INPUT: WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
; WVSDATE - START DATE OF INTEREST IN FILEMAN FORMAT [OPTIONAL]
; DEFAULT: TODAY'S DATE
; WVEDATE - END DATE OF INTEREST IN FILEMAN FORMAT [OPTIONAL]
; NO DEFAULT VALUE
; WVCDE - SEE PREGS LINE TAG FOR DESCRIPTION
;OUTPUT: $$ISPREG=1 - PREGNANT
; 0 - NOT PREGNANT (INCLUDES ALL STATUSES EXCEPT PREGNANT)
I $G(WVFKST) Q 1
Q $$ISIT(4,WVDFN,$G(WVSDATE,DT),$G(WVEDATE),+$G(WVCDE))
ISLACT(WVDFN,WVSDATE,WVEDATE,WVCDE) ;DETERMINE IF PATIENT WAS LACTATING ON DATE OR IN
; DATE RANGE
;INPUT: WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
; WVSDATE - START DATE OF INTEREST IN FILEMAN FORMAT [OPTIONAL]
; DEFAULT: TODAY'S DATE
; WVEDATE - END DATE OF INTEREST IN FILEMAN FORMAT [OPTIONAL]
; NO DEFAULT VALUE
; WVCDE - SEE LACTS LINE TAG FOR DESCRIPTION
;OUTPUT: $$ISLACT=1 - LACTATING
; 0 - NOT LACTATING
I $G(WVFKST) Q 1
Q $$ISIT(5,WVDFN,$G(WVSDATE,DT),$G(WVEDATE),+$G(WVCDE))
ISIT(WVNODE,WVDFN,WVSDATE,WVEDATE,WVCDE,WVRIEN) ;RETURNS PATIENT'S STATUS BASED ON TYPE AND
; DATE RANGE
;INPUT: WVNODE - SUBSCRIPT UNDER ^WV(790,WVDFN) THAT CONTAINS STATUS
; WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
; WVSDATE - START DATE OF INTEREST IN FILEMAN FORMAT [REQUIRED]
; WVEDATE - END DATE OF INTEREST IN FILEMAN FORMAT [OPTIONAL]
; WVCDE - SEE PREGS OR LACTS LINE TAGS FOR DESCRIPTION [OPTIONAL]
; WVRIEN - RETURN IEN OF LAST RECORD ASSOCIATED WITH THE PERIOD [OPTIONAL]
Q:+$G(WVSDATE)=0 0
N WVVISIT,WVDATE,WVIEN,WVINDEX,WVRTN,WVRECS,WVREC,WVINAME
S WVNODE=+$G(WVNODE),WVCDE=+$G(WVCDE)
S WVINAME=$S(WVNODE=4:"APREG",WVNODE=5:"ALACT",1:"") Q:WVINAME="" 0
I WVCDE D
.I WVNODE=4 D PREGS(WVDFN,.WVINDEX,.WVCDE)
.I WVNODE=5 D LACTS(WVDFN,.WVINDEX,.WVCDE)
I '$D(WVINDEX),$D(^WV(790,WVDFN,WVNODE,WVINAME)) M WVINDEX=^WV(790,WVDFN,WVNODE,WVINAME)
Q:'$D(WVINDEX) 0
S WVRTN=0,WVRIEN=+$G(WVRIEN)
S WVDATE(1)="" F S WVDATE(1)=$O(WVINDEX(WVDATE(1))) Q:WVDATE(1)=""!($D(WVRECS(1))) D
.S WVDATE(2)=$O(WVINDEX(WVDATE(1),"")) Q:WVDATE(2)=""
.S WVDATE("LAST_START")=WVDATE(1)
.I WVSDATE>=WVDATE(1),WVSDATE<=WVDATE(2) S WVRECS(1)=+$O(WVINDEX(WVDATE(1),WVDATE(2),0))
I '$D(WVRECS(1)),WVSDATE>WVDATE(2) S WVRECS(1)=+$O(WVINDEX(WVDATE("LAST_START"),WVDATE(2),0))_U_$S(WVNODE=4:0,1:"")
K WVDATE("LAST_START")
I +$G(WVRECS(1))>0,$P(WVRECS(1),U,2)="" S $P(WVRECS(1),U,2)=+$P($G(^WV(790,WVDFN,WVNODE,+WVRECS(1),2)),U)
I +$G(WVEDATE)>0 D
.S WVDATE(1)="" F S WVDATE(1)=$O(WVINDEX(WVDATE(1))) Q:WVDATE(1)=""!($D(WVRECS(2))) D
..S WVDATE(2)=$O(WVINDEX(WVDATE(1),"")) Q:WVDATE(2)=""
..S WVDATE("LAST_START")=WVDATE(1)
..I WVEDATE>=WVDATE(1),WVEDATE<=WVDATE(2) S WVRECS(2)=+$O(WVINDEX(WVDATE(1),WVDATE(2),0))
.I '$D(WVRECS(2)),WVEDATE>WVDATE(2) S WVRECS(2)=+$O(WVINDEX(WVDATE("LAST_START"),WVDATE(2),0))_U_$S(WVNODE=4:0,1:"")
I +$G(WVRECS(2))>0,$P($G(WVRECS(1)),U,2)="" S $P(WVRECS(2),U,2)=+$P($G(^WV(790,WVDFN,WVNODE,+WVRECS(2),2)),U)
F WVREC=1:1:2 I $D(WVRECS(WVREC)),$P($G(WVRTN),U)'=1 S WVRTN=$P(WVRECS(WVREC),U,2)_$S(WVRIEN=1:U_$P(WVRECS(WVREC),U),1:"")
I "^0^1^"'[(U_$P(WVRTN,U)_U) S $P(WVRTN,U)=0
Q WVRTN
PREGS(WVDFN,WVINDEX,WVCDE) ;CREATES INDEX OF PREGNANCY STATUSES
; INPUT: WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
; WVINDEX - REFERENCE TO ARRAY IN WHICH TO RETURN THE INDEX OF STATUSES
; WVCDE - CALCULATE END DATE; FOR PREGNANCIES THAT DO NOT HAVE A SPECIFIED
; END DATE BUT HAVE A "NO LONGER PREGNANT" STATUS FOLLOWING IT,
; WVCDE=1 WILL SET THAT PREGNANCY'S END DATE TO TOMORROW
; AND WVCDE=0 WILL SET THAT PREGNANCY'S END DATE TO THE
; "NO LONGER PREGNANT" STATUS' D/T ENTERED. WVCDE=1 IS USED
; BY DIALOGS TO PROMPT FOR END OF PREGNANCY DATA
; OUTPUT: WVINDEX(START,STOP,STOP_IEN)=""
N WVDATE,WVIEN,WVSTART,WVEDD,WVEND,WVSAVE,WVNODE,WVSTATUS
S WVCDE=+$G(WVCDE)
S WVSAVE=$S(WVCDE=0:1,1:0),(WVSTART,WVEDD,WVEND)=0,WVNODE=4
S WVDATE="" F S WVDATE=$O(^WV(790,WVDFN,WVNODE,"B",WVDATE)) Q:WVDATE="" S WVIEN="" F S WVIEN=$O(^WV(790,WVDFN,WVNODE,"B",WVDATE,WVIEN)) Q:WVIEN="" D
.Q:$P($G(^WV(790,WVDFN,WVNODE,WVIEN,0)),U,6)=1
.S WVSTATUS=$P($G(^WV(790,WVDFN,WVNODE,WVIEN,2)),U)
.I (WVSTATUS'=1)!(+$P($G(^WV(790,WVDFN,WVNODE,WVIEN,4)),U,4)>0) D
..I WVEND>0 S WVIEN("CONT-END")=WVIEN I '$D(WVEND("GUESS")) Q
..I WVSTART>0,WVEDD>0 K WVINDEX(WVSTART,WVEDD) S WVEDD=0
..S WVEND=+$P($G(^WV(790,WVDFN,WVNODE,WVIEN,4)),U,4),WVIEN("END")=WVIEN
..I WVEND>0 D Q
...S WVEND=+$$FMADD^XLFDT(WVEND,-1)
...I $G(WVEND("GUESS"))>0 K WVINDEX(WVSTART,+$$FMADD^XLFDT(WVEND("GUESS"),-1)),WVEND("GUESS")
...I WVSTART=0 D
....S WVINDEX(1410102,WVEND,WVIEN)=""
...I WVSTART>0 D
....S WVINDEX(WVSTART,WVEND,$S(+$G(WVIEN("CONT-START"))>0:WVIEN("CONT-START"),1:WVIEN("START")))="",WVSTART=0 K WVIEN("START"),WVIEN("CONT-START")
...S WVEND=$S(WVSTATUS=1:0,1:$$FMADD^XLFDT(WVEND,1))
..I WVEND=0 D
...I WVSTART=0 S WVEND=$P(WVDATE,".")
...I WVSTART>0 D
....Q:$G(WVEND("GUESS"))>0
....S WVEND("GUESS")=$S(WVCDE:+$$FMADD^XLFDT(DT,1),1:+$$FMADD^XLFDT($P(WVDATE,"."),-1))
....I WVSTART<=WVEND("GUESS") D Q
.....S WVINDEX(WVSTART,WVEND("GUESS"),$S(+$G(WVIEN("CONT-START"))>0:WVIEN("CONT-START"),1:WVIEN("START")))=""
.....K WVIEN("CONT-START")
.....S WVEND("GUESS")=+$$FMADD^XLFDT(WVEND("GUESS"),1)
....I WVSTART>WVEND("GUESS") S WVSTART=0,WVEND=$P(WVDATE,".") K WVEND("GUESS"),WVIEN("START") Q
.I WVSTATUS=1 D
..I WVSTART>0 D
...I $D(WVEND("GUESS")) S WVSTART=0 Q
...S WVSTART("OLD")=WVSTART,WVSTART=+$P($G(^WV(790,WVDFN,WVNODE,WVIEN,4)),U)
...I WVSTART=0 S WVSTART=$P(WVDATE,".") Q:WVSTART=0
...S WVEDD("OLD")=WVEDD,WVEDD=+$P($G(^WV(790,WVDFN,WVNODE,WVIEN,4)),U,2)
...I WVEDD>0 S WVEDD=+$$FMADD^XLFDT(WVEDD,$$GETGRACD)
...I WVEDD=0 S WVEDD=+$$FMADD^XLFDT(WVSTART,(280+$$GETGRACD))
...I WVSTART=WVSTART("OLD") D
....I WVEDD=WVEDD("OLD") K WVINDEX(WVSTART,WVEDD) S WVIEN("START")=WVIEN
....I WVEDD'=WVEDD("OLD") K WVINDEX(WVSTART,WVEDD("OLD"))
...I WVSTART'=WVSTART("OLD") D
....I WVSTART<WVEDD("OLD") D
.....K WVINDEX(WVSTART("OLD"),WVEDD("OLD"))
.....S WVEDD("OLD")=+$$FMADD^XLFDT(WVSTART,-1)
.....S WVINDEX(WVSTART("OLD"),WVEDD("OLD"),WVIEN("START"))=""
.....S WVIEN("START")=WVIEN
....I WVSTART=WVEDD("OLD") S WVIEN("CONT-START")=WVIEN
...K WVSTART("OLD"),WVEDD("OLD")
...I $G(WVIEN("CONT-START"))>0 Q
...S WVINDEX(WVSTART,WVEDD,WVIEN)=""
..I WVSTART=0 D
...S WVSTART=+$P($G(^WV(790,WVDFN,WVNODE,WVIEN,4)),U)
...I WVSTART=0 S WVSTART=$P(WVDATE,".")
...S WVEDD=+$P($G(^WV(790,WVDFN,WVNODE,WVIEN,4)),U,2),WVIEN("START")=WVIEN
...I (WVEND>0)!($G(WVEND("GUESS"))>0) D
....I WVEND=0 S WVEND=WVEND("GUESS")
....S WVSTART("INDEX")=$$FMADD^XLFDT(WVSTART,-1)
....I WVSTART("INDEX")>=WVEND S WVINDEX(WVEND,WVSTART("INDEX"),$S(+$G(WVIEN("CONT-END"))>0:WVIEN("CONT-END"),1:WVIEN("END")))=""
....S WVEND=0
....K WVIEN("END"),WVSTART("INDEX"),WVIEN("CONT-END"),WVEND("GUESS")
...I WVEDD>0 D
....S WVEDD=+$$FMADD^XLFDT(WVEDD,$$GETGRACD)
....S WVINDEX(WVSTART,WVEDD,WVIEN)=""
...I WVEDD=0 D
....S WVEDD=+$$FMADD^XLFDT(WVSTART,(280+$$GETGRACD))
....S WVINDEX(WVSTART,WVEDD,WVIEN)=""
I $G(WVEND("GUESS"))>0 S WVEND=WVEND("GUESS")
I WVEND>0 D
.S WVINDEX(WVEND,$S(WVEND<DT:DT,1:WVEND),$S($D(WVIEN("CONT-END"))=1:WVIEN("CONT-END"),1:WVIEN("END")))=""
I WVCDE,$G(WVSTATUS)=1,DT>WVEDD D
.K WVINDEX(WVSTART,WVEDD)
.S WVEDD=+$$FMADD^XLFDT(DT,1)
.S WVINDEX(WVSTART,WVEDD,WVIEN("START"))=""
I WVSAVE D
.K ^WV(790,WVDFN,WVNODE,"APREG")
.I $D(WVINDEX) M ^WV(790,WVDFN,WVNODE,"APREG")=WVINDEX
Q
GETGRACD() ;WRAPPER TO CALL GETGRACD^PXRMCWH1
;PXRM*2.0*45 INSTALLS AFTER WV*1.0*24
;REMOVE THIS LINE-TAG IF PATCHING THIS ROUTINE AFTER WV*1.0*24
I $T(GETGRACD^PXRMCWH1) Q $$GETGRACD^PXRMCWH1
Q 28
LACTS(WVDFN,WVINDEX,WVCDE) ;CREATES INDEX OF LACTATION STATUSES
; INPUT: WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
; WVINDEX - REFERENCE TO ARRAY IN WHICH TO RETURN THE INDEX OF STATUSES
; WVCDE - CALCULATE END DATE; FOR LACTATIONS THAT DO NOT HAVE A SPECIFIED
; END DATE BUT HAVE A "NO LONGER LACTATING" STATUS FOLLOWING IT,
; WVCDE=1 WILL SET THAT LACTATION'S END DATE TO TOMORROW
; AND WVCDE=0 WILL SET THAT LACTATION'S END DATE TO THE
; "NO LONGER LACTATING" STATUS' D/T ENTERED. WVCDE=1 IS USED
; BY DIALOGS TO PROMPT FOR END OF LACTATION DATA
; OUTPUT: WVINDEX(START,STOP,STOP_IEN)=""
N WVDATE,WVIEN,WVSTART,WVEND,WVSAVE,WVNODE,WVSTATUS
S WVCDE=+$G(WVCDE)
S WVSAVE=$S(WVCDE=0:1,1:0),(WVSTART,WVEND)=0,WVNODE=5
S WVDATE="" F S WVDATE=$O(^WV(790,WVDFN,WVNODE,"B",WVDATE)) Q:WVDATE="" S WVIEN="" F S WVIEN=$O(^WV(790,WVDFN,WVNODE,"B",WVDATE,WVIEN)) Q:WVIEN="" D
.Q:$P($G(^WV(790,WVDFN,WVNODE,WVIEN,0)),U,6)=1
.S WVSTATUS=$P($G(^WV(790,WVDFN,WVNODE,WVIEN,2)),U)
.I WVSTATUS=1 D
..I WVSTART>0 D
...I $D(WVEND("GUESS")) S WVSTART=0 Q
...S WVIEN("CONT-START")=WVIEN
..I WVSTART=0 D
...S WVSTART=$P(WVDATE,"."),WVIEN("START")=WVIEN
...I (WVEND>0)!($G(WVEND("GUESS"))>0) D
....I WVEND=0 S WVEND=+$$FMADD^XLFDT(WVEND("GUESS"),1)
....S WVSTART("INDEX")=$$FMADD^XLFDT(WVSTART,-1)
....I WVSTART("INDEX")>=WVEND S WVINDEX(WVEND,WVSTART("INDEX"),$S(+$G(WVIEN("CONT-END"))>0:WVIEN("CONT-END"),1:WVIEN("END")))=""
....S WVEND=0
....K WVEND("GUESS"),WVIEN("END"),WVSTART("INDEX"),WVIEN("CONT-END")
.I WVSTATUS=0 D
..I WVEND>0 S WVIEN("CONT-END")=WVIEN I '$D(WVEND("GUESS")) Q
..S WVEND=+$P($G(^WV(790,WVDFN,WVNODE,WVIEN,2)),U,2),WVIEN("END")=WVIEN
..I WVEND>0 D Q
...I $G(WVEND("GUESS"))>0 K WVINDEX(WVSTART,WVEND("GUESS")),WVEND("GUESS")
...I WVSTART=0 D
....S WVINDEX(1410102,WVEND,WVIEN)=""
...I WVSTART>0 D
....S WVINDEX(WVSTART,WVEND,$S(+$G(WVIEN("CONT-START"))>0:WVIEN("CONT-START"),1:WVIEN("START")))="",WVSTART=0 K WVIEN("START"),WVIEN("CONT-START")
...S WVEND=$$FMADD^XLFDT(WVEND,1)
..I WVEND=0 D
...I WVSTART=0 S WVEND=$P($P($G(^WV(790,WVDFN,WVNODE,WVIEN,0)),U),".")
...I WVSTART>0 D
....Q:$G(WVEND("GUESS"))>0
....S WVEND("GUESS")=$S(WVCDE:+$$FMADD^XLFDT(DT,1),1:+$$FMADD^XLFDT($P(WVDATE,"."),-1))
....I WVSTART<=WVEND("GUESS") S WVINDEX(WVSTART,WVEND("GUESS"),$S(+$G(WVIEN("CONT-START"))>0:WVIEN("CONT-START"),1:WVIEN("START")))="" K WVIEN("CONT-START")
....I WVSTART>WVEND("GUESS") S WVSTART=0,WVEND("GUESS")=$S(WVCDE:DT,1:$P($P($G(^WV(790,WVDFN,WVNODE,WVIEN,0)),U),".")) K WVIEN("START") Q
I $G(WVEND("GUESS"))>0 S WVEND=+$$FMADD^XLFDT(WVEND("GUESS"),1)
I WVEND>0 D
.S WVINDEX(WVEND,$S(WVEND<DT:DT,1:WVEND),$S($D(WVIEN("CONT-END"))=1:WVIEN("CONT-END"),1:WVIEN("END")))=""
I WVSTART>0,WVEND=0 S WVINDEX(WVSTART,DT,$S($D(WVIEN("CONT-START"))=1:WVIEN("CONT-START"),1:WVIEN("START")))=""
I WVSAVE D
.K ^WV(790,WVDFN,WVNODE,"ALACT")
.I $D(WVINDEX) M ^WV(790,WVDFN,WVNODE,"ALACT")=WVINDEX
Q
MOA(WVMOA,WVDFN,WVDT) ;RETURN LIKELIHOOD OF BECOMING PREGNANT
; GIVEN THE METHOD OF CONTRACEPTION
; INPUT: WVMOA - CONTRACEPTIVE METHOD (NAME OR IEN IN FILE #791)
; WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
; WVDATE - DATE TO USE WHEN CALCULATING THE LIKELIHOOD
; OUTPUT: 1 - HIGH, 2 - LOW, -1 - Error
Q:$G(WVMOA)="" -1
N WVIEN,WVRETURN
S WVRETURN=-1,WVDT=$G(WVDT,DT),WVDT=$P(WVDT,".")
S WVIEN=$S(WVMOA'=+WVMOA:$O(^WV(791,"B",WVMOA,0)),1:WVMOA)
Q:'WVIEN WVRETURN
I $D(^WV(791,WVIEN,1)) X ^WV(791,WVIEN,1)
E S WVRETURN=$P($G(^WV(791,WVIEN,0)),U,2)
S:WVRETURN<1 WVRETURN=-1
Q WVRETURN
GETLREC(WVDFN,WVNODE) ;RETURN "IEN^DATE^ENTERED BY^STATUS" OF MOST RECENT PREGNANCY
; OR LACTATION STATUS RECORD
N WVRET,WVSTATUS,WVIEN
S WVRET=0
S WVSTATUS=$$ISIT^WVUTL11(WVNODE,WVDFN,DT,"",0,1)
S WVIEN=+$P(WVSTATUS,U,2),WVSTATUS=$P(WVSTATUS,U)
I WVIEN>0 D
.I 'WVSTATUS,WVNODE=4,$P($G(^WV(790,WVDFN,WVNODE,WVIEN,2)),U)=2 D
..S WVSTATUS=2
.S WVRET=WVIEN_U_$P($G(^WV(790,WVDFN,WVNODE,WVIEN,0)),U,1,2)_U_WVSTATUS
Q WVRET
REM(WVDFN,WVNAME,WVFIEVAL) ;EVALUATE REMINDER DEFINITION
;RETURN: $$REM => EVAL STATUS
N WVPARAMS,WVRESULT,WVREMST
S WVFIEVAL=+$G(WVFIEVAL)
S WVPARAMS("SUB")="WV APPLICABLE",WVPARAMS("DFN")=WVDFN
S WVPARAMS("REMINDERS",WVNAME)=WVFIEVAL_U_5
D EN^PXRMGEV(.WVRESULT,.WVPARAMS)
I $P($G(^TMP($J,"WV APPLICABLE",0)),U)=-1 Q ^TMP($J,"WV APPLICABLE",0)
S WVREMST=$P($G(^TMP($J,"WV APPLICABLE",WVNAME)),U)
K:'WVFIEVAL ^TMP($J,"WV APPLICABLE")
I WVREMST="" Q -1_U_"Reminder "_WVNAME_" evaluation did not return a status."
Q WVREMST
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HWVUTL11 18034 printed Oct 16, 2024@18:48:37 Page 2
WVUTL11 ;ISP/RFR - TERATOGENIC DRUGS UTILITY FUNCTIONS;Dec 01, 2020@12:32
+1 ;;1.0;WOMEN'S HEALTH;**24,26**;Sep 30, 1998;Build 624
+2 QUIT
BC(WVDFN,WVDT) ;Return patient's likelihood of becoming pregnant
+1 ; when on prescription contraceptives
+2 ; DT^DILF (IA #2054): This component converts a user-formatted date into FileMan date format
+3 ; DATA^PSS50 (IA #4533): This component returns DRUG file (#50) data
+4 ; OCL^PSOORRL (IA #2400): This component returns all medications for a patient in a date range
+5 ; INPUT: WVDFN - IEN from PATIENT file #2
+6 ; WVDT - Date to use as today's date
+7 ; OUTPUT: 1 - HIGH, 2 - LOW
+8 NEW WV100,WV465,WVCODE,WVDATE,WVRX,WVDRUG,WVRISK,WVON,WVNODE,X1,X2,X,%H
+9 NEW BDT1,DRG,EXDT,FL,I,IEN,II,ITFN,J,LSTDS,LSTFD,LSTRD,MDR,MIG,MR,PSBDT,PSEDT,PSOR,RX0,RX2,RX3,SC,SCH,SG,ST,ST0,STA,TFN,TRM
+10 ; Oldest dispense date for patient to be low risk
SET X1=WVDT
SET X2=-100
DO C^%DTC
SET WV100=X
+11 ; Start date for search
SET X1=WVDT
SET X2=-465
DO C^%DTC
SET WV465=X
+12 DO ITEMLIST^PXRMAPI("","VA-WH HIRISK CONTRACEPTIVES GROUP","P","WVLIST")
+13 DO OCL^PSOORRL(WVDFN,WV465,WVDT)
+14 MERGE ^TMP("WVPS",$JOB)=^TMP("PS",$JOB)
KILL ^TMP("PS",$JOB)
+15 SET WVRISK=1
+16 SET WVON=""
FOR
SET WVON=$ORDER(^TMP("WVPS",$JOB,WVON))
if WVON=""!($GET(WVRISK)=2)
QUIT
Begin DoDot:1
+17 SET WVNODE=$GET(^TMP("WVPS",$JOB,WVON,0))
if WVNODE=""
QUIT
+18 ;CLINIC MEDICATIONS ARE EXPIRED WHEN GIVEN, ACTIVE WHEN FINISHED
+19 if $PIECE(WVNODE,U)[";I"&($PIECE(WVNODE,U,9)'="EXPIRED")
QUIT
+20 SET WVDATE=$SELECT($PIECE(WVNODE,U)[";O":$PIECE(WVNODE,U,10),$PIECE(WVNODE,U)[";I":$PIECE(WVNODE,U,4),1:0)
+21 IF WVDATE>=WV100
DO OEL^PSOORRL(WVDFN,$PIECE(WVNODE,U))
FOR WVDRUG=1:1:$GET(^TMP("PS",$JOB,"DD",0))
Begin DoDot:2
+22 SET WVDRUG(1)=$PIECE($GET(^TMP("PS",$JOB,"DD",WVDRUG,0)),U)
+23 DO DATA^PSS50(WVDRUG(1),"","","","","WVTDPD")
+24 IF $DATA(^TMP($JOB,"WVLIST","VA-WH HIRISK CONTRACEPTIVES GROUP","P",$PIECE($GET(^TMP($JOB,"WVTDPD",WVDRUG(1),20)),U)_";PSNDF(50.6,"))
SET WVRISK=2
+25 IF $DATA(^TMP($JOB,"WVLIST","VA-WH HIRISK CONTRACEPTIVES GROUP","P",$PIECE($GET(^TMP($JOB,"WVTDPD",WVDRUG(1),25)),U)_";PS(50.605,"))
SET WVRISK=2
+26 IF $DATA(^TMP($JOB,"WVLIST","VA-WH HIRISK CONTRACEPTIVES GROUP","P",$PIECE($GET(^TMP($JOB,"WVTDPD",WVDRUG(1),22)),U)_";PSNDF(50.68,"))
SET WVRISK=2
+27 IF $DATA(^TMP($JOB,"WVLIST","VA-WH HIRISK CONTRACEPTIVES GROUP","P",WVDRUG(1)_";PSDRUG("))
SET WVRISK=2
End DoDot:2
End DoDot:1
+28 KILL ^TMP($JOB,"WVTDPD"),^TMP($JOB,"WVLIST"),^TMP("PS",$JOB),^TMP("WVPS",$JOB)
+29 QUIT WVRISK
COBP(WVDFN,WVPIEN) ;Determine patient's likelihood of becomming pregnant
+1 ; INPUT: WVDFN - IEN from PATIENT file #2
+2 ; WVPIEN - IEN in PREGNANCY STATUSES sub-file #790.05
+3 ; OUTPUT: -1 - Error (message text in second caret piece)
+4 ; 0 - Unknown risk of pregnancy
+5 ; 1 - High risk of pregnancy
+6 ; 2 - Low risk of pregnancy
+7 NEW WVRETURN,WVIEN,WVERR,WVRISK
+8 SET WVRETURN=0
+9 SET WVIEN=0
FOR
SET WVIEN=$ORDER(^WV(790,WVDFN,4,WVPIEN,3,WVIEN))
if 'WVIEN!($GET(WVERR))
QUIT
Begin DoDot:1
+10 NEW WVCONT
+11 SET WVCONT=$PIECE($GET(^WV(790,WVDFN,4,WVPIEN,3,WVIEN,0)),U)
+12 SET WVRISK(1)=$$MOA(WVCONT,WVDFN)
+13 IF WVRISK(1)=-1
SET WVERR=$PIECE($GET(^WV(791,WVCONT,0)),U)
QUIT
+14 IF $GET(WVRISK)=""
SET WVRISK=WVRISK(1)
+15 IF $GET(WVRISK)'=""
IF WVRISK(1)>WVRISK
SET WVRISK=WVRISK(1)
+16 KILL WVRISK(1)
End DoDot:1
+17 IF $GET(WVERR)'=""
SET WVRETURN=-1_U_"Unknown pregnancy risk for "_WVERR
+18 IF $GET(WVERR)=""
IF $GET(WVRISK)'=""
SET WVRETURN=WVRISK
+19 QUIT WVRETURN
FMERROR(WVRESULT) ;RETURN FILEMAN ERROR MESSAGE AS STRING
+1 NEW WVITM,WVERRTXT,WVERRNUM,WVERRORS
+2 SET WVERRNUM=0
FOR
SET WVERRNUM=$ORDER(WVRESULT("DIERR",WVERRNUM))
if '+WVERRNUM
QUIT
Begin DoDot:1
+3 if $DATA(WVERRORS($GET(WVRESULT("DIERR",WVERRNUM))))
QUIT
+4 SET WVITM=0
FOR
SET WVITM=$ORDER(WVRESULT("DIERR",WVERRNUM,"TEXT",WVITM))
if WVITM=""
QUIT
Begin DoDot:2
+5 SET WVERRTXT=$SELECT($GET(WVERRTXT)'="":WVERRTXT_" ",1:"")_WVRESULT("DIERR",WVERRNUM,"TEXT",WVITM)
End DoDot:2
+6 SET WVERRORS=$GET(WVRESULT("DIERR",WVERRNUM))
+7 IF WVERRORS'=""
SET WVERRORS(WVERRORS)=""
End DoDot:1
+8 QUIT $GET(WVERRTXT)
ISREG(WVDFN) ;DETERMINE IF PATIENT IS REGISTERED
+1 ; INPUT: WVDFN - IEN IN WV PATIENT FILE [REQUIRED]
+2 ; OUTPUT: $$ISREG - 1: PATIENT IS/WAS SUCCESSFULLY REGISTERED
+3 ; 0^MESSAGE: PATIENT IS/WAS NOT SUCCESSFULLY REGISTERED
+4 NEW WVNPFLAG
+5 IF $GET(WVDFN)'?1.N
Begin DoDot:1
+6 SET WVNPFLAG=0_U_"Invalid patient identifier: """_$GET(WVDFN)_"""."
End DoDot:1
QUIT WVNPFLAG
+7 IF '$DATA(^WV(790,WVDFN))
Begin DoDot:1
+8 IF "^f^F^"'[(U_$PIECE($GET(^DPT(WVDFN,0)),U,2)_U)
SET WVNPFLAG=0_U_"The specified patient is not a female."
QUIT
+9 NEW WVERRADD,WVEXTRA
+10 IF $DATA(^WV(790.02,DUZ(2),0))=1
DO AUTOADD^WVPATE(WVDFN,DUZ(2),.WVERRADD)
+11 IF $DATA(^WV(790.02,DUZ(2),0))'=1
SET WVEXTRA=" and the "_$$GET1^DIQ(4,DUZ(2)_",",.01)_" institution is not configured in the Women's Health package"
SET WVERRADD=0
+12 IF +$GET(WVERRADD)>0
SET WVNPFLAG=1
+13 IF '$TEST
SET WVNPFLAG=0_U_"The specified patient is not in the WV PATIENT file"_$GET(WVEXTRA)_"."
End DoDot:1
QUIT WVNPFLAG
+14 QUIT 1
VISITIEN(WVDFN,WVVSTR) ;RETURN VISIT FILE IEN GIVEN TIU VSTRING
+1 SET WVDFN=+$GET(WVDFN)
SET WVVSTR=$GET(WVVSTR)
+2 IF ('WVDFN)!('$DATA(^DPT(WVDFN)))
QUIT 0
+3 IF WVVSTR'?1.N1";"7N.1".".N1";"1U
QUIT 0
+4 NEW WVDT
+5 SET WVDT=+$PIECE(WVVSTR,";",2)
SET WVDT=(9999999-$PIECE(WVDT,"."))_"."_$PIECE(WVDT,".",2)
+6 IF $PIECE(WVDT,".",2)=""
SET WVDT=$PIECE(WVDT,".")
+7 QUIT +$ORDER(^AUPNVSIT("AA",WVDFN,WVDT,0))
VSTRING(WVIEN) ;RETURN TIU VSTRING GIVEN VISIT FILE IEN
+1 SET WVIEN=+$GET(WVIEN)
+2 if 'WVIEN
QUIT ""
+3 NEW VSIT0
+4 SET VSIT0=$GET(^AUPNVSIT(WVIEN,0))
+5 QUIT +$PIECE(VSIT0,U,22)_";"_+$PIECE(VSIT0,U)_";"_$PIECE(VSIT0,U,7)
ISPREG(WVDFN,WVSDATE,WVEDATE,WVCDE) ;DETERMINES IF PATIENT WAS PREGNANT ON DATE OR IN
+1 ; DATE RANGE
+2 ;INPUT: WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
+3 ; WVSDATE - START DATE OF INTEREST IN FILEMAN FORMAT [OPTIONAL]
+4 ; DEFAULT: TODAY'S DATE
+5 ; WVEDATE - END DATE OF INTEREST IN FILEMAN FORMAT [OPTIONAL]
+6 ; NO DEFAULT VALUE
+7 ; WVCDE - SEE PREGS LINE TAG FOR DESCRIPTION
+8 ;OUTPUT: $$ISPREG=1 - PREGNANT
+9 ; 0 - NOT PREGNANT (INCLUDES ALL STATUSES EXCEPT PREGNANT)
+10 IF $GET(WVFKST)
QUIT 1
+11 QUIT $$ISIT(4,WVDFN,$GET(WVSDATE,DT),$GET(WVEDATE),+$GET(WVCDE))
ISLACT(WVDFN,WVSDATE,WVEDATE,WVCDE) ;DETERMINE IF PATIENT WAS LACTATING ON DATE OR IN
+1 ; DATE RANGE
+2 ;INPUT: WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
+3 ; WVSDATE - START DATE OF INTEREST IN FILEMAN FORMAT [OPTIONAL]
+4 ; DEFAULT: TODAY'S DATE
+5 ; WVEDATE - END DATE OF INTEREST IN FILEMAN FORMAT [OPTIONAL]
+6 ; NO DEFAULT VALUE
+7 ; WVCDE - SEE LACTS LINE TAG FOR DESCRIPTION
+8 ;OUTPUT: $$ISLACT=1 - LACTATING
+9 ; 0 - NOT LACTATING
+10 IF $GET(WVFKST)
QUIT 1
+11 QUIT $$ISIT(5,WVDFN,$GET(WVSDATE,DT),$GET(WVEDATE),+$GET(WVCDE))
ISIT(WVNODE,WVDFN,WVSDATE,WVEDATE,WVCDE,WVRIEN) ;RETURNS PATIENT'S STATUS BASED ON TYPE AND
+1 ; DATE RANGE
+2 ;INPUT: WVNODE - SUBSCRIPT UNDER ^WV(790,WVDFN) THAT CONTAINS STATUS
+3 ; WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
+4 ; WVSDATE - START DATE OF INTEREST IN FILEMAN FORMAT [REQUIRED]
+5 ; WVEDATE - END DATE OF INTEREST IN FILEMAN FORMAT [OPTIONAL]
+6 ; WVCDE - SEE PREGS OR LACTS LINE TAGS FOR DESCRIPTION [OPTIONAL]
+7 ; WVRIEN - RETURN IEN OF LAST RECORD ASSOCIATED WITH THE PERIOD [OPTIONAL]
+8 if +$GET(WVSDATE)=0
QUIT 0
+9 NEW WVVISIT,WVDATE,WVIEN,WVINDEX,WVRTN,WVRECS,WVREC,WVINAME
+10 SET WVNODE=+$GET(WVNODE)
SET WVCDE=+$GET(WVCDE)
+11 SET WVINAME=$SELECT(WVNODE=4:"APREG",WVNODE=5:"ALACT",1:"")
if WVINAME=""
QUIT 0
+12 IF WVCDE
Begin DoDot:1
+13 IF WVNODE=4
DO PREGS(WVDFN,.WVINDEX,.WVCDE)
+14 IF WVNODE=5
DO LACTS(WVDFN,.WVINDEX,.WVCDE)
End DoDot:1
+15 IF '$DATA(WVINDEX)
IF $DATA(^WV(790,WVDFN,WVNODE,WVINAME))
MERGE WVINDEX=^WV(790,WVDFN,WVNODE,WVINAME)
+16 if '$DATA(WVINDEX)
QUIT 0
+17 SET WVRTN=0
SET WVRIEN=+$GET(WVRIEN)
+18 SET WVDATE(1)=""
FOR
SET WVDATE(1)=$ORDER(WVINDEX(WVDATE(1)))
if WVDATE(1)=""!($DATA(WVRECS(1)))
QUIT
Begin DoDot:1
+19 SET WVDATE(2)=$ORDER(WVINDEX(WVDATE(1),""))
if WVDATE(2)=""
QUIT
+20 SET WVDATE("LAST_START")=WVDATE(1)
+21 IF WVSDATE>=WVDATE(1)
IF WVSDATE<=WVDATE(2)
SET WVRECS(1)=+$ORDER(WVINDEX(WVDATE(1),WVDATE(2),0))
End DoDot:1
+22 IF '$DATA(WVRECS(1))
IF WVSDATE>WVDATE(2)
SET WVRECS(1)=+$ORDER(WVINDEX(WVDATE("LAST_START"),WVDATE(2),0))_U_$SELECT(WVNODE=4:0,1:"")
+23 KILL WVDATE("LAST_START")
+24 IF +$GET(WVRECS(1))>0
IF $PIECE(WVRECS(1),U,2)=""
SET $PIECE(WVRECS(1),U,2)=+$PIECE($GET(^WV(790,WVDFN,WVNODE,+WVRECS(1),2)),U)
+25 IF +$GET(WVEDATE)>0
Begin DoDot:1
+26 SET WVDATE(1)=""
FOR
SET WVDATE(1)=$ORDER(WVINDEX(WVDATE(1)))
if WVDATE(1)=""!($DATA(WVRECS(2)))
QUIT
Begin DoDot:2
+27 SET WVDATE(2)=$ORDER(WVINDEX(WVDATE(1),""))
if WVDATE(2)=""
QUIT
+28 SET WVDATE("LAST_START")=WVDATE(1)
+29 IF WVEDATE>=WVDATE(1)
IF WVEDATE<=WVDATE(2)
SET WVRECS(2)=+$ORDER(WVINDEX(WVDATE(1),WVDATE(2),0))
End DoDot:2
+30 IF '$DATA(WVRECS(2))
IF WVEDATE>WVDATE(2)
SET WVRECS(2)=+$ORDER(WVINDEX(WVDATE("LAST_START"),WVDATE(2),0))_U_$SELECT(WVNODE=4:0,1:"")
End DoDot:1
+31 IF +$GET(WVRECS(2))>0
IF $PIECE($GET(WVRECS(1)),U,2)=""
SET $PIECE(WVRECS(2),U,2)=+$PIECE($GET(^WV(790,WVDFN,WVNODE,+WVRECS(2),2)),U)
+32 FOR WVREC=1:1:2
IF $DATA(WVRECS(WVREC))
IF $PIECE($GET(WVRTN),U)'=1
SET WVRTN=$PIECE(WVRECS(WVREC),U,2)_$SELECT(WVRIEN=1:U_$PIECE(WVRECS(WVREC),U),1:"")
+33 IF "^0^1^"'[(U_$PIECE(WVRTN,U)_U)
SET $PIECE(WVRTN,U)=0
+34 QUIT WVRTN
PREGS(WVDFN,WVINDEX,WVCDE) ;CREATES INDEX OF PREGNANCY STATUSES
+1 ; INPUT: WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
+2 ; WVINDEX - REFERENCE TO ARRAY IN WHICH TO RETURN THE INDEX OF STATUSES
+3 ; WVCDE - CALCULATE END DATE; FOR PREGNANCIES THAT DO NOT HAVE A SPECIFIED
+4 ; END DATE BUT HAVE A "NO LONGER PREGNANT" STATUS FOLLOWING IT,
+5 ; WVCDE=1 WILL SET THAT PREGNANCY'S END DATE TO TOMORROW
+6 ; AND WVCDE=0 WILL SET THAT PREGNANCY'S END DATE TO THE
+7 ; "NO LONGER PREGNANT" STATUS' D/T ENTERED. WVCDE=1 IS USED
+8 ; BY DIALOGS TO PROMPT FOR END OF PREGNANCY DATA
+9 ; OUTPUT: WVINDEX(START,STOP,STOP_IEN)=""
+10 NEW WVDATE,WVIEN,WVSTART,WVEDD,WVEND,WVSAVE,WVNODE,WVSTATUS
+11 SET WVCDE=+$GET(WVCDE)
+12 SET WVSAVE=$SELECT(WVCDE=0:1,1:0)
SET (WVSTART,WVEDD,WVEND)=0
SET WVNODE=4
+13 SET WVDATE=""
FOR
SET WVDATE=$ORDER(^WV(790,WVDFN,WVNODE,"B",WVDATE))
if WVDATE=""
QUIT
SET WVIEN=""
FOR
SET WVIEN=$ORDER(^WV(790,WVDFN,WVNODE,"B",WVDATE,WVIEN))
if WVIEN=""
QUIT
Begin DoDot:1
+14 if $PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,0)),U,6)=1
QUIT
+15 SET WVSTATUS=$PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,2)),U)
+16 IF (WVSTATUS'=1)!(+$PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,4)),U,4)>0)
Begin DoDot:2
+17 IF WVEND>0
SET WVIEN("CONT-END")=WVIEN
IF '$DATA(WVEND("GUESS"))
QUIT
+18 IF WVSTART>0
IF WVEDD>0
KILL WVINDEX(WVSTART,WVEDD)
SET WVEDD=0
+19 SET WVEND=+$PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,4)),U,4)
SET WVIEN("END")=WVIEN
+20 IF WVEND>0
Begin DoDot:3
+21 SET WVEND=+$$FMADD^XLFDT(WVEND,-1)
+22 IF $GET(WVEND("GUESS"))>0
KILL WVINDEX(WVSTART,+$$FMADD^XLFDT(WVEND("GUESS"),-1)),WVEND("GUESS")
+23 IF WVSTART=0
Begin DoDot:4
+24 SET WVINDEX(1410102,WVEND,WVIEN)=""
End DoDot:4
+25 IF WVSTART>0
Begin DoDot:4
+26 SET WVINDEX(WVSTART,WVEND,$SELECT(+$GET(WVIEN("CONT-START"))>0:WVIEN("CONT-START"),1:WVIEN("START")))=""
SET WVSTART=0
KILL WVIEN("START"),WVIEN("CONT-START")
End DoDot:4
+27 SET WVEND=$SELECT(WVSTATUS=1:0,1:$$FMADD^XLFDT(WVEND,1))
End DoDot:3
QUIT
+28 IF WVEND=0
Begin DoDot:3
+29 IF WVSTART=0
SET WVEND=$PIECE(WVDATE,".")
+30 IF WVSTART>0
Begin DoDot:4
+31 if $GET(WVEND("GUESS"))>0
QUIT
+32 SET WVEND("GUESS")=$SELECT(WVCDE:+$$FMADD^XLFDT(DT,1),1:+$$FMADD^XLFDT($PIECE(WVDATE,"."),-1))
+33 IF WVSTART<=WVEND("GUESS")
Begin DoDot:5
+34 SET WVINDEX(WVSTART,WVEND("GUESS"),$SELECT(+$GET(WVIEN("CONT-START"))>0:WVIEN("CONT-START"),1:WVIEN("START")))=""
+35 KILL WVIEN("CONT-START")
+36 SET WVEND("GUESS")=+$$FMADD^XLFDT(WVEND("GUESS"),1)
End DoDot:5
QUIT
+37 IF WVSTART>WVEND("GUESS")
SET WVSTART=0
SET WVEND=$PIECE(WVDATE,".")
KILL WVEND("GUESS"),WVIEN("START")
QUIT
End DoDot:4
End DoDot:3
End DoDot:2
+38 IF WVSTATUS=1
Begin DoDot:2
+39 IF WVSTART>0
Begin DoDot:3
+40 IF $DATA(WVEND("GUESS"))
SET WVSTART=0
QUIT
+41 SET WVSTART("OLD")=WVSTART
SET WVSTART=+$PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,4)),U)
+42 IF WVSTART=0
SET WVSTART=$PIECE(WVDATE,".")
if WVSTART=0
QUIT
+43 SET WVEDD("OLD")=WVEDD
SET WVEDD=+$PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,4)),U,2)
+44 IF WVEDD>0
SET WVEDD=+$$FMADD^XLFDT(WVEDD,$$GETGRACD)
+45 IF WVEDD=0
SET WVEDD=+$$FMADD^XLFDT(WVSTART,(280+$$GETGRACD))
+46 IF WVSTART=WVSTART("OLD")
Begin DoDot:4
+47 IF WVEDD=WVEDD("OLD")
KILL WVINDEX(WVSTART,WVEDD)
SET WVIEN("START")=WVIEN
+48 IF WVEDD'=WVEDD("OLD")
KILL WVINDEX(WVSTART,WVEDD("OLD"))
End DoDot:4
+49 IF WVSTART'=WVSTART("OLD")
Begin DoDot:4
+50 IF WVSTART<WVEDD("OLD")
Begin DoDot:5
+51 KILL WVINDEX(WVSTART("OLD"),WVEDD("OLD"))
+52 SET WVEDD("OLD")=+$$FMADD^XLFDT(WVSTART,-1)
+53 SET WVINDEX(WVSTART("OLD"),WVEDD("OLD"),WVIEN("START"))=""
+54 SET WVIEN("START")=WVIEN
End DoDot:5
+55 IF WVSTART=WVEDD("OLD")
SET WVIEN("CONT-START")=WVIEN
End DoDot:4
+56 KILL WVSTART("OLD"),WVEDD("OLD")
+57 IF $GET(WVIEN("CONT-START"))>0
QUIT
+58 SET WVINDEX(WVSTART,WVEDD,WVIEN)=""
End DoDot:3
+59 IF WVSTART=0
Begin DoDot:3
+60 SET WVSTART=+$PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,4)),U)
+61 IF WVSTART=0
SET WVSTART=$PIECE(WVDATE,".")
+62 SET WVEDD=+$PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,4)),U,2)
SET WVIEN("START")=WVIEN
+63 IF (WVEND>0)!($GET(WVEND("GUESS"))>0)
Begin DoDot:4
+64 IF WVEND=0
SET WVEND=WVEND("GUESS")
+65 SET WVSTART("INDEX")=$$FMADD^XLFDT(WVSTART,-1)
+66 IF WVSTART("INDEX")>=WVEND
SET WVINDEX(WVEND,WVSTART("INDEX"),$SELECT(+$GET(WVIEN("CONT-END"))>0:WVIEN("CONT-END"),1:WVIEN("END")))=""
+67 SET WVEND=0
+68 KILL WVIEN("END"),WVSTART("INDEX"),WVIEN("CONT-END"),WVEND("GUESS")
End DoDot:4
+69 IF WVEDD>0
Begin DoDot:4
+70 SET WVEDD=+$$FMADD^XLFDT(WVEDD,$$GETGRACD)
+71 SET WVINDEX(WVSTART,WVEDD,WVIEN)=""
End DoDot:4
+72 IF WVEDD=0
Begin DoDot:4
+73 SET WVEDD=+$$FMADD^XLFDT(WVSTART,(280+$$GETGRACD))
+74 SET WVINDEX(WVSTART,WVEDD,WVIEN)=""
End DoDot:4
End DoDot:3
End DoDot:2
End DoDot:1
+75 IF $GET(WVEND("GUESS"))>0
SET WVEND=WVEND("GUESS")
+76 IF WVEND>0
Begin DoDot:1
+77 SET WVINDEX(WVEND,$SELECT(WVEND<DT:DT,1:WVEND),$SELECT($DATA(WVIEN("CONT-END"))=1:WVIEN("CONT-END"),1:WVIEN("END")))=""
End DoDot:1
+78 IF WVCDE
IF $GET(WVSTATUS)=1
IF DT>WVEDD
Begin DoDot:1
+79 KILL WVINDEX(WVSTART,WVEDD)
+80 SET WVEDD=+$$FMADD^XLFDT(DT,1)
+81 SET WVINDEX(WVSTART,WVEDD,WVIEN("START"))=""
End DoDot:1
+82 IF WVSAVE
Begin DoDot:1
+83 KILL ^WV(790,WVDFN,WVNODE,"APREG")
+84 IF $DATA(WVINDEX)
MERGE ^WV(790,WVDFN,WVNODE,"APREG")=WVINDEX
End DoDot:1
+85 QUIT
GETGRACD() ;WRAPPER TO CALL GETGRACD^PXRMCWH1
+1 ;PXRM*2.0*45 INSTALLS AFTER WV*1.0*24
+2 ;REMOVE THIS LINE-TAG IF PATCHING THIS ROUTINE AFTER WV*1.0*24
+3 IF $TEXT(GETGRACD^PXRMCWH1)
QUIT $$GETGRACD^PXRMCWH1
+4 QUIT 28
LACTS(WVDFN,WVINDEX,WVCDE) ;CREATES INDEX OF LACTATION STATUSES
+1 ; INPUT: WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
+2 ; WVINDEX - REFERENCE TO ARRAY IN WHICH TO RETURN THE INDEX OF STATUSES
+3 ; WVCDE - CALCULATE END DATE; FOR LACTATIONS THAT DO NOT HAVE A SPECIFIED
+4 ; END DATE BUT HAVE A "NO LONGER LACTATING" STATUS FOLLOWING IT,
+5 ; WVCDE=1 WILL SET THAT LACTATION'S END DATE TO TOMORROW
+6 ; AND WVCDE=0 WILL SET THAT LACTATION'S END DATE TO THE
+7 ; "NO LONGER LACTATING" STATUS' D/T ENTERED. WVCDE=1 IS USED
+8 ; BY DIALOGS TO PROMPT FOR END OF LACTATION DATA
+9 ; OUTPUT: WVINDEX(START,STOP,STOP_IEN)=""
+10 NEW WVDATE,WVIEN,WVSTART,WVEND,WVSAVE,WVNODE,WVSTATUS
+11 SET WVCDE=+$GET(WVCDE)
+12 SET WVSAVE=$SELECT(WVCDE=0:1,1:0)
SET (WVSTART,WVEND)=0
SET WVNODE=5
+13 SET WVDATE=""
FOR
SET WVDATE=$ORDER(^WV(790,WVDFN,WVNODE,"B",WVDATE))
if WVDATE=""
QUIT
SET WVIEN=""
FOR
SET WVIEN=$ORDER(^WV(790,WVDFN,WVNODE,"B",WVDATE,WVIEN))
if WVIEN=""
QUIT
Begin DoDot:1
+14 if $PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,0)),U,6)=1
QUIT
+15 SET WVSTATUS=$PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,2)),U)
+16 IF WVSTATUS=1
Begin DoDot:2
+17 IF WVSTART>0
Begin DoDot:3
+18 IF $DATA(WVEND("GUESS"))
SET WVSTART=0
QUIT
+19 SET WVIEN("CONT-START")=WVIEN
End DoDot:3
+20 IF WVSTART=0
Begin DoDot:3
+21 SET WVSTART=$PIECE(WVDATE,".")
SET WVIEN("START")=WVIEN
+22 IF (WVEND>0)!($GET(WVEND("GUESS"))>0)
Begin DoDot:4
+23 IF WVEND=0
SET WVEND=+$$FMADD^XLFDT(WVEND("GUESS"),1)
+24 SET WVSTART("INDEX")=$$FMADD^XLFDT(WVSTART,-1)
+25 IF WVSTART("INDEX")>=WVEND
SET WVINDEX(WVEND,WVSTART("INDEX"),$SELECT(+$GET(WVIEN("CONT-END"))>0:WVIEN("CONT-END"),1:WVIEN("END")))=""
+26 SET WVEND=0
+27 KILL WVEND("GUESS"),WVIEN("END"),WVSTART("INDEX"),WVIEN("CONT-END")
End DoDot:4
End DoDot:3
End DoDot:2
+28 IF WVSTATUS=0
Begin DoDot:2
+29 IF WVEND>0
SET WVIEN("CONT-END")=WVIEN
IF '$DATA(WVEND("GUESS"))
QUIT
+30 SET WVEND=+$PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,2)),U,2)
SET WVIEN("END")=WVIEN
+31 IF WVEND>0
Begin DoDot:3
+32 IF $GET(WVEND("GUESS"))>0
KILL WVINDEX(WVSTART,WVEND("GUESS")),WVEND("GUESS")
+33 IF WVSTART=0
Begin DoDot:4
+34 SET WVINDEX(1410102,WVEND,WVIEN)=""
End DoDot:4
+35 IF WVSTART>0
Begin DoDot:4
+36 SET WVINDEX(WVSTART,WVEND,$SELECT(+$GET(WVIEN("CONT-START"))>0:WVIEN("CONT-START"),1:WVIEN("START")))=""
SET WVSTART=0
KILL WVIEN("START"),WVIEN("CONT-START")
End DoDot:4
+37 SET WVEND=$$FMADD^XLFDT(WVEND,1)
End DoDot:3
QUIT
+38 IF WVEND=0
Begin DoDot:3
+39 IF WVSTART=0
SET WVEND=$PIECE($PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,0)),U),".")
+40 IF WVSTART>0
Begin DoDot:4
+41 if $GET(WVEND("GUESS"))>0
QUIT
+42 SET WVEND("GUESS")=$SELECT(WVCDE:+$$FMADD^XLFDT(DT,1),1:+$$FMADD^XLFDT($PIECE(WVDATE,"."),-1))
+43 IF WVSTART<=WVEND("GUESS")
SET WVINDEX(WVSTART,WVEND("GUESS"),$SELECT(+$GET(WVIEN("CONT-START"))>0:WVIEN("CONT-START"),1:WVIEN("START")))=""
KILL WVIEN("CONT-START")
+44 IF WVSTART>WVEND("GUESS")
SET WVSTART=0
SET WVEND("GUESS")=$SELECT(WVCDE:DT,1:$PIECE($PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,0)),U),"."))
KILL WVIEN("START")
QUIT
End DoDot:4
End DoDot:3
End DoDot:2
End DoDot:1
+45 IF $GET(WVEND("GUESS"))>0
SET WVEND=+$$FMADD^XLFDT(WVEND("GUESS"),1)
+46 IF WVEND>0
Begin DoDot:1
+47 SET WVINDEX(WVEND,$SELECT(WVEND<DT:DT,1:WVEND),$SELECT($DATA(WVIEN("CONT-END"))=1:WVIEN("CONT-END"),1:WVIEN("END")))=""
End DoDot:1
+48 IF WVSTART>0
IF WVEND=0
SET WVINDEX(WVSTART,DT,$SELECT($DATA(WVIEN("CONT-START"))=1:WVIEN("CONT-START"),1:WVIEN("START")))=""
+49 IF WVSAVE
Begin DoDot:1
+50 KILL ^WV(790,WVDFN,WVNODE,"ALACT")
+51 IF $DATA(WVINDEX)
MERGE ^WV(790,WVDFN,WVNODE,"ALACT")=WVINDEX
End DoDot:1
+52 QUIT
MOA(WVMOA,WVDFN,WVDT) ;RETURN LIKELIHOOD OF BECOMING PREGNANT
+1 ; GIVEN THE METHOD OF CONTRACEPTION
+2 ; INPUT: WVMOA - CONTRACEPTIVE METHOD (NAME OR IEN IN FILE #791)
+3 ; WVDFN - PATIENT IEN IN WV PATIENT FILE (#790)
+4 ; WVDATE - DATE TO USE WHEN CALCULATING THE LIKELIHOOD
+5 ; OUTPUT: 1 - HIGH, 2 - LOW, -1 - Error
+6 if $GET(WVMOA)=""
QUIT -1
+7 NEW WVIEN,WVRETURN
+8 SET WVRETURN=-1
SET WVDT=$GET(WVDT,DT)
SET WVDT=$PIECE(WVDT,".")
+9 SET WVIEN=$SELECT(WVMOA'=+WVMOA:$ORDER(^WV(791,"B",WVMOA,0)),1:WVMOA)
+10 if 'WVIEN
QUIT WVRETURN
+11 IF $DATA(^WV(791,WVIEN,1))
XECUTE ^WV(791,WVIEN,1)
+12 IF '$TEST
SET WVRETURN=$PIECE($GET(^WV(791,WVIEN,0)),U,2)
+13 if WVRETURN<1
SET WVRETURN=-1
+14 QUIT WVRETURN
GETLREC(WVDFN,WVNODE) ;RETURN "IEN^DATE^ENTERED BY^STATUS" OF MOST RECENT PREGNANCY
+1 ; OR LACTATION STATUS RECORD
+2 NEW WVRET,WVSTATUS,WVIEN
+3 SET WVRET=0
+4 SET WVSTATUS=$$ISIT^WVUTL11(WVNODE,WVDFN,DT,"",0,1)
+5 SET WVIEN=+$PIECE(WVSTATUS,U,2)
SET WVSTATUS=$PIECE(WVSTATUS,U)
+6 IF WVIEN>0
Begin DoDot:1
+7 IF 'WVSTATUS
IF WVNODE=4
IF $PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,2)),U)=2
Begin DoDot:2
+8 SET WVSTATUS=2
End DoDot:2
+9 SET WVRET=WVIEN_U_$PIECE($GET(^WV(790,WVDFN,WVNODE,WVIEN,0)),U,1,2)_U_WVSTATUS
End DoDot:1
+10 QUIT WVRET
REM(WVDFN,WVNAME,WVFIEVAL) ;EVALUATE REMINDER DEFINITION
+1 ;RETURN: $$REM => EVAL STATUS
+2 NEW WVPARAMS,WVRESULT,WVREMST
+3 SET WVFIEVAL=+$GET(WVFIEVAL)
+4 SET WVPARAMS("SUB")="WV APPLICABLE"
SET WVPARAMS("DFN")=WVDFN
+5 SET WVPARAMS("REMINDERS",WVNAME)=WVFIEVAL_U_5
+6 DO EN^PXRMGEV(.WVRESULT,.WVPARAMS)
+7 IF $PIECE($GET(^TMP($JOB,"WV APPLICABLE",0)),U)=-1
QUIT ^TMP($JOB,"WV APPLICABLE",0)
+8 SET WVREMST=$PIECE($GET(^TMP($JOB,"WV APPLICABLE",WVNAME)),U)
+9 if 'WVFIEVAL
KILL ^TMP($JOB,"WV APPLICABLE")
+10 IF WVREMST=""
QUIT -1_U_"Reminder "_WVNAME_" evaluation did not return a status."
+11 QUIT WVREMST