import numpy as np from .. import parser from datetime import datetime @parser(element='NM1',x12='*', anchor={'41':'submitter','40':'receiver','82':'rendering_provider','85':'billing_provider','87':'pay_to_provider','IL':'patient','PR':'payer','QC':'patient','DN':'referring_provider','77':'provider','2':'billing_provider'}, map={1:'type',3:'name',-1:'id'}) def NM1 (**_args): """ Expected Element NM1 ref IL,40,41,82,85,PR ... Information about entities (doctors, clearing house, provider). we should be mindful of the references """ # _CODE_INDEX = 1 # CONTEXT_MAP = { # '2':{'field':'payer'}, # 'PR':{'field':'payer'}, # '41':{'field':'header'}, # '45':{'field':'ambulance_location'}, # 'IL':{'field':'patient','map':{'type':2,'first_name':4,'last_name':3}}, # 'P5':{'field':'plan_sponsor'}, # '82':{'field':'rendering_provider','map':{'type':2,'first_name':4,'last_name':3}}, # '85':{'field':'billing_provider'}, # } # _args ['plugin-context'] = {'@ref':CONTEXT_MAP} # # _map = {_CODE_INDEX:{'41':'submitter','40':'receiver','PR':'payer'}} # _columns = ['type','name','id'] # _indexes = [1,3,-1] # # _info = [{'index':'40','field':'receiver'},{'index':'41','field':'submitter'},{'index':'PR','field':'payer'}] # _pointer = _args['parser'] # _info = _pointer(_columns,_indexes,**_args) # self.lastelement = _info # return _info pass @parser(element='N3',x12='837', parent='NM1',map={1:'address_line_1',2:'address_line_2'}) def N3 (**_args): """ Expected Element N3 """ pass # _columns = ['address_line_1'] # return self.parse(_columns,[1,2],**_args) @parser(element='N4',x12='*',parent='NM1',map={1:'city',2:'state',3:'zipcode'}) def N4(**_args): """ Expected Element N4 """ # _columns = ['city','state','zip'] # return self.parse(_columns,[1,2,3],**_args) pass @parser(element='HI',x12='837', map={1:'type',2:'code'}) def HI(**_args): """ Expected Element HI This function will parse diagnosis codes ICD 9/10 """ # _columns = ['code','type'] # return self.parse(_columns,[2,1],**_args) pass @parser(element='AMT',x12='837',map={2:'patient_amount',1:'patient_amount_qualifier'}) def AMT (**_args): """ Expected Element AMT """ # _columns = ['amount','qualifier'] # return self.parse(_columns,[2,1],**_args) pass @parser(element='SBR',x12='837',field='subscriber',map={9:'vendor',2:'individual_code',1:'type'}) def SBR (**_args): """ Expected Element SBR """ # _index = [9,1] # _columns = ['vendor','individual_code','type'] # return self.parse(_columns,[9,2,1],**_args) pass @parser(element='DMG',x12='837', field='patient',map={2:'dob',3:'gender',1:'format'}) def DMG (**_args): """ Expected Element DMG, these need to be stored in a patient object """ _data = _args['data'] _y = _data['dob'][:4] _m= _data['dob'][4:6] _d = _data['dob'][6:].strip() _data['dob'] = datetime(year=int(_y), month=int(_m),day=int(_d)) return _data # _columns = ['dob','gender','format'] # _info = self.parse(_columns,[2,3,1],**_args) # return {'patient':_info} pass @parser(element='DTP', x12='837', field='date',map={3:['to','from']}) def DTP (**_args): """ Expected Element DTP """ # _columns = ['to','from','type'] # return self.parse(_columns,[3],**_args) _data = _args['data'] _data['to'] = '-'.join([_data['to'][:4],_data['to'][4:6],_data['to'][6:]]) _data['from'] = '-'.join([_data['from'][:4],_data['from'][4:6],_data['from'][6:]]) return _data pass @parser(element='PER',anchor={'IC':'submitter'},map={2:'contact',4:'phone_number',8:'email'}) def PER (**_args): """ Expected Element PER """ # _CODE_INDEX = 1 # _map = {_CODE_INDEX:{'IC':'submitter'}} # attribute to store the data in # _columns = ['contact_name','phone','email'] # _info = self.parse (_columns,[2,4,8],**_args) # # @TODO: Inspect the configuration file for the attribute information # # return _info pass @parser(element='CLM',x12='837',map={1:'claim_id',2:'claim_amount',5:'facility_code',5:'facility_qualifier',5:'frequency_code'}) def CLM (**_args): """ Expected Element CLM """ _data = _args['data'] _data['claim_amount'] = np.float64(_data['claim_amount']) return _data # _columns = ['claim_id','claim_amount','facility_code','facility_qualifier','frequency_code'] # return self.parse(_columns,[1,2,5,5,5],**_args) pass # @parser(element='REF', field='ref',map={2:'id'}) def REF (**_args): # print (_args) _columns = ['identifier','qualifier',''] # _CODE_INDEX = 1 # -- according to x12 standard # _map = {_CODE_INDEX:{'EA':'patient','EI':'provider','6R':'','D9':''}} # return self.parse(_columns,[2],**_args) pass @parser(element='HI',x12='837',container='diagnosis',map={1:'code',2:'type'}) def HI (**_args): """ Expected Element HI """ # _columns = ['code','type'] # return self.parse(_columns,[1,2],**_args) _data = _args['data'] if ':' in _data['code'] : _data['type'],_data['code'] = _data['code'].split(':') return _data @parser(element=['SV1','SV3'],x12='837',container='procedures',map={1:['type','code'],2:'amount'}) def SV1 (**_args): """ Expected Element SV1 """ # _row = _args['row'] if type(_args['row']) == list else _args['row'].split('*') # _columns = ['type','code','amount','modifier_1','modifier_2','modifier_3','modifier_4','place_of_service','units','measurement'] # return self.parse(_columns,[1,1,2,1,1,1,1,5,4,3],**_args) _data = _args['data'] if 'type' in _data : _data['type'] = _data['type'].split(':')[0] _data['code'] = _data['code'].split(':')[1] _data['amount']= np.float64(_data['amount']) return _data pass @parser (element='HL',x12='837', field='patient', map={1:'_index',2:'parent_code',3:'level_code',4:'child_code'}) def HL (**_args) : """, Expected Element HL The expected block is supposed to be unprocessed (to make things simple) """ pass # _data = _args['data'] # _data['_index'] = int(_data['_index']) # return _data # # _row = _args['row'] if type(_args['row']) == list else _args['row'].split('~') # # _attr = self.elements() #[_name for _name in dir() if not _name.islower() and not _name.startswith('_')] # # _pointers = [getattr(_name) for _name in _attr] # # _map = dict(zip(_attr,_pointers)) # _map = self.pointers() # # # # The index here tells us what we are processing i.e index == 1 something about header # # # _columns = ['_index','parent','code','child'] # # _args['row'] = _row[0] # _info = self.parse (_columns,[1,2,3,4],**_args) # # _field = 'billing_provider' if _info['_index'] == '1' else 'patient' # # _config ={'field':_field} # return _info