Ignore:
Timestamp:
Jul 7, 2010, 4:31:10 PM (14 years ago)
Author:
Kevin Toppenberg
Message:

Upgrade to version 27

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cprs/trunk/CPRS-Chart/Orders/rODMeds.pas

    r456 r829  
    33interface
    44
    5 uses SysUtils, Classes, ORNet, ORFn, uCore, uConst;
     5uses SysUtils, Classes, ORNet, ORFn, uCore, uConst, Windows;
     6
     7type
     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;
    622
    723function DEACheckFailed(AnOI: Integer; ForInpatient: Boolean): Boolean;
     
    1733procedure LoadFormularyAltDose(AList: TStringList; DispDrug, OI: Integer; ForInpatient: Boolean);
    1834procedure 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 = '');
    2036function GetAdminTime(const StartText, Schedule: string; OrdItem: Integer): TFMDateTime;
    2137procedure LoadSchedules(Dest: TStrings; IsInptDlg: boolean = False);
     38procedure LoadDOWSchedules(Dest: TStrings);
     39procedure LoadAllIVRoutes(Dest: TStrings);
     40procedure LoadDosageFormIVRoutes(Dest: TStrings; OrderIDs: TStringList; Default: boolean);
    2241function QtyToDays(Quantity: Double;   const UnitsPerDose, Schedule, Duration, Drug: string): Integer;
    2342function DaysToQty(DaysSupply: Integer; const UnitsPerDose, Schedule, Duration, Drug: string): Integer;
     
    3251function QOHasRouteDefined(AQOID: integer): boolean;
    3352procedure CheckExistingPI(AOrderId: string; var APtI: string);
     53function PassDrugTest(OI: integer; OrderType: string; InptOrder: boolean; CheckForClozapineOnly: boolean = false): boolean;
     54function AdminTimeHelpText(): string;
     55//function ValidateDaySupplyandQuantity(DaySupply, Quantity: integer): boolean;
     56//function ValidateMaxQuantity(Quantity: integer): boolean;
     57function ValidateDrugAutoAccept(tempDrug, tempUnit, tempSch, tempDur: string; OI, tempSupply, tempQuantity, tempRefills: integer): boolean;
     58function ValidateDaySupplyandQuantityErrorMsg(DaySupply, quantity: integer): String;
     59procedure ClearMaxData;
     60function DifferentOrderLocations(ID: string; Loc: integer): boolean;
     61function IsClozapineOrder: boolean;
     62//function ValidateQuantityErrorMsg(Quantity: integer): String;
     63function GetQOOrderableItem(DialogIEN: string): integer;
     64
    3465
    3566implementation
     67 var
     68  uAdminTimeHelpText: TAdminTimeHelpText;
     69  uDrugHasMaxData: TDrugHasMaxData;
     70  uInpatientClozapineText : TInpatientClozapineText;
    3671
    3772function DEACheckFailed(AnOI: Integer; ForInpatient: Boolean): Boolean;
     
    6095begin
    6196  CallV('ORWUL FVSUB', [ListIEN, First+1, Last+1]);  // M side not 0-based
    62   if Append then Dest.AddStrings(RPCBrokerV.Results) else
     97  if Append then FastAddStrings(RPCBrokerV.Results, Dest) else
    6398  begin
    6499    for i := Pred(RPCBrokerV.Results.Count) downto 0 do Dest.Insert(0, RPCBrokerV.Results[i]);
     
    123158  if ForInpatient then PtType := 'I' else PtType := 'O';
    124159  CallV('ORWDPS1 FORMALT', [AnIEN, PtType]);
    125   AList.Assign(RPCBrokerV.Results);
     160  FastAssign(RPCBrokerV.Results, AList);
    126161end;
    127162
     
    132167  if ForInpatient then PtType := 'I' else PtType := 'O';
    133168  CallV('ORWDPS1 DOSEALT', [DispDrug, OI, PtType]);
    134   AList.Assign(RPCBrokerV.Results);
     169  FastAssign(RPCBrokerV.Results, AList);
    135170end;
    136171
    137172procedure 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 = '');
    139174var
    140175  x: string;
    141176begin
    142   x := sCallV('ORWDPS2 ADMIN', [Patient.DFN, Schedule, OrdItem, Encounter.Location]);
     177  x := sCallV('ORWDPS2 ADMIN', [Patient.DFN, Schedule, OrdItem, Encounter.Location, Admin]);
    143178  StartText := Piece(x, U, 1);
    144179  AdminTime := MakeFMDateTime(Piece(x, U, 4));
     
    157192begin
    158193  // 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);
    161196  If (Dest.IndexOfName('OTHER') < 0) and IsInptDlg then
    162197    Dest.Add('OTHER');
    163198end;
    164199
     200procedure LoadAllIVRoutes(Dest: TStrings);
     201begin
     202  CallV('ORWDPS32 ALLIVRTE', []);
     203  FastAssign(RPCBrokerV.Results, Dest);
     204end;
     205
     206procedure LoadDosageFormIVRoutes(Dest: TStrings; OrderIDs: TStringList; Default: boolean);
     207begin
     208  CallV('ORWDPS33 IVDOSFRM', [OrderIDs, Default, False]);
     209  FastAssign(RPCBrokerV.Results, Dest);
     210end;
     211procedure LoadDOWSchedules(Dest: TStrings);
     212begin
     213  // if uMedSchedules = nil then CallV('ORWDPS ALLSCHD', [nil]); uMedSchedules.Assign(...);
     214  CallV('ORWDPS1 DOWSCH', [patient.dfn, patient.location]);
     215  FastAssign(RPCBrokerV.Results, Dest);
     216end;
     217
    165218function QtyToDays(Quantity: Double;   const UnitsPerDose, Schedule, Duration, Drug: string): Integer;
    166219begin
     
    173226  Result := StrToIntDef(sCallV('ORWDPS2 DAY2QTY',
    174227    [DaysSupply, UnitsPerDose, Schedule, Duration, Patient.DFN, Drug]), 0);
     228  if uDrugHasMaxData.CaptureMaxData = True then uDrugHasMaxData.MaxQuantity := Result;
    175229end;
    176230
     
    183237begin
    184238  Result := StrToIntDef(sCallV('ORWDPS1 DFLTSPLY', [UnitStr, SchedStr, Patient.DFN, ADrug]), 0);
     239  if uDrugHasMaxData.CaptureMaxData = True then uDrugHasMaxData.MaxSupply := Result;
    185240end;
    186241
     
    188243begin
    189244  Result := StrToIntDef(sCallV('ORWDPS2 MAXREF', [Patient.DFN, Drug, Days, OrdItem, Discharge]), 0);
     245  if uDrugHasMaxData.CaptureMaxData = True then uDrugHasMaxData.MaxRefills := Result;
    190246end;
    191247
     
    239295end;
    240296
     297function PassDrugTest(OI: integer; OrderType: string; InptOrder: boolean; CheckForClozapineOnly: boolean = false): boolean;
     298var
     299MessCap, MessText: string;
     300i: integer;
     301begin
     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);
     341end;
     342
     343function AdminTimeHelpText(): string;
     344var
     345i: integer;
     346begin
     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
     355end;
     356
     357function ValidateDrugAutoAccept(tempDrug, tempUnit, tempSch, tempDur: string; OI, tempSupply, tempQuantity, tempRefills: integer): boolean;
     358var
     359daySupply, Quantity, Refills: integer;
     360begin
     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;
     387end;
     388
     389function ValidateDaySupplyandQuantity(DaySupply, Quantity: integer): boolean;
     390var
     391str: string;
     392begin
     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;
     409end;
     410
     411function ValidateMaxQuantity(Quantity: integer): boolean;
     412begin
     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;
     421end;
     422
     423function ValidateDaySupplyandQuantityErrorMsg(DaySupply, quantity: integer): String;
     424begin
     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;
     437end;
     438
     439function ValidateQuantityErrorMsg(Quantity: integer): String;
     440begin
     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;
     448end;
     449
     450procedure ClearMaxData;
     451begin
     452  uDrugHasMaxData.CaptureMaxData := false;
     453end;
     454
     455function DifferentOrderLocations(ID: string; Loc: integer): boolean;
     456begin
     457   Result := (sCallV('ORWDPS33 COMPLOC', [ID, Loc])='1');
     458end;
     459
     460function IsClozapineOrder: boolean;
     461begin
     462   if uDrugHasMaxData.CaptureMaxData = true then result := true
     463   else result := false;
     464end;
     465
     466function GetQOOrderableItem(DialogIEN: string): integer;
     467begin
     468  Result := StrtoInt(SCallV('ORWDPS1 QOMEDALT',[DialogIEN]))
     469end;
     470
    241471end.
Note: See TracChangeset for help on using the changeset viewer.