| 1 | VDEFREQ ;INTEGIC/AM & BPOIFO/JG - VDEF Request Processor ; 15 Nov 2005  3:00 PM | 
|---|
| 2 | ;;1.0;VDEF;**3**;Dec 28, 2004 | 
|---|
| 3 | ;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ; IA: 10063 - $$S^%ZTLOAD | 
|---|
| 6 | ;     10063 - $$ASKSTOP^%ZTLOAD | 
|---|
| 7 | ; | 
|---|
| 8 | Q  ; No bozos | 
|---|
| 9 | ; | 
|---|
| 10 | EN ; Main entry point for the Request Queue processor from TaskMan | 
|---|
| 11 | ; | 
|---|
| 12 | ; Input parameter: | 
|---|
| 13 | ;   QIEN - Request Queue IEN passed in by TaskMan | 
|---|
| 14 | ; | 
|---|
| 15 | ; Output parameters: | 
|---|
| 16 | ;   ZTSTOP - flag indicating whether to stop processing: 0 by default | 
|---|
| 17 | ;    1 if an outside request to stop the Processor or internal error | 
|---|
| 18 | ;    2 if VistA HL7 API errored out | 
|---|
| 19 | ;   ZTREQ  - Tells the Submanager to delete this task's record if "@" | 
|---|
| 20 | ; | 
|---|
| 21 | N DSTDATA,DSTIEN,ERR,FDA,NVPIEN,QUEUE,SCHED,IEN,VDEFWAIT,VDEFTSK | 
|---|
| 22 | S VDEFTSK=ZTSK | 
|---|
| 23 | ; | 
|---|
| 24 | ; Lock this Request Queue from other processors. If it's already locked, | 
|---|
| 25 | ; another process has it. | 
|---|
| 26 | L +^VDEFHL7(579.3,"QUEUE",QIEN):1 G EXIT:'$T | 
|---|
| 27 | ; | 
|---|
| 28 | EN1 ; Re-entry point after the wait period has expired | 
|---|
| 29 | ; | 
|---|
| 30 | ; Quit if there has been a request to stop processing | 
|---|
| 31 | S ZTSTOP=$$S^%ZTLOAD() G EXIT:ZTSTOP | 
|---|
| 32 | ; | 
|---|
| 33 | ; Get the queue data | 
|---|
| 34 | S QUEUE=$G(^VDEFHL7(579.3,QIEN,0)) | 
|---|
| 35 | ; | 
|---|
| 36 | ; Quit if this Request Queue is suspended | 
|---|
| 37 | G EXIT:$P(QUEUE,U,9)="S" | 
|---|
| 38 | ; | 
|---|
| 39 | ; Set the wait period to the REQUEST QUEUE WAKEUP | 
|---|
| 40 | S VDEFWAIT=+$P(QUEUE,U,2) | 
|---|
| 41 | ; | 
|---|
| 42 | ; See if current time is in a scheduling rule | 
|---|
| 43 | S SCHED=$$SCHEDULE^VDEFQM(QIEN,$H) G EN2:'SCHED | 
|---|
| 44 | ; | 
|---|
| 45 | ; If current time is in a suspend rule, set wait period to | 
|---|
| 46 | ; the next start time or the basic wakeup period whichever is longer. | 
|---|
| 47 | I $P(SCHED,U)="S",$P(SCHED,U,2)>VDEFWAIT S VDEFWAIT=$P(SCHED,U,2) G WAITLOOP | 
|---|
| 48 | ; | 
|---|
| 49 | EN2 ; Update the Request Queue definition with the current task # | 
|---|
| 50 | K FDA S FDA(1,579.3,QIEN_",",.11)=VDEFTSK D FILE^DIE("","FDA(1)","ERR(1)") | 
|---|
| 51 | ; | 
|---|
| 52 | ; Store VDEF Destination data in a local array | 
|---|
| 53 | S DSTIEN=0 F  S DSTIEN=$O(^VDEFHL7(579.2,DSTIEN)) Q:'DSTIEN  D | 
|---|
| 54 | . S DSTDATA(DSTIEN)=$G(^VDEFHL7(579.2,DSTIEN,0)) | 
|---|
| 55 | ; | 
|---|
| 56 | ; Loop through the Queued Up requests for this queue | 
|---|
| 57 | S (ZTSTOP,IEN)=0 | 
|---|
| 58 | F  S IEN=$O(^VDEFHL7(579.3,"C","Q",QIEN,IEN)) Q:IEN=""  D  Q:ZTSTOP | 
|---|
| 59 | . ; | 
|---|
| 60 | . ; Quit if there has been a request to stop processing | 
|---|
| 61 | . S ZTSTOP=$$S^%ZTLOAD() Q:ZTSTOP | 
|---|
| 62 | . I $P($G(^VDEFHL7(579.3,QIEN,0)),U,9)="S" S ZTSTOP=1 Q | 
|---|
| 63 | . N DSTPROT,DSTTYP,DYNAMIC,ERR,SITEPARM | 
|---|
| 64 | . N FDA,VDEFHL,HLA,HLCS,IEN577,IENS,II,HL | 
|---|
| 65 | . N NAMEVAL,PAIR,REQUEST,SUBT,VAL,VDEFERR | 
|---|
| 66 | . S IENS=IEN_","_QIEN_"," ; Request Queue IEN string | 
|---|
| 67 | . L +^VDEFHL7(579.3,QIEN,IEN):5 Q:'$T | 
|---|
| 68 | . M VAL=^VDEFHL7(579.3,QIEN,1,IEN) S REQUEST=$G(VAL(0)) | 
|---|
| 69 | . M NAMEVAL=VAL(.05) ; Name Value pairs | 
|---|
| 70 | . M DYNAMIC=VAL(.19) ; Dynamic Addressing information | 
|---|
| 71 | . K VAL | 
|---|
| 72 | . ; | 
|---|
| 73 | . ; Check for an incomplete record | 
|---|
| 74 | . I '$D(NAMEVAL(1)) L -^VDEFHL7(579.3,QIEN,IEN) Q | 
|---|
| 75 | . ; | 
|---|
| 76 | . ; Change request status from "Q"ueued Up to "C"hecked Out | 
|---|
| 77 | . S FDA(1,579.31,IENS,.02)="C" D FILE^DIE("","FDA(1)") K FDA | 
|---|
| 78 | . ; | 
|---|
| 79 | . ; Get the Event Subtype | 
|---|
| 80 | . S SUBT="",PAIR=$P($G(NAMEVAL(1,0)),U,2) | 
|---|
| 81 | . I $P(PAIR,"=",1)="SUBTYPE" S SUBT=$P(PAIR,"=",2) | 
|---|
| 82 | . E  D ERR("Subtype missing from Name/Value Pair") L -^VDEFHL7(579.3,QIEN,IEN) Q | 
|---|
| 83 | . ; | 
|---|
| 84 | . ; Get the VistA data file IEN | 
|---|
| 85 | . S NVPIEN="",PAIR=$P($G(NAMEVAL(2,0)),U,2) | 
|---|
| 86 | . I $P(PAIR,"=",1)="IEN" S NVPIEN=$P(PAIR,"=",2) | 
|---|
| 87 | . E  D ERR("IEN missing from Name/Value Pair") L -^VDEFHL7(579.3,QIEN,IEN) Q | 
|---|
| 88 | . ; | 
|---|
| 89 | . ; Retrieve the Destination information for this request | 
|---|
| 90 | . S DSTIEN=$P(REQUEST,U,7),DSTTYP=$P($G(DSTDATA(+DSTIEN)),U,2) | 
|---|
| 91 | . ; | 
|---|
| 92 | . ; Get the VDEF Event IEN | 
|---|
| 93 | . S IEN577=$P(REQUEST,U,18) | 
|---|
| 94 | . ; | 
|---|
| 95 | . ; Get the VISTA HL7 Protocol | 
|---|
| 96 | . S DSTPROT=$P($G(^VDEFHL7(577,IEN577,0)),U,7) | 
|---|
| 97 | . I DSTPROT="" D ERR("Protocol not defined in VDEF event file") S ZTSTOP=1 L -^VDEFHL7(579.3,QIEN,IEN) Q | 
|---|
| 98 | . ; | 
|---|
| 99 | . ; Create delimiter structure to use when building segments | 
|---|
| 100 | . D INIT^HLFNC2(DSTPROT,.VDEFHL) | 
|---|
| 101 | . I '$D(VDEFHL) D ERR("No HL7 parameters for this Protocol") S ZTSTOP=1 L -^VDEFHL7(579.3,QIEN,IEN) Q | 
|---|
| 102 | . S HLCS=$E(VDEFHL("ECH")) M HL=VDEFHL ; Some called routines use 'HL' array | 
|---|
| 103 | . ; | 
|---|
| 104 | . ; Get the site parameters | 
|---|
| 105 | . S SITEPARM=$$PARAM^HLCS2 | 
|---|
| 106 | . ; | 
|---|
| 107 | . ; If no IEN don't generate an HL7 message | 
|---|
| 108 | . I $G(NVPIEN)="" D STATUS^VDEFREQ1(IENS,"P"),ERR("Invalid IEN") S ZTSTOP=1 L -^VDEFHL7(579.3,QIEN,IEN) Q | 
|---|
| 109 | . D NOW^%DTC S FDA(1,579.31,IENS,.09)=% | 
|---|
| 110 | . ; | 
|---|
| 111 | . ; Update this Request record with the current date & time | 
|---|
| 112 | . D FILE^DIE("","FDA(1)","ERR(1)") K FDA | 
|---|
| 113 | . ; | 
|---|
| 114 | . ; Generate HL7 message for this request | 
|---|
| 115 | . D GENERATE^VDEFREQ1(NVPIEN,.HLA,HLCS,IEN577,SUBT,DSTPROT,DSTTYP,.ZTSTOP,.VDEFHL,.DYNAMIC) | 
|---|
| 116 | . ; | 
|---|
| 117 | . ; Update request status from Checked Out to Processed or Errored Out | 
|---|
| 118 | . ; Leave Request Checked Out if VistA HL7 errored out (ZTSTOP=2) | 
|---|
| 119 | . I ZTSTOP'=2 D STATUS^VDEFREQ1(IENS,$S(ZTSTOP=1:"E",1:"P")) S ZTSTOP=0 | 
|---|
| 120 | . I ZTSTOP=2 S ZTSTOP=0 ; If VistA HL7 errored out, continue processing | 
|---|
| 121 | . ; | 
|---|
| 122 | . ; Unlock the record | 
|---|
| 123 | . L -^VDEFHL7(579.3,QIEN,IEN) | 
|---|
| 124 | ; | 
|---|
| 125 | ; Quit if necessary. | 
|---|
| 126 | G EXIT:ZTSTOP | 
|---|
| 127 | ; Wait for the next time to run. | 
|---|
| 128 | ; The wait process is in a loop so it can check if there | 
|---|
| 129 | ; has been a request to stop processing before the wait expires. | 
|---|
| 130 | WAITLOOP N I S ZTSTOP=0 F I=1:1:VDEFWAIT D  Q:ZTSTOP | 
|---|
| 131 | . S ZTSTOP=$$S^%ZTLOAD() Q:ZTSTOP | 
|---|
| 132 | . I $P(^VDEFHL7(579.3,QIEN,0),U,9)="S" S ZTSTOP=1 Q | 
|---|
| 133 | . H 1 | 
|---|
| 134 | ; | 
|---|
| 135 | ; Quit or resume processing | 
|---|
| 136 | I 'ZTSTOP K I G EN1 | 
|---|
| 137 | ; | 
|---|
| 138 | ; Quit | 
|---|
| 139 | ; Unlock the record in case it left the loop with an error | 
|---|
| 140 | EXIT L -^VDEFHL7(579.3,"QUEUE",QIEN),-^VDEFHL7(579.3,QIEN,IEN) | 
|---|
| 141 | D ALERT^VDEFUTIL("VDEF REQUEST QUEUE PROCESSOR FOR "_$P(QUEUE,U)_" HAS EXITED.") | 
|---|
| 142 | ; | 
|---|
| 143 | ; Stop the task and delete this task's record | 
|---|
| 144 | N X,I S ZTSK=VDEFTSK,X=$$ASKSTOP^%ZTLOAD(ZTSK),ZTREQ="@" | 
|---|
| 145 | F I=1:1:5 D STAT^%ZTLOAD Q:ZTSK(1)=0!(ZTSK(1)>2)  H 1 | 
|---|
| 146 | K X,I | 
|---|
| 147 | Q | 
|---|
| 148 | ; | 
|---|
| 149 | ERR(TEXT) ; Error processing | 
|---|
| 150 | N FDA,ERR | 
|---|
| 151 | S VDEFERR=$TR(TEXT,"^"),FDA(1,579.31,IENS,.17)=VDEFERR | 
|---|
| 152 | D FILE^DIE("","FDA(1)","ERR") | 
|---|
| 153 | Q | 
|---|