| [459] | 1 | unit rPCE;
 | 
|---|
 | 2 | 
 | 
|---|
 | 3 | {$OPTIMIZATION OFF}                              // REMOVE AFTER UNIT IS DEBUGGED
 | 
|---|
 | 4 | 
 | 
|---|
 | 5 | interface
 | 
|---|
 | 6 | 
 | 
|---|
 | 7 | uses SysUtils, Classes, ORNet, ORFn, uPCE, UBACore, ORClasses;
 | 
|---|
 | 8 | 
 | 
|---|
 | 9 | const
 | 
|---|
 | 10 |   LX_ICD = 12;
 | 
|---|
 | 11 |   LX_CPT = 13;
 | 
|---|
 | 12 | 
 | 
|---|
 | 13 |   LX_Threshold = 15;
 | 
|---|
 | 14 | 
 | 
|---|
 | 15 |   PCE_IMM = 20;
 | 
|---|
 | 16 |   PCE_SK  = 21;
 | 
|---|
 | 17 |   PCE_PED = 22;
 | 
|---|
 | 18 |   PCE_HF  = 23;
 | 
|---|
 | 19 |   PCE_XAM = 24;
 | 
|---|
 | 20 |   PCE_TRT = 25;
 | 
|---|
 | 21 | 
 | 
|---|
 | 22 |   SCC_YES =  1;
 | 
|---|
 | 23 |   SCC_NO  =  0;
 | 
|---|
 | 24 |   SCC_NA  = -1;
 | 
|---|
 | 25 | 
 | 
|---|
 | 26 | var
 | 
|---|
 | 27 |   uEncLocation: integer;
 | 
|---|
 | 28 | //  uEncDateTime: TFMDateTime;
 | 
|---|
 | 29 | 
 | 
|---|
 | 30 | type
 | 
|---|
 | 31 |   TSCConditions = record
 | 
|---|
 | 32 |     SCAllow:  Boolean;        // prompt for service connected
 | 
|---|
 | 33 |     SCDflt:   Boolean;        // default if prompting service connected
 | 
|---|
 | 34 |     AOAllow:  Boolean;        // prompt for agent orange exposure
 | 
|---|
 | 35 |     AODflt:   Boolean;        // default if prompting agent orange exposure
 | 
|---|
 | 36 |     IRAllow:  Boolean;        // prompt for ionizing radiation exposure
 | 
|---|
 | 37 |     IRDflt:   Boolean;        // default if prompting ionizing radiation
 | 
|---|
 | 38 |     ECAllow:  Boolean;        // prompt for environmental conditions
 | 
|---|
 | 39 |     ECDflt:   Boolean;        // default if prompting environmental cond.
 | 
|---|
 | 40 |     MSTAllow: Boolean;        // prompt for military sexual trauma
 | 
|---|
 | 41 |     MSTDflt:  Boolean;        // default if prompting military sexual trauma
 | 
|---|
 | 42 |     HNCAllow: Boolean;        // prompt for Head or Neck Cancer
 | 
|---|
 | 43 |     HNCDflt:  Boolean;        // default if prompting Head or Neck Cancer
 | 
|---|
 | 44 |     CVAllow: Boolean;        // prompt for Combat Veteran Related
 | 
|---|
 | 45 |     CVDflt:  Boolean;        // default if prompting Comabt Veteran
 | 
|---|
 | 46 |   end;
 | 
|---|
 | 47 | 
 | 
|---|
 | 48 |   TPCEListCodesProc = procedure(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 49 | 
 | 
|---|
 | 50 |   TAskPCE = (apPrimaryNeeded, apPrimaryOutpatient, apPrimaryAlways,
 | 
|---|
 | 51 |              apNeeded, apOutpatient, apAlways, apNever, apDisable);
 | 
|---|
 | 52 | 
 | 
|---|
 | 53 | function GetVisitCat(InitialCat: char; Location: integer; Inpatient: boolean): char;
 | 
|---|
 | 54 | 
 | 
|---|
 | 55 | {assign and read values from fPCEData}
 | 
|---|
 | 56 | //function SetRPCEncouterInfo(PCEData: TPCEData): boolean;
 | 
|---|
 | 57 | function SetRPCEncLocation(Loc: Integer): boolean;
 | 
|---|
 | 58 | //function SetRPCEncDateTime(DT: TFMDateTime): boolean;
 | 
|---|
 | 59 | 
 | 
|---|
 | 60 | function PCERPCEncLocation: integer;
 | 
|---|
 | 61 | //function PCERPCEncDateTime: TFMDateTime;
 | 
|---|
 | 62 | function GetLocSecondaryVisitCode(Loc: integer): char;
 | 
|---|
 | 63 | 
 | 
|---|
 | 64 | {check for active person class on provider}
 | 
|---|
 | 65 | function CheckActivePerson(provider:string;DateTime:TFMDateTime): boolean;
 | 
|---|
 | 66 | function ForcePCEEntry(Loc: integer): boolean;
 | 
|---|
 | 67 | 
 | 
|---|
 | 68 | {"Other" form PCE calls}
 | 
|---|
 | 69 | procedure LoadcboOther(Dest: TStrings; Location, fOtherApp: Integer);
 | 
|---|
 | 70 | 
 | 
|---|
 | 71 | { Lexicon Lookup Calls }
 | 
|---|
 | 72 | function  LexiconToCode(IEN, LexApp: Integer; ADate: TFMDateTime = 0): string;
 | 
|---|
 | 73 | procedure ListLexicon(Dest: TStrings; const x: string; LexApp: Integer; ADate: TFMDateTime = 0);
 | 
|---|
 | 74 | function  IsActiveICDCode(ACode: string; ADate: TFMDateTime = 0): boolean;
 | 
|---|
 | 75 | function  IsActiveCPTCode(ACode: string; ADate: TFMDateTime = 0): boolean;
 | 
|---|
 | 76 | function  IsActiveCode(ACode: string; LexApp: integer; ADate: TFMDateTime = 0): boolean;
 | 
|---|
 | 77 | 
 | 
|---|
 | 78 | { Encounter Form Elements }
 | 
|---|
 | 79 | procedure DeletePCE(const AVisitStr: string);
 | 
|---|
 | 80 | function EligbleConditions: TSCConditions;
 | 
|---|
 | 81 | 
 | 
|---|
 | 82 | procedure ListVisitTypeSections(Dest: TStrings);
 | 
|---|
 | 83 | procedure ListVisitTypeCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 84 | procedure ListVisitTypeByLoc(Dest: TStrings; Location: Integer; ADateTime: TFMDateTime = 0);
 | 
|---|
 | 85 | function AutoSelectVisit(Location: integer): boolean;
 | 
|---|
 | 86 | function UpdateVisitTypeModifierList(Dest: TStrings; Index: integer): string;
 | 
|---|
 | 87 | 
 | 
|---|
 | 88 | procedure ListDiagnosisSections(Dest: TStrings);
 | 
|---|
 | 89 | procedure ListDiagnosisCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 90 | 
 | 
|---|
 | 91 | procedure ListExamsSections(Dest: TStrings);
 | 
|---|
 | 92 | procedure ListExamsCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 93 | 
 | 
|---|
 | 94 | procedure ListHealthSections(Dest: TStrings);
 | 
|---|
 | 95 | procedure ListHealthCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 96 | 
 | 
|---|
 | 97 | procedure ListImmunizSections(Dest: TStrings);
 | 
|---|
 | 98 | procedure ListImmunizCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 99 | 
 | 
|---|
 | 100 | procedure ListPatientSections(Dest: TStrings);
 | 
|---|
 | 101 | procedure ListPatientCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 102 | 
 | 
|---|
 | 103 | procedure ListProcedureSections(Dest: TStrings);
 | 
|---|
 | 104 | procedure ListProcedureCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 105 | function ModifierList(CPTCode: string): string;
 | 
|---|
 | 106 | procedure ListCPTModifiers(Dest: TStrings; CPTCodes, NeededModifiers: string);
 | 
|---|
 | 107 | function ModifierName(ModIEN: string): string;
 | 
|---|
 | 108 | function ModifierCode(ModIEN: string): string;
 | 
|---|
 | 109 | function UpdateModifierList(Dest: TStrings; Index: integer): string;
 | 
|---|
 | 110 | 
 | 
|---|
 | 111 | procedure ListSkinSections(Dest: TStrings);
 | 
|---|
 | 112 | procedure ListSkinCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 113 | 
 | 
|---|
 | 114 | procedure ListSCDisabilities(Dest: TStrings);
 | 
|---|
 | 115 | procedure LoadPCEDataForNote(Dest: TStrings; ANoteIEN: Integer; VStr: string);
 | 
|---|
 | 116 | function GetVisitIEN(NoteIEN: Integer): string;
 | 
|---|
 | 117 | procedure SavePCEData(PCEList: TStringList; ANoteIEN, ALocation: integer);
 | 
|---|
 | 118 | 
 | 
|---|
 | 119 | function DataHasCPTCodes(AList: TStrings): boolean;
 | 
|---|
 | 120 | function GetAskPCE(Loc: integer): TAskPCE;
 | 
|---|
 | 121 | function HasVisit(const ANoteIEN, ALocation: integer; const AVisitDate: TFMDateTime): Integer;
 | 
|---|
 | 122 | 
 | 
|---|
 | 123 | procedure LoadImmSeriesItems(Dest: TStrings);
 | 
|---|
 | 124 | procedure LoadImmReactionItems(Dest: TStrings);
 | 
|---|
 | 125 | procedure LoadSkResultsItems(Dest: TStrings);
 | 
|---|
 | 126 | procedure LoadPEDLevelItems(Dest: TStrings);
 | 
|---|
 | 127 | procedure LoadHFLevelItems(Dest: TStrings);
 | 
|---|
 | 128 | procedure LoadXAMResultsItems(Dest: TStrings);
 | 
|---|
 | 129 | procedure LoadHistLocations(Dest: TStrings);
 | 
|---|
 | 130 | procedure AddProbsToDiagnoses;
 | 
|---|
 | 131 | 
 | 
|---|
 | 132 | //GAF
 | 
|---|
 | 133 | function GAFOK: boolean;
 | 
|---|
 | 134 | function MHClinic(const Location: integer): boolean;
 | 
|---|
 | 135 | procedure RecentGAFScores(const Limit: integer);
 | 
|---|
 | 136 | function SaveGAFScore(const Score: integer; GAFDate: TFMDateTime; Staff: Int64): boolean;
 | 
|---|
 | 137 | function GAFURL: string;
 | 
|---|
 | 138 | function MHTestsOK: boolean;
 | 
|---|
 | 139 | function MHTestAuthorized(Test: string): boolean;
 | 
|---|
 | 140 | 
 | 
|---|
 | 141 | function AnytimeEncounters: boolean;
 | 
|---|
 | 142 | function AutoCheckout(Loc: integer): boolean;
 | 
|---|
 | 143 | 
 | 
|---|
 | 144 | { Encounter }
 | 
|---|
 | 145 | //function RequireExposures(ANote: Integer): Boolean;      {RAB}
 | 
|---|
 | 146 | function RequireExposures(ANote, ATitle: Integer): Boolean;
 | 
|---|
 | 147 | function PromptForWorkload(ANote, ATitle: Integer; VisitCat: Char; StandAlone: boolean): Boolean;
 | 
|---|
 | 148 | function DefaultProvider(ALocation: integer; AUser: Int64; ADate: TFMDateTime;
 | 
|---|
 | 149 |                                              ANoteIEN: integer): string;
 | 
|---|
 | 150 | function IsUserAProvider(AUser: Int64; ADate: TFMDateTime): boolean;
 | 
|---|
 | 151 | function IsCancelOrNoShow(ANote: integer): boolean;
 | 
|---|
| [460] | 152 | function IsNonCountClinic(ALocation: integer): boolean;
 | 
|---|
| [459] | 153 | 
 | 
|---|
 | 154 | // HNC Flag
 | 
|---|
 | 155 | //function HNCOK: boolean;
 | 
|---|
 | 156 | 
 | 
|---|
 | 157 | implementation
 | 
|---|
 | 158 | 
 | 
|---|
 | 159 | uses TRPCB, rCore, uCore, uConst, fEncounterFrame, UBAGlobals, UBAConst;
 | 
|---|
 | 160 | 
 | 
|---|
 | 161 | var
 | 
|---|
 | 162 |   uLastLocation:  Integer;
 | 
|---|
 | 163 |   uLastDFN:       String;
 | 
|---|
 | 164 |   uVTypeLastLoc:  Integer;
 | 
|---|
 | 165 |   uVTypeLastDate: double = 0;
 | 
|---|
 | 166 |   uDiagnoses:     TStringList;
 | 
|---|
 | 167 |   uExams:         TStringList;
 | 
|---|
 | 168 |   uHealthFactors: TStringList;
 | 
|---|
 | 169 |   uImmunizations: TStringList;
 | 
|---|
 | 170 |   uPatientEds:    TStringList;
 | 
|---|
 | 171 |   uProcedures:    TStringList;
 | 
|---|
 | 172 |   uSkinTests:     TStringList;
 | 
|---|
 | 173 |   uVisitTypes:    TStringList;
 | 
|---|
 | 174 |   uVTypeForLoc:   TStringList;
 | 
|---|
 | 175 |   uProblems:      TStringList;
 | 
|---|
 | 176 |   uModifiers:     TORStringList = nil;
 | 
|---|
 | 177 |   uGAFOK:         boolean;
 | 
|---|
 | 178 |   uGAFOKCalled:   boolean = FALSE;
 | 
|---|
 | 179 |   uLastForceLoc:  integer = -1;
 | 
|---|
 | 180 |   uLastForce:     boolean;
 | 
|---|
 | 181 |   uHasCPT:        TStringList = nil;
 | 
|---|
 | 182 |   uGAFURL:        string;
 | 
|---|
 | 183 |   uGAFURLChecked: boolean = FALSE;
 | 
|---|
 | 184 |   uMHOK:          boolean;
 | 
|---|
 | 185 |   uMHOKChecked:   boolean = FALSE;
 | 
|---|
 | 186 |   uVCInitialCat:  char = #0;
 | 
|---|
 | 187 |   uVCLocation:    integer = -2;
 | 
|---|
 | 188 |   uVCInpatient:   boolean = FALSE;
 | 
|---|
 | 189 |   uVCResult:      char;
 | 
|---|
 | 190 |   uAPUser:        Int64 = -1;
 | 
|---|
 | 191 |   uAPLoc:         integer = -2;
 | 
|---|
 | 192 |   uAPAsk:         TAskPCE;
 | 
|---|
 | 193 |   uAnytimeEnc:    integer = -1;
 | 
|---|
 | 194 |   UAutoSelLoc:    integer = -1;
 | 
|---|
 | 195 |   UAutoSelVal:    boolean;
 | 
|---|
 | 196 |   uLastChkOut:    boolean;
 | 
|---|
 | 197 |   uLastChkOutLoc: integer = -2;
 | 
|---|
 | 198 |   uLastIsClinicLoc: integer = 0;
 | 
|---|
 | 199 |   uLastIsClinic: boolean = FALSE;
 | 
|---|
 | 200 | //  uHNCOK:         integer = -1;
 | 
|---|
 | 201 | 
 | 
|---|
 | 202 | function GetVisitCat(InitialCat: char; Location: integer; Inpatient: boolean): char;
 | 
|---|
 | 203 | var
 | 
|---|
 | 204 |   tmp: string;
 | 
|---|
 | 205 | 
 | 
|---|
 | 206 | begin
 | 
|---|
 | 207 |   if(InitialCat <> uVCInitialCat) or (Location <> uVCLocation) or
 | 
|---|
 | 208 |     (Inpatient <> uVCInpatient) then
 | 
|---|
 | 209 |   begin
 | 
|---|
 | 210 |     uVCInitialCat := InitialCat;
 | 
|---|
 | 211 |     uVCLocation := Location;
 | 
|---|
 | 212 |     uVCInpatient := Inpatient;
 | 
|---|
 | 213 |     tmp := sCallV('ORWPCE GETSVC', [InitialCat, Location, BOOLCHAR[Inpatient]]);
 | 
|---|
 | 214 |     if(tmp <> '') then
 | 
|---|
 | 215 |       uVCResult := tmp[1]
 | 
|---|
 | 216 |     else
 | 
|---|
 | 217 |       uVCResult := InitialCat;
 | 
|---|
 | 218 |   end;
 | 
|---|
 | 219 |   Result := uVCResult
 | 
|---|
 | 220 | end;
 | 
|---|
 | 221 | 
 | 
|---|
 | 222 | { Lexicon Lookup Calls }
 | 
|---|
 | 223 | 
 | 
|---|
 | 224 | function LexiconToCode(IEN, LexApp: Integer; ADate: TFMDateTime = 0): string;
 | 
|---|
 | 225 | var
 | 
|---|
 | 226 |   CodeSys: string;
 | 
|---|
 | 227 | begin
 | 
|---|
 | 228 |   case LexApp of
 | 
|---|
 | 229 |   LX_ICD: CodeSys := 'ICD';
 | 
|---|
 | 230 |   LX_CPT: CodeSys := 'CHP';
 | 
|---|
 | 231 |   end;
 | 
|---|
 | 232 |   Result := sCallV('ORWPCE LEXCODE', [IEN, CodeSys, ADate]);
 | 
|---|
 | 233 | end;
 | 
|---|
 | 234 | 
 | 
|---|
 | 235 | procedure ListLexicon(Dest: TStrings; const x: string; LexApp: Integer; ADate: TFMDateTime = 0);
 | 
|---|
 | 236 | var
 | 
|---|
 | 237 |   CodeSys: string;
 | 
|---|
 | 238 | begin
 | 
|---|
 | 239 |   case LexApp of
 | 
|---|
 | 240 |   LX_ICD: CodeSys := 'ICD';
 | 
|---|
 | 241 |   LX_CPT: CodeSys := 'CHP';
 | 
|---|
 | 242 |   end;
 | 
|---|
 | 243 |   CallV('ORWPCE LEX', [x, CodeSys, ADate]);
 | 
|---|
 | 244 |   Dest.Assign(RPCBrokerV.Results);
 | 
|---|
 | 245 | end;
 | 
|---|
 | 246 | 
 | 
|---|
 | 247 | function  IsActiveICDCode(ACode: string; ADate: TFMDateTime = 0): boolean;
 | 
|---|
 | 248 | begin
 | 
|---|
 | 249 |   Result := IsActiveCode(ACode, LX_ICD, ADate);
 | 
|---|
 | 250 | end;
 | 
|---|
 | 251 | 
 | 
|---|
 | 252 | function  IsActiveCPTCode(ACode: string; ADate: TFMDateTime = 0): boolean;
 | 
|---|
 | 253 | begin
 | 
|---|
 | 254 |   Result := IsActiveCode(ACode, LX_CPT, ADate);
 | 
|---|
 | 255 | end;
 | 
|---|
 | 256 | 
 | 
|---|
 | 257 | function  IsActiveCode(ACode: string; LexApp: integer; ADate: TFMDateTime = 0): boolean;
 | 
|---|
 | 258 | var
 | 
|---|
 | 259 |   CodeSys: string;
 | 
|---|
 | 260 | begin
 | 
|---|
 | 261 |   case LexApp of
 | 
|---|
 | 262 |   LX_ICD: CodeSys := 'ICD';
 | 
|---|
 | 263 |   LX_CPT: CodeSys := 'CHP';
 | 
|---|
 | 264 |   end;
 | 
|---|
 | 265 |   Result := (sCallV('ORWPCE ACTIVE CODE',[ACode, CodeSys, ADate]) = '1');
 | 
|---|
 | 266 | end;
 | 
|---|
 | 267 | 
 | 
|---|
 | 268 | { Encounter Form Elements ------------------------------------------------------------------ }
 | 
|---|
 | 269 | 
 | 
|---|
 | 270 | procedure DeletePCE(const AVisitStr: string);
 | 
|---|
 | 271 | begin
 | 
|---|
 | 272 |   sCallV('ORWPCE DELETE', [AVisitStr, Patient.DFN]);
 | 
|---|
 | 273 | end;
 | 
|---|
 | 274 | 
 | 
|---|
 | 275 | procedure LoadEncounterForm;
 | 
|---|
 | 276 | { load the major coding lists that are used by the encounter form for a given location }
 | 
|---|
 | 277 | var
 | 
|---|
 | 278 |   i: integer;
 | 
|---|
 | 279 |   uTempList: TStringList;
 | 
|---|
 | 280 |   EncDt: TFMDateTime;
 | 
|---|
 | 281 |   
 | 
|---|
 | 282 | begin
 | 
|---|
 | 283 |   uLastLocation := uEncLocation;
 | 
|---|
 | 284 |   EncDt := Trunc(uEncPCEData.VisitDateTime);
 | 
|---|
 | 285 | 
 | 
|---|
 | 286 |   //add problems to the top of diagnoses.
 | 
|---|
 | 287 |   uTempList := TstringList.Create;
 | 
|---|
 | 288 | 
 | 
|---|
 | 289 | 
 | 
|---|
 | 290 |   if UBAGlobals.BILLING_AWARE then //BAPHII 1.3.10
 | 
|---|
 | 291 |      begin
 | 
|---|
 | 292 |         UBACore.BADxList := TStringList.Create;
 | 
|---|
 | 293 |      end;
 | 
|---|
 | 294 | 
 | 
|---|
 | 295 |   try
 | 
|---|
 | 296 |     uDiagnoses.clear;
 | 
|---|
 | 297 | 
 | 
|---|
 | 298 |     if BILLING_AWARE then
 | 
|---|
 | 299 |      begin
 | 
|---|
 | 300 |         UBACore.BADxList.Clear; //BAPHII 1.3.10
 | 
|---|
 | 301 |      end;
 | 
|---|
 | 302 | 
 | 
|---|
 | 303 |     tCallV(uTempList,     'ORWPCE DIAG',  [uEncLocation, EncDt]);  //BAPHII 1.3.10
 | 
|---|
 | 304 |     uDiagnoses.add(utemplist.strings[0]);  //BAPHII 1.3.10
 | 
|---|
 | 305 |     AddProbsToDiagnoses;  //BAPHII 1.3.10
 | 
|---|
 | 306 |    // BA 25  AddProviderPatientDaysDx(uDxLst, IntToStr(Encounter.Provider), Patient.DFN);
 | 
|---|
 | 307 |     for i := 1 to (uTempList.Count-1) do  //BAPHII 1.3.10
 | 
|---|
 | 308 |       uDiagnoses.add(uTemplist.strings[i]);  //BAPHII 1.3.10
 | 
|---|
 | 309 | 
 | 
|---|
 | 310 |   finally
 | 
|---|
 | 311 |     uTempList.free;
 | 
|---|
 | 312 |   end;
 | 
|---|
 | 313 | 
 | 
|---|
 | 314 |   tCallV(uVisitTypes,    'ORWPCE VISIT', [uEncLocation, EncDt]);
 | 
|---|
 | 315 |   tCallV(uProcedures,    'ORWPCE PROC',  [uEncLocation, EncDt]);
 | 
|---|
 | 316 |   tCallV(uImmunizations, 'ORWPCE IMM',   [uEncLocation]);
 | 
|---|
 | 317 |   tCallV(uSkinTests,     'ORWPCE SK',    [uEncLocation]);
 | 
|---|
 | 318 |   tCallV(uPatientEds,    'ORWPCE PED',   [uEncLocation]);
 | 
|---|
 | 319 |   tCallV(uHealthFactors, 'ORWPCE HF',    [uEncLocation]);
 | 
|---|
 | 320 |   tCallV(uExams,         'ORWPCE XAM',   [uEncLocation]);
 | 
|---|
 | 321 | 
 | 
|---|
 | 322 |   if uVisitTypes.Count > 0    then uVisitTypes.Delete(0);             // discard counts
 | 
|---|
 | 323 |   if uDiagnoses.Count  > 0    then uDiagnoses.Delete(0);
 | 
|---|
 | 324 |   if uProcedures.Count > 0    then uProcedures.Delete(0);
 | 
|---|
 | 325 |   if uImmunizations.Count > 0 then uImmunizations.Delete(0);   
 | 
|---|
 | 326 |   if uSkinTests.Count > 0     then uSkinTests.Delete(0);       
 | 
|---|
 | 327 |   if uPatientEds.Count > 0    then uPatientEds.Delete(0);      
 | 
|---|
 | 328 |   if uHealthFactors.Count > 0 then uHealthFactors.Delete(0);   
 | 
|---|
 | 329 |   if uExams.Count > 0         then uExams.Delete(0);           
 | 
|---|
 | 330 | 
 | 
|---|
 | 331 |   if (uVisitTypes.Count > 0) and (CharAt(uVisitTypes[0], 1) <> U) then uVisitTypes.Insert(0, U);
 | 
|---|
 | 332 |   if (uDiagnoses.Count > 0)  and (CharAt(uDiagnoses[0], 1)  <> U) then uDiagnoses.Insert(0,  U);
 | 
|---|
 | 333 |   if (uProcedures.Count > 0) and (CharAt(uProcedures[0], 1) <> U) then uProcedures.Insert(0, U);
 | 
|---|
 | 334 |   if (uImmunizations.Count > 0) and (CharAt(uImmunizations[0], 1) <> U) then uImmunizations.Insert(0, U);
 | 
|---|
 | 335 |   if (uSkinTests.Count > 0) and (CharAt(uSkinTests[0], 1) <> U) then uSkinTests.Insert(0, U);            
 | 
|---|
 | 336 |   if (uPatientEds.Count > 0) and (CharAt(uPatientEds[0], 1) <> U) then uPatientEds.Insert(0, U);         
 | 
|---|
 | 337 |   if (uHealthFactors.Count > 0) and (CharAt(uHealthFactors[0], 1) <> U) then uHealthFactors.Insert(0, U);
 | 
|---|
 | 338 |   if (uExams.Count > 0) and (CharAt(uExams[0], 1) <> U) then uExams.Insert(0, U);                        
 | 
|---|
 | 339 | 
 | 
|---|
 | 340 | end;
 | 
|---|
 | 341 | 
 | 
|---|
 | 342 | {Visit Types-------------------------------------------------------------------}
 | 
|---|
 | 343 | procedure ListVisitTypeSections(Dest: TStrings);
 | 
|---|
 | 344 | { return section names in format: ListIndex^SectionName (sections begin with '^') }
 | 
|---|
 | 345 | var
 | 
|---|
 | 346 |   i: Integer;
 | 
|---|
 | 347 |   x: string;
 | 
|---|
 | 348 | begin
 | 
|---|
 | 349 |   if (uLastLocation <> uEncLocation) then LoadEncounterForm;
 | 
|---|
 | 350 |   for i := 0 to uVisitTypes.Count - 1 do if CharAt(uVisitTypes[i], 1) = U then
 | 
|---|
 | 351 |   begin
 | 
|---|
 | 352 |     x := Piece(uVisitTypes[i], U, 2);
 | 
|---|
 | 353 |     if Length(x) = 0 then x := '<No Section Name>';
 | 
|---|
 | 354 |     Dest.Add(IntToStr(i) + U + Piece(uVisitTypes[i], U, 2) + U + x);
 | 
|---|
 | 355 |   end;
 | 
|---|
 | 356 | end;
 | 
|---|
 | 357 | 
 | 
|---|
 | 358 | procedure ListVisitTypeCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 359 | { return visit types in format: visit type <TAB> amount of time <TAB> CPT code <TAB> CPT code }
 | 
|---|
 | 360 | var
 | 
|---|
 | 361 |   i: Integer;
 | 
|---|
 | 362 |   s: string;
 | 
|---|
 | 363 | 
 | 
|---|
 | 364 |   function InsertTab(x: string): string;
 | 
|---|
 | 365 |   { turn the white space between the name and the number of minutes into a single tab }
 | 
|---|
 | 366 |   begin
 | 
|---|
 | 367 |     if CharAt(x, 20) = ' '
 | 
|---|
 | 368 |       then Result := Trim(Copy(x, 1, 20)) + U + Trim(Copy(x, 21, Length(x)))
 | 
|---|
 | 369 |       else Result := Trim(x) + U;
 | 
|---|
 | 370 |   end;
 | 
|---|
 | 371 | 
 | 
|---|
 | 372 | begin {ListVisitTypeCodes}
 | 
|---|
 | 373 |   Dest.Clear;
 | 
|---|
 | 374 |   i := SectionIndex + 1;           // first line after the section name
 | 
|---|
 | 375 |   while (i < uVisitTypes.Count) and (CharAt(uVisitTypes[i], 1) <> U) do
 | 
|---|
 | 376 |   begin
 | 
|---|
 | 377 |     s := Pieces(uVisitTypes[i], U, 1, 2) + U + InsertTab(Piece(uVisitTypes[i], U, 2)) + U + Piece(uVisitTypes[i], U, 1) +
 | 
|---|
 | 378 |          U + IntToStr(i);
 | 
|---|
 | 379 |     Dest.Add(s);
 | 
|---|
 | 380 |     Inc(i);
 | 
|---|
 | 381 |   end;
 | 
|---|
 | 382 | end;
 | 
|---|
 | 383 | 
 | 
|---|
 | 384 | procedure ListVisitTypeByLoc(Dest: TStrings; Location: Integer; ADateTime: TFMDateTime = 0);
 | 
|---|
 | 385 | var
 | 
|---|
 | 386 |   i: Integer;
 | 
|---|
 | 387 |   x, SectionName: string;
 | 
|---|
 | 388 |   EncDt: TFMDateTime;
 | 
|---|
 | 389 | begin
 | 
|---|
 | 390 |   EncDt := Trunc(ADateTime);
 | 
|---|
 | 391 |   if (uVTypeLastLoc <> Location) or (uVTypeLastDate <> EncDt) then
 | 
|---|
 | 392 |   begin
 | 
|---|
 | 393 |     uVTypeForLoc.Clear;
 | 
|---|
 | 394 |     if Location = 0 then Exit;
 | 
|---|
 | 395 |     SectionName := '';
 | 
|---|
 | 396 |     CallV('ORWPCE VISIT', [Location, EncDt]);
 | 
|---|
 | 397 |     with RPCBrokerV do for i := 0 to Results.Count - 1 do
 | 
|---|
 | 398 |     begin
 | 
|---|
 | 399 |       x := Results[i];
 | 
|---|
 | 400 |       if CharAt(x, 1) = U
 | 
|---|
 | 401 |         then SectionName := Piece(x, U, 2)
 | 
|---|
 | 402 |         else uVTypeForLoc.Add(Piece(x, U, 1) + U + SectionName + U + Piece(x, U, 2));
 | 
|---|
 | 403 |     end;
 | 
|---|
 | 404 |     uVTypeLastLoc := Location;
 | 
|---|
 | 405 |     uVTypeLastDate := EncDt;
 | 
|---|
 | 406 |   end;
 | 
|---|
 | 407 |   Dest.Assign(uVTypeForLoc);
 | 
|---|
 | 408 | end;
 | 
|---|
 | 409 | 
 | 
|---|
 | 410 | function AutoSelectVisit(Location: integer): boolean;
 | 
|---|
 | 411 | begin
 | 
|---|
 | 412 |   if UAutoSelLoc <> Location then
 | 
|---|
 | 413 |   begin
 | 
|---|
 | 414 |     UAutoSelVal := (sCallV('ORWPCE AUTO VISIT TYPE SELECT', [Location]) = '1');
 | 
|---|
 | 415 |     UAutoSelLoc := Location;
 | 
|---|
 | 416 |   end;
 | 
|---|
 | 417 |   Result := UAutoSelVal;
 | 
|---|
 | 418 | end;
 | 
|---|
 | 419 | 
 | 
|---|
 | 420 | {Diagnosis---------------------------------------------------------------------}
 | 
|---|
 | 421 | procedure ListDiagnosisSections(Dest: TStrings);
 | 
|---|
 | 422 | { return section names in format: ListIndex^SectionName (sections begin with '^') }
 | 
|---|
 | 423 | var
 | 
|---|
 | 424 |   i: Integer;
 | 
|---|
 | 425 |   x: string;
 | 
|---|
 | 426 | begin
 | 
|---|
 | 427 |  //// if (uLastLocation <> uEncLocation) then LoadEncounterForm;
 | 
|---|
 | 428 |  // if (uLastDFN <> patient.DFN) then LoadEncounterForm;// commented out for CIDC needs.
 | 
|---|
 | 429 |   LoadEncounterForm;
 | 
|---|
 | 430 |   for i := 0 to uDiagnoses.Count - 1 do if CharAt(uDiagnoses[i], 1) = U then
 | 
|---|
 | 431 |   begin
 | 
|---|
 | 432 |     x := Piece(uDiagnoses[i], U, 2);
 | 
|---|
 | 433 |     if Length(x) = 0 then x := '<No Section Name>';
 | 
|---|
 | 434 |     Dest.Add(IntToStr(i) + U + Piece(uDiagnoses[i], U, 2) + U + x);
 | 
|---|
 | 435 |   end;
 | 
|---|
 | 436 | end;
 | 
|---|
 | 437 | 
 | 
|---|
 | 438 | procedure ListDiagnosisCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 439 | { return diagnoses within section in format:
 | 
|---|
 | 440 |     diagnosis <TAB> ICDInteger <TAB> .ICDDecimal <TAB> ICD Code }
 | 
|---|
 | 441 | var
 | 
|---|
 | 442 |   i: Integer;
 | 
|---|
 | 443 |   s,d: string;
 | 
|---|
 | 444 |   EncDT: TFMDateTime;
 | 
|---|
 | 445 | 
 | 
|---|
 | 446 | begin
 | 
|---|
 | 447 |   EncDT := uEncPCEData.VisitDateTime;
 | 
|---|
 | 448 |   Dest.Clear;
 | 
|---|
 | 449 |   i := SectionIndex + 1;           // first line after the section name
 | 
|---|
 | 450 |   while (i < uDiagnoses.Count) and (CharAt(uDiagnoses[i], 1) <> U) do
 | 
|---|
 | 451 |   begin
 | 
|---|
 | 452 |     s := Piece(uDiagnoses[i], U, 1);
 | 
|---|
 | 453 |     d := Piece(s, '.', 2);
 | 
|---|
 | 454 |     s := s + U + Piece(uDiagnoses[i], U, 2) + U + Piece(s, '.', 1) + U;
 | 
|---|
 | 455 |     if(d <> '') then
 | 
|---|
 | 456 |       SetPiece(s, U, 4, '.' + d )
 | 
|---|
 | 457 |     else    // RV - CSV - need to do this so trailing "#" lines up correctly when no decimals
 | 
|---|
 | 458 |       SetPiece(s, U, 4, '   ');  
 | 
|---|
 | 459 | 
 | 
|---|
 | 460 |     //filtering out inactive codes.
 | 
|---|
 | 461 |     if (Piece(uDiagnoses[i], U, 3) =  '#') then
 | 
|---|
 | 462 |     begin
 | 
|---|
 | 463 |       SetPiece(s, U, 5, '#');
 | 
|---|
 | 464 |       Dest.Add(s);
 | 
|---|
 | 465 |     end
 | 
|---|
 | 466 |     else if ((Piece(uDiagnoses[i], U, 3) =  '') or
 | 
|---|
 | 467 |      ( StrToFloat(Piece(uDiagnoses[i], U, 3)) > EncDT )) then
 | 
|---|
 | 468 |     begin
 | 
|---|
 | 469 |       Dest.Add(s);
 | 
|---|
 | 470 |     end;
 | 
|---|
 | 471 |     Inc(i);
 | 
|---|
 | 472 |   end;
 | 
|---|
 | 473 | end;
 | 
|---|
 | 474 | 
 | 
|---|
 | 475 | procedure AddProbsToDiagnoses;
 | 
|---|
 | 476 | var
 | 
|---|
 | 477 |   i: integer;                 //loop index
 | 
|---|
 | 478 |   EncDT: TFMDateTime;
 | 
|---|
 | 479 | begin
 | 
|---|
 | 480 |   //get problem list
 | 
|---|
 | 481 |   EncDT := Trunc(uEncPCEData.VisitDateTime);
 | 
|---|
 | 482 |   uLastDFN := patient.DFN;
 | 
|---|
 | 483 |   tCallV(uProblems,      'ORWPCE ACTPROB',[Patient.DFN, EncDT]);
 | 
|---|
 | 484 |   if uProblems.count > 0 then
 | 
|---|
 | 485 |   begin
 | 
|---|
 | 486 |     //add category to udiagnoses
 | 
|---|
 | 487 |     uDiagnoses.add(U + DX_PROBLEM_LIST_TXT);
 | 
|---|
 | 488 |     for i := 1 to (uProblems.count-1) do //start with 1 because strings[0] is
 | 
|---|
 | 489 |                                          //the count of elements.
 | 
|---|
 | 490 |     begin
 | 
|---|
 | 491 |       //add problems to udiagnosis.
 | 
|---|
 | 492 |       if (piece(uproblems.Strings[i],U,3) = '799.9') then continue;            // DON'T INCLUDE 799.9 CODES
 | 
|---|
 | 493 | 
 | 
|---|
 | 494 |       if (Piece(uproblems.Strings[i], U, 11) =  '#') then
 | 
|---|
 | 495 |         uDiagnoses.add(piece(uProblems.Strings[i],U,3) + U +                   // PL code inactive
 | 
|---|
 | 496 |           piece(uProblems.Strings[i],U,2) + U + '#')
 | 
|---|
 | 497 |       else if (Piece(uproblems.Strings[i], U, 10) =  '') then                  // no inactive date for code
 | 
|---|
 | 498 |         uDiagnoses.add(piece(uProblems.Strings[i],U,3) + U +
 | 
|---|
 | 499 |           piece(uProblems.Strings[i],U,2))
 | 
|---|
 | 500 |       else if (Trunc(StrToFloat(Piece(uProblems.Strings[i], U, 10))) > EncDT) then     // code active as of EncDt
 | 
|---|
 | 501 |         uDiagnoses.add(piece(uProblems.Strings[i],U,3) + U +
 | 
|---|
 | 502 |           piece(uProblems.Strings[i],U,2))
 | 
|---|
 | 503 |       else
 | 
|---|
 | 504 |         uDiagnoses.add(piece(uProblems.Strings[i],U,3) + U +                   // PL code inactive
 | 
|---|
 | 505 |           piece(uProblems.Strings[i],U,2) + U + '#');
 | 
|---|
 | 506 |     end;
 | 
|---|
 | 507 | 
 | 
|---|
 | 508 |     //1.3.10
 | 
|---|
 | 509 |     if BILLING_AWARE then
 | 
|---|
 | 510 |      begin
 | 
|---|
 | 511 |         //  add New Section and dx codes to Encounter Diagnosis Section and Code List.
 | 
|---|
 | 512 |         //  Diagnoses  ->  Provider/Patient/24 hrs
 | 
|---|
 | 513 |         uDiagnoses.add(UBAConst.ENCOUNTER_TODAYS_DX); //BAPHII 1.3.10
 | 
|---|
 | 514 |         //BADxList := AddProviderPatientDaysDx(UBACore.uDxLst, IntToStr(Encounter.Provider), Patient.DFN); //BAPHII 1.3.10
 | 
|---|
 | 515 |         rpcGetProviderPatientDaysDx(IntToStr(Encounter.Provider), Patient.DFN); //BAPHII 1.3.10
 | 
|---|
 | 516 | 
 | 
|---|
 | 517 |         for i := 0 to (UBACore.uDxLst.Count-1) do //BAPHII 1.3.10
 | 
|---|
 | 518 |            uDiagnoses.add(UBACore.uDxLst[i]); //BAPHII 1.3.10
 | 
|---|
 | 519 |         //  Code added after presentation.....
 | 
|---|
 | 520 |         //  Add Personal Diagnoses Section and Codes to Encounter Diagnosis Section and Code List.
 | 
|---|
 | 521 |         UBACore.uDxLst.Clear;
 | 
|---|
 | 522 |         uDiagnoses.Add(UBAConst.ENCOUNTER_PERSONAL_DX);
 | 
|---|
 | 523 |         UBACore.uDxLst := rpcGetPersonalDxList(User.DUZ);
 | 
|---|
 | 524 |         for i := 0 to (UBACore.uDxLst.Count -1) do
 | 
|---|
 | 525 |         begin
 | 
|---|
 | 526 |             uDiagnoses.Add(UBACore.uDxLst.Strings[i]);
 | 
|---|
 | 527 |         end;
 | 
|---|
 | 528 |      end;
 | 
|---|
 | 529 | 
 | 
|---|
 | 530 |   end;
 | 
|---|
 | 531 | end;
 | 
|---|
 | 532 | {Immunizations-----------------------------------------------------------------}
 | 
|---|
 | 533 | procedure LoadImmReactionItems(Dest: TStrings);
 | 
|---|
 | 534 | begin
 | 
|---|
 | 535 |   tCallV(Dest,'ORWPCE GET SET OF CODES',['9000010.11','.06','1']);
 | 
|---|
 | 536 | end;
 | 
|---|
 | 537 | 
 | 
|---|
 | 538 | procedure LoadImmSeriesItems(Dest: TStrings);  
 | 
|---|
 | 539 | {loads items into combo box on Immunixation screen}
 | 
|---|
 | 540 | begin
 | 
|---|
 | 541 |   tCallV(Dest,'ORWPCE GET SET OF CODES',['9000010.11','.04','1']);
 | 
|---|
 | 542 | end;
 | 
|---|
 | 543 | 
 | 
|---|
 | 544 | procedure ListImmunizSections(Dest: TStrings);
 | 
|---|
 | 545 | { return section names in format: ListIndex^SectionName (sections begin with '^') }
 | 
|---|
 | 546 | var
 | 
|---|
 | 547 |   i: Integer;
 | 
|---|
 | 548 |   x: string;
 | 
|---|
 | 549 | begin
 | 
|---|
 | 550 |   if (uLastLocation <> uEncLocation) then LoadEncounterForm;
 | 
|---|
 | 551 |   for i := 0 to uImmunizations.Count - 1 do if CharAt(uImmunizations[i], 1) = U then
 | 
|---|
 | 552 |   begin
 | 
|---|
 | 553 |     x := Piece(uImmunizations[i], U, 2);
 | 
|---|
 | 554 |     if Length(x) = 0 then x := '<No Section Name>';
 | 
|---|
 | 555 |     Dest.Add(IntToStr(i) + U + Piece(uImmunizations[i], U, 2) + U + x);
 | 
|---|
 | 556 |   end;
 | 
|---|
 | 557 | end;
 | 
|---|
 | 558 | 
 | 
|---|
 | 559 | procedure ListImmunizCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 560 | { return procedures within section in format: procedure <TAB> CPT code <TAB><TAB> CPT code}
 | 
|---|
 | 561 | var
 | 
|---|
 | 562 |   i: Integer;
 | 
|---|
 | 563 | begin
 | 
|---|
 | 564 |   Dest.Clear;
 | 
|---|
 | 565 |   i := SectionIndex + 1;           // first line after the section name
 | 
|---|
 | 566 |   while (i < uImmunizations.Count) and (CharAt(uImmunizations[i], 1) <> U) do
 | 
|---|
 | 567 |   begin
 | 
|---|
 | 568 |     Dest.Add(Pieces(uImmunizations[i], U, 1, 2));
 | 
|---|
 | 569 |     Inc(i);
 | 
|---|
 | 570 |   end;
 | 
|---|
 | 571 | end;
 | 
|---|
 | 572 | 
 | 
|---|
 | 573 | 
 | 
|---|
 | 574 | {Procedures--------------------------------------------------------------------}
 | 
|---|
 | 575 | procedure ListProcedureSections(Dest: TStrings);
 | 
|---|
 | 576 | { return section names in format: ListIndex^SectionName (sections begin with '^') }
 | 
|---|
 | 577 | var
 | 
|---|
 | 578 |   i: Integer;
 | 
|---|
 | 579 |   x: string;
 | 
|---|
 | 580 | begin
 | 
|---|
 | 581 |   if (uLastLocation <> uEncLocation) then LoadEncounterForm;
 | 
|---|
 | 582 |   for i := 0 to uProcedures.Count - 1 do if CharAt(uProcedures[i], 1) = U then
 | 
|---|
 | 583 |   begin
 | 
|---|
 | 584 |     x := Piece(uProcedures[i], U, 2);
 | 
|---|
 | 585 |     if Length(x) = 0 then x := '<No Section Name>';
 | 
|---|
 | 586 |     Dest.Add(IntToStr(i) + U + Piece(uProcedures[i], U, 2) + U + x);
 | 
|---|
 | 587 |   end;
 | 
|---|
 | 588 | end;
 | 
|---|
 | 589 | 
 | 
|---|
 | 590 | procedure ListProcedureCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 591 | { return procedures within section in format: procedure <TAB> CPT code <TAB><TAB> CPT code}
 | 
|---|
 | 592 | //Piece 12 are CPT Modifiers, Piece 13 is a flag indicating conversion of Piece 12 from
 | 
|---|
 | 593 | //modifier code to modifier IEN (updated in UpdateModifierList routine)
 | 
|---|
 | 594 | var
 | 
|---|
 | 595 |   i: Integer;
 | 
|---|
 | 596 | begin
 | 
|---|
 | 597 |   Dest.Clear;
 | 
|---|
 | 598 |   i := SectionIndex + 1;           // first line after the section name
 | 
|---|
 | 599 |   while (i < uProcedures.Count) and (CharAt(uProcedures[i], 1) <> U) do
 | 
|---|
 | 600 |   begin
 | 
|---|
 | 601 |     Dest.Add(Pieces(uProcedures[i], U, 1, 2) + U + Piece(uProcedures[i], U, 1) + U +
 | 
|---|
 | 602 |              Piece(uProcedures[i], U, 12) + U + Piece(uProcedures[i], U, 13) + U +
 | 
|---|
 | 603 |              IntToStr(i));
 | 
|---|
 | 604 |     Inc(i);
 | 
|---|
 | 605 |   end;
 | 
|---|
 | 606 | end;
 | 
|---|
 | 607 | 
 | 
|---|
 | 608 | function MixedCaseModifier(const inStr: string): string;
 | 
|---|
 | 609 | begin
 | 
|---|
 | 610 |   Result := inStr;
 | 
|---|
 | 611 |   SetPiece(Result, U, 2, MixedCase(Trim(Piece(Result, U, 2))));
 | 
|---|
 | 612 | end;
 | 
|---|
 | 613 | 
 | 
|---|
 | 614 | function ModifierIdx(ModIEN: string): integer;
 | 
|---|
 | 615 | var
 | 
|---|
 | 616 |   EncDt: TFMDateTime;
 | 
|---|
 | 617 | begin
 | 
|---|
 | 618 |   Result := uModifiers.IndexOfPiece(ModIEN);
 | 
|---|
 | 619 |   if(Result < 0) then
 | 
|---|
 | 620 |     begin
 | 
|---|
 | 621 |       if Assigned(uEncPCEData) then         // may not exist yet on display of note and PCE data
 | 
|---|
 | 622 |         EncDT := Trunc(uEncPCEData.VisitDateTime)
 | 
|---|
 | 623 |       else if Encounter.DateTime > 0 then   // really need note date/time next, but can't get to it
 | 
|---|
 | 624 |         EncDT := Trunc(Encounter.DateTime)
 | 
|---|
 | 625 |       else
 | 
|---|
 | 626 |         EncDT := FMToday;
 | 
|---|
 | 627 |       Result := uModifiers.Add(MixedCaseModifier(sCallV('ORWPCE GETMOD', [ModIEN, EncDt])));
 | 
|---|
 | 628 |     end;
 | 
|---|
 | 629 | end;
 | 
|---|
 | 630 | 
 | 
|---|
 | 631 | function ModifierList(CPTCode: string): string;
 | 
|---|
 | 632 | // uModifiers list contains <@>CPTCode;ModCount;^Mod1Index^Mod2Index^...^ModNIndex
 | 
|---|
 | 633 | //    or                    MODIEN^MODDescription^ModCode
 | 
|---|
 | 634 | 
 | 
|---|
 | 635 | const
 | 
|---|
 | 636 |   CPTCodeHeader = '<@>';
 | 
|---|
 | 637 | 
 | 
|---|
 | 638 | var
 | 
|---|
 | 639 |   i, idx: integer;
 | 
|---|
 | 640 |   s, ModIEN: string;
 | 
|---|
 | 641 |   EncDt: TFMDateTime;
 | 
|---|
 | 642 | begin
 | 
|---|
 | 643 |   EncDT := Trunc(uEncPCEData.VisitDateTime);
 | 
|---|
 | 644 |   idx := uModifiers.IndexOfPiece(CPTCodeHeader + CPTCode, ';', 1);
 | 
|---|
 | 645 |   if(idx < 0) then
 | 
|---|
 | 646 |   begin
 | 
|---|
 | 647 |     CallV('ORWPCE CPTMODS', [CPTCode, EncDt]);
 | 
|---|
 | 648 |     s := CPTCodeHeader + CPTCode + ';' + IntToStr(RPCBrokerV.Results.Count) + ';' + U;
 | 
|---|
 | 649 |     for i := 0 to RPCBrokerV.Results.Count - 1 do
 | 
|---|
 | 650 |     begin
 | 
|---|
 | 651 |       ModIEN := piece(RPCBrokerV.Results[i], U, 1);
 | 
|---|
 | 652 |       idx := uModifiers.IndexOfPiece(ModIEN);
 | 
|---|
 | 653 |       if(idx < 0) then
 | 
|---|
 | 654 |         idx := uModifiers.Add(MixedCaseModifier(RPCBrokerV.Results[i]));
 | 
|---|
 | 655 |       s := s + IntToStr(idx) + U;
 | 
|---|
 | 656 |     end;
 | 
|---|
 | 657 |     idx := uModifiers.Add(s);
 | 
|---|
 | 658 |   end;
 | 
|---|
 | 659 |   Result := uModifiers[idx];
 | 
|---|
 | 660 | end;
 | 
|---|
 | 661 | 
 | 
|---|
 | 662 | procedure ListCPTModifiers(Dest: TStrings; CPTCodes, NeededModifiers: string);
 | 
|---|
 | 663 | //CPTCodes expected in the format of code^code^code
 | 
|---|
 | 664 | //NeededModifiers in format of ModIEN1;ModIEN2;ModIEN3
 | 
|---|
 | 665 | var
 | 
|---|
 | 666 |   TmpSL: TStringList;
 | 
|---|
 | 667 |   i, j, idx, cnt, found: integer;
 | 
|---|
 | 668 |   s, Code: string;
 | 
|---|
 | 669 | 
 | 
|---|
 | 670 | begin
 | 
|---|
 | 671 |   if(not assigned(uModifiers)) then uModifiers := TORStringList.Create;
 | 
|---|
 | 672 |   if(copy(CPTCodes, length(CPTCodes), 1) <> U) then
 | 
|---|
 | 673 |     CPTCodes := CPTCodes + U;
 | 
|---|
 | 674 |   if(copy(NeededModifiers, length(NeededModifiers), 1) <> ';') then
 | 
|---|
 | 675 |     NeededModifiers := NeededModifiers + ';';
 | 
|---|
 | 676 | 
 | 
|---|
 | 677 |   TmpSL := TStringList.Create;
 | 
|---|
 | 678 |   try
 | 
|---|
 | 679 |     repeat
 | 
|---|
 | 680 |       i := pos(U, CPTCodes);
 | 
|---|
 | 681 |       if(i > 0) then
 | 
|---|
 | 682 |       begin
 | 
|---|
 | 683 |         Code := copy(CPTCodes, 1, i-1);
 | 
|---|
 | 684 |         delete(CPTCodes,1,i);
 | 
|---|
 | 685 |         if(Code <> '') then
 | 
|---|
 | 686 |           TmpSL.Add(ModifierList(Code));
 | 
|---|
 | 687 |         i := pos(U, CPTCodes);
 | 
|---|
 | 688 |       end;
 | 
|---|
 | 689 |     until(i = 0);
 | 
|---|
 | 690 |     if(TmpSL.Count = 0) then
 | 
|---|
 | 691 |       s := ';0;'
 | 
|---|
 | 692 |     else
 | 
|---|
 | 693 |     if(TmpSL.Count = 1) then
 | 
|---|
 | 694 |       s := TmpSL[0]
 | 
|---|
 | 695 |     else
 | 
|---|
 | 696 |     begin
 | 
|---|
 | 697 |       s := '';
 | 
|---|
 | 698 |       found := 0;
 | 
|---|
 | 699 |       cnt := StrToIntDef(piece(TmpSL[0], ';', 2), 0);
 | 
|---|
 | 700 |       for i := 1 to cnt do
 | 
|---|
 | 701 |       begin
 | 
|---|
 | 702 |         Code := U + Piece(TmpSL[0], U, i+1);
 | 
|---|
 | 703 |         for j := 1 to TmpSL.Count-1 do
 | 
|---|
 | 704 |         begin
 | 
|---|
 | 705 |           if(pos(Code + U, TmpSL[j]) = 0) then
 | 
|---|
 | 706 |           begin
 | 
|---|
 | 707 |             Code := '';
 | 
|---|
 | 708 |             break;
 | 
|---|
 | 709 |           end;
 | 
|---|
 | 710 |         end;
 | 
|---|
 | 711 |         if(Code <> '') then
 | 
|---|
 | 712 |         begin
 | 
|---|
 | 713 |           s := s + Code;
 | 
|---|
 | 714 |           inc(found);
 | 
|---|
 | 715 |         end;
 | 
|---|
 | 716 |       end;
 | 
|---|
 | 717 |       s := s + U;
 | 
|---|
 | 718 |       SetPiece(s , U, 1, ';' + IntToStr(Found) + ';');
 | 
|---|
 | 719 |     end;
 | 
|---|
 | 720 |   finally
 | 
|---|
 | 721 |     TmpSL.Free;
 | 
|---|
 | 722 |   end;
 | 
|---|
 | 723 | 
 | 
|---|
 | 724 |   Dest.Clear;
 | 
|---|
 | 725 |   cnt := StrToIntDef(piece(s, ';', 2), 0);
 | 
|---|
 | 726 |   if(NeededModifiers <> '') then
 | 
|---|
 | 727 |   begin
 | 
|---|
 | 728 |     found := cnt;
 | 
|---|
 | 729 |     repeat
 | 
|---|
 | 730 |       i := pos(';',NeededModifiers);
 | 
|---|
 | 731 |       if(i > 0) then
 | 
|---|
 | 732 |       begin
 | 
|---|
 | 733 |         idx := StrToIntDef(copy(NeededModifiers,1,i-1),0);
 | 
|---|
 | 734 |         if(idx > 0) then
 | 
|---|
 | 735 |         begin
 | 
|---|
 | 736 |           Code := IntToStr(ModifierIdx(IntToStr(idx))) + U;
 | 
|---|
 | 737 |           if(pos(U+Code, s) = 0) then
 | 
|---|
 | 738 |           begin
 | 
|---|
 | 739 |             s := s + Code;
 | 
|---|
 | 740 |             inc(cnt);
 | 
|---|
 | 741 |           end;
 | 
|---|
 | 742 |         end;
 | 
|---|
 | 743 |         delete(NeededModifiers,1,i);
 | 
|---|
 | 744 |       end;
 | 
|---|
 | 745 |     until(i = 0);
 | 
|---|
 | 746 |     if(found <> cnt) then
 | 
|---|
 | 747 |       SetPiece(s , ';', 2, IntToStr(cnt));
 | 
|---|
 | 748 |   end;
 | 
|---|
 | 749 |   for i := 1 to cnt do
 | 
|---|
 | 750 |   begin
 | 
|---|
 | 751 |     idx := StrToIntDef(piece(s, U, i + 1), -1);
 | 
|---|
 | 752 |     if(idx >= 0) then
 | 
|---|
 | 753 |       Dest.Add(uModifiers[idx]);
 | 
|---|
 | 754 |   end;
 | 
|---|
 | 755 | end;
 | 
|---|
 | 756 | 
 | 
|---|
 | 757 | function ModifierName(ModIEN: string): string;
 | 
|---|
 | 758 | begin
 | 
|---|
 | 759 |   if(not assigned(uModifiers)) then uModifiers := TORStringList.Create;
 | 
|---|
 | 760 |   Result := piece(uModifiers[ModifierIdx(ModIEN)], U, 2);
 | 
|---|
 | 761 | end;
 | 
|---|
 | 762 | 
 | 
|---|
 | 763 | function ModifierCode(ModIEN: string): string;
 | 
|---|
 | 764 | begin
 | 
|---|
 | 765 |   if(not assigned(uModifiers)) then uModifiers := TORStringList.Create;
 | 
|---|
 | 766 |   Result := piece(uModifiers[ModifierIdx(ModIEN)], U, 3);
 | 
|---|
 | 767 | end;
 | 
|---|
 | 768 | 
 | 
|---|
 | 769 | function UpdateModifierList(Dest: TStrings; Index: integer): string;
 | 
|---|
 | 770 | var
 | 
|---|
 | 771 |   i, idx, LastIdx: integer;
 | 
|---|
 | 772 |   Tmp, OKMods, Code: string;
 | 
|---|
 | 773 |   OK: boolean;
 | 
|---|
 | 774 | 
 | 
|---|
 | 775 | begin
 | 
|---|
 | 776 |   if(Piece(Dest[Index], U, 5) = '1') then
 | 
|---|
 | 777 |     Result := Piece(Dest[Index],U,4)
 | 
|---|
 | 778 |   else
 | 
|---|
 | 779 |   begin
 | 
|---|
 | 780 |     Tmp := Piece(Dest[Index], U, 4);
 | 
|---|
 | 781 |     Result := '';
 | 
|---|
 | 782 |     OKMods := ModifierList(Piece(Dest[Index], U, 1))+U;
 | 
|---|
 | 783 |     i := 1;
 | 
|---|
 | 784 |     repeat
 | 
|---|
 | 785 |       Code := Piece(Tmp,';',i);
 | 
|---|
 | 786 |       if(Code <> '') then
 | 
|---|
 | 787 |       begin
 | 
|---|
 | 788 |         LastIdx := -1;
 | 
|---|
 | 789 |         OK := FALSE;
 | 
|---|
 | 790 |         repeat
 | 
|---|
 | 791 |           idx := uModifiers.IndexOfPiece(Code, U, 3, LastIdx);
 | 
|---|
 | 792 |           if(idx > 0) then
 | 
|---|
 | 793 |           begin
 | 
|---|
 | 794 |             if(pos(U + IntToStr(idx) + U, OKMods)>0) then
 | 
|---|
 | 795 |             begin
 | 
|---|
 | 796 |               Result := Result + piece(uModifiers[idx],U,1) + ';';
 | 
|---|
 | 797 |               OK := TRUE;
 | 
|---|
 | 798 |             end
 | 
|---|
 | 799 |             else
 | 
|---|
 | 800 |               LastIdx := Idx;
 | 
|---|
 | 801 |           end;
 | 
|---|
 | 802 |         until(idx < 0) or OK;
 | 
|---|
 | 803 |         inc(i);
 | 
|---|
 | 804 |       end
 | 
|---|
 | 805 |     until(Code = '');
 | 
|---|
 | 806 |     Tmp := Dest[Index];
 | 
|---|
 | 807 |     SetPiece(Tmp,U,4,Result);
 | 
|---|
 | 808 |     SetPiece(Tmp,U,5,'1');
 | 
|---|
 | 809 |     Dest[Index] := Tmp;
 | 
|---|
 | 810 |     idx := StrToIntDef(piece(Tmp,U,6),-1);
 | 
|---|
 | 811 |     if(idx >= 0) then
 | 
|---|
 | 812 |     begin
 | 
|---|
 | 813 |       Tmp := uProcedures[idx];
 | 
|---|
 | 814 |       SetPiece(Tmp,U,12,Result);
 | 
|---|
 | 815 |       SetPiece(Tmp,U,13,'1');
 | 
|---|
 | 816 |       uProcedures[idx] := Tmp;
 | 
|---|
 | 817 |     end;
 | 
|---|
 | 818 |   end;
 | 
|---|
 | 819 | end;
 | 
|---|
 | 820 | 
 | 
|---|
 | 821 | function UpdateVisitTypeModifierList(Dest: TStrings; Index: integer): string;
 | 
|---|
 | 822 | var
 | 
|---|
 | 823 |   i, idx, LastIdx: integer;
 | 
|---|
 | 824 |   Tmp, OKMods, Code: string;
 | 
|---|
 | 825 |   OK: boolean;
 | 
|---|
 | 826 | 
 | 
|---|
 | 827 | begin
 | 
|---|
 | 828 |   if(Piece(Dest[Index], U, 7) = '1') then
 | 
|---|
 | 829 |     Result := Piece(Dest[Index],U,6)
 | 
|---|
 | 830 |   else
 | 
|---|
 | 831 |   begin
 | 
|---|
 | 832 |     Tmp := Piece(Dest[Index], U, 6);
 | 
|---|
 | 833 |     Result := '';
 | 
|---|
 | 834 |     OKMods := ModifierList(Piece(Dest[Index], U, 1))+U;
 | 
|---|
 | 835 |     i := 1;
 | 
|---|
 | 836 |     repeat
 | 
|---|
 | 837 |       Code := Piece(Tmp,';',i);
 | 
|---|
 | 838 |       if(Code <> '') then
 | 
|---|
 | 839 |       begin
 | 
|---|
 | 840 |         LastIdx := -1;
 | 
|---|
 | 841 |         OK := FALSE;
 | 
|---|
 | 842 |         repeat
 | 
|---|
 | 843 |           idx := uModifiers.IndexOfPiece(Code, U, 3, LastIdx);
 | 
|---|
 | 844 |           if(idx > 0) then
 | 
|---|
 | 845 |           begin
 | 
|---|
 | 846 |             if(pos(U + IntToStr(idx) + U, OKMods)>0) then
 | 
|---|
 | 847 |             begin
 | 
|---|
 | 848 |               Result := Result + piece(uModifiers[idx],U,1) + ';';
 | 
|---|
 | 849 |               OK := TRUE;
 | 
|---|
 | 850 |             end
 | 
|---|
 | 851 |             else
 | 
|---|
 | 852 |               LastIdx := Idx;
 | 
|---|
 | 853 |           end;
 | 
|---|
 | 854 |         until(idx < 0) or OK;
 | 
|---|
 | 855 |         inc(i);
 | 
|---|
 | 856 |       end
 | 
|---|
 | 857 |     until(Code = '');
 | 
|---|
 | 858 |     Tmp := Dest[Index];
 | 
|---|
 | 859 |     SetPiece(Tmp,U,6,Result);
 | 
|---|
 | 860 |     SetPiece(Tmp,U,7,'1');
 | 
|---|
 | 861 |     Dest[Index] := Tmp;
 | 
|---|
 | 862 |     idx := StrToIntDef(piece(Tmp,U,8),-1);
 | 
|---|
 | 863 |     if(idx >= 0) then
 | 
|---|
 | 864 |     begin
 | 
|---|
 | 865 |       Tmp := uProcedures[idx];
 | 
|---|
 | 866 |       SetPiece(Tmp,U,12,Result);
 | 
|---|
 | 867 |       SetPiece(Tmp,U,13,'1');
 | 
|---|
 | 868 |       uProcedures[idx] := Tmp;
 | 
|---|
 | 869 |     end;
 | 
|---|
 | 870 |   end;
 | 
|---|
 | 871 | end;
 | 
|---|
 | 872 | 
 | 
|---|
 | 873 | 
 | 
|---|
 | 874 | {SkinTests---------------------------------------------------------------------}
 | 
|---|
 | 875 | procedure LoadSkResultsItems(Dest: TStrings);  
 | 
|---|
 | 876 | begin
 | 
|---|
 | 877 |   tCallV(Dest,'ORWPCE GET SET OF CODES',['9000010.12','.04','1']);
 | 
|---|
 | 878 | end;
 | 
|---|
 | 879 | 
 | 
|---|
 | 880 | procedure ListSkinSections(Dest: TStrings);                    
 | 
|---|
 | 881 | { return section names in format: ListIndex^SectionName (sections begin with '^') }
 | 
|---|
 | 882 | var
 | 
|---|
 | 883 |   i: Integer;
 | 
|---|
 | 884 |   x: string;
 | 
|---|
 | 885 | begin
 | 
|---|
 | 886 |   if (uLastLocation <> uEncLocation) then LoadEncounterForm;
 | 
|---|
 | 887 |   for i := 0 to uSkinTests.Count - 1 do if CharAt(uSkinTests[i], 1) = U then
 | 
|---|
 | 888 |   begin
 | 
|---|
 | 889 |     x := Piece(uSkinTests[i], U, 2);
 | 
|---|
 | 890 |     if Length(x) = 0 then x := '<No Section Name>';
 | 
|---|
 | 891 |     Dest.Add(IntToStr(i) + U + Piece(uSkinTests[i], U, 2) + U + x);
 | 
|---|
 | 892 |   end;
 | 
|---|
 | 893 | end;
 | 
|---|
 | 894 | 
 | 
|---|
 | 895 | 
 | 
|---|
 | 896 | procedure ListSkinCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 897 | { return procedures within section in format: procedure <TAB> CPT code <TAB><TAB> CPT code}
 | 
|---|
 | 898 | var
 | 
|---|
 | 899 |   i: Integer;
 | 
|---|
 | 900 | begin
 | 
|---|
 | 901 |   Dest.Clear;
 | 
|---|
 | 902 |   i := SectionIndex + 1;           // first line after the section name
 | 
|---|
 | 903 |   while (i < uSkinTests.Count) and (CharAt(uSkinTests[i], 1) <> U) do
 | 
|---|
 | 904 |   begin
 | 
|---|
 | 905 |     Dest.Add(Pieces(uSkinTests[i], U, 1, 2));
 | 
|---|
 | 906 |     Inc(i);
 | 
|---|
 | 907 |   end;
 | 
|---|
 | 908 | end;
 | 
|---|
 | 909 | 
 | 
|---|
 | 910 | 
 | 
|---|
 | 911 | {Patient Education-------------------------------------------------------------}
 | 
|---|
 | 912 | procedure LoadPEDLevelItems(Dest: TStrings);  
 | 
|---|
 | 913 | begin
 | 
|---|
 | 914 |   tCallV(Dest,'ORWPCE GET SET OF CODES',['9000010.16','.06','1']);
 | 
|---|
 | 915 | end;
 | 
|---|
 | 916 | 
 | 
|---|
 | 917 | procedure ListPatientSections(Dest: TStrings);                    
 | 
|---|
 | 918 | { return Sections in format: ListIndex^SectionName (sections begin with '^') }
 | 
|---|
 | 919 | var
 | 
|---|
 | 920 |   i: Integer;
 | 
|---|
 | 921 |   x: string;
 | 
|---|
 | 922 | begin
 | 
|---|
 | 923 |   if (uLastLocation <> uEncLocation) then LoadEncounterForm;
 | 
|---|
 | 924 |   for i := 0 to uPatientEds.Count - 1 do if CharAt(uPatientEds[i], 1) = U then
 | 
|---|
 | 925 |   begin
 | 
|---|
 | 926 |     x := Piece(uPatientEds[i], U, 2);
 | 
|---|
 | 927 |     if Length(x) = 0 then x := '<No Section Name>';
 | 
|---|
 | 928 |     Dest.Add(IntToStr(i) + U + Piece(uPatientEds[i], U, 2) + U + x);
 | 
|---|
 | 929 |   end;
 | 
|---|
 | 930 | end;
 | 
|---|
 | 931 | 
 | 
|---|
 | 932 | 
 | 
|---|
 | 933 | procedure ListPatientCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 934 | { return PatientEds within section in format: procedure <TAB> CPT code <TAB><TAB> CPT code}
 | 
|---|
 | 935 | var
 | 
|---|
 | 936 |   i: Integer;
 | 
|---|
 | 937 | begin
 | 
|---|
 | 938 |   Dest.Clear;
 | 
|---|
 | 939 |   i := SectionIndex + 1;           // first line after the section name
 | 
|---|
 | 940 |   while (i < uPatientEds.Count) and (CharAt(uPatientEds[i], 1) <> U) do
 | 
|---|
 | 941 |   begin
 | 
|---|
 | 942 |     Dest.Add(Pieces(uPatientEds[i], U, 1, 2));
 | 
|---|
 | 943 |     Inc(i);
 | 
|---|
 | 944 |   end;
 | 
|---|
 | 945 | end;
 | 
|---|
 | 946 | 
 | 
|---|
 | 947 | 
 | 
|---|
 | 948 | 
 | 
|---|
 | 949 | {HealthFactors-------------------------------------------------------------}
 | 
|---|
 | 950 | procedure LoadHFLevelItems(Dest: TStrings);  
 | 
|---|
 | 951 | begin
 | 
|---|
 | 952 |   tCallV(Dest,'ORWPCE GET SET OF CODES',['9000010.23','.04','1']);
 | 
|---|
 | 953 | end;
 | 
|---|
 | 954 | 
 | 
|---|
 | 955 | procedure ListHealthSections(Dest: TStrings);                    
 | 
|---|
 | 956 | { return Sections in format: ListIndex^SectionName (sections begin with '^') }
 | 
|---|
 | 957 | var
 | 
|---|
 | 958 |   i: Integer;
 | 
|---|
 | 959 |   x: string;
 | 
|---|
 | 960 | begin
 | 
|---|
 | 961 |   if (uLastLocation <> uEncLocation) then LoadEncounterForm;
 | 
|---|
 | 962 |   for i := 0 to uHealthFactors.Count - 1 do if CharAt(uHealthFactors[i], 1) = U then
 | 
|---|
 | 963 |   begin
 | 
|---|
 | 964 |     x := Piece(uHealthFactors[i], U, 2);
 | 
|---|
 | 965 |     if Length(x) = 0 then x := '<No Section Name>';
 | 
|---|
 | 966 |     Dest.Add(IntToStr(i) + U + Piece(uHealthFactors[i], U, 2) + U + x);
 | 
|---|
 | 967 |   end;
 | 
|---|
 | 968 | end;
 | 
|---|
 | 969 | 
 | 
|---|
 | 970 | 
 | 
|---|
 | 971 | procedure ListHealthCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 972 | { return PatientEds within section in format: procedure <TAB> CPT code <TAB><TAB> CPT code}
 | 
|---|
 | 973 | var
 | 
|---|
 | 974 |   i: Integer;
 | 
|---|
 | 975 | begin
 | 
|---|
 | 976 |   Dest.Clear;
 | 
|---|
 | 977 |   i := SectionIndex + 1;           // first line after the section name
 | 
|---|
 | 978 |   while (i < uHealthFactors.Count) and (CharAt(uHealthFactors[i], 1) <> U) do
 | 
|---|
 | 979 |   begin
 | 
|---|
 | 980 |     Dest.Add(Pieces(uHealthFactors[i], U, 1, 2));
 | 
|---|
 | 981 |     Inc(i);
 | 
|---|
 | 982 |   end;
 | 
|---|
 | 983 | end;
 | 
|---|
 | 984 | 
 | 
|---|
 | 985 | 
 | 
|---|
 | 986 | 
 | 
|---|
 | 987 | {Exams-------------------------------------------------------------------------}
 | 
|---|
 | 988 | procedure LoadXAMResultsItems(Dest: TStrings);  
 | 
|---|
 | 989 | begin
 | 
|---|
 | 990 |   tCallV(Dest,'ORWPCE GET SET OF CODES',['9000010.13','.04','1']);
 | 
|---|
 | 991 | end;
 | 
|---|
 | 992 | 
 | 
|---|
 | 993 | procedure LoadHistLocations(Dest: TStrings);
 | 
|---|
 | 994 | var
 | 
|---|
 | 995 |   i, j, tlen: integer;
 | 
|---|
 | 996 |   tmp: string;
 | 
|---|
 | 997 | 
 | 
|---|
 | 998 | begin
 | 
|---|
 | 999 |   tCallV(Dest,'ORQQPX GET HIST LOCATIONS',[]);
 | 
|---|
 | 1000 |   for i := 0 to (Dest.Count - 1) do
 | 
|---|
 | 1001 |   begin
 | 
|---|
 | 1002 |     tmp := MixedCase(dest[i]);
 | 
|---|
 | 1003 |     j := pos(', ',tmp);
 | 
|---|
 | 1004 |     tlen := length(tmp);
 | 
|---|
 | 1005 |     if(j > 0) and (j < (tlen - 2)) and (pos(tmp[j+2],UpperCaseLetters) > 0) and
 | 
|---|
 | 1006 |       (pos(tmp[j+3],LowerCaseLetters)>0) and ((j = (tlen-3)) or (pos(tmp[j+4],LowerCaseLetters)=0)) then
 | 
|---|
 | 1007 |       tmp[j+3] := UpCase(tmp[j+3]);
 | 
|---|
 | 1008 |     if(tlen > 1) then
 | 
|---|
 | 1009 |     begin
 | 
|---|
 | 1010 |       if(pos(tmp[tlen],Digits) > 0) and (pos(tmp[tlen-1],Digits)=0) then
 | 
|---|
 | 1011 |         insert(' ',tmp, tlen);
 | 
|---|
 | 1012 |     end;
 | 
|---|
 | 1013 |     dest[i] := tmp;
 | 
|---|
 | 1014 |   end;
 | 
|---|
 | 1015 | end;
 | 
|---|
 | 1016 | 
 | 
|---|
 | 1017 | procedure ListExamsSections(Dest: TStrings);                    
 | 
|---|
 | 1018 | { return Sections in format: ListIndex^SectionName (sections begin with '^') }
 | 
|---|
 | 1019 | var
 | 
|---|
 | 1020 |   i: Integer;
 | 
|---|
 | 1021 |   x: string;
 | 
|---|
 | 1022 | begin
 | 
|---|
 | 1023 |   if (uLastLocation <> uEncLocation) then LoadEncounterForm;
 | 
|---|
 | 1024 |   for i := 0 to uExams.Count - 1 do if CharAt(uExams[i], 1) = U then
 | 
|---|
 | 1025 |   begin
 | 
|---|
 | 1026 |     x := Piece(uExams[i], U, 2);
 | 
|---|
 | 1027 |     if Length(x) = 0 then x := '<No Section Name>';
 | 
|---|
 | 1028 |     Dest.Add(IntToStr(i) + U + Piece(uExams[i], U, 2) + U + x);
 | 
|---|
 | 1029 |   end;
 | 
|---|
 | 1030 | end;
 | 
|---|
 | 1031 | 
 | 
|---|
 | 1032 | 
 | 
|---|
 | 1033 | procedure ListExamsCodes(Dest: TStrings; SectionIndex: Integer);
 | 
|---|
 | 1034 | { return PatientEds within section in format: procedure <TAB> CPT code <TAB><TAB> CPT code}
 | 
|---|
 | 1035 | var
 | 
|---|
 | 1036 |   i: Integer;
 | 
|---|
 | 1037 | begin
 | 
|---|
 | 1038 |   Dest.Clear;
 | 
|---|
 | 1039 |   i := SectionIndex + 1;           // first line after the section name
 | 
|---|
 | 1040 |   while (i < uExams.Count) and (CharAt(uExams[i], 1) <> U) do
 | 
|---|
 | 1041 |   begin
 | 
|---|
 | 1042 |     Dest.Add(Pieces(uExams[i], U, 1, 2));
 | 
|---|
 | 1043 |     Inc(i);
 | 
|---|
 | 1044 |   end;
 | 
|---|
 | 1045 | end;
 | 
|---|
 | 1046 | 
 | 
|---|
 | 1047 | 
 | 
|---|
 | 1048 | 
 | 
|---|
 | 1049 | 
 | 
|---|
 | 1050 | 
 | 
|---|
 | 1051 | {------------------------------------------------------------------------------}
 | 
|---|
 | 1052 | function EligbleConditions: TSCConditions;
 | 
|---|
 | 1053 | { return a record listing the conditions for which a patient is eligible }
 | 
|---|
 | 1054 | var
 | 
|---|
 | 1055 |   x: string;
 | 
|---|
 | 1056 | begin
 | 
|---|
 | 1057 |   x := sCallV('ORWPCE SCSEL', [Patient.DFN, Encounter.DateTime, uEncLocation]);
 | 
|---|
 | 1058 |   with Result do
 | 
|---|
 | 1059 |   begin
 | 
|---|
 | 1060 |     SCAllow  := Piece(Piece(x, ';', 1), U, 1) = '1';
 | 
|---|
 | 1061 |     SCDflt   := Piece(Piece(x, ';', 1), U, 2) = '1';
 | 
|---|
 | 1062 |     AOAllow  := Piece(Piece(x, ';', 2), U, 1) = '1';
 | 
|---|
 | 1063 |     AODflt   := Piece(Piece(x, ';', 2), U, 2) = '1';
 | 
|---|
 | 1064 |     IRAllow  := Piece(Piece(x, ';', 3), U, 1) = '1';
 | 
|---|
 | 1065 |     IRDflt   := Piece(Piece(x, ';', 3), U, 2) = '1';
 | 
|---|
 | 1066 |     ECAllow  := Piece(Piece(x, ';', 4), U, 1) = '1';
 | 
|---|
 | 1067 |     ECDflt   := Piece(Piece(x, ';', 4), U, 2) = '1';
 | 
|---|
 | 1068 |     MSTAllow := Piece(Piece(x, ';', 5), U, 1) = '1';
 | 
|---|
 | 1069 |     MSTDflt  := Piece(Piece(x, ';', 5), U, 2) = '1';
 | 
|---|
 | 1070 |     HNCAllow := Piece(Piece(x, ';', 6), U, 1) = '1';
 | 
|---|
 | 1071 |     HNCDflt  := Piece(Piece(x, ';', 6), U, 2) = '1';
 | 
|---|
 | 1072 |     CVAllow  := Piece(Piece(x, ';', 7), U, 1) = '1';
 | 
|---|
 | 1073 |     CVDflt   := Piece(Piece(x, ';', 7), U, 2) = '1';
 | 
|---|
 | 1074 |   end;
 | 
|---|
 | 1075 | end;
 | 
|---|
 | 1076 | 
 | 
|---|
 | 1077 | procedure ListSCDisabilities(Dest: TStrings);
 | 
|---|
 | 1078 | { return text listing a patient's rated disabilities and % service connected }
 | 
|---|
 | 1079 | begin
 | 
|---|
 | 1080 |   CallV('ORWPCE SCDIS', [Patient.DFN]);
 | 
|---|
 | 1081 |   Dest.Assign(RPCBrokerV.Results);
 | 
|---|
 | 1082 | end;
 | 
|---|
 | 1083 | 
 | 
|---|
 | 1084 | procedure LoadPCEDataForNote(Dest: TStrings; ANoteIEN: Integer; VStr: string);
 | 
|---|
 | 1085 | begin
 | 
|---|
 | 1086 |   if(ANoteIEN < 1) then
 | 
|---|
 | 1087 |     CallV('ORWPCE PCE4NOTE', [ANoteIEN, Patient.DFN, VStr])
 | 
|---|
 | 1088 |   else
 | 
|---|
 | 1089 |     CallV('ORWPCE PCE4NOTE', [ANoteIEN]);
 | 
|---|
 | 1090 |   Dest.Assign(RPCBrokerV.Results);
 | 
|---|
 | 1091 | end;
 | 
|---|
 | 1092 | 
 | 
|---|
 | 1093 | function GetVisitIEN(NoteIEN: Integer): string;
 | 
|---|
 | 1094 | begin
 | 
|---|
 | 1095 |   if(NoteIEN < 1) then
 | 
|---|
 | 1096 |     CallV('ORWPCE GET VISIT', [NoteIEN, Patient.DFN, Encounter.VisitStr])
 | 
|---|
 | 1097 |   else
 | 
|---|
 | 1098 |     CallV('ORWPCE GET VISIT', [NoteIEN]);
 | 
|---|
 | 1099 |   if(RPCBrokerV.Results.Count > 0) then
 | 
|---|
 | 1100 |     Result := RPCBrokerV.Results[0]
 | 
|---|
 | 1101 |   else
 | 
|---|
 | 1102 |     Result := '0';
 | 
|---|
 | 1103 | end;
 | 
|---|
 | 1104 | 
 | 
|---|
 | 1105 | procedure SavePCEData(PCEList: TStringList; ANoteIEN, ALocation: integer);
 | 
|---|
 | 1106 | begin
 | 
|---|
 | 1107 |   CallV('ORWPCE SAVE', [PCEList, ANoteIEN, ALocation]);
 | 
|---|
 | 1108 | end;
 | 
|---|
 | 1109 | 
 | 
|---|
 | 1110 | {-----------------------------------------------------------------------------}
 | 
|---|
 | 1111 | 
 | 
|---|
 | 1112 | function DataHasCPTCodes(AList: TStrings): boolean;
 | 
|---|
 | 1113 | var
 | 
|---|
 | 1114 |   i: integer;
 | 
|---|
 | 1115 |   vl: string;
 | 
|---|
 | 1116 | 
 | 
|---|
 | 1117 | begin
 | 
|---|
 | 1118 |   if(not assigned(uHasCPT)) then
 | 
|---|
 | 1119 |     uHasCPT := TStringList.Create;
 | 
|---|
 | 1120 |   Result := FALSE;
 | 
|---|
 | 1121 |   i := 0;
 | 
|---|
 | 1122 |   while(i < AList.Count) do
 | 
|---|
 | 1123 |   begin
 | 
|---|
 | 1124 |     vl := uHasCPT.Values[AList[i]];
 | 
|---|
 | 1125 |     if(vl = '1') then
 | 
|---|
 | 1126 |     begin
 | 
|---|
 | 1127 |       Result := TRUE;
 | 
|---|
 | 1128 |       exit;
 | 
|---|
 | 1129 |     end
 | 
|---|
 | 1130 |     else
 | 
|---|
 | 1131 |     if(vl = '0') then
 | 
|---|
 | 1132 |       AList.Delete(i)
 | 
|---|
 | 1133 |     else
 | 
|---|
 | 1134 |       inc(i);
 | 
|---|
 | 1135 |   end;
 | 
|---|
 | 1136 |   if(AList.Count > 0) then
 | 
|---|
 | 1137 |   begin
 | 
|---|
 | 1138 |     with RPCBrokerV do
 | 
|---|
 | 1139 |     begin
 | 
|---|
 | 1140 |       ClearParameters := True;
 | 
|---|
 | 1141 |       RemoteProcedure := 'ORWPCE HASCPT';
 | 
|---|
 | 1142 |       Param[0].PType := list;
 | 
|---|
 | 1143 |       with Param[0] do
 | 
|---|
 | 1144 |       begin
 | 
|---|
 | 1145 |         for i := 0 to AList.Count-1 do
 | 
|---|
 | 1146 |           Mult[inttostr(i+1)] := AList[i];
 | 
|---|
 | 1147 |       end;
 | 
|---|
 | 1148 |       CallBroker;
 | 
|---|
 | 1149 |       for i := 0 to RPCBrokerV.Results.Count-1 do
 | 
|---|
 | 1150 |       begin
 | 
|---|
 | 1151 |         if(Piece(RPCBrokerV.Results[i],'=',2) = '1') then
 | 
|---|
 | 1152 |         begin
 | 
|---|
 | 1153 |           Result := TRUE;
 | 
|---|
 | 1154 |           break;
 | 
|---|
 | 1155 |         end;
 | 
|---|
 | 1156 |       end;
 | 
|---|
 | 1157 |       uHasCPT.AddStrings(RPCBrokerV.Results);
 | 
|---|
 | 1158 |     end;
 | 
|---|
 | 1159 |   end;
 | 
|---|
 | 1160 | end;
 | 
|---|
 | 1161 | 
 | 
|---|
 | 1162 | function GetAskPCE(Loc: integer): TAskPCE;
 | 
|---|
 | 1163 | begin
 | 
|---|
 | 1164 |   if(uAPUser <> User.DUZ) or (uAPLoc <> Loc) then
 | 
|---|
 | 1165 |   begin
 | 
|---|
 | 1166 |     uAPUser := User.DUZ;
 | 
|---|
 | 1167 |     uAPLoc := Loc;
 | 
|---|
 | 1168 |     uAPAsk := TAskPCE(StrToIntDef(sCallV('ORWPCE ASKPCE', [User.DUZ, Loc]), 0));
 | 
|---|
 | 1169 |   end;
 | 
|---|
 | 1170 |   Result := uAPAsk;
 | 
|---|
 | 1171 | end;
 | 
|---|
 | 1172 | 
 | 
|---|
 | 1173 | function HasVisit(const ANoteIEN, ALocation: integer; const AVisitDate: TFMDateTime): Integer;
 | 
|---|
 | 1174 | begin
 | 
|---|
 | 1175 |   Result := StrToIntDef(sCallV('ORWPCE HASVISIT', [ANoteIEN, Patient.DFN, ALocation, AVisitDate]), -1);
 | 
|---|
 | 1176 | end;
 | 
|---|
 | 1177 | 
 | 
|---|
 | 1178 | {-----------------------------------------------------------------------------}
 | 
|---|
 | 1179 | function CheckActivePerson(provider:String;DateTime:TFMDateTime): boolean;
 | 
|---|
 | 1180 | var
 | 
|---|
 | 1181 |   RetVal: String;
 | 
|---|
 | 1182 | begin
 | 
|---|
 | 1183 |   Callv('ORWPCE ACTIVE PROV',[provider,FloatToStr(DateTime)]);
 | 
|---|
 | 1184 |   retval := RPCBrokerV.Results[0];
 | 
|---|
 | 1185 |   if StrToInt(RetVal) = 1 then result := true
 | 
|---|
 | 1186 |   else result := false;
 | 
|---|
 | 1187 | end;
 | 
|---|
 | 1188 | 
 | 
|---|
 | 1189 | function ForcePCEEntry(Loc: integer): boolean;
 | 
|---|
 | 1190 | begin
 | 
|---|
 | 1191 |   if(Loc <> uLastForceLoc) then
 | 
|---|
 | 1192 |   begin
 | 
|---|
 | 1193 |     uLastForce := (sCallV('ORWPCE FORCE', [User.DUZ, Loc]) = '1');
 | 
|---|
 | 1194 |     uLastForceLoc := Loc;
 | 
|---|
 | 1195 |   end;
 | 
|---|
 | 1196 |   Result := uLastForce;
 | 
|---|
 | 1197 | end;
 | 
|---|
 | 1198 | 
 | 
|---|
 | 1199 | procedure LoadcboOther(Dest: TStrings; Location, fOtherApp: Integer);
 | 
|---|
 | 1200 | {loads items into combo box on Immunization screen}
 | 
|---|
 | 1201 | var
 | 
|---|
 | 1202 |   IEN, RPC: string;
 | 
|---|
 | 1203 |   TmpSL: TORStringList;
 | 
|---|
 | 1204 |   i, j, idx, typ: integer;
 | 
|---|
 | 1205 | 
 | 
|---|
 | 1206 | begin
 | 
|---|
 | 1207 |   TmpSL := TORStringList.Create;
 | 
|---|
 | 1208 |   try
 | 
|---|
 | 1209 |     Idx := 0;
 | 
|---|
 | 1210 |     case fOtherApp of
 | 
|---|
 | 1211 |       PCE_IMM: begin typ := 1; RPC := 'ORWPCE GET IMMUNIZATION TYPE';           end;
 | 
|---|
 | 1212 |       PCE_SK:  begin typ := 2; RPC := 'ORWPCE GET SKIN TEST TYPE';              end;
 | 
|---|
 | 1213 |       PCE_PED: begin typ := 3; RPC := 'ORWPCE GET EDUCATION TOPICS';            end;
 | 
|---|
 | 1214 |       PCE_HF:  begin typ := 4; RPC := 'ORWPCE GET HEALTH FACTORS TY'; Idx := 1; end;
 | 
|---|
 | 1215 |       PCE_XAM: begin typ := 5; RPC := 'ORWPCE GET EXAM TYPE';                   end;
 | 
|---|
 | 1216 |       else     begin typ := 0; RPC := '';                                       end;
 | 
|---|
 | 1217 |     end;
 | 
|---|
 | 1218 |     if typ > 0 then
 | 
|---|
 | 1219 |     begin
 | 
|---|
 | 1220 |       if idx = 0 then
 | 
|---|
 | 1221 |         tCallV(TmpSL,RPC,[nil])
 | 
|---|
 | 1222 |       else
 | 
|---|
 | 1223 |         tCallV(TmpSL,RPC,[idx]);
 | 
|---|
 | 1224 |       CallV('ORWPCE GET EXCLUDED', [Location, Typ]);
 | 
|---|
 | 1225 |       for i := 0 to RPCBrokerV.Results.Count-1 do
 | 
|---|
 | 1226 |       begin
 | 
|---|
 | 1227 |         IEN := piece(RPCBrokerV.Results[i],U,2);
 | 
|---|
 | 1228 |         idx := TmpSL.IndexOfPiece(IEN);
 | 
|---|
 | 1229 |         if idx >= 0 then
 | 
|---|
 | 1230 |         begin
 | 
|---|
 | 1231 |           TmpSL.Delete(idx);
 | 
|---|
 | 1232 |           if fOtherApp = PCE_HF then
 | 
|---|
 | 1233 |           begin
 | 
|---|
 | 1234 |             j := 0;
 | 
|---|
 | 1235 |             while (j < TmpSL.Count) do
 | 
|---|
 | 1236 |             begin
 | 
|---|
 | 1237 |               if IEN = Piece(TmpSL[J],U,4) then
 | 
|---|
 | 1238 |                 TmpSL.Delete(j)
 | 
|---|
 | 1239 |               else
 | 
|---|
 | 1240 |                 inc(j);
 | 
|---|
 | 1241 |             end;
 | 
|---|
 | 1242 |           end;
 | 
|---|
 | 1243 |         end;
 | 
|---|
 | 1244 |       end;
 | 
|---|
 | 1245 |     end;
 | 
|---|
 | 1246 |     Dest.Assign(TmpSL);
 | 
|---|
 | 1247 |   finally
 | 
|---|
 | 1248 |     TmpSL.Free;
 | 
|---|
 | 1249 |   end;
 | 
|---|
 | 1250 | end;
 | 
|---|
 | 1251 | 
 | 
|---|
 | 1252 | {
 | 
|---|
 | 1253 | function SetRPCEncouterInfo(PCEData: TPCEData): boolean;
 | 
|---|
 | 1254 | begin
 | 
|---|
 | 1255 |   if (SetRPCEncLocation(PCEData.location) = False) or (SetRPCEncDateTime(PCEData.DateTime) = False) then
 | 
|---|
 | 1256 |     result := False
 | 
|---|
 | 1257 |   else result := True;
 | 
|---|
 | 1258 | end;
 | 
|---|
 | 1259 | }
 | 
|---|
 | 1260 | 
 | 
|---|
 | 1261 | function SetRPCEncLocation(Loc: Integer): boolean;
 | 
|---|
 | 1262 | begin
 | 
|---|
 | 1263 |   uEncLocation := Loc;
 | 
|---|
 | 1264 |   Result := (uEncLocation <> 0);
 | 
|---|
 | 1265 | end;
 | 
|---|
 | 1266 | 
 | 
|---|
 | 1267 | {
 | 
|---|
 | 1268 | function SetRPCEncDateTime(DT: TFMDateTime): boolean;
 | 
|---|
 | 1269 | begin
 | 
|---|
 | 1270 |   uEncDateTime := 0.0;
 | 
|---|
 | 1271 |   result := False;
 | 
|---|
 | 1272 |   uEncDateTime := DT;
 | 
|---|
 | 1273 |   if uEncDateTime > 0.0 then result := true;
 | 
|---|
 | 1274 | end;
 | 
|---|
 | 1275 | }
 | 
|---|
 | 1276 | 
 | 
|---|
 | 1277 | function PCERPCEncLocation: integer;
 | 
|---|
 | 1278 | begin
 | 
|---|
 | 1279 |   result := uEncLocation;
 | 
|---|
 | 1280 | end;
 | 
|---|
 | 1281 | 
 | 
|---|
 | 1282 | {
 | 
|---|
 | 1283 | function PCERPCEncDateTime: TFMDateTime;
 | 
|---|
 | 1284 | begin
 | 
|---|
 | 1285 |   result := uEncDateTime;
 | 
|---|
 | 1286 | end;
 | 
|---|
 | 1287 | }
 | 
|---|
 | 1288 | 
 | 
|---|
 | 1289 | function GetLocSecondaryVisitCode(Loc: integer): char;
 | 
|---|
 | 1290 | begin
 | 
|---|
 | 1291 |   if (Loc <> uLastIsClinicLoc) then
 | 
|---|
 | 1292 |   begin
 | 
|---|
 | 1293 |     uLastIsClinicLoc := Loc;
 | 
|---|
 | 1294 |     uLastIsClinic := (sCallV('ORWPCE ISCLINIC', [Loc]) = '1');
 | 
|---|
 | 1295 |   end;
 | 
|---|
 | 1296 |   if uLastIsClinic then
 | 
|---|
 | 1297 |     Result := 'I'
 | 
|---|
 | 1298 |   else
 | 
|---|
 | 1299 |     Result := 'D';
 | 
|---|
 | 1300 | end;
 | 
|---|
 | 1301 | 
 | 
|---|
 | 1302 | function GAFOK: boolean;
 | 
|---|
 | 1303 | begin
 | 
|---|
 | 1304 |   if(not uGAFOKCalled) then
 | 
|---|
 | 1305 |   begin
 | 
|---|
 | 1306 |     uGAFOK := (sCallV('ORWPCE GAFOK', []) = '1');
 | 
|---|
 | 1307 |     uGAFOKCalled := TRUE;
 | 
|---|
 | 1308 |   end;
 | 
|---|
 | 1309 |   Result := uGAFOK;
 | 
|---|
 | 1310 | end;
 | 
|---|
 | 1311 | 
 | 
|---|
 | 1312 | function MHClinic(const Location: integer): boolean;
 | 
|---|
 | 1313 | begin
 | 
|---|
 | 1314 |   if GAFOK then
 | 
|---|
 | 1315 |     Result := (sCallV('ORWPCE MHCLINIC', [Location]) = '1')
 | 
|---|
 | 1316 |   else
 | 
|---|
 | 1317 |     Result := FALSE;
 | 
|---|
 | 1318 | end;
 | 
|---|
 | 1319 | 
 | 
|---|
 | 1320 | procedure RecentGAFScores(const Limit: integer);
 | 
|---|
 | 1321 | begin
 | 
|---|
 | 1322 |   if(GAFOK) then
 | 
|---|
 | 1323 |   begin
 | 
|---|
 | 1324 |     with RPCBrokerV do
 | 
|---|
 | 1325 |     begin
 | 
|---|
 | 1326 |       ClearParameters := True;
 | 
|---|
 | 1327 |       RemoteProcedure := 'ORWPCE LOADGAF';
 | 
|---|
 | 1328 |       Param[0].PType := list;
 | 
|---|
 | 1329 |       with Param[0] do
 | 
|---|
 | 1330 |       begin
 | 
|---|
 | 1331 |         Mult['"DFN"'] := Patient.DFN;
 | 
|---|
 | 1332 |         Mult['"LIMIT"'] := IntToStr(Limit);
 | 
|---|
 | 1333 |       end;
 | 
|---|
 | 1334 |       CallBroker;
 | 
|---|
 | 1335 |     end;
 | 
|---|
 | 1336 |   end;
 | 
|---|
 | 1337 | end;
 | 
|---|
 | 1338 | 
 | 
|---|
 | 1339 | function SaveGAFScore(const Score: integer; GAFDate: TFMDateTime; Staff: Int64): boolean;
 | 
|---|
 | 1340 | begin
 | 
|---|
 | 1341 |   Result := FALSE;
 | 
|---|
 | 1342 |   if(GAFOK) then
 | 
|---|
 | 1343 |   begin
 | 
|---|
 | 1344 |     with RPCBrokerV do
 | 
|---|
 | 1345 |     begin
 | 
|---|
 | 1346 |       ClearParameters := True;
 | 
|---|
 | 1347 |       RemoteProcedure := 'ORWPCE SAVEGAF';
 | 
|---|
 | 1348 |       Param[0].PType := list;
 | 
|---|
 | 1349 |       with Param[0] do
 | 
|---|
 | 1350 |       begin
 | 
|---|
 | 1351 |         Mult['"DFN"'] := Patient.DFN;
 | 
|---|
 | 1352 |         Mult['"GAF"'] := IntToStr(Score);
 | 
|---|
 | 1353 |         Mult['"DATE"'] := FloatToStr(GAFDate);
 | 
|---|
 | 1354 |         Mult['"STAFF"'] := IntToStr(Staff);
 | 
|---|
 | 1355 |       end;
 | 
|---|
 | 1356 |       CallBroker;
 | 
|---|
 | 1357 |     end;
 | 
|---|
 | 1358 |     if(RPCBrokerV.Results.Count > 0) and
 | 
|---|
 | 1359 |       (RPCBrokerV.Results[0] = '1') then
 | 
|---|
 | 1360 |       Result := TRUE;
 | 
|---|
 | 1361 |   end;
 | 
|---|
 | 1362 | end;
 | 
|---|
 | 1363 | 
 | 
|---|
 | 1364 | function GAFURL: string;
 | 
|---|
 | 1365 | begin
 | 
|---|
 | 1366 |   if(not uGAFURLChecked) then
 | 
|---|
 | 1367 |   begin
 | 
|---|
 | 1368 |     uGAFURL := sCallV('ORWPCE GAFURL', []);
 | 
|---|
 | 1369 |     uGAFURLChecked  := TRUE;
 | 
|---|
 | 1370 |   end;
 | 
|---|
 | 1371 |   Result := uGAFURL;
 | 
|---|
 | 1372 | end;
 | 
|---|
 | 1373 | 
 | 
|---|
 | 1374 | function MHTestsOK: boolean;
 | 
|---|
 | 1375 | begin
 | 
|---|
 | 1376 |   if(not uMHOKChecked) then
 | 
|---|
 | 1377 |   begin
 | 
|---|
 | 1378 |     uMHOK := (sCallV('ORWPCE MHTESTOK', []) = '1');
 | 
|---|
 | 1379 |     uMHOKChecked := TRUE;
 | 
|---|
 | 1380 |   end;
 | 
|---|
 | 1381 |   Result := uMHOK;
 | 
|---|
 | 1382 | end;
 | 
|---|
 | 1383 | 
 | 
|---|
 | 1384 | function MHTestAuthorized(Test: string): boolean;
 | 
|---|
 | 1385 | begin
 | 
|---|
 | 1386 |   Result := (sCallV('ORWPCE MH TEST AUTHORIZED', [Test, User.DUZ]) = '1');
 | 
|---|
 | 1387 | end;
 | 
|---|
 | 1388 | 
 | 
|---|
 | 1389 | function AnytimeEncounters: boolean;
 | 
|---|
 | 1390 | begin
 | 
|---|
 | 1391 |   if uAnytimeEnc < 0 then
 | 
|---|
 | 1392 |     uAnytimeEnc := ord(sCallV('ORWPCE ANYTIME', []) = '1');
 | 
|---|
 | 1393 |   Result := BOOLEAN(uAnytimeEnc);
 | 
|---|
 | 1394 | end;
 | 
|---|
 | 1395 | 
 | 
|---|
 | 1396 | function AutoCheckout(Loc: integer): boolean;
 | 
|---|
 | 1397 | begin
 | 
|---|
 | 1398 |   if(uLastChkOutLoc <> Loc) then
 | 
|---|
 | 1399 |   begin
 | 
|---|
 | 1400 |     uLastChkOutLoc := Loc;
 | 
|---|
 | 1401 |     uLastChkOut := (sCallV('ORWPCE ALWAYS CHECKOUT', [Loc]) = '1');
 | 
|---|
 | 1402 |   end;
 | 
|---|
 | 1403 |   Result := uLastChkOut;
 | 
|---|
 | 1404 | end;
 | 
|---|
 | 1405 | 
 | 
|---|
 | 1406 | { encounter capture functions ------------------------------------------------ }
 | 
|---|
 | 1407 | 
 | 
|---|
 | 1408 | function RequireExposures(ANote, ATitle: Integer): Boolean;   {*RAB 3/22/99*}
 | 
|---|
 | 1409 | { returns true if a progress note should require the expossure questions to be answered }
 | 
|---|
 | 1410 | begin
 | 
|---|
 | 1411 |   if ANote <= 0
 | 
|---|
 | 1412 |     then Result := Piece(sCallV('TIU GET DOCUMENT PARAMETERS', ['0', ATitle]), U, 15) = '1'
 | 
|---|
 | 1413 |     else Result := Piece(sCallV('TIU GET DOCUMENT PARAMETERS', [ANote]), U, 15) = '1';
 | 
|---|
 | 1414 | end;
 | 
|---|
 | 1415 | 
 | 
|---|
 | 1416 | function PromptForWorkload(ANote, ATitle: Integer; VisitCat: Char; StandAlone: boolean): Boolean;
 | 
|---|
 | 1417 | { returns true if a progress note should prompt for capture of encounter }
 | 
|---|
 | 1418 | var
 | 
|---|
 | 1419 |   X: string;
 | 
|---|
 | 1420 | 
 | 
|---|
 | 1421 | begin
 | 
|---|
 | 1422 |   Result := FALSE;
 | 
|---|
 | 1423 |   if (VisitCat <> 'A') and (VisitCat <> 'I') and (VisitCat <> 'T') then exit;
 | 
|---|
 | 1424 |   if ANote <= 0 then
 | 
|---|
 | 1425 |     X := sCallV('TIU GET DOCUMENT PARAMETERS', ['0', ATitle])
 | 
|---|
 | 1426 |   else
 | 
|---|
 | 1427 |     X := sCallV('TIU GET DOCUMENT PARAMETERS', [ANote]);
 | 
|---|
 | 1428 |   if(Piece(X, U, 14) = '1') then exit; // Suppress DX/CPT  param is TRUE - don't ask
 | 
|---|
 | 1429 |   if StandAlone then
 | 
|---|
 | 1430 |     Result := TRUE
 | 
|---|
 | 1431 |   else
 | 
|---|
 | 1432 |     Result := (Piece(X, U, 16) = '1'); // Check  Ask DX/CPT  param
 | 
|---|
 | 1433 | end;
 | 
|---|
 | 1434 | 
 | 
|---|
 | 1435 | function IsCancelOrNoShow(ANote: integer): boolean;
 | 
|---|
 | 1436 | begin
 | 
|---|
 | 1437 |   Result := (sCallV('ORWPCE CXNOSHOW', [ANote]) = '0');
 | 
|---|
 | 1438 | end;
 | 
|---|
 | 1439 | 
 | 
|---|
| [460] | 1440 | function IsNonCountClinic(ALocation: integer): boolean;
 | 
|---|
 | 1441 | begin
 | 
|---|
 | 1442 |   Result := (sCallV('ORWPCE1 NONCOUNT', [ALocation]) = '1');
 | 
|---|
 | 1443 | end;
 | 
|---|
 | 1444 | 
 | 
|---|
| [459] | 1445 | function DefaultProvider(ALocation: integer; AUser: Int64; ADate: TFMDateTime;
 | 
|---|
 | 1446 |                                              ANoteIEN: integer): string;
 | 
|---|
 | 1447 | begin
 | 
|---|
 | 1448 |   Result := sCallV('TIU GET DEFAULT PROVIDER', [ALocation, AUser, ADate, ANoteIEN]);
 | 
|---|
 | 1449 | end;
 | 
|---|
 | 1450 | 
 | 
|---|
 | 1451 | function IsUserAProvider(AUser: Int64; ADate: TFMDateTime): boolean;
 | 
|---|
 | 1452 | begin
 | 
|---|
 | 1453 |   Result := (sCallV('TIU IS USER A PROVIDER?', [AUser, ADate]) = '1');
 | 
|---|
 | 1454 | end;
 | 
|---|
 | 1455 | 
 | 
|---|
 | 1456 | //function HNCOK: boolean;
 | 
|---|
 | 1457 | //begin
 | 
|---|
 | 1458 | //  if uHNCOK < 0 then
 | 
|---|
 | 1459 | //    uHNCOK := ord(sCallV('ORWPCE HNCOK', []) = '1');
 | 
|---|
 | 1460 | //  Result := boolean(uHNCOK);
 | 
|---|
 | 1461 | //end;
 | 
|---|
 | 1462 | 
 | 
|---|
 | 1463 | initialization
 | 
|---|
 | 1464 |   uLastLocation := 0;
 | 
|---|
 | 1465 |   uVTypeLastLoc := 0;
 | 
|---|
 | 1466 |   uVTypeLastDate := 0;
 | 
|---|
 | 1467 |   uDiagnoses     := TStringList.Create;
 | 
|---|
 | 1468 |   uExams         := TStringList.Create;
 | 
|---|
 | 1469 |   uHealthFactors := TStringList.Create;
 | 
|---|
 | 1470 |   uImmunizations := TStringList.Create;
 | 
|---|
 | 1471 |   uPatientEds    := TStringList.Create;
 | 
|---|
 | 1472 |   uProcedures    := TStringList.Create;
 | 
|---|
 | 1473 |   uSkinTests     := TStringList.Create;
 | 
|---|
 | 1474 |   uVisitTypes    := TStringList.Create;
 | 
|---|
 | 1475 |   uVTypeForLoc   := TStringList.Create;
 | 
|---|
 | 1476 |   uProblems      := TStringList.Create;
 | 
|---|
 | 1477 | 
 | 
|---|
 | 1478 | finalization
 | 
|---|
 | 1479 |   uDiagnoses.Free;
 | 
|---|
 | 1480 |   uExams.Free;
 | 
|---|
 | 1481 |   uHealthFactors.Free;
 | 
|---|
 | 1482 |   uImmunizations.Free;
 | 
|---|
 | 1483 |   uPatientEds.Free;
 | 
|---|
 | 1484 |   uProcedures.Free;
 | 
|---|
 | 1485 |   uSkinTests.free;
 | 
|---|
 | 1486 |   uVisitTypes.Free;
 | 
|---|
 | 1487 |   uVTypeForLoc.Free;
 | 
|---|
 | 1488 |   uProblems.Free;
 | 
|---|
 | 1489 |   KillObj(@uModifiers);
 | 
|---|
 | 1490 |   KillObj(@uHasCPT);
 | 
|---|
 | 1491 | 
 | 
|---|
 | 1492 | end.
 | 
|---|