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

BAR50P01.m

Go to the documentation of this file.
  1. BAR50P01 ; IHS/SD/LSL - EDI PARSING ;
  1. ;;1.8;IHS ACCOUNTS RECEIVABLE;**1,3,21,26**;OCT 26, 2005;Build 17
  1. ;;
  1. ; IHS/ASDS/LSL - O6/15/2001 - V1.5 Patch 1 - HQW-0201-100027 - FM 22 issue. Modified to include E in DIC(0).
  1. ;
  1. ; IHS/SD/LSL - 08/19/2002 - V1.7 Patch 4 - HIPAA - Modified FILE and LOOP to accomodate X12 loops on segments with the same ID.
  1. ;
  1. ;IHS/SD/POT - 1.8*26 - HEAT158770 04/09/2014 Allow more than 1 SVC segment per claim to avoid <SUBSCRIPT>IDENT+32^BAR50P01 *SEGID("SVC","")
  1. ; *********************************************************************
  1. ;
  1. EN(TRDA,IMPDA) ; EP -- Process the file loaded into Image
  1. S VALMBCK="R"
  1. D PARSE(TRDA,IMPDA)
  1. D FILE(TRDA,IMPDA)
  1. W " ",COUNT
  1. Q
  1. ; ********************************************************************
  1. ;
  1. PARSE(TRDA,IMPDA) ;
  1. ; parse image in ^TMP($J,"I", into segments "S"
  1. ; Separators S-Segment, E-Element, SE-Sub Element
  1. K ^TMP($J,"I"),^TMP($J,"S")
  1. D SEP(TRDA,IMPDA) ; find separators
  1. S BARTMP=0
  1. F S BARTMP=$O(^BAREDI("I",DUZ(2),IMPDA,10,BARTMP)) Q:'+BARTMP S ^TMP($J,"I",10,BARTMP)=^BAREDI("I",DUZ(2),IMPDA,10,BARTMP,0)
  1. ;
  1. ; remove trailing spaces if any (because control char were replaced
  1. ; spaces when the file was read into a global)
  1. S A="^TMP($J,""I"",10)"
  1. S B="^TMP($J,""S"")"
  1. S LC=$O(@A@(""),-1)
  1. F I=1:1:LC S X=@A@(I) D S @A@(I)=X
  1. . F S L=$L(X) Q:$E(X,L)'=" " S X=$E(X,1,L-1)
  1. S X=""
  1. S L1=1,L2=1
  1. ;
  1. ; the following uses GO commands to simplify the logic loops
  1. ; have to combine lines of the import and pull out the records
  1. ; uniquely into seperate segments
  1. ;
  1. W !,"Splitting image into Segments",!
  1. S COUNT=1
  1. ;
  1. ADD ;add image lines to X till it has a seperator
  1. G:'$D(@A@(L1)) LAST
  1. G:@A@(L1)="" LAST
  1. S X=X_@A@(L1)
  1. S L1=L1+1
  1. I X[S G STORE
  1. G ADD
  1. ; ********************************************************************
  1. ;
  1. STORE ;
  1. ; store segment & store more if X has several segments in it
  1. W:'(COUNT#10) "."
  1. W:'(COUNT#500) " ",COUNT,!
  1. S COUNT=COUNT+1
  1. S Y=$P(X,S)
  1. S X=$P(X,S,2,999)
  1. S @B@(L2)=Y
  1. S L2=L2+1
  1. I X[S G STORE
  1. G ADD
  1. ; ********************************************************************
  1. ;
  1. LAST ;store last
  1. S X=$$STRIP^BAR50IUT(X)
  1. S:$L(X) @B@(L2)=X
  1. S Z=$O(@B@(""),-1)
  1. K ^BAREDI("I",DUZ(2),IMPDA,15)
  1. F I=1:1:Z S ^BAREDI("I",DUZ(2),IMPDA,15,I,0)=@B@(I)
  1. S ^BAREDI("I",DUZ(2),IMPDA,15,0)="^^"_Z_"^"_Z_"^"_DT
  1. Q
  1. ; ********************************************************************
  1. ;
  1. SEP(TRDA,IMPDA) ;
  1. ; FIND SEPERATORS
  1. ;TRANSPORT - TRDA, IMPORT DA - IMPDA
  1. ;store S=Segment,E=Element,SE=Subelement
  1. S ROU=$$GET1^DIQ(90056.01,TRDA,.02)
  1. S ROU=$TR(ROU,"|","^")
  1. Q:'$L(ROU)
  1. D @ROU
  1. Q
  1. ; ********************************************************************
  1. ;
  1. FILE(TRDA,IMPDA) ;
  1. ; Take field 15 Image by Segment, find its segment and
  1. ; store in segments multiple(s) ready for spliting & conversion
  1. ;
  1. W !,"Identifying Segments Uniquely",!
  1. S COUNT=1
  1. ;pull image by segment into @SEG@
  1. K ^TMP($J,"SEG")
  1. ;
  1. ; build SEGID array for assignments
  1. ; SEGID(ID,SEGMENT)=USE ; ie SEGID("CAS","2-090-CAS")=99
  1. ;
  1. K SEGI,SESGID
  1. D ENPM^XBDIQ1(90056.0101,"TRDA,0",".01;.02;.06","SEGI(")
  1. S I=0 F S I=$O(SEGI(I)) Q:I'>0 S SEGID(SEGI(I,.02),SEGI(I,.01))=SEGI(I,.06)
  1. ;
  1. ; Pull & build loop id array LOOP(ID)=SEGMENT
  1. ; If Mark(ID) then segment sets its own last segment level
  1. ; If BARLOOP("DUP"), then Segment Id is LOOPed more than once
  1. ;
  1. K DIC,LOOP,LOP
  1. S DIC=$$DIC^XBDIQ1(90056.0101)
  1. S DIC("S")="I +$P(^(0),U,5)"
  1. D ENPM^XBDIQ1(.DIC,"TRDA,0",".01;.02","LOP(")
  1. K BARLOOP
  1. S I=0
  1. F S I=$O(LOP(I)) Q:I'>0 D
  1. . S:$D(LOOP(LOP(I,.02))) BARLOOP("DUP",LOP(I,.02))=1
  1. . S LOOP(LOP(I,.02))=LOP(I,.01)
  1. K LOP
  1. ;
  1. ; initialize current & last ID, SEGMENT, USE
  1. S (LSTID,LSTSEG,LSTUSE,CURID,CURSEG,CURUSE)=""
  1. ;
  1. K ^BAREDI("I",DUZ(2),20) ; clear Records
  1. S SEGDA=0
  1. F S SEGDA=$O(^BAREDI("I",DUZ(2),IMPDA,15,SEGDA)) Q:SEGDA'>0 S SEGX=^(SEGDA,0) D
  1. .S LSTSEG=CURSEG
  1. . S LSTID=CURID
  1. . S LSTUSE=CURUSE
  1. . D IDENT
  1. . Q:CURID="NTE" ;BAR*1.8*3 IM25273 CANNOT HANDLE NTE SEGMENTS
  1. .; SRS TO BE WRITTEN FOR SPECIFICATIONS
  1. . D FILE1
  1. Q
  1. ; ********************************************************************
  1. ;
  1. IDENT ; logic to locate segment from ID
  1. S CURID=$P(SEGX,E)
  1. Q:CURID="NTE" ;BAR*1.8*3 IM25273 CANNOT HANDLE NTE SEGMENTS
  1. ; SRS TO BE WRITTEN FOR SPECIFICATIONS
  1. I CURID'=LSTID D Q
  1. . I $D(LOOP(CURID)) D I 1
  1. . . I $D(BARLOOP("DUP",CURID)) D Q
  1. . . . I TRNAME["HIPAA",CURID="N1" D
  1. . . . . S:$P(SEGX,E,2)="PR" CURSEG="2-080.A-N1"
  1. . . . . S:$P(SEGX,E,2)="PE" CURSEG="2-080.B-N1"
  1. . . . I TRNAME["3041.4A",CURID="N1" D
  1. . . . . S:$P(SEGX,E,2)="PR" CURSEG="1-080.A-N1"
  1. . . . . S:$P(SEGX,E,2)="PE" CURSEG="1-080.B-N1"
  1. . . S CURSEG=LOOP(CURID)
  1. . E D ;S CURSEG=$O(SEGID(CURID,LSTSEG)) ;BAR*1.8*1 SRS PATCH 1 ADDENDUM
  1. . . ;CHANGE MADE BECAUSE ALGORYTHM DID NOT HANDLE GOING FROM THE B TO NEXT B SEGMENTS
  1. . . ;IT WOULD SKIP TO THE PREVIOUS A-XXX SEGMENT
  1. . . S TEMPSEG=LSTSEG
  1. . . S LOOPID1=$P($P(LSTSEG,".",2),"-")
  1. . . S CURSEG=$O(SEGID(CURID,LSTSEG))
  1. . . S LOOPID2=$P($P(CURSEG,".",2),"-")
  1. . . S:LOOPID1="B"&(LOOPID2="A") CURSEG=$O(SEGID(CURID,CURSEG))
  1. . . ;END BAR*1.8*1 SRS PATCH 1 ADDENDUM
  1. . ;IHS/SD/TPF 12/16/2005 IM19044
  1. . I $G(CURSEG)="",($G(CURID)="ISA") W !,"File contains more than one ISA/IEA pair at "_$G(^BAREDI("I",DUZ(2),IMPDA,15,SEGDA))_" . Inform payor and request new file." H 3 Q
  1. . S CURUSE=SEGID(CURID,CURSEG)
  1. ;
  1. I LSTUSE>1 D Q
  1. . S CURSEG=LSTSEG
  1. . S CURUSE=LSTUSE
  1. ;
  1. I CURID="SVC" Q ;bar*1.8*26 IHS/SD/POT HEAT158770
  1. S CURSEG=$O(SEGID(CURID,LSTSEG))
  1. S CURUSE=SEGID(CURID,CURSEG)
  1. Q
  1. ; ********************************************************************
  1. ;
  1. FILE1 ;
  1. ;FM HAS ISSUE WITH ^ IN FREE TEXT FIELD
  1. I $E(SEGX,1,3)="ISA",($E(SEGX,83)="^") S $E(SEGX,83)="U" ;IHS/SD/TPF 8/24/2011 BAR*1.8*21
  1. W:'(COUNT#10) "."
  1. W:'(COUNT#500) " ",COUNT,!
  1. S COUNT=COUNT+1
  1. K DIC,DR,DD,DO,DA
  1. S DIC=$$DIC^XBDIQ1(90056.0101)
  1. S X=CURSEG
  1. S DIC(0)="X"
  1. S DA(1)=TRDA
  1. D ^DIC
  1. N SEGLNK
  1. S SEGLNK=TRDA_","_+Y
  1. K DIC,DR,DD,DO,DA
  1. S DA(1)=IMPDA
  1. S DIC("P")="90056.0202A"
  1. S DIC=$$DIC^XBDIQ1(90056.0202)
  1. S DLAYGO=90056
  1. S DIC(0)="FZE"
  1. S X=SEGDA
  1. S DIC("DR")=".02///^S X=CURID"
  1. S DIC("DR")=DIC("DR")_";.03///^S X=CURSEG"
  1. S DIC("DR")=DIC("DR")_";.04///^S X=SEGLNK"
  1. S DIC("DR")=DIC("DR")_";1.01///^S X=SEGX"
  1. D FILE^DICN
  1. K DIC,DR,DD,DO
  1. Q
  1. ; ********************************************************************
  1. ;
  1. CLEAR(IMPDA) ; kill nodes 15 & 20 for a rerun
  1. K ^BAREDI("I",DUZ(2),IMPDA,15)
  1. K ^BAREDI("I",DUZ(2),IMPDA,20)
  1. Q