From 71eb85568b43896d382aa7a868ef5ccf6ce0f9e8 Mon Sep 17 00:00:00 2001 From: "watcha.h" Date: Thu, 12 Feb 2015 15:52:35 +0700 Subject: [PATCH] clean --- netforce_clinic/actions/clinic_cust_print.xml | 6 + .../actions/clinic_matching_payment.xml | 2 +- .../layouts/clinic_account_menu.xml | 13 +- .../layouts/clinic_dialyzer_form.xml | 2 +- .../layouts/clinic_hd_case_form.xml | 1 - .../layouts/clinic_labor_cost_form.xml | 4 +- .../layouts/clinic_matching_payment.xml | 1 - netforce_clinic/layouts/clinic_shop_form.xml | 1 + netforce_clinic/migrations/__init__.py | 2 +- .../{import_ar.py => import_acc.py} | 12 +- netforce_clinic/migrations/import_pks.py | 144 ------------------ netforce_clinic/migrations/import_uc.py | 141 ----------------- netforce_clinic/models/dialyzer.py | 5 +- netforce_clinic/models/labor_cost.py | 4 +- netforce_clinic/models/matching_payment.py | 6 +- netforce_clinic/models/shop.py | 72 ++++++++- netforce_clinic/reports/cust_payment.odt | Bin 0 -> 30235 bytes 17 files changed, 104 insertions(+), 312 deletions(-) create mode 100644 netforce_clinic/actions/clinic_cust_print.xml rename netforce_clinic/migrations/{import_ar.py => import_acc.py} (59%) delete mode 100644 netforce_clinic/migrations/import_pks.py delete mode 100644 netforce_clinic/migrations/import_uc.py create mode 100644 netforce_clinic/reports/cust_payment.odt diff --git a/netforce_clinic/actions/clinic_cust_print.xml b/netforce_clinic/actions/clinic_cust_print.xml new file mode 100644 index 0000000..75a7d50 --- /dev/null +++ b/netforce_clinic/actions/clinic_cust_print.xml @@ -0,0 +1,6 @@ + + report_odt2 + clinic.shop + get_data + cust_payment + diff --git a/netforce_clinic/actions/clinic_matching_payment.xml b/netforce_clinic/actions/clinic_matching_payment.xml index 7f23370..ec78bbd 100644 --- a/netforce_clinic/actions/clinic_matching_payment.xml +++ b/netforce_clinic/actions/clinic_matching_payment.xml @@ -4,5 +4,5 @@ clinic.matching.payment matching_payment matching_payment - clinic_menu + account_menu diff --git a/netforce_clinic/layouts/clinic_account_menu.xml b/netforce_clinic/layouts/clinic_account_menu.xml index 29a46f4..48fb75d 100644 --- a/netforce_clinic/layouts/clinic_account_menu.xml +++ b/netforce_clinic/layouts/clinic_account_menu.xml @@ -2,17 +2,18 @@ - + - +
- - - - + + + + +
diff --git a/netforce_clinic/layouts/clinic_dialyzer_form.xml b/netforce_clinic/layouts/clinic_dialyzer_form.xml index 2da19eb..3dc7190 100644 --- a/netforce_clinic/layouts/clinic_dialyzer_form.xml +++ b/netforce_clinic/layouts/clinic_dialyzer_form.xml @@ -3,7 +3,7 @@ diff --git a/netforce_clinic/layouts/clinic_hd_case_form.xml b/netforce_clinic/layouts/clinic_hd_case_form.xml index 742f0a4..a34f7dd 100644 --- a/netforce_clinic/layouts/clinic_hd_case_form.xml +++ b/netforce_clinic/layouts/clinic_hd_case_form.xml @@ -60,7 +60,6 @@ - diff --git a/netforce_clinic/layouts/clinic_labor_cost_form.xml b/netforce_clinic/layouts/clinic_labor_cost_form.xml index ef561ed..2ac8626 100644 --- a/netforce_clinic/layouts/clinic_labor_cost_form.xml +++ b/netforce_clinic/layouts/clinic_labor_cost_form.xml @@ -33,7 +33,7 @@ - + @@ -46,7 +46,7 @@ - + diff --git a/netforce_clinic/layouts/clinic_matching_payment.xml b/netforce_clinic/layouts/clinic_matching_payment.xml index 0a409d9..cde5ae6 100644 --- a/netforce_clinic/layouts/clinic_matching_payment.xml +++ b/netforce_clinic/layouts/clinic_matching_payment.xml @@ -5,7 +5,6 @@ - diff --git a/netforce_clinic/layouts/clinic_shop_form.xml b/netforce_clinic/layouts/clinic_shop_form.xml index 8af1802..19643e7 100644 --- a/netforce_clinic/layouts/clinic_shop_form.xml +++ b/netforce_clinic/layouts/clinic_shop_form.xml @@ -1,6 +1,7 @@
+ diff --git a/netforce_clinic/migrations/__init__.py b/netforce_clinic/migrations/__init__.py index 454dc53..c72c313 100644 --- a/netforce_clinic/migrations/__init__.py +++ b/netforce_clinic/migrations/__init__.py @@ -1,2 +1,2 @@ from . import clinic_setting -from . import import_ar +from . import import_acc diff --git a/netforce_clinic/migrations/import_ar.py b/netforce_clinic/migrations/import_acc.py similarity index 59% rename from netforce_clinic/migrations/import_ar.py rename to netforce_clinic/migrations/import_acc.py index d4994a2..6191acb 100644 --- a/netforce_clinic/migrations/import_ar.py +++ b/netforce_clinic/migrations/import_acc.py @@ -2,23 +2,21 @@ from netforce.model import get_model from netforce import migration class Migration(migration.Migration): - _name="import.ar" + _name="import.acc" _version="2.10.0" def migrate(self): cbv_id=24 cbv=get_model("conv.bal").browse(cbv_id) cbv.write({ - 'file': '', + 'file': 'tb.csv', }) - print("import acc file running ...") - get_model("conv.bal").import_acc_file([cbv.id],context={}) - print("import sale file running ...") + print("import acc file (step 1) running ...") cbv.write({ - 'file': '', + 'file': 'ar.csv', }) + print("import sale file (step 2)running ...") get_model("conv.bal").import_sale_file([cbv.id],context={}) - print("Done! ", cbv.id, cbv.file) return True Migration.register() diff --git a/netforce_clinic/migrations/import_pks.py b/netforce_clinic/migrations/import_pks.py deleted file mode 100644 index 6eaacb3..0000000 --- a/netforce_clinic/migrations/import_pks.py +++ /dev/null @@ -1,144 +0,0 @@ -from netforce.model import get_model -from netforce import migration -from netforce.utils import get_file_path -from netforce.access import get_active_user, set_active_user, set_active_company, get_active_company -from . import utils - -class Migration(migration.Migration): - _name="import.pks" - _version="2.10" - - def import_visit(self,lines): - visits={} - cycles=[(c['id'],'%s:00'%c['time_start'],'%s:00'%c['time_stop']) for c in get_model("clinic.cycle").search_read([[]],['time_start','time_stop'])] - for line in lines: - hcode=line.get('hcode18') - if not hcode: - hcode='0' - hcode=int(hcode) - hcode=str(hcode) - hcode_impt='23869' - if hcode_impt==hcode: - name=line.get("name14") - patient_ids=get_model("clinic.patient").search([['name','=',name]]) - if patient_ids: - patient_id=patient_ids[0] - patient=get_model("clinic.patient").browse(patient_id) - doctor=patient.doctor_id - department=patient.department_id - vals={ - 'patient_id': patient.id, - 'doctor_id': doctor.id, - 'department_id': department.id, - 'state': 'pending', - } - # find cycle - dttran=line.get("dttran") - date=dttran[0:10] - time=dttran[11:] - if not time: - continue - cycle_id=None - for cycle in cycles: - time_start=cycle[1] - time_stop=cycle[2] - if time >= time_start: - cycle_id=cycle[0] - vals['cycle_id']=cycle_id - vals['time_start']='%s %s'%(date,time_start) - vals['time_stop']='%s %s'%(date,time_stop) - if not cycle_id: - raise Exception("not found cycle on this time %s %s %s"%(dttran, time_start,time_stop)) - visit_ids=get_model("clinic.visit").search([['visit_date','=',date],['patient_id','=',patient_id]]) - visit_id=None - if not visit_ids: - vals['visit_date']=date - visit_id=get_model('clinic.visit').create(vals) - #print('create visit ', visit_id, date) - else: - visit_id=visit_ids[0] - #print('already ', date, ' ', name) - if visit_id: - visits.update({ - visit_id: { - 'hct': line.get('hct'), - 'epoadm29':line.get("epoadm29"), # SRV - 'amount23':line.get("amount23"), # FEE - 'allow37':line.get("allow37"), # EPO - } - }) - else: - print("found ", name) - return visits - - def confirm_visit(self,visits): - st=get_model("clinic.setting").browse(1) - st.write({ - 'auto_gen': True, - }) - hd_case_ids=[] - visit_ids=visits.keys() - for visit in get_model('clinic.visit').browse(visit_ids): - if visit!='confirmed': - hd_case_id=visit.confirm()['next']['active_id'] - hd_case=get_model("clinic.hd.case").browse(hd_case_id) - # lines - vals={ - 'hct': visits[visit.id]['hct'] or 0, - 'lines': [], - } - for st_prod in st.products: - if st_prod.patient_type_id.id==3: - prod=st_prod.product_id - price=st_prod.price - qty=st_prod.qty - categ=st_prod.product_categ_id - if categ.code=='FEE': - amt=visits[visit.id]['amount23'] or 0 - elif categ.code=='SRV': - amt=visits[visit.id]['epoadm29'] or 0 - elif categ.code=='EPO': - amt=visits[visit.id]['allow37'] or 0 - else: - amt=0 - vals['lines'].append(('create',{ - 'product_id': prod.id, - 'uom_id': st_prod.uom_id.id, - 'product_categ_id': categ.id, - 'description': st_prod.description, - 'price': price, - 'qty': qty, - 'reimbursable': st_prod.reimbursable, - 'amount': amt, - })) - hd_case.write(vals) - hd_case_ids.append(hd_case.id) - st.write({ - 'auto_gen': False, - }) - return hd_case_ids - - - def hdc_done(self,hd_case_ids): - done_ids=[] - for hd_case in get_model("clinic.hd.case").browse(hd_case_ids): - if hd_case.state=='waiting_treatment': - hd_case.complete() - done_ids.append(hd_case.id) - return done_ids - - def migrate(self): - fname='pks.xls' - fpath=get_file_path(fname) - lines=utils.read_excel(fpath,show_datetime=True) - set_active_company(1) - visits=self.import_visit(lines) - print("visit ", len(visits)) - hd_case_ids=self.confirm_visit(visits) - print('hd case ', len(hd_case_ids)) - hd_case_ids=self.hdc_done(hd_case_ids) - print('Done ', len(hd_case_ids)) - set_active_company(1) - return True - -Migration.register() diff --git a/netforce_clinic/migrations/import_uc.py b/netforce_clinic/migrations/import_uc.py deleted file mode 100644 index 787a820..0000000 --- a/netforce_clinic/migrations/import_uc.py +++ /dev/null @@ -1,141 +0,0 @@ -from netforce.model import get_model -from netforce import migration -from netforce.utils import get_file_path -from netforce.access import get_active_user, set_active_user, set_active_company, get_active_company -from . import utils - -class Migration(migration.Migration): - _name="import.uc" - _version="2.11" - - def import_visit(self,lines): - visits={} - cycles=[(c['id'],'%s:00'%c['time_start'],'%s:00'%c['time_stop']) for c in get_model("clinic.cycle").search_read([[]],['time_start','time_stop'])] - patients=get_model("clinic.patient").search_browse([]) - for line in lines: - dttran=line.get("dttran") - hn=line.get("hn") - if hn: - hn=''.join(x for x in hn if x.isdigit) - - pid=None - for pt in patients: - if pt['hn_num']==hn: - pid=pt.id - break - if not pid: - print('continue ', pid) - continue - if dttran: - date,time=dttran.split("T") - if not time: - continue - cycle_id=None - patient=get_model("clinic.patient").browse(pid) - doctor=patient.doctor_id - department=patient.department_id - vals={ - 'patient_id': patient.id, - 'doctor_id': doctor.id, - 'department_id': department.id, - 'state': 'pending', - } - for cycle in cycles: - time_start=cycle[1] - time_stop=cycle[2] - if time >= time_start: - cycle_id=cycle[0] - vals['cycle_id']=cycle_id - vals['time_start']='%s %s'%(date,time_start) - vals['time_stop']='%s %s'%(date,time_stop) - if not cycle_id: - raise Exception("not found cycle on this time %s %s %s"%(dttran, time_start,time_stop)) - visit_ids=get_model("clinic.visit").search([['visit_date','=',date],['patient_id','=',pid]]) - visit_id=None - if not visit_ids: - vals['visit_date']=date - visit_id=get_model('clinic.visit').create(vals) - else: - visit_id=visit_ids[0] - if visit_id: - visits.update({ - visit_id: { - 'hct': line.get('hct'), - } - }) - - pass - return visits - - def confirm_visit(self,visits): - st=get_model("clinic.setting").browse(1) - st.write({ - 'auto_gen': True, - }) - hd_case_ids=[] - visit_ids=visits.keys() - for visit in get_model('clinic.visit').browse(visit_ids): - if visit!='confirmed': - hd_case_id=visit.confirm()['next']['active_id'] - hd_case=get_model("clinic.hd.case").browse(hd_case_id) - # lines - vals={ - 'hct': visits[visit.id]['hct'] or 0, - 'lines': [], - } - for st_prod in st.products: - if st_prod.patient_type_id.id==3: - prod=st_prod.product_id - price=st_prod.price - qty=st_prod.qty - categ=st_prod.product_categ_id - if categ.code=='FEE': - amt=visits[visit.id]['amount23'] or 0 - elif categ.code=='SRV': - amt=visits[visit.id]['epoadm29'] or 0 - elif categ.code=='EPO': - amt=visits[visit.id]['allow37'] or 0 - else: - amt=0 - vals['lines'].append(('create',{ - 'product_id': prod.id, - 'uom_id': st_prod.uom_id.id, - 'product_categ_id': categ.id, - 'description': st_prod.description, - 'price': price, - 'qty': qty, - 'reimbursable': st_prod.reimbursable, - 'amount': amt, - })) - hd_case.write(vals) - hd_case_ids.append(hd_case.id) - st.write({ - 'auto_gen': False, - }) - return hd_case_ids - - - def hdc_done(self,hd_case_ids): - done_ids=[] - for hd_case in get_model("clinic.hd.case").browse(hd_case_ids): - if hd_case.state=='waiting_treatment': - hd_case.complete() - done_ids.append(hd_case.id) - return done_ids - - def migrate(self): - #fname='22283_EURSTM_201406.xml' - fname='22283_UOCDSTM_20140902.xml' - fpath=get_file_path(fname) - node='HDBills' - lines=utils.read_xml(fpath,node=node) - set_active_company(1) - visits=self.import_visit(lines) - print("visit ", len(visits)) - #hd_case_ids=self.confirm_visit(visits) - #print('hd case ', len(hd_case_ids)) - #hd_case_ids=self.hdc_done(hd_case_ids) - #print('Done ', len(hd_case_ids)) - return True - -Migration.register() diff --git a/netforce_clinic/models/dialyzer.py b/netforce_clinic/models/dialyzer.py index a02a7b4..7f679bd 100644 --- a/netforce_clinic/models/dialyzer.py +++ b/netforce_clinic/models/dialyzer.py @@ -15,7 +15,7 @@ class Dialyzer(Model): "number": fields.Char("Number",required=True,search=True), 'ref': fields.Char("Ref."), "note": fields.Text("Note",search=True), - "date": fields.Date("Create Date",search=True), + "date": fields.DateTime("Create Date",search=True), "use_time": fields.Integer("Use Time"), "max_use_time": fields.Integer("Max Use Time"), "exp_date": fields.Date("Expiry Date",search=True), @@ -80,7 +80,7 @@ class Dialyzer(Model): _defaults={ "state": "new", - "date": lambda *a: time.strftime("%Y-%m-%d"), + "date": lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"), 'number': '/', "max_use_time": 10, "use_time": 0, @@ -132,6 +132,7 @@ class Dialyzer(Model): pick_vals={ "type": "out", 'journal_id': stock_journal.id, + 'date': obj.date, "ref": obj.number, "related_id": "clinic.dialyzer,%s"%obj.id, "partner_id": obj.patient_id.partner_id.id, diff --git a/netforce_clinic/models/labor_cost.py b/netforce_clinic/models/labor_cost.py index 28031f0..8a3c4f9 100644 --- a/netforce_clinic/models/labor_cost.py +++ b/netforce_clinic/models/labor_cost.py @@ -33,7 +33,7 @@ class LaborCost(Model): total_a+=fline.var_a or 0 total_b+=fline.var_b or 0 var_ptx=total_case*(obj.var_k or 0) - var_fml1='PTxK=%sX%s'%(total_a,total_b) + var_fml1='PTxK=%sx%s'%(total_a,total_b) total_bstr=total_b < 0 and "+%s"%(abs(total_b)) or "-%s"%total_b var_x=0.0 if total_a: @@ -56,7 +56,7 @@ class LaborCost(Model): 'var_pt': total_case, 'var_ptx': total_case*(obj.var_k or 0), 'var_fml1': '%s'%(var_fml1), - 'var_fml2': '%s=%sX%s'%(var_ptx,total_a,total_b), + 'var_fml2': '%s=%sx%s'%(var_ptx,total_a,total_b), 'var_fml3': '(%s%s)/%s'%(var_ptx,total_bstr,total_a), 'var_x': round(var_x,2), 'total': total, diff --git a/netforce_clinic/models/matching_payment.py b/netforce_clinic/models/matching_payment.py index 046bf3f..4ecfb8c 100644 --- a/netforce_clinic/models/matching_payment.py +++ b/netforce_clinic/models/matching_payment.py @@ -526,8 +526,10 @@ class MatchingPayment(Model): print("Done!") def get_report_data(self,ids,context={}): - obj=self.browse(ids)[0] - lines=obj.match() + lines=[] + if ids: + obj=self.browse(ids)[0] + lines=obj.match() data={ 'lines': lines, } diff --git a/netforce_clinic/models/shop.py b/netforce_clinic/models/shop.py index d2e3c0e..53a5d09 100644 --- a/netforce_clinic/models/shop.py +++ b/netforce_clinic/models/shop.py @@ -2,7 +2,7 @@ import time from netforce.model import Model, fields, get_model from netforce.access import get_active_user, set_active_user, get_active_company -from netforce.utils import get_data_path +from netforce.utils import get_data_path, get_file_path class Shop(Model): _name="clinic.shop" @@ -460,4 +460,74 @@ class Shop(Model): }, } + def get_bill(self,context={}): + if not context.get('refer_id'): + return {} + shop_id=int(context['refer_id']) + shop=self.browse(shop_id) + comp_id=get_active_company() + comp=get_model('company').browse(comp_id) + st=get_model('settings').browse(1) + addresses=st.addresses + comp_addr='' + if addresses: + comp_addr=addresses[0].address_text + cust=shop.contact_id + cust_name=cust.name or '' + cust_addr='' + if cust.addresses: + cust_addr=cust.addresses[0].address_text + + #if cust_name.lower()=='walk + if cust.walkin_cust: + cust_name=shop.ref or '' + no=1 + sub_total=0 + amount_total=0 + lines=[] + for line in shop.lines: + amt=line.amount or 0 + prod=line.product_id + lines.append({ + 'no': no, + 'product_name': prod.name or '', + 'description': line.description or '', + 'uom_name': line.uom_id.name or '', + 'qty': line.qty or 0, + 'price': line.price or 0, + 'amount': amt, + }) + sub_total+=amt + amount_total+=sub_total #XXX + no+=1 + data={ + 'comp_name': comp.name or '', + 'comp_addr': comp_addr or '', + 'number': shop.number or '', + 'ref': shop.ref, + 'date': shop.date, + 'cust_name': cust_name, + 'cust_addr': cust_addr, + 'lines':lines, + 'sub_total': sub_total, + 'amount_total': amount_total, + } + if comp.logo: + data['logo']=get_file_path(comp.logo) + return data + + def get_data(self,ids,context={}): + settings=get_model('settings').browse(1) + pages=[] + for obj in get_model('clinic.shop').browse(ids): + context['refer_id']=obj.id + data=get_model('clinic.shop').get_bill(context=context) + pages.append(data) + if pages: + pages[-1]["is_last_page"]=True + return { + "pages": pages, + "logo": get_file_path(settings.logo), + } + Shop.register() diff --git a/netforce_clinic/reports/cust_payment.odt b/netforce_clinic/reports/cust_payment.odt new file mode 100644 index 0000000000000000000000000000000000000000..ee32d8b270afa84b433774cfd4f5093057938371 GIT binary patch literal 30235 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 literal 0 HcmV?d00001