Index: /fmts/trunk/p/C0XPT0.m
===================================================================
--- /fmts/trunk/p/C0XPT0.m	(revision 1615)
+++ /fmts/trunk/p/C0XPT0.m	(revision 1616)
@@ -1,3 +1,3 @@
-C0XPT0 ; VEN/SMH - Get patient data and do something about it ;2013-02-21  4:52 PM
+C0XPT0 ; VEN/SMH - Get patient data and do something about it ;2013-04-10  4:23 PM
  ;;1.1;FILEMAN TRIPLE STORE;;
  ;
@@ -26,4 +26,5 @@
  SET PARAM("MRN")=$$MRN(DEM)
  NEW RETURN
+ WRITE !!,PARAM("NAME"),!
  D ADDPT(.RETURN,.PARAM)
  N DFN S DFN=$P(RETURN(1),U,2)
Index: /fmts/trunk/p/C0XPT3.m
===================================================================
--- /fmts/trunk/p/C0XPT3.m	(revision 1615)
+++ /fmts/trunk/p/C0XPT3.m	(revision 1616)
@@ -1,3 +1,3 @@
-C0XPT3	;ISI/MLS,VEN/SMH -- MEDS IMPORT ;2013-02-22  3:38 PM
+C0XPT3	;ISI/MLS,VEN/SMH -- MEDS IMPORT ;2013-04-10  6:54 PM
 	;;1.0;FILEMAN TRIPLE STORE;;Jun 26,2012;Build 29
 	;
@@ -7,4 +7,12 @@
 	D ONETYPE^C0XGET3($NA(^TMP($J,"MEDS")),G,"sp:Medication")
 	;
+	; PRIVATE TO SAM -- PRIVATE TO SAM -- PRIVATE TO SAM
+	; Delete the old drugs for this patient
+	N DIK,DA
+	S DIK="^PS(55,",DA=DFN D ^DIK ; bye bye
+	S DIK="^PSRX(" F DA=0:0 S DA=$O(^PSRX(DA)) Q:'DA  D:$P(^(DA,0),U,2)=DFN ^DIK
+	S DIK="^OR(100," F DA=0:0 S DA=$O(^OR(100,DA)) Q:'DA  D:+$P(^(DA,0),U,2)=DFN ^DIK
+	; PRIVATE TO SAM -- PRIVATE TO SAM -- PRIVATE TO SAM
+	;
 	; For each medication (C0XI = COUNTER; S = Medication Node as Subject)
 	N C0XI,S F C0XI=0:0 S C0XI=$O(^TMP($J,"MEDS",C0XI)) Q:'C0XI  S S=^(C0XI) DO MED1(G,S,DFN)
@@ -39,5 +47,5 @@
 	N DN S DN=$$GSPO1^C0XGET3(G,S,"sp:drugName.dcterms:title") ; Drug Name
 	;
-	W S," ",FVALUE_FUNIT," ",DOSE," ",DUNIT," ",INST," ",DN,!
+	W S," ",FVALUE_FUNIT," ",DOSE," ",DUNIT," ",INST," ",DN," ",RXN,!
 	;
 	; 6. Get Fill Dates
@@ -61,5 +69,5 @@
 	. S FILLS(RXN,FILLDATE,"sp:quantityDispensed.sp:unit")=$TR($$GSPO1^C0XGET3(G,S,"sp:quantityDispensed.sp:unit"),"{}")
 	;
-	; ZWRITE:$D(FILLS) FILLS
+	ZWRITE:$D(FILLS) FILLS
 	;
 	D 
@@ -81,8 +89,15 @@
 	; 6. Coded sig (FVALUE, FUNIT, DOSE, DUNIT)
 	; 7. Fill label log section of Rx? Maybe not.
+	;
+	I '$$EXIST^C0CRXNLK(RXN) S $EC=",U1," ; Invalid RxNorm code passed.
+	;
 	N ORZPT,PSODFN S (ORZPT,PSODFN)=DFN  ;"" ;POINTER TO PATIENT FILE (#2)
 	N PNTSTAT S PNTSTAT=20 ; NON-VA ;RX PATIENT STATUS FILE (#53)
 	N PROV S PROV=$$NP^C0XPT0() ;NEW PERSON FILE (#200)
-	N PSODRUG S PSODRUG=94558 ;POINTER TO DRUG FILE (#50) ; TODO: HARDCODED; RXN
+	I $$ISBRAND^C0CRXNLK(RXN) S RXN=$$BR2GEN^C0CRXNLK(RXN) ; Get Generic Drug for Brand
+	N LOCALDRUG S LOCALDRUG=+$$RXN2MEDS^C0CRXNLK(RXN)
+	I 'LOCALDRUG S LOCALDRUG=$$ADDDRUG(RXN)
+	W "(debug) Local Drug IEN: "_LOCALDRUG,!
+	N PSODRUG S PSODRUG=LOCALDRUG  ;POINTER TO DRUG FILE (#50) ; TODO: HARDCODED; RXN
 	S PSODRUG("DEA")=$P($G(^PSDRUG(PSODRUG,0)),U,3)
 	N QTY S QTY=FILQTY ; NUMBER ;0;7 NUMBER (Required)
@@ -109,5 +124,4 @@
 	N REASON S REASON="E" ;Activity log ; SET ([E]dit)
 	N INIT S INIT=.5 ;NEW PERSON FILE (#200)
-	N COM S COM="Oupatient medication order." ;TEXT
 	N SIG S SIG=INST ;#51,.01
 	;
@@ -120,5 +134,5 @@
 	;
 	L +^PSRX(0):0 ; Lock zero node while we get the record.
-	N PSOIEN S PSOIEN=$P($G(^PSRX(0)),"^",3)+1 ; Next available IEN
+	N PSOIEN S PSOIEN=$O(^PSRX(" "),-1)+1 ; Next available IEN
 	I $D(^PSRX(PSOIEN)) S $EC=",U1," ; Next number not available. File issue.
 	S $P(^PSRX(0),U,3)=PSOIEN ; Reset next available number.
@@ -160,5 +174,5 @@
 	. S $P(^PSRX(PSOIEN,"A",C0XREFCT+1,0),"^",3)=INIT ;NEW PERSON FILE (#200)
 	. S $P(^PSRX(PSOIEN,"A",C0XREFCT+1,0),"^",4)=0 ;NUMBER - RX REFERENCE
-	. S $P(^PSRX(PSOIEN,"A",C0XREFCT+1,0),"^",5)="Imported from Smart" ;TEXT
+	. S $P(^PSRX(PSOIEN,"A",C0XREFCT+1,0),"^",5)="Imported from Smart"
 	. ;
 	. Q:C0XFILL=FILDT  ; Don't add refill data for first fill!
@@ -220,2 +234,91 @@
 	Q
 	;
+ADDDRUG(RXN,NDC,BARCODE) ; Public Proc; Add Drug to Drug File
+ ; Input: RXN - RxNorm Semantic Clinical Drug CUI by Value. Required.
+ ; Input: NDC - Drug NDC by Value. Optional. Pass in 11 digit format without dashes.
+ ; Input: BARCODE - Wand Barcode. Optional. Pass exactly as wand reads minus control characters.
+ ; Output: None.
+ ;
+ ; Prelim Checks
+ I '$G(RXN) S $EC=",U1," ; Required
+ I $L($G(NDC)),$L(NDC)'=11 S $EC=",U1,"
+ ;
+ N PSSZ S PSSZ=1    ; Needed for the drug file to let me in!
+ ;
+ ; If RXN refers to a brand drug, get the generic instead.
+ I $$ISBRAND^C0CRXNLK(RXN) S RXN=$$BR2GEN^C0CRXNLK(RXN)
+ W !,"(debug) RxNorm is "_RXN,!
+ ;
+ ; Get first VUID for this RxNorm drug
+ N VUID S VUID=+$$RXN2VUI^C0CRXNLK(RXN)
+ Q:'VUID
+ W "(debug) VUID for RxNorm CUI "_RXN_" is "_VUID,!
+ ;
+ ; IEN in 50.68
+ N C0XVUID ; For Searching Compound Index
+ S C0XVUID(1)=VUID
+ S C0XVUID(2)=1
+ N F5068IEN S F5068IEN=$$FIND1^DIC(50.68,"","XQ",.C0XVUID,"AMASTERVUID")
+ Q:'F5068IEN
+ W "F 50.68 IEN (debug): "_F5068IEN,!
+ ;
+ ; FDA Array
+ N C0XFDA
+ ;
+ ; Name, shortened
+ S C0XFDA(50,"+1,",.01)=$E($$GET1^DIQ(50.68,F5068IEN,.01),1,40)
+ ;
+ ; File BarCode as a Synonym for BCMA
+ I $L($G(BARCODE)) D
+ . S C0XFDA(50.1,"+2,+1,",.01)=BARCODE
+ . S C0XFDA(50.1,"+2,+1,",1)="Q"
+ ;
+ ; Brand Names
+ N BNS S BNS=$$RXN2BNS^C0CRXNLK(RXN) ; Brands
+ I $L(BNS) N I F I=1:1:$L(BNS,U) D
+ . N IENS S IENS=I+2
+ . S C0XFDA(50.1,"+"_IENS_",+1,",.01)=$$UP^XLFSTR($E($P(BNS,U,I),1,40))
+ . S C0XFDA(50.1,"+"_IENS_",+1,",1)="T"
+ ;
+ ; NDC (string)
+ I $G(NDC) S C0XFDA(50,"+1,",31)=$E(NDC,1,5)_"-"_$E(NDC,6,9)_"-"_$E(NDC,10,11)
+ ;
+ ; Dispense Unit (string)
+ S C0XFDA(50,"+1,",14.5)=$$GET1^DIQ(50.68,F5068IEN,"VA DISPENSE UNIT")
+ ;
+ ; National Drug File Entry (pointer to 50.6)
+ S C0XFDA(50,"+1,",20)="`"_$$GET1^DIQ(50.68,F5068IEN,"VA GENERIC NAME","I")
+ ;
+ ; VA Product Name (string)
+ S C0XFDA(50,"+1,",21)=$E($$GET1^DIQ(50.68,F5068IEN,.01),1,70)
+ ;
+ ; PSNDF VA PRODUCT NAME ENTRY (pointer to 50.68)
+ S C0XFDA(50,"+1,",22)="`"_F5068IEN
+ ;
+ ; DEA, SPECIAL HDLG (string)
+ D  ; From ^PSNMRG
+ . N CS S CS=$$GET1^DIQ(50.68,F5068IEN,"CS FEDERAL SCHEDULE","I")
+ . S CS=$S(CS?1(1"2n",1"3n"):+CS_"C",+CS=2!(+CS=3)&(CS'["C"):+CS_"A",1:CS)
+ . S C0XFDA(50,"+1,",3)=CS
+ ;
+ ; NATIONAL DRUG CLASS (pointer to 50.605) (triggers VA Classification field)
+ S C0XFDA(50,"+1,",25)="`"_$$GET1^DIQ(50.68,F5068IEN,"PRIMARY VA DRUG CLASS","I")
+ ;
+ ; Right Now, I don't file the following which ^PSNMRG does (cuz I don't need them)
+ ; - Package Size (derived from NDC/UPN file)
+ ; - Package Type (ditto)
+ ; - CMOP ID (from $$PROD2^PSNAPIS)
+ ; - National Formulary Indicator (from 50.68)
+ ;
+ ; Next Step is to kill Old OI if Dosage Form doesn't match
+ ; Won't do that here as it's assumed any drugs that's added is new.
+ ; This happens at ^PSNPSS
+ ;
+ ; Next Step: Kill off old doses and add new ones. We need to to that.
+ ; TODO: Add doses. Happens at EN1^PSSUTIL.
+ N C0XERR,C0XIEN
+ D UPDATE^DIE("E","C0XFDA","C0XIEN","C0XERR")
+ ;
+ S:$D(C0XERR) $EC=",U1,"
+ ;
+ QUIT C0XIEN(1)
