From 54af83fcfa56ea400b2e9e952696f8509ef770e4 Mon Sep 17 00:00:00 2001 From: "saharat.i@netforce.co.th" Date: Tue, 14 Nov 2017 18:01:03 +0700 Subject: [PATCH 01/42] report_wizard_labor_cost merge file to pdf --- .../layouts/clinic_account_menu.xml | 1 + .../clinic_report_wizard_labor_cost.xml | 18 ++ netforce_clinic/models/__init__.py | 1 + netforce_clinic/models/report_labor_cost.py | 2 +- .../models/report_labor_cost_detail.py | 4 +- .../models/report_labor_cost_summary.py | 4 +- .../models/report_wizard_labor_cost.py | 266 ++++++++++++++++++ .../reports/report_labor_cost.xlsx | Bin 7540 -> 7603 bytes .../reports/report_labor_cost_detail.xlsx | Bin 7690 -> 7749 bytes .../reports/report_labor_cost_summary.xlsx | Bin 7478 -> 7398 bytes .../report_wizard_labor_cost_details.odt | Bin 0 -> 16338 bytes .../report_wizard_labor_cost_summany.odt | Bin 0 -> 14962 bytes 12 files changed, 291 insertions(+), 5 deletions(-) create mode 100644 netforce_clinic/layouts/clinic_report_wizard_labor_cost.xml create mode 100644 netforce_clinic/models/report_wizard_labor_cost.py create mode 100644 netforce_clinic/reports/report_wizard_labor_cost_details.odt create mode 100644 netforce_clinic/reports/report_wizard_labor_cost_summany.odt diff --git a/netforce_clinic/layouts/clinic_account_menu.xml b/netforce_clinic/layouts/clinic_account_menu.xml index 2b9c2a4..98139d3 100644 --- a/netforce_clinic/layouts/clinic_account_menu.xml +++ b/netforce_clinic/layouts/clinic_account_menu.xml @@ -17,6 +17,7 @@ + diff --git a/netforce_clinic/layouts/clinic_report_wizard_labor_cost.xml b/netforce_clinic/layouts/clinic_report_wizard_labor_cost.xml new file mode 100644 index 0000000..11d4d88 --- /dev/null +++ b/netforce_clinic/layouts/clinic_report_wizard_labor_cost.xml @@ -0,0 +1,18 @@ +
+ + + + + + + + + + + + + + diff --git a/netforce_clinic/templates/report_account_hd_case_summary.hbs b/netforce_clinic/templates/report_account_hd_case_summary.hbs index e64af47..96e08ab 100644 --- a/netforce_clinic/templates/report_account_hd_case_summary.hbs +++ b/netforce_clinic/templates/report_account_hd_case_summary.hbs @@ -1,3 +1,24 @@ + +

{{title}} @@ -21,9 +42,9 @@ {{#ifeq reimbursable "no"}} - + {{else}} - + {{/ifeq}} {{#if ptype_id}} Total: {{total_qty}} @@ -53,7 +74,9 @@ Misc. Dlz Ref.Inv# + {{else}} Date Cycle# @@ -68,7 +91,9 @@ ค่ายา ค่าบริการฉีดยา Inv# + แพทย์ พยาบาล {{/ifeq}} @@ -98,21 +123,23 @@ {{/if}} {{epo_name}} - {{currency fee zero=""}} - {{currency mdc zero=""}} - {{currency lab zero=""}} - {{currency misc zero=""}} - {{currency dlz_price zero=""}} + {{fee}} + {{mdc}} + {{lab}} + {{misc}} + {{dlz_price}} {{#if inv_id}} {{view "link" string=inv_ref action="cust_invoice" action_options="form_view_xml&cust_invoice_form&mode=form" active_id=inv_id}} {{/if}} + {{else}} {{date}} {{cycle}} @@ -125,9 +152,9 @@ {{ptype}} {{hct}} {{epo_name}} - {{currency fee zero=""}} - {{currency mdc zero=""}} - {{currency srv zero=""}} + {{fee}} + {{mdc}} + {{srv}} {{#if inv_id}} {{view "link" string=inv_number action="cust_invoice" action_options="form_view_xml&cust_invoice_form&mode=form" active_id=inv_id}} @@ -136,6 +163,7 @@ {{/if}} + {{dname}} {{view "link" string="View" action="clinic_cycle_item" action_options="mode=form" active_id=cycle_item_id}} @@ -163,11 +192,12 @@ - {{currency total_fee zero=""}} - {{currency total_mdc zero=""}} - {{currency total_lab zero=""}} - {{currency total_misc zero=""}} - {{currency total_dlz zero=""}} + {{total_fee}} + {{total_mdc}} + {{total_lab}} + {{total_misc}} + {{total_dlz}} + {{else}} @@ -179,12 +209,33 @@ - {{currency total_fee zero=""}} - {{currency total_mdc zero=""}} - {{currency total_srv zero=""}} + {{total_fee}} + {{total_mdc}} + {{total_srv}} + {{/ifeq}} + + + From a3e5bb7cf5c2f8294d541f0c00d0d1232af559e9 Mon Sep 17 00:00:00 2001 From: SPP Date: Fri, 24 Nov 2017 13:22:28 +0700 Subject: [PATCH 08/42] rearrange menu --- .../clinic_report_account_hd_case_summary.xml | 8 -- netforce_clinic/actions/rdc_board.xml | 5 ++ .../actions/report_hdcase_expense_summary.xml | 8 ++ .../layouts/clinic_account_menu.xml | 36 +-------- .../layouts/clinic_account_menu.xml.old | 38 +++++++++ ....xml => report_hdcase_expense_summary.xml} | 2 +- netforce_clinic/models/__init__.py | 2 +- ...ry.py => report_hdcase_expense_summary.py} | 8 +- ...lsx => report_hdcase_expense_summary.xlsx} | Bin netforce_clinic/templates/clinic_page.hbs | 2 +- netforce_clinic/templates/rdc_page.hbs | 73 ++++++++++++++++++ ....hbs => report_hdcase_expense_summary.hbs} | 0 12 files changed, 132 insertions(+), 50 deletions(-) delete mode 100644 netforce_clinic/actions/clinic_report_account_hd_case_summary.xml create mode 100644 netforce_clinic/actions/rdc_board.xml create mode 100644 netforce_clinic/actions/report_hdcase_expense_summary.xml create mode 100644 netforce_clinic/layouts/clinic_account_menu.xml.old rename netforce_clinic/layouts/{clinic_report_account_hd_case_summary.xml => report_hdcase_expense_summary.xml} (92%) rename netforce_clinic/models/{report_account_hd_case_summary.py => report_hdcase_expense_summary.py} (98%) rename netforce_clinic/reports/{report_account_hd_case_summary.xlsx => report_hdcase_expense_summary.xlsx} (100%) create mode 100644 netforce_clinic/templates/rdc_page.hbs rename netforce_clinic/templates/{report_account_hd_case_summary.hbs => report_hdcase_expense_summary.hbs} (100%) diff --git a/netforce_clinic/actions/clinic_report_account_hd_case_summary.xml b/netforce_clinic/actions/clinic_report_account_hd_case_summary.xml deleted file mode 100644 index 5b156b9..0000000 --- a/netforce_clinic/actions/clinic_report_account_hd_case_summary.xml +++ /dev/null @@ -1,8 +0,0 @@ - - Account HD Case Summary - report - clinic.report.account.hd.case.summary - report_account_hd_case_summary - report_account_hd_case_summary - account_menu - diff --git a/netforce_clinic/actions/rdc_board.xml b/netforce_clinic/actions/rdc_board.xml new file mode 100644 index 0000000..723080b --- /dev/null +++ b/netforce_clinic/actions/rdc_board.xml @@ -0,0 +1,5 @@ + + template_view + rdc_page + account_menu + diff --git a/netforce_clinic/actions/report_hdcase_expense_summary.xml b/netforce_clinic/actions/report_hdcase_expense_summary.xml new file mode 100644 index 0000000..a842d6b --- /dev/null +++ b/netforce_clinic/actions/report_hdcase_expense_summary.xml @@ -0,0 +1,8 @@ + + HDCase Expense Summary + report + report.hdcase.expense.summary + report_hdcase_expense_summary + report_hdcase_expense_summary + account_menu + diff --git a/netforce_clinic/layouts/clinic_account_menu.xml b/netforce_clinic/layouts/clinic_account_menu.xml index 85717d3..cb40bfd 100644 --- a/netforce_clinic/layouts/clinic_account_menu.xml +++ b/netforce_clinic/layouts/clinic_account_menu.xml @@ -1,40 +1,6 @@ - -
- - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - + diff --git a/netforce_clinic/layouts/clinic_account_menu.xml.old b/netforce_clinic/layouts/clinic_account_menu.xml.old new file mode 100644 index 0000000..6477713 --- /dev/null +++ b/netforce_clinic/layouts/clinic_account_menu.xml.old @@ -0,0 +1,38 @@ + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + +
+ + + +
+ + + + + + + diff --git a/netforce_clinic/layouts/clinic_report_account_hd_case_summary.xml b/netforce_clinic/layouts/report_hdcase_expense_summary.xml similarity index 92% rename from netforce_clinic/layouts/clinic_report_account_hd_case_summary.xml rename to netforce_clinic/layouts/report_hdcase_expense_summary.xml index 5977ec8..347d27b 100644 --- a/netforce_clinic/layouts/clinic_report_account_hd_case_summary.xml +++ b/netforce_clinic/layouts/report_hdcase_expense_summary.xml @@ -1,4 +1,4 @@ -
+ diff --git a/netforce_clinic/models/__init__.py b/netforce_clinic/models/__init__.py index b916ed5..8563616 100644 --- a/netforce_clinic/models/__init__.py +++ b/netforce_clinic/models/__init__.py @@ -67,7 +67,7 @@ from . import report_clinic from . import report_visit from . import report_cycle_item from . import report_hd_case_summary -from . import report_account_hd_case_summary +from . import report_hdcase_expense_summary from . import report_account_hd_case_detail from . import report_hd_case_detail from . import report_medical_summary diff --git a/netforce_clinic/models/report_account_hd_case_summary.py b/netforce_clinic/models/report_hdcase_expense_summary.py similarity index 98% rename from netforce_clinic/models/report_account_hd_case_summary.py rename to netforce_clinic/models/report_hdcase_expense_summary.py index 4709d85..c984a20 100644 --- a/netforce_clinic/models/report_account_hd_case_summary.py +++ b/netforce_clinic/models/report_hdcase_expense_summary.py @@ -4,9 +4,9 @@ from calendar import monthrange from netforce.model import Model, fields, get_model from netforce.access import get_active_company -class ReportAccountHDCaseSummary(Model): - _name="clinic.report.account.hd.case.summary" - _string="HD Case Report Summary" +class ReportHDCaseExpenseSummary(Model): + _name="report.hdcase.expense.summary" + _string="HDCase Expense Summary" _transient=True _fields={ @@ -377,4 +377,4 @@ class ReportAccountHDCaseSummary(Model): data['date_to']=data['date_from'] return data -ReportAccountHDCaseSummary.register() +ReportHDCaseExpenseSummary.register() diff --git a/netforce_clinic/reports/report_account_hd_case_summary.xlsx b/netforce_clinic/reports/report_hdcase_expense_summary.xlsx similarity index 100% rename from netforce_clinic/reports/report_account_hd_case_summary.xlsx rename to netforce_clinic/reports/report_hdcase_expense_summary.xlsx diff --git a/netforce_clinic/templates/clinic_page.hbs b/netforce_clinic/templates/clinic_page.hbs index c4ce238..4a400fa 100644 --- a/netforce_clinic/templates/clinic_page.hbs +++ b/netforce_clinic/templates/clinic_page.hbs @@ -1,4 +1,4 @@ -{{#view "page" title="Clinic Board"}} +{{#view "page" title="Nurse Board"}}
diff --git a/netforce_clinic/templates/rdc_page.hbs b/netforce_clinic/templates/rdc_page.hbs new file mode 100644 index 0000000..ee70f2e --- /dev/null +++ b/netforce_clinic/templates/rdc_page.hbs @@ -0,0 +1,73 @@ +{{#view "page" title="Ratchawat Board"}} + +{{/view}} diff --git a/netforce_clinic/templates/report_account_hd_case_summary.hbs b/netforce_clinic/templates/report_hdcase_expense_summary.hbs similarity index 100% rename from netforce_clinic/templates/report_account_hd_case_summary.hbs rename to netforce_clinic/templates/report_hdcase_expense_summary.hbs From 59b0427b6a33fb6c1a31fc83d2e93048bbdde9fa Mon Sep 17 00:00:00 2001 From: "saharat.i@netforce.co.th" Date: Fri, 24 Nov 2017 13:40:34 +0700 Subject: [PATCH 09/42] report hd case summary (revise) --- netforce_clinic/models/patient.py | 19 ++ netforce_clinic/models/patient_move.py | 3 +- .../models/report_discontinue_patient.py | 70 +++++ .../models/report_hd_case_detail.py | 289 ++++++++++++++++++ .../models/report_hdcase_summary.py | 173 +++++++++++ .../models/report_recent_patient.py | 70 +++++ .../templates/report_hdcase_summary.hbs | 10 +- 7 files changed, 631 insertions(+), 3 deletions(-) diff --git a/netforce_clinic/models/patient.py b/netforce_clinic/models/patient.py index 58bb9eb..0d0bf0f 100644 --- a/netforce_clinic/models/patient.py +++ b/netforce_clinic/models/patient.py @@ -330,6 +330,15 @@ class Patient(Model): }) #TODO create patient.move + patient_move={ + "patient_id": obj.id, + "patient_name": "%s %s"% (obj.first_name or "",obj.last_name or ""), + "patient_type": obj.type_id.name, + "type": "in", + #"location_from_id": obj.location, + #"location_to_id": obj.location, + } + get_model("clinic.patient.move").create(patient_move) return obj_id def delete(self,ids,context={}): @@ -375,6 +384,16 @@ class Patient(Model): if not vals.get("resign_date"): vals['resign_date']=time.strftime("%Y-%m-%d") vals['rm_remain_visit']=True + obj=self.browse(ids)[0] + patient_move={ + "patient_id": obj.id, + "patient_name": "%s %s"% (obj.first_name or "",obj.last_name or ""), + "patient_type": obj.type_id.name, + "type": "out", + #"location_from_id": obj.location, + #"location_to_id": obj.location, + } + get_model("clinic.patient.move").create(patient_move) else: vals['state']='admit' vals['rm_remain_visit']=False diff --git a/netforce_clinic/models/patient_move.py b/netforce_clinic/models/patient_move.py index 4d94992..2756708 100644 --- a/netforce_clinic/models/patient_move.py +++ b/netforce_clinic/models/patient_move.py @@ -11,9 +11,10 @@ class PatientMove(Model): "patient_name": fields.Char("Patient Name"), "patient_type": fields.Char("Patient Type"), #ปกส. .... "type": fields.Selection([['in','In'],['out','Out']], 'Type', required=True), + "location_from_id": fields.Many2One("stock.location", "From Location", required=False, search=True), + "location_to_id": fields.Many2One("stock.location", "To Location", required=False, search=True), } - _defaults={ 'date': lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"), } diff --git a/netforce_clinic/models/report_discontinue_patient.py b/netforce_clinic/models/report_discontinue_patient.py index 1267eb7..edfc021 100644 --- a/netforce_clinic/models/report_discontinue_patient.py +++ b/netforce_clinic/models/report_discontinue_patient.py @@ -51,6 +51,76 @@ class ReportDiscontinuePatient(Model): } return res + def get_report_data_revise(self,ids,context={}): + company_id=get_active_company() + company=get_model('company').browse(company_id) + year, month=time.strftime("%Y-%m").split("-") + weekday, total_day=monthrange(int(year), int(month)) + defaults=self.default_get(context=context) + time_start=defaults.get("date_from") + time_stop=defaults.get("date_to") + branch_id=defaults.get("branch_id") + department_id=defaults.get("department_id") + if ids: + obj=self.browse(ids)[0] + month=obj.date_from.split("-")[1] + time_start=obj.date_from + time_stop=obj.date_to + branch_id=obj.branch_id.id + department_id=obj.department_id.id + # new patient of this month + dom=[] + dom.append(['date','>=',time_start]) + dom.append(['date','<=',time_stop]) + dom.append(['type','=','out']) + #dom.append(['resign_date','>=',time_start]) + #dom.append(['resign_date','<=',time_stop]) + #dom.append(['walkin','=',"no"]) + #dom.append(['dispose','=',True]) + #if branch_id: + #dom.append(['branch_id','=',branch_id]) + #if department_id: + #dom.append(['department_id','=',department_id]) + print("dom ", dom) + records=get_model('clinic.patient.move').search_browse(dom) + lines=[] + no=1 + for record in records: + if record.patient_id.branch_id.id!=branch_id: + continue + if record.patient_id.department_id.id!=department_id: + continue + lines.append({ + 'no': no, + 'name': record.patient_name or '', + 'pid': record.id, + 'note': record.patient_id.note or '', + 'resign_date': record.date[:10] or '', + }) + no+=1 + month_str=utils.MONTHS['th_TH'][int(month)] + start=int(time_start[8:10]) + stop=int(time_stop[8:10]) + diff=stop-start + sub_name='' + if department_id: + dpt=get_model("clinic.department").browse(department_id) + sub_name="(%s)" % dpt.name or "" + elif branch_id: + branch=get_model("clinic.branch").browse(branch_id) + sub_name="(%s)" % branch.name or "" + data={ + 'company_name': '%s %s' % (company.name or "", sub_name), + 'parent_company_name': company.parent_id.name or "", + 'lines': lines, + 'month': month_str, + 'from': time_start, + 'to': time_stop, + 'is_duration': diff+1 < total_day, + 'year': year, + } + return data + def get_report_data(self,ids,context={}): company_id=get_active_company() company=get_model('company').browse(company_id) diff --git a/netforce_clinic/models/report_hd_case_detail.py b/netforce_clinic/models/report_hd_case_detail.py index a6ee966..cf31819 100644 --- a/netforce_clinic/models/report_hd_case_detail.py +++ b/netforce_clinic/models/report_hd_case_detail.py @@ -77,6 +77,295 @@ class ReportHDCaseDetail(Model): #print('report.hd.case.detail.defaults ', res) return res + def get_report_data_revise(self,ids,context={}): + user_id=get_active_user() + set_active_user(1) + + company_id=get_active_company() + company=get_model("company").browse(company_id) + defaults=self.default_get(context=context) + date=defaults.get('date',time.strftime("%Y-%m-%d")) + year=int(date[0:4]) + crr_month=int(date[5:7]) + weekday, crr_total_day=monthrange(year, crr_month) + date_from=defaults.get('date_from',date) + date_to=defaults.get('date_to',date) + branch_id=defaults.get("branch_id",None) + department_id=defaults.get("department_id",None) + hdcase_type=defaults.get('hdcase_type') + report_type=defaults.get('report_type','topic1') + patient_type_id=defaults.get('patient_type_id') + time_start='%s-%s-01'%(year,str(crr_month).zfill(2)) + time_stop='%s-%s-%s'%(year,str(crr_month).zfill(2),crr_total_day) + titles=dict(self._fields['report_type'].selection) + title=titles.get(report_type,'no title') + if ids: + obj=self.browse(ids)[0] + branch_id=obj.branch_id.id + department_id=obj.department_id.id + date=obj.date + crr_month=int(date[5:7]) + time_start=obj.date_from + time_stop=obj.date_to + year=int(date[0:4]) + date_from=obj.date_from + date_to=obj.date_to + report_type=obj.report_type or 'topic1' + hdcase_type=obj.hdcase_type or 'completed' + patient_type_id=obj.patient_type_id.id + prev_year=year + next_year=year + prev_month=crr_month-1 + next_month=crr_month+1 + if crr_month==1: + prev_month=12 + prev_year-=1 + if crr_month==12: + next_month=1 + next_year+=1 + month_str=utils.MONTHS['th_TH'][crr_month] + next_month_str=utils.MONTHS['th_TH'][next_month] + prev_month_str=utils.MONTHS['th_TH'][prev_month] + + def replace_quote(dom=""): + dom=dom.replace("False","false") + dom=dom.replace("True","true") + return dom.replace("'","\"") + dom=[] + lines=[] + total=0 + # current hd case + if report_type=='topic1': + title=titles.get(report_type,'no title') + dom=[] + dom.append(["date",">=",date_from]) + dom.append(["date","<=",date_to]) + if hdcase_type=='completed': + dom.append(["state","in",["waiting_payment","paid"]]) + else: + dom.append(["state","not in",["waiting_payment","paid"]]) + if branch_id: + dom.append(['branch_id','=',branch_id]) + if department_id: + dom.append(['department_id','=',department_id]) + total=0 + for hdcase in get_model("clinic.hd.case").search_browse(dom,order="number"): + patient=hdcase.patient_id + lines.append({ + 'number': hdcase.number, + 'date': hdcase.date, + 'name': patient.name, + 'note': hdcase.note, + }) + total+=1 + # number of patient from previous month + elif report_type=='topic2': + title=titles.get(report_type,'no title') + title+=' '+prev_month_str + prev_weekday, prev_total_day=monthrange(prev_year, prev_month) + reg_date='%s-%s-%s'%(prev_year,str(prev_month).zfill(2),str(prev_total_day).zfill(2)) + print('topic2 ', reg_date) + dom=[] + dom.append(['reg_date','<=',reg_date]) + dom.append(['walkin','=',"no"]) + #dom.append(['dispose','=',False]) + if branch_id: + dom.append(['branch_id','=',branch_id]) + if department_id: + dom.append(['department_id','=',department_id]) + total=0 + for patient in get_model("clinic.patient").search_browse(dom): + if patient.dispose and patient.resign_date: + if patient.resign_date < date_from: + print('continue >>> ', patient.name, patient.resign_date, date_from, date_to) + continue + elif patient.resign_date > date_to: + pass + elif not patient.resign_date > date_to: + print('pass >>> ', patient.name, patient.resign_date, date_from, date_to) + elif not (patient.resign_date>=date_from and patient.resign_date<=date_to): + print('continue >>> ', patient.name, patient.resign_date, date_from, date_to) + continue + print('pass >>> ', patient.name, patient.resign_date, date_from, date_to) + lines.append({ + 'number': patient.hn_no, + 'pid': patient.id, + 'name': patient.name, + 'note': patient.note, + 'date': patient.reg_date, + }) + total+=1 + # new patient of this month + #TODO should include move_history + elif report_type=='topic3': + title=titles.get(report_type,'no title') + title+=' '+month_str + dom=[] + dom.append(['date','>=',time_start]) + dom.append(['date','<=',time_stop]) + dom.append(['type','=',"in"]) + #dom.append(['reg_date','>=',time_start]) + #dom.append(['reg_date','<=',time_stop]) + #dom.append(['walkin','=',"no"]) + #dom.append(['dispose','=',False]) + #if branch_id: + #dom.append(['branch_id','=',branch_id]) + #if department_id: + #dom.append(['department_id','=',department_id]) + total=0 + for moves in get_model('clinic.patient.move').search_browse(dom): + if moves.patient_id.branch_id.id!=branch_id: + continue + if moves.patient_id.department_id.id!=department_id: + continue + lines.append({ + #'number': patient.hn_no, + #'pid': patient.id, + #'name': patient.name, + #'note': patient.note, + #'date': patient.reg_date, + 'number': moves.patient_id.hn_no, + 'pid': moves.patient_id.id, + 'name': moves.patient_id.name, + 'note': moves.patient_id.note, + 'date': moves.date[:10], + }) + total+=1 + # number for patient who resign for this month + #TODO should include move_history + elif report_type=='topic4': + title=titles.get(report_type,'no title') + title+=' '+month_str + dom=[] + #dom.append(['resign_date','>=',time_start]) + #dom.append(['resign_date','<=',time_stop]) + dom.append(['date','>=',time_start]) + dom.append(['date','<=',time_stop]) + dom.append(['type','=',"out"]) + #dom.append(['walkin','=',"no"]) + #dom.append(['dispose','=',True]) + #if branch_id: + #dom.append(['branch_id','=',branch_id]) + #if department_id: + #dom.append(['department_id','=',department_id]) + total=0 + for moves in get_model('clinic.patient.move').search_browse(dom): + if moves.patient_id.branch_id.id!=branch_id: + continue + if moves.patient_id.department_id.id!=department_id: + continue + lines.append({ + 'number': moves.patient_id.hn_no, + 'pid': moves.patient_id.id, + 'name': moves.patient_id.name, + 'note': moves.patient_id.note, + 'date': moves.date[:10], + }) + total+=1 + # all patient who are in hospital on select month + elif report_type=='topic5': + print('topic5 ', time_stop) + title=titles.get(report_type,'no title') + title+=' '+next_month_str + dom=[] + dom.append(['reg_date','<=',time_stop]) + if branch_id: + dom.append(['branch_id','=',branch_id]) + if department_id: + dom.append(['department_id','=',department_id]) + dom.append(['walkin','=',"no"]) + total=0 + for patient in get_model('clinic.patient').search_browse(dom,order="reg_date"): + if patient.dispose and patient.resign_date: + if patient.resign_date < date_from: + print('1. continue >>> ', patient.name, patient.resign_date, date_from, date_to) + continue + elif patient.resign_date > date_to: + pass + elif patient.resign_date > date_to: + print('2. pass >>> ', patient.name, patient.resign_date, date_from, date_to) + elif (patient.resign_date>=date_from and patient.resign_date<=date_to): + print('3. continue >>> ', patient.name, patient.resign_date, date_from, date_to) + continue + print('4. pass >>> ', patient.name, patient.resign_date, date_from, date_to) + lines.append({ + 'number': patient.hn_no, + 'pid': patient.id, + 'name': patient.name, + 'note': patient.note, + 'date': patient.reg_date, + 'dispose': patient.dispose and 'yes' or 'no', + }) + total+=1 + # find patient movement + elif report_type=='topic6': + print('topic6') + ptype=None + if patient_type_id: + ptype=get_model('clinic.patient.type').browse(patient_type_id) + if not ptype: + return {'total': 0} + title=ptype.name or '' + dom=[] + dom.append(['reg_date','<=',time_stop]) + dom.append(['type_id','=',ptype['id']]) + dom.append(['walkin','=',"no"]) + dom.append(['type_id','=',ptype.id]) + if branch_id: + dom.append(['branch_id','=',branch_id]) + if department_id: + dom.append(['department_id','=',department_id]) + total=0 + for patient in get_model("clinic.patient").search_browse(dom): + if patient.resign_date: + if patient.dispose and patient.resign_date < date_from: + print('1. continue >>> ', patient.name, patient.resign_date, date_from, date_to) + continue + elif patient.resign_date > date_to: + pass + elif patient.resign_date > date_to: + print('2. pass >>> ', patient.name, patient.resign_date, date_from, date_to) + elif (patient.resign_date>=date_from and patient.resign_date<=date_to): + print('3. continue >>> ', patient.name, patient.resign_date, date_from, date_to) + continue + print('4. pass >>> ', patient.name, patient.resign_date, date_from, date_to) + lines.append({ + 'pid': patient.id, + 'number': patient.hn_no, + 'name': patient.name or '', + 'date': patient.reg_date, + }) + total+=1 + sub_name='' + if department_id: + dpt=get_model("clinic.department").browse(department_id) + sub_name="(%s)" % dpt.name or "" + elif branch_id: + branch=get_model("clinic.branch").browse(branch_id) + sub_name="(%s)" % branch.name or "" + no=1 + for line in lines: + line['no']="{0:,.0f}".format(no) + no+=1 + data={ + 'total_txt': "{0:,.0f}".format(total), + 'total': total, + 'title': title, + 'report_type': report_type, + 'date': date, + 'date_from': date_from, + 'date_to': date_to, + 'month': month_str, + 'year': year, + 'branch_id': branch_id, + 'department_id': department_id, + 'lines': lines, + 'company_name': '%s %s'% (company.name or "", sub_name), + 'parent_company_name': company.parent_id.name or "", + } + set_active_user(user_id) + return data + def get_report_data(self,ids,context={}): user_id=get_active_user() set_active_user(1) diff --git a/netforce_clinic/models/report_hdcase_summary.py b/netforce_clinic/models/report_hdcase_summary.py index 9167607..43ec6b1 100644 --- a/netforce_clinic/models/report_hdcase_summary.py +++ b/netforce_clinic/models/report_hdcase_summary.py @@ -69,6 +69,179 @@ class ReportHDCaseSummary(Model): #TODO get data from clinic.patient.move #DO SOME STAFF data={} + year=year+543 + sub_name='' + if department_id: + department_id=department_id[0] + if branch_id: + branch_id=branch_id[0] + if ids: + obj=self.browse(ids)[0] + branch_id=obj.branch_id.id + department_id=obj.department_id.id + date=obj.date + crr_month=int(date[5:7]) #XXX + year=int(date[0:4]) + date_from=obj.date_from + date_to=obj.date_to + hdcase_type=obj.hdcase_type or 'completed' + prev_year=year + next_year=year + prev_month=crr_month-1 + next_month=crr_month+1 + if crr_month==1: + prev_month=12 + prev_year-=1 + if crr_month==12: + next_month=1 + next_year+=1 + + month_str=utils.MONTHS['th_TH'][crr_month] + next_month_str=utils.MONTHS['th_TH'][next_month] + prev_month_str=utils.MONTHS['th_TH'][prev_month] + + def rzero(n): + if not n: + return '0' + n="{0:,.0f}".format(n) + return n + + def set_default(dom=[],topic='topic1'): + dom_txt='' + for f,op,v in dom: + if 'in' in op: + continue + dom_txt+='defaults.%s%s%s&'%(f,op,v) + if date: + dom_txt+='&defaults.date=%s'%date + if date_from: + dom_txt+='&defaults.date_from=%s'%date_from + if date_to: + dom_txt+='&defaults.date_to=%s'%date_to + if topic: + dom_txt+='&defaults.report_type=%s'%topic + if hdcase_type: + dom_txt+='&defaults.hdcase_type=%s'%hdcase_type + return dom_txt + + def set_ctx(dom=[],topic='topic1'): + ctx={'defaults': {}} + ctx['defaults'].update({ + 'report_type': topic, + 'hdcase_type': hdcase_type, + 'date': date, + 'date_from': date_from, + 'date_to': date_to, + }) + for f,op,v in dom: + if 'in' in op: #XXX + continue + ctx['defaults'].update({ + f: v, + }) + return ctx + + dom=[] + if branch_id: + dom.append(['branch_id','=',branch_id]) + if department_id: + dom.append(['department_id','=',department_id]) + + topics=utils.TOPICS + count=6 + number=[1,2,3,4,5] + for ptype in get_model("clinic.patient.type").search_browse([[]]): + topic='topic%s'%count + topics.update({ + topic:{ + 'name': ptype.name, + 'unit': 'คน', + 'ptype_id': ptype.id, + } + }) + number.append(count) + count+=1 + month_val='' + items={} + for index in number: + if index==2: + weekday, prev_total_day=monthrange(prev_year, prev_month) + month_val=prev_month_str + elif index==5: + month_val=next_month_str + else: + month_val=month_str + topic="topic%s"%(str(index)) + if 'ptype_id' in topics[topic]: + dom2=dom+[['patient_type_id','=',topics[topic]['ptype_id']]] + dom_txt=set_default(dom2,topic) + ctx=set_ctx(dom2,topic) + qty=get_model("clinic.report.hd.case.detail").get_report_data_revise(ids=[],context=ctx)['total'] + else: + dom_txt=set_default(dom,topic) + ctx=set_ctx(dom,topic) + qty=get_model("clinic.report.hd.case.detail").get_report_data_revise(ids=[],context=ctx)['total'] + item_vals={ + "topic": topics[topic]['name'], + "unit": topics[topic]['unit'], + "month": month_val if index<=5 else "", + "qty": rzero(qty), + "action": 'clinic_patient' if index==5 else "", + "link": "clinic_report_hd_case_detail&%s"%dom_txt, + } + if hdcase_type!="completed" and index==1: + item_vals['link']='clinic_report_hd_case_detail&%s'%dom_txt + items[topic]=item_vals + + lines=[] + items_vals=sorted(items, key=lambda s: int(s[5:])) + for item in items_vals: + line=items[item] + lines.append(line) + if hdcase_type=='not_completed': + lines[0]['topic']='%s (ไม่สำเร็จ)'%lines[0]['topic'] + context['defaults']={ + 'date': date, + 'date_from': date_from, + 'date_to': date_to, + 'branch_id': branch_id, + 'department_id': department_id, + 'hdcase_type': hdcase_type, + } + medicals=get_model("clinic.report.medical.summary").get_report_data(ids=[],context=context) + if department_id: + dpt=get_model("clinic.department").browse(department_id) + sub_name="(%s)" % dpt.name or "" + if branch_id: + branch=get_model("clinic.branch").browse(branch_id) + sub_name="(%s)" % branch.name or "" + medical_lines=medicals['lines'] + medical_titles=medicals['titles'] + plines=medicals['plines'] + prod_titles=medicals['prod_titles'] + date_print=time.strftime("%m/%d/%Y %H:%M:%S") + user=get_model('base.user').browse(get_active_user()) + data={ + 'user_name': user.name, + 'hdcase_type': hdcase_type, + 'branch_id': branch_id, + 'department_id': department_id, + 'date_from': date_from, + 'date_to': date_to, + 'date': date, + 'date_print': date_print, + 'month': month_str, + 'year': year, + 'lines': lines, + 'recent_patients': get_model("clinic.report.recent.patient").get_report_data_revise(ids=[],context=context)['lines'], + 'resign_patients': get_model("clinic.report.discontinue.patient").get_report_data_revise(ids=[],context=context)['lines'], + 'medicals': medical_lines, + 'titles': medical_titles, + 'plines': plines, + 'prod_titles': prod_titles, + 'company_name': '%s %s'% (company.name or "", sub_name), + 'parent_company_name': company.parent_id.name or "", + } return data def onchange_date(self,context={}): diff --git a/netforce_clinic/models/report_recent_patient.py b/netforce_clinic/models/report_recent_patient.py index c423d33..104edad 100644 --- a/netforce_clinic/models/report_recent_patient.py +++ b/netforce_clinic/models/report_recent_patient.py @@ -50,6 +50,76 @@ class ReportRecentPatient(Model): } return res + def get_report_data_revise(self,ids,context={}): + company_id=get_active_company() + company=get_model('company').browse(company_id) + year, month=time.strftime("%Y-%m").split("-") + weekday, total_day=monthrange(int(year), int(month)) + defaults=self.default_get(context=context) + time_start=defaults.get("date_from") + time_stop=defaults.get("date_to") + branch_id=defaults.get("branch_id") + department_id=defaults.get("department_id") + if ids: + obj=self.browse(ids)[0] + month=obj.date_from.split("-")[1] + time_start=obj.date_from + time_stop=obj.date_to + branch_id=obj.branch_id.id + department_id=obj.department_id.id + # new patient of this month + dom=[] + dom.append(['date','>=',time_start]) + dom.append(['date','<=',time_stop]) + dom.append(['type','=',"in"]) + #dom.append(['reg_date','>=',time_start]) + #dom.append(['reg_date','<=',time_stop]) + #dom.append(['walkin','=',"no"]) + #dom.append(['dispose','=',False]) + #if branch_id: + #dom.append(['branch_id','=',branch_id]) + #if department_id: + #dom.append(['department_id','=',department_id]) + records=get_model('clinic.patient.move').search_browse(dom) + lines=[] + no=1 + for record in records: + if record.patient_id.branch_id.id!=branch_id: + continue + if record.patient_id.department_id.id!=department_id: + continue + lines.append({ + 'no': no, + 'name': record.patient_name or '', + 'pid': record.id, + 'note': record.patient_id.note or '', + 'reg_date': record.date[:10], + }) + no+=1 + + month_str=utils.MONTHS['th_TH'][int(month)] + start=int(time_start[8:10]) + stop=int(time_stop[8:10]) + diff=stop-start + sub_name='' + if department_id: + dpt=get_model("clinic.department").browse(department_id) + sub_name="(%s)" % dpt.name or "" + elif branch_id: + branch=get_model("clinic.branch").browse(branch_id) + sub_name="(%s)" % branch.name or "" + data={ + 'company_name': '%s %s'%(company.name or "", sub_name), + 'parent_company_name': company.parent_id.name or "", + 'lines': lines, + 'month': month_str, + 'from': time_start, + 'to': time_stop, + 'is_duration': diff+1 < total_day, + 'year': year, + } + return data + def get_report_data(self,ids,context={}): company_id=get_active_company() company=get_model('company').browse(company_id) diff --git a/netforce_clinic/templates/report_hdcase_summary.hbs b/netforce_clinic/templates/report_hdcase_summary.hbs index 017ee66..785d089 100644 --- a/netforce_clinic/templates/report_hdcase_summary.hbs +++ b/netforce_clinic/templates/report_hdcase_summary.hbs @@ -68,7 +68,10 @@ {{no}} {{reg_date}} - {{view "link" string=name action="clinic_patient" action_options="mode=form" active_id=pid}} + {{view "link" string=name action="clinic_patient_move" action_options="mode=form" active_id=pid}} + + + {{/each}} @@ -98,7 +101,10 @@ {{no}} {{resign_date}} - {{view "link" string=name action="clinic_patient" action_options="mode=form" active_id=pid}} + {{view "link" string=name action="clinic_patient_move" action_options="mode=form" active_id=pid}} + + + {{/each}} From 1062124931c0c93fe166e6454d3b99725f417e6b Mon Sep 17 00:00:00 2001 From: "watcha.h" Date: Fri, 24 Nov 2017 15:28:42 +0700 Subject: [PATCH 10/42] paid invoice on hdcase --- .../layouts/clinic_account_setting.xml | 1 + .../layouts/clinic_hd_case_form.xml | 1 + netforce_clinic/models/account_invoice.py | 32 +++++++++++++++++++ netforce_clinic/models/setting.py | 1 + 4 files changed, 35 insertions(+) diff --git a/netforce_clinic/layouts/clinic_account_setting.xml b/netforce_clinic/layouts/clinic_account_setting.xml index d0ff53a..0585c21 100644 --- a/netforce_clinic/layouts/clinic_account_setting.xml +++ b/netforce_clinic/layouts/clinic_account_setting.xml @@ -55,6 +55,7 @@ + diff --git a/netforce_clinic/layouts/clinic_hd_case_form.xml b/netforce_clinic/layouts/clinic_hd_case_form.xml index 2576196..17d8705 100644 --- a/netforce_clinic/layouts/clinic_hd_case_form.xml +++ b/netforce_clinic/layouts/clinic_hd_case_form.xml @@ -135,6 +135,7 @@ + {{/each}} @@ -103,8 +106,11 @@ {{view "link" string=name action="clinic_patient_move" action_options="mode=form" active_id=pid}} + - + {{/each}} From 1edcbbea3580297c0b8306496991211a1e2c2057 Mon Sep 17 00:00:00 2001 From: SPP Date: Tue, 26 Dec 2017 15:00:07 +0700 Subject: [PATCH 16/42] dev --- .../clinic_report_wizard_labor_cost.xml | 2 +- .../layouts/report_hdcase_expense_summary.xml | 3 + netforce_clinic/migrations/__init__.py | 3 +- netforce_clinic/migrations/check_patient.py | 70 ++++++++++++++++++ netforce_clinic/models/account_payment.py | 2 +- netforce_clinic/models/hd_case.py | 5 +- netforce_clinic/models/patient.py | 2 +- .../models/report_hdcase_expense_summary.py | 15 +++- .../models/report_wizard_labor_cost.py | 12 +-- netforce_clinic/models/visit.py | 8 +- netforce_clinic/reports/cust_payment.odt | Bin 53146 -> 33666 bytes .../report_hdcase_expense_summary_pdf.odt | Bin 0 -> 16129 bytes ...t => report_wizard_labor_cost_summary.odt} | Bin 13 files changed, 107 insertions(+), 15 deletions(-) create mode 100644 netforce_clinic/migrations/check_patient.py create mode 100644 netforce_clinic/reports/report_hdcase_expense_summary_pdf.odt rename netforce_clinic/reports/{report_wizard_labor_cost_summany.odt => report_wizard_labor_cost_summary.odt} (100%) diff --git a/netforce_clinic/layouts/clinic_report_wizard_labor_cost.xml b/netforce_clinic/layouts/clinic_report_wizard_labor_cost.xml index 11d4d88..70b2313 100644 --- a/netforce_clinic/layouts/clinic_report_wizard_labor_cost.xml +++ b/netforce_clinic/layouts/clinic_report_wizard_labor_cost.xml @@ -11,7 +11,7 @@ -
From 7d4275959ad538e8e56952816f4896e7faded01c Mon Sep 17 00:00:00 2001 From: SPP Date: Thu, 4 Jan 2018 11:20:22 +0700 Subject: [PATCH 18/42] Fix select box staff not show item --- netforce_clinic/layouts/clinic_report_labor_cost_sub_detail.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netforce_clinic/layouts/clinic_report_labor_cost_sub_detail.xml b/netforce_clinic/layouts/clinic_report_labor_cost_sub_detail.xml index 7982c05..2cdcc31 100644 --- a/netforce_clinic/layouts/clinic_report_labor_cost_sub_detail.xml +++ b/netforce_clinic/layouts/clinic_report_labor_cost_sub_detail.xml @@ -3,7 +3,7 @@ - + From 15b91116cdffcb4beabb268458de3ea6c5ff24e6 Mon Sep 17 00:00:00 2001 From: SPP Date: Tue, 9 Jan 2018 14:41:27 +0700 Subject: [PATCH 19/42] saved --- netforce_clinic/models/report_cycle_item.py | 6 +++--- .../reports/report_receipt_summary.xlsx | Bin 5555 -> 5660 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/netforce_clinic/models/report_cycle_item.py b/netforce_clinic/models/report_cycle_item.py index c7fd5e5..58752fe 100644 --- a/netforce_clinic/models/report_cycle_item.py +++ b/netforce_clinic/models/report_cycle_item.py @@ -277,7 +277,7 @@ class ReportCycleItem(Model): # if nurse more that cres, should show name of nurses nlines+=more_lines if no==count: - epo_items=[{'name': k, 'qty': v} for k,v in epos.items() if k ] + epo_items=sorted([{'name': k, 'qty': v} for k,v in epos.items() if k ], key=lambda a: a['name']) #sort item #clines=sorted(clines,key=lambda cl: cl[sort_by]) no=1 @@ -322,13 +322,13 @@ class ReportCycleItem(Model): 'fee': sub_fee, 'mdc': sub_mdc, 'epo_items': epo_items, - 'epo_txt': ', '.join(['%s = %s'%(k,v) for k,v in epos.items() if k]) + 'epo_txt': ', '.join(['%s = %s'%(v['name'], v['qty']) for v in epo_items if v]) }) for epo_item in epo_items: if not total_epos.get(epo_item['name']): total_epos[epo_item['name']]=0 total_epos[epo_item['name']]+=epo_item['qty'] or 0 - total_epo_items=[{'name': k, 'qty': v} for k,v in total_epos.items() if k ] + total_epo_items=sorted([{'name': k, 'qty': v} for k,v in total_epos.items() if k ], key=lambda a: a['name']) vscl_lines=[] for k,v in vasculars.items(): vscl_lines.append({ diff --git a/netforce_clinic/reports/report_receipt_summary.xlsx b/netforce_clinic/reports/report_receipt_summary.xlsx index 459685f44dbcae3f3d1393ae99e331de4454fc41..baf98b025533b0bd62c2b244678f2cb05d883fbb 100644 GIT binary patch delta 3082 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 J^zirT{{a4IURwYF From 8afa12274398c4a4b35fbb9d55aaf3b3cba0e650 Mon Sep 17 00:00:00 2001 From: SPP Date: Tue, 9 Jan 2018 15:34:18 +0700 Subject: [PATCH 20/42] [fixed] issue no. 6 from email --- .../models/report_hdcase_expense_summary.py | 25 ++++++++++++------ .../report_hdcase_expense_summary_pdf.odt | Bin 16129 -> 15340 bytes 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/netforce_clinic/models/report_hdcase_expense_summary.py b/netforce_clinic/models/report_hdcase_expense_summary.py index 85b3e46..d1a3325 100644 --- a/netforce_clinic/models/report_hdcase_expense_summary.py +++ b/netforce_clinic/models/report_hdcase_expense_summary.py @@ -292,6 +292,15 @@ class ReportHDCaseExpenseSummary(Model): total_dlz+=line.get('dlz_price',0) line['no']=no + ######XXX revise for accountant: convert from int to thounsand without decimal zero + line['fee']=line.get('fee') and '{:,}'.format(line.get('fee',0)) or "" + line['srv']=line.get('srv') and '{:,}'.format(line.get('srv',0)) or "" + line['epo']=line.get('epo') and '{:,}'.format(line.get('epo',0)) or "" + line['mdc']=line.get('mdc') and '{:,}'.format(line.get('mdc',0)) or "" + line['lab']=line.get('lab') and '{:,}'.format(line.get('lab',0)) or "" + line['misc']=line.get('misc') and '{:,}'.format(line.get('misc',0)) or "" + ###### + cid=line['cid'] if not cid in old: old.append(cid) @@ -324,14 +333,14 @@ class ReportHDCaseExpenseSummary(Model): 'date_from': date_from, 'date_to': date_to, 'lines': slines, - 'total_fee': total_fee, - 'total_srv': total_srv, - 'total_epo': total_epo, - 'total_mdc': total_mdc, - 'total_lab': total_lab, - 'total_misc': total_misc, - 'total_dlz': total_dlz, - 'total_qty': total_qty, + 'total_fee': total_fee and '{:,}'.format(total_fee) or "", + 'total_srv': total_srv and '{:,}'.format(total_srv) or "", + 'total_epo': total_epo and '{:,}'.format(total_epo) or "", + 'total_mdc': total_mdc and '{:,}'.format(total_mdc) or "", + 'total_lab': total_lab and '{:,}'.format(total_lab) or "", + 'total_misc': total_misc and '{:,}'.format(total_misc) or "", + 'total_dlz': total_dlz and '{:,}'.format(total_dlz) or "", + 'total_qty': total_qty and '{:,}'.format(total_qty) or "", 'types': types, 'reimbursable': reimbursable, 'is_reim': reimbursable=='yes' and True or False, diff --git a/netforce_clinic/reports/report_hdcase_expense_summary_pdf.odt b/netforce_clinic/reports/report_hdcase_expense_summary_pdf.odt index 4bf0a2d410c3a62a55e894621e9f9ad17007100f..240a5da62226786c2e54ad40ba56a8fe38be5027 100644 GIT binary patch literal 15340 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 literal 16129 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 U-u Date: Mon, 15 Jan 2018 16:14:20 +0700 Subject: [PATCH 21/42] reports/report_hdcase_expense_summary_pdf.odt --- .../report_hdcase_expense_summary_pdf.odt | Bin 15340 -> 14549 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/netforce_clinic/reports/report_hdcase_expense_summary_pdf.odt b/netforce_clinic/reports/report_hdcase_expense_summary_pdf.odt index 240a5da62226786c2e54ad40ba56a8fe38be5027..e0df4afd1180049525d595f0fe2d7fcf3d88c5e6 100644 GIT binary patch delta 12730 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 CExEY> delta 13461 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 qCG?-qH~jw+I-m!#aN@xI Date: Mon, 15 Jan 2018 16:59:59 +0700 Subject: [PATCH 22/42] [improve] report hdcase expense summary --- .../models/report_hdcase_expense_summary.py | 5 +++-- .../report_hdcase_expense_summary_pdf.odt | Bin 14549 -> 14355 bytes 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/netforce_clinic/models/report_hdcase_expense_summary.py b/netforce_clinic/models/report_hdcase_expense_summary.py index d1a3325..3ca637a 100644 --- a/netforce_clinic/models/report_hdcase_expense_summary.py +++ b/netforce_clinic/models/report_hdcase_expense_summary.py @@ -316,7 +316,8 @@ class ReportHDCaseExpenseSummary(Model): no+=1 types=[] total_qty=0 - for name, vals in ptypes.items(): + for name in sorted(ptypes.keys()): + vals=ptypes[name] qty=vals['qty'] or 0 total_qty+=qty color=vals['color'] or "default" @@ -332,7 +333,7 @@ class ReportHDCaseExpenseSummary(Model): 'date': date, 'date_from': date_from, 'date_to': date_to, - 'lines': slines, + 'lines': sorted(slines, key=lambda a: (a.get('ptype',''), a.get('epo_name',''))), 'total_fee': total_fee and '{:,}'.format(total_fee) or "", 'total_srv': total_srv and '{:,}'.format(total_srv) or "", 'total_epo': total_epo and '{:,}'.format(total_epo) or "", diff --git a/netforce_clinic/reports/report_hdcase_expense_summary_pdf.odt b/netforce_clinic/reports/report_hdcase_expense_summary_pdf.odt index e0df4afd1180049525d595f0fe2d7fcf3d88c5e6..c81571eb303b132b75a7d60f905bcab3131934fd 100644 GIT binary patch delta 12434 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

(!J10 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 From 6babde480024a3008e321b1951b1d9fa00b87133 Mon Sep 17 00:00:00 2001 From: SPP Date: Mon, 22 Jan 2018 13:19:10 +0700 Subject: [PATCH 23/42] Edit report hdcase expense summary (Title : sorted) --- netforce_clinic/models/report_hdcase_expense_summary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netforce_clinic/models/report_hdcase_expense_summary.py b/netforce_clinic/models/report_hdcase_expense_summary.py index 3ca637a..270e188 100644 --- a/netforce_clinic/models/report_hdcase_expense_summary.py +++ b/netforce_clinic/models/report_hdcase_expense_summary.py @@ -333,7 +333,7 @@ class ReportHDCaseExpenseSummary(Model): 'date': date, 'date_from': date_from, 'date_to': date_to, - 'lines': sorted(slines, key=lambda a: (a.get('ptype',''), a.get('epo_name',''))), + 'lines': sorted(slines, key=lambda a: (a.get('ptype',''), a.get('epo_name',''), a.get('pname',''))), 'total_fee': total_fee and '{:,}'.format(total_fee) or "", 'total_srv': total_srv and '{:,}'.format(total_srv) or "", 'total_epo': total_epo and '{:,}'.format(total_epo) or "", From 12e81bfd7111fe09a009d1c4a91f26c68d54a264 Mon Sep 17 00:00:00 2001 From: SPP Date: Mon, 22 Jan 2018 13:21:37 +0700 Subject: [PATCH 24/42] report_wizard_labor_cost merge file to pdf (3) --- netforce_clinic/layouts/clinic_menu.xml | 2 +- .../clinic_print_wizard_labor_cost_form.xml | 2 + .../clinic_print_wizard_labor_cost_list.xml | 5 +++ .../models/print_wizard_labor_cost.py | 13 ++++-- .../models/report_labor_cost_sub_detail.py | 40 ++++++++++++------- 5 files changed, 43 insertions(+), 19 deletions(-) diff --git a/netforce_clinic/layouts/clinic_menu.xml b/netforce_clinic/layouts/clinic_menu.xml index 3ca2c74..90d0136 100644 --- a/netforce_clinic/layouts/clinic_menu.xml +++ b/netforce_clinic/layouts/clinic_menu.xml @@ -45,7 +45,7 @@ - + diff --git a/netforce_clinic/layouts/clinic_print_wizard_labor_cost_form.xml b/netforce_clinic/layouts/clinic_print_wizard_labor_cost_form.xml index 28dcc21..97f5ec9 100644 --- a/netforce_clinic/layouts/clinic_print_wizard_labor_cost_form.xml +++ b/netforce_clinic/layouts/clinic_print_wizard_labor_cost_form.xml @@ -8,9 +8,11 @@ + +