1 | MPIFAPI ;CMC/BP-APIS FOR MPI ;DEC 21, 1998
|
---|
2 | ;;1.0; MASTER PATIENT INDEX VISTA ;**1,3,14,16,17,21,27,28,33,35,37,43,45,44,46,48**;30 Apr 99;Build 6
|
---|
3 | ; Integration Agreements Utilized:
|
---|
4 | ; ^DPT( - #2070 and #4079
|
---|
5 | ; ^DPT("AICN", ^DPT("AMPIMIS", ^DPT("ASCN2" - #2070
|
---|
6 | ; EXC, START, STOP^RGHLLOG - #2796
|
---|
7 | ;
|
---|
8 | EN2() ;NEW ENTRY POINT FOR LOCALS
|
---|
9 | N MPIOUT,DIC,MPICHK,MPINCK,MPINNM,MPINUM1,DA,MPINUM
|
---|
10 | I $O(^MPIF(984.1,0))="" G SETUP
|
---|
11 | AGN2 L +^MPIF(984.1):1 E H 3 G AGN2
|
---|
12 | S MPINUM=0,X=$$SITE^VASITE,X=$P(X,"^",3),X=X\1
|
---|
13 | S DIC="^MPIF(984.1,",DIC(0)="XZ" D ^DIC
|
---|
14 | S MPINUM1=$P(Y(0),"^",4),MPICHK=$P(Y(0),"^",5),MPINNM=MPINUM1+1
|
---|
15 | S MPINUM=MPINUM1_"V"_MPICHK,MPINCK=$$CHECKDG^MPIFSPC(MPINNM)
|
---|
16 | S DA=1,DIE="^MPIF(984.1,",DR="1////^S X=MPINUM1;2////^S X=MPICHK;3////^S X=MPINNM;5////"_MPINCK
|
---|
17 | D ^DIE
|
---|
18 | K DIE,DR,X,Y
|
---|
19 | L -^MPIF(984.1)
|
---|
20 | Q MPINUM
|
---|
21 | SETUP ;
|
---|
22 | N CHK,NUM,NXTCHK,NXTNUM,SITE,DA
|
---|
23 | S SITE=$$SITE^VASITE,SITE=$P(SITE,"^",3),SITE=SITE\1
|
---|
24 | S DIC="^MPIF(984.1,",DA=1,DIC(0)="",X=SITE
|
---|
25 | S NUM=SITE_"0000000",CHK=$$CHECKDG^MPIFSPC(NUM),MPINUM=NUM_"V"_CHK
|
---|
26 | S NXTNUM=NUM+1,NXTCHK=$$CHECKDG^MPIFSPC(NXTNUM)
|
---|
27 | S DIC("DR")="1////^S X=NUM;2////^S X=CHK;3////^S X=NXTNUM;5////"_NXTCHK
|
---|
28 | K DD,D0
|
---|
29 | D FILE^DICN
|
---|
30 | K DIC,X,Y
|
---|
31 | Q MPINUM
|
---|
32 | ;
|
---|
33 | MPILINK() ;returns MPI logical Link
|
---|
34 | N MPIL,MPILINK
|
---|
35 | D LINK^HLUTIL3("MPI",.MPIL)
|
---|
36 | I '$D(MPIL) Q "-1^NOT DEFINED"
|
---|
37 | S MPILINK=$O(MPIL(0))
|
---|
38 | I MPILINK="" Q "-1^NOT DEFINED"
|
---|
39 | S MPILINK=$G(MPIL(MPILINK))
|
---|
40 | Q MPILINK
|
---|
41 | ;
|
---|
42 | SUBNUM(DFN) ; returns SCN from MPI node for given DFN
|
---|
43 | ; DFN - ien of patient file
|
---|
44 | ; returns: -1^error message << always returns.
|
---|
45 | ;*** Subscription control numbers no longer exist
|
---|
46 | Q "-1^No Subscription Control Number for DFN "_DFN
|
---|
47 | ;
|
---|
48 | MPINODE(DFN) ; returns MPI node for given DFN
|
---|
49 | ; DFN - patient file ien
|
---|
50 | ; returns: -1^error message or MPI node from patient file
|
---|
51 | N TMP
|
---|
52 | I '$D(DFN) Q "-1^DFN not defined"
|
---|
53 | I '$D(^DPT(DFN)) Q "-1^DFN doesn't exist"
|
---|
54 | I '$D(^DPT(DFN,"MPI")) Q "-1^No MPI node for DFN "_DFN
|
---|
55 | L +^DPT("MPI",DFN):10 ;**45 added lock check for getting ICN data back
|
---|
56 | N NODE S NODE=$G(^DPT(DFN,"MPI"))
|
---|
57 | I NODE=""!(NODE?."^") S NODE="-1^No MPI data for DFN "_DFN
|
---|
58 | I +NODE>0 D
|
---|
59 | .;**45 checking if checksum for ICN is correct, if not update the 991.02 field
|
---|
60 | .; and include new value in NODE returned.
|
---|
61 | .N CHK S CHK=$$CHECKDG^MPIFSPC($P(NODE,"^"))
|
---|
62 | .I CHK'=$P(NODE,"^",2) S TMP=$$SETICN^MPIF001(DFN,$P(NODE,"^"),CHK) S $P(NODE,"^",2)=CHK
|
---|
63 | L -^DPT("MPI",DFN)
|
---|
64 | Q NODE
|
---|
65 | ;
|
---|
66 | GETADFN(ICN) ; return DFN ONLY if ICN is the active ICN
|
---|
67 | ; ICN - Integration Control Number for patient to be returned
|
---|
68 | ; returns: -1^error message
|
---|
69 | ; DFN - IEN for the patient entry in the Patient file (#2)
|
---|
70 | N RETURN,DFN
|
---|
71 | I $G(ICN)'>0 Q "-1^NO ICN"
|
---|
72 | I '$D(^DPT("AICN",ICN)) Q "-1^ICN NOT IN DATABASE"
|
---|
73 | S DFN=$O(^DPT("AICN",ICN,0))
|
---|
74 | I $G(DFN)'>0 Q "-1^BAD AICN CROSS-REFERENCE"
|
---|
75 | I $P($G(^DPT(DFN,"MPI")),"^")'=ICN Q "-1^ICN is not Active one"
|
---|
76 | Q DFN
|
---|
77 | ;
|
---|
78 | UPDATE(DFN,ARR,MPISILNT,REMOVE) ;api to edit 'mpi','mpifhis' and 'mpicmor' nodes
|
---|
79 | ;**37 UPDATE module moved 3/30/05 from MPIFAPI into MPIFAPI1.
|
---|
80 | ;Linetag must remain due to DBIA #2706.
|
---|
81 | Q $$UPDATE^MPIFAPI1(DFN,ARR,.MPISILNT,.REMOVE)
|
---|
82 | ;
|
---|
83 | MPIQ(DFN) ;MPI QUERY
|
---|
84 | N MPIFARR
|
---|
85 | L +^DPT(DFN):2 I '$T,'$D(MPIFS) W $C(7),!!,"Patient is being edited. No attempt will be made to connect to the MPI." H 2 Q
|
---|
86 | I '$D(MPIFS) D ;Not from SmartCard background job
|
---|
87 | .;**37 mods to L -^DPT
|
---|
88 | .I $G(DGNEW)=1 D ;New patient, fields always blank, ask
|
---|
89 | ..D WRTLN
|
---|
90 | ..; **44 Adding Pseudo SSN Reason to the list of prompted fields if SSN is a pseudo and there isn't already a reason stored
|
---|
91 | ..N MPIFP S MPIFP="" S DA=DFN,DIQ(0)="EI",DIC=2,DR=".09;.0906",DIQ="MPIFARR" D EN^DIQ1 K DA,DR,DIC,DQ,DR
|
---|
92 | ..I $D(MPIFARR(2,DFN,.0906,"I")) D
|
---|
93 | ...I MPIFARR(2,DFN,.09,"E")["P",("S"[MPIFARR(2,DFN,.0906,"I")) S MPIFP=".0906;"
|
---|
94 | ..S DIE="^DPT(",DA=DFN,DIE("NO^")="BACK"
|
---|
95 | ..S DR=MPIFP_".2403;.092;.093;1",DR(2,2.01)=".01" D ^DIE K DA,DIE,DR Q
|
---|
96 | .I $G(DGNEW)="" D ;Existing patient, get current values
|
---|
97 | ..N MPIDOB,IMPRS,MPIMMN,MPICTY,MPIST
|
---|
98 | ..S DIC=2,DR=".02;.03;.09;.0906;.092;.093;.2403;994;1",DR(2.01)=".01" ;**44 include pseudo ssn reason to list
|
---|
99 | ..S DA=DFN,DA(2.01)=1,DIQ(0)="EI",DIQ="MPIFARR"
|
---|
100 | ..D EN^DIQ1 K DA,DIC,DIQ,DR
|
---|
101 | ..;build DR from blank fields / imprecise DOB / pseudo SSN
|
---|
102 | ..S DR=""
|
---|
103 | ..S MPIDOB=$G(MPIFARR(2,DFN,.03,"I")) ;DATE OF BIRTH
|
---|
104 | ..I MPIDOB="" S DR=DR_".03;" ;DOB null
|
---|
105 | ..;Is DOB imprecise?
|
---|
106 | ..I MPIDOB'="" S IMPRS=0 D
|
---|
107 | ...I $E(MPIDOB,4,7)="0000" S IMPRS=1 ;Year only; no month/day
|
---|
108 | ...I ($E(MPIDOB,6,7)="00")&($E(MPIDOB,4,5)'="00") S IMPRS=1 ;Year/month only; no day
|
---|
109 | ...I IMPRS=1 S DR=DR_".03;" ;DOB imprecise
|
---|
110 | ..I $G(MPIFARR(2,DFN,.02,"I"))="" S DR=DR_".02;" ;SEX
|
---|
111 | ..;if the SSN is null, add to prompted fields
|
---|
112 | ..N SSNP S SSNP=0
|
---|
113 | ..I ($G(MPIFARR(2,DFN,.09,"E"))="") S DR=DR_".09;",SSNP=1 ;SSN
|
---|
114 | ..I DR'="" D
|
---|
115 | ...D WRTLN
|
---|
116 | ...S DIE="^DPT(",DA=DFN,DIE("NO^")="BACK"
|
---|
117 | ...D ^DIE K DA,DIE,DR,DIC,DIQ
|
---|
118 | ...;if SSN was prompted then reinitialize SSN ARRAY variable
|
---|
119 | ...I SSNP=1 S MPIFARR(2,DFN,.09,"E")="" S DIC=2,DR=".09" S DA=DFN,DA(2.01)=1,DIQ(0)="E",DIQ="MPIFARR" D EN^DIQ1 K DA,DIC,DIQ,DR
|
---|
120 | ...;**44 if the PSEUDO SSN REASON field exist
|
---|
121 | ..S DR="" ;reset DR to null to be able to concatenate the fields together since DR was just killed above
|
---|
122 | ..I $D(MPIFARR(2,DFN,.0906,"I")) D
|
---|
123 | ...;check to see if the SSN is a PSEUDO and the PSEUDO SSN REASON is null or "S" (FOLLOW-UP REQUIRED), if so add PSEUDO SSN REASON to the prompted fields
|
---|
124 | ...I MPIFARR(2,DFN,.09,"E")["P",(MPIFARR(2,DFN,.0906,"I")="") S DR=DR_".0906;" ;**48 correct when SSN is prompted
|
---|
125 | ...I MPIFARR(2,DFN,.09,"E")["P",(MPIFARR(2,DFN,.0906,"I")="S") S DR=DR_".09;" ;**48 correct when SSN is prompted
|
---|
126 | ..I $G(MPIFARR(2,DFN,994,"I"))="" S DR=DR_"994;" ;MULTIPLE BIRTH INDICATOR
|
---|
127 | ..S MPIMMN=$G(MPIFARR(2,DFN,.2403,"E")) ;MOTHER'S MAIDEN NAME
|
---|
128 | ..I $$VALDT(MPIMMN) S DR=DR_".2403;" ;Validate MMN value
|
---|
129 | ..S MPICTY=$G(MPIFARR(2,DFN,.092,"E")) ;PLACE OF BIRTH [CITY]
|
---|
130 | ..S MPIST=$G(MPIFARR(2,DFN,.093,"E")) ;PLACE OF BIRTH [STATE]
|
---|
131 | ..I $S($$VALDT(MPICTY):1,$$VALDT(MPIST):1,1:0) S DR=DR_".092;.093;" ;Validate POB [CITY] & [STATE] value
|
---|
132 | ..I $G(MPIFARR(2.01,1,.01,"E"))="" S DR=DR_"1",DR(2,2.01)=".01;1" ;ALIAS **44 ADDING ALIAS SSN TO FIELDS
|
---|
133 | ..I DR'="" D
|
---|
134 | ...D WRTLN
|
---|
135 | ...S DIE="^DPT(",DA=DFN,DIE("NO^")="BACK"
|
---|
136 | ...D ^DIE K DA,DIE,DR,DIC,DIQ
|
---|
137 | L -^DPT(DFN)
|
---|
138 | I $D(ZTQUEUED) S ZTREQ="@"
|
---|
139 | K MPIFRTN D VTQ^MPIFQ0
|
---|
140 | ;**43 No longer get list of potential matches to pick from
|
---|
141 | ;I $G(MPIFRTN)="" D
|
---|
142 | ;. ^ Quit at LM screen when presented with a list of possible matches
|
---|
143 | ;. \/ setup Local ICN and proceed
|
---|
144 | ;.N ICN,ERR
|
---|
145 | ;.S ICN=$$EN2^MPIFAPI()
|
---|
146 | ;.Q:ICN=""!(+ICN=-1)
|
---|
147 | ;.S ERR=$$SETICN^MPIF001(DFN,+ICN,$P(ICN,"V",2))
|
---|
148 | ;.Q:+ERR=-1
|
---|
149 | ;. ^ couldn't set ICN don't set other fields
|
---|
150 | ;.S ERR=$$SETLOC^MPIF001(DFN,1),ERR=$$CHANGE^MPIF001(DFN,$P($$SITE^VASITE,"^"))
|
---|
151 | K MPIFRTN,ZTREQ
|
---|
152 | Q
|
---|
153 | ;
|
---|
154 | MPIQQ(PDFN) ; Entry point for queuing d/c
|
---|
155 | ; Returned is -1^error message OR Task #
|
---|
156 | Q:'$D(PDFN) "-1^No DFN passed"
|
---|
157 | S ZTRTN="MPIQ^MPIFAPI(PDFN)"
|
---|
158 | I $D(DUZ) S ZTSAVE("DUZ")=DUZ
|
---|
159 | S ZTSAVE("PDFN")=PDFN,ZTSAVE("MPIFS")=1
|
---|
160 | ; ^ silent flag
|
---|
161 | S ZTIO="",ZTDTH=$$FMADD^XLFDT($$NOW^XLFDT,0,0,1,0)
|
---|
162 | D ^%ZTLOAD
|
---|
163 | D HOME^%ZIS K IO("Q")
|
---|
164 | N TSK S TSK=ZTSK
|
---|
165 | K ZTSAVE,ZTRTN,ZTIO,ZTDTH,ZTSK
|
---|
166 | Q TSK
|
---|
167 | ;
|
---|
168 | WRTLN ;**37 Write intro text ONLY if there are fields to ask
|
---|
169 | W !!,"Please verify or update the following information:",!
|
---|
170 | Q
|
---|
171 | ;
|
---|
172 | VALDT(VAL) ;**37 Validate value passed in.
|
---|
173 | ;Prompt if field contains invalid data (e.g., UNKNOWN, NOT KNOWN, etc.)
|
---|
174 | ;Returns 0 if not found
|
---|
175 | ;Returns 1 if found
|
---|
176 | I VAL="" Q 1
|
---|
177 | I $E($$UP^XLFSTR(VAL),1,3)="UNK" Q 1
|
---|
178 | I $E($$UP^XLFSTR(VAL),1,4)="NONE" Q 1
|
---|
179 | I $E($$UP^XLFSTR(VAL),1,4)="NOT " Q 1
|
---|
180 | I $$UP^XLFSTR(VAL)["UNAVAILABLE" Q 1
|
---|
181 | I $$UP^XLFSTR(VAL)["DECEASED" Q 1
|
---|
182 | I $E($$UP^XLFSTR(VAL),1,2)="DC" Q 1
|
---|
183 | Q 0
|
---|
184 | ;
|
---|