VPR1P36 ;SLC/MKB/CMF -- Patch 36 CTP ;9/13/23 10:46
;;1.0;VIRTUAL PATIENT RECORD;**36**;Sep 01, 2011;Build 23
;;Per VHA Directive 6402, this routine should not be modified.
;
;
; This code is called from the HealthShare CallToPopulate utility to
; resend records corrected by VPR*1*36 in:
; Observation - Vital Observations missing Unit of Measure
;
;
ENV ;Main entry point for Environment check point.
;
S XPDABORT=""
D PROGCHK(.XPDABORT) ;checks programmer variables
I XPDABORT="" K XPDABORT
Q
;
;
PROGCHK(XPDABORT) ;checks for necessary programmer variables
;
I '$G(DUZ)!($G(DUZ(0))'="@")!('$G(DT))!($G(U)'="^") D
.D BMES^XPDUTL("*****")
.D MES^XPDUTL("Your programming variables are not set up properly.")
.D MES^XPDUTL("Installation aborted.")
.D MES^XPDUTL("*****")
.S XPDABORT=2
Q
;
;
; This code is called from the HealthShare CallToPopulate utility to
; resend records corrected by VPR*1*36 in:
; Observation - Vital Observations missing Unit of Measure
;
;
EN(START,STOP,TYPE,FMT,PAT,VPRY) ; -- entry point to test CTP
N VPRBDT,VPREDT,VPRTYPE,VPRPAT,VPRPT,VPRFMT,VPRII,VPRN,VPR36
S VPRBDT=$G(START,3190401)
S VPR36=$$PATCH(36)
S VPREDT=$S(+$G(STOP):STOP,VPR36'=0:VPR36,1:DT)
S VPRPAT=$NA(^VPR(1,2)) I $L($G(PAT)) D
. I +PAT=PAT S VPRPT(+PAT)="",VPRPAT="VPRPT" Q
. I ($E(PAT)="^")!($E(PAT)?1.A),$D(@PAT)>9 S VPRPAT=PAT Q
;
S VPRY=$G(VPRY,$NA(^XTMP("VPRP36"))) K @VPRY
S @VPRY@(0)=$$FMADD^XLFDT(DT,7)_U_DT_U_"Call To Populate SDA P36"
S (VPRN,VPRN("D"),VPRN("U"))=0
S VPRFMT=$G(FMT,"OBS"),VPRII=0
;
S VPRTYPE=$G(TYPE,"OBS") ;default=all tags in routine
D CTP
;
D BMES^XPDUTL(" Total results returned: "_VPRN)
D MES^XPDUTL(" #updates: "_$G(VPRN("U")))
D MES^XPDUTL(" #deletes: "_$G(VPRN("D")))
M @VPRY@("Tot")=VPRN
S @VPRY@("Tot")=VPRN_U_VPRN("U")_U_VPRN("D")_U_VPRII
D:$D(@VPRY@("Tot","OBS"))
. D MES^XPDUTL(" #OBS Domain: "_@VPRY@("Tot","OBS"))
Q
;
PATCH(P) ; -- return patch P installation date
N Y,VPRI S P=+$G(P)
S Y=$$INSTALDT^XPDUTL("VPR*1.0*"_P,.VPRI)
I Y S Y=$O(VPRI(0)) ;[first]install date.time
Q Y
;
CTP ; -- main loops,called from VPRZCTP on HealthShare
; Expects VPRBDT,VPREDT,VPRTYPE,VPRPAT,VPRN
N STN,DFN,ICN,VPRT,TAG
S STN=$P($$SITE^VASITE,U,3) Q:$G(VPRTYPE)=""
I '$D(VPRPAT) S VPRPAT=$S($D(VPRPT):"VPRPT",1:$NA(^VPR(1,2)))
S DFN=0 F S DFN=$O(@VPRPAT@(DFN)) Q:DFN<1 D
. S ICN=$$ICN(DFN) Q:ICN<0
. F VPRT=1:1:$L(VPRTYPE,",") S TAG=$P(VPRTYPE,",",VPRT) I $L(TAG) D
.. S TAG=$E($$UP^XLFSTR(TAG),1,8) I $L($T(@TAG)) D @TAG
Q
;
ICN(DFN) ; -- return ICN or -1^invalid
N Y I $G(DFN)<1 S Y="-1^ERROR" G ICQ
I '$D(^DPT(DFN,0)) S Y="-1^UNDEFINED" G ICQ
I '$D(^VPR(1,2,+$G(DFN),0)) S Y="-1^UNSUBSCRIBED" G ICQ
I $$MERGED^VPRHS(DFN) S Y="-1^MERGED" G ICQ
S Y=$$GETICN^MPIF001(DFN) ;-1^error or ICN
ICQ ;exit
Q Y
;
POST(TYPE,ID,ACT,VST) ; -- post an update to
; @VPRY@(SEQ) = ICN ^ TYPE ^ ID ^ U/D ^ VISIT# ^ DFN
;
S TYPE=$G(TYPE),ID=$G(ID) Q:TYPE="" Q:ID=""
S ACT=$S($G(ACT)="@":"D",1:"U")
; add/update list
S VPRN(TAG)=+$G(VPRN(TAG))+1
S VPRN(ACT)=+$G(VPRN(ACT))+1
S VPRN=+$G(VPRN)+1,VPRII=+$G(VPRII)+1
I VPRFMT'="CNT" D ;include data node, if not just counts
. S @VPRY@(VPRII)=$G(ICN)_U_$G(TYPE)_U_$G(ID)_U_$G(ACT)_U_$G(VST)_U_DFN
S @VPRY@("DFN",DFN,VPRII)=""
S @VPRY@("DOMAIN",DFN,TYPE,VPRII)=""
Q
;
OBS ; -- Vital Observations missing Unit of Measure
; Expects DFN,VPRBDT,VPREDT,VPRN
N GMRVSTR,VPRIDT,VPRTYP,ID,X0,TYP,GUID,DMAX,DRANGE
S GMRVSTR="BP;T;R;P;HT;WT;CVP;CG;PO2;PN" ;CPRS vitals data set
S DMAX=99999
S GMRVSTR(0)=$G(VPRBDT)_U_$G(VPREDT)_U_DMAX_U_1
D EN1^GMRVUT0
S VPRIDT=0 F S VPRIDT=$O(^UTILITY($J,"GMRVD",VPRIDT)) Q:VPRIDT<1 D Q:VPRN'<DMAX
. S VPRTYP="" F S VPRTYP=$O(^UTILITY($J,"GMRVD",VPRIDT,VPRTYP)) Q:VPRTYP="" D
.. S ID=$O(^UTILITY($J,"GMRVD",VPRIDT,VPRTYP,0)) Q:'ID
.. S X0=$G(^UTILITY($J,"GMRVD",VPRIDT,VPRTYP,ID))
.. S TYP=$P(X0,U,3)
.. Q:TYP=""
.. D POST("Observation",ID_";120.5","U") ; Send update with Unit of Measure
K ^UTILITY($J,"GMRVD")
Q
;
;
PO ;Main entry point for Post-init items.
; Queue off predictor to run after 10:00pm
D BMES^XPDUTL(" Queuing CTP predictor to run after 10:00pm.")
N DAY,DONE,QQ,TIME,ZTIO,ZTSK,ZTRTN,ZTDESC,ZTSAVE,ZTDTH,Y
S ZTIO="",ZTRTN="PREDICTOR^VPR1P36"
;schedule job after 10:00pm
K SCH S QQ=$$NOW^XLFDT,DAY=$P(QQ,"."),TIME=$P(QQ,".",2)
I TIME<"215900" S SCH=DAY_".2205"
I TIME>"220000" S SCH=$$NOW^XLFDT
S ZTDTH=SCH
S ZTDESC="VPR*1*36 post-install of CTP predictor."
D ^%ZTLOAD
I '$G(ZTSK) D MES^XPDUTL(" **** Queuing CTP predictor failed!!!") Q
D MES^XPDUTL(" Job number #"_ZTSK_" was queued.")
Q
;
PREDICTOR ;-- capture CTP predictor as Post Init on patch install (optional)
N VPRPRED
D EN(,,"OBS","CNT",,.VPRPRED)
;
MSG ; add post message and send to VPR developers in Outlook
N VPRN,LINE,VPRSITE
S VPRSITE=$$SITE^VASITE
I $D(@VPRPRED@("Tot")) S VPRN=@VPRPRED@("Tot")
;I 'VPRN Q
S LINE=1
S VPRMSG(LINE,0)="There's been a VPR*1*36 PREDICTOR run at site: "_+(VPRSITE)_"." S LINE=LINE+1
S VPRMSG(LINE,0)=" ",LINE=LINE+1
S VPRMSG(LINE,0)="Total 'Observation' results returned: "_$P(VPRN,U),LINE=LINE+1
S VPRMSG(LINE,0)=" #updates: "_$P(VPRN,U,2),LINE=LINE+1
S VPRMSG(LINE,0)=" #deletes: "_$P(VPRN,U,3),LINE=LINE+1
D:$D(@VPRPRED@("Tot","OBS"))
. S VPRMSG(LINE,0)=" #OBS Domain: "_@VPRPRED@("Tot","OBS")
S VPRMSG(LINE,0)=" " S LINE=LINE+1
N XMSUB,XMDUZ,XMY,XMTEXT,XMDUN
S XMSUB="VPR*1*36 >> PREDICTOR TASK COMPLETED AT SITE: #"_+(VPRSITE)
S XMDUZ=.5
K XMY
S XMY(DUZ)=""
S XMY("liana.buciuman@domain.ext")=""
S XMY("m.robert.yorty@domain.ext")=""
S XMTEXT="VPRMSG(" D ^XMD
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HVPR1P36 5878 printed Sep 23, 2025@20:20:44 Page 2
VPR1P36 ;SLC/MKB/CMF -- Patch 36 CTP ;9/13/23 10:46
+1 ;;1.0;VIRTUAL PATIENT RECORD;**36**;Sep 01, 2011;Build 23
+2 ;;Per VHA Directive 6402, this routine should not be modified.
+3 ;
+4 ;
+5 ; This code is called from the HealthShare CallToPopulate utility to
+6 ; resend records corrected by VPR*1*36 in:
+7 ; Observation - Vital Observations missing Unit of Measure
+8 ;
+9 ;
ENV ;Main entry point for Environment check point.
+1 ;
+2 SET XPDABORT=""
+3 ;checks programmer variables
DO PROGCHK(.XPDABORT)
+4 IF XPDABORT=""
KILL XPDABORT
+5 QUIT
+6 ;
+7 ;
PROGCHK(XPDABORT) ;checks for necessary programmer variables
+1 ;
+2 IF '$GET(DUZ)!($GET(DUZ(0))'="@")!('$GET(DT))!($GET(U)'="^")
Begin DoDot:1
+3 DO BMES^XPDUTL("*****")
+4 DO MES^XPDUTL("Your programming variables are not set up properly.")
+5 DO MES^XPDUTL("Installation aborted.")
+6 DO MES^XPDUTL("*****")
+7 SET XPDABORT=2
End DoDot:1
+8 QUIT
+9 ;
+10 ;
+11 ; This code is called from the HealthShare CallToPopulate utility to
+12 ; resend records corrected by VPR*1*36 in:
+13 ; Observation - Vital Observations missing Unit of Measure
+14 ;
+15 ;
EN(START,STOP,TYPE,FMT,PAT,VPRY) ; -- entry point to test CTP
+1 NEW VPRBDT,VPREDT,VPRTYPE,VPRPAT,VPRPT,VPRFMT,VPRII,VPRN,VPR36
+2 SET VPRBDT=$GET(START,3190401)
+3 SET VPR36=$$PATCH(36)
+4 SET VPREDT=$SELECT(+$GET(STOP):STOP,VPR36'=0:VPR36,1:DT)
+5 SET VPRPAT=$NAME(^VPR(1,2))
IF $LENGTH($GET(PAT))
Begin DoDot:1
+6 IF +PAT=PAT
SET VPRPT(+PAT)=""
SET VPRPAT="VPRPT"
QUIT
+7 IF ($EXTRACT(PAT)="^")!($EXTRACT(PAT)?1.A)
IF $DATA(@PAT)>9
SET VPRPAT=PAT
QUIT
End DoDot:1
+8 ;
+9 SET VPRY=$GET(VPRY,$NAME(^XTMP("VPRP36")))
KILL @VPRY
+10 SET @VPRY@(0)=$$FMADD^XLFDT(DT,7)_U_DT_U_"Call To Populate SDA P36"
+11 SET (VPRN,VPRN("D"),VPRN("U"))=0
+12 SET VPRFMT=$GET(FMT,"OBS")
SET VPRII=0
+13 ;
+14 ;default=all tags in routine
SET VPRTYPE=$GET(TYPE,"OBS")
+15 DO CTP
+16 ;
+17 DO BMES^XPDUTL(" Total results returned: "_VPRN)
+18 DO MES^XPDUTL(" #updates: "_$GET(VPRN("U")))
+19 DO MES^XPDUTL(" #deletes: "_$GET(VPRN("D")))
+20 MERGE @VPRY@("Tot")=VPRN
+21 SET @VPRY@("Tot")=VPRN_U_VPRN("U")_U_VPRN("D")_U_VPRII
+22 if $DATA(@VPRY@("Tot","OBS"))
Begin DoDot:1
+23 DO MES^XPDUTL(" #OBS Domain: "_@VPRY@("Tot","OBS"))
End DoDot:1
+24 QUIT
+25 ;
PATCH(P) ; -- return patch P installation date
+1 NEW Y,VPRI
SET P=+$GET(P)
+2 SET Y=$$INSTALDT^XPDUTL("VPR*1.0*"_P,.VPRI)
+3 ;[first]install date.time
IF Y
SET Y=$ORDER(VPRI(0))
+4 QUIT Y
+5 ;
CTP ; -- main loops,called from VPRZCTP on HealthShare
+1 ; Expects VPRBDT,VPREDT,VPRTYPE,VPRPAT,VPRN
+2 NEW STN,DFN,ICN,VPRT,TAG
+3 SET STN=$PIECE($$SITE^VASITE,U,3)
if $GET(VPRTYPE)=""
QUIT
+4 IF '$DATA(VPRPAT)
SET VPRPAT=$SELECT($DATA(VPRPT):"VPRPT",1:$NAME(^VPR(1,2)))
+5 SET DFN=0
FOR
SET DFN=$ORDER(@VPRPAT@(DFN))
if DFN<1
QUIT
Begin DoDot:1
+6 SET ICN=$$ICN(DFN)
if ICN<0
QUIT
+7 FOR VPRT=1:1:$LENGTH(VPRTYPE,",")
SET TAG=$PIECE(VPRTYPE,",",VPRT)
IF $LENGTH(TAG)
Begin DoDot:2
+8 SET TAG=$EXTRACT($$UP^XLFSTR(TAG),1,8)
IF $LENGTH($TEXT(@TAG))
DO @TAG
End DoDot:2
End DoDot:1
+9 QUIT
+10 ;
ICN(DFN) ; -- return ICN or -1^invalid
+1 NEW Y
IF $GET(DFN)<1
SET Y="-1^ERROR"
GOTO ICQ
+2 IF '$DATA(^DPT(DFN,0))
SET Y="-1^UNDEFINED"
GOTO ICQ
+3 IF '$DATA(^VPR(1,2,+$GET(DFN),0))
SET Y="-1^UNSUBSCRIBED"
GOTO ICQ
+4 IF $$MERGED^VPRHS(DFN)
SET Y="-1^MERGED"
GOTO ICQ
+5 ;-1^error or ICN
SET Y=$$GETICN^MPIF001(DFN)
ICQ ;exit
+1 QUIT Y
+2 ;
POST(TYPE,ID,ACT,VST) ; -- post an update to
+1 ; @VPRY@(SEQ) = ICN ^ TYPE ^ ID ^ U/D ^ VISIT# ^ DFN
+2 ;
+3 SET TYPE=$GET(TYPE)
SET ID=$GET(ID)
if TYPE=""
QUIT
if ID=""
QUIT
+4 SET ACT=$SELECT($GET(ACT)="@":"D",1:"U")
+5 ; add/update list
+6 SET VPRN(TAG)=+$GET(VPRN(TAG))+1
+7 SET VPRN(ACT)=+$GET(VPRN(ACT))+1
+8 SET VPRN=+$GET(VPRN)+1
SET VPRII=+$GET(VPRII)+1
+9 ;include data node, if not just counts
IF VPRFMT'="CNT"
Begin DoDot:1
+10 SET @VPRY@(VPRII)=$GET(ICN)_U_$GET(TYPE)_U_$GET(ID)_U_$GET(ACT)_U_$GET(VST)_U_DFN
End DoDot:1
+11 SET @VPRY@("DFN",DFN,VPRII)=""
+12 SET @VPRY@("DOMAIN",DFN,TYPE,VPRII)=""
+13 QUIT
+14 ;
OBS ; -- Vital Observations missing Unit of Measure
+1 ; Expects DFN,VPRBDT,VPREDT,VPRN
+2 NEW GMRVSTR,VPRIDT,VPRTYP,ID,X0,TYP,GUID,DMAX,DRANGE
+3 ;CPRS vitals data set
SET GMRVSTR="BP;T;R;P;HT;WT;CVP;CG;PO2;PN"
+4 SET DMAX=99999
+5 SET GMRVSTR(0)=$GET(VPRBDT)_U_$GET(VPREDT)_U_DMAX_U_1
+6 DO EN1^GMRVUT0
+7 SET VPRIDT=0
FOR
SET VPRIDT=$ORDER(^UTILITY($JOB,"GMRVD",VPRIDT))
if VPRIDT<1
QUIT
Begin DoDot:1
+8 SET VPRTYP=""
FOR
SET VPRTYP=$ORDER(^UTILITY($JOB,"GMRVD",VPRIDT,VPRTYP))
if VPRTYP=""
QUIT
Begin DoDot:2
+9 SET ID=$ORDER(^UTILITY($JOB,"GMRVD",VPRIDT,VPRTYP,0))
if 'ID
QUIT
+10 SET X0=$GET(^UTILITY($JOB,"GMRVD",VPRIDT,VPRTYP,ID))
+11 SET TYP=$PIECE(X0,U,3)
+12 if TYP=""
QUIT
+13 ; Send update with Unit of Measure
DO POST("Observation",ID_";120.5","U")
End DoDot:2
End DoDot:1
if VPRN'<DMAX
QUIT
+14 KILL ^UTILITY($JOB,"GMRVD")
+15 QUIT
+16 ;
+17 ;
PO ;Main entry point for Post-init items.
+1 ; Queue off predictor to run after 10:00pm
+2 DO BMES^XPDUTL(" Queuing CTP predictor to run after 10:00pm.")
+3 NEW DAY,DONE,QQ,TIME,ZTIO,ZTSK,ZTRTN,ZTDESC,ZTSAVE,ZTDTH,Y
+4 SET ZTIO=""
SET ZTRTN="PREDICTOR^VPR1P36"
+5 ;schedule job after 10:00pm
+6 KILL SCH
SET QQ=$$NOW^XLFDT
SET DAY=$PIECE(QQ,".")
SET TIME=$PIECE(QQ,".",2)
+7 IF TIME<"215900"
SET SCH=DAY_".2205"
+8 IF TIME>"220000"
SET SCH=$$NOW^XLFDT
+9 SET ZTDTH=SCH
+10 SET ZTDESC="VPR*1*36 post-install of CTP predictor."
+11 DO ^%ZTLOAD
+12 IF '$GET(ZTSK)
DO MES^XPDUTL(" **** Queuing CTP predictor failed!!!")
QUIT
+13 DO MES^XPDUTL(" Job number #"_ZTSK_" was queued.")
+14 QUIT
+15 ;
PREDICTOR ;-- capture CTP predictor as Post Init on patch install (optional)
+1 NEW VPRPRED
+2 DO EN(,,"OBS","CNT",,.VPRPRED)
+3 ;
MSG ; add post message and send to VPR developers in Outlook
+1 NEW VPRN,LINE,VPRSITE
+2 SET VPRSITE=$$SITE^VASITE
+3 IF $DATA(@VPRPRED@("Tot"))
SET VPRN=@VPRPRED@("Tot")
+4 ;I 'VPRN Q
+5 SET LINE=1
+6 SET VPRMSG(LINE,0)="There's been a VPR*1*36 PREDICTOR run at site: "_+(VPRSITE)_"."
SET LINE=LINE+1
+7 SET VPRMSG(LINE,0)=" "
SET LINE=LINE+1
+8 SET VPRMSG(LINE,0)="Total 'Observation' results returned: "_$PIECE(VPRN,U)
SET LINE=LINE+1
+9 SET VPRMSG(LINE,0)=" #updates: "_$PIECE(VPRN,U,2)
SET LINE=LINE+1
+10 SET VPRMSG(LINE,0)=" #deletes: "_$PIECE(VPRN,U,3)
SET LINE=LINE+1
+11 if $DATA(@VPRPRED@("Tot","OBS"))
Begin DoDot:1
+12 SET VPRMSG(LINE,0)=" #OBS Domain: "_@VPRPRED@("Tot","OBS")
End DoDot:1
+13 SET VPRMSG(LINE,0)=" "
SET LINE=LINE+1
+14 NEW XMSUB,XMDUZ,XMY,XMTEXT,XMDUN
+15 SET XMSUB="VPR*1*36 >> PREDICTOR TASK COMPLETED AT SITE: #"_+(VPRSITE)
+16 SET XMDUZ=.5
+17 KILL XMY
+18 SET XMY(DUZ)=""
+19 SET XMY("liana.buciuman@domain.ext")=""
+20 SET XMY("m.robert.yorty@domain.ext")=""
+21 SET XMTEXT="VPRMSG("
DO ^XMD
+22 QUIT