1 | MPIFA31I ;ALB/JRP-PROCESS ADT-A31 MESSAGE FROM MPI ;03-JAN-97
|
---|
2 | ;;1.0; MASTER PATIENT INDEX VISTA ;**1,21**;30 Apr 99
|
---|
3 | ;
|
---|
4 | ; Integration Agreements Utilized:
|
---|
5 | ; ^DGCN(391.91 - #2751
|
---|
6 | ; ^DPT("AICNL" - #2070
|
---|
7 | ; EXC^RGHLLOG - #2796
|
---|
8 | ;
|
---|
9 | PROCESS(MSGARR) ;Process ADT-A31 message received from MPI when a new
|
---|
10 | ; patient is assigned an Integration Control Number
|
---|
11 | ;
|
---|
12 | ;Input : MSGARR - Array containing ADT-A31 message (full global ref)
|
---|
13 | ; - MSGARR must be in format compatible with interaction
|
---|
14 | ; with DHCP HL7 package
|
---|
15 | ; MSGARR(1) = First segment of message
|
---|
16 | ; MSGARR(1,n) = Continuation node(s) for segment
|
---|
17 | ; MSGARR(x) = Xth segment of message
|
---|
18 | ; MSGARR(x,n) = Continuation node(s) for segment
|
---|
19 | ; - Defaults to ^TMP("MPIFA31",$J,"MPI-ADT-A31")
|
---|
20 | ;Output : ICN = Successfully processed
|
---|
21 | ; -1^Reason = Failure
|
---|
22 | ;Notes : The MPI uses an ADT-A31 message to return the ICN of new
|
---|
23 | ; patients. This value (seq # 2 of PID segment) is the only
|
---|
24 | ; information that will be stored.
|
---|
25 | ;
|
---|
26 | ;Check input
|
---|
27 | S MSGARR=$G(MSGARR)
|
---|
28 | S:(MSGARR="") MSGARR="^TMP(""MPIFA31"","_$J_",""MPI-ADT-A31"")"
|
---|
29 | Q:(('$D(@MSGARR))!('$O(@MSGARR@(0)))) "-1^Array containing ADT-A31 message not valid"
|
---|
30 | ;Declare variables
|
---|
31 | N MSH,EVN,PID,SEND,RECEIVE,EVENT,REASON,SEGMENT,SEGNAME
|
---|
32 | N ICN,ICNNUM,ICNCHECK,DFNCHECK,CHKSCHM,SSN,LOCAL,TMP,FLDSEP,HLECH
|
---|
33 | N CMPSEP,REPSEP,ESC,SUBSEP,TMP1,TMP2
|
---|
34 | ;Parse required segments out of message
|
---|
35 | S (MSH,EVN,PID)=""
|
---|
36 | S TMP=0
|
---|
37 | F S TMP=+$O(@MSGARR@(TMP)) Q:('TMP) D
|
---|
38 | .;Get segment and screen out unused segments
|
---|
39 | .S SEGMENT=$G(@MSGARR@(TMP))
|
---|
40 | .S SEGNAME=$E(SEGMENT,1,3)
|
---|
41 | .S TMP1=","_SEGNAME_","
|
---|
42 | .Q:('(",MSH,EVN,PID,"[TMP1))
|
---|
43 | .;Use first occurrance of segment
|
---|
44 | .Q:(@SEGNAME'="")
|
---|
45 | .;Remember field separator if MSH segment
|
---|
46 | .S:(SEGNAME="MSH") FLDSEP=$E(SEGMENT,4)
|
---|
47 | .;Drop segment name and field separator for storage
|
---|
48 | .S @SEGNAME=$E(SEGMENT,5,$L(SEGMENT))
|
---|
49 | .;Account for rollover (begin rollover subscripting with 1)
|
---|
50 | .S TMP1=0
|
---|
51 | .S TMP2=1
|
---|
52 | .F S TMP1=+$O(@MSGARR@(TMP,TMP1)) Q:('TMP1) D
|
---|
53 | ..;Get/save rollover
|
---|
54 | ..S @SEGNAME@(TMP2)=$G(@MSGARR@(TMP,TMP1))
|
---|
55 | ..S TMP2=TMP2+1
|
---|
56 | ;Make sure used segments were all found
|
---|
57 | F SEGNAME="MSH","EVN","PID" Q:(@SEGNAME="")
|
---|
58 | Q:(@SEGNAME="") "-1^Required segment ("_SEGNAME_") missing"
|
---|
59 | ;Safety check on field separator (use DHCP default value)
|
---|
60 | S:($G(FLDSEP)="") FLDSEP="^"
|
---|
61 | ;Get encoding characters
|
---|
62 | S HLECH=$P(MSH,FLDSEP,1)
|
---|
63 | ;Component separator
|
---|
64 | S CMPSEP=$E(HLECH,1)
|
---|
65 | ;Repetion separator
|
---|
66 | S REPSEP=$E(HLECH,2)
|
---|
67 | ;Escape character
|
---|
68 | S ESC=$E(HLECH,3)
|
---|
69 | ;Subcomponent separator
|
---|
70 | S SUBSEP=$E(HLECH,4)
|
---|
71 | ;Process MSH segment
|
---|
72 | ; - Get sending facility
|
---|
73 | S SEND=$P(MSH,FLDSEP,3)
|
---|
74 | ; - Get receiving facility
|
---|
75 | S RECEIVE=$P(MSH,FLDSEP,5)
|
---|
76 | ; - Get event type
|
---|
77 | S EVENT=$P($P(MSH,FLDSEP,8),CMPSEP,2)
|
---|
78 | ; - Validate information in MSH segment
|
---|
79 | ; - MPI is sending facility
|
---|
80 | ;Q:(SEND'="200M") "-1^Sending facility not valid (must be '200M')"
|
---|
81 | ; - Receiving facility is local facility
|
---|
82 | S TMP=+$P($$SITE^VASITE(),"^",3)
|
---|
83 | Q:(RECEIVE'=TMP) "-1^Receiving facility not valid (must be "_TMP_")"
|
---|
84 | ; - Event type is A31
|
---|
85 | Q:(EVENT'="A31") "-1^Event type not valid (must be 'A31')"
|
---|
86 | ;Process EVN segment
|
---|
87 | ; - Get event reason
|
---|
88 | S REASON=$P(EVN,FLDSEP,4)
|
---|
89 | ; - Validate information in EVN segment
|
---|
90 | ; - Event reason is 95
|
---|
91 | Q:(REASON'="95") "-1^Event reason code not valid (must be '95')"
|
---|
92 | ;Process PID segment
|
---|
93 | ; - Get ICN & checksum & checksum scheme
|
---|
94 | S TMP=$P(PID,FLDSEP,2)
|
---|
95 | S ICN=$P(TMP,CMPSEP,1)
|
---|
96 | Q:(ICN'?1.16N1"V"6N) "-1^ICN not in correct format"
|
---|
97 | S ICNNUM=$P(ICN,"V",1)
|
---|
98 | S ICNCHECK=$P(TMP,"V",2)
|
---|
99 | Q:((ICNNUM="")!(ICNCHECK="")) "-1^Could not determine ICN"
|
---|
100 | ; - Validate checksum
|
---|
101 | Q:(ICNCHECK'=$$CHECKDG^MPIFSPC(ICNNUM)) "-1^ICN/checksum not valid"
|
---|
102 | ; - Get DFN & checksum & checksum scheme
|
---|
103 | S TMP=$P(PID,FLDSEP,3)
|
---|
104 | ; - Get SSN (account for roll over)
|
---|
105 | S SSN=""
|
---|
106 | S TMP=$L(PID,FLDSEP)
|
---|
107 | S TMP1=$P(PID,FLDSEP,TMP)
|
---|
108 | S:(TMP=19) SSN=$P(PID,FLDSEP,19)_$P($G(PID(1)),FLDSEP,1)
|
---|
109 | S:(TMP>19) SSN=$P(PID,FLDSEP,19)
|
---|
110 | S:(TMP<19) SSN=$P($G(PID(1)),FLDSEP,((19-TMP)+1))
|
---|
111 | ; - Validate information in PID
|
---|
112 | ; - Make sure DFN exists
|
---|
113 | S LOCAL=$G(^DPT(DFN,0))
|
---|
114 | Q:($P(LOCAL,"^",1)="") "-1^Could not locate patient (bad DFN)"
|
---|
115 | ; - Make sure SSNs match
|
---|
116 | Q:($P(LOCAL,"^",9)'=SSN) "-1^DFN/SSN pairing not valid"
|
---|
117 | ;Extra validation checks
|
---|
118 | ; - Verify lack of national ICN
|
---|
119 | I ($$GETICN^MPIF001(DFN)>0) Q:('$D(^DPT("AICNL",1,DFN))) "-1^National ICN already assigned to patient"
|
---|
120 | ;Passed all validation checks - store ICN & checksum
|
---|
121 | S TMP=$$SETICN^MPIF001(DFN,ICNNUM,ICNCHECK)
|
---|
122 | Q:(TMP<0) "-1^Unable to store ICN and checksum"
|
---|
123 | ;Delete local ICN flag
|
---|
124 | S TMP=$$SETLOC^MPIF001(DFN,0)
|
---|
125 | S TMP=$$CHANGE^MPIF001(DFN,+$$SITE^VASITE)
|
---|
126 | N HERE,TFSITE
|
---|
127 | S HERE=+$P($$SITE^VASITE,"^",3)
|
---|
128 | S TFSITE=$$LKUP^XUAF4(HERE)
|
---|
129 | Q:+TFSITE'>0 ICN
|
---|
130 | Q:$D(^DGCN(391.91,"APAT",DFN,TFSITE)) ICN
|
---|
131 | K DD,DO N DIC,X,Y
|
---|
132 | S DIC="^DGCN(391.91,",DIC("DR")=".02///`"_TFSITE,X=DFN,DIC(0)="LQZ"
|
---|
133 | D FILE^DICN
|
---|
134 | I +Y=-1 S ^XTMP($J,"MPIF","MSHERR")="Treating Facility Add Failed" D
|
---|
135 | .D EXC^RGHLLOG(212,"DFN= "_DFN_" Treating Facility= "_TFSITE,DFN)
|
---|
136 | K DD,DO,DIC,X,Y
|
---|
137 | ;Done
|
---|
138 | Q ICN
|
---|