def __init__(self, param, errh, src_file_obj, xslt_files=None, map_path=None): """ @param param: pyx12.param instance @param errh: Error Handler object @param src_file_obj: Source document @type src_file_obj: string @rtype: boolean """ self.param = param self.map_path = map_path self.errh = error_handler.errh_list() self.icvn = None self.fic = None self.vriic = None self.tspc = None # Get X12 DATA file self.src = x12file.X12Reader(src_file_obj) #Get Map of Control Segments self.map_file = 'x12.control.00501.xml' if self.src.icvn == '00501' else 'x12.control.00401.xml' self.control_map = map_if.load_map_file(self.map_file, param, self.map_path) self.map_index_if = map_index.map_index(self.map_path) self.x12_map_node = self.control_map.getnodebypath('/ISA_LOOP/ISA') self.walker = walk_tree()
def setUp(self): self.walker = walk_tree() param = pyx12.params.params() self.errh = pyx12.error_handler.errh_null() self.map = pyx12.map_if.load_map_file('837.4010.X098.A1.xml', param)
def setUp(self): initialCounts = {} self.walker = walk_tree(initialCounts) param = pyx12.params.params() self.map = pyx12.map_if.load_map_file('837.4010.X098.A1.xml', param) self.errh = pyx12.error_handler.errh_null()
def setUp(self): self.walker = walk_tree() param = pyx12.params.params('pyx12.conf.xml') self.map = pyx12.map_if.load_map_file('834.5010.X220.A1.xml', param) self.errh = pyx12.error_handler.errh_null()
def test_999_2110_IK4(self): walker = walk_tree() param = pyx12.params.params() cmap = pyx12.map_if.load_map_file('999.5010.xml', self.param) errh = pyx12.error_handler.errh_null() path = '/ISA_LOOP/GS_LOOP/ST_LOOP/HEADER/2000/2100/IK3' node = cmap.getnodebypath(path) self.assertNotEqual(node, None) self.assertEqual(node.base_name, 'segment') #node.cur_count = 1 walker.setCountState({node.parent.x12path: 1, node.x12path: 1}) seg_data = pyx12.segment.Segment('IK4*3*116*7*88888-8888~', '~', '*', ':') errh.reset() (node, pop, push) = walker.walk(node, seg_data, errh, seg_count=8, cur_line=7, ls_id=None) self.assertNotEqual(node, None, 'walker failed to find %s' % (seg_data)) self.assertEqual(seg_data.get_seg_id(), node.id) self.assertEqual(errh.err_cde, None, errh.err_str) self.assertEqual(get_id_list(pop), []) self.assertEqual(get_id_list(push), ['2110'])
def setUp(self): self.walker = walk_tree() param = pyx12.params.params() self.map = pyx12.map_if.load_map_file('834.5010.X220.A1.xml', param) self.errh = pyx12.error_handler.errh_null()
def setUp(self): self.walker = walk_tree() param = pyx12.params.params() self.map = pyx12.map_if.load_map_file('837.4010.X098.A1.xml', param) self.errh = pyx12.error_handler.errh_null() self.node = self.map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/ST')
def setUp(self): self.walker = walk_tree() self.param = pyx12.params.params() self.map = pyx12.map_if.load_map_file('278.4010.X094.A1.xml', self.param) self.errh = pyx12.error_handler.errh_null()
def setUp(self): self.walker = walk_tree() self.param = pyx12.params.params('pyx12.conf.xml') self.map = pyx12.map_if.load_map_file( '278.4010.X094.A1.xml', self.param) self.errh = pyx12.error_handler.errh_null()
def setUp(self): self.walker = walk_tree() param = pyx12.params.params('pyx12.conf.xml') self.map = pyx12.map_if.load_map_file('837.4010.X098.A1.xml', param) self.errh = pyx12.error_handler.errh_null() self.node = self.map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/ST')
def setUp(self): self.walker = walk_tree() param = pyx12.params.params('pyx12.conf.xml') self.map = pyx12.map_if.load_map_file('834.5010.X220.A1.xml', param) self.errh = pyx12.error_handler.errh_null() #self.node = self.map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000A/2000B/2100B/N4') self.node = self.map.getnodebypath( '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000/INS') self.assertNotEqual(self.node, None) self.node.parent.cur_count = 1 # Loop 2000 self.node.cur_count = 1 # INS
def setUp(self): initialCounts = { '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000': 1, '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000/INS': 1, } self.walker = walk_tree(initialCounts) param = pyx12.params.params() self.map = pyx12.map_if.load_map_file('834.5010.X220.A1.xml', param) self.errh = pyx12.error_handler.errh_null() #self.node = self.map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000A/2000B/2100B/N4') self.node = self.map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000/INS') self.assertNotEqual(self.node, None)
def setUp(self): initialCounts = { '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000': 1, '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000/INS': 1, } self.walker = walk_tree(initialCounts) param = pyx12.params.params() self.map = pyx12.map_if.load_map_file('834.5010.X220.A1.xml', param) self.errh = pyx12.error_handler.errh_null() #self.node = self.map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000A/2000B/2100B/N4') self.node = self.map.getnodebypath( '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000/INS') self.assertNotEqual(self.node, None)
def test_GS_to_ST_277(self): map_file = '277.5010.X214.xml' walker = walk_tree() param = pyx12.params.params() map = pyx12.map_if.load_map_file(map_file, param) errh = pyx12.error_handler.errh_null() errh.reset() node = map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') seg_data = pyx12.segment.Segment('ST*277*0001*005010X214', '~', '*', ':') (node, pop, push) = walker.walk(node, seg_data, errh, 5, 4, None) self.assertNotEqual(node, None) self.assertEqual(seg_data.get_seg_id(), node.id) self.assertEqual(get_id_list(pop), []) self.assertEqual(get_id_list(push), ['ST_LOOP'])
def test_GS_to_ST_277(self): map_file = '277.5010.X214.xml' walker = walk_tree() param = pyx12.params.params() map = pyx12.map_if.load_map_file(map_file, param) errh = pyx12.error_handler.errh_null() errh.reset() node = map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') seg_data = pyx12.segment.Segment('ST*277*0001*005010X214', '~', '*', ':') (node, pop, push) = walker.walk( node, seg_data, errh, 5, 4, None) self.assertNotEqual(node, None) self.assertEqual(seg_data.get_seg_id(), node.id) self.assertEqual(get_id_list(pop), []) self.assertEqual(get_id_list(push), ['ST_LOOP'])
def setUp(self): self.walker = walk_tree() param = pyx12.params.params('pyx12.conf.xml') self.map = pyx12.map_if.load_map_file('270.4010.X092.A1.xml', param) self.errh = pyx12.error_handler.errh_null() #self.node = self.map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000A/2000B/2100B/N4') self.node = self.map.getnodebypath( '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000A/2000B/2100B/NM1') self.node.parent.cur_count = 1 # Loop 2100B self.countState = { self.node.parent.x12path: 1, self.node.x12path: 1, } self.node.cur_count = 1 self.node = self.map.getnodebypath( '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000A/2000B/2100B/PER') self.assertNotEqual(self.node, None) self.countState[self.node.x12path] = 1
def setUp(self): self.walker = walk_tree() param = pyx12.params.params() self.map = pyx12.map_if.load_map_file('270.4010.X092.A1.xml', param) self.errh = pyx12.error_handler.errh_null() #self.node = self.map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000A/2000B/2100B/N4') self.node = self.map.getnodebypath( '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000A/2000B/2100B/NM1') #self.node.parent.cur_count = 1 # Loop 2100B self.countState = { self.node.parent.x12path: 1, self.node.x12path: 1, } #self.node.cur_count = 1 self.node = self.map.getnodebypath( '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000A/2000B/2100B/PER') self.assertNotEqual(self.node, None) self.countState[self.node.x12path] = 1
def test_837i_2420a(self): walker = walk_tree() param = pyx12.params.params() cmap = pyx12.map_if.load_map_file( '837Q3.I.5010.X223.A1.xml', self.param) errh = pyx12.error_handler.errh_null() path = '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000A/2000B/2300/2400/DTP' node = cmap.getnodebypath(path) self.assertNotEqual(node, None) self.assertEqual(node.base_name, 'segment') seg_data = pyx12.segment.Segment( 'NM1*72*1*TEST*BAR****XX*9999974756~', '~', '*', ':') (node, pop, push) = walker.walk(node, seg_data, errh, 5, 4, None) self.assertNotEqual(node, None, 'walker failed to find %s' % (seg_data)) self.assertEqual(seg_data.get_seg_id(), node.id) self.assertEqual(errh.err_cde, None, errh.err_str) self.assertEqual(get_id_list(pop), []) self.assertEqual(get_id_list(push), ['2420A'])
def test_837i_2420a(self): walker = walk_tree() param = pyx12.params.params() cmap = pyx12.map_if.load_map_file('837Q3.I.5010.X223.A1.xml', self.param) errh = pyx12.error_handler.errh_null() path = '/ISA_LOOP/GS_LOOP/ST_LOOP/DETAIL/2000A/2000B/2300/2400/DTP' node = cmap.getnodebypath(path) self.assertNotEqual(node, None) self.assertEqual(node.base_name, 'segment') seg_data = pyx12.segment.Segment('NM1*72*1*TEST*BAR****XX*9999974756~', '~', '*', ':') (node, pop, push) = walker.walk(node, seg_data, errh, 5, 4, None) self.assertNotEqual(node, None, 'walker failed to find %s' % (seg_data)) self.assertEqual(seg_data.get_seg_id(), node.id) self.assertEqual(errh.err_cde, None, errh.err_str) self.assertEqual(get_id_list(pop), []) self.assertEqual(get_id_list(push), ['2420A'])
def x12n_document(param, src_file, fd_997, fd_html, fd_xmldoc=None, xslt_files=None, map_path=None, callback=None): """ Primary X12 validation function @param param: pyx12.param instance @param src_file: Source document @type src_file: string @param fd_997: 997/999 output document @type fd_997: file descriptor @param fd_html: HTML output document @type fd_html: file descriptor @param fd_xmldoc: XML output document @type fd_xmldoc: file descriptor @rtype: boolean """ logger = logging.getLogger('pyx12') errh = pyx12.error_handler.err_handler() # Get X12 DATA file try: src = pyx12.x12file.X12Reader(src_file) except pyx12.errors.X12Error: logger.error('"%s" does not look like an X12 data file' % (src_file)) return False #Get Map of Control Segments map_file = 'x12.control.00501.xml' if src.icvn == '00501' else 'x12.control.00401.xml' logger.debug('X12 control file: %s' % (map_file)) control_map = pyx12.map_if.load_map_file(map_file, param, map_path) map_index_if = pyx12.map_index.map_index(map_path) node = control_map.getnodebypath('/ISA_LOOP/ISA') walker = walk_tree() icvn = fic = vriic = tspc = None cur_map = None # we do not initially know the X12 transaction type #XXX Generate TA1 if needed. if fd_html: html = pyx12.error_html.error_html(errh, fd_html, src.get_term()) html.header() err_iter = pyx12.error_handler.err_iter(errh) if fd_xmldoc: xmldoc = pyx12.x12xml_simple.x12xml_simple(fd_xmldoc, param.get('simple_dtd')) #basedir = os.path.dirname(src_file) #erx = errh_xml.err_handler(basedir=basedir) valid = True for seg in src: #find node orig_node = node if False: print('--------------------------------------------') print(seg) print('--------------------------------------------') # reset to control map for ISA and GS loops print('------- counters before --------') print(walker.counter._dict) if seg.get_seg_id() == 'ISA': node = control_map.getnodebypath('/ISA_LOOP/ISA') walker.forceWalkCounterToLoopStart('/ISA_LOOP', '/ISA_LOOP/ISA') elif seg.get_seg_id() == 'GS': node = control_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') walker.forceWalkCounterToLoopStart('/ISA_LOOP/GS_LOOP', '/ISA_LOOP/GS_LOOP/GS') else: # from the current node, find the map node matching the segment # keep track of the loops traversed try: (node, pop_loops, push_loops) = walker.walk(node, seg, errh, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) except pyx12.errors.EngineError: logger.error('Source file line %i' % (src.get_cur_line())) raise if False: print('------- counters after --------') print(walker.counter._dict) if node is None: node = orig_node else: if seg.get_seg_id() == 'ISA': errh.add_isa_loop(seg, src) icvn = seg.get_value('ISA12') errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'IEA': errh.handle_errors(src.pop_errors()) errh.close_isa_loop(node, seg, src) # Generate 997 #XXX Generate TA1 if needed. elif seg.get_seg_id() == 'GS': fic = seg.get_value('GS01') vriic = seg.get_value('GS08') map_file_new = map_index_if.get_filename(icvn, vriic, fic) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}".format( icvn, fic, vriic) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file( map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) #apply_loop_count(orig_node, cur_map) #reset_isa_counts(cur_map) #_reset_counter_to_isa_counts(walker) # new counter #reset_gs_counts(cur_map) #_reset_counter_to_gs_counts(walker) # new counter node = cur_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') errh.add_gs_loop(seg, src) errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'BHT': # special case for 4010 837P if vriic in ('004010X094', '004010X094A1'): tspc = seg.get_value('BHT02') logger.debug('icvn=%s, fic=%s, vriic=%s, tspc=%s' % (icvn, fic, vriic, tspc)) map_file_new = map_index_if.get_filename( icvn, vriic, fic, tspc) logger.debug('New map file: %s' % (map_file_new)) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}, tspc={}".format( icvn, fic, vriic, tspc) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file( map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.info('Map file: %s' % (map_file)) #apply_loop_count(node, cur_map) node = cur_map.getnodebypath( '/ISA_LOOP/GS_LOOP/ST_LOOP/HEADER/BHT') errh.add_seg(node, seg, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'GE': errh.handle_errors(src.pop_errors()) errh.close_gs_loop(node, seg, src) elif seg.get_seg_id() == 'ST': errh.add_st_loop(seg, src) errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'SE': errh.handle_errors(src.pop_errors()) errh.close_st_loop(node, seg, src) else: errh.add_seg(node, seg, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) errh.handle_errors(src.pop_errors()) #errh.set_cur_line(src.get_cur_line()) valid &= node.is_valid(seg, errh) #erx.handleErrors(src.pop_errors()) #erx.handleErrors(errh.get_errors()) #errh.reset() if callback: try: callback(seg, src, node, valid) except: logger.error('callback failed') pass if fd_html: if node is not None and node.is_first_seg_in_loop(): html.loop(node.get_parent()) err_node_list = [] while True: try: next(err_iter) err_node = err_iter.get_cur_node() err_node_list.append(err_node) except pyx12.errors.IterOutOfBounds: break html.gen_seg(seg, src, err_node_list) if fd_xmldoc: xmldoc.seg(node, seg) if False: print('\n\n') #erx.Write(src.cur_line) #erx.handleErrors(src.pop_errors()) src.cleanup() # Catch any skipped loop trailers errh.handle_errors(src.pop_errors()) #erx.handleErrors(src.pop_errors()) #erx.handleErrors(errh.get_errors()) if fd_html: html.footer() del html if fd_xmldoc: del xmldoc #visit_debug = pyx12.error_debug.error_debug_visitor(sys.stdout) #errh.accept(visit_debug) #If this transaction is not a 997/999, generate one. if fd_997 and fic != 'FA': if vriic and vriic[:6] == '004010': try: visit_997 = pyx12.error_997.error_997_visitor( fd_997, src.get_term()) errh.accept(visit_997) del visit_997 except Exception: logger.exception('Failed to create 997 response') if vriic and vriic[:6] == '005010': try: visit_999 = pyx12.error_999.error_999_visitor( fd_997, src.get_term()) errh.accept(visit_999) del visit_999 except Exception: logger.exception('Failed to create 999 response') del node del src del control_map try: del cur_map except UnboundLocalError: pass try: if not valid or errh.get_error_count() > 0: return False else: return True except Exception: print(errh) return False
def x12n_document(param, src_file, fd_997, fd_html, fd_xmldoc=None, xslt_files=None, map_path=None, callback=None): """ Primary X12 validation function @param param: pyx12.param instance @param src_file: Source document @type src_file: string @param fd_997: 997/999 output document @type fd_997: file descriptor @param fd_html: HTML output document @type fd_html: file descriptor @param fd_xmldoc: XML output document @type fd_xmldoc: file descriptor @rtype: boolean """ logger = logging.getLogger('pyx12') errh = pyx12.error_handler.err_handler() # Get X12 DATA file try: src = pyx12.x12file.X12Reader(src_file) except pyx12.errors.X12Error: logger.error('"%s" does not look like an X12 data file' % (src_file)) return False #Get Map of Control Segments map_file = 'x12.control.00501.xml' if src.icvn == '00501' else 'x12.control.00401.xml' logger.debug('X12 control file: %s' % (map_file)) control_map = pyx12.map_if.load_map_file(map_file, param, map_path) map_index_if = pyx12.map_index.map_index(map_path) node = control_map.getnodebypath('/ISA_LOOP/ISA') walker = walk_tree() icvn = fic = vriic = tspc = None cur_map = None # we do not initially know the X12 transaction type #XXX Generate TA1 if needed. if fd_html: html = pyx12.error_html.error_html(errh, fd_html, src.get_term()) html.header() err_iter = pyx12.error_handler.err_iter(errh) if fd_xmldoc: xmldoc = pyx12.x12xml_simple.x12xml_simple(fd_xmldoc, param.get('simple_dtd')) #basedir = os.path.dirname(src_file) #erx = errh_xml.err_handler(basedir=basedir) valid = True for seg in src: #find node orig_node = node if False: print('--------------------------------------------') print(seg) print('--------------------------------------------') # reset to control map for ISA and GS loops print('------- counters before --------') print(walker.counter._dict) if seg.get_seg_id() == 'ISA': node = control_map.getnodebypath('/ISA_LOOP/ISA') walker.forceWalkCounterToLoopStart('/ISA_LOOP', '/ISA_LOOP/ISA') elif seg.get_seg_id() == 'GS': node = control_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') walker.forceWalkCounterToLoopStart('/ISA_LOOP/GS_LOOP', '/ISA_LOOP/GS_LOOP/GS') else: # from the current node, find the map node matching the segment # keep track of the loops traversed try: (node, pop_loops, push_loops) = walker.walk(node, seg, errh, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) except pyx12.errors.EngineError: logger.error('Source file line %i' % (src.get_cur_line())) raise if False: print('------- counters after --------') print(walker.counter._dict) if node is None: node = orig_node else: if seg.get_seg_id() == 'ISA': errh.add_isa_loop(seg, src) icvn = seg.get_value('ISA12') errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'IEA': errh.handle_errors(src.pop_errors()) errh.close_isa_loop(node, seg, src) # Generate 997 #XXX Generate TA1 if needed. elif seg.get_seg_id() == 'GS': fic = seg.get_value('GS01') vriic = seg.get_value('GS08') map_file_new = map_index_if.get_filename(icvn, vriic, fic) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}".format(icvn, fic, vriic) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file(map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) #apply_loop_count(orig_node, cur_map) #reset_isa_counts(cur_map) #_reset_counter_to_isa_counts(walker) # new counter #reset_gs_counts(cur_map) #_reset_counter_to_gs_counts(walker) # new counter node = cur_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') errh.add_gs_loop(seg, src) errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'BHT': # special case for 4010 837P if vriic in ('004010X094', '004010X094A1'): tspc = seg.get_value('BHT02') logger.debug('icvn=%s, fic=%s, vriic=%s, tspc=%s' % (icvn, fic, vriic, tspc)) map_file_new = map_index_if.get_filename(icvn, vriic, fic, tspc) logger.debug('New map file: %s' % (map_file_new)) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}, tspc={}".format( icvn, fic, vriic, tspc) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file(map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) #apply_loop_count(node, cur_map) node = cur_map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/HEADER/BHT') errh.add_seg(node, seg, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'GE': errh.handle_errors(src.pop_errors()) errh.close_gs_loop(node, seg, src) elif seg.get_seg_id() == 'ST': errh.add_st_loop(seg, src) errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'SE': errh.handle_errors(src.pop_errors()) errh.close_st_loop(node, seg, src) else: errh.add_seg(node, seg, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) errh.handle_errors(src.pop_errors()) #errh.set_cur_line(src.get_cur_line()) valid &= node.is_valid(seg, errh) #erx.handleErrors(src.pop_errors()) #erx.handleErrors(errh.get_errors()) #errh.reset() if callback: try: callback(seg, src, node, valid) except: logger.error('callback failed') pass if fd_html: if node is not None and node.is_first_seg_in_loop(): html.loop(node.get_parent()) err_node_list = [] while True: try: next(err_iter) err_node = err_iter.get_cur_node() err_node_list.append(err_node) except pyx12.errors.IterOutOfBounds: break html.gen_seg(seg, src, err_node_list) if fd_xmldoc: xmldoc.seg(node, seg) if False: print('\n\n') #erx.Write(src.cur_line) #erx.handleErrors(src.pop_errors()) src.cleanup() # Catch any skipped loop trailers errh.handle_errors(src.pop_errors()) #erx.handleErrors(src.pop_errors()) #erx.handleErrors(errh.get_errors()) if fd_html: html.footer() del html if fd_xmldoc: del xmldoc #visit_debug = pyx12.error_debug.error_debug_visitor(sys.stdout) #errh.accept(visit_debug) #If this transaction is not a 997/999, generate one. if fd_997 and fic != 'FA': if vriic and vriic[:6] == '004010': try: visit_997 = pyx12.error_997.error_997_visitor(fd_997, src.get_term()) errh.accept(visit_997) del visit_997 except Exception: logger.exception('Failed to create 997 response') if vriic and vriic[:6] == '005010': try: visit_999 = pyx12.error_999.error_999_visitor(fd_997, src.get_term()) errh.accept(visit_999) del visit_999 except Exception: logger.exception('Failed to create 999 response') del node del src del control_map try: del cur_map except UnboundLocalError: pass try: if not valid or errh.get_error_count() > 0: return False else: return True except Exception: print(errh) return False
def get_x12file_metadata(param, src_file, map_path=None): logger = logging.getLogger('pyx12') errh = pyx12.error_handler.errh_null() # Get X12 DATA file try: src = pyx12.x12file.X12Reader(src_file) except pyx12.errors.X12Error: logger.error('"%s" does not look like an X12 data file' % (src_file)) return (False, None, None) #Get Map of Control Segments map_file = 'x12.control.00501.xml' if src.icvn == '00501' else 'x12.control.00401.xml' logger.debug('X12 control file: %s' % (map_file)) control_map = pyx12.map_if.load_map_file(map_file, param, map_path) map_index_if = pyx12.map_index.map_index(map_path) node = control_map.getnodebypath('/ISA_LOOP/ISA') walker = walk_tree() icvn = fic = vriic = tspc = None cur_map = None # we do not initially know the X12 transaction type isa_data = {} node_summary = {} node_ordinal = 0 last_x12_segment_path = None for seg in src: orig_node = node if seg.get_seg_id() == 'ISA': node = control_map.getnodebypath('/ISA_LOOP/ISA') walker.forceWalkCounterToLoopStart('/ISA_LOOP', '/ISA_LOOP/ISA') elif seg.get_seg_id() == 'GS': node = control_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') walker.forceWalkCounterToLoopStart('/ISA_LOOP/GS_LOOP', '/ISA_LOOP/GS_LOOP/GS') else: # from the current node, find the map node matching the segment # keep track of the loops traversed try: (node, pop_loops, push_loops) = walker.walk(node, seg, errh, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) except pyx12.errors.EngineError: logger.error('Source file line %i' % (src.get_cur_line())) raise if node is None: raise pyx12.errors.EngineError("Node not found") node = orig_node if seg.get_seg_id() == 'ISA': icvn = seg.get_value('ISA12') elif seg.get_seg_id() == 'IEA': pass elif seg.get_seg_id() == 'GS': fic = seg.get_value('GS01') vriic = seg.get_value('GS08') map_file_new = map_index_if.get_filename(icvn, vriic, fic) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}".format(icvn, fic, vriic) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file(map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) node = cur_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') pass elif seg.get_seg_id() == 'BHT': # special case for 4010 837P if vriic in ('004010X094', '004010X094A1'): tspc = seg.get_value('BHT02') logger.debug('icvn=%s, fic=%s, vriic=%s, tspc=%s' % (icvn, fic, vriic, tspc)) map_file_new = map_index_if.get_filename(icvn, vriic, fic, tspc) logger.debug('New map file: %s' % (map_file_new)) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}, tspc={}".format( icvn, fic, vriic, tspc) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file(map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) node = cur_map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/HEADER/BHT') if seg.get_seg_id() == 'ISA': isa_data = { 'InterchangeSenderIDQualifier': seg.get_value('ISA05'), 'InterchangeSenderID': seg.get_value('ISA06'), 'InterchangeReceiverIDQualifier': seg.get_value('ISA07'), 'InterchangeReceiverID': seg.get_value('ISA08'), 'InterchangeDate': seg.get_value('ISA09'), 'InterchangeTime': seg.get_value('ISA10'), 'InterchangeControlStandardsIdentifier': seg.get_value('ISA11'), 'InterchangeControlVersionNumber': seg.get_value('ISA12'), 'InterchangeControlNumber': seg.get_value('ISA13'), 'AcknowledgmentRequested': seg.get_value('ISA14'), 'UsageIndicator': seg.get_value('ISA15'), 'GSLoops': [] } icvn = isa_data['InterchangeControlVersionNumber'] elif seg.get_seg_id() == 'IEA': isa_data['NumberofIncludedFunctionalGroups'] = seg.get_value('IEA01') elif seg.get_seg_id() == 'GS': gs_data = { 'FunctionalGroupHeader': seg.get_value('GS01'), 'ApplicationSendersCode': seg.get_value('GS02'), 'ApplicationReceiversCode': seg.get_value('GS03'), 'FunctionalGroupDate': seg.get_value('GS04'), 'FunctionalGroupTime': seg.get_value('GS05'), 'GroupControlNumber': seg.get_value('GS06'), 'ResponsibleAgencyCode': seg.get_value('GS07'), 'VersionReleaseIndustryIdentifierCode': seg.get_value('GS08'), 'STLoops': [] } elif seg.get_seg_id() == 'GE': gs_data['NumberofTransactionSetsIncluded'] = seg.get_value('GE01') isa_data['GSLoops'].append(gs_data) elif seg.get_seg_id() == 'ST': st_data = { 'TransactionSetIdentifierCode': seg.get_value('ST01'), 'TransactionSetControlNumber': seg.get_value('ST02'), 'ImplementationConventionReference': seg.get_value('ST03'), } elif seg.get_seg_id() == 'SE': st_data['TransactionSegmentCount'] = seg.get_value('SE01') gs_data['STLoops'].append(st_data) elif seg.get_seg_id() == 'BHT': st_data['HierarchicalStructureCode'] = seg.get_value('BHT01') st_data['TransactionSetPurposeCode'] = seg.get_value('BHT02') st_data['OriginatorApplicationTransactionIdentifier'] = seg.get_value('BHT03') st_data['TransactionSetCreationDate'] = seg.get_value('BHT04') st_data['TransactionSetCreationTime'] = seg.get_value('BHT05') st_data['ClaimorEncounterIdentifier'] = seg.get_value('BHT06') x12path = node.get_path() #parent if x12path in node_summary: node_summary[x12path]['Count'] += 1 if last_x12_segment_path not in node_summary[x12path]['prefix_nodes']: node_summary[x12path]['prefix_nodes'].append(last_x12_segment_path) else: node_summary[x12path] = { 'Ordinal': node_ordinal, 'Count': 1, 'NodeType': node.base_name, 'Id': node.id, 'Name': node.name, 'ParentName': node.parent.name, 'LoopMaxUse': node.max_use, 'ParentPath': node.parent.get_path(), 'prefix_nodes': [last_x12_segment_path] } node_ordinal += 1 for (refdes, ele_ord, comp_ord, val) in seg.values_iterator(): ele_node = node.getnodebypath2(refdes) if ele_node.is_composite(): ele_node = ele_node.get_child_node_by_ordinal(1) elepath = ele_node.get_path() if elepath in node_summary: node_summary[elepath]['Count'] += 1 else: node_summary[elepath] = { 'Ordinal': node_ordinal, 'Count': 1, 'NodeType': ele_node.base_name, 'Id': ele_node.id, 'Name': ele_node.name, 'ParentName': ele_node.parent.name, 'ParentPath': ele_node.parent.get_path(), 'Usage': ele_node.usage, 'DataType': ele_node.data_type, 'MinLength': ele_node.min_len, 'MaxLength': ele_node.max_len, } node_ordinal += 1 last_x12_segment_path = x12path return (True, isa_data, node_summary)
def x12n_iterator(param, src_file, map_path=None): logger = logging.getLogger('pyx12') errh = pyx12.error_handler.errh_null() # Get X12 DATA file try: src = pyx12.x12file.X12Reader(src_file) except pyx12.errors.X12Error: logger.error('"%s" does not look like an X12 data file' % (src_file)) return False #Get Map of Control Segments map_file = 'x12.control.00501.xml' if src.icvn == '00501' else 'x12.control.00401.xml' logger.debug('X12 control file: %s' % (map_file)) control_map = pyx12.map_if.load_map_file(map_file, param, map_path) map_index_if = pyx12.map_index.map_index(map_path) node = control_map.getnodebypath('/ISA_LOOP/ISA') walker = walk_tree() icvn = fic = vriic = tspc = None cur_map = None # we do not initially know the X12 transaction type res = {} res_ordinal = 0 last_x12_segment_path = None for seg in src: #find node orig_node = node if False: print('--------------------------------------------') print(seg) print('--------------------------------------------') # reset to control map for ISA and GS loops print('------- counters before --------') print(walker.counter._dict) if seg.get_seg_id() == 'ISA': node = control_map.getnodebypath('/ISA_LOOP/ISA') walker.forceWalkCounterToLoopStart('/ISA_LOOP', '/ISA_LOOP/ISA') elif seg.get_seg_id() == 'GS': node = control_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') walker.forceWalkCounterToLoopStart('/ISA_LOOP/GS_LOOP', '/ISA_LOOP/GS_LOOP/GS') else: # from the current node, find the map node matching the segment # keep track of the loops traversed try: (node, pop_loops, push_loops) = walker.walk(node, seg, errh, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) except pyx12.errors.EngineError: logger.error('Source file line %i' % (src.get_cur_line())) raise if False: print('------- counters after --------') print(walker.counter._dict) if node is None: node = orig_node else: if seg.get_seg_id() == 'ISA': icvn = seg.get_value('ISA12') elif seg.get_seg_id() == 'IEA': pass elif seg.get_seg_id() == 'GS': fic = seg.get_value('GS01') vriic = seg.get_value('GS08') map_file_new = map_index_if.get_filename(icvn, vriic, fic) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}".format(icvn, fic, vriic) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file(map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) node = cur_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') pass elif seg.get_seg_id() == 'BHT': # special case for 4010 837P if vriic in ('004010X094', '004010X094A1'): tspc = seg.get_value('BHT02') logger.debug('icvn=%s, fic=%s, vriic=%s, tspc=%s' % (icvn, fic, vriic, tspc)) map_file_new = map_index_if.get_filename(icvn, vriic, fic, tspc) logger.debug('New map file: %s' % (map_file_new)) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}, tspc={}".format( icvn, fic, vriic, tspc) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file(map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) #apply_loop_count(node, cur_map) node = cur_map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/HEADER/BHT') #elif seg.get_seg_id() == 'GE': # pass #elif seg.get_seg_id() == 'ST': # pass #elif seg.get_seg_id() == 'SE': # pass else: pass x12path = node.get_path() #parent if x12path in res: res[x12path]['Count'] += 1 if last_x12_segment_path not in res[x12path]['prefix_nodes']: res[x12path]['prefix_nodes'].append(last_x12_segment_path) else: res[x12path] = { 'Ordinal': res_ordinal, 'Count': 1, 'NodeType': node.base_name, 'Id': node.id, 'Name': node.name, 'FormattedName': clean_name(node.name), 'ParentName': clean_name(node.parent.name), 'LoopMaxUse': node.max_use, 'ParentPath': node.parent.get_path(), 'prefix_nodes': [last_x12_segment_path] } res_ordinal += 1 for (refdes, ele_ord, comp_ord, val) in seg.values_iterator(): elepath = node.parent.get_path() + '/' + refdes if elepath in res: res[elepath]['Count'] += 1 else: ele_node = node.getnodebypath2(refdes) #node.get_child_node_by_ordinal( res[elepath] = { 'Ordinal': res_ordinal, 'Count': 1, 'NodeType': ele_node.base_name, 'Id': ele_node.id, 'Name': ele_node.name, 'FormattedName': clean_name(ele_node.name), 'ParentName': clean_name(ele_node.parent.name), #'max_use': ele_node.max_use, 'ParentPath': ele_node.parent.get_path(), 'Usage': ele_node.usage, 'DataType': ele_node.data_type, 'MinLength': ele_node.min_len, 'MaxLength': ele_node.max_len, } res_ordinal += 1 #print (refdes, val) last_x12_segment_path = x12path del node del src del control_map try: del cur_map except UnboundLocalError: pass return res
def x12n_document(param, src_file, fd_997, fd_html, fd_xmldoc=None, xslt_files=None): """ Primary X12 validation function @param param: pyx12.param instance @param src_file: Source document @type src_file: string @param fd_997: 997/999 output document @type fd_997: file descriptor @param fd_html: HTML output document @type fd_html: file descriptor @param fd_xmldoc: XML output document @type fd_xmldoc: file descriptor @rtype: boolean """ logger = logging.getLogger('pyx12') errh = pyx12.error_handler.err_handler() # Get X12 DATA file try: src = pyx12.x12file.X12Reader(src_file) except pyx12.errors.X12Error: logger.error('"%s" does not look like an X12 data file' % (src_file)) return False #Get Map of Control Segments map_file = 'x12.control.00501.xml' if src.icvn == '00501' else 'x12.control.00401.xml' logger.debug('X12 control file: %s' % (map_file)) control_map = pyx12.map_if.load_map_file(map_file, param) map_index_if = pyx12.map_index.map_index() node = control_map.getnodebypath('/ISA_LOOP/ISA') walker = walk_tree() icvn = fic = vriic = tspc = None #XXX Generate TA1 if needed. if fd_html: html = pyx12.error_html.error_html(errh, fd_html, src.get_term()) html.header() err_iter = pyx12.error_handler.err_iter(errh) if fd_xmldoc: xmldoc = pyx12.x12xml_simple.x12xml_simple( fd_xmldoc, param.get('simple_dtd')) #basedir = os.path.dirname(src_file) #erx = errh_xml.err_handler(basedir=basedir) valid = True for seg in src: #find node orig_node = node if seg.get_seg_id() == 'ISA': node = control_map.getnodebypath('/ISA_LOOP/ISA') elif seg.get_seg_id() == 'GS': node = control_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') else: try: (node, pop_loops, push_loops) = walker.walk(node, seg, errh, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) except pyx12.errors.EngineError: logger.error('Source file line %i' % (src.get_cur_line())) raise if node is None: node = orig_node else: if seg.get_seg_id() == 'ISA': errh.add_isa_loop(seg, src) icvn = seg.get_value('ISA12') errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'IEA': errh.handle_errors(src.pop_errors()) errh.close_isa_loop(node, seg, src) # Generate 997 #XXX Generate TA1 if needed. elif seg.get_seg_id() == 'GS': fic = seg.get_value('GS01') vriic = seg.get_value('GS08') map_file_new = map_index_if.get_filename(icvn, vriic, fic) if map_file != map_file_new: map_file = map_file_new if map_file is None: raise pyx12.errors.EngineError("Map not found. icvn=%s, fic=%s, vriic=%s" % (icvn, fic, vriic)) cur_map = pyx12.map_if.load_map_file(map_file, param) if cur_map.id == '837': src.check_837_lx = True else: src.check_837_lx = False logger.debug('Map file: %s' % (map_file)) apply_loop_count(orig_node, cur_map) reset_isa_counts(cur_map) reset_gs_counts(cur_map) node = cur_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') errh.add_gs_loop(seg, src) errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'BHT': if vriic in ('004010X094', '004010X094A1'): tspc = seg.get_value('BHT02') logger.debug('icvn=%s, fic=%s, vriic=%s, tspc=%s' % (icvn, fic, vriic, tspc)) map_file_new = map_index_if.get_filename( icvn, vriic, fic, tspc) logger.debug('New map file: %s' % (map_file_new)) if map_file != map_file_new: map_file = map_file_new if map_file is None: raise pyx12.errors.EngineError("Map not found. icvn=%s, fic=%s, vriic=%s, tspc=%s" % (icvn, fic, vriic, tspc)) cur_map = pyx12.map_if.load_map_file(map_file, param) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) apply_loop_count(node, cur_map) node = cur_map.getnodebypath('/ISA_LOOP/GS_LOOP/ST_LOOP/HEADER/BHT') errh.add_seg(node, seg, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'GE': errh.handle_errors(src.pop_errors()) errh.close_gs_loop(node, seg, src) elif seg.get_seg_id() == 'ST': errh.add_st_loop(seg, src) errh.handle_errors(src.pop_errors()) elif seg.get_seg_id() == 'SE': errh.handle_errors(src.pop_errors()) errh.close_st_loop(node, seg, src) else: errh.add_seg(node, seg, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) errh.handle_errors(src.pop_errors()) #errh.set_cur_line(src.get_cur_line()) valid &= node.is_valid(seg, errh) #erx.handleErrors(src.pop_errors()) #erx.handleErrors(errh.get_errors()) #errh.reset() if fd_html: if node is not None and node.is_first_seg_in_loop(): html.loop(node.get_parent()) err_node_list = [] while True: try: err_iter.next() err_node = err_iter.get_cur_node() err_node_list.append(err_node) except pyx12.errors.IterOutOfBounds: break html.gen_seg(seg, src, err_node_list) if fd_xmldoc: xmldoc.seg(node, seg) #erx.Write(src.cur_line) #erx.handleErrors(src.pop_errors()) src.cleanup() # Catch any skipped loop trailers errh.handle_errors(src.pop_errors()) #erx.handleErrors(src.pop_errors()) #erx.handleErrors(errh.get_errors()) if fd_html: html.footer() del html if fd_xmldoc: del xmldoc #visit_debug = pyx12.error_debug.error_debug_visitor(sys.stdout) #errh.accept(visit_debug) #If this transaction is not a 997/999, generate one. #import ipdb; ipdb.set_trace() if fd_997 and fic != 'FA': if vriic and vriic[:6] == '004010': visit_997 = pyx12.error_997.error_997_visitor(fd_997, src.get_term()) errh.accept(visit_997) del visit_997 if vriic and vriic[:6] == '005010': visit_999 = pyx12.error_999.error_999_visitor(fd_997, src.get_term()) errh.accept(visit_999) del visit_999 del node del src del control_map del cur_map try: if not valid or errh.get_error_count() > 0: return False else: return True except Exception: print(errh) return False
def setUp(self): self.walker = walk_tree() self.param = pyx12.params.params() self.map = pyx12.map_if.load_map_file('837Q3.I.5010.X223.A1.xml', self.param) self.errh = pyx12.error_handler.errh_null()
def x12n_iterator(param, src_file, map_path=None): logger = logging.getLogger('pyx12') errh = pyx12.error_handler.errh_null() # Get X12 DATA file try: src = pyx12.x12file.X12Reader(src_file) except pyx12.errors.X12Error: logger.error('"%s" does not look like an X12 data file' % (src_file)) return False #Get Map of Control Segments map_file = 'x12.control.00501.xml' if src.icvn == '00501' else 'x12.control.00401.xml' logger.debug('X12 control file: %s' % (map_file)) control_map = pyx12.map_if.load_map_file(map_file, param, map_path) map_index_if = pyx12.map_index.map_index(map_path) node = control_map.getnodebypath('/ISA_LOOP/ISA') walker = walk_tree() icvn = fic = vriic = tspc = None cur_map = None # we do not initially know the X12 transaction type res = {} res_ordinal = 0 last_x12_segment_path = None for seg in src: #find node orig_node = node if False: print('--------------------------------------------') print(seg) print('--------------------------------------------') # reset to control map for ISA and GS loops print('------- counters before --------') print(walker.counter._dict) if seg.get_seg_id() == 'ISA': node = control_map.getnodebypath('/ISA_LOOP/ISA') walker.forceWalkCounterToLoopStart('/ISA_LOOP', '/ISA_LOOP/ISA') elif seg.get_seg_id() == 'GS': node = control_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') walker.forceWalkCounterToLoopStart('/ISA_LOOP/GS_LOOP', '/ISA_LOOP/GS_LOOP/GS') else: # from the current node, find the map node matching the segment # keep track of the loops traversed try: (node, pop_loops, push_loops) = walker.walk(node, seg, errh, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) except pyx12.errors.EngineError: logger.error('Source file line %i' % (src.get_cur_line())) raise if False: print('------- counters after --------') print(walker.counter._dict) if node is None: node = orig_node else: if seg.get_seg_id() == 'ISA': icvn = seg.get_value('ISA12') elif seg.get_seg_id() == 'IEA': pass elif seg.get_seg_id() == 'GS': fic = seg.get_value('GS01') vriic = seg.get_value('GS08') map_file_new = map_index_if.get_filename(icvn, vriic, fic) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}".format( icvn, fic, vriic) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file( map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) node = cur_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') pass elif seg.get_seg_id() == 'BHT': # special case for 4010 837P if vriic in ('004010X094', '004010X094A1'): tspc = seg.get_value('BHT02') logger.debug('icvn=%s, fic=%s, vriic=%s, tspc=%s' % (icvn, fic, vriic, tspc)) map_file_new = map_index_if.get_filename( icvn, vriic, fic, tspc) logger.debug('New map file: %s' % (map_file_new)) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}, tspc={}".format( icvn, fic, vriic, tspc) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file( map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) #apply_loop_count(node, cur_map) node = cur_map.getnodebypath( '/ISA_LOOP/GS_LOOP/ST_LOOP/HEADER/BHT') #elif seg.get_seg_id() == 'GE': # pass #elif seg.get_seg_id() == 'ST': # pass #elif seg.get_seg_id() == 'SE': # pass else: pass x12path = node.get_path() #parent if x12path in res: res[x12path]['Count'] += 1 if last_x12_segment_path not in res[x12path]['prefix_nodes']: res[x12path]['prefix_nodes'].append(last_x12_segment_path) else: res[x12path] = { 'Ordinal': res_ordinal, 'Count': 1, 'NodeType': node.base_name, 'Id': node.id, 'Name': node.name, 'FormattedName': clean_name(node.name), 'ParentName': clean_name(node.parent.name), 'LoopMaxUse': node.max_use, 'ParentPath': node.parent.get_path(), 'prefix_nodes': [last_x12_segment_path] } res_ordinal += 1 for (refdes, ele_ord, comp_ord, val) in seg.values_iterator(): elepath = node.parent.get_path() + '/' + refdes if elepath in res: res[elepath]['Count'] += 1 else: ele_node = node.getnodebypath2(refdes) #node.get_child_node_by_ordinal( res[elepath] = { 'Ordinal': res_ordinal, 'Count': 1, 'NodeType': ele_node.base_name, 'Id': ele_node.id, 'Name': ele_node.name, 'FormattedName': clean_name(ele_node.name), 'ParentName': clean_name(ele_node.parent.name), #'max_use': ele_node.max_use, 'ParentPath': ele_node.parent.get_path(), 'Usage': ele_node.usage, 'DataType': ele_node.data_type, 'MinLength': ele_node.min_len, 'MaxLength': ele_node.max_len, } res_ordinal += 1 #print (refdes, val) last_x12_segment_path = x12path del node del src del control_map try: del cur_map except UnboundLocalError: pass return res
def get_x12file_metadata(param, src_file, map_path=None, do_node_summary=False): logger = logging.getLogger('pyx12') errh = pyx12.error_handler.errh_null() # Get X12 DATA file try: src = pyx12.x12file.X12Reader(src_file) except pyx12.errors.X12Error: logger.error('"%s" does not look like an X12 data file' % (src_file)) return (False, None, None) #Get Map of Control Segments map_file = 'x12.control.00501.xml' if src.icvn == '00501' else 'x12.control.00401.xml' logger.debug('X12 control file: %s' % (map_file)) control_map = pyx12.map_if.load_map_file(map_file, param, map_path) map_index_if = pyx12.map_index.map_index(map_path) node = control_map.getnodebypath('/ISA_LOOP/ISA') walker = walk_tree() icvn = fic = vriic = tspc = None cur_map = None # we do not initially know the X12 transaction type isa_data = {} if do_node_summary: node_summary = {} node_ordinal = 0 last_x12_segment_path = None else: node_summary = None for seg in src: orig_node = node if seg.get_seg_id() == 'ISA': node = control_map.getnodebypath('/ISA_LOOP/ISA') walker.forceWalkCounterToLoopStart('/ISA_LOOP', '/ISA_LOOP/ISA') elif seg.get_seg_id() == 'GS': node = control_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') walker.forceWalkCounterToLoopStart('/ISA_LOOP/GS_LOOP', '/ISA_LOOP/GS_LOOP/GS') else: # from the current node, find the map node matching the segment # keep track of the loops traversed try: (node, pop_loops, push_loops) = walker.walk(node, seg, errh, src.get_seg_count(), src.get_cur_line(), src.get_ls_id()) except pyx12.errors.EngineError: logger.error('Source file line %i' % (src.get_cur_line())) raise if node is None: raise pyx12.errors.EngineError("Node not found") node = orig_node if seg.get_seg_id() == 'ISA': icvn = seg.get_value('ISA12') elif seg.get_seg_id() == 'IEA': pass elif seg.get_seg_id() == 'GS': fic = seg.get_value('GS01') vriic = seg.get_value('GS08') map_file_new = map_index_if.get_filename(icvn, vriic, fic) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}".format( icvn, fic, vriic) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file(map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) node = cur_map.getnodebypath('/ISA_LOOP/GS_LOOP/GS') pass elif seg.get_seg_id() == 'BHT': # special case for 4010 837P if vriic in ('004010X094', '004010X094A1'): tspc = seg.get_value('BHT02') logger.debug('icvn=%s, fic=%s, vriic=%s, tspc=%s' % (icvn, fic, vriic, tspc)) map_file_new = map_index_if.get_filename( icvn, vriic, fic, tspc) logger.debug('New map file: %s' % (map_file_new)) if map_file != map_file_new: map_file = map_file_new if map_file is None: err_str = "Map not found. icvn={}, fic={}, vriic={}, tspc={}".format( icvn, fic, vriic, tspc) raise pyx12.errors.EngineError(err_str) cur_map = pyx12.map_if.load_map_file( map_file, param, map_path) src.check_837_lx = True if cur_map.id == '837' else False logger.debug('Map file: %s' % (map_file)) node = cur_map.getnodebypath( '/ISA_LOOP/GS_LOOP/ST_LOOP/HEADER/BHT') if seg.get_seg_id() == 'ISA': isa_data = { 'InterchangeSenderIDQualifier': seg.get_value('ISA05'), 'InterchangeSenderID': seg.get_value('ISA06'), 'InterchangeReceiverIDQualifier': seg.get_value('ISA07'), 'InterchangeReceiverID': seg.get_value('ISA08'), 'InterchangeDate': seg.get_value('ISA09'), 'InterchangeTime': seg.get_value('ISA10'), 'InterchangeControlStandardsIdentifier': seg.get_value('ISA11'), 'InterchangeControlVersionNumber': seg.get_value('ISA12'), 'InterchangeControlNumber': seg.get_value('ISA13'), 'AcknowledgmentRequested': seg.get_value('ISA14'), 'UsageIndicator': seg.get_value('ISA15'), 'GSLoops': [] } icvn = isa_data['InterchangeControlVersionNumber'] elif seg.get_seg_id() == 'IEA': isa_data['NumberofIncludedFunctionalGroups'] = seg.get_value( 'IEA01') elif seg.get_seg_id() == 'GS': gs_data = { 'FunctionalGroupHeader': seg.get_value('GS01'), 'ApplicationSendersCode': seg.get_value('GS02'), 'ApplicationReceiversCode': seg.get_value('GS03'), 'FunctionalGroupDate': seg.get_value('GS04'), 'FunctionalGroupTime': seg.get_value('GS05'), 'GroupControlNumber': seg.get_value('GS06'), 'ResponsibleAgencyCode': seg.get_value('GS07'), 'VersionReleaseIndustryIdentifierCode': seg.get_value('GS08'), 'STLoops': [] } elif seg.get_seg_id() == 'GE': gs_data['NumberofTransactionSetsIncluded'] = seg.get_value('GE01') isa_data['GSLoops'].append(gs_data) elif seg.get_seg_id() == 'ST': st_data = { 'TransactionSetIdentifierCode': seg.get_value('ST01'), 'TransactionSetControlNumber': seg.get_value('ST02'), 'ImplementationConventionReference': seg.get_value('ST03'), } elif seg.get_seg_id() == 'SE': st_data['TransactionSegmentCount'] = seg.get_value('SE01') gs_data['STLoops'].append(st_data) elif seg.get_seg_id() == 'BHT': st_data['HierarchicalStructureCode'] = seg.get_value('BHT01') st_data['TransactionSetPurposeCode'] = seg.get_value('BHT02') st_data[ 'OriginatorApplicationTransactionIdentifier'] = seg.get_value( 'BHT03') st_data['TransactionSetCreationDate'] = seg.get_value('BHT04') st_data['TransactionSetCreationTime'] = seg.get_value('BHT05') st_data['ClaimorEncounterIdentifier'] = seg.get_value('BHT06') x12path = node.get_path() #parent if do_node_summary: if x12path in node_summary: node_summary[x12path]['Count'] += 1 if last_x12_segment_path not in node_summary[x12path][ 'prefix_nodes']: node_summary[x12path]['prefix_nodes'].append( last_x12_segment_path) else: node_summary[x12path] = { 'Ordinal': node_ordinal, 'Count': 1, 'NodeType': node.base_name, 'Id': node.id, 'Name': node.name, 'ParentName': node.parent.name, 'LoopMaxUse': node.max_use, 'ParentPath': node.parent.get_path(), 'prefix_nodes': [last_x12_segment_path] } node_ordinal += 1 for (refdes, ele_ord, comp_ord, val) in seg.values_iterator(): ele_node = node.getnodebypath2(refdes) if ele_node.is_composite(): ele_node = ele_node.get_child_node_by_ordinal(1) elepath = ele_node.get_path() if elepath in node_summary: node_summary[elepath]['Count'] += 1 else: node_summary[elepath] = { 'Ordinal': node_ordinal, 'Count': 1, 'NodeType': ele_node.base_name, 'Id': ele_node.id, 'Name': ele_node.name, 'ParentName': ele_node.parent.name, 'ParentPath': ele_node.parent.get_path(), 'Usage': ele_node.usage, 'DataType': ele_node.data_type, 'MinLength': ele_node.min_len, 'MaxLength': ele_node.max_len, } node_ordinal += 1 last_x12_segment_path = x12path return (True, isa_data, node_summary)