2014-10-27 14:17:22 +00:00
|
|
|
import time
|
|
|
|
import random
|
|
|
|
import datetime
|
|
|
|
import xlrd
|
|
|
|
import xmltodict
|
|
|
|
|
2014-09-11 03:21:52 +00:00
|
|
|
from netforce.model import Model, fields, get_model
|
2014-10-27 14:17:22 +00:00
|
|
|
from netforce.utils import get_file_path
|
2014-11-21 16:11:57 +00:00
|
|
|
from netforce.access import get_active_company
|
2014-09-11 03:21:52 +00:00
|
|
|
|
|
|
|
class ClinicSetting(Model):
|
|
|
|
_name="clinic.setting"
|
|
|
|
_string="Setting"
|
|
|
|
_fields={
|
2014-10-26 08:48:51 +00:00
|
|
|
"var_k": fields.Float("K"),
|
2014-10-27 14:17:22 +00:00
|
|
|
'file': fields.File("File"),
|
2014-11-21 02:39:26 +00:00
|
|
|
'levels': fields.One2Many("clinic.setting.level","setting_id","Levels"),
|
2014-11-21 16:11:57 +00:00
|
|
|
'cost_per_case': fields.Float("Cost Per Case"),
|
|
|
|
'company_id': fields.Many2One("company", 'Company'),
|
2014-09-11 03:21:52 +00:00
|
|
|
}
|
2014-10-27 19:01:18 +00:00
|
|
|
|
2014-11-21 16:11:57 +00:00
|
|
|
_defaults={
|
|
|
|
"company_id": lambda *a: get_active_company(),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-10-27 14:17:22 +00:00
|
|
|
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
|
|
|
|
|
2014-10-27 19:01:18 +00:00
|
|
|
def make_visit(self,ids,context={}):
|
2014-10-27 14:17:22 +00:00
|
|
|
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:
|
2014-10-27 19:01:18 +00:00
|
|
|
medical=line.get('medical') or line.get('eponame') or ""
|
2014-10-27 14:17:22 +00:00
|
|
|
if not medical in medicals:
|
|
|
|
medicals.append(medical)
|
2014-10-27 19:01:18 +00:00
|
|
|
patient=line.get('hn','')
|
|
|
|
name14=line.get('name14') or ""
|
2014-10-27 14:17:22 +00:00
|
|
|
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)
|
2014-10-27 19:01:18 +00:00
|
|
|
seq=6
|
2014-10-27 14:17:22 +00:00
|
|
|
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'])
|
2014-11-03 01:21:34 +00:00
|
|
|
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'])]
|
2014-10-27 14:17:22 +00:00
|
|
|
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
|
|
|
|
|
2014-10-27 19:01:18 +00:00
|
|
|
def get_visit(date,state=None):
|
2014-10-27 14:17:22 +00:00
|
|
|
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")
|
2014-10-27 19:01:18 +00:00
|
|
|
return #XXXX
|
2014-10-27 14:17:22 +00:00
|
|
|
count=0
|
|
|
|
for line in lines:
|
|
|
|
date=line['dttran']
|
|
|
|
# prevent timeout
|
|
|
|
if count > 10:
|
|
|
|
break
|
2014-10-27 19:01:18 +00:00
|
|
|
#print(date)
|
2014-10-27 14:17:22 +00:00
|
|
|
visit=get_visit(date=date,state='draft')
|
2014-10-27 19:01:18 +00:00
|
|
|
print(date, ' ', visit)
|
2014-10-27 14:17:22 +00:00
|
|
|
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']
|
2014-10-27 19:01:18 +00:00
|
|
|
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 ""
|
2014-10-27 14:17:22 +00:00
|
|
|
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
|
2014-10-27 19:01:18 +00:00
|
|
|
|
|
|
|
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
|
2014-09-11 03:21:52 +00:00
|
|
|
|
|
|
|
ClinicSetting.register()
|