from netforce.model import Model, fields, get_model class HDCasePayment(Model): _name="clinic.hd.case.payment" _transient=True _fields={ "hd_case_id": fields.Many2One("clinic.hd.case","HdCase",required=True,on_delete="cascade"), "pay_amount": fields.Float("Due Amount"), "to_pay": fields.Float("To Pay"), "complete": fields.Boolean("Mark as full payment for Cash"), 'bill_no': fields.Char("Bill No."), } def _get_hd_case_id(self,context={}): hd_case_id=context.get("refer_id") if not hd_case_id: return None return int(hd_case_id) def _get_pay_amount(self,context={}): hd_case_id=context.get("refer_id") hd_case=get_model("clinic.hd.case").browse(hd_case_id) return hd_case.due_amount def _get_topay(self,context={}): hd_case_id=context.get("refer_id") hd_case=get_model("clinic.hd.case").browse(hd_case_id) return hd_case.due_amount _defaults={ 'hd_case_id': _get_hd_case_id, 'pay_amount': _get_pay_amount, 'to_pay': _get_topay, 'complete': True, } def cash(self,ids,context): obj=self.browse(ids)[0] hd_case=get_model("clinic.hd.case").browse(obj.hd_case_id.id) context['amount']=obj.pay_amount or 0.0 context['is_credit']=False context['bill_no']=obj.bill_no or "" hd_case.make_invoices(context=context) #XXX hd_case.post_invoices() if obj.pay_amount: hd_case.make_payment(context=context) inv_remain_amount=0 for inv in hd_case.invoices: inv_remain_amount+=(inv.amount_subtotal-inv.amount_paid) if obj.complete: hd_case.create_cycle_item() #due_amount -> only not reimbursable total=hd_case.due_amount-obj.to_pay if total<=0 and inv_remain_amount<=0: vals={ 'state': 'paid', } else: vals={ 'state': 'waiting_payment', } hd_case.write(vals) obj.write({ 'pay_amount': hd_case.amount, }) hd_case.recompute_labor_cost() return { 'next': { 'name': 'clinic_hd_case', 'mode': 'form', 'active_id': hd_case.id, }, 'flash': '%s has been paid'%hd_case.number, } def credit(self,ids,context): obj=self.browse(ids)[0] hd_case=get_model("clinic.hd.case").browse(obj.hd_case_id.id) context['is_credit']=True hd_case.make_invoices(context=context) hd_case.post_invoices() hd_case.create_cycle_item() hd_case.write({ 'state': 'waiting_payment', 'req_fee': 0, # force to hide button pay! }) hd_case.recompute_labor_cost() inv_number=[] for inv in hd_case.invoices: inv_number.append(inv.number or "") flash='%s is waiting to pay.'% ' and '.join([inv for inv in inv_number]) return { 'next': { 'name': 'clinic_hd_case', 'mode': 'form', 'active_id': hd_case.id, }, 'flash': flash, } def onchange_amount(self,context={}): data=context['data'] pay_amount=data['pay_amount'] or 0.0 data['pay_amount']=pay_amount return data HDCasePayment.register()