conv_bal
watcha.h 2014-10-14 10:57:20 +07:00
parent e1240368c0
commit 1db2481ca7
17 changed files with 286 additions and 236 deletions

View File

@ -0,0 +1,7 @@
<action>
<field name="string">Cycles</field>
<field name="view_cls">multi_view</field>
<field name="model">clinic.cycle</field>
<field name="modes">list,form</field>
<field name="menu">clinic_menu</field>
</action>

View File

@ -0,0 +1,4 @@
<form model="clinic.cycle">
<field name="name"/>
<field name="duration"/>
</form>

View File

@ -0,0 +1,4 @@
<list model="clinic.cycle">
<field name="name"/>
<field name="duration"/>
</list>

View File

@ -2,25 +2,33 @@
<head> <head>
<field name="state"/> <field name="state"/>
<button string="Options" dropdown="1"> <button string="Options" dropdown="1">
<item string="New Visit" method="new_visit"/> <!--<item string="New Visit" method="new_visit"/>-->
<item string="TODO" method="todo"/>
</button> </button>
</head> </head>
<group span="6" columns="1"> <group span="6" columns="1">
<field name="number"/> <field name="number"/>
<field name="date"/>
<field name="time_start"/> <field name="time_start"/>
<field name="total_time"/> <field name="doctor_id"/>
<field name="visit_id"/> <field name="nurse_id"/>
<field name="cycle_id"/>
</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"/>
<field name="doctor_id"/>
<field name="time_stop"/> <field name="time_stop"/>
<field name="nurse_id"/> <field name="duration"/>
<field name="department_id"/> <field name="department_id"/>
<field name="visit_id"/>
</group> </group>
<tabs> <tabs>
<tab string="Dialyzer"> <tab string="General">
<field name="wh_start"/>
<field name="wh_stop"/>
<field name="bp_start"/>
<field name="per_bp_start"/>
<field name="bp_stop"/>
<field name="per_bp_stop"/>
<field name="hct"/>
<field name="dialyzers" nolabel="1"> <field name="dialyzers" nolabel="1">
<list> <list>
<field name="dialyzer_id" domain="[['patient_id','=',parent.patient_id]]" onchange="onchange_dialyzer"/> <field name="dialyzer_id" domain="[['patient_id','=',parent.patient_id]]" onchange="onchange_dialyzer"/>
@ -35,53 +43,52 @@
</list> </list>
</field> </field>
</tab> </tab>
<tab string="Notes"> <tab string="Other Expenses">
<field name="wh_start"/> <field name="lines" count="3" nolabel="1">
<field name="wh_stop"/>
<field name="bp_start"/>
<field name="per_bp_start"/>
<field name="bp_stop"/>
<field name="per_bp_stop"/>
<field name="hct"/>
</tab>
<tab string="Next Visit">
<separator string="Click Options-> New Visit"/>
<field name="planes" nolabel="1" domain="[['state','=','open']]">
<list> <list>
<field name="date" onchange="onchange_dateplane"/> <field name="product_id" onchange="onchange_product"/>
<field name="time_start"/> <field name="description"/>
<field name="time_stop"/> <field name="qty" onchange="onchange_line"/>
<field name="state"/> <field name="uom_id"/>
<field name="price" onchange="onchange_line"/>
<field name="amount"/>
</list> </list>
</field> </field>
<group span="8" columns="1">
</group>
<group span="4" columns="1">
<field name="total"/>
<field name="amount"/>
</group>
</tab> </tab>
<tab string="Others"> <tab string="Government Pays">
<field name="note"/> <field name="gm_lines" count="3" nolabel="1">
<field name="paid" readonly="1"/> <list>
<field name="product_id" onchange="onchange_gmproduct"/>
<field name="description"/>
<field name="qty" onchange="onchange_gmline"/>
<field name="uom_id"/>
<field name="price" onchange="onchange_gmline"/>
<field name="amount"/>
</list>
</field>
<group span="8" columns="1">
<group span="6" columns="1">
<!--<field name="fee_partner_id"/>-->
<field name="fee_partner_id" domain="[['type','=','org']]" attrs='{"required":[["fee_amount","!=",0]]}'/>
</group>
<group span="2" columns="1">
</group>
</group>
<group span="4" columns="1">
<field name="fee_total"/>
<field name="fee_amount"/>
</group>
</tab>
<tab string="Notes">
<field name="note" nolabel="1"/>
</tab> </tab>
</tabs> </tabs>
<separator string="Other Expenses"/>
<field name="lines" count="3" nolabel="1">
<list>
<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"/>
</list>
</field>
<group span="4" columns="1">
<field name="fee"/>
<!--<field name="fee_type" onchange="onchange_fee_type"/>-->
<field name="fee_partner_id" domain="[['type','=','org']]" attrs='{"required":[["fee","!=",0]]}'/>
</group>
<group span="4" columns="1">
</group>
<group span="4" columns="1">
<field name="total"/>
<field name="amount"/>
</group>
<foot> <foot>
<button string="Confirm" type="success" method="confirm" states="draft"/> <button string="Confirm" type="success" method="confirm" states="draft"/>
<button string="Complete" type="success" method="complete" states="in_progress"/> <button string="Complete" type="success" method="complete" states="in_progress"/>

View File

@ -2,6 +2,7 @@
<field name="number"/> <field name="number"/>
<field name="time_start"/> <field name="time_start"/>
<field name="time_stop"/> <field name="time_stop"/>
<field name="cycle_id"/>
<field name="patient_id"/> <field name="patient_id"/>
<field name="doctor_id"/> <field name="doctor_id"/>
<field name="nurse_id"/> <field name="nurse_id"/>

View File

@ -19,9 +19,6 @@
</item> </item>
<item string="Visits" action="clinic_visit"/> <item string="Visits" action="clinic_visit"/>
<item string="Treatments" action="clinic_hd_case"/> <item string="Treatments" action="clinic_hd_case"/>
<!--<item string="Planings">-->
<!--<item string="Visit" action="clinic_visit"/>-->
<!--</item>-->
<item string="Reports"> <item string="Reports">
<item string="TODO" action="todo"/> <item string="TODO" action="todo"/>
</item> </item>
@ -30,6 +27,7 @@
</item> </item>
<item string="Settings"> <item string="Settings">
<item string="Departments" action="clinic_department"/> <item string="Departments" action="clinic_department"/>
<item string="Cycle" action="clinic_cycle"/>
<item string="Clinic Settings" action="clinic_setting"/> <item string="Clinic Settings" action="clinic_setting"/>
</item> </item>
</menu> </menu>

View File

@ -1,5 +1,5 @@
<!--<calendar model="clinic.visit" states='waiting_treatment' date_field="date_visit" colors='{"#090":[["cycle","=",1]],"#2400ff":[["cycle","=",2]],"#ebff00":[["cycle","=",3]],"#f20000":[["cycle","=",4]]}'>--> <!--<calendar model="clinic.visit" states='waiting_treatment' date_field="date_visit" colors='{"#090":[["cycle","=",1]],"#2400ff":[["cycle","=",2]],"#ebff00":[["cycle","=",3]],"#f20000":[["cycle","=",4]]}'>-->
<calendar model="clinic.visit" states='waiting_treatment' date_field="date_visit" start_field="time_start" end_field="time_stop" colors='{"#090":[["cycle","=",1]],"#2400ff":[["cycle","=",2]],"orange":[["cycle","=",3]],"#f20000":[["cycle","=",4]]}'> <calendar model="clinic.visit" states='waiting_treatment' start_field="time_start" end_field="time_stop" colors='{"#090":[["cycle","=",1]],"#2400ff":[["cycle","=",2]],"orange":[["cycle","=",3]],"#f20000":[["cycle","=",4]]}'>
<field name="patient_id"/> <field name="patient_id"/>
<field name="cycle"/> <field name="cycle"/>
<field name="number"/> <field name="number"/>

View File

@ -5,53 +5,25 @@
<button string="Options" dropdown="1"> <button string="Options" dropdown="1">
<item string="Copy" method="copy"/> <item string="Copy" method="copy"/>
<item string="Create Dialyzer" method="create_dialyzer"/> <item string="Create Dialyzer" method="create_dialyzer"/>
<item string="Generate Cycle" method="generate_cycle"/>
</button> </button>
</head> </head>
<tabs> <tabs>
<tab string="General"> <tab string="General">
<group span="6" columns="1"> <group span="6" columns="1">
<field name="number"/> <field name="number"/>
<field name="date_visit" onchange="onchange_date_visit"/> <field name="time_start" onchange="onchange_time" attrs='{"required":[["state","=","waiting_treatment"]]}'/>
<field name="cycle"/> <field name="department_id"/>
<field name="cycle_id" onchange="onchange_time" required="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"/>
<field name="doctor_id" attrs='{"required":[["state","=","waiting_treatment"]]}'/> <field name="time_stop" attrs='{"required":[["state","=","waiting_treatment"]]}'/>
<field name="doctor_id"/>
<field name="nurse_id" attrs='{"required":[["state","=","waiting_treatment"]]}'/> <field name="nurse_id" attrs='{"required":[["state","=","waiting_treatment"]]}'/>
<field name="department_id"/>
</group> </group>
</tab> </tab>
<tab string="Planing">
<field name="time_start" attrs='{"required":[["state","=","waiting_treatment"]]}'/>
<field name="time_stop" attrs='{"required":[["state","=","waiting_treatment"]]}'/>
<field name="time_use" onchange="onchange_timeuse"/>
<separator string="Next Visit"/>
<field name="planes" nolabel="1">
<list>
<field name="date" onchange="onchange_dateplane"/>
<field name="time_start"/>
<field name="time_stop"/>
<field name="state"/>
</list>
</field>
</tab>
</tabs> </tabs>
<group attrs='{"invisible": [["state","not in",["waiting_treatment"]]]}'>
<separator string="Select Dialyzer -> Click Do Treatment"/>
<field name="dialyzers" nolabel="1" count="3">
<list>
<field name="dialyzer_id" domain="[['state','=','active'],['patient_id','=',parent.patient_id]]" onchange="onchange_dialyzer"/>
<field name="description"/>
<field name="use_time"/>
<field name="max_use_time"/>
<field name="member_type"/>
<field name="dialyzer_type"/>
<field name="bid_flow_rate"/>
<field name="ultrafittration"/>
<field name="state"/>
</list>
</field>
</group>
<foot> <foot>
<button string="Confirm" type="success" method="confirm" states="draft" /> <button string="Confirm" type="success" method="confirm" states="draft" />
<button string="Do Treatment" type="success" method="do_treatment" icon="arrow-right" states="waiting_treatment" /> <button string="Do Treatment" type="success" method="do_treatment" icon="arrow-right" states="waiting_treatment" />

View File

@ -1,10 +1,18 @@
<list model="clinic.visit" colors='{"#EF4D4D":[["late_visit","=",1]]}'> <list model="clinic.visit">
<field name="late_visit" invisible="1"/> <search>
<field name="number"/>
<field name="cycle_id"/>
<field name="date"/>
<field name="patient_id"/>
<field name="doctor_id"/>
<field name="nurse_id"/>
</search>
<field name="number"/> <field name="number"/>
<field name="date_visit"/> <field name="time_start"/>
<field name="cycle"/> <field name="time_stop"/>
<field name="patient_id"/> <field name="patient_id"/>
<field name="doctor_id"/> <field name="doctor_id"/>
<field name="nurse_id"/> <field name="nurse_id"/>
<field name="cycle_id"/>
<field name="state"/> <field name="state"/>
</list> </list>

View File

@ -16,11 +16,14 @@ from . import department
from . import doctor from . import doctor
from . import nurse from . import nurse
from . import visit from . import visit
from . import visit_line
from . import visit_plan from . import visit_plan
from . import hd_case from . import hd_case
from . import hd_case_line from . import hd_case_line
from . import hd_case_gmline
from . import hd_case_discont from . import hd_case_discont
from . import dialyzer from . import dialyzer
from . import dialyzer_line from . import dialyzer_line
from . import import_payment from . import import_payment
from . import file_sheet from . import file_sheet
from . import cycle

View File

@ -0,0 +1,37 @@
from datetime import datetime, timedelta
from netforce.model import Model, fields
FMT_DATE="%Y-%m-%d %H:%M:%S"
class Cycle(Model):
_name="clinic.cycle"
_string="Cycle"
_fields={
"name": fields.Char("Name",required=True,search=True),
#"time_start": fields.DateTime("Time Start"),
#"time_stop": fields.DateTime("Time Stop"),
'duration': fields.Integer("Duration (hrs)"),
}
def _get_time_stop(self,context):
time_stop=datetime.now()+timedelta(seconds=3600)
return time_stop.strftime(FMT_DATE)
_defaults={
#'time_start': lambda *a: datetime.now().strftime(FMT_DATE),
#'time_stop': _get_time_stop,
'duration': 1,
}
def onchange_duration(self,context={}):
data=context['data']
duration=data['duration']
seconds=duration*3600
time_start=data['time_start']
data['time_stop']=(datetime.strptime(time_start,FMT_DATE)+timedelta(seconds=seconds)).strftime(FMT_DATE)
return data
Cycle.register()

View File

@ -24,8 +24,11 @@ class HDcase(Model):
_fields={ _fields={
"number": fields.Char("Number",required=True,search=True), "number": fields.Char("Number",required=True,search=True),
"time_start": fields.DateTime("Time start",required=True,search=True),
"time_stop": fields.DateTime("Time stop",required=True,search=True),
"date": fields.Date("Time stop",required=True,search=True),
"patient_id": fields.Many2One("clinic.patient","Patient",required=True,search=True), "patient_id": fields.Many2One("clinic.patient","Patient",required=True,search=True),
"doctor_id": fields.Many2One("clinic.doctor","Doctor", required=True,search=True), "doctor_id": fields.Many2One("clinic.doctor","Doctor", required=False,search=True),
"nurse_id": fields.Many2One("clinic.nurse","Nurse", required=True,search=True), "nurse_id": fields.Many2One("clinic.nurse","Nurse", required=True,search=True),
"department_id": fields.Many2One("clinic.department", "Department",search=True), "department_id": fields.Many2One("clinic.department", "Department",search=True),
"wh_start": fields.Float("Wt.Kg start"), "wh_start": fields.Float("Wt.Kg start"),
@ -38,9 +41,9 @@ class HDcase(Model):
"state": fields.Selection([("draft","Draft"),("in_progress","In Progress"),("completed","Completed"),("discountinued","Discountinued"),("uncompleted","Uncompleted")],"Status",required=True), "state": fields.Selection([("draft","Draft"),("in_progress","In Progress"),("completed","Completed"),("discountinued","Discountinued"),("uncompleted","Uncompleted")],"Status",required=True),
"dialyzers": fields.One2Many("clinic.dialyzer.line","hd_case_id","Dializers"), "dialyzers": fields.One2Many("clinic.dialyzer.line","hd_case_id","Dializers"),
"lines": fields.One2Many("clinic.hd.case.line","hd_case_id","Lines"), "lines": fields.One2Many("clinic.hd.case.line","hd_case_id","Lines"),
"gm_lines": fields.One2Many("clinic.hd.case.gm.line","hd_case_id","GM Lines"),
"comments": fields.One2Many("message","related_id","Comments"), "comments": fields.One2Many("message","related_id","Comments"),
"company_id": fields.Many2One("company","Company"), "company_id": fields.Many2One("company","Company"),
"fee": fields.Float("HD Fee"),
"amount": fields.Float("Due Amount",function="get_total",readonly=True,function_multi=True), "amount": fields.Float("Due Amount",function="get_total",readonly=True,function_multi=True),
"total": fields.Float("Total",function="get_total",readonly=True,function_multi=True), "total": fields.Float("Total",function="get_total",readonly=True,function_multi=True),
"reconcile_id": fields.Many2One("account.reconcile","Reconcile Id",readonly=True), "reconcile_id": fields.Many2One("account.reconcile","Reconcile Id",readonly=True),
@ -48,15 +51,13 @@ class HDcase(Model):
"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"),
'visit_id': fields.Many2One("clinic.visit", "Visit"), 'visit_id': fields.Many2One("clinic.visit", "Visit"),
'total_time': fields.Integer("Total Time(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"),
'fee_partner_id': fields.Many2One("partner","Contact Fee"), 'fee_partner_id': fields.Many2One("partner","Contact Fee"),
'paid': fields.Boolean("Paid"), "fee_amount": fields.Float("Due Amount",function="get_gmtotal",readonly=True,function_multi=True),
"time_start": fields.DateTime("Time start",required=True,search=True), "fee_total": fields.Float("Total",function="get_gmtotal",readonly=True,function_multi=True),
"time_stop": fields.DateTime("Time stop",required=True,search=True),
"date": fields.Date("Date Treatment",required=True),
'planes': fields.One2Many("clinic.visit.plane","hd_case_id","Planning"),
'note': fields.Text("Note"), 'note': fields.Text("Note"),
"cycle_id": fields.Many2One("clinic.cycle","Cycle"),
} }
def _get_number(self,context={}): def _get_number(self,context={}):
@ -90,6 +91,7 @@ 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,
'cycle': '1',
} }
_order="date desc,number desc" _order="date desc,number desc"
@ -156,6 +158,37 @@ class HDcase(Model):
data['total']=total data['total']=total
return data return data
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 onchange_gmline(self,context={}):
data=context['data']
total=0.0
for line in data['gm_lines']:
price=line.get('price') or 0
qty=line.get('qty') or 0
amt=qty * price
product_id=line.get("product_id")
if product_id:
line['amount']=amt
total+=amt
data['fee_total']=total
data['fee_amount']=total
return data
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
@ -313,11 +346,12 @@ class HDcase(Model):
def complete(self,ids,context={}): def complete(self,ids,context={}):
obj=self.browse(ids)[0] obj=self.browse(ids)[0]
if not obj.dialyzers:
raise Exception("Please enter dialyzer!")
obj.make_invoices() obj.make_invoices()
obj.post_invoices() obj.post_invoices()
obj.write({ obj.write({
"state":"completed", "state":"completed",
#'paid': True,
}) })
return { return {
'next': { 'next': {
@ -357,6 +391,22 @@ class HDcase(Model):
} }
return vals return vals
def get_gmtotal(self,ids,context={}):
vals={}
for obj in self.browse(ids):
total=0
amt=0
fee=obj.fee or 0
for line in obj.gm_lines:
total+=line.amount or 0
fee=0 # XXX
amt=total+fee
vals[obj.id]={
"fee_total": total,
"fee_amount": amt,
}
return vals
def view_hdcase(self,ids,context={}): def view_hdcase(self,ids,context={}):
return { return {
'name': 'clinic_hd_case', 'name': 'clinic_hd_case',

View File

@ -0,0 +1,16 @@
from netforce.model import Model, fields
class HDCaseGMline(Model):
_name="clinic.hd.case.gm.line"
_fields={
"hd_case_id": fields.Many2One("clinic.hd.case","HdCase",required=True,on_delete="cascade"),
"product_id": fields.Many2One("product","Product",search=True),
"description": fields.Char("Description",search=True),
"qty":fields.Integer("QTY"),
"uom_id": fields.Many2One("uom","UOM",required=True,search=True),
"price":fields.Float("Price"),
"amount":fields.Float("Amount"),
}
HDCaseGMline.register()

View File

@ -183,14 +183,6 @@ class Patient(Model):
get_model("partner").delete(partner_ids) get_model("partner").delete(partner_ids)
super().delete(ids) super().delete(ids)
def _delete(self,ids,context={}):
partner_ids=[]
for obj in self.browse(ids):
if obj.type not in ("mg","nhso","sc"):
partner_ids.append(obj.partner_id.id)
get_model("partner").delete(partner_ids)
super().delete(ids)
def write(self,ids,vals,**kw): def write(self,ids,vals,**kw):
for obj in self.browse(ids): for obj in self.browse(ids):
partner_id=obj.partner_id partner_id=obj.partner_id
@ -208,4 +200,8 @@ class Patient(Model):
vals['partner_id']=partner_id vals['partner_id']=partner_id
super().write(ids,vals,**kw) super().write(ids,vals,**kw)
def generate_visit(self,ids,context={}):
obj=self.browse(ids)[0]
pass
Patient.register() Patient.register()

View File

@ -1,9 +1,11 @@
import time import time
import datetime from datetime import datetime, timedelta
from netforce.model import Model, fields, get_model from netforce.model import Model, fields, get_model
from netforce.access import get_active_company, get_active_user, set_active_user from netforce.access import get_active_company, get_active_user, set_active_user
from netforce.utils import get_data_path #from netforce.utils import get_data_path
FMT_DATE="%Y-%m-%d %H:%M:%S"
class Visit(Model): class Visit(Model):
_name="clinic.visit" _name="clinic.visit"
@ -14,35 +16,30 @@ class Visit(Model):
def _get_visit_late(self,ids,context={}): def _get_visit_late(self,ids,context={}):
res={} res={}
#oneday=datetime.timedelta(days=1)
#yesterday=datetime.datetime.now()-oneday
datenow=time.strftime("%Y-%m-%d") datenow=time.strftime("%Y-%m-%d")
for obj in self.browse(ids): for obj in self.browse(ids):
late=0 late=0
if datenow > obj.date_visit and obj.state=='waiting_treatment': if datenow > (obj.date_visit or '') and obj.state=='waiting_treatment':
late=1 late=1
res[obj.id]=late res[obj.id]=late
return res return res
_fields={ _fields={
"number": fields.Char("Number",required=True,search=True), "number": fields.Char("Number",required=True,search=True),
"date": fields.Date("Date Visit"),
"time_start": fields.DateTime("Time Start"),
"time_stop": fields.DateTime("Time Stop"),
"patient_id": fields.Many2One("clinic.patient","Patient",required=True,search=True), "patient_id": fields.Many2One("clinic.patient","Patient",required=True,search=True),
"doctor_id": fields.Many2One("clinic.doctor","Doctor",search=True), "doctor_id": fields.Many2One("clinic.doctor","Doctor",search=True),
"nurse_id": fields.Many2One("clinic.nurse","Nurse",search=True), "nurse_id": fields.Many2One("clinic.nurse","Nurse",search=True),
"department_id": fields.Many2One("clinic.department", "Department",search=True), "department_id": fields.Many2One("clinic.department", "Department",search=True),
"cycle": fields.Selection([("1","One"),("2","Two"),("3","Tree"),("4","Four")],"Cycle",required=True),
"state": fields.Selection([("draft","Draft"),("waiting_treatment","Waiting Treatment"),('treatment','Treatment'),("cancelled","Cancelled")],"Status",required=True),
"comments": fields.One2Many("message","related_id","Comments"),
"company_id": fields.Many2One("company","Company"), "company_id": fields.Many2One("company","Company"),
'time_use': fields.Integer("Fix Hour"), 'time_use': fields.Integer("Fix Hour"),
'late_visit': fields.Integer("Late Vist",function="_get_visit_late"), 'late_visit': fields.Integer("Late Vist",function="_get_visit_late", store=True),
"dialyzers": fields.One2Many("clinic.dialyzer.line","visit_id","Dialyzers"),
"date_visit": fields.Date("Visit Date",required=True,search=True),
"time_start": fields.DateTime("Time Start"),
"time_stop": fields.DateTime("Time Stop"),
'planes': fields.One2Many("clinic.visit.plane","visit_id","Planning"),
'hd_cases': fields.One2Many('clinic.hd.case','visit_id',"HD Cases",readonly=True), 'hd_cases': fields.One2Many('clinic.hd.case','visit_id',"HD Cases",readonly=True),
"cycle_id": fields.Many2One("clinic.cycle","Cycle"),
"state": fields.Selection([("draft","Draft"),("waiting_treatment","Waiting Treatment"),('treatment','Treatment'),("cancelled","Cancelled")],"Status",required=True),
"comments": fields.One2Many("message","related_id","Comments"),
} }
def _get_number(self,context={}): def _get_number(self,context={}):
@ -68,25 +65,25 @@ class Visit(Model):
return None return None
def _get_time_start(self,context={}): def _get_time_start(self,context={}):
now=datetime.datetime.now() now=datetime.now()
starttime=now.strftime("%Y-%m-%d %H:%M:%S") starttime=now.strftime("%Y-%m-%d %H:%M:%S")
return starttime return starttime
def _get_time_stop(self,context={}): def _get_time_stop(self,context={}):
hr=datetime.timedelta(seconds=3600) hr=timedelta(seconds=3600)
now=datetime.datetime.now() now=datetime.now()
stoptime=(now+hr).strftime("%Y-%m-%d %H:%M:%S") stoptime=(now+hr).strftime("%Y-%m-%d %H:%M:%S")
return stoptime return stoptime
_defaults={ _defaults={
"state": "draft", "state": "draft",
"cycle": "1", 'date': lambda *a: time.strftime("%Y-%m-%d"),
'date_visit': lambda *a: time.strftime("%Y-%m-%d"),
'time_start': _get_time_start, 'time_start': _get_time_start,
'time_stop': _get_time_stop, 'time_stop': _get_time_stop,
"number": "/", "number": "/",
"company_id": lambda *a: get_active_company(), "company_id": lambda *a: get_active_company(),
'nurse_id': _get_nurse, 'nurse_id': _get_nurse,
'cycle': '1',
'time_use': 1, 'time_use': 1,
} }
_order="id desc" _order="id desc"
@ -107,19 +104,15 @@ class Visit(Model):
def do_treatment(self,ids,context={}): def do_treatment(self,ids,context={}):
hd_case_obj=get_model("clinic.hd.case") hd_case_obj=get_model("clinic.hd.case")
dt=datetime.datetime dt=datetime
datenow=dt.now().strftime("%Y-%m-%d") datenow=dt.now().strftime("%Y-%m-%d")
obj=self.browse(ids)[0] obj=self.browse(ids)[0]
date_visit=obj.time_start[0:10]
# cannot treatment if current date is not same visit date # cannot treatment if current date is not same visit date
if obj.date_visit!=datenow: if date_visit!=datenow:
raise Exception("Today is not treament date!") raise Exception("Today is not treament date!")
if not obj.dialyzers:
raise Exception("Please select dialyzer!")
if len(obj.dialyzers)>1:
raise Exception("Can select only 1 dialyzer!")
include_fee=obj.patient_id.type in ('mg','sc','nhso') and True or False #include_fee=obj.patient_id.type in ('mg','sc','nhso') and True or False
vals={ vals={
'patient_id': obj.patient_id.id, 'patient_id': obj.patient_id.id,
'doctor_id': obj.doctor_id.id, 'doctor_id': obj.doctor_id.id,
@ -128,7 +121,8 @@ class Visit(Model):
'time_start': obj.time_start, 'time_start': obj.time_start,
'time_stop': obj.time_stop, 'time_stop': obj.time_stop,
'visit_id': obj.id, 'visit_id': obj.id,
'fee': include_fee and 1500.00 or 0.0, 'cycle_id': obj.cycle_id.id,
#'fee': include_fee and 1500.00 or 0.0,
'fee_type': obj.patient_id.type, 'fee_type': obj.patient_id.type,
'lines':[], 'lines':[],
'dialyzers': [], 'dialyzers': [],
@ -155,21 +149,7 @@ class Visit(Model):
vals['fee_partner_id']=partner_id vals['fee_partner_id']=partner_id
break break
# find dialyser
if not obj.dialyzers:
raise Exception("%s don't have dialyzer for treatment yet" % obj.patient_id.name)
hd_case_id=hd_case_obj.create(vals) hd_case_id=hd_case_obj.create(vals)
for dlz in obj.dialyzers:
# TODO check max time and expire day also
dlz.dialyzer_id.write({'use_time': dlz.use_time}) # count use time
dlz.write({
'hd_case_id': hd_case_id,
})
for plan in obj.planes:
plan.write({
'hd_case_id': hd_case_id,
})
obj.write({"state":"treatment"}) obj.write({"state":"treatment"})
return { return {
'next': { 'next': {
@ -193,14 +173,9 @@ class Visit(Model):
patient_id=data['patient_id'] patient_id=data['patient_id']
visits=self.search_browse([['patient_id','=',patient_id]],order="number desc") visits=self.search_browse([['patient_id','=',patient_id]],order="number desc")
if visits: if visits:
#print([(v.id, v.date_visit,v.cycle) for v in visits])
visit=visits[0] visit=visits[0]
data['doctor_id']=visit.doctor_id.id data['doctor_id']=visit.doctor_id.id
data['department_id']=visit.department_id.id data['department_id']=visit.department_id.id
cycle=int(visit.cycle)+1
data['cycle']=str(cycle)
if cycle>4:
data['cycle']='1'
else: else:
data['doctor_id']=None data['doctor_id']=None
data['department_id']=None data['department_id']=None
@ -213,15 +188,8 @@ class Visit(Model):
'doctor_id': obj.doctor_id.id, 'doctor_id': obj.doctor_id.id,
'nurse_id': obj.nurse_id.id, 'nurse_id': obj.nurse_id.id,
'department_id': obj.department_id.id, 'department_id': obj.department_id.id,
'cycle': obj.cycle,
} }
# XXX update cycle
visits=self.search_browse([['patient_id','=',obj.patient_id.id]],order="number desc")
if visits:
visit=visits[0] # order desc already
cycle=int(visit.cycle)+1
vals['cycle']=str(cycle)
if cycle>4:
vals['cycle']='1'
new_id=self.create(vals,context=context) new_id=self.create(vals,context=context)
new_obj=self.browse(new_id) new_obj=self.browse(new_id)
return { return {
@ -246,7 +214,6 @@ class Visit(Model):
return {} return {}
ref_id=int(ref_id) ref_id=int(ref_id)
obj=self.browse(ref_id) obj=self.browse(ref_id)
cycle_list={'1': 'One','2': 'Two','3': 'Tree','4': 'Four'}
data={ data={
'number': obj.number, 'number': obj.number,
'date_visit': obj.date_visit, 'date_visit': obj.date_visit,
@ -254,80 +221,22 @@ class Visit(Model):
'patient_name': obj.patient_id.name or "", 'patient_name': obj.patient_id.name or "",
'doctor_name': obj.doctor_id.name or "", 'doctor_name': obj.doctor_id.name or "",
'nurse_name': obj.nurse_id.name or "", 'nurse_name': obj.nurse_id.name or "",
'cycle': cycle_list.get(obj.cycle,""),
'print_date': time.strftime("%d/%m/%Y"), 'print_date': time.strftime("%d/%m/%Y"),
} }
return data return data
def onchange_dialyzer(self,context={}): def onchange_time(self,context={}):
data=context["data"] data=context['data']
path=context["path"] cycle_id=data['cycle_id']
line=get_data_path(data,path,parent=True) duration=1
dialyzer_id=line.get("dialyzer_id") if cycle_id:
if not dialyzer_id: cycle=get_model('clinic.cycle').browse(cycle_id)
return {} duration=cycle.duration or 0
dialyzer=get_model("clinic.dialyzer").browse(dialyzer_id) seconds=duration*3600
use_time=dialyzer.use_time or 0
use_time+=1
line["description"]=dialyzer.description or ""
line["use_time"]=use_time
line["max_use_time"]=dialyzer.max_use_time
line["member_type"]=dialyzer.member_type
line["dialyzer_type"]=dialyzer.dialyzer_type
line["bid_flow_rate"]=dialyzer.bid_flow_rate
line["ultrafittration"]=dialyzer.ultrafittration
line["state"]=dialyzer.state
return data
def onchange_timeuse(self,context={}):
data=context["data"]
time_start=data['time_start'] time_start=data['time_start']
fmt_date="%Y-%m-%d %H:%M:%S" data['time_stop']=(datetime.strptime(time_start,FMT_DATE)+timedelta(seconds=seconds)).strftime(FMT_DATE)
time_start=datetime.datetime.strptime(time_start,fmt_date)
time_use=data['time_use']
seconds=(time_use or 1)*3600
time_stop=time_start+datetime.timedelta(seconds=seconds)
data['time_stop']=time_stop.strftime(fmt_date)
return data return data
def onchange_date_visit(self,context={}):
data=context["data"]
timenow=time.strftime("%H:%M:%S")
date_visit=data['date_visit']
fmt_date="%Y-%m-%d %H:%M:%S"
time_start=datetime.datetime.strptime("%s %s"%(date_visit,timenow),fmt_date)
print("time_start ", time_start)
time_use=data['time_use']
seconds=(time_use or 1)*3600
time_stop=time_start+datetime.timedelta(seconds=seconds)
data['time_start']=time_start.strftime(fmt_date)
data['time_stop']=time_stop.strftime(fmt_date)
return data
def onchange_dateplane(self,context={}):
data=context["data"]
path=context["path"]
line=get_data_path(data,path,parent=True)
start_date=line.get("date")
if not start_date:
return {}
timenow=time.strftime("%H:%M:%S")
timevisit=timenow
# XXX
timevisit=data['time_start'][11:20]
if not timevisit:
timevisit=timenow
fmt_date="%Y-%m-%d %H:%M:%S"
fix_hrs=data['time_use'] or 0
time_start=datetime.datetime.strptime("%s %s"%(start_date,timevisit),fmt_date)
seconds=fix_hrs*3600
time_stop=time_start+datetime.timedelta(seconds=seconds)
line['time_start']=time_start.strftime(fmt_date)
line['time_stop']=time_stop.strftime(fmt_date)
if not line.get('state'):
line['state']='open'
return data
def create_dialyzer(self,ids,context={}): def create_dialyzer(self,ids,context={}):
return { return {

View File

@ -0,0 +1,15 @@
from netforce.model import Model, fields, get_model
class VisitLine(Model):
_name="clinic.visit.line"
_string="Visit Line"
_fields={
'visit_id': fields.Many2One("clinic.visit","Visit"),
'cycle_id': fields.Many2One("clinic.cycle","Cycle"),
'time_start': fields.DateTime("Time Start"),
'time_stop': fields.DateTime("Time Stop"),
"state": fields.Selection([("pending","Pending"),("completed","Completed")],"Status"),
}
VisitLine.register()

View File

@ -1,7 +1,30 @@
=====
select diaylizer at treatment page
=====
step:
nurse
1. go to visit calendar
- auto gen visit
2. go to visit
- confirm
- copy data to hd case
- patient
- doctor
- department
- nurse
- other ...
- auto generate cycle (4 cycle)
3. go to hd case
- select dialyzer
- if not we can no do treament
===== todo ===== todo
monday: ######
- A, B, C, D - import payment
tueday: - visit planing
######
======== ========
Account Receivable -> invoice Account Receivable -> invoice
find account id find account id