GMRA72P ;HDSO/RJH - GMRA*4.0*72 Post-install routine; Feb 5, 2024@16:00
;;4.0;ADVERSE REACTION TRACKING;**72**; 30 Oct 98;Build 5
;
;
; Note: The routine is not deleted after install since it is tasked and the
; BACKOUT functionality needs to remain available. A future patch can
; be used to delete the routine, if needed.
;
Q ; Must be run from a specific tag
;
; ============================================================================
;
EN ; Main entry point
D BMES^XPDUTL(" ")
D BMES^XPDUTL(" The GMRA*4.0*72 Post-Install Routine will scan the PATIENT ALLERGIES file")
D MES^XPDUTL(" file (#120.8) for pointers to inactive drug records in the GMR ALLERGY")
D MES^XPDUTL(" file (#120.82). If found, this patch will attempt to correct those records.")
;
N GMRADUZ,ZTRTN,ZTDESC,ZTIO,ZTDTH,ZTSAVE,ZTQUEUED,ZTREQ,ZTSK
S ZTRTN="START^GMRA72P"
S ZTDESC="GMRA*4.0*72 Post-Install Routine"
S ZTIO="",ZTDTH=$H
S GMRADUZ=DUZ
S ZTSAVE("GMRADUZ")=""
D ^%ZTLOAD
;
D BMES^XPDUTL(" The GMRA*4.0*72 Post-Install Routine has been tasked.")
D MES^XPDUTL(" Task Number: "_$G(ZTSK))
D MES^XPDUTL(" You will receive MailMan messages when it completes.")
D BMES^XPDUTL(" ")
Q
;
START ; Start the correction process
N GMRASUB,GMRAFROM,GMRATEXT
S GMRANODE="GMRA*4.0*72 POST INSTALL"
;
; Next line in case the patch is installed and backed out multiple times
I $D(^XTMP("GMRA*4.0*72 BACKOUT")) D CHKDUPES
;
S ^XTMP(GMRANODE,0)=$$FMADD^XLFDT(DT,90)_"^"_DT_"^GMRA*4.0*72 POST INSTALL"
D GMRA
S:$D(ZTQUEUED) ZTREQ="@"
Q
;
CHKDUPES ; Look for record IDs found in both the FIXED and BACKOUT nodes caused
; by an early version of this functionality
; ^XTMP("GMRA*4.0*72 BACKOUT",0)="3240904^3240606^GMRA*4.0*72 BACKOUT"
; ^XTMP("GMRA*4.0*72 POST INSTALL",0)="3240903^3240605^GMRA*4.0*72 POST INSTALL"
N BKDT,FXDT,RECIEN
S BKDT=$P($G(^XTMP("GMRA*4.0*72 BACKOUT",0)),"^",2)
S FXDT=$P($G(^XTMP("GMRA*4.0*72 POST INSTALL",0)),"^",2)
I BKDT'<FXDT D
. S RECIEN=0
. F S RECIEN=$O(^XTMP("GMRA*4.0*72 BACKOUT",0,RECIEN)) Q:'RECIEN D
.. I $D(^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",RECIEN)) K ^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",RECIEN)
.. Q
. Q
;
Q
;
GMRA ; Fix records in the PATIENT ALLERGY file (120.8)
; INC30029401 - find inactive GMRA allergies in the Patient Allergy file.
; Search the 120.8 Patient Allergy file to find allergies that are marked as
; inactive in the GMR Allergy file (#120.82)
N ALGIEN,NODE0,PT,GMRALGY,GMRIEN,ALGYNAME,STATUS,ERRMSG,ACTVDT,DTIEN,DTDATA
N DTCNT,PREVSTS,STOP,ERRCNT,RECCNT,GMRCNT,ALGYTYPE,LASTDT,FIXCNT,PT,DEADCNT
N TESTCNT,GMRANODE
;
S GMRANODE="GMRA*4.0*72 POST INSTALL"
S (ALGIEN,RECCNT,ERRCNT,FIXCNT,DEADCNT,TESTCNT)=0
F S ALGIEN=$O(^GMR(120.8,ALGIEN)) Q:'ALGIEN D
. S RECCNT=RECCNT+1
. Q:$D(^GMR(120.8,ALGIEN,"ER")) ; Entered in Error
. ;
. S NODE0=$G(^GMR(120.8,ALGIEN,0)) Q:NODE0=""
. S PT=$P(NODE0,"^",1) Q:PT=""
. I +$P($G(^DPT(PT,.35)),"^",1) S DEADCNT=DEADCNT+1 Q ; Deceased Patient
. I $$TESTPAT^VADPT(PT) S TESTCNT=TESTCNT+1 Q ; Test patient
. ;
. S GMRALGY=$P(NODE0,"^",3) Q:GMRALGY=""
. I GMRALGY'["GMRD(120.82" Q ; GMR Allergies only
. I $$GET1^DIQ(120.8,ALGIEN,3.1)'["DRUG" Q ; Drug allergies only
. ;
. S GMRIEN=$P(GMRALGY,";",1) Q:GMRIEN=""
. I '$D(^GMRD(120.82,GMRIEN)) Q
. I '$D(^GMRD(120.82,GMRIEN,"VUID")) D FIXIT Q
. S STATUS=$$CHKACTV("^GMRD(120.82",GMRIEN)
. I 'STATUS D FIXIT ; Inactive/bad record
. Q
;
D SUMMARY
D REPORT("FIXED",0),REPORT("NOTFIXED",0)
Q
;
FIXIT ; Try to find a matching drug in #50.6 and fix the record
N FIXED,PIEN,FDA,FILEERR,COMMENT
S FIXED=0
S ERRCNT=ERRCNT+1
; Next line - ALGYNAME = REACTANT (File 120.8, field# .02)
S ALGYNAME=$P(NODE0,"^",2) Q:ALGYNAME=""
S PIEN=$O(^PSNDF(50.6,"B",ALGYNAME,"")) I PIEN="" D Q
. S ^XTMP("GMRA*4.0*72 POST INSTALL",0,"NOTFIXED",ALGIEN)=NODE0
. Q
;
S STATUS=$$CHKACTV("^PSNDF(50.6",PIEN)
I STATUS D REBUILD
;
I 'FIXED S ^XTMP("GMRA*4.0*72 POST INSTALL",0,"NOTFIXED",ALGIEN)=NODE0
; Next line in case a site ran a previous version of the patch
I FIXED,$D(^XTMP("GMRA*4.0*72 POST INSTALL",0,"NOTFIXED",ALGIEN)) D
. K ^XTMP("GMRA*4.0*72 POST INSTALL",0,"NOTFIXED",ALGIEN)
. Q
;
K FDA,FILEERR
Q
;
REBUILD ; Rebuild piece 3 of ^GMR(120.8,ien,0) here and add a comment
S FDA(120.8,ALGIEN_",",1)=PIEN_";PSNDF(50.6"_","
D FILE^DIE("","FDA","FILEERR")
I $D(FILEERR) Q
D FNDVADC I 'FIXED S ^GMR(120.8,ALGIEN,0)=NODE0 Q
;
S FIXED=1,FIXCNT=FIXCNT+1
S ^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",ALGIEN)=NODE0
;
; Add a comment for this update
S COMMENT="Updated using GMRA*4.0*72 Post-Install routine. Changed inactive "
S COMMENT=COMMENT_"GMRA reactant from file 120.82 to matching active "
S COMMENT=COMMENT_"reactant #"_PIEN_" from file 50.6."
D ADCOM^GMRAFX(ALGIEN,"O",COMMENT) ;Add a comment for this update
Q
;
FNDVADC ; Find the VA Drug Class(es) associated with this drug
N VADC,VADCPTR,VFDA,VFILEERR,VADCFND
S VADCFND=+$P($G(^GMR(120.8,ALGIEN,3,0)),"^",4) ; VA Drug Class counter
S FIXED=$S(VADCFND:1,1:0)
;
I '$D(^PSNDF(50.6,"APRO")) Q
I '$D(^PSNDF(50.6,"APRO",PIEN)) Q
;
S VADC=""
F S VADC=$O(^PSNDF(50.6,"APRO",PIEN,VADC)) Q:'VADC D
. S VADCPTR=$$GET1^DIQ(50.68,VADC,15,"I") ;Pointer to #50.605
. Q:VADCPTR=""
. Q:$D(^GMR(120.8,ALGIEN,3,"B",VADCPTR)) ;Already present
. S STATUS=$$CHKACTV("^PS(50.605",VADCPTR)
. I 'STATUS Q
. S VFDA(120.803,"+1,"_ALGIEN_",",.01)=VADCPTR
. D UPDATE^DIE("","VFDA","","VFILEERR")
. I $D(VFILEERR) K VFDA,VFILEERR Q
. S FIXED=1
. S ^XTMP(GMRANODE,0,"FIXED",ALGIEN,3,VADCPTR)=""
. K VFDA,VFILEERR
. Q
;
Q
;
; ----------------------------------------------------------------------------
CHKACTV(CHKGBL,AIEN) ; Check to see if an item is active
N STRING
S STATUS=0
S STRING="""TERMSTATUS"""_")"
S CHKGBL=CHKGBL_","_AIEN_","_STRING
S LASTDT=$O(@CHKGBL@("B","9999999"),-1) I LASTDT="" Q STATUS
S DTIEN=$O(@CHKGBL@("B",LASTDT,""),-1) I DTIEN="" Q STATUS
S DTDATA=$G(@CHKGBL@(DTIEN,0)) I DTDATA="" Q STATUS
S STATUS=$P(DTDATA,"^",2)
Q STATUS
;
SUMMARY ; Summary of results
S ^XTMP(GMRANODE,0,"SUMMARY",1)=" "
S ^XTMP(GMRANODE,0,"SUMMARY",2)="********** GMRA*4.0*72 Post-Install Routine Summary Report **********"
S ^XTMP(GMRANODE,0,"SUMMARY",3)=" "
S ^XTMP(GMRANODE,0,"SUMMARY",4)=" Process was run by "_$$GET1^DIQ(200,DUZ,.01)_" on "_$$FMTE^XLFDT(DT)
S ^XTMP(GMRANODE,0,"SUMMARY",5)=" "
S ^XTMP(GMRANODE,0,"SUMMARY",6)="Total Patient Allergy records examined = "_$J(RECCNT,7)
S ^XTMP(GMRANODE,0,"SUMMARY",7)=" Deceased patient bad records found = "_$J(DEADCNT,7)
S ^XTMP(GMRANODE,0,"SUMMARY",8)=" Test patient bad records found = "_$J(TESTCNT,7)
S ^XTMP(GMRANODE,0,"SUMMARY",9)=" "
S ^XTMP(GMRANODE,0,"SUMMARY",10)=" Total active bad records found = "_$J(ERRCNT,7)
S ^XTMP(GMRANODE,0,"SUMMARY",11)="Bad records that could not be repaired = "_$J(ERRCNT-FIXCNT,7)
S ^XTMP(GMRANODE,0,"SUMMARY",12)=" _______"
S ^XTMP(GMRANODE,0,"SUMMARY",13)=" Bad records fixed = "_$J(FIXCNT,7)
S ^XTMP(GMRANODE,0,"SUMMARY",14)=" "
S ^XTMP(GMRANODE,0,"SUMMARY",15)=" The original version of the corrected records, if any, are stored for"
S ^XTMP(GMRANODE,0,"SUMMARY",16)=" 90 days at ^XTMP(""GMRA*4.0*72 POST INSTALL"",0,""FIXED"",recordID)."
S ^XTMP(GMRANODE,0,"SUMMARY",17)=" "
S ^XTMP(GMRANODE,0,"SUMMARY",18)="*************************** End of Report ****************************"
;
; Send MailMan message to installer and users with GMRA SUPERVISOR or PSNMGR key
S GMRASUB="GMRA*4.0*72 Post-Install Summary Information"
S GMRAFROM="GMRA*4.0*72 Post-Install"
S GMRATEXT="^XTMP(""GMRA*4.0*72 POST INSTALL"",0,""SUMMARY"")"
D MAILMSG(GMRASUB,GMRAFROM,GMRATEXT)
Q
;
; ============================================================================
BACKOUT ; Run this from the programmer's prompt if patch backout is required
W #
N DIR,Y
S DIR("A",1)="This action will back out the file modifications that were performed"
S DIR("A",2)="after the install of GMRA*4.0*72."
S DIR("A",3)=""
S DIR("A")="Are you sure you wish to proceed",DIR("B")="NO",DIR(0)="Y"
D ^DIR
Q:Y<1
;
I '$D(^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED")) D Q
. W !!,"No converted records were found that can be backed out. Quitting...",!!
. Q
;
N GMBKNODE,GMRADUZ,GMRBKOK,GMRNOBK,GMRIEN,GMRAREC,GMRATEXT,GMRAMY,GMRASUB,GMRAMIN
N GMRAMZ,GMRAFROM,GMRCNT,GMRCMTDT,GMRCMT,GMRCMTERR
;
S GMBKNODE="GMRA*4.0*72 BACKOUT"
S GMRADUZ=DUZ
S ^XTMP(GMBKNODE,0)=$$FMADD^XLFDT(DT,90)_"^"_DT_"^GMRA*4.0*72 BACKOUT"
;
W !!,"Please wait until the backout completes."
W !,"Working...",!
D BKRECS
;
K DIR
N DIR
S DIR("A",1)="A MailMan message has been sent to you as well as holders"
S DIR("A",2)="of the GMRA-SUPERVISOR or PSNMGR security keys."
S DIR("A",3)=""
S DIR("A")="Press any key to continue"
S DIR(0)="E" D ^DIR
Q
;
BKRECS ; Restore the previous (erroneous) records back to ^GMR(120.8,ien,0)
N FDA,FILEERR,VADCPTR,VADCNODE,VFDA,VFILEERR,VADCERR
S (GMRIEN,GMRBKOK,GMRNOBK,GMRCMTERR,VADCERR)=0
;
; ^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",ALGIEN)=NODE0
F S GMRIEN=$O(^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",GMRIEN)) Q:GMRIEN="" D
. I '$D(^GMR(120.8,GMRIEN)) S GMRNOBK=GMRNOBK+1 Q ; This should never happen
. S ^XTMP(GMBKNODE,0,"BACKOUT",GMRIEN)=^GMR(120.8,GMRIEN,0)
. S ^GMR(120.8,GMRIEN,0)=^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",GMRIEN)
. ;
. ; Back out VA Drug Class(es) added during repair
. I $D(^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",GMRIEN,3)) D BKVADC
. ;
. ; Back out the comment added during repair
. S GMRCMTDT=9999999
. K FDA,FILEERR
. F S GMRCMTDT=$O(^GMR(120.8,GMRIEN,26,"B",GMRCMTDT),-1) Q:GMRCMTDT="" D
.. S GMRCNT=$O(^GMR(120.8,GMRIEN,26,"B",GMRCMTDT,"")) Q:GMRCNT=""
.. S GMRCMT=$G(^GMR(120.8,GMRIEN,26,GMRCNT,2,1,0)) Q:GMRCMT=""
.. I GMRCMT["Updated using GMRA*4.0*72" D
... S FDA(120.826,GMRCNT_","_GMRIEN_",",.01)="@"
... D FILE^DIE("","FDA","FILEERR")
... I $D(FILEERR) S ^XTMP(GMBKNODE,0,"BACKOUT",GMRIEN,"CMTERR")="",GMRCMTERR=GMRCMTERR+1
... Q
.. Q
. S GMRBKOK=GMRBKOK+1
. K ^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",GMRIEN)
. Q
;
D BKSMRY
Q
;
BKVADC ; Back out the VA Drug Class updates
S VADCPTR=0
F S VADCPTR=$O(^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",GMRIEN,3,VADCPTR)) Q:'VADCPTR D
. S VADCNODE=$O(^GMR(120.8,GMRIEN,3,"B",VADCPTR,"")) Q:VADCNODE=""
. S VFDA(120.803,VADCNODE_","_GMRIEN_",",.01)="@"
. D FILE^DIE("","VFDA","VFILEERR")
. I $D(VFILEERR) S ^XTMP(GMBKNODE,0,"BACKOUT",GMRIEN,"VADCERR",VADCPTR)="",VADCERR=VADCERR+1
. K VFDA,VFILEERR
. Q
;
Q
;
BKSMRY ; Summary of the backout results
S ^XTMP(GMBKNODE,0,"SUMMARY",1)=" "
S ^XTMP(GMBKNODE,0,"SUMMARY",2)="**************** GMRA*4.0*72 Rollback Summary Report ****************"
S ^XTMP(GMBKNODE,0,"SUMMARY",3)=" "
S ^XTMP(GMBKNODE,0,"SUMMARY",4)=" Backout was run by "_$$GET1^DIQ(200,DUZ,.01)_" on "_$$FMTE^XLFDT(DT)
S ^XTMP(GMBKNODE,0,"SUMMARY",5)=" "
S ^XTMP(GMBKNODE,0,"SUMMARY",6)=" Number of records not rolled back: "_GMRNOBK
S ^XTMP(GMBKNODE,0,"SUMMARY",7)=" Number of records rolled back: "_GMRBKOK
S ^XTMP(GMBKNODE,0,"SUMMARY",8)=" Number of comment backout errors: "_GMRCMTERR
S ^XTMP(GMBKNODE,0,"SUMMARY",9)=" Number of VA Drug Class backout errors: "_VADCERR
S ^XTMP(GMBKNODE,0,"SUMMARY",10)=" "
S ^XTMP(GMBKNODE,0,"SUMMARY",11)=" The previously corrected records will be saved for 90 days at"
S ^XTMP(GMBKNODE,0,"SUMMARY",12)=" ^XTMP(""GMRA*4.0*72 BACKOUT"",0,""BACKOUT"",recordID)."
S ^XTMP(GMBKNODE,0,"SUMMARY",13)=" with errors encountered during comment backout, if any, at"
S ^XTMP(GMBKNODE,0,"SUMMARY",14)=" ^XTMP(""GMRA*4.0*72 BACKOUT"",0,""BACKOUT"",recordID,""CMTERR"")"
S ^XTMP(GMBKNODE,0,"SUMMARY",15)=" and errors encountered during VA Drug Class backout, if any, at"
S ^XTMP(GMBKNODE,0,"SUMMARY",16)=" ^XTMP(""GMRA*4.0*72 BACKOUT"",0,""BACKOUT"",recordID,""VADCERR"")"
S ^XTMP(GMBKNODE,0,"SUMMARY",17)=" "
S ^XTMP(GMBKNODE,0,"SUMMARY",18)=" The text of this message will also be stored for 90 days at"
S ^XTMP(GMBKNODE,0,"SUMMARY",19)=" ^XTMP(""GMRA*4.0*72 BACKOUT"",0,""SUMMARY""."
S ^XTMP(GMBKNODE,0,"SUMMARY",20)=" "
S ^XTMP(GMBKNODE,0,"SUMMARY",21)="*************************** End of Report ****************************"
;
; Send MailMan message with backout info to appropriate group
S GMRASUB="GMRA*4.0*72 Backout Information"
S GMRAFROM="GMRA*4.0*72 BACKOUT"
S GMRATEXT="^XTMP(""GMRA*4.0*72 BACKOUT"",0,""SUMMARY"")"
D MAILMSG(GMRASUB,GMRAFROM,GMRATEXT)
Q
;
; ============================================================================
REPORT(TYPE,LOCAL) ; Common report data
; Local = report run from prompt = 1, otherwise 0
N RPTIEN,RPTDATA,RPTNAME,RPTFILE,RPTFLIEN,RPTPT,RPTPTNM,RPTNODE,RPTSS,RPTLN
N RPTFTR,RPTRECS,RPTCERR,RPTSUB,RPTFROM,RPTTEXT,RPTSTOP,NORECS,DLM
S:$G(TYPE)="" TYPE=""
S:$G(LOCAL)="" LOCAL=1
S RPTSS=$S(TYPE["FIX":"GMRA*4.0*72 POST INSTALL",1:"GMRA*4.0*72 BACKOUT")
S RPTNODE="GMRA*4.0*72 POST INSTALL"
S RPTRECS=$S(TYPE="FIXED":"Fixed",TYPE="NOTFIXED":"Unfixed",1:"Backed Out")_" Records "
S RPTFTR="*************************** End of Report ***************************"
S RPTSUB="GMRA*4.0*72 "_TYPE_" Record Report Information"
S RPTFROM="GMRA*4.0*72 REPORT"
S RPTTEXT="^XTMP(""GMRA*4.0*72 POST INSTALL"",0,""REPORT"")"
S (RPTSTOP,NORECS)=0,DLM="^"
;
I LOCAL D Q:RPTSTOP
. W #
. I $G(TYPE)="" W !!,"GMRA*72 Report Type not specified. Quitting...",!! S RPTSTOP=1 Q
. I (TYPE'="FIXED"),(TYPE'="NOTFIXED"),(TYPE'="BACKOUT") D Q
.. W !!,"GMRA*72 Report type of "_TYPE_" not valid. Quitting...",!!
.. S RPTSTOP=1
.. Q
. ;
. W !!,"GMRA*4.0*72 "_RPTRECS_"Report Results will be sent to you and users"
. W !,"with the GMRA-SUPERVISOR or PSNMGR security key via a MailMan message",!!
. Q
;
K ^XTMP(RPTNODE,0,"REPORT")
D RPTHDR
I '$D(^XTMP(RPTSS,0,TYPE)) D Q
. S NORECS=1,^XTMP(RPTNODE,0,"REPORT",8)=" No "_RPTRECS_"found"
. D RPTFTR(9)
. D MAILMSG(RPTSUB,RPTFROM,RPTTEXT)
. Q
;
S ^XTMP(RPTNODE,0,"REPORT",8)="#120.8 ID"_DLM_"PATIENT NAME"_DLM_"DRUG ALLERGY NAME"
;
S RPTIEN="",RPTLN=9
F S RPTIEN=$O(^XTMP(RPTSS,0,TYPE,RPTIEN)) Q:'RPTIEN D
. S RPTCERR=""
. S RPTDATA=$G(^XTMP(RPTSS,0,TYPE,RPTIEN))
. S RPTPT=$P(RPTDATA,"^",1),RPTPTNM=$$GET1^DIQ(2,RPTPT,.01)
. S RPTNAME=$P(RPTDATA,"^",2),RPTFLIEN=$P($P(RPTDATA,"^",3),";",1)
. I TYPE="BACKOUT" D RPTBKERR
. S ^XTMP(RPTNODE,0,"REPORT",RPTLN)=RPTIEN_RPTCERR_DLM_RPTPTNM_DLM_RPTNAME
. S RPTLN=RPTLN+1
. Q
;
S RPTLN=RPTLN+1 D RPTFTR(RPTLN)
D MAILMSG(RPTSUB,RPTFROM,RPTTEXT)
Q
;
RPTBKERR ; Look for errors during the backout process
N CERR,VERR
S (CERR,VERR)=0
S CERR=$D(^XTMP(RPTSS,0,"BACKOUT",RPTIEN,"CMTERR"))
S VERR=$D(^XTMP(RPTSS,0,"BACKOUT",RPTIEN,"VADCERR"))
S RPTCERR=$S((CERR&VERR):"B",CERR:"C",VERR:"V",1:"")
Q
;
RPTHDR ; Write the report header
S ^XTMP(RPTNODE,0,"REPORT",1)=" "
S ^XTMP(RPTNODE,0,"REPORT",2)="************************* GMRA*4.0*72 Report ************************"
S ^XTMP(RPTNODE,0,"REPORT",3)=" "
S ^XTMP(RPTNODE,0,"REPORT",4)=" "_TYPE_" Report was requested by "_$$GET1^DIQ(200,DUZ,.01)_" on "_$$FMTE^XLFDT(DT)
S ^XTMP(RPTNODE,0,"REPORT",5)=" "
S ^XTMP(RPTNODE,0,"REPORT",6)=" You are receiving this report as a holder of the GMRA-SUPERVISOR or PSNMGR key"
S ^XTMP(RPTNODE,0,"REPORT",7)=" "
Q
;
RPTFTR(LINE) ; Write the report footer
S ^XTMP(RPTNODE,0,"REPORT",LINE)=" "
S LINE=LINE+1
I TYPE="BACKOUT" D
. I 'NORECS D
.. S ^XTMP(RPTNODE,0,"REPORT",LINE)=" Record IDs with a C, V, or B suffix, if any, had backout issues"
.. S LINE=LINE+1
.. Q
. S ^XTMP(RPTNODE,0,"REPORT",LINE)=" "
. S LINE=LINE+1
. Q
;
S ^XTMP(RPTNODE,0,"REPORT",LINE)=RPTFTR
Q
;
; ============================================================================
MAILMSG(MSGSUBJ,MSGFROM,MSGTEXT) ; Build and send a MailMan message
N GMRAREC,GMRAMY,GMRAMIN,GMRAMZ,GMRAKEY
I '$D(GMRADUZ) S GMRADUZ=DUZ
S GMRAMIN("FROM")=MSGFROM
;
; Next line - send to users with specified GMRAKEY. Add more here if needed
F GMRAKEY="GMRA-SUPERVISOR","PSNMGR" D
. S GMRAREC=""
. F S GMRAREC=$O(^XUSEC(GMRAKEY,GMRAREC)) Q:GMRAREC="" S GMRAMY(GMRAREC)=""
. Q
;
S GMRAMY(GMRADUZ)=""
D SENDMSG^XMXAPI(GMRADUZ,MSGSUBJ,MSGTEXT,.GMRAMY,.GMRAMIN,.GMRAMZ,"")
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HGMRA72P 16872 printed Nov 22, 2024@16:48:54 Page 2
GMRA72P ;HDSO/RJH - GMRA*4.0*72 Post-install routine; Feb 5, 2024@16:00
+1 ;;4.0;ADVERSE REACTION TRACKING;**72**; 30 Oct 98;Build 5
+2 ;
+3 ;
+4 ; Note: The routine is not deleted after install since it is tasked and the
+5 ; BACKOUT functionality needs to remain available. A future patch can
+6 ; be used to delete the routine, if needed.
+7 ;
+8 ; Must be run from a specific tag
QUIT
+9 ;
+10 ; ============================================================================
+11 ;
EN ; Main entry point
+1 DO BMES^XPDUTL(" ")
+2 DO BMES^XPDUTL(" The GMRA*4.0*72 Post-Install Routine will scan the PATIENT ALLERGIES file")
+3 DO MES^XPDUTL(" file (#120.8) for pointers to inactive drug records in the GMR ALLERGY")
+4 DO MES^XPDUTL(" file (#120.82). If found, this patch will attempt to correct those records.")
+5 ;
+6 NEW GMRADUZ,ZTRTN,ZTDESC,ZTIO,ZTDTH,ZTSAVE,ZTQUEUED,ZTREQ,ZTSK
+7 SET ZTRTN="START^GMRA72P"
+8 SET ZTDESC="GMRA*4.0*72 Post-Install Routine"
+9 SET ZTIO=""
SET ZTDTH=$HOROLOG
+10 SET GMRADUZ=DUZ
+11 SET ZTSAVE("GMRADUZ")=""
+12 DO ^%ZTLOAD
+13 ;
+14 DO BMES^XPDUTL(" The GMRA*4.0*72 Post-Install Routine has been tasked.")
+15 DO MES^XPDUTL(" Task Number: "_$GET(ZTSK))
+16 DO MES^XPDUTL(" You will receive MailMan messages when it completes.")
+17 DO BMES^XPDUTL(" ")
+18 QUIT
+19 ;
START ; Start the correction process
+1 NEW GMRASUB,GMRAFROM,GMRATEXT
+2 SET GMRANODE="GMRA*4.0*72 POST INSTALL"
+3 ;
+4 ; Next line in case the patch is installed and backed out multiple times
+5 IF $DATA(^XTMP("GMRA*4.0*72 BACKOUT"))
DO CHKDUPES
+6 ;
+7 SET ^XTMP(GMRANODE,0)=$$FMADD^XLFDT(DT,90)_"^"_DT_"^GMRA*4.0*72 POST INSTALL"
+8 DO GMRA
+9 if $DATA(ZTQUEUED)
SET ZTREQ="@"
+10 QUIT
+11 ;
CHKDUPES ; Look for record IDs found in both the FIXED and BACKOUT nodes caused
+1 ; by an early version of this functionality
+2 ; ^XTMP("GMRA*4.0*72 BACKOUT",0)="3240904^3240606^GMRA*4.0*72 BACKOUT"
+3 ; ^XTMP("GMRA*4.0*72 POST INSTALL",0)="3240903^3240605^GMRA*4.0*72 POST INSTALL"
+4 NEW BKDT,FXDT,RECIEN
+5 SET BKDT=$PIECE($GET(^XTMP("GMRA*4.0*72 BACKOUT",0)),"^",2)
+6 SET FXDT=$PIECE($GET(^XTMP("GMRA*4.0*72 POST INSTALL",0)),"^",2)
+7 IF BKDT'<FXDT
Begin DoDot:1
+8 SET RECIEN=0
+9 FOR
SET RECIEN=$ORDER(^XTMP("GMRA*4.0*72 BACKOUT",0,RECIEN))
if 'RECIEN
QUIT
Begin DoDot:2
+10 IF $DATA(^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",RECIEN))
KILL ^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",RECIEN)
+11 QUIT
End DoDot:2
+12 QUIT
End DoDot:1
+13 ;
+14 QUIT
+15 ;
GMRA ; Fix records in the PATIENT ALLERGY file (120.8)
+1 ; INC30029401 - find inactive GMRA allergies in the Patient Allergy file.
+2 ; Search the 120.8 Patient Allergy file to find allergies that are marked as
+3 ; inactive in the GMR Allergy file (#120.82)
+4 NEW ALGIEN,NODE0,PT,GMRALGY,GMRIEN,ALGYNAME,STATUS,ERRMSG,ACTVDT,DTIEN,DTDATA
+5 NEW DTCNT,PREVSTS,STOP,ERRCNT,RECCNT,GMRCNT,ALGYTYPE,LASTDT,FIXCNT,PT,DEADCNT
+6 NEW TESTCNT,GMRANODE
+7 ;
+8 SET GMRANODE="GMRA*4.0*72 POST INSTALL"
+9 SET (ALGIEN,RECCNT,ERRCNT,FIXCNT,DEADCNT,TESTCNT)=0
+10 FOR
SET ALGIEN=$ORDER(^GMR(120.8,ALGIEN))
if 'ALGIEN
QUIT
Begin DoDot:1
+11 SET RECCNT=RECCNT+1
+12 ; Entered in Error
if $DATA(^GMR(120.8,ALGIEN,"ER"))
QUIT
+13 ;
+14 SET NODE0=$GET(^GMR(120.8,ALGIEN,0))
if NODE0=""
QUIT
+15 SET PT=$PIECE(NODE0,"^",1)
if PT=""
QUIT
+16 ; Deceased Patient
IF +$PIECE($GET(^DPT(PT,.35)),"^",1)
SET DEADCNT=DEADCNT+1
QUIT
+17 ; Test patient
IF $$TESTPAT^VADPT(PT)
SET TESTCNT=TESTCNT+1
QUIT
+18 ;
+19 SET GMRALGY=$PIECE(NODE0,"^",3)
if GMRALGY=""
QUIT
+20 ; GMR Allergies only
IF GMRALGY'["GMRD(120.82"
QUIT
+21 ; Drug allergies only
IF $$GET1^DIQ(120.8,ALGIEN,3.1)'["DRUG"
QUIT
+22 ;
+23 SET GMRIEN=$PIECE(GMRALGY,";",1)
if GMRIEN=""
QUIT
+24 IF '$DATA(^GMRD(120.82,GMRIEN))
QUIT
+25 IF '$DATA(^GMRD(120.82,GMRIEN,"VUID"))
DO FIXIT
QUIT
+26 SET STATUS=$$CHKACTV("^GMRD(120.82",GMRIEN)
+27 ; Inactive/bad record
IF 'STATUS
DO FIXIT
+28 QUIT
End DoDot:1
+29 ;
+30 DO SUMMARY
+31 DO REPORT("FIXED",0)
DO REPORT("NOTFIXED",0)
+32 QUIT
+33 ;
FIXIT ; Try to find a matching drug in #50.6 and fix the record
+1 NEW FIXED,PIEN,FDA,FILEERR,COMMENT
+2 SET FIXED=0
+3 SET ERRCNT=ERRCNT+1
+4 ; Next line - ALGYNAME = REACTANT (File 120.8, field# .02)
+5 SET ALGYNAME=$PIECE(NODE0,"^",2)
if ALGYNAME=""
QUIT
+6 SET PIEN=$ORDER(^PSNDF(50.6,"B",ALGYNAME,""))
IF PIEN=""
Begin DoDot:1
+7 SET ^XTMP("GMRA*4.0*72 POST INSTALL",0,"NOTFIXED",ALGIEN)=NODE0
+8 QUIT
End DoDot:1
QUIT
+9 ;
+10 SET STATUS=$$CHKACTV("^PSNDF(50.6",PIEN)
+11 IF STATUS
DO REBUILD
+12 ;
+13 IF 'FIXED
SET ^XTMP("GMRA*4.0*72 POST INSTALL",0,"NOTFIXED",ALGIEN)=NODE0
+14 ; Next line in case a site ran a previous version of the patch
+15 IF FIXED
IF $DATA(^XTMP("GMRA*4.0*72 POST INSTALL",0,"NOTFIXED",ALGIEN))
Begin DoDot:1
+16 KILL ^XTMP("GMRA*4.0*72 POST INSTALL",0,"NOTFIXED",ALGIEN)
+17 QUIT
End DoDot:1
+18 ;
+19 KILL FDA,FILEERR
+20 QUIT
+21 ;
REBUILD ; Rebuild piece 3 of ^GMR(120.8,ien,0) here and add a comment
+1 SET FDA(120.8,ALGIEN_",",1)=PIEN_";PSNDF(50.6"_","
+2 DO FILE^DIE("","FDA","FILEERR")
+3 IF $DATA(FILEERR)
QUIT
+4 DO FNDVADC
IF 'FIXED
SET ^GMR(120.8,ALGIEN,0)=NODE0
QUIT
+5 ;
+6 SET FIXED=1
SET FIXCNT=FIXCNT+1
+7 SET ^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",ALGIEN)=NODE0
+8 ;
+9 ; Add a comment for this update
+10 SET COMMENT="Updated using GMRA*4.0*72 Post-Install routine. Changed inactive "
+11 SET COMMENT=COMMENT_"GMRA reactant from file 120.82 to matching active "
+12 SET COMMENT=COMMENT_"reactant #"_PIEN_" from file 50.6."
+13 ;Add a comment for this update
DO ADCOM^GMRAFX(ALGIEN,"O",COMMENT)
+14 QUIT
+15 ;
FNDVADC ; Find the VA Drug Class(es) associated with this drug
+1 NEW VADC,VADCPTR,VFDA,VFILEERR,VADCFND
+2 ; VA Drug Class counter
SET VADCFND=+$PIECE($GET(^GMR(120.8,ALGIEN,3,0)),"^",4)
+3 SET FIXED=$SELECT(VADCFND:1,1:0)
+4 ;
+5 IF '$DATA(^PSNDF(50.6,"APRO"))
QUIT
+6 IF '$DATA(^PSNDF(50.6,"APRO",PIEN))
QUIT
+7 ;
+8 SET VADC=""
+9 FOR
SET VADC=$ORDER(^PSNDF(50.6,"APRO",PIEN,VADC))
if 'VADC
QUIT
Begin DoDot:1
+10 ;Pointer to #50.605
SET VADCPTR=$$GET1^DIQ(50.68,VADC,15,"I")
+11 if VADCPTR=""
QUIT
+12 ;Already present
if $DATA(^GMR(120.8,ALGIEN,3,"B",VADCPTR))
QUIT
+13 SET STATUS=$$CHKACTV("^PS(50.605",VADCPTR)
+14 IF 'STATUS
QUIT
+15 SET VFDA(120.803,"+1,"_ALGIEN_",",.01)=VADCPTR
+16 DO UPDATE^DIE("","VFDA","","VFILEERR")
+17 IF $DATA(VFILEERR)
KILL VFDA,VFILEERR
QUIT
+18 SET FIXED=1
+19 SET ^XTMP(GMRANODE,0,"FIXED",ALGIEN,3,VADCPTR)=""
+20 KILL VFDA,VFILEERR
+21 QUIT
End DoDot:1
+22 ;
+23 QUIT
+24 ;
+25 ; ----------------------------------------------------------------------------
CHKACTV(CHKGBL,AIEN) ; Check to see if an item is active
+1 NEW STRING
+2 SET STATUS=0
+3 SET STRING="""TERMSTATUS"""_")"
+4 SET CHKGBL=CHKGBL_","_AIEN_","_STRING
+5 SET LASTDT=$ORDER(@CHKGBL@("B","9999999"),-1)
IF LASTDT=""
QUIT STATUS
+6 SET DTIEN=$ORDER(@CHKGBL@("B",LASTDT,""),-1)
IF DTIEN=""
QUIT STATUS
+7 SET DTDATA=$GET(@CHKGBL@(DTIEN,0))
IF DTDATA=""
QUIT STATUS
+8 SET STATUS=$PIECE(DTDATA,"^",2)
+9 QUIT STATUS
+10 ;
SUMMARY ; Summary of results
+1 SET ^XTMP(GMRANODE,0,"SUMMARY",1)=" "
+2 SET ^XTMP(GMRANODE,0,"SUMMARY",2)="********** GMRA*4.0*72 Post-Install Routine Summary Report **********"
+3 SET ^XTMP(GMRANODE,0,"SUMMARY",3)=" "
+4 SET ^XTMP(GMRANODE,0,"SUMMARY",4)=" Process was run by "_$$GET1^DIQ(200,DUZ,.01)_" on "_$$FMTE^XLFDT(DT)
+5 SET ^XTMP(GMRANODE,0,"SUMMARY",5)=" "
+6 SET ^XTMP(GMRANODE,0,"SUMMARY",6)="Total Patient Allergy records examined = "_$JUSTIFY(RECCNT,7)
+7 SET ^XTMP(GMRANODE,0,"SUMMARY",7)=" Deceased patient bad records found = "_$JUSTIFY(DEADCNT,7)
+8 SET ^XTMP(GMRANODE,0,"SUMMARY",8)=" Test patient bad records found = "_$JUSTIFY(TESTCNT,7)
+9 SET ^XTMP(GMRANODE,0,"SUMMARY",9)=" "
+10 SET ^XTMP(GMRANODE,0,"SUMMARY",10)=" Total active bad records found = "_$JUSTIFY(ERRCNT,7)
+11 SET ^XTMP(GMRANODE,0,"SUMMARY",11)="Bad records that could not be repaired = "_$JUSTIFY(ERRCNT-FIXCNT,7)
+12 SET ^XTMP(GMRANODE,0,"SUMMARY",12)=" _______"
+13 SET ^XTMP(GMRANODE,0,"SUMMARY",13)=" Bad records fixed = "_$JUSTIFY(FIXCNT,7)
+14 SET ^XTMP(GMRANODE,0,"SUMMARY",14)=" "
+15 SET ^XTMP(GMRANODE,0,"SUMMARY",15)=" The original version of the corrected records, if any, are stored for"
+16 SET ^XTMP(GMRANODE,0,"SUMMARY",16)=" 90 days at ^XTMP(""GMRA*4.0*72 POST INSTALL"",0,""FIXED"",recordID)."
+17 SET ^XTMP(GMRANODE,0,"SUMMARY",17)=" "
+18 SET ^XTMP(GMRANODE,0,"SUMMARY",18)="*************************** End of Report ****************************"
+19 ;
+20 ; Send MailMan message to installer and users with GMRA SUPERVISOR or PSNMGR key
+21 SET GMRASUB="GMRA*4.0*72 Post-Install Summary Information"
+22 SET GMRAFROM="GMRA*4.0*72 Post-Install"
+23 SET GMRATEXT="^XTMP(""GMRA*4.0*72 POST INSTALL"",0,""SUMMARY"")"
+24 DO MAILMSG(GMRASUB,GMRAFROM,GMRATEXT)
+25 QUIT
+26 ;
+27 ; ============================================================================
BACKOUT ; Run this from the programmer's prompt if patch backout is required
+1 WRITE #
+2 NEW DIR,Y
+3 SET DIR("A",1)="This action will back out the file modifications that were performed"
+4 SET DIR("A",2)="after the install of GMRA*4.0*72."
+5 SET DIR("A",3)=""
+6 SET DIR("A")="Are you sure you wish to proceed"
SET DIR("B")="NO"
SET DIR(0)="Y"
+7 DO ^DIR
+8 if Y<1
QUIT
+9 ;
+10 IF '$DATA(^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED"))
Begin DoDot:1
+11 WRITE !!,"No converted records were found that can be backed out. Quitting...",!!
+12 QUIT
End DoDot:1
QUIT
+13 ;
+14 NEW GMBKNODE,GMRADUZ,GMRBKOK,GMRNOBK,GMRIEN,GMRAREC,GMRATEXT,GMRAMY,GMRASUB,GMRAMIN
+15 NEW GMRAMZ,GMRAFROM,GMRCNT,GMRCMTDT,GMRCMT,GMRCMTERR
+16 ;
+17 SET GMBKNODE="GMRA*4.0*72 BACKOUT"
+18 SET GMRADUZ=DUZ
+19 SET ^XTMP(GMBKNODE,0)=$$FMADD^XLFDT(DT,90)_"^"_DT_"^GMRA*4.0*72 BACKOUT"
+20 ;
+21 WRITE !!,"Please wait until the backout completes."
+22 WRITE !,"Working...",!
+23 DO BKRECS
+24 ;
+25 KILL DIR
+26 NEW DIR
+27 SET DIR("A",1)="A MailMan message has been sent to you as well as holders"
+28 SET DIR("A",2)="of the GMRA-SUPERVISOR or PSNMGR security keys."
+29 SET DIR("A",3)=""
+30 SET DIR("A")="Press any key to continue"
+31 SET DIR(0)="E"
DO ^DIR
+32 QUIT
+33 ;
BKRECS ; Restore the previous (erroneous) records back to ^GMR(120.8,ien,0)
+1 NEW FDA,FILEERR,VADCPTR,VADCNODE,VFDA,VFILEERR,VADCERR
+2 SET (GMRIEN,GMRBKOK,GMRNOBK,GMRCMTERR,VADCERR)=0
+3 ;
+4 ; ^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",ALGIEN)=NODE0
+5 FOR
SET GMRIEN=$ORDER(^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",GMRIEN))
if GMRIEN=""
QUIT
Begin DoDot:1
+6 ; This should never happen
IF '$DATA(^GMR(120.8,GMRIEN))
SET GMRNOBK=GMRNOBK+1
QUIT
+7 SET ^XTMP(GMBKNODE,0,"BACKOUT",GMRIEN)=^GMR(120.8,GMRIEN,0)
+8 SET ^GMR(120.8,GMRIEN,0)=^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",GMRIEN)
+9 ;
+10 ; Back out VA Drug Class(es) added during repair
+11 IF $DATA(^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",GMRIEN,3))
DO BKVADC
+12 ;
+13 ; Back out the comment added during repair
+14 SET GMRCMTDT=9999999
+15 KILL FDA,FILEERR
+16 FOR
SET GMRCMTDT=$ORDER(^GMR(120.8,GMRIEN,26,"B",GMRCMTDT),-1)
if GMRCMTDT=""
QUIT
Begin DoDot:2
+17 SET GMRCNT=$ORDER(^GMR(120.8,GMRIEN,26,"B",GMRCMTDT,""))
if GMRCNT=""
QUIT
+18 SET GMRCMT=$GET(^GMR(120.8,GMRIEN,26,GMRCNT,2,1,0))
if GMRCMT=""
QUIT
+19 IF GMRCMT["Updated using GMRA*4.0*72"
Begin DoDot:3
+20 SET FDA(120.826,GMRCNT_","_GMRIEN_",",.01)="@"
+21 DO FILE^DIE("","FDA","FILEERR")
+22 IF $DATA(FILEERR)
SET ^XTMP(GMBKNODE,0,"BACKOUT",GMRIEN,"CMTERR")=""
SET GMRCMTERR=GMRCMTERR+1
+23 QUIT
End DoDot:3
+24 QUIT
End DoDot:2
+25 SET GMRBKOK=GMRBKOK+1
+26 KILL ^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",GMRIEN)
+27 QUIT
End DoDot:1
+28 ;
+29 DO BKSMRY
+30 QUIT
+31 ;
BKVADC ; Back out the VA Drug Class updates
+1 SET VADCPTR=0
+2 FOR
SET VADCPTR=$ORDER(^XTMP("GMRA*4.0*72 POST INSTALL",0,"FIXED",GMRIEN,3,VADCPTR))
if 'VADCPTR
QUIT
Begin DoDot:1
+3 SET VADCNODE=$ORDER(^GMR(120.8,GMRIEN,3,"B",VADCPTR,""))
if VADCNODE=""
QUIT
+4 SET VFDA(120.803,VADCNODE_","_GMRIEN_",",.01)="@"
+5 DO FILE^DIE("","VFDA","VFILEERR")
+6 IF $DATA(VFILEERR)
SET ^XTMP(GMBKNODE,0,"BACKOUT",GMRIEN,"VADCERR",VADCPTR)=""
SET VADCERR=VADCERR+1
+7 KILL VFDA,VFILEERR
+8 QUIT
End DoDot:1
+9 ;
+10 QUIT
+11 ;
BKSMRY ; Summary of the backout results
+1 SET ^XTMP(GMBKNODE,0,"SUMMARY",1)=" "
+2 SET ^XTMP(GMBKNODE,0,"SUMMARY",2)="**************** GMRA*4.0*72 Rollback Summary Report ****************"
+3 SET ^XTMP(GMBKNODE,0,"SUMMARY",3)=" "
+4 SET ^XTMP(GMBKNODE,0,"SUMMARY",4)=" Backout was run by "_$$GET1^DIQ(200,DUZ,.01)_" on "_$$FMTE^XLFDT(DT)
+5 SET ^XTMP(GMBKNODE,0,"SUMMARY",5)=" "
+6 SET ^XTMP(GMBKNODE,0,"SUMMARY",6)=" Number of records not rolled back: "_GMRNOBK
+7 SET ^XTMP(GMBKNODE,0,"SUMMARY",7)=" Number of records rolled back: "_GMRBKOK
+8 SET ^XTMP(GMBKNODE,0,"SUMMARY",8)=" Number of comment backout errors: "_GMRCMTERR
+9 SET ^XTMP(GMBKNODE,0,"SUMMARY",9)=" Number of VA Drug Class backout errors: "_VADCERR
+10 SET ^XTMP(GMBKNODE,0,"SUMMARY",10)=" "
+11 SET ^XTMP(GMBKNODE,0,"SUMMARY",11)=" The previously corrected records will be saved for 90 days at"
+12 SET ^XTMP(GMBKNODE,0,"SUMMARY",12)=" ^XTMP(""GMRA*4.0*72 BACKOUT"",0,""BACKOUT"",recordID)."
+13 SET ^XTMP(GMBKNODE,0,"SUMMARY",13)=" with errors encountered during comment backout, if any, at"
+14 SET ^XTMP(GMBKNODE,0,"SUMMARY",14)=" ^XTMP(""GMRA*4.0*72 BACKOUT"",0,""BACKOUT"",recordID,""CMTERR"")"
+15 SET ^XTMP(GMBKNODE,0,"SUMMARY",15)=" and errors encountered during VA Drug Class backout, if any, at"
+16 SET ^XTMP(GMBKNODE,0,"SUMMARY",16)=" ^XTMP(""GMRA*4.0*72 BACKOUT"",0,""BACKOUT"",recordID,""VADCERR"")"
+17 SET ^XTMP(GMBKNODE,0,"SUMMARY",17)=" "
+18 SET ^XTMP(GMBKNODE,0,"SUMMARY",18)=" The text of this message will also be stored for 90 days at"
+19 SET ^XTMP(GMBKNODE,0,"SUMMARY",19)=" ^XTMP(""GMRA*4.0*72 BACKOUT"",0,""SUMMARY""."
+20 SET ^XTMP(GMBKNODE,0,"SUMMARY",20)=" "
+21 SET ^XTMP(GMBKNODE,0,"SUMMARY",21)="*************************** End of Report ****************************"
+22 ;
+23 ; Send MailMan message with backout info to appropriate group
+24 SET GMRASUB="GMRA*4.0*72 Backout Information"
+25 SET GMRAFROM="GMRA*4.0*72 BACKOUT"
+26 SET GMRATEXT="^XTMP(""GMRA*4.0*72 BACKOUT"",0,""SUMMARY"")"
+27 DO MAILMSG(GMRASUB,GMRAFROM,GMRATEXT)
+28 QUIT
+29 ;
+30 ; ============================================================================
REPORT(TYPE,LOCAL) ; Common report data
+1 ; Local = report run from prompt = 1, otherwise 0
+2 NEW RPTIEN,RPTDATA,RPTNAME,RPTFILE,RPTFLIEN,RPTPT,RPTPTNM,RPTNODE,RPTSS,RPTLN
+3 NEW RPTFTR,RPTRECS,RPTCERR,RPTSUB,RPTFROM,RPTTEXT,RPTSTOP,NORECS,DLM
+4 if $GET(TYPE)=""
SET TYPE=""
+5 if $GET(LOCAL)=""
SET LOCAL=1
+6 SET RPTSS=$SELECT(TYPE["FIX":"GMRA*4.0*72 POST INSTALL",1:"GMRA*4.0*72 BACKOUT")
+7 SET RPTNODE="GMRA*4.0*72 POST INSTALL"
+8 SET RPTRECS=$SELECT(TYPE="FIXED":"Fixed",TYPE="NOTFIXED":"Unfixed",1:"Backed Out")_" Records "
+9 SET RPTFTR="*************************** End of Report ***************************"
+10 SET RPTSUB="GMRA*4.0*72 "_TYPE_" Record Report Information"
+11 SET RPTFROM="GMRA*4.0*72 REPORT"
+12 SET RPTTEXT="^XTMP(""GMRA*4.0*72 POST INSTALL"",0,""REPORT"")"
+13 SET (RPTSTOP,NORECS)=0
SET DLM="^"
+14 ;
+15 IF LOCAL
Begin DoDot:1
+16 WRITE #
+17 IF $GET(TYPE)=""
WRITE !!,"GMRA*72 Report Type not specified. Quitting...",!!
SET RPTSTOP=1
QUIT
+18 IF (TYPE'="FIXED")
IF (TYPE'="NOTFIXED")
IF (TYPE'="BACKOUT")
Begin DoDot:2
+19 WRITE !!,"GMRA*72 Report type of "_TYPE_" not valid. Quitting...",!!
+20 SET RPTSTOP=1
+21 QUIT
End DoDot:2
QUIT
+22 ;
+23 WRITE !!,"GMRA*4.0*72 "_RPTRECS_"Report Results will be sent to you and users"
+24 WRITE !,"with the GMRA-SUPERVISOR or PSNMGR security key via a MailMan message",!!
+25 QUIT
End DoDot:1
if RPTSTOP
QUIT
+26 ;
+27 KILL ^XTMP(RPTNODE,0,"REPORT")
+28 DO RPTHDR
+29 IF '$DATA(^XTMP(RPTSS,0,TYPE))
Begin DoDot:1
+30 SET NORECS=1
SET ^XTMP(RPTNODE,0,"REPORT",8)=" No "_RPTRECS_"found"
+31 DO RPTFTR(9)
+32 DO MAILMSG(RPTSUB,RPTFROM,RPTTEXT)
+33 QUIT
End DoDot:1
QUIT
+34 ;
+35 SET ^XTMP(RPTNODE,0,"REPORT",8)="#120.8 ID"_DLM_"PATIENT NAME"_DLM_"DRUG ALLERGY NAME"
+36 ;
+37 SET RPTIEN=""
SET RPTLN=9
+38 FOR
SET RPTIEN=$ORDER(^XTMP(RPTSS,0,TYPE,RPTIEN))
if 'RPTIEN
QUIT
Begin DoDot:1
+39 SET RPTCERR=""
+40 SET RPTDATA=$GET(^XTMP(RPTSS,0,TYPE,RPTIEN))
+41 SET RPTPT=$PIECE(RPTDATA,"^",1)
SET RPTPTNM=$$GET1^DIQ(2,RPTPT,.01)
+42 SET RPTNAME=$PIECE(RPTDATA,"^",2)
SET RPTFLIEN=$PIECE($PIECE(RPTDATA,"^",3),";",1)
+43 IF TYPE="BACKOUT"
DO RPTBKERR
+44 SET ^XTMP(RPTNODE,0,"REPORT",RPTLN)=RPTIEN_RPTCERR_DLM_RPTPTNM_DLM_RPTNAME
+45 SET RPTLN=RPTLN+1
+46 QUIT
End DoDot:1
+47 ;
+48 SET RPTLN=RPTLN+1
DO RPTFTR(RPTLN)
+49 DO MAILMSG(RPTSUB,RPTFROM,RPTTEXT)
+50 QUIT
+51 ;
RPTBKERR ; Look for errors during the backout process
+1 NEW CERR,VERR
+2 SET (CERR,VERR)=0
+3 SET CERR=$DATA(^XTMP(RPTSS,0,"BACKOUT",RPTIEN,"CMTERR"))
+4 SET VERR=$DATA(^XTMP(RPTSS,0,"BACKOUT",RPTIEN,"VADCERR"))
+5 SET RPTCERR=$SELECT((CERR&VERR):"B",CERR:"C",VERR:"V",1:"")
+6 QUIT
+7 ;
RPTHDR ; Write the report header
+1 SET ^XTMP(RPTNODE,0,"REPORT",1)=" "
+2 SET ^XTMP(RPTNODE,0,"REPORT",2)="************************* GMRA*4.0*72 Report ************************"
+3 SET ^XTMP(RPTNODE,0,"REPORT",3)=" "
+4 SET ^XTMP(RPTNODE,0,"REPORT",4)=" "_TYPE_" Report was requested by "_$$GET1^DIQ(200,DUZ,.01)_" on "_$$FMTE^XLFDT(DT)
+5 SET ^XTMP(RPTNODE,0,"REPORT",5)=" "
+6 SET ^XTMP(RPTNODE,0,"REPORT",6)=" You are receiving this report as a holder of the GMRA-SUPERVISOR or PSNMGR key"
+7 SET ^XTMP(RPTNODE,0,"REPORT",7)=" "
+8 QUIT
+9 ;
RPTFTR(LINE) ; Write the report footer
+1 SET ^XTMP(RPTNODE,0,"REPORT",LINE)=" "
+2 SET LINE=LINE+1
+3 IF TYPE="BACKOUT"
Begin DoDot:1
+4 IF 'NORECS
Begin DoDot:2
+5 SET ^XTMP(RPTNODE,0,"REPORT",LINE)=" Record IDs with a C, V, or B suffix, if any, had backout issues"
+6 SET LINE=LINE+1
+7 QUIT
End DoDot:2
+8 SET ^XTMP(RPTNODE,0,"REPORT",LINE)=" "
+9 SET LINE=LINE+1
+10 QUIT
End DoDot:1
+11 ;
+12 SET ^XTMP(RPTNODE,0,"REPORT",LINE)=RPTFTR
+13 QUIT
+14 ;
+15 ; ============================================================================
MAILMSG(MSGSUBJ,MSGFROM,MSGTEXT) ; Build and send a MailMan message
+1 NEW GMRAREC,GMRAMY,GMRAMIN,GMRAMZ,GMRAKEY
+2 IF '$DATA(GMRADUZ)
SET GMRADUZ=DUZ
+3 SET GMRAMIN("FROM")=MSGFROM
+4 ;
+5 ; Next line - send to users with specified GMRAKEY. Add more here if needed
+6 FOR GMRAKEY="GMRA-SUPERVISOR","PSNMGR"
Begin DoDot:1
+7 SET GMRAREC=""
+8 FOR
SET GMRAREC=$ORDER(^XUSEC(GMRAKEY,GMRAREC))
if GMRAREC=""
QUIT
SET GMRAMY(GMRAREC)=""
+9 QUIT
End DoDot:1
+10 ;
+11 SET GMRAMY(GMRADUZ)=""
+12 DO SENDMSG^XMXAPI(GMRADUZ,MSGSUBJ,MSGTEXT,.GMRAMY,.GMRAMIN,.GMRAMZ,"")
+13 QUIT