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

APSPPCC.m

Go to the documentation of this file.
  1. APSPPCC ;IHS/CIA/DKM/PLS - PCC Hook for Pharmacy Package ;22-Sep-2014 14:55;DU
  1. ;;7.0;IHS PHARMACY MODIFICATIONS;**1003,1004,1006,1007,1008,1009,1010,1013,1015,1017,1018**;Sep 23, 2004;Build 21
  1. ; EP - Called by event protocol.
  1. ; DATA = Event message. May either be a global reference or
  1. ; a local array passed by reference.
  1. ; REPROC = If this is a reprocessed message, this should contain
  1. ; the index of the message in the XTMP global.
  1. ; Modified - IHS/MSC/PLS - 02/04/08 - Line POV - changed v68.1 to primary
  1. ; 02/05/08 - API PRVNARR modified
  1. ; 01/27/09 - LOCADJ+4
  1. ; 01/28/09 - Checks for SUSPENSE status
  1. ; 08/25/10 - DOIT+40
  1. ; 02/10/11 - Added support of POV for Suspense
  1. ; 01/28/14 - Line REFPRV+3
  1. ; 06/04/14 - Added support of adding POV to visits
  1. EN(DATA,REPROC) ;EP
  1. N MSG
  1. I $D(DATA)=1 M MSG=@DATA
  1. E M MSG=DATA
  1. S MSG=$S($G(REPROC):REPROC,1:-1)
  1. ;I $$QUEUE^CIAUTSK("TASK^APSPPCC","PCC VMED FILER",,"MSG^MSG(")
  1. D TASK
  1. Q
  1. ; Taskman entry point
  1. TASK ;EP
  1. N SEG,LP,DL1,DL2,IEN
  1. S ZTREQ="@"
  1. S LP=0
  1. S SEG=$$SEG("MSH",.LP)
  1. Q:'LP
  1. S DL1=$E(SEG,4),DL2=$E(SEG,5)
  1. Q:$P(SEG,DL1,3)'="PHARMACY"
  1. S SEG=$$SEG("PID",.LP)
  1. Q:'LP
  1. Q:'$P(SEG,DL1,4)
  1. S SEG=$$SEG("ORC",.LP)
  1. Q:'LP
  1. S IEN=$P($P(SEG,DL1,4),U)
  1. I IEN?1.N1"N" D EN^APSPPCC2(IEN,.MSG) ;IHS/MSC/PLS 10/29/07 - Outside Meds
  1. Q:IEN'=+IEN
  1. D LOG("MSG",.MSG)
  1. K:$$PROCESS(IEN,,MSG,1)<0 ZTREQ
  1. Q
  1. ; EP - Process a script
  1. ; IEN = IEN of prescription
  1. ; REF = Refill # (0=original fill,>0=refill,missing=last)
  1. ; MSG = Message log IEN
  1. ; BUL = If nonzero, a bulletin is fired on error
  1. PROCESS(IEN,REF,MSG,BUL) ;EP
  1. N PRV,SIG,RX0,RX2,RX3,PCC,LOC,DAT,DIV,INS,RTS,PHM,QTY,DAY,CAN,DFN,OPV
  1. N VMED,VM0,VSTR,VSIT,ERR,ACT,COM,RXID,PLOC,PRI,POV,DRG,STA,RF0,LFN,X
  1. N DEFOLOC,VSVCCAT
  1. S ERR="",MSG=$G(MSG),BUL=$G(BUL)
  1. L +^APSPPCC(IEN):5
  1. I D
  1. .D DOIT
  1. .L -^APSPPCC(IEN)
  1. E S ERR="-1^Timeout while trying to lock record."
  1. D:ERR LOG("ERR",.MSG)
  1. D:ERR<0 BUL(IEN,.DFN,.MSG,ERR):BUL
  1. ;IHS exemption approved on 3/29/2007
  1. Q:$Q ERR
  1. Q
  1. DOIT ;EP
  1. D LOG($NA(^PSRX(IEN)),.MSG)
  1. S RX0=$G(^PSRX(IEN,0)),RX2=$G(^(2)),RX3=$G(^(3)),STA=+$G(^("STA")),LFN=+$O(^(1,$C(1)),-1)
  1. S RXID=$P(RX0,U)
  1. S DFN=$P(RX0,U,2)
  1. ;IHS/CIA/PLS - 05/23/06 - Commented out next line and added the line after.
  1. ;K:STA'<10 ^PS(55,DFN,"P","CP",IEN)
  1. ; Chronic Med flag is cleared if status is: DISCONTINUED, DELETED, DISCONTINUED BY PROVIDER or
  1. ; DISCONTINUED (EDIT)
  1. D:STA>11&(STA<16) KILLOCM^PSORN52(IEN)
  1. I STA=13,LFN S ERR="1^Prescription logically deleted." Q ;Ignore if deleted with refills remaining
  1. S CAN=$P(RX3,U,5)
  1. I STA=14,'CAN S CAN=$P($G(^OR(100,+$P($G(^PSRX(IEN,"OR1")),U,2),6)),U,3)
  1. S DRG=$P(RX0,U,6) ;Drug
  1. S SIG=$P(RX0,U,10) ;SIG
  1. S LOC=$P(RX0,U,5) ;Clinic (File 44 IEN)
  1. S:'$L(SIG) SIG=$P($G(^PSRX(IEN,"SIG")),U)
  1. I '$L(SIG) D
  1. .F X=0:0 S X=$O(^PSRX(IEN,"SIG1",X)) Q:'X S SIG=SIG_$S($L(SIG):" ",1:"")_^(X,0) Q:$L(SIG)>144
  1. S:'$D(REF) REF=LFN
  1. S RF0=$S(REF:$G(^PSRX(IEN,1,REF,0)),1:RX0)
  1. S VMED=+$S(REF:$G(^PSRX(IEN,1,REF,999999911)),1:$G(^PSRX(IEN,999999911)))
  1. S DAT=+$S(REF:$P(RF0,U),1:$P(RX2,U,2))
  1. ;I STA=3,'DAT S DAT=DT ; Substitute Today's Date if Fill Date null.
  1. ;IHS/MSC/PLS - 01/28/09 - Added check for suspense status
  1. I (STA=3!(STA=5)),'DAT S DAT=DT ; Substitute Today's Date if Fill Date null.
  1. I 'DAT S ERR="1^Not released." Q
  1. I DAT>DT,'VMED S ERR="1^Future Fill Date - Suspense" Q
  1. I REF D ; Use Refill Date for refills
  1. .I DAT>DT S DAT=+$P(RF0,U,19) ; Use Dispense date if Refill Date>Today
  1. I 'DAT S ERR="1^No date associated with fill."
  1. S:DAT#1=0 DAT=DAT+.12
  1. S DIV=+$P($S(REF:RF0,1:RX2),U,9),INS=$$INS(DIV)
  1. I 'INS S ERR="1^Hook disabled for division." Q
  1. S DEFOLOC=$P($G(^APSPCTRL(DIV,1)),U,2)
  1. S:'DEFOLOC DEFOLOC=INS
  1. S RTS=$S(REF:$P(RF0,U,16),1:$P(RX2,U,15))\1
  1. S COM=$S(RTS:"RETURNED TO STOCK",1:"@")
  1. S VMED=+$S(REF:$G(^PSRX(IEN,1,REF,999999911)),1:$G(^PSRX(IEN,999999911)))
  1. ;S ACT=$S(STA=13:"-",STA=16:"-",STA=3:"-",VMED:"",1:"+")
  1. ;IHS/MSC/PLS - 01/28/09 - Added check for suspense status
  1. S ACT=$S(STA=13:"-",STA=16:"-",STA=3:"-",STA=5:"-",VMED:"",1:"+")
  1. I 'VMED,ACT="-" Q
  1. ;IHS/MSC/PLS - 02/10/2011 - removed restriction for refill on POV process
  1. ; Process Paperless Refills
  1. ;I +$$GET1^DIQ(9009033,+$G(DIV),315,"I") D
  1. ;.;IHS/MSC/PLS - 08/25/10 - Logic changed to obtain cached POV from Parameter
  1. ;.;Q:'$L($G(^XTMP("APSPPCC.VPOV",+IEN,+REF)))
  1. ;.Q:'$D(^PSRX(IEN,1,REF)) ; Refill check
  1. ;.;S POV=$G(^XTMP("APSPPCC.VPOV",IEN,REF))
  1. ;.S POV=$TR($$GET^XPAR("SYS","APSP POV CACHE",+IEN_","_+REF),"~",U)
  1. ;.Q:'$L(POV)
  1. ;.S DAT=$P(DAT,".")_".13"
  1. ;.;K ^XTMP("APSPPCC.VPOV",IEN,REF)
  1. ; Check for cached POV
  1. ;IHS/MSC/PLS - 07/16/13 - POV no longer captured
  1. ;IHS/MSC/PLS - 06/04/14 - POV is being used again as a hardcoded set in APSPPCC1
  1. S POV=$TR($$GET^XPAR("SYS","APSP POV CACHE",+IEN_","_+REF),"~",U)
  1. ;S POV=""
  1. ; Refills or suspended prescriptions will be set to 1300 unless the
  1. ; suspended prescription is an original dispensed on the day of release.
  1. ;I $L(POV),$$GET1^DIQ(9009033,PSOSITE,405,"I") D ;IHS/MSC/PLS - 10/28/11 - Capture POV for all prescriptions
  1. I $L(POV),$$GET1^DIQ(9009033,$G(PSOSITE),405,"I") D ;IHS/MSC/PLS - 01/07/13 - Wrap with $G
  1. .S DAT=DAT ;S DAT=$P(DAT,".")_".13"
  1. ;E I $L(POV),$P(RX0,U,13)'=$P(DAT,".") D ; if issue date<>fill date
  1. ;.S DAT=$P(DAT,".")_".13"
  1. E D
  1. .D:$L(POV)&(ACT'="-") DEL^XPAR("SYS","APSP POV CACHE",+IEN_","_+REF)
  1. .K POV
  1. ; Provider is set to Clerk if Paperless Refill otherwise to Ordering Provider
  1. ;S (OPV,PRV)=$S($D(POV):$$NPF($P(RF0,U,7)),1:$$NPF(+$P(RX0,U,4)))
  1. ;IHS/CIA/PLS - 10/07/05 - Changed following line to look at clerk if paperless refill, refill provider if regular refill or prescription provider
  1. ;S PRV=$S($D(POV):$$NPF($P(RF0,U,7)),1:$$NPF(+$P(RX0,U,4)))
  1. ;IHS/MSC/PLS - 10/23/07 - Changed following line to add support for requesting refill provider
  1. ;S PRV=$S($D(POV):$$NPF($P(RF0,U,7)),REF:$$NPF($P(RF0,U,17)),1:$$NPF(+$P(RX0,U,4)))
  1. S PRV=$S($D(POV):$S(REF:$$NPF($P(RF0,U,7)),1:$$NPF(+$P($G(^PSRX(IEN,"OR1")),U,5))),REF:$$REFPRV(IEN,REF),1:$$NPF(+$P(RX0,U,4))) ;p1010
  1. S OPV=$S(REF:$$NPF($P(RF0,U,17)),1:$$NPF(+$P(RX0,U,4))) ;Provider
  1. S PHM=$$NPF(+$P(RX2,U,3)) ;Pharmacist
  1. S:REF PHM=$$NPF($P(RF0,U,7)) ;Clerk Code
  1. S:'PHM PHM=$$NPF(+$P($G(^PSRX(IEN,"OR1")),U,5)) ;Finishing Person
  1. S:'PHM PHM=$$NPF(+$P(RX0,U,16)) ;Entered By
  1. S QTY=$P(RF0,U,$S(REF:4,1:7))
  1. S DAY=$P(RF0,U,$S(REF:10,1:8))
  1. ;S VMED=+$S(REF:$G(^PSRX(IEN,1,REF,999999911)),1:$G(^PSRX(IEN,999999911)))
  1. ;;S ACT=$S(STA=13:"-",STA=16:"-",STA=3:"-",VMED:"",1:"+")
  1. ;;IHS/MSC/PLS - 01/28/09 - Added check for suspense status
  1. ;S ACT=$S(STA=13:"-",STA=16:"-",STA=3:"-",STA=5:"-",VMED:"",1:"+")
  1. ;I 'VMED,ACT="-" Q
  1. S VM0=$S(VMED:$G(^AUPNVMED(VMED,0)),1:"")
  1. S VSIT=$P(VM0,U,3)
  1. S VSVCCAT="A"
  1. ;IHS/CIA/PLS - 10/07/05 - Changed to pass clinic (if defined) or zero for ancillary
  1. ;S LOC=$S($D(POV):$O(^DIC(40.7,"C",39,0)),1:0) ; Set location to pharmacy stop code if Paperless refill
  1. ;Old format = VSTR format = zero or Clinic Stop Code; Date/Time of Visit;Visit Category
  1. S LOC=$$LOCADJ(LOC,IEN,RXID) ; IHS/CIA/PLS - 12/30/05 - Call to adjust the hospital location for REFILL and RENEWED orders
  1. S:$D(POV) LOC=0
  1. ; New VSTR format = Hospital Location IEN; Date/Time of Visit;Visit Category
  1. I $P($G(^PSRX(IEN,999999921)),U,4) D ; Electronic Pharmacy
  1. .N EPHARM
  1. .S EPHARM=$$GET1^DIQ(9009033.9,$$GET1^DIQ(52,IEN,9999999.24,"I"),.01)
  1. .S VSIT=$S('VSIT:";"_DEFOLOC_";"_EPHARM,1:VSIT)
  1. .S VSVCCAT="E"
  1. S VSTR=LOC_";"_DAT_";"_VSVCCAT_";"_VSIT ; Location is either a pointer to clinic stop code or a zero
  1. ;S (PRV,PHM,PRI)=0
  1. I $D(POV) D
  1. .S PRI=1,PHM=0
  1. .S X=$$VSTR2VIS^APSPPCCV(DFN,.VSTR,1,PRV,DIV,1) ;Find or create a visit using clerk code
  1. E D
  1. .S X=$$VSTR2VIS^APSPPCCV(DFN,.VSTR,1,PRV,DIV,0) ;Find or create a visit using ordering provider
  1. .;I X'>0!(+VSTR=PLOC) S LOC=PLOC,$P(VSTR,";")=PLOC,PRV=0,PHM=0,PRI=1
  1. .I X'>0 S PRV=0,PHM=0,PRI=1
  1. .E S (PRV,PHM,PRI)=0
  1. D ADD("HDR^^^"_VSTR)
  1. D ADD("VST^PT^"_DFN)
  1. D ADD("VST^DT^"_DAT)
  1. D:$D(POV)&PRV ADD("PRV^"_PRV_"^^^^"_PRI)
  1. D:PHM ADD("PRV^"_PHM_"^^^^0")
  1. POV I $D(POV) D
  1. .;D:POV'="" ADD("POV^"_$P(POV,U)_"^^"_$P(POV,U,2)_"^0^2") ;IHS/MSC/PLS - 02/04/2008 - Changed to secondary
  1. .;D:POV'="" ADD("POV^"_$P(POV,U)_"^^"_$P(POV,U,2)_U_$S(REF:0,1:1)_U_$S(REF:2,1:1)) ;IHS/MSC/PLS - 04/21/2011
  1. .;D:REF ADD("POV^"_"V68.1"_"^^"_$$PRVNARR("MEDICATION REFILL")_"^1^2") ;IHS/MSC/PLS - 02/04/2008 - Changed to primary
  1. .D:POV'="" ADD("POV^"_$P(POV,U)_"^^^1^"_$S(REF:2,1:1)) ;IHS/MSC/PLS - 09/22/2014
  1. .;IHS/MSC/PLS - 08/25/2010 - remove the cached data
  1. .Q:ACT="-" ;Leave in cache
  1. .D DEL^XPAR("SYS","APSP POV CACHE",+IEN_","_+REF)
  1. I VM0,DRG'=+VM0 D ADD("RX-^"_+VM0_U_VMED_U_IEN_U_REF) S ACT="+"
  1. D ADD("RX"_ACT_U_DRG_U_VMED_U_IEN_U_REF_U_$S(OPV:OPV,1:"")_U_QTY_U_DAY_U_$S(RTS:RTS,1:CAN)_U_RXID)
  1. D:$L(COM) ADD("COM^1^"_COM)
  1. D ADD("SIG^1^"_$S($L(SIG)<146:SIG,1:$E(SIG,1,144)_"~"))
  1. D LOG("PCC",.MSG)
  1. D SAVE^APSPPCCV(.ERR,.PCC)
  1. Q
  1. ; Add to PCC array
  1. ADD(X) S PCC=$G(PCC)+1,PCC(PCC)=X
  1. Q
  1. ; Adjust file 200 pointer if file 16 conversion not done
  1. NPF(IEN) Q +$S('$D(^VA(200,+IEN,0)):0,$P($G(^AUTTSITE(1,0)),U,22):IEN,1:$P(^VA(200,+IEN,0),U,16))
  1. ; Return institution if PCC capture enabled for division
  1. INS(DIV) Q $S($P($G(^APSPCTRL(+DIV,0)),U,15)="Y":+$G(^PS(59,+DIV,"INI")),1:0)
  1. ; Return specified segment, starting at line LP
  1. SEG(TYP,LP) ;
  1. F S LP=$O(MSG(LP)) Q:'LP Q:$E(MSG(LP),1,$L(TYP))=TYP
  1. Q $S(LP:MSG(LP),1:"")
  1. ; Send a bulletin on error
  1. BUL(IEN,DFN,MSG,ERR) ;
  1. N XMB,XMTEXT,XMY,XMDUZ,XMDT,XMYBLOB,XMZ
  1. S XMB="APSP LINK FAIL VMED"
  1. S XMB(1)=$G(IEN,"UNKNOWN")
  1. S XMB(2)=$P($G(^DPT(DFN,0)),U)
  1. S XMB(3)=$G(MSG,"UNKNOWN")
  1. S XMB(4)=$$FMTE^XLFDT(DT)
  1. S XMB(5)=$P(ERR,U,2)
  1. S XMDUZ=.5
  1. D ^XMB
  1. Q
  1. ; Log data
  1. LOG(ARY,CNT) ;
  1. Q:'$G(CNT)
  1. Q:'$$GET^XPAR("ALL","APSPPCC LOG MESSAGES")
  1. N SUB,NMSP
  1. S SUB="APSPPCC",NMSP=$TR($P(ARY,"("),U)
  1. L +^XTMP(SUB):2
  1. S ^XTMP(SUB,0)=$$FMADD^XLFDT(DT,7)_U_$$DT^XLFDT
  1. S:CNT<0 CNT=1+$O(^XTMP(SUB,""),-1)
  1. K ^XTMP(SUB,CNT,NMSP)
  1. M ^XTMP(SUB,CNT,NMSP)=@ARY
  1. L -^XTMP(SUB)
  1. Q
  1. ; Return Provider Narrative IEN
  1. PRVNARR(TXT) ; EP
  1. N IEN,FDA,IENS,ERR
  1. Q:'$L(TXT) ""
  1. S IEN=$O(^AUTNPOV("B",$E(TXT,1,30),0)) ; IHS/MSC/PLS - 02/05/08 - Changed lookup to 30 characters
  1. I 'IEN D
  1. .S FDA(9999999.27,"+1,",.01)=$E(TXT,1,80) ; IHS/MSC/PLS - 02/05/08 - Changed set to 80 characters
  1. .D UPDATE^DIE("","FDA","IENS","ERR")
  1. .I $G(ERR) S IEN=""
  1. .E S IEN=$G(IENS(1))
  1. Q IEN
  1. ; Return Inpatient Location IEN or Zero
  1. ; VAINDT contains inpatient admission date or defaults to today
  1. INPAT(DFN,VAINDT) ;
  1. N RET,VAIN
  1. D INP^VADPT
  1. S RET=+$G(VAIN(4))
  1. Q RET
  1. ; Return adjusted Hospital Location IEN
  1. ; The visit location will be returned as zero using the following rules:
  1. ; 1) Refill orders - Orders processed using options other than PSO LMOE FINISH
  1. ; 2) Renew orders - Orders processed using options other than PSO LMOE FINISH
  1. ;
  1. LOCADJ(LOC,RXIEN,RXN) ;EP
  1. I $G(PSOFROM)="REFILL",$G(XQY0)'["PSO LMOE FINISH" S LOC=0
  1. I $G(PSOFROM)="NEW",RXN?.N1.U,$G(XQY0)'["PSO LMOE FINISH" S LOC=0
  1. ; IHS/MSC/PLS - 01/27/2009 - If new prescription and Fill Date <> Issue Date
  1. I $G(PSOFROM)="NEW",($P($G(^PSRX(RXIEN,2)),U,2)'=$P($G(^PSRX(RXIEN,0)),U,13)) S LOC=0
  1. Q LOC
  1. ; IHS/MSC/PLS - 10/24/07
  1. REFPRV(RX,REF) ;EP
  1. N RES,PRV,RPRV
  1. S PRV=$P(^PSRX(RX,1,REF,0),U,17)
  1. S RPRV=$P($G(^PSRX(RX,1,REF,9999999)),U) ;IHS/MSC/PLS - 01/28/14 added $G
  1. S RES=$S(RPRV:RPRV,1:PRV)
  1. Q RES