clinic/netforce_clinic/models/matching_hdcase.py

342 lines
12 KiB
Python

import time
from netforce.model import Model, fields, get_model
from netforce.utils import get_file_path
class MatchingHDCase(Model):
_name="clinic.matching.hdcase"
_transient=True
_fields={
"date_from": fields.Date("From", required=True),
"date_to": fields.Date("To", required=True),
'file': fields.File("File"),
'state': fields.Selection([["match","Math"],["not_match","Not Match"]],"State"),
'skip_lines': fields.One2Many("clinic.matching.hdcase.line","matching_hdcase_id","Skip Lines"),
'file_lines': fields.One2Many("clinic.matching.hdcase.file","matching_hdcase_id","File Lines"),
'msg': fields.Text("Message"),
'branch_id': fields.Many2One("clinic.branch","Branch"),
}
def _get_skip_lines(self,context={}):
skip_lines=[]
st=get_model('clinic.setting').browse(1)
if st.skip_type_id:
skip_lines.append({
'type_id': st.skip_type_id.id,
})
return skip_lines
_defaults={
'date_from': lambda *a: time.strftime('%Y-%m-%d'),
'date_to': lambda *a: time.strftime('%Y-%m-%d'),
'skip_lines': _get_skip_lines,
}
def get_rows(self,fpath=None):
if not fpath:
raise Exception("File not found")
try:
# or codecs.open on Python 2
filedata = open(fpath, encoding='UTF-8').read()
except:
filedata = open(fpath, encoding='TIS-620').read()
lines=filedata.split("\n")
count=0
rows=[]
for line in lines:
#open
if '***' in line and count==0:
count+=1
#end
elif '***' in line and count==1:
count=0
#table content
if count==1:
line=line.replace("*","")
line=line.replace("|","")
i=0
vals={}
for l in line.split(","):
if l:
vals[i]=l
i+=1
# only right data
if vals:
if len(vals)>1:
rows.append(vals)
return rows
def get_report_data(self,ids,context={}):
defaults=self.default_get(context=context)
date_from=defaults.get("date_from")
date_to=defaults.get("date_to")
branch_id=defaults.get("branch_id")
lines=[]
state="all"
if ids:
obj=self.browse(ids)[0]
state=obj.state
date_from=obj.date_from
date_to=obj.date_to
branch_id=obj.branch_id.id
skip_lines=[skip.type_id.name for skip in obj.skip_lines]
if not obj.file:
return {}
fpath=get_file_path(obj.file)
rows=self.get_rows(fpath)
if not rows:
return {
'message': 'No Data',
}
#{0: ' A 01',
#1: ' 6',
#2: ' 11686',
#3: ' 91312851',
#4: ' 450124497',
#5: ' 27/01/2558 06:05:00',
#6: ' C',
#7: ' O',
#8: ' U ',
#9: ' N',
#10: ' Espogen',
#11: ' 4000',
#12: ' 30',
#13: ' 1',
#14: ' 0',
#15: ' 1500',
#16: ' 1500',
#17: ' 0',
#18: ' 1500',
#19: ' S',
#20: ' U '}
patients={}
dom=[
['dispose','=',False],
['walkin','=','no'],
]
for pt in get_model("clinic.patient").search_read(dom,['name','hn_no','type_id']):
hn=pt['hn_no']
patients[hn]={
'id': pt['id'],
'name': pt['name'] or '',
'type': pt['type_id'][1],
}
products={}
for prod in get_model("product").search_read([],['name']):
name=(prod['name'] or "").replace(" ", "")
name=name.upper()
products[name]=prod['id']
dom=[]
dom.append(['patient_id.walkin',"=","no"]) #XXX
dom.append(['date',">=",date_from])
dom.append(['date',"<=",date_to])
dom.append(['state','!=','cancelled'])
if branch_id:
dom.append(['branch_id','=',branch_id])
hdcases1={}
hdcases2={}
hdcases3={}
def get_account_patient_hn(patient_id):
res=get_model("clinic.setting.account.patient").search_read([['patient_id','=',patient_id]],['hn','patient_id'])
if res:
return res[0]
return res
print('hdcase get key ....')
for hdcase in get_model("clinic.hd.case").search_browse(dom):
date=hdcase.date
hn=hdcase.patient_id.hn_no or ""
fee_amt=0
hct=hdcase.hct or "0"
hct=round(float(hct),2)
prod_line=[]
for line in hdcase.lines:
prod=line.product_id
categ=prod.categ_id
if categ and line.reimbursable=='yes':
if categ.code=='EPO':
prod_name=(prod.name or "").split("-")
if len(prod_name) >= 1:
prod_name=prod_name[0]
prod_line.append(prod_name)
elif categ.code=='FEE':
fee_amt=line.amount or 0
prod_name=''
if prod_line:
prod_name='-'.join(prod_line)
key1='%s-%s-%s-%s'%(date,hn,prod_name,fee_amt)
hdcases1[key1]={
'id': hdcase.id,
'number': hdcase.number or '',
'note': '',
}
key2='%s-%s'%(date,hn)
hdcases2[key2]={
'id': hdcase.id,
'number': hdcase.number or '',
'note': '%s, %s, %s, %s, %s'%(date,hn,hct,prod_name,fee_amt),
}
patient=hdcase.patient_id
result=get_account_patient_hn(patient.id)
if result:
hn=result['hn']
key3='%s-%s-%s-%s'%(date,hn,prod_name,fee_amt)
hdcases3[key3]={
'id': hdcase.id,
'number': hdcase.number or '',
'note': '',
'patient_id': patient.id,
'patient_name': patient.name,
'patient_type': patient.type_id.name,
}
ddate=set()
print('match hdcase ....')
for row in rows:
vals=list(row.values())
date,_time=(vals[5] or "").split()
ddate.update({date})
if len(date)<3:
raise Exception("Wrong format date")
d,m,y=date.split("/")
y=int(y)-543
date='%s-%s-%s'%(y,m,d)
hn=vals[3]
hn=''.join(x for x in (hn or "") if x.isdigit())
pt=patients.get(hn)
pt_type=''
pt_name=''
pt_id=None
if pt:
pt_name=pt['name']
pt_id=pt['id']
pt_type=pt['type']
hct=float(vals[12] or "0")
hct=round(hct,2)
fee_amt=float(vals[15] or "0")
fee_amt=round(fee_amt,2)
prod_name=vals[10] or ''
prod_name=prod_name.replace(" ", "")
prod_id=products.get(prod_name.upper(),None)
key1='%s-%s-%s-%s'%(date,hn,prod_name.upper(),fee_amt)
hdcase=hdcases1.get(key1)
unit_amt=float(vals[11])
line_vals={
'hn': hn,
'date': date,
'patient_name': pt_name,
'patient_id': pt_id,
'patient_type': pt_type,
'hct': hct,
'prod_name': (prod_name or "").title(),
'prod_id': prod_id,
'fee_amt': fee_amt,
'note': '',
'nf_date': '',
'nf_hn': '',
'nf_hct': '',
'nf_epo': '',
'nf_fee': '',
'unit_amt': unit_amt,
}
if hdcase:
line_vals['is_match']=True
line_vals['hd_case_id']=hdcase['id']
line_vals['hd_case_number']=hdcase['number']
else:
line_vals['is_match']=False
key2='%s-%s'%(date,hn)
hdcase2=hdcases2.get(key2)
if hdcase2:
line_vals['hd_case_id']=hdcase2['id']
line_vals['hd_case_number']=hdcase2['number']
line_vals['note']=''
nf_date,nf_hn,nf_hct,nf_epo,nf_fee=hdcase2['note'].split(",")
line_vals['nf_date']=nf_date
line_vals['nf_hn']=nf_hn
line_vals['nf_hct']=nf_hct
nf_epo=(nf_epo or "").replace("-",",")
line_vals['nf_epo']=nf_epo.title()
line_vals['nf_fee']=round(float((nf_fee or "0")),2)
lines.append(line_vals)
key3='%s-%s-%s-%s'%(date,hn,prod_name.upper(),fee_amt)
hdcase=hdcases3.get(key3)
if hdcase:
line_vals['is_match']=True
line_vals['hd_case_id']=hdcase['id']
line_vals['hd_case_number']=hdcase['number']
line_vals['patient_id']=hdcase['patient_id']
line_vals['patient_name']=hdcase['patient_name']
line_vals['patient_type']=hdcase['patient_type']
no=1
lines2=[]
total=0
total_match=0
total_unmatch=0
mdate=[]
print('sorted line ...')
for line in sorted(lines,key=lambda x: x['hn']):
ldate=line.get('date') or ""
if ldate not in mdate:
mdate.append(ldate)
cont=ldate and (ldate >=date_from and ldate <= date_to)
# skip out of range
if not cont:
continue
patient_type=line.get('patient_type')
hn=line.get('hn')
if patient_type in skip_lines:
print('continue ', patient_type)
continue
elif not patient_type and hn:
found=0
for pt in get_model("clinic.patient").search_browse([['hn_no','=',hn]]):
if pt.type_id.name in skip_lines:
found=1
break
if found:
print('continue ', hn)
continue
is_match=line.get('is_match',False)
if is_match:
total_match+=1
else:
total_unmatch+=1
total+=1
if state=='not_match' and is_match:
continue
elif state=='match' and not is_match:
continue
else:
pass
line['no']=no
lines2.append(line)
no+=1
lines=lines2
date=''
if date_from==date_to:
date=date_from
data={
'lines': sorted(lines,key=lambda x: x.get('date')),
'date_from': date_from,
'date_to': date_to,
'date': date,
'total': total,
'total_match': total_match,
'total_unmatch': total_unmatch,
'message': '',
}
if no <=1 and ids:
data['message']="%s"%', '.join(sorted(ddate))
return data
def onchange_date(self,context={}):
data=context['data']
data['date_to']=data['date_from']
return data
MatchingHDCase.register()