VistA-cprs/CPRS-Chart/uProbs.pas

1321 lines
36 KiB
Plaintext
Raw Blame History

unit uProbs;
interface
uses
SysUtils, Windows, Messages, Controls, Classes, StdCtrls, ORfn,
ORCtrls, Dialogs, Forms, Grids, graphics, ORNet, uConst, Vawrgrid;
const
fComStart=4;
v:char = #254;
PL_OP_VIEW:char = 'C';
PL_IP_VIEW:char = 'S';
PL_UF_VIEW:char = 'U';
PL_CLINIC:char ='C';
PL_WARD:char='W';
ACTIVE_LIST_CAP='Active Problems';
INACTIVE_LIST_CAP='Inactive Problems';
BOTH_LIST_CAP= 'Active and Inactive Problems';
REMOVED_LIST_CAP='Removed Problems';
type
{Key/value -internal/external pairs}
TKeyVal=class(TObject)
Id:string;
name:string; {may want to use instead of id sometime}
intern:string;
extern:string;
internOrig:string;
externOrig:string;
function GetDHCPField:string;
public
procedure DHCPtoKeyVal(DHCPFld:String);
property DHCPField:string read GetDHCPField;
end;
TComment=class(TObject)
IFN:string;
Facility:string;
Narrative:string;
Status:String;
DateAdd:string;
AuthorID:string;
AuthorName:String;
StatusFlag:string; {used for processing adds/deletes}
function GetExtDateAdd:string;
function GetAge:boolean;
constructor Create(dhcpcom:string);
destructor Destroy; override;
function TComtoDHCPCom:string;
property ExtDateAdd:string read GetExtDateAdd;
property IsNew:boolean read GetAge;
end;
{patient qualifiers}
TPLPt=class(TObject)
PtVAMC:string;
PtDead:string;
PtBid:string;
PtServiceConnected:boolean;
PtAgentOrange:boolean;
PtRadiation:boolean;
PtEnvironmental:boolean;
PtHNC:boolean;
PtMST:boolean;
constructor Create(Alist:TStringList);
function GetGMPDFN(dfn:string;name:String):string;
function Today:string;
end;
{ User params}
TPLUserParams=class(TObject)
usPrimeUser:Boolean; {GMPLUSER true if clinical entry, false if clerical}
usDefaultView:String;
usCurrentView:String; {what view does user currently have? (OP,IP,Preferred,Unfilterred)}
usVerifyTranscribed:Boolean; {authority to verify transcribed problems}
usPromptforCopy:boolean;
usUseLexicon:boolean; {user will be using Lexicon}
usReverseChronDisplay:Boolean;
usViewAct:String; {viewing A)ctive, I)nactive, B)oth, R)emoved problems}
usViewProv:String; {prov (ptr #200) of displayed list or 0 for all}
usService:String; {user's service/section}
{I can't see where either of the ViewClin or ViewServ vals are setup in the
M application. They are documented in the PL V2.0 tech manual though}
usViewServ:string; {should be a list of ptr to file 49, format ptr/ptr/...}
usViewClin:string; {should be a list of ptr to file 44, format ptr/ptr/...}
usViewComments: string;
usDefaultContext: string;
usTesting:boolean; {used for test purposes only}
usClinList:TstringList;
usServList:TstringList;
constructor Create(alist:TstringList);
destructor Destroy; override;
end;
{filter lists}
TPLFilters = class(TObject)
ProviderList:TstringList;
ClinicList:TstringList;
ServiceList:TStringList;
constructor create;
destructor destroy; override;
end;
{problem record}
TProbRec = class(TObject)
private
fNewrec:Tstringlist;
fOrigRec:TStringList;
fPIFN:String;
fDiagnosis:Tkeyval; {.01}
fModDate:TKeyVal; {.03}
fNarrative:TKeyVal; {.05}
fEntDate:TKeyVal; { .08}
fStatus:TKeyVal; {.12}
fOnsetDate:TKeyVal; {.13}
fProblem:TKeyVal; {1.01}
fCondition:TKeyVal; {1.02}
fEntBy:TKeyVal; {1.03}
fRecBy:TKeyVal; {1.04}
fRespProv:TKeyVal; {1.05}
fService:TKeyVal; {1.06}
fResolveDate:TKeyVal; {1.07}
fClinic:TKeyVal; {1.08}
fRecordDate:TKeyVal; {1.09}
fServCon:TKeyVal; {1.1}
fAOExposure:TKeyVal; {1.11}
fRadExposure:TKeyVal; {1.12}
fGulfExposure:TKeyVal; {1.13}
fPriority:TKeyVal; {1.14}
fHNC:TKeyVal; {1.15}
fMST:TKeyVal; {1.16}
fFieldList:TstringList; {list of fields by name and class (TKeyVal or TComment)}
fFilerObj:TstringList;
fCmtIsXHTML: boolean;
fCmtNoEditReason: string;
Procedure LoadField(Fldrec:TKeyVal;Id:String;name:string);
Procedure CreateFields;
procedure LoadComments;
procedure SetDate(datefld:TKeyVal;dt:TDateTime);
function GetModDate:TDateTime;
procedure SetModDate(value:TDateTime);
function GetEntDate:TDateTime;
procedure SetEntDate(value:TDateTime);
procedure SetOnsetDate(value:TDateTime);
function GetOnsetDate:TDateTime;
Function GetSCProblem:Boolean;
Procedure SetSCProblem(value:Boolean);
Function GetAOProblem:Boolean;
Procedure SetAOProblem(value:Boolean);
Function GetRADProblem:Boolean;
Procedure SetRADProblem(value:Boolean);
Function GetENVProblem:Boolean;
Procedure SetENVProblem(value:Boolean);
Function GetHNCProblem:Boolean;
Procedure SetHNCProblem(value:Boolean);
Function GetMSTProblem:Boolean;
Procedure SetMSTProblem(value:Boolean);
function GetStatus:String;
procedure SetStatus(value:String);
function GetPriority:String;
procedure SetPriority(value:String);
function GetRESDate:TDateTime;
procedure SetRESDate(value:TDateTime);
function GetRECDate:TDateTime;
procedure SetRECDate(value:TDateTime);
procedure SetNarrative(value:TKeyVal);
function GetTDateTime(dt:string):TDateTime;
function GetFilerObject:TstringList;
function GetAltFilerObject:TstringList;
function GetCommentCount:integer;
Procedure EraseComments(clist:TList);
function GetModDatstr:string;
procedure SetModDatStr(value:string);
function GetEntDatstr:string;
procedure SetEntDatStr(value:string);
function GetOnsetDatstr:string;
procedure SetOnsetDatStr(value:string);
function GetResDatstr:string;
procedure SetResDatStr(value:string);
function GetRecDatstr:string;
procedure SetRecDatStr(value:string);
procedure SetDateString(df:TKeyVal;value:string);
function GetCondition:string;
procedure SetCondition(value:String);
public
fComments:TList; {comments}
procedure AddNewComment(Txt:string);
function FieldChanged(fldName:string):Boolean;
constructor Create(AList:TstringList);
destructor Destroy;override;
property RawNewRec:TstringList read fNewRec;
property RawOrigRec:TStringList read fOrigRec;
property DateModified:TDateTime read GetModDate write SetModDate;
property DateModStr:string read GetModDatStr write SetModDatStr;
property DateEntered:TDateTime read GetEntDate write SetEntDate;
property DateEntStr:string read GetEntDatStr write SetEntDatStr;
property DateOnset:TDateTime read GetOnsetDate write SetOnsetDate;
property DateOnsetStr:string read GetOnsetDatStr write SetOnsetDatStr;
property SCProblem:Boolean read GetSCProblem write SetSCProblem;
property AOProblem:Boolean read GetAOProblem write SetAOProblem;
property RADProblem:Boolean read GetRadProblem write SetRADProblem;
property ENVProblem:Boolean read GetENVProblem write SetENVProblem;
property HNCProblem:Boolean read GetHNCProblem write SetHNCProblem;
property MSTProblem:Boolean read GetMSTProblem write SetMSTProblem;
property Status:String read GetStatus write SetStatus;
property Narrative:TKeyVal read fNarrative write SetNarrative;
property Diagnosis:TKeyVal read fDiagnosis write fDiagnosis;
property Problem:TKeyVal read fProblem write fProblem;
property RespProvider:TKeyVal read fRespProv write fRespProv;
property EnteredBy:TKeyVal read fEntBy write fEntBy;
property RecordedBy:TKeyVal read fRecBy write fRecBy;
property Service:TKeyVal read fService write fService;
property Clinic:TKeyVal read fClinic write fClinic;
property DateResolved:TDateTime read GetResDate write SetResdate;
property DateResStr:string read GetResDatStr write SetResDatStr;
property DateRecorded:TDateTime read GetRecDate write SetRecdate;
property DateRecStr:string read GetRecDatStr write SetRecDatStr;
property Priority:string read GetPriority write SetPriority;
property Comments:TList read fComments write fComments;
property Condition:string read GetCondition write SetCondition;
property CommentCount:integer read GetCommentCount;
property FilerObject:TstringList read GetFilerObject;
property AltFilerObject:TstringList read GetAltFilerObject;
property PIFN:string read fPIFN write fPIFN;
property CmtIsXHTML: boolean read fCmtIsXHTML;
property CmtNoEditReason: string read fCmtNoEditReason;
end;
var
ProbRec :TProbRec;
PLPt :TPLPt;
PLUser :TPLUserParams;
pProviderID :int64; {this is provider reviewing record, not resp provider}
pProviderName :string; {ditto}
PLFilters :TPLFilters;
PLProblem :string; {this is problem selected from lexicon lookup form}
procedure GetListforIP(Alist:TstringList; AGrid: TCaptionListBox);
procedure GetListforOP(Alist:TstringList; AGrid: TCaptionListBox);
procedure LoadFilterList(Alist:TstringList;DestList:TstringList);
procedure ShowFilterStatus(s: string);
procedure InitViewFilters(Alist:TstringList);
procedure SetViewFilters(Alist:TStringList);
Function DateStringOK(ds:string):string;
Function StripSpace(str:string):string;
function ByProvider:String;
function ForChars(Num, FontWidth: Integer): Integer;
procedure GetFontInfo(AHandle: THandle; var FontWidth, FontHeight: Integer);
function ShortDateStrToDate(shortdate: string): string ;
//function NewComment: string ;
//function EditComment(OldValue: string): string ;
function FixQuotes(Instring: string): string;
implementation
uses
rCore, uCore;//, fProbCmt;
const
Months: array[1..12] of string[3] = ('JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC');
{------------------- TKeyVal Class -----------------}
function TKeyVal.GetDHCPField:string;
begin
result := intern + u + extern;
end;
procedure TKeyVal.DHCPtoKeyVal(DHCPFld:String);
begin
intern := Piece(DHCPFld,u,1);
extern := Piece(DHCPFLd,u,2);
end;
{------------------- TComment Class ----------------}
constructor TComment.Create(dhcpcom:string);
begin
{create and instantiate a Tcomment object}
IFN:=Piece(dhcpcom,u,1);
Facility:=Piece(dhcpcom,u,2);
Narrative:=Piece(dhcpcom,u,3);
Status:=Piece(dhcpcom,u,4);
DateAdd:=Piece(dhcpcom,u,5);
AuthorID:=Piece(dhcpcom,u,6);
AuthorName:=Piece(dhcpcom,u,7);
StatusFlag:='';
end;
destructor TComment.Destroy;
begin
inherited destroy;
end;
function TComment.TComtoDHCPCom:string;
begin
Narrative := FixQuotes(Narrative);
if uppercase(IFN)='NEW' then {new note}
result := Narrative
else {potential edit of existing note}
result := IFN + u + Facility + u + Narrative + u +
Status + u + DateAdd + u + AuthorID; {leave off author name}
end;
function TComment.GetExtDateAdd:String;
begin
result := FormatFMDateTime('mmm dd yyyy',StrToFloat(DateAdd)) ;
end;
function TComment.Getage:boolean;
begin
result := uppercase(IFN)='NEW';
end;
{-------------------------- TPLPt Class ----------------------}
constructor TPLPt.Create(Alist:TStringList);
var
i: integer;
begin
for i := 0 to AList.Count - 1 do
case i of
0: PtVAMC := copy(Alist[i],1,999);
1: PtDead := AList[i];
2: PtServiceConnected := (AList[i] = '1');
3: PtAgentOrange := (AList[i] = '1');
4: PtRadiation := (AList[i] = '1');
5: PtEnvironmental := (AList[i] = '1');
6: PtBID := Alist[i];
7: PtHNC := (AList[i] = '1');
8: PtMST := (AList[i] = '1');
end;
end;
function TPLPt.GetGMPDFN(dfn:string;name:string):string;
begin
result := dfn + u + name + u + PtBID + u + PtDead
end;
function TPLPt.Today:string;
{returns string in DHCP^mmm dd yyyy format}
begin
result := Piece(FloatToStr(FMToday),'.',1) + u + FormatFMDateTime('mmm dd yyyy',FMToday) ;
end;
{-------------------- TUserParams -------------------------------}
constructor TPLUserParams.create(alist:TstringList);
var
p:string;
i:integer;
begin
usPrimeUser := false;
usDefaultView := '';
usVerifyTranscribed := True; // SHOULD DEFAULT BE FALSE???
usPromptforCopy := false;
usUseLexicon := false;
usReverseChronDisplay := true;
usViewAct := 'A';
usViewProv := '0^All';
usService := '';
usViewcomments := '0';
usClinList := TstringList.create;
usServList := TstringList.create;
if alist.count=0 then exit; {BAIL OUT IF LIST EMPTY}
//usPrimeUser := False; {for testing}
usPrimeUser := (alist[0]='1');
usDefaultView := alist[1];
if usDefaultView = '' then
begin
if Patient.Inpatient then usDefaultView := PL_IP_VIEW
else usDefaultView := PL_OP_VIEW;
end;
usVerifyTranscribed := (alist[2]='1');
usPromptforCopy := (alist[3]='1');
//usUseLexicon := False; {for testing}
usUseLexicon := (alist[4]='1');
usReverseChronDisplay := (alist[5]='1');
usViewAct := alist[6];
usViewProv := alist[7];
usService := alist[8];
usViewServ := alist[9];
usViewClin := alist[10];
usTesting := (alist[11]<>'');
usViewComments := AList[12];
usCurrentView := usDefaultView;
usDefaultContext := ';;' + usViewAct + ';' + usViewComments + ';' + Piece(usViewProv, U, 1);
if usViewClin <> '' then
begin
i := 1;
repeat
begin
p := Piece(usViewClin,'/',i);
inc(i);
if p <> '' then usClinList.add(p);
end;
until p = '';
end;
if usViewServ <> '' then
begin
i := 1;
repeat
begin
p := Piece(usViewServ,'/',i);
inc(i);
if p <> '' then usServList.add(p);
end;
until p = '';
end;
end;
destructor TPLUserParams.Destroy;
begin
usClinList.free;
usServList.free;
inherited destroy;
end;
{-------------------- TPLFilters -------------------}
constructor TPLFilters.Create;
begin
ProviderList := TstringList.create;
ClinicList := TstringList.create;
ServiceList := TStringList.create;
end;
destructor TPLFilters.destroy;
begin
ProviderList.free;
ClinicList.Free;
ServiceList.Free;
inherited destroy;
end;
{------------------ TProbRec -----------------------}
constructor TProbRec.create(AList:TstringList);
var
i: integer;
begin
fFieldList := TstringList.create;
fFilerObj := TStringList.Create;
fNewRec := TstringList.create;
for i := 0 to Pred(Alist.count) do
if copy(Alist[i],1,3) = 'NEW' then fNewRec.add(Alist[i]);
fOrigRec := TStringList.Create;
for i := 0 to pred(Alist.count) do
if copy(Alist[i],1,3) = 'ORG' then fOrigRec.add(Alist[i]);
CreateFields;
{names selected to agree with subscripts of argument array to callable
entrypoints in ^GMPUTL where possible.}
LoadField(fDiagnosis,'.01','DIAGNOSIS');
LoadField(fModDate,'.03','MODIFIED');
LoadField(fNarrative,'.05','NARRATIVE');
LoadField(fEntDate,'.08','ENTERED');
LoadField(fStatus,'.12','STATUS');
LoadField(fOnsetDate,'.13','ONSET');
LoadField(fProblem,'1.01','LEXICON');
LoadField(fCondition,'1.02','CONDITION');
LoadField(fEntBy,'1.03','ENTERER');
LoadField(fRecBy,'1.04','RECORDER');
LoadField(fRespProv,'1.05','PROVIDER');
LoadField(fService,'1.06','SERVICE');
LoadField(fResolveDate,'1.07','RESOLVED');
LoadField(fClinic,'1.08','LOCATION');
LoadField(fRecordDate,'1.09','RECORDED');
LoadField(fServCon,'1.1','SC');
LoadField(fAOExposure,'1.11','AO');
LoadField(fRadExposure,'1.12','IR');
LoadField(fGulfExposure,'1.13','EC');
LoadField(fPriority,'1.14','PRIORITY');
LoadField(fHNC,'1.15','HNC');
LoadField(fMST,'1.16','MST');
LoadComments;
end;
destructor TProbRec.destroy;
begin
fOrigRec.free;
fNewrec.free;
fDiagnosis.free;
fModDate.free;
fNarrative.free;
fEntDate.free;
fStatus.free;
fOnsetDate.free;
fProblem.free;
fCondition.free;
fRespProv.free;
fEntBy.free;
fRecBy.Free;
fService.free;
fResolveDate.free;
fClinic.free;
fRecordDate.free;
fServCon.free;
fAOExposure.free;
fRadExposure.free;
fGulfExposure.free;
fPriority.free;
fHNC.free;
fMST.free;
fFieldList.free;
fFilerObj.free;
EraseComments(fComments);
fComments.free;
inherited Destroy;
end;
procedure TProbRec.EraseComments(clist:TList);
var
i:integer;
begin
if clist.count>0 then
begin
for i:=0 to pred(clist.count) do
TComment(clist[i]).free;
end;
end;
procedure TProbRec.CreateFields;
begin
fDiagnosis:=TKeyVal.create;
fModDate:=TKeyVal.create;
fNarrative:=TKeyVal.create;
fEntDate:=TKeyVal.create;
fStatus:=TKeyVal.create;
fOnsetDate:=TKeyVal.create;
fProblem:=TKeyVal.create;
fCondition:=TKeyVal.create;
fEntBy:=TKeyVal.create;
fRecBy:=TKeyVal.create;
fRespProv:=TKeyVal.create;
fService:=TKeyVal.create;
fResolveDate:=TKeyVal.create;
fClinic:=TKeyVal.create;
fRecordDate:=TKeyVal.create;
fServCon:=TKeyVal.create;
fAOExposure:=TKeyVal.create;
fRadExposure:=TKeyVal.create;
fGulfExposure:=TKeyVal.create;
fPriority:=TKeyVal.create;
fHNC:=TKeyVal.create;
fMST:=TKeyVal.create;
fComments:=TList.create;
end;
procedure TProbRec.LoadField(Fldrec:TKeyVal;Id:String;name:string);
var
i:integer;
fldval:string;
function GetOrigVal(id:string):string;
var
i:integer;
begin
i := 0;
Result := '^';
if fOrigRec.count = 0 then exit;
while (i < fOrigRec.Count) and (Piece(fOrigRec[i],v,2)<>id) do inc(i);
if i = fOrigRec.Count then exit;
if Piece(fOrigRec[i],v,2) = id then Result := Piece(fOrigRec[i],v,3)
end;
begin
i := -1;
repeat
inc(i);
until (Piece(fNewRec[i],v,2) = id) or (i = Pred(fNewRec.count));
if Piece(fNewrec[i],v,2) = id then
fldVal := Piece(fNewrec[i],v,3)
else
fldVal := '^';
fldRec.id := id;
fldrec.name := name;
fldRec.intern := Piece(fldVal,'^',1);
fldRec.extern := Piece(fldval,'^',2);
{get the original values for later comparison}
fldVal := GetOrigVal(id);
fldRec.internOrig := Piece(fldVal,'^',1);
fldRec.internOrig := Piece(fldVal,'^',2);
{add this field to list}
fFieldList.addobject(id,fldrec);
end;
procedure TProbrec.LoadComments;
var
i,j:integer;
cv, noedit:string;
co:TComment;
first:boolean;
begin
j := 1; {first comment must be 1 or greater}
first := true;
for i := 0 to Pred(fNewRec.count) do
begin
if Piece(Piece(fNewRec[i],v,2),',',1) = '10' then
begin
if first then {the first line is just a counter}
begin
first := false;
// 'NEW<45>10,0<>-1^These notes are now in XHTML format and must be modified via CPRS-R.'
noedit := Piece(fNewRec[i], v, 3);
if Piece(noedit, U, 1) = '-1' then
begin
fCmtIsXHTML := TRUE;
fCmtNoEditReason := Piece(noedit, U, 2);
end
else
begin
fCmtIsXHTML := FALSE;
fCmtNoEditReason := '';
end;
end
else
begin
cv := Piece(fNewRec[i],v,3);
co := TComment.Create(cv);
fComments.add(co); {put object in list}
fFieldList.addObject('10,' + inttostr(j),co);
inc(j);
end;
end;
end;
end;
function TProbRec.GetCommentCount:integer;
begin
result := fComments.count;
end;
procedure TProbRec.AddNewComment(Txt:string);
var
cor:TComment;
begin
cor := TComment.create('NEW^^' + txt + '^A^' + FloatToStr(FMToday) + '^' + IntToStr(User.DUZ));
fComments.add(cor);
fFieldList.addObject('10,"NEW",' + inttostr(fComments.count),cor);
end;
function TProbrec.GetModDate:TDateTime;
var
dt:string;
begin
dt := fModDate.extern;
result := GetTDateTime(dt);
end;
procedure TProbrec.SetModDate(value:TDateTime);
begin
SetDate(fModDate,value);
end;
function TProbRec.GetModDatstr:string;
begin
result := fModdate.extern;
end;
procedure TProbRec.SetModDatStr(value:String);
begin
SetDateString(fModDate,value);
end;
procedure TProbRec.SetDateString(df:TKeyVal;value:string);
var
{c:char;
days:longint;}
fmresult: double ;
begin
{try }
if (value = '') then
begin
df.Intern := '';
df.Extern := '';
end
else
begin
fmresult := StrToFMDateTime(value) ;
if fmresult = -1 then
begin
df.intern := '0';
df.extern := '';
end
else
begin
df.intern := Piece(FloatToStr(fmresult),'.',1);
df.extern := FormatFMDateTime('mmm dd yyyy',fmresult);
end ;
end;
end;
function TProbrec.GetEntDate:TDateTime;
var
dt:string;
begin
dt := fEntDate.extern;
result := GetTDateTime(dt);
end;
procedure TProbrec.SetEntDate(value:TDateTime);
begin
SetDate(fEntDate,value);
end;
function TProbRec.GetEntDatstr:string;
begin
result:=fEntdate.extern;
end;
procedure TProbRec.SetEntDatStr(value:String);
begin
SetDateString(fEntDate,value);
end;
function TProbrec.GetOnsetDate:TDateTime;
var
dt:string;
begin
dt := fOnsetDate.extern;
result := GetTDateTime(dt);
end;
procedure TProbrec.SetOnsetDate(value:TDateTime);
begin
SetDate(fOnsetDate,value);
end;
function TProbRec.GetOnsetDatstr:string;
begin
result := fOnsetdate.extern;
end;
procedure TProbRec.SetOnsetDatStr(value:String);
begin
SetDateString(fOnsetDate,value);
end;
procedure TProbrec.SetDate(datefld:TKeyVal;dt:TDateTime);
begin
datefld.extern := DatetoStr(dt);
datefld.intern := FloatToStr(DateTimetoFMDateTime(dt));
end;
function TProbrec.GetSCProblem:Boolean;
begin
result := (fServCon.Intern='1');
end;
function TProbRec.GetCondition:string;
begin
result := fCondition.Intern;
end;
procedure TProbRec.SetCondition(value:string);
begin
if (uppercase(value[1])='T') or (value='1') then
begin
fCondition.intern := 'T';
fCondition.extern := 'Transcribed';
end
else if (uppercase(value[1]) = 'P') or (value = '0') then
begin
fCondition.intern := 'P';
fCondition.extern := 'Permanent';
end
else if uppercase(value[1]) = 'H' then
begin
fCondition.intern := 'H';
fCondition.extern := 'Hidden';
end;
end;
procedure TProbRec.SetSCProblem(value:Boolean);
begin
if value = true then
begin
fServCon.intern := '1';
fServCon.Extern := 'YES';
end
else
begin
fServCon.intern := '0';
fServCon.Extern := 'NO';
end;
end;
function TProbrec.GetAOProblem:Boolean;
begin
result := (fAOExposure.Intern='1');
end;
procedure TProbRec.SetAOProblem(value:Boolean);
begin
if value = true then
begin
fAOExposure.intern := '1';
fAOExposure.extern := 'Yes';
end
else
begin
fAOExposure.intern := '0';
fAOExposure.extern := 'No';
end;
end;
function TProbrec.GetRADProblem:Boolean;
begin
result := (fRADExposure.Intern = '1');
end;
procedure TProbRec.SetRADProblem(value:Boolean);
begin
if value = true then
begin
fRADExposure.intern := '1';
fRADExposure.extern := 'Yes';
end
else
begin
fRADExposure.intern := '0';
fRADExposure.extern := 'No';
end;
end;
function TProbrec.GetENVProblem:Boolean;
begin
result := (fGulfExposure.Intern = '1');
end;
procedure TProbRec.SetENVProblem(value:Boolean);
begin
if value = true then
begin
fGulfExposure.intern := '1';
fGulfExposure.extern := 'Yes';
end
else
begin
fGulfExposure.intern := '0';
fGulfExposure.extern := 'No';
end;
end;
function TProbrec.GetHNCProblem:Boolean;
begin
result := (fHNC.Intern = '1');
end;
procedure TProbRec.SetHNCProblem(value:Boolean);
begin
if value = true then
begin
fHNC.intern := '1';
fHNC.extern := 'Yes';
end
else
begin
fHNC.intern := '0';
fHNC.extern := 'No';
end;
end;
function TProbrec.GetMSTProblem:Boolean;
begin
result := (fMST.Intern = '1');
end;
procedure TProbRec.SetMSTProblem(value:Boolean);
begin
if value = true then
begin
fMST.intern := '1';
fMST.extern := 'Yes';
end
else
begin
fMST.intern := '0';
fMST.extern := 'No';
end;
end;
function TProbRec.GetStatus:String;
begin
result := Uppercase(fStatus.intern);
end;
procedure TProbRec.SetStatus(value:String);
begin
if (UpperCase(Value) = 'ACTIVE') or (Uppercase(value) = 'A') then
begin
fStatus.intern := 'A';
fStatus.extern := 'ACTIVE';
end
else
begin
fStatus.intern := 'I';
fStatus.extern := 'INACTIVE';
end;
end;
function TProbRec.GetPriority:String;
begin
result := Uppercase(fPriority.intern);
end;
procedure TProbRec.SetPriority(value:String);
begin
if (UpperCase(Value) = 'ACUTE') or (Uppercase(value) = 'A') then
begin
fPriority.intern := 'A';
fPriority.extern := 'ACUTE';
end
else
begin
fPriority.intern := 'C';
fPriority.extern := 'CHRONIC';
end;
end;
function TProbrec.GetResDate:TDateTime;
var
dt:string;
begin
dt := fResolveDate.extern;
result := GetTDateTime(dt);
end;
procedure TProbrec.SetResDate(value:TDateTime);
begin
SetDate(fResolveDate,value);
end;
function TProbRec.GetResDatstr:string;
begin
result := fResolvedate.extern;
end;
procedure TProbRec.SetResDatStr(value:String);
begin
SetDateString(fResolveDate,value);
end;
function TProbrec.GetRecDate:TDateTime;
var
dt:string;
begin
dt := fRecordDate.extern;
result := GetTDateTime(dt);
end;
procedure TProbrec.SetRecDate(value:TDateTime);
begin
SetDate(fRecordDate,value);
end;
function TProbRec.GetRecDatstr:string;
begin
result := fRecordDate.extern;
end;
procedure TProbRec.SetRecDatStr(value:String);
begin
SetDateString(fRecordDate,value);
end;
procedure TProbRec.SetNarrative(value:TKeyVal);
begin
if (value.intern = '') or (value.extern = '') then
begin
InfoBox('Both internal and external values required', 'Error', MB_OK or MB_ICONERROR);
exit;
end;
fNarrative.intern := value.intern;
fNarrative.extern := value.extern;
end;
function TProbRec.GetTDateTime(dt:string):TDateTime;
begin
try
if dt = '' then result := 0 else result := StrtoDate(dt);
except on exception do
result := 0;
end;
end;
{--------------------------------- Filer Objects -------------------------}
function TProbRec.GetFilerObject:TstringList;
{return array for filing in dhcp}
var
i:integer;
fldID,fldVal: string;
begin
fFilerObj.clear;
for i := 0 to pred(fFieldList.count) do
begin
fldID := fFieldList[i];
if pos(',',fldID)>0 then {is a comment field}
fldVal := TComment(fFieldList.objects[i]).TComtoDHCPCom
else {is a regular field}
begin
if fldID = '1.02' then {have to make exception for CONDITION field}
fldVal := TKeyVal(fFieldList.objects[i]).intern
else
fldVal := FixQuotes(TKeyVal(fFieldList.objects[i]).DHCPField);
end;
fFilerObj.add('GMPFLD(' + fldID + ')="' + fldVal + '"');
end;
fFilerObj.add('GMPFLD(10,0)="' + inttostr(fComments.count) + '"');
{now get original fields}
for i := 0 to pred(fOrigRec.count) do
begin
fldVal := fOrigRec[i];
fldID := Piece(fldVal,v,2);
fldVal := FixQuotes(Piece(fldVal,v,3));
fFilerObj.add('GMPORIG(' + fldID + ')="' + fldVal + '"');
end;
result := fFilerObj;
end;
function TProbRec.GetAltFilerObject:TstringList;
{return array for filing in dhcp via UPDATE^GMPLUTL}
{NOTES:
- leave narrative out, looks like inclusion causes new entry
- Date recorded (1.09) is non-editable, causes error if present}
var
i: integer;
fldID,fldVal: string;
begin
fFilerObj.Clear;
for i := 0 to pred(fFieldList.count) do
begin
fldID := fFieldList[i];
if pos(u + fldID + u, '^.01^.12^.13^1.01^1.05^1.07^1.08^1.1^1.11^1.12^1.13^1.15^1.16') > 0 then
{is a field eligible for update}
begin
fldVal := TKeyVal(fFieldList.objects[i]).intern;
fFilerObj.add('ORARRAY("' + TkeyVal(fFieldList.objects[i]).Name + '")="' + fldVal + '"');
end;
end;
fFilerObj.add('ORARRAY("PROBLEM")="' + fPIFN + '"');
result := fFilerObj;
end;
function TProbRec.FieldChanged(fldName:string):boolean;
var
i: integer;
begin
i := -1;
repeat
inc(i);
until (TKeyVal(fFieldList.objects[i]).name = fldName) or
(i=Pred(fFieldList.count));
if (TKeyVal(fFieldList.objects[i]).name = fldName) and
(TKeyVal(fFieldList.objects[i]).intern = TKeyVal(fFieldList.objects[i]).internOrig) then
Result := false
else
Result := true;
end;
{----------------------------------- Check Date -------------------------------}
function DateStringOK(ds: string): string;
var
fmresult: double ;
begin
ds := StripSpace(ds);
result := ds;
if ds = '' then exit;
if Copy(ds,1,1) = ',' then ds := Copy(ds, 2, 99) ;
fmresult := StrToFMDateTime(ds) ;
if fmresult = -1 then
result := 'ERROR'
else
result := FormatFMDateTime('mmm dd yyyy',fmresult) ;
end;
function StripSpace(str: string): string;
var
i,j: integer;
begin
i := 1;
j := length(str);
while str[i] = #32 do inc(i);
while str[j] = #32 do dec(j);
result := copy(str, i, j-i+1);
end;
{-------------------- procedures used in View Filters ----------------------}
procedure GetListforIP(Alist:TstringList; AGrid: TCaptionListBox);
var
i:integer;
sv:string;
anon:boolean;
begin
anon:=false;
with AGrid do
for i := 0 to pred(items.count) do
begin
//pt := cells[12,i];
{location type is ward, or no clinic and service is non nil}
{if (pt = PL_WARD) or ((cells[10,i] = '') and (cells[11,i] <> '')) then
begin }
sv := Piece( items[i], U, 12);
if sv <> '' then
begin
if Alist.indexof(sv) < 0 then Alist.add(sv);
end
else if (sv = '') and (not anon) then
begin
Alist.add('-1^<None recorded>');
anon := true;
end;
//end;
end;
end;
Procedure GetListforOP(Alist:TstringList; AGrid: TCaptionListBox);
var {get list of extant clinics from patient's problem list}
i: integer;
clin: string;
anon: boolean;
begin
anon := false;
with AGrid do
for i := 0 to pred(items.count) do
{begin
pt := cells[12,i];
if pt <> PL_WARD then}
begin
clin := Piece( items[i], U, 11);
if ((clin = '') or (clin = '0')) and (not anon) then
begin
AList.add('-1^<None recorded>'); {add a holder for "no clinic"}
anon := true;
end
else if (clin<>'') and (Alist.indexof(clin)<0) then
Alist.add(clin);
end;
//end;
end;
procedure LoadFilterList(Alist: TstringList; DestList: TstringList);
var
i:integer;
begin
for i := 0 to pred(Alist.count) do DestList.add(Piece(Alist[i],u,1));
end;
procedure ShowFilterStatus(s: string);
var
lin:string;
begin
if s = PL_OP_VIEW then lin := 'View clinics'
else if s = PL_IP_VIEW then lin := 'View services'
else lin := 'View all problems';
Application.ProcessMessages;
end;
function ByProvider: string;
begin
result := '';
if PLFilters.ProviderList.count > 0 then
if PLFilters.ProviderList[0] <> '0' then result := 'by Provider';
end;
procedure SetViewFilters(Alist:TStringList);
begin
if PLFilters.ProviderList.count = 0 then
PLFilters.ProviderList.add('0'); {default to all provides if none selected}
if PLUser.usCurrentView = PL_OP_VIEW then
begin
if PLFilters.ClinicList.count = 0 then
begin
//GetListforOP(Alist);
LoadFilterList(Alist,PLFilters.ClinicList);
end;
//PostMessage(frmProblems.Handle, UM_PLFILTER,0,0);
end
else if PLUser.usCurrentView = PL_IP_VIEW then
begin
if PLFilters.ServiceList.count=0 then
begin
//GetListforIP(Alist);
LoadFilterList(Alist,PLFilters.ServiceList);
end;
//PostMessage(frmProblems.Handle, UM_PLFILTER,0,0);
end
else {if no default view specified, assumed to be unfiltered}
PlUser.usCurrentView := PL_UF_VIEW;
ShowFilterStatus(PlUser.usCurrentView);
end;
procedure InitViewFilters(Alist: TstringList);
var
i:integer;
begin
if PLUser.usCurrentView = '' then PLUser.usCurrentView := PL_UF_VIEW;
if (PLUser.usViewProv = '') or (Piece(PLUser.usViewProv, U, 1) = '0') then
begin
PLFilters.ProviderList.clear;
PLFilters.Providerlist.add('0');
end
else {conserve user preferred provider}
PLFilters.ProviderList.Add(Piece(PLUser.usViewProv, U, 1));
if PLUser.usCurrentView = PL_UF_VIEW then
begin {no filter on patient type, so do routine filter on provider and bail}
SetViewFilters(Alist);
//exit;
end;
if (PLUser.usCurrentView = PL_OP_VIEW) and (PLUser.usViewClin = '') then
begin {no user preferred list of clinics, so get standard list and bail}
SetViewFilters(Alist);
//exit;
end;
if (PLUser.usCurrentView = PL_IP_VIEW) and (PLUser.usViewServ = '') then
begin {no user preferred list of services, so get standard list and bail}
SetViewFilters(Alist);
//exit;
end;
if (PLUser.usCurrentView = PL_OP_VIEW) and (PLUser.usClinList.Count > 0) then
begin {conserve user preferred clinic list}
for i := 0 to pred(PLUser.usClinList.Count) do
PLFilters.ClinicList.add(PLUser.usClinList[i]);
end;
if PLUser.usCurrentView = PL_IP_VIEW then
begin {conserve user preferred service list}
for i := 0 to pred(PLUser.usServList.Count) do
PLFilters.ServiceList.add(PLUser.usServList[i]);
end;
// ShowFilterStatus(PlUser.usCurrentView);
// PostMessage(frmProblems.Handle, UM_PLFILTER,0,0);
end;
function ForChars(Num, FontWidth: Integer): Integer;
begin
Result := Num * FontWidth;
end;
procedure GetFontInfo(AHandle: THandle; var FontWidth, FontHeight: Integer);
{ pass in a FONT HANDLE & return character width & height }
var
DC: HDC;
SaveFont: HFont;
FontMetrics: TTextMetric;
size: TSize ;
begin
DC := GetDC(0);
SaveFont := SelectObject(DC, AHandle);
GetTextExtentPoint32(DC, UpperCaseLetters + LowerCaseLetters, 52, size);
FontWidth := size.cx div 52;
GetTextMetrics(DC, FontMetrics);
FontHeight := FontMetrics.tmHeight;
SelectObject(DC, SaveFont);
ReleaseDC(0, DC);
end;
function ShortDateStrToDate(shortdate: string): string ;
{Converts date in format 'mmm dd,yy' or 'mmm dd,yyyy' to standard 'mm/dd/yy'}
var
month,day,year: string ;
i: integer ;
begin
result := 'ERROR' ;
if ((Pos(' ',shortdate) <> 4) or (Pos(',',shortdate) <> 7)) then exit ; {no spaces or comma}
for i := 1 to 12 do
if Months[i] = UpperCase(Copy(shortdate,1,3)) then month := IntToStr(i);
if month = '' then exit ; {invalid month name}
day := IntToStr(StrToInt(Copy(shortdate,5,2))) ;
year := IntToStr(StrToInt(Copy(shortdate,8,99))) ;
result := month+'/'+day+'/'+year ;
end ;
(*function NewComment: string ;
var
frmProbCmt: TfrmProbCmt ;
begin
frmProbCmt := TfrmProbCmt.Create(Application) ;
try
frmProbCmt.Execute;
result := frmProbCmt.CmtResult ;
finally
frmProbCmt.Free ;
end ;
end ;
function EditComment(OldValue: string): string ;
var
frmProbCmt: TfrmProbCmt ;
begin
frmProbCmt := TfrmProbCmt.Create(Application) ;
try
frmProbCmt.edComment.Text := Piece(OldValue, U, 2);
frmProbCmt.Execute;
result := frmProbCmt.CmtResult ;
finally
frmProbCmt.Free ;
end ;
end ;*)
function FixQuotes(InString: string): string;
var
i: integer;
OutString: string;
begin
OutString := '';
for i := 1 to Length(InString) do
if CharAt(InString, i) = '"' then
OutString := OutString + '""'
else
OutString := OutString + CharAt(InString, i);
Result := OutString;
end;
end.