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),