fee profile

conv_bal
watcha.h 2014-11-26 18:22:17 +07:00
parent 6e39dbb31c
commit e2c8e36c56
10 changed files with 188 additions and 124 deletions

View File

@ -27,6 +27,7 @@
<field name="bp_stop"/>
<field name="per_bp_stop"/>
<field name="hct" onchange="onchange_hct"/>
<field name="nu"/>
<newline/>
<field offset="2" name="hct_msg" nolabel="1" readonly="1"/>
<field name="dialyzers" nolabel="1">
@ -46,13 +47,13 @@
<tab string="Expenses">
<field name="lines" count="3" nolabel="1">
<list>
<field name="type" onchange="onchange_line"/>
<field name="type"/>
<field name="product_id" onchange="onchange_product"/>
<field name="description"/>
<field name="qty" onchange="onchange_line"/>
<field name="uom_id"/>
<field name="price" onchange="onchange_line"/>
<field name="amount"/>
<field name="amount" onchange="onchange_line"/>
</list>
</field>
<group span="8" form_layout="stacked" attrs='{"invisible":[["amount","=",0]]}'>

View File

@ -1,5 +1,27 @@
<form model="clinic.setting" title="Clinic Settings">
<tabs>
<tab string="HD Case">
<field name="products" nolabel="1">
<list>
<field name="patient_type"/>
<field name="type"/>
<field name="product_id" onchange="onchange_product"/>
<field name="description"/>
<field name="uom_id"/>
<field name="qty" onchange="onchange_product"/>
<field name="amount"/>
</list>
<form>
<field name="patient_type"/>
<field name="type"/>
<field name="product_id"/>
<field name="description"/>
<field name="uom_id"/>
<field name="qty"/>
<field name="amount"/>
</form>
</field>
</tab>
<tab string="Labor Cost">
<separator string="Nurse"/>
<field name="var_k"/>
@ -22,17 +44,17 @@
<separator string="Doctor"/>
<field name="cost_per_case"/>
</tab>
<tab string="Testing">
<group form_layout="stacked">
<field name="file" span="3"/>
<newline/>
<button string="Make Visit" method="make_visit" span="2"/>
<newline/>
<button string="Make HD Case" method="make_done" span="2"/>
<newline/>
<button string="Complete HD Case" method="make_complete" span="2"/>
</group>
</tab>
<!--<tab string="Testing">-->
<!--<group form_layout="stacked">-->
<!--<field name="file" span="3"/>-->
<!--<newline/>-->
<!--<button string="Make Visit" method="make_visit" span="2"/>-->
<!--<newline/>-->
<!--<button string="Make HD Case" method="make_done" span="2"/>-->
<!--<newline/>-->
<!--<button string="Complete HD Case" method="make_complete" span="2"/>-->
<!--</group>-->
<!--</tab>-->
</tabs>
<foot>
</foot>

View File

@ -1,5 +1,6 @@
from . import utils
from . import setting
from . import setting_product
from . import setting_level
from . import cause_chronic
from . import comorbidity

View File

@ -56,11 +56,12 @@ class Dialyzer(Model):
for prod in get_model("product").search_browse([]):
if found:
break
for categ in prod.categs:
if categ.id in categ_ids:
product_id=prod.id
found=True
break
if prod.categ_id.id in categ_ids:
product_id=prod.id
found=True
break
if not product_id:
raise Exception("No Product with category 'Dialyzer'")
return product_id
_defaults={

View File

@ -6,6 +6,8 @@ from netforce.utils import get_data_path, get_file_path
from netforce.access import get_active_user,set_active_user
from netforce.access import get_active_company
from . import utils
class HDCase(Model):
_name="clinic.hd.case"
_string="HD Case"
@ -76,6 +78,7 @@ class HDCase(Model):
"total_doctor": fields.Integer("Total Doctor",function="get_staff",function_multi=True),
"total_nurse": fields.Integer("Total Nurse",function="get_staff",function_multi=True),
'doctor_id': fields.Many2One("clinic.staff","Doctor",domain=[['type','=','doctor']],function="get_staff",function_multi=True),
'nu': fields.Char("N/U"),
}
def _get_number(self,context={}):
@ -146,54 +149,49 @@ class HDCase(Model):
return data
def onchange_line(self,context={}):
data=context['data']
path=context['path']
line=get_data_path(data,path,parent=True)
qty=line['qty'] or 0
price=line['price'] or 0.0
line['amount']=qty*price
self.update_amount(data)
return data
def onchange_product(self,context={}):
data=context['data']
path=context["path"]
path=context['path']
line=get_data_path(data,path,parent=True)
product_id=line.get('product_id')
if not product_id:
return
prod=get_model("product").browse(product_id)
line['uom_id']=prod.uom_id.id
line['description']=prod.name
line['qty']=1
line['price']=prod.sale_price or 0.0
line['amount']=prod.sale_price or 0.0
self.onchange_line(context)
qty=1
price=prod.sale_price or 0.0
amt=qty*price
line['qty']=qty
line['price']=price
line['amount']=amt
self.update_amount(data)
return data
def onchange_line(self,context={}):
data=context['data']
total=0.0
def update_amount(self,data):
total_amt=0.0
fee_amt=0.0
for line in data['lines']:
price=line.get('price') or 0
qty=line.get('qty') or 0
amt=qty * price
line['amount']=amt
amt=qty*price
if line['type']=='fee':
fee_amt+=amt
else:
total+=amt
data['total']=total+fee_amt
total_amt+=amt
data['total']=total_amt+fee_amt
data['fee_amount']=fee_amt
for line in data['payment_lines']:
total-=line['amount'] or 0.0
data['amount']=total
if not data.get('pay_date'):
data['pay_date']=time.strftime("%Y-%m-%d")
if not data.get('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
total_amt-=line['amount'] or 0.0
data['amount']=total_amt
return data
def onchange_pay(self,context={}):
@ -213,23 +211,29 @@ class HDCase(Model):
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:
partner=obj.patient_id.partner_id
if not partner:
raise Exception("No contact on this patient")
company_id=get_active_company()
account_id=obj.pay_account_id.id
account_receivable_id=partner.account_receivable_id
if not account_receivable_id:
st=get_model('settings').browse(1)
account_receivable_id=st.account_receivable_id
if not account_receivable_id:
raise Exception("Not found account recieveable in account setting")
account_id=account_receivable_id.id
if not account_id:
raise Exception("No Account for payment")
pay_amount=obj.pay_amount
# XXX get from popup
if context.get("amount",0):
pay_amount=context['amount'] or 0.0
vals={
"partner_id": partner_id,
"partner_id": partner.id,
"company_id": company_id,
"type": "in",
"pay_type": "direct",
"date": obj.pay_date,
'date': time.strftime("%Y-%m-%d"),
"account_id": account_id,
'related_id': "clinic.hd.case,%s"%obj.id,
'direct_lines': [],
@ -264,22 +268,6 @@ class HDCase(Model):
obj=self.browse(ids)[0]
obj.write({" state":"cancelled"})
def onchange_gmproduct(self,context={}):
data=context['data']
path=context["path"]
line=get_data_path(data,path,parent=True)
product_id=line.get('product_id')
if not product_id:
return
prod=get_model("product").browse(product_id)
line['uom_id']=prod.uom_id.id
line['description']=prod.name
line['qty']=1
line['price']=prod.sale_price or 0.0
line['amount']=prod.sale_price or 0.0
data=self.onchange_gmline(context)
return data
def make_invoices(self,ids,context={}):
setting=get_model("settings").browse(1)
currency_id=setting.currency_id.id
@ -468,6 +456,7 @@ class HDCase(Model):
cycle_item_id=cycle_item_ids[0]
else:
cycle_item_id=cycle_item.create({
'date': obj.date,
'cycle_id': obj.cycle_id.id,
})
obj.write({
@ -702,4 +691,58 @@ class HDCase(Model):
return res
def get_staff_line(self,vals,patient_id=None):
if not patient_id:
return vals
patient=get_model("clinic.patient").browse(patient_id)
doctor=patient.doctor_id
if doctor:
if not vals.get('staffs'):
vals['staffs']=[]
vals['staffs'].append(('create',{
'staff_id': doctor.id,
'type': 'doctor',
'priop': 'owner',
}))
st=get_model("clinic.setting").browse(1)
if not vals.get('lines'):
vals['lines']=[]
for st_prod in st.products:
if patient.type==st_prod.patient_type:
prod=st_prod.product_id
vals['lines'].append(('create',{
'product_id': prod.id,
'uom_id': st_prod.uom_id.id,
'type': st_prod.type,
'description': st_prod.description,
'qty': st_prod.qty,
'amount': st_prod.amount,
}))
categ_name=utils.PATIENT_TYPE.get(patient.type)
categ_ids=get_model("partner.categ").search([['name','=',categ_name]])
if not categ_ids:
raise Exception("Partner Category: %s not found"%categ_name)
partner_id=None
if patient.type in ("mg","sc","uc"):
partner_obj=get_model("partner")
for partner in partner_obj.search_browse([]):
if partner.categ_id.id in categ_ids:
partner_id=partner.id
vals['fee_partner_id']=partner_id
break
return vals
def create(self,vals,**kw):
patient_id=vals['patient_id']
vals=self.get_staff_line(vals,patient_id)
new_id=super().create(vals,**kw)
return new_id
def write(self,ids,vals,**kw):
patient_id=vals.get('patient_id')
vals=self.get_staff_line(vals,patient_id)
super().write(ids,vals,**kw)
HDCase.register()

View File

@ -10,11 +10,11 @@ class Hdcaseline(Model):
"uom_id": fields.Many2One("uom","UOM",required=True,search=True),
"price":fields.Float("Price"),
"amount":fields.Float("Amount"),
"type": fields.Selection([("fee","Fee"),("other","Other"),("service","Service")],"Type",required=True),
"type": fields.Selection([("fee","Fee"),("others","Others")],"Type",required=True),
}
_defaults={
'type': 'other',
'type': 'others',
}
Hdcaseline.register()

View File

@ -15,6 +15,7 @@ class ClinicSetting(Model):
"var_k": fields.Float("K"),
'file': fields.File("File"),
'levels': fields.One2Many("clinic.setting.level","setting_id","Levels"),
'products': fields.One2Many("clinic.setting.product","setting_id","Products"),
'cost_per_case': fields.Float("Cost Per Case"),
'company_id': fields.Many2One("company", 'Company'),
}
@ -289,4 +290,23 @@ class ClinicSetting(Model):
line['formular']='%sX%s%s'%(var_a,op,var_b)
return data
def onchange_product(self,context={}):
data=context['data']
path=context['path']
line=get_data_path(data,path,parent=True)
product_id=line['product_id']
if product_id:
prod=get_model("product").browse(product_id)
uom=prod.uom_id
if not uom:
uom=get_model("uom").browse(1)
if not uom:
raise Exception("Not found uom 'Unit'")
line['uom_id']=uom.id
line['description']=prod.name
qty=line['qty'] or 0
amt=qty*(prod.sale_price or 0.0)
line['amount']=amt
return data
ClinicSetting.register()

View File

@ -0,0 +1,27 @@
from netforce.model import Model, fields, get_model
class SettingProduct(Model):
_name="clinic.setting.product"
_string="Setting Product"
_fields={
"setting_id": fields.Many2One("clinic.setting","Setting"),
"type": fields.Selection([("fee","FEE"),("others","Others")],"Type",required=True),
"patient_type": fields.Selection([("sc","Social Security"),("uc","UC"),("others","Others")],"Patient Type",required=True),
'uom_id': fields.Many2One("uom","UOM", required=True),
"product_id": fields.Many2One("product","Product"),
'description': fields.Char("Description"),
'qty': fields.Integer("Qty"),
'amount': fields.Float("Amount"),
}
_defaults={
'type': 'fee',
'patient_type': 'sc',
'qty': 1,
}
_order="patient_type,type"
SettingProduct.register()

View File

@ -15,7 +15,7 @@ MONTHS={
PATIENT_TYPE={
"sc":"ปกส.",
"uc":"uc.",
"uc":"UC.",
"others": "จ่ายเอง",
}

View File

@ -116,62 +116,12 @@ class Visit(Model):
'time_stop': obj.time_stop,
'cycle_id' : obj.cycle_id.id,
'visit_id': obj.id,
'cycle_id': obj.cycle_id.id,
'lines':[],
'dialyzers': [],
'staffs': [],
'state': 'draft',
}
vals['staffs'].append(('create',{
'staff_id': obj.doctor_id.id,
'type': 'doctor',
'priop': 'owner',
}))
products=get_model("product").search_browse([['code','=','FEE']])
for product in products:
vals['lines'].append(('create',{
'type': 'fee',
'product_id': product.id,
'description': product.name or "",
'qty': 2,
'price': product.sale_price or 0.0,
'amount': product.sale_price or 0.0,
'uom_id': product.uom_id.id,
}))
if obj.patient_id.type=='sc':
products=get_model("product").search_browse([['code','=','S0001']]) #XXX
for product in products:
vals['lines'].append(('create',{
'type': 'fee',
'product_id': product.id,
'description': product.name or "",
'qty': 1,
'price': product.sale_price or 0.0,
'amount': product.sale_price or 0.0,
'uom_id': product.uom_id.id,
}))
patient_type={
"sc":"Social Security",
"uc":"UC",
"others": "Others",
}
categ_name=patient_type.get(obj.patient_id.type)
categ_ids=get_model("partner.categ").search([['name','=',categ_name]])
if not categ_ids:
raise Exception("Partner Category: %s not found"%categ_name)
partner_id=None
if obj.patient_id.type in ("mg","sc","uc"):
partner_obj=get_model("partner")
for partner in partner_obj.search_browse([]):
if partner.categ_id.id in categ_ids:
partner_id=partner.id
vals['fee_partner_id']=partner_id
break
# use exist hd_case (in case set to draft)
hd_case_id=None
if obj.hd_cases:
@ -190,7 +140,6 @@ class Visit(Model):
dom=[]
dom.append(['date','=',date])
dom.append(['cycle_id','=',cycle.id])
#dom.append(['state','=','draft'])
item_obj=get_model('clinic.cycle.item')
item_ids=item_obj.search(dom)