Пример #1
0
    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()
Пример #2
0
    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)
Пример #3
0
    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()
Пример #4
0
    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()
Пример #5
0
    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'])
Пример #6
0
    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()
Пример #7
0
    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()
Пример #8
0
    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')
Пример #9
0
    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()
Пример #10
0
    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()
Пример #11
0
    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')
Пример #12
0
    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
Пример #13
0
    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)
Пример #14
0
    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)
Пример #15
0
 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'])
Пример #16
0
 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'])
Пример #17
0
    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
Пример #18
0
    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'])
Пример #19
0
    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
Пример #20
0
    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'])
Пример #21
0
    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'])
Пример #22
0
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
Пример #23
0
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
Пример #24
0
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)
Пример #25
0
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
Пример #26
0
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
Пример #27
0
 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()
Пример #28
0
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
Пример #29
0
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)