import time from calendar import monthrange 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 #_key=['name'] def _get_all(self,ids,context={}): res={} for obj in self.browse(ids): total=0.0 total_qty=0 dcost=0 ncost=0 for line in obj.lines: amt=line.amount or 0 qty=line.qty or 0 if line.type=='nurse': ncost+=amt else: dcost+=amt total_qty+=qty total+=amt res[obj.id]={ 'total':total, 'total_qty': total_qty, 'dcost': dcost, 'ncost': ncost, } return res _fields={ 'name': fields.Char("Name", required=True,search=True), 'date': fields.Date("Month",required=True), '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), 'total_qty': fields.Float("Total Qty", function="_get_all",function_multi=True), 'dcost': fields.Float("Doctor Cost", function="_get_all",function_multi=True), 'ncost': fields.Float("Nurse Cost", function="_get_all",function_multi=True), "lines": fields.One2Many("clinic.labor.cost.entry.line", "entry_id", "Lines"), "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']]), 'state': fields.Selection([['draft','Draft'],['approved','Approved']],"State"), 'user_id': fields.Many2One("base.user","Approver",search=True), 'note': fields.Text("Note"), 'company_id': fields.Many2One("company","Company"), 'department_id': fields.Many2One("clinic.department","Department",search=True), 'branch_id': fields.Many2One("clinic.branch","Branch",search=True), } 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) _defaults={ 'state': 'draft', 'name': '/', 'date': lambda *a: time.strftime("%Y-%m-%d"), 'date_from': _get_date_from, 'date_to': _get_date_to, 'user_id': lambda *a: get_active_user(), 'company_id': lambda *a: get_active_company(), } _order="date_from desc,branch_id,department_id" def compute(self,ids,context={}): obj=self.browse(ids)[0] year,month,day=obj.date.split("-") 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) staffs={} for line in get_model("clinic.labor.cost.line").browse(line_ids): staff=line.staff_id qty=line.qty amt=line.amount dpt=staff.department_id if not dpt: dpt=line.labor_cost_id.cycle_item_id.department_id if not staffs.get(staff.id): staffs[staff.id]={ 'department_id': dpt.id, '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(): qty=vals['qty'] or 0 amt=vals['amt'] or 0.0 rate=0.0 if qty: rate=amt/qty # average lines.append(('create',{ 'staff_id': staff_id, 'qty': qty, 'amount': amt, 'date': timenow, 'rate': rate, 'department_id': vals['department_id'], })) 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) 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 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 def onchange_branch(self,context={}): data=context['data'] data['department_id']=None return data LaborCostEntry.register()