diff --git a/netforce_clinic/actions/clinic_report_staff.xml b/netforce_clinic/actions/clinic_report_staff.xml new file mode 100644 index 0000000..da3ebcb --- /dev/null +++ b/netforce_clinic/actions/clinic_report_staff.xml @@ -0,0 +1,8 @@ + + Report Staff + multi_view + clinic.report.staff + list,form + account_menu + 25 + diff --git a/netforce_clinic/layouts/clinic_account_setting.xml b/netforce_clinic/layouts/clinic_account_setting.xml index 02b4b80..f2ac11a 100644 --- a/netforce_clinic/layouts/clinic_account_setting.xml +++ b/netforce_clinic/layouts/clinic_account_setting.xml @@ -22,7 +22,16 @@ - + + + + + + + + + + diff --git a/netforce_clinic/layouts/clinic_hd_case_search.xml b/netforce_clinic/layouts/clinic_hd_case_search.xml index 45b9f09..5acd5a9 100644 --- a/netforce_clinic/layouts/clinic_hd_case_search.xml +++ b/netforce_clinic/layouts/clinic_hd_case_search.xml @@ -3,6 +3,7 @@ + diff --git a/netforce_clinic/layouts/clinic_labor_cost_entry_form.xml b/netforce_clinic/layouts/clinic_labor_cost_entry_form.xml index 17cf7f4..9a97b90 100644 --- a/netforce_clinic/layouts/clinic_labor_cost_entry_form.xml +++ b/netforce_clinic/layouts/clinic_labor_cost_entry_form.xml @@ -24,6 +24,7 @@ + @@ -37,6 +38,7 @@ + diff --git a/netforce_clinic/layouts/clinic_labor_cost_form.xml b/netforce_clinic/layouts/clinic_labor_cost_form.xml index 775e155..93ec199 100644 --- a/netforce_clinic/layouts/clinic_labor_cost_form.xml +++ b/netforce_clinic/layouts/clinic_labor_cost_form.xml @@ -47,8 +47,8 @@ - - + + diff --git a/netforce_clinic/layouts/clinic_menu_inherit.xml b/netforce_clinic/layouts/clinic_menu_inherit.xml index 51b561d..2dc50dc 100644 --- a/netforce_clinic/layouts/clinic_menu_inherit.xml +++ b/netforce_clinic/layouts/clinic_menu_inherit.xml @@ -9,6 +9,7 @@
+ diff --git a/netforce_clinic/layouts/clinic_report_staff_form.xml b/netforce_clinic/layouts/clinic_report_staff_form.xml new file mode 100644 index 0000000..98dd688 --- /dev/null +++ b/netforce_clinic/layouts/clinic_report_staff_form.xml @@ -0,0 +1,18 @@ +
+ + + + + + + + + + + + + +
diff --git a/netforce_clinic/layouts/clinic_report_staff_list.xml b/netforce_clinic/layouts/clinic_report_staff_list.xml new file mode 100644 index 0000000..4b46ab0 --- /dev/null +++ b/netforce_clinic/layouts/clinic_report_staff_list.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/netforce_clinic/models/__init__.py b/netforce_clinic/models/__init__.py index 1f8c54e..6549256 100644 --- a/netforce_clinic/models/__init__.py +++ b/netforce_clinic/models/__init__.py @@ -1,6 +1,7 @@ from . import utils from . import setting from . import fin_setting +from . import setting_account_product from . import setting_product from . import setting_level from . import setting_policy @@ -62,6 +63,8 @@ from . import report_hd_case_summary from . import report_medical_summary from . import report_recent_patient from . import report_discontinue_patient +from . import report_staff +from . import report_staff_line from . import report_staff_fee from . import report_staff_fee_detail from . import report_staff_fee_sum diff --git a/netforce_clinic/models/hd_case.py b/netforce_clinic/models/hd_case.py index 1484d32..26e8024 100644 --- a/netforce_clinic/models/hd_case.py +++ b/netforce_clinic/models/hd_case.py @@ -78,7 +78,7 @@ class HDCase(Model): "time_stop": fields.DateTime("Finish Time",required=True), "date": fields.Date("Date",required=True,search=True), "patient_id": fields.Many2One("clinic.patient","Patient",required=True,search=True), - "patient_type_id": fields.Many2One("clinic.patient.type", "Type",function="_get_patient_type"), + "patient_type_id": fields.Many2One("clinic.patient.type", "Type"), "nurse_id": fields.Many2One("clinic.staff","Approve By", domain=[['type','=','nurse']]), "department_id": fields.Many2One("clinic.department", "Department",search=True), "wt_start": fields.Float("Start Wt (kg.)"), @@ -983,8 +983,8 @@ class HDCase(Model): vals['lines']=[] for st_prod in st.products: if patient.type_id.id==st_prod.patient_type_id.id: - price=st_prod.price - qty=st_prod.qty + price=st_prod.price or 0 + qty=st_prod.qty or 0 amt=st_prod.amount categ=st_prod.product_categ_id account_id=st_prod.ar_credit_id.id diff --git a/netforce_clinic/models/labor_cost.py b/netforce_clinic/models/labor_cost.py index 235e734..6ba440a 100644 --- a/netforce_clinic/models/labor_cost.py +++ b/netforce_clinic/models/labor_cost.py @@ -394,12 +394,20 @@ class LaborCost(Model): def update_amt(self,context): total=0.0 data=context['data'] - for line in data['lines']: + for line in data['doctor_lines']: qty=line['qty'] or 0 rate=line['rate'] or 0.0 amt=qty*rate total+=amt - data['total_cost']=total + data['total_dcost']=total + for line in data['nurse_lines']: + #qty=line['qty'] or 0 + #rate=line['rate'] or 0.0 + #amt=qty*rate + amt=line['amount'] or 0.0 + total+=amt + data['total_ncost']=total + data['total']=total return data def create(self,vals,**kw): diff --git a/netforce_clinic/models/labor_cost_entry.py b/netforce_clinic/models/labor_cost_entry.py index fd88875..557ad0f 100644 --- a/netforce_clinic/models/labor_cost_entry.py +++ b/netforce_clinic/models/labor_cost_entry.py @@ -101,18 +101,28 @@ class LaborCostEntry(Model): amt=line.amount state=line.state or staff.state dpt=staff.department_id + citem=line.labor_cost_id.cycle_item_id if not dpt: - dpt=line.labor_cost_id.cycle_item_id.department_id + dpt=citem.department_id if not staffs.get(staff.id): staffs[staff.id]={ + 'staff_type': staff.type, 'department_id': dpt.id, 'qty': 0, 'amt': 0, 'rate': 0, # XXX for special nurse 'state': state, + 'report_staff_id': get_model("clinic.report.staff").create({ + 'date_from': obj.date_from, + 'date_to': obj.date_to, + 'staff_id': staff.id, + }), + 'items': set(), } + # create staff report staffs[staff.id]['qty']+=qty staffs[staff.id]['amt']+=amt + staffs[staff.id]['items'].update({citem.id}) lines=[] timenow=time.strftime("%Y-%m-%d") @@ -120,6 +130,29 @@ class LaborCostEntry(Model): qty=vals['qty'] or 0 amt=vals['amt'] or 0.0 state=vals['state'] + report_staff_id=vals['report_staff_id'] + report_staff=get_model("clinic.report.staff").browse(report_staff_id) + # find hd case for each staff + hids=set() + for item in get_model("clinic.cycle.item").browse(vals['items']): + if vals['staff_type']=='nurse': + for hd_case in item.hd_cases: + hids.update({hd_case.id}) + else: + for hd_case in item.hd_cases: + doctor_id=hd_case.doctor_id.id + if staff_id==doctor_id: + hids.update({hd_case.id}) + rlines=[] + for hid in list(hids): + rlines.append(('create',{ + 'hd_case_id': hid, + })) + report_staff.write({ + 'lines': rlines, + }) + ##### + rate=0.0 if qty: rate=amt/qty # average @@ -131,6 +164,7 @@ class LaborCostEntry(Model): 'rate': rate, 'state': state, 'department_id': vals['department_id'], + 'report_staff_id': report_staff.id, })) for line in obj.lines: diff --git a/netforce_clinic/models/labor_cost_entry_line.py b/netforce_clinic/models/labor_cost_entry_line.py index e42a400..ecd3813 100644 --- a/netforce_clinic/models/labor_cost_entry_line.py +++ b/netforce_clinic/models/labor_cost_entry_line.py @@ -19,6 +19,7 @@ class LaborCostEntryLine(Model): 'department_id': fields.Many2One("clinic.department","Department"), "type": fields.Selection([['staff','Staff'],["doctor","Doctor"],["nurse","Nurse"]],"Type"), "state": fields.Selection([["part_time","Part Time"],["full_time","Full Time"]],"Working Status",search=True), + 'report_staff_id': fields.Many2One("clinic.report.staff","#"), } _order="type" @@ -33,5 +34,12 @@ class LaborCostEntryLine(Model): vals['type']=staff.type new_id=super().create(vals,**kw) return new_id + + def delete(self,ids): + for obj in self.browse(ids): + report=obj.report_staff_id + if report: + report.delete() + super().delete(ids) LaborCostEntryLine.register() diff --git a/netforce_clinic/models/report_staff.py b/netforce_clinic/models/report_staff.py new file mode 100644 index 0000000..f08f7fa --- /dev/null +++ b/netforce_clinic/models/report_staff.py @@ -0,0 +1,43 @@ +from netforce.model import Model, fields + +class ReportStaff(Model): + _name='clinic.report.staff' + _string="Report Staff" + + def _get_store(self,ids,context={}): + res={} + for obj in self.browse(ids): + total=len(obj.lines) + res[obj.id]={ + 'name': total, + } + return res + + def _get_all(self,ids,context={}): + res={} + for obj in self.browse(ids): + total=len(obj.lines) + res[obj.id]={ + 'hdcase_total': total, + } + return res + + _fields={ + 'staff_id': fields.Many2One("clinic.staff",'Staff'), + 'name': fields.Char("Name", function="_get_store",function_multi=True,store=True), + 'date_from': fields.Date("From"), + 'date_to': fields.Date("To"), + 'hdcase_total': fields.Char("Total", function="_get_all",function_multi=True), + 'lines': fields.One2Many("clinic.report.staff.line","report_staff_id","Lines"), + } + + def create(self,vals,**kw): + id=super().create(vals,**kw) + self.function_store([id]) + return id + + def write(self,ids,vals,**kw): + super().write(ids,vals,**kw) + self.function_store(ids) + +ReportStaff.register() diff --git a/netforce_clinic/models/report_staff_line.py b/netforce_clinic/models/report_staff_line.py new file mode 100644 index 0000000..7542256 --- /dev/null +++ b/netforce_clinic/models/report_staff_line.py @@ -0,0 +1,11 @@ +from netforce.model import Model, fields + +class ReportStaffLine(Model): + _name='clinic.report.staff.line' + _string="Report Staff Line" + _fields={ + 'report_staff_id': fields.Many2One("clinic.report.staff","Report Staff", required=True, on_delete="cascade"), + 'hd_case_id': fields.Many2One("clinic.hd.case","HD Case"), + } + +ReportStaffLine.register() diff --git a/netforce_clinic/models/setting.py b/netforce_clinic/models/setting.py index 027ebfb..e7e2950 100644 --- a/netforce_clinic/models/setting.py +++ b/netforce_clinic/models/setting.py @@ -12,6 +12,7 @@ class ClinicSetting(Model): 'file': fields.File("File"), 'levels': fields.One2Many("clinic.setting.level","setting_id","Levels"), 'products': fields.One2Many("clinic.setting.product","setting_id","Products"), + 'account_products': fields.One2Many("clinic.setting.account.product","setting_id","Account Products"), 'invoice_policies': fields.One2Many("clinic.setting.policy","setting_id","Invoice Policies"), 'cost_per_case': fields.Float("Cost Per Case"), 'company_id': fields.Many2One("company", 'Company'), @@ -101,23 +102,13 @@ class ClinicSetting(Model): return True def run_script(self,ids,context={}): - for hdcase in get_model("clinic.hd.case").search_browse([]): - mt=hdcase.membrane_type - for dlz in hdcase.dialyzers: - dlz2=dlz.dialyzer_id - dlz2.write({ - 'membrane_type': mt, - }) - for pt in get_model("clinic.patient").search_browse([]): - count=0 - for hdcase in pt.hd_cases: - if count > 1: - break - if hdcase.vascular_acc: - pt.write({ - 'vascular_acc': hdcase.vascular_acc.id, - }) - count+=1 + count=1 + for hd_case in get_model("clinic.hd.case").search_browse([]): + hd_case.write({ + 'patient_type_id': hd_case.patient_id.type_id.id, + }) + print(count, " update ", hd_case.patient_id.type_id.id) + count+=1 print("Done! ") def reset_last_import(self,ids,context={}): diff --git a/netforce_clinic/models/setting_account_product.py b/netforce_clinic/models/setting_account_product.py new file mode 100644 index 0000000..b5692cf --- /dev/null +++ b/netforce_clinic/models/setting_account_product.py @@ -0,0 +1,21 @@ +from netforce.model import Model, fields +from netforce.access import get_active_company + +class SettingAccountProduct(Model): + _name="clinic.setting.account.product" + _string="Setting Account Product" + _multi_company=True + + _fields={ + "setting_id": fields.Many2One("clinic.setting","Setting",required=True,on_delete="cascade"), + "product_id": fields.Many2One("product","Product"), + "ar_credit_id": fields.Many2One("account.account","AR Credit",multi_company=True), + "ar_debit_id": fields.Many2One("account.account","AR Debit",multi_company=True), + 'company_id': fields.Many2One("company","Company"), + } + + _defaults={ + "company_id": lambda *a: get_active_company(), + } + +SettingAccountProduct.register() diff --git a/netforce_clinic/models/visit.py b/netforce_clinic/models/visit.py index 4d20a4a..1dd999d 100644 --- a/netforce_clinic/models/visit.py +++ b/netforce_clinic/models/visit.py @@ -161,6 +161,7 @@ class Visit(Model): hd_case_obj=get_model("clinic.hd.case") vals={ 'patient_id': obj.patient_id.id, + 'patient_type_id': obj.patient_id.type_id.id, 'vascular_acc': obj.patient_id.vascular_acc.id, 'nurse_id': obj.nurse_id.id, 'department_id': obj.department_id.id, diff --git a/netforce_clinic/todo.txt b/netforce_clinic/todo.txt index eff85b9..65df73a 100644 --- a/netforce_clinic/todo.txt +++ b/netforce_clinic/todo.txt @@ -1,5 +1,7 @@ todo: - accounting + - labor cost + - report *** - invoice line -> account -> credit - debit from hd case setting - if user select product by them self