imgrate lost data

report_acc_hdcase_summary
watcha.h 2016-11-29 23:30:11 +07:00
parent c708149d54
commit 17d342155a
13 changed files with 392 additions and 8 deletions

View File

@ -112,8 +112,9 @@
<group span="3" columns="1"> <group span="3" columns="1">
</group> </group>
</tab> </tab>
<tab string="Approval"> <tab string="Other">
<field name="nurse_id" span="4"/> <field name="nurse_id" span="4"/>
<field name="check_dlz" span="4"/>
<!--<field name="fee_partner_id" span="4" domain="[['type','=','org']]"/>--> <!--<field name="fee_partner_id" span="4" domain="[['type','=','org']]"/>-->
</tab> </tab>
</tabs> </tabs>

View File

@ -2,7 +2,7 @@
<head> <head>
<field name="type_id"/> <field name="type_id"/>
<button string="Options" dropdown="1"> <button string="Options" dropdown="1">
<item string="Share To Another Location" action="clinic_share_location"/> <item string="Share" action="clinic_share_location"/>
</button> </button>
</head> </head>
<field name="number"/> <field name="number"/>

View File

@ -9,6 +9,7 @@
<field name="department_id" domain='[["branch_id","=",branch_id]]' span="2"/> <field name="department_id" domain='[["branch_id","=",branch_id]]' span="2"/>
<field name="state" span="2"/> <field name="state" span="2"/>
<button string='Confirm Visits' method="confirm" type="success" icon="arrow-right"/> <button string='Confirm Visits' method="confirm" type="success" icon="arrow-right"/>
<field name="gen_back" perm="clinic_admin" span="2"/>
<group span="6" columns="1"> <group span="6" columns="1">
<template> <template>
<div> <div>

View File

@ -8,6 +8,9 @@
<field name="department_id"/> <field name="department_id"/>
</list> </list>
</field> </field>
<!--<separator string="Admin"/>-->
<!--<field name="no_dlz" perm="clinic_admin"/>-->
<!--<field name="random_sickbed" perm="clinic_admin"/>-->
<foot> <foot>
<button string="Confirm" type="success" method="confirm" confirm="Are your sure?"/> <button string="Confirm" type="success" method="confirm" confirm="Are your sure?"/>
</foot> </foot>

View File

@ -11,4 +11,8 @@ from . import clinic_setting
#from . import reset_hdcase_number #from . import reset_hdcase_number
#from . import remove_dbl_contact #from . import remove_dbl_contact
#from . import update_invoice #from . import update_invoice
from . import update_pick_out_number #from . import update_pick_out_number
#from . import reimport10to15
#from . import add_missing_dlz # pending
#from . import validate_cycle_item
from . import update_line_amount

View File

@ -0,0 +1,45 @@
import csv
import xlrd
from netforce.model import get_model
from netforce import migration
from netforce.access import set_active_user, set_active_company
from netforce.database import get_connection
class Migration(migration.Migration):
_name="clinic.add.missing.dlz"
_version="2.12.4"
def migrate(self):
set_active_company(1)
set_active_user(1)
cond=[
['date','>=','2016-11-10'],
['date','<=','2016-11-15'],
['patient_id','=',16907], # test
]
for hdcase in get_model("clinic.hd.case").search_browse(cond):
if not hdcase.dialyzers:
patient=hdcase.patient_id
dialyzer=patient.dialyzers[0] #active
print('hdcase.number : ', hdcase.number)
print("//"*30)
dlzs=get_model("clinic.hd.case.dialyzer").search_browse([['dialyzer_id','=',dialyzer.id]])
if dlzs:
dlz=dlzs[0]
next_usetime=dlz.use_time+1
vals={
"description": dialyzer.name,
'use_time': next_usetime,
'max_use_time': dialyzer.max_use_time,
'dialyzer_type': dialyzer.type,
'dlz_id': dialyzer.id,
'hd_case_id': hdcase.id,
}
print(patient.id, patient.name, dialyzer.id, dlz.use_time)
print("//"*30)
break
Migration.register()

View File

@ -0,0 +1,212 @@
import csv
import xlrd
from netforce.model import get_model
from netforce import migration
from netforce.access import set_active_user, set_active_company
from netforce.database import get_connection
class Migration(migration.Migration):
_name="clinic.reimport.10to15"
_version="2.12.4"
def migrate(self):
set_active_company(1)
set_active_user(1)
#find hdcase => date, patient => fill up => hct , erythopoie => validate
#///////////////// SAMSEN //////////////////////
#path="/home/watcha/Desktop/RD-10-15.csv"
for fname in ["RD-10-15.csv","LS-10-15.csv"]:
#for fname in ["RD-10-15.csv"]:
path="/tmp/"+fname
field_names=[]
nolines=[]
print('RUN.%s ... '%fname)
with open(path) as csvfile:
reader = csv.DictReader(csvfile)
field_names=reader.fieldnames
count=0
found=0
no=0
for row in reader:
count+=1
name=row['name']
hn=row['hn']
pid=row['pid']
cond=[
['or',[
['name','ilike',name],
#['hn','ilike',hn],
#['card_no','ilike',pid],
],
],
]
pids=get_model("clinic.patient").search(cond)
if pids:
patient_id=pids[0]
dpt=row['dpt']
dpt_id=None
if dpt=='LS01':
dpt_id=1
elif dpt=='LS02':
dpt_id=2
elif dpt=='LS03':
dpt_id=3
elif dpt=='RD02':
dpt_id=4
elif dpt=='RD03':
dpt_id=5 # สามเสนช้น 4
cycle_id=None
cycle=row['cycle']
if '1' in cycle:
cycle_id=1
elif '2' in cycle:
cycle_id=2
elif '3' in cycle:
cycle_id=3
elif '4' in cycle:
cycle_id=4
cycle=get_model("clinic.cycle").browse(cycle_id)
m,d,y=row['datehd'].split("/") #mm/dd/yyyy
date="-".join([y.zfill(2), m.zfill(2), d.zfill(2)])
cond=[
['date','=', date],
['department_id','=',dpt_id],
#['cycle_id','=',cycle_id], # maybe change the cycle
['patient_id','=',pids[0]],
]
#print('cond >>> ', cond)
res=get_model("clinic.hd.case").search_read(cond,['cycle_id'])
if res:
if len(res)>1:
pass
#continue
hdcase_id=res[0]['id']
hdcase=get_model("clinic.hd.case").browse(hdcase_id)
vals={'hct': row['hct']}
for line in hdcase.lines:
categ=line.product_categ_id
if categ:
#36 | Fee
#43 | Service
#34 | Erythropoietin
if categ.id==43:
line.write({
'qty': row['qty'],
'price': row['inject_price'],
})
if categ.id==34:
prods=get_model("product").search_read([['description','ilike',row['epo_nf']]],['name'])
if prods:
product_id=prods[0]['id']
desc=prods[0]['name'] or ""
line.write({
'description': desc,
'product_id': product_id,
'qty': row['qty'],
'price': row['product_price'],
})
if cycle_id!=res[0]['cycle_id'][0]:
print("update cycle hdcase.%s "%(hdcase.number))
hdcase.visit_id.write({
'cycle_id': cycle_id,
})
vals.update({
'cycle_id': cycle_id,
})
if vals and hdcase.state not in ("waiting_payment","paid"):
hdcase.write(vals)
#req_fee : 1=> topay else claim expense
if not hdcase.req_fee:
hdcase.make_invoices()
hdcase.post_invoices()
hdcase.write({
'state': 'waiting_payment'
})
else:
hdcase.make_payment()
hdcase.write({
'state': 'paid'
})
found+=1
else:
no+=1
# create new visit -> hdcase
patient=get_model('clinic.patient').browse(patient_id)
dpt=get_model("clinic.department").browse(dpt_id)
visit_vals={
'patient_id': patient.id,
'department_id': dpt.id,
'cycle_id': cycle_id,
'doctor_id': patient.doctor_id.id,
'branch_id': dpt.branch_id.id,
'time_start': '%s %s:00'%(date,cycle.time_start),
'time_stop': '%s %s:00'%(date,cycle.time_stop),
'visit_date': date,
'state': 'pending',
}
context={
'no_dlz': True,
'random_sickbed': True
}
new_id=get_model('clinic.visit').create(visit_vals,context=context)
visit=get_model('clinic.visit').browse(new_id)
visit.confirm(context)
for hdcase in visit.hd_cases:
for line in hdcase.lines:
categ=line.product_categ_id
if categ:
#36 | Fee
#43 | Service
#34 | Erythropoietin
if categ.id==43:
line.write({
'qty': row['qty'],
'price': row['inject_price'],
})
if categ.id==34:
prods=get_model("product").search_read([['description','ilike',row['epo_nf']]],['name'])
if prods:
product_id=prods[0]['id']
desc=prods[0]['name'] or ""
line.write({
'product_id': product_id,
'description': desc,
'qty': row['qty'],
'price': row['product_price'],
})
if not hdcase.req_fee:
hdcase.make_invoices()
hdcase.post_invoices()
hdcase.write({
'state': 'waiting_payment'
})
else:
hdcase.make_payment()
hdcase.write({
'state': 'paid'
})
nolines.append(row)
else:
no+=1 #XXX
if field_names and nolines:
fname="no-%s"%(fname)
path='/tmp/%s'%(fname)
with open(path, 'w') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=field_names)
writer.writeheader()
for noline in nolines:
writer.writerow(noline)
print("Missing %s please checkout %s"%(len(nolines), path))
print(count, found, no)
#///////////////// LAKSI //////////////////////
Migration.register()

View File

@ -0,0 +1,81 @@
import csv
import xlrd
from netforce.model import get_model
from netforce import migration
from netforce.access import set_active_user, set_active_company
from netforce.database import get_connection
class Migration(migration.Migration):
_name="clinic.update.line.amount"
_version="2.12.5"
def migrate(self):
set_active_company(1)
set_active_user(1)
cond=[
['date','>=','2016-11-10'],
['date','<=','2016-11-15'],
['state','in',['waiting_payment','paid']],
]
settings=get_model('settings').browse(1)
cst=get_model("clinic.setting").browse(1)
prod_acc=cst.get_product_account
currency_id=settings.currency_id.id
for hdcase in get_model("clinic.hd.case").search_browse(cond):
print("hdcase.number ", hdcase.id, hdcase.number)
patient=hdcase.patient_id
ptype=patient.type_id
partner=ptype.contact_id
track_id=hdcase.branch_id.track_id.id
for line in hdcase.lines:
categ=line.product_categ_id
if line.reimbursable=='yes' and categ.id==34: #Erythopo...
prod=line.product_id
acc=prod_acc(prod.id,hdcase.patient_type_id.id)
account_id=acc.get("ar_credit_id",None)
ar_debit_id=acc.get("ar_debit_id",None) # account receiveable
amount=line.amount or (line.price*line.qty) or 0
if not amount:
continue
lines=[
('create',{
"product_id": prod.id,
"description": line.description or "",
"qty": line.qty,
"uom_id": line.uom_id.id,
"unit_price": line.price or 0,
"amount": amount,
'account_id': account_id,
#'ar_debit_id': ar_debit_id,
'track_id': track_id,
})
]
context={
'date' : hdcase.date,
'branch_id': hdcase.branch_id.id,
"type": "out",
"inv_type": "invoice",
}
vals={
"type": "out",
"inv_type": "invoice",
"tax_type": "tax_in",
'date': hdcase.date,
'due_date': hdcase.date,
"ref": '%s (%s)'%(patient.name or '',patient.number or ''),
'department_id': hdcase.department_id.id,
"related_id": "clinic.hd.case,%s"%hdcase.id,
"currency_id": currency_id,
"company_id": hdcase.company_id.id,
"partner_id": partner.id,
'patient_partner_id':patient.partner_id.id,
'account_id':account_id,
'lines':lines,
}
inv_id=get_model("account.invoice").create(vals,context=context)
inv=get_model("account.invoice").browse(inv_id)
inv.post()
Migration.register()

View File

@ -0,0 +1,19 @@
import csv
import xlrd
from netforce.model import get_model
from netforce import migration
from netforce.access import set_active_user, set_active_company
from netforce.database import get_connection
class Migration(migration.Migration):
_name="clinic.validate.cycle.item"
_version="2.12.5"
def migrate(self):
set_active_company(1)
set_active_user(1)
for citem in get_model("clinic.cycle.item").search_browse([['date','>=','2016-11-10'],['date','<=','2016-11-15']]):
citem.validate()
Migration.register()

View File

@ -297,6 +297,7 @@ class HDCase(Model):
'hd_case_id': fields.Many2One("clinic.hd.case","HD",function="_get_all",function_multi=True), # XXX 'hd_case_id': fields.Many2One("clinic.hd.case","HD",function="_get_all",function_multi=True), # XXX
'company_id': fields.Many2One("company","Company"), 'company_id': fields.Many2One("company","Company"),
'branch_id': fields.Many2One("clinic.branch","Branch"), 'branch_id': fields.Many2One("clinic.branch","Branch"),
'check_dlz': fields.Boolean("Check Dialyzer"),
} }
def _get_number(self,context={}): def _get_number(self,context={}):
@ -342,6 +343,7 @@ class HDCase(Model):
'invoice_policy': 'fee', 'invoice_policy': 'fee',
'req_fee': 0, 'req_fee': 0,
'hct_include': False, 'hct_include': False,
'check_dlz': True,
} }
_order="date desc,number desc" _order="date desc,number desc"
@ -886,8 +888,7 @@ class HDCase(Model):
def do_treatment(self,ids,context={}): def do_treatment(self,ids,context={}):
obj=self.browse(ids)[0] obj=self.browse(ids)[0]
#TODO should find dlz when confirm visit if obj.check_dlz and not obj.dialyzers:
if not obj.dialyzers:
raise Exception("Please input dialyzer!") raise Exception("Please input dialyzer!")
vals={ vals={
'state': 'in_progress', 'state': 'in_progress',

View File

@ -1,4 +1,5 @@
import time import time
from random import random
from datetime import datetime, timedelta from datetime import datetime, timedelta
@ -187,11 +188,20 @@ class Visit(Model):
'date': obj.visit_date, #XXX 'date': obj.visit_date, #XXX
} }
random_sickbed=context.get("random_sickbed")
if random_sickbed:
ids=get_model('clinic.sickbed').search([['department_id','=',obj.department_id.id]])
i=int(random()*len(ids))
vals['sickbed_id']=ids[i]
no_gen_dlz=context.get("no_dlz")
st=get_model("clinic.setting").browse(1) st=get_model("clinic.setting").browse(1)
if st.find_dlz and not obj.hd_cases: # force to remove if not no_gen_dlz and st.find_dlz and not obj.hd_cases: # force to remove
dialyzer=self.get_dlz(obj.id) dialyzer=self.get_dlz(obj.id)
if dialyzer: if dialyzer:
vals['dialyzers'].append(('create',dialyzer)) vals['dialyzers'].append(('create',dialyzer))
else:
vals['check_dlz']=False
vals['staffs'].append(('create',{ vals['staffs'].append(('create',{
'staff_id': obj.doctor_id.id, 'staff_id': obj.doctor_id.id,

View File

@ -44,6 +44,7 @@ class VisitBoard(Model):
'department_id': fields.Many2One("clinic.department","Department"), 'department_id': fields.Many2One("clinic.department","Department"),
'branch_id': fields.Many2One("clinic.branch","Branch"), 'branch_id': fields.Many2One("clinic.branch","Branch"),
"state": fields.Selection([["draft","Draft"],['pending','Pending'],["confirmed","Confirmed"],["cancelled","Cancelled"]],"Status",required=True), "state": fields.Selection([["draft","Draft"],['pending','Pending'],["confirmed","Confirmed"],["cancelled","Cancelled"]],"Status",required=True),
'gen_back': fields.Boolean("Gen Back (Admin)"),
} }
def default_get(self,field_names=None,context={},**kw): def default_get(self,field_names=None,context={},**kw):
@ -88,6 +89,7 @@ class VisitBoard(Model):
branch_id=defaults.get("branch_id",None) branch_id=defaults.get("branch_id",None)
context['branch_id']=branch_id context['branch_id']=branch_id
state=defaults.get("state",'pending') state=defaults.get("state",'pending')
gen_back=False
if ids: if ids:
obj=self.browse(ids)[0] obj=self.browse(ids)[0]
date_from=obj.date_from date_from=obj.date_from
@ -99,6 +101,7 @@ class VisitBoard(Model):
branch_id=obj.branch_id.id branch_id=obj.branch_id.id
context['branch_id']=branch_id context['branch_id']=branch_id
state=obj.state state=obj.state
gen_back=obj.gen_back
# auto generate visit day to day # auto generate visit day to day
def auto_gen_visit(dom=[]): def auto_gen_visit(dom=[]):
dom.append(['dispose','=',False]) dom.append(['dispose','=',False])
@ -117,7 +120,7 @@ class VisitBoard(Model):
weekday=date.weekday() weekday=date.weekday()
date_txt=date.strftime("%Y-%m-%d") date_txt=date.strftime("%Y-%m-%d")
datenow=time.strftime("%Y-%m-%d") datenow=time.strftime("%Y-%m-%d")
if date_txt < datenow: if date_txt < datenow and not gen_back:
print("continue ", date_txt, datenow) print("continue ", date_txt, datenow)
continue continue
for pt in get_model("clinic.patient").search_browse(dom): for pt in get_model("clinic.patient").search_browse(dom):

View File

@ -15,6 +15,8 @@ class VisitPopupConfirm(Model):
'user_id': fields.Many2One("base.user","User"), 'user_id': fields.Many2One("base.user","User"),
"note": fields.Text("Note"), "note": fields.Text("Note"),
'lines': fields.One2Many("clinic.popup.visit.confirm.line","popup_visit_id",'Lines'), 'lines': fields.One2Many("clinic.popup.visit.confirm.line","popup_visit_id",'Lines'),
'no_dlz': fields.Boolean("No Dialyzer"),
'random_sickbed': fields.Boolean("Random Sickbed"),
} }
def _get_visitboard_id(self,context={}): def _get_visitboard_id(self,context={}):
@ -93,13 +95,15 @@ class VisitPopupConfirm(Model):
vals={} vals={}
if nurse_ids: if nurse_ids:
vals['nurse_id']=nurse_ids[0] vals['nurse_id']=nurse_ids[0]
context['no_dlz']=obj.no_dlz
context['random_sickbed']=obj.random_sickbed
for line in obj.lines: for line in obj.lines:
vs=line.visit_id vs=line.visit_id
dt=line.doctor_id dt=line.doctor_id
if dt: if dt:
vals['doctor_id']=dt.id vals['doctor_id']=dt.id
vs.write(vals) vs.write(vals)
vs.confirm() vs.confirm(context)
count+=1 count+=1
return { return {
'next': { 'next': {