import time from netforce.model import Model, fields, get_model from netforce.access import get_active_company from netforce.utils import get_data_path class CycleItem(Model): _name="clinic.cycle.item" _string="Cycle Item" _name_field="name" def _get_all(self,ids,context): res={} for obj in self.browse(ids): name="%s-%s"%(obj.cycle_id.name,obj.date) 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]={ 'name': name, 'var_x': x, 'total_pt': hd_total, 'total_amount': hd_total*k, 'total': total, 'total_balance': (hd_total*k)-total, } return res _fields={ 'name': fields.Char("Name", function="_get_all",function_multi=True), # need to field related in journal '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), 'total_balance': fields.Float("Total Balance", function="_get_all",function_multi=True), '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', } 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, }, } CycleItem.register()