Changeset 829 for cprs/trunk/CPRS-Chart/Orders/rODMeds.pas
- Timestamp:
- Jul 7, 2010, 4:31:10 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cprs/trunk/CPRS-Chart/Orders/rODMeds.pas
r456 r829 3 3 interface 4 4 5 uses SysUtils, Classes, ORNet, ORFn, uCore, uConst; 5 uses SysUtils, Classes, ORNet, ORFn, uCore, uConst, Windows; 6 7 type 8 TAdminTimeHelpText = record 9 HelpText: string; 10 end; 11 12 TInpatientClozapineText = record 13 dispText: string; 14 end; 15 16 TDrugHasMaxData = record 17 CaptureMaxData: boolean; 18 MaxSupply: integer; 19 MaxQuantity: integer; 20 MaxRefills: integer; 21 end; 6 22 7 23 function DEACheckFailed(AnOI: Integer; ForInpatient: Boolean): Boolean; … … 17 33 procedure LoadFormularyAltDose(AList: TStringList; DispDrug, OI: Integer; ForInpatient: Boolean); 18 34 procedure LoadAdminInfo(const Schedule: string; OrdItem: Integer; var StartText: string; 19 var AdminTime: TFMDateTime; var Duration: string );35 var AdminTime: TFMDateTime; var Duration: string; Admin: string = ''); 20 36 function GetAdminTime(const StartText, Schedule: string; OrdItem: Integer): TFMDateTime; 21 37 procedure LoadSchedules(Dest: TStrings; IsInptDlg: boolean = False); 38 procedure LoadDOWSchedules(Dest: TStrings); 39 procedure LoadAllIVRoutes(Dest: TStrings); 40 procedure LoadDosageFormIVRoutes(Dest: TStrings; OrderIDs: TStringList; Default: boolean); 22 41 function QtyToDays(Quantity: Double; const UnitsPerDose, Schedule, Duration, Drug: string): Integer; 23 42 function DaysToQty(DaysSupply: Integer; const UnitsPerDose, Schedule, Duration, Drug: string): Integer; … … 32 51 function QOHasRouteDefined(AQOID: integer): boolean; 33 52 procedure CheckExistingPI(AOrderId: string; var APtI: string); 53 function PassDrugTest(OI: integer; OrderType: string; InptOrder: boolean; CheckForClozapineOnly: boolean = false): boolean; 54 function AdminTimeHelpText(): string; 55 //function ValidateDaySupplyandQuantity(DaySupply, Quantity: integer): boolean; 56 //function ValidateMaxQuantity(Quantity: integer): boolean; 57 function ValidateDrugAutoAccept(tempDrug, tempUnit, tempSch, tempDur: string; OI, tempSupply, tempQuantity, tempRefills: integer): boolean; 58 function ValidateDaySupplyandQuantityErrorMsg(DaySupply, quantity: integer): String; 59 procedure ClearMaxData; 60 function DifferentOrderLocations(ID: string; Loc: integer): boolean; 61 function IsClozapineOrder: boolean; 62 //function ValidateQuantityErrorMsg(Quantity: integer): String; 63 function GetQOOrderableItem(DialogIEN: string): integer; 64 34 65 35 66 implementation 67 var 68 uAdminTimeHelpText: TAdminTimeHelpText; 69 uDrugHasMaxData: TDrugHasMaxData; 70 uInpatientClozapineText : TInpatientClozapineText; 36 71 37 72 function DEACheckFailed(AnOI: Integer; ForInpatient: Boolean): Boolean; … … 60 95 begin 61 96 CallV('ORWUL FVSUB', [ListIEN, First+1, Last+1]); // M side not 0-based 62 if Append then Dest.AddStrings(RPCBrokerV.Results) else97 if Append then FastAddStrings(RPCBrokerV.Results, Dest) else 63 98 begin 64 99 for i := Pred(RPCBrokerV.Results.Count) downto 0 do Dest.Insert(0, RPCBrokerV.Results[i]); … … 123 158 if ForInpatient then PtType := 'I' else PtType := 'O'; 124 159 CallV('ORWDPS1 FORMALT', [AnIEN, PtType]); 125 AList.Assign(RPCBrokerV.Results);160 FastAssign(RPCBrokerV.Results, AList); 126 161 end; 127 162 … … 132 167 if ForInpatient then PtType := 'I' else PtType := 'O'; 133 168 CallV('ORWDPS1 DOSEALT', [DispDrug, OI, PtType]); 134 AList.Assign(RPCBrokerV.Results);169 FastAssign(RPCBrokerV.Results, AList); 135 170 end; 136 171 137 172 procedure LoadAdminInfo(const Schedule: string; OrdItem: Integer; var StartText: string; 138 var AdminTime: TFMDateTime; var Duration: string );173 var AdminTime: TFMDateTime; var Duration: string; Admin: string = ''); 139 174 var 140 175 x: string; 141 176 begin 142 x := sCallV('ORWDPS2 ADMIN', [Patient.DFN, Schedule, OrdItem, Encounter.Location ]);177 x := sCallV('ORWDPS2 ADMIN', [Patient.DFN, Schedule, OrdItem, Encounter.Location, Admin]); 143 178 StartText := Piece(x, U, 1); 144 179 AdminTime := MakeFMDateTime(Piece(x, U, 4)); … … 157 192 begin 158 193 // if uMedSchedules = nil then CallV('ORWDPS ALLSCHD', [nil]); uMedSchedules.Assign(...); 159 CallV('ORWDPS1 SCHALL', [ nil]);160 Dest.Assign(RPCBrokerV.Results);194 CallV('ORWDPS1 SCHALL', [patient.dfn, patient.location]); 195 FastAssign(RPCBrokerV.Results, Dest); 161 196 If (Dest.IndexOfName('OTHER') < 0) and IsInptDlg then 162 197 Dest.Add('OTHER'); 163 198 end; 164 199 200 procedure LoadAllIVRoutes(Dest: TStrings); 201 begin 202 CallV('ORWDPS32 ALLIVRTE', []); 203 FastAssign(RPCBrokerV.Results, Dest); 204 end; 205 206 procedure LoadDosageFormIVRoutes(Dest: TStrings; OrderIDs: TStringList; Default: boolean); 207 begin 208 CallV('ORWDPS33 IVDOSFRM', [OrderIDs, Default, False]); 209 FastAssign(RPCBrokerV.Results, Dest); 210 end; 211 procedure LoadDOWSchedules(Dest: TStrings); 212 begin 213 // if uMedSchedules = nil then CallV('ORWDPS ALLSCHD', [nil]); uMedSchedules.Assign(...); 214 CallV('ORWDPS1 DOWSCH', [patient.dfn, patient.location]); 215 FastAssign(RPCBrokerV.Results, Dest); 216 end; 217 165 218 function QtyToDays(Quantity: Double; const UnitsPerDose, Schedule, Duration, Drug: string): Integer; 166 219 begin … … 173 226 Result := StrToIntDef(sCallV('ORWDPS2 DAY2QTY', 174 227 [DaysSupply, UnitsPerDose, Schedule, Duration, Patient.DFN, Drug]), 0); 228 if uDrugHasMaxData.CaptureMaxData = True then uDrugHasMaxData.MaxQuantity := Result; 175 229 end; 176 230 … … 183 237 begin 184 238 Result := StrToIntDef(sCallV('ORWDPS1 DFLTSPLY', [UnitStr, SchedStr, Patient.DFN, ADrug]), 0); 239 if uDrugHasMaxData.CaptureMaxData = True then uDrugHasMaxData.MaxSupply := Result; 185 240 end; 186 241 … … 188 243 begin 189 244 Result := StrToIntDef(sCallV('ORWDPS2 MAXREF', [Patient.DFN, Drug, Days, OrdItem, Discharge]), 0); 245 if uDrugHasMaxData.CaptureMaxData = True then uDrugHasMaxData.MaxRefills := Result; 190 246 end; 191 247 … … 239 295 end; 240 296 297 function PassDrugTest(OI: integer; OrderType: string; InptOrder: boolean; CheckForClozapineOnly: boolean = false): boolean; 298 var 299 MessCap, MessText: string; 300 i: integer; 301 begin 302 result := false; 303 MessText := ''; 304 uDrugHasMaxData.CaptureMaxData := false; 305 uDrugHasMaxData.MaxSupply := 0; 306 uDrugHasMaxData.MaxQuantity := 0; 307 uDrugHasMaxData.MaxRefills := 0; 308 CallV('ORALWORD ALLWORD', [Patient.DFN, OI, OrderType, Encounter.Provider]); 309 for i := 0 to RPCBrokerV.Results.Count -1 do 310 begin 311 if i = 0 then 312 begin 313 MessCap := Piece(RPCBrokerV.Results.strings[i],U,1); 314 if Piece(RPCBrokerV.Results.strings[i],U,2) = '1' then uDrugHasMaxData.CaptureMaxData := True; 315 end; 316 if i >0 then MessText := MessText + RPCBrokerV.Results.Strings[i] + CRLF; 317 end; 318 if CheckForClozapineOnly = True then 319 begin 320 Result := uDrugHasMaxData.CaptureMaxData = True; 321 Exit; 322 end; 323 if (MessText = '') and (MessCap = '') then 324 begin 325 Result := True; 326 if (InptOrder = true) and (uDrugHasMaxData.CaptureMaxData = true) then 327 begin 328 uDrugHasMaxData.CaptureMaxData := false; 329 if uInpatientClozapineText.dispText = '' then 330 begin 331 CallV('ORDDPAPI CLOZMSG', []); 332 for i := 0 to RPCBrokerV.Results.Count -1 do 333 if i = 0 then uInpatientClozapineText.dispText := RPCBrokerV.Results.Strings[i] 334 else uInpatientClozapineText.dispText := uInpatientClozapineText.dispText + CRLF + RPCBrokerV.Results.Strings[i]; 335 end; 336 if uInpatientClozapineText.dispText <> '' then infoBox(uInpatientClozapineText.dispText, 'Inpatient Drug Warning', MB_OK); 337 end; 338 exit; 339 end; 340 infoBox(MessText, MessCap,MB_OK); 341 end; 342 343 function AdminTimeHelpText(): string; 344 var 345 i: integer; 346 begin 347 if uAdminTimeHelpText.HelpText = '' then 348 begin 349 CallV('ORDDPAPI ADMTIME',[]); 350 for I := 0 to RPCBrokerV.Results.Count - 1 do 351 if I = 0 then uAdminTimeHelpText.HelpText := RPCBrokerV.Results.Strings[i] 352 else uAdminTimeHelpText.HelpText := uAdminTimeHelpText.HelpText + CRLF +RPCBrokerV.Results.Strings[i]; 353 end; 354 Result := uAdminTimeHelpText.helpText 355 end; 356 357 function ValidateDrugAutoAccept(tempDrug, tempUnit, tempSch, tempDur: string; OI, tempSupply, tempQuantity, tempRefills: integer): boolean; 358 var 359 daySupply, Quantity, Refills: integer; 360 begin 361 Result := True; 362 if uDrugHasMaxData.CaptureMaxData = false then exit; 363 daySupply := DefaultDays(tempDrug, tempUnit, tempSch); 364 if (tempSupply > daySupply) and (uDrugHasMaxData.MaxSupply > 0) then 365 begin 366 infoBox('For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxSupply), 'Cannot Save Error', MB_OK); 367 Result := false; 368 uDrugHasMaxData.CaptureMaxData := false; 369 Exit; 370 end; 371 Quantity := DaysToQty(daySupply, tempUnit, tempSch, tempDur, tempDrug); 372 if (tempQuantity > Quantity) and (uDrugHasMaxData.MaxQuantity > 0) then 373 begin 374 infoBox('For this medication Quantity cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity), 'Cannot Save Error', MB_OK); 375 Result := false; 376 uDrugHasMaxData.CaptureMaxData := false; 377 Exit; 378 end; 379 Refills := CalcMaxRefills(tempDrug, daySupply, OI, false); 380 if tempRefills > Refills then 381 begin 382 infoBox('For this medication Quantity cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxRefills), 'Cannot Save Error', MB_OK); 383 Result := false; 384 uDrugHasMaxData.CaptureMaxData := false; 385 Exit; 386 end; 387 end; 388 389 function ValidateDaySupplyandQuantity(DaySupply, Quantity: integer): boolean; 390 var 391 str: string; 392 begin 393 Result := True; 394 str := ''; 395 if uDrugHasMaxData.CaptureMaxData = false then exit; 396 if (daySupply > uDrugHasMaxData.MaxSupply) and (uDrugHasMaxData.MaxSupply > 0) then 397 begin 398 str := 'For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxSupply); 399 Result := false; 400 end; 401 if (Quantity > uDrugHasMaxData.MaxQuantity) and (uDrugHasMaxData.MaxQuantity > 0) then 402 begin 403 if str <> '' then str := str + CRLF + 'For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity) 404 else str := 'For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity); 405 result := false; 406 end; 407 if str <> '' then infoBox(str, 'Cannot Save Error', MB_OK); 408 //uDrugHasMaxData.CaptureMaxData := false; 409 end; 410 411 function ValidateMaxQuantity(Quantity: integer): boolean; 412 begin 413 Result := True; 414 if uDrugHasMaxData.CaptureMaxData = false then exit; 415 if uDrugHasMaxData.MaxQuantity = 0 then exit; 416 if Quantity > uDrugHasMaxData.MaxQuantity then 417 begin 418 infoBox('For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity), 'Cannot Save Error', MB_OK); 419 Result := false; 420 end; 421 end; 422 423 function ValidateDaySupplyandQuantityErrorMsg(DaySupply, quantity: integer): String; 424 begin 425 Result := ''; 426 if uDrugHasMaxData.CaptureMaxData = false then exit; 427 if (daySupply > uDrugHasMaxData.MaxSupply) and (uDrugHasMaxData.MaxSupply > 0) then 428 begin 429 Result := 'For this medication Day Supply cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxSupply); 430 end; 431 if (Quantity > uDrugHasMaxData.MaxQuantity) and (uDrugHasMaxData.MaxQuantity > 0) then 432 begin 433 if Result <> '' then Result := Result + CRLF + 'For this medication Quantity cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity) 434 else Result := 'For this medication Quantity cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity); 435 end; 436 //uDrugHasMaxData.CaptureMaxData := false; 437 end; 438 439 function ValidateQuantityErrorMsg(Quantity: integer): String; 440 begin 441 Result := ''; 442 if uDrugHasMaxData.CaptureMaxData = false then exit; 443 if uDrugHasMaxData.MaxQuantity = 0 then exit; 444 if Quantity > uDrugHasMaxData.MaxQuantity then 445 begin 446 Result := 'For this medication Quantity cannot be greater then ' + InttoStr(uDrugHasMaxData.MaxQuantity); 447 end; 448 end; 449 450 procedure ClearMaxData; 451 begin 452 uDrugHasMaxData.CaptureMaxData := false; 453 end; 454 455 function DifferentOrderLocations(ID: string; Loc: integer): boolean; 456 begin 457 Result := (sCallV('ORWDPS33 COMPLOC', [ID, Loc])='1'); 458 end; 459 460 function IsClozapineOrder: boolean; 461 begin 462 if uDrugHasMaxData.CaptureMaxData = true then result := true 463 else result := false; 464 end; 465 466 function GetQOOrderableItem(DialogIEN: string): integer; 467 begin 468 Result := StrtoInt(SCallV('ORWDPS1 QOMEDALT',[DialogIEN])) 469 end; 470 241 471 end.
Note:
See TracChangeset
for help on using the changeset viewer.