unit fBAOptionsDiagnoses; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, fAutoSz, StdCtrls, ORCtrls, ExtCtrls, ORFn, UCore, RCore, ORNet, UBAGlobals, fPCELex, rPCE, Buttons, UBACore, UBAMessages, UBAConst, ComCtrls; type TfrmBAOptionsDiagnoses = class(TfrmAutoSz) Panel1: TPanel; Panel2: TPanel; Splitter1: TSplitter; Splitter2: TSplitter; Splitter3: TSplitter; pnlBottom: TPanel; btnOther: TButton; btnOK: TButton; Panel3: TPanel; lbSections: TORListBox; Panel4: TPanel; lbDiagnosis: TORListBox; Panel5: TPanel; lbPersonalDx: TORListBox; pnlTop: TPanel; Panel7: TPanel; btnAdd: TBitBtn; btnDelete: TBitBtn; Splitter5: TSplitter; Button1: TButton; StaticText3: TStaticText; hdrCntlDx: THeaderControl; hdrCntlDxSections: THeaderControl; hdrCntlDxAdd: THeaderControl; procedure FormCreate(Sender: TObject); procedure btnOtherClick(Sender: TObject); procedure lbSectionsClick(Sender: TObject); procedure lbSectionsEnter(Sender: TObject); procedure lbDiagnosisClick(Sender: TObject); procedure btnCancelClick(Sender: TObject); procedure btnOKClick(Sender: TObject); procedure btnAddClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject); procedure lbDiagnosisChange(Sender: TObject); procedure lbPersonalDxClick(Sender: TObject); procedure lbDiagnosisEnter(Sender: TObject); procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormActivate(Sender: TObject); function IsDXInList(ADXCode: string):boolean; procedure LoadPersonalDxList; procedure btnRemoveAllClick(Sender: TObject); procedure btnAddAllClick(Sender: TObject); procedure hdrCntlDxSectionClick(HeaderControl: THeaderControl; Section: THeaderSection); procedure FormResize(Sender: TObject); private { Private declarations } procedure LoadEncounterDx; procedure ListDiagnosesSections(Dest: TStrings); procedure AddProblemsToDxList; procedure ListDiagnosesCodes(Section: String); procedure InactiveICDNotification; procedure SyncDxDeleteList; procedure SyncDxNewList; public { Public declarations } end; var uAddToP : integer; uDeleteFromPDL: integer; uNewDxList : TStringList; Problems : TStringList; DxList : TStringList; ECFDiagnoses : TStringList; tmplst : TStringList; newDxLst : TStringList; delDxLst : TStringList; inactiveCodes : integer; procedure DialogOptionsDiagnoses(topvalue, leftvalue, fontsize: integer; var actiontype: Integer); implementation {$R *.dfm} var LastDFN : string; LastLocation : integer; FDxSection: string; BADxCode: String; procedure DialogOptionsDiagnoses(topvalue, leftvalue, fontsize: integer; var actiontype: Integer); var frmBAOptionsDiagnoses: TfrmBAOptionsDiagnoses; begin frmBAOptionsDiagnoses := TfrmBAOptionsDiagnoses.Create(Application); actiontype := 0; with frmBAOptionsDiagnoses do begin if (topvalue < 0) or (leftvalue < 0) then Position := poScreenCenter else begin Position := poDesigned; Top := topvalue; Left := leftvalue; end; ResizeAnchoredFormToFont(frmBAOptionsDiagnoses); ShowModal; end; end; procedure TfrmBAOptionsDiagnoses.FormCreate(Sender: TObject); begin inactiveCodes := 0; LoadEncounterDx; ListDiagnosesSections(lbSections.Items); // lbPersonalDx.Items := rpcGetPersonalDxList(User.DUZ); LoadPersonalDxList; btnOK.Enabled := False; hdrCntlDx.Sections[0].Width := lbPersonalDX.Width; hdrCntlDxSections.Sections[0].Width := lbSections.Width; hdrCntlDxAdd.Sections[0].Width := lbDiagnosis.Width; // lbPersonalDx.Sorted := false; // lbPersonalDx.Sorted := True; lbPersonalDX.Repaint; end; procedure TfrmBAOptionsDiagnoses.LoadEncounterDx; { load the major coding lists that are used by the encounter form for a given location } var i: integer; TempList: TStringList; EncDt: TFMDateTime; begin Caption := 'Personal Diagnoses List for ' + User.Name; LastLocation := Encounter.Location; EncDt := Trunc(FMToday); //add problems to the top of diagnoses. TempList := TstringList.Create; DxList.clear; tCallV(TempList,'ORWPCE DIAG', [LastLocation, EncDt]); DxList.add(templist.strings[0]); AddProblemsToDxList; for i := 1 to (TempList.Count-1) do begin DxList.add(Templist.strings[i]); end; end; procedure TfrmBAOptionsDiagnoses.ListDiagnosesSections(Dest: TStrings); var i: Integer; x: string; begin for i := 0 to DxList.Count - 1 do if CharAt(DxList[i], 1) = U then begin x := Piece(DxList[i], U, 2); if Length(x) = 0 then x := ''; Dest.Add(IntToStr(i) + U + Piece(DxList[i], U, 2) + U + x); end; end; procedure TfrmBAOptionsDiagnoses.ListDiagnosesCodes(Section: String); var i,j: integer; a: string; begin lbDiagnosis.Clear; a := ''; for i := 0 to DxList.Count-1 do begin a := DxList.Strings[i]; if Piece(DxList[i], U, 2) = (Piece(Section,U,2)) then break; end; inc(i); for j := i to DxList.Count-1 do begin if Piece(DxList[j], U, 0) = '' then break else begin a := Piece(DxList[j], U, 2) + '^' + Piece(DxList[j], U, 1); if not UBACore.IsICD9CodeActive(Piece(a,U,2),'ICD',Encounter.DateTime) then begin a := a + ' ' + UBAConst.BA_INACTIVE_CODE; inc(inactiveCodes); end; lbDiagnosis.Items.Add(a); end; end; end; procedure TfrmBAOptionsDiagnoses.AddProblemsToDxList; var i : integer; EncDt: TFMDateTime; x : String; begin //Get problem list EncDt := Trunc(FMToday); LastDFN := Patient.DFN; tCallV(Problems, 'ORWPCE ACTPROB', [Patient.DFN, EncDT]); if Problems.Count > 0 then begin DxList.add('^Problem List Items'); for i := 1 to (Problems.count-1) do begin x :=(Piece(Problems.Strings[i],U,3) + U + Piece(Problems.Strings[i],U,2)); // if (Piece(Problems.Strings[i],U,3) = '799.9') then continue; // DON'T INCLUDE 799.9 CODES if (Piece(problems.Strings[i], U, 11) = '#') then DxList.add(Piece(Problems.Strings[i],U,3) + U + // PL code inactive Piece(Problems.Strings[i],U,2) + U + '#') else if (Piece(problems.Strings[i], U, 10) = '') then // no inactive date for code DxList.add(Piece(Problems.Strings[i],U,3) + U + Piece(Problems.Strings[i],U,2)) else if (Trunc(StrToFloat(Piece(Problems.Strings[i], U, 10))) > EncDT) then // code active as of EncDt DxList.add(Piece(Problems.Strings[i],U,3) + U + Piece(Problems.Strings[i],U,2)) else DxList.add(Piece(Problems.Strings[i],U,3) + U + // PL code inactive Piece(Problems.Strings[i],U,2) + U + '#'); end; end; end; procedure TfrmBAOptionsDiagnoses.btnOtherClick(Sender: TObject); var Match: string; SelectedList : TStringList; lexIEN: string; begin inherited; BAPersonalDX := True; SelectedList := TStringList.Create; if Assigned (SelectedList) then SelectedList.Clear; BADxCode := ''; //init //Execute LEXICON LexiconLookup(Match, LX_ICD); if Match = '' then Exit; if strLen(PChar(Piece(Match, U, 3)))> 0 then lexIEN := Piece(Match, U, 3); BADxCode := Piece(Match,U,2) + ' ' + Piece(Match, U, 1); if IsDXInList(Piece(Match,U,1) ) then Exit; // eliminate duplicates if UBACore.IsICD9CodeActive(Piece(Match,U,1),'ICD',Encounter.DateTime) then begin lbPersonalDx.Items.Add(BADxCode); if strLen(PChar(lexIEN)) > 0 then newDxLst.Add(Piece(Match,U,1) + U + lexIEN) else newDxLst.Add(Piece(Match,U,1)); end else InfoBox(BA_INACTIVE_ICD9_CODE_1 + BADxCode + BA_INACTIVE_ICD9_CODE_2 , BA_INACTIVE_CODE, MB_ICONWARNING or MB_OK); lexIEN := ''; BAPersonalDX := False; if newDxLst.Count > 0 then btnOK.Enabled := True; end; procedure TfrmBAOptionsDiagnoses.lbSectionsClick(Sender: TObject); var i: integer; begin inherited; for i := 0 to lbSections.Items.Count-1 do begin if(lbSections.Selected[i]) then begin ListDiagnosesCodes(lbSections.Items[i]); FDXSection := lbSections.Items[i]; Break; end; end; end; procedure TfrmBAOptionsDiagnoses.lbSectionsEnter(Sender: TObject); begin inherited; lbSections.Selected[0] := true; end; procedure TfrmBAOptionsDiagnoses.lbDiagnosisClick(Sender: TObject); var i : integer; newDxCodes: TStringList; selectedCode: String; begin inherited; newDxCodes := TStringList.Create; newDxCodes.Clear; for i := 0 to lbDiagnosis.Items.Count-1 do begin if(lbDiagnosis.Selected[i]) then begin selectedCode := Piece(lbDiagnosis.Items[i],U,2); newDxCodes.Add(selectedCode); end; if newDxCodes.Count > 0 then begin rpcAddToPersonalDxList(User.DUZ,NewDxCodes); NewDxCodes.Clear; lbPersonalDx.Items := rpcGetPersonalDxList(User.DUZ); end; end; end; procedure TfrmBAOptionsDiagnoses.btnCancelClick(Sender: TObject); begin inherited; Close; end; procedure TfrmBAOptionsDiagnoses.btnOKClick(Sender: TObject); begin inherited; if delDxLst.Count > 0 then begin // delete selected dx's rpcDeleteFromPersonalDxList(User.DUZ,delDxLst); delDxLst.Clear; end; if newDxLst.Count > 0 then begin newDxLst.Sort; newDxLst.Duplicates := dupIgnore; // add selected dx's rpcAddToPersonalDxList(User.DUZ,newDxLst); newDxLst.Clear; end; Close; end; procedure TfrmBAOptionsDiagnoses.btnAddClick(Sender: TObject); var i : integer; newDxCode: string; begin inherited; for i := 0 to lbDiagnosis.Items.Count-1 do begin if(lbDiagnosis.Selected[i]) then begin newDxCode := Piece(lbDiagnosis.Items[i],U,2); if (not IsDxInList(newDxCode) ) then begin if UBACore.IsICD9CodeActive(newDxCode,'ICD',Encounter.DateTime) then begin newDxLst.Add(newDxCode); lbPersonalDx.Items.Add(Piece(lbDiagnosis.Items[i],U,2) + U + Piece(lbDiagnosis.Items[i],U,1) ) end else InfoBox(BA_INACTIVE_ICD9_CODE_1 + Trim(Piece(newDxCode,'#',1)) + BA_INACTIVE_ICD9_CODE_2 , BA_INACTIVE_CODE, MB_ICONWARNING or MB_OK); end; end; end; btnAdd.Enabled := False; lbDiagnosis.ClearSelection; if newDxLst.Count > 0 then btnOK.Enabled := True; end; procedure TfrmBAOptionsDiagnoses.btnDeleteClick(Sender: TObject); var i, c: integer; begin inherited; SyncDxDeleteList; SyncDxNewList; // delete selected dx from listbox. with lbPersonalDX do begin i := Items.Count - 1; c := SelCount; Items.BeginUpdate; while (i >= 0) and (c > 0) do begin if Selected[i] = true then begin Dec(c); Items.Delete(i); end; Dec(i); end; Items.EndUpdate; end; btnDelete.Enabled := False; lbDiagnosis.ClearSelection; if delDxLst.Count > 0 then btnOK.Enabled := True; end; procedure TfrmBAOptionsDiagnoses.lbDiagnosisChange(Sender: TObject); begin inherited; if lbDiagnosis.Count = 0 then btnAdd.Enabled := False else begin if (lbDiagnosis.SelCount > 0) then btnAdd.Enabled := True else btnAdd.Enabled := False; end; end; procedure TfrmBAOptionsDiagnoses.lbPersonalDxClick(Sender: TObject); var i : integer; begin inherited; for i := 0 to lbPersonalDX.Count-1 do begin if(lbPersonalDX.Selected[i]) then begin btnDelete.Enabled := True; break; end else btnDelete.Enabled := False; end; end; procedure TfrmBAOptionsDiagnoses.lbDiagnosisEnter(Sender: TObject); begin inherited; if lbDiagnosis.Count > 0 then lbDiagnosis.Selected[0] := true; end; procedure TfrmBAOptionsDiagnoses.FormShow(Sender: TObject); begin inherited; if lbSections.Count > 0 then ListDiagnosesCodes(lbSections.Items[0]); lbSections.SetFocus; end; procedure TfrmBAOptionsDiagnoses.Button1Click(Sender: TObject); begin inherited; newDxLst.Clear; Close; end; procedure TfrmBAOptionsDiagnoses.InactiveICDNotification; begin if inactiveCodes > 0 then begin if (not BAFWarningShown) and (inactiveCodes > 0) then begin InfoBox('There are ' + IntToStr(inactiveCodes) + ' active problem(s) flagged with a "#" as having' + #13#10 + 'inactive ICD codes as of today''s date. Please correct these' + #13#10 + 'problems via the Problems Tab - Change" option.', 'Inactive ICD Codes Found', MB_ICONWARNING or MB_OK); BAFWarningShown := True; end; end; end; procedure TfrmBAOptionsDiagnoses.FormActivate(Sender: TObject); begin inherited; InactiveICDNotification; end; function TfrmBAOptionsDiagnoses.IsDXInList(ADXCode: string):boolean; var i: integer; //x,y: string; begin Result := False; for i := 0 to lbPersonalDx.Count-1 do if ADXCode = Piece(lbPersonalDx.Items[i],U,1) then begin Result := True; Break; end; end; procedure TfrmBAOptionsDiagnoses.LoadPersonalDxList; var i: integer; dxList: TStringList; inActiveDx: string; begin dxList := TStringList.Create; dxList.Clear; dxList := rpcGetPersonalDxList(User.DUZ); if dxList.Count > 0 then begin for i := 0 to dxList.Count -1 do begin if not UBACore.IsICD9CodeActive(Piece(dxList.Strings[i],U,1),'ICD',Encounter.DateTime ) then begin inActiveDx := Piece(dxList.Strings[i],U,1) + ' ' + BA_INACTIVE_CODE + U + Piece(DxList.Strings[i],U,2); lbPersonalDx.Items.Add(inActiveDx); end else lbPersonalDx.Items.Add(dxList.Strings[i]); end; end; end; procedure TfrmBAOptionsDiagnoses.btnRemoveAllClick(Sender: TObject); var i: integer; delDxCode: string; begin inherited; // save dx seleted for deletion, update file when ok is pressed for i := 0 to lbPersonalDX.Count-1 do begin delDxCode := Piece(lbPersonalDX.Items[i],U,1); delDxLst.Add(delDxCode); end; // delete selected dx from listbox. with lbPersonalDX do begin i := Items.Count - 1; Items.BeginUpdate; while (i >= 0) do begin Items.Delete(i); Dec(i); end; Items.EndUpdate; end; btnDelete.Enabled := False; lbDiagnosis.ClearSelection; if delDxLst.Count > 0 then btnOK.Enabled := True; end; procedure TfrmBAOptionsDiagnoses.btnAddAllClick(Sender: TObject); var i : integer; newDxCode: string; begin inherited; for i := 0 to lbDiagnosis.Items.Count-1 do begin newDxCode := Piece(lbDiagnosis.Items[i],U,2); if (not IsDxInList(newDxCode) ) then begin if UBACore.IsICD9CodeActive(newDxCode,'ICD',Encounter.DateTime) then begin newDxLst.Add(newDxCode); lbPersonalDx.Items.Add(Piece(lbDiagnosis.Items[i],U,2) + U + Piece(lbDiagnosis.Items[i],U,1) ) end else InfoBox(BA_INACTIVE_ICD9_CODE_1 + Trim(Piece(newDxCode,'#',1)) + BA_INACTIVE_ICD9_CODE_2 , BA_INACTIVE_CODE, MB_ICONWARNING or MB_OK); end; end; btnAdd.Enabled := False; lbDiagnosis.ClearSelection; if newDxLst.Count > 0 then btnOK.Enabled := True; end; procedure TfrmBAOptionsDiagnoses.hdrCntlDxSectionClick( HeaderControl: THeaderControl; Section: THeaderSection); begin inherited; lbPersonalDx.Sorted := false; lbPersonalDx.Sorted := True; lbPersonalDX.Repaint; end; procedure TfrmBAOptionsDiagnoses.FormResize(Sender: TObject); begin inherited; hdrCntlDxSections.Sections[0].Width := lbSections.Width; hdrCntlDxAdd.Sections[0].Width := lbDiagnosis.Width; hdrCntlDx.Sections[0].Width := lbPersonalDx.Width; end; procedure TfrmBAOptionsDiagnoses.SyncDxDeleteList; var i: integer; delDxCode: string; begin // save dx selected for deletion, update file when ok is pressed for i := 0 to lbPersonalDX.Count-1 do begin if(lbPersonalDX.Selected[i]) then begin delDxCode := Piece(lbPersonalDX.Items[i],U,1); delDxLst.Add(delDxCode); end; end; end; procedure TfrmBAOptionsDiagnoses.SyncDxNewList; var i,j :integer; begin // remove diagnoses selected for deletion from newdxList; for i := 0 to lbPersonalDX.Count-1 do begin if lbPersonalDX.Selected[i] then begin for j := 0 to newDxLst.Count-1 do begin if (Piece(lbPersonalDX.Items[i],U,1)) = (newDxLst.Strings[j]) then begin newDxLst.Delete(j); Break; end; end; end; end; end; initialization uAddToPDL := 0; uDeleteFromPDL := 0; Problems := TStringList.Create; DxList := TStringList.Create; ECFDiagnoses := TStringList.Create; uNewDxList := TStringList.Create; tmplst := TStringList.Create; newDxLst := TStringList.Create; delDxLst := TStringList.Create; Problems.Clear; DxList.Clear; ECFDiagnoses.Clear; uNewDxList.Clear; tmplst.Clear; newDxLst.Clear; delDxLst.Clear; end.