source: ccr/trunk/p/CCRMEDS3.m@ 227

Last change on this file since 227 was 227, checked in by Sam Habiel, 16 years ago

Added CCRMEDS4 for inpatient UD, and tiny fixes for the FMDTOUTCCCRUTIL call for CCRMEDS1 and 2

File size: 8.3 KB
Line 
1CCRMEDS3 ; WV/CCDCCR/SMH - CCR/CCD PROCESSING FOR MEDICATIONS - Outside_non-VA Meds;10/13/08
2 ;;0.1;CCDCCR;;;
3 ; Copyright 2008 WorldVistA. Licensed under the terms of the GNU
4 ; General Public License See attached copy of the License.
5 ;
6 ; This program is free software; you can redistribute it and/or modify
7 ; it under the terms of the GNU General Public License as published by
8 ; the Free Software Foundation; either version 2 of the License, or
9 ; (at your option) any later version.
10 ;
11 ; This program is distributed in the hope that it will be useful,
12 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ; GNU General Public License for more details.
15 ;
16 ; You should have received a copy of the GNU General Public License along
17 ; with this program; if not, write to the Free Software Foundation, Inc.,
18 ; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 ;
20 W "NO ENTRY FROM TOP",!
21 Q
22 ;
23EXTRACT(MINXML,DFN,OUTXML) ; EXTRACT MEDICATIONS INTO PROVIDED XML TEMPLATE
24 ;
25 ; MINXML is the Input XML Template, passed by name
26 ; DFN is Patient IEN
27 ; OUTXML is the resultant XML.
28 ;
29 ; MEDS is return array from RPC.
30 ; MAP is a mapping variable map (store result) for each med
31 ; MED is holds each array element from MEDS, one medicine
32 ;
33 ; Non-VA meds don't have an API. They are stored in file 55, subfile 52.2
34 ; Discontinued meds are indicated by the presence of a value in fields
35 ; 5 or 6 (STATUS 1 or 2, and DISCONTINUED DATE)
36 ; Will use Fileman API GETS^DIQ
37 ;
38 N MEDS,MAP
39 K ^TMP($J),NVA
40 D GETS^DIQ(55,DFN,"52.2*","IE","NVA") ; Output in NVA in FDA array format.
41 ; If NVA does not exist, then patient has no non-VA meds
42 I $D(NVA)=0 S @OUTXML@(0)=0 QUIT
43 ; Otherwise, we go on...
44 M MEDS=NVA(55.05)
45 ; We are done with NVA
46 K NVA
47 ;
48 I DEBUG ZWR MEDS
49 N FDAIEN S FDAIEN=0 ; For use in $Order in the MEDS array.
50 S MEDMAP=$NA(^TMP("GPLCCR",$J,"MEDMAP"))
51 N MEDCOUNT S MEDCOUNT=@MEDMAP@(0) ; We already have meds in the array
52 F S FDAIEN=$O(MEDS(FDAIEN)) Q:RXIEN="" D ; FOR EACH MEDICATION IN THE LIST
53 . N MED M MED=MEDS(FDAIEN)
54 . I MED(5,"I")!MED(6,"I") QUIT ; If disconinued, we don't want to pull it.
55 . S MEDCOUNT=MEDCOUNT+1
56 . S MAP=$NA(^TMP("GPLCCR",$J,"MEDMAP",MEDCOUNT))
57 . S @MEDMAP@(0)=@MEDMAP@(0)+1 ; INCREMENT TOTAL MEDS IN VAR ARRAY
58 . N RXIEN S RXIEN=$P(FDAIEN,",") ; First piece of FDAIEN is the number of the med for this patient
59 . I DEBUG W "RXIEN IS ",RXIEN,!
60 . I DEBUG W "MAP= ",MAP,!
61 . S @MAP@("MEDOBJECTID")="MED_OUTSIDE"_MEDCOUNT ; MEDCOUNT FOR ID
62 . S @MAP@("MEDISSUEDATETXT")="Documented Date"
63 . ; Field 6 is "Effective date", and we pull it in timson format w/ I
64 . S @MAP@("MEDISSUEDATE")=$$FMDTOUTC^CCRUTIL(MED(11,"I"),"DT")
65 . ; Med never filled; next 4 fields are not applicable.
66 . S @MAP@("MEDLASTFILLDATETXT")=""
67 . S @MAP@("MEDLASTFILLDATE")=""
68 . S @MAP@("MEDRXNOTXT")=""
69 . S @MAP@("MEDRXNO")=""
70 . S @MAP@("MEDTYPETEXT")="Medication"
71 . S @MAP@("MEDDETAILUNADORNED")="" ; Leave blank, field has its uses
72 . S @MAP@("MEDSTATUSTEXT")="ACTIVE" ; nearest status for pending meds
73 . S @MAP@("MEDSOURCEACTORID")="ACTORPROVIDER_"_MED(12,"I")
74 . S @MAP@("MEDPRODUCTNAMETEXT")=MED(.01,"E")
75 . ; NDC is field 31 in the drug file.
76 . ; The actual drug entry in the drug file is not necessarily supplied.
77 . ; It' node 1, internal form.
78 . N MEDIEN S MEDIEN=MED(1,"I")
79 . S @MAP@("MEDPRODUCTNAMECODEVALUE")=$S($L(MEDIEN):$$GET1^DIQ(50,MEDIEN,31,"E"),1:"")
80 . S @MAP@("MEDPRODUCTNAMECODINGINGSYSTEM")=$S($L(MEDIEN):"NDC",1:"")
81 . S @MAP@("MEDPRODUCTNAMECODEVERSION")=$S($L(MEDIEN):"none",1:"")
82 . S @MAP@("MEDBRANDNAMETEXT")=""
83 . I $L(MEDIEN) D DOSE^PSS50(MEDIEN,,,,,"DOSE")
84 . I $L(MEDIEN) N DOSEDATA M DOSEDATA=^TMP($J,"DOSE",MEDIEN)
85 . S @MAP@("MEDSTRENGTHVALUE")=$S($L(MEDIEN):DOSEDATA(901),1:"")
86 . S @MAP@("MEDSTRENGTHUNIT")=$S($P(DOSEDATA(902),U,2),1:"")
87 . ; Units, concentration, etc, come from another call
88 . ; $$CPRS^PSNAPIS which returns dosage-form^va class^strengh^unit
89 . ; This call takes nodes 1 and 3 of ^PSDRUG(D0,"ND") as parameters
90 . ; NDF Entry IEN, and VA Product Name
91 . ; These can be obtained using NDF^PSS50 (IEN,,,,,"SUBSCRIPT")
92 . ; Documented in the same manual.
93 . N NDFDATA,CONCDATA
94 . I $L(MEDIEN) D
95 . . D NDF^PSS50(MEDIEN,,,,,"CONC")
96 . . M NDFDATA=^TMP($J,"CONC",MEDIEN)
97 . . N NDFIEN S NDFIEN=$P(NDFDATA(20),U)
98 . . N VAPROD S VAPROD=$P(NDFDATA(22),U)
99 . . ; If a drug was not matched to NDF, then the NDFIEN is gonna be ""
100 . . ; and this will crash the call. So...
101 . . I NDFIEN="" S CONCDATA=""
102 . . E S CONCDATA=$$CPRS^PSNAPIS(NDFIEN,VAPROD)
103 . E S (NDFDATA,CONCDATA)="" ; This line is defensive programming to prevent undef errors.
104 . S @MAP@("MEDFORMTEXT")=$S($L(MEDIEN):$P(CONCDATA,U,1),1:"")
105 . S @MAP@("MEDCONCVALUE")=$S($L(MEDIEN):$P(CONCDATA,U,3),1:"")
106 . S @MAP@("MEDCONCUNIT")=$S($L(MEDIEN):$P(CONCDATA,U,4),1:"")
107 . S @MAP@("MEDSIZETEXT")=$S($L(MEDIEN):$P(NDFDATA(23),U,2)_" "_$P(NDFDATA(24),U,2),1:"")
108 . S @MAP@("MEDQUANTITYVALUE")="" ; not provided for in Non-VA meds.
109 . ; Oddly, there is no easy place to find the dispense unit.
110 . ; It's not included in the original call, so we have to go to the drug file.
111 . ; That would be DATA^PSS50(IEN,,,,,"SUBSCRIPT")
112 . ; Node 14.5 is the Dispense Unit
113 . I $L(MEDIEN) D
114 . . D DATA^PSS50(MEDIEN,,,,,"QTY")
115 . . N QTYDATA M QTYDATA=^TMP($J,"QTY",MEDIEN)
116 . . S @MAP@("MEDQUANTITYUNIT")=QTYDATA(14.5)
117 E S @MAP@("MEDQUANTITYUNIT")=""
118 . ;
119 . ; --- START OF DIRECTIONS ---
120 . ; Dosage is field 2, route is 3, schedule is 4
121 . ; These are all free text fields, and don't point to any files
122 . ; For that reason, I will use the field I never used before:
123 . ; MEDDIRECTIONDESCRIPTIONTEXT
124 . S @MAP@("M","DIRECTIONS",1,"MEDDIRECTIONDESCRIPTIONTEXT")=MED(2,"E")_" "_MED(3,"E")_" "_MED(4,"E")
125 . S @MAP@("M","DIRECTIONS",1,"MEDDOSEINDICATOR")="4" ; means look in description text. See E2369-05.
126 . S @MAP@("M","DIRECTIONS",1,"MEDDELIVERYMETHOD")=""
127 . S @MAP@("M","DIRECTIONS",1,"MEDDOSEVALUE")=""
128 . S @MAP@("M","DIRECTIONS",1,"MEDDOSEUNIT")=""
129 . S @MAP@("M","DIRECTIONS",1,"MEDRATEVALUE")=""
130 . S @MAP@("M","DIRECTIONS",1,"MEDRATEUNIT")=""
131 . S @MAP@("M","DIRECTIONS",1,"MEDVEHICLETEXT")=""
132 . S @MAP@("M","DIRECTIONS",1,"MEDDIRECTIONROUTETEXT")=""
133 . S @MAP@("M","DIRECTIONS",1,"MEDFREQUENCYVALUE")=""
134 . S @MAP@("M","DIRECTIONS",1,"MEDINTERVALVALUE")=""
135 . S @MAP@("M","DIRECTIONS",1,"MEDINTERVALUNIT")=""
136 . S @MAP@("M","DIRECTIONS",1,"MEDDURATIONVALUE")=""
137 . S @MAP@("M","DIRECTIONS",1,"MEDDURATIONUNIT")=""
138 . S @MAP@("M","DIRECTIONS",1,"MEDPRNFLAG")=""
139 . S @MAP@("M","DIRECTIONS",1,"MEDPROBLEMOBJECTID")=""
140 . S @MAP@("M","DIRECTIONS",1,"MEDPROBLEMTYPETXT")=""
141 . S @MAP@("M","DIRECTIONS",1,"MEDPROBLEMDESCRIPTION")=""
142 . S @MAP@("M","DIRECTIONS",1,"MEDPROBLEMCODEVALUE")=""
143 . S @MAP@("M","DIRECTIONS",1,"MEDPROBLEMCODINGSYSTEM")=""
144 . S @MAP@("M","DIRECTIONS",1,"MEDPROBLEMCODINGVERSION")=""
145 . S @MAP@("M","DIRECTIONS",1,"MEDPROBLEMSOURCEACTORID")=""
146 . S @MAP@("M","DIRECTIONS",1,"MEDSTOPINDICATOR")=""
147 . S @MAP@("M","DIRECTIONS",1,"MEDDIRSEQ")=""
148 . S @MAP@("M","DIRECTIONS",1,"MEDMULDIRMOD")=""
149 . ;
150 . ; --- END OF DIRECTIONS ---
151 . ;
152 . ; S @MAP@("MEDPTINSTRUCTIONS","F")="52.41^105"
153 . S @MAP@("MEDPTINSTRUCTIONS")=MED(10,1) ; WP Field
154 . S @MAP@("MEDFULLFILLMENTINSTRUCTIONS")=MED(14,1) ; WP Field
155 . S @MAP@("MEDRFNO")=""
156 . N RESULT S RESULT=$NA(^TMP("GPLCCR",$J,"MAPPED"))
157 . K @RESULT
158 . D MAP^GPLXPATH(MINXML,MAP,RESULT)
159 . ; D PARY^GPLXPATH(RESULT)
160 . ; MAPPING DIRECTIONS
161 . N MEDDIR1,DIRXML1 S DIRXML1="MEDDIR1" ; VARIABLE AND NAME VARIABLE TEMPLATE
162 . N MEDDIR2,DIRXML2 S DIRXML2="MEDDIR2" ; VARIABLE AND NAME VARIABLE RESULT
163 . D QUERY^GPLXPATH(MINXML,"//Medications/Medication/Directions",DIRXML1)
164 . D REPLACE^GPLXPATH(RESULT,"","//Medications/Medication/Directions")
165 . ; N MDZ1,MDZNA
166 . I DIRCNT>0 D ; IF THERE ARE DIRCTIONS
167 . . F MDZ1=1:1:DIRCNT D ; FOR EACH DIRECTION
168 . . . S MDZNA=$NA(@MAP@("M","DIRECTIONS",MDZ1))
169 . . . D MAP^GPLXPATH(DIRXML1,MDZNA,DIRXML2)
170 . . . D INSERT^GPLXPATH(RESULT,DIRXML2,"//Medications/Medication")
171 . D:MEDCOUNT=1 CP^GPLXPATH(RESULT,OUTXML) ; First one is a copy
172 . D:MEDCOUNT>1 INSINNER^GPLXPATH(OUTXML,RESULT) ; AFTER THE FIRST, INSERT INNER XML
173 N MEDTMP,MEDI
174 D MISSING^GPLXPATH(OUTXML,"MEDTMP") ; SEARCH XML FOR MISSING VARS
175 I MEDTMP(0)>0 D ; IF THERE ARE MISSING VARS - MARKED AS @@X@@
176 . W "MEDICATION MISSING ",!
177 . F MEDI=1:1:MEDTMP(0) W MEDTMP(MEDI),!
178 Q
179 ;
Note: See TracBrowser for help on using the repository browser.