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

APSPPCCV.m

Go to the documentation of this file.
  1. APSPPCCV ;IHS/CIA/DKM/PLS - PCC Data Management ;26-Oct-2015 17:40;DU
  1. ;;7.0;IHS PHARMACY MODIFICATIONS;**1003,1004,1005,1006,1007,1009,1018,1020**;Sep 23, 2004;Build 7
  1. ; Modified - IHS/CIA/PLS - 10/07/05
  1. ; IHS/MSC/PLS - 04/03/06
  1. ; - 10/31/06
  1. ; - 01/03/07 - Added logic to find an ancillary rx visit when more than one visit is returned
  1. ; - 09/26/07 - Added $GET to FNDVIS+5
  1. ; - 11/08/07 - Added RXV line label
  1. ; - 03/28/08 - Added logic to set Prescription Number into field 1102 of V MED file
  1. ; - 06/21/10 - Added line RXV+9
  1. ; - 06/03/14 - Modified the POV subroutine
  1. ; - 10/26/15 - Added N DIERR at STORE+16
  1. ; RPC: Update PCC data
  1. ; DATA = Returned as 0 if successful
  1. ; PCC = Array of PCC data to process
  1. ; X,Y = Not used (but required)
  1. SAVE(DATA,PCC,X,Y) ;EP
  1. N IDX,TYP,CODE,VST,VSTR,ADD,DEL,VAL,DFN,PRV,FLD,DAT,COM,EVT
  1. S IDX=0,DATA=0,PRV=0
  1. F S IDX=$O(PCC(IDX)) Q:'IDX!DATA D
  1. .S VAL=PCC(IDX),TYP=$P(VAL,U),CODE=$P(VAL,U,2),ADD=TYP["+",DEL=TYP["-",TYP=$TR(TYP,"+-")
  1. .D LOOK("COM",.COM)
  1. .I TYP?1.3AN,$T(@TYP)'="" D @TYP
  1. S EVT=""
  1. F S EVT=$O(EVT(EVT)) Q:'$L(EVT) D
  1. .D BRDCAST^CIANBEVT("PCC."_EVT(EVT)_"."_EVT)
  1. Q
  1. ; Look ahead for modifiers
  1. ; TYP = modifier type
  1. ; ARY = array to receive data
  1. LOOK(TYP,ARY) ;EP
  1. K ARY
  1. N IDX2,CNT
  1. S IDX2=IDX
  1. F CNT=0:1 S IDX2=$O(PCC(IDX2)) Q:'IDX2 Q:$P(PCC(IDX2),U)'=TYP D
  1. .I CNT S ARY(CNT)=PCC(IDX2)
  1. .E S ARY=PCC(IDX2)
  1. .S IDX=IDX2
  1. Q
  1. SET(FLN,PC,CV) ;EP
  1. S PC=$P(VAL,U,PC),FLD(FLN)=$S($D(CV):$$SET^CIAU(PC,CV),$L(PC):PC,1:"@")
  1. Q
  1. ; Find an existing V file entry
  1. ; CRT = Scalar or array of additional criteria in (field|format|value) format
  1. FIND(FN,CODE,VST,CRT) ;EP
  1. N GBL,IEN
  1. S GBL=$$ROOT^DILFD(FN,,1),IEN=0
  1. S:$L($G(CRT)) CRT(-1)=CRT
  1. F S IEN=+$O(@GBL@("AD",VST,IEN)) Q:'IEN Q:$P($G(@GBL@(IEN,0)),U)=CODE&$$EVAL(.CRT)
  1. Q IEN
  1. ; Evaluate list of additional fields and values
  1. EVAL(ARY) ;EP
  1. N LP,RES,ITM,TYP,FLD
  1. S RES=1,LP=""
  1. F S LP=$O(CRT(LP)) Q:LP="" D Q:'RES
  1. .S ITM=CRT(LP),FLD=$P(ITM,"|"),TYP=$P(ITM,"|",2),TYP=$S($L(TYP):TYP,1:"E"),ITM=$P(ITM,"|",3,99)
  1. .I FLD=.001 S RES=IEN=ITM
  1. .E S RES=$$GET1^DIQ(FN,IEN,FLD,TYP)=ITM
  1. Q RES
  1. ; Store the data in the specified V file
  1. ; FN = Fractional portion of V file file #
  1. ; CF = Field # of comment field (0=none; defaults to 81101)
  1. ; CRT = Additional lookup criteria
  1. STORE(FN,CF,CRT) ;EP
  1. N CIAFLD,CIAERR,CIAIEN,IEN
  1. S:'$G(VST) VST=$$VSTR2VIS(DFN,.VSTR,'DEL)
  1. I VST'>0 S:'DEL DATA="-1^Cannot create visit." G STXIT
  1. S FN=9000010+FN
  1. S:'$D(CF) CF=81101
  1. I ADD S IEN="+1"
  1. E S IEN=$$FIND(FN,CODE,VST,.CRT) I 'IEN G:DEL STXIT S IEN="+1"
  1. S:'$D(FLD(.01)) FLD(.01)=$S(DEL:"@",1:CODE)
  1. S FLD(.02)=DFN
  1. S FLD(.03)=VST
  1. S:CF&$D(COM) FLD(CF)=$P(COM,U,3,999)
  1. S:'$D(FLD(1204))&(PRV>0) FLD(1204)=PRV
  1. S:'$D(FLD(1201))&$G(DAT) FLD(1201)=DAT
  1. M CIAFLD(FN,IEN_",")=FLD
  1. K FLD
  1. N DIERR ;P1020
  1. D UPDATE^DIE("","CIAFLD","CIAIEN","CIAERR")
  1. S:$G(DIERR) DATA=-CIAERR("DIERR",1)_U_CIAERR("DIERR",1,"TEXT",1)
  1. S:$G(CIAIEN(1)) IEN=$G(CIAIEN(1))
  1. ;IHS/CIA/PLS - 10/07/05 - Remove a pharmacy created visit if no dependents
  1. I VST,DEL D
  1. .Q:$$GET1^DIQ(9000010,VST,.09) ;Quit if dependent count not zero
  1. .Q:$$GET1^DIQ(9000010,VST,.25,"I")'=$$GETPROT() ;Quit if protocol is not pharmacy protocol
  1. .Q:$$GET1^DIQ(9000010,VST,.24,"I")'=$$GETOPT() ; Quit if option is not pharmacy option
  1. .D DELVSIT(VST)
  1. S EVT(TYP)=DFN
  1. ;IHS exemption approved on 3/29/2007
  1. STXIT Q:$Q $G(IEN)
  1. Q
  1. HDR ;; Visit string
  1. S VSTR=$P(VAL,U,4)
  1. Q
  1. VST ;; Patient and encounter date
  1. S:CODE="PT" DFN=+$P(VAL,U,3)
  1. S:CODE="DT" DAT=+$P(VAL,U,3)
  1. Q
  1. PRV ;; Provider
  1. S PRV=+CODE,ADD=0
  1. D:PRV>0 SET(.04,6,"1:P;0:S;:@"),STORE(.06)
  1. Q
  1. POV ;; Purpose of visit
  1. N NAR,VAL1,SNO,DESC,X,TXT,PICD
  1. ;IHS/MSC/MGH updated to use correct lookup
  1. ;S CODE=$$FIND1^DIC(80,,"X",CODE_" ","BA")
  1. ;MGH Patch 1018 fix for adding SNOMED codes to POV
  1. S SNO=373784005
  1. S X=$$CONC^BSTSAPI(SNO_"^^^1")
  1. S DESC=$P(X,U,3)
  1. S PICD=$P(X,U,5)
  1. S $P(VAL,U,7)=SNO
  1. S $P(VAL,U,8)=DESC
  1. I $$AICD S CODE=$P($$CODEN^ICDEX(CODE,80),"~",1)
  1. E S CODE=+$$CODEN^ICDCODE(CODE,80)
  1. Q:CODE'>0
  1. S TXT=$P(VAL,U,4)
  1. S $P(VAL,U,4)=$$NARR(TXT_"|"_DESC)
  1. D:CODE>0 SET(.04,4),SET(.12,5,"1:P;0:S;:@"),SET(.08,6),SET(1101,7),SET(1102,8),STORE(.07)
  1. Q
  1. ; Lookup and optionally add narrative
  1. ; Returns pointer to PROVIDER NARRATIVE file
  1. NARR(DESCT) ;
  1. N IEN,TRC,NARR,FDA,TXT
  1. Q:'$L(DESCT) ""
  1. S TXT=$E(DESCT,1,160),TRC=$E(DESCT,1,30)
  1. F IEN=0:0 S IEN=$O(^AUTNPOV("B",TRC,IEN)) Q:'IEN Q:$P($G(^AUTNPOV(IEN,0)),U)=TXT
  1. Q:IEN IEN
  1. S FDA(9999999.27,"+1,",.01)=TXT
  1. D UPDATE^DIE("E","FDA","IEN","ERR")
  1. Q $G(IEN(1))
  1. CPT ;; CPT codes
  1. S CODE=+$$CPT^ICPTCOD(CODE)
  1. D:CODE>0 SET(.16,5),STORE(.18)
  1. Q
  1. ;
  1. RX ; Prescriptions
  1. N SIG,IEN,VMED,CRT
  1. D LOOK("SIG",.SIG)
  1. S FLD(.05)=$P($G(SIG),U,3)
  1. D SET(1202,6),SET(.06,7),SET(.07,8),SET(.08,9),SET(1102,10)
  1. S VMED=$P(VAL,U,3)
  1. S:VMED CRT=".001|I|"_VMED
  1. S IEN=$$STORE(.14,1101,.CRT)
  1. I IEN!DEL D
  1. .N RXN,RFN,FN,IENS,CIAFLD,CIAIEN,CIAERR
  1. .S RXN=$P(VAL,U,4),RFN=$P(VAL,U,5)
  1. .S IENS=$S(RFN:RFN_","_RXN_",",1:RXN_",")
  1. .S FN=$S(RFN:52.1,1:52)
  1. .S CIAFLD(FN,IENS,9999999.11)=$S(DEL:"@",1:IEN)
  1. .D UPDATE^DIE("","CIAFLD","CIAIEN","CIAERR")
  1. .S:$G(DIERR) DATA=-CIAERR("DIERR",1)_U_CIAERR("DIERR",1,"TEXT",1)
  1. Q
  1. RXV ; Non-VA Meds
  1. N SIG,IEN,VMED,CRT
  1. D LOOK("SIG",.SIG)
  1. D SET(1108,4)
  1. S FLD(.05)=$P($G(SIG),U,3)
  1. D SET(1202,6),SET(.06,7),SET(.07,8),SET(.08,9)
  1. S VMED=$P(VAL,U,3)
  1. S:VMED CRT=".001|I|"_VMED
  1. S IEN=$$STORE(.14,1101,.CRT)
  1. S:IEN="+1" IEN="" ;IHS/MSC/PLS - 06/21/10
  1. I IEN!DEL D
  1. .N NVA,RFN,FN,IENS,CIAFLD,CIAIEN,CIAERR,DFN
  1. .S IENS=+$P(VAL,U,4)_","_$P(VAL,U,5)_","
  1. .S FN=55.05
  1. .S CIAFLD(FN,IENS,9999999.11)=$S(DEL:"@",1:IEN)
  1. .D UPDATE^DIE("","CIAFLD","CIAIEN","CIAERR")
  1. .S:$G(DIERR) DATA=-CIAERR("DIERR",1)_U_CIAERR("DIERR",1,"TEXT",1)
  1. Q
  1. ; RPC: Fetch visit IEN given visit id
  1. VID2IEN(DATA,VID) ;EP
  1. S DATA=$$VID2IEN^VSIT(VID)
  1. Q
  1. ; Find a visit (internal use only)
  1. ; DFN = Patient IEN
  1. ; DAT = Visit date/time
  1. ; CAT = Service category
  1. ; LOC = Hospital Location IEN(44) Defaults to zero (A nonzero value indicates that the Clinic was defined during prescription processing)
  1. ; CRE = Force create?
  1. ; PRV = Provider IEN to restrict search (optional)
  1. ; PDIV = Pharmacy division (File 59 IEN)
  1. ; PRF = Paperless refill flag
  1. ; TYP = Visit Type
  1. ; OLOC = Other location
  1. ; OSID = Outside Location
  1. FNDVIS(DFN,DAT,CAT,LOC,CRE,PRV,PDIV,PRF,TYP,OLOC,OSID) ;
  1. N IN,OUT,IEN,DIF,FVST
  1. S IN("PAT")=DFN
  1. S IN("VISIT DATE")=DAT
  1. S IN("SITE")=$S($G(OLOC):$$ABS(OLOC),1:DUZ(2))
  1. I $G(TYP)="O" D
  1. .S IN("APCDOLOC")=$S($L($G(OSID)):OSID,1:"OUTSIDE MED")
  1. .S IN("APCDLOC")=$$ABS(OLOC)
  1. S IN("VISIT TYPE")=$S($L($G(TYP)):TYP,$P($G(^APCCCTRL(DUZ(2),0)),U,4)]"":$P(^(0),U,4),1:"I")
  1. S IN("SRV CAT")=CAT
  1. S IN("USR")=DUZ
  1. S IN("APCDOPT")=$$GETOPT()
  1. S IN("APCDPROT")=$$GETPROT()
  1. I LOC D
  1. .S IN("HOS LOC")=LOC
  1. .I LOC=$$GET1^DIQ(9009033,$G(PDIV),317,"I") D
  1. ..S IN("TIME RANGE")=0
  1. ..S:$G(PRV)&PRF IN("PROVIDER")=PRV
  1. .E D
  1. ..S IN("TIME RANGE")=-1
  1. ..S:$G(PRV) IN("PROVIDER")=PRV
  1. ..S IN("ANCILLARY")=1 ; IHS/MSC/PLS - 04/03/06
  1. E D
  1. .S IN("TIME RANGE")=0
  1. .S IN("HOS LOC")=$$GET1^DIQ(9009033,$G(PDIV),317,"I")
  1. .S:$G(PRV)&PRF IN("PROVIDER")=PRV
  1. K:CAT="E" IN("HOS LOC")
  1. I CRE<0 D Q IEN
  1. .S IN("FORCE ADD")=1
  1. .S IEN=$$MAKEVST(.IN) ; Force Create and return visit
  1. E D
  1. .K:'CRE IN("ANCILLARY")
  1. .S IN("NEVER ADD")=1
  1. .S FVST=$$FNDVSTX(.IN)
  1. Q $S(FVST:FVST,CRE>0:$$MAKEVST(.IN),1:0)
  1. ; Return whether an existing visit can be used or need to create one.
  1. FNDVSTX(CRIT) ;
  1. N IEN,RET,EFLG
  1. S RET=0
  1. D GETVISIT^BSDAPI4(.CRIT,.OUT)
  1. Q:'OUT(0) RET ; No visits were found
  1. S IEN=0,EFLG=0
  1. F S IEN=$O(OUT(IEN)) Q:'IEN D Q:EFLG
  1. .D:OUT(IEN)="ADD" BRDCAST^CIANBEVT("PCC."_DFN_".VST",IEN)
  1. .I PRF,$$CKRXVST(IEN,13) S EFLG=1,RET=IEN Q
  1. .I 'PRF,$$CKRXVST(IEN,13) D
  1. ..K OUT(IEN)
  1. ..S OUT(0)=OUT(0)-1
  1. Q $S(RET:RET,OUT(0)=1:$O(OUT(0)),1:$$ANCVCK(.OUT))
  1. ;
  1. MAKEVST(CRIT) ;
  1. N RET,OUT
  1. K CRIT("NEVER ADD")
  1. S CRIT("FORCE ADD")=1
  1. S CRIT("HOS LOC")=$S(IN("SRV CAT")="E":"",LOC:+LOC,1:$$GET1^DIQ(9009033,$G(PDIV),317,"I")) ;SET TO PHARMACY HOSPITAL LOCATION
  1. S CRIT("CLINIC CODE")=$$GET1^DIQ(44,CRIT("HOS LOC"),8,"I")
  1. D GETVISIT^BSDAPI4(.CRIT,.OUT)
  1. Q:'OUT(0) OUT(0)
  1. S RET=+$O(OUT(0))
  1. D:OUT(RET)="ADD" BRDCAST^CIANBEVT("PCC."_DFN_".VST",RET)
  1. Q RET
  1. ; Check visit for a Pharmacy visit (ancillary or paperless refill) and matching time
  1. ; Time is passed, Protocol and Option to Create are pharmacy options
  1. CKRXVST(VIEN,TM) ; EP
  1. N PRT,OPT
  1. S TM=$P($$GET1^DIQ(9000010,VIEN,.01,"I"),".",2)=TM
  1. S PRT=$$GET1^DIQ(9000010,VIEN,.25,"I")=$$GETPROT()
  1. S OPT=$$GET1^DIQ(9000010,VIEN,.24,"I")=$$GETOPT()
  1. Q TM&PRT&OPT
  1. ; Check visits in array for existence of RX ancillary visit and return first ancillary visit
  1. ANCVCK(VARY) ; EP
  1. ;Q 0
  1. N VIEN,RES
  1. S RES=0
  1. S VIEN=0
  1. F S VIEN=$O(VARY(VIEN)) Q:'VIEN D Q:RES
  1. .S:$$CKRXVST(VIEN,12) RES=VIEN
  1. Q RES
  1. ; Return absolute value
  1. ABS(X) Q $S(X<0:-X,1:X)
  1. ; Return a visit ien from a visit string (create if necessary)
  1. ; DFN = Patient IEN
  1. ; VSTR = Visit string (format: Hospital Location IEN or zero;Date of Service;Service Category;Visit IEN;outside med other location (- number = outside med, + number = other pharmacy)
  1. ; CREATE = Create flag
  1. ; 0 = Don't create
  1. ; >0 = Create if not found
  1. ; <0 = Always create
  1. ; PRV = Provider IEN to restrict visit search (optional)
  1. ; PDIV = Pharmacy Division (optional) Used for lookup of associated Hospital Location
  1. ; PRF = Paperless Refill Flag
  1. VSTR2VIS(DFN,VSTR,CREATE,PRV,PDIV,PRF) ;EP
  1. N IEN,DAT,CAT,LOC,FLG,VSIT,LP,APCDALVR,TYP,OLOC,OSID
  1. S LOC=+VSTR,DAT=+$P(VSTR,";",2),CAT=$P(VSTR,";",3),IEN=+$P(VSTR,";",4),CREATE=+$G(CREATE)
  1. S OLOC=$P(VSTR,";",5),TYP=$S(OLOC:"O",1:""),OSID=$P(VSTR,";",6)
  1. S:'IEN IEN=$$FNDVIS(DFN,DAT,CAT,LOC,CREATE,.PRV,+$G(PDIV),+$G(PRF),TYP,OLOC,OSID)
  1. I IEN>0 D
  1. .S VSTR=$G(^AUPNVSIT(+IEN,0))
  1. .I '$L(VSTR) S IEN="-1^Visit does not exist"
  1. .E I $P(VSTR,U,5)'=DFN S IEN="-1^Visit does not belong to current patient"
  1. .E S VSTR=$S($P(VSTR,U,22):$P(VSTR,U,22),1:LOC)_";"_+VSTR_";"_$P(VSTR,U,7)_";"_+IEN ; IHS/MSC/PLS - 10/31/06 - Correct issue with Hosp Loc piece
  1. Q IEN
  1. ; Build PCC array
  1. ADDPCC(X) ;
  1. S:'$D(PCC) PCC(1)="HDR^^^"_VSTR,PCC(2)="VST^PT^"_DFN
  1. S PCC($O(PCC(""),-1)+1)=X
  1. Q
  1. ; Return Option IEN used to Create
  1. GETOPT() ;EP
  1. N RET
  1. S RET=$$FIND1^DIC(19,,"O","PSO LM BACKDOOR ORDERS")
  1. Q $S(RET:RET,1:"")
  1. ; Return Protocol IEN used to Create
  1. GETPROT() ;EP
  1. N RET
  1. S RET=$$FIND1^DIC(101,,"O","IHS PS HOOK")
  1. Q $S(RET:RET,1:"")
  1. ;
  1. DELVSIT(VST) ;EP
  1. N APCDVLDT,U,APCDVFLE,AUPNVSIT,APCDVNM,APCDVDG,APCDVIGR,APCDVDFN
  1. N APCDVI,DIK,DA
  1. S APCDVDLT=VST
  1. D EN^APCDVDLT
  1. Q
  1. AICD() ;EP
  1. Q $S($$VERSION^XPDUTL("AICD")<"4.0":0,1:1)