| 1 | unit fMedCopy;
 | 
|---|
| 2 | 
 | 
|---|
| 3 | interface
 | 
|---|
| 4 | 
 | 
|---|
| 5 | uses
 | 
|---|
| 6 |   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 | 
|---|
| 7 |   StdCtrls, ORDtTm, ORCtrls, ORFn, rOrders, uCore, rCore, mEvntDelay, fAutoSz,
 | 
|---|
| 8 |   ExtCtrls, UConst;
 | 
|---|
| 9 | 
 | 
|---|
| 10 | type
 | 
|---|
| 11 |   TfrmMedCopy = class(TForm)
 | 
|---|
| 12 |     Panel1: TPanel;
 | 
|---|
| 13 |     lblPtInfo: TLabel;
 | 
|---|
| 14 |     Panel2: TPanel;
 | 
|---|
| 15 |     lblInstruction: TStaticText;
 | 
|---|
| 16 |     Image1: TImage;
 | 
|---|
| 17 |     Label1: TStaticText;
 | 
|---|
| 18 |     Panel3: TPanel;
 | 
|---|
| 19 |     GroupBox2: TGroupBox;
 | 
|---|
| 20 |     radDelayed: TRadioButton;
 | 
|---|
| 21 |     radRelease: TRadioButton;
 | 
|---|
| 22 |     cmdOK: TButton;
 | 
|---|
| 23 |     cmdCancel: TButton;
 | 
|---|
| 24 |     Panel4: TPanel;
 | 
|---|
| 25 |     fraEvntDelayList: TfraEvntDelayList;
 | 
|---|
| 26 |     procedure cmdOKClick(Sender: TObject);
 | 
|---|
| 27 |     procedure cmdCancelClick(Sender: TObject);                         
 | 
|---|
| 28 |     procedure FormCreate(Sender: TObject);
 | 
|---|
| 29 |     procedure radDelayedClick(Sender: TObject);
 | 
|---|
| 30 |     procedure radReleaseClick(Sender: TObject);
 | 
|---|
| 31 |     procedure fraEvntDelayListcboEvntListChange(Sender: TObject);
 | 
|---|
| 32 |     procedure UMStillDelay(var message: TMessage); message UM_STILLDELAY;
 | 
|---|
| 33 |     procedure fraEvntDelayListmlstEventsDblClick(Sender: TObject);
 | 
|---|
| 34 |     procedure fraEvntDelayListmlstEventsChange(Sender: TObject);
 | 
|---|
| 35 |     procedure FormKeyDown(Sender: TObject; var Key: Word;
 | 
|---|
| 36 |       Shift: TShiftState);
 | 
|---|
| 37 | 
 | 
|---|
| 38 |   private
 | 
|---|
| 39 |     FDelayEvent: TOrderDelayEvent;
 | 
|---|
| 40 |     FOKPressed: Boolean;
 | 
|---|
| 41 |   public
 | 
|---|
| 42 |     { Public declarations }
 | 
|---|
| 43 |   end;
 | 
|---|
| 44 | 
 | 
|---|
| 45 | function SetDelayEventForMed(const RadCap: string; var ADelayEvent: TOrderDelayEvent;
 | 
|---|
| 46 |           var IsNewEvent: Boolean; LimitEvent: Char): Boolean;
 | 
|---|
| 47 | var
 | 
|---|
| 48 |    frmMedCopy: TfrmMedCopy;
 | 
|---|
| 49 | 
 | 
|---|
| 50 | implementation
 | 
|---|
| 51 | {$R *.DFM}
 | 
|---|
| 52 | 
 | 
|---|
| 53 | uses  fODBase, fOrdersTS, fOrders;
 | 
|---|
| 54 | 
 | 
|---|
| 55 | const
 | 
|---|
| 56 |   TX_SEL_DATE = 'An effective date (approximate) must be selected for discharge orders.';
 | 
|---|
| 57 |   TC_SEL_DATE = 'Missing Effective Date';
 | 
|---|
| 58 | 
 | 
|---|
| 59 | function SetDelayEventForMed(const RadCap: string; var ADelayEvent: TOrderDelayEvent;
 | 
|---|
| 60 |           var IsNewEvent: Boolean; LimitEvent: Char): Boolean;
 | 
|---|
| 61 | const
 | 
|---|
| 62 |   TX_RELEASE1  = 'Release ';
 | 
|---|
| 63 |   TX_RELEASE2  = ' orders immediately';
 | 
|---|
| 64 |   TX_DELAYED1  = 'Delay release of ';
 | 
|---|
| 65 |   TX_DELAYED2  = ' orders until';
 | 
|---|
| 66 | var
 | 
|---|
| 67 |   EvtInfo,PtEvtID,AnEvtDlg: string;
 | 
|---|
| 68 |   SpeCap, CurrTS: string;
 | 
|---|
| 69 | 
 | 
|---|
| 70 |   procedure Highlight(APtEvtID: string);
 | 
|---|
| 71 |   var
 | 
|---|
| 72 |     j: integer;
 | 
|---|
| 73 |   begin
 | 
|---|
| 74 |     frmOrders.InitOrderSheetsForEvtDelay;
 | 
|---|
| 75 |     for j := 0 to frmOrders.lstSheets.Items.Count - 1 do
 | 
|---|
| 76 |     begin
 | 
|---|
| 77 |       if Piece(frmOrders.lstSheets.Items[j],'^',1)=APtEvtID then
 | 
|---|
| 78 |       begin
 | 
|---|
| 79 |         frmOrders.lstSheets.ItemIndex := j;
 | 
|---|
| 80 |         break;
 | 
|---|
| 81 |       end;
 | 
|---|
| 82 |     end;
 | 
|---|
| 83 |   end;
 | 
|---|
| 84 | 
 | 
|---|
| 85 |   function DisplayEvntDialog(AEvtDlg: String; AnEvent: TOrderDelayEvent): boolean;
 | 
|---|
| 86 |   var
 | 
|---|
| 87 |     DlgData: string;
 | 
|---|
| 88 |   begin
 | 
|---|
| 89 |     DlgData := GetDlgData(AEvtDlg);
 | 
|---|
| 90 |     frmOrders.NeedShowModal := True;
 | 
|---|
| 91 |     frmOrders.IsDefaultDlg := True;
 | 
|---|
| 92 |     Result := frmOrders.PlaceOrderForDefaultDialog(DlgData, True, AnEvent);
 | 
|---|
| 93 |     frmOrders.IsDefaultDlg := False;
 | 
|---|
| 94 |     frmOrders.NeedShowModal := False;
 | 
|---|
| 95 |   end;
 | 
|---|
| 96 | 
 | 
|---|
| 97 | begin
 | 
|---|
| 98 |   if LimitEvent = 'C' then
 | 
|---|
| 99 |   begin
 | 
|---|
| 100 |     Result := True;
 | 
|---|
| 101 |     ADelayEvent.EventType := 'C';
 | 
|---|
| 102 |     ADelayEvent.Specialty := 0;
 | 
|---|
| 103 |     ADelayEvent.Effective := 0;
 | 
|---|
| 104 |     Exit;
 | 
|---|
| 105 |   end;
 | 
|---|
| 106 |   Result := False;
 | 
|---|
| 107 |   frmMedCopy := TfrmMedCopy.Create(Application);
 | 
|---|
| 108 |   try
 | 
|---|
| 109 |     if (LimitEvent = 'A') and (not Patient.Inpatient) then
 | 
|---|
| 110 |     begin
 | 
|---|
| 111 |       frmMedCopy.radDelayed.Checked := True;
 | 
|---|
| 112 |       frmMedCopy.radRelease.Enabled := False;
 | 
|---|
| 113 |     end;
 | 
|---|
| 114 |     ResizeAnchoredFormToFont(frmMedCopy);
 | 
|---|
| 115 |     CurrTS := Piece(GetCurrentSpec(Patient.DFN),'^',1);
 | 
|---|
| 116 |     if Length(CurrTS)>0 then
 | 
|---|
| 117 |       SpeCap := #13 + '  The current treating specialty is ' + CurrTS
 | 
|---|
| 118 |     else
 | 
|---|
| 119 |       SpeCap := #13 + '  No treating specialty is available.';
 | 
|---|
| 120 |     if Patient.Inpatient then
 | 
|---|
| 121 |       frmMedCopy.lblPtInfo.Caption := '   ' + Patient.Name + ' is currently admitted to ' + Encounter.LocationName + SpeCap
 | 
|---|
| 122 |     else
 | 
|---|
| 123 |     begin
 | 
|---|
| 124 |       if (Encounter.Location > 0) then
 | 
|---|
| 125 |         frmMedCopy.lblPtInfo.Caption := Patient.Name + ' is currently at ' + Encounter.LocationName + SpeCap
 | 
|---|
| 126 |       else
 | 
|---|
| 127 |         frmMedCopy.lblPtInfo.Caption := Patient.Name + ' currently is an outpatient.' + SpeCap;
 | 
|---|
| 128 |     end;
 | 
|---|
| 129 |     frmMedCopy.fraEvntDelayList.EvntLimit := LimitEvent;
 | 
|---|
| 130 |     if Pos('transfer',RadCap)>0 then
 | 
|---|
| 131 |       frmMedCopy.Caption := 'Transfer Medication Orders';
 | 
|---|
| 132 |     frmMedCopy.radRelease.Caption := TX_RELEASE1 + RadCap + TX_RELEASE2;
 | 
|---|
| 133 |     frmMedCopy.radDelayed.Caption := TX_DELAYED1 + RadCap + TX_DELAYED2;
 | 
|---|
| 134 |     if LimitEvent='D' then
 | 
|---|
| 135 |     begin
 | 
|---|
| 136 |       frmMedCopy.Panel2.Visible := False;
 | 
|---|
| 137 |       frmMedCopy.Height := frmMedCopy.Panel1.Height + frmMedCopy.GroupBox2.Height;
 | 
|---|
| 138 |     end;
 | 
|---|
| 139 |     frmMedCopy.ShowModal;
 | 
|---|
| 140 |     if (frmMedCopy.FOKPressed) and (frmMedCopy.radRelease.Checked) then
 | 
|---|
| 141 |     begin
 | 
|---|
| 142 |       if (frmMedCopy.radRelease.Checked) and (LimitEvent = 'D') then
 | 
|---|
| 143 |         XfInToOutNow := True
 | 
|---|
| 144 |       else XfInToOutNow := False;
 | 
|---|
| 145 |       ADelayEvent := frmMedCopy.FDelayEvent;
 | 
|---|
| 146 |       Result := True;
 | 
|---|
| 147 |     end
 | 
|---|
| 148 |     else if (frmMedCopy.FOKPressed) and (frmMedCopy.radDelayed.Checked) then
 | 
|---|
| 149 |     begin
 | 
|---|
| 150 |       EvtInfo := frmMedCopy.fraEvntDelayList.mlstEvents.Items[frmMedCopy.fraEvntDelayList.mlstEvents.ItemIndex];
 | 
|---|
| 151 |       ADelayEvent.EventType := CharAt(Piece(EvtInfo,'^',3),1);
 | 
|---|
| 152 |       ADelayEvent.EventIFN  := StrToInt64Def(Piece(EvtInfo,'^',1),0);
 | 
|---|
| 153 |       if StrToInt64Def(Piece(EvtInfo,'^',13),0) > 0 then
 | 
|---|
| 154 |       begin
 | 
|---|
| 155 |         ADelayEvent.TheParent.Assign(Piece(EvtInfo,'^',13));
 | 
|---|
| 156 |         ADelayEvent.EventType := ADelayEvent.TheParent.ParentType;
 | 
|---|
| 157 |       end;
 | 
|---|
| 158 |       ADelayEvent.EventName := frmMedCopy.fraEvntDelayList.mlstEvents.DisplayText[frmMedCopy.fraEvntDelayList.mlstEvents.ItemIndex];
 | 
|---|
| 159 |       ADelayEvent.Specialty := 0;
 | 
|---|
| 160 |       if frmMedCopy.fraEvntDelayList.orDateBox.Visible then
 | 
|---|
| 161 |         ADelayEvent.Effective := frmMedCopy.fraEvntDelayList.orDateBox.FMDateTime
 | 
|---|
| 162 |       else
 | 
|---|
| 163 |         ADelayEvent.Effective := 0;
 | 
|---|
| 164 |       IsNewEvent := False;
 | 
|---|
| 165 |       if TypeOfExistedEvent(Patient.DFN,ADelayEvent.EventIFN) = 0 then
 | 
|---|
| 166 |       begin
 | 
|---|
| 167 |          IsNewEvent := True;
 | 
|---|
| 168 |          if ADelayEvent.TheParent.ParentIFN > 0 then
 | 
|---|
| 169 |          begin
 | 
|---|
| 170 |            if StrToIntDef(ADelayEvent.TheParent.ParentDlg,0)>0 then
 | 
|---|
| 171 |              AnEvtDlg := ADelayEvent.TheParent.ParentDlg;
 | 
|---|
| 172 |          end
 | 
|---|
| 173 |          else
 | 
|---|
| 174 |            AnEvtDlg := Piece(EvtInfo,'^',5);
 | 
|---|
| 175 |       end;
 | 
|---|
| 176 |       if (StrToIntDef(AnEvtDlg,0)>0) and (IsNewEvent) then
 | 
|---|
| 177 |          if not DisplayEvntDialog(AnEvtDlg, ADelayEvent) then
 | 
|---|
| 178 |          begin
 | 
|---|
| 179 |            frmOrders.lstSheets.ItemIndex := 0;
 | 
|---|
| 180 |            frmOrders.lstSheetsClick(nil);
 | 
|---|
| 181 |            Result := False;
 | 
|---|
| 182 |            Exit;
 | 
|---|
| 183 |          end;
 | 
|---|
| 184 |       if not isExistedEvent(Patient.DFN, IntToStr(ADelayEvent.EventIFN), PtEvtID) then
 | 
|---|
| 185 |       begin
 | 
|---|
| 186 |         IsNewEvent := True;
 | 
|---|
| 187 |         if (ADelayEvent.TheParent.ParentIFN > 0) and (TypeOfExistedEvent(Patient.DFN,ADelayEvent.EventIFN) = 0 ) then
 | 
|---|
| 188 |           SaveEvtForOrder(Patient.DFN,ADelayEvent.TheParent.ParentIFN,'');
 | 
|---|
| 189 |         SaveEvtForOrder(Patient.DFN,ADelayEvent.EventIFN,'');
 | 
|---|
| 190 |         if isExistedEvent(Patient.DFN, IntToStr(ADelayEvent.EventIFN),PtEvtID) then
 | 
|---|
| 191 |         begin
 | 
|---|
| 192 |           Highlight(PtEvtID);
 | 
|---|
| 193 |           ADelayEvent.IsNewEvent := False;
 | 
|---|
| 194 |           ADelayEvent.PtEventIFN := StrToIntDef(PtEvtID,0);
 | 
|---|
| 195 |         end;
 | 
|---|
| 196 |       end else
 | 
|---|
| 197 |       begin
 | 
|---|
| 198 |         Highlight(PtEvtID);
 | 
|---|
| 199 |         ADelayEvent.PtEventIFN := StrToIntDef(PtEvtID,0);
 | 
|---|
| 200 |         ADelayEvent.IsNewEvent := False;
 | 
|---|
| 201 |       end;
 | 
|---|
| 202 | 
 | 
|---|
| 203 |       if frmOrders.lstSheets.ItemIndex > -1 then
 | 
|---|
| 204 |       begin
 | 
|---|
| 205 |         frmOrders.AskForCancel := False;
 | 
|---|
| 206 |         frmOrders.lstSheetsClick(nil);
 | 
|---|
| 207 |         frmOrders.AskForCancel := True;
 | 
|---|
| 208 |       end;
 | 
|---|
| 209 |       Result := True;
 | 
|---|
| 210 |     end;
 | 
|---|
| 211 |   finally
 | 
|---|
| 212 |     frmMedCopy.fraEvntDelayList.ResetProperty;
 | 
|---|
| 213 |     frmMedCopy.Release;
 | 
|---|
| 214 |   end;
 | 
|---|
| 215 | end;
 | 
|---|
| 216 | 
 | 
|---|
| 217 | procedure TfrmMedCopy.FormCreate(Sender: TObject);
 | 
|---|
| 218 | begin
 | 
|---|
| 219 |   inherited;
 | 
|---|
| 220 |   FOKPressed            := False;
 | 
|---|
| 221 |   FDelayEvent.EventType := #0;
 | 
|---|
| 222 |   FDelayEvent.EventIFN  := 0;
 | 
|---|
| 223 |   radRelease.Checked := True;
 | 
|---|
| 224 |   if not Patient.Inpatient then
 | 
|---|
| 225 |     panel2.Visible := False;
 | 
|---|
| 226 |   if not radDelayed.Checked then
 | 
|---|
| 227 |   begin
 | 
|---|
| 228 |     if not panel2.Visible then
 | 
|---|
| 229 |       Height := Height - fraEvntDelayList.Height - panel2.Height
 | 
|---|
| 230 |     else
 | 
|---|
| 231 |       Height := Height - fraEvntDelayList.Height;
 | 
|---|
| 232 |   end;
 | 
|---|
| 233 | end;
 | 
|---|
| 234 | 
 | 
|---|
| 235 | procedure TfrmMedCopy.cmdOKClick(Sender: TObject);
 | 
|---|
| 236 | var
 | 
|---|
| 237 |   today : TFMDateTime;
 | 
|---|
| 238 | begin
 | 
|---|
| 239 |   inherited;
 | 
|---|
| 240 |   today := FMToday;
 | 
|---|
| 241 |   if (radDelayed.Checked) and (fraEvntDelayList.mlstEvents.ItemIndex < 0) then
 | 
|---|
| 242 |   begin
 | 
|---|
| 243 |     InfoBox('A release event must be selected.', 'No Selection Made', MB_OK);
 | 
|---|
| 244 |     Exit;
 | 
|---|
| 245 |   end;
 | 
|---|
| 246 |   if (radRelease.Checked) and (Pos('copied',radRelease.Caption)>0)  then
 | 
|---|
| 247 |   begin
 | 
|---|
| 248 |     ImmdCopyAct := True;
 | 
|---|
| 249 |     FDelayEvent.EventType := 'C';
 | 
|---|
| 250 |     FDelayEvent.Specialty := 0;
 | 
|---|
| 251 |     FDelayEvent.Effective := 0;
 | 
|---|
| 252 |   end
 | 
|---|
| 253 |   else if (radRelease.Checked) and (Pos('transfer',radRelease.Caption)>0) then
 | 
|---|
| 254 |   begin
 | 
|---|
| 255 |     FDelayEvent.EventType := 'D';
 | 
|---|
| 256 |     FDelayEvent.Specialty := 0;
 | 
|---|
| 257 |     FDelayEvent.Effective := today;
 | 
|---|
| 258 |   end;
 | 
|---|
| 259 |   FOKPressed := True;
 | 
|---|
| 260 |   Close;
 | 
|---|
| 261 | end;
 | 
|---|
| 262 | 
 | 
|---|
| 263 | procedure TfrmMedCopy.cmdCancelClick(Sender: TObject);
 | 
|---|
| 264 | begin
 | 
|---|
| 265 |   inherited;
 | 
|---|
| 266 |   Close;
 | 
|---|
| 267 | end;
 | 
|---|
| 268 | 
 | 
|---|
| 269 | procedure TfrmMedCopy.radDelayedClick(Sender: TObject);
 | 
|---|
| 270 | const
 | 
|---|
| 271 |   WarningMSG = 'If you''re writing medication orders to transfer these from Inpatient' +
 | 
|---|
| 272 |     ' to Outpatient, please use the ''release immediately'' choice.  These will be' +
 | 
|---|
| 273 |     ' readied in advance by Pharmacy for the patient''s expected discharge date.';
 | 
|---|
| 274 | begin
 | 
|---|
| 275 |   inherited;
 | 
|---|
| 276 |   frmMedCopy.fraEvntDelayList.UserDefaultEvent := StrToIntDef(GetDefaultEvt(IntToStr(User.DUZ)),0);
 | 
|---|
| 277 |   fraEvntDelayList.DisplayEvntDelayList;
 | 
|---|
| 278 |   if fraEvntDelayList.mlstEvents.Items.Count < 1 then
 | 
|---|
| 279 |   begin
 | 
|---|
| 280 |     ShowMessage(WarningMSG);
 | 
|---|
| 281 |     radRelease.Checked := True;
 | 
|---|
| 282 |   end else
 | 
|---|
| 283 |   begin
 | 
|---|
| 284 |     Height := Height + fraEvntDelayList.Height;
 | 
|---|
| 285 |     fraEvntDelayList.Visible := True;
 | 
|---|
| 286 |   end;
 | 
|---|
| 287 | end;
 | 
|---|
| 288 | 
 | 
|---|
| 289 | procedure TfrmMedCopy.radReleaseClick(Sender: TObject);
 | 
|---|
| 290 | begin
 | 
|---|
| 291 |   inherited;
 | 
|---|
| 292 |   fraEvntDelayList.Visible := False;
 | 
|---|
| 293 |   Height := Height - fraEvntDelayList.Height;
 | 
|---|
| 294 | end;
 | 
|---|
| 295 | 
 | 
|---|
| 296 | procedure TfrmMedCopy.fraEvntDelayListcboEvntListChange(Sender: TObject);
 | 
|---|
| 297 | begin
 | 
|---|
| 298 |   inherited;
 | 
|---|
| 299 |   fraEvntDelayList.mlstEventsChange(Sender);
 | 
|---|
| 300 |   if fraEvntDelayList.MatchedCancel then Close
 | 
|---|
| 301 | end;
 | 
|---|
| 302 | 
 | 
|---|
| 303 | procedure TfrmMedCopy.UMStillDelay(var message: TMessage);
 | 
|---|
| 304 | begin
 | 
|---|
| 305 |   CmdOKClick(Application);
 | 
|---|
| 306 | end;
 | 
|---|
| 307 | 
 | 
|---|
| 308 | procedure TfrmMedCopy.fraEvntDelayListmlstEventsDblClick(Sender: TObject);
 | 
|---|
| 309 | begin
 | 
|---|
| 310 |   if fraEvntDelayList.mlstEvents.ItemID > 0 then
 | 
|---|
| 311 |     cmdOKClick(Self);
 | 
|---|
| 312 | end;
 | 
|---|
| 313 | 
 | 
|---|
| 314 | procedure TfrmMedCopy.fraEvntDelayListmlstEventsChange(Sender: TObject);
 | 
|---|
| 315 | begin
 | 
|---|
| 316 |   fraEvntDelayList.mlstEventsChange(Sender);
 | 
|---|
| 317 |   if fraEvntDelayList.MatchedCancel then
 | 
|---|
| 318 |   begin
 | 
|---|
| 319 |     FOKPressed := False;
 | 
|---|
| 320 |     Close;
 | 
|---|
| 321 |     Exit;
 | 
|---|
| 322 |   end;
 | 
|---|
| 323 | end;
 | 
|---|
| 324 | 
 | 
|---|
| 325 | procedure TfrmMedCopy.FormKeyDown(Sender: TObject; var Key: Word;
 | 
|---|
| 326 |   Shift: TShiftState);
 | 
|---|
| 327 | begin
 | 
|---|
| 328 |   if Key = VK_RETURN then
 | 
|---|
| 329 |     cmdOKClick(Self);
 | 
|---|
| 330 | end;
 | 
|---|
| 331 | 
 | 
|---|
| 332 | end.
 | 
|---|