claims.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import numpy as np
  2. from .. import parser
  3. from datetime import datetime
  4. @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'})
  5. def NM1 (**_args):
  6. """
  7. Expected Element NM1
  8. ref IL,40,41,82,85,PR ...
  9. Information about entities (doctors, clearing house, provider). we should be mindful of the references
  10. """
  11. # _CODE_INDEX = 1
  12. # CONTEXT_MAP = {
  13. # '2':{'field':'payer'},
  14. # 'PR':{'field':'payer'},
  15. # '41':{'field':'header'},
  16. # '45':{'field':'ambulance_location'},
  17. # 'IL':{'field':'patient','map':{'type':2,'first_name':4,'last_name':3}},
  18. # 'P5':{'field':'plan_sponsor'},
  19. # '82':{'field':'rendering_provider','map':{'type':2,'first_name':4,'last_name':3}},
  20. # '85':{'field':'billing_provider'},
  21. # }
  22. # _args ['plugin-context'] = {'@ref':CONTEXT_MAP}
  23. # # _map = {_CODE_INDEX:{'41':'submitter','40':'receiver','PR':'payer'}}
  24. # _columns = ['type','name','id']
  25. # _indexes = [1,3,-1]
  26. # # _info = [{'index':'40','field':'receiver'},{'index':'41','field':'submitter'},{'index':'PR','field':'payer'}]
  27. # _pointer = _args['parser']
  28. # _info = _pointer(_columns,_indexes,**_args)
  29. # self.lastelement = _info
  30. # return _info
  31. pass
  32. @parser(element='N3',x12='837', parent='NM1',map={1:'address_line_1',2:'address_line_2'})
  33. def N3 (**_args):
  34. """
  35. Expected Element N3
  36. """
  37. pass
  38. # _columns = ['address_line_1']
  39. # return self.parse(_columns,[1,2],**_args)
  40. @parser(element='N4',x12='*',parent='NM1',map={1:'city',2:'state',3:'zipcode'})
  41. def N4(**_args):
  42. """
  43. Expected Element N4
  44. """
  45. # _columns = ['city','state','zip']
  46. # return self.parse(_columns,[1,2,3],**_args)
  47. pass
  48. @parser(element='HI',x12='837', map={1:'type',2:'code'})
  49. def HI(**_args):
  50. """
  51. Expected Element HI
  52. This function will parse diagnosis codes ICD 9/10
  53. """
  54. # _columns = ['code','type']
  55. # return self.parse(_columns,[2,1],**_args)
  56. pass
  57. @parser(element='AMT',x12='837',map={2:'patient_amount',1:'patient_amount_qualifier'})
  58. def AMT (**_args):
  59. """
  60. Expected Element AMT
  61. """
  62. # _columns = ['amount','qualifier']
  63. # return self.parse(_columns,[2,1],**_args)
  64. pass
  65. @parser(element='SBR',x12='837',field='subscriber',map={9:'vendor',2:'individual_code',1:'type'})
  66. def SBR (**_args):
  67. """
  68. Expected Element SBR
  69. """
  70. # _index = [9,1]
  71. # _columns = ['vendor','individual_code','type']
  72. # return self.parse(_columns,[9,2,1],**_args)
  73. pass
  74. @parser(element='DMG',x12='837', field='patient',map={2:'dob',3:'gender',1:'format'})
  75. def DMG (**_args):
  76. """
  77. Expected Element DMG, these need to be stored in a patient object
  78. """
  79. _data = _args['data']
  80. _y = _data['dob'][:4]
  81. _m= _data['dob'][4:6]
  82. _d = _data['dob'][6:].strip()
  83. _data['dob'] = datetime(year=int(_y), month=int(_m),day=int(_d))
  84. return _data
  85. # _columns = ['dob','gender','format']
  86. # _info = self.parse(_columns,[2,3,1],**_args)
  87. # return {'patient':_info}
  88. pass
  89. @parser(element='DTP', x12='837', field='date',map={3:['to','from']})
  90. def DTP (**_args):
  91. """
  92. Expected Element DTP
  93. """
  94. # _columns = ['to','from','type']
  95. # return self.parse(_columns,[3],**_args)
  96. _data = _args['data']
  97. _data['to'] = '-'.join([_data['to'][:4],_data['to'][4:6],_data['to'][6:]])
  98. _data['from'] = '-'.join([_data['from'][:4],_data['from'][4:6],_data['from'][6:]])
  99. return _data
  100. pass
  101. @parser(element='PER',anchor={'IC':'submitter'},map={2:'contact',4:'phone_number',8:'email'})
  102. def PER (**_args):
  103. """
  104. Expected Element PER
  105. """
  106. # _CODE_INDEX = 1
  107. # _map = {_CODE_INDEX:{'IC':'submitter'}} # attribute to store the data in
  108. # _columns = ['contact_name','phone','email']
  109. # _info = self.parse (_columns,[2,4,8],**_args)
  110. #
  111. # @TODO: Inspect the configuration file for the attribute information
  112. #
  113. # return _info
  114. pass
  115. @parser(element='CLM',x12='837',map={1:'claim_id',2:'claim_amount',5:'facility_code',5:'facility_qualifier',5:'frequency_code'})
  116. def CLM (**_args):
  117. """
  118. Expected Element CLM
  119. """
  120. _data = _args['data']
  121. _data['claim_amount'] = np.float64(_data['claim_amount'])
  122. return _data
  123. # _columns = ['claim_id','claim_amount','facility_code','facility_qualifier','frequency_code']
  124. # return self.parse(_columns,[1,2,5,5,5],**_args)
  125. pass
  126. # @parser(element='REF', field='ref',map={2:'id'})
  127. def REF (**_args):
  128. # print (_args)
  129. _columns = ['identifier','qualifier','']
  130. # _CODE_INDEX = 1 # -- according to x12 standard
  131. # _map = {_CODE_INDEX:{'EA':'patient','EI':'provider','6R':'','D9':''}}
  132. # return self.parse(_columns,[2],**_args)
  133. pass
  134. @parser(element='HI',x12='837',container='diagnosis',map={1:'code',2:'type'})
  135. def HI (**_args):
  136. """
  137. Expected Element HI
  138. """
  139. # _columns = ['code','type']
  140. # return self.parse(_columns,[1,2],**_args)
  141. _data = _args['data']
  142. if ':' in _data['code'] :
  143. _data['type'],_data['code'] = _data['code'].split(':')
  144. return _data
  145. @parser(element=['SV1','SV3'],x12='837',container='procedures',map={1:['type','code'],2:'amount'})
  146. def SV1 (**_args):
  147. """
  148. Expected Element SV1
  149. """
  150. # _row = _args['row'] if type(_args['row']) == list else _args['row'].split('*')
  151. # _columns = ['type','code','amount','modifier_1','modifier_2','modifier_3','modifier_4','place_of_service','units','measurement']
  152. # return self.parse(_columns,[1,1,2,1,1,1,1,5,4,3],**_args)
  153. _data = _args['data']
  154. if 'type' in _data :
  155. _data['type'] = _data['type'].split(':')[0]
  156. _data['code'] = _data['code'].split(':')[1]
  157. _data['amount']= np.float64(_data['amount'])
  158. return _data
  159. pass
  160. @parser (element='HL',x12='837', field='patient', map={1:'_index',2:'parent_code',3:'level_code',4:'child_code'})
  161. def HL (**_args) :
  162. """,
  163. Expected Element HL
  164. The expected block is supposed to be unprocessed (to make things simple)
  165. """
  166. pass
  167. # _data = _args['data']
  168. # _data['_index'] = int(_data['_index'])
  169. # return _data
  170. # # _row = _args['row'] if type(_args['row']) == list else _args['row'].split('~')
  171. # # _attr = self.elements() #[_name for _name in dir() if not _name.islower() and not _name.startswith('_')]
  172. # # _pointers = [getattr(_name) for _name in _attr]
  173. # # _map = dict(zip(_attr,_pointers))
  174. # _map = self.pointers()
  175. # #
  176. # # The index here tells us what we are processing i.e index == 1 something about header
  177. # #
  178. # _columns = ['_index','parent','code','child']
  179. # # _args['row'] = _row[0]
  180. # _info = self.parse (_columns,[1,2,3,4],**_args)
  181. # # _field = 'billing_provider' if _info['_index'] == '1' else 'patient'
  182. # # _config ={'field':_field}
  183. # return _info