import time import random import datetime import xlrd import xmltodict from netforce.model import Model, fields, get_model from netforce.utils import get_file_path from netforce.access import get_active_company class ClinicSetting(Model): _name="clinic.setting" _string="Setting" _fields={ "var_k": fields.Float("K"), 'file': fields.File("File"), 'levels': fields.One2Many("clinic.setting.level","setting_id","Levels"), 'cost_per_case': fields.Float("Cost Per Case"), 'company_id': fields.Many2One("company", 'Company'), } _defaults={ "company_id": lambda *a: get_active_company(), } 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)} d={} for col_index in range(sheet.ncols): ctype=sheet.cell(row_index,col_index).ctype if ctype==3: value=sheet.cell(row_index, col_index).value year, month, day, hour, minute, second = xlrd.xldate_as_tuple(value,wb.datemode) value=datetime.datetime(year, month, day, hour, minute,second) value=value.strftime("%Y-%m-%d") else: value=sheet.cell(row_index, col_index).value d.update({(keys[col_index] or "").lower():value}) data.append(d) return data def make_visit(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") medicals=[] patients=[] for line in lines: medical=line.get('medical') or line.get('eponame') or "" if not medical in medicals: medicals.append(medical) patient=line.get('hn','') name14=line.get('name14') or "" value=(patient,name14) if not value in patients: patients.append(value) products=[p['name'] for p in get_model("product").search_read([],['name'])] print('generate product') print("="*50) seq=6 for md in medicals: md=md.replace(" ","") if not md: continue if not md in products: vals={ 'code': "m"+("%s"%seq).zfill(4), 'name':md, 'uom_id': 2, 'type': 'stock', } seq+=1 prod_id=get_model("product").create(vals) print(prod_id) print("="*50) print('generate patient') hns=[pt['hn'] for pt in get_model("clinic.patient").search_read([],['hn'])] for hn, name in patients: hn=hn.replace(' ',"") if not hn: continue if not hn in hns: vals={ 'hn': hn, 'name': name, 'type': 'sc', } pt_id=get_model("clinic.patient").create(vals) print('hn ', pt_id) print("="*50) patients=get_model("clinic.patient").search_read([],['name','hn']) visits=get_model("clinic.visit").search_read([],['number','time_start','cycle_id','state']) doctor_ids=[dt['id'] for dt in get_model("clinic.personal").search_read([['type','=','doctor']],['name'])] nurse_ids=[ns['id'] for ns in get_model("clinic.personal").search_read([['type','=','nurse']],['name'])] cycle_ids=[cc['id'] for cc in get_model("clinic.cycle").search_read([],['name'])] department_ids=[dp['id'] for dp in get_model("clinic.department").search_read([],['name'])] #db=get_connection() def get_patient(hn): for pt in patients: if hn==pt['hn']: return pt return None def get_visit(date,state=None): for visit in visits: if date==visit['time_start'][0:10]: if state: if visit['state']==state: return visit else: return None return visit print("="*50) print("create simple visit") timenow=time.strftime("%H:%M:%S") timenow2="%s:%s:%s" % (int(time.strftime("%H"))+1, time.strftime("%M"), time.strftime("%S")) time_start=timenow for line in lines: hn=line['hn'] date=line['dttran'] visit=get_visit(date) if not visit: patient=get_patient(hn) if patient: time_start="%s %s"%(date,timenow) time_stop="%s %s"%(date,timenow2) vals={ 'time_start': time_start, 'time_stop': time_stop, 'patient_id': patient['id'], 'cycle_id': random.choice(cycle_ids), 'nurse_id': random.choice(nurse_ids), 'doctor_id': random.choice(doctor_ids), 'department_id': random.choice(department_ids), } visit_id=get_model("clinic.visit").create(vals) print("create visit %s ", visit_id) print("="*50) print("visit with state is draft") return #XXXX count=0 for line in lines: date=line['dttran'] # prevent timeout if count > 10: break #print(date) visit=get_visit(date=date,state='draft') print(date, ' ', visit) if visit: visit_id=visit['id'] context['called']=True hd_case_id=get_model("clinic.visit").browse(visit_id).confirm(context=context) #allow37=line['allow37'] hct=line.get('hct') medical=line.get('medical') or line.get("eponame") or "" medical_cost=line.get('medical_cost') or line.get('allow37') or 0.0 inject_service=line.get('inject_service') or line.get("epoadm29") or "" vals={ 'hct': hct and hct or 0, 'lines': [], } if medical: prods=get_model("product").search_browse([['name','=',medical]]) if prods: prod=prods[0] vals['lines'].append(('create',{ 'type': 'other', 'product_id': prod.id, 'description': prod.name, 'uom_id': prod.uom_id.id, 'qty': 1, 'price': medical_cost, 'amount': medical_cost, })) if inject_service: vals['lines'].append(('create',{ 'type': 'other', 'product_id': 55, #XXX 'description': prod.name, 'uom_id': prod.uom_id.id, 'qty': 1, 'price': medical_cost, 'amount': medical_cost, })) hd_case=get_model("clinic.hd.case").browse(hd_case_id) hd_case.write(vals) count+=1 print("#%s write hd_case %s ok and visit %s" % (count,hd_case_id,hd_case.visit_id.number)) print("="*50) print("Done") return def make_done(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") def get_line(hn,date): for line in lines: if hn==line['hn'] and date==line['dttran']: return line count=0 for visit in get_model("clinic.visit").search_browse([['state','=','draft']]): if count > 200: break count+=1 context['called']=True hd_case_id=visit.confirm(context=context) hn=visit.patient_id.hn date_visit=visit.time_start[0:10] line=get_line(hn,date_visit) if line: hct=line.get('hct') medical=line.get('medical') or line.get('eponame') or "" medical_cost=line.get('medical_cost') or line.get("allow37") or "" inject_service=line.get('inject_service') or line.get("EPOadm29") or "" vals={ 'hct': hct and hct or 0, 'lines': [], } if medical: prods=get_model("product").search_browse([['name','=',medical]]) if prods: prod=prods[0] vals['lines'].append(('create',{ 'type': 'fee', 'product_id': prod.id, 'description': prod.name, 'uom_id': prod.uom_id.id, 'qty': 1, 'price': medical_cost, 'amount': medical_cost, })) if inject_service: prod=get_model("product").browse(55) vals['lines'].append(('create',{ 'type': 'other', 'product_id': 55, #XXX 'description': prod.name, 'uom_id': prod.uom_id.id, 'qty': 1, 'price': medical_cost, 'amount': medical_cost, })) hd_case=get_model("clinic.hd.case").browse(hd_case_id) hd_case.write(vals) print("#%s make hd_case %s ok "%(count,hd_case.number)) def make_complete(self,ids,context={}): context['called']=True count=0 for hd_case in get_model('clinic.hd.case').search_browse(['state','=','draft']): if count > 100: break if not hd_case.dialyzers: patient=hd_case.patient_id if not patient.addresses: patient.simple_address() hd_case.new_dialyzer(context=context) hd_case.complete() print("%s is completed"%hd_case.number) count+=1 ClinicSetting.register()