clinic/netforce_clinic/models/labor_cost_entry.py

192 lines
6.5 KiB
Python
Raw Normal View History

2014-12-09 04:24:41 +00:00
import time
2015-01-22 10:40:05 +00:00
from calendar import monthrange
2014-12-09 04:24:41 +00:00
from netforce.model import Model, fields, get_model
from netforce.database import get_connection
from netforce.access import get_active_user, get_active_company
from netforce.utils import get_data_path
from . import utils
class LaborCostEntry(Model):
_name="clinic.labor.cost.entry"
_string="Labor Cost Entry"
_multi_company=True
2015-01-22 10:40:05 +00:00
#_key=['name']
2014-12-09 04:24:41 +00:00
def _get_all(self,ids,context={}):
res={}
for obj in self.browse(ids):
2015-01-22 10:40:05 +00:00
total=0.0
2014-12-09 04:24:41 +00:00
total_qty=0
2015-01-22 10:40:05 +00:00
dcost=0
ncost=0
2014-12-09 04:24:41 +00:00
for line in obj.lines:
2015-01-22 10:40:05 +00:00
amt=line.amount or 0
qty=line.qty or 0
if line.type=='nurse':
ncost+=amt
else:
dcost+=amt
total_qty+=qty
total+=amt
2014-12-09 04:24:41 +00:00
res[obj.id]={
2015-01-22 10:40:05 +00:00
'total':total,
2014-12-09 04:24:41 +00:00
'total_qty': total_qty,
2015-01-22 10:40:05 +00:00
'dcost': dcost,
'ncost': ncost,
2014-12-09 04:24:41 +00:00
}
return res
_fields={
2015-01-22 10:40:05 +00:00
'name': fields.Char("Name", required=True,search=True),
2014-12-09 04:24:41 +00:00
'date': fields.Date("Month",required=True),
2015-01-22 10:40:05 +00:00
'date_from': fields.Date("From",required=True),
'date_to': fields.Date("To",required=True),
'total': fields.Float("Total (Baht)", function="_get_all",function_multi=True),
2014-12-09 04:24:41 +00:00
'total_qty': fields.Float("Total Qty", function="_get_all",function_multi=True),
2015-01-22 10:40:05 +00:00
'dcost': fields.Float("Doctor Cost", function="_get_all",function_multi=True),
'ncost': fields.Float("Nurse Cost", function="_get_all",function_multi=True),
2014-12-09 04:24:41 +00:00
"lines": fields.One2Many("clinic.labor.cost.entry.line", "entry_id", "Lines"),
2015-01-22 10:40:05 +00:00
"nurse_lines": fields.One2Many("clinic.labor.cost.entry.line", "entry_id", "Nurse Lines",domain=[['type','=','nurse']]),
"doctor_lines": fields.One2Many("clinic.labor.cost.entry.line", "entry_id", "Doctor Lines",domain=[['type','=','doctor']]),
2014-12-09 04:24:41 +00:00
'state': fields.Selection([['draft','Draft'],['approved','Approved']],"State"),
2015-01-22 10:40:05 +00:00
'user_id': fields.Many2One("base.user","Approver",search=True),
2014-12-09 04:24:41 +00:00
'note': fields.Text("Note"),
'company_id': fields.Many2One("company","Company"),
2015-01-22 10:40:05 +00:00
'department_id': fields.Many2One("clinic.department","Department",search=True),
'branch_id': fields.Many2One("clinic.branch","Branch",search=True),
2014-12-09 04:24:41 +00:00
}
2015-01-22 10:40:05 +00:00
def _get_date_from(self,context={}):
year,month=time.strftime("%Y-%m").split("-")
return '%s-%s-01'%(year,month)
def _get_date_to(self,context={}):
year,month,day=time.strftime("%Y-%m-%d").split("-")
weekday, total_day=monthrange(int(year), int(month))
return "%s-%s-%s"%(year,month,total_day)
2014-12-09 04:24:41 +00:00
_defaults={
'state': 'draft',
2015-01-22 10:40:05 +00:00
'name': '/',
2014-12-09 04:24:41 +00:00
'date': lambda *a: time.strftime("%Y-%m-%d"),
2015-01-22 10:40:05 +00:00
'date_from': _get_date_from,
'date_to': _get_date_to,
2014-12-09 04:24:41 +00:00
'user_id': lambda *a: get_active_user(),
'company_id': lambda *a: get_active_company(),
}
2015-01-22 10:40:05 +00:00
_order="date_from desc,branch_id,department_id"
2014-12-09 04:24:41 +00:00
def compute(self,ids,context={}):
obj=self.browse(ids)[0]
year,month,day=obj.date.split("-")
2015-01-22 10:40:05 +00:00
line_ids=[]
dom=[
['date','>=',obj.date_from],
['date','<=',obj.date_to],
]
if obj.branch_id:
dom.append(['labor_cost_id.cycle_item_id.branch_id','=',obj.branch_id.id])
if obj.department_id:
dom.append(['labor_cost_id.cycle_item_id.department_id','=',obj.department_id.id])
for lc_id in get_model("clinic.labor.cost.line").search(dom):
line_ids.append(lc_id)
2014-12-09 04:24:41 +00:00
staffs={}
for line in get_model("clinic.labor.cost.line").browse(line_ids):
staff=line.staff_id
qty=line.qty
amt=line.amount
2015-01-22 10:40:05 +00:00
dpt=staff.department_id
if not dpt:
dpt=line.labor_cost_id.cycle_item_id.department_id
2014-12-09 04:24:41 +00:00
if not staffs.get(staff.id):
staffs[staff.id]={
2015-01-22 10:40:05 +00:00
'department_id': dpt.id,
2014-12-09 04:24:41 +00:00
'qty': 0,
'amt': 0,
'rate': 0, # XXX for special nurse
}
staffs[staff.id]['qty']+=qty
staffs[staff.id]['amt']+=amt
lines=[]
timenow=time.strftime("%Y-%m-%d")
for staff_id, vals in staffs.items():
2014-12-09 04:35:20 +00:00
qty=vals['qty'] or 0
amt=vals['amt'] or 0.0
rate=0.0
if qty:
rate=amt/qty # average
2014-12-09 04:24:41 +00:00
lines.append(('create',{
'staff_id': staff_id,
2014-12-09 04:35:20 +00:00
'qty': qty,
'amount': amt,
2014-12-09 04:24:41 +00:00
'date': timenow,
2014-12-09 04:35:20 +00:00
'rate': rate,
2015-01-22 10:40:05 +00:00
'department_id': vals['department_id'],
2014-12-09 04:24:41 +00:00
}))
for line in obj.lines:
line.delete()
obj.write({
'lines': lines,
})
return {
'next': {
'name': 'clinic_labor_cost_entry',
'mode': 'form',
'active_id': obj.id,
},
'flash': 'Compute Succesffuly',
}
def create(self,vals,**kw):
vals['name']=utils.date2thai(vals['date'],format='%(BY)s/%(m)s')
new_id=super().create(vals,**kw)
return new_id
def write(self,ids,vals,**kw):
if 'date' in vals.keys():
vals['name']=utils.date2thai(vals['date'],format='%(BY)s/%(m)s')
else:
obj=self.browse(ids)[0]
vals['name']=utils.date2thai(obj.date,format='%(BY)s/%(m)s')
super().write(ids,vals,**kw)
2015-01-22 10:40:05 +00:00
def update_amount(self,context={}):
data=context['data']
total_amt=0.0
for line in data['lines']:
total_amt+=line['amount']
data['total_amt']=total_amt
return data
def onchange_date(self,context={}):
data=context['data']
date=data['date']
year,month,day=date.split("-")
weekday, total_day=monthrange(int(year), int(month))
data['date_from']="%s-%s-01"%(year,month)
data['date_to']="%s-%s-%s"%(year,month,total_day)
return data
2014-12-09 04:24:41 +00:00
def onchange_line(self,context={}):
data=context['data']
path=context['path']
line=get_data_path(data,path,parent=True)
line['amount']=(line['qty'] or 0) * (line['rate'] or 0.0)
data=self.update_amount(context)
return data
2015-01-22 10:40:05 +00:00
def onchange_branch(self,context={}):
2014-12-09 04:24:41 +00:00
data=context['data']
2015-01-22 10:40:05 +00:00
data['department_id']=None
2014-12-09 04:24:41 +00:00
return data
LaborCostEntry.register()