unit fOrdersSign; {.$define debug} interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fAutoSz, StdCtrls, ORFn, ORCtrls, AppEvnts, mCoPayDesc, XUDIGSIGSC_TLB, ComCtrls, CheckLst, ExtCtrls, uConsults, UBAGlobals,UBACore, UBAMessages, UBAConst, Menus, ORClasses, fBase508Form, fPrintLocation, VA508AccessibilityManager; type TfrmSignOrders = class(TfrmBase508Form) cmdOK: TButton; cmdCancel: TButton; lblESCode: TLabel; txtESCode: TCaptionEdit; clstOrders: TCaptionCheckListBox; laDiagnosis: TLabel; gbdxLookup: TGroupBox; buOrdersDiagnosis: TButton; poBACopyPaste: TPopupMenu; Copy1: TMenuItem; Paste1: TMenuItem; Diagnosis1: TMenuItem; Exit1: TMenuItem; lblOrderList: TStaticText; fraCoPay: TfraCoPayDesc; procedure FormCreate(Sender: TObject); procedure cmdOKClick(Sender: TObject); procedure cmdCancelClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure clstOrdersDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure clstOrdersMeasureItem(Control: TWinControl; Index: Integer; var AHeight: Integer); procedure clstOrdersClickCheck(Sender: TObject); procedure clstOrdersMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormShow(Sender: TObject); procedure buOrdersDiagnosisClick(Sender: TObject); function IsSignatureRequired:boolean; procedure Exit1Click(Sender: TObject); procedure Copy1Click(Sender: TObject); procedure Paste1Click(Sender: TObject); procedure clstOrdersMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure clstOrdersClick(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure fraCoPaylblHNCMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure fraCoPayLabel23Enter(Sender: TObject); procedure fraCoPayLabel23Exit(Sender: TObject); procedure clstOrdersKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormResize(Sender: TObject); private OKPressed: Boolean; ESCode: string; FLastHintItem: integer; FOldHintPause: integer; FOldHintHidePause: integer; function ItemsAreChecked: Boolean; function GetNumberOfSelectedOrders : byte; procedure ShowTreatmentFactorHints(var pHintText: string; var pCompName: TVA508StaticText); // 508 procedure SetItemTextToState; procedure FormatListForScreenReader; public procedure SetCheckBoxStatus(thisOrderID: string); function GetCheckBoxStatus(sourceOrderID : string) : string; overload; end; {Begin BillingAware} TarRect = array[MIN_RECT..MAX_RECT] of TRect; var thisRect: TRect; j: shortint; ARect: TRect; arRect: TarRect; ProvDx: TProvisionalDiagnosis; FOSTFHintWndActive: boolean; FOSTFhintWindow: THintWindow; tempList : TList; {End BillingAware} {Forward} function ExecuteSignOrders(SelectedList: TList): Boolean; var crypto: IXuDigSigS; rectIndex: Integer; {Begin BillingAware} frmSignOrders: TfrmSignOrders; chkBoxStatus: string; srcOrderID: string; targetOrderID: string; tempStrList: TStringList; srcDx: string; tempBillableList :TStringList; tempOrderList: TStringList; copyOrderID: string; srcIndex: integer; CopyBuffer: TBADxRecord; {End BillingAware} implementation {$R *.DFM} uses Hash, rCore, rOrders, uConst, fOrdersPrint, uCore, uOrders, uSignItems, fOrders, fPCELex, rPCE, fODConsult, fBALocalDiagnoses, fClinicWardMeds, fFrame, rODLab, fRptBox, VAUtils; const TX_SAVERR1 = 'The error, '; TX_SAVERR2 = ', occurred while trying to save:' + CRLF + CRLF; TC_SAVERR = 'Error Saving Order'; function TfrmSignOrders.GetNumberOfSelectedOrders : byte; { - Return the number of orders in clstOrders that are currently selected. } var i: integer; numSelected: byte; begin Result := 0; if BILLING_AWARE then begin numSelected := 0; try for i := 0 to fOrdersSign.frmSignOrders.clstOrders.Items.Count-1 do if (fOrdersSign.frmSignOrders.clstOrders.Selected[i]) then Inc(numSelected); except on EListError do begin {$ifdef debug}Show508Message('EListError in frmSignOrders.GetNumberOfSelectedOrders()');{$endif} raise; end; end; Result := numSelected; end; end; procedure TfrmSignOrders.SetCheckBoxStatus(thisOrderID: string); { - Set the current GRID checkboxes status } begin if BILLING_AWARE then begin uSignItems.uSigItems.SetSigItems(clstOrders, thisOrderID); end; end; function TfrmSignOrders.GetCheckBoxStatus(sourceOrderID: string) : string; //PASS IN ORDER ID - NOT GRID INDEX { - Obtain checkbox status for selected order - BY ORDER ID } var itemsList: TStringList; i: smallint; thisOrderID: string; begin Result := ''; itemsList := TStringList.Create; itemsList.Clear; itemsList := uSigItems.GetSigItems; //Get FItems list if BILLING_AWARE then begin try for i := 0 to itemsList.Count-1 do begin thisOrderID := Piece(itemsList[i],'^',1); //get the order ID if thisOrderID = sourceOrderID then //compare to order ID of source order begin Result := Piece(itemsList[i],U,4); //return TF status' Break; end; end; except on EListError do begin {$ifdef debug}Show508Message('EListError in frmSignOrders.GetCheckBoxStatus()');{$endif} raise; end; end; end; end; function ExecuteSignOrders(SelectedList: TList): Boolean; const VERT_SPACING = 6; var i, cidx,cnt, theSts, WardIEN: Integer; ShrinkHeight: integer; SignList: TStringList; Obj: TOrder; DigSigErr, DigStoreErr, ContainsIMOOrders, DoNotPrint: Boolean; x, SigData, SigUser, SigDrugSch, SigDEA: string; cSignature, cHashData, cCrlUrl, cErr, WardName: string; cProvDUZ: Int64; OrderText, ASvc: string; PrintLoc: Integer; AList, ClinicList, DCList, OrderPrintList, WardList: TStringList; EncLocName, EncLocText: string; EncLocIEN: integer; EncDT: TFMDateTime; EncVC: Char; function FindOrderText(const AnID: string): string; var i: Integer; begin Result := ''; fOrdersSign.tempList := selectedList; with SelectedList do for i := 0 to Count - 1 do with TOrder(Items[i]) do if ID = AnID then begin Result := Text; Break; end; end; function SignNotRequired: Boolean; var i: Integer; begin Result := True; tempList := SelectedList; with SelectedList do for i := 0 to Pred(Count) do begin with TOrder(Items[i]) do if Signature <> OSS_NOT_REQUIRE then Result := False; end; end; function DigitalSign: Boolean; var i: Integer; begin Result := False; with SelectedList do for i := 0 to Pred(Count) do begin with TOrder(Items[i]) do if Copy(DigSigReq,1,1) = '2' then Result := True; end; end; begin Result := False; DigSigErr := True; PrintLoc := 0; EncLocIEN := 0; DoNotPrint := False; if SelectedList.Count = 0 then Exit; if BILLING_AWARE then begin tempOrderList := TStringList.Create; tempOrderList.Clear; end; frmSignOrders := TfrmSignOrders.Create(Application); try ResizeAnchoredFormToFont(frmSignOrders); SigItems.ResetOrders; with SelectedList do for i := 0 to Count - 1 do begin obj := TOrder(Items[i]); cidx := frmSignOrders.clstOrders.Items.AddObject(Obj.Text,Obj); SigItems.Add(CH_ORD,Obj.ID, cidx); if BILLING_AWARE then tempOrderList.Add(Obj.ID); frmSignOrders.clstOrders.Checked[cidx] := TRUE; if (TOrder(Items[i]).DGroupName) = NonVAMedGroup then frmSignOrders.clstOrders.State[cidx] := cbGrayed ; end; if SigItems.UpdateListBox(frmSignOrders.clstOrders) then frmSignOrders.fraCoPay.Visible := TRUE else begin {Begin BillingAware} if BILLING_AWARE then frmSignOrders.gbDxLookup.Visible := FALSE; {End BillingAware} with frmSignOrders do begin ShrinkHeight := lblOrderList.Top - VERT_SPACING; Height := Height - ShrinkHeight; lblOrderList.Top := lblOrderList.Top - ShrinkHeight; clstOrders.Top := clstOrders.Top - ShrinkHeight; clstOrders.Height := clstOrders.Height + ShrinkHeight; end; end; if GetPKISite and GetPKIUse and DigitalSign then //PKI setup for crypto card read begin try //PKI object creation crypto := CoXuDigSigS.Create; crypto.GetCSP; StatusText(crypto.Reason); DigSigErr := False; except on E: Exception do begin DigSigErr := True; end; end; end; if SignNotRequired then begin frmSignOrders.lblESCode.Visible := False; frmSignOrders.txtESCode.Visible := False; end; if BILLING_AWARE then begin // build list of orders that are not billable based on order type UBAGlobals.NonBillableOrderList := rpcNonBillableOrders(tempOrderList); end; frmSignOrders.ShowModal; if frmSignOrders.OKPressed then begin Result := True; SignList := TStringList.Create; ClinicList := TStringList.Create; OrderPrintList := TStringList.Create; WardList := TStringList.Create; ContainsIMOOrders := false; try with SelectedList do for i := 0 to Count - 1 do with TOrder(Items[i]) do begin DigStoreErr := false; if (DigSigErr = False) and (Copy(TOrder(Items[i]).DigSigReq,1,1) = '2') then begin StatusText('Retrieving DIGITAL SIGNATURE'); x := TOrder(Items[i]).ID; SigDrugSch := GetDrugSchedule(x); SigData := SetExternalText(x,SigDrugSch,User.DUZ); if Length(SigData) < 1 then begin ShowMsg(TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + 'Digital Signature failed with reason: Unable to get required data from server'); DigStoreErr := true; end; SigUser := piece(SigData,'^',18); SigDEA := piece(SigData,'^',20); cProvDUZ := User.DUZ; if DigStoreErr = false then try crypto.Reset; crypto.DEAsig := true; crypto.UsrName := SigUser; crypto.DrugSch := SigDrugSch; crypto.UsrNumber := SigDEA; crypto.DataBuffer := SigData; if crypto.Signdata = true then begin cSignature := crypto.Signature; cHashData := crypto.HashValue; cCrlUrl := crypto.CrlUrl; end else begin ShowMsg(TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + 'Digital Signature failed with reason: '+ piece(Crypto.Reason, '^', 2)); DigStoreErr := true; end; except on E: Exception do begin ShowMsg(TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + 'Crypto raised an error: '+ E.Message); DigStoreErr := true; end; end; //except if DigStoreErr = true then //PKI begin //NoOp end else begin cErr := ''; StoreDigitalSig(ID, cHashData, cProvDUZ, cSignature, cCrlUrl, cErr); cidx := frmSignOrders.clstOrders.Items.IndexOfObject(TOrder(Items[i])); if (cidx > -1 ) and (frmSignOrders.clstOrders.Checked[cidx]) and (cErr = '') then begin UpdateOrderDGIfNeeded(ID); SignList.Add(ID + U + SS_DIGSIG + U + RS_RELEASE + U + NO_PROVIDER); BAOrderList.Add(TOrder(Items[i]).ID); end; end; end else begin if GetPKISite and (Copy(TOrder(SelectedList.Items[i]).DigSigReq,1,1) = '2') then begin ShowMsg('ORDER NOT SENT TO PHARMACY' + CRLF + CRLF + TOrder(SelectedList.Items[i]).Text + CRLF + CRLF + 'This Schedule II medication cannot be electronically entered without a Digital Signature. ' + CRLF + 'Please discontinue/cancel this order and create a hand written order for manual processing, or digitally sign the order at a PKI-enabled workstation.'); end else begin cidx := frmSignOrders.clstOrders.Items.IndexOfObject(TOrder(Items[i])); if TOrder(Items[i]).DGroupName = NonVAMedGroup then frmSignOrders.clstOrders.Checked[cidx] := True; //Non VA MEDS if (cidx > -1 ) and (frmSignOrders.clstOrders.Checked[cidx]) then begin UpdateOrderDGIfNeeded(ID); SignList.Add(ID + U + SS_ESIGNED + U + RS_RELEASE + U + NO_PROVIDER); end; end; end; end; StatusText('Sending Orders to Service(s)...'); if SignList.Count > 0 then begin //hds7591 Clinic/Ward movement. Patient Admission IMO if not frmFrame.TimedOut then begin if (Patient.Inpatient = True) and (Encounter.Location <> Patient.Location) then begin DCList := TStringList.Create; EncLocName := Encounter.LocationName; EncLocIEN := Encounter.Location; EncLocText := Encounter.LocationText; EncDT := Encounter.DateTime; EncVC := Encounter.VisitCategory; for i := 0 to SelectedList.Count - 1 do begin cidx := frmSignOrders.clstOrders.Items.IndexOfObject(TOrder(SelectedList.Items[i])); if frmSignOrders.clstOrders.Checked[cidx] = false then continue; if TOrder(SelectedList.Items[i]).DGroupName = 'Clinic Orders' then ContainsIMOOrders := true; if TOrder(SelectedList.Items[i]).DGroupName = '' then continue; if TOrder(SelectedList.Items[i]).EventPtr <> '' then continue; if Pos('DC', TOrder(SelectedList.Items[i]).ActionOn) > 0 then begin DCList.Add(TOrder(SelectedList.Items[i]).ID); Continue; end; OrderPrintList.Add(TOrder(SelectedList.Items[i]).ID + ':' + TOrder(SelectedList.Items[i]).Text); end; if OrderPrintList.Count > 0 then begin frmPrintLocation.PrintLocation(OrderPrintList, EncLocIEN, EncLocName, EncLocText, EncDT, EncVC, ClinicList, WardList, WardIen,WardName, ContainsIMOOrders, true); fframe.frmFrame.OrderPrintForm := false; end else DoNotPrint := True; if (DCList <> nil) and (DCList.Count > 0) then begin for i := 0 to DCList.Count - 1 do WardList.Add(DCList.Strings[i]); if (WardIEN = 0) and (WardName = '') then CurrentLocationForPatient(Patient.DFN, WardIEN, WardName, ASvc); end; if DCList <> nil then DCList.Free; end; end; uCore.TempEncounterLoc := 0; uCore.TempEncounterLocName := ''; //hds7591 Clinic/Ward movement Patient Admission IMO SigItems.SaveSettings; // Save CoPay FIRST! SendOrders(SignList, frmSignOrders.ESCode); end; with SignList do if Count > 0 then for i := 0 to Count - 1 do begin if Pos('E', Piece(SignList[i], U, 2)) > 0 then begin OrderText := FindOrderText(Piece(SignList[i], U, 1)); if Piece(SignList[i],U,4) = 'Invalid Pharmacy order number' then InfoBox(TX_SAVERR1 + Piece(SignList[i], U, 4) + TX_SAVERR2 + OrderText + CRLF + CRLF + 'The changes to this order have not been saved. You must contact Pharmacy to complete any action on this order.', TC_SAVERR, MB_OK) else InfoBox(TX_SAVERR1 + Piece(SignList[i], U, 4) + TX_SAVERR2 + OrderText, TC_SAVERR, MB_OK); end; if Pos('R', Piece(SignList[i], U, 2)) > 0 then NotifyOtherApps(NAE_ORDER, 'RL' + U + Piece(SignList[i], U, 1)); end; StatusText(''); for cnt := SignList.Count - 1 downto 0 do begin if Pos('E', Piece(SignList[cnt], U, 2)) > 0 then begin SignList.Delete(cnt); Continue; end; theSts := GetOrderStatus(Piece(SignList[cnt],U,1)); if theSts = 10 then SignList.Delete(cnt); //signed delayed order should not be printed. end; // CQ 10226, PSI-05-048 - advise of auto-change from LC to WC on lab orders AList := TStringList.Create; try CheckForChangeFromLCtoWCOnRelease(AList, Encounter.Location, SignList); if AList.Text <> '' then ReportBox(AList, 'Changed Orders', TRUE); finally AList.Free; end; if(ClinicList.Count > 0) or (WardList.count > 0) then PrintOrdersOnSignReleaseMult(SignList, CLinicList, WardList, NO_PROVIDER, EncLocIEN, WardIEN, EncLocName, wardName) else if DoNotPrint = False then PrintOrdersOnSignRelease(SignList, NO_PROVIDER, PrintLoc); finally SignList.Free; OrderPrintList.free; WardList.free; ClinicList.free; end; end; {if frmSignOrders.OKPressed} finally frmSignOrders.Free; with SelectedList do for i := 0 to Count - 1 do UnlockOrder(TOrder(Items[i]).ID); end; crypto := nil; end; procedure TfrmSignOrders.FormCreate(Sender: TObject); begin inherited; FLastHintItem := -1; OKPressed := False; FOldHintPause := Application.HintPause; Application.HintPause := 250; FOldHintHidePause := Application.HintHidePause; Application.HintHidePause := 30000; tempList := TList.Create; {Begin BillingAware} //This is the DIAGNOSIS label above the Dx column if BILLING_AWARE then begin clstOrders.Height := 228; clstOrders.Top := (gbdxLookup.top + 65); gbDxLookup.Visible := TRUE; lblOrderList.Top := (gbdxLookup.Top + gbdxLookup.Height); laDiagnosis.Top := lblOrderList.Top; laDiagnosis.Left := 270; laDiagnosis.Visible := TRUE; rectIndex := 0; end else begin lblOrderList.Top := 158; lblOrderList.Left := 8; end; {End BillingAware} end; function TfrmSignOrders.IsSignatureRequired:boolean; var i: Integer; begin Result := FALSE; with tempList do for i := 0 to Pred(Count) do begin if frmSignOrders.clstOrders.Checked[i] then begin with TOrder(Items[i]) do if Signature <> OSS_NOT_REQUIRE then Result := TRUE; end; end; end; procedure TfrmSignOrders.cmdOKClick(Sender: TObject); const TX_NO_CODE = 'An electronic signature code must be entered to sign orders.'; TC_NO_CODE = 'Electronic Signature Code Required'; TX_BAD_CODE = 'The electronic signature code entered is not valid.'; TC_BAD_CODE = 'Invalid Electronic Signature Code'; TC_NO_DX = 'Incomplete Diagnosis Entry'; TX_NO_DX = 'A Diagnosis must be selected prior to signing any of the following order types:' + CRLF + 'Lab, Radiology, Outpatient Medications, Prosthetics.'; begin inherited; if txtESCode.Visible and (Length(txtESCode.Text) = 0) then begin InfoBox(TX_NO_CODE, TC_NO_CODE, MB_OK); Exit; end; if txtESCode.Visible and not ValidESCode(txtESCode.Text) then begin InfoBox(TX_BAD_CODE, TC_BAD_CODE, MB_OK); txtESCode.SetFocus; txtESCode.SelectAll; Exit; end; {Begin BillingAware} if BILLING_AWARE then begin if SigItems.OK2SaveSettings then if Not UBACore.BADxEntered then // if Dx have been entered and OK is pressed begin // billing data will be saved. otherwise error message! InfoBox(TX_NO_DX, 'Sign Orders', MB_OK); Exit; end; end; {End BillingAware} if not SigItems.OK2SaveSettings then begin InfoBox(TX_Order_Error, 'Sign Orders', MB_OK); Exit; end; if txtESCode.Visible then ESCode := Encrypt(txtESCode.Text) else ESCode := ''; OKPressed := True; Close; end; procedure TfrmSignOrders.cmdCancelClick(Sender: TObject); begin inherited; Close; end; procedure TfrmSignOrders.FormDestroy(Sender: TObject); begin inherited; Application.HintPause := FOldHintPause; Application.HintHidePause := FOldHintHidePause; Crypto := nil; //PKI object destroy end; procedure TfrmSignOrders.clstOrdersDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var {Begin BillingAware} str: String; tempID: string; thisRec: UBAGlobals.TBADxRecord; {End BillingAware} X: string; ARect: TRect; begin inherited; X := ''; ARect := Rect; {Begin BillingAware} if BILLING_AWARE then begin with clstOrders do begin if Index < Items.Count then begin Canvas.FillRect(ARect); Canvas.Pen.Color := Get508CompliantColor(clSilver); Canvas.MoveTo(ARect.Left, ARect.Bottom); Canvas.LineTo(ARect.Right, ARect.Bottom); x := FilteredString(Items[Index]); ARect.Right := ARect.Right - 50; //50 to 40 //Vertical column line Canvas.MoveTo(ARect.Right, Rect.Top); Canvas.LineTo(ARect.Right, Rect.Bottom); //Adjust position of 'Diagnosis' column label for font size laDiagnosis.Left := ARect.Right + 14; if uSignItems.GetAllBtnLeftPos > 0 then laDiagnosis.left := uSignItems.GetAllBtnLeftPos - (laDiagnosis.Width +5); // ARect.Right below controls the right-hand side of the Dx Column // Adjust ARect.Right in conjunction with procedure uSignItems.TSigItems.lbDrawItem(), because the // two rectangles overlap each other. if BILLING_AWARE then begin arRect[Index] := Classes.Rect(ARect.Right+2, ARect.Top, ARect.Right + 108, ARect.Bottom); Canvas.FillRect(arRect[Index]); end; //Win32 API - This call to DrawText draws the text of the ORDER - not the diagnosis code DrawText(Canvas.handle, PChar(x), Length(x), ARect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK); if BILLING_AWARE then begin if Assigned(UBAGlobals.tempDxList) then begin tempID := TOrder(clstOrders.Items.Objects[Index]).ID; if UBAGlobals.tempDxNodeExists(tempID) then begin thisRec := TBADxRecord.Create; UBAGlobals.GetBADxListForOrder(thisRec, tempID); str := Piece(thisRec.FBADxCode,'^',1); {v25 BA} str := Piece(str,':',1); DrawText(Canvas.handle, PChar(str), Length(str), arRect[Index], DT_LEFT or DT_NOPREFIX or DT_WORDBREAK); if Not UBACore.IsOrderBillable(tempID) then begin Canvas.Font.Color := clBlue; DrawText(Canvas.handle, PChar(NOT_APPLICABLE), Length(NOT_APPLICABLE), {Length(str),} arRect[Index], DT_LEFT or DT_NOPREFIX or DT_WORDBREAK); end; end else begin // determine if order is billable, if NOT then insert NA in Dx field if Not UBACore.IsOrderBillable(tempID) then begin Canvas.Font.Color := clBlue; DrawText(Canvas.handle, PChar(NOT_APPLICABLE), Length(NOT_APPLICABLE), {Length(str),} arRect[Index], DT_LEFT or DT_NOPREFIX or DT_WORDBREAK); end; end; end; end; end; end; end else begin X := ''; ARect := Rect; with clstOrders do begin if Index < Items.Count then begin Canvas.FillRect(ARect); Canvas.Pen.Color := Get508CompliantColor(clSilver); Canvas.MoveTo(ARect.Left, ARect.Bottom - 1); Canvas.LineTo(ARect.Right, ARect.Bottom - 1); X := FilteredString(Items[Index]); DrawText(Canvas.handle, PChar(x), Length(x), ARect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK); end; end; end; {End BillingAware} end; procedure TfrmSignOrders.clstOrdersMeasureItem(Control: TWinControl; Index: Integer; var AHeight: Integer); var X: string; ARect: TRect; begin inherited; AHeight := SigItemHeight; with clstOrders do if Index < Items.Count then begin ARect := ItemRect(Index); Canvas.FillRect(ARect); x := FilteredString(Items[Index]); AHeight := WrappedTextHeightByFont(Canvas, Font, x, ARect); if AHeight > 255 then AHeight := 255; //------------------- {Bug fix-HDS00001627} //if AHeight < 13 then AHeight := 13; {ORIG} if AHeight < 13 then AHeight := 15; //------------------- end; end; procedure TfrmSignOrders.clstOrdersClickCheck(Sender: TObject); procedure updateAllChilds(CheckedStatus: boolean; ParentOrderId: string); var idx: integer; begin for idx := 0 to clstOrders.Items.Count - 1 do if TOrder(clstOrders.Items.Objects[idx]).ParentID = ParentOrderId then begin if clstOrders.Checked[idx] <> CheckedStatus then begin clstOrders.Checked[idx] := CheckedStatus; SigItems.EnableSettings(idx, clstOrders.checked[Idx]); end; end; end; begin with clstOrders do begin if Length(TOrder(Items.Objects[ItemIndex]).ParentID)>0 then begin SigItems.EnableSettings(ItemIndex, checked[ItemIndex]); updateAllChilds(checked[ItemIndex],TOrder(Items.Objects[ItemIndex]).ParentID); end else SigItems.EnableSettings(ItemIndex, checked[ItemIndex]); end; if ItemsAreChecked then begin lblESCode.Visible := IsSignatureRequired; txtESCode.Visible := IsSignatureRequired end else begin lblESCode.Visible := ItemsAreChecked; txtESCode.Visible := ItemsAreChecked; end; end; function TfrmSignOrders.ItemsAreChecked: Boolean; { return true if any items in the Review List are checked for applying signature } var i: Integer; begin Result := False; with clstOrders do for i := 0 to Items.Count - 1 do if Checked[i] then begin Result := True; break; end; end; procedure TfrmSignOrders.clstOrdersMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var Itm: integer; {Begin BillingAware} thisRec: UBAGlobals.TBADxRecord; i: smallint; thisOrderID: string; {End BillingAware} begin inherited; Itm := clstOrders.ItemAtPos(Point(X, Y), TRUE); if (Itm >= 0) then begin if (Itm <> FLastHintItem) then begin Application.CancelHint; {Begin BillingAware} if BILLING_AWARE then begin //Billing Awareness 'flyover' hint includes Dx code(s) when Dx code(s) have been assigned to an order thisOrderID := TChangeItem(fOrdersSign.frmSignOrders.clstOrders.Items.Objects[Itm]).ID; if UBAGlobals.tempDxNodeExists(thisOrderID) then begin if Assigned(tempDxList) then try for i := 0 to (tempDxList.Count - 1) do begin thisRec := TBADxRecord(tempDxList.Items[i]); if Assigned(thisRec) then if (thisRec.FOrderID = thisOrderID) then begin with thisRec do begin FBADxCode := StringReplace(thisrec.FBADxCode,'^',':',[rfReplaceAll]); FBASecDx1 := StringReplace(thisrec.FBASecDx1,'^',':',[rfReplaceAll]); FBASecDx2 := StringReplace(thisrec.FBASecDx2,'^',':',[rfReplaceAll]);; FBASecDx3 := StringReplace(thisrec.FBASecDx3,'^',':',[rfReplaceAll]); end; clstOrders.Hint := TrimRight(clstOrders.Items[Itm] + #13 + thisRec.FBADxCode + #13 + thisRec.FBASecDx1 + #13 + thisRec.FBASecDx2 + #13 + thisRec.FBASecDx3); end end except on EListError do begin {$ifdef debug}Show508Message('EListError in frmSignOrders.clstOrdersMouseMove()');{$endif} raise; end; end; end else clstOrders.Hint := TrimRight(clstOrders.Items[Itm]); end; {End BillingAware} FLastHintItem := Itm; Application.ActivateHint(Point(X, Y)); end; end else begin clstOrders.Hint := ''; FLastHintItem := -1; Application.CancelHint; end; end; procedure TfrmSignOrders.FormShow(Sender: TObject); begin {Begin BillingAware} if (clstOrders.Top + clstOrders.Height) > (lblESCode.Top - 4) then clstOrders.Height := lblESCode.Top - clstOrders.Top - 4; //INITIALIZATIONS Paste1.Enabled := false; fOrdersSign.srcOrderID := ''; fOrdersSign.srcDx := ''; if txtESCode.Visible then frmSignOrders.txtESCode.SetFocus; if BILLING_AWARE then begin //List to contain loading OrderID's if not Assigned(UBAGlobals.OrderIDList) then UBAGlobals.OrderIDList := TStringList.Create; if BILLING_AWARE then clstOrders.Multiselect := true; with fraCoPay do begin lblSC2.Caption := 'Service &Connected Condition'; lblCV2.Caption := 'Combat &Vet (Combat Related)'; lblAO2.Caption := 'Agent &Orange Exposure'; lblIR2.Caption := 'Ionizing &Radiation Exposure'; lblSWAC2.Caption := '&Environmental Contaminants'; lblMST2.Caption := '&MST'; lblHNC2.Caption := '&Head and/or Neck Cancer'; lblSHAD2.Caption := 'Shi&pboard Hazard and Defense'; lblSC2.ShowAccelChar := true; lblCV2.ShowAccelChar := true; lblAO2.ShowAccelChar := true; lblIR2.ShowAccelChar := true; lblSWAC2.ShowAccelChar := true; lblMST2.ShowAccelChar := true; lblHNC2.ShowAccelChar := true; lblSHAD2.ShowAccelChar := true; end; end; //BILLING_AWARE clstOrders.TabOrder := 0; //CQ5057 FormatListForScreenReader; //CQ5172 if clstOrders.Count = 1 then begin clstOrders.Selected[0] := true; buOrdersDiagnosis.Enabled := True; Diagnosis1.Enabled := True; // if number of orders is 1 and order is billable select order and disable diagnosis button if NOT UBACore.IsOrderBillable(TChangeItem(fOrdersSign.frmSignOrders.clstOrders.Items.Objects[0]).ID) then begin buOrdersDiagnosis.Enabled := False; Diagnosis1.Enabled := False; clstOrders.Selected[0] := False; end else if Piece(TChangeItem(fOrdersSign.frmSignOrders.clstOrders.Items.Objects[0]).ID,';',2) = DISCONTINUED_ORDER then begin buOrdersDiagnosis.Enabled := False; Diagnosis1.Enabled := False; end; end; //end CQ5172 end; {Begin BillingAware} // New BA Button.... procedure TfrmSignOrders.buOrdersDiagnosisClick(Sender: TObject); var i: smallint; thisOrderID: string; match: boolean; allBlank: boolean; numSelected: smallint; begin {Begin BillingAware} match := false; allBlank := false; if Assigned (orderIDList) then orderIDList.Clear; if Assigned(UBAGlobals.PLFactorsIndexes) then UBAGlobals.PLFactorsIndexes.Clear; if Assigned (BAtmpOrderList) then BAtmpOrderList.Clear; try // User has selected no orders to sign for i := 0 to fOrdersSign.frmSignOrders.clstOrders.Items.Count-1 do begin if (fOrdersSign.frmSignOrders.clstOrders.Selected[i]) then begin thisOrderID := TChangeItem(fOrdersSign.frmSignOrders.clstOrders.Items.Objects[i]).ID; orderIDList.Add(thisOrderID); {BAV25 Code} BAtmpOrderList.Add(TOrder(fOrdersSign.frmSignOrders.clstOrders.Items.Objects[i]).TEXT); // stringlist holding index and stsFactors UBAGlobals.PLFactorsIndexes.Add(IntToStr(i)+ U + GetCheckBoxStatus(thisOrderID) ); // store indexes and flags of selected orders {BAV25 Code} // Test for blank Dx on current grid item if not (tempDxNodeExists(thisOrderID)) then if Assigned(UBAGlobals.globalDxRec) then InitializeNewDxRec(UBAGlobals.globalDxRec); if (tempDxNodeExists(thisOrderID)) then begin // Create UBAGlobals.globalDxRec with loaded fields if not Assigned(UBAGlobals.globalDxRec) then begin UBAGlobals.globalDxRec := UBAGlobals.TBADxRecord.Create; InitializeNewDxRec(UBAGlobals.globalDxRec); GetBADxListForOrder(UBAGlobals.globalDxRec, thisOrderID); end else GetBADxListForOrder(UBAGlobals.globalDxRec, thisOrderID); {$ifdef debug} with UBAGlobals.globalDxRec do //Show508Message('globalDxRec:'+#13+FOrderID+#13+FBADxCode+#13+FBASecDx1+#13+FBASecDx2+#13+FBASecDx3); {$endif} end; end; //if end; //for except on E: Exception do ShowMsg(E.ClassName+' error raised, with message : '+E.Message); end; numSelected := CountSelectedOrders(UBAConst.F_ORDERS_SIGN); if numSelected = 0 then begin ShowMsg(UBAMessages.BA_NO_ORDERS_SELECTED); Exit; end else if numSelected = 1 then match := true; if (UBAGlobals.CompareOrderDx(UBAConst.F_ORDERS_SIGN)) then match := true; if UBAGlobals.AllSelectedDxBlank(UBAConst.F_ORDERS_SIGN) then allBlank := true; if ((match and allBlank) or (match and (not allBlank))) then // All selected are blank or matching-not-blank frmBALocalDiagnoses.Enter(UBAConst.F_ORDERS_SIGN, orderIDList) else begin //Warning message //If 'Yes' on warning message then open localDiagnosis if (not allBlank) then if MessageDlg(UBAMessages.BA_CONFIRM_DX_OVERWRITE, mtConfirmation, [mbYes, mbNo], 0) = mrNo then Exit else if Assigned(UBAGlobals.globalDxRec) then InitializeNewDxRec(UBAGlobals.globalDxRec); frmBALocalDiagnoses.Enter(UBAConst.F_ORDERS_SIGN, orderIDList); end; // TFactors come from FBALocalDiagnoses(Problem List Dx's Only). if Length(UBAGlobals.TFactors) > 0 then begin UBACore.SetTreatmentFactors(UBAGlobals.TFactors); SigItems.DisplayPlTreatmentFactors; end; {End BillingAware} txtESCode.SetFocus; end; procedure TfrmSignOrders.Exit1Click(Sender: TObject); begin Close; end; procedure TfrmSignOrders.Copy1Click(Sender: TObject); { - Copy contents of the 'source' order for copy/paste operation } var i : byte; numSelected: byte; thisChangeItem: TChangeItem; begin try if BILLING_AWARE then begin Paste1.Enabled := true; numSelected := GetNumberOfSelectedOrders; if numSelected > 1 then begin ShowMsg('Only 1 order at a time may be selected for ''Copying'''); Exit; end; for i := 0 to fOrdersSign.frmSignOrders.clstOrders.Items.Count-1 do if (fOrdersSign.frmSignOrders.clstOrders.Selected[i]) then begin thisChangeItem := TChangeItem.Create; thisChangeItem := nil; thisChangeItem := TChangeItem(clstOrders.Items.Objects[i]); //Skip this one if it's a "header" on the grid if (thisChangeItem = nil) then //or (thisChangeItem.ItemType <> CH_ORD)) then begin FreeAndNil(thisChangeItem); Exit; end; fOrdersSign.srcOrderID := TChangeItem(frmSignOrders.clstOrders.Items.Objects[i]).ID; //Copy source order to COPY BUFFER and add it to the Dx List CopyBuffer := TBADxRecord.Create; InitializeNewDxRec(CopyBuffer); GetBADxListForOrder(CopyBuffer, fOrdersSign.srcOrderID); fOrdersSign.CopyBuffer.FOrderID := BUFFER_ORDER_ID; UBAGlobals.tempDxList.Add(CopyBuffer); //************************************************************************* if (NOT UBACore.IsOrderBillable(fOrdersSign.srcOrderID) ) then //and // added to allow copy to NON CIDC consult order the requires a DX. then begin ShowMsg(BA_NA_COPY_DISALLOWED); fOrdersSign.srcOrderID := ''; Exit; end; //************************************************************************* fOrdersSign.srcIndex := clstOrders.ItemIndex; fOrdersSign.chkBoxStatus := GetCheckBoxStatus(fOrdersSign.srcOrderID); Break; end; end; //if BILLING_AWARE except on EListError do begin ShowMsg('EListError in frmSignOrders.Copy1Click()'); raise; end; end; end; procedure TfrmSignOrders.Paste1Click(Sender: TObject); { - Populate 'target' orders of a copy/paste operation with contents of 'source' order } var i: byte; newRec: TBADxRecord; begin if BILLING_AWARE then begin if not Assigned(fOrdersSign.CopyBuffer) then //CQ5414 fOrdersSign.CopyBuffer := TBADxRecord.Create; //CQ5414 try for i := 0 to clstOrders.Count - 1 do begin if (fOrdersSign.frmSignOrders.clstOrders.Selected[i]) then begin fOrdersSign.targetOrderID := TChangeItem(fOrdersSign.frmSignOrders.clstOrders.Items.Objects[i]).ID; if fOrdersSign.targetOrderID = fOrdersSign.srcOrderID then //disallow copying an order to itself Continue else begin fOrdersSign.CopyBuffer.FOrderID := BUFFER_ORDER_ID; //*************************************************************** if Not UBACore.IsOrderBillable(targetOrderID) then begin ShowMsg(BA_NA_PASTE_DISALLOWED); fOrdersSign.targetOrderID := ''; Continue; end; //*************************************************************** newRec := TBADxRecord.Create; with newRec do begin FOrderID := fOrdersSign.targetOrderID; FBADxCode := CopyBuffer.FBADxCode; FBASecDx1 := CopyBuffer.FBASecDx1; FBASecDx2 := CopyBuffer.FBASecDx2; FBASecDx3 := CopyBuffer.FBASecDx3; end; tempDxList.Add(newRec); CopyTFCIToTargetOrder( fOrdersSign.targetOrderID, fOrdersSign.chkBoxStatus); SetCheckBoxStatus( fOrdersSign.targetOrderID); //calls uSignItems.SetSigItems() end; end; end; except on EListError do begin ShowMsg('EListError in frmSignOrders.Paste1Click()'+#13+'for i := 0 to clstOrders.Count - 1 do'); raise; end; end; clstOrders.Refresh; //Update grid to show pasted Dx end; end; procedure TfrmSignOrders.clstOrdersMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); { - Open copy/paste popup menu. } var ClientPoint: TPoint; ScreenPoint: TPoint; begin if not BILLING_AWARE then clstOrders.PopupMenu := nil; if BILLING_AWARE then begin try if Button = mbRight then //Right-click to open copy/paste popup menu begin //CQ3325 if fOrdersSign.frmSignOrders.clstOrders.Items.Count = 1 then begin Copy1.Enabled := false; Paste1.Enabled := false end else begin Copy1.Enabled := true; end; //End CQ3325 if not frmSignOrders.clstOrders.Selected[clstOrders.ItemIndex] then (Sender as TCheckListBox).Selected[clstOrders.ItemIndex] := true; ClientPoint.X := X; ClientPoint.Y := Y; ScreenPoint := clstOrders.ClientToScreen(ClientPoint); poBACopyPaste.Popup(ScreenPoint.X, ScreenPoint.Y); end; except on EListError do begin ShowMsg('EListError in frmSignOrders.clstOrdersMouseDown()'); raise; end; end; end; end; procedure TfrmSignOrders.clstOrdersClick(Sender: TObject); //If grid item is an order-able item, then enable the Diagnosis button // else disable the Diagnosis button. var thisChangeItem: TChangeItem; i: smallint; thisOrderList: TStringList; begin thisOrderList := TStringList.Create; {Begin BillingAware} if BILLING_AWARE then begin if clstOrders.Items.Count > 1 then copy1.Enabled := True else copy1.Enabled := False; for i := 0 to clstOrders.Items.Count - 1 do begin if clstOrders.Selected[i] then begin thisChangeItem := TChangeItem(clstOrders.Items.Objects[i]); //Disallow copying of a grid HEADER item on LEFT MOUSE CLICK if thisChangeItem = nil then begin Copy1.Enabled := false; buOrdersDiagnosis.Enabled := false; Exit; end; if (thisChangeItem <> nil) then //Blank row - not an order item begin thisOrderList.Clear; thisOrderList.Add(thisChangeItem.ID); if IsAllOrdersNA(thisOrderList) then begin Diagnosis1.Enabled := false; buOrdersDiagnosis.Enabled := false; end else begin Diagnosis1.Enabled := true; buOrdersDiagnosis.Enabled := true; end end else begin buOrdersDiagnosis.Enabled := false; Diagnosis1.Enabled := False; Break; end; end; end; if Assigned(thisOrderList) then thisOrderList.Free; end; end; procedure TfrmSignOrders.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var j: integer; //CQ5054 begin inherited; if FOSTFHintWndActive then begin FOSTFhintWindow.ReleaseHandle ; FOSTFHintWndActive := False ; end; case Key of 67,99: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorSC,fraCoPay.lblSC2); //C,c 86,118: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorCV,fraCoPay.lblCV2); //V,v 79,111: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorAO,fraCoPay.lblAO2); //O,o 82,114: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorIR,fraCoPay.lblIR2); //R,r 65,97: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorEC,fraCoPay.lblSWAC2); //A,a 77,109: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorMST,fraCoPay.lblMST2); //M,m 78,110: if (ssAlt in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorHNC,fraCoPay.lblHNC2); //N,n 72,104: if (ssALT in Shift) then ShowTreatmentFactorHints(BAFactorsRec.FBAFactorSHAD,fraCopay.lblSHAD2); // H,h //CQ5054 83,115: if (ssAlt in Shift) then begin for j := 0 to clstOrders.Items.Count-1 do clstOrders.Selected[j] := false; clstOrders.Selected[0] := true; clstOrders.SetFocus; end; //end CQ5054 end; end; //BILLING AWARE Procedure procedure TfrmSignOrders.ShowTreatmentFactorHints(var pHintText: string; var pCompName: TVA508StaticText); // 508 var HRect: TRect; thisRect: TRect; x,y: integer; begin try if FOSTFhintWndActive then begin FOSTFhintWindow.ReleaseHandle; FOSTFhintWndActive := False; end; except on E: Exception do begin {$ifdef debug}Show508Message('Unhandled exception in procedure TfrmSignOrders.ShowTreatmentFactorHints()');{$endif} raise; end; end; try FOSTFhintWindow := THintWindow.Create(frmSignOrders); FOSTFhintWindow.Color := clInfoBk; GetWindowRect(pCompName.Handle,thisRect); x := thisRect.Left; y := thisRect.Top; hrect := FOSTFhintWindow.CalcHintRect(Screen.Width, pHintText,nil); hrect.Left := hrect.Left + X; hrect.Right := hrect.Right + X; hrect.Top := hrect.Top + Y; hrect.Bottom := hrect.Bottom + Y; fraCoPay.LabelCaptionsOn(not FOSTFHintWndActive); FOSTFhintWindow.ActivateHint(hrect, pHintText); FOSTFHintWndActive := True; except on E: Exception do begin {$ifdef debug}Show508Message('Unhandled exception in procedure TfrmSignOrders.ShowTreatmentFactorHints()');{$endif} raise; end; end; end; procedure TfrmSignOrders.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin try if FOSTFhintWndActive then begin FOSTFhintWindow.ReleaseHandle; FOSTFHintWndActive := False; Application.ProcessMessages; end; except on E: Exception do begin {$ifdef debug}Show508Message('Unhandled exception in procedure TfrmSignOrders.FormMouseMove()');{$endif} raise; end; end; end; procedure TfrmSignOrders.FormResize(Sender: TObject); begin inherited; clstOrders.invalidate; end; procedure TfrmSignOrders.fraCoPaylblHNCMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin fraCoPay.LabelCaptionsOn(not FOSTFHintWndActive) end; procedure TfrmSignOrders.fraCoPayLabel23Enter(Sender: TObject); begin (Sender as TVA508StaticText).Font.Style := [fsBold]; end; procedure TfrmSignOrders.fraCoPayLabel23Exit(Sender: TObject); begin (Sender as TVA508StaticText).Font.Style := []; end; procedure TfrmSignOrders.SetItemTextToState; var i : integer; begin //The with statement below would cause access violations on other Delphi machines. { with clstOrders do begin } //Must use fully qualifying path includeing the unit... very wierd! if fOrdersSign.frmSignOrders.clstOrders.Count < 1 then Exit; for i := 0 to fOrdersSign.frmSignOrders.clstOrders.Count-1 do if fOrdersSign.frmSignOrders.clstOrders.Items.Objects[i] <> nil then //Not a Group Title begin if fOrdersSign.frmSignOrders.clstOrders.Items.Objects[i] is TOrder then if fOrdersSign.frmSignOrders.clstOrders.Checked[i] then fOrdersSign.frmSignOrders.clstOrders.Items[i] := 'Checked '+TOrder(fOrdersSign.frmSignOrders.clstOrders.Items.Objects[i]).Text else fOrdersSign.frmSignOrders.clstOrders.Items[i] := 'Not Checked '+TOrder(fOrdersSign.frmSignOrders.clstOrders.Items.Objects[i]).Text; end; if fOrdersSign.frmSignOrders.clstOrders.ItemIndex >= 0 then fOrdersSign.frmSignOrders.clstOrders.Selected[fOrdersSign.frmSignOrders.clstOrders.ItemIndex] := True; // end; end; procedure TfrmSignOrders.clstOrdersKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = VK_Space) then FormatListForScreenReader end; procedure TfrmSignOrders.FormatListForScreenReader; begin if ScreenReaderActive then SetItemTextToState; end; end.