clinic/netforce_clinic/models/import_hd_case.py

166 lines
5.6 KiB
Python

import time
from netforce.model import Model, fields, get_model
from netforce.utils import get_file_path
from . import utils
class ImportHDCase(Model):
_name="clinic.import.hd.case"
_transient=True
_fields={
'date': fields.Date("Date"),
'file': fields.File("File"),
'hcode_id': fields.Many2One("clinic.hospital", "Hospital",required=True),
'max_row': fields.Integer("Max Row"),
'remain_row': fields.Integer("Import Pending"),
'total_row': fields.Integer("Total Case"),
'msg': fields.Text("Message"),
'done_qty': fields.Integer("Success"),
'fail_qty': fields.Integer("Fail"),
}
def get_hcode_id(self,context={}):
hp_ids=get_model("clinic.hospital").search([])
hp_id=None
if hp_ids:
hp_id=hp_ids[0]
return hp_id
_defaults={
'date': lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"),
'hcode_id': get_hcode_id,
'max_row': 50,
}
def import_hd_case(self,ids,context={}):
obj=self.browse(ids)[0]
fname=obj.file
fpath=get_file_path(fname)
lines=utils.read_excel(fpath,show_datetime=True)
if not lines:
raise Exception("Wrong File")
st_lines=[]
st=get_model("clinic.setting").browse(1)
for st_prod in st.products:
prod=st_prod.product_id
if st_prod.patient_type=='sc':
st_lines.append(('create',{
'type': st_prod.type,
'product_id': prod.id,
'uom_id': prod.uom_id.id,
'description': prod.name,
'qty': 1,
'price': st_prod.price,
'amount': st_prod.price,
}))
policy=''
option=''
for st_policy in st.invoice_policies:
if st_policy=='sc':
policy=st_policy.invoice_policy
option=st_policy.invoice_option
msg=""
max_row=obj.max_row
count=0
nofound=0
did=0
blank=0
fail_qty=0
done_qty=0
for line in lines:
name=line.get("name14")
hn=line.get('hn',"")
hct=line.get("hct","")
hcode=line.get('hcode18','0')
if not hcode:
hcode='0'
hcode=int(hcode)
hcode=str(hcode)
if not obj.hcode_id.code==hcode:
if hcode:
nofound+=1
if hcode!='0':
msg+="not found %s, %s, %s \n"%(hcode,hn,name)
fail_qty+=1
else:
blank+=1
continue
dttran=line.get("dttran","")
date=dttran[0:10]
pt_ids=get_model("clinic.patient").search([['name','=',name]])
if not pt_ids:
pt_ids=get_model("clinic.patient").search([['hn','=',hn]])
if count > max_row:
#XXX timeout
break
hlines=[]
if pt_ids:
prod_price=line.get("epopay27") # XXX
prod_code=line.get("code31")
prods=get_model("product").search_browse([['code','=',prod_code]])
if prods:
prod=prods[0]
hlines=[('create',{
'type': 'medicine',
'product_id': prod.id,
'uom_id': prod.uom_id.id,
'description': prod.name,
'price': prod_price or 0.0,
'qty': 1,
'amount': prod_price or 0.0,
})]
patient_id=pt_ids[0]
visit_obj=get_model("clinic.visit")
visits=visit_obj.search_browse([['visit_date','=',date],['patient_id','=',patient_id],['state','=','draft']])
if visits:
count+=1
done_qty+=1
hlines+=st_lines
visit=visits[0]
cycle=visit.cycle_id
vals={
'patient_id': patient_id,
'hct': hct or 0,
'invoice_policy': policy,
'invoice_option': option,
'date': visit.visit_date,
'time_start': visit.time_start,
'time_stop': visit.time_stop, # XXX
'visit_id': visit.id,
'cycle_id': cycle.id,
'lines': hlines,
}
hd_case_obj=get_model("clinic.hd.case")
hd_case_id=hd_case_obj.create(vals)
visit.confirm()
hd_case=hd_case_obj.browse(hd_case_id)
hd_case.done()
for inv in hd_case.invoices:
inv.write({
'date': inv.due_date,
})
msg+="confirm visit %s\n"%(visit.visit_date)
else:
did+=1
#print("not found visit for %s on %s"%(name,date))
else:
pass
remain_row=len(lines)-blank-did-count
if remain_row <= 0:
msg="Nothing to import"
obj.write({
'total_row': len(lines),
'remain_row': remain_row,
'msg': msg,
'done_qty': done_qty,
'fail_qty': fail_qty,
})
print("Done!")
ImportHDCase.register()