VistA-cprs/CPRS-Chart/Orders/fODDiet.pas

2256 lines
77 KiB
Plaintext

unit fODDiet;
{$O-}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
fODBase, ComCtrls, ExtCtrls, StdCtrls, Grids, ORCtrls, ORDtTm, ORFn, uConst;
type
TfrmODDiet = class(TfrmODBase)
nbkDiet: TPageControl;
pgeDiet: TTabSheet;
lblDietAvail: TLabel;
lblDietSelect: TLabel;
lblComment: TLabel;
lblStart: TLabel;
lblStop: TLabel;
lblDelivery: TLabel;
cboDietAvail: TORComboBox;
lstDietSelect: TORListBox;
cmdRemove: TButton;
txtDietComment: TCaptionEdit;
calDietStart: TORDateBox;
calDietStop: TORDateBox;
cboDelivery: TORComboBox;
pgeTubefeeding: TTabSheet;
lblTFProductList: TLabel;
lblTFComment: TLabel;
lblTFStrength: TLabel;
lblTFQuantity: TLabel;
lblTFProduct: TLabel;
cboProduct: TORComboBox;
txtTFComment: TCaptionEdit;
grdSelected: TCaptionStringGrid;
cmdTFRemove: TButton;
pgeEarlyLate: TTabSheet;
pgeIsolations: TTabSheet;
pgeAdditional: TTabSheet;
chkCancelTubefeeding: TCheckBox;
chkCancelTrays: TCheckBox;
txtQuantity: TCaptionEdit;
cboStrength: TCaptionComboBox;
lblTFAmount: TLabel;
grpMeal: TKeyClickRadioGroup;
grpMealTime: TGroupBox;
lblELStart: TLabel;
calELStart: TORDateBox;
lblELStop: TLabel;
calELStop: TORDateBox;
grpDoW: TGroupBox;
chkMonday: TCheckBox;
chkTuesday: TCheckBox;
chkWednesday: TCheckBox;
chkThursday: TCheckBox;
chkFriday: TCheckBox;
chkSaturday: TCheckBox;
chkSunday: TCheckBox;
chkBagged: TCheckBox;
radET1: TRadioButton;
radET2: TRadioButton;
radET3: TRadioButton;
radLT1: TRadioButton;
radLT2: TRadioButton;
radLT3: TRadioButton;
lblNoTimes: TLabel;
txtAOComment: TCaptionEdit;
lblAddlOrder: TLabel;
lstIsolation: TORListBox;
lblIsolation: TLabel;
lblIPComment: TLabel;
txtIPComment: TCaptionEdit;
lblIPCurrent: TLabel;
txtIPCurrent: TCaptionEdit;
pgeOutPt: TTabSheet;
grpOPMeal: TKeyClickRadioGroup;
grpOPDoW: TGroupBox;
chkOPMonday: TCheckBox;
chkOPTuesday: TCheckBox;
chkOPWednesday: TCheckBox;
chkOPThursday: TCheckBox;
chkOPFriday: TCheckBox;
chkOPSaturday: TCheckBox;
chkOPSunday: TCheckBox;
lblOPStart: TLabel;
calOPStart: TORDateBox;
lblOPStop: TLabel;
calOPStop: TORDateBox;
lblOPDietAvail: TLabel;
cboOPDietAvail: TORComboBox;
lblOPComment: TLabel;
txtOPDietComment: TCaptionEdit;
lblOPDelivery: TLabel;
cboOPDelivery: TORComboBox;
lblOPSelect: TLabel;
lstOPDietSelect: TORListBox;
cmdOPRemove: TButton;
chkOPCancelTubefeeding: TCheckBox;
calOPTFStart: TORDateBox;
lblOPTFStart: TLabel;
lblOPAOStart: TLabel;
calOPAOStart: TORDateBox;
cboOPAORecurringMeals: TORComboBox;
cboOPTFRecurringMeals: TORComboBox;
cboOPELRecurringMeals: TORComboBox;
procedure nbkDietChanging(Sender: TObject;
var AllowChange: Boolean);
procedure nbkDietChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure cboDietAvailNeedData(Sender: TObject;
const StartFrom: String; Direction, InsertAt: Integer);
procedure cboDietAvailMouseClick(Sender: TObject);
procedure cboDietAvailExit(Sender: TObject);
procedure cmdRemoveClick(Sender: TObject);
procedure DietChange(Sender: TObject);
procedure cmdAcceptClick(Sender: TObject);
procedure cboProductMouseClick(Sender: TObject);
procedure cboProductExit(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure grdSelectedSelectCell(Sender: TObject; Col, Row: Integer;
var CanSelect: Boolean);
procedure txtQuantityChange(Sender: TObject);
procedure txtQuantityExit(Sender: TObject);
procedure cboStrengthChange(Sender: TObject);
procedure cboStrengthExit(Sender: TObject);
procedure TFChange(Sender: TObject);
procedure cmdTFRemoveClick(Sender: TObject);
procedure grdSelectedDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
procedure cboStrengthKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure cboStrengthEnter(Sender: TObject);
procedure txtQuantityKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure txtQuantityEnter(Sender: TObject);
procedure grpMealClick(Sender: TObject);
procedure calELStartExit(Sender: TObject);
procedure calELStopChange(Sender: TObject);
procedure ELChange(Sender: TObject);
procedure calELStartEnter(Sender: TObject);
procedure calELStartChange(Sender: TObject);
procedure IPChange(Sender: TObject);
procedure AOChange(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure cboOPDietAvailMouseClick(Sender: TObject);
procedure cboOPDietAvailExit(Sender: TObject);
procedure calOPStartExit(Sender: TObject);
procedure calOPStopChange(Sender: TObject);
procedure calOPStartEnter(Sender: TObject);
procedure calOPStartChange(Sender: TObject);
procedure OPChange(Sender: TObject);
procedure grpOPMealClick(Sender: TObject);
procedure cmdOPRemoveClick(Sender: TObject);
procedure cboOPDietAvailKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
FNextCol: Integer;
FNextRow: Integer;
FChangeStop: Boolean;
FIsolationID: string;
FTabChanging: Boolean;
procedure DietCheckForNPO;
procedure DietCheckForTF;
function GetMealTime: string;
function GetDaysOfWeek: string;
function IsEarlyTray: Boolean;
procedure ResetControlsDO;
procedure ResetControlsTF;
procedure ResetControlsEL;
procedure ResetControlsIP;
procedure ResetControlsAO;
procedure SetEnableDOW(AllowUse: Boolean);
procedure SetNextCell(ACol, ARow: Integer);
procedure SetValuesFromResponsesDO;
procedure SetValuesFromResponsesTF;
procedure SetValuesFromResponsesEL;
procedure SetValuesFromResponsesIP;
procedure SetValuesFromResponsesAO;
procedure TFMoveToNextCell;
procedure TFClearGrid;
procedure TFSetAmountForRow(ARow: Integer);
function TFStrengthCode(const x: string): Integer;
// Outpatient meal additions
function FMDOW(AnFMDate: TFMDateTime): integer;
function FMDays(AStart, AEnd: TFMDateTime): string;
function GetOPDaysOfWeek: string;
procedure SetEnableOPDOW(AllowUse: Boolean; OneTimeDay: integer; DaysToCheck: string = '');
procedure ResetControlsOP;
procedure SetValuesFromResponsesOP;
function GetOPMealWindow: string;
procedure OPDietCheckForNPO;
procedure OPDietCheckForTF;
function PatientHasRecurringMeals(var MealList: TStringList; MealType: string = ''): boolean;
protected
procedure InitDialog; override;
procedure Validate(var AnErrMsg: string); override;
public
procedure SetupDialog(OrderAction: Integer; const ID: string); override;
end;
var
frmODDiet: TfrmODDiet;
uDialogName: string;
uFHAUTH: boolean;
uRecurringMealList: TStringList;
implementation
{$R *.DFM}
uses uCore, rODBase, rODDiet, rCore, rOrders, fODDietLT, uAccessibleStringGrid, DateUtils;
const
TX_DIET_REG = 'A regular diet may not be combined with other diets.';
TX_DIET_NPO = 'NPO may not be combined with other diets.';
TX_DIET_LIM = 'A maximum of 5 diet modifications may be selected.';
TX_DIET_DUP = 'This diet has already been selected.';
TX_DIET_PRC = 'This diet conflicts with ';
TC_DIET_ERR = 'Unable to Add Diet';
TX_INPT_ONLY = 'This type of diet may be entered for inpatients only.';
TC_INPT_ONLY = 'Ordering Restriction';
TX_CANCEL_TF = 'Cancel the current tubefeeding order?' + CRLF + CRLF;
TC_CANCEL_TF = 'Cancel Tubefeeding';
TX_NO_DIET = 'At least one diet must be selected.';
TX_BAD_START = 'The effective date is not valid.';
TX_BAD_STOP = 'The expiration date is not valid.';
TX_STOPSTART = 'The expiration date must be after the effective date.';
TX_MINMAX = 'At least 1 product must be selected (maximum: 5).';
TX_TFQTY = 'A quantity must be entered for ';
TX_TFAMT = 'The quantity is invalid for ';
TX_TF5000 = 'The total quantity ordered may not exceed 5000ml.';
TX_HLPQTY = CRLF + 'The following may be entered for quantity:' + CRLF +
' Units may be K for Kcals, C for cc''s, M for ml, O for oz. or U for units (e.g. cans).' + CRLF +
' Frequency may be DAY, HOUR, QD, QH, BID, TID, QID, Q2H, Q3H, Q4H, or Q6H.' + CRLF +
' May also input 100CC/HR X 16 for 16 hours. Valid quantity for powder form' + CRLF +
' product can be "# GRAMS" as 20 G, GRAMS, or GMS, or as 1 PKG or 1 U and the' + CRLF +
' frequency (e.g. 20 GRAMS/DAY or 1 PKG/TID).';
TX_ELMEAL = 'A meal must be selected.';
TX_ELTIME = 'A meal time must be selected.';
TX_ELNOSTART = 'A valid start date must be entered.';
TX_ELNOSTOP = 'A valid end date must be entered.';
TX_ELSTARTLT = 'The start date may not be earlier than today.';
TX_ELSTOPLT = 'The end date may not be earlier than today.';
TX_ELSTOPSTART = 'The end date may not be earlier than the start date.';
TX_ELSTART30 = 'The start date may not be more than 30 days in the future.';
TX_ELSTOP30 = 'The end date may not be more than 30 days in the future.';
TX_ELDOW = 'The days of the week must be selected for time ranges greater than 1 day.';
TX_ELPAST = 'The selected meal time has already passed.';
TX_IPNONE = 'An isolation type must be selected.';
TX_AONONE = 'Text for additional order has not been entered.';
TX_ACCEPT = 'Accept the following order?' + CRLF + CRLF;
TX_CONTINUE = 'Continue editing the following order?' + CRLF + CRLF;
TX_DISCARD = CRLF + CRLF + 'Answering NO will discard all changes.';
TC_ACCEPT = 'Unsaved Order';
TX_EL_SAVE_ERR = 'An error occurred while saving this late tray order.';
TC_EL_SAVE_ERR = 'Error Saving Late Tray Order';
// Outpatient meal additions
TX_OPMEAL = 'A meal must be selected.';
TX_OPNOSTART = 'A valid start date must be entered.';
TX_OPNOSTOP = 'A valid end date must be entered.';
TX_OPSTARTLT = 'The start date may not be earlier than today.';
TX_OPSTOPLT = 'The end date may not be earlier than today.';
TX_OPSTOPSTART = 'The end date may not be earlier than the start date.';
TX_OPSTART_MAX1 = 'The start date may not be more than ';
TX_OPSTART_MAX2 = ' days in the future.';
TX_OPSTOP_MAX1 = 'The end date may not be more than ';
TX_OPSTOP_MAX2 = ' days in the future.';
TX_OPDOW = 'The days of the week must be selected for time ranges greater than 1 day.';
TX_OPPAST = 'The selected meal time has already passed.';
TX_OP_SAVE_ERR = 'An error occurred while saving this outpatient meal order.';
TC_OP_SAVE_ERR = 'Error Saving Outpatient Meal Order';
TX_OP_NO_DIET = 'One and only one diet must be selected.';
TX_OP_BAD_START = 'The effective date is not valid.';
TX_OP_BAD_STOP = 'The expiration date is not valid.';
//TX_OP_DIET_REG = 'A regular diet may not be combined with other diets.';
//TX_OP_DIET_NPO = 'NPO may not be combined with other diets.';
//TX_OP_DIET_LIM = 'A maximum of 1 diet may be selected.';
//TX_OP_DIET_DUP = 'This diet has already been selected.';
//TX_OP_DIET_PRC = 'This diet conflicts with ';
TC_OP_DIET_ERR = 'Unable to Add Diet';
TX_OUTPT_ONLY = 'This type of diet may be entered for outpatients only.';
TC_OUTPT_ONLY = 'Ordering Restriction';
TX_NO_PARAMS = 'Placing Early or Late tray orders is not allowed until the IRM diet package' + CRLF +
'coordinator enters times for E/L trays for this location.';
TC_NO_PARAMS = 'Unable to Order Early/Late Tray';
TX_NOSTART = 'A valid start date must be entered.';
TC_NOSTART = 'Start date required';
TX_NOT_THIS_LOC = 'This location has not been configured to' + CRLF +
'allow ordering of meals for outpatients.' + CRLF + CRLF +
'Please contact your IRM diet package coordinator.';
TC_NOT_THIS_LOC = 'Unable to order from this location';
TX_NO_OUTPT_ORDERS = 'Diet orders may only be entered for inpatients.';
TC_NO_OUTPT_ORDERS = 'Ordering Restriction';
TX_NO_MEALS_DEFINED = 'No diet types have been defined to be orderable for outpatients.' + CRLF + CRLF +
'Please contact your IRM diet package coordinator.';
TC_NO_MEALS_DEFINED = 'Unable to order outpatient meals';
FMDayLetters: array[1..7] of string[1] = ('M', 'T', 'W', 'R', 'F', 'S', 'X');
type
TTFProduct = class
private
IEN: Integer;
Name: string;
end;
var
uDietParams: TDietParams;
procedure TfrmODDiet.FormCreate(Sender: TObject);
var
ALocation: string; //ptr to #44 hospital location
begin
inherited;
AbortOrder := False;
uRecurringMealList := TStringList.Create;
if OrderForInpatient then
begin
pgeDiet.TabVisible := True;
pgeOutPt.TabVisible := False;
end
else if OutpatientPatchInstalled then // put here to only call RPCs if outpatient - remove "IF" later
begin
pgeDiet.TabVisible := False;
pgeOutPt.TabVisible := True;
end
else // this block will go away after FH patch installed everywhere
begin
InfoBox(TX_NO_OUTPT_ORDERS, TC_NO_OUTPT_ORDERS, MB_OK);
AbortOrder := True;
Exit;
end;
FillerID := 'FH'; // does 'on Display' order check **KCM**
ALocation := '0';
if Self.EvtID > 0 then
ALocation := GetEventLoc1(IntToStr(Self.EvtID));
if StrToIntDef(ALocation, 0) < 1 then
ALocation := IntToStr(Encounter.Location);
if (not OrderForInpatient) and OutpatientPatchInstalled and (not OutpatientLocationConfigured(ALocation)) then
begin
InfoBox(TX_NOT_THIS_LOC, TC_NOT_THIS_LOC, MB_OK or MB_ICONINFORMATION);
AbortOrder := True;
end
else
begin
LoadDietParams(uDietParams, ALocation);
if pgeOutPt.TabVisible then
with uDietParams, cboOPDelivery do
begin
if Tray then Items.Add('T^Tray');
if Cafeteria then Items.Add('C^Cafeteria');
if DiningRm then Items.Add('D^Dining Room');
ItemIndex := 0;
chkBagged.Visible := uDietParams.Bagged;
end
else
with uDietParams, cboDelivery do
begin
if Tray then Items.Add('T^Tray');
if Cafeteria then Items.Add('C^Cafeteria');
if DiningRm then Items.Add('D^Dining Room');
ItemIndex := 0;
chkBagged.Visible := uDietParams.Bagged;
end;
end;
TAccessibleStringGrid.WrapControl(grdSelected);
end;
procedure TfrmODDiet.FormDestroy(Sender: TObject);
begin
TAccessibleStringGrid.UnwrapControl(grdSelected);
TFClearGrid;
uRecurringMealList.Free;
inherited;
end;
procedure TfrmODDiet.FormResize(Sender: TObject);
begin
inherited;
with grdSelected do
begin
ColWidths[1] := Canvas.TextWidth('XFULLX') + GetSystemMetrics(SM_CXVSCROLL);
ColWidths[2] := Canvas.TextWidth('100 GRAMS/HOUR X 24');
ColWidths[3] := Canvas.TextWidth('55000ml');
ColWidths[0] := ClientWidth - ColWidths[1] - ColWidths[2] - ColWidths[3] - 3;
lblTFStrength.Left := Left + ColWidths[0] + 3;
lblTFQuantity.Left := Left + ColWidths[0] + ColWidths[1] + 5;
lblTFAmount.Left := Left + ColWidths[0] + ColWidths[1] + ColWidths[2] + 7;
end;
end;
procedure TfrmODDiet.InitDialog;
begin
inherited;
// handle all initialization at the tab level
// if FTabChanging, then nbkDietChange is about to be called anyway
if not FTabChanging then nbkDietChange(Self);
end;
procedure TfrmODDiet.SetupDialog(OrderAction: Integer; const ID: string);
begin
if AbortOrder then exit;
inherited;
uDialogName := ExternalName(DialogIEN, 101.41);
case DietDialogType(DisplayGroup) of
'D': begin
if not OrderForInpatient then
begin
InfoBox(TX_INPT_ONLY, TC_INPT_ONLY, MB_OK);
Close;
Exit;
end;
pgeDiet.TabVisible := True;
pgeOutPt.TabVisible := False;
nbkDiet.ActivePage := pgeDiet;
nbkDietChange(Self);
if OrderAction <> ORDER_NEW then SetValuesFromResponsesDO;
end;
'N': begin
if not OrderForInpatient then
begin
InfoBox(TX_INPT_ONLY, TC_INPT_ONLY, MB_OK);
Close;
Exit;
end;
nbkDiet.ActivePage := pgeDiet;
nbkDietChange(Self);
if OrderAction <> ORDER_NEW then SetValuesFromResponsesDO;
end;
'T': begin
if (not OrderForInpatient) and (not PatientHasRecurringMeals(uRecurringMealList)) then
begin
Close;
Exit;
end;
nbkDiet.ActivePage := pgeTubefeeding;
nbkDietChange(Self);
if OrderAction <> ORDER_NEW then SetValuesFromResponsesTF;
end;
'E': begin
if (not OrderForInpatient) and (not PatientHasRecurringMeals(uRecurringMealList)) then
begin
Close;
Exit;
end;
nbkDiet.ActivePage := pgeEarlyLate;
nbkDietChange(Self);
if OrderAction <> ORDER_NEW then SetValuesFromResponsesEL;
end;
'P': begin
nbkDiet.ActivePage := pgeIsolations;
nbkDietChange(Self);
if OrderAction <> ORDER_NEW then SetValuesFromResponsesIP;
end;
'A': begin
if (not OrderForInpatient) and (not PatientHasRecurringMeals(uRecurringMealList)) then
begin
Close;
Exit;
end;
nbkDiet.ActivePage := pgeAdditional;
nbkDietChange(Self);
if OrderAction <> ORDER_NEW then SetValuesFromResponsesAO;
end;
'M': begin
if OrderForInpatient then
begin
InfoBox(TX_OUTPT_ONLY, TC_OUTPT_ONLY, MB_OK);
Close;
Exit;
end;
uFHAUTH := UserHasFHAUTHKey; // is this really needed for other than printing?
pgeDiet.TabVisible := False;
pgeOutPt.TabVisible := True;
nbkDiet.ActivePage := pgeOutPt;
nbkDietChange(Self);
if OrderAction <> ORDER_NEW then SetValuesFromResponsesOP;
end
else
begin
if not OrderForInpatient then
begin
InfoBox(TX_INPT_ONLY, TC_INPT_ONLY, MB_OK);
Close;
Exit;
end;
pgeDiet.TabVisible := True;
pgeOutPt.TabVisible := False;
nbkDiet.ActivePage := pgeDiet;
nbkDietChange(Self);
if OrderAction <> ORDER_NEW then SetValuesFromResponsesDO;
ActiveControl := cboOPDietAvail;
end;
end;
if OrderAction = ORDER_NEW then SetFocusedControl(nbkDiet);
end;
procedure TfrmODDiet.Validate(var AnErrMsg: string);
var
ErrMsg: string;
i, Sum: Integer;
procedure SetError(const x: string);
begin
if Length(AnErrMsg) > 0 then AnErrMsg := AnErrMsg + CRLF;
AnErrMsg := AnErrMsg + x;
end;
function MealTimePassed: Boolean;
var
x: string;
ATime: Integer;
begin
Result := False;
if calELStart.FMDateTime <> FMToday then Exit;
x := GetMealTime;
if Pos(':', x) = 0 then Exit;
ATime := StrToIntDef(Piece(x, ':', 1) + Copy(Piece(x, ':', 2), 1, 2), 0);
if (Pos('P', x) > 0) and (ATime < 1200) then ATime := ATime + 1200;
if (Pos('A', x) > 0) and (ATime > 1200) then ATime := ATime - 1200;
if (ATime / 10000) < Frac(FMNow) then Result := True;
end;
function OPMealTimePassed: Boolean;
var
WindowTimes: string;
EndWindow: integer;
x: extended;
begin
Result := False;
if calOPStart.FMDateTime <> FMToday then Exit;
WindowTimes := GetOPMealWindow;
if WindowTimes = U then exit;
EndWindow := StrToIntDef(Piece(WindowTimes, U, 2), 0);
x := Frac(calOPStart.FMDateTime);
if x = 0 then x := Frac(FMNow) * 10000;
if x > EndWindow then Result := True;
end;
begin
// do the appropriate validation depending on the currently selected tab
if nbkDiet.ActivePage = pgeDiet then
begin
if lstDietSelect.Items.Count < 1 then SetError(TX_NO_DIET);
if not calDietStart.IsValid then SetError(TX_BAD_START);
with calDietStop do
begin
Validate(ErrMsg);
if Length(ErrMsg) > 0 then SetError(TX_BAD_STOP);
if (Length(Text) > 0) and (FMDateTime <= calDietStart.FMDateTime)
then SetError(TX_STOPSTART);
end; {with calDietStop}
end; {pgeDiet}
if nbkDiet.ActivePage = pgeTubeFeeding then
begin
Sum := 0;
with grdSelected do for i := 0 to RowCount - 1 do if Objects[0, i] <> nil then Inc(Sum);
if (Sum < 1) or (Sum > 5) then SetError(TX_MINMAX);
Sum := 0;
with grdSelected do for i := 0 to RowCount - 1 do if Objects[0, i] <> nil then
begin
if Length(Cells[2, i]) = 0 then SetError(TX_TFQTY + Cells[0, i]);
if (Length(Cells[2, i]) > 0) and (Length(Cells[3, i]) = 0)
then SetError(TX_TFAMT + Cells[0, i] + TX_HLPQTY);
Sum := Sum + StrToIntDef(Piece(Cells[3, i], 'c', 1), 0);
end;
if Sum > 5000 then SetError(TX_TF5000);
if not OrderForInpatient then
if not calOPTFStart.IsValid then SetError(TX_BAD_START);
end;
if nbkDiet.ActivePage = pgeEarlyLate then
begin
if grpMeal.ItemIndex = 3 then SetError(TX_ELMEAL);
if not calELStart.IsValid then SetError(TX_ELNOSTART);
if calELStart.FMDateTime < FMToday then SetError(TX_ELSTARTLT);
if calELStart.FMDateTime > FMDateTimeOffsetBy(FMToday, 30) then SetError(TX_ELSTART30);
if OrderForInpatient then
begin
if GetMealTime = '' then SetError(TX_ELTIME);
if not calELStop.IsValid then SetError(TX_ELNOSTOP);
if calELStop.FMDateTime < FMToday then SetError(TX_ELSTOPLT);
if calELStop.FMDateTime < calELStart.FMDateTime then SetError(TX_ELSTOPSTART);
if calELStop.FMDateTime > FMDateTimeOffsetBy(FMToday, 30) then SetError(TX_ELSTOP30);
end;
if grpDOW.Enabled and (GetDaysOfWeek = '') then SetError(TX_ELDOW);
if MealTimePassed then SetError(TX_ELPAST);
end;
if nbkDiet.ActivePage = pgeIsolations then
begin
if lstIsolation.ItemIndex < 0 then SetError(TX_IPNONE);
end;
if nbkDiet.ActivePage = pgeAdditional then
begin
if not ContainsVisibleChar(txtAOComment.Text) then SetError(TX_AONONE);
if not OrderForInpatient then
if not calOPAOStart.IsValid then SetError(TX_BAD_START);
end;
if nbkDiet.ActivePage = pgeOutPt then
begin
if grpOPMeal.ItemIndex = 3 then SetError(TX_OPMEAL);
if lstOPDietSelect.Items.Count < 1 then SetError(TX_OP_NO_DIET);
if OPMealTimePassed then SetError(TX_OPPAST);
if uDialogName = 'FHW OP MEAL' then
begin
if not calOPStart.IsValid then SetError(TX_OP_BAD_START);
with calOPStop do
begin
Validate(ErrMsg);
if Length(ErrMsg) > 0 then SetError(TX_OP_BAD_STOP);
if (Length(Text) > 0) and (FMDateTime < calOPStart.FMDateTime)
then SetError(TX_OPSTOPSTART);
end; {with calOPDietStop}
if calOPStart.FMDateTime > FMDateTimeOffsetBy(FMToday, uDietParams.OPMaxDays)
then SetError(TX_OPSTART_MAX1 + IntToStr(uDietParams.OPMaxDays) +
TX_OPSTART_MAX2);
if calOPStop.FMDateTime > FMDateTimeOffsetBy(FMToday, uDietParams.OPMaxDays)
then SetError(TX_OPSTOP_MAX1 + IntToStr(uDietParams.OPMaxDays) +
TX_OPSTOP_MAX2);
if grpOPDOW.Enabled and (GetOPDaysOfWeek = '')
then SetError(TX_OPDOW);
end;
end;
end;
{ notebook tabs - general ------------------------------------------------------------------- }
procedure TfrmODDiet.nbkDietChanging(Sender: TObject; var AllowChange: Boolean);
begin
inherited;
with Responses do if (Length(CopyOrder) > 0) or (Length(EditOrder) > 0) then
begin
AllowChange := False;
Exit;
end;
FTabChanging := True;
if Length(memOrder.Text) > 0 then
begin
if nbkDiet.ActivePage = pgeOutpt then
begin
if InfoBox(TX_CONTINUE + memOrder.Text + TX_DISCARD, TC_ACCEPT, MB_YESNO) = ID_YES then
begin
AllowChange := FALSE;
end else
begin
memOrder.Text := '';
memOrder.Lines.Clear;
Responses.Clear;
end;
end
else
begin
if InfoBox(TX_ACCEPT + memOrder.Text, TC_ACCEPT, MB_YESNO) = ID_YES then
begin
cmdAcceptClick(Self);
AllowChange := AcceptOK;
end else
begin
memOrder.Text := '';
memOrder.Lines.Clear;
Responses.Clear;
end;
end
end;
FTabChanging := False;
end;
procedure TfrmODDiet.nbkDietChange(Sender: TObject);
var
x, CxMsg: string ;
i: integer;
AStringList: TStringList;
const
// TX_CX_CUR = 'A new diet order will CANCEL and REPLACE this current diet:' + CRLF + CRLF;
TX_CX_CUR = 'A new diet order will CANCEL and REPLACE this current diet now unless' + CRLF +
'you specify a start date for when the new diet should replace the current' + CRLF +
'diet:' + CRLF + CRLF;
TX_CX_FUT = 'A new diet order with no expiration date will CANCEL and REPLACE these diets:' + CRLF + CRLF;
begin
inherited;
// much of the logic here can be eliminated if ClearDialogControls starts clearing containers
if AbortOrder then
begin
cmdQuitClick(Self);
exit;
end;
StatusText('Loading Dialog Definition');
if Sender <> Self then Responses.Clear;
Changing := True; // Changing set!
if nbkDiet.ActivePage = pgeDiet then
begin
AllowQuickOrder := True;
x := CurrentDietText;
if Piece(x, #13, 1) <> 'Current Diet: ' then
begin
AStringList := TStringList.Create;
try
AStringList.Text := x;
CxMsg := TX_CX_CUR + #9 + Piece(AStringList[0], ':', 1) + ':' + CRLF + CRLF
+ #9 + Copy(AStringList[0], 16, 99) + CRLF;
if AStringList.Count > 1 then
begin
CxMsg := CxMsg + CRLF + CRLF +
TX_CX_FUT + #9 + Piece(AStringList[1], ':', 1) + ':' + CRLF + CRLF
+ #9 + Copy(AStringList[1], 22, 99) + CRLF;
if AStringList.Count > 2 then
for i := 2 to AStringList.Count - 1 do
CxMsg := CxMsg + #9 + TrimLeft(AStringList[i]) + CRLF;
end;
finally
AStringList.Free;
end;
end;
if CxMsg <> '' then
begin
if InfoBox(CxMsg + CRLF +
'Are you sure?', 'Confirm', MB_ICONWARNING or MB_YESNO) = ID_NO then
begin
AbortOrder := True;
cmdQuitClick(Self);
exit;
end;
end;
OrderMessage(x);
Responses.Dialog := 'FHW1'; // Diet Order
DisplayGroup := DisplayGroupForDialog('FHW1');
LoadDietQuickList(cboDietAvail.Items, 'DO');
cboDietAvail.InsertSeparator;
cboDietAvail.InitLongList('');
chkCancelTubefeeding.State := cbGrayed;
chkCancelTubefeeding.Visible := False;
ResetControlsDO;
end;
if nbkDiet.ActivePage = pgeTubefeeding then
begin
if not OrderForInpatient then
begin
if not PatientHasRecurringMeals(uRecurringMealList) then
begin
Changing := False;
nbkDiet.ActivePage := pgeOutPt;
nbkDietChange(nbkDiet);
Exit;
end
else
cboOPTFRecurringMeals.Items.Assign(uRecurringMealList);
end;
cboOPTFRecurringMeals.Visible := not OrderForInpatient;
calOPTFStart.Visible := False;
lblOPTFStart.Visible := not OrderForInpatient;
AllowQuickOrder := True;
if Length(uDietParams.CurTF) > 0
then OrderMessage(TextForOrder(uDietParams.CurTF))
else OrderMessage('');
Responses.Dialog := 'FHW8'; // Tubefeeding
DisplayGroup := DisplayGroupForDialog('FHW8');
with cboProduct do if Items.Count = 0 then
begin
LoadDietQuickList(Items, 'TF');
if Items.Count > 0 then
begin
Items.Add(LLS_LINE);
Items.Add(LLS_SPACE);
end;
AppendTFProducts(Items);
end;
cboProduct.Text := '';
ResetControlsTF;
end;
if nbkDiet.ActivePage = pgeEarlyLate then
begin
if not OrderForInpatient then
begin
if not PatientHasRecurringMeals(uRecurringMealList) then
begin
Changing := False;
nbkDiet.ActivePage := pgeOutPt;
nbkDietChange(nbkDiet);
Exit;
end
else
cboOPELRecurringMeals.Items.Assign(uRecurringMealList);
end
else if (StrToIntDef(uDietParams.EarlyIEN, 0) = 0) or (StrToIntDef(uDietParams.LateIEN, 0) = 0) then
begin
InfoBox(TX_NO_PARAMS, TC_NO_PARAMS, MB_ICONERROR or MB_OK);
if pgeEarlyLate <> nil then
nbkDiet.SelectNextPage(False);
Changing := False;
Exit;
end;
cboOPELRecurringMeals.Visible := not OrderForInpatient;
cboOPELRecurringMeals.TabStop := not OrderForInpatient;
calELStart.Visible := OrderForInpatient;
calELStart.TabStop := OrderForInpatient;
calELStop.Visible := OrderForInpatient;
lblELStop.Visible := OrderForInpatient;
grpDOW.Visible := OrderForInpatient;
grpDOW.Enabled := OrderForInpatient;
AllowQuickOrder := False;
OrderMessage('');
Responses.Dialog := 'FHW2'; // Early/Late Tray
DisplayGroup := DisplayGroupForDialog('FHW2');
ResetControlsEL;
end;
if nbkDiet.ActivePage = pgeIsolations then
begin
AllowQuickOrder := False;
OrderMessage('');
Responses.Dialog := 'FHW3'; // Isolations
DisplayGroup := DisplayGroupForDialog('FHW3');
if lstIsolation.Items.Count = 0 then LoadIsolations(lstIsolation.Items);
txtIPCurrent.Text := CurrentIsolation;
FIsolationID := IsolationID;
ResetControlsIP;
end;
if nbkDiet.ActivePage = pgeAdditional then
begin
if not OrderForInpatient then
begin
if not PatientHasRecurringMeals(uRecurringMealList) then
begin
Changing := False;
nbkDiet.ActivePage := pgeOutPt;
nbkDietChange(nbkDiet);
Exit;
end
else
cboOPAORecurringMeals.Items.Assign(uRecurringMealList);
end;
cboOPAORecurringMeals.Visible := not OrderForInpatient;
calOPAOStart.Visible := False; //not OrderForInpatient;
lblOPAOStart.Visible := not OrderForInpatient;
AllowQuickOrder := False;
OrderMessage('');
Responses.Dialog := 'FHW7'; // Additional Order
DisplayGroup := DisplayGroupForDialog('FHW7');
ResetControlsAO;
end;
if nbkDiet.ActivePage = pgeOutPt then
begin
x := CurrentDietText;
if Length(Piece(x, #$D, 1)) > Length('Current Diet: ') then
OrderMessage(x)
else
OrderMessage('');
if (uDialogName <> 'FHW SPECIAL MEAL') and (uDialogName <> 'FHW OP MEAL') then
uDialogName := 'FHW OP MEAL';
Responses.Dialog := uDialogName;
DisplayGroup := DisplayGroupForDialog(uDialogName);
if uDialogName = 'FHW SPECIAL MEAL' then // Special meal
begin
AllowQuickOrder := False;
ResetControlsOP;
cboOPDietAvail.Items.AddStrings(SubsetOfOPDiets);
{ TODO -oRich V. -cOutpatient Meals : Need to DC Tubefeeding order for OP meals? }
chkOPCancelTubefeeding.State := cbGrayed;
chkOPCancelTubefeeding.Visible := False;
grpOPMeal.Caption := 'Special Meal';
pgeTubefeeding.TabVisible := False;
pgeIsolations.TabVisible := False;
pgeAdditional.TabVisible := False;
pgeEarlyLate.TabVisible := False;
cboOPDietAvail.SelectByIEN(uDietParams.OPDefaultDiet);
cboOPDietAvailMouseClick(Self);
Changing := False;
end
else if uDialogName = 'FHW OP MEAL' then // Recurring meal
begin
AllowQuickOrder := True;
ResetControlsOP;
LoadDietQuickList(cboOPDietAvail.Items, 'MEAL'); // use D.G. short name here
cboOPDietAvail.InsertSeparator;
cboOPDietAvail.Items.AddStrings(SubsetOfOPDiets);
cboOPDietAvail.SelectByIEN(uDietParams.OPDefaultDiet);
{ TODO -oRich V. -cOutpatient Meals : Need to DC Tubefeeding order for OP meals? }
chkOPCancelTubefeeding.State := cbGrayed;
chkOPCancelTubefeeding.Visible := False;
grpOPMeal.Caption := 'Recurring Meal';
SetEnableOPDOW(False, -1);
cboOPDietAvailMouseClick(Self);
Changing := False;
end;
end;
Changing := False; // Changing reset
StatusText('');
end;
{ Diet Order tab ---------------------------------------------------------------------------- }
procedure TfrmODDiet.DietCheckForNPO;
begin
if Piece(lstDietSelect.Items[0], U, 2) = 'NPO' then
begin
lblDelivery.Visible := False;
cboDelivery.Visible := False;
lblComment.Visible := True; // <-- these changes added for 11a to suppress
txtDietComment.Visible := True; // <-- prompting of special instructions except
end else // <-- for NPO
begin // <--
lblComment.Visible := False; // <--
txtDietComment.Visible := False; // <--
txtDietComment.Text := ''; // <--
end;
end;
procedure TfrmODDiet.DietCheckForTF;
var
x: string;
begin
with lstDietSelect do
begin
if (Items.Count = 1) and (Piece(Items[0], U, 2) <> 'NPO')
and (Length(uDietParams.CurTF) > 0) then
begin
x := TextForOrder(uDietParams.CurTF);
if InfoBox(TX_CANCEL_TF + x, TC_CANCEL_TF, MB_YESNO) = IDYES then
begin
chkCancelTubeFeeding.State := cbChecked;
chkCancelTubeFeeding.Visible := True;
end
else chkCancelTubeFeeding.State := cbUnchecked;
end; {if (Items...}
end; {with lstDietSelect}
end;
procedure TfrmODDiet.ResetControlsDO;
begin
lstDietSelect.Clear;
calDietStart.Text := 'Now';
calDietStop.Text := '';
lblDelivery.Visible := True;
cboDelivery.Visible := True;
txtDietComment.Text := ''; // <-- suppress except for NPO
txtDietComment.Visible := False; // <--
lblComment.Visible := False; // <--
end;
procedure TfrmODDiet.SetValuesFromResponsesDO;
var
AnInstance: Integer;
AResponse: TResponse;
ADiet: string;
begin
Changing := True; // Changing set!!
ResetControlsDO;
with Responses do
begin
AnInstance := NextInstance('ORDERABLE', 0);
while AnInstance > 0 do
begin
AResponse := FindResponseByName('ORDERABLE', AnInstance);
if AResponse <> nil then
begin
ADiet := DietAttributes(StrToIntDef(AResponse.IValue,0));
if Piece(ADiet,'^',1)='0' then
begin
InfoBox(Piece(ADiet,'^',2), TC_DIET_ERR, MB_OK);
cboDietAvail.ItemIndex := -1;
Changing := False;
Exit;
end;
lstDietSelect.Items.Add(ADiet);
end;
AnInstance := NextInstance('ORDERABLE', AnInstance);
end; {while AnInstance - ORDERABLE}
SetControl(calDietStart, 'START', 1);
SetControl(calDietStop, 'STOP', 1);
SetControl(cboDelivery, 'DELIVERY', 1);
SetControl(txtDietComment, 'COMMENT', 1);
end;
DietCheckForNPO;
DietCheckForTF;
Changing := False; // Changing reset
DietChange(Self);
end;
procedure TfrmODDiet.cboDietAvailNeedData(Sender: TObject; const StartFrom: string;
Direction, InsertAt: Integer);
begin
inherited;
cboDietAvail.ForDataUse(SubSetOfDiets(StartFrom, Direction));
end;
procedure TfrmODDiet.cboDietAvailMouseClick(Sender: TObject);
var
NewDiet, ErrMsg: string;
DupDiet: Boolean;
i: Integer;
procedure SetError(const AnError: string);
begin
if Length(ErrMsg) > 0 then Exit;
ErrMsg := AnError;
end;
begin
inherited;
if CharAt(cboDietAvail.ItemID, 1) = 'Q' then // setup quick order
begin
Responses.QuickOrder := ExtractInteger(cboDietAvail.ItemID);
SetValuesFromResponsesDO;
cboDietAvail.ItemIndex := -1;
Exit;
end;
if cboDietAvail.ItemIEN > 0 then with lstDietSelect do
begin
ErrMsg := '';
if Items.Count > 0 then // disallow other diets with Regular & NPO
begin
if cboDietAvail.ItemIEN = uDietParams.RegIEN then SetError(TX_DIET_REG);
if GetIEN(0) = uDietParams.RegIEN then SetError(TX_DIET_REG);
if cboDietAvail.ItemIEN = uDietParams.NPOIEN then SetError(TX_DIET_NPO);
if GetIEN(0) = uDietParams.NPOIEN then SetError(TX_DIET_NPO);
end;
if Items.Count = 5 then SetError(TX_DIET_LIM); // maximum of 5 diet modifications
DupDiet := False;
for i := 0 to Items.Count - 1 do if cboDietAvail.ItemIEN = GetIEN(i) then DupDiet := True;
if DupDiet then SetError(TX_DIET_DUP); // each diet mod must be unique
NewDiet := DietAttributes(cboDietAvail.ItemIEN);
if Piece(NewDiet,'^',1)='0' then
begin
InfoBox(Piece(NewDiet,'^',2),TC_DIET_ERR, MB_OK);
cboDietAvail.ItemIndex := -1;
Exit;
end;
for i := 0 to Items.Count - 1 do // check to make sure unique precedence
if Piece(Items[i], U, 4) = Piece(NewDiet, U, 4)
then SetError(TX_DIET_PRC + Piece(Items[i], U, 2));
if Length(ErrMsg) > 0 then InfoBox(ErrMsg, TC_DIET_ERR, MB_OK) else
begin
lstDietSelect.Items.Add(NewDiet);
DietCheckForNPO;
DietCheckForTF;
OrderMessage(OIMessage(StrToIntDef(Piece(NewDiet, U, 1), 0)));
DietChange(Sender);
end; {else of if Length}
end; {if cboDietAvail}
cboDietAvail.ItemIndex := -1;
end;
procedure TfrmODDiet.cboDietAvailExit(Sender: TObject);
begin
inherited;
if (cboDietAvail.ItemIEN > 0) or (CharAt(cboDietAvail.ItemID, 1) = 'Q') then
cboDietAvailMouseClick(Self);
end;
procedure TfrmODDiet.cmdRemoveClick(Sender: TObject);
begin
inherited;
with lstDietSelect do if ItemIndex > -1 then Items.Delete(ItemIndex);
DietChange(Sender);
with lstDietSelect do if Items.Count = 0 then
begin
chkCancelTubefeeding.State := cbGrayed;
chkCancelTubefeeding.Visible := False;
lblDelivery.Visible := True;
cboDelivery.Visible := True;
end;
end;
procedure TfrmODDiet.DietChange(Sender: TObject);
var
i: Integer;
begin
inherited;
if Changing then Exit;
if Sender <> Self then Responses.Clear; // Sender=Self when called from SetupDialog
with calDietStart do {if Length(Text) > 0 then} Responses.Update('START', 1, Text, Text);
with calDietStop do {if Length(Text) > 0 then} Responses.Update('STOP', 1, Text, Text);
with lstDietSelect do for i := 0 to Items.Count - 1 do
Responses.Update('ORDERABLE', i+1, Piece(Items[i], U, 1), Piece(Items[i], U, 2));
with txtDietComment do {if Length(Text) > 0 then} Responses.Update('COMMENT', 1, Text, Text);
with cboDelivery do if Visible then Responses.Update('DELIVERY', 1, ItemID, Text);
with chkCancelTubefeeding do case State of
cbChecked: Responses.Update('CANCEL', 1, '1', 'YES');
cbUnchecked: Responses.Update('CANCEL', 1, '0', 'NO');
end;
with lstDietSelect do if (Items.Count = 1) and (GetIEN(0) = uDietParams.NPOIEN) then
begin
if Frac(calDietStart.FMDateTime) > 0.2358 then Responses.VarTrailing := 'at Midnight';
end
else Responses.VarTrailing := 'Diet';
memOrder.Text := Responses.OrderText;
end;
{ Tubefeeding tab --------------------------------------------------------------------------- }
procedure TfrmODDiet.ResetControlsTF;
begin
TFClearGrid;
chkCancelTrays.Checked := False;
calOPTFStart.Text := '';
txtTFComment.Text := '';
end;
procedure TfrmODDiet.SetValuesFromResponsesTF;
var
AnInstance: Integer;
AResponse: TResponse;
AProduct: TTFProduct;
begin
Changing := True; // Changing set!!
ResetControlsTF;
with Responses do
begin
AnInstance := NextInstance('ORDERABLE', 0);
while AnInstance > 0 do
begin
AResponse := FindResponseByName('ORDERABLE', AnInstance);
if AResponse <> nil then
begin
AProduct := TTFProduct.Create;
AProduct.IEN := StrToIntDef(AResponse.IValue, 0);
AProduct.Name := AResponse.EValue;
with grdSelected do
begin
if Objects[0, RowCount - 1] <> nil then RowCount := RowCount + 1;
Objects[0, RowCount - 1] := AProduct;
Cells[0, RowCount - 1] := AProduct.Name;
AResponse := FindResponseByName('STRENGTH', AnInstance);
if AResponse <> nil then Cells[1, RowCount - 1] := AResponse.EValue;
AResponse := FindResponseByName('INSTR', AnInstance);
if AResponse <> nil then Cells[2, RowCount - 1] := AResponse.EValue;
TFSetAmountForRow(RowCount - 1);
end;
end;
AnInstance := NextInstance('ORDERABLE', AnInstance);
end; {while AnInstance - ORDERABLE}
AResponse := FindResponseByName('CANCEL', 1);
if AResponse <> nil then chkCancelTrays.Checked := AResponse.IValue = '1';
if not OrderForInpatient then
begin
SetControl(cboOPTFRecurringMeals, 'DATETIME', 1);
SetControl(calOPTFStart, 'DATETIME', 1);
end;
SetControl(txtTFComment, 'COMMENT', 1);
end;
Changing := False; // Changing reset
TFChange(Self);
end;
procedure TfrmODDiet.TFClearGrid;
var
i: Integer;
begin
with grdSelected do for i := 0 to RowCount - 1 do
begin
TTFProduct(Objects[0, i]).Free;
Rows[i].Clear;
end;
grdSelected.RowCount := 1;
end;
procedure TfrmODDiet.cboProductMouseClick(Sender: TObject);
var
AProduct: TTFProduct;
begin
inherited;
// check quick order
if CharAt(cboProduct.ItemID, 1) = 'Q' then // setup quick order
begin
Responses.QuickOrder := ExtractInteger(cboProduct.ItemID);
SetValuesFromResponsesTF;
cboProduct.ItemIndex := -1;
Exit;
end;
if cboProduct.ItemIEN <= 0 then Exit;
AProduct := TTFProduct.Create;
AProduct.IEN := cboProduct.ItemIEN;
AProduct.Name := Piece(cboProduct.Items[cboProduct.ItemIndex], U, 3);
cboProduct.ItemIndex := -1;
with grdSelected do
begin
if Objects[0, RowCount - 1] <> nil then RowCount := RowCount + 1;
Objects[0, RowCount - 1] := AProduct;
Cells[0, RowCount - 1] := AProduct.Name;
Cells[1, RowCount - 1] := 'FULL';
Row := RowCount - 1;
Col := 1;
end;
OrderMessage(OIMessage(AProduct.IEN));
TFChange(Sender);
end;
procedure TfrmODDiet.cboProductExit(Sender: TObject);
begin
inherited;
if (cboProduct.ItemIEN > 0) or (CharAt(cboProduct.ItemID, 1) = 'Q') then
cboProductMouseClick(Self);
end;
procedure TfrmODDiet.grdSelectedDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
begin
inherited;
if Sender = ActiveControl then Exit;
if not (gdSelected in State) then Exit;
with Sender as TStringGrid do
begin
Canvas.Brush.Color := Color;
Canvas.Font := Font;
Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]);
end;
end;
procedure TfrmODDiet.grdSelectedSelectCell(Sender: TObject; Col, Row: Integer;
var CanSelect: Boolean);
procedure PlaceControl(AControl: TWinControl);
var
ARect: TRect;
begin
with AControl do
begin
ARect := grdSelected.CellRect(Col, Row);
SetBounds(ARect.Left + grdSelected.Left + 1, ARect.Top + grdSelected.Top + 1,
ARect.Right - ARect.Left + 1, ARect.Bottom - ARect.Top + 1);
BringToFront;
Show;
SetFocus;
end;
end;
begin
inherited;
if (Col <> 1) and (Col <> 2) then Exit;
if csDestroying in ComponentState then Exit;
if Col = 1 then
begin
cboStrength.ItemIndex :=cboStrength.Items.IndexOf(grdSelected.Cells[Col, Row]);
cboStrength.Tag := (Col * 256) + Row;
PlaceControl(cboStrength);
end;
if Col = 2 then
begin
txtQuantity.Text := grdSelected.Cells[Col, Row];
txtQuantity.Tag := (Col * 256) + Row;
PlaceControl(txtQuantity);
end;
end;
procedure TfrmODDiet.SetNextCell(ACol, ARow: Integer);
begin
FNextCol := ACol;
FNextRow := ARow;
end;
procedure TfrmODDiet.TFMoveToNextCell;
var
NextCol, NextRow: Integer;
begin
if (FNextCol < 0) or (FNextRow < 0) then Exit;
if (ActiveControl = grdSelected) and not (csLButtonDown in grdSelected.ControlState) then
begin
NextCol := FNextCol;
NextRow := FNextRow;
with grdSelected do if NextCol <> Col then Col := NextCol;
with grdSelected do if NextRow <> Row then Row := NextRow;
end;
end;
procedure TfrmODDiet.TFSetAmountForRow(ARow: Integer);
var
Product, Strength: Integer;
x: string;
begin
with grdSelected do
begin
if Objects[0, ARow] <> nil
then Product := TTFProduct(Objects[0, ARow]).IEN
else Product := 0;
Strength := TFStrengthCode(Cells[1, ARow]);
x := ExpandedQuantity(Product, Strength, Cells[2, ARow]);
if Length(x) > 0 then
begin
grdSelected.Cells[2, ARow] := Piece(x, U, 2);
grdSelected.Cells[3, ARow] := Piece(x, U, 1) + 'ml';
end
else grdSelected.Cells[3, ARow] := '';
end;
end;
function TfrmODDiet.TFStrengthCode(const x: string): Integer;
begin
Result := 0;
if x = '1/4' then Result := 1
else if x = '1/2' then Result := 2
else if x = '3/4' then Result := 3
else if x = 'FULL' then Result := 4;
end;
procedure TfrmODDiet.cboStrengthEnter(Sender: TObject);
begin
inherited;
SetNextCell(2, grdSelected.Row);
end;
procedure TfrmODDiet.cboStrengthKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
inherited;
with grdSelected do
case Key of
VK_LEFT: SetNextCell(0, Row);
VK_RIGHT: SetNextCell(2, Row);
end;
if Key in [VK_LEFT, VK_RIGHT] then
begin
Key := 0;
if not (csDestroying in ComponentState) then grdSelected.SetFocus;
end;
end;
procedure TfrmODDiet.cboStrengthChange(Sender: TObject);
begin
inherited;
with cboStrength do
begin
if Tag < 0 then Exit;
grdSelected.Cells[Tag div 256, Tag mod 256] := Text;
end;
TFChange(Sender);
end;
procedure TfrmODDiet.cboStrengthExit(Sender: TObject);
begin
inherited;
with cboStrength do
begin
grdSelected.Cells[Tag div 256, Tag mod 256] := Text;
TFSetAmountForRow(Tag mod 256);
Tag := -1;
Hide;
end;
TFChange(Sender);
TFMoveToNextCell;
end;
procedure TfrmODDiet.txtQuantityEnter(Sender: TObject);
begin
inherited;
SetNextCell(-1, -1);
end;
procedure TfrmODDiet.txtQuantityKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
inherited;
with grdSelected, txtQuantity do
case Key of
VK_UP: SetNextCell(Col, HigherOf(Row - 1, 0));
VK_DOWN: SetNextCell(Col, LowerOf(Row + 1, RowCount - 1));
VK_LEFT: if (SelLength = 0) and (SelStart = 0) then SetNextCell(1, Row);
VK_RIGHT: if (SelLength = 0) and (SelStart = Length(Text)) then SetNextCell(3, Row);
VK_END: if (SelLength = 0) and (SelStart = Length(Text)) then SetNextCell(3, Row);
VK_HOME: if (SelLength = 0) and (SelStart = 0) then SetNextCell(0, Row);
VK_PRIOR: SetNextCell(Col, 0);
VK_NEXT: SetNextCell(Col, RowCount - 1);
end;
if FNextCol > -1 then
begin
Key := 0;
if not (csDestroying in ComponentState) then grdSelected.SetFocus;
end;
end;
procedure TfrmODDiet.txtQuantityChange(Sender: TObject);
begin
inherited;
with txtQuantity do
begin
if Tag < 0 then Exit;
grdSelected.Cells[Tag div 256, Tag mod 256] := Text;
end;
TFChange(Sender);
end;
procedure TfrmODDiet.txtQuantityExit(Sender: TObject);
begin
inherited;
with txtQuantity do
begin
grdSelected.Cells[Tag div 256, Tag mod 256] := Text;
TFSetAmountForRow(Tag mod 256);
Tag := -1;
Hide;
end;
TFChange(Sender);
TFMoveToNextCell;
end;
procedure TfrmODDiet.cmdTFRemoveClick(Sender: TObject);
var
i: Integer;
begin
inherited;
with grdSelected do
begin
if Row < 0 then Exit;
if Objects[0, Row] <> nil then TTFProduct(Objects[0, Row]).Free;
for i := Row to RowCount - 2 do Rows[i] := Rows[i + 1];
Rows[RowCount - 1].Clear;
RowCount := RowCount - 1;
end;
TFChange(Sender);
end;
procedure TfrmODDiet.TFChange(Sender: TObject);
var
i: Integer;
AProduct: TTFProduct;
begin
inherited;
if Changing then Exit;
if Sender <> Self then Responses.Clear; // Sender=Self when called from SetupDialog
with grdSelected do for i := 0 to RowCount - 1 do
begin
AProduct := TTFProduct(Objects[0, i]);
if AProduct = nil then Continue;
with AProduct do if IEN > 0
then Responses.Update('ORDERABLE', i+1, IntToStr(IEN), Name);
if TFStrengthCode(Cells[1,i]) > 0
then Responses.Update('STRENGTH', i+1, IntToStr(TFStrengthCode(Cells[1,i])), Cells[1,i]);
if Length(Cells[2,i]) > 0
then Responses.Update('INSTR', i+1, Cells[2,i], Cells[2,i]);
end; {with grdSelected}
with txtTFComment do if Text <> ''
then Responses.Update('COMMENT', 1, Text, Text);
with chkCancelTrays do if Checked
then Responses.Update('CANCEL', 1, '1', 'Yes')
else Responses.Update('CANCEL', 1, '0', 'No');
if not OrderForInpatient then
begin
calOPTFStart.FMDateTime := StrToFloatDef(cboOPTFRecurringMeals.ItemID, 0);
Responses.Update('DATETIME', 1, FloatToStr(calOPTFStart.FMDateTime), calOPTFStart.Text);
end;
memOrder.Text := Responses.OrderText;
end;
{ Early/Late Tray tab ----------------------------------------------------------------------- }
procedure TfrmODDiet.ResetControlsEL;
begin
grpMeal.ItemIndex := 3;
grpMeal.TabStop := True;
grpMealTime.TabStop := False;
radET1.Visible := False;
radET2.Visible := False;
radET3.Visible := False;
radLT1.Visible := False;
radLT2.Visible := False;
radLT3.Visible := False;
lblNoTimes.Visible := False;
calELStart.Text := '';
calELStop.Text := '';
chkMonday.Checked := False;
chkTuesday.Checked := False;
chkWednesday.Checked := False;
chkThursday.Checked := False;
chkFriday.Checked := False;
chkSaturday.Checked := False;
chkSunday.Checked := False;
chkBagged.Checked := False;
end;
procedure TfrmODDiet.SetValuesFromResponsesEL;
var
AResponse: TResponse;
begin
Changing := True;
ResetControlsEL;
with Responses do
begin
AResponse := FindResponseByName('MEAL', 1);
if AResponse <> nil then
begin
if AResponse.IValue = 'B' then grpMeal.ItemIndex := 0;
if AResponse.IValue = 'N' then grpMeal.ItemIndex := 1;
if AResponse.IValue = 'E' then grpMeal.ItemIndex := 2;
end;
if grpMeal.ItemIndex <> 3 then grpMealClick(Self);
AResponse := FindResponseByName('TIME', 1);
if AResponse <> nil then
begin
if radET1.Caption = AResponse.IValue then radET1.Checked := True;
if radET2.Caption = AResponse.IValue then radET2.Checked := True;
if radET3.Caption = AResponse.IValue then radET3.Checked := True;
if radLT1.Caption = AResponse.IValue then radLT1.Checked := True;
if radLT2.Caption = AResponse.IValue then radLT2.Checked := True;
if radLT3.Caption = AResponse.IValue then radLT3.Checked := True;
end;
if not OrderForInpatient then
SetControl(cboOPELRecurringMeals, 'START', 1)
else
begin
SetControl(calELStart, 'START', 1);
SetControl(calELStop, 'STOP', 1);
end;
calELStopChange(Self);
AResponse := FindResponseByName('SCHEDULE', 1);
if AResponse <> nil then
begin
chkMonday.Checked := Pos('M', AResponse.IValue) > 0;
chkTuesday.Checked := Pos('T', AResponse.IValue) > 0;
chkWednesday.Checked := Pos('W', AResponse.IValue) > 0;
chkThursday.Checked := Pos('R', AResponse.IValue) > 0;
chkFriday.Checked := Pos('F', AResponse.IValue) > 0;
chkSaturday.Checked := Pos('S', AResponse.IValue) > 0;
chkSunday.Checked := Pos('X', AResponse.IValue) > 0;
end;
AResponse := FindResponseByName('YN', 1);
if AResponse <> nil then chkBagged.Checked := AResponse.IValue = '1';
end; {with Responses}
Changing := False;
ELChange(Self);
end;
function TfrmODDiet.GetMealTime: string;
begin
Result := '';
if radET1.Checked then Result := radET1.Caption;
if radET2.Checked then Result := radET2.Caption;
if radET3.Checked then Result := radET3.Caption;
if radLT1.Checked then Result := radLT1.Caption;
if radLT2.Checked then Result := radLT2.Caption;
if radLT3.Checked then Result := radLT3.Caption;
end;
function TfrmODDiet.GetDaysOfWeek: string;
begin
Result := '';
if chkMonday.Checked then Result := Result + 'M';
if chkTuesday.Checked then Result := Result + 'T';
if chkWednesday.Checked then Result := Result + 'W';
if chkThursday.Checked then Result := Result + 'R';
if chkFriday.Checked then Result := Result + 'F';
if chkSaturday.Checked then Result := Result + 'S';
if chkSunday.Checked then Result := Result + 'X';
end;
function TfrmODDiet.IsEarlyTray: Boolean;
begin
Result := True;
if radLT1.Checked then Result := False;
if radLT2.Checked then Result := False;
if radLT3.Checked then Result := False;
end;
procedure TfrmODDiet.grpMealClick(Sender: TObject);
procedure SetMealTimes(const x: string);
procedure ActivateButton( Button: TRadioButton; const MealTime: string;
var MoreActivated: boolean);
var
Activate: boolean;
begin
Button.Caption := MealTime;
Activate := Length(MealTime) > 0;
Button.Visible := Activate;
Button.Checked := Activate and not MoreActivated;
MoreActivated := MoreActivated or Activate;
end;
var
HasTimes: Boolean;
begin
HasTimes := False;
ActivateButton(radET1, Piece(x, U, 1), HasTimes);
ActivateButton(radET2, Piece(x, U, 2), HasTimes);
ActivateButton(radET3, Piece(x, U, 3), HasTimes);
ActivateButton(radLT1, Piece(x, U, 4), HasTimes);
ActivateButton(radLT2, Piece(x, U, 5), HasTimes);
ActivateButton(radLT3, Piece(x, U, 6), HasTimes);
lblNoTimes.Visible := not HasTimes;
end;
var
AMeal: string;
begin
inherited;
Changing := True;
case grpMeal.ItemIndex of
0: begin
SetMealTimes(uDietParams.BTimes);
AMeal := 'B';
end;
1: begin
SetMealTimes(uDietParams.NTimes);
AMeal := 'N';
end;
2: begin
SetMealTimes(uDietParams.ETimes);
AMeal := 'E';
end;
else
begin
SetMealTimes('');
AMeal := '';
end;
end;
if not OrderForInpatient then
begin
if AMeal = '' then
begin
uRecurringMealList.Clear;
cboOPELRecurringMeals.Clear;
end
else if not PatientHasRecurringMeals(uRecurringMealList, AMeal) then
begin
uRecurringMealList.Clear;
cboOPELRecurringMeals.Clear;
grpMeal.ItemIndex := 3;
end
else
cboOPELRecurringMeals.Items.Assign(uRecurringMealList);
end;
Changing := False;
ELChange(grpMeal);
end;
procedure TfrmODDiet.SetEnableDOW(AllowUse: Boolean);
begin
grpDOW.Enabled := AllowUse;
chkMonday.Enabled := AllowUse;
chkTuesday.Enabled := AllowUse;
chkWednesday.Enabled := AllowUse;
chkThursday.Enabled := AllowUse;
chkFriday.Enabled := AllowUse;
chkSaturday.Enabled := AllowUse;
chkSunday.Enabled := AllowUse;
end;
procedure TfrmODDiet.calELStartEnter(Sender: TObject);
begin
inherited;
FChangeStop := Length(calELStop.Text) = 0;
end;
procedure TfrmODDiet.calELStartChange(Sender: TObject);
begin
inherited;
if FChangeStop then
calELStop.Text := calELStart.Text
else
ELChange(Sender);
end;
procedure TfrmODDiet.calELStartExit(Sender: TObject);
begin
inherited;
if not OrderForInpatient then SetEnableDOW(False)
else if (Length(calELStop.Text) > 0) and (calELStop.Text = calELStart.Text)
then SetEnableDOW(False)
else SetEnableDOW(True);
end;
procedure TfrmODDiet.calELStopChange(Sender: TObject);
begin
inherited;
if (Length(calELStop.Text) > 0) and (calELStop.FMDateTime = calELStart.FMDateTime)
then SetEnableDOW(False)
else SetEnableDOW(True);
ELChange(Sender);
end;
procedure TfrmODDiet.ELChange(Sender: TObject);
var
x: string;
begin
inherited;
if Changing then Exit;
if Sender <> Self then Responses.Clear; // Sender=Self when called from SetupDialog
case grpMeal.ItemIndex of
0: Responses.Update('MEAL', 1, 'B', 'BREAKFAST');
1: Responses.Update('MEAL', 1, 'N', 'NOON');
2: Responses.Update('MEAL', 1, 'E', 'EVENING');
end;
x := GetMealTime;
if Length(x) > 0 then
begin
Responses.Update('TIME', 1, x, x);
if IsEarlyTray
then Responses.Update('ORDERABLE', 1, uDietParams.EarlyIEN, 'EARLY TRAY')
else Responses.Update('ORDERABLE', 1, uDietParams.LateIEN, 'LATE TRAY');
end;
if not OrderForInpatient then
begin
calELStart.FMDateTime := StrToFloatDef(cboOPELRecurringMeals.ItemID, 0);
calELStop.FMDateTime := calELStart.FMDateTime;
end;
with calELStart do if Length(Text) > 0 then Responses.Update('START', 1, Text, Text);
with calELStop do if Length(Text) > 0 then Responses.Update('STOP', 1, Text, Text);
x := GetDaysOfWeek;
if Length(x) > 0 then Responses.Update('SCHEDULE', 1, x, x);
if chkBagged.Checked
then Responses.Update('YN', 1, '1', 'YES')
else Responses.Update('YN', 1, '0', 'NO');
memOrder.Text := Responses.OrderText;
end;
{ Isolation Precautions tab ----------------------------------------------------------------- }
procedure TfrmODDiet.ResetControlsIP;
begin
lstIsolation.ItemIndex := -1;
txtIPComment.Text := '';
end;
procedure TfrmODDiet.SetValuesFromResponsesIP;
begin
Changing := True;
ResetControlsIP;
Responses.SetControl(lstIsolation, 'ISOLATION', 1);
Responses.SetControl(txtIPComment, 'COMMENT', 1);
Changing := False;
IPChange(Self);
end;
procedure TfrmODDiet.IPChange(Sender: TObject);
begin
inherited;
if Changing then Exit;
if Sender <> Self then Responses.Clear; // Sender=Self when called from SetupDialog
Responses.Update('ORDERABLE', 1, FIsolationID, 'Isolation Procedures');
with lstIsolation do if ItemIEN > 0
then Responses.Update('ISOLATION', 1, ItemID, DisplayText[ItemIndex]);
with txtIPComment do if Text <> ''
then Responses.Update('COMMENT', 1, Text, Text);
memOrder.Text := Responses.OrderText;
end;
{ Additional Diet Order tab ----------------------------------------------------------------- }
procedure TfrmODDiet.ResetControlsAO;
begin
txtAOComment.Text := '';
calOPAOStart.Text := '';
end;
procedure TfrmODDiet.SetValuesFromResponsesAO;
begin
Changing := True;
ResetControlsAO;
Responses.SetControl(txtAOComment, 'COMMENT', 1);
//Responses.SetControl(calOPAOStart, 'DATETIME', 1);
Responses.SetControl(cboOPAORecurringMeals, 'DATETIME', 1);
Changing := False;
AOChange(Self);
end;
procedure TfrmODDiet.AOChange(Sender: TObject);
begin
inherited;
if Changing then Exit;
with txtAOComment do if Text <> ''
then Responses.Update('COMMENT', 1, Text, Text);
if not OrderForInpatient then
begin
calOPAOStart.FMDateTime := StrToFloatDef(cboOPAORecurringMeals.ItemID, 0);
Responses.Update('DATETIME', 1, FloatToStr(calOPAOStart.FMDateTime), calOPAOStart.Text);
end;
memOrder.Text := Responses.OrderText;
end;
{ Outpatient Meals Order tab ----------------------------------------------------------------- }
procedure TfrmODDiet.cboOPDietAvailMouseClick(Sender: TObject);
var
NewDiet,ErrMsg: string;
procedure SetError(const AnError: string);
begin
if Length(ErrMsg) > 0 then Exit;
ErrMsg := AnError;
end;
begin
inherited;
if cboOPDietAvail.Items.Count = 0 then
begin
InfoBox(TX_NO_MEALS_DEFINED, TC_NO_MEALS_DEFINED, MB_OK or MB_ICONINFORMATION);
AbortOrder := True;
exit;
end ;
if CharAt(cboOPDietAvail.ItemID, 1) = 'Q' then // setup quick order
begin
Responses.QuickOrder := ExtractInteger(cboOPDietAvail.ItemID);
SetValuesFromResponsesOP;
cboOPDietAvail.ItemIndex := -1;
Exit;
end;
if cboOPDietAvail.ItemIEN > 0 then with lstOPDietSelect do
begin
ErrMsg := '';
NewDiet := DietAttributes(cboOPDietAvail.ItemIEN);
if Piece(NewDiet,'^',1)='0' then
begin
InfoBox(Piece(NewDiet,'^',2),TC_OP_DIET_ERR, MB_OK);
cboOPDietAvail.ItemIndex := -1;
Exit;
end;
lstOPDietSelect.Items.Clear;
lstOPDietSelect.Items.Add(NewDiet);
{ TODO -oRich V. -cOutpatient Meals : Will these be selectable for an outpatient meal? }
OPDietCheckForNPO;
{ TODO -oRich V. -cOutpatient Meals : Need to DC Tubefeeding order for OP meals? }
OPDietCheckForTF;
OrderMessage(OIMessage(StrToIntDef(Piece(NewDiet, U, 1), 0)));
OPChange(Sender);
end; {if cboOPDietAvail}
OPChange(Sender);
cboOPDietAvail.ItemIndex := -1;
end;
procedure TfrmODDiet.cboOPDietAvailExit(Sender: TObject);
begin
inherited;
if (cboOPDietAvail.ItemIEN > 0) or (CharAt(cboOPDietAvail.ItemID, 1) = 'Q') then
cboOPDietAvailMouseClick(Self);
end;
procedure TfrmODDiet.ResetControlsOP;
begin
lstOPDietSelect.Clear;
cboOPDietAvail.ItemIndex := -1;
grpOPMeal.ItemIndex := 3;
grpOPMeal.TabStop := True;
chkOPMonday.Checked := False;
chkOPTuesday.Checked := False;
chkOPWednesday.Checked := False;
chkOPThursday.Checked := False;
chkOPFriday.Checked := False;
chkOPSaturday.Checked := False;
chkOPSunday.Checked := False;
lblOPComment.Visible := False;
txtOPDietComment.Visible := False;
txtOPDietComment.Text := '';
if uDialogName = 'FHW OP MEAL' then
begin
calOPStart.Text := '';
calOPStop.Text := '';
calOPStart.Enabled := True;
calOPStop.Enabled := True;
lblOPStart.Enabled := True;
lblOPStop.Enabled := True;
grpOPDOW.Visible := True;
end
else if uDialogName = 'FHW SPECIAL MEAL' then
begin
calOPStart.Text := 'TODAY';
calOPStop.Text := 'TODAY';
calOPStart.Enabled := False;
calOPStop.Enabled := False;
lblOPStart.Enabled := False;
lblOPStop.Enabled := False;
grpOPDOW.Visible := False;
end;
end;
procedure TfrmODDiet.SetValuesFromResponsesOP;
var
AResponse: TResponse;
ADiet: string;
begin
Changing := True;
ResetControlsOP;
with Responses do
begin
AResponse := FindResponseByName('ORDERABLE', 1);
if AResponse <> nil then
begin
ADiet := DietAttributes(StrToIntDef(AResponse.IValue,0));
if Piece(ADiet,'^',1)='0' then
begin
InfoBox(Piece(ADiet,'^',2), TC_OP_DIET_ERR, MB_OK);
cboOPDietAvail.ItemIndex := -1;
Changing := False;
Exit;
end;
SetControl(cboOPDietAvail, 'ORDERABLE', 1);
lstOPDietSelect.Items.Add(ADiet);
end;
SetControl(cboOPDelivery, 'DELIVERY', 1);
AResponse := FindResponseByName('MEAL', 1);
if AResponse <> nil then
begin
if AResponse.IValue = 'B' then grpOPMeal.ItemIndex := 0;
if AResponse.IValue = 'N' then grpOPMeal.ItemIndex := 1;
if AResponse.IValue = 'E' then grpOPMeal.ItemIndex := 2;
end;
SetControl(calOPStart, 'START', 1);
SetControl(calOPStop, 'STOP', 1);
calOPStopChange(Self);
AResponse := FindResponseByName('SCHEDULE', 1);
if AResponse <> nil then
begin
chkOPMonday.Checked := Pos('M', AResponse.IValue) > 0;
chkOPTuesday.Checked := Pos('T', AResponse.IValue) > 0;
chkOPWednesday.Checked := Pos('W', AResponse.IValue) > 0;
chkOPThursday.Checked := Pos('R', AResponse.IValue) > 0;
chkOPFriday.Checked := Pos('F', AResponse.IValue) > 0;
chkOPSaturday.Checked := Pos('S', AResponse.IValue) > 0;
chkOPSunday.Checked := Pos('X', AResponse.IValue) > 0;
end;
SetControl(txtOPDietComment, 'COMMENT', 1);
end; {with Responses}
OPDietCheckForNPO;
OPDietCheckForTF;
Changing := False;
OPChange(Self);
end;
procedure TfrmODDiet.calOPStartEnter(Sender: TObject);
begin
inherited;
FChangeStop := Length(calOPStop.Text) = 0;
end;
procedure TfrmODDiet.calOPStartChange(Sender: TObject);
begin
inherited;
if Changing then exit;
if FChangeStop then
calOPStop.Text := calOPStart.Text
else
OPChange(Sender);
end;
function TfrmODDiet.FMDOW(AnFMDate: TFMDateTime): integer;
var
WinDate: TDateTime;
x: integer;
begin
WinDate := FMDateTimeToDateTime(AnFMDate);
x := DayOfTheWeek(WinDate);
Result := x;
end;
function TfrmODDiet.FMDays(AStart, AEnd: TFMDateTime): string;
var
AWinStart, AWinEnd: TDateTime;
i: double;
Days: string;
begin
AWinStart := FMDateTimeToDateTime(AStart);
AWinEnd := FMDateTimeToDateTime(AEnd);
i := AWinStart;
repeat
Days := Days + FMDayLetters[DayOfTheWeek(i)];
i := i + 1;
until i > AWinEnd;
Result := Days;
end;
procedure TfrmODDiet.calOPStartExit(Sender: TObject);
var
Days: string;
begin
inherited;
if not (calOPStart.FMDateTime > 0) then
begin
SetEnableOPDOW(False, -1);
Exit ;
end;
if (Length(calOPStop.Text) > 0) and (calOPStop.Text = calOPStart.Text) then
SetEnableOPDOW(False, FMDOW(calOPStart.FMDateTime))
else
begin
Days := FMDays(calOPStart.FMDateTime, calOPStop.FMDateTime);
SetEnableOPDOW(True, -1, Days);
end;
end;
procedure TfrmODDiet.calOPStopChange(Sender: TObject);
var
Days: string;
begin
inherited;
if Changing then exit;
if not (calOPStop.FMDateTime > 0) then
begin
SetEnableOPDOW(False, -1);
Exit ;
end;
if (Length(calOPStop.Text) > 0) and (calOPStop.FMDateTime = calOPStart.FMDateTime) then
SetEnableOPDOW(False, FMDOW(calOPStart.FMDateTime))
else
begin
Days := FMDays(calOPStart.FMDateTime, calOPStop.FMDateTime);
SetEnableOPDOW(True, -1, Days);
end;
OPChange(Sender);
end;
procedure TfrmODDiet.OPChange(Sender: TObject);
var
x: string;
//i: integer;
begin
inherited;
if Changing then Exit;
if Sender <> Self then Responses.Clear; // Sender=Self when called from SetupDialog
// Per NFS, only one selection allowed from any of 10-15 available OP diets
with lstOPDietSelect do if Items.Count > 0 then
Responses.Update('ORDERABLE', 1, Piece(Items[0], U, 1), Piece(Items[0], U, 2));
case grpOPMeal.ItemIndex of
0: Responses.Update('MEAL', 1, 'B', 'BREAKFAST');
1: Responses.Update('MEAL', 1, 'N', 'NOON');
2: Responses.Update('MEAL', 1, 'E', 'EVENING');
end;
with calOPStart do (*if Length(Text) > 0 then*) Responses.Update('START', 1, Text, Text);
with calOPStop do (*if Length(Text) > 0 then*) Responses.Update('STOP', 1, Text, Text);
if uDialogName = 'FHW OP MEAL' then
begin
x := GetOPDaysOfWeek;
if Length(x) = 0 then x := 'ONCE';
Responses.Update('SCHEDULE', 1, x, x);
end;
with txtOPDietComment do {if Length(Text) > 0 then} Responses.Update('COMMENT', 1, Text, Text);
with cboOPDelivery do if Visible then Responses.Update('DELIVERY', 1, ItemID, Text);
{ TODO -oRich V. -cOutpatient Meals : Need to DC Tubefeeding order for OP meals? }
(* with chkOPCancelTubefeeding do case State of
cbChecked: Responses.Update('CANCEL', 1, '1', 'YES');
cbUnchecked: Responses.Update('CANCEL', 1, '0', 'NO');
end;*)
Responses.VarTrailing := 'Meal';
memOrder.Text := Responses.OrderText;
end;
procedure TfrmODDiet.grpOPMealClick(Sender: TObject);
begin
inherited;
OPChange(Sender);
end;
procedure TfrmODDiet.SetEnableOPDOW(AllowUse: Boolean; OneTimeDay: integer; DaysToCheck: string = '');
var
i: integer;
begin
if (not AllowUse) and (OneTimeDay > -1) then
begin
for i := 0 to grpOPDOW.ControlCount - 1 do
begin
if grpOPDOW.Controls[i] is TCheckBox then
TCheckBox(grpOPDOW.Controls[i]).Checked := False;
end;
//TCheckBox(grpOPDOW.Controls[OneTimeDay - 1]).Checked := True; CQ #8305
end;
grpOPDOW.Enabled := AllowUse;
chkOPMonday.Enabled := AllowUse and (Pos('M', DaysToCheck) > 0);
chkOPTuesday.Enabled := AllowUse and (Pos('T', DaysToCheck) > 0);
chkOPWednesday.Enabled := AllowUse and (Pos('W', DaysToCheck) > 0);
chkOPThursday.Enabled := AllowUse and (Pos('R', DaysToCheck) > 0);
chkOPFriday.Enabled := AllowUse and (Pos('F', DaysToCheck) > 0);
chkOPSaturday.Enabled := AllowUse and (Pos('S', DaysToCheck) > 0);
chkOPSunday.Enabled := AllowUse and (Pos('X', DaysToCheck) > 0);
end;
function TfrmODDiet.GetOPDaysOfWeek: string;
begin
Result := '';
if chkOPMonday.Checked then Result := Result + 'M';
if chkOPTuesday.Checked then Result := Result + 'T';
if chkOPWednesday.Checked then Result := Result + 'W';
if chkOPThursday.Checked then Result := Result + 'R';
if chkOPFriday.Checked then Result := Result + 'F';
if chkOPSaturday.Checked then Result := Result + 'S';
if chkOPSunday.Checked then Result := Result + 'X';
end;
procedure TfrmODDiet.cmdOPRemoveClick(Sender: TObject);
begin
inherited;
with lstOPDietSelect do if ItemIndex > -1 then Items.Delete(ItemIndex);
OPChange(Sender);
with lstOPDietSelect do if Items.Count = 0 then
begin
lblOPDelivery.Visible := True;
cboOPDelivery.Visible := True;
{ TODO -oRich V. -cOutpatient Meals : Need to DC Tubefeeding order for OP meals? }
chkOPCancelTubefeeding.State := cbGrayed;
chkOPCancelTubefeeding.Visible := False;
end;
end;
function TfrmODDiet.GetOPMealWindow: string;
begin
case grpOPMeal.ItemIndex of
0: Result := Pieces(uDietParams.Alarms, U, 1, 2);
1: Result := Pieces(uDietParams.Alarms, U, 3, 4);
2: Result := Pieces(uDietParams.Alarms, U, 5, 6);
else
Result := U;
end;
end;
procedure TfrmODDiet.OPDietCheckForNPO;
begin
{ TODO -oRich V. -cOutpatient Meals : Need NFS input on this section (NPO and special instructions.) }
if Piece(lstOPDietSelect.Items[0], U, 2) = 'NPO' then
begin
lblOPDelivery.Visible := False;
cboOPDelivery.Visible := False;
lblOPComment.Visible := True;
txtOPDietComment.Visible := True;
end else
begin
lblOPComment.Visible := False;
txtOPDietComment.Visible := False;
txtOPDietComment.Text := '';
end;
end;
{ TODO -oRich V. -cOutpatient Meals : Need to DC Tubefeeding order for OP meals? }
procedure TfrmODDiet.OPDietCheckForTF;
var
x: string;
begin
with lstOPDietSelect do
begin
if (Items.Count = 1) and (Piece(Items[0], U, 2) <> 'NPO')
and (Length(uDietParams.CurTF) > 0) then
begin
x := TextForOrder(uDietParams.CurTF);
if InfoBox(TX_CANCEL_TF + x, TC_CANCEL_TF, MB_YESNO) = IDYES then
begin
chkOPCancelTubeFeeding.State := cbChecked;
chkOPCancelTubeFeeding.Visible := True;
end
else chkOPCancelTubeFeeding.State := cbUnchecked;
end; {if (Items...}
end; {with lstOPDietSelect}
end;
{ Common Buttons ---------------------------------------------------------------------------- }
procedure TfrmODDiet.cmdAcceptClick(Sender: TObject);
var
DCOrder: TOrder;
AResponse, AnotherResponse: TResponse;
LateTrayFields: TLateTrayFields;
NewOrder: TOrder;
CanSign: Integer;
begin
// these actions should be before inherited, so that InitDialog doesn't clear properties
LateTrayFields.LateMeal := #0; // #0 so only create late order if LT dialog invoked
if nbkDiet.ActivePage = pgeDiet then
begin
// create dc tubefeeding order
if chkCancelTubeFeeding.State = cbChecked then
begin
DCOrder := TOrder.Create;
DCOrder.ID := uDietParams.CurTF;
SendMessage(Application.MainForm.Handle, UM_NEWORDER, ORDER_DC, Integer(DCOrder));
DCOrder.Free;
end;
// check if late tray should be ordered
AResponse := Responses.FindResponseByName('ORDERABLE', 1);
if (Self.EvtID = 0) and (AResponse <> nil) and (Copy(AResponse.EValue, 1, 3) <> 'NPO') then
begin
AResponse := Responses.FindResponseByName('START', 1);
if AResponse <> nil then CheckLateTray(AResponse.IValue, LateTrayFields, False);
end;
end;
{ TODO -oRich V. -cOutpatient Meals : Need to DC Tubefeeding order for OP meals? }
if nbkDiet.ActivePage = pgeOutPt then
begin
// create dc tubefeeding order
if chkOPCancelTubeFeeding.State = cbChecked then
begin
DCOrder := TOrder.Create;
DCOrder.ID := uDietParams.CurTF;
SendMessage(Application.MainForm.Handle, UM_NEWORDER, ORDER_DC, Integer(DCOrder));
DCOrder.Free;
end;
// check if late tray should be ordered
AResponse := Responses.FindResponseByName('ORDERABLE', 1);
if (Self.EvtID = 0) and (AResponse <> nil) and (Copy(AResponse.EValue, 1, 3) <> 'NPO') then
begin
AResponse := Responses.FindResponseByName('START', 1);
AnotherResponse := Responses.FindResponseByName('MEAL', 1);
if (AResponse <> nil) and (AnotherResponse <> nil) then
CheckLateTray(AResponse.IValue, LateTrayFields, True, CharAt(AnotherResponse.IValue, 1));
end;
end;
inherited;
with LateTrayFields do if LateMeal <> #0 then
begin
NewOrder := TOrder.Create;
OrderLateTray(NewOrder, LateMeal, LateTime, IsBagged);
if NewOrder.ID <> '' then
begin
if OrderForInpatient then
begin
if (Encounter.Provider = User.DUZ) and User.CanSignOrders
then CanSign := CH_SIGN_YES
else CanSign := CH_SIGN_NA;
end
else
begin
CanSign := CH_SIGN_NA;
end;
Changes.Add(CH_ORD, NewOrder.ID, NewOrder.Text, '', CanSign);
SendMessage(Application.MainForm.Handle, UM_NEWORDER, ORDER_NEW, Integer(NewOrder))
end
else InfoBox(TX_EL_SAVE_ERR, TC_EL_SAVE_ERR, MB_OK);
NewOrder.Free;
end;
end;
procedure TfrmODDiet.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
if (Key = VK_TAB) then begin
if (ssCtrl in Shift) then begin
if not (ActiveControl is TCustomMemo) or not TMemo(ActiveControl).WantTabs then begin
nbkDiet.SelectNextPage( not (ssShift in Shift));
Key := 0;
end;
end;
end;
end;
procedure TfrmODDiet.cboOPDietAvailKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
if Key = VK_RETURN then cboOPDietAvailMouseClick(Self);
end;
function TfrmODDiet.PatientHasRecurringMeals(var MealList: TStringList; MealType: string = ''): boolean;
const
TX_NO_RECURRING_MEALS = 'For outpatients, this type of order requires association with an existing recurring' + CRLF +
'meal order. There are currently no active recurring meal orders for this patient.' + CRLF + CRLF +
'Those orders must be signed and released before they can be linked to this item.';
TC_NO_RECURRING_MEALS = 'Unable to order ' ;
begin
MealList.Clear;
GetCurrentRecurringOPMeals(MealList, MealType);
if MealList.Count = 0 then
begin
InfoBox(TX_NO_RECURRING_MEALS, TC_NO_RECURRING_MEALS + nbkDiet.ActivePage.Caption, MB_OK);
Result := False;
end
else
Result := True;
end;
end.