| [459] | 1 | unit rConsults;
 | 
|---|
 | 2 | 
 | 
|---|
 | 3 | interface
 | 
|---|
 | 4 | 
 | 
|---|
 | 5 | uses SysUtils, Classes, ORNet, ORFn, rCore, uCore, TRPCB, dialogs, uConsults, rTIU, uTIU;
 | 
|---|
 | 6 | 
 | 
|---|
| [460] | 7 | type
 | 
|---|
 | 8 | 
 | 
|---|
 | 9 |   TUnresolvedConsults = record
 | 
|---|
 | 10 |     UnresolvedConsultsExist: boolean;
 | 
|---|
 | 11 |     ShowNagScreen: boolean;
 | 
|---|
 | 12 |   end;
 | 
|---|
 | 13 | 
 | 
|---|
| [459] | 14 | {Consult Titles }
 | 
|---|
 | 15 | function  DfltConsultTitle: integer;
 | 
|---|
 | 16 | function  DfltConsultTitleName: string;
 | 
|---|
 | 17 | function  DfltClinProcTitle: integer;
 | 
|---|
 | 18 | function  DfltClinProcTitleName: string;
 | 
|---|
 | 19 | function  IdentifyConsultsClass: integer;
 | 
|---|
 | 20 | function  IdentifyClinProcClass: integer;
 | 
|---|
 | 21 | procedure ListConsultTitlesShort(Dest: TStrings);
 | 
|---|
 | 22 | procedure ListClinProcTitlesShort(Dest: TStrings);
 | 
|---|
 | 23 | function SubSetOfConsultTitles(const StartFrom: string; Direction: Integer; IDNoteTitlesOnly: boolean): TStrings;
 | 
|---|
 | 24 | function SubSetOfClinProcTitles(const StartFrom: string; Direction: Integer; IDNoteTitlesOnly: boolean): TStrings;
 | 
|---|
 | 25 | procedure ResetConsultTitles;
 | 
|---|
 | 26 | procedure ResetClinProcTitles;
 | 
|---|
 | 27 | 
 | 
|---|
 | 28 | { Data Retrieval }
 | 
|---|
 | 29 | procedure GetConsultsList(Dest: TStrings; Early, Late: double;
 | 
|---|
 | 30 |   Service, Status: string; SortAscending: Boolean);
 | 
|---|
 | 31 | procedure LoadConsultDetail(Dest: TStrings; IEN: integer) ;
 | 
|---|
 | 32 | function  GetCurrentContext: TSelectContext;
 | 
|---|
 | 33 | procedure SaveCurrentContext(AContext: TSelectContext) ;
 | 
|---|
 | 34 | procedure DisplayResults(Dest: TStrings; IEN: integer) ;
 | 
|---|
 | 35 | procedure GetConsultRec(IEN: integer) ;
 | 
|---|
 | 36 | function  ShowSF513(ConsultIEN: integer): TStrings ;
 | 
|---|
 | 37 | procedure PrintSF513ToDevice(AConsult: Integer; const ADevice: string; ChartCopy: string;
 | 
|---|
 | 38 |   var ErrMsg: string);
 | 
|---|
 | 39 | function GetFormattedSF513(AConsult: Integer; ChartCopy: string): TStrings;
 | 
|---|
 | 40 | function UnresolvedConsultsExist: boolean;
 | 
|---|
| [460] | 41 | procedure GetUnresolvedConsultsInfo;
 | 
|---|
| [459] | 42 | 
 | 
|---|
 | 43 | {list box fillers}
 | 
|---|
 | 44 | function  SubSetOfStatus: TStrings;
 | 
|---|
 | 45 | function  SubSetOfUrgencies(ConsultIEN: integer): TStrings;
 | 
|---|
 | 46 | function  LoadServiceList(Purpose: integer): TStrings ;
 | 
|---|
 | 47 | function  LoadServiceListWithSynonyms(Purpose: integer): TStrings ; overload;
 | 
|---|
 | 48 | function  LoadServiceListWithSynonyms(Purpose, ConsultIEN: integer): TStrings ; overload;
 | 
|---|
 | 49 | function  SubSetOfServices(const StartFrom: string; Direction: Integer): TStrings;
 | 
|---|
 | 50 | function  FindConsult(ConsultIEN: integer): string ;
 | 
|---|
 | 51 | 
 | 
|---|
 | 52 | {user access level functions}
 | 
|---|
 | 53 | function  ConsultServiceUser(ServiceIEN: integer; DUZ: int64): boolean ;
 | 
|---|
 | 54 | function GetActionMenuLevel(ConsultIEN: integer): TMenuAccessRec ;
 | 
|---|
 | 55 | 
 | 
|---|
 | 56 | {consult result functions}
 | 
|---|
 | 57 | function  GetAssignableMedResults(ConsultIEN: integer): TStrings;
 | 
|---|
 | 58 | function  GetRemovableMedResults(ConsultIEN: integer): TStrings;
 | 
|---|
 | 59 | function  GetDetailedMedicineResults(ResultID: string): TStrings;
 | 
|---|
 | 60 | procedure AttachMedicineResult(ConsultIEN: integer; ResultID: string; DateTime: TFMDateTime; ResponsiblePerson: int64; AlertTo: string);
 | 
|---|
 | 61 | procedure RemoveMedicineResult(ConsultIEN: integer; ResultID: string; DateTime: TFMDateTime; ResponsiblePerson: int64);
 | 
|---|
 | 62 | 
 | 
|---|
 | 63 | {Consult Request Actions}
 | 
|---|
 | 64 | procedure ReceiveConsult(Dest: TStrings; IEN: integer; ReceivedBy: int64; RcptDate: TFMDateTime; Comments: TStrings);
 | 
|---|
 | 65 | procedure ScheduleConsult(Dest: TStrings; IEN: integer; ScheduledBy: Int64; SchdDate: TFMDateTime; Alert: integer;
 | 
|---|
 | 66 |      AlertTo: string; Comments: TStrings);
 | 
|---|
 | 67 | procedure DiscontinueConsult(Dest: TStrings; IEN: integer; DiscontinuedBy: int64;
 | 
|---|
 | 68 |      DiscontinueDate: TFMDateTime; Comments: TStrings);
 | 
|---|
 | 69 | procedure DenyConsult(Dest: TStrings; IEN: integer; DeniedBy: int64;
 | 
|---|
 | 70 |      DenialDate: TFMDateTime; Comments: TStrings);
 | 
|---|
 | 71 | procedure ForwardConsult(Dest: TStrings; IEN, ToService: integer; Forwarder, AttentionOf: int64;
 | 
|---|
 | 72 |      Urgency: integer; ActionDate: TFMDateTime; Comments: TStrings);
 | 
|---|
 | 73 | procedure AddComment(Dest: TStrings; IEN: integer; Comments: TStrings; ActionDate: TFMDateTime; Alert: integer;
 | 
|---|
 | 74 |      AlertTo: string) ;
 | 
|---|
 | 75 | procedure SigFindings(Dest: TStrings; IEN: integer; SigFindingsFlag: string; Comments: TStrings;  ActionDate: TFMDateTime;Alert: integer;
 | 
|---|
 | 76 |      AlertTo: string) ;
 | 
|---|
 | 77 | procedure AdminComplete(Dest: TStrings; IEN: integer; SigFindingsFlag: string; Comments: TStrings;
 | 
|---|
 | 78 |           RespProv: Int64; ActionDate: TFMDateTime; Alert: integer; AlertTo: string) ;
 | 
|---|
 | 79 | 
 | 
|---|
 | 80 |      { Consults Ordering Calls }
 | 
|---|
 | 81 | function ODForConsults: TStrings;
 | 
|---|
 | 82 | function ODForProcedures: TStrings;
 | 
|---|
 | 83 | function ConsultMessage(AnIEN: Integer): string;
 | 
|---|
 | 84 | function LoadConsultsQuickList: TStrings ;
 | 
|---|
 | 85 | function GetProcedureServices(ProcIEN: integer): TStrings;
 | 
|---|
 | 86 | function ConsultCanBeResubmitted(ConsultIEN: integer): string;
 | 
|---|
 | 87 | function LoadConsultForEdit(ConsultIEN: integer): TEditResubmitRec;
 | 
|---|
 | 88 | function ResubmitConsult(EditResubmitRec: TEditResubmitRec): string;
 | 
|---|
 | 89 | function SubSetOfProcedures(const StartFrom: string; Direction: Integer): TStrings;
 | 
|---|
 | 90 | function GetDefaultReasonForRequest(Service: string; Resolve: Boolean): TStrings;
 | 
|---|
 | 91 | function ReasonForRequestEditable(Service: string): string;
 | 
|---|
 | 92 | function GetNewDialog(OrderType: string): string;
 | 
|---|
 | 93 | function GetServiceIEN(ORIEN: string): string;
 | 
|---|
 | 94 | function GetProcedureIEN(ORIEN: string): string;
 | 
|---|
 | 95 | function GetConsultOrderIEN(ConsultIEN: integer): string;
 | 
|---|
 | 96 | function GetServicePrerequisites(Service: string): TStrings;
 | 
|---|
 | 97 | procedure GetProvDxMode(var ProvDx: TProvisionalDiagnosis; SvcIEN: string);
 | 
|---|
 | 98 | 
 | 
|---|
 | 99 | { Clinical Procedures Specific}
 | 
|---|
 | 100 | function GetSavedCPFields(NoteIEN: integer): TEditNoteRec;
 | 
|---|
 | 101 | 
 | 
|---|
 | 102 | var
 | 
|---|
 | 103 |   uConsultsClass: integer;
 | 
|---|
 | 104 |   uConsultTitles: TConsultTitles;
 | 
|---|
 | 105 |   uClinProcClass: integer;
 | 
|---|
 | 106 |   uClinProcTitles: TClinProcTitles;
 | 
|---|
| [460] | 107 |   uUnresolvedConsults: TUnresolvedConsults;
 | 
|---|
| [459] | 108 | 
 | 
|---|
 | 109 | implementation
 | 
|---|
 | 110 | 
 | 
|---|
 | 111 | uses  rODBase;
 | 
|---|
 | 112 | 
 | 
|---|
 | 113 | var
 | 
|---|
 | 114 |   uLastOrderedIEN: Integer;
 | 
|---|
 | 115 |   uLastOrderMsg: string;
 | 
|---|
 | 116 | 
 | 
|---|
 | 117 | { -------------------------- Consult Titles --------------------------------- }
 | 
|---|
 | 118 | 
 | 
|---|
 | 119 | function IdentifyConsultsClass: integer;
 | 
|---|
 | 120 | begin
 | 
|---|
 | 121 |   if uConsultsClass = 0 then
 | 
|---|
 | 122 |     uConsultsClass := StrToIntDef(sCallV('TIU IDENTIFY CONSULTS CLASS',[nil]), 0)  ;
 | 
|---|
 | 123 |   Result := uConsultsClass;
 | 
|---|
 | 124 | end;
 | 
|---|
 | 125 | 
 | 
|---|
 | 126 | procedure LoadConsultTitles;
 | 
|---|
 | 127 | { private - called one time to set up the uConsultTitles object }
 | 
|---|
 | 128 | var
 | 
|---|
 | 129 |   x: string;
 | 
|---|
 | 130 | begin
 | 
|---|
 | 131 |   if uConsultTitles <> nil then Exit;
 | 
|---|
 | 132 |   CallV('TIU PERSONAL TITLE LIST', [User.DUZ, IdentifyConsultsClass]);
 | 
|---|
 | 133 |   RPCBrokerV.Results.Insert(0, '~SHORT LIST');  // insert so can call ExtractItems
 | 
|---|
 | 134 |   uConsultTitles := TConsultTitles.Create;
 | 
|---|
 | 135 |   ExtractItems(uConsultTitles.ShortList, RPCBrokerV.Results, 'SHORT LIST');
 | 
|---|
 | 136 |   x := ExtractDefault(RPCBrokerV.Results, 'SHORT LIST');
 | 
|---|
 | 137 |   uConsultTitles.DfltTitle := StrToIntDef(Piece(x, U, 1), 0);
 | 
|---|
 | 138 |   uConsultTitles.DfltTitleName := Piece(x, U, 2);
 | 
|---|
 | 139 | end;
 | 
|---|
 | 140 | 
 | 
|---|
 | 141 | procedure ResetConsultTitles;
 | 
|---|
 | 142 | begin
 | 
|---|
 | 143 |   if uConsultTitles <> nil then
 | 
|---|
 | 144 |     begin
 | 
|---|
 | 145 |       uConsultTitles.Free;
 | 
|---|
 | 146 |       uConsultTitles := nil;
 | 
|---|
 | 147 |       LoadConsultTitles;
 | 
|---|
 | 148 |     end;
 | 
|---|
 | 149 | end;
 | 
|---|
 | 150 | 
 | 
|---|
 | 151 | function DfltConsultTitle: integer;
 | 
|---|
 | 152 | { returns the user defined default Consult title (if any) }
 | 
|---|
 | 153 | begin
 | 
|---|
 | 154 |   if uConsultTitles = nil then LoadConsultTitles;
 | 
|---|
 | 155 |   Result := uConsultTitles.DfltTitle;
 | 
|---|
 | 156 | end;
 | 
|---|
 | 157 | 
 | 
|---|
 | 158 | function DfltConsultTitleName: string;
 | 
|---|
 | 159 | { returns the name of the user defined default progress note title (if any) }
 | 
|---|
 | 160 | begin
 | 
|---|
 | 161 |   if uConsultTitles = nil then LoadConsultTitles;
 | 
|---|
 | 162 |   Result := uConsultTitles.DfltTitleName;
 | 
|---|
 | 163 | end;
 | 
|---|
 | 164 | 
 | 
|---|
 | 165 | procedure ListConsultTitlesShort(Dest: TStrings);
 | 
|---|
 | 166 | { returns the user defined list (short list) of Consult titles }
 | 
|---|
 | 167 | begin
 | 
|---|
 | 168 |   if uConsultTitles = nil then LoadConsultTitles;
 | 
|---|
 | 169 |   Dest.AddStrings(uConsultTitles.ShortList);
 | 
|---|
 | 170 |   if uConsultTitles.ShortList.Count > 0 then
 | 
|---|
 | 171 |   begin
 | 
|---|
 | 172 |     Dest.Add('0^________________________________________________________________________');
 | 
|---|
 | 173 |     Dest.Add('0^ ');
 | 
|---|
 | 174 |   end;
 | 
|---|
 | 175 | end;
 | 
|---|
 | 176 | 
 | 
|---|
 | 177 | function SubSetOfConsultTitles(const StartFrom: string; Direction: Integer; IDNoteTitlesOnly: boolean): TStrings;
 | 
|---|
 | 178 | { returns a pointer to a list of consults progress note titles (for use in a long list box) -
 | 
|---|
 | 179 |   The return value is a pointer to RPCBrokerV.Results, so the data must be used BEFORE
 | 
|---|
 | 180 |   the next broker call! }
 | 
|---|
 | 181 | begin
 | 
|---|
 | 182 | (*  if IDNoteTitlesOnly then        //  This RPC not changed for initial ID Notes release
 | 
|---|
 | 183 |     CallV('TIU LONG LIST CONSULT TITLES', [StartFrom, Direction, IDNoteTitlesOnly])
 | 
|---|
 | 184 |   else*)
 | 
|---|
 | 185 |     CallV('TIU LONG LIST CONSULT TITLES', [StartFrom, Direction]);
 | 
|---|
 | 186 |   //MixedCaseList(RPCBrokerV.Results);
 | 
|---|
 | 187 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 188 | end;
 | 
|---|
 | 189 | 
 | 
|---|
 | 190 | 
 | 
|---|
 | 191 | { -------------------------- Clinical Procedures Titles --------------------------------- }
 | 
|---|
 | 192 | function IdentifyClinProcClass: integer;
 | 
|---|
 | 193 | begin
 | 
|---|
 | 194 |   if uClinProcClass = 0 then
 | 
|---|
 | 195 |     uClinProcClass := StrToIntDef(sCallV('TIU IDENTIFY CLINPROC CLASS',[nil]), 0)  ;
 | 
|---|
 | 196 |   Result := uClinProcClass;
 | 
|---|
 | 197 | end;
 | 
|---|
 | 198 | 
 | 
|---|
 | 199 | procedure LoadClinProcTitles;
 | 
|---|
 | 200 | { private - called one time to set up the uConsultTitles object }
 | 
|---|
 | 201 | var
 | 
|---|
 | 202 |   x: string;
 | 
|---|
 | 203 | begin
 | 
|---|
 | 204 |   if uClinProcTitles <> nil then Exit;
 | 
|---|
 | 205 |   CallV('TIU PERSONAL TITLE LIST', [User.DUZ, IdentifyClinProcClass]);
 | 
|---|
 | 206 |   RPCBrokerV.Results.Insert(0, '~SHORT LIST');  // insert so can call ExtractItems
 | 
|---|
 | 207 |   uClinProcTitles := TClinProcTitles.Create;
 | 
|---|
 | 208 |   ExtractItems(uClinProcTitles.ShortList, RPCBrokerV.Results, 'SHORT LIST');
 | 
|---|
 | 209 |   x := ExtractDefault(RPCBrokerV.Results, 'SHORT LIST');
 | 
|---|
 | 210 |   uClinProcTitles.DfltTitle := StrToIntDef(Piece(x, U, 1), 0);
 | 
|---|
 | 211 |   uClinProcTitles.DfltTitleName := Piece(x, U, 2);
 | 
|---|
 | 212 | end;
 | 
|---|
 | 213 | 
 | 
|---|
 | 214 | procedure ResetClinProcTitles;
 | 
|---|
 | 215 | begin
 | 
|---|
 | 216 |   if uClinProcTitles <> nil then
 | 
|---|
 | 217 |     begin
 | 
|---|
 | 218 |       uClinProcTitles.Free;
 | 
|---|
 | 219 |       uClinProcTitles := nil;
 | 
|---|
 | 220 |       LoadClinProcTitles;
 | 
|---|
 | 221 |     end;
 | 
|---|
 | 222 | end;
 | 
|---|
 | 223 | 
 | 
|---|
 | 224 | function DfltClinProcTitle: integer;
 | 
|---|
 | 225 | { returns the user defined default ClinProc title (if any) }
 | 
|---|
 | 226 | begin
 | 
|---|
 | 227 |   if uClinProcTitles = nil then LoadClinProcTitles;
 | 
|---|
 | 228 |   Result := uClinProcTitles.DfltTitle;
 | 
|---|
 | 229 | end;
 | 
|---|
 | 230 | 
 | 
|---|
 | 231 | function DfltClinProcTitleName: string;
 | 
|---|
 | 232 | { returns the name of the user defined default progress note title (if any) }
 | 
|---|
 | 233 | begin
 | 
|---|
 | 234 |   if uClinProcTitles = nil then LoadClinProcTitles;
 | 
|---|
 | 235 |   Result := uClinProcTitles.DfltTitleName;
 | 
|---|
 | 236 | end;
 | 
|---|
 | 237 | 
 | 
|---|
 | 238 | procedure ListClinProcTitlesShort(Dest: TStrings);
 | 
|---|
 | 239 | { returns the user defined list (short list) of ClinProc titles }
 | 
|---|
 | 240 | begin
 | 
|---|
 | 241 |   if uClinProcTitles = nil then LoadClinProcTitles;
 | 
|---|
 | 242 |   Dest.AddStrings(uClinProcTitles.ShortList);
 | 
|---|
 | 243 |   if uClinProcTitles.ShortList.Count > 0 then
 | 
|---|
 | 244 |   begin
 | 
|---|
 | 245 |     Dest.Add('0^________________________________________________________________________');
 | 
|---|
 | 246 |     Dest.Add('0^ ');
 | 
|---|
 | 247 |   end;
 | 
|---|
 | 248 | end;
 | 
|---|
 | 249 | 
 | 
|---|
 | 250 | function SubSetOfClinProcTitles(const StartFrom: string; Direction: Integer; IDNoteTitlesOnly: boolean): TStrings;
 | 
|---|
 | 251 | { returns a pointer to a list of clinical procedures titles (for use in a long list box) -
 | 
|---|
 | 252 |   The return value is a pointer to RPCBrokerV.Results, so the data must be used BEFORE
 | 
|---|
 | 253 |   the next broker call! }
 | 
|---|
 | 254 | begin
 | 
|---|
 | 255 | (*  if IDNoteTitlesOnly then        //  This RPC not changed for initial ID Notes release
 | 
|---|
 | 256 |     CallV('TIU LONG LIST CLINPROC TITLES', [StartFrom, Direction, IDNoteTitlesOnly])
 | 
|---|
 | 257 |   else*)
 | 
|---|
 | 258 |     CallV('TIU LONG LIST CLINPROC TITLES', [StartFrom, Direction]);
 | 
|---|
 | 259 |   //MixedCaseList(RPCBrokerV.Results);
 | 
|---|
 | 260 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 261 | end;
 | 
|---|
 | 262 | 
 | 
|---|
 | 263 | {--------------- data retrieval ------------------------------------------}
 | 
|---|
 | 264 | 
 | 
|---|
 | 265 | procedure GetConsultsList(Dest: TStrings; Early, Late: double;
 | 
|---|
 | 266 |   Service, Status: string; SortAscending: Boolean);
 | 
|---|
 | 267 | { returns a list of consults for a patient, based on selected dates, service, status, or ALL}
 | 
|---|
 | 268 | var
 | 
|---|
 | 269 |   i: Integer;
 | 
|---|
 | 270 |   x, date1, date2: string;
 | 
|---|
 | 271 | begin
 | 
|---|
 | 272 |   if Early <= 0 then date1 := '' else date1 := FloatToStr(Early) ;
 | 
|---|
 | 273 |   if Late  <= 0 then date2 := '' else date2 := FloatToStr(Late)  ;
 | 
|---|
 | 274 |   CallV('ORQQCN LIST', [Patient.DFN, date1, date2, Service, Status]);
 | 
|---|
 | 275 |   with RPCBrokerV do
 | 
|---|
 | 276 |    begin
 | 
|---|
 | 277 |     if Copy(Results[0],1,1) <> '<' then
 | 
|---|
 | 278 |       begin
 | 
|---|
 | 279 |        SortByPiece(TStringList(Results), U, 2);
 | 
|---|
 | 280 |        if not SortAscending then InvertStringList(TStringList(Results));
 | 
|---|
 | 281 |        //SetListFMDateTime('mmm dd,yy', TStringList(Results), U, 2);
 | 
|---|
 | 282 |        for i := 0 to Results.Count - 1 do
 | 
|---|
 | 283 |          begin
 | 
|---|
 | 284 |            x := MakeConsultListItem(Results[i]);
 | 
|---|
 | 285 |            Results[i] := x;
 | 
|---|
 | 286 |          end;
 | 
|---|
 | 287 |        Dest.Assign(Results);
 | 
|---|
 | 288 |      end
 | 
|---|
 | 289 |     else
 | 
|---|
 | 290 |      begin
 | 
|---|
 | 291 |        Dest.Clear ;
 | 
|---|
 | 292 |        Dest.Add('-1^No Matches') ;
 | 
|---|
 | 293 |      end ;
 | 
|---|
 | 294 |   end;
 | 
|---|
 | 295 | end;
 | 
|---|
 | 296 | 
 | 
|---|
 | 297 | procedure LoadConsultDetail(Dest: TStrings; IEN: integer) ;
 | 
|---|
 | 298 | { returns the detail of a consult }
 | 
|---|
 | 299 | begin
 | 
|---|
 | 300 |   CallV('ORQQCN DETAIL', [IEN]);
 | 
|---|
 | 301 |   Dest.Assign(RPCBrokerV.Results);
 | 
|---|
 | 302 | end;
 | 
|---|
 | 303 | 
 | 
|---|
 | 304 | procedure DisplayResults(Dest: TStrings; IEN: integer) ;
 | 
|---|
 | 305 | { returns the results for a consult }
 | 
|---|
 | 306 | begin
 | 
|---|
 | 307 |   CallV('ORQQCN MED RESULTS', [IEN]);
 | 
|---|
 | 308 |   Dest.Assign(RPCBrokerV.Results);
 | 
|---|
 | 309 | end;
 | 
|---|
 | 310 | 
 | 
|---|
 | 311 | procedure GetConsultRec(IEN: integer);
 | 
|---|
 | 312 | {returns zero node from file 123, plus a list of all related TIU documents, if any}
 | 
|---|
 | 313 | const
 | 
|---|
 | 314 |   SHOW_ADDENDA = True;
 | 
|---|
 | 315 | var
 | 
|---|
 | 316 |    alist: TStrings;
 | 
|---|
 | 317 |    x: string ;
 | 
|---|
 | 318 |    i: integer;
 | 
|---|
 | 319 | {           1    2    3     4     5     6    7    8   9    10   11  12   13     14    15
 | 
|---|
 | 320 | { Pieces: EntDt^Pat^OrIFN^PtLoc^ToSvc^From^ReqDt^Typ^Urg^Place^Attn^Sts^LstAct^SndPrv^Rslt^
 | 
|---|
 | 321 |     16      17     18    19     20     21      22
 | 
|---|
 | 322 |  ^EntMode^ReqTyp^InOut^SigFnd^TIUPtr^OrdFac^FrgnCslt}
 | 
|---|
 | 323 | begin
 | 
|---|
 | 324 |   FillChar(ConsultRec, SizeOf(ConsultRec), 0);
 | 
|---|
 | 325 |   CallV('ORQQCN GET CONSULT', [IEN, SHOW_ADDENDA]);
 | 
|---|
 | 326 |   ConsultRec.IEN := IEN ;
 | 
|---|
 | 327 |   alist := TStringList.Create ;
 | 
|---|
 | 328 |  try
 | 
|---|
 | 329 |   alist.Assign(RPCBrokerV.Results) ;
 | 
|---|
 | 330 |   x := alist[0] ;
 | 
|---|
 | 331 |   if Piece(x,u,1) <> '-1' then
 | 
|---|
 | 332 |     with ConsultRec do
 | 
|---|
 | 333 |      begin
 | 
|---|
 | 334 |       EntryDate             := MakeFMDateTime(Piece(x, U, 1));
 | 
|---|
 | 335 |       ORFileNumber          := StrToIntDef(Piece(x, U, 3),0);
 | 
|---|
 | 336 |       PatientLocation       := StrToIntDef(Piece(x, U, 4),0);
 | 
|---|
 | 337 |       OrderingFacility      := StrToIntDef(Piece(x, U, 21),0);
 | 
|---|
 | 338 |       ForeignConsultFileNum := StrToIntDef(Piece(x, U, 22),0);
 | 
|---|
 | 339 |       ToService             := StrToIntDef(Piece(x, U, 5),0);
 | 
|---|
 | 340 |       From                  := StrToIntDef(Piece(x, U, 6),0);
 | 
|---|
 | 341 |       RequestDate           := MakeFMDateTime(Piece(x, U, 7));
 | 
|---|
 | 342 |       ConsultProcedure      := Piece(x, U, 8)  ;
 | 
|---|
 | 343 |       Urgency               := StrToIntDef(Piece(x, U, 9),0);
 | 
|---|
 | 344 |       PlaceOfConsult        := StrToIntDef(Piece(x, U, 10),0);
 | 
|---|
 | 345 |       Attention             := StrToInt64Def(Piece(x, U, 11),0);
 | 
|---|
 | 346 |       ORStatus              := StrToIntDef(Piece(x, U, 12),0);
 | 
|---|
 | 347 |       LastAction            := StrToIntDef(Piece(x, U, 13),0);
 | 
|---|
 | 348 |       SendingProvider       := StrToInt64Def(Piece(Piece(x, U, 14),';',1),0);
 | 
|---|
 | 349 |       SendingProviderName   := Piece(Piece(x, U, 14),';',2)   ;
 | 
|---|
 | 350 |       Result                := Piece(x, U, 15)  ;
 | 
|---|
 | 351 |       ModeOfEntry           := Piece(x, U, 16)  ;
 | 
|---|
 | 352 |       RequestType           := StrToIntDef(Piece(x, U, 17),0);
 | 
|---|
 | 353 |       InOut                 := Piece(x, U, 18)  ;
 | 
|---|
 | 354 |       Findings              := Piece(x, U, 19)  ;
 | 
|---|
 | 355 |       TIUResultNarrative    := StrToIntDef(Piece(x, U, 20),0);
 | 
|---|
 | 356 |       //ProvDiagnosis         := Piece(x, U, 23);  NO!!!!! Up to 180 Characters!!!!
 | 
|---|
 | 357 |       alist.delete(0) ;
 | 
|---|
 | 358 |       TIUDocuments := TStringList.Create ;
 | 
|---|
 | 359 |       MedResults := TStringList.Create;
 | 
|---|
 | 360 |       if alist.count > 0 then
 | 
|---|
 | 361 |         begin
 | 
|---|
 | 362 |           SortByPiece(TStringList(alist), U, 3);
 | 
|---|
 | 363 |           for i := 0 to alist.Count - 1 do
 | 
|---|
 | 364 |             if Copy(Piece(Piece(alist[i], U, 1), ';', 2), 1, 4) = 'MCAR' then
 | 
|---|
 | 365 |               MedResults.Add(alist[i])
 | 
|---|
 | 366 |             else
 | 
|---|
 | 367 |               TIUDocuments.Add(alist[i]);
 | 
|---|
 | 368 |         end;
 | 
|---|
 | 369 |      end  {ConsultRec}
 | 
|---|
 | 370 |   else
 | 
|---|
 | 371 |    ConsultRec.EntryDate := -1 ;
 | 
|---|
 | 372 |  finally
 | 
|---|
 | 373 |    alist.free ;
 | 
|---|
 | 374 |  end ;
 | 
|---|
 | 375 | end ;
 | 
|---|
 | 376 | 
 | 
|---|
 | 377 | {---------------- list box fillers -----------------------------------}
 | 
|---|
 | 378 | 
 | 
|---|
 | 379 | function SubSetOfStatus: TStrings;
 | 
|---|
 | 380 | { returns a pointer to a list of stati (for use in a list box) }
 | 
|---|
 | 381 | begin
 | 
|---|
 | 382 |   CallV('ORQQCN STATUS', [nil]);
 | 
|---|
 | 383 |   MixedCaseList(RPCBrokerV.Results);
 | 
|---|
 | 384 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 385 | end;
 | 
|---|
 | 386 | 
 | 
|---|
 | 387 | function SubSetOfUrgencies(ConsultIEN: integer): TStrings;
 | 
|---|
 | 388 | { returns a pointer to a list of urgencies  }
 | 
|---|
 | 389 | begin
 | 
|---|
 | 390 |   CallV('ORQQCN URGENCIES',[ConsultIEN]) ;
 | 
|---|
 | 391 |   MixedCaseList(RPCBrokerV.Results);
 | 
|---|
 | 392 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 393 | end;
 | 
|---|
 | 394 | 
 | 
|---|
 | 395 | function FindConsult(ConsultIEN: integer): string ;
 | 
|---|
 | 396 | var
 | 
|---|
 | 397 |   x: string;
 | 
|---|
 | 398 | begin
 | 
|---|
 | 399 |   x := sCallV('ORQQCN FIND CONSULT',[ConsultIEN]);
 | 
|---|
 | 400 |   Result := MakeConsultListItem(x);
 | 
|---|
 | 401 | end;
 | 
|---|
 | 402 | 
 | 
|---|
 | 403 | {-----------------consult result functions-----------------------------------}
 | 
|---|
 | 404 | function GetAssignableMedResults(ConsultIEN: integer): TStrings;
 | 
|---|
 | 405 | begin
 | 
|---|
 | 406 |   CallV('ORQQCN ASSIGNABLE MED RESULTS', [ConsultIEN]);
 | 
|---|
 | 407 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 408 | end;
 | 
|---|
 | 409 | 
 | 
|---|
 | 410 | function GetRemovableMedResults(ConsultIEN: integer): TStrings;
 | 
|---|
 | 411 | begin
 | 
|---|
 | 412 |   CallV('ORQQCN REMOVABLE MED RESULTS', [ConsultIEN]);
 | 
|---|
 | 413 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 414 | end;
 | 
|---|
 | 415 | 
 | 
|---|
 | 416 | function GetDetailedMedicineResults(ResultID: string): TStrings;
 | 
|---|
 | 417 | begin
 | 
|---|
 | 418 |   CallV('ORQQCN GET MED RESULT DETAILS', [ResultID]);
 | 
|---|
 | 419 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 420 | end;
 | 
|---|
 | 421 | 
 | 
|---|
 | 422 | procedure AttachMedicineResult(ConsultIEN: integer; ResultID: string; DateTime: TFMDateTime; ResponsiblePerson: int64; AlertTo: string);
 | 
|---|
 | 423 | begin
 | 
|---|
 | 424 |   CallV('ORQQCN ATTACH MED RESULTS', [ConsultIEN, ResultID, DateTime, ResponsiblePerson, AlertTo]);
 | 
|---|
 | 425 | end;
 | 
|---|
 | 426 | 
 | 
|---|
 | 427 | procedure RemoveMedicineResult(ConsultIEN: integer; ResultID: string; DateTime: TFMDateTime; ResponsiblePerson: int64);
 | 
|---|
 | 428 | begin
 | 
|---|
 | 429 |   CallV('ORQQCN REMOVE MED RESULTS', [ConsultIEN, ResultID, DateTime, ResponsiblePerson]);
 | 
|---|
 | 430 | end;
 | 
|---|
 | 431 | {-------------- user access level functions ---------------------------------}
 | 
|---|
 | 432 | 
 | 
|---|
 | 433 | function ConsultServiceUser(ServiceIEN: integer; DUZ: int64): boolean ;
 | 
|---|
 | 434 | var
 | 
|---|
 | 435 |   i: integer ;
 | 
|---|
 | 436 | begin
 | 
|---|
 | 437 |   Result := False ;
 | 
|---|
 | 438 |   CallV('ORWU GENERIC', ['',1,'^GMR(123.5,'+IntToStr(ServiceIEN)+',123.3,"B")']) ;
 | 
|---|
 | 439 |   for i:=0 to RPCBrokerV.Results.Count-1 do
 | 
|---|
 | 440 |       if StrToInt64(Piece(RPCBrokerV.Results[i],u,2))=DUZ then result := True  ;
 | 
|---|
 | 441 | end ;
 | 
|---|
 | 442 | 
 | 
|---|
 | 443 | function GetActionMenuLevel(ConsultIEN: integer): TMenuAccessRec ;
 | 
|---|
 | 444 | var
 | 
|---|
 | 445 |   x: string;
 | 
|---|
 | 446 | begin
 | 
|---|
 | 447 |   x := sCallV('ORQQCN SET ACT MENUS', [ConsultIEN]) ;
 | 
|---|
 | 448 |   Result.UserLevel := StrToIntDef(Piece(x, U, 1), 1);
 | 
|---|
 | 449 |   Result.AllowMedResulting := (Piece(x, U, 4) = '1');
 | 
|---|
 | 450 |   Result.AllowMedDissociate := (Piece(x, U, 5) = '1');
 | 
|---|
 | 451 |   Result.AllowResubmit := (Piece(x, U, 6) = '1') and (Piece(ConsultCanBeResubmitted(ConsultIEN), U, 1) <> '0');
 | 
|---|
 | 452 |   Result.ClinProcFlag := StrToIntDef(Piece(x, U, 7), CP_NOT_CLINPROC);
 | 
|---|
 | 453 |   Result.IsClinicalProcedure := (Result.ClinProcFlag > CP_NOT_CLINPROC);
 | 
|---|
 | 454 | end ;
 | 
|---|
 | 455 | 
 | 
|---|
 | 456 | {------------------- Consult request actions -------------------------------}
 | 
|---|
 | 457 | 
 | 
|---|
 | 458 | procedure ReceiveConsult(Dest: TStrings; IEN: integer; ReceivedBy: int64; RcptDate: TFMDateTime; Comments: TStrings);
 | 
|---|
 | 459 | begin
 | 
|---|
 | 460 |   CallV('ORQQCN RECEIVE', [IEN, ReceivedBy, RcptDate, Comments]);
 | 
|---|
 | 461 |   Dest.Assign(RPCBrokerV.Results);   {1^Error message' or '0'}
 | 
|---|
 | 462 | end;
 | 
|---|
 | 463 | 
 | 
|---|
 | 464 | procedure ScheduleConsult(Dest: TStrings; IEN: integer; ScheduledBy: Int64; SchdDate: TFMDateTime; Alert: integer;
 | 
|---|
 | 465 |      AlertTo: string; Comments: TStrings);
 | 
|---|
 | 466 | begin
 | 
|---|
 | 467 |   CallV('ORQQCN2 SCHEDULE CONSULT', [IEN, ScheduledBy, SchdDate, Alert, AlertTo, Comments]);
 | 
|---|
 | 468 |   Dest.Assign(RPCBrokerV.Results);   {1^Error message' or '0'}
 | 
|---|
 | 469 | end;
 | 
|---|
 | 470 | 
 | 
|---|
 | 471 | procedure DenyConsult(Dest: TStrings; IEN: integer; DeniedBy: int64;
 | 
|---|
 | 472 |             DenialDate: TFMDateTime; Comments: TStrings);
 | 
|---|
 | 473 | begin
 | 
|---|
 | 474 |   CallV('ORQQCN DISCONTINUE', [IEN, DeniedBy, DenialDate,'DY',Comments]);
 | 
|---|
 | 475 |   Dest.Assign(RPCBrokerV.Results);   {1^Error message' or '0'}
 | 
|---|
 | 476 | end;
 | 
|---|
 | 477 | 
 | 
|---|
 | 478 | procedure DiscontinueConsult(Dest: TStrings; IEN: integer; DiscontinuedBy: int64;
 | 
|---|
 | 479 |             DiscontinueDate: TFMDateTime; Comments: TStrings);
 | 
|---|
 | 480 | begin
 | 
|---|
 | 481 |   CallV('ORQQCN DISCONTINUE', [IEN, DiscontinuedBy, DiscontinueDate,'DC',Comments]);
 | 
|---|
 | 482 |   Dest.Assign(RPCBrokerV.Results);   {1^Error message' or '0'}
 | 
|---|
 | 483 | end;
 | 
|---|
 | 484 | 
 | 
|---|
 | 485 | procedure ForwardConsult(Dest: TStrings; IEN, ToService: integer; Forwarder, AttentionOf: int64; Urgency: integer;
 | 
|---|
 | 486 |      ActionDate: TFMDateTime; Comments: TStrings);
 | 
|---|
 | 487 | begin
 | 
|---|
 | 488 |      CallV('ORQQCN FORWARD', [IEN, ToService, Forwarder, AttentionOf, Urgency, ActionDate, Comments]);
 | 
|---|
 | 489 |      Dest.Assign(RPCBrokerV.Results);   {1^Error message' or '0'}
 | 
|---|
 | 490 | end ;
 | 
|---|
 | 491 | 
 | 
|---|
 | 492 | procedure AddComment(Dest: TStrings; IEN: integer; Comments: TStrings; ActionDate: TFMDateTime; Alert: integer;
 | 
|---|
 | 493 | AlertTo: string) ;
 | 
|---|
 | 494 | begin
 | 
|---|
 | 495 |      CallV('ORQQCN ADDCMT', [IEN, Comments, Alert, AlertTo, ActionDate]);
 | 
|---|
 | 496 |      Dest.Assign(RPCBrokerV.Results);   {1^Error message' or '0'}
 | 
|---|
 | 497 | end ;
 | 
|---|
 | 498 | 
 | 
|---|
 | 499 | procedure AdminComplete(Dest: TStrings; IEN: integer; SigFindingsFlag: string; Comments: TStrings;
 | 
|---|
 | 500 |           RespProv: Int64; ActionDate: TFMDateTime; Alert: integer; AlertTo: string) ;
 | 
|---|
 | 501 | begin
 | 
|---|
 | 502 |      CallV('ORQQCN ADMIN COMPLETE', [IEN, SigFindingsFlag, Comments, RespProv, Alert, AlertTo, ActionDate]);
 | 
|---|
 | 503 |      Dest.Assign(RPCBrokerV.Results);   {1^Error message' or '0'}
 | 
|---|
 | 504 | end ;
 | 
|---|
 | 505 | 
 | 
|---|
 | 506 | procedure SigFindings(Dest: TStrings; IEN: integer; SigFindingsFlag: string; Comments: TStrings; ActionDate: TFMDateTime; Alert: integer;
 | 
|---|
 | 507 | AlertTo: string) ;
 | 
|---|
 | 508 | begin
 | 
|---|
 | 509 |      CallV('ORQQCN SIGFIND', [IEN, SigFindingsFlag, Comments, Alert, AlertTo, ActionDate]);
 | 
|---|
 | 510 |      Dest.Assign(RPCBrokerV.Results);   {1^Error message' or '0'}
 | 
|---|
 | 511 | end ;
 | 
|---|
 | 512 | 
 | 
|---|
 | 513 | //==================  Ordering functions   ===================================
 | 
|---|
 | 514 | function ODForConsults: TStrings;
 | 
|---|
 | 515 | { Returns init values for consults dialog.  The results must be used immediately. }
 | 
|---|
 | 516 | begin
 | 
|---|
 | 517 |   CallV('ORWDCN32 DEF', ['C']);
 | 
|---|
 | 518 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 519 | end;
 | 
|---|
 | 520 | 
 | 
|---|
 | 521 | function ODForProcedures: TStrings;
 | 
|---|
 | 522 | { Returns init values for procedures dialog.  The results must be used immediately. }
 | 
|---|
 | 523 | begin
 | 
|---|
 | 524 |   CallV('ORWDCN32 DEF', ['P']);
 | 
|---|
 | 525 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 526 | end;
 | 
|---|
 | 527 | 
 | 
|---|
 | 528 | function SubSetOfProcedures(const StartFrom: string; Direction: Integer): TStrings;
 | 
|---|
 | 529 | begin
 | 
|---|
 | 530 | begin
 | 
|---|
 | 531 |   CallV('ORWDCN32 PROCEDURES', [StartFrom, Direction]);
 | 
|---|
 | 532 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 533 | end;
 | 
|---|
 | 534 | end;
 | 
|---|
 | 535 | 
 | 
|---|
 | 536 | function LoadServiceList(Purpose: integer): TStrings ;
 | 
|---|
 | 537 | // Purpose:  0=display all services, 1=forward or order from possible services
 | 
|---|
 | 538 | begin
 | 
|---|
 | 539 |   Callv('ORQQCN SVCTREE',[Purpose]) ;
 | 
|---|
 | 540 |   MixedCaseList(RPCBrokerV.Results) ;
 | 
|---|
 | 541 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 542 | end ;
 | 
|---|
 | 543 | 
 | 
|---|
 | 544 | function LoadServiceListWithSynonyms(Purpose: integer): TStrings ;
 | 
|---|
 | 545 | // Param 1 = Starting service (1=All Services)
 | 
|---|
 | 546 | // Param 2 = Purpose:  0=display all services, 1=forward or order from possible services
 | 
|---|
 | 547 | // Param 3 = Show synonyms
 | 
|---|
 | 548 | begin
 | 
|---|
 | 549 |   Callv('ORQQCN SVC W/SYNONYMS',[1, Purpose, True]) ;
 | 
|---|
 | 550 |   MixedCaseList(RPCBrokerV.Results) ;
 | 
|---|
 | 551 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 552 | end ;
 | 
|---|
 | 553 | 
 | 
|---|
 | 554 | function LoadServiceListWithSynonyms(Purpose, ConsultIEN: integer): TStrings ;
 | 
|---|
 | 555 | // Param 1 = Starting service (1=All Services)
 | 
|---|
 | 556 | // Param 2 = Purpose:  0=display all services, 1=forward or order from possible services
 | 
|---|
 | 557 | // Param 3 = Show synonyms
 | 
|---|
 | 558 | // Param 4 = Consult IEN
 | 
|---|
 | 559 | begin
 | 
|---|
 | 560 |   Callv('ORQQCN SVC W/SYNONYMS',[1, Purpose, True, ConsultIEN]) ;
 | 
|---|
 | 561 |   MixedCaseList(RPCBrokerV.Results) ;
 | 
|---|
 | 562 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 563 | end ;
 | 
|---|
 | 564 | 
 | 
|---|
 | 565 | function SubSetOfServices(const StartFrom: string; Direction: Integer): TStrings;
 | 
|---|
 | 566 | //  used only on consults order dialog for service long combo box, which needs to include quick orders
 | 
|---|
 | 567 | begin
 | 
|---|
 | 568 |   CallV('ORQQCN SVCLIST', [StartFrom, Direction]);
 | 
|---|
 | 569 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 570 | end;
 | 
|---|
 | 571 | 
 | 
|---|
 | 572 | function LoadConsultsQuickList: TStrings ;
 | 
|---|
 | 573 | begin
 | 
|---|
 | 574 |   Callv('ORWDXQ GETQLST',['CSLT', 'Q']) ;
 | 
|---|
 | 575 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 576 | end ;
 | 
|---|
 | 577 | 
 | 
|---|
 | 578 | function ShowSF513(ConsultIEN: integer): TStrings ;
 | 
|---|
 | 579 | var
 | 
|---|
 | 580 |   x: string;
 | 
|---|
 | 581 |   i: integer;
 | 
|---|
 | 582 | begin
 | 
|---|
 | 583 |   CallV('ORQQCN SHOW SF513',[ConsultIEN]) ;
 | 
|---|
 | 584 |   if RPCBrokerV.Results.Count > 0 then
 | 
|---|
 | 585 |     begin
 | 
|---|
 | 586 |       x := RPCBrokerV.Results[0];
 | 
|---|
 | 587 |       i := Pos('-', x);
 | 
|---|
 | 588 |       x := Copy(x, i, 999);
 | 
|---|
 | 589 |       RPCBrokerV.Results[0] := x;
 | 
|---|
 | 590 |     end;
 | 
|---|
 | 591 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 592 | end ;
 | 
|---|
 | 593 | 
 | 
|---|
 | 594 | procedure PrintSF513ToDevice(AConsult: Integer; const ADevice: string; ChartCopy: string;
 | 
|---|
 | 595 |   var ErrMsg: string);
 | 
|---|
 | 596 | { prints a SF 513 on the selected device }
 | 
|---|
 | 597 | begin
 | 
|---|
 | 598 |   ErrMsg := sCallV('ORQQCN PRINT SF513', [AConsult, ChartCopy, ADevice]);
 | 
|---|
 | 599 | //  if Piece(ErrMsg, U, 1) = '0' then ErrMsg := '' else ErrMsg := Piece(ErrMsg, U, 2);
 | 
|---|
 | 600 | end;
 | 
|---|
 | 601 | 
 | 
|---|
 | 602 | function GetFormattedSF513(AConsult: Integer; ChartCopy: string): TStrings;
 | 
|---|
 | 603 | begin
 | 
|---|
 | 604 |   CallV('ORQQCN SF513 WINDOWS PRINT',[AConsult, ChartCopy]);
 | 
|---|
 | 605 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 606 | end;
 | 
|---|
 | 607 | 
 | 
|---|
 | 608 | function UnresolvedConsultsExist: boolean;
 | 
|---|
 | 609 | begin
 | 
|---|
 | 610 |   Result := (sCallV('ORQQCN UNRESOLVED', [Patient.DFN]) = '1');
 | 
|---|
 | 611 | end;
 | 
|---|
 | 612 | 
 | 
|---|
| [460] | 613 | procedure GetUnresolvedConsultsInfo;
 | 
|---|
 | 614 | var
 | 
|---|
 | 615 |   x: string;
 | 
|---|
 | 616 | begin
 | 
|---|
 | 617 |   x := sCallV('ORQQCN UNRESOLVED', [Patient.DFN]);
 | 
|---|
 | 618 |   with uUnresolvedConsults do
 | 
|---|
 | 619 |   begin
 | 
|---|
 | 620 |     UnresolvedConsultsExist := (Piece(x, U, 1) = '1');
 | 
|---|
 | 621 |     ShowNagScreen := (Piece(x, U, 2) = '1');
 | 
|---|
 | 622 |   end;
 | 
|---|
 | 623 | end;
 | 
|---|
 | 624 | 
 | 
|---|
| [459] | 625 | function ConsultMessage(AnIEN: Integer): string;
 | 
|---|
 | 626 | begin
 | 
|---|
 | 627 |   if AnIEN = uLastOrderedIEN then Result := uLastOrderMsg else
 | 
|---|
 | 628 |   begin
 | 
|---|
 | 629 |     Result := sCallV('ORWDCN32 ORDRMSG', [AnIEN]);
 | 
|---|
 | 630 |     uLastOrderedIEN := AnIEN;
 | 
|---|
 | 631 |     uLastOrderMsg := Result;
 | 
|---|
 | 632 |   end;
 | 
|---|
 | 633 | end;
 | 
|---|
 | 634 | 
 | 
|---|
 | 635 | function GetProcedureIEN(ORIEN: string): string;
 | 
|---|
 | 636 | begin
 | 
|---|
 | 637 |   Result := sCallV('ORQQCN GET PROC IEN', [ORIEN]);
 | 
|---|
 | 638 | end;
 | 
|---|
 | 639 | 
 | 
|---|
 | 640 | function GetProcedureServices(ProcIEN: integer): TStrings;
 | 
|---|
 | 641 | begin
 | 
|---|
 | 642 |   CallV('ORQQCN GET PROC SVCS',[ProcIEN]) ;
 | 
|---|
 | 643 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 644 | end;
 | 
|---|
 | 645 | 
 | 
|---|
 | 646 | function ConsultCanBeResubmitted(ConsultIEN: integer): string;
 | 
|---|
 | 647 | begin
 | 
|---|
 | 648 |   Result := sCallV('ORQQCN CANEDIT', [ConsultIEN]);
 | 
|---|
 | 649 | end;
 | 
|---|
 | 650 | 
 | 
|---|
 | 651 | function LoadConsultForEdit(ConsultIEN: integer): TEditResubmitRec;
 | 
|---|
 | 652 | var
 | 
|---|
 | 653 |   Dest: TStringList;
 | 
|---|
 | 654 |   EditRec: TEditResubmitRec;
 | 
|---|
 | 655 | begin
 | 
|---|
 | 656 |   Dest := TStringList.Create;
 | 
|---|
 | 657 |   try
 | 
|---|
 | 658 |     tCallV(Dest, 'ORQQCN LOAD FOR EDIT',[ConsultIEN]) ;
 | 
|---|
 | 659 |     with EditRec do
 | 
|---|
 | 660 |       begin
 | 
|---|
 | 661 |          Changed         := False;
 | 
|---|
 | 662 |          IEN             := ConsultIEN;
 | 
|---|
 | 663 |          ToService       := StrToIntDef(Piece(ExtractDefault(Dest, 'SERVICE'), U, 2), 0);
 | 
|---|
 | 664 |          RequestType     := Piece(ExtractDefault(Dest, 'TYPE'), U, 3);
 | 
|---|
 | 665 |          OrderableItem   := StrToIntDef(Piece(ExtractDefault(Dest, 'PROCEDURE'), U, 1), 0);
 | 
|---|
 | 666 |          ConsultProc     := Piece(ExtractDefault(Dest, 'PROCEDURE'), U, 3);
 | 
|---|
 | 667 |          ConsultProcName := Piece(ExtractDefault(Dest, 'PROCEDURE'), U, 2);
 | 
|---|
 | 668 |          Urgency         := StrToIntDef(Piece(ExtractDefault(Dest, 'URGENCY'), U, 3), 0);
 | 
|---|
 | 669 |          UrgencyName     := Piece(ExtractDefault(Dest, 'URGENCY'), U, 2);
 | 
|---|
 | 670 |          Place           := Piece(ExtractDefault(Dest, 'PLACE'), U, 1);
 | 
|---|
 | 671 |          PlaceName       := Piece(ExtractDefault(Dest, 'PLACE'), U, 2);
 | 
|---|
 | 672 |          Attention       := StrToInt64Def(Piece(ExtractDefault(Dest, 'ATTENTION'), U, 1), 0);
 | 
|---|
 | 673 |          AttnName        := Piece(ExtractDefault(Dest, 'ATTENTION'), U, 2);
 | 
|---|
 | 674 |          InpOutp         := Piece(ExtractDefault(Dest, 'CATEGORY'), U, 1);
 | 
|---|
 | 675 |          ProvDiagnosis      := Piece(ExtractDefault(Dest, 'DIAGNOSIS'), U, 1);
 | 
|---|
 | 676 |          ProvDxCode         := Piece(ExtractDefault(Dest, 'DIAGNOSIS'), U, 2);
 | 
|---|
 | 677 |          ProvDxCodeInactive := (Piece(ExtractDefault(Dest, 'DIAGNOSIS'), U, 3) = '1');
 | 
|---|
 | 678 |          RequestReason   := TStringList.Create;
 | 
|---|
 | 679 |          ExtractText(RequestReason, Dest, 'REASON');
 | 
|---|
 | 680 |          LimitStringLength(RequestReason, 74);
 | 
|---|
 | 681 |          DenyComments    := TStringList.Create;
 | 
|---|
 | 682 |          ExtractText(DenyComments, Dest, 'DENY COMMENT');
 | 
|---|
 | 683 |          OtherComments   := TStringList.Create;
 | 
|---|
 | 684 |          ExtractText(OtherComments, Dest, 'ADDED COMMENT');
 | 
|---|
 | 685 |          NewComments     := TStringList.Create;
 | 
|---|
 | 686 |       end;
 | 
|---|
 | 687 |     Result := EditRec;
 | 
|---|
 | 688 |   finally
 | 
|---|
 | 689 |     Dest.Free;
 | 
|---|
 | 690 |   end;
 | 
|---|
 | 691 | end;
 | 
|---|
 | 692 | 
 | 
|---|
 | 693 | function ResubmitConsult(EditResubmitRec: TEditResubmitRec): string;
 | 
|---|
 | 694 | var
 | 
|---|
 | 695 |   i: integer;
 | 
|---|
 | 696 | begin
 | 
|---|
 | 697 |   with RPCBrokerV, EditResubmitRec do
 | 
|---|
 | 698 |     begin
 | 
|---|
 | 699 |       ClearParameters := True;
 | 
|---|
 | 700 |       RemoteProcedure := 'ORQQCN RESUBMIT';
 | 
|---|
 | 701 |       Param[0].PType := literal;
 | 
|---|
 | 702 |       Param[0].Value := IntToStr(IEN);
 | 
|---|
 | 703 |       Param[1].PType := list;
 | 
|---|
 | 704 |       with Param[1] do
 | 
|---|
 | 705 |         begin
 | 
|---|
 | 706 |           if ToService > 0 then
 | 
|---|
 | 707 |             Mult['1']  := 'GMRCSS^'   + IntToStr(ToService);
 | 
|---|
 | 708 |           if ConsultProc <> '' then
 | 
|---|
 | 709 |             Mult['2']  := 'GMRCPROC^' + ConsultProc ;
 | 
|---|
 | 710 |           if Urgency > 0 then
 | 
|---|
 | 711 |             Mult['3']  := 'GMRCURG^'  + IntToStr(Urgency);
 | 
|---|
 | 712 |           if Length(Place) > 0 then
 | 
|---|
 | 713 |             Mult['4']  := 'GMRCPL^'   + Place;
 | 
|---|
 | 714 |           if Attention > 0 then
 | 
|---|
 | 715 |             Mult['5']  := 'GMRCATN^'  + IntToStr(Attention)
 | 
|---|
 | 716 |           else if Attention = -1 then
 | 
|---|
 | 717 |             Mult['5']  := 'GMRCATN^'  + '@';
 | 
|---|
 | 718 |           if RequestType <> '' then
 | 
|---|
 | 719 |             Mult['6']  := 'GMRCRQT^'  + RequestType;
 | 
|---|
 | 720 |           if Length(InpOutP) > 0 then
 | 
|---|
 | 721 |             Mult['7']  := 'GMRCION^'  + InpOutp;
 | 
|---|
 | 722 |           if Length(ProvDiagnosis) > 0 then
 | 
|---|
 | 723 |             Mult['8']  := 'GMRCDIAG^' + ProvDiagnosis + U + ProvDxCode;
 | 
|---|
 | 724 |           if RequestReason.Count > 0 then
 | 
|---|
 | 725 |             begin
 | 
|---|
 | 726 |               Mult['9']  := 'GMRCRFQ^20';
 | 
|---|
 | 727 |               for i := 0 to RequestReason.Count - 1 do
 | 
|---|
 | 728 |                 Mult['9,' + IntToStr(i+1)]  := RequestReason.Strings[i];
 | 
|---|
 | 729 |             end;
 | 
|---|
 | 730 |           if NewComments.Count > 0 then
 | 
|---|
 | 731 |             begin
 | 
|---|
 | 732 |               Mult['10'] := 'COMMENT^';
 | 
|---|
 | 733 |               for i := 0 to NewComments.Count - 1 do
 | 
|---|
 | 734 |                 Mult['10,' + IntToStr(i+1)] := NewComments.Strings[i];
 | 
|---|
 | 735 |             end;
 | 
|---|
 | 736 |         end;
 | 
|---|
 | 737 |       CallBroker;
 | 
|---|
 | 738 |       Result := '0';
 | 
|---|
 | 739 |       //Result := Results[0];
 | 
|---|
 | 740 |     end;
 | 
|---|
 | 741 | end;
 | 
|---|
 | 742 | 
 | 
|---|
 | 743 | function  GetCurrentContext: TSelectContext;
 | 
|---|
 | 744 | var
 | 
|---|
 | 745 |   x: string;
 | 
|---|
 | 746 |   AContext: TSelectContext;
 | 
|---|
 | 747 | begin
 | 
|---|
 | 748 |   x := sCallV('ORQQCN2 GET CONTEXT', [User.DUZ]) ;
 | 
|---|
 | 749 |   with AContext do
 | 
|---|
 | 750 |     begin
 | 
|---|
 | 751 |       Changed       := True;
 | 
|---|
 | 752 |       BeginDate     := Piece(x, ';', 1);
 | 
|---|
 | 753 |       EndDate       := Piece(x, ';', 2);
 | 
|---|
 | 754 |       Status        := Piece(x, ';', 3);
 | 
|---|
 | 755 |       Service       := Piece(x, ';', 4);
 | 
|---|
 | 756 |       GroupBy       := Piece(x, ';', 5);
 | 
|---|
 | 757 |       Ascending     := (Piece(x, ';', 6) = '1');
 | 
|---|
 | 758 |     end;
 | 
|---|
 | 759 |   Result := AContext;
 | 
|---|
 | 760 | end;
 | 
|---|
 | 761 | 
 | 
|---|
 | 762 | procedure SaveCurrentContext(AContext: TSelectContext) ;
 | 
|---|
 | 763 | var
 | 
|---|
 | 764 |   x: string;
 | 
|---|
 | 765 | begin
 | 
|---|
 | 766 |   with AContext do
 | 
|---|
 | 767 |     begin
 | 
|---|
 | 768 |       SetPiece(x, ';', 1, BeginDate);
 | 
|---|
 | 769 |       SetPiece(x, ';', 2, EndDate);
 | 
|---|
 | 770 |       SetPiece(x, ';', 3, Status);
 | 
|---|
 | 771 |       SetPiece(x, ';', 4, Service);
 | 
|---|
 | 772 |       SetPiece(x, ';', 5, GroupBy);
 | 
|---|
 | 773 |       SetPiece(x, ';', 6, BOOLCHAR[Ascending]);
 | 
|---|
 | 774 |     end;
 | 
|---|
 | 775 |   CallV('ORQQCN2 SAVE CONTEXT', [x]);
 | 
|---|
 | 776 | end;
 | 
|---|
 | 777 | 
 | 
|---|
 | 778 | function GetDefaultReasonForRequest(Service: string; Resolve: Boolean): TStrings;
 | 
|---|
 | 779 | begin
 | 
|---|
 | 780 |   CallV('ORQQCN DEFAULT REQUEST REASON',[Service, Patient.DFN, Resolve]) ;
 | 
|---|
 | 781 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 782 | end;
 | 
|---|
 | 783 | 
 | 
|---|
 | 784 | function ReasonForRequestEditable(Service: string): string;
 | 
|---|
 | 785 | begin
 | 
|---|
 | 786 |   Result := sCallV('ORQQCN EDIT DEFAULT REASON', [Service]);
 | 
|---|
 | 787 | end;
 | 
|---|
 | 788 | 
 | 
|---|
 | 789 | function GetServicePrerequisites(Service: string): TStrings;
 | 
|---|
 | 790 | begin
 | 
|---|
 | 791 |   CallV('ORQQCN2 GET PREREQUISITE',[Service, Patient.DFN]) ;
 | 
|---|
 | 792 |   Result := RPCBrokerV.Results;
 | 
|---|
 | 793 | end;
 | 
|---|
 | 794 | 
 | 
|---|
 | 795 | function GetNewDialog(OrderType: string): string;
 | 
|---|
 | 796 | { get dialog for new consults}
 | 
|---|
 | 797 | begin
 | 
|---|
 | 798 |   Result := sCallV('ORWDCN32 NEWDLG', [OrderType, Encounter.Location]);
 | 
|---|
 | 799 | end;
 | 
|---|
 | 800 | 
 | 
|---|
 | 801 | function GetServiceIEN(ORIEN: string): string;
 | 
|---|
 | 802 | begin
 | 
|---|
 | 803 |   Result := sCallV('ORQQCN GET SERVICE IEN', [ORIEN]);
 | 
|---|
 | 804 | end;
 | 
|---|
 | 805 | 
 | 
|---|
 | 806 | procedure GetProvDxMode(var ProvDx: TProvisionalDiagnosis; SvcIEN: string);
 | 
|---|
 | 807 | var
 | 
|---|
 | 808 |   x: string;
 | 
|---|
 | 809 | begin
 | 
|---|
 | 810 |   x := sCallV('ORQQCN PROVDX', [SvcIEN]);
 | 
|---|
 | 811 |   ProvDx.Reqd := Piece(x, U, 1);
 | 
|---|
 | 812 |   ProvDx.PromptMode := Piece(x, U, 2);
 | 
|---|
 | 813 | end;
 | 
|---|
 | 814 | 
 | 
|---|
 | 815 | function GetConsultOrderIEN(ConsultIEN: integer): string;
 | 
|---|
 | 816 | begin
 | 
|---|
 | 817 |   Result := sCallV('ORQQCN GET ORDER NUMBER', [ConsultIEN]); 
 | 
|---|
 | 818 | end;
 | 
|---|
 | 819 | 
 | 
|---|
 | 820 | function GetSavedCPFields(NoteIEN: integer): TEditNoteRec;
 | 
|---|
 | 821 | var
 | 
|---|
 | 822 |   x: string;
 | 
|---|
 | 823 |   AnEditRec: TEditNoteRec;
 | 
|---|
 | 824 | begin
 | 
|---|
 | 825 |   x := sCallV('ORWTIU GET SAVED CP FIELDS', [NoteIEN]);
 | 
|---|
 | 826 |   with AnEditRec do
 | 
|---|
 | 827 |     begin
 | 
|---|
 | 828 |       Author := StrToInt64Def(Piece(x, U, 1), 0);
 | 
|---|
 | 829 |       Cosigner := StrToInt64Def(Piece(x, U, 2), 0);
 | 
|---|
 | 830 |       ClinProcSummCode := StrToIntDef(Piece(x, U, 3), 0);
 | 
|---|
 | 831 |       ClinProcDateTime := StrToFMDateTime(Piece(x, U, 4));
 | 
|---|
 | 832 |       Title := StrToIntDef(Piece(x, U, 5), 0);
 | 
|---|
 | 833 |     end;
 | 
|---|
 | 834 |   Result := AnEditRec;
 | 
|---|
 | 835 | end;
 | 
|---|
 | 836 | 
 | 
|---|
 | 837 | initialization
 | 
|---|
 | 838 |   uLastOrderedIEN := 0;
 | 
|---|
 | 839 |   uLastOrderMsg := '';
 | 
|---|
 | 840 |   uConsultsClass := 0;
 | 
|---|
 | 841 |   uClinProcClass := 0;
 | 
|---|
 | 842 | 
 | 
|---|
 | 843 | finalization
 | 
|---|
 | 844 |   if uConsultTitles <> nil then uConsultTitles.Free;
 | 
|---|
 | 845 |   if uClinProcTitles <> nil then uClinProcTitles.Free;
 | 
|---|
 | 846 | 
 | 
|---|
 | 847 | end.
 | 
|---|