Package Gnumed :: Package business :: Module gmCA_MSVA
[frames] | no frames]

Source Code for Module Gnumed.business.gmCA_MSVA

  1  """GNUmed to MSVA (Canada) connector classes. 
  2   
  3  Jim's notes: 
  4   
  5  - source directory will reside on a Windows NTFS file system volume. 
  6  - end-of-Record will be designated by Carriage Return and Line Feed 
  7  - character set is "plain Western" (ISO Latin 1) 
  8  - record mockup: 
  9   
 10  FIRSTNAME           XXLASTNAME                 912345677300BC    196012251234512345M6       ADDRESS_LINE_1_XXXXXXXXXXADDRESS_LINE_2_XXXXXXXXXXCITY_XXXXXXXXXXXXXXXXXXXXBCA2A 2A2  604124456760489012340000000002009071307801 
 11   
 12  - "PHN" + "Dependent #" + "Carrier ID" (in the above example "9123456773", "00", BC") work together as an identifier 
 13   
 14  - format specification: 
 15   
 16  *-- MSVAEX30.TXT format 
 17  *-- 
 18  *-------------------------------------------------------------------- 
 19  *-- First Name          X(20)  No punctuations ( e.g. John Allen) 
 20  *-- MSP Initials        X(02)  e.g. JA 
 21  *-- Last Name           X(25) 
 22  *-- PHN                 9(10) 
 23  *-- Dependent #         9(02)  66 for newborn, otherwise zeros 
 24  *-- Carrier ID          X(02)  Province providing coverage: 
 25  *--                            BC, AB, SA, MB, ON, PQ, OI, NB, NS, NL, YT, NT, NU 
 26  *-- Exempt              X(01)  "X" for exempt, otherwise blank 
 27  *-- Opted-out           X(01)  "H" for Hard (Send payment to patient address) 
 28  *--                            "S" for Soft (Send paymant to office address) 
 29  *--                            Blank for Opted-in 
 30  *-- Visits Used         9(02)  # of MSP visits used this calendar year, form zero up 
 31  *--                            to 12 0r 15 depending on age. 
 32  *-- Birthdate           9(08)  ccyymmdd 
 33  *-- Payee #             9(05)   
 34  *-- Practitioner #      9(05) 
 35  *-- Sex                 X(01)  M, F 
 36  *-- Chart #             X(08) 
 37  *-- Street 1            X(25) 
 38  *-- Street 2            X(25) 
 39  *-- City                X(25) 
 40  *-- Province            X(02) 
 41  *-- Postal Code         X(09) A0A'b'0A0 or US Zip Code 
 42  *-- Home Phone          9(10) If no area code use 3 leading zeros 
 43  *-- Work Phone          9(10) If no area code use 3 leading zeros 
 44  *-- SIN                 9(09) 
 45  *-- Last Service Date   9(08) ccyymmdd 
 46  *-- Referral Doctor     9(05) 
 47  *-- 
 48  *-- Record size = 220 + <CR><LF> = 222 End-of-Record designated by Carriage Return and Line Feed.  
 49  *-- File is ASCII text - Named "MSVAEX30.TXT" 
 50  *-- X(n) = Aplhanumeric, left justified, padded with blanks 
 51  *-- 9(n) = Numeric, leading zeros 
 52   
 53  A0A'b'0A0: 
 54   
 55          - standard Canadian postal code format which is 3 characters: 
 56                  - (upper case letter + single digit number + upper case letter) 
 57                  - followed by a breaking space 
 58                  - followed by (number+letter number) 
 59   
 60  US Zip code: 
 61   
 62          - 12345 or 12345-1234 
 63   
 64  Dependant # / Carrier ID 
 65   
 66  I did some checking, and it seems in BC a corner case about 
 67  the "00" being instead "66". The provision to designate 
 68  newborns (as dependent "66" and, in the case of multiple 
 69  births, "64" ... "63") seems now obsoleted by the ability of 
 70  the hospital to log into the provincial system and generate 
 71  a new Personal Health Number. Any such legacy values in 
 72  Medical Manager would not be to drive the slave. 
 73   
 74  The PHN can therefore be taken as unique *within* carrier 
 75  ID. While the following may be far fetched, there is no 
 76  agreement between Canada's provinces to avoid collisions, so 
 77  it could be possible to exist 
 78   
 79          BC.CA MOH | Personal Health Number | 90123456780 
 80          ON.CA MOH | Personal Health Number | 90123456780 
 81   
 82  """ 
 83  #============================================================ 
 84  __license__ = "GPL" 
 85  __version__ = "$Revision: 1.2 $" 
 86  __author__ = "K.Hilbert <Karsten.Hilbert@gmx.net>" 
 87   
 88   
 89  # stdlib 
 90  import sys, codecs, time, datetime as pyDT 
 91   
 92   
 93  # GNUmed modules 
 94  if __name__ == '__main__': 
 95          sys.path.insert(0, '../../') 
 96  from Gnumed.pycommon import gmTools, gmDateTime 
 97  from Gnumed.business import gmPerson 
 98   
 99  MSVA_line_len = 220 
100  MSVA_dob_format = '%Y%m%d' 
101  MSVA_encoding = 'latin1' 
102   
103  #============================================================ 
104 -def read_persons_from_msva_file(filename=None, encoding=None):
105 106 if encoding is None: 107 encoding = MSVA_encoding 108 109 pats_file = codecs.open(filename = filename, mode = 'rU', encoding = encoding) 110 111 dtos = [] 112 113 for line in pats_file: 114 if len(line) < MSVA_line_len: 115 continue # perhaps raise Exception ? 116 117 dto = gmPerson.cDTO_person() 118 dto.source = u'Med.Manager/CA' 119 120 dto.firstnames = u'%s %s' % ( 121 gmTools.capitalize(line[:20].strip(), gmTools.CAPS_FIRST_ONLY), # should be _NAMES 122 gmTools.capitalize(line[20:22].strip(), gmTools.CAPS_FIRST_ONLY) # should be _NAMES 123 ) 124 dto.lastnames = gmTools.capitalize(line[22:47].strip(), gmTools.CAPS_FIRST_ONLY) # should be _NAMES 125 126 province = line[59:61] 127 dto.remember_external_id ( 128 name = u'PHN (%s.CA)' % province, 129 value = line[47:57], 130 issuer = u'MOH (%s.CA)' % province 131 ) 132 133 dob = time.strptime(line[65:73].strip(), MSVA_dob_format) 134 dto.dob = pyDT.datetime(dob.tm_year, dob.tm_mon, dob.tm_mday, tzinfo = gmDateTime.gmCurrentLocalTimezone) 135 dto.gender = line[83].lower() 136 137 dto.remember_external_id ( 138 name = u'MM (CA) Chart #', 139 value = line[84:92], 140 issuer = u'Medical Manager (CA) application' 141 ) 142 143 # this is the home address 144 street = u'%s // %s' % ( 145 gmTools.capitalize(line[92:117].strip(), gmTools.CAPS_FIRST), 146 gmTools.capitalize(line[117:142].strip(), gmTools.CAPS_FIRST) 147 ) 148 dto.remember_address ( 149 number = '?', 150 street = street, 151 urb = line[142:167], 152 region = line[167:169], # or "province" 153 zip = line[169:178], 154 country = 'CA' 155 ) 156 157 # channel types must correspond to GNUmed database comm type 158 dto.remember_comm_channel(channel = u'homephone', url = line[178:188]) 159 dto.remember_comm_channel(channel = u'workphone', url = line[188:198]) 160 161 dto.remember_external_id ( 162 name = u'Social Insurance Number', 163 value = line[198:207], 164 issuer = u'Canada' 165 ) 166 167 dtos.append(dto) 168 169 pats_file.close() 170 171 return dtos
172 #============================================================ 173 # main 174 #------------------------------------------------------------ 175 if __name__ == "__main__": 176 from Gnumed.pycommon import gmI18N 177 gmI18N.activate_locale() 178 gmI18N.install_domain() 179 gmDateTime.init() 180 181 patfile = sys.argv[1] 182 print "reading patient data from MSVA file [%s]" % patfile 183 184 dtos = read_persons_from_msva_file(patfile) 185 for dto in dtos: 186 print "DTO:", dto 187 print "dto.dob:", dto.dob, type(dto.dob) 188 print "dto.dob.tz:", dto.dob.tzinfo 189 print "dto.zip / urb / region: %s / %s / %s" % (dto.zip, dto.urb, dto.region) 190 print "dto.street:", dto.street 191 for ext_id in dto.external_ids: 192 print ext_id 193 for comm in dto.comms: 194 print comm 195 # searcher = gmPersonSearch.cPatientSearcher_SQL() 196 # ident = searcher.get_identities(dto=dto)[0] 197 # print ident 198 199 #============================================================== 200