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 iter_segments(self, loop_id=None): """ Simple segment or tree iterator @return: X12 Data Node - simple segment or tree @rtype: L{node<x12context.X12DataNode>} """ cur_tree = None cur_data_node = None for seg in self.src: #find node orig_node = self.x12_map_node pop_loops = [] push_loops = [] errh = error_handler.errh_list() if seg.get_seg_id() == 'ISA': tpath = '/ISA_LOOP/ISA' self.x12_map_node = self.control_map.getnodebypath(tpath) elif seg.get_seg_id() == 'GS': tpath = '/ISA_LOOP/GS_LOOP/GS' self.x12_map_node = self.control_map.getnodebypath(tpath) else: try: (seg_node, pop_loops, push_loops) = self.walker.walk(self.x12_map_node, seg, errh, self.src.get_seg_count(), self.src.get_cur_line(), self.src.get_ls_id()) self.x12_map_node = seg_node except errors.EngineError: raise if self.x12_map_node is None: self.x12_map_node = orig_node else: seg_id = seg.get_seg_id() if seg_id == 'ISA': icvn = seg.get_value('ISA12') elif seg_id == 'GS': fic = seg.get_value('GS01') vriic = seg.get_value('GS08') map_file_new = self.map_index_if.get_filename(icvn, vriic, fic) if self.map_file != map_file_new: self.map_file = map_file_new if self.map_file is None: raise pyx12.errors.EngineError("Map not found. icvn=%s, fic=%s, vriic=%s" % (icvn, fic, vriic)) cur_map = map_if.load_map_file(self.map_file, self.param, self.map_path) if cur_map.id == '837': self.src.check_837_lx = True else: self.src.check_837_lx = False #self._apply_loop_count(orig_node, cur_map) #self._reset_isa_counts(cur_map) self._reset_counter_to_isa_counts() #self._reset_gs_counts(cur_map) self._reset_counter_to_gs_counts() tpath = '/ISA_LOOP/GS_LOOP/GS' self.x12_map_node = cur_map.getnodebypath(tpath) #self.walker.forceWalkCounterToLoopStart('/ISA_LOOP/GS_LOOP', '/ISA_LOOP/GS_LOOP/GS') elif seg_id == 'BHT': if vriic in ('004010X094', '004010X094A1'): tspc = seg.get_value('BHT02') map_file_new = self.map_index_if.get_filename(icvn, vriic, fic, tspc) if self.map_file != map_file_new: self.map_file = map_file_new if self.map_file is None: err_str = "Map not found. icvn=%s, fic=%s, vriic=%s, tspc=%s" % \ (icvn, fic, vriic, tspc) raise pyx12.errors.EngineError(err_str) cur_map = map_if.load_map_file(self.map_file, self.param, self.map_path) if cur_map.id == '837': self.src.check_837_lx = True else: self.src.check_837_lx = False self._apply_loop_count(self.x12_map_node, cur_map) tpath = '/ISA_LOOP/GS_LOOP/ST_LOOP/HEADER/BHT' self.x12_map_node = cur_map.getnodebypath(tpath) node_x12path = self.x12_map_node.x12path # If we are in the requested tree, wait until we have the whole thing if loop_id is not None and loop_id in node_x12path.loop_list: # Are we at the start of the requested tree? if node_x12path.loop_list[-1] == loop_id and \ self.x12_map_node.is_first_seg_in_loop(): if cur_tree is not None: # Found root loop repeat. Yield existing, create new tree yield cur_tree # Make new tree on parent loop #pop_loops = get_pop_loops(cur_data_node.x12_map_node, self.x12_map_node) #pop_loops = [x12_node for x12_node in pop_loops if x12_node.get_path().find(loop_id) == -1] cur_tree = X12LoopDataNode(x12_node=self.x12_map_node.parent, end_loops=pop_loops) # parent=cur_data_node) cur_data_node = self._add_segment(cur_tree, self.x12_map_node, seg, pop_loops, push_loops) else: if cur_data_node is None or self.x12_map_node is None: raise errors.EngineError('Either cur_data_node or self.x12_map_node is None') cur_data_node = self._add_segment(cur_data_node, self.x12_map_node, seg, pop_loops, push_loops) else: if cur_tree is not None: # We have completed a tree yield cur_tree cur_tree = None if cur_data_node is not None: #push_loops = get_push_loops(cur_data_node.x12_map_node, self.x12_map_node) #pop_loops = get_pop_loops(cur_data_node.x12_map_node, self.x12_map_node) if loop_id: pop_loops = [x12_node for x12_node in pop_loops if x12_node.get_path().find(loop_id) == -1] assert loop_id not in [x12.id for x12 in push_loops], 'Loop ID %s should not be in push loops' % (loop_id) assert loop_id not in [x12.id for x12 in pop_loops], 'Loop ID %s should not be in pop loops' % (loop_id) cur_data_node = X12SegmentDataNode(self.x12_map_node, seg, push_loops, pop_loops) else: cur_data_node = X12SegmentDataNode(self.x12_map_node, seg) # Get errors caught by x12Reader errh.handle_errors(self.src.pop_errors()) # Handle errors captured in errh_list cur_data_node.handle_errh_errors(errh) if cur_data_node.id != 'ISA' and cur_data_node is not None: assert cur_data_node.parent is not None, 'Node "%s" has no parent' % (cur_data_node.id) yield cur_data_node
def iter_segments(self, loop_id=None): """ Simple segment or tree iterator @return: X12 Data Node - simple segment or tree @rtype: L{node<x12context.X12DataNode>} """ cur_tree = None cur_data_node = None for seg in self.src: #find node orig_node = self.x12_map_node pop_loops = [] push_loops = [] errh = error_handler.errh_list() if seg.get_seg_id() == 'ISA': tpath = '/ISA_LOOP/ISA' self.x12_map_node = self.control_map.getnodebypath(tpath) elif seg.get_seg_id() == 'GS': tpath = '/ISA_LOOP/GS_LOOP/GS' self.x12_map_node = self.control_map.getnodebypath(tpath) else: try: (seg_node, pop_loops, push_loops) = self.walker.walk(self.x12_map_node, seg, errh, self.src.get_seg_count(), self.src.get_cur_line(), self.src.get_ls_id()) self.x12_map_node = seg_node except errors.EngineError: raise if self.x12_map_node is None: self.x12_map_node = orig_node else: seg_id = seg.get_seg_id() if seg_id == 'ISA': icvn = seg.get_value('ISA12') elif seg_id == 'GS': fic = seg.get_value('GS01') vriic = seg.get_value('GS08') map_file_new = self.map_index_if.get_filename( icvn, vriic, fic) if self.map_file != map_file_new: self.map_file = map_file_new if self.map_file is None: raise pyx12.errors.EngineError( "Map not found. icvn=%s, fic=%s, vriic=%s" % (icvn, fic, vriic)) cur_map = map_if.load_map_file(self.map_file, self.param, self.map_path) if cur_map.id == '837': self.src.check_837_lx = True else: self.src.check_837_lx = False #self._apply_loop_count(orig_node, cur_map) #self._reset_isa_counts(cur_map) self._reset_counter_to_isa_counts() #self._reset_gs_counts(cur_map) self._reset_counter_to_gs_counts() tpath = '/ISA_LOOP/GS_LOOP/GS' self.x12_map_node = cur_map.getnodebypath(tpath) #self.walker.forceWalkCounterToLoopStart('/ISA_LOOP/GS_LOOP', '/ISA_LOOP/GS_LOOP/GS') elif seg_id == 'BHT': if vriic in ('004010X094', '004010X094A1'): tspc = seg.get_value('BHT02') map_file_new = self.map_index_if.get_filename( icvn, vriic, fic, tspc) if self.map_file != map_file_new: self.map_file = map_file_new if self.map_file is None: err_str = "Map not found. icvn=%s, fic=%s, vriic=%s, tspc=%s" % \ (icvn, fic, vriic, tspc) raise pyx12.errors.EngineError(err_str) cur_map = map_if.load_map_file( self.map_file, self.param, self.map_path) if cur_map.id == '837': self.src.check_837_lx = True else: self.src.check_837_lx = False self._apply_loop_count(self.x12_map_node, cur_map) tpath = '/ISA_LOOP/GS_LOOP/ST_LOOP/HEADER/BHT' self.x12_map_node = cur_map.getnodebypath(tpath) node_x12path = self.x12_map_node.x12path # If we are in the requested tree, wait until we have the whole thing if loop_id is not None and loop_id in node_x12path.loop_list: # Are we at the start of the requested tree? if node_x12path.loop_list[-1] == loop_id and \ self.x12_map_node.is_first_seg_in_loop(): if cur_tree is not None: # Found root loop repeat. Yield existing, create new tree yield cur_tree # Make new tree on parent loop #pop_loops = get_pop_loops(cur_data_node.x12_map_node, self.x12_map_node) #pop_loops = [x12_node for x12_node in pop_loops if x12_node.get_path().find(loop_id) == -1] cur_tree = X12LoopDataNode( x12_node=self.x12_map_node.parent, end_loops=pop_loops) # parent=cur_data_node) cur_data_node = self._add_segment(cur_tree, self.x12_map_node, seg, pop_loops, push_loops) else: if cur_data_node is None or self.x12_map_node is None: raise errors.EngineError( 'Either cur_data_node or self.x12_map_node is None' ) cur_data_node = self._add_segment(cur_data_node, self.x12_map_node, seg, pop_loops, push_loops) else: if cur_tree is not None: # We have completed a tree yield cur_tree cur_tree = None if cur_data_node is not None: #push_loops = get_push_loops(cur_data_node.x12_map_node, self.x12_map_node) #pop_loops = get_pop_loops(cur_data_node.x12_map_node, self.x12_map_node) if loop_id: pop_loops = [ x12_node for x12_node in pop_loops if x12_node.get_path().find(loop_id) == -1 ] assert loop_id not in [ x12.id for x12 in push_loops ], 'Loop ID %s should not be in push loops' % (loop_id) assert loop_id not in [ x12.id for x12 in pop_loops ], 'Loop ID %s should not be in pop loops' % (loop_id) cur_data_node = X12SegmentDataNode(self.x12_map_node, seg, push_loops, pop_loops) else: cur_data_node = X12SegmentDataNode(self.x12_map_node, seg) # Get errors caught by x12Reader errh.handle_errors(self.src.pop_errors()) # Handle errors captured in errh_list cur_data_node.handle_errh_errors(errh) if cur_data_node.id != 'ISA' and cur_data_node is not None: assert cur_data_node.parent is not None, 'Node "%s" has no parent' % ( cur_data_node.id) yield cur_data_node