unit fOrderVw;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  fAutoSz, StdCtrls, ComCtrls, ExtCtrls, ORCtrls, ORFn, rOrders, ORDtTm;

type
  TfrmOrderView = class(TfrmAutoSz)
    pnlView: TPanel;
    lblView: TLabel;
    Panel1: TPanel;
    Panel2: TPanel;
    lblFilter: TLabel;
    trFilters: TCaptionTreeView;
    Panel3: TPanel;
    treService: TCaptionTreeView;
    lblService: TLabel;
    Panel4: TPanel;
    chkDateRange: TCheckBox;
    GroupBox1: TGroupBox;
    lblFrom: TLabel;
    lblThru: TLabel;
    calFrom: TORDateBox;
    calThru: TORDateBox;
    chkInvChrono: TCheckBox;
    chkByService: TCheckBox;
    cmdOK: TButton;
    cmdCancel: TButton;
    Splitter1: TSplitter;
    procedure FormCreate(Sender: TObject);
    procedure treServiceClick(Sender: TObject);
    procedure cmdCancelClick(Sender: TObject);
    procedure cmdOKClick(Sender: TObject);
    procedure chkDateRangeClick(Sender: TObject);
    procedure calChange(Sender: TObject);
    procedure trFiltersClick(Sender: TObject);
    procedure Splitter1Moved(Sender: TObject);
  private
    FChanged: Boolean;
    FDGroup: Integer;
    FDGroupName: string;
    FFilter: Integer;
    FFilterName: string;
    FInvChrono: Boolean;
    FByService: Boolean;
    FTimeFrom: TFMDateTime;
    FTimeThru: TFMDateTime;
    procedure LoadDGroups(const Parent: string; Node: TTreeNode);
    procedure LoadFilters(const Parent: string; Node: TTreeNode);
    procedure SynchViewData;
    procedure UpdateViewName;
  public
    { Public declarations }
  end;

procedure SelectOrderView(var OrderView: TOrderView);

implementation

{$R *.DFM}

const
  TX_DATES = 'To list orders for a specific date range, both From & Thru dates are required.';
  TC_DATES = 'Error in Date Range';

var
  uDGroupList: TStringList;
  uFilterList: TStringList;

procedure SelectOrderView(var OrderView: TOrderView);
var
  frmOrderView: TfrmOrderView;
begin
  frmOrderView := TfrmOrderView.Create(Application);
  try
    ResizeFormToFont(TForm(frmOrderView));
    with frmOrderView do
    begin
      FDGroup    := OrderView.DGroup;
      FFilter    := OrderView.Filter;
      FInvChrono := OrderView.InvChrono;
      FByService := OrderView.ByService;
      FTimeFrom  := OrderView.TimeFrom;
      FTimeThru  := OrderView.TimeThru;
      SynchViewData;
      ShowModal;
      if FChanged then
      begin
        OrderView.Changed   := FChanged;
        OrderView.DGroup    := FDGroup;
        OrderView.Filter    := FFilter;
        OrderView.InvChrono := FInvChrono;
        OrderView.ByService := FByService;
        OrderView.TimeFrom  := FTimeFrom;
        OrderView.TimeThru  := FTimeThru;
        OrderView.CtxtTime  := 0;                // set by RefreshOrderList
        OrderView.TextView  := 0;                // set by RefreshOrderList
        OrderView.ViewName  := lblView.Caption;
        OrderView.EventDelay.EventType := 'C';
        OrderView.EventDelay.Specialty := 0;     // treating specialty only for event delayed
        OrderView.EventDelay.Effective := 0;     // effective date only for discharge orders
      end
      else OrderView.Changed := False;
    end; {with}
  finally
    frmOrderView.Release;
  end;
end;

procedure TfrmOrderView.FormCreate(Sender: TObject);
begin
  inherited;
  FChanged := False;
  uDGroupList  := TStringList.Create;
  uFilterList := TStringList.Create;
  try
    ListDGroupAll(uDGroupList);
    LoadDGroups('0', nil);

    ListOrderFiltersAll(uFilterList);
    LoadFilters('0', nil);
  finally
    uDGroupList.Free;
    uDGroupList := nil;
    uFilterList.Free;
    uFilterList := nil;    
  end;
end;

procedure TfrmOrderView.UpdateViewName;
const
  FMT_TIME = 'mm/dd/yy';
var
  DateText, FilterText: string;
begin
  if chkDateRange.Checked
    then DateText := ' ('     + FormatFMDateTime(FMT_TIME, calFrom.FMDateTime) +
                     ' thru ' + FormatFMDateTIme(FMT_TIME, calThru.FMDateTime) + ')'
    else DateText := '';
  if FFilter in [6, 8, 9, 10, 19, 20]
    then FilterText := FFilterName
    else FilterText := FFilterName + ' Orders';
  lblView.Caption := FilterText + ' - ' + FDGroupName + DateText;
end;

procedure TfrmOrderView.SynchViewData;
var
  i: Integer;
begin
  with treService.Items do for i := 0 to Count - 1 do if Integer(Item[i].Data) = FDGroup then
  begin
    Item[i].Expanded := True;
    Item[i].Selected := True;
    FDGroupName := Item[i].Text;
    Break;
  end;

  with trFilters.Items do for i := 0 to Count - 1 do if Integer(Item[i].Data) = FFilter then
  begin
    Item[i].Expanded := True;
    Item[i].Selected := True;
    FDGroupName := Item[i].Text;
    Break;
  end;

  if (FTimeFrom > 0) or (FTimeThru > 0) then
  begin
    calFrom.FMDateTime := FTimeFrom;
    calThru.FMDateTime := FTimeThru;
    chkDateRange.Checked := True;
    chkDateRangeClick(Self);
  end;
  UpdateViewName;
  chkByService.Checked := FByService;
  chkInvChrono.Checked := FInvChrono;
end;

procedure TfrmOrderView.LoadDGroups(const Parent: string; Node: TTreeNode);
var
  MyID, MyParent, Name: string;
  i, IEN: Integer;
  ChildNode: TTreeNode;
  HasChildren: Boolean;
begin
  with uDGroupList do for i := 0 to Count - 1 do
  begin
    MyParent := Piece(Strings[i], U, 3);
    if MyParent = Parent then
    begin
      MyID := Piece(Strings[i], U, 1);
      IEN  := StrToIntDef(MyID, 0);
      Name := Piece(Strings[i], U, 2);
      HasChildren := Piece(Strings[i], U, 4) = '+';
      ChildNode := treService.Items.AddChildObject(Node, Name, Pointer(IEN));
      if HasChildren then LoadDGroups(MyID, ChildNode);
    end;
  end;
end;

procedure TfrmOrderView.LoadFilters(const Parent: string; Node: TTreeNode);
var
  MyID, MyParent, Name: string;
  i, IEN: Integer;
  ChildNode: TTreeNode;
  HasChildren: Boolean;
begin
  with uFilterList do for i := 0 to Count - 1 do
  begin
    MyParent := Piece(Strings[i], U, 3);
    if MyParent = Parent then
    begin
      MyID := Piece(Strings[i], U, 1);
      IEN  := StrToIntDef(MyID, 0);
      Name := Piece(Strings[i], U, 2);
      HasChildren := Piece(Strings[i], U, 4) = '+';
      ChildNode := trFilters.Items.AddChildObject(Node, Name, Pointer(IEN));
      if HasChildren then LoadFilters(MyID, ChildNode);
    end;
  end;
end;

procedure TfrmOrderView.treServiceClick(Sender: TObject);
var
  Node: TTreeNode;
begin
  inherited;
  Node := treService.Selected;
  if Node <> nil then
  begin
    FDGroup := Integer(Node.Data);
    FDGroupName := Node.Text;
    UpdateViewName;
  end;
end;

procedure TfrmOrderView.chkDateRangeClick(Sender: TObject);
begin
  inherited;
  lblThru.Enabled := chkDateRange.Checked;
  calThru.Enabled := chkDateRange.Checked;
  lblFrom.Enabled := chkDateRange.Checked;
  calFrom.Enabled := chkDateRange.Checked;
  if chkDateRange.Checked then
  begin
    calFrom.Color := clWindow;
    calThru.Color := clWindow;
    if calThru.FMDateTime = 0 then calThru.Text := 'NOW';
  end else
  begin
    calFrom.FMDateTime := 0;
    calThru.FMDateTime := 0;
    calFrom.Color := clBtnFace;
    calThru.Color := clBtnFace;
  end;
  UpdateViewName;
end;

procedure TfrmOrderView.calChange(Sender: TObject);
begin
  inherited;
  UpdateViewName;
end;

procedure TfrmOrderView.cmdOKClick(Sender: TObject);
begin
  inherited;
  if chkDateRange.Checked and ((not calFrom.IsValid) or (not calThru.IsValid)) then
  begin
    InfoBox(TX_DATES, TC_DATES, MB_OK);
    Exit;
  end;
  if chkDateRange.Checked then
  begin
    FTimeFrom := calFrom.FMDateTime;
    FTimeThru := calThru.FMDateTime;
  end else
  begin
    FTimeFrom := 0;
    FTimeThru := 0;
  end;
  FChanged := True;
  FInvChrono := chkInvChrono.Checked;
  FByService := chkByService.Checked;
  Close;
end;

procedure TfrmOrderView.cmdCancelClick(Sender: TObject);
begin
  inherited;
  Close;
end;

procedure TfrmOrderView.trFiltersClick(Sender: TObject);
var
  Node: TTreeNode;
begin
  inherited;
  Node := trFilters.Selected;
  if Node <> nil then
  begin
    FFilter := Integer(Node.Data);
    FFilterName := Node.Text;
    if FFilter = 2 then                          // disallow date range for active orders view
    begin
      chkDateRange.Checked := False;
      chkDateRangeClick(Self);
    end;
    if FFilter in [8, 9, 10, 20] then chkDateRange.Checked := True else
    begin
      if (calFrom.Text = '') and (calThru.Text = '') then chkDateRange.Checked := False;
    end;
    UpdateViewName;
  end;
end;

procedure TfrmOrderView.Splitter1Moved(Sender: TObject);
begin
  inherited;
  Splitter1.Align := alNone;
  Splitter1.Align := alLeft;
end;

end.
