VistA-cprs/CPRS-Chart/fPtSelOptns.pas

411 lines
14 KiB
Plaintext

unit fPtSelOptns;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ORDtTmRng, ORCtrls, StdCtrls, ExtCtrls, ORFn, fBase508Form,
VA508AccessibilityManager;
type
TSetCaptionTopProc = procedure of object;
TSetPtListTopProc = procedure(IEN: Int64) of object;
TfrmPtSelOptns = class(TfrmBase508Form)
orapnlMain: TORAutoPanel;
bvlPtList: TORAutoPanel;
lblPtList: TLabel;
lblDateRange: TLabel;
cboList: TORComboBox;
cboDateRange: TORComboBox;
calApptRng: TORDateRangeDlg;
radDflt: TRadioButton;
radProviders: TRadioButton;
radTeams: TRadioButton;
radSpecialties: TRadioButton;
radClinics: TRadioButton;
radWards: TRadioButton;
radAll: TRadioButton;
procedure radHideSrcClick(Sender: TObject);
procedure radShowSrcClick(Sender: TObject);
procedure radLongSrcClick(Sender: TObject);
procedure cboListExit(Sender: TObject);
procedure cboListKeyPause(Sender: TObject);
procedure cboListMouseClick(Sender: TObject);
procedure cboListNeedData(Sender: TObject; const StartFrom: String;
Direction, InsertAt: Integer);
procedure cboDateRangeExit(Sender: TObject);
procedure cboDateRangeMouseClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FLastTopList: string;
FLastDateIndex: Integer;
FSrcType: Integer;
FSetCaptionTop: TSetCaptionTopProc;
FSetPtListTop: TSetPtListTopProc;
procedure HideDateRange;
procedure ShowDateRange;
public
function IsLast5(x: string): Boolean;
function IsFullSSN(x: string): Boolean;
procedure cmdSaveListClick(Sender: TObject);
procedure SetDefaultPtList(Dflt: string);
procedure UpdateDefault;
property LastTopList: string read FLastTopList write FLastTopList;
property SrcType: Integer read FSrcType write FSrcType;
property SetCaptionTopProc: TSetCaptionTopProc read FSetCaptionTop write FSetCaptionTop;
property SetPtListTopProc: TSetPtListTopProc read FSetPtListTop write FSetPtListTop;
end;
const
{ constants referencing the value of the tag property in components }
TAG_SRC_DFLT = 11; // default patient list
TAG_SRC_PROV = 12; // patient list by provider
TAG_SRC_TEAM = 13; // patient list by team
TAG_SRC_SPEC = 14; // patient list by treating specialty
TAG_SRC_CLIN = 16; // patient list by clinic
TAG_SRC_WARD = 17; // patient list by ward
TAG_SRC_ALL = 18; // all patients
var
frmPtSelOptns: TfrmPtSelOptns;
clinDoSave, clinSaveToday: boolean;
clinDefaults: string;
implementation
{$R *.DFM}
uses
rCore, fPtSelOptSave, fPtSel, VA508AccessibilityRouter;
const
TX_LS_DFLT = 'This is already saved as your default patient list settings.';
TX_LS_PROV = 'A provider must be selected to save patient list settings.';
TX_LS_TEAM = 'A team must be selected to save patient list settings.';
TX_LS_SPEC = 'A specialty must be selected to save patient list settings.';
TX_LS_CLIN = 'A clinic and a date range must be selected to save settings for a clinic.';
TX_LS_WARD = 'A ward must be selected to save patient list settings.';
TC_LS_FAIL = 'Unable to Save Patient List Settings';
TX_LS_SAV1 = 'Save ';
TX_LS_SAV2 = CRLF + 'as your default patient list setting?';
TC_LS_SAVE = 'Save Patient List Settings';
function TfrmPtSelOptns.IsLast5(x: string): Boolean;
{ returns true if string matchs patterns: A9999 or 9999 (BS & BS5 xrefs for patient lookup) }
var
i: Integer;
begin
Result := False;
if not ((Length(x) = 4) or (Length(x) = 5)) then Exit;
if Length(x) = 5 then
begin
if not (x[1] in ['A'..'Z', 'a'..'z']) then Exit;
x := Copy(x, 2, 4);
end;
for i := 1 to 4 do if not (x[i] in ['0'..'9']) then Exit;
Result := True;
end;
function TfrmPtSelOptns.IsFullSSN(x: string): boolean;
var
i: integer;
begin
Result := False;
if (Length(x) < 9) or (Length(x) > 12) then Exit;
case Length(x) of
9: // no dashes, no 'P'
for i := 1 to 9 do if not (x[i] in ['0'..'9']) then Exit;
10: // no dashes, with 'P'
begin
for i := 1 to 9 do if not (x[i] in ['0'..'9']) then Exit;
if (Uppercase(x[10]) <> 'P') then Exit;
end;
11: // dashes, no 'P'
begin
if (x[4] <> '-') or (x[7] <> '-') then Exit;
x := Copy(x,1,3) + Copy(x,5,2) + Copy(x,8,4);
for i := 1 to 9 do if not (x[i] in ['0'..'9']) then Exit;
end;
12: // dashes, with 'P'
begin
if (x[4] <> '-') or (x[7] <> '-') then Exit;
x := Copy(x,1,3) + Copy(x,5,2) + Copy(x,8,5);
for i := 1 to 9 do if not (x[i] in ['0'..'9']) then Exit;
if UpperCase(x[10]) <> 'P' then Exit;
end;
end;
Result := True;
end;
procedure TfrmPtSelOptns.radHideSrcClick(Sender: TObject);
{ called by radDflt & radAll - hides list source combo box and refreshes patient list }
begin
cboList.Pieces := '2';
FSrcType := TControl(Sender).Tag;
FLastTopList := '';
HideDateRange;
cboList.Visible := False;
cboList.Caption := TRadioButton(Sender).Caption;
FSetCaptionTop;
FSetPtListTop(0);
end;
procedure TfrmPtSelOptns.radShowSrcClick(Sender: TObject);
{ called by radTeams, radSpecialties, radWards - shows items for the list source }
begin
cboList.Pieces := '2';
FSrcType := TControl(Sender).Tag;
FLastTopList := '';
HideDateRange;
FSetCaptionTop;
with cboList do
begin
Clear;
LongList := False;
Sorted := True;
case FSrcType of
TAG_SRC_TEAM: ListTeamAll(Items);
TAG_SRC_SPEC: ListSpecialtyAll(Items);
TAG_SRC_WARD: ListWardAll(Items);
end;
Visible := True;
end;
cboList.Caption := TRadioButton(Sender).Caption;
end;
procedure TfrmPtSelOptns.radLongSrcClick(Sender: TObject);
{ called by radProviders, radClinics - switches to long list & shows items for the list source }
begin
cboList.Pieces := '2';
FSrcType := TControl(Sender).Tag;
FLastTopList := '';
FSetCaptionTop;
with cboList do
begin
Sorted := False;
LongList := True;
Clear;
case FSrcType of
TAG_SRC_PROV: begin
cboList.Pieces := '2,3';
HideDateRange;
ListProviderTop(Items);
end;
TAG_SRC_CLIN: begin
ShowDateRange;
ListClinicTop(Items);
end;
end;
InitLongList('');
Visible := True;
end;
cboList.Caption := TRadioButton(Sender).Caption;
end;
procedure TfrmPtSelOptns.cboListExit(Sender: TObject);
begin
with cboList do if ItemIEN > 0 then FSetPtListTop(ItemIEN);
end;
procedure TfrmPtSelOptns.cboListKeyPause(Sender: TObject);
begin
with cboList do if ItemIEN > 0 then FSetPtListTop(ItemIEN);
end;
procedure TfrmPtSelOptns.cboListMouseClick(Sender: TObject);
begin
with cboList do if ItemIEN > 0 then FSetPtListTop(ItemIEN);
end;
procedure TfrmPtSelOptns.cboListNeedData(Sender: TObject; const StartFrom: String; Direction, InsertAt: Integer);
{CQ6363 Notes: This procedure was altered for CQ6363, but then changed back to its original form, as it is now.
The problem is that in LOM1T, there are numerous entries in the HOSPITAL LOCATION file (44) that are lower-case,
resulting in a "B" xref that looks like this:
^SC("B","module 1x",2897) =
^SC("B","pt",3420) =
^SC("B","read",3146) =
^SC("B","zz GIM/WONG NEW",2902) =
^SC("B","zz bhost/arm",3076) =
^SC("B","zz bhost/day",2698) =
^SC("B","zz bhost/eve/ornelas",2885) =
^SC("B","zz bhost/resident",2710) =
^SC("B","zz bhost/sws",2946) =
^SC("B","zz c&P ortho/patel",3292) =
^SC("B","zz mhc md/kelley",320) =
^SC("B","zz/mhc/p",1076) =
^SC("B","zzMHC MD/THRASHER",1018) =
^SC("B","zztest clinic",3090) =
^SC("B","zzz-hbpc-phone-jung",1830) =
^SC("B","zzz-hbpcphone cocohran",1825) =
^SC("B","zzz-home service",1428) =
^SC("B","zzz-phone-deloye",1834) =
^SC("B","zzz/gmonti impotence",2193) =
ASCII sort mode puts those entries at the end of the "B" xref, but when retrieved by CPRS and upper-cased, it
messes up the logic of the combo box. This problem has been around since there was a CPRS GUI, and the best
possible fix is to require those entries to either be in all uppercase or be removed. If that's cleaned up,
the logic below will work correctly.
}
begin
case frmPtSelOptns.SrcType of
TAG_SRC_PROV: cboList.ForDataUse(SubSetOfProviders(StartFrom, Direction));
TAG_SRC_CLIN: cboList.ForDataUse(SubSetOfClinics(StartFrom, Direction));
end;
end;
procedure TfrmPtSelOptns.HideDateRange;
begin
lblDateRange.Hide;
cboDateRange.Hide;
cboList.Height := cboDateRange.Top - cboList.Top + cboDateRange.Height;
end;
procedure TfrmPtSelOptns.ShowDateRange;
var
DateString, DRStart, DREnd: string;
TStart, TEnd: boolean;
begin
with cboDateRange do if Items.Count = 0 then
begin
ListDateRangeClinic(Items);
ItemIndex := 0;
end;
DateString := DfltDateRangeClinic; // Returns "^T" even if no settings.
DRStart := piece(DateString,U,1);
DREnd := piece(DateString,U,2);
if (DRStart <> ' ') then
begin
TStart := false;
TEnd := false;
if ((DRStart = 'T') or (DRStart = 'TODAY')) then
TStart := true;
if ((DREnd = 'T') or (DREnd = 'TODAY')) then
TEnd := true;
if not (TStart and TEnd) then
cboDateRange.ItemIndex := cboDateRange.Items.Add(DRStart + ';' +
DREnd + U + DRStart + ' to ' + DREnd);
end;
cboList.Height := lblDateRange.Top - cboList.Top - 4;
lblDateRange.Show;
cboDateRange.Show;
end;
procedure TfrmPtSelOptns.cboDateRangeExit(Sender: TObject);
begin
if cboDateRange.ItemIndex <> FLastDateIndex then cboDateRangeMouseClick(Self);
end;
procedure TfrmPtSelOptns.cboDateRangeMouseClick(Sender: TObject);
begin
if (cboDateRange.ItemID = 'S') then
begin
with calApptRng do if Execute
then cboDateRange.ItemIndex := cboDateRange.Items.Add(RelativeStart + ';' +
RelativeStop + U + TextOfStart + ' to ' + TextOfStop)
else cboDateRange.ItemIndex := -1;
end;
FLastDateIndex := cboDateRange.ItemIndex;
if cboList.ItemIEN > 0 then FSetPtListTop(cboList.ItemIEN);
end;
procedure TfrmPtSelOptns.cmdSaveListClick(Sender: TObject);
var
x: string;
begin
x := '';
case FSrcType of
TAG_SRC_DFLT: InfoBox(TX_LS_DFLT, TC_LS_FAIL, MB_OK);
TAG_SRC_PROV: if cboList.ItemIEN <= 0
then InfoBox(TX_LS_PROV, TC_LS_FAIL, MB_OK)
else x := 'P^' + IntToStr(cboList.ItemIEN) + U + U +
'Provider = ' + cboList.Text;
TAG_SRC_TEAM: if cboList.ItemIEN <= 0
then InfoBox(TX_LS_TEAM, TC_LS_FAIL, MB_OK)
else x := 'T^' + IntToStr(cboList.ItemIEN) + U + U +
'Team = ' + cboList.Text;
TAG_SRC_SPEC: if cboList.ItemIEN <= 0
then InfoBox(TX_LS_SPEC, TC_LS_FAIL, MB_OK)
else x := 'S^' + IntToStr(cboList.ItemIEN) + U + U +
'Specialty = ' + cboList.Text;
TAG_SRC_CLIN: if (cboList.ItemIEN <= 0) or (Pos(';', cboDateRange.ItemID) = 0)
then InfoBox(TX_LS_CLIN, TC_LS_FAIL, MB_OK)
else
begin
clinDefaults := 'Clinic = ' + cboList.Text + ', ' + cboDaterange.text;
frmPtSelOptSave := TfrmPtSelOptSave.create(Application); // Calls dialogue form for user input.
frmPtSelOptSave.showModal;
frmPtSelOptSave.free;
if (not clinDoSave) then
Exit;
if clinSaveToday then
x := 'CT^' + IntToStr(cboList.ItemIEN) + U + cboDateRange.ItemID + U +
'Clinic = ' + cboList.Text + ', ' + cboDateRange.Text
else
x := 'C^' + IntToStr(cboList.ItemIEN) + U + cboDateRange.ItemID + U +
'Clinic = ' + cboList.Text + ', ' + cboDateRange.Text;
end;
TAG_SRC_WARD: if cboList.ItemIEN <= 0
then InfoBox(TX_LS_WARD, TC_LS_FAIL, MB_OK)
else x := 'W^' + IntToStr(cboList.ItemIEN) + U + U +
'Ward = ' + cboList.Text;
TAG_SRC_ALL : x := 'A';
end;
if (x <> '') then
begin
if not (FSrcType = TAG_SRC_CLIN) then // Clinics already have a "confirm" d-box.
begin
if (InfoBox(TX_LS_SAV1 + Piece(x, U, 4) + TX_LS_SAV2, TC_LS_SAVE, MB_YESNO) = IDYES) then
begin
SavePtListDflt(x);
UpdateDefault;
end;
end
else // Skip second confirmation box for clinics.
begin
SavePtListDflt(x);
UpdateDefault;
end;
end;
end;
procedure TfrmPtSelOptns.FormCreate(Sender: TObject);
begin
FLastDateIndex := -1;
end;
procedure TfrmPtSelOptns.SetDefaultPtList(Dflt: string);
begin
if Length(Dflt) > 0 then // if default patient list available, use it
begin
radDflt.Caption := '&Default: ' + Dflt;
radDflt.Checked := True; // causes radHideSrcClick to be called
end
else // otherwise, select from all patients
begin
radDflt.Enabled := False;
radAll.Checked := True; // causes radHideSrcClick to be called
bvlPtList.TabStop := True;
bvlPtList.Hint := 'No default radio button unavailable 1 of 7 to move to the other patient list categories press tab';
// fixes CQ #4716: 508 - No Default rad btn on Patient Selection screen doesn't read in JAWS. [CPRS v28.1] (TC).
end;
end;
procedure TfrmPtSelOptns.UpdateDefault;
begin
FSrcType := TAG_SRC_DFLT;
fPtSel.FDfltSrc := DfltPtList; // Server side default setting: "DfltPtList" is in rCore.
fPtSel.FDfltSrcType := Piece(fPtSel.FDfltSrc, U, 2);
fPtSel.FDfltSrc := Piece(fPtSel.FDfltSrc, U, 1);
if (IsRPL = '1') then // Deal with restricted patient list users.
fPtSel.FDfltSrc := '';
SetDefaultPtList(fPtSel.FDfltSrc);
end;
initialization
SpecifyFormIsNotADialog(TfrmPtSelOptns);
end.