Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"segment ISA~ does not occur" error even though I see the ISA segment #196

Closed
austinmbrown opened this issue Jun 5, 2019 · 3 comments
Closed
Labels

Comments

@austinmbrown
Copy link
Contributor

I get X12 strings back from an API, so here's a sample 271 with fake data:

response = "ISA*00*          *00*          *ZZ*ABILITY        *ZZ*WELLD          *190604*1438*^*00501*207235994*0*P*:~GS*HB*ABILITY*WELLD*20190604*1438*207235995*X*005010X279~ST*271*207235996*005010X279A1~BHT*0022*11*207235996*20190604*1438~HL*1**20*1~NM1*PR*2*MEDICARE*****PI*13173~HL*2*1*21*1~NM1*1P*2*BIGTIME HOSPITAL*****XX*1234567893~HL*3*2*22*1~NM1*IL*1*DOE*BOBBY****MI*WDOE123~HL*4*3*23*0~TRN*2*46557091X0001*9A0D72CEF1~NM1*03*1*DOE*ANGELA~REF*18*09990~N3*4444 SMOKEY LANE.~N4*MAYS*NM*87830~DMG*D8*19020923*F~INS*N*19~DTP*346*D8*20120620~DTP*472*D8*20130222~DTP*356*D8*20140620~EB*L*ECH*30*PS~MSG*PCP SELECTION NOT REQUIRED~EB*W~LS*2120~NM1*PR*2*AETNA~N3*PO BOX 981106~N4*EL PASO*TX*79998~LE*2120~EB*1*ECH*30*PS*AETNA CHOICE POS II~EB*C*FAM*30***23*3000*****W~DTP*346*D8*20170101~MSG*INT MED AND RX,DED INCLUDED IN OOP,CHIROPRACTOR VISIT OR EVALUATION,LAB PERFORMED BY CHIROPRACTOR,XRAY BY CHIROPRACTOR,MANIPULATION BY CHIROPRACTOR,OCCUPATIONAL THERAPY BY CHIROPRACTOR,PHYSICAL THERAPY BY CHIROPRACTOR,CHIROPRACTOR VISIT OR EVALUATION IN OFFICE~MSG*LAB PERFORMED BY CHIROPRACTOR IN OFFICE,XRAY BY CHIROPRACTOR IN OFFICE,MANIPULATION BY CHIROPRACTOR IN OFFICE,OCCUPATIONAL THERAPY BY CHIROPRACTOR IN OFFICE,PHYSICAL THERAPY BY CHIROPRACTOR IN OFFICE,EMERGENCY USE OF EMERGENCY ROOM,OUTPATIENT MEDICAL ANCILLARY~MSG*AMBULATORY MEDICAL ANCILLARY,MEDICAL ANCILLARY,SEMI PRIVATE ROOM AND BOARD,INTENSIVE CARE ROOM AND BOARD,OUTPATIENT SURGERY FACILITY,NON EMERGENCY USE OF EMERGENCY ROOM,EMERGENCY ROOM PHYSICIAN,URGENT CARE,NON URGENT SERVICES AT AN URGENT CARE FACILITY,GYN VISIT~MSG*SPECIALIST VISIT OR EVALUATION,PRIMARY CARE VISIT OR EVALUATION,GYN VISIT WHEN PERFORMED IN AN OFFICE,SPECIALIST VISIT OR EVALUATION WHEN PERFORMED IN AN OFFICE,PRIMARY CARE VISIT OR EVALUATION IN OFFICE~EB*C*FAM*30***29*2086.28*****W~MSG*INT MED AND RX~EB*G*FAM*30****6000*****W~MSG*INT MED AND RX~EB*G*FAM*30***29*5086.28*****W~EB*F*ECH*30*********Y~MSG*PLAN REQUIRES PRECERT~EB*F*ECH*30~MSG*SELF FUNDED~EB*F*ECH*30***32~MSG*UNLIMITED LIFETIME BENEFITS~EB*1*ECH*1^33^47^48^50^86^98^UC^AL^MH^88**AETNA CHOICE POS II~EB*A*ECH*33*****0****Y~MSG*ALL OTHER IN-NETWORK PROVIDERS~MSG*CHIROPRACTOR VISIT OR EVALUATION~MSG*LAB PERFORMED BY CHIROPRACTOR~MSG*XRAY BY CHIROPRACTOR~MSG*MANIPULATION BY CHIROPRACTOR~MSG*OCCUPATIONAL THERAPY BY CHIROPRACTOR~MSG*PHYSICAL THERAPY BY CHIROPRACTOR~EB*A*ECH*48*****0***Y*Y~MSG*ALL OTHER IN-NETWORK PROVIDERS~MSG*SEMI PRIVATE ROOM AND BOARD~EB*A*ECH*50*****0****Y~MSG*ALL OTHER IN-NETWORK PROVIDERS~EB*A*ECH*98*****0****Y~MSG*ALL OTHER IN-NETWORK PROVIDERS~MSG*GYN VISIT~MSG*SPECIALIST VISIT OR EVALUATION~MSG*PRIMARY CARE VISIT OR EVALUATION~EB*B*ECH*33****0*****Y~MSG*ALL OTHER IN-NETWORK PROVIDERS~MSG*CHIROPRACTOR VISIT OR EVALUATION~MSG*LAB PERFORMED BY CHIROPRACTOR~MSG*XRAY BY CHIROPRACTOR~EB*B*ECH*98****0*****Y~MSG*ALL OTHER IN-NETWORK PROVIDERS~MSG*GYN VISIT~MSG*SPECIALIST VISIT OR EVALUATION~MSG*PRIMARY CARE VISIT OR EVALUATION~EB*A*ECH*86*****0***Y*W~MSG*NON EMERGENCY USE OF EMERGENCY ROOM~MSG*EMERGENCY ROOM PHYSICIAN~MSG*EMERGENCY USE OF EMERGENCY ROOM~MSG*URGENT CARE~MSG*NON URGENT SERVICES AT AN URGENT CARE FACILITY~EB*A*ECH*UC*****0***Y*W~EB*B*ECH*33****0****Y*W~MSG*MANIPULATION BY CHIROPRACTOR~MSG*OCCUPATIONAL THERAPY BY CHIROPRACTOR~MSG*PHYSICAL THERAPY BY CHIROPRACTOR~EB*B*ECH*48****0****Y*W~MSG*SEMI PRIVATE ROOM AND BOARD~EB*B*ECH*50^UC****0****Y*W~EB*B*ECH*86****150****Y*W~MSG*NON EMERGENCY USE OF EMERGENCY ROOM,COPAY INCLUDED IN OOP~MSG*EMERGENCY USE OF EMERGENCY ROOM,COPAY INCLUDED IN OOP~EB*B*ECH*86****0****Y*W~MSG*EMERGENCY ROOM PHYSICIAN~MSG*URGENT CARE~MSG*NON URGENT SERVICES AT AN URGENT CARE FACILITY~EB*F*IND*33*********W~HSD*VS*25***21*1~MSG*SPINAL MANIP,MANIPULATION BY CHIROPRACTOR~EB*F*IND*33*********W~HSD*VS*25***29~MSG*SPINAL MANIP~EB*A*ECH*33*****.2***Y*N~MSG*MANIPULATION BY CHIROPRACTOR,COINS APPLIES TO OUT OF POCKET~MSG*OCCUPATIONAL THERAPY BY CHIROPRACTOR,COINS APPLIES TO OUT OF POCKET~MSG*PHYSICAL THERAPY BY CHIROPRAC* CONNECTION #0 TO HOST CH.AWS.G4HS.NET LEFT INTACTTOR,COINS APPLIES TO OUT OF POCKET~MSG*CHIROPRACTOR VISIT OR EVALUATION IN OFFICE,COINS APPLIES TO OUT OF POCKET~MSG*LAB PERFORMED BY CHIROPRACTOR IN OFFICE,COINS APPLIES TO OUT OF POCKET~MSG*XRAY BY CHIROPRACTOR IN OFFICE,COINS APPLIES TO OUT OF POCKET~MSG*MANIPULATION BY CHIROPRACTOR IN OFFICE,COINS APPLIES TO OUT OF POCKET~MSG*OCCUPATIONAL THERAPY BY CHIROPRACTOR IN OFFICE,COINS APPLIES TO OUT OF POCKET~MSG*PHYSICAL THERAPY BY CHIROPRACTOR IN OFFICE,COINS APPLIES TO OUT OF POCKET~EB*A*ECH*48*****.2***Y*N~MSG*MEDICAL ANCILLARY,COINS APPLIES TO OUT OF POCKET~MSG*SEMI PRIVATE ROOM AND BOARD,COINS APPLIES TO OUT OF POCKET~MSG*INTENSIVE CARE ROOM AND BOARD,COINS APPLIES TO OUT OF POCKET~EB*A*ECH*50*****.2***Y*N~MSG*COINS APPLIES TO OUT OF POCKET~EB*A*ECH*98*****.2***Y*N~MSG*GYN VISIT WHEN PERFORMED IN AN OFFICE,COINS APPLIES TO OUT OF POCKET~MSG*SPECIALIST VISIT OR EVALUATION WHEN PERFORMED IN AN OFFICE,COINS APPLIES TO OUT OF POCKET~MSG*PRIMARY CARE VISIT OR EVALUATION IN OFFICE,COINS APPLIES TO OUT OF POCKET~EB*B*ECH*33****0****Y*N~MSG*CHIROPRACTOR VISIT OR EVALUATION IN OFFICE~MSG*LAB PERFORMED BY CHIROPRACTOR IN OFFICE~MSG*XRAY BY CHIROPRACTOR IN OFFICE~MSG*MANIPULATION BY CHIROPRACTOR IN OFFICE~MSG*OCCUPATIONAL THERAPY BY CHIROPRACTOR IN OFFICE~MSG*PHYSICAL THERAPY BY CHIROPRACTOR IN OFFICE~EB*B*ECH*98****0****Y*N~MSG*GYN VISIT WHEN PERFORMED IN AN OFFICE~MSG*SPECIALIST VISIT OR EVALUATION WHEN PERFORMED IN AN OFFICE~MSG*PRIMARY CARE VISIT OR EVALUATION IN OFFICE~EB*F*ECH*1^33^48^50^86^98^UC~MSG*PLAN INCLUDES NAP~SE*137*207235996~GE*1*207235995~IEA*1*207235994~"

Then I can do:

> config = Stupidedi::Config.hipaa
=> #<Stupidedi::Config:0x2b1bbc1c9eb0 ...>

> parser = Stupidedi::Parser::StateMachine.build(config)
=> #<Stupidedi::Parser::StateMachine:0x2b1bbc1a888c ...>

> parser, result = parser.read(Stupidedi::Reader.build(response))
=> [#<Stupidedi::Parser::StateMachine:0x2b1bbbbffe94 ...>, Either.failure("reached end of input before finding ISA segment identifier")]

I get an error, so then of course:

> parser.find(:ISA)
=> Either.failure("segment ISA~ does not occur")

But the errors confuse me because of the following:

> parser.first.fetch
=> StateMachine[1](
  SegmentVal[ISA: Interchange Control Header](
    ID.value[  I01: Authorization Information Qualifier](00: No Authorization Information Present (No Meaningful Information in I02)),
    AN.empty[  I02: Authorization Information],
    ID.value[  I03: Security Information Qualifier](00: No Security Information (No Meaningful Information in I04)),
    AN.empty[  I04: Security Information],
    ID.value[  I05: Interchange ID Qualifier](ZZ: Mutually Defined),
    AN.value[  I06: Interchange Sender ID](ABILITY),
    ID.value[  I05: Interchange ID Qualifier](ZZ: Mutually Defined),
    AN.value[  I07: Interchange Receiver ID](WELLD),
    DT.value[  I08: Interchange Date](XX19-06-04),
    TM.value[  I09: Interchange Time](14:38:ss),
    SeparatorVal.value[I65](^),
    ID.value[  I11: Interchange Control Version Number](00501: Standards Approved for Publication by ASC X12 Procedures Review Board through October 2003),
    Nn.value[  I12: Interchange Control Number](207235994),
    ID.value[  I13: Acknowledgment Requested](0: No Interchange Acknowledgment Requested),
    ID.value[  I14: Interchange Usage Indicator](P: Production Data),
    SeparatorVal.value[I15](:)))

So, what's the story? Is this related to #173 ?

I'd like to be able to do something like parser.find(:GS, :GS01) but I keep being told those segments don't occur. Am I parsing the X12 wrong? Or not understanding the limitations of find?

@austinmbrown
Copy link
Contributor Author

I think I see my mistake on the .find question, that second argument is not an element id, it's a value for identifying the segment. Looks like I can find other elements as I move around the tree. Thanks for your patience, X12 and this gem are... a lot. :D

I am still curious about that parsing error, but I don't have an immediate need to .find the ISA.

@kputnam
Copy link
Owner

kputnam commented Sep 10, 2019

One quirk is that find only looks ahead from the current position. So if you're already on ISA, calling StateMachine#find(:ISA) will look ahead to the next ISA which probably doesn't exist.

The other bit, I think you saw, you probably want to write parser.find(:GS) unless you want to further restrict the search. For instance if you only want to match where GS01 is "X", then you can call #find(:GS, "X").

The last thing you should know is when you use StateMachine#read, it returns a cursor pointing to the last segment that it parsed. So calling #find(:ISA) on it will start at the end of the file. You can rewind to the first segment by calling #first. You can also move backward by calling #parent, which moves to the start segment of the parent structure (loop, table, etc).

This documentation should help, and so should the code examples in examples/ and notes/ and bin/.

@kputnam
Copy link
Owner

kputnam commented Sep 27, 2019

Closing. Feel free to re-open or create a new issue if your issue/question wasn't answered.

@kputnam kputnam closed this as completed Sep 27, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants