Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: BQITASK

BQITASK.m

Go to the documentation of this file.
  1. BQITASK ;PRXM/HC/ALA-Scheduled Task Program ; 20 Dec 2006 4:56 PM
  1. ;;2.7;ICARE MANAGEMENT SYSTEM;**1**;Dec 19, 2017;Build 12
  1. Q
  1. ;
  1. EN ;EP - Entry point
  1. NEW UID
  1. S UID=$S($G(ZTSK):"Z"_ZTSK,1:$J)
  1. ;
  1. NEW $ESTACK,$ETRAP S $ETRAP="D ERR^BQI1POJB"
  1. ;
  1. D DXC
  1. D GPR
  1. ;
  1. K BQIUPD,INSTALL,UID,STAT
  1. Q
  1. ;
  1. DXC ;EP - Tag the diagnosis categories
  1. ; Variables
  1. ; BQDEF - Diag Cat Definition Name
  1. ; BQEXEC - Diag Cat special executable program
  1. ; BQPRG - Diag Cat standard executable program
  1. ; BQREF - Taxonomy array reference
  1. ; BQGLB - Temporary global reference
  1. ; BQORD - Order that the category must be determined
  1. ; (Some categories depend upon a patient not being
  1. ; in another category)
  1. ; BQTN - Diag Cat internal entry number
  1. ;
  1. NEW $ESTACK,$ETRAP S $ETRAP="D ERR^BQI1POJB D UNWIND^%ZTER"
  1. ;
  1. ; Set the DATE/TIME DXN CATEGORY STARTED field
  1. NEW DA
  1. S DA=$O(^BQI(90508,0)) I 'DA Q
  1. S BQIUPD(90508,DA_",",4.01)=$$NOW^XLFDT()
  1. S BQIUPD(90508,DA_",",4.03)=1
  1. S BQIUPD(90508,DA_",",24.04)=$G(ZTSK)
  1. D FILE^DIE("","BQIUPD","ERROR")
  1. K BQIUPD
  1. ;
  1. NEW BQTN,BQDEF,BQORD,IEN
  1. S BQORD=""
  1. F S BQORD=$O(^BQI(90506.2,"AC",BQORD)) Q:BQORD="" D
  1. . S BQTN=0
  1. . F S BQTN=$O(^BQI(90506.2,"AC",BQORD,BQTN)) Q:'BQTN D
  1. .. ; If the category is marked as inactive, ignore it
  1. .. ;I $$GET1^DIQ(90506.2,BQTN_",",.03,"I") Q
  1. .. I $P($G(^BQI(90506.2,BQTN,0)),"^",3)'="" Q
  1. .. ; If the category is a subdefinition, ignore it
  1. .. ;I $$GET1^DIQ(90506.2,BQTN_",",.05,"I")=1 Q
  1. .. I $P($G(^BQI(90506.2,BQTN,0)),"^",5)=1 Q
  1. .. ;S BQDEF=$$GET1^DIQ(90506.2,BQTN_",",.01,"E")
  1. .. S BQDEF=$P($G(^BQI(90506.2,BQTN,0)),"^",1)
  1. .. ;S BQPRG=$$GET1^DIQ(90506.2,BQTN_",",.04,"E")
  1. .. S BQPRG=$P($G(^BQI(90506.2,BQTN,0)),"^",4)
  1. .. ;S BQEXEC=$$GET1^DIQ(90506.2,BQTN_",",1,"E")
  1. .. S BQEXEC=$G(^BQI(90506.2,BQTN,1))
  1. .. ;
  1. .. ; Set the taxonomy array from the file definition
  1. .. S BQREF="BQIRY" K @BQREF
  1. .. D ARY^BQITUTL(BQDEF,BQREF)
  1. .. S BQGLB=$NA(^TMP(UID,"BQIPOP"))
  1. .. K @BQGLB
  1. .. ;
  1. .. ; Call the populate category code
  1. .. S PRGM="POP^"_BQPRG_"(BQREF,BQGLB)"
  1. .. D @PRGM
  1. .. ;
  1. .. ; Check if patient tagged but not found in criteria anymore
  1. .. S IEN=""
  1. .. F S IEN=$O(^BQIREG("B",BQTN,IEN)) Q:IEN="" D
  1. ... S DFN=$P(^BQIREG(IEN,0),U,2)
  1. ... I '$D(@BQGLB@(DFN)) D
  1. .... D NCR^BQITDUTL(DFN,BQTN)
  1. .... ; Remove previous criteria
  1. .... NEW DA,DIK
  1. .... S DA(2)=DFN,DA(1)=BQTN,DA=0,DIK="^BQIPAT("_DA(2)_",20,"_DA(1)_",1,"
  1. .... F S DA=$O(^BQIPAT(DFN,20,BQTN,1,DA)) Q:'DA D ^DIK
  1. .... K ^BQIPAT(DFN,20,BQTN,1,"B")
  1. .. ; File the patients who met criteria
  1. .. S DFN=0
  1. .. F S DFN=$O(@BQGLB@(DFN)) Q:DFN="" D FIL(BQGLB,DFN)
  1. .. Q
  1. ;
  1. K @BQGLB,AGE,BQEXEC,BQDEF,BQPRG,@BQREF,BQREF,BQGLB,DFN,PRGM
  1. K SEX,TXDXCN,TXDXCT,TXT,Y
  1. ;
  1. ; Set the DATE/TIME DXN CATEGORY STOPPED field
  1. NEW DA
  1. S DA=$O(^BQI(90508,0)) I 'DA Q
  1. S BQIUPD(90508,DA_",",4.02)=$$NOW^XLFDT()
  1. S BQIUPD(90508,DA_",",4.03)="@"
  1. S BQIUPD(90508,DA_",",24.04)="@"
  1. D FILE^DIE("","BQIUPD","ERROR")
  1. K BQIUPD
  1. Q
  1. ;
  1. GPR ;EP - Entry point to get GPRA values for all users
  1. ;
  1. ;Variables
  1. ; BQIGREF - Temporary global reference that returns the raw GPRA data
  1. ; BQIDATA - Global reference for iCare Patients.
  1. ;
  1. NEW $ESTACK,$ETRAP S $ETRAP="D ERR^BQI1POJB D UNWIND^%ZTER"
  1. ;
  1. NEW BGP3YE,BGPB3YE,BGPBBD,BGPBD,BGPBED,BGPED,BGPIND,BGPP3YE,BGPPBD,BGPPED
  1. NEW BGPQTR,BGPRPT,BGPRTYPE,BQIDATA,BQIGREF,BQIH,BQIINDG,BQIPUP,BQIROU,BQIY
  1. NEW BQIYR,IND,MCT,MEAS,SIND,BGPPER,BQIDFN,CT,GPMEAS,BQIMEASG,CRDT
  1. ;
  1. NEW UID
  1. S UID=$S($G(ZTSK):"Z"_ZTSK,1:$J)
  1. ;
  1. ; Check if new version of CRS has been loaded
  1. D GCHK^BQIGPUPD(0)
  1. ;
  1. ; Set the DATE/TIME GPRA STARTED field
  1. NEW DA
  1. S DA=$O(^BQI(90508,0)) I 'DA Q
  1. S BQIUPD(90508,DA_",",4.04)=$$NOW^XLFDT()
  1. S BQIUPD(90508,DA_",",4.06)=1
  1. S BQIUPD(90508,DA_",",24.05)=$G(ZTSK)
  1. D FILE^DIE("","BQIUPD")
  1. K BQIUPD
  1. ;
  1. NEW DFN
  1. S BQIGREF=$NA(^TMP(UID,"BQIGPRA"))
  1. K @BQIGREF
  1. S BQIDATA=$NA(^BQIPAT)
  1. ;
  1. ; Initialize data
  1. D INP^BQINIGHT
  1. ; If the routine is not defined, quit
  1. I $G(BQIROU)="" G EXIT
  1. ;
  1. ; If the tag is not defined, quit
  1. I $T(@("BQI^"_BQIROU))="" G EXIT
  1. ;
  1. ; Initialize GPRA variables
  1. NEW VER,BQX,XN
  1. S VER=$$VERSION^XPDUTL("BGP")
  1. ;
  1. I VER>7.0 D
  1. . S BQX=""
  1. . F S BQX=$O(^BQI(90506.1,"AC","G",BQX)) Q:BQX="" D
  1. .. I $P(^BQI(90506.1,BQX,0),U,10)=1 Q
  1. .. S X=$P(^BQI(90506.1,BQX,0),U,1),XN=$P(X,"_",2)
  1. .. S X=$P($G(@BQIMEASG@(XN,0)),U,1) I X'="" S BGPIND(X)=""
  1. ;
  1. ; Define the time frame for the patient
  1. S BGPBD=$$DATE^BQIUL1("T-12M"),BGPED=DT
  1. ;S BGPBD=3160731,BGPED=3170731
  1. S BGPBBD="300"_$E(BGPBD,4,7),BGPBED="300"_$E(BGPED,4,7)
  1. S BGPPBD=$$DATE^BQIUL1("T-24M"),BGPPED=$$DATE^BQIUL1("T-12M")
  1. S BGPPER=$E($$DT^XLFDT(),1,3)_"0000"
  1. S BGPQTR=$S(BGPBD>($E(BGPBD,1,3)_"0101")&(BGPBD<($E(BGPBD,1,3)_"0331")):1,BGPBD>($E(BGPBD,1,3)_"0401")&(BGPBD<($E(BGPBD,1,3)_"0630")):2,BGPBD>($E(BGPBD,1,3)_"0701")&(BGPBD<($E(BGPBD,1,3)_"0930")):3,1:4)
  1. S BGPRTYPE=4,BGPRPT=4
  1. S BGP3YE=$$FMADD^XLFDT(BGPED,-1096)
  1. S BGPP3YE=$$FMADD^XLFDT(BGPPED,-1096)
  1. S BGPB3YE=$$FMADD^XLFDT(BGPBED,-1096)
  1. ;
  1. ; Setup taxonomies
  1. I VER>14.1 D
  1. . I $T(UNFOLDTX^BGP8UTL2)="" Q
  1. . D UNFOLDTX^BGP8UTL2
  1. ;
  1. ; For every patient in the database, call the GPRA API
  1. S BQIDFN=0
  1. F S BQIDFN=$O(^AUPNPAT(BQIDFN)) Q:'BQIDFN D
  1. . ; Remove any previous GPRA data
  1. . K @BQIDATA@(BQIDFN,30)
  1. . ;
  1. . ; If patient is deceased, don't calculate
  1. . I $P($G(^DPT(BQIDFN,.35)),U,1)'="" Q
  1. . ; If patient has no active HRNs, quit
  1. . I '$$HRN^BQIUL1(BQIDFN) Q
  1. . ; If patient has no visits in past 3 years, quit
  1. . I '$$VTHR^BQIUL1(BQIDFN) Q
  1. . ;I '$$VTWR^BQIUL1(BQIDFN) Q
  1. . I $P($G(^AUPNPAT(BQIDFN,0)),U,1)="" Q
  1. . ; if the patient doesn't already exist in the iCare Patient file, add them
  1. . I $G(^BQIPAT(BQIDFN,0))="" D NPT(BQIDFN)
  1. . I $P($G(^BQIPAT(BQIDFN,0)),"^",1)="" S $P(^BQIPAT(BQIDFN,0),"^",1)=BQIDFN,^BQIPAT("B",BQIDFN,BQIDFN)=""
  1. . ;
  1. . ;S CRDT=$P($G(^BQIPAT(BQIDFN,0)),"^",5)
  1. . ;I $$FMDIFF^XLFDT(DT,CRDT\1)<7 Q
  1. . ;
  1. . D @("BQI^"_BQIROU_"(BQIDFN,.BQIGREF)")
  1. . ; if the patient doesn't meet any GPRA logic, quit
  1. . I '$D(@BQIGREF@(BQIDFN)) Q
  1. . ;
  1. . S @BQIDATA@(BQIDFN,30,0)="^90507.53^^"
  1. . ;
  1. . ; set the year of the GPRA and the begin/end dates
  1. . S BQIPUP(90507.5,BQIDFN_",",.02)=BQIYR
  1. . S BQIPUP(90507.5,BQIDFN_",",.03)=BGPBD
  1. . S BQIPUP(90507.5,BQIDFN_",",.04)=BGPED
  1. . S BQIPUP(90507.5,BQIDFN_",",.05)=$$NOW^XLFDT()
  1. . D FILE^DIE("","BQIPUP","ERROR")
  1. . K BQIPUP
  1. . ;
  1. . ; initialize the summary indicators for the patient
  1. . S CT=0,SIND=""
  1. . F S SIND=$O(^BQI(90506.1,"AC","G",SIND)) Q:SIND="" D
  1. .. S CT=CT+1
  1. .. I $P(^BQI(90506.1,SIND,0),U,10)=1 Q
  1. .. S @BQIDATA@(BQIDFN,30,CT,0)=$P(^BQI(90506.1,SIND,0),U,1)
  1. .. S @BQIDATA@(BQIDFN,30,"B",$P(^BQI(90506.1,SIND,0),U,1),CT)=""
  1. . ;
  1. . S IND=0
  1. . F S IND=$O(@BQIGREF@(BQIDFN,IND)) Q:IND="" D
  1. .. S MEAS=0
  1. .. F S MEAS=$O(@BQIGREF@(BQIDFN,IND,MEAS)) Q:MEAS="" D
  1. ... S GPMEAS=BQIYR_"_"_MEAS
  1. ... S MCT=$O(^BQIPAT(BQIDFN,30,"B",GPMEAS,"")) I MCT="" Q
  1. ... S $P(@BQIDATA@(BQIDFN,30,MCT,0),U,2)=$P(@BQIGREF@(BQIDFN,IND),U,2)
  1. ... S $P(@BQIDATA@(BQIDFN,30,MCT,0),U,3)=$P(@BQIGREF@(BQIDFN,IND,MEAS),U,2)
  1. ... S $P(@BQIDATA@(BQIDFN,30,MCT,0),U,4)=$P(@BQIGREF@(BQIDFN,IND,MEAS),U,3)
  1. . K @BQIGREF
  1. . ; reindex the patient record
  1. . ;NEW DA,DIK
  1. . ;S DA=BQIDFN,DIK="^BQIPAT(" D IX1^DIK
  1. ;
  1. K ^XTMP("BGP15TAX",$J),^XTMP("BGPSNOMEDSUBSET",$J)
  1. ;
  1. EXIT ; Set the DATE/TIME GPRA STOPPED
  1. NEW DA
  1. S DA=$O(^BQI(90508,0)) I 'DA Q
  1. S BQIUPD(90508,DA_",",4.05)=$$NOW^XLFDT()
  1. S BQIUPD(90508,DA_",",4.06)="@"
  1. S BQIUPD(90508,DA_",",24.05)="@"
  1. D FILE^DIE("","BQIUPD","ERROR")
  1. K BQIUPD
  1. Q
  1. ;
  1. FIL(BQGLB,DFN) ;EP - File diagnosis category
  1. NEW DA,IENS,DIC,X,DLAYGO,DINUM,EVN,TXN,TYP,MEVN,TGDATA,CSTAT,RIEN,TXT,TXN,QFL
  1. NEW THCFL
  1. ; Exclude deceased patients
  1. I $P($G(^DPT(DFN,.35)),U,1)'="" Q
  1. ; If patient has no active HRNs, quit
  1. ;I '$$HRN^BQIUL1(DFN) Q
  1. ; If patient has no visit in past 3 years, quit
  1. ;I BQDEF'="ASCVD Known",'$$VTHR^BQIUL1(DFN) Q
  1. ;
  1. ; Check on status of current record
  1. S RIEN=$O(^BQIREG("C",DFN,BQTN,""))
  1. ; If patient is in BQIREG with accepted status, no need to do anything
  1. I RIEN'="" S QFL=0 D Q:QFL
  1. . S CSTAT=$P(^BQIREG(RIEN,0),U,3)
  1. . I CSTAT="A" S QFL=1
  1. . I CSTAT="N",BQTN'=3 S QFL=1
  1. ; if the patient doesn't already exist in the iCare Patient file, add them
  1. I $G(^BQIPAT(DFN,0))="" D NPT(DFN)
  1. ;
  1. S DA(1)=DFN
  1. I '$D(^BQIPAT(DFN,20,0)) S ^BQIPAT(DFN,20,0)="^90507.52P^^"
  1. S (X,DINUM)=BQTN,DIC(0)="L",DIC="^BQIPAT("_DA(1)_",20,",DLAYGO=90507.52,DIC("P")=DLAYGO
  1. K DO,DD D FILE^DICN
  1. S DA=+Y S:DA=-1 DA=BQTN
  1. S IENS=$$IENS^DILF(.DA)
  1. S BQIUPD(90507.52,IENS,.02)=$$NOW^XLFDT()
  1. S BQIUPD(90507.5,DFN_",",.06)=$$NOW^XLFDT()
  1. D FILE^DIE("","BQIUPD","ERROR")
  1. K BQIUPD
  1. ;
  1. ; Remove previous criteria
  1. D DEL
  1. ;
  1. ; Add the criteria on why patient met diagnosis category
  1. S TXT=""
  1. F S TXT=$O(@BQGLB@(DFN,"CRITERIA",TXT)) Q:TXT="" D
  1. . I '$D(^BQIPAT(DFN,20,BQTN,1,0)) S ^BQIPAT(DFN,20,BQTN,1,0)="^90507.521^^"
  1. . NEW DA
  1. . S DA(2)=DFN,DA(1)=BQTN,X=TXT,DIC(0)="L"
  1. . S DIC="^BQIPAT("_DA(2)_",20,"_DA(1)_",1,",DLAYGO=90507.521
  1. . K DO,DD D FILE^DICN
  1. . S TXN=+Y
  1. . I '$D(^BQIPAT(DFN,20,BQTN,1,TXN,1,0)) S ^BQIPAT(DFN,20,BQTN,1,TXN,1,0)="^90507.5211^^"
  1. . F TYP="P" S EVN=0 D
  1. .. F S EVN=$O(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN)) Q:EVN="" D
  1. ... NEW DA,IENS
  1. ... S DA(3)=DFN,DA(2)=BQTN,DA(1)=TXN,DIC(0)="L",DLAYGO=90507.5211,X=TYP_EVN
  1. ... S DIC="^BQIPAT("_DA(3)_",20,"_DA(2)_",1,"_DA(1)_",1,"
  1. ... D ^DIC
  1. ... S DA=+Y,IENS=$$IENS^DILF(.DA)
  1. ... S BQIUPD(90507.5211,IENS,.02)=$P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN),U,1)
  1. ... I $P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN),U,2)'="" S BQIUPD(90507.5211,IENS,.03)=$P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN),U,2)
  1. ... I $P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN),U,3)'="" S BQIUPD(90507.5211,IENS,.04)=$P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN),U,3)
  1. ... I $P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN),U,4)'="" S BQIUPD(90507.5211,IENS,.05)=$P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN),U,4)
  1. ... D FILE^DIE("","BQIUPD","ERROR")
  1. ... K BQIUPD
  1. . F TYP="V" S EVN="" D
  1. .. F S EVN=$O(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN)) Q:EVN="" D
  1. ... S MEVN=""
  1. ... F S MEVN=$O(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN,MEVN)) Q:MEVN="" D
  1. .... NEW DA,IENS
  1. .... S DA(3)=DFN,DA(2)=BQTN,DA(1)=TXN,DIC(0)="L",DLAYGO=90507.5211,X=TYP_EVN
  1. .... S DIC="^BQIPAT("_DA(3)_",20,"_DA(2)_",1,"_DA(1)_",1,"
  1. .... D ^DIC
  1. .... I $P(Y,U,3)'=1 D
  1. ..... I Y=-1 K DO,DD D FILE^DICN Q
  1. ..... I $P(^BQIPAT(DFN,20,BQTN,1,TXN,1,+Y,0),U,4)'=MEVN K DO,DD D FILE^DICN
  1. .... S DA=+Y,IENS=$$IENS^DILF(.DA)
  1. .... S BQIUPD(90507.5211,IENS,.02)=$P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN,MEVN),U,1)
  1. .... I $P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN,MEVN),U,2)'="" S BQIUPD(90507.5211,IENS,.03)=$P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN,MEVN),U,2)
  1. .... I $P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN,MEVN),U,3)'="" S BQIUPD(90507.5211,IENS,.04)=$P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN,MEVN),U,3)
  1. .... I $P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN,MEVN),U,4)'="" S BQIUPD(90507.5211,IENS,.05)=$P(@BQGLB@(DFN,"CRITERIA",TXT,TYP,EVN,MEVN),U,4)
  1. .... D FILE^DIE("","BQIUPD","ERROR")
  1. .... K BQIUPD
  1. ;
  1. K @BQGLB@(DFN)
  1. ; Check on status of current record
  1. S RIEN=$O(^BQIREG("C",DFN,BQTN,""))
  1. ; If no record found, then it's a new record
  1. I RIEN="" D Q
  1. . ; if patient is in a register, check status to determine "A" else "P"
  1. . I $$REG^BQITDUTL(DFN,BQTN)=1 D EN^BQITDPRC(.TGDATA,DFN,BQTN,"A",,"SYSTEM UPDATE",8) Q
  1. . I $$REG^BQITDUTL(DFN,BQTN)=2 D EN^BQITDPRC(.TGDATA,DFN,BQTN,"P",,"SYSTEM UPDATE",8) Q
  1. . D EN^BQITDPRC(.TGDATA,DFN,BQTN,"P",,"SYSTEM UPDATE",5)
  1. ;
  1. ; If a record was found, check its current status and hierarchy
  1. S CSTAT=$P(^BQIREG(RIEN,0),U,3)
  1. I CSTAT="P" D RCHK Q
  1. ;
  1. I CSTAT="V"!(CSTAT="S") D EN^BQITDPRC(.TGDATA,DFN,BQTN,"P",,"SYSTEM UPDATE",5) Q
  1. ; Check for new factors, if none, quit
  1. I '$$CMP^BQITDUTL(DFN,BQTN) D DEL^BQITASK Q
  1. D EN^BQITDPRC(.TGDATA,DFN,BQTN,"P",,"SYSTEM UPDATE",5)
  1. Q
  1. ;
  1. NPT(DFN) ;EP - New patient
  1. ; if the patient doesn't already exist in the iCare Patient file, add them
  1. NEW DIC,X,DINUM,DLAYGO
  1. S (X,DINUM)=DFN,DLAYGO=90507.5,DIC="^BQIPAT(",DIC(0)="L",DIC("P")=DLAYGO
  1. K DO,DD D FILE^DICN
  1. Q
  1. ;
  1. DEL ;EP - Delete criteria
  1. NEW DA,DIK
  1. S DA(2)=DFN,DA(1)=BQTN,DA=0,DIK="^BQIPAT("_DA(2)_",20,"_DA(1)_",1,"
  1. F S DA=$O(^BQIPAT(DFN,20,BQTN,1,DA)) Q:'DA D ^DIK
  1. K ^BQIPAT(DFN,20,BQTN,1,"B")
  1. Q
  1. ;
  1. RCHK ; Register check
  1. ; if patient is in a register, check status to determine "A" else "P"
  1. I $$REG^BQITDUTL(DFN,BQTN)=1 D EN^BQITDPRC(.TGDATA,DFN,BQTN,"A",,"SYSTEM UPDATE",8) Q
  1. Q