labor cost and search patient type
parent
9abb3c8e0e
commit
d3a5cb86e2
|
@ -0,0 +1,8 @@
|
|||
<action>
|
||||
<field name="string">Report Staff</field>
|
||||
<field name="view_cls">multi_view</field>
|
||||
<field name="model">clinic.report.staff</field>
|
||||
<field name="modes">list,form</field>
|
||||
<field name="menu">account_menu</field>
|
||||
<field name="limit">25</field>
|
||||
</action>
|
|
@ -22,7 +22,16 @@
|
|||
<separator string="Doctor"/>
|
||||
<field name="cost_per_case"/>
|
||||
</tab>
|
||||
<tab string="Importing">
|
||||
<tab string="Products">
|
||||
<field name="account_products" nolabel="1">
|
||||
<list>
|
||||
<field name="product_id"/>
|
||||
<field name="ar_debit_id"/>
|
||||
<field name="ar_credit_id"/>
|
||||
</list>
|
||||
</field>
|
||||
</tab>
|
||||
<tab string="Matching Payment">
|
||||
<field name="patient_type_id"/>
|
||||
<field name="imp_patient_type_id"/>
|
||||
</tab>
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
<field name="date"/>
|
||||
<field name="cycle_id"/>
|
||||
<field name="patient_id"/>
|
||||
<field name="patient_type_id"/>
|
||||
<field name="department_id"/>
|
||||
<field name="branch_id"/>
|
||||
</search>
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
<field name="qty" onchange="onchange_line"/>
|
||||
<field name="rate" onchange="onchange_line"/>
|
||||
<field name="amount"/>
|
||||
<field name="report_staff_id"/>
|
||||
</list>
|
||||
</field>
|
||||
<field name="dcost" string="Total" span="3" offset="9"/>
|
||||
|
@ -37,6 +38,7 @@
|
|||
<field name="qty" string="PT" onchange="onchange_line"/>
|
||||
<field name="rate" onchange="onchange_line"/>
|
||||
<field name="amount"/>
|
||||
<field name="report_staff_id"/>
|
||||
</list>
|
||||
</field>
|
||||
<field name="ncost" string="Total" span="3" offset="9"/>
|
||||
|
|
|
@ -47,8 +47,8 @@
|
|||
<field name="description"/>
|
||||
<field name="level_id"/>
|
||||
<field name="state"/>
|
||||
<field name="qty" onchange="onchange_cost_line"/>
|
||||
<field name="rate" onchange="onchange_cost_line"/>
|
||||
<!--<field name="qty" onchange="onchange_cost_line"/>-->
|
||||
<!--<field name="rate" onchange="onchange_cost_line"/>-->
|
||||
<field name="amount"/>
|
||||
</list>
|
||||
</field>
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
<item string="HD Case Expenses" action="clinic_hd_case_expense"/>
|
||||
<divider/>
|
||||
<header string="REPORTS"/>
|
||||
<item string="Staff" action="clinic_report_staff"/>
|
||||
<item string="Staff Fee" action="clinic_report_staff_fee"/>
|
||||
<item string="Staff Fee Detail" action="clinic_report_staff_fee_detail"/>
|
||||
<item string="Staff Fee Summary" action="clinic_report_staff_fee_sum"/>
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
<form model="clinic.report.staff">
|
||||
<head>
|
||||
<button string="Print" icon="print"/>
|
||||
<button string="Options" dropdown="1">
|
||||
<item string="TODO"/>
|
||||
</button>
|
||||
</head>
|
||||
<group form_layout="stacked">
|
||||
<field name="date_from" span="3"/>
|
||||
<field name="date_to" span="3"/>
|
||||
<field name="staff_id" span="3"/>
|
||||
</group>
|
||||
<field name="lines" nolabel="1">
|
||||
<list>
|
||||
<field name="hd_case_id"/>
|
||||
</list>
|
||||
</field>
|
||||
</form>
|
|
@ -0,0 +1,6 @@
|
|||
<list model="clinic.report.staff">
|
||||
<field name="date_from"/>
|
||||
<field name="date_to"/>
|
||||
<field name="staff_id"/>
|
||||
<field name="hdcase_total"/>
|
||||
</list>
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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"
|
||||
|
@ -34,4 +35,11 @@ class LaborCostEntryLine(Model):
|
|||
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()
|
||||
|
|
|
@ -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()
|
|
@ -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()
|
|
@ -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={}):
|
||||
|
|
|
@ -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()
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue