multi payment

conv_bal
watcha.h 2014-10-20 18:49:54 +07:00
parent d22408c748
commit 1fa886de89
7 changed files with 110 additions and 115 deletions

View File

@ -1,6 +0,0 @@
<action>
<field name="string">Payment</field>
<field name="view_cls">form_popup</field>
<field name="model">clinic.payment</field>
<field name="target">_popup</field>
</action>

View File

@ -10,7 +10,7 @@
<field name="time_start"/> <field name="time_start"/>
<field name="cycle_id"/> <field name="cycle_id"/>
<field name="department_id"/> <field name="department_id"/>
<field name="visit_id"/> <field name="visit_id" readonly="1"/>
</group> </group>
<group span="6" columns="1"> <group span="6" columns="1">
<field name="patient_id" onchange="onchange_patient"/> <field name="patient_id" onchange="onchange_patient"/>
@ -28,7 +28,6 @@
<field name="bp_stop"/> <field name="bp_stop"/>
<field name="per_bp_stop"/> <field name="per_bp_stop"/>
<field name="hct" onchange="onchange_hct"/> <field name="hct" onchange="onchange_hct"/>
<field name="pop_txt" nolabel="1"/>
<field name="dialyzers" nolabel="1"> <field name="dialyzers" nolabel="1">
<list> <list>
<field name="dialyzer_id" domain="[['patient_id','=',parent.patient_id],['state','=','active']]" onchange="onchange_dialyzer"/> <field name="dialyzer_id" domain="[['patient_id','=',parent.patient_id],['state','=','active']]" onchange="onchange_dialyzer"/>
@ -77,12 +76,30 @@
<field name="amount"/> <field name="amount"/>
</list> </list>
</field> </field>
<group span="8" columns="1"> <group span="8" form_layout="stacked" attrs='{"invisible":[["amount","=",0]]}'>
<separator string="Make a payment"/>
<field name="pay_amount" attrs='{"required":[["amount","!=",0]]}' onchange="onchange_pay" span="3"/>
<field name="pay_date" span="3"/>
<field name="pay_account_id" span="3"/>
<button string="Add Payment" method="make_payment" icon="ok" size="small" type="success"/>
</group> </group>
<group span="4" columns="1"> <group span="4" columns="1">
<field name="total"/> <field name="total"/>
<field name="payment_lines" nolabel="1">
<template>
{{#each context.data}}
<div class="form-group nf-field">
<label class="control-label col-md-4">Less
<a href="#name=payment&amp;mode=form&amp;active_id={{payment_id.0.}}">Payment</a>
</label>
<div class="col-md-8" style="text-align:right">
{{currency amount}}
</div>
</div>
{{/each}}
</template>
</field>
<field name="amount"/> <field name="amount"/>
<button string="Pay Now" span="2" size="small" action="clinic_payment" icon="arrow-right" type="success"/>
</group> </group>
</tab> </tab>
<tab string="Notes"> <tab string="Notes">

View File

@ -1,19 +0,0 @@
<form model="clinic.payment">
<field name="partner_id" />
<field name="lines" nolabel="1">
<list>
<field name="description"/>
<field name="qty"/>
<field name="price"/>
<field name="amount"/>
</list>
</field>
<group span="4">
</group>
<group span="8">
<field offset="6" name="total"/>
</group>
<foot>
<button string="POST" type="success" method="post"/>
</foot>
</form>

View File

@ -32,5 +32,4 @@ from . import gen_visit_line
from . import report_hd_dialy from . import report_hd_dialy
from . import report_hd_monthly from . import report_hd_monthly
from . import payment from . import payment
from . import payment_line
from . import input_data from . import input_data

View File

@ -56,6 +56,7 @@ class HDcase(Model):
"invoices": fields.One2Many("account.invoice","related_id","Invoices"), "invoices": fields.One2Many("account.invoice","related_id","Invoices"),
"pickings": fields.One2Many("stock.picking","related_id","Pickings"), "pickings": fields.One2Many("stock.picking","related_id","Pickings"),
"payments": fields.One2Many("account.payment","related_id","Payments"), "payments": fields.One2Many("account.payment","related_id","Payments"),
"payment_lines": fields.One2Many("clinic.payment","hd_case_id","Payment Lines"),
'visit_id': fields.Many2One("clinic.visit", "Visit"), 'visit_id': fields.Many2One("clinic.visit", "Visit"),
'duration': fields.Integer("Duration (hrs)",function="get_hrs"), 'duration': fields.Integer("Duration (hrs)",function="get_hrs"),
"fee_type": fields.Selection([("mg","Medical Government"),("sc","Social Security"),("nhso","NHSO (30฿)"),("personal","Personal"),("others","Others")],"Fee Type"), "fee_type": fields.Selection([("mg","Medical Government"),("sc","Social Security"),("nhso","NHSO (30฿)"),("personal","Personal"),("others","Others")],"Fee Type"),
@ -64,7 +65,9 @@ class HDcase(Model):
"fee_total": fields.Float("Total",function="get_gmtotal",readonly=True,function_multi=True), "fee_total": fields.Float("Total",function="get_gmtotal",readonly=True,function_multi=True),
'note': fields.Text("Note"), 'note': fields.Text("Note"),
"cycle_id": fields.Many2One("clinic.cycle","Cycle"), "cycle_id": fields.Many2One("clinic.cycle","Cycle"),
'pop_txt': fields.Char("POP TEXT", readonly=True), 'pay_amount': fields.Float("Amount"),
'pay_date': fields.Date("Pay Date"),
'pay_account_id': fields.Many2One("account.account","Account"),
} }
def _get_number(self,context={}): def _get_number(self,context={}):
@ -98,7 +101,6 @@ class HDcase(Model):
"number": _get_number, "number": _get_number,
"company_id": lambda *a: get_active_company(), "company_id": lambda *a: get_active_company(),
"fee": 1500, "fee": 1500,
'show_pop': False,
} }
_order="date desc,number desc" _order="date desc,number desc"
@ -171,15 +173,86 @@ class HDcase(Model):
line['amount']=amt line['amount']=amt
total+=amt total+=amt
data['total']=total data['total']=total
for line in data['payment_lines']:
total-=line['amount'] or 0.0
data['amount']=total
if not data['pay_date']:
data['pay_date']=time.strftime("%Y-%m-%d")
if not data['pay_account_id']:
patient_id=data['patient_id']
if patient_id:
patient=get_model("clinic.patient").browse(patient_id)
partner=patient.partner_id
if partner:
account_id=partner.account_payable_id
if not account_id:
settings=get_model("settings").browse(1)
account_id=settings.account_receivable_id
data['pay_account_id']=account_id.id
pay_amount=total
data['pay_amount']=pay_amount
return data return data
def onchange_pay(self,context={}):
data=context['data']
pay_amount=data['pay_amount'] or 0
amount=data['amount'] or 0
if pay_amount > amount:
data['pay_amount']=0
return data
def make_payment(self,ids,context={}):
obj=self.browse(ids)[0]
remaining_amt=0.0
for line in obj.lines:
remaining_amt+=line.amount or 0.0
for line in obj.payment_lines:
remaining_amt-=line.amount or 0.0
partner_id=obj.patient_id.partner_id.id
if not partner_id:
raise Exception("No contact on this patient")
company_id=get_active_company()
account_id=obj.pay_account_id.id
vals={
"partner_id": partner_id,
"company_id": company_id,
"type": "in",
"pay_type": "direct",
"date": obj.pay_date,
"account_id": account_id,
'related_id': "clinic.hd.case,%s"%obj.id,
'direct_lines': [],
}
vals['direct_lines'].append(('create',{
'description': 'Payment; %s'%obj.number,
'account_id': account_id,
'qty': 1,
'unit_price': obj.pay_amount,
'amount': obj.pay_amount,
}))
payment_id=get_model("account.payment").create(vals,context={"type":"in"})
obj.write({
'pay_amount': remaining_amt-obj.pay_amount,
'payment_lines': [('create',{
'payment_id': payment_id,
'amount': obj.pay_amount,
})],
})
return {
'next': {
'name': 'clinic_hd_case',
'mode': 'form',
'active_id': obj.id,
},
'flash': 'Pay OK',
}
def onchange_hct(self,context={}): def onchange_hct(self,context={}):
data=context['data'] data=context['data']
hct=data['hct'] hct=data['hct']
if(hct<=39): if(hct<=39):
data['pop_txt']='xxxxxxxxxxxxxxxxx' pass
else:
data['pop_txt']=''
return data return data
def cancelled(self,ids,context={}): def cancelled(self,ids,context={}):
@ -217,9 +290,6 @@ class HDcase(Model):
data['fee_amount']=total data['fee_amount']=total
return data return data
def make_payment(self,ids,context={}):
pass
def make_invoices(self,ids,context={}): def make_invoices(self,ids,context={}):
setting=get_model("settings").browse(1) setting=get_model("settings").browse(1)
currency_id=setting.currency_id.id currency_id=setting.currency_id.id
@ -423,11 +493,11 @@ class HDcase(Model):
for obj in self.browse(ids): for obj in self.browse(ids):
total=0 total=0
amt=0 amt=0
fee=obj.fee or 0
for line in obj.lines: for line in obj.lines:
total+=line.amount or 0 total+=line.amount or 0.0
fee=0 # XXX amt=total
amt=total+fee for line in obj.payment_lines:
amt-=line.amount or 0.0
vals[obj.id]={ vals[obj.id]={
"total": total, "total": total,
"amount": amt, "amount": amt,
@ -489,5 +559,6 @@ class HDcase(Model):
}, },
'flash': '%s has been undo'%obj.number, 'flash': '%s has been undo'%obj.number,
} }
HDcase.register() HDcase.register()

View File

@ -1,65 +1,15 @@
#from netforce.access import get_active_user from netforce.model import Model, fields
from netforce.model import Model, fields, get_model
class Payment(Model): class Payment(Model):
_name="clinic.payment" _name="clinic.payment"
_transient=True _transient=True
def _get_all(self,ids,context={}):
res={}
for obj in self.browse(ids):
total=0.0
for line in obj.lines:
total+=line.amount or 0.0
res[obj.id]={
'total': total
}
return res
_fields={ _fields={
'partner_id': fields.Many2One("partner","Partner"), 'hd_case_id': fields.Many2One("clinic.hd.case","HD Case",on_delete="cascade"),
'lines': fields.One2Many("clinic.payment.line","payment_id", "Lines"), 'payment_id': fields.Many2One("account.payment","Payment",on_delete="cascade"),
'total': fields.Float("Total", function="_get_all",function_multi=True), 'account_id': fields.Many2One("account.account","Account"),
"state": fields.Selection([["draft","Draft"],['paid','Paid'],["cancelled","Cancelled"]],"Status",required=True), 'amount': fields.Float("Amount"),
} }
def _get_partner_id(self,context={}):
refer_id=context.get("refer_id") # hd_case_id
hd_case=get_model('clinic.hd.case').browse(refer_id)
partner_id=hd_case.patient_id.partner_id.id or None
return partner_id
def _get_lines(self,context={}):
refer_id=context.get("refer_id") # hd_case_id
hd_case=get_model('clinic.hd.case').browse(refer_id)
lines=[]
for line in hd_case.lines:
vals={
'description': line.description or '',
'qty': line.qty or 0,
'price': line.price,
'amount': line.amount,
}
lines.append(vals)
return lines
def _get_total(self,context={}):
refer_id=context.get("refer_id")
hd_case=get_model('clinic.hd.case').browse(refer_id)
total=0.0
for line in hd_case.lines:
total+=line.amount
print("total ", total)
return total
_defaults={
'partner_id': _get_partner_id,
'lines': _get_lines,
'total': _get_total,
}
def paid(self,context={}):
pass
Payment.register() Payment.register()

View File

@ -1,17 +0,0 @@
from netforce.model import Model, fields, get_model
class PaymentLine(Model):
_name="clinic.payment.line"
_transient=True
_fields={
'payment_id': fields.Many2One("clinic.payment","Payment"),
'description': fields.Char("Description"),
'qty': fields.Integer("Qty"),
'price': fields.Float("Unit Price"),
'account_id': fields.Many2One("account.account","Account"),
'amount': fields.Float("Amount"),
}
PaymentLine.register()