From f8e99319b4b4991bbb5db7fb4cdf53590409ddfd Mon Sep 17 00:00:00 2001 From: "watcha.h" Date: Wed, 3 Dec 2014 09:16:05 +0700 Subject: [PATCH] import payment --- netforce_clinic/layouts/clinic_menu.xml | 2 +- .../layouts/import_clinic_payment_form.xml | 48 ++++++-- netforce_clinic/models/__init__.py | 1 + netforce_clinic/models/import_payment.py | 111 ++++++++++++++++-- netforce_clinic/models/import_payment_line.py | 21 ++++ netforce_clinic/todo.txt | 3 +- 6 files changed, 168 insertions(+), 18 deletions(-) create mode 100644 netforce_clinic/models/import_payment_line.py diff --git a/netforce_clinic/layouts/clinic_menu.xml b/netforce_clinic/layouts/clinic_menu.xml index c5f2919..c007930 100644 --- a/netforce_clinic/layouts/clinic_menu.xml +++ b/netforce_clinic/layouts/clinic_menu.xml @@ -66,6 +66,6 @@ - + diff --git a/netforce_clinic/layouts/import_clinic_payment_form.xml b/netforce_clinic/layouts/import_clinic_payment_form.xml index ad447cf..301803e 100644 --- a/netforce_clinic/layouts/import_clinic_payment_form.xml +++ b/netforce_clinic/layouts/import_clinic_payment_form.xml @@ -2,25 +2,59 @@ + + - - + + + + - - + + + - + + + + + + + + +
+ + + + + +
- + + + + + + + + +
+ + + + + +
diff --git a/netforce_clinic/models/__init__.py b/netforce_clinic/models/__init__.py index 7c7410a..e64ff4b 100644 --- a/netforce_clinic/models/__init__.py +++ b/netforce_clinic/models/__init__.py @@ -65,6 +65,7 @@ from . import branch from . import period from . import period_line from . import import_payment +from . import import_payment_line from . import import_product from . import import_patient from . import import_visit diff --git a/netforce_clinic/models/import_payment.py b/netforce_clinic/models/import_payment.py index 37fa915..5d751c3 100644 --- a/netforce_clinic/models/import_payment.py +++ b/netforce_clinic/models/import_payment.py @@ -1,4 +1,6 @@ import time +from datetime import datetime, timedelta +from calendar import monthrange from netforce.model import Model, fields, get_model from netforce.utils import get_file_path @@ -16,17 +18,24 @@ class ImportPayment(Model): _fields={ 'name': fields.Char("Name",function="_get_name"), - 'type_id': fields.Many2One("clinic.patient.type","Patient Type"), - 'date': fields.Date("Date"), - 'file': fields.File("File"), + 'type_id': fields.Many2One("clinic.patient.type","Patient Type",required=True), 'hcode_id': fields.Many2One("clinic.hospital", "Hospital",required=True), + 'date': fields.Date("Date"), + 'date_from': fields.Date("From"), + 'date_to': fields.Date("To"), + 'file': fields.File("File"), 'max_row': fields.Integer("Max Row"), 'remain_row': fields.Integer("Pending"), 'total_row': fields.Integer("Total Payment"), + 'est_time': fields.Float("Estimate Time",scale=4), 'msg': fields.Text("Message"), 'done_qty': fields.Integer("Success"), 'fail_qty': fields.Integer("Fail"), - 'state': fields.Selection([['draft','Draft'],['fail','Fail'],['success','Success']],'State'), + 'match_qty': fields.Integer("Match"), + 'unmatch_qty': fields.Integer("UnMatch"), + 'state': fields.Selection([['draft','Draft'],['confirmed','Confirmed'],['fail','Fail'],['success','Success']],'State'), + 'match_lines': fields.One2Many("import.clinic.payment.line","import_payment_id","Match",domain=[["state","=","match"]]), + 'unmatch_lines': fields.One2Many("import.clinic.payment.line","import_payment_id","UnMatch",domain=[["state","=","unmatch"]]), } def get_hcode_id(self,context={}): @@ -35,34 +44,80 @@ class ImportPayment(Model): if hp_ids: hp_id=hp_ids[0] return hp_id + + def _get_date_from(self,context={}): + datenow=time.strftime("%Y-%m-%d") + year,month,day=datenow.split("-") + return '%s-%s-01'%(year,month) + + def _get_date_to(self,context={}): + datenow=datetime.now().strftime("%Y-%m-%d") + year,month,day=datenow.split("-") + weekday, total_day=monthrange(int(year), int(month)) + return '%s-%s-%s'%(year,month,total_day) + _defaults={ - 'date': lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"), + 'date': lambda *a: time.strftime("%Y-%m-%d"), + 'date_from': _get_date_from, + 'date_to': _get_date_to, 'hcode_id': get_hcode_id, 'max_row': 50, 'state': 'draft', } def import_payment(self,ids,context={}): + fmt='%Y-%m-%d %H:%M:%S' + start_time=time.strftime(fmt) obj=self.browse(ids)[0] fname=obj.file fpath=get_file_path(fname) - lines=utils.read_excel(fpath,show_datetime=True) + lines=utils.read_excel(fpath,show_datetime=False) if not lines: raise Exception("Wrong File") msg="" - max_row=obj.max_row count=0 nofound=0 did=0 blank=0 fail_qty=0 done_qty=0 + match_qty=0 + unmatch_qty=0 + msg+=""*10; msg+="hcode,hn,name\n" + + dom=[] + dom.append(['state','=','waiting_payment']) + invoices={} + for inv in get_model("account.invoice").search_browse(dom): + hd_case=inv.related_id + patient=hd_case.patient_id + key=(inv.date,patient.id) + invoices[key]={ + 'id': inv.id, + 'amount_due': inv.amount_due, + 'hd_case_id': hd_case.id, + } + + patients={} + for pt in get_model("clinic.patient").search_read([[]],['hn','hn_num']): + key=pt['hn_num'] + patients[key]={ + 'id': pt['id'], + } + + def get_hn_num(hn=""): + return ''.join(h for h in hn if h.isdigit()) + + mlines=[] + umlines=[] for line in lines: name=line.get("name14") hn=line.get('hn',"") + hn_num=get_hn_num(hn) hct=line.get("hct","") + inv_date=line.get("dttran") hcode=line.get('hcode18','0') if not hcode: hcode='0' @@ -77,16 +132,54 @@ class ImportPayment(Model): else: blank+=1 continue + + if patients.get(hn_num): + patient_id=patients[hn_num]['id'] + key=(inv_date,patient_id) + if invoices.get(key): + inv=invoices[key] + mlines.append(('create',{ + 'date': inv_date, + 'invoice_id': inv['id'], + 'hd_case_id': inv['hd_case_id'], + 'patient_id': patient_id, + 'state': 'match', + })) + match_qty+=1 + else: + umlines.append(('create',{ + 'date': inv_date, + 'patient_id': patient_id, + })) + unmatch_qty+=1 + + + for mline in obj.match_lines: + mline.delete() + for umline in obj.unmatch_lines: + umline.delete() + + stop_time=time.strftime(fmt) + est_time=datetime.strptime(stop_time,fmt)-datetime.strptime(start_time,fmt) + 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, + 'remain_row': remain_row-match_qty, 'msg': msg, - 'done_qty': done_qty, + 'done_qty': match_qty, 'fail_qty': fail_qty, + 'match_qty': match_qty, + 'unmatch_qty': unmatch_qty, + 'est_time': est_time.seconds/3600, + 'match_lines': mlines, + 'unmatch_lines': umlines, }) + print("Done!") + ImportPayment.register() diff --git a/netforce_clinic/models/import_payment_line.py b/netforce_clinic/models/import_payment_line.py new file mode 100644 index 0000000..e1a20d0 --- /dev/null +++ b/netforce_clinic/models/import_payment_line.py @@ -0,0 +1,21 @@ +from netforce.model import Model, fields + +class PaymentLine(Model): + _name="import.clinic.payment.line" + _string="Race" + + _fields={ + 'import_payment_id': fields.Many2One("import.clinic.payment","Payment",required=True,on_delete="cascade"), + 'date': fields.Date("Date"), + 'invoice_id': fields.Many2One("account.invoice","Invoice"), + 'patient_id': fields.Many2One("clinic.patient","Patient"), + 'hd_case_id': fields.Many2One("clinic.hd.case","HDCase"), + 'state': fields.Selection([['match','Match'],['unmatch','Unmatch']],"State"), + 'amount': fields.Float("Amount"), + } + + _defaults={ + 'state': 'unmatch', + } + +PaymentLine.register() diff --git a/netforce_clinic/todo.txt b/netforce_clinic/todo.txt index 0659875..b34d46f 100644 --- a/netforce_clinic/todo.txt +++ b/netforce_clinic/todo.txt @@ -1,7 +1,8 @@ - missing - import schedule -> wait K. Ekk - missing hd case in staff (nurse, doctor) - + - special nurse + - report for show max cycle and got cycle ===============