Changeset 1563 for Scheduling
- Timestamp:
- Oct 8, 2012, 6:59:10 AM (12 years ago)
- Location:
- Scheduling/trunk/m
- Files:
-
- 41 edited
Legend:
- Unmodified
- Added
- Removed
-
Scheduling/trunk/m/BSDX01.m
r1481 r1563 1 BSDX01 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/6/12 10:52am2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDX01 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 5/16/11 2:46pm 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; … … 282 282 ; 283 283 INDIV(BSDXSC) ; PEP - Is ^SC clinic in the same DUZ(2) as user? 284 ; Input: BSDXSC - Hospital Location IEN 285 ; Output: True or False 286 I '+BSDXSC QUIT 1 ;If not tied to clinic, yes 287 I '$D(^SC(BSDXSC,0)) QUIT 1 ; If Clinic does not exist, yes 288 ; Jump to Division:Medical Center Division:Inst File Pointer for 289 ; Institution IEN (and get its internal value) 290 N DIV S DIV=$$GET1^DIQ(44,BSDXSC_",","3.5:.07","I") 291 I DIV="" Q 1 ; If clinic has no division, consider it avial to user. 292 I DIV=DUZ(2) Q 1 ; If same, then User is in same Div as Clinic 293 E Q 0 ; Otherwise, no 284 ; Input: BSDXSC - Hospital Location IEN 285 ; Output: True or False 286 I '+BSDXSC QUIT 1 ;If not tied to clinic, yes 287 I '$D(^SC(BSDXSC,0)) QUIT 1 ; If Clinic does not exist, yes 288 ; Jump to Division:Medical Center Division:Inst File Pointer for 289 ; Institution IEN (and get its internal value) 290 N DIV S DIV=$$GET1^DIQ(44,BSDXSC_",","3.5:.07","I") 291 I DIV="" Q 1 ; If clinic has no division, consider it avial to user. 292 I DIV=DUZ(2) Q 1 ; If same, then User is in same Div as Clinic 293 E Q 0 ; Otherwise, no 294 QUIT 294 295 INDIV2(BSDXRES) ; PEP - Is Resource in the same DUZ(2) as user? 295 ; Input BSDXRES - BSDX RESOURCE IEN296 ; Output: True of False297 Q $$INDIV($P($G(^BSDXRES(BSDXRES,0)),U,4)) ; Extract Hospital Location and send to $$INDIV298 U TINDIV ; Unit Test $$INDIV299 W "Testing if they are the same",!300 S DUZ(2)=67301 I '$$INDIV(1) W "ERROR",!302 I '$$INDIV(2) W "ERROR",!303 W "Testing if Div not defined in 44, should be true",!304 I '$$INDIV(3) W "ERROR",!305 W "Testing empty string. Should be true",!306 I '$$INDIV("") W "ERROR",!307 W "Testing if they are different",!308 S DUZ(2)=899309 I $$INDIV(1) W "ERROR",!310 I $$INDIV(2) W "ERROR",!311 QUIT312 U TINDIV2 ; Unit Test $$INDIV2313 W "Testing if they are the same",!314 S DUZ(2)=69315 I $$INDIV2(22)'=0 W "ERROR",!316 I $$INDIV2(25)'=1 W "ERROR",!317 I $$INDIV2(26)'=1 W "ERROR",!318 I $$INDIV2(27)'=1 W "ERROR",!319 QUIT320 ;296 ; Input BSDXRES - BSDX RESOURCE IEN 297 ; Output: True of False 298 Q $$INDIV($P($G(^BSDXRES(BSDXRES,0)),U,4)) ; Extract Hospital Location and send to $$INDIV 299 UnitTestINDIV 300 W "Testing if they are the same",! 301 S DUZ(2)=67 302 I '$$INDIV(1) W "ERROR",! 303 I '$$INDIV(2) W "ERROR",! 304 W "Testing if Div not defined in 44, should be true",! 305 I '$$INDIV(3) W "ERROR",! 306 W "Testing empty string. Should be true",! 307 I '$$INDIV("") W "ERROR",! 308 W "Testing if they are different",! 309 S DUZ(2)=899 310 I $$INDIV(1) W "ERROR",! 311 I $$INDIV(2) W "ERROR",! 312 QUIT 313 UnitTestINDIV2 314 W "Testing if they are the same",! 315 S DUZ(2)=69 316 I $$INDIV2(22)'=0 W "ERROR",! 317 I $$INDIV2(25)'=1 W "ERROR",! 318 I $$INDIV2(26)'=1 W "ERROR",! 319 I $$INDIV2(27)'=1 W "ERROR",! 320 QUIT 321 ; 321 322 GETRADEX(BSDXY,DFN,SCIEN) ; Get All Pending and On Hold Radiology Exams for Patient; RPC EP; UJO/SMH new in v 1.6 322 323 ; RPC: BSDX GET RAD EXAM FOR PT; Return: Global Array … … 345 346 ; Fields 5 = Request Status; 2 = Procedure; 16 = Requested Entered Date Time 346 347 ; Filter Field: First piece is DFN, 5th piece is 3 or 5 (Status of Pending Or Hold); 20th piece is Radiology Location requested 347 D LIST^DIC(75.1,"","@;5;2;16","P","","","","B","I $P(^(0),U)=DFN&(35[$P(^(0),U,5))&($P(^(0),U,20)=BSDXRLIEN)","","BSDXOUT","BSDXERR") 348 ; 349 ;;EHS/MKH,BAH;;UJO*1.0*143;;30/09/2012;; Update [Fix the performance issue in SchedGUI] 350 ; START OF CODE CHANGES FOR [UJO*1.0*143] 351 ; Commented old Line 352 ;D LIST^DIC(75.1,"","@;5;2;16","P","","","","B","I $P(^(0),U)=DFN&(35[$P(^(0),U,5))&($P(^(0),U,20)=BSDXRLIEN)","","BSDXOUT","BSDXERR") 353 DO FIND^DIC(75.1,"","@;5;2;16","QP",DFN,"","B","IF 35[$PIECE(^(0),U,5)&($PIECE(^(0),U,20)=BSDXRLIEN)","","BSDXOUT","BSDXERR") 354 ; END OF CODE CHANGES FOR [UJO*1.0*143] 348 355 ; 349 356 IF $DATA(BSDXERR) GOTO END -
Scheduling/trunk/m/BSDX02.m
r1481 r1563 1 BSDX02 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/6/12 11:09am2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDX02 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 5/16/11 2:47pm 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ;Licensed under LGPL 4 4 ; Change Log … … 30 30 S BSDXERR="" 31 31 S BSDXY="^BSDXTMP("_$J_")" 32 S ^BSDXTMP($J,0)="I00020APPOINTMENTID^D00030START_TIME^D00030END_TIME^D00030CHECKIN^D00030AUXTIME^I00020PATIENTID^T00030PATIENTNAME^T00030RESOURCENAME" 33 S ^(0)=^(0)_"^I00005NOSHOW^T00020HRN^I00005ACCESSTYPEID^I00005WALKIN^T00250NOTE^T00006SEX^T00040PID^D00030DOB^I00020RADIOLOGY_EXAM"_$C(30) 32 S ^BSDXTMP($J,0)="I00020APPOINTMENTID^D00030START_TIME^D00030END_TIME^D00030CHECKIN^D00030AUXTIME^I00020PATIENTID^T00030PATIENTNAME^T00030RESOURCENAME^I00005NOSHOW^T00020HRN^I00005ACCESSTYPEID^I00005WALKIN^T00250NOTE^T00006SEX^T00040PID^D00030DOB^I00020RADIOLOGY_EXAM"_$C(30) 34 33 D ^XBKVAR S X="ETRAP^BSDX02",@^%ZOSF("TRAP") 35 34 ; … … 38 37 ; S %DT="T",X=BSDXEND D ^%DT S BSDXEND=Y 39 38 ; I BSDXEND=-1 S ^BSDXTMP($J,1)=$C(31) Q 40 ;39 ; 41 40 S BSDXI=0 42 41 D STRES -
Scheduling/trunk/m/BSDX03.m
r1481 r1563 1 1 BSDX03 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:14am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ;Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX04.m
r1481 r1563 1 BSDX04 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; ; 7/6/12 10:55am2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDX04 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; ; 4/28/11 10:15am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; Change Log: … … 74 74 . Q:BSDXRESN="" 75 75 . Q:'$D(^BSDXRES("B",BSDXRESN)) 76 . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0)) 76 . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0)) 77 77 . Q:'+BSDXRESD 78 78 . Q:'$D(^BSDXAB("ARSCT",BSDXRESD)) -
Scheduling/trunk/m/BSDX05.m
r1481 r1563 1 1 BSDX05 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:16am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX06.m
r1481 r1563 1 1 BSDX06 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:16am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; Change Log: -
Scheduling/trunk/m/BSDX07.m
r1481 r1563 1 BSDX07 ; VW/UJO/SMH - WINDOWS SCHEDULING RPCS ; 7/9/12 4:02pm 2 ;;1.7T2;BSDX;;Jul 11, 2012;Build 18 3 ; Licensed under LGPL 4 ; 5 ; Change Log: 6 ; UJO/SMH 7 ; v1.3 July 13 2010 - Add support i18n - Dates input as FM dates, not US. 8 ; v1.42 Oct 22 2010 - Transaction now restartable by providing arguments 9 ; v1.42 Oct 30 2010 - Extensive refactoring. 10 ; v1.5 Mar 15 2011 - End time does not have to have time anymore. 11 ; It could be midnight of the next day 12 ; v1.6 Apr 11 2011 - Support for Scheduling Radiology Exams... 13 ; v1.7 Jun 20 2012 - Refactoring to remove transactions - many changes 14 ; - AVUPDT moved to AVUPDTMK in BSDXAPI1 15 ; 16 ; Error Reference: 17 ; -1: Patient Record is locked. This means something is wrong!!!! 18 ; -2: Start Time is not a valid Fileman date 19 ; -3: End Time is not a valid Fileman date 20 ; v1.5:obsolete::-4: End Time does not have time inside of it. 21 ; -5: BSDXPATID is not numeric 22 ; -6: Patient Does not exist in ^DPT 23 ; -7: Resource Name does not exist in B index of BSDX RESOURCE 24 ; -8: Resouce doesn't exist in ^BSDXRES 25 ; -9: Couldn't add appointment to BSDX APPOINTMENT 26 ; -10: Couldn't add appointment to files 2 and/or 44 27 ; -100: Mumps Error 28 ; 1 BSDX07 ; VW/UJO/SMH - WINDOWS SCHEDULING RPCS ; 4/28/11 10:17am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 ; Licensed under LGPL 4 ; 5 ; Change Log: 6 ; UJO/SMH 7 ; v1.3 July 13 2010 - Add support i18n - Dates input as FM dates, not US. 8 ; v1.42 Oct 22 2010 - Transaction now restartable by providing arguments 9 ; thanks to Rick Marshall and Zach Gonzalez at Oroville. 10 ; v1.42 Oct 30 2010 - Extensive refactoring. 11 ; v1.5 Mar 15 2011 - End time does not have to have time anymore. 12 ; It could be midnight of the next day 13 ; v1.6 Apr 11 2011 - Support for Scheduling Radiology Exams... 14 ; 15 ; Error Reference: 16 ; -1: Patient Record is locked. This means something is wrong!!!! 17 ; -2: Start Time is not a valid Fileman date 18 ; -3: End Time is not a valid Fileman date 19 ; v1.5:obsolete::-4: End Time does not have time inside of it. 20 ; -5: BSDXPATID is not numeric 21 ; -6: Patient Does not exist in ^DPT 22 ; -7: Resource Name does not exist in B index of BSDX RESOURCE 23 ; -8: Resouce doesn't exist in ^BSDXRES 24 ; -9: Couldn't add appointment to BSDX APPOINTMENT 25 ; -10: Couldn't add appointment to files 2 and/or 44 26 ; -100: Mumps Error 27 29 28 APPADDD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID) ;EP 30 ;Entry point for debugging 31 ; D DEBUG^%Serenji("APPADD^BSDX07(.BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)") 32 Q 33 ; 34 APPADD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID,BSDXRADEXAM) ;Private EP 35 ; 36 ;Called by RPC: BSDX ADD NEW APPOINTMENT 37 ; 38 ;Add new appointment to 3 files 39 ; - BSDX APPOINTMENT 40 ; - Hosp Location Appointment SubSubfile if Resource is linked to clinic 41 ; - Patient Appointment Subfile if Resource is linked to clinic 42 ; 43 ;Paramters: 44 ;BSDXY: Global Return (RPC must be set to Global Array) 45 ;BSDXSTART: FM Start Date 46 ;BSDXEND: FM End Date 47 ;BSDXPATID: Patient DFN 48 ;BSDXRES is ResourceName in BSDX RESOURCE file (not IEN) 49 ;BSDXLEN is the appointment duration in minutes 50 ;BSDXNOTE is the Appiontment Note 51 ;BSDXATID is used for 2 purposes: 52 ; if BSDXATID = "WALKIN" then BSDAPI is called to create a walkin appt. 53 ; if BSDXATID = a number, then it is the access type id (used for rebooking) 54 ;BSDXRADEXAM is used to store the Radiology Exam to which this appointment is tied to (optional) 55 ; 56 ;Return: 57 ; ADO.net Recordset having fields: 58 ; AppointmentID and ErrorNumber 59 ; 60 ; TODO: Specifying BSDXLEN and BSDXEND is redundant. For future programmers 61 ; to sort out. Needs changes on client. 62 ; 63 ;Test lines: 64 ;BSDX ADD NEW APPOINTMENT^3091122.0930^3091122.1000^370^Dr Office^30^EXAM^WALKIN 65 ; 66 ; Deal with optional arguments 67 S BSDXRADEXAM=$G(BSDXRADEXAM) 68 ; 69 ; Return Array; set Return and clear array 70 S BSDXY=$NA(^BSDXTMP($J)) 71 K ^BSDXTMP($J) 72 ; 73 ; $ET 74 N $ET S $ET="G ETRAP^BSDX07" 75 ; 76 ; Counter 77 N BSDXI S BSDXI=0 78 ; 79 ; Lock BSDX node, only to synchronize access to the globals. 80 ; It's not expected that the error will ever happen as no filing 81 ; is supposed to take 5 seconds. 82 L +^BSDXPAT(BSDXPATID):5 I '$T D ERR(BSDXI,"-1~Patient record is locked. Please contact technical support.") Q 83 ; 84 ; Header Node 85 S ^BSDXTMP($J,BSDXI)="I00020APPOINTMENTID^T00100ERRORID"_$C(30) 86 ; 87 ; Turn off SDAM APPT PROTOCOL BSDX Entries 88 N BSDXNOEV 89 S BSDXNOEV=1 ;Don't execute BSDX ADD APPOINTMENT protocol 90 ; 91 ; Set Error Message to be empty 92 N BSDXERR S BSDXERR=0 93 ; 94 ;;;test for error. See if %ZTER works 95 I $G(BSDXDIE) N X S X=1/0 96 ;;;test 97 ; 98 ; -- Start and End Date Processing -- 99 ; If C# sends the dates with extra zeros, remove them 100 S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND 101 ; Are the dates valid? Must be FM Dates > than 2010 102 I BSDXSTART'>3100000 D ERR(BSDXI,"-2~BSDX07 Error: Invalid Start Time") Q 103 I BSDXEND'>3100000 D ERR(BSDXI,"-3~BSDX07 Error: Invalid End Time") Q 104 ; 105 ;; If Ending date doesn't have a time, this is an error --rm 1.5 106 ; I $L(BSDXEND,".")=1 D ERR(BSDXI,"-4~BSDX07 Error: Invalid End Time") Q 107 ; 108 ; If the Start Date is greater than the end date, swap dates 109 N BSDXTMP 110 I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP 111 ; 112 ; Check if the patient exists: 113 ; - DFN valid number? 114 ; - Valid Patient in file 2? 115 I '+BSDXPATID D ERR(BSDXI,"-5~BSDX07 Error: Invalid Patient ID") Q 116 I '$D(^DPT(BSDXPATID,0)) D ERR(BSDXI,"-6~BSDX07 Error: Invalid Patient ID") Q 117 ; 118 ;Validate Resource entry 119 I '$D(^BSDXRES("B",BSDXRES)) D ERR(BSDXI,"-7~BSDX07 Error: Invalid Resource ID") Q 120 N BSDXRESD ; Resource IEN 121 S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0)) 122 N BSDXRNOD ; Resouce zero node 123 S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0)) 124 I BSDXRNOD="" D ERR(BSDXI,"-8~BSDX07 Error: invalid Resource entry.") Q 125 ; 126 ; Walk-in (Unscheduled) Appointment? 127 N BSDXWKIN S BSDXWKIN=0 128 I BSDXATID="WALKIN" S BSDXWKIN=1 129 ; Reset Access Type ID if it doesn't say "WALKIN" and isn't a number 130 I BSDXATID'?.N&(BSDXATID'="WALKIN") S BSDXATID="" 131 ; 132 ; Now, check if PIMS has any issues with us making the appt using MAKECK 133 N BSDXSCD S BSDXSCD=$P(BSDXRNOD,U,4) ; Hosp Location IEN 134 N BSDXERR S BSDXERR=0 ; Variable to hold value of $$MAKE and $$MAKECK 135 N BSDXC ; Array to send to MAKE and MAKECK APIs 136 ; Only if we have a valid Hosp Location 137 I +BSDXSCD,$D(^SC(BSDXSCD,0)) D 138 . S BSDXC("PAT")=BSDXPATID 139 . S BSDXC("CLN")=BSDXSCD 140 . S BSDXC("TYP")=3 ;3 for scheduled appts, 4 for walkins 141 . S:BSDXWKIN BSDXC("TYP")=4 142 . S BSDXC("ADT")=BSDXSTART 143 . S BSDXC("LEN")=BSDXLEN 144 . S BSDXC("OI")=$E($G(BSDXNOTE),1,150) ;File 44 has 150 character limit on OTHER field 145 . S BSDXC("OI")=$TR(BSDXC("OI"),";"," ") ;No semicolons allowed by MAKE^BSDXAPI 146 . S BSDXC("OI")=$$STRIP(BSDXC("OI")) ;Strip control characters from note 147 . S BSDXC("USR")=DUZ 148 . S BSDXERR=$$MAKECK^BSDXAPI(.BSDXC) 149 I BSDXERR D ERR(BSDXI,"-10~BSDX07 Error: MAKECK^BSDXAPI returned error code: "_BSDXERR) Q ; no need for roll back 150 ; 151 ; Done with all checks, let's make appointment in BSDX APPOINTMENT 152 N BSDXAPPTID 153 S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID,BSDXRADEXAM) 154 I 'BSDXAPPTID D ERR(BSDXI,"-9~BSDX07 Error: Unable to add appointment to BSDX APPOINTMENT file.") Q ; no roll back needed! No appts made. 155 I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE) ; no error checks are made here 156 ; I don't think it's important b/c users can detect right away if the WP 157 ; filing fails. 158 ; 159 I $G(BSDXSIMERR1) D ERR(BSDXI,"-11~BSDX07 Error: Simulated Error"),ROLLBACK(BSDXAPPTID,.BSDXC) Q ; UT Line 160 ; 161 ; Only if we have a valid Hosp Loc can we make an appointment in 2/44 162 ; Use BSDXC array from before. 163 ; FYI: $$MAKE itself calls $$MAKECK to check again for being okay. 164 ; If an error happens here, we roll back both ^BSDXAPPT and 2/44 by deleting 165 N BSDXERR S BSDXERR=0 ; Variable to hold value of $$MAKE and $$MAKECK 166 I +BSDXSCD,$D(^SC(BSDXSCD,0)) S BSDXERR=$$MAKE^BSDXAPI(.BSDXC) 167 I BSDXERR D ERR(BSDXI,"-10~BSDX07 Error: MAKE^BSDXAPI returned error code: "_BSDXERR),ROLLBACK(BSDXAPPTID,.BSDXC) Q 168 ; 169 ; Unlock 170 L -^BSDXPAT(BSDXPATID) 171 ; 172 ;Return Recordset 173 S BSDXI=BSDXI+1 174 S ^BSDXTMP($J,BSDXI)=BSDXAPPTID_"^"_$C(30) 175 S BSDXI=BSDXI+1 176 S ^BSDXTMP($J,BSDXI)=$C(31) 177 Q 29 ;Entry point for debugging 30 D DEBUG^%Serenji("APPADD^BSDX07(.BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)") 31 Q 32 ; 33 UT ; Unit Tests 34 N ZZZ 35 ; Test for bad start date 36 D APPADD(.ZZZ,2100123,3100123.3,2,"Dr Office",30,"Sam's Note",1) 37 I +$P(^BSDXTMP($J,1),U,2)'=-2 W "Error in -2",! 38 ; Test for bad end date 39 D APPADD(.ZZZ,3100123,2100123.3,2,"Dr Office",30,"Sam's Note",1) 40 I +$P(^BSDXTMP($J,1),U,2)'=-3 W "Error in -3",! 41 ; Test for end date without time 42 D APPADD(.ZZZ,3100123.1,3100123,2,"Dr Office",30,"Sam's Note",1) 43 I +$P(^BSDXTMP($J,1),U,2)'=-4 W "Error in -4",! 44 ; Test for mumps error 45 S bsdxdie=1 46 D APPADD(.ZZZ,3100123.09,3100123.093,2,"Dr Office",30,"Sam's Note",1) 47 I +$P(^BSDXTMP($J,1),U,2)'=-100 W "Error in -100: M Error",! 48 K bsdxdie 49 ; Test for TRESTART 50 s bsdxrestart=1 51 D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1) 52 I +$P(^BSDXTMP($J,1),U,2)'=0&(+$P(^BSDXTMP($J,1),U,2)'=-10) W "Error in TRESTART",! 53 k bsdxrestart 54 ; Test for non-numeric patient 55 D APPADD(.ZZZ,3100123.09,3100123.093,"CAT,DOG","Dr Office",30,"Sam's Note",1) 56 I +$P(^BSDXTMP($J,1),U,2)'=-5 W "Error in -5",! 57 ; Test for a non-existent patient 58 D APPADD(.ZZZ,3100123.09,3100123.093,8989898989,"Dr Office",30,"Sam's Note",1) 59 I +$P(^BSDXTMP($J,1),U,2)'=-6 W "Error in -6",! 60 ; Test for a non-existent resource name 61 D APPADD(.ZZZ,3100123.09,3100123.093,3,"lkajsflkjsadf",30,"Sam's Note",1) 62 I +$P(^BSDXTMP($J,1),U,2)'=-7 W "Error in -7",! 63 ; Test for corrupted resource 64 ; Can't test for -8 since it requires DB corruption 65 ; Test for inability to add appointment to BSDX Appointment 66 ; Also requires something wrong in the DB 67 ; Test for inability to add appointment to 2,44 68 ; Test by creating a duplicate appointment 69 D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1) 70 D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1) 71 I +$P(^BSDXTMP($J,1),U,2)'=-10 W "Error in -10",! 72 ; Test for normality: 73 D APPADD(.ZZZ,3110123.09,3110123.093,3,"Dr Office",30,"Sam's Note",1) 74 ; Does Appt exist? 75 N APPID S APPID=+$P(^BSDXTMP($J,1),U) 76 I 'APPID W "Error Making Appt-1" QUIT 77 I +^BSDXAPPT(APPID,0)'=3110123.09 W "Error Making Appt-2" 78 I '$D(^DPT(3,"S",3110123.09)) W "Error Making Appt-3" 79 I '$D(^SC(2,"S",3110123.09)) W "Error Making Appt-4" 80 QUIT 81 ; 82 APPADD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID,BSDXRADEXAM) ;EP 83 ; 84 ;Called by RPC: BSDX ADD NEW APPOINTMENT 85 ; 86 ;Add new appointment to 3 files 87 ; - BSDX APPOINTMENT 88 ; - Hosp Location Appointment SubSubfile if Resource is linked to clinic 89 ; - Patient Appointment Subfile if Resource is linked to clinic 90 ; 91 ;Paramters: 92 ;BSDXY: Global Return (RPC must be set to Global Array) 93 ;BSDXSTART: FM Start Date 94 ;BSDXEND: FM End Date 95 ;BSDXPATID: Patient DFN 96 ;BSDXRES is ResourceName in BSDX RESOURCE file (not IEN) 97 ;BSDXLEN is the appointment duration in minutes 98 ;BSDXNOTE is the Appiontment Note 99 ;BSDXATID is used for 2 purposes: 100 ; if BSDXATID = "WALKIN" then BSDAPI is called to create a walkin appt. 101 ; if BSDXATID = a number, then it is the access type id (used for rebooking) 102 ;BSDXRADEXAM is used to store the Radiology Exam to which this appointment is tied to (optional) 103 ; 104 ;Return: 105 ; ADO.net Recordset having fields: 106 ; AppointmentID and ErrorNumber 107 ; 108 ;Test lines: 109 ;BSDX ADD NEW APPOINTMENT^3091122.0930^3091122.1000^370^Dr Office^30^EXAM^WALKIN 110 ; 111 ; Deal with optional arguments 112 S BSDXRADEXAM=$G(BSDXRADEXAM) 113 ; Return Array; set Return and clear array 114 S BSDXY=$NA(^BSDXTMP($J)) 115 K ^BSDXTMP($J) 116 ; $ET 117 N $ET S $ET="G ETRAP^BSDX07" 118 ; Counter 119 N BSDXI S BSDXI=0 120 ; Lock BSDX node, only to synchronize access to the globals. 121 ; It's not expected that the error will ever happen as no filing 122 ; is supposed to take 5 seconds. 123 L +^BSDXAPPT(BSDXPATID):5 I '$T D ERR(BSDXI,"-1~Patient record is locked. Please contact technical support.") Q 124 ; Header Node 125 S ^BSDXTMP($J,BSDXI)="I00020APPOINTMENTID^T00100ERRORID"_$C(30) 126 ;Restartable Transaction; restore paramters when starting. 127 ; (Params restored are what's passed here + BSDXI) 128 TSTART (BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID,BSDXI):T="BSDX ADD NEW APPOINTMENT^BSDX07" 129 ; 130 ; Turn off SDAM APPT PROTOCOL BSDX Entries 131 N BSDXNOEV 132 S BSDXNOEV=1 ;Don't execute BSDX ADD APPOINTMENT protocol 133 ; 134 ; Set Error Message to be empty 135 N BSDXERR S BSDXERR=0 136 ; 137 ;;;test for error inside transaction. See if %ZTER works 138 I $G(bsdxdie) S X=1/0 139 ;;;test 140 ;;;test for TRESTART 141 I $G(bsdxrestart) K bsdxrestart TRESTART 142 ;;;test 143 ; 144 ; -- Start and End Date Processing -- 145 ; If C# sends the dates with extra zeros, remove them 146 S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND 147 ; Are the dates valid? Must be FM Dates > than 2010 148 I BSDXSTART'>3100000 D ERR(BSDXI,"-2~BSDX07 Error: Invalid Start Time") Q 149 I BSDXEND'>3100000 D ERR(BSDXI,"-3~BSDX07 Error: Invalid End Time") Q 150 ; 151 ;; If Ending date doesn't have a time, this is an error --rm 1.5 152 ; I $L(BSDXEND,".")=1 D ERR(BSDXI,"-4~BSDX07 Error: Invalid End Time") Q 153 ; 154 ; If the Start Date is greater than the end date, swap dates 155 N BSDXTMP 156 I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP 157 ; 158 ; Check if the patient exists: 159 ; - DFN valid number? 160 ; - Valid Patient in file 2? 161 I '+BSDXPATID D ERR(BSDXI,"-5~BSDX07 Error: Invalid Patient ID") Q 162 I '$D(^DPT(BSDXPATID,0)) D ERR(BSDXI,"-6~BSDX07 Error: Invalid Patient ID") Q 163 ; 164 ;Validate Resource entry 165 I '$D(^BSDXRES("B",BSDXRES)) D ERR(BSDXI,"-7~BSDX07 Error: Invalid Resource ID") Q 166 N BSDXRESD ; Resource IEN 167 S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0)) 168 N BSDXRNOD ; Resouce zero node 169 S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0)) 170 I BSDXRNOD="" D ERR(BSDXI,"-8~BSDX07 Error: invalid Resource entry.") Q 171 ; 172 ; Walk-in (Unscheduled) Appointment? 173 N BSDXWKIN S BSDXWKIN=0 174 I BSDXATID="WALKIN" S BSDXWKIN=1 175 ; Reset Access Type ID if it doesn't say "WALKIN" and isn't a number 176 I BSDXATID'?.N&(BSDXATID'="WALKIN") S BSDXATID="" 177 ; 178 ; Done with all checks, let's make appointment in BSDX APPOINTMENT 179 N BSDXAPPTID 180 S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID,BSDXRADEXAM) 181 I 'BSDXAPPTID D ERR(BSDXI,"-9~BSDX07 Error: Unable to add appointment to BSDX APPOINTMENT file.") Q 182 I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE) 183 ; 184 ; Then Create Subfiles in 2/44 Appointment 185 N BSDXSCD S BSDXSCD=$P(BSDXRNOD,U,4) ; Hosp Location IEN 186 ; Only if we have a valid Hosp Loc can we make an appointment 187 I +BSDXSCD,$D(^SC(BSDXSCD,0)) D I +BSDXERR D ERR(BSDXI,"-10~BSDX07 Error: MAKE^BSDXAPI returned error code: "_BSDXERR) Q 188 . N BSDXC 189 . S BSDXC("PAT")=BSDXPATID 190 . S BSDXC("CLN")=BSDXSCD 191 . S BSDXC("TYP")=3 ;3 for scheduled appts, 4 for walkins 192 . S:BSDXWKIN BSDXC("TYP")=4 193 . S BSDXC("ADT")=BSDXSTART 194 . S BSDXC("LEN")=BSDXLEN 195 . S BSDXC("OI")=$E($G(BSDXNOTE),1,150) ;File 44 has 150 character limit on OTHER field 196 . S BSDXC("OI")=$TR(BSDXC("OI"),";"," ") ;No semicolons allowed by MAKE^BSDXAPI 197 . S BSDXC("OI")=$$STRIP(BSDXC("OI")) ;Strip control characters from note 198 . S BSDXC("USR")=DUZ 199 . S BSDXERR=$$MAKE^BSDXAPI(.BSDXC) 200 . Q:BSDXERR 201 . ;Update RPMS Clinic availability 202 . D AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN) 203 . Q 204 ; 205 ;Return Recordset 206 TCOMMIT 207 L -^BSDXAPPT(BSDXPATID) 208 S BSDXI=BSDXI+1 209 S ^BSDXTMP($J,BSDXI)=BSDXAPPTID_"^"_$C(30) 210 S BSDXI=BSDXI+1 211 S ^BSDXTMP($J,BSDXI)=$C(31) 212 Q 213 BSDXDEL(BSDXAPPTID) ;Deletes appointment BSDXAPPTID from BSDXAPPOINTMETN 214 N DA,DIK 215 S DIK="^BSDXAPPT(",DA=BSDXAPPTID 216 D ^DIK 217 Q 218 ; 178 219 STRIP(BSDXZ) ;Replace control characters with spaces 179 N BSDXI180 F BSDXI=1:1:$L(BSDXZ) I (32>$A($E(BSDXZ,BSDXI))) S BSDXZ=$E(BSDXZ,1,BSDXI-1)_" "_$E(BSDXZ,BSDXI+1,999)181 Q BSDXZ182 ;220 N BSDXI 221 F BSDXI=1:1:$L(BSDXZ) I (32>$A($E(BSDXZ,BSDXI))) S BSDXZ=$E(BSDXZ,1,BSDXI-1)_" "_$E(BSDXZ,BSDXI+1,999) 222 Q BSDXZ 223 ; 183 224 BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID,BSDXRADEXAM) ;ADD BSDX APPOINTMENT ENTRY 184 ;Returns ien in BSDXAPPT or 0 if failed185 ;Create entry in BSDX APPOINTMENT186 N BSDXAPPTID,BSDXFDA187 S BSDXFDA(9002018.4,"+1,",.01)=BSDXSTART188 S BSDXFDA(9002018.4,"+1,",.02)=BSDXEND189 S BSDXFDA(9002018.4,"+1,",.05)=BSDXPATID190 S BSDXFDA(9002018.4,"+1,",.07)=BSDXRESD191 S BSDXFDA(9002018.4,"+1,",.08)=$G(DUZ)192 S BSDXFDA(9002018.4,"+1,",.09)=$$NOW^XLFDT193 S:BSDXATID="WALKIN" BSDXFDA(9002018.4,"+1,",.13)="y"194 S:BSDXATID?.N BSDXFDA(9002018.4,"+1,",.06)=BSDXATID195 S BSDXFDA(9002018.4,"+1,",.14)=$G(BSDXRADEXAM)196 N BSDXIEN,BSDXMSG197 D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")198 S BSDXAPPTID=+$G(BSDXIEN(1))199 Q BSDXAPPTID200 ;225 ;Returns ien in BSDXAPPT or 0 if failed 226 ;Create entry in BSDX APPOINTMENT 227 N BSDXAPPTID 228 S BSDXFDA(9002018.4,"+1,",.01)=BSDXSTART 229 S BSDXFDA(9002018.4,"+1,",.02)=BSDXEND 230 S BSDXFDA(9002018.4,"+1,",.05)=BSDXPATID 231 S BSDXFDA(9002018.4,"+1,",.07)=BSDXRESD 232 S BSDXFDA(9002018.4,"+1,",.08)=$G(DUZ) 233 S BSDXFDA(9002018.4,"+1,",.09)=$$NOW^XLFDT 234 S:BSDXATID="WALKIN" BSDXFDA(9002018.4,"+1,",.13)="y" 235 S:BSDXATID?.N BSDXFDA(9002018.4,"+1,",.06)=BSDXATID 236 S BSDXFDA(9002018.4,"+1,",.14)=BSDXRADEXAM 237 N BSDXIEN,BSDXMSG 238 D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG") 239 S BSDXAPPTID=+$G(BSDXIEN(1)) 240 Q BSDXAPPTID 241 ; 201 242 BSDXWP(BSDXAPPTID,BSDXNOTE) ; 202 ;Add WP field 203 N BSDXMSG 204 I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE="" 205 I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0) 206 I $D(BSDXNOTE(.5)) D 207 . D WP^DIE(9002018.4,BSDXAPPTID_",",1,"","BSDXNOTE","BSDXMSG") 208 Q 209 ; 243 ;Add WP field 244 I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE="" 245 I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0) 246 I $D(BSDXNOTE(.5)) D 247 . D WP^DIE(9002018.4,BSDXAPPTID_",",1,"","BSDXNOTE","BSDXMSG") 248 Q 249 ; 210 250 ADDEVT(BSDXPATID,BSDXSTART,BSDXSC,BSDXSCDA) ;EP 211 ;Called by BSDX ADD APPOINTMENT protocol212 ;BSDXSC=IEN of clinic in ^SC213 ;BSDXSCDA=IEN for ^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA). Use to get Length & Note214 ;215 N BSDXNOD,BSDXLEN,BSDXAPPTID,BSDXNODP,BSDXWKIN,BSDXRES,BSDXNOTE,BSDXEND216 Q:+$G(BSDXNOEV)217 I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0))218 E I $D(^BSDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0))219 Q:'+$G(BSDXRES)220 S BSDXNOD=$G(^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA,0))221 Q:BSDXNOD=""222 S BSDXNODP=$G(^DPT(BSDXPATID,"S",BSDXSTART,0))223 S BSDXWKIN=""224 S:$P(BSDXNODP,U,7)=4 BSDXWKIN="WALKIN" ;Purpose of Visit field of DPT Appointment subfile225 S BSDXLEN=$P(BSDXNOD,U,2)226 Q:'+BSDXLEN227 S BSDXEND=$$FMADD^XLFDT(BSDXSTART,0,0,BSDXLEN,0)228 S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXWKIN)229 Q:'+BSDXAPPTID230 S BSDXNOTE=$P(BSDXNOD,U,4)231 I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE)232 D ADDEVT3(BSDXRES)233 Q234 ;251 ;Called by BSDX ADD APPOINTMENT protocol 252 ;BSDXSC=IEN of clinic in ^SC 253 ;BSDXSCDA=IEN for ^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA). Use to get Length & Note 254 ; 255 N BSDXNOD,BSDXLEN,BSDXAPPTID,BSDXNODP,BSDXWKIN,BSDXRES 256 Q:+$G(BSDXNOEV) 257 I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) 258 E I $D(^BSDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) 259 Q:'+$G(BSDXRES) 260 S BSDXNOD=$G(^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA,0)) 261 Q:BSDXNOD="" 262 S BSDXNODP=$G(^DPT(BSDXPATID,"S",BSDXSTART,0)) 263 S BSDXWKIN="" 264 S:$P(BSDXNODP,U,7)=4 BSDXWKIN="WALKIN" ;Purpose of Visit field of DPT Appointment subfile 265 S BSDXLEN=$P(BSDXNOD,U,2) 266 Q:'+BSDXLEN 267 S BSDXEND=$$FMADD^XLFDT(BSDXSTART,0,0,BSDXLEN,0) 268 S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXWKIN) 269 Q:'+BSDXAPPTID 270 S BSDXNOTE=$P(BSDXNOD,U,4) 271 I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE) 272 D ADDEVT3(BSDXRES) 273 Q 274 ; 235 275 ADDEVT3(BSDXRES) ; 236 ;Call RaiseEvent to notify GUI clients 237 N BSDXRESN 238 S BSDXRESN=$G(^BSDXRES(BSDXRES,0)) 239 Q:BSDXRESN="" 240 S BSDXRESN=$P(BSDXRESN,"^") 241 ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","") 242 D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN) 243 Q 244 ; 245 ROLLBACK(BSDXAPPTID,BSDXC) ; Private EP; Roll back appointment set 246 ; DO NOT USE except as an emergency measure - only if unforseen error occurs 247 ; Input: 248 ; Appointment ID to remove from ^BSDXAPPT 249 ; BSDXC array (see array format in $$MAKE^BSDXAPI) 250 N % 251 D BSDXDEL^BSDX07(BSDXAPPTID) 252 S:$D(BSDXC) %=$$UNMAKE^BSDXAPI(.BSDXC) ; rtn value always 0 253 QUIT 254 ; 255 BSDXDEL(BSDXAPPTID) ;Private EP ; Deletes appointment BSDXAPPTID from ^BSDXAPPT 256 ; DO NOT USE except in emergencies to roll back an appointment set 257 N DA,DIK 258 S DIK="^BSDXAPPT(",DA=BSDXAPPTID 259 D ^DIK 260 Q 261 ; 262 ERR(BSDXI,BSDXERR) ;Error processing - different from error trap. 263 ; Unlock first 264 L -^BSDXPAT(BSDXPATID) 265 ; If last line is $C(31), we are done. No more errors to send to client. 266 I ^BSDXTMP($J,$O(^BSDXTMP($J," "),-1))=$C(31) QUIT 267 S BSDXI=BSDXI+1 268 S BSDXERR=$TR(BSDXERR,"^","~") 269 S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30) 270 S BSDXI=BSDXI+1 271 S ^BSDXTMP($J,BSDXI)=$C(31) 272 Q 273 ; 276 ;Call RaiseEvent to notify GUI clients 277 N BSDXRESN 278 S BSDXRESN=$G(^BSDXRES(BSDXRES,0)) 279 Q:BSDXRESN="" 280 S BSDXRESN=$P(BSDXRESN,"^") 281 ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","") 282 D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN) 283 Q 284 ; 285 ERR(BSDXI,BSDXERR) ;Error processing 286 S BSDXI=BSDXI+1 287 S BSDXERR=$TR(BSDXERR,"^","~") 288 I $TL>0 TROLLBACK 289 S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30) 290 S BSDXI=BSDXI+1 291 S ^BSDXTMP($J,BSDXI)=$C(31) 292 L -^BSDXAPPT(BSDXPATID) 293 Q 294 ; 274 295 ETRAP ;EP Error trap entry 275 N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap 276 D ^%ZTER 277 ; 278 I +$G(BSDXAPPTID) D ROLLBACK(BSDXAPPTID,.BSDXC) ; Rollback if BSDXAPPTID exists 279 ; 280 ; Log error message and send to client 281 I '$D(BSDXI) N BSDXI S BSDXI=0 282 D ERR(BSDXI,"-100~BSDX07 Error: "_$G(%ZTERZE)) 283 Q:$Q 1_U_"Mumps Error" Q 284 ; 296 N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap 297 ; Rollback, otherwise ^XTER will be empty from future rollback 298 I $TL>0 TROLLBACK 299 D ^%ZTER 300 S $EC="" ; Clear Error 301 ; Log error message and send to client 302 I '$D(BSDXI) N BSDXI S BSDXI=0 303 D ERR(BSDXI,"-100~BSDX07 Error: "_$G(%ZTERZE)) 304 Q 305 ; 306 DAY ;;^SUN^MON^TUES^WEDNES^THURS^FRI^SATUR 307 ; 308 DOW S %=$E(X,1,3),Y=$E(X,4,5),Y=Y>2&'(%#4)+$E("144025036146",Y) 309 F %=%:-1:281 S Y=%#4=1+1+Y 310 S Y=$E(X,6,7)+Y#7 311 Q 312 ; 313 AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN) ;Update RPMS Clinic availability 314 ;SEE SDM1 315 N Y,DFN 316 N SL,STARTDAY,X,SC,SB,HSI,SI,STR,SDDIF,SDMAX,SDDATE,SDDMAX,SDSDATE,CCXN,MXOK,COV,SDPROG 317 N X1,SDEDT,X2,SD,SM,SS,S,SDLOCK,ST,I 318 S Y=BSDXSCD,DFN=BSDXPATID 319 S SL=$G(^SC(+Y,"SL")),X=$P(SL,U,3),STARTDAY=$S($L(X):X,1:8),SC=Y,SB=STARTDAY-1/100,X=$P(SL,U,6),HSI=$S(X=1:X,X:X,1:4),SI=$S(X="":4,X<3:4,X:X,1:4),STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz",SDDIF=$S(HSI<3:8/HSI,1:2) K Y 320 ;Determine maximum days for scheduling 321 S SDMAX(1)=$P($G(^SC(+SC,"SDP")),U,2) S:'SDMAX(1) SDMAX(1)=365 322 S (SDMAX,SDDMAX)=$$FMADD^XLFDT(DT,SDMAX(1)) 323 S SDDATE=BSDXSTART 324 S SDSDATE=SDDATE,SDDATE=SDDATE\1 325 1 ;L Q:$D(SDXXX) S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0 S SC=+SC 326 Q:$D(SDXXX) S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0 S SC=+SC 327 S X1=DT,SDEDT=365 S:$D(^SC(SC,"SDP")) SDEDT=$P(^SC(SC,"SDP"),"^",2) 328 S X2=SDEDT D C^%DTC S SDEDT=X 329 S Y=BSDXSTART 330 EN1 S (X,SD)=Y,SM=0 D DOW 331 S I '$D(^SC(SC,"ST",$P(SD,"."),1)) S SS=+$O(^SC(+SC,"T"_Y,SD)) Q:SS'>0 Q:^(SS,1)="" S ^SC(+SC,"ST",$P(SD,"."),1)=$E($P($T(DAY),U,Y+2),1,2)_" "_$E(SD,6,7)_$J("",SI+SI-6)_^(1),^(0)=$P(SD,".") 332 S S=BSDXLEN 333 ;Check if BSDXLEN evenly divisible by appointment length 334 S RPMSL=$P(SL,U) 335 I BSDXLEN<RPMSL S BSDXLEN=RPMSL 336 I BSDXLEN#RPMSL'=0 D 337 . S BSDXINC=BSDXLEN\RPMSL 338 . S BSDXINC=BSDXINC+1 339 . S BSDXLEN=RPMSL*BSDXINC 340 S SL=S_U_$P(SL,U,2,99) 341 SC S SDLOCK=$S('$D(SDLOCK):1,1:SDLOCK+1) Q:SDLOCK>9 342 L +^SC(SC,"ST",$P(SD,"."),1):5 G:'$T SC 343 S SDLOCK=0,S=^SC(SC,"ST",$P(SD,"."),1) 344 S I=SD#1-SB*100,ST=I#1*SI\.6+($P(I,".")*SI),SS=SL*HSI/60*SDDIF+ST+ST 345 I (I<1!'$F(S,"["))&(S'["CAN") L -^SC(SC,"ST",$P(SD,"."),1) Q 346 I SM<7 S %=$F(S,"[",SS-1) S:'%!($P(SL,"^",6)<3) %=999 I $F(S,"]",SS)'<%!(SDDIF=2&$E(S,ST+ST+1,SS-1)["[") S SM=7 347 ; 348 SP I ST+ST>$L(S),$L(S)<80 S S=S_" " G SP 349 S SDNOT=1 350 S ABORT=0 351 F I=ST+ST:SDDIF:SS-SDDIF D Q:ABORT 352 . S ST=$E(S,I+1) S:ST="" ST=" " 353 . S Y=$E(STR,$F(STR,ST)-2) 354 . I S["CAN"!(ST="X"&($D(^SC(+SC,"ST",$P(SD,"."),"CAN")))) S ABORT=1 Q 355 . I Y="" S ABORT=1 Q 356 . S:Y'?1NL&(SM<6) SM=6 S ST=$E(S,I+2,999) S:ST="" ST=" " S S=$E(S,1,I)_Y_ST 357 . Q 358 S ^SC(SC,"ST",$P(SD,"."),1)=S 359 L -^SC(SC,"ST",$P(SD,"."),1) 360 Q -
Scheduling/trunk/m/BSDX08.m
r1481 r1563 1 BSDX08 ; VW/UJO/SMH - WINDOWS SCHEDULING RPCS ; 7/9/12 4:22pm2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDX08 ; VW/UJO/SMH - WINDOWS SCHEDULING RPCS ; 4/28/11 10:17am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; 4 4 ; Original by HMW. New Written by Sam Habiel. Licensed under LGPL. … … 6 6 ; Change History 7 7 ; 3101022 UJO/SMH v1.42 8 ; - Transaction work. As of v 1.7, all work here has been superceded 9 ; - Refactoring of AVUPDT - never tested though. 8 ; - Transaction now restartable. Thanks to 9 ; --> Zach Gonzalez and Rick Marshall for fix. 10 ; - Extra TROLLBACK in Lock Statement when lock fails. 11 ; --> Removed--Rollback is already in ERR tag. 12 ; - Added new statements to old SD code in AVUPDT to obviate 13 ; --> need to restore variables in transaction 14 ; - Refactored this chunk of code. Don't really know whether it 15 ; --> worked in the first place. Waiting for bug report to know. 10 16 ; - Refactored all of APPDEL. 11 17 ; … … 13 19 ; - Added ability to remove checked in appointments. Added a couple 14 20 ; of units tests for that under UT2. 15 ; 16 ; 3120625 VEN/SMH v1.7 17 ; - Transactions removed. Code refactored to work w/o txns. 18 ; - Moved AVUPDT to AVUPDTCN in BSDXAPI1. BSDXAPI takes care of calling 19 ; that. 21 ; - Minor reformatting because of how KIDS adds tabs. 20 22 ; 21 23 ; Error Reference: … … 29 31 ; -8^BSDX08: Unable to find associated PIMS appointment for this patient 30 32 ; -9^BSDX08: BSDXAPI returned an error: (error) 31 ; -10^BSDX08: $$BSDXCAN failed (Fileman filing error)32 33 ; -100~BSDX08 Error: (Mumps Error) 33 34 ; 34 35 APPDELD(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT) ;EP 35 36 ;Entry point for debugging 36 ;D DEBUG^%Serenji("APPDEL^BSDX08(.BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)") 37 Q 38 ; 39 APPDEL(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT) ; Private EP 37 D DEBUG^%Serenji("APPDEL^BSDX08(.BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)") 38 Q 39 ; 40 UT ; Unit Tests 41 ; Test 1: Make normal appointment and cancel it. See if every thing works 42 N ZZZ 43 D APPADD^BSDX07(.ZZZ,3110123.2,3110123.3,4,"Dr Office",10,"Sam's Note",1) 44 S APPID=+$P(^BSDXTMP($J,1),U) 45 D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note") 46 I $P(^BSDXAPPT(APPID,0),U,12)'>0 W "Error in Cancellation-1" 47 I $O(^SC(2,"S",3110123.2,1,0))]"" W "Error in Cancellation-2" 48 I $P(^DPT(4,"S",3110123.2,0),U,2)'="PC" W "Error in Cancellation-3" 49 I ^DPT(4,"S",3110123.2,"R")'="Sam's Cancel Note" W "Error in Cancellation-4" 50 ; 51 ; Test 2: Check for -1 52 ; Make appt 53 D APPADD^BSDX07(.ZZZ,3110125.2,3110125.3,4,"Dr Office",10,"Sam's Note",1) 54 ; Lock the node in another job 55 S APPID=+$P(^BSDXTMP($J,1),U) 56 ; W "Lock ^BSDXAPPT("_APPID_") in another session. You have 10 seconds." H 10 57 D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note") 58 ; 59 ; Test 3: Check for -100 60 S bsdxdie=1 61 D APPADD^BSDX07(.ZZZ,3110126.2,3110126.3,4,"Dr Office",10,"Sam's Note",1) 62 S APPID=+$P(^BSDXTMP($J,1),U) 63 D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons") 64 I $P(^BSDXTMP($J,1),"~")'=-100 W "Error in -100",! 65 K bsdxdie 66 ; 67 ; Test 4: Restartable transaction 68 S bsdxrestart=1 69 D APPADD^BSDX07(.ZZZ,3110128.2,3110128.3,4,"Dr Office",10,"Sam's Note",1) 70 S APPID=+$P(^BSDXTMP($J,1),U) 71 D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons") 72 I $P(^DPT(4,"S",3110128.2,0),U,2)'="PC" W "Error in Restartable Transaction",! 73 ; 74 ; Test 5: for invalid Appointment ID (-2 and -3) 75 D APPDEL^BSDX08(.ZZZ,0,"PC",1,"Reasons") 76 I $P(^BSDXTMP($J,1),"~")'=-2 W "Error in -2",! 77 D APPDEL^BSDX08(.ZZZ,999999,"PC",1,"Reasons") 78 I $P(^BSDXTMP($J,1),"~")'=-3 W "Error in -3",! 79 UT2 ; More unit Tests 80 ; 81 ; Test 6: for Cancelling walkin and checked-in appointments 82 S BSDXSTART=$E($$NOW^XLFDT,1,12),BSDXEND=BSDXSTART+.0001 83 D APPADD^BSDX07(.ZZZ,BSDXSTART,BSDXEND,4,"Dr Office",10,"Sam's Note",1) ; Add appt 84 S APPID=+$P(^BSDXTMP($J,1),U) 85 I APPID=0 W "Error in test 6",! 86 D CHECKIN^BSDX25(.ZZZ,APPID,$$NOW^XLFDT) ; check-in 87 D APPDEL^BSDX08(.ZZZ,APPID,"PC",10,"Cancel Note") ; Delete appt 88 I $P(^BSDXTMP($J,1),$C(30))'="" W "Error in test 6",! 89 ; 90 ; Test 7: for cancelling walkin and checked-in appointments 91 S BSDXSTART=$E($$NOW^XLFDT,1,12)+.0001,BSDXEND=BSDXSTART+.0001 92 D APPADD^BSDX07(.ZZZ,BSDXSTART,BSDXEND,4,"Dr Office",10,"Sam's Note",1) ; Add appt 93 S APPID=+$P(^BSDXTMP($J,1),U) 94 I APPID=0 W "Error in test 6",! 95 D CHECKIN^BSDX25(.ZZZ,APPID,$$NOW^XLFDT) ; Checkin 96 S BSDXRES=$O(^BSDXRES("B","Dr Office","")) 97 S BSDXCLN=$P(^BSDXRES(BSDXRES,0),U,4) 98 S BSDXRESULT=$$RMCI^BSDXAPI(4,BSDXCLN,BSDXSTART) ; remove checkin 99 D APPDEL^BSDX08(.ZZZ,APPID,"PC",10,"Cancel Note") ; delete appt 100 I $P(^BSDXTMP($J,1),$C(30))'="" W "Error in test 6",! 101 QUIT 102 APPDEL(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT) ;EP 40 103 ;Called by RPC: BSDX CANCEL APPOINTMENT 41 104 ;Cancels existing appointment in BSDX APPOINTMENT and 44/2 subfiles … … 61 124 ; Counter 62 125 N BSDXI S BSDXI=0 63 ;64 126 ; Header Node 65 127 S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30) 128 ; 129 ; Lock BSDX node, only to synchronize access to the globals. 130 ; It's not expected that the error will ever happen as no filing 131 ; is supposed to take 5 seconds. 132 L +^BSDXAPPT(BSDXAPTID):5 I '$T D ERR(BSDXI,"-1~BSDX08: Appt record is locked. Please contact technical support.") Q 133 ; 134 ;Restartable Transaction; restore paramters when starting. 135 ; (Params restored are what's passed here + BSDXI) 136 TSTART (BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT,BSDXI):T="BSDX CANCEL APPOINTEMENT^BSDX08" 66 137 ; 67 138 ; Turn off SDAM APPT PROTOCOL BSDX Entries … … 70 141 ; 71 142 ;;;test for error inside transaction. See if %ZTER works 72 I $G(BSDXDIE1) N X S X=1/0 143 I $G(bsdxdie) S X=1/0 144 ;;;test 145 ;;;test for TRESTART 146 I $G(bsdxrestart) K bsdxrestart TRESTART 147 ;;;test 73 148 ; 74 149 ; Check appointment ID and whether it exists 75 150 I '+BSDXAPTID D ERR(BSDXI,"-2~BSDX08: Invalid Appointment ID") Q 76 151 I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-3~BSDX08: Invalid Appointment ID") Q 77 ;78 ; Lock BSDX node, only to synchronize access to the globals.79 ; It's not expected that the error will ever happen as no filing80 ; is supposed to take 5 seconds.81 L +^BSDXAPPT(BSDXAPTID):5 E D ERR(BSDXI,"-1~BSDX08: Appt record is locked. Please contact technical support.") Q82 152 ; 83 153 ; Start Processing: 84 ; First, get data154 ; First, add cancellation date to appt entry in BSDX APPOINTMENT 85 155 N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; BSDX Appt Node 86 156 N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; Patient ID 87 157 N BSDXSTART S BSDXSTART=$P(BSDXNOD,U) ; Start Time 88 ; 89 ; Check the resource ID and whether it exists 158 D BSDXCAN(BSDXAPTID) ; Add a cancellation date in BSDX APPOINTMENT 159 ; 160 ; Second, cancel appt in "S" nodes in file 2 and 44, then update Legacy PIMS Availability 90 161 N BSDXSC1 S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID 91 ; If the resou rce id doesn't exist...162 ; If the resouce id doesn't exist... 92 163 I BSDXSC1="" D ERR(BSDXI,"-4~BSDX08: Cancelled appointment does not have a Resouce ID") QUIT 93 164 I '$D(^BSDXRES(BSDXSC1,0)) D ERR(BSDXI,"-5~BSDX08: Resouce ID does not exist in BSDX RESOURCE") QUIT 94 ;95 ;96 ; Check if PIMS will let us cancel the appointment using $$CANCELCK^BSDXAPI97 165 ; Get zero node of resouce 98 N BSDXNODS BSDXNOD=^BSDXRES(BSDXSC1,0)166 S BSDXNOD=^BSDXRES(BSDXSC1,0) 99 167 ; Get Hosp location 100 168 N BSDXLOC S BSDXLOC=$P(BSDXNOD,U,4) 101 ; Error indicator 169 ; Error indicator for Hosp Location filing for getting out of routine 102 170 N BSDXERR S BSDXERR=0 103 ; 104 N BSDXC ; Array to pass to BSDXAPI 105 ; 106 I BSDXLOC D 107 . S BSDXC("PAT")=BSDXPATID 108 . S BSDXC("CLN")=BSDXLOC 109 . S BSDXC("TYP")=BSDXTYP 110 . S BSDXC("ADT")=BSDXSTART 111 . S BSDXC("CDT")=$$NOW^XLFDT() 112 . S BSDXC("NOT")=BSDXNOT 113 . S:'+$G(BSDXCR) BSDXCR=11 ;Other 114 . S BSDXC("CR")=BSDXCR 115 . S BSDXC("USR")=DUZ 116 . ; 117 . S BSDXERR=$$CANCELCK^BSDXAPI(.BSDXC) ; 0 or 1^error message 118 ; If error, quit. No need to rollback as no changes took place. 119 I BSDXERR D ERR(BSDXI,"-9~BSDX08: BSDXAPI reports that "_$P(BSDXERR,U,2)) QUIT 120 ; 121 I $G(BSDXDIE2) N X S X=1/0 122 ; 123 ; Now cancel the appointment for real 124 ; BSDXAPPT First; no need for rollback if error occured. 125 N BSDXERR S BSDXERR=$$BSDXCAN(BSDXAPTID) ; Add a cancellation date in BSDX APPOINTMENT 126 I BSDXERR D ERR(BSDXI,"-10~BSDX08: $$BSDXCAN failed (Fileman filing error): "_$P(BSDXERR,U,2)) QUIT 127 ; 128 ; Then PIMS: 129 ; cancel appt in "S" nodes in file 2 and 44, then update Legacy PIMS Availability 130 ; If error happens, must rollback ^BSDXAPPT 131 I BSDXLOC S BSDXERR=$$CANCEL^BSDXAPI(.BSDXC) ; Cancel through BSDXAPI 132 ; Rollback BSDXAPPT if error occurs 133 I BSDXERR D ERR(BSDXI,"-9^BSDX08: BSDXAPI returned an error: "_$P(BSDXERR,U,2)),ROLLBACK(BSDXAPTID) QUIT 134 ; 171 ; Only file in 2/44 if there is an associated hospital location 172 I BSDXLOC D QUIT:BSDXERR 173 . I '$D(^SC(BSDXLOC,0)) S BSDXERR=1 D ERR(BSDXI,"-6~BSDX08: Invalid Hosp Location stored in Database") QUIT 174 . ; Get the IEN of the appointment in the "S" node of ^SC 175 . N BSDXSCIEN 176 . S BSDXSCIEN=$$SCIEN^BSDXAPI(BSDXPATID,BSDXLOC,BSDXSTART) 177 . I BSDXSCIEN="" S BSDXERR=1 D ERR(BSDXI,"-7~BSDX08: Patient does not have an appointment in PIMS Clinic") QUIT 178 . ; Get the appointment node 179 . S BSDXNOD=$G(^SC(BSDXLOC,"S",BSDXSTART,1,BSDXSCIEN,0)) 180 . I BSDXNOD="" S BSDXERR=1 D ERR(BSDXI,"-8^BSDX08: Unable to find associated PIMS appointment for this patient") QUIT 181 . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2) 182 . ; Cancel through BSDXAPI 183 . N BSDXZ 184 . D APCAN(.BSDXZ,BSDXLOC,BSDXPATID,BSDXSTART) 185 . I +BSDXZ>0 S BSDXERR=1 D ERR(BSDXI,"-9^BSDX08: BSDXAPI returned an error: "_$P(BSDXZ,U,2)) QUIT 186 . ; Update Legacy PIMS clinic Availability 187 . D AVUPDT(BSDXLOC,BSDXSTART,BSDXLEN) 188 ; 189 TCOMMIT 135 190 L -^BSDXAPPT(BSDXAPTID) 136 191 S BSDXI=BSDXI+1 … … 140 195 Q 141 196 ; 142 BSDXCAN(BSDXAPTID) ; $$; Private; Cancel BSDX APPOINTMENT entry 143 ; Input: Appt IEN in ^BSDXAPPT 144 ; Output: 0 for success and 1^Msg for failure 145 N BSDXDATE,BSDXIENS,BSDXFDA,BSDXMSG 146 S BSDXDATE=$$NOW^XLFDT() 197 AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN) ;Update Legacy PIMS Clinic availability 198 ;See SDCNP0 199 N SD,S ; Start Date 200 S (SD,S)=BSDXSTART 201 N I ; Clinic IEN in 44 202 S I=BSDXSCD 203 ; if day has no schedule in legacy PIMS, forget about this update. 204 Q:'$D(^SC(I,"ST",SD\1,1)) 205 N SL ; Clinic characteristics node (length of appt, when appts start etc) 206 S SL=^SC(I,"SL") 207 N X ; Hour Clinic Display Begins 208 S X=$P(SL,U,3) 209 N STARTDAY ; When does the day start? 210 S STARTDAY=$S($L(X):X,1:8) ; If defined, use it; otherwise, 8am 211 N SB ; ?? Who knows? Day Start - 1 divided by 100. 212 S SB=STARTDAY-1/100 213 S X=$P(SL,U,6) ; Now X is Display increments per hour 214 N HSI ; Slots per hour, try 1 215 S HSI=$S(X:X,1:4) ; if defined, use it; otherwise, 4 216 N SI ; Slots per hour, try 2 217 S SI=$S(X="":4,X<3:4,X:X,1:4) ; If slots "", or less than 3, then 4 218 N STR ; ?? 219 S STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz" 220 N SDDIF ; Slots per hour diff?? 221 S SDDIF=$S(HSI<3:8/HSI,1:2) 222 S SL=BSDXLEN ; Dammit, reusing variable; SL now Appt Length from GUI 223 S S=^SC(I,"ST",SD\1,1) ; reusing var again; S now Day Pattern from PIMS 224 N Y ; Hours since start of Date 225 S Y=SD#1-SB*100 ;SD#1=FM Time portion; -SB minus start of day; conv to hrs 226 N ST ; ?? 227 ; Y#1 -> Minutes; *SI -> * Slots per hour; \.6 trunc min to hour 228 ; Y\1 -> Hours since start of day; * SI: * slots 229 S ST=Y#1*SI\.6+(Y\1*SI) 230 N SS ; how many slots are supposed to be taken by appointment 231 S SS=SL*HSI/60 ; (nb: try SL: 30 min; HSI: 4 slots) 232 N I 233 I Y'<1 D ; If Hours since start of Date is greater than 1 234 . ; loop through pattern. Tired of documenting. 235 . F I=ST+ST:SDDIF D Q:Y="" Q:SS'>0 236 . . S Y=$E(STR,$F(STR,$E(S,I+1))) Q:Y="" 237 . . S S=$E(S,1,I)_Y_$E(S,I+2,999) 238 . . S SS=SS-1 239 . . Q:SS'>0 240 S ^SC(BSDXSCD,"ST",SD\1,1)=S ; new pattern; global set 241 Q 242 ; 243 APCAN(BSDXZ,BSDXLOC,BSDXDFN,BSDXSD) ; 244 ;Cancel appointment for patient BSDXDFN in clinic BSDXSC1 245 ;at time BSDXSD 246 N BSDXC,%H 247 S BSDXC("PAT")=BSDXPATID 248 S BSDXC("CLN")=BSDXLOC 249 S BSDXC("TYP")=BSDXTYP 250 S BSDXC("ADT")=BSDXSD 251 S %H=$H D YMD^%DTC 252 S BSDXC("CDT")=X+% 253 S BSDXC("NOT")=BSDXNOT 254 S:'+$G(BSDXCR) BSDXCR=11 ;Other 255 S BSDXC("CR")=BSDXCR 256 S BSDXC("USR")=DUZ 257 ; 258 S BSDXZ=$$CANCEL^BSDXAPI(.BSDXC) 259 Q 260 ; 261 BSDXCAN(BSDXAPTID) ; 262 ;Cancel BSDX APPOINTMENT entry 263 N %DT,X,BSDXDATE,Y,BSDXIENS,BSDXFDA,BSDXMSG 264 S %DT="XT",X="NOW" D ^%DT ; X ^DD("DD") 265 S BSDXDATE=Y 147 266 S BSDXIENS=BSDXAPTID_"," 148 267 S BSDXFDA(9002018.4,BSDXIENS,.12)=BSDXDATE 268 K BSDXMSG 149 269 D FILE^DIE("","BSDXFDA","BSDXMSG") 150 I $D(BSDXMSG) Q 1_U_BSDXMSG("DIERR",1,"TEXT",1) 151 QUIT 0 152 ; 153 ROLLBACK(BSDXAPTID) ; Proc; Private; Rollback cancellation 154 ; Input same as $$BSDXCAN 155 N BSDXIENS S BSDXIENS=BSDXAPTID_"," 156 N BSDXFDA S BSDXFDA(9002018.4,BSDXIENS,.12)="@" 157 N BSDXMSG 158 D FILE^DIE("","BSDXFDA","BSDXMSG") 159 ;I $D(BSDXMSG) ; Not sure what to do. We are already handling an error. 160 QUIT 270 Q 161 271 ; 162 272 CANEVT(BSDXPAT,BSDXSTART,BSDXSC) ;EP Called by BSDX CANCEL APPOINTMENT event … … 182 292 Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND 183 293 S BSDXAPPT=0 F S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT D Q:BSDXFOUND 184 . N BSDXNOD185 294 . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD="" 186 295 . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q 187 I BSDXFOUND,+$G(BSDXAPPT) N % S %=$$BSDXCAN(BSDXAPPT) I % D ^%ZTER296 I BSDXFOUND,+$G(BSDXAPPT) D BSDXCAN(BSDXAPPT) 188 297 Q BSDXFOUND 189 298 ; … … 200 309 ; 201 310 ERR(BSDXI,BSDXERR) ;Error processing 202 ; Unlock first203 L:$D(BSDXAPTID) -^BSDXAPPT(BSDXAPTID)204 ; If last line is $C(31), we are done. No more errors to send to client.205 I ^BSDXTMP($J,$O(^BSDXTMP($J," "),-1))=$C(31) QUIT206 311 S BSDXI=BSDXI+1 207 312 S BSDXERR=$TR(BSDXERR,"^","~") 313 I $TL>0 TROLLBACK 208 314 S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30) 209 315 S BSDXI=BSDXI+1 210 316 S ^BSDXTMP($J,BSDXI)=$C(31) 317 L -^BSDXAPPT(BSDXAPTID) 211 318 QUIT 212 319 ; 213 320 ETRAP ;EP Error trap entry 214 321 N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap 322 ; Rollback, otherwise ^XTER will be empty from future rollback 323 I $TL>0 TROLLBACK 215 324 D ^%ZTER 216 ; 217 ; Roll back BSDXAPPT; 218 ; NB: What if a Mumps error happens inside fileman in BSDXAPI? 219 ; I have decided the M errors are out of scope for me to handle. 220 D:$G(BSDXAPTID) ROLLBACK(BSDXAPTID) 221 ; 325 S $EC="" ; Clear Error 222 326 ; Log error message and send to client 223 327 I '$D(BSDXI) N BSDXI S BSDXI=0 224 328 D ERR(BSDXI,"-100~BSDX08 Error: "_$G(%ZTERZE)) 225 Q :$Q 1_U_"-100~Mumps Error" Q329 QUIT 226 330 ; 227 331 ;;;NB: This is code that is unused in both original and port. -
Scheduling/trunk/m/BSDX09.m
r1481 r1563 1 BSDX09 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; ; 6/21/12 11:03am2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDX09 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; ; 4/28/11 10:18am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX11.m
r1481 r1563 1 1 BSDX11 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:18am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX12.m
r1481 r1563 1 1 BSDX12 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:18am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX13.m
r1481 r1563 1 1 BSDX13 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:19am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX14.m
r1481 r1563 1 1 BSDX14 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:19am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX15.m
r1481 r1563 1 1 BSDX15 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:19am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX16.m
r1481 r1563 1 1 BSDX16 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; ; 4/28/11 10:20am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX17.m
r1481 r1563 1 1 BSDX17 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:20am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX18.m
r1481 r1563 1 1 BSDX18 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:20am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX19.m
r1481 r1563 1 1 BSDX19 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:21am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX20.m
r1481 r1563 1 1 BSDX20 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:21am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX21.m
r1481 r1563 1 1 BSDX21 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:22am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX22.m
r1481 r1563 1 1 BSDX22 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:22am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX23.m
r1481 r1563 1 1 BSDX23 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:22am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX24.m
r1481 r1563 1 1 BSDX24 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:22am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX25.m
r1481 r1563 1 BSDX25 ; V EN/SMH - WINDOWS SCHEDULING RPCS ; 7/9/12 5:00pm2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDX25 ; VW/UJO/SMH - WINDOWS SCHEDULING RPCS ; 4/28/11 10:24am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; 5 5 ; Change Log: 6 6 ; 3110106: SMH -> Changed Check-in EP - Removed unused paramters. Will change C# 7 ; 3120630: VEN/SMH -> Extensive Refactoring to remove transactions. 8 ; -> Functionality still the same. 9 ; -> Unit Tests in UT25^BSDXUT2 10 ; 11 ; 12 CHECKIND(BSDXY,BSDXAPPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG) ;EP 7 ; 8 ; 9 UT ; Unit Tests 10 ; Make appointment, checkin, then uncheckin 11 N ZZZ 12 N APPTTIME S APPTTIME=$E($$NOW^XLFDT(),1,12) 13 D APPADD^BSDX07(.ZZZ,APPTTIME,APPTTIME+.0001,3,"Dr Office",30,"Sam's Note",1) 14 N APPTID S APPTID=+^BSDXTMP($J,1) 15 N HL S HL=$$GET1^DIQ(9002018.4,APPTID,".07:.04","I") 16 D CHECKIN^BSDX25(.ZZZ,APPTID,$$NOW^XLFDT()) 17 IF '$P(^BSDXAPPT(APPTID,0),U,3) WRITE "ERROR IN CHECKIN 1",! 18 IF '+$G(^SC(HL,"S",APPTTIME,1,1,"C")) WRITE "ERROR IN CHECKIN 2",! 19 D RMCI^BSDX25(.ZZZ,APPTID) 20 IF $P(^BSDXAPPT(APPTID,0),U,3) WRITE "ERROR IN UNCHECKIN 1",! 21 IF $G(^SC(HL,"S",APPTTIME,1,1,"C")) WRITE "ERROR IN UNCHECKIN 2",! 22 D RMCI^BSDX25(.ZZZ,APPTID) ; again, test sanity in repeat 23 IF $P(^BSDXAPPT(APPTID,0),U,3) WRITE "ERROR IN UNCHECKIN 1",! 24 IF $G(^SC(HL,"S",APPTTIME,1,1,"C")) WRITE "ERROR IN UNCHECKIN 2",! 25 ; now test various error conditions 26 ; Test Error 1 27 D RMCI^BSDX25(.ZZZ,) 28 IF +^BSDXTMP($J,1)'=-1 WRITE "ERROR IN ETest 1",! 29 ; Test Error 2 30 D RMCI^BSDX25(.ZZZ,234987234398) 31 IF +^BSDXTMP($J,1)'=-2 WRITE "ERROR IN Etest 2",! 32 ; Tests for 3 to 5 difficult to produce 33 ; Error tests follow: Mumps error test; Transaction restartability 34 N bsdxdie S bsdxdie=1 35 D RMCI^BSDX25(.ZZZ,APPTID) 36 IF +^BSDXTMP($J,1)'=-20 WRITE "ERROR IN Etest 3",! 37 K bsdxdie 38 N bsdxrestart S bsdxrestart=1 39 D RMCI^BSDX25(.ZZZ,APPTID) 40 IF +^BSDXTMP($J,1)'=0 WRITE "Error in Etest 4",! 41 QUIT 42 CHECKIND(BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG) ;EP 13 43 ;Entry point for debugging 14 44 ; 15 ;I +$G(^BSDXDBUG("BREAK","CHECKIN")),+$G(^BSDXDBUG("BREAK"))=DUZ D DEBUG^%Serenji("CHECKIN^BSDX25(.BSDXY,BSDXAPPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)",$P(^BSDXDBUG("BREAK"),U,2)) 16 Q 17 ; 18 CHECKIN(BSDXY,BSDXAPPTID,BSDXCDT) ;Private EP Check in appointment 19 ; Old additional vars: ,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG) 20 ; Called by RPC: BSDX CHECKIN APPOINTMENT 21 ; 45 ;I +$G(^BSDXDBUG("BREAK","CHECKIN")),+$G(^BSDXDBUG("BREAK"))=DUZ D DEBUG^%Serenji("CHECKIN^BSDX25(.BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)",$P(^BSDXDBUG("BREAK"),U,2)) 46 Q 47 ; 48 CHECKIN(BSDXY,BSDXAPTID,BSDXCDT) ; ,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG) ;EP Check in appointment 22 49 ; Private to GUI; use BSDXAPI for general API to checkin patients 23 50 ; Parameters: 24 51 ; BSDXY: Global Out 25 ; BSDXAP PTID: Appointment ID in ^BSDXAPPT52 ; BSDXAPTID: Appointment ID in ^BSDXAPPT 26 53 ; BSDXCDT: Checkin Date --> Changed 27 54 ; BSDXCC: Clinic Stop IEN (not used) … … 30 57 ; BSDXVCL: PCC+ Clinic IEN (not used) 31 58 ; BSDXVFM: PCC+ Form IEN (not used) 32 ; BSDXOG: PCC+ Outguide (true or false) (not used)59 ; BSDXOG: PCC+ Outguide (true or false) 33 60 ; 34 61 ; Output: … … 36 63 ; - 0 if all okay 37 64 ; - Another number or text if not 38 ; 39 ; Error reference: 40 ; -1 -> Invalid Appointment ID 41 ; -2 -> Invalid Check-in Date 42 ; -3 -> Cannot check-in due to Fileman Filer failure 43 ; -4 -> Cannot lock ^BSDXAPPT(APPTID) 44 ; -10 -> BSDXAPI error 45 ; -100 -> Mumps Error 46 ; 47 ; Turn off SDAM Appointment Events BSDX Protocol Processing 65 66 N BSDXNOD,BSDXPATID,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXZ,BSDXIENS,BSDXVEN 48 67 N BSDXNOEV 49 68 S BSDXNOEV=1 ;Don't execute protocol 50 69 ; 51 ; Set min DUZ vars 52 D ^XBKVAR 53 ; 54 ; $ET 55 N $ET S $ET="G ERROR^BSDX25" 56 ; 57 ; Test for error trap for Unit Tests 58 I $G(BSDXDIE) N X S X=1/0 59 ; 60 N BSDXI S BSDXI=0 61 ; 62 S BSDXY=$NAME(^BSDXTMP($J)) 63 K @BSDXY 64 ; 70 D ^XBKVAR S X="ERROR^BSDX25",@^%ZOSF("TRAP") 71 S BSDXI=0 72 K ^BSDXTMP($J) 73 S BSDXY="^BSDXTMP("_$J_")" 65 74 S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30) 66 ; 67 I '+BSDXAPPTID D ERR("-1~Invalid Appointment ID") QUIT 68 I '$D(^BSDXAPPT(BSDXAPPTID,0)) D ERR("-1~Invalid Appointment ID") QUIT 69 ; 70 ; Lock BSDX node, only to synchronize access to the globals. 71 ; It's not expected that the error will ever happen as no filing 72 ; is supposed to take 5 seconds. 73 L +^BSDXAPPT(BSDXAPPTID):5 E D ERR("-4~Appt record is locked. Please contact technical support.") QUIT 74 ; 75 I '+BSDXAPTID D ERR("BSDX25: Invalid Appointment ID") Q 76 I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR("BSDX08: Invalid Appointment ID") Q 75 77 ; Remove Date formatting v.1.5. Client will send date as FM Date. 76 78 ;S:BSDXCDT["@0000" BSDXCDT=$P(BSDXCDT,"@") 77 79 ;S %DT="T",X=BSDXCDT D ^%DT S BSDXCDT=Y 78 S BSDXCDT=+BSDXCDT ; Strip off zeros if C# sends them79 I BSDXCDT '>2000000 D ERR("-2~Invalid Check-in Date") QUIT80 S BSDXCDT=+BSDXCDT ; Strip off zeros if C# sends them 81 I BSDXCDT=-1 D ERR(70) Q 80 82 I BSDXCDT>$$NOW^XLFDT S BSDXCDT=$$NOW^XLFDT 81 ; 82 ; Some data 83 N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPPTID,0) ; Appointment Node 84 N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; DFN 85 N BSDXSTART S BSDXSTART=$P(BSDXNOD,U) ; Appointment Start Time 86 ; 87 ; Get Hospital Location IEN from BSDXAPPT to BSDXRES (RESOUCE:HOSPITAL LOCATION) 88 N BSDXSC1 S BSDXSC1=$$GET1^DIQ(9002018.4,BSDXAPPTID_",",".07:.04","I") 89 I BSDXSC1,'$D(^SC(BSDXSC1,0)) S BSDXSC1="" ; Null it off if it doesn't exist 90 ; 91 ; Check if we can check-in using BSDXAPI 92 N BSDXERR S BSDXERR=0 93 I BSDXSC1 S BSDXERR=$$CHECKIC1^BSDXAPI(BSDXPATID,BSDXSC1,BSDXSTART) 94 I BSDXERR D ERR(-10_"~"_$P(BSDXERR,U,2)) QUIT 95 ; 96 ; Checkin BSDX APPOINTMENT entry 97 ; Failure Analysis: If we fail here, no changes were made. 98 N BSDXERR S BSDXERR=$$BSDXCHK(BSDXAPPTID,BSDXCDT) 99 I BSDXERR D ERR("-3~Fileman Filer failed to check-in appt") QUIT 100 ; 101 ; File check-in using BSDXAPI 102 ; Failure Analysis: If we fail here, we need to roll back first check-in. 103 N BSDXERR S BSDXERR=0 104 I BSDXSC1 S BSDXERR=$$CHECKIN1^BSDXAPI(BSDXPATID,BSDXSC1,BSDXSTART) 105 I BSDXERR D QUIT 106 . N % S %=$$BSDXCHK(BSDXAPPTID,"@") ; No Error checking to prevent loop. 107 . D ERR(-10_"~"_$P(BSDXERR,U,2)) ; Send error message to client 108 ; 109 L -^BSDXAPPT(BSDXAPPTID) 83 ;Checkin BSDX APPOINTMENT entry 84 D BSDXCHK(BSDXAPTID,BSDXCDT) 85 S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) 86 S BSDXPATID=$P(BSDXNOD,U,5) 87 S BSDXSTART=$P(BSDXNOD,U) 88 ; 89 S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID 90 I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D I +$G(BSDXZ) D ERR($P(BSDXZ,U,2)) Q 91 . S BSDXNOD=^BSDXRES(BSDXSC1,0) 92 . S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION 93 . I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APCHK(.BSDXZ,BSDXSC1,BSDXPATID,BSDXCDT,BSDXSTART) 94 ; 110 95 S BSDXI=BSDXI+1 111 96 S ^BSDXTMP($J,BSDXI)="0"_$C(30) … … 114 99 Q 115 100 ; 116 BSDXCHK(BSDXAPPTID,BSDXCDT) ; $$ Private Entry Point. File or delete check-in to 117 ; BSDX Appointment 118 ; Input: BSDXAPPTID -> Appointment ID 119 ; BSDXCDT -> Check-in date, or "@" to remove check-in. 120 ; 121 ; Output: 1^Error for error 122 ; 0 for success 123 ; 124 Q:$G(BSDXSIMERR1) 1_U_"Simulated Error 1" 125 ; 126 N BSDXIENS,BSDXMSG,BSDXFDA ; Filer variables 127 S BSDXIENS=BSDXAPPTID_"," 101 BSDXCHK(BSDXAPTID,BSDXCDT) ; 102 ; 103 S BSDXIENS=BSDXAPTID_"," 128 104 S BSDXFDA(9002018.4,BSDXIENS,.03)=BSDXCDT 129 105 D FILE^DIE("","BSDXFDA","BSDXMSG") 130 Q:$D(BSDXMSG) 1_U_BSDXMSG("DIERR",1,"TEXT",1) 131 Q 0 132 ; 133 RMCI(BSDXY,BSDXAPPTID) ; Private EP - Remove Check-in from BSDX APPT and 2/44 134 ; Called by RPC BSDX REMOVE CHECK-IN 106 Q 107 ; 108 APCHK(BSDXZ,BSDXSC1,BSDXDFN,BSDXCDT,BSDXSTART) ; 109 ;Checkin appointment for patient BSDXDFN in clinic BSDXSC1 110 ;at time BSDXSTART 111 S BSDXZ=$$CHECKIN1^BSDXAPI(BSDXDFN,BSDXSC1,BSDXSTART) 112 Q 113 ; 114 RMCI(BSDXY,BSDXAPPTID) ; EP - Remove Check-in from BSDX APPT and 2/44 115 ; Called by RPC [Fill in later] 135 116 ; 136 117 ; Parameters to pass: … … 147 128 ; -4~DB has corruption. Call Tech Support. (Resource ID in BSDXAPPT doesnt exist in BSDXRES) 148 129 ; -5~BSDXAPI Error. Message depends on error. 149 ; -6~Data Filing Error in BSDXCHK 150 ; -7~Lock not acquired 151 ; -100~Mumps Error 130 ; -20~Mumps Error 152 131 ; 153 132 N BSDXNOEV S BSDXNOEV=1 ;Don't execute protocol … … 163 142 S ^BSDXTMP($J,BSDXI)="T00020ERRORID"_$C(30) ; Header of ADO recordset 164 143 ; 144 TSTART (BSDXI):SERIAL ; Perform Autolocking 145 ; 165 146 ;;;test 166 I $G(BSDXDIE) N X S X=8/0 147 I $g(bsdxdie) S X=8/0 148 ;;; 149 I $g(bsdxrestart) k bsdxrestart TRESTART 150 ;;;test 167 151 ; 168 152 ; Check for Appointment ID (passed and exists in file) … … 170 154 I '$D(^BSDXAPPT(BSDXAPPTID,0)) D ERR("-2~Invalid Appointment ID") QUIT 171 155 ; 172 ; Lock 173 ; Timeout not expected to happen except in error conditions. 174 L +^BSDXAPPT(BSDXAPPTID):5 E D ERR("-7~Appt record is locked. Please contact technical support.") QUIT 175 ; 176 ; Get appointment Data 156 ; Remove checkin from BSDX APPOINTMENT entry 157 D BSDXCHK(BSDXAPPTID,"@") 158 ; 159 ; Now, remove checkin from PIMS files 2/44 177 160 N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPPTID,0) 178 N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) 179 N BSDXSTART S BSDXSTART=$P(BSDXNOD,U) 180 N BSDX RESID S BSDXRESID=$P(BSDXNOD,U,7) ; Resource ID161 N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; DFN 162 N BSDXSTART S BSDXSTART=$P(BSDXNOD,U) ; Start Date 163 N BSDXSC1 S BSDXSC1=$P(BSDXNOD,U,7) ; Resource ID 181 164 ; 182 165 ; If the resource doesn't exist, error out. DB is corrupt. 183 I 'BSDXRESID D ERR("-3~DB has corruption. Call Tech Support.") QUIT 184 I '$D(^BSDXRES(BSDXRESID,0)) D ERR("-4~DB has corruption. Call Tech Support.") QUIT 185 ; 186 ; Get HL Data 187 N BSDXNOD S BSDXNOD=^BSDXRES(BSDXRESID,0) ; Resource 0 node 188 N BSDXSC1 S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION IEN 189 I BSDXSC1,'$D(^SC(BSDXSC1,0)) S BSDXSC1="" ; Zero out if HL doesn't exist 190 ; 191 ; Is it okay to remove check-in from PIMS? 192 N BSDXERR S BSDXERR=0 ; Scratch variable 193 ; $$RMCICK = Remove Check-in Check 194 I BSDXSC1 S BSDXERR=$$RMCICK^BSDXAPI1(BSDXPATID,BSDXSC1,BSDXSTART) 195 I BSDXERR D ERR("-5~"_$P(BSDXERR,U,2)) QUIT 196 ; 197 ; For possible rollback, get old check-in date (internal value) 198 N BSDXCDT S BSDXCDT=$$GET1^DIQ(9002018.4,BSDXAPPTID_",",.03,"I") 199 ; 200 ; Remove checkin from BSDX APPOINTMENT entry 201 ; No need to rollback here on failure. 202 N BSDXERR S BSDXERR=$$BSDXCHK(BSDXAPPTID,"@") 203 I BSDXERR D ERR("-6~Cannot file data in $$BSDXCHK") QUIT 204 ; 205 ; Now, remove checkin from PIMS files 2/44 206 ; Restore BSDXCDT into ^BSDXAPPT if we fail. 207 N BSDXERR S BSDXERR=0 ; Scratch variable to hold error message 208 I BSDXSC1 S BSDXERR=$$RMCI^BSDXAPI1(BSDXPATID,BSDXSC1,BSDXSTART) 209 I BSDXERR D QUIT 210 . N % S %=$$BSDXCHK(BSDXAPPTID,BSDXCDT) ; No error checking here. 211 . D ERR("-5~"_$P(BSDXERR,U,2)) ; Send error message to client 212 ; 213 ; Unlock 214 L -^BSDXAPPT(BSDXAPPTID) 166 I 'BSDXSC1 D ERR("-3~DB has corruption. Call Tech Support.") QUIT 167 I '$D(^BSDXRES(BSDXSC1,0)) D ERR("-4~DB has corruption. Call Tech Support.") QUIT 168 ; 169 N BSDXNOD S BSDXNOD=^BSDXRES(BSDXSC1,0) ; Resource 0 node 170 S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION 171 ; 172 N BSDXZ ; Scratch variable to hold error message 173 I BSDXSC1]"",$D(^SC(BSDXSC1,0)) S BSDXZ=$$RMCI^BSDXAPI(BSDXPATID,BSDXSC1,BSDXSTART) 174 I +$G(BSDXZ) D ERR("-5~"_$P(BSDXZ,U,2)) QUIT 175 ; 176 TCOMMIT ; Save Data into Globals 215 177 ; 216 178 ; Return ADO recordset … … 246 208 Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND 247 209 S BSDXAPPT=0 F S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT D Q:BSDXFOUND 248 . N BSDXNODS BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""210 . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD="" 249 211 . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q 250 I BSDXFOUND,+$G(BSDXAPPT) D 251 . N BSDXERR S BSDXERR=$$BSDXCHK(BSDXAPPT,BSDXSTAT) 252 . I BSDXERR D ^%ZTER ; VEN/SMH - This is silent. This is a last resort 212 I BSDXFOUND,+$G(BSDXAPPT) D BSDXCHK(BSDXAPPT,BSDXSTAT) 253 213 Q BSDXFOUND 254 214 ; … … 265 225 ERROR ; 266 226 S $ETRAP="D ^%ZTER HALT" ; Emergency Error Trap for the wise 267 D ^%ZTER 268 ; VEN/SMH: NB: I make a conscious decision not to roll back anything 269 ; here in the error trap. Once the error is fixed, users can 270 ; undo or redo the check-in. 271 ; Individual portions of this routine may choose to do rolling back 272 ; of their own (e.g. a failed call to BSDXAPI causes rollback to occur 273 ; in CHECKIN and RMCI) 274 ; 275 ; Log error message and send to client 276 D ERR("-100~Mumps Error") 277 Q:$Q "-100^Mumps Error" Q 227 ; Rollback, otherwise ^XTER will be empty from future rollback 228 I $TL>0 TROLLBACK 229 D ^%ZTER 230 S $EC="" ; Clear Error 231 ; Log error message and send to client 232 D ERR("-20~Mumps Error") 233 Q 278 234 ; 279 235 ERR(BSDXERR) ;Error processing 280 ; Unlock first 281 L:$D(BSDXAPPTID) -^BSDXAPPT(BSDXAPPTID) 282 ; If last line is $C(31), we are done. No more errors to send to client. 283 I ^BSDXTMP($J,$O(^BSDXTMP($J," "),-1))=$C(31) QUIT 236 I $TLEVEL>0 TROLLBACK 284 237 S BSDXERR=$G(BSDXERR) 285 238 S BSDXERR=$P(BSDXERR,"~")_"~"_$TEXT(+0)_":"_$P(BSDXERR,"~",2) ; Append Routine Name -
Scheduling/trunk/m/BSDX26.m
r1481 r1563 1 BSDX26 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/10/12 10:27am 2 ;;1.7T2;BSDX;;Jul 11, 2012;Build 18 3 ; Licensed under LGPL 4 ; Change History: 5 ; 3101023 - UJO/SMH - Addition of restartable transaction; relocation of tx. 6 ; 3101205 - UJO/SMH - Extensive refactoring. 7 ; 3120625 - VEN/SMH - Removal of Transactions, reloation of UTs to BSDXUT1 8 ; 9 ; Error Reference: 10 ; 1: Appt ID is not a number 11 ; 2: Appt IEN is not in ^BSDXAPPT 12 ; 3: FM Failure to file WP field in ^BSDXAPPT 13 ; 4: BSDXAPI reports failure to change note field in ^SC 14 ; 5: Failure to acquire lock on ^BSDXAPPT(APPTID) 15 ; 100: Mumps Error 16 ; 17 ; NB: Normally I use negative numbers for errors; this routine returns 18 ; -1 as a successful result! So I needed to use +ve numbers. 19 ; 1 BSDX26 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:24am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 ; Licensed under LGPL 4 ; Change History: 5 ; 3101023 - UJO/SMH - Addition of restartable transaction; relocation of tx. 6 ; --> Thanks to Zach Gonzalez and Rick Marshall 7 ; 3101205 - UJO/SMH - Extensive refactoring. 8 ; 9 ; Error Reference: 10 ; -1: Appt ID is not a number 11 ; -2: Appt IEN is not in ^BSDXAPPT 12 ; -3: FM Failure to file WP field in ^BSDXAPPT 13 ; 20 14 EDITAPTD(BSDXY,BSDXAPTID,BSDXNOTE) ;EP 21 ;Entry point for debugging 22 ; 23 ;D DEBUG^%Serenji("EDITAPT^BSDX26(.BSDXY,BSDXAPTID,BSDXNOTE)") 24 Q 15 ;Entry point for debugging 16 ; 17 D DEBUG^%Serenji("EDITAPT^BSDX26(.BSDXY,BSDXAPTID,BSDXNOTE)") 18 Q 19 UT ; Unit Tests 20 ; Test 1: Make sure this damn thing works 21 N ZZZ 22 N %H S %H=$H 23 N NOTE S NOTE="New Note "_%H 24 D EDITAPT(.ZZZ,188,NOTE) 25 I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR",! B 26 ; Test 2: Test Errors -1 and -2 27 N ZZZ 28 N NOTE S NOTE="Nothing important" 29 D EDITAPT(.ZZZ,"BLAHBLAH",NOTE) 30 I +^BSDXTMP($J,1)'=-1 W "ERROR IN -1",! B 31 D EDITAPT(.ZZZ,298734322,NOTE) 32 I +^BSDXTMP($J,1)'=-2 W "ERROR IN -2",! B 33 ; Test 4: M Error 34 N bsdxdie S bsdxdie=1 35 D EDITAPT(.ZZZ,188,NOTE) 36 I +^BSDXTMP($J,1)'=-100 W "ERROR IN -100",! B 37 k bsdxdie 38 ; Test 5: Trestart 39 N bsdxrestart S bsdxrestart=1 40 N %H S %H=$H 41 N NOTE S NOTE="New Note "_%H 42 D EDITAPT(.ZZZ,188,NOTE) 43 I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR in TRESTART",! B 44 ; Test 6: for Hosp Location Update 45 N DATE S DATE=$$NOW^XLFDT() 46 S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform 47 D APPADD^BSDX07(.ZZZ,DATE,DATE+.001,3,"Dr Office",30,"Old Note",1) 48 N APPID S APPID=+$P(^BSDXTMP($J,1),U) 49 D EDITAPT(.ZZZ,APPID,"New Note") 50 I ^BSDXAPPT(APTID,1,1,0)'="New Note" W "Error in HL Section",! B 51 I $P(^SC(2,"S",DATE,1,1,0),U,4)'="New Note" W "Error in HL Section",! B 52 QUIT 53 ; 25 54 EDITAPT(BSDXY,BSDXAPTID,BSDXNOTE) ;EP Edit appointment (only note text can be edited) 26 ; Called by RPC: BSDX EDIT APPOINTMENT 27 ; 28 ; Edits Appointment Text in BSDX APPOINTMENT file & Hosp Location (44) file 29 ; 30 ; Parameters: 31 ; - BSDXY: Global Return (RPC must be set to Global Array) 32 ; - BSDXAPTID: Appointment IEN in BSDX APPOINTMENT 33 ; - BSDXNOTE: New note 34 ; 35 ; Return: 36 ; ADO.net Recordset having 1 field: ERRORID 37 ; If Okay: -1; otherwise, positive integer with message 38 ; 39 ; Return Array; set Return and clear array 40 S BSDXY=$NA(^BSDXTMP($J)) 41 K ^BSDXTMP($J) 42 ; ET 43 N $ET S $ET="G ETRAP^BSDX26" 44 ; Set up basic DUZ variables 45 D ^XBKVAR 46 ; Counter 47 N BSDXI S BSDXI=0 48 ; Header Node 49 S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30) 50 ; 51 ;;;test for error. See if %ZTER works 52 I $G(BSDXDIE) S X=1/0 53 ; 54 ; Validate Appointment ID 55 I '+BSDXAPTID D ERR(BSDXI,"1~BSDX26: Invalid Appointment ID") QUIT 56 I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"2~BSDX26: Invalid Appointment ID") QUIT 57 ; 58 ; Lock BSDX node, only to synchronize access to the globals. 59 ; It's not expected that the error will ever happen as no filing 60 ; is supposed to take 5 seconds. 61 L +^BSDXAPPT(BSDXAPTID):5 E D ERR(BSDXI,"5~BSDX08: Appt record is locked. Please contact technical support.") QUIT 62 ; 63 ; Put the WP in decendant fields from the root to file as a WP field 64 S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE="" 65 I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0) 66 ; 67 N BSDXMSG ; Message in case of error in filing. 68 ; 69 ; Save Before State in case we need it for rollback 70 K ^TMP($J) 71 M ^TMP($J,"BEFORE","BSDXAPPT")=^BSDXAPPT(BSDXAPTID) 72 ; 73 ; Update note in BSDX APPOINTMENT 74 I $D(BSDXNOTE(.5)) D 75 . D WP^DIE(9002018.4,BSDXAPTID_",",1,"","BSDXNOTE","BSDXMSG") 76 ; 77 ; Error handling. No need for rollback since nothing else changed. 78 I $D(BSDXMSG) D ERR(BSDXI,"3~BSDX26: Fileman failure to file data into 9002018.4") QUIT 79 ; 80 ; Now file in file 44: 81 N PTIEN S PTIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".05","I") ; Patient IEN 82 N HLIEN S HLIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".07:.04","I") ; HL Location IEN pointed to by Resource ID 83 N DATE S DATE=+^BSDXAPPT(BSDXAPTID,0) ; Date of APPT 84 N BSDXRES S BSDXRES=0 ; Result 85 ; Update Note only if we have a linked hospital location. 86 I HLIEN S BSDXRES=$$UPDATENT^BSDXAPI1(PTIEN,HLIEN,DATE,BSDXNOTE(.5)) 87 ; If we get an error (denoted by -1 in BSDXRES), return error to client 88 ; AND restore the original note 89 I BSDXRES D ERR(BSDXI,"4~BSDX26: BSDXAPI reports an error: "_BSDXRES),ROLLBACK(BSDXAPTID) QUIT 90 ; 91 ;Return Recordset indicating success 92 L -^BSDXAPPT(BSDXAPTID) 93 S BSDXI=BSDXI+1 94 S ^BSDXTMP($J,BSDXI)="-1"_$C(30) 95 S BSDXI=BSDXI+1 96 S ^BSDXTMP($J,BSDXI)=$C(31) 97 ; 98 K ^TMP($J) ; Done; remove TMP data 99 QUIT 100 ; 101 ROLLBACK(BSDXAPTID) ; Rollback note to original in ^BSDXAPPT 102 M ^BSDXAPPT(BSDXAPTID)=^TMP($J,"BEFORE","BSDXAPPT") 103 K ^TMP($J) 104 QUIT 105 ; 55 ; Called by RPC: BSDX EDIT APPOINTMENT 56 ; 57 ; Edits Appointment Text in BSDX APPOINTMENT file & Hosp Location (44) file 58 ; 59 ; Parameters: 60 ; - BSDXY: Global Return (RPC must be set to Global Array) 61 ; - BSDXAPTID: Appointment IEN in BSDX APPOINTMENT 62 ; - BSDXNOTE: New note 63 ; 64 ; Return: 65 ; ADO.net Recordset having 1 field: ERRORID 66 ; If Okay: -1; otherwise, positive integer with message 67 ; 68 ; Return Array; set Return and clear array 69 S BSDXY=$NA(^BSDXTMP($J)) 70 K ^BSDXTMP($J) 71 ; ET 72 N $ET S $ET="G ETRAP^BSDX26" 73 ; Set up basic DUZ variables 74 D ^XBKVAR 75 ; Counter 76 N BSDXI S BSDXI=0 77 ; Header Node 78 S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30) 79 ; Restartable txn for GT.M. Restored vars are Params + BSDXI. 80 TSTART (BSDXY,BSDXAPTID,BSDXNOTE,BSDXI):T="BSDX EDIT APPOINTMENT^BSDX26" 81 ; 82 ;;;test for error inside transaction. See if %ZTER works 83 I $G(bsdxdie) S X=1/0 84 ;;;test 85 ;;;test for TRESTART 86 I $G(bsdxrestart) K bsdxrestart TRESTART 87 ;;;test 88 ; 89 ; Validate Appointment ID 90 I '+BSDXAPTID D ERR(BSDXI,"-1~BSDX26: Invalid Appointment ID") QUIT 91 I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-2~BSDX26: Invalid Appointment ID") QUIT 92 ; Put the WP in decendant fields from the root to file as a WP field 93 S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE="" 94 I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0) 95 N BSDXMSG ; Message in case of error in filing. 96 I $D(BSDXNOTE(.5)) D 97 . D WP^DIE(9002018.4,BSDXAPTID_",",1,"","BSDXNOTE","BSDXMSG") 98 I $D(BSDXMSG) D ERR(BSDXI,"-3~BSDX26: Fileman failure to file data into 9002018.4") QUIT 99 ; 100 ; Now file in file 44: 101 N PTIEN S PTIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".05","I") ; Patient IEN 102 N HLIEN S HLIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".07:.04","I") ; HL Location IEN pointed to by Resource ID 103 N DATE S DATE=+^BSDXAPPT(BSDXAPTID,0) ; Date of APPT 104 N BSDXRES S BSDXRES=0 ; Result 105 ; Update Note only if we have a linked hospital location. 106 I HLIEN S BSDXRES=$$UPDATENOTE^BSDXAPI(PTIEN,HLIEN,DATE,BSDXNOTE(.5)) 107 ; If we get an error (denoted by -1 in BSDXRES), return error to client 108 I BSDXRES<0 D ERR(BSDXI,"-4~BSDX26: BSDXAPI reports an error: "_BSDXRES) QUIT 109 ;Return Recordset 110 TCOMMIT 111 S BSDXI=BSDXI+1 112 S ^BSDXTMP($J,BSDXI)="-1"_$C(30) 113 S BSDXI=BSDXI+1 114 S ^BSDXTMP($J,BSDXI)=$C(31) 115 QUIT 116 ; 106 117 ERR(BSDXI,BSDXERR) ;Error processing 107 ; Unlock first 108 L:$D(BSDXAPTID) -^BSDXAPPT(BSDXAPTID) 109 ; If last line is $C(31), we are done. No more errors to send to client. 110 I ^BSDXTMP($J,$O(^BSDXTMP($J," "),-1))=$C(31) QUIT 111 S BSDXI=BSDXI+1 112 S BSDXERR=$TR(BSDXERR,"^","~") 113 S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30) 114 S BSDXI=BSDXI+1 115 S ^BSDXTMP($J,BSDXI)=$C(31) 116 QUIT 117 ; 118 S BSDXI=BSDXI+1 119 S BSDXERR=$TR(BSDXERR,"^","~") 120 I $TL>0 TROLLBACK 121 S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30) 122 S BSDXI=BSDXI+1 123 S ^BSDXTMP($J,BSDXI)=$C(31) 124 QUIT 125 ; 118 126 ETRAP ;EP Error trap entry 119 N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap 120 D ^%ZTER 121 ; 122 I '$D(BSDXI) N BSDXI S BSDXI=0 123 D ERR(BSDXI,"100~BSDX26 Error: "_$G(%ZTERZE)) 124 QUIT 127 N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap 128 I $TL>0 TROLLBACK 129 D ^%ZTER 130 S $EC="" 131 I '$D(BSDXI) N BSDXI S BSDXI=0 132 D ERR(BSDXI,"-100~BSDX26 Error: "_$G(%ZTERZE)) 133 Q -
Scheduling/trunk/m/BSDX27.m
r1481 r1563 1 1 BSDX27 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:24am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX28.m
r1481 r1563 1 BSDX28 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/6/12 10:57am2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDX28 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:25am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; Change Log: … … 38 38 . S BSDXRET=BSDXRET_NAME_U_HRN_U_PID_U_DOB_U_BSDXIEN_$C(30) 39 39 PID ;PID Lookup 40 ; If this ID exists, go get it. If "UJOPID" index doesn't exist,41 ; won't work anyways.42 I $D(^DPT("UJOPID",BSDXP)) DO SET BSDXY=BSDXRET_$C(31) QUIT43 . S BSDXIEN=$O(^DPT("UJOPID",BSDXP,""))44 . Q:'$D(^DPT(BSDXIEN,0))45 . S BSDXDPT=$G(^DPT(BSDXIEN,0))46 . S BSDXZ=$P(BSDXDPT,U) ;NAME47 . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART48 . I BSDXHRN="" Q ;NO CHART AT THIS DUZ249 . ; Inactivated Chart get an *50 . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q51 . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN52 . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID53 . S Y=$P(BSDXDPT,U,3) X ^DD("DD")54 . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB55 . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN56 . S BSDXRET=BSDXRET_BSDXZ_$C(30)40 ; If this ID exists, go get it. If "UJOPID" index doesn't exist, 41 ; won't work anyways. 42 I $D(^DPT("UJOPID",BSDXP)) DO SET BSDXY=BSDXRET_$C(31) QUIT 43 . S BSDXIEN=$O(^DPT("UJOPID",BSDXP,"")) 44 . Q:'$D(^DPT(BSDXIEN,0)) 45 . S BSDXDPT=$G(^DPT(BSDXIEN,0)) 46 . S BSDXZ=$P(BSDXDPT,U) ;NAME 47 . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART 48 . I BSDXHRN="" Q ;NO CHART AT THIS DUZ2 49 . ; Inactivated Chart get an * 50 . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q 51 . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN 52 . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID 53 . S Y=$P(BSDXDPT,U,3) X ^DD("DD") 54 . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB 55 . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN 56 . S BSDXRET=BSDXRET_BSDXZ_$C(30) 57 57 ; 58 58 DOB ;DOB Lookup … … 76 76 . Q 77 77 ; 78 CHART ;Chart# Lookup 78 CHART 79 ;Chart# Lookup 79 80 I +DUZ(2),BSDXP]"",$D(^AUPNPAT("D",BSDXP)) D S BSDXY=BSDXRET_$C(31) Q 80 81 . S BSDXIEN=0 F S BSDXIEN=$O(^AUPNPAT("D",BSDXP,BSDXIEN)) Q:'+BSDXIEN I $D(^AUPNPAT("D",BSDXP,BSDXIEN,DUZ(2))) D Q -
Scheduling/trunk/m/BSDX29.m
r1481 r1563 1 BSDX29 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/9/12 11:50am2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDX29 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:25am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; … … 8 8 ; v1.42 by WV/SMH on 3101023 9 9 ; - Transaction moved; now restartable too. 10 ; --> Thanks to Zach Gonzalez and Rick Marshall. 10 11 ; - Refactoring of major portions of routine 11 ; v1.7 by VEN/SMH on 312062212 ; - Removed transaction code; Locks added in update to prevent concurrent13 ; update14 12 ; 15 13 BSDXCPD(BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND) ;EP 16 14 ;Entry point for debugging 17 15 ; 18 ;D DEBUG^%Serenji("BSDXCP^BSDX29(.BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND)")16 D DEBUG^%Serenji("BSDXCP^BSDX29(.BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND)") 19 17 Q 20 18 ; … … 24 22 ;Called by RPC: BSDX COPY APPOINTMENTS 25 23 ; 26 ; Parameters:27 ; - BSDXY: Global Return28 ; - BSDXRES: BSDX RESOURCE to copy appointments to29 ; - BSDX44: Hospital Location IEN to copy appointments from30 ; - BSDXBEG: Beginning Date in FM Format31 ; - BSDXEND: End Date in FM Format32 ;24 ; Parameters: 25 ; - BSDXY: Global Return 26 ; - BSDXRES: BSDX RESOURCE to copy appointments to 27 ; - BSDX44: Hospital Location IEN to copy appointments from 28 ; - BSDXBEG: Beginning Date in FM Format 29 ; - BSDXEND: End Date in FM Format 30 ; 33 31 ;Returns ADO Recordset containing TASK_NUMBER and ERRORID 34 32 ; 35 ; Return Array33 ; Return Array 36 34 S BSDXY=$NA(^BSDXTMP($J)) 37 K ^BSDXTMP($J)38 ; $ET39 N $ET S $ET="G ETRAP^BSDX29"35 K ^BSDXTMP($J) 36 ; $ET 37 N $ET S $ET="G ETRAP^BSDX29" 40 38 ; Counter 41 N BSDXI S BSDXI=042 ; Header Node39 N BSDXI S BSDXI=0 40 ; Header Node 43 41 S ^BSDXTMP($J,0)="T00010TASK_NUMBER^T00100ERRORID"_$C(30) 44 42 ; 45 ; Make dates inclusive; add 1 to FM dates46 S BSDXBEG=$$FMADD^XLFDT(BSDXBEG,-1)47 S BSDXEND= $$FMADD^XLFDT(BSDXEND,+1)48 ; 49 ; Taskman variables50 N ZTSK,ZTRTN,ZTDTH,ZTDESC,ZTSAVE,ZTIO43 ; Make dates inclusive; add 1 to FM dates 44 S BSDXBEG=BSDXBEG-1 45 S BSDXEND=BSDXEND+1 46 ; 47 ; Taskman variables 48 N ZTSK,ZTRTN,ZTDTH,ZTDESC,ZTSAVE 51 49 ; Task Load 52 S ZTRTN="ZTM^BSDX29",ZTDTH=$H,ZTDESC="COPY PATIENT APPTS" ,ZTIO=""50 S ZTRTN="ZTM^BSDX29",ZTDTH=$H,ZTDESC="COPY PATIENT APPTS" 53 51 S ZTSAVE("BSDXBEG")="",ZTSAVE("BSDXEND")="",ZTSAVE("BSDX44")="",ZTSAVE("BSDXRES")="" 54 52 D ^%ZTLOAD … … 64 62 ; 65 63 ZTM ;EP - Taskman entry point 66 ; Variables set up in ZTSAVE above67 ;64 ; Variables set up in ZTSAVE above 65 ; 68 66 Q:'$D(ZTSK) 69 ;70 ; $ET71 N $ET S $ET="G ZTMERR^BSDX29"72 ;67 ; $ET 68 N $ET S $ET="G ZTMERR^BSDX29" 69 ; Txn 70 TSTART (BSDXBEG,BSDXEND,BSDX44,BSDXRES):T="BSDX COPY APPOINTMENT^BSDX29" 73 71 ;$O through ^SC(BSDX44,"S", 74 72 N BSDXCNT S BSDXCNT=0 ; Count of Copied Appointments 75 N BSDXQUIT S BSDXQUIT=0 ; Quit Flag to be retrieved from an external proc73 N BSDXQUIT S BSDXQUIT=0 ; Quit Flag to be retrieved from an external proc 76 74 ; Set Count 77 S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT75 S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT 78 76 ; Loop through dates here. 79 F S BSDXBEG=$O(^SC(BSDX44,"S",BSDXBEG)) Q:'+BSDXBEG Q:BSDXBEG>BSDXEND Q:BSDXQUIT D80 . ; Loop through Entries in each date in the subsubfile.81 . ; Quit if we are at the end or if a remote process requests a quit.82 . N BSDXIEN S BSDXIEN=077 F S BSDXBEG=$O(^SC(BSDX44,"S",BSDXBEG)) Q:'+BSDXBEG Q:BSDXBEG>BSDXEND Q:BSDXQUIT D 78 . ; Loop through Entries in each date in the subsubfile. 79 . ; Quit if we are at the end or if a remote process requests a quit. 80 . N BSDXIEN S BSDXIEN=0 83 81 . F S BSDXIEN=$O(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN)) Q:'+BSDXIEN Q:BSDXQUIT D 84 82 . . N BSDXNOD S BSDXNOD=$G(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN,0)) ; Node 85 83 . . Q:'+BSDXNOD ; Quit if no node 86 84 . . N BSDXCAN S BSDXCAN=$P(BSDXNOD,U,9) ; Cancel flag 87 . . Q:BSDXCAN="C" ; Quit if appt cancelled -- smh - this will never happen; cancelled appointments are normally removed from 4488 . . N BSDXPAT S BSDXPAT=$P(BSDXNOD,U) ; Patient89 . . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2) ;duration in minutes85 . . Q:BSDXCAN="C" ; Quit if appt cancelled 86 . . N BSDXPAT S BSDXPAT=$P(BSDXNOD,U) ; Patient 87 . . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2) ;duration in minutes 90 88 . . N BSDXCLRK S BSDXCLRK=$P(BSDXNOD,U,6) ;appt made by (clerk) 91 89 . . N BSDXMADE S BSDXMADE=$P(BSDXNOD,U,7) ;date appt made … … 93 91 . . S BSDXCNT=BSDXCNT+$$XFER(BSDXRES,BSDXBEG,BSDXPAT,BSDXLEN,BSDXCLRK,BSDXMADE,BSDXNOTE) 94 92 . . I +BSDXCNT,BSDXCNT#10=0 S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT_" records copied." ;every 10th record 95 . . I $D(^BSDXTMP("BSDXCOPY",ZTSK,"CANCEL")) S BSDXQUIT=1 ;Check for cancel flag ; smh - not used currently (v1.7) 96 ; 97 ; 93 . . I $D(^BSDXTMP("BSDXCOPY",ZTSK,"CANCEL")) S BSDXQUIT=1 ;Check for cancel flag 94 . . Q 95 . Q 96 I 'BSDXQUIT TCOMMIT 97 E TROLLBACK 98 98 S ^BSDXTMP("BSDXCOPY",ZTSK)=$S(BSDXQUIT:"Cancelled. No records copied.",1:"Finished. "_BSDXCNT_" records copied.") 99 99 Q … … 101 101 ZTMERR ; For now, error from TM is only in trap; not returned to client. 102 102 N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap 103 ; Rollback before logging the error 104 I $TL>0 TROLLBACK 103 105 D ^%ZTER 106 S $EC="" ; Clear Error 104 107 QUIT 105 108 ; … … 109 112 ;Return 1 if record copied, otherwise 0 110 113 ; 111 N REF112 S REF=$NA(^BSDXLOCK(BSDXRES,BSDXBEG,BSDXPAT)) ; This combo is unique113 L +@REF:0 E Q 0114 ;115 114 ;$O Thru ^BSDXAPPT to determine if this appt already added 116 N BSDXEND,BSDXIEN,BSDXFND,BSDXPAT2 ,BSDXNOD115 N BSDXEND,BSDXIEN,BSDXFND,BSDXPAT2 117 116 S BSDXIEN=0,BSDXFND=0 118 117 F S BSDXIEN=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXBEG,BSDXIEN)) Q:'+BSDXIEN D Q:BSDXFND … … 123 122 . I BSDXPAT2=BSDXPAT S BSDXFND=1 124 123 . Q 125 I BSDXFND L -@REF Q0124 Q:BSDXFND 0 126 125 ; 127 126 ;Add to BSDX APPOINTMENT … … 129 128 ;Calculate ending time from beginning time and duration. 130 129 S BSDXEND=$$ADDMIN(BSDXBEG,BSDXLEN) 131 N BSDXFDA,BSDXIENS132 130 S BSDXIENS="+1," 133 131 S BSDXFDA(9002018.4,BSDXIENS,.01)=BSDXBEG … … 139 137 ; 140 138 K BSDXIEN 141 ;142 139 D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG") 143 140 S BSDXIEN=+$G(BSDXIEN(1)) 144 I '+BSDXIEN L -@REFQ 0141 I '+BSDXIEN Q 0 145 142 ; 146 143 ;Add WP field 147 144 I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE="" D 148 145 . D WP^DIE(9002018.4,BSDXIEN_",",1,"","BSDXNOTE","BSDXMSG") 149 L -@REF150 146 ; 151 147 Q 1 152 148 ; 153 149 ERR(BSDXI,BSDXCNT,BSDXERR) ;Error processing 154 ; If last line is $C(31), we are done. No more errors to send to client. 155 I ^BSDXTMP($J,$O(^BSDXTMP($J," "),-1))=$C(31) QUIT 156 S BSDXI=BSDXI+1 157 S BSDXERR=$TR(BSDXERR,"^","~") 150 S BSDXI=BSDXI+1 151 S BSDXERR=$TR(BSDXERR,"^","~") 158 152 S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_BSDXERR_$C(30) 159 153 S BSDXI=BSDXI+1 … … 163 157 ETRAP ;EP Error trap entry 164 158 ; No Txn here. So don't rollback anything 165 N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap166 D ^%ZTER167 S $EC="" ; Clear error159 N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap 160 D ^%ZTER 161 S $EC="" ; Clear error 168 162 I '$D(BSDXI) N BSDXI S BSDXI=0 169 163 D ERR(BSDXI,$G(BSDXCNT),"~100~BSDX29, Error: "_$G(%ZTERZE)) -
Scheduling/trunk/m/BSDX2E.m
r1481 r1563 1 BSDX2E ;IHS/OIT/MJL - ENVIRONMENT CHECK FOR WINDOWS SCHEDULING [ 7/11/12 9:37am]2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDX2E ;IHS/OIT/MJL - ENVIRONMENT CHECK FOR WINDOWS SCHEDULING [4/28/11 10:28am] 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; … … 24 24 Q:'$$VERCHK("SD",5.3) 25 25 ; Q:'$$PATCHCK("PIMS*5.3*1003") D 26 Q:'$$VERCHK("BMX", 4)26 Q:'$$VERCHK("BMX",2) 27 27 ; 28 28 OTHER ; … … 91 91 . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG") 92 92 . ; Error message 93 . I $D(BSDXMSG) D MES^XPDUTL("Error: ",BSDXMSG("DIERR",1,"TEXT",1))93 . I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1) 94 94 ; 95 95 ; Remove nassssty protocols ORU PATIENT MOVMT and DVBA C&P SCHD EVENT … … 106 106 D:$D(BSDXFDA) FILE^DIE("","BSDXFDA","BSDXMSG") 107 107 ; If error 108 I $D(BSDXMSG) D MES^XPDUTL("Error: ",BSDXMSG("DIERR",1,"TEXT",1))108 I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1) 109 109 ; 110 110 ; … … 117 117 I $G(BSDXERR) W $C(7),"Error: ",BSDXERR 118 118 D PUT^XPAR("PKG","BSDX AUTO PRINT AS",1,0,.BSDXERR) 119 I $G(BSDXERR) D MES^XPDUTL("Error: ",BSDXERR)119 I $G(BSDXERR) W $C(7),"Error: ",BSDXERR 120 120 QUIT 121 121 ; -
Scheduling/trunk/m/BSDX30.m
r1481 r1563 1 BSDX30 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; [ 7/6/12 11:03am]2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDX30 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; [4/28/11 10:28am] 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; … … 7 7 ;Entry point for debugging 8 8 ; 9 ;D DEBUG^%Serenji("SPACE^BSDX30(.BSDXY,BSDXDIC,BSDXVAL)")9 D DEBUG^%Serenji("SPACE^BSDX30(.BSDXY,BSDXDIC,BSDXVAL)") 10 10 Q 11 11 ; … … 49 49 EHRPTD(BSDXY,BSDXWID,BSDXDFN) ; 50 50 ; 51 ;D DEBUG^%Serenji("EHRPT^BSDX30(.BSDXY,BSDXWID,BSDXDFN)")51 D DEBUG^%Serenji("EHRPT^BSDX30(.BSDXY,BSDXWID,BSDXDFN)") 52 52 Q 53 53 ; … … 70 70 ; 71 71 PEVENT(BSDXWID,DFN) ;EP - Raise patient selection event to EHR 72 ; VEN/SMH v1.7 3120706 - Not used in VISTA.73 ; No way right now to synchronize with CPRS.74 ; Code commented out for now.75 72 ; 76 73 ;Change patient context to patient DFN … … 81 78 ;all EHR client sessions belonging to user DUZ. 82 79 ; 83 ;Q:'$G(DUZ)80 Q:'$G(DUZ) 84 81 ;N X 85 82 ;S X="CIANBUTL" X ^%ZOSF("TEST") Q:'$T 86 83 ;S X="CIANBEVT" X ^%ZOSF("TEST") Q:'$T 87 ;N UID,BRET88 ;S BRET=0,UID=089 ;F S BRET=$$NXTUID^CIANBUTL(.UID,1) Q:'UID D90 ;. Q:DUZ'=$$GETVAR^CIANBUTL("DUZ",,,UID)91 ;. I BSDXWID'="" Q:BSDXWID'=$TR($$GETVAR^CIANBUTL("WID",,,UID),"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")92 ;. D QUEUE^CIANBEVT("CONTEXT.PATIENT",+DFN,UID)93 ;Q84 N UID,BRET 85 S BRET=0,UID=0 86 F S BRET=$$NXTUID^CIANBUTL(.UID,1) Q:'UID D 87 . Q:DUZ'=$$GETVAR^CIANBUTL("DUZ",,,UID) 88 . I BSDXWID'="" Q:BSDXWID'=$TR($$GETVAR^CIANBUTL("WID",,,UID),"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") 89 . D QUEUE^CIANBEVT("CONTEXT.PATIENT",+DFN,UID) 90 Q -
Scheduling/trunk/m/BSDX31.m
r1481 r1563 1 BSDX31 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/10/12 10:39am 2 ;;1.7T2;BSDX;;Jul 11, 2012;Build 18 3 ; Licensed under LGPL 4 ; Change Log: 5 ; v1.42 3101023 WV/SMH - Change transaction to restartable. 6 ; v1.42 3101206 UJO/SMH - Extensive refactoring 7 ; v1.7 3120626 VEN/SMH - Removed transactions; extensive refactoring 8 ; - Moved APTNS (whatever it was) to BSDXAPI1 9 ; as $$NOSHOW 10 ; - Made BSDXNOS extrinsic. 11 ; - Moved Unit Tests to BSDXUT1 12 ; - BSDXNOS deletes no-show rather than file 0 for 13 ; undoing a no show 14 ; 15 ; Error Reference: 16 ; -1: zero or null Appt ID 17 ; -2: Invalid APPT ID (doesn't exist in ^BSDXAPPT) 18 ; -3: No-show flag is invalid 19 ; -4: Filing of No-show in ^BSDXAPPT failed 20 ; -5: Filing of No-show in ^DPT failed (BSDXAPI error) 21 ; -6: Invalid Resource ID 22 ; -7: Lock not acquired on ^BSDXAPPT(BSDXAPTID) 23 ; -100: M Error 24 ; 25 ; 1 BSDX31 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:28am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 ; Licensed under LGPL 4 ; Change Log: 5 ; v1.42 Oct 23 2010 WV/SMH 6 ; - Change transaction to restartable. Thanks to Zach Gonzalez 7 ; --> and Rick Marshall for their help. 8 ; v1.42 Dec 6 2010: Extensive refactoring 9 ; 10 ; Error Reference: 11 ; -1: zero or null Appt ID 12 ; -2: Invalid APPT ID (doesn't exist in ^BSDXAPPT) 13 ; -3: No-show flag is invalid 14 ; -4: Filing of No-show in ^BSDXAPPT failed 15 ; -5: Filing of No-show in ^DPT failed (BSDXAPI error) 16 ; -100: M Error 17 ; 18 ; 26 19 NOSHOWD(BSDXY,BSDXAPTID,BSDXNS) ;EP 27 ;Entry point for debugging 28 ; 29 ; D DEBUG^%Serenji("NOSHOW^BSDX31(.BSDXY,BSDXAPTID,BSDXNS)") 30 Q 31 ; 20 ;Entry point for debugging 21 ; 22 D DEBUG^%Serenji("NOSHOW^BSDX31(.BSDXY,BSDXAPTID,BSDXNS)") 23 Q 24 ; 25 UT ; Unit Tests 26 ; Test 1: Sanity Check 27 N ZZZ ; Garbage return variable 28 N DATE S DATE=$$NOW^XLFDT() 29 S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform 30 D APPADD^BSDX07(.ZZZ,DATE,DATE+.0001,3,"Dr Office",30,"Old Note",1) 31 N APPID S APPID=+$P(^BSDXTMP($J,1),U) 32 D NOSHOW(.ZZZ,APPID,1) 33 I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T1",! B 34 I $P(^DPT(3,"S",DATE,0),U,2)'="N" W "ERROR T1",! B 35 ; Test 2: Undo noshow 36 D NOSHOW(.ZZZ,APPID,0) 37 I $P(^BSDXAPPT(APPID,0),U,10)'="0" W "ERROR T2",! B 38 I $P(^DPT(3,"S",DATE,0),U,2)'="" W "ERROR T2",! B 39 ; Test 3: -1 40 D NOSHOW(.ZZZ,"",0) 41 I $P(^BSDXTMP($J,1),U)'=-1 W "ERROR T3",! B 42 ; Test 4: -2 43 D NOSHOW(.ZZZ,2938748233,0) 44 I $P(^BSDXTMP($J,1),U)'=-2 W "ERROR T4",! B 45 ; Test 5: -3 46 D NOSHOW(.ZZZ,APPID,3) 47 I $P(^BSDXTMP($J,1),U)'=-3 W "ERROR T5",! B 48 ; Test 6: Mumps error (-100) 49 s bsdxdie=1 50 D NOSHOW(.ZZZ,APPID,1) 51 I $P(^BSDXTMP($J,1),U)'=-100 W "ERROR T6",! B 52 k bsdxdie 53 ; Test 7: Restartable transaction 54 s bsdxrestart=1 55 D NOSHOW(.ZZZ,APPID,1) 56 I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T7",! B 57 QUIT 32 58 NOSHOW(BSDXY,BSDXAPTID,BSDXNS) ;EP - No show a patient 33 ; Called by RPC: BSDX NOSHOW 34 ; Sets appointment noshow flag in BSDX APPOINTMENT file and "S" node in File 2 35 ; 36 ; Parameters: 37 ; BSDXY: Global Return 38 ; BSDXAPTID is entry number in BSDX APPOINTMENT file 39 ; BSDXNS = 1: NOSHOW, 0: CANCEL NOSHO 40 ; 41 ; Returns ADO.net record set with fields 42 ; - ERRORID; ERRORTEXT 43 ; ERRORID of 1 is okay 44 ; Anything else is an error. 45 ; 46 ; Return Array; set and clear 47 S BSDXY=$NA(^BSDXTMP($J)) 48 K ^BSDXTMP($J) 49 ; 50 ; $ET 51 N $ET S $ET="G ETRAP^BSDX31" 52 ; 53 ; Basline vars 54 D ^XBKVAR ; Set up baseline variables (DUZ, DUZ(2)) if they don't exist 55 ; 56 ; Counter 57 N BSDXI S BSDXI=0 58 ; 59 ; Header Node 60 S ^BSDXTMP($J,BSDXI)="I00100ERRORID^T00030ERRORTEXT"_$C(30) 61 ; 62 ;;;test for error. See if %ZTER works 63 I $G(BSDXDIE) N X S X=1/0 64 ;;;TEST 65 ; 66 ; Turn off SDAM APPT PROTOCOL BSDX Entries 67 N BSDXNOEV S BSDXNOEV=1 ;Don't execute protocol 68 ; 69 ; Appointment ID check 70 I '+BSDXAPTID D ERR(-1,"BSDX31: Invalid Appointment ID") Q 71 I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(-2,"BSDX31: Invalid Appointment ID") Q 72 ; 73 ; Lock BSDX node, only to synchronize access to the globals. 74 ; It's not expected that the error will ever happen as no filing 75 ; is supposed to take 5 seconds. 76 L +^BSDXAPPT(BSDXAPTID):5 E D ERR(-7,"BSDX31: Appt record is locked. Please contact technical support.") Q 77 ; 78 ; Noshow value check - Must be 1 or 0 79 S BSDXNS=+BSDXNS 80 I BSDXNS'=1&(BSDXNS'=0) D ERR(-3,"BSDX31: Invalid No Show value") Q 81 ; 82 ; Get Some data 83 N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; Node 84 N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; DFN 85 N BSDXSTART S BSDXSTART=$P(BSDXNOD,U) ; Start Date/Time 86 N BSDXRES S BSDXRES=$P(BSDXNOD,U,7) ; Resource ID 87 ; 88 ; Check if Resource ID is missing or invalid 89 I BSDXRES="" D ERR(-6,"BSDX31: Invalid Resource") QUIT 90 I '$D(^BSDXRES(BSDXRES,0)) D ERR(-6,"BSDX31: Invalid Resource") QUIT 91 ; 92 ; Get the Hospital Location 93 N BSDXRESNOD S BSDXRESNOD=^BSDXRES(BSDXRES,0) 94 N BSDXLOC S BSDXLOC=$P(BSDXRESNOD,U,4) ;HOSPITAL LOCATION 95 I BSDXLOC,'$D(^SC(BSDXLOC,0)) S BSDXLOC="" ; Unlink it if it doesn't exist 96 ; I can go and then delete it from ^BSDXRES like Mailman code which tries 97 ; to be too helpful... but I will postpone that until this is a need. 98 ; 99 ; Check if it's okay to no-show patient. 100 N BSDXERR S BSDXERR=0 ; Error variable 101 I BSDXLOC S BSDXERR=$$NOSHOWCK^BSDXAPI1(BSDXPATID,BSDXLOC,BSDXSTART,BSDXNS) 102 I BSDXERR D ERR(-5,"BSDX31: "_$P(BSDXERR,U,2)) QUIT 103 ; 104 ; Simulated Error 105 I $G(BSDXSIMERR1) D ERR(-4,"BSDX31: Simulated Error") QUIT 106 ; Edit BSDX APPOINTMENT entry No-show field 107 ; Failure Analysis: If we fail here, no rollback needed, as this is the 1st 108 ; call 109 N BSDXMSG S BSDXMSG=$$BSDXNOS(BSDXAPTID,BSDXNS) 110 I BSDXMSG D ERR(-4,"BSDX31: "_$P(BSDXMSG,U,2)) QUIT 111 ; 112 ; Edit File 2 "S" node entry 113 ; Failure Analysis: If we fail here, we need to rollback the BSDX 114 ; Apptointment Entry 115 N BSDXERR S BSDXERR=0 ; Error variable 116 ; If HL exist, (resource is linked to PIMS), file no show in File 2 117 I BSDXLOC S BSDXERR=$$NOSHOW^BSDXAPI1(BSDXPATID,BSDXLOC,BSDXSTART,BSDXNS) 118 I BSDXERR D QUIT 119 . D ERR(-5,"BSDX31: "_$P(BSDXERR,U,2)) 120 . N % S %=$$BSDXNOS(BSDXAPTID,'BSDXNS) ; no error checking for filer 121 ; 122 ; Unlock 123 L -^BSDXAPPT(BSDXAPTID) 124 ; 125 ; Return data in ADO.net table 126 S BSDXI=BSDXI+1 127 S ^BSDXTMP($J,BSDXI)="1^"_$C(30) ; 1 means everything okay 128 S BSDXI=BSDXI+1 129 S ^BSDXTMP($J,BSDXI)=$C(31) 130 QUIT 131 ; 132 BSDXNOS(BSDXAPTID,BSDXNS) ; $$ Private; File/unfile noshow in ^BSDXAPPT 133 ; in v1.7 I delete the no-show value rather than file zero 134 N BSDXFDA,BSDXIENS,BSDXMSG 135 N BSDXVALUE ; What to file: 1 or delete it. 136 I BSDXNS S BSDXVALUE=1 137 E S BSDXVALUE="@" 138 S BSDXIENS=BSDXAPTID_"," 139 S BSDXFDA(9002018.4,BSDXIENS,.1)=BSDXVALUE ;NOSHOW 1 or 0 140 D FILE^DIE("","BSDXFDA","BSDXMSG") 141 QUIT:$D(BSDXMSG) -1_U_BSDXMSG("DIERR",1,"TEXT",1) 142 QUIT 0 143 ; 59 ; Called by RPC: BSDX NOSHOW 60 ; Sets appointment noshow flag in BSDX APPOINTMENT file and "S" node in File 2 61 ; 62 ; Parameters: 63 ; BSDXY: Global Return 64 ; BSDXAPTID is entry number in BSDX APPOINTMENT file 65 ; BSDXNS = 1: NOSHOW, 0: CANCEL NOSHO 66 ; 67 ; Returns ADO.net record set with fields 68 ; - ERRORID; ERRORTEXT 69 ; ERRORID of 1 is okay 70 ; Anything else is an error. 71 ; 72 ; Return Array; set and clear 73 S BSDXY=$NA(^BSDXTMP($J)) 74 K ^BSDXTMP($J) 75 ; $ET 76 N $ET S $ET="G ETRAP^BSDX31" 77 ; Basline vars 78 D ^XBKVAR ; Set up baseline variables (DUZ, DUZ(2)) if they don't exist 79 ; Counter 80 N BSDXI S BSDXI=0 81 ; Header Node 82 S ^BSDXTMP($J,BSDXI)="I00100ERRORID^T00030ERRORTEXT"_$C(30) 83 ; Begin transaction 84 TSTART (BSDXI,BSDXY,BSDXAPTID,BSDXNS):T="BSDX NOSHOW CANCEL^BSDX29" 85 ;;;test for error inside transaction. See if %ZTER works 86 I $G(bsdxdie) S X=1/0 87 ;;;TEST 88 ;;;test for TRESTART 89 I $G(bsdxrestart) K bsdxrestart TRESTART 90 ;;;test 91 ; Turn off SDAM APPT PROTOCOL BSDX Entries 92 N BSDXNOEV S BSDXNOEV=1 ;Don't execute protocol 93 ; Appointment ID check 94 I '+BSDXAPTID D ERR(-1,"BSDX31: Invalid Appointment ID") Q 95 I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(-2,"BSDX31: Invalid Appointment ID") Q 96 ; Noshow value check - Must be 1 or 0 97 S BSDXNS=+BSDXNS 98 I BSDXNS'=1&(BSDXNS'=0) D ERR(-3,"BSDX31: Invalid No Show value") Q 99 ; Get Some data 100 N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; Node 101 N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; DFN 102 N BSDXSTART S BSDXSTART=$P(BSDXNOD,U) ; Start Date/Time 103 ; Edit BSDX APPOINTMENT entry 104 N BSDXMSG ; 105 D BSDXNOS(BSDXAPTID,BSDXNS,.BSDXMSG) ;Edit BSDX APPOINTMENT entry NOSHOW field 106 I $D(BSDXMSG("DIERR")) S BSDXMSG=$G(BSDXMSG("DIERR",1,"TEXT",1)) D ERR(-4,"BSDX31: "_BSDXMSG) Q 107 ; Edit File 2 "S" node entry 108 N BSDXZ,BSDXERR ; Error variables to control looping 109 S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID 110 ; If Resource ID exists, and HL exists (means that Resource is linked), No show in File 2 111 I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D I $G(BSDXZ)]"" S BSDXERR="BSDX31: APNOSHO Returned: "_BSDXZ D ERR(-5,BSDXERR) Q 112 . S BSDXNOD=^BSDXRES(BSDXSC1,0) 113 . S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION 114 . I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APNOSHO(.BSDXZ,BSDXSC1,BSDXPATID,BSDXSTART,BSDXNS) 115 ; 116 TCOMMIT 117 S BSDXI=BSDXI+1 118 S ^BSDXTMP($J,BSDXI)="1^"_$C(30) ; 1 means everything okay 119 S BSDXI=BSDXI+1 120 S ^BSDXTMP($J,BSDXI)=$C(31) 121 QUIT 122 ; 123 APNOSHO(BSDXZ,BSDXSC1,BSDXDFN,BSDXSD,BSDXNS) ; 124 ; update file 2 info 125 ;Set noshow for patient BSDXDFN in clinic BSDXSC1 126 ;at time BSDXSD 127 N BSDXC,%H,BSDXCDT,BSDXIEN 128 N BSDXIENS,BSDXFDA,BSDXMSG 129 S %H=$H D YMD^%DTC 130 S BSDXCDT=X+% 131 ; 132 S BSDXIENS=BSDXSD_","_BSDXDFN_"," 133 I +BSDXNS D 134 . S BSDXFDA(2.98,BSDXIENS,3)="N" 135 . S BSDXFDA(2.98,BSDXIENS,14)=DUZ 136 . S BSDXFDA(2.98,BSDXIENS,15)=BSDXCDT 137 E D 138 . S BSDXFDA(2.98,BSDXIENS,3)="" 139 . S BSDXFDA(2.98,BSDXIENS,14)="" 140 . S BSDXFDA(2.98,BSDXIENS,15)="" 141 K BSDXIEN 142 D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG") 143 S BSDXZ=$G(BSDXMSG("DIERR",1,"TEXT",1)) 144 Q 145 ; 146 BSDXNOS(BSDXAPTID,BSDXNS,BSDXMSG) ; 147 ; 148 N BSDXFDA,BSDXIENS 149 S BSDXIENS=BSDXAPTID_"," 150 S BSDXFDA(9002018.4,BSDXIENS,.1)=BSDXNS ;NOSHOW 151 D FILE^DIE("","BSDXFDA","BSDXMSG") 152 QUIT 153 ; 144 154 NOSEVT(BSDXPAT,BSDXSTART,BSDXSC) ;EP Called by BSDX NOSHOW APPOINTMENT event 145 ;when appointments NOSHOW via PIMS interface.146 ;Propagates NOSHOW to BSDXAPPT and raises refresh event to running GUI clients147 ;148 Q:+$G(BSDXNOEV)149 Q:'+$G(BSDXSC)150 Q:$G(SDATA("AFTER","STATUS"))["AUTO RE-BOOK"151 N BSDXSTAT,BSDXFOUND,BSDXRES152 S BSDXSTAT=1153 S:$G(SDATA("BEFORE","STATUS"))["NO-SHOW" BSDXSTAT=0154 S BSDXFOUND=0155 I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)156 I BSDXFOUND D NOSEVT3(BSDXRES) Q157 I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)158 I BSDXFOUND D NOSEVT3(BSDXRES)159 Q160 ;155 ;when appointments NOSHOW via PIMS interface. 156 ;Propagates NOSHOW to BSDXAPPT and raises refresh event to running GUI clients 157 ; 158 Q:+$G(BSDXNOEV) 159 Q:'+$G(BSDXSC) 160 Q:$G(SDATA("AFTER","STATUS"))["AUTO RE-BOOK" 161 N BSDXSTAT,BSDXFOUND,BSDXRES 162 S BSDXSTAT=1 163 S:$G(SDATA("BEFORE","STATUS"))["NO-SHOW" BSDXSTAT=0 164 S BSDXFOUND=0 165 I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT) 166 I BSDXFOUND D NOSEVT3(BSDXRES) Q 167 I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT) 168 I BSDXFOUND D NOSEVT3(BSDXRES) 169 Q 170 ; 161 171 NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT) ; 162 ;Get appointment id in BSDXAPT 163 ;If found, call BSDXNOS(BSDXAPPT) and return 1 164 ;else return 0 165 N BSDXFOUND,BSDXAPPT,BSDXNOD 166 S BSDXFOUND=0 167 Q:'+$G(BSDXRES) BSDXFOUND 168 Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND 169 S BSDXAPPT=0 F S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT D Q:BSDXFOUND 170 . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD="" 171 . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q 172 I BSDXFOUND,+$G(BSDXAPPT) N BSDXMSG S BSDXMSG=$$BSDXNOS(BSDXAPPT,BSDXSTAT) 173 I BSDXMSG D ^%ZTER ; Last ditch error handling. This is supposed to be silently called from the protocol file. 174 Q BSDXFOUND 175 ; 172 ;Get appointment id in BSDXAPT 173 ;If found, call BSDXNOS(BSDXAPPT) and return 1 174 ;else return 0 175 N BSDXFOUND,BSDXAPPT 176 S BSDXFOUND=0 177 Q:'+$G(BSDXRES) BSDXFOUND 178 Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND 179 S BSDXAPPT=0 F S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT D Q:BSDXFOUND 180 . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD="" 181 . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q 182 I BSDXFOUND,+$G(BSDXAPPT) D BSDXNOS(BSDXAPPT,BSDXSTAT) 183 Q BSDXFOUND 184 ; 176 185 NOSEVT3(BSDXRES) ; 177 ;Call RaiseEvent to notify GUI clients178 ;179 N BSDXRESN180 S BSDXRESN=$G(^BSDXRES(BSDXRES,0))181 Q:BSDXRESN=""182 S BSDXRESN=$P(BSDXRESN,"^")183 D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)184 Q185 ;186 ;186 ;Call RaiseEvent to notify GUI clients 187 ; 188 N BSDXRESN 189 S BSDXRESN=$G(^BSDXRES(BSDXRES,0)) 190 Q:BSDXRESN="" 191 S BSDXRESN=$P(BSDXRESN,"^") 192 D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN) 193 Q 194 ; 195 ; 187 196 ERR(BSDXERID,ERRTXT) ;Error processing 188 ; Unlock first 189 L:$D(BSDXAPTID) -^BSDXAPPT(BSDXAPTID) 190 ; If last line is $C(31), we are done. No more errors to send to client. 191 I ^BSDXTMP($J,$O(^BSDXTMP($J," "),-1))=$C(31) QUIT 192 S BSDXI=BSDXI+1 193 S ERRTXT=$TR(ERRTXT,"^","~") 194 S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30) 195 S BSDXI=BSDXI+1 196 S ^BSDXTMP($J,BSDXI)=$C(31) 197 QUIT 198 ; 197 S BSDXI=BSDXI+1 198 S ERRTXT=$TR(ERRTXT,"^","~") 199 I $TL>0 TROLLBACK 200 S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30) 201 S BSDXI=BSDXI+1 202 S ^BSDXTMP($J,BSDXI)=$C(31) 203 QUIT 204 ; 199 205 ETRAP ;EP Error trap entry 200 N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap 201 D ^%ZTER 202 ; 203 ; Send to client 204 I '$D(BSDXI) N BSDXI S BSDXI=0 205 D ERR(-100,"BSDX31 Error: "_$G(%ZTERZE)) 206 Q:$Q 100_U_"Mumps Error" Q 207 ; 206 N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap 207 ; Rollback, otherwise ^XTER will be empty from future rollback 208 I $TL>0 TROLLBACK 209 D ^%ZTER 210 S $EC="" ; Clear Error 211 ; Send to client 212 I '$D(BSDXI) N BSDXI S BSDXI=0 213 D ERR(-100,"BSDX31 Error: "_$G(%ZTERZE)) 214 QUIT 215 ; 208 216 IMHERE(BSDXRES) ;EP 209 ;Entry point for BSDX IM HERE remote procedure210 S BSDXRES=1211 Q212 ;217 ;Entry point for BSDX IM HERE remote procedure 218 S BSDXRES=1 219 Q 220 ; -
Scheduling/trunk/m/BSDX32.m
r1481 r1563 1 1 BSDX32 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 5/11/11 10:39am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX33.m
r1481 r1563 1 1 BSDX33 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:29am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; Mods by WV/STAR -
Scheduling/trunk/m/BSDX34.m
r1481 r1563 1 1 BSDX34 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:29am 2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 182 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDX35.m
r1481 r1563 1 BSDX35 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 6/21/12 3:57pm2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDX35 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 4/28/11 10:29am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDXAPI.m
r1481 r1563 1 BSDXAPI ; IHS/ LJF,HMW,MAW & VEN/SMH - SCHEDULING APIs ; 7/10/12 5:58pm2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDXAPI ; IHS/ANMC/LJF & VW/SMH - SCHEDULING APIs ; 4/28/11 10:30am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; 5 ; Orignal routine is BSDAPI by IHS/LJF, HMW, and MAW 6 ; mods (many) by WV/SMH 7 ; Move to BSDX namespace as BSDXAPI from BSDAPI by WV/SMH 8 ; Change history is located in BSDXAPI1 (to save space). 5 ;Orignal routine is BSDAPI by IHS/LJF, HMW, and MAW 6 ;local mods (many) by WV/SMH 7 ;Move to BSDX namespace as BSDXAPI from BSDAPI by WV/SMH 8 ; Change History: 9 ; 2010-11-5: (1.42) 10 ; - Fixed errors having to do uncanceling patient appointments if it was a patient cancelled appointment. 11 ; - Use new style Fileman API for storing appointments in file 44 in $$MAKE due to problems with legacy API. 12 ; 2010-11-12: (1.42) 13 ; - Changed ="C" to ["C" in SCIEN. Cancelled appointments can be "PC" as well. 14 ; 2010-12-5 (1.42) 15 ; Added an entry point to update the patient note in file 44. 16 ; 2010-12-6 (1.42) 17 ; MAKE1 incorrectly put info field in BSDR("INFO") rather than BSDR("OI") 18 ; 2010-12-8 (1.42) 19 ; Removed restriction on max appt length. Even though this restriction 20 ; exists in fileman (120 minutes), PIMS ignores it. Therefore, I 21 ; will ignore it here too. 22 ; 2011-01-25 (v.1.5) 23 ; Added entry point $$RMCI to remove checked in appointments. 24 ; In $$CANCEL, if the appointment is checked in, delete check-in rather than 25 ; spitting an error message to the user saying 'Delete the check-in' 26 ; Changed all lines that look like this: 27 ; I $G(BSDR("ADT"))'?7N1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT")) 28 ; to: 29 ; I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT")) 30 ; to allow for date at midnight which does not have a dot at the end. 31 ; 2011-01-26 (v.1.5) 32 ; More user friendly message if patient already has appointment in $$MAKE: 33 ; Spits out pt name and user friendly date. 34 ; 9 35 ; 10 36 MAKE1(DFN,CLIN,TYP,DATE,LEN,INFO) ; Simplified PEP w/ parameters for $$MAKE - making appointment … … 13 39 ; for Baby foxes hallucinations. 14 40 ; S RESULT=$$MAKE1^BSDXAPI(23435,33,(3 or 4),3091220.221159,30,"I see Baby foxes") 15 N BSDR16 41 S BSDR("PAT")=DFN ;DFN 17 42 S BSDR("CLN")=CLIN ;Hosp Loc IEN … … 40 65 ; = 1^message: error and reason 41 66 ; 42 N BSDXMKCK S BSDXMKCK=$$MAKECK(.BSDR) ; Check if we can make appointment43 I BSDXMKCK Q BSDXMKCK ; If we can't, quit with the reason why.44 ;45 ;Otherwise, we continue46 ;47 N BSDXFDA,BSDXIENS,BSDXMSG ; FILE/UPDATE^DIE variables48 ;49 I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)["C" D50 . ; "un-cancel" existing appt in file 251 . S BSDXIENS=BSDR("ADT")_","_BSDR("PAT")_","52 . S BSDXFDA(2.98,BSDXIENS,".01")=BSDR("CLN")53 . S BSDXFDA(2.98,BSDXIENS,"3")=""54 . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")55 . S BSDXFDA(2.98,BSDXIENS,"9.5")=956 . S BSDXFDA(2.98,BSDXIENS,"14")=""57 . S BSDXFDA(2.98,BSDXIENS,"15")=""58 . S BSDXFDA(2.98,BSDXIENS,"16")=""59 . S BSDXFDA(2.98,BSDXIENS,"17")="@" ; v 1.7; cancellation remarks were left over60 . S BSDXFDA(2.98,BSDXIENS,"19")=""61 . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT62 . D FILE^DIE("","BSDXFDA","BSDXMSG")63 Q:$D(BSDXMSG) 1_U_"Fileman edit to DPT error: Patient="_BSDR("PAT")_" Appt="_BSDR("ADT")_" Error="_BSDXMSG("DIERR",1,"TEXT",1)64 ;65 Q:$G(BSDXSIMERR2) 1_U_$NA(BSDXSIMERR2) ; Unit Test line66 ;67 E D ; File new appointment/edit existing appointment in file 268 . S BSDXIENS="?+2,"_BSDR("PAT")_","69 . S BSDXIENS(2)=BSDR("ADT")70 . S BSDXFDA(2.98,BSDXIENS,.01)=BSDR("CLN")71 . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")72 . S BSDXFDA(2.98,BSDXIENS,"9.5")=973 . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT74 . D UPDATE^DIE("","BSDXFDA","BSDXIENS","BSDXMSG")75 Q:$D(BSDXMSG) 1_U_"FileMan add to DPT error: Patient="_BSDR("PAT")_" Appt="_BSDR("ADT")_" Error="_BSDXMSG("DIERR",1,"TEXT",1)76 ;77 Q:$G(BSDXSIMERR3) 1_U_$NA(BSDXSIMERR3) ; Unit Test line78 ;79 ; add appt to file 44. This adds it to the FIRST subfile (Appointment)80 N DIC,DA,Y,X,DD,DO,DLAYGO,DINUM81 I '$D(^SC(BSDR("CLN"),"S",0)) S ^SC(BSDR("CLN"),"S",0)="^44.001DA^^"82 I '$D(^SC(BSDR("CLN"),"S",BSDR("ADT"),0)) D I Y<1 Q 1_U_"Error adding date to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")83 . S DIC="^SC("_BSDR("CLN")_",""S"",",DA(1)=BSDR("CLN"),(X,DINUM)=BSDR("ADT")84 . S DIC("P")="44.001DA",DIC(0)="L",DLAYGO=44.00185 . S Y=1 I '$D(@(DIC_X_")")) D FILE^DICN86 ;87 Q:$G(BSDXSIMERR4) 1_U_$NA(BSDXSIMERR4) ; Unit Test line88 ;89 ; add appt for file 44, second subfile (Appointment/Patient)90 ; Sep 28 2010: Changed old style API to new style API. Keep for reference //smh91 ;K DIC,DA,X,Y,DLAYGO,DD,DO,DINUM92 ;S DIC="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"93 ;S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),X=BSDR("PAT")94 ;S DIC("DR")="1///"_BSDR("LEN")_";3///"_$E($G(BSDR("OI")),1,150)_";7///`"_BSDR("USR")_";8///"_$P($$NOW^XLFDT,".")95 ;S DIC("P")="44.003PA",DIC(0)="L",DLAYGO=44.00396 ;D FILE^DICN97 ;98 N BSDXIENS S BSDXIENS="?+1,"_BSDR("ADT")_","_BSDR("CLN")_","99 N BSDXFDA100 S BSDXFDA(44.003,BSDXIENS,.01)=BSDR("PAT")101 S BSDXFDA(44.003,BSDXIENS,1)=BSDR("LEN")102 S BSDXFDA(44.003,BSDXIENS,3)=$E($G(BSDR("OI")),1,150)103 S BSDXFDA(44.003,BSDXIENS,7)=BSDR("USR")104 S BSDXFDA(44.003,BSDXIENS,8)=$P($$NOW^XLFDT,".")105 N BSDXERR106 D UPDATE^DIE("","BSDXFDA","","BSDXERR")107 ;108 I $D(BSDXERR) Q 1_U_"Error adding appt to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")_" Patient="_BSDR("PAT")_" Error: "_BSDXERR("DIERR",1,"TEXT",1)109 ;110 ;Q:$G(BSDXSIMERR5) 1_U_$NA(BSDXSIMERR5) ; Unit Test line111 S:$G(BSDXSIMERR5) X=1/0112 ;113 ; Update the Availablilities ; Doesn't fail. Global reads and sets.114 D AVUPDTMK^BSDXAPI1(BSDR("CLN"),BSDR("ADT"),BSDR("LEN"),BSDR("PAT"))115 ;116 ; call event driver117 NEW DFN,SDT,SDCL,SDDA,SDMODE118 S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2119 S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))120 D MAKE^SDAMEVT(DFN,SDT,SDCL,SDDA,SDMODE)121 Q 0122 ;123 MAKECK(BSDR) ; $$ - Is it okay to make an appointment? ; PEP124 ; Input: Same as $$MAKE125 ; Output: 1^error or 0 for success126 ; NB: This subroutine saves no data. Only checks whether it's okay.127 ;128 67 I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT")) 129 68 I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN")) … … 132 71 I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT")) 133 72 ; 134 ; Appt Length check removed in v 1.5 135 ; 73 ;I ($G(BSDR("LEN"))<5)!($G(BSDR("LEN"))>240) Q 1_U_"Appt Length error: "_$G(BSDR("LEN")) ; v 1.42 - no check on length is done anymore. see top comments for details. 136 74 I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(BSDR("USR")) 137 ; More verbose error message in v1.5 75 ;I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)'["C" Q 1_U_"Patient "_BSDR("PAT")_" already has appt at "_BSDR("ADT") ; v.1.5 more user friendly err msg 76 ; 138 77 ; Following block to give an error message to user if there is already an appointment for patient. More verbose than others. 139 78 N BSDXERR ; place to store error message … … 149 88 . . N BSDXRESNAM S BSDXRESNAM=$P(^BSDXRES(BSDXRESIEN,0),U) 150 89 . . S BSDXERR=BSDXERR_$C(13,10)_"Scheduling GUI clinic: "_BSDXRESNAM ; tell the user of the BSDX clinic 90 ; 91 NEW DIC,DA,Y,X,DD,DO,DLAYGO 92 ; 93 I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)["C" D 94 . ; "un-cancel" existing appt in file 2 95 . N BSDXFDA,BSDXIENS,BSDXMSG 96 . S BSDXIENS=BSDR("ADT")_","_BSDR("PAT")_"," 97 . S BSDXFDA(2.98,BSDXIENS,".01")=BSDR("CLN") 98 . S BSDXFDA(2.98,BSDXIENS,"3")="" 99 . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP") 100 . S BSDXFDA(2.98,BSDXIENS,"9.5")=9 101 . S BSDXFDA(2.98,BSDXIENS,"14")="" 102 . S BSDXFDA(2.98,BSDXIENS,"15")="" 103 . S BSDXFDA(2.98,BSDXIENS,"16")="" 104 . S BSDXFDA(2.98,BSDXIENS,"19")="" 105 . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT 106 . D FILE^DIE("","BSDXFDA","BSDXMSG") 107 . N BSDXTEMP S BSDXTEMP=$G(BSDXMSG) 108 E D I $G(BSDXERR(1)) Q 1_U_"FileMan add to DPT error: Patient="_BSDR("PAT")_" Appt="_BSDR("ADT") 109 . N BSDXFDA,BSDXIENS,BSDXMSG 110 . S BSDXIENS="?+2,"_BSDR("PAT")_"," 111 . S BSDXIENS(2)=BSDR("ADT") 112 . S BSDXFDA(2.98,BSDXIENS,.01)=BSDR("CLN") 113 . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP") 114 . S BSDXFDA(2.98,BSDXIENS,"9.5")=9 115 . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT 116 . D UPDATE^DIE("","BSDXFDA","BSDXIENS","BSDXERR(1)") 117 ; add appt to file 44 118 K DIC,DA,X,Y,DLAYGO,DD,DO 119 I '$D(^SC(BSDR("CLN"),"S",0)) S ^SC(BSDR("CLN"),"S",0)="^44.001DA^^" 120 I '$D(^SC(BSDR("CLN"),"S",BSDR("ADT"),0)) D I Y<1 Q 1_U_"Error adding date to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT") 121 . S DIC="^SC("_BSDR("CLN")_",""S"",",DA(1)=BSDR("CLN"),(X,DINUM)=BSDR("ADT") 122 . S DIC("P")="44.001DA",DIC(0)="L",DLAYGO=44.001 123 . S Y=1 I '$D(@(DIC_X_")")) D FILE^DICN 124 ; 125 ; Sep 28 2010: Changed old style API to new style API. Keep for reference //smh 126 ;K DIC,DA,X,Y,DLAYGO,DD,DO,DINUM 127 ;S DIC="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1," 128 ;S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),X=BSDR("PAT") 129 ;S DIC("DR")="1///"_BSDR("LEN")_";3///"_$E($G(BSDR("OI")),1,150)_";7///`"_BSDR("USR")_";8///"_$P($$NOW^XLFDT,".") 130 ;S DIC("P")="44.003PA",DIC(0)="L",DLAYGO=44.003 131 ;D FILE^DICN 132 ; 133 N BSDXIENS S BSDXIENS="?+1,"_BSDR("ADT")_","_BSDR("CLN")_"," 134 N BSDXFDA 135 S BSDXFDA(44.003,BSDXIENS,.01)=BSDR("PAT") 136 S BSDXFDA(44.003,BSDXIENS,1)=BSDR("LEN") 137 S BSDXFDA(44.003,BSDXIENS,3)=$E($G(BSDR("OI")),1,150) 138 S BSDXFDA(44.003,BSDXIENS,7)=BSDR("USR") 139 S BSDXFDA(44.003,BSDXIENS,8)=$P($$NOW^XLFDT,".") 140 N BSDXERR 141 D UPDATE^DIE("","BSDXFDA","","BSDXERR") 142 ; 143 I $D(BSDXERR) Q 1_U_"Error adding appt to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")_" Patient="_BSDR("PAT")_" Error: "_BSDXERR("DIERR",1,"TEXT",1) 144 ; 145 ; call event driver 146 NEW DFN,SDT,SDCL,SDDA,SDMODE 147 S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2 148 S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT")) 149 D MAKE^SDAMEVT(DFN,SDT,SDCL,SDDA,SDMODE) 151 150 Q 0 152 ;153 UNMAKE(BSDR) ; Reverse Make - Private $$154 ; Only used in Emergiencies where Fileman data filing fails.155 ; If previous data exists, which caused an error, it's destroyed.156 ; NB: ^DIK stops for nobody157 ; NB: If Patient Appointment previously existed as cancelled, it's removed.158 ; How can I tell if one previously existed when data is in an intermediate159 ; State? Can I restore it if the other file failed? Restoration can cause160 ; another error. If I restore the global, there will be cross-references161 ; missing (ASDCN specifically).162 ;163 ; Input: Same array as $$MAKE164 ; Output: Always 0165 NEW DIK,DA166 S DIK="^DPT("_BSDR("PAT")_",""S"","167 S DA(1)=BSDR("PAT"),DA=BSDR("ADT")168 D ^DIK169 ;170 N IEN S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))171 I 'IEN QUIT 0172 ;173 NEW DIK,DA174 S DIK="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"175 S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN176 D ^DIK177 QUIT 0178 151 ; 179 152 CHECKIN1(DFN,CLIN,APDATE) ; Simplified PEP w/ parameters for $$CHECKIN - Checking in … … 181 154 ; for appt at Dec 20, 2009 @ 10:11:59 182 155 ; S RESULT=$$CHECKIN1^BSDXAPI(23435,33,3091220.221159) 183 N BSDR184 156 S BSDR("PAT")=DFN ;DFN 185 157 S BSDR("CLN")=CLIN ;Hosp Loc IEN … … 203 175 ; = 0 means everything worked 204 176 ; = 1^message means error with reason message 205 ;206 I $G(BSDXDIE2) N X S X=1/0207 ;208 N BSDXERR S BSDXERR=$$CHECKICK(.BSDR)209 I BSDXERR Q BSDXERR210 ;211 ; find ien for appt in file 44212 NEW IEN,DIE,DA,DR213 S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))214 ;215 ; remember before status216 ; Failure analysis: Only ^TMP global is set here.217 NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL,SDMODE218 S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN219 S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL220 D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)221 ;222 ; set checkin; Old Code -- keep for ref VEN/SMH 3 Jul 2012223 ; S DIE="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"224 ; S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN225 ; S DR="309///"_BSDR("CDT")_";302///`"_BSDR("USR")_";305///"_$$NOW^XLFDT226 ; D ^DIE227 ;228 I $D(BSDXSIMERR3) Q 1_U_"Simulated Error"229 ;230 ; Failure analysis: If this fails, no other changes were made in this routine231 N BSDXIENS S BSDXIENS=IEN_","_BSDR("ADT")_","_BSDR("CLN")_","232 N BSDXFDA233 S BSDXFDA(44.003,BSDXIENS,309)=BSDR("CDT")234 S BSDXFDA(44.003,BSDXIENS,302)=BSDR("USR")235 S BSDXFDA(44.003,BSDXIENS,305)=$$NOW^XLFDT()236 N BSDXERR237 D UPDATE^DIE("","BSDXFDA","BSDXERR")238 ;239 I $D(BSDXERR) Q 1_U_"Error checking in appointment to file 44. Error: "_BSDXERR("DIERR",1,"TEXT",1)240 ;241 ; set after status242 S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))243 S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL244 D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)245 ;246 ; Point of no Return247 ; call event driver248 D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL)249 Q 0250 ;251 CHECKIC1(DFN,CLIN,APDATE) ; Simplified PEP w/ parameters for $$CHECKICK -252 ; Check-in Check253 ; Call like this for DFN 23435 checking in now at Hospital Location 33254 ; for appt at Dec 20, 2009 @ 10:11:59255 ; S RESULT=$$CHECKIC1^BSDXAPI(23435,33,3091220.221159)256 N BSDR257 S BSDR("PAT")=DFN ;DFN258 S BSDR("CLN")=CLIN ;Hosp Loc IEN259 S BSDR("ADT")=APDATE ;Appt Date260 S BSDR("CDT")=$$NOW^XLFDT ;Check-in date defaults to now261 S BSDR("USR")=DUZ ;Check-in user defaults to current262 Q $$CHECKICK(.BSDR)263 ;264 CHECKICK(BSDR) ; $$ PEP; - Is it okay to check-in patient?265 ; Input: Same as $$CHECKIN266 ; Output: 0 if okay or 1^message if error267 ;268 I $G(BSDXSIMERR2) Q 1_U_"Simulated Error"269 177 ; 270 178 I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT")) … … 277 185 ; 278 186 ; find ien for appt in file 44 279 N IEN S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT")) 187 NEW IEN,DIE,DA,DR 188 S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT")) 280 189 I 'IEN Q 1_U_"Error trying to find appointment for checkin: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT") 190 ; 191 ; remember before status 192 NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL 193 S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN 194 S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL 195 D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL) 196 ; 197 ; set checkin 198 S DIE="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1," 199 S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN 200 S DR="309///"_BSDR("CDT")_";302///`"_BSDR("USR")_";305///"_$$NOW^XLFDT 201 D ^DIE 202 ; 203 ; set after status 204 S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT")) 205 S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL 206 D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL) 207 ; 208 ; call event driver 209 D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL) 281 210 Q 0 282 211 ; … … 287 216 ; because foxes come out during bad weather. 288 217 ; S RESULT=$$CANCEL1^BSDXAPI(23435,33,"PC",3091220.221159,1,"Afraid of foxes") 289 N BSDR290 218 S BSDR("PAT")=DFN 291 219 S BSDR("CLN")=CLIN … … 316 244 ; = 1^message: error and reason 317 245 ; 318 ; Okay to Cancel? Call Cancel Check.319 N BSDXCANCK S BSDXCANCK=$$CANCELCK(.BSDR)320 I BSDXCANCK Q BSDXCANCK321 ;322 ; BSDX 1.5 3110125323 ; UJO/SMH - Add ability to remove check-in if the patient is checked in324 ; VEN/SMH on 3120625/v1.7 - PIMS doesn't care if patient is already checked in325 ; Lets you remove appointment anyways! Not like RPMS.326 ; Plus... deleting checkin affects S node on 44, which is DELETED anyways!327 ;328 ; remember before status329 NEW SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL,SDMODE330 NEW IEN S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))331 S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN332 S SDCPHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL333 D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL)334 ; NB: Here only ^TMP globals are set with before values.335 ;336 ; get user who made appt and date appt made from ^SC337 ; because data in ^SC will be deleted338 ; Appointment Length: ditto339 NEW USER,DATE340 S USER=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,6)341 S DATE=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,7)342 N BSDXLEN S BSDXLEN=$$APPLEN(DFN,SDCL,SDT) ; appt length343 ;344 ; update file 2 info --old code; keep for reference345 ;NEW DIE,DA,DR346 ;S DIE="^DPT("_DFN_",""S"",",DA(1)=DFN,DA=SDT347 ;S DR="3///"_BSDR("TYP")_";14///`"_BSDR("USR")_";15///"_BSDR("CDT")_";16///`"_BSDR("CR")_";19///`"_USER_";20///"_DATE348 ;S:$G(BSDR("NOT"))]"" DR=DR_";17///"_$E(BSDR("NOT"),1,160)349 ;D ^DIE350 N BSDXIENS S BSDXIENS=SDT_","_DFN_","351 N BSDXFDA352 S BSDXFDA(2.98,BSDXIENS,3)=BSDR("TYP")353 S BSDXFDA(2.98,BSDXIENS,14)=BSDR("USR")354 S BSDXFDA(2.98,BSDXIENS,15)=BSDR("CDT")355 S BSDXFDA(2.98,BSDXIENS,16)=BSDR("CR")356 S BSDXFDA(2.98,BSDXIENS,19)=USER357 S BSDXFDA(2.98,BSDXIENS,20)=DATE358 S:$G(BSDR("NOT"))]"" BSDXFDA(2.98,BSDXIENS,17)=$E(BSDR("NOT"),1,160)359 N BSDXERR360 D FILE^DIE("","BSDXFDA","BSDXERR")361 I $D(BSDXERR) Q 1_U_"Cannot cancel appointment in File 2"362 ; Failure point 1: If we fail here, nothing has happened yet.363 ;364 ; delete data in ^SC -- this does not (typically) fail. Fileman won't stop365 NEW DIK,DA366 S DIK="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"367 S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN368 D ^DIK369 ; Failure point 2: not expected to happen here370 ;371 ; Update PIMS availability -- this doesn't fail. Global gets/sets only.372 D AVUPDTCN^BSDXAPI1(SDCL,SDT,BSDXLEN)373 ;374 ; call event driver -- point of no return375 D CANCEL^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDMODE,SDCPHDL)376 ;377 Q 0378 ;379 CANCELCK(BSDR) ; $$ PEP; Okay to Cancel Appointment?380 ; Input: .BSDR array as documented in $$CANCEL381 ; Output: 0 or 1^Error message382 246 I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT")) 383 247 I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN")) … … 390 254 I '$D(^SD(409.2,+$G(BSDR("CR")))) Q 1_U_"Cancel Reason error: "_$G(BSDR("CR")) 391 255 ; 392 NEW IEN S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT")) 256 NEW IEN,DIE,DA,DR 257 S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT")) 393 258 I 'IEN Q 1_U_"Error trying to find appointment for cancel: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT") 394 259 ; 395 ; Check-out check. New in v1.7 396 I $$CO(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) Q 1_U_"Cannot delete. Appointment has already been checked-out!" 260 ; BSDX 1.5 3110125 261 ; UJO/SMH - Add ability to remove check-in if the patient is checked in 262 ; I $$CI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) Q 1_U_"Patient already checked in; cannot cancel until checkin deleted: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT") 263 ; Remove check-in if the patient is checked in. 264 N BSDXRESULT S BSDXRESULT=0 ; Result; should be zero if success; -1 + message if failure 265 I $$CI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) SET BSDXRESULT=$$RMCI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT")) 266 I BSDXRESULT Q BSDXRESULT 267 ; 268 ; remember before status 269 NEW SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL 270 S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN 271 S SDCPHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL 272 D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL) 273 ; 274 ; get user who made appt and date appt made from ^SC 275 ; because data in ^SC will be deleted 276 NEW USER,DATE 277 S USER=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,6) 278 S DATE=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,7) 279 ; 280 ; update file 2 info 281 NEW DIE,DA,DR 282 S DIE="^DPT("_DFN_",""S"",",DA(1)=DFN,DA=SDT 283 S DR="3///"_BSDR("TYP")_";14///`"_BSDR("USR")_";15///"_BSDR("CDT")_";16///`"_BSDR("CR")_";19///`"_USER_";20///"_DATE 284 S:$G(BSDR("NOT"))]"" DR=DR_";17///"_$E(BSDR("NOT"),1,160) 285 D ^DIE 286 ; 287 ; delete data in ^SC 288 NEW DIK,DA 289 S DIK="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1," 290 S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN 291 D ^DIK 292 ; 293 ; call event driver 294 D CANCEL^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDMODE,SDCPHDL) 397 295 Q 0 398 296 ; … … 404 302 Q $S(X:1,1:0) 405 303 ; 304 RMCI(PAT,CLINIC,DATE) ;PEP; -- Remove Check-in; $$ 305 ; PAT = DFN 306 ; CLINIC = SC IEN 307 ; DATE = FM Date/Time of Appointment 308 ; 309 ; Returns: 310 ; 0 if okay 311 ; -1 if failure 312 ; 313 ; Call like this: $$RMCI(233,33,3110102.1130) 314 ; 315 ; Move my variables into the ones used by SDAPIs (just a convenience) 316 NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL 317 S DFN=PAT,SDT=DATE,SDCL=CLINIC,SDMODE=2,SDDA=$$SCIEN(DFN,SDCL,SDT) 318 ; 319 I SDDA<1 QUIT 0 ; Appt cancelled; cancelled appts rm'ed from file 44 320 ; 321 ; remember before status 322 S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL 323 D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL) 324 ; 325 ; remove check-in using filer. 326 N BSDXIENS S BSDXIENS=SDDA_","_DATE_","_CLINIC_"," 327 S BSDXFDA(44.003,BSDXIENS,309)="@" ; CHECKED-IN 328 S BSDXFDA(44.003,BSDXIENS,302)="@" ; CHECK IN USER 329 S BSDXFDA(44.003,BSDXIENS,305)="@" ; CHECK IN ENTERED 330 N BSDXERR 331 D FILE^DIE("","BSDXFDA","BSDXERR") 332 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) 333 ; 334 ; set after status 335 S SDDA=$$SCIEN(DFN,SDCL,SDT) 336 S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL 337 D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL) 338 ; 339 ; call event driver 340 D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL) 341 QUIT 0 342 ; 343 SCIEN(PAT,CLINIC,DATE) ;PEP; returns ien for appt in ^SC 344 NEW X,IEN 345 S X=0 F S X=$O(^SC(CLINIC,"S",DATE,1,X)) Q:'X Q:$G(IEN) D 346 . Q:$P($G(^SC(CLINIC,"S",DATE,1,X,0)),U,9)["C" ;cancelled 347 . I +$G(^SC(CLINIC,"S",DATE,1,X,0))=PAT S IEN=X 348 Q $G(IEN) 349 ; 350 APPTYP(PAT,DATE) ;PEP; -- returns type of appt (scheduled or walk-in) 351 NEW X S X=$P($G(^DPT(PAT,"S",DATE,0)),U,7) 352 Q $S(X=3:"SCHED",X=4:"WALK-IN",1:"??") 353 ; 406 354 CO(PAT,CLINIC,DATE,SDIEN) ;PEP; -- returns 1 if appt already checked-out 407 355 NEW X … … 411 359 Q $S(X:1,1:0) 412 360 ; 413 SCIEN(PAT,CLINIC,DATE) ;PEP; returns ien for appt in ^SC 414 NEW X,IEN415 S X=0 F S X=$O(^SC(CLINIC,"S",DATE,1,X)) Q:'X Q:$G(IEN) D416 . Q:$P($G(^SC(CLINIC,"S",DATE,1,X,0)),U,9)["C" ;cancelled417 . I +$G(^SC(CLINIC,"S",DATE,1,X,0))=PAT S IEN=X418 Q $G(IEN)419 ; 420 APPLEN(PAT,CLINIC,DATE) ; $$ PEP; returns an appointment's length 421 ; Get either the appointment length or zero422 N SCIEN S SCIEN=$$SCIEN(PAT,CLINIC,DATE)423 Q:SCIEN $P(^SC(CLINIC,"S",DATE,1,SCIEN,0),U,2)424 Q 0425 APPTYP(PAT,DATE) ;PEP; -- returns type of appt (scheduled or walk-in) 426 NEW X S X=$P($G(^DPT(PAT,"S",DATE,0)),U,7)427 Q $S(X=3:"SCHED",X=4:"WALK-IN",1:"??")428 ;361 UPDATENOTE(PAT,CLINIC,DATE,NOTE) ; PEP; Update Note in ^SC for patient's appointment @ DATE 362 ; PAT = DFN 363 ; CLINIC = SC IEN 364 ; DATE = FM Date/Time of Appointment 365 ; 366 ; Returns: 367 ; 0 if okay 368 ; -1 if failure 369 N SCIEN S SCIEN=$$SCIEN(PAT,CLINIC,DATE) ; ien of appt in ^SC 370 I SCIEN<1 QUIT 0 ; Appt cancelled; cancelled appts rm'ed from file 44 371 N BSDXIENS S BSDXIENS=SCIEN_","_DATE_","_CLINIC_"," 372 S BSDXFDA(44.003,BSDXIENS,3)=$E(NOTE,1,150) 373 N BSDXERR 374 D FILE^DIE("","BSDXFDA","BSDXERR") 375 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) 376 QUIT 0 -
Scheduling/trunk/m/BSDXAPI1.m
r1481 r1563 1 1 BSDXAPI1 ; VEN/SMH - SCHEDULING APIs - Continued!!! ; 7/9/12 2:22pm 2 ;;1.7 T2;BSDX;;Jul 11, 2012;Build 182 ;;1.7;BSDX;;Oct 04, 2012;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDXGPRV.m
r1481 r1563 1 BSDXGPRV ; WV/SMH - WINDOWS SCHEDULING RPCS ; 7/6/12 11:07am2 ;;1. 7T2;BSDX;;Jul 11, 2012;Build 181 BSDXGPRV ; WV/SMH - WINDOWS SCHEDULING RPCS ; 4/28/11 10:31am 2 ;;1.6;BSDX;;Aug 31, 2011;Build 25 3 3 ; Licensed under LGPL 4 4 ; … … 18 18 PD(BSDXY,HLIEN) ;EP Debugging entry point 19 19 ; 20 ;D DEBUG^%Serenji("P^BSDXGPRV(.BSDXY,HLIEN)","192.168.254.130")20 D DEBUG^%Serenji("P^BSDXGPRV(.BSDXY,HLIEN)","192.168.254.130") 21 21 ; 22 22 Q … … 33 33 S BSDXI=0 34 34 I '$D(^SC(HLIEN,0)) D ERR("HOSPITAL LOCATION NOT FOUND") QUIT 35 D ^XBKVAR 35 D ^XBKVAR 36 36 N $ET S $ET="G ERROR^BSDXGPRV" 37 37 K ^BSDXTMP($J) -
Scheduling/trunk/m/BSDXUT.m
r1481 r1563 1 1 BSDXUT ; VEN/SMH - Unit Tests for Scheduling GUI ; 6/29/12 12:20pm 2 ;;1.7 T2;BSDX;;Jul 11, 2012;Build 182 ;;1.7;BSDX;;Oct 04, 2012;Build 25 3 3 ; Licensed under LGPL 4 4 ; -
Scheduling/trunk/m/BSDXUT1.m
r1481 r1563 1 1 BSDXUT1 ; VEN/SMH - Unit Tests for Scheduling GUI - cont. ; 7/9/12 12:31pm 2 ;;1.7 T2;BSDX;;Jul 11, 2012;Build 182 ;;1.7;BSDX;;Oct 04, 2012;Build 25 3 3 ; 4 4 ; -
Scheduling/trunk/m/BSDXUT2.m
r1481 r1563 1 1 BSDXUT2 ; VEN/SMH - Unit Tests for Scheduling GUI - cont. ; 7/9/12 3:18pm 2 ;;1.7 T2;BSDX;;Jul 11, 2012;Build 182 ;;1.7;BSDX;;Oct 04, 2012;Build 25 3 3 ; 4 4 EN ; Run all unit tests in this routine
Note:
See TracChangeset
for help on using the changeset viewer.