Index: Scheduling/trunk/m/BSDX26.m
===================================================================
--- Scheduling/trunk/m/BSDX26.m	(revision 1027)
+++ Scheduling/trunk/m/BSDX26.m	(revision 1034)
@@ -1,55 +1,130 @@
-BSDX26	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
-	;;1.41;BSDX;;Sep 29, 2010
-	;
-	;
-EDITAPTD(BSDXY,BSDXAPTID,BSDXNOTE)	;EP
-	;Entry point for debugging
-	;
-	;D DEBUG^%Serenji("EDITAPT^BSDX26(.BSDXY,BSDXAPTID,BSDXNOTE)")
-	Q
-	;
-EDITAPT(BSDXY,BSDXAPTID,BSDXNOTE)	;EP Edit appointment (only note text can be edited)
-	;
-	N BSDXNOD,BSDXPATID,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXZ,BSDXIENS
-	;
-	D ^XBKVAR
-	S X="ETRAP^BSDX26",@^%ZOSF("TRAP")
-	S BSDXI=0
-	K ^BSDXTMP($J)
-	S BSDXY="^BSDXTMP("_$J_")"
-	S ^BSDXTMP($J,BSDXI)="T00020ERRORID"_$C(30)
-	S BSDXI=BSDXI+1
-	TSTART
-	I '+BSDXAPTID D ERR(BSDXI,"BSDX26: Invalid Appointment ID") Q
-	I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"BSDX26: Invalid Appointment ID") Q
-	;Add WP field
-	;I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
-	S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
-	I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
-	I $D(BSDXNOTE(.5)) D
-	. D WP^DIE(9002018.4,BSDXAPTID_",",1,"","BSDXNOTE","BSDXMSG")
-	;
-	;Return Recordset
-	TCOMMIT
-	S BSDXI=BSDXI+1
-	S ^BSDXTMP($J,BSDXI)="-1"_$C(30)
-	S BSDXI=BSDXI+1
-	S ^BSDXTMP($J,BSDXI)=$C(31)
-	Q
-	;
-	;
-ERR(BSDXI,BSDXERR)	;Error processing
-	S BSDXI=BSDXI+1
-	TROLLBACK
-	S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
-	S BSDXI=BSDXI+1
-	S ^BSDXTMP($J,BSDXI)=$C(31)
-	Q
-	;
-ETRAP	;EP Error trap entry
-	TROLLBACK
-	D ^%ZTER
-	I '$D(BSDXI) N BSDXI S BSDXI=999999
-	S BSDXI=BSDXI+1
-	D ERR(BSDXI,"BSDX26 Error: "_$G(%ZTERROR))
-	Q
+BSDX26  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 11/18/10 5:36pm
+    ;;1.42;BSDX;;Sep 29, 2010
+    ; Change History:
+    ; 3101023 - UJO/SMH - Addition of restartable transaction; relocation of tx.
+    ; --> Thanks to Zach Gonzalez and Rick Marshall
+    ; 3101205 - UJO/SMH - Extensive refactoring.
+    ;
+    ; Error Reference:
+    ; -1: Appt ID is not a number
+    ; -2: Appt IEN is not in ^BSDXAPPT
+    ; -3: FM Failure to file WP field in ^BSDXAPPT
+    ;
+EDITAPTD(BSDXY,BSDXAPTID,BSDXNOTE)  ;EP
+    ;Entry point for debugging
+    ;
+    D DEBUG^%Serenji("EDITAPT^BSDX26(.BSDXY,BSDXAPTID,BSDXNOTE)")
+    Q
+UT ; Unit Tests
+    ; Test 1: Make sure this damn thing works
+    N ZZZ
+    N %H S %H=$H
+    N NOTE S NOTE="New Note "_%H
+    D EDITAPT(.ZZZ,188,NOTE)
+    I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR",! B
+    ; Test 2: Test Errors -1 and -2
+    N ZZZ
+    N NOTE S NOTE="Nothing important"
+    D EDITAPT(.ZZZ,"BLAHBLAH",NOTE)
+    I +^BSDXTMP($J,1)'=-1 W "ERROR IN -1",! B
+    D EDITAPT(.ZZZ,298734322,NOTE)
+    I +^BSDXTMP($J,1)'=-2 W "ERROR IN -2",! B
+    ; Test 4: M Error
+    N bsdxdie S bsdxdie=1
+    D EDITAPT(.ZZZ,188,NOTE)
+    I +^BSDXTMP($J,1)'=-100 W "ERROR IN -100",! B
+    ; Test 5: Trestart
+    N bsdxrestart S bsdxrestart=1
+    N %H S %H=$H
+    N NOTE S NOTE="New Note "_%H
+    D EDITAPT(.ZZZ,188,NOTE)
+    I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR in TRESTART",! B
+    ; Test for Hosp Location Update
+    N DATE S DATE=$$NOW^XLFDT()
+    D APPADD^BSDX07(.ZZZ,DATE,DATE+.001,3,"Dr Office",30,"Old Note",1)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+    D EDITAPT(.ZZZ,APTID,"New Note")
+    I ^BSDXAPPT(APTID,1,1,0)'="New Note" W "Error in HL Section",! B
+    I $P(^SC(2,"S",DATE,1,1,0),U,4)'="New Note" W "Error in HL Section",! B
+    QUIT
+    ;
+EDITAPT(BSDXY,BSDXAPTID,BSDXNOTE)   ;EP Edit appointment (only note text can be edited)
+    ; Called by RPC: BSDX EDIT APPOINTMENT
+    ;
+    ; Edits Appointment Text in BSDX APPOINTMENT file & Hosp Location (44) file
+    ;
+    ; Parameters:
+    ; - BSDXY: Global Return (RPC must be set to Global Array)
+    ; - BSDXAPTID: Appointment IEN in BSDX APPOINTMENT
+    ; - BSDXNOTE: New note
+    ;
+    ; Return:
+    ; ADO.net Recordset having 1 field: ERRORID
+    ; If Okay: -1; otherwise, positive integer with message
+    ;
+    ; Return Array; set Return and clear array
+    S BSDXY=$NA(^BSDXTMP($J))
+    K ^BSDXTMP($J)
+    ; ET
+    N $ET S $ET="G ETRAP^BSDX26"
+    ; Set up basic DUZ variables
+    D ^XBKVAR
+    ; Counter
+    N BSDXI S BSDXI=0
+    ; Header Node
+    S ^BSDXTMP($J,BSDXI)="T00020ERRORID"_$C(30)
+    ; Restartable txn for GT.M. Restored vars are Params + BSDXI.
+    TSTART (BSDXY,BSDXAPTID,BSDXNOTE,BSDXI):T="BSDX EDIT APPOINTMENT^BSDX26"
+    ;
+    ;;;test for error inside transaction. See if %ZTER works
+    I $G(bsdxdie) S X=1/0
+    ;;;test
+    ;;;test for TRESTART
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+    ;;;test
+    ;
+    ; Validate Appointment ID
+    I '+BSDXAPTID D ERR(BSDXI,"-1~BSDX26: Invalid Appointment ID") QUIT
+    I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-2~BSDX26: Invalid Appointment ID") QUIT
+    ; Put the WP in decendant fields from the root to file as a WP field
+    S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+    I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+    N BSDXMSG ; Message in case of error in filing.
+    I $D(BSDXNOTE(.5)) D
+    . D WP^DIE(9002018.4,BSDXAPTID_",",1,"","BSDXNOTE","BSDXMSG")
+    I $D(BSDXMSG) D ERR(BSDXI,"-3~BSDX26: Fileman failure to file data into 9002018.4") QUIT
+    ;
+    ; Now file in file 44:
+    N PTIEN S PTIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".05","I") ; Patient IEN
+    N HLIEN S HLIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".07:.04","I") ; HL Location IEN pointed to by Resource ID
+    N DATE S DATE=+^BSDXAPPT(BSDXAPTID,0) ; Date of APPT
+    N BSDXRES S BSDXRES=0 ; Result
+    ; Update Note only if we have a linked hospital location.
+    I HLIEN S BSDXRES=$$UPDATENOTE^BSDXAPI(PTIEN,HLIEN,DATE,BSDXNOTE(.5))
+    ; If we get an error (denoted by -1 in BSDXRES), return error to client
+    I BSDXRES<0 D ERR(BSDXI,"-4~BSDX26: BSDXAPI reports an error: "_BSDXRES) QUIT
+    ;Return Recordset
+    TCOMMIT
+    S BSDXI=BSDXI+1
+    S ^BSDXTMP($J,BSDXI)="-1"_$C(30)
+    S BSDXI=BSDXI+1
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+    QUIT
+    ;
+ERR(BSDXI,BSDXERR)  ;Error processing
+    S BSDXI=BSDXI+1
+    S BSDXERR=$TR(BSDXERR,"^","~")
+    I $TL>0 TROLLBACK
+    S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+    S BSDXI=BSDXI+1
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+    QUIT
+    ;
+ETRAP   ;EP Error trap entry
+    N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+    I $TL>0 TROLLBACK
+    D ^%ZTER
+    S $EC=""
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+    D ERR(BSDXI,"-100~BSDX26 Error: "_$G(%ZTERZE))
+    Q
Index: Scheduling/trunk/m/BSDXAPI.m
===================================================================
--- Scheduling/trunk/m/BSDXAPI.m	(revision 1027)
+++ Scheduling/trunk/m/BSDXAPI.m	(revision 1034)
@@ -1,3 +1,3 @@
-BSDXAPI	; IHS/ANMC/LJF - SCHEDULING APIs ; 11/2/10 4:36pm
+BSDXAPI	; IHS/ANMC/LJF - SCHEDULING APIs ; 11/18/10 5:34pm
 	;;1.42;BSDX;;Sep 29, 2010;Build 7
 	;Orignal routine is BSDAPI by IHS/LJF, HMW, and MAW
@@ -9,4 +9,6 @@
     ; 2010-11-12:
     ; - Changed ="C" to ["C" in SCIEN. Cancelled appointments can be "PC" as well. 
+    ; 2010-12-5
+    ; Added an entry point to update the patient note in file 44.
 	;
 MAKE1(DFN,CLIN,TYP,DATE,LEN,INFO)	; Simplified PEP w/ parameters for $$MAKE - making appointment
@@ -276,2 +278,18 @@
 	Q $S(X:1,1:0)
 	;
+UPDATENOTE(PAT,CLINIC,DATE,NOTE) ; PEP; Update Note in ^SC for patient's appointment @ DATE
+    ; PAT = DFN
+    ; CLINIC = SC IEN
+    ; DATE = FM Date/Time of Appointment
+    ;
+    ; Returns:
+    ; 0 if okay
+    ; -1 if failure
+    N SCIEN S SCIEN=$$SCIEN(PAT,CLINIC,DATE) ; ien of appt in ^SC
+    I SCIEN<1 QUIT "-1~No Appt can be found in file 44 for Patient "_PAT_" on "_DATE_" in clinic "_CLINIC
+    N BSDXIENS S BSDXIENS=SCIEN_","_DATE_","_CLINIC_","
+    S BSDXFDA(44.003,BSDXIENS,3)=$E(NOTE,1,150)
+    N BSDXERR
+    D FILE^DIE("","BSDXFDA","BSDXERR")
+    I $D(BSDXERR) QUIT "-1~Can't file for Pat "_PAT_" in Clinic "_CLINIC_" at "_DATE_". Fileman reported an error: "_BSDXERR("DIERR",1,"TEXT",1)
+    QUIT 0
