improve matching
parent
ccab6a2ba2
commit
030ad8fcd5
|
@ -67,6 +67,9 @@
|
|||
<!--</list>-->
|
||||
<!--</field>-->
|
||||
</tab>
|
||||
<tab string="Matching HD Case">
|
||||
<field name="skip_type_id"/>
|
||||
</tab>
|
||||
<tab string="Accounting">
|
||||
<field name="cash_account_id"/>
|
||||
<field name="income_account_id" string="Account Receivable"/>
|
||||
|
|
|
@ -1,6 +1,30 @@
|
|||
<form model="clinic.matching.hdcase">
|
||||
<field name="date_from" onchange="onchange_date" span="2"/>
|
||||
<field name="date_to" span="2"/>
|
||||
<field name="file" span="3"/>
|
||||
<field name="state" span="3"/>
|
||||
<tabs>
|
||||
<tab string="General">
|
||||
<field name="date_from" onchange="onchange_date" span="2"/>
|
||||
<field name="date_to" span="2"/>
|
||||
<field name="file" span="3"/>
|
||||
<field name="state" span="3"/>
|
||||
<!--<group span="6" columns="1">-->
|
||||
<!--<field name="file_lines" nolabel="1">-->
|
||||
<!--<list>-->
|
||||
<!--<field name="file"/>-->
|
||||
<!--</list>-->
|
||||
<!--</field>-->
|
||||
<!--</group>-->
|
||||
<!--<group span="6" columns="1">-->
|
||||
<!--</group>-->
|
||||
</tab>
|
||||
<tab string="Skip Type">
|
||||
<group span="6" columns="1">
|
||||
<field name="skip_lines" nolabel="1">
|
||||
<list>
|
||||
<field name="type_id"/>
|
||||
</list>
|
||||
</field>
|
||||
</group>
|
||||
<group span="6" columns="1">
|
||||
</group>
|
||||
</tab>
|
||||
</tabs>
|
||||
</form>
|
||||
|
|
|
@ -114,6 +114,8 @@ from . import matching_payment_popup
|
|||
from . import invoice_payment
|
||||
from . import invoice_payment_line
|
||||
from . import matching_hdcase
|
||||
from . import matching_hdcase_line
|
||||
from . import matching_hdcase_file
|
||||
from . import sale_order
|
||||
from . import shop
|
||||
from . import shop_line
|
||||
|
|
|
@ -12,18 +12,25 @@ class MatchingHDCase(Model):
|
|||
"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"),
|
||||
}
|
||||
|
||||
def default_get(self,field_names=None,context={},**kw):
|
||||
defaults=context.get("defaults",{})
|
||||
datenow=time.strftime("%Y-%m-%d")
|
||||
date_from=defaults.get('date_from',datenow)
|
||||
date_to=defaults.get('date_to',datenow)
|
||||
res={
|
||||
'date_from': date_from,
|
||||
'date_to': date_to,
|
||||
}
|
||||
return res
|
||||
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:
|
||||
|
@ -72,194 +79,220 @@ class MatchingHDCase(Model):
|
|||
state=obj.state
|
||||
date_from=obj.date_from
|
||||
date_to=obj.date_to
|
||||
if obj.file:
|
||||
fpath=get_file_path(obj.file)
|
||||
rows=self.get_rows(fpath)
|
||||
if not rows:
|
||||
raise Exception("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 '}
|
||||
skip_lines=[skip.type_id.name for skip in obj.skip_lines]
|
||||
print('skip_lines ', skip_lines)
|
||||
if not obj.file:
|
||||
return {}
|
||||
#raise Exception("File Not found")
|
||||
fpath=get_file_path(obj.file)
|
||||
rows=self.get_rows(fpath)
|
||||
if not rows:
|
||||
raise Exception("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'])
|
||||
hdcases={}
|
||||
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
|
||||
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'])
|
||||
hdcases={}
|
||||
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
|
||||
|
||||
for hdcase in get_model("clinic.hd.case").search_browse(dom):
|
||||
date=hdcase.date
|
||||
hn=hdcase.patient_id.hn_no or ""
|
||||
#hn=hn[0:7] #XXX K.Ekk explain on 03/04/2015 : 0-7 is main of hn
|
||||
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)
|
||||
hdcases[key1]={
|
||||
for hdcase in get_model("clinic.hd.case").search_browse(dom):
|
||||
date=hdcase.date
|
||||
hn=hdcase.patient_id.hn_no or ""
|
||||
#hn=hn[0:7] #XXX K.Ekk explain on 03/04/2015 : 0-7 is main of hn
|
||||
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)
|
||||
hdcases[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,
|
||||
}
|
||||
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,
|
||||
}
|
||||
for row in rows:
|
||||
vals=list(row.values())
|
||||
date,_time=(vals[5] or "").split()
|
||||
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=hdcases.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
|
||||
for row in rows:
|
||||
vals=list(row.values())
|
||||
date,_time=(vals[5] or "").split()
|
||||
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=hdcases.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)
|
||||
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']
|
||||
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=[]
|
||||
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
|
||||
|
@ -288,11 +321,13 @@ class MatchingHDCase(Model):
|
|||
'total_match': total_match,
|
||||
'total_unmatch': total_unmatch,
|
||||
}
|
||||
if no <=1 and ids:
|
||||
raise Exception("File match only %s"%', '.join(sorted(mdate)))
|
||||
return data
|
||||
|
||||
def onchange_date(self,context={}):
|
||||
data=context['data']
|
||||
data['date_to']=data['date_from']
|
||||
#data['date_to']=data['date_from']
|
||||
return data
|
||||
|
||||
MatchingHDCase.register()
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
from netforce.model import Model, fields, get_model
|
||||
|
||||
class MatchingHDCaseFile(Model):
|
||||
_name="clinic.matching.hdcase.file"
|
||||
_transient=True
|
||||
|
||||
_fields={
|
||||
"matching_hdcase_id": fields.Many2One("clinic.matching.hdcase","Matching HD Case"),
|
||||
'file': fields.File("File"),
|
||||
}
|
||||
|
||||
MatchingHDCaseFile.register()
|
|
@ -0,0 +1,12 @@
|
|||
from netforce.model import Model, fields, get_model
|
||||
|
||||
class MatchingHDCaseLine(Model):
|
||||
_name="clinic.matching.hdcase.line"
|
||||
_transient=True
|
||||
|
||||
_fields={
|
||||
"matching_hdcase_id": fields.Many2One("clinic.matching.hdcase","Matching HD Case"),
|
||||
'type_id': fields.Many2One("clinic.patient.type","Type"),
|
||||
}
|
||||
|
||||
MatchingHDCaseLine.register()
|
|
@ -55,6 +55,7 @@ class ClinicSetting(Model):
|
|||
'branch_id': fields.Many2One("clinic.branch","Branch"),
|
||||
'shop_categs': fields.Many2Many("product.categ","Categs"),
|
||||
'shop_type_id': fields.Many2One("clinic.patient.type","Patient Type"),
|
||||
'skip_type_id': fields.Many2One("clinic.patient.type","Skip Type"), # Matching HD Case
|
||||
"cash_account_id": fields.Many2One("account.account","Cash Account",multi_company=True),
|
||||
"income_account_id": fields.Many2One("account.account","Income Account",multi_company=True),
|
||||
"import_account_id": fields.Many2One("account.account","Import Account",multi_company=True),
|
||||
|
|
Loading…
Reference in New Issue