166 lines
5.6 KiB
Python
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()
|