From 030ad8fcd549f84359d8b09d05d292fc91241734 Mon Sep 17 00:00:00 2001 From: "watcha.h@almacom.co.th" Date: Thu, 9 Apr 2015 17:47:40 +0700 Subject: [PATCH] improve matching --- .../layouts/clinic_account_setting.xml | 3 + .../layouts/clinic_matching_hdcase.xml | 32 +- netforce_clinic/models/__init__.py | 2 + netforce_clinic/models/matching_hdcase.py | 407 ++++++++++-------- .../models/matching_hdcase_file.py | 12 + .../models/matching_hdcase_line.py | 12 + netforce_clinic/models/setting.py | 1 + 7 files changed, 279 insertions(+), 190 deletions(-) create mode 100644 netforce_clinic/models/matching_hdcase_file.py create mode 100644 netforce_clinic/models/matching_hdcase_line.py diff --git a/netforce_clinic/layouts/clinic_account_setting.xml b/netforce_clinic/layouts/clinic_account_setting.xml index 2195efb..b3cc3f5 100644 --- a/netforce_clinic/layouts/clinic_account_setting.xml +++ b/netforce_clinic/layouts/clinic_account_setting.xml @@ -67,6 +67,9 @@ + + + diff --git a/netforce_clinic/layouts/clinic_matching_hdcase.xml b/netforce_clinic/layouts/clinic_matching_hdcase.xml index beff827..14ac1f7 100644 --- a/netforce_clinic/layouts/clinic_matching_hdcase.xml +++ b/netforce_clinic/layouts/clinic_matching_hdcase.xml @@ -1,6 +1,30 @@
- - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/netforce_clinic/models/__init__.py b/netforce_clinic/models/__init__.py index dcfd9fe..d4e1fa4 100644 --- a/netforce_clinic/models/__init__.py +++ b/netforce_clinic/models/__init__.py @@ -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 diff --git a/netforce_clinic/models/matching_hdcase.py b/netforce_clinic/models/matching_hdcase.py index 782ccf9..88f4b7c 100644 --- a/netforce_clinic/models/matching_hdcase.py +++ b/netforce_clinic/models/matching_hdcase.py @@ -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 - - 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) + 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) - 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() diff --git a/netforce_clinic/models/matching_hdcase_file.py b/netforce_clinic/models/matching_hdcase_file.py new file mode 100644 index 0000000..0c0f7bd --- /dev/null +++ b/netforce_clinic/models/matching_hdcase_file.py @@ -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() diff --git a/netforce_clinic/models/matching_hdcase_line.py b/netforce_clinic/models/matching_hdcase_line.py new file mode 100644 index 0000000..82e113e --- /dev/null +++ b/netforce_clinic/models/matching_hdcase_line.py @@ -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() diff --git a/netforce_clinic/models/setting.py b/netforce_clinic/models/setting.py index b907814..5b1a0f9 100644 --- a/netforce_clinic/models/setting.py +++ b/netforce_clinic/models/setting.py @@ -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),