clinic/netforce_clinic/models/cycle_item.py

193 lines
6.7 KiB
Python
Raw Normal View History

2014-10-26 08:48:51 +00:00
import time
from netforce.model import Model, fields, get_model
from netforce.access import get_active_company
2014-10-26 10:11:19 +00:00
from netforce.utils import get_data_path
2014-10-26 08:48:51 +00:00
class CycleItem(Model):
_name="clinic.cycle.item"
_string="Cycle Item"
2014-10-26 10:11:19 +00:00
_name_field="name"
2014-10-26 08:48:51 +00:00
def _get_all(self,ids,context):
res={}
for obj in self.browse(ids):
2014-10-26 10:11:19 +00:00
name="%s-%s"%(obj.cycle_id.name,obj.date)
2014-10-26 08:48:51 +00:00
hd_total=len([hd_case for hd_case in obj.hd_cases if hd_case.state=='completed']) # XXX
pt=(hd_total or 0.0)
k=(obj.var_k or 0.0)
pt_k=pt*k
x=(pt_k + 1275)/13.5
total=0.0
for line in obj.lines:
total+=line.amount
res[obj.id]={
2014-10-26 10:11:19 +00:00
'name': name,
2014-10-26 08:48:51 +00:00
'var_x': x,
'total_pt': hd_total,
'total_amount': hd_total*k,
'total': total,
2014-10-26 10:11:19 +00:00
'total_balance': (hd_total*k)-total,
2014-10-26 08:48:51 +00:00
}
return res
_fields={
2014-10-26 10:11:19 +00:00
'name': fields.Char("Name", function="_get_all",function_multi=True), # need to field related in journal
2014-10-26 08:48:51 +00:00
'company_id': fields.Many2One("company", "Company"),
'cycle_id': fields.Many2One("clinic.cycle", "Cycle",search=True),
'date': fields.Date("Date",search=True),
'var_k': fields.Float("K"),
'var_x': fields.Float("X", function="_get_all",function_multi=True),
'total_pt': fields.Float("PT", function="_get_all",function_multi=True),
'total_amount': fields.Float("PT*K", function="_get_all",function_multi=True),
2014-10-26 10:11:19 +00:00
'total_balance': fields.Float("Total Balance", function="_get_all",function_multi=True),
2014-10-26 08:48:51 +00:00
'total': fields.Float("Total", function="_get_all",function_multi=True),
"state": fields.Selection([("draft","Draft"),("done","Done")],"Status",required=True),
'hd_cases': fields.One2Many("clinic.hd.case","cycle_item_id", "HD Cases"),
'lines': fields.One2Many('clinic.cycle.item.line', 'cycle_item_id', 'Lines'),
}
_defaults={
'state': 'draft',
'company_id': lambda *a: get_active_company(),
'date': lambda *a: time.strftime("%Y-%m-%d"),
'var_k': 450,
}
def compute(self,ids,context={}):
for obj in self.browse(ids):
#nurer_categ_ids=[line.nurse_categ.id for line in obj.lines]
# XXX
vals_dict={}
for hd_case in obj.hd_cases:
if hd_case.state=='completed':
nurse_code=hd_case.nurse_id.categ_id.code or ""
print("nurse_code ", nurse_code)
if not vals_dict.get(nurse_code):
vals_dict[nurse_code]=0
vals_dict[nurse_code]+=1
for line in obj.lines:
line.delete()
vals={
'lines': [],
}
print(vals_dict)
for nurse_categ in get_model("clinic.nurse.categ").search_browse([]):
formular=nurse_categ.formular or ""
rate=0
try:
var_x="%s"%(round(obj.var_x,2))
formulared=formular.replace("x",var_x)
rate=eval(formulared)
except:
rate=0
vals['lines'].append(('create',{
'nurse_categ': nurse_categ.id,
'formular': formular,
'qty': vals_dict.get(nurse_categ.code,0),
'rate': rate,
}))
obj.write(vals)
return {
'next': {
'name': 'clinic_cycle_item',
'mode': 'form',
'active_id': obj.id,
},
'flash': 'Compute OK',
}
2014-10-26 10:11:19 +00:00
def onchange_line(self,context={}):
data=context['data']
path=context["path"]
line=get_data_path(data,path,parent=True)
#qty=line.get("qty")
#rate=line.get("rate")
total=0.0
for line in data['lines']:
line['amount']=(line['qty'] or 0) * (line['rate'] or 0.0)
total+=line['amount']
print(line)
data['total']=total
data['total_amount']=data['total_pt']*(data['var_k'] or 0)
data['total_balance']=data['total_amount']-data['total']
return data
def create_journal(self,ids,context={}):
obj=self.browse(ids)[0]
settings=get_model("settings").browse(1)
account_id=settings.ap_nurse_id.id
if not account_id:
raise Exception("No Account payment for nurse")
vals={
"company_id": obj.company_id.id,
"type": "in",
"pay_type": "direct",
#"date": time.strftime("%Y-%m-%d"),
"date": obj.date or time.strftime("%Y-%m-%d"),
"account_id": account_id,
'related_id': "clinic.cycle.item,%s"%obj.id,
'direct_lines': [],
}
for line in obj.lines:
if not line.amount:
continue
vals['direct_lines'].append(('create',{
'description': 'Payment; %s'%line.nurse_categ.name,
'account_id': account_id,
'qty': 1,
'unit_price': line.amount,
'amount': line.amount,
}))
payment_id=get_model("account.payment").create(vals,context={"type":"in"})
get_model("account.payment").browse(payment_id).post()
obj.write({
'state': 'done',
})
return {
'next': {
'name': 'payment',
'mode': 'form',
'active_id': payment_id,
},
'flash': 'Create journal successfully',
}
def to_draft(self,ids,context={}):
obj=self.browse(ids)[0]
related_id="clinic.cycle.item,%s"%obj.id
for payment in get_model("account.payment").search_browse([['related_id','=',related_id]]):
payment.to_draft()
payment.delete()
obj.write({
'state': 'draft',
})
return {
'next': {
'name': 'clinic_cycle_item',
'mode': 'form',
'active_id': obj.id,
},
'flash': 'Cycle item is set to draft',
}
def view_journal(self,ids,context={}):
obj=self.browse(ids)[0]
related_id="clinic.cycle.item,%s"%obj.id
payment_ids=get_model("account.payment").search([['related_id','=',related_id]])
if payment_ids:
payment_id=payment_ids[0]
return {
'next': {
'name': 'payment',
'mode': 'form',
'active_id': payment_id,
},
}
2014-10-26 08:48:51 +00:00
CycleItem.register()