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

VAFCTFIN.m

Go to the documentation of this file.
  1. VAFCTFIN ;BIR/DR-TREATING FACILTIY MFU PROCESSING ROUTINE ;4/29/21 12:57
  1. ;;5.3;Registration;**428,474,520,639,707,800,821,837,863,1013,1042,1050**;Aug 13, 1993;Build 2
  1. ;Reference to EXC, START, and STOP^RGHLLOG supported by IA #2796
  1. ;Reference to GETDFN^MPIF001 supported by IA #2701
  1. ;Reference to MPILINK^MPIFAPI supported by IA #2702
  1. ;
  1. IN ;This entry point is used to process the Treating Facility Master File Update Message.
  1. ;It is called by the VAFC MFN-M05 CLIENT processing routine when a MFN
  1. ;message is received.
  1. ;There are no inputs or outputs
  1. ;
  1. ;Initial check whether incoming MFN message is old format or new. If it is old format, go to old routine (VAFCOFIN) to process. **821
  1. I HL("MTN")="MFK" D RSP Q
  1. N VAFC,SG,MSG
  1. F VAFCI=1:1 X HLNEXT Q:HLQUIT'>0 I $E(HLNODE,1,3)="MFE" S MSG=HLNODE
  1. I $P($G(MSG),"^",3)'["-" D IN^VAFCOFIN Q
  1. K VAFCI,HLNODE,SG,HLQUIT,HLDONE,MSG
  1. S HLQUIT=0
  1. ;
  1. N VAFC,STATN,VAFCI,MSG,SG,VAFCARR,PDFN,INST,MFUPT,PDLT,TFIEN
  1. N ICN,MFI,MFE,MFA,HLCOMP,CNT,X,VAFCERR,VAFCX,VAFCJ
  1. ;quit if Master Patient Index (MPI) is not installed
  1. S X="MPIF001" X ^%ZOSF("TEST") Q:'$T
  1. S X="MPIFQ0" X ^%ZOSF("TEST") Q:'$T
  1. S X="RGRSBUL1" X ^%ZOSF("TEST") Q:'$T
  1. S X="RGRSBULL" X ^%ZOSF("TEST") Q:'$T
  1. INIT ;Process in the Treating Facility MFN msg
  1. ;**837 - MVI_791 (ckn)
  1. ;F VAFCI=1:1 X HLNEXT Q:HLQUIT'>0 S (MSG,VAFC(VAFCI))=HLNODE,SG=$E(HLNODE,1,3) D:SG?2A1(1A,1N) PICK
  1. F VAFCI=1:1 X HLNEXT Q:HLQUIT'>0 D
  1. .K MSG S MSG=HLNODE
  1. .S VAFCJ=0 F S VAFCJ=$O(HLNODE(VAFCJ)) Q:'VAFCJ S MSG(VAFCJ)=HLNODE(VAFCJ)
  1. .S SG=$E(HLNODE,1,3)
  1. .I SG="MFE" D MFE(.MSG) Q
  1. .D PICK
  1. ;
  1. ;**1042, VAMPI-8215 (dri)
  1. ;**1050, VAMPI-9501 (dri)
  1. ;If the icn in the tf update is NOT known to the Patient (#2) file then
  1. ;we know we're dealing with a tf update for someone who is ONLY known to
  1. ;New Person (#200) file so we file their inbound tf list in the New Person
  1. ;Treating Facility List (#391.92) file instead of the Treating Facility
  1. ;List (#391.91) file.
  1. ;If this New Person later also becomes a Patient then the tf list is
  1. ;deleted from #391.92 and the incoming tf list is filed into #391.91.
  1. I $$GETDFN^MPIF001(ICN)<0 D EN^VAFCTFNP(.MFI,.MFA) ;file tf list into #391.92
  1. I $$GETDFN^MPIF001(ICN)>0,$O(^DGCN(391.92,"AISS",ICN,"NI","USVHA",$$IEN^XUAF4("200M"),0)) D CLEANUP^VAFCTFNP(ICN) ;delete tf list from #391.92
  1. I '$D(MFA) D RECONCIL ;file tf list into #391.91
  1. ;
  1. ;create response message
  1. S CNT=1
  1. S HLA("HLA",1)="MSA"_HL("FS")_"AA"_HL("FS")_HL("MID")_HL("FS") S CNT=CNT+1
  1. S HLA("HLA",CNT)=MFI S CNT=CNT+1
  1. ;S VAFCX=0 F S VAFCX=$O(MFE(VAFCX)) Q:'VAFCX S HLA("HLA",CNT)=MFE(VAFCX),CNT=CNT+1,HLA("HLA",CNT)=MFA(VAFCX),CNT=CNT+1
  1. ;S VAFCX=0 F S VAFCX=$O(MFE(VAFCX)) Q:'VAFCX D
  1. ;. S VAFCN=0 F S VAFCN=$O(MFE(VAFCX,VAFCN)) Q:'VAFCN D
  1. ;.. S HLA("HLA",CNT)=MFE(VAFCX,VAFCN),CNT=CNT+1,HLA("HLA",CNT)=MFA(VAFCX,VAFCN),CNT=CNT+1
  1. ;**837 - MVI_791 (ckn)
  1. S VAFCX=0 F S VAFCX=$O(MFE(VAFCX)) Q:'VAFCX D
  1. . S VAFCN=0 F S VAFCN=$O(MFE(VAFCX,VAFCN)) Q:'VAFCN D
  1. .. S ZCNT=0 F S ZCNT=$O(MFE(VAFCX,VAFCN,ZCNT)) Q:'ZCNT D
  1. ... I ZCNT=1 S HLA("HLA",CNT)=MFE(VAFCX,VAFCN,ZCNT)
  1. ... I ZCNT>1 S HLA("HLA",CNT,ZCNT-1)=MFE(VAFCX,VAFCN,ZCNT)
  1. ...; S HLA("HLA",CNT)=MFE(VAFCX,VAFCN,ZCNT),CNT=CNT+1
  1. .. S CNT=CNT+1
  1. .. S HLA("HLA",CNT)=MFA(VAFCX,VAFCN),CNT=CNT+1
  1. ;generate an application level ack (MFK) identifying the status of the adds/edits/deletes of TF's passed in
  1. D ROUTE
  1. D GENACK^HLMA1(HL("EID"),HLMTIENS,HL("EIDS"),"LM",1,.VAFCERR,"",.HLP)
  1. Q
  1. PICK ;check routine for segment entry point
  1. I $T(@SG)]"" D @SG
  1. I $T(@SG)="" Q
  1. Q
  1. MSH ;;MSH
  1. ;process the MSH segment
  1. S (HLFS,HL("FS"))=$E(MSG,4),(HLECH,HL("ECH"))=$E(MSG,5,8)
  1. S HLCOMP=$E(HL("ECH"),1)
  1. S VAFCARR("SENDING SITE")=$P(MSG,HL("FS"),4)
  1. Q
  1. EVN ;;EVN
  1. ;process the EVN segment
  1. S STATN=+$$SITE^VASITE()_"^"_$$FMDATE^HLFNC($P(MSG,HL("FS"),3))
  1. Q
  1. PID ;;PID
  1. ;process the PID segment
  1. S PDFN=+$P(MSG,HL("FS"),4)
  1. Q
  1. MFI ;;MFI
  1. ;process the MFI segment
  1. S MFI=MSG
  1. S MFUPT=$P(MSG,HL("FS"),4)
  1. S VAFCARR("CMOR")=$P($P(MSG,HL("FS"),8),$E(HL("ECH"),1))
  1. Q
  1. MFE(MSG) ;;MFE
  1. ;process the MFE segment
  1. N HLCOMP,NXTSGMT,TYPE,REP,MFE4,DFNATST,IDENSTAT
  1. ;**837 - MVI_791 (ckn)
  1. N LNGTH,SUBCOMP,TMFE,SEQ,SEQ1,X,NXT,Y,LNGTH2,LNGTH1
  1. N LASTID,IDCNT,X,IDS,ACNT,AA,IDTYP,AATYP,MCNT,MFE5
  1. S HLCOMP=$E(HL("ECH"),1),REP=$E(HL("ECH"),2),SUBCOMP=$E(HL("ECH"),4)
  1. S LNGTH=$L(MSG,HL("FS")) F SEQ=1:1:LNGTH S TMFE(SEQ)=$P(MSG,HL("FS"),SEQ)
  1. S SEQ1=1,X=0 F S X=$O(MSG(X)) Q:'X S LNGTH=$L(MSG(X),HL("FS")) D
  1. . F Y=1:1:LNGTH S:Y'=1 SEQ=SEQ+1 D
  1. .. S NXT=$P(MSG(X),HL("FS"),Y) D
  1. ... I $L($G(TMFE(SEQ)))=245 D Q
  1. .... I $L(NXT_$G(TMFE(SEQ,SEQ1)))>245 S LNGTH1=$L(TMFE(SEQ,SEQ1)) S LNGTH2=245-LNGTH1,TMFE(SEQ,SEQ1)=$G(TMFE(SEQ,SEQ1))_$E(NXT,1,LNGTH2),LNGTH2=LNGTH2+1,NXT=$E(NXT,LNGTH2,$L(NXT)),SEQ1=SEQ1+1
  1. .... I $L(NXT_$G(TMFE(SEQ,SEQ1)))'>245 S TMFE(SEQ,SEQ1)=$G(TMFE(SEQ,SEQ1))_NXT
  1. ... I $L(NXT_$G(TMFE(SEQ)))>245 S LNGTH1=$L($G(TMFE(SEQ))) S LNGTH2=245-LNGTH1,TMFE(SEQ)=$G(TMFE(SEQ))_$E(NXT,1,LNGTH2),LNGTH2=LNGTH2+1,NXT=$E(NXT,LNGTH2,$L(NXT)) S TMFE(SEQ,SEQ1)=NXT
  1. ... I $L(NXT_$G(TMFE(SEQ)))'>245 S TMFE(SEQ)=$G(TMFE(SEQ))_NXT Q
  1. S MFE5=$G(TMFE(5))
  1. S LASTID=$L(MFE5,REP),IDCNT=1,ACNT=0
  1. F X=1:1:LASTID S ACNT=ACNT+1,IDS(ACNT)=$P(MFE5,REP,X) D
  1. .;if this is the last entry check for an extension of the message and reset the key variables
  1. .I X=LASTID I $D(TMFE(5,IDCNT)) D
  1. ..S IDS(ACNT)=IDS(ACNT)_$P(TMFE(5,IDCNT),REP)
  1. ..S MFE5=$P(TMFE(5,IDCNT),REP,2,99) I MFE5="" Q
  1. ..S IDCNT=IDCNT+1,X=0,LASTID=$L(MFE5,REP)
  1. S PDLT=$$FMDATE^HLFNC($G(TMFE(4)))
  1. S INST=$P($G(TMFE(3)),"-")
  1. S ZCNT=$P($G(TMFE(3)),"-",2)
  1. S TYPE=$G(TMFE(2))
  1. S IDENSTAT=$S(TYPE="MDC":"H",1:"A")
  1. S ICN=$P($G(IDS(1)),HLCOMP)
  1. S AATYP=$P($P($G(IDS(2)),HLCOMP,4),SUBCOMP,3)
  1. S AA=$S(AATYP="ISO":$P($P($G(IDS(2)),HLCOMP,4),SUBCOMP,2),1:$P($P($G(IDS(2)),HLCOMP,4),SUBCOMP))
  1. S IDTYP=$P($G(IDS(2)),HLCOMP,5)
  1. ;We do not have facility to map ID type from OID in VistA so default "NI" value to Id type if site is 200N*
  1. I $E(INST,1,4)="200N",AATYP="ISO" S IDTYP="NI"
  1. S DFNATST=$P($G(IDS(2)),HLCOMP)
  1. S MFE(INST,ZCNT,1)=MSG
  1. I $D(MSG(1)) D
  1. .S MCNT=0 F S MCNT=$O(MSG(MCNT)) Q:+MCNT=0 S MFE(INST,ZCNT,MCNT+1)=MSG(MCNT)
  1. S MFI(ICN,INST,ZCNT)=PDLT_"^^"_TYPE_"^^^^"_DFNATST_"^"_IDENSTAT_"^"_AA_"^"_IDTYP
  1. Q
  1. ZET ;;ZET
  1. ;process Patient's Date Last Treated Event Type, ZET segment
  1. N PDLTET,IPP
  1. S PDLTET=$P(MSG,HL("FS"),2)
  1. S $P(MFI(ICN,INST,ZCNT),"^",2)=PDLTET
  1. ;DG*5.3*800 - Process In-Person Proofed
  1. S IPP=$P(MSG,HL("FS"),3) ;In-Person Proofed
  1. S $P(MFI(ICN,INST,ZCNT),"^",6)=IPP
  1. Q
  1. RSP ;response process logic entry point
  1. Q
  1. ROUTE ;routing logic entry point
  1. N MPI
  1. S MPI=$$MPILINK^MPIFAPI() D
  1. .;**1013 - Story - 1260465 (ckn) - Include 200M in HLL links for HAC
  1. .I $P($G(MPI),U)'=-1 S HLL("LINKS",1)="VAFC MFN-M05 CLIENT"_"^"_MPI_$S($P($$SITE^VASITE(),"^",3)=741:"^200M",1:"")
  1. .I $P($G(MPI),U)=-1 D
  1. .. N RGLOG D START^RGHLLOG(HLMTIEN,"","")
  1. .. D EXC^RGHLLOG(224,"No MPI link identified in CIRN SITE PARAMETER file (#991.8)",$G(PDFN))
  1. .. D STOP^RGHLLOG(0)
  1. Q
  1. TEST ;
  1. W $$REPROC^HLUTIL(39266,"D IN^VAFCTFIN")
  1. Q
  1. RECONCIL ;
  1. N DFN,MFIC,VAFCX,VAFCY,TFL,CNFLT,LOCCMOR,VAFCTYPE,VAFCN,IDSTAT,SID
  1. S CNFLT=0
  1. S DFN=$$GETDFN^MPIF001(ICN)
  1. I DFN'>0 S CNFLT=1_"^"_$P($G(DFN),"^",2)
  1. ;CHANGED TFL^VAFCTFU1 to TFL^VAFCTFU3 to get ALL tf entries
  1. I MFUPT="REP" I +CNFLT=0 D TFL^VAFCTFU3(.TFL,DFN) S VAFCX=0 F S VAFCX=$O(TFL(VAFCX)) Q:'VAFCX D
  1. .; S MFIC($P(TFL(VAFCX),"^"))=TFL(VAFCX) I '$D(MFI(ICN,$P(TFL(VAFCX),"^"))) D DEL(ICN,$P(TFL(VAFCX),"^"))
  1. . N EXTFIEN,STIEN,STEXT
  1. . S MFIC($P(TFL(VAFCX),"^"))=TFL(VAFCX),STIEN=$$LKUP^XUAF4($P(TFL(VAFCX),"^")),STEXT=$P(TFL(VAFCX),"^")
  1. . S EXTFIEN=0 F S EXTFIEN=$O(^DGCN(391.91,"APAT",DFN,STIEN,EXTFIEN)) Q:+EXTFIEN=0 D
  1. . . N NODE0,NODE2,EXIDTYP,EXAA,EXSID,EXIDST,ZCNT,MATCH
  1. . .; Existing AA, ID type, Source ID, Identifier Status
  1. . . S NODE0=$G(^DGCN(391.91,EXTFIEN,0)),NODE2=$G(^DGCN(391.91,EXTFIEN,2))
  1. . . S EXIDTYP=$P(NODE0,"^",9),EXAA=$P(NODE2,"^"),EXSID=$P(NODE2,"^",2),EXIDST=$P(NODE2,"^",3)
  1. . . ;Loop through MFI (incoming data) and compare the values
  1. . . S ZCNT=0,MATCH=0 F S ZCNT=$O(MFI(ICN,STEXT,ZCNT)) Q:+ZCNT=0!(MATCH) D
  1. . . . N TMPNODE,INIDST,INAA,INIDTYP,INSID
  1. . . . S TMPNODE=$G(MFI(ICN,STEXT,ZCNT))
  1. . . . S INSID=$P(TMPNODE,"^",7),INIDST=$P(TMPNODE,"^",8),INAA=$P(TMPNODE,"^",9),INIDTYP=$P(TMPNODE,"^",10)
  1. . . . I INSID=EXSID,INIDST=EXIDST,INAA=EXAA,INIDTYP=EXIDTYP S MATCH=1 Q
  1. . . . I 'MATCH,$E(STEXT,1,4)="200N" D ;For 200N* only check Source ID and Idtype if no match for all matching criteria
  1. . . . . I INSID=EXSID,INIDTYP=EXIDTYP S MATCH=1
  1. . . I 'MATCH S DELTFARR(EXTFIEN)=""
  1. . I $D(DELTFARR) S DTIEN=0 F S DTIEN=$O(DELTFARR(DTIEN)) Q:+DTIEN=0 D DEL(ICN,STEXT,DTIEN)
  1. . K DELTFARR
  1. ;VAFCX=ICN and VAFCY=INSTITUTION
  1. S VAFCX=0 F S VAFCX=$O(MFI(VAFCX)) Q:'VAFCX D
  1. . S VAFCY=0 F S VAFCY=$O(MFI(VAFCX,VAFCY)) Q:'VAFCY D
  1. .. S VAFCN=0 F S VAFCN=$O(MFI(VAFCX,VAFCY,VAFCN)) Q:'VAFCN D
  1. ... S VAFCTYPE=$P(MFI(VAFCX,VAFCY,VAFCN),"^",3)
  1. ... S SID=$P(MFI(VAFCX,VAFCY,VAFCN),"^",7)
  1. ... S IDSTAT=$P(MFI(VAFCX,VAFCY,VAFCN),"^",8)
  1. ...;**837 - MVI_791 (ckn)
  1. ... S AA=$P(MFI(VAFCX,VAFCY,VAFCN),"^",9),IDTYP=$P(MFI(VAFCX,VAFCY,VAFCN),"^",10)
  1. ... I +CNFLT=1 D
  1. ....S MFA(VAFCY,VAFCN)="MFA"_HL("FS")_VAFCTYPE_HL("FS")_VAFCY_"-"_VAFCN_HL("FS")_$$HLDATE^HLFNC($$NOW^XLFDT)_HL("FS")_"U"_HLCOMP_$S(VAFCTYPE="MDL":"Delete of ",1:"Update of ")
  1. ....S MFA(VAFCY,VAFCN)=$G(MFA(VAFCY,VAFCN))_VAFCY_" Failed at "_$P($$SITE^VASITE,"^",3)_" due to "_$P(CNFLT,"^",2)
  1. ... I +CNFLT=0 I VAFCTYPE="MAD"!(VAFCTYPE="MUP")!(VAFCTYPE="MDC") D ADDUPD(DFN,VAFCY,$P(MFI(VAFCX,VAFCY,VAFCN),"^"),$P(MFI(VAFCX,VAFCY,VAFCN),"^",2),$P(MFI(VAFCX,VAFCY,VAFCN),"^",6),$G(SID),$G(IDSTAT),VAFCN,VAFCTYPE,AA,IDTYP)
  1. ...; I +CNFLT=0 I VAFCTYPE="MDL" D DEL(ICN,VAFCY,VAFCN)
  1. ... I +CNFLT=0 I VAFCTYPE="MDL" D
  1. .... N EXTFIEN,STIEN
  1. .... S STIEN=$$LKUP^XUAF4(VAFCY)
  1. .... S EXTFIEN=0 F S EXTFIEN=$O(^DGCN(391.91,"APAT",DFN,STIEN,EXTFIEN)) Q:+EXTFIEN=0 D
  1. ..... N NODE0,NODE2,EXIDTYP,EXAA,EXSID,EXIDST
  1. .....; Existing AA, ID type, Source ID, Identifier Status
  1. ..... S NODE0=$G(^DGCN(391.91,EXTFIEN,0)),NODE2=$G(^DGCN(391.91,EXTFIEN,2))
  1. ..... S EXIDTYP=$P(NODE0,"^",9),EXAA=$P(NODE2,"^"),EXSID=$P(NODE2,"^",2),EXIDST=$P(NODE2,"^",3)
  1. ..... I EXIDTYP=IDTYP,EXAA=AA,EXSID=SID,EXIDST=IDSTAT D DEL(ICN,VAFCY,EXTFIEN) Q
  1. ..... I $E(VAFCY,1,4)="200N" D ;Check only Source iD and IdType for 200N*
  1. ...... I EXIDTYP=IDTYP,EXSID=SID D DEL(ICN,VAFCY,EXTFIEN)
  1. Q
  1. ADDUPD(DFN,INST,PDLT,PDLRTET,IPP,DFNATST,IDENSTAT,ZCNT,VAFCTYPE,AA,IDTYP) ;add or update TF entry
  1. N ERROR,STA
  1. S STA=INST
  1. S INST=$$LKUP^XUAF4(INST)
  1. I INST=0 S ERROR(STA)="Update of "_STA_" Failed at "_$P($$SITE^VASITE,"^",3)_" due to unknown Institution IEN "_INST_" passed into TF update."
  1. I '$D(ERROR(STA)) D FILE^VAFCTFU(DFN,INST_"^"_$G(PDLT)_"^"_$G(PDLRTET),1,1,.ERROR,$G(IPP),DFNATST,IDENSTAT,AA,IDTYP)
  1. S MFA(STA,ZCNT)="MFA"_HL("FS")_VAFCTYPE_HL("FS")_STA_"-"_ZCNT_HL("FS")_$$HLDATE^HLFNC($$NOW^XLFDT)_HL("FS")
  1. I '$D(ERROR(STA)) S MFA(STA,ZCNT)=MFA(STA,ZCNT)_"S"
  1. I $D(ERROR(STA)) S MFA(STA,ZCNT)=MFA(STA,ZCNT)_"U"_HLCOMP_ERROR(STA)_HL("FS")
  1. Q
  1. DEL(ICN,INST,DTIEN) ;delete a TF entry
  1. N ERROR,STA
  1. S STA=INST
  1. S INST=$$LKUP^XUAF4(INST)
  1. S ERROR=$$DELETETF^VAFCTFU(ICN,INST,DTIEN)
  1. ;**821 - No need to send MFA for entries that are deleted locally
  1. ;S MFA(STA,ZCNT)="MFA"_HL("FS")_"MDL"_HL("FS")_STA_"-"_ZCNT_HL("FS")_$$HLDATE^HLFNC($$NOW^XLFDT)_HL("FS")
  1. ;I +ERROR'=1 S MFA(STA,ZCNT)=MFA(STA,ZCNT)_"S"
  1. ;I +ERROR=1 S MFA(STA,ZCNT)=MFA(STA,ZCNT)_"U"_HLCOMP_"Delete Failed: "_$P(ERROR,"^",2)
  1. Q