source: fmts/trunk/p/C0XPT3.m@ 1609

Last change on this file since 1609 was 1609, checked in by Sam Habiel, 11 years ago

Medications: Can now add a fake prescription to the record

File size: 8.3 KB
Line 
1C0XPT3 ;ISI/MLS,VEN/SMH -- MEDS IMPORT ;2013-02-21 5:05 PM
2 ;;1.0;FILEMAN TRIPLE STORE;;Jun 26,2012;Build 29
3 ;
4MEDS(G,DFN) ; Private Proc; Extract Medication Data from a Patient's Graph
5 ; G - Patient Graph, DFN - you should know this
6 K ^TMP($J,"MEDS")
7 D ONETYPE^C0XGET3($NA(^TMP($J,"MEDS")),G,"sp:Medication")
8 ;
9 ; For each medication (I = COUNTER; S = Medication Node as Subject)
10 N C0XI,S F C0XI=0:0 S C0XI=$O(^TMP($J,"MEDS",C0XI)) Q:'C0XI S S=^(C0XI) DO MED1(G,S,DFN)
11 K ^TMP($J,"MEDS")
12 QUIT
13 ;
14MED1(G,S,DFN) ; Private Procedure; Process each medication in Graph.
15 ; G = Graph; S = Medication Description ID as subject.
16 ;
17 ; 1. Start Date; obtain and then conv to fileman format
18 N STARTDT S STARTDT=$$GSPO1^C0XGET3(G,S,"sp:startDate") ; Duh! Start Date.
19 D
20 . N %DT,X,Y S X=STARTDT D ^%DT S STARTDT=Y ; New stack level for variables.
21 ;
22 ;DEBUG.ASSERT that STARTDT is greater than 1900
23 I STARTDT'>2000000 S $EC=",U1,"
24 ;
25 ; 2. Frequency
26 N FVALUE S FVALUE=$$GSPO1^C0XGET3(G,S,"sp:frequency.sp:value")
27 N FUNIT S FUNIT=$$GSPO1^C0XGET3(G,S,"sp:frequency.sp:unit")
28 ;
29 ; 3. Dose Quantity
30 ; Get value, get unit and strip the braces out.
31 N DOSE S DOSE=$$GSPO1^C0XGET3(G,S,"sp:quantity.sp:value")
32 N DUNIT S DUNIT=$$GSPO1^C0XGET3(G,S,"sp:quantity.sp:unit"),DUNIT=$TR(DUNIT,"{}")
33 ;
34 ; 4. Instructions
35 N INST S INST=$$GSPO1^C0XGET3(G,S,"sp:instructions")
36 ;
37 ; 5. Drug Name and Code
38 N RXN S RXN=$$GSPO1^C0XGET3(G,S,"sp:drugName.sp:code"),RXN=$P(RXN,"/",$L(RXN,"/")) ; RxNorm Code
39 N DN S DN=$$GSPO1^C0XGET3(G,S,"sp:drugName.dcterms:title") ; Drug Name
40 ;
41 W S," ",FVALUE_FUNIT," ",DOSE," ",DUNIT," ",INST," ",DN,!
42 ;
43 ; 6. Get Fill Dates
44 N FULF ; Fulfillments
45 D GSPO^C0XGET3($NA(FULF),G,S,"sp:fulfillment")
46 ;
47 N FILLS ; Fills array. Contains every time a drug was dispensed.
48 N FILL S FILL="" F S FILL=$O(FULF(FILL)) Q:FILL="" D
49 . N S S S=FULF(FILL) ; New subject; subsumes above one in this loop
50 . ;
51 . ; Dispense Date
52 . N FILLDATE S FILLDATE=$$GSPO1^C0XGET3(G,S,"dcterms:date")
53 . D
54 . . N %DT,X,Y S X=FILLDATE D ^%DT S FILLDATE=Y
55 . I FILLDATE<2000000 W $EC=",U1," ; Converstion error
56 . ;
57 . S FILLS(RXN,FILLDATE,"sp:dispenseDaysSupply")=$$GSPO1^C0XGET3(G,S,"sp:dispenseDaysSupply") ; Self Explanatory?
58 . ;
59 . ; Get quantity value and unit
60 . S FILLS(RXN,FILLDATE,"sp:quantityDispensed.sp:value")=$$GSPO1^C0XGET3(G,S,"sp:quantityDispensed.sp:value")
61 . S FILLS(RXN,FILLDATE,"sp:quantityDispensed.sp:unit")=$TR($$GSPO1^C0XGET3(G,S,"sp:quantityDispensed.sp:unit"),"{}")
62 ;
63 ; ZWRITE:$D(FILLS) FILLS
64 ;
65 D
66 . N FILDT,FILQTY,FILDAYS
67 . S FILDT=$O(FILLS(RXN,""))
68 . I FILDT S FILQTY=FILLS(RXN,FILDT,"sp:quantityDispensed.sp:value"),FILDAYS=FILLS(RXN,FILDT,"sp:dispenseDaysSupply")
69 . E S (FILQTY,FILDAYS)=""
70 . D PREP(DFN,RXN,INST,FILDT,FILQTY,FILDAYS)
71 ;
72 QUIT
73PREP(DFN,RXN,INST,FILDT,FILQTY,FILDAYS) ;
74 N ORZPT,PSODFN S (ORZPT,PSODFN)=DFN ;"" ;POINTER TO PATIENT FILE (#2)
75 N PNTSTAT S PNTSTAT=20 ; NON-VA ;RX PATIENT STATUS FILE (#53)
76 N PROV S PROV=$$NP^C0XPT0() ;NEW PERSON FILE (#200)
77 N PSODRUG S PSODRUG=94558 ;POINTER TO DRUG FILE (#50) ; TODO: HARDCODED; RXN
78 S PSODRUG("DEA")=$P($G(^PSDRUG(PSODRUG,0)),U,3)
79 N QTY S QTY=FILQTY ; NUMBER ;0;7 NUMBER (Required)
80 N DAYSUPLY S DAYSUPLY=FILDAYS ;NUMBER ; 0;8 NUMBER (Required);
81 N REFIL S REFIL=0 ;NUMBER ; 0;9 NUMBER (Required)
82 N ORDCONV S ORDCONV=1 ;'1' FOR ORDER CONVERTED;'2' FOR EXPIRATION TO CPRS;
83 N COPIES S COPIES=1 ;NUMBER
84 N MLWIND S MLWIND="W" ; Mail/Window: 'M' or 'W'
85 N ENTERBY S ENTERBY=.5 ;NEW PERSON FILE (#200) - POSTMASTER
86 N UNITPRICE S UNITPRICE=$P(^PSDRUG(PSODRUG,660),U,6) ;0.009 ;"" ;NUMBER
87 N PSOSITE S PSOSITE=$O(^PS(59,0)) ; OUTPATIENT SITE FILE (#59); get first one
88 N %,LOGDT D NOW^%DTC S LOGDT=% ;LOGIN DATE ; 2;1 DATE (Required)
89 N FILLDT S FILLDT=FILDT ;DATE; First fill date from our data.
90 N ISSDT S ISSDT=FILLDT ;DATE
91 N DISPDT S DISPDT=ISSDT ;DATE
92 N X D
93 . N X1,X2
94 . S X1=DISPDT,X2=180 D C^%DTC ;Default expiration of T+180
95 N EXPIRDT S EXPIRDT=X ;
96 N PORDITM S PORDITM=$P($G(^PSDRUG(PSODRUG,2)),U,1) ;PHARMACY ORDERABLE ITEM FILE (#50.7)
97 N STATUS S STATUS=0 ;STA;1 SET (Required) ; '0' FOR ACTIVE;
98 N TRNSTYP S TRNSTYP=1 ; IB ACTION TYPE FILE (#350.1)
99 N LDISPDT S LDISPDT=FILLDT ; 3;1 DATE
100 N REASON S REASON="E" ;Activity log ; SET ([E]dit)
101 N INIT S INIT=DUZ ;NEW PERSON FILE (#200)
102 N COM S COM="Oupatient medication order." ;TEXT
103 N SIG S SIG=INST ;#51,.01
104 ;
105CREATE ; fall through
106 ;
107 N PSONEW
108 D AUTO^PSONRXN ;RX auto number
109 I $G(PSONEW("RX #"))="" S $EC=",U1," ; Auto-numbering not turned on!
110 N RXNUM S RXNUM=PSONEW("RX #") ; Rx Number, again...
111 ;
112 L +^PSRX(0):0 ; Lock zero node while we get the record.
113 N PSOIEN S PSOIEN=$P($G(^PSRX(0)),"^",3)+1 ; Next available IEN
114 I $D(^PSRX(PSOIEN)) S $EC=",U1," ; Next number not available. File issue.
115 S $P(^PSRX(0),U,3)=PSOIEN ; Reset next available number.
116 S $P(^PSRX(PSOIEN,0),"^",1)=RXNUM ; 0;1 FREE TEXT (Required)
117 L -^PSRX(0) ; Unlock zero node, we now got it
118 ;
119 L +^PSRX(PSOIEN):0 ; Lock record node
120 S $P(^PSRX(PSOIEN,0),"^",13)=ISSDT ; 0;13 DATE (Required)
121 S $P(^PSRX(PSOIEN,0),"^",2)=ORZPT ;POINTER TO PATIENT FILE (#2)
122 S $P(^PSRX(PSOIEN,0),"^",3)=PNTSTAT ;RX PATIENT STATUS FILE (#53)
123 S $P(^PSRX(PSOIEN,0),"^",4)=PROV ;NEW PERSON FILE (#200)
124 S $P(^PSRX(PSOIEN,0),"^",5)="" ; Outpatient ; LOC ;HOSPITAL LOCATION FILE (#44)
125 S $P(^PSRX(PSOIEN,0),"^",6)=PSODRUG ;POINTER TO DRUG FILE (#50)
126 S $P(^PSRX(PSOIEN,0),"^",7)=QTY ;NUMBER ;0;7 NUMBER (Required)
127 S $P(^PSRX(PSOIEN,0),"^",8)=DAYSUPLY ;NUMBER ; 0;8 NUMBER (Required)
128 S $P(^PSRX(PSOIEN,0),"^",9)=REFIL ;NUMBER ; 0;9 NUMBER (Required)
129 S $P(^PSRX(PSOIEN,0),"^",11)=MLWIND ;'M' or 'W'
130 S $P(^PSRX(PSOIEN,0),"^",16)=ENTERBY ;NEW PERSON FILE (#200)
131 S $P(^PSRX(PSOIEN,0),"^",17)=UNITPRICE ;NUMBER
132 S $P(^PSRX(PSOIEN,0),"^",18)=COPIES ;COPIES
133 S $P(^PSRX(PSOIEN,0),"^",19)=ORDCONV ;ORDER CONVERTED 0;19 SET ['1' FOR ORDER CONVERTED;'2' FOR EXPIRATION TO CPRS;]
134 ;
135 S $P(^PSRX(PSOIEN,2),"^",1)=LOGDT ;LOGIN DATE ; 2;1 DATE (Required)
136 S $P(^PSRX(PSOIEN,2),"^",2)=FILLDT ;FILL DATE
137 ;S $P(^PSRX(PSOIEN,2),"^",3)=PHARMACIST ; "" ; PHARMACIST ;2;3 POINTER TO NEW PERSON FILE (#200)
138 ;S $P(^PSRX(PSOIEN,2),"^",4)="" ; LOT # 2;4 FREE TEXT
139 S $P(^PSRX(PSOIEN,2),"^",5)=DISPDT ; DISPENSED DATE 2;5 DATE (Required)
140 S $P(^PSRX(PSOIEN,2),"^",6)=EXPIRDT ;"" ; EXPIRATION DATE
141 S $P(^PSRX(PSOIEN,2),"^",9)=PSOSITE ;2;9 POINTER TO OUTPATIENT SITE FILE (#59)
142 ;
143 S $P(^PSRX(PSOIEN,3),U,1)=DISPDT ;LAST DISPENSED DATE 3;1 DATE
144 ;
145 S ^PSRX(PSOIEN,"A",0)="^52.3DA^1^1"
146 S $P(^PSRX(PSOIEN,"A",1,0),"^",1)=LOGDT ;DATE
147 S $P(^PSRX(PSOIEN,"A",1,0),"^",2)=REASON ;SET
148 S $P(^PSRX(PSOIEN,"A",1,0),"^",3)=INIT ;NEW PERSON FILE (#200)
149 S $P(^PSRX(PSOIEN,"A",1,0),"^",4)=0 ;NUMBER - RX REFERENCE
150 S $P(^PSRX(PSOIEN,"A",1,0),"^",5)="ISI automated entry." ;TEXT
151 ;
152 S ^PSRX(PSOIEN,"OR1")=PORDITM ;PHARMACY ORDERABLE ITEM FILE (#50.7)
153 ;
154 S $P(^PSRX(PSOIEN,"POE"),"^",1)=1 ; POE RX POE;1 SET ['1' FOR YES;]
155 ;
156 S $P(^PSRX(PSOIEN,"SIG"),"^",1)=SIG ;SIG;1 FREE TEXT (Required) medication instruction DIC(51)
157 S $P(^PSRX(PSOIEN,"SIG"),"^",2)=0 ;OERR SIG (SET: 0 for NO; 1 for YES)
158 ;
159 S $P(^PSRX(PSOIEN,"STA"),"^",1)=STATUS ;STA;1 SET (Required) ; '0' FOR ACTIVE;
160 ;
161 ;S ^PSRX(PSOIEN,"IB")=TRNSTYP ;COPAY TRANSACTION TYPE IB ACTION TYPE FILE (#350.1)
162 S ^PSRX(PSOIEN,"TYPE")=0 ;TYPE OF RX TYPE;1 NUMBER
163 D OERR(PSOIEN),F55,F52,F525
164 L -PSRX(PSOIEN) ; Unlock record
165 Q
166 ;
167OERR(PSOIEN) ;UPDATES OR1 NODE
168 ;THE SECOND PIECE IS KILLED BEFORE MAKING THE CALL
169 S $P(^PSRX(PSOIEN,"OR1"),"^",2)=""
170 N PSXRXIEN,STAT,PSSTAT,COMM,PSNOO
171 S PSXRXIEN=PSOIEN,STAT="SN",PSSTAT="CM",COMM="",PSNOO="W"
172 D EN^PSOHLSN1(PSXRXIEN,STAT,PSSTAT,COMM,PSNOO)
173 QUIT
174F55 ; - File data into ^PS(55)
175 ;S PSODFN=DFN
176 S:'$D(^PS(55,PSODFN,"P",0)) ^(0)="^55.03PA^^"
177 F PSOX1=$P(^PS(55,PSODFN,"P",0),"^",3):1 Q:'$D(^PS(55,PSODFN,"P",PSOX1))
178 S ^PS(55,PSODFN,"P",PSOX1,0)=PSOIEN,$P(^PS(55,PSODFN,"P",0),"^",3,4)=PSOX1_"^"_($P(^PS(55,PSODFN,"P",0),"^",4)+1)
179 S:$P($G(^PSRX(PSOIEN,2)),"^",6) ^PS(55,PSODFN,"P","A",$P($G(^PSRX(PSOIEN,2)),"^",6),PSOIEN)=""
180 K PSOX1
181 Q
182F52 ;; - Re-indexing file 52 entry
183 K DIK,DA S DIK="^PSRX(",DA=PSOIEN D IX1^DIK K DIK
184 Q
185 ;
186F525 ;UPDATE SUSPENSE FILE
187 Q:$G(^PSRX(PSOIEN,"STA"))'=5
188 S DA=PSOIEN,X=PSOIEN,FDT=$P($G(^PSRX(PSOIEN,2)),"^",2),TYPE=$P($G(^PSRX(PSOIEN,0)),"^",11)
189 S DIC="^PS(52.5,",DIC(0)="L",DLAYGO=52.5,DIC("DR")=".02///"_FDT_";.03////"_$P(^PSRX(PSOIEN,0),"^",2)_";.04////"_TYPE_";.05///0;.06////"_DIV_";2///0" K DD,D0 D FILE^DICN K DD,D0
190 Q
191 ;
Note: See TracBrowser for help on using the repository browser.