import time import xlrd import xmltodict from netforce.model import Model, fields, get_model from netforce.access import get_active_company from netforce.utils import get_file_path from netforce.utils import get_data_path from netforce.database import get_connection class ImportPayment(Model): _name="clinic.import.payment" _transient=True _fields={ 'date': fields.DateTime("Date"), 'file': fields.File("File"), 'result': fields.Text("Success"), } _defaults={ 'date': lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"), } def read_excel(self,fpath=None): data={} if fpath: suffix=fpath.split(".")[-1] if suffix not in ('xls', 'xlsx'): raise Exception("ERROR : please should file xls or xlsx") wb=xlrd.open_workbook(fpath) sheet=wb.sheet_by_name("Sheet1") # read header values into the list keys = [sheet.cell(0, col_index).value for col_index in range(sheet.ncols)] data=[] for row_index in range(1, sheet.nrows): d = {(keys[col_index] or "").lower(): sheet.cell(row_index, col_index).value for col_index in range(sheet.ncols)} data.append(d) return data def read_xml(self,fpath=None,node=""): data={} if not node: return data if fpath: suffix=fpath.split(".")[-1] if suffix not in ('xml'): raise Exception("ERROR : please should file xml") data=xmltodict.parse(open(fpath,"r").read()) stmstm=data.get('STMSTM') if stmstm: hdbills=stmstm.get(node) if not hdbills: return {} lines=[] for k, v in hdbills.items(): collections=v for collection in collections: if isinstance(collection,dict): line={} for i, j in collection.items(): key=(i or "").lower() line[key]=j lines.append(line) #titles=[title for title, value in lines[0].items()] return lines def import_nhso(self,ids,context={}): obj=self.browse(ids)[0] fname=obj.file fpath=get_file_path(fname) if not fpath: raise Exception("Please select file") lines=self.read_xml(fpath,node='HDBills') if not lines: raise Exception("Wrong file") data_nhso=get_model("clinic.data.nhso") nhso_ids=data_nhso.search([]) data_nhso.delete(nhso_ids) result="" result+="Match: %s"%(50) result+="\n" result+="*"*50 for line in lines: # TODO need to check match or not data_nhso.create(line) line['type']='success' print(line) result+="\n" result+="Not Match: %s"%(40) result+="\n" result+="*"*50 obj.write({ 'result': result, }) def import_mg(self,ids,context={}): obj=self.browse(ids)[0] fname=obj.file fpath=get_file_path(fname) print("fpath ", fpath) def import_sc(self,ids,context={}): obj=self.browse(ids)[0] fname=obj.file fpath=get_file_path(fname) lines=self.read_excel(fpath) if not lines: raise Exception("Wrong File") data_sc=get_model("clinic.data.sc") sc_ids=data_sc.search([]) data_sc.delete(sc_ids) st={} patient=get_model("clinic.patient") old_patient=[x['hn'] for x in patient.search_read([],['hn']) if x['hn']] for line in lines: hn=line.get('hn') if not hn: continue # create patient if not found if not st.get(hn) and (not hn in old_patient): patient.create({ 'type': 'sc', 'hn': hn, 'name': line.get('name14'), 'reg_date': time.strftime("%Y-%m-%d"), }) st.update({hn: line.get('name14')}) print("create %s ok"%hn) vals={ 'hn': hn, 'name14': line.get('name14'), 'hcode18': line.get('hcode18'), 'amount23': line.get('amount23'), "cur": line.get('cur'), 'epoadm29': line.get('epoadm29'), 'eponame': line.get('eponame'), 'ln': line.get('ln'), 'st': line.get('st'), 'allow37': line.get('allow37'), 'type': 'success', } data_sc.create(vals) msg="%s -OK "%("*"*50) obj.write({ 'result': msg, }) print("OK") ImportPayment.register()