diff --git a/netforce_clinic/layouts/clinic_setting.xml b/netforce_clinic/layouts/clinic_setting.xml
index 75a0875..b683086 100644
--- a/netforce_clinic/layouts/clinic_setting.xml
+++ b/netforce_clinic/layouts/clinic_setting.xml
@@ -9,7 +9,9 @@
-
+
+
+
diff --git a/netforce_clinic/migrations/__init__.py b/netforce_clinic/migrations/__init__.py
index e583863..60e40e4 100644
--- a/netforce_clinic/migrations/__init__.py
+++ b/netforce_clinic/migrations/__init__.py
@@ -1,3 +1,10 @@
from . import clinic_setting
#from . import conv_bal
+#from . import clinic_setting
#from . import repost_invoice
+#from . import conv_bal
+#from . import tb_ap_import
+#from . import check_seq
+#from . import del_gi
+#from . import restore_picking
+from . import rename_dbl_hdcase_number
diff --git a/netforce_clinic/migrations/check_seq.py b/netforce_clinic/migrations/check_seq.py
new file mode 100644
index 0000000..95b7559
--- /dev/null
+++ b/netforce_clinic/migrations/check_seq.py
@@ -0,0 +1,37 @@
+from netforce.model import get_model
+from netforce import migration
+from netforce.access import set_active_user, set_active_company
+
+class Migration(migration.Migration):
+ _name="clinic.check.seq"
+ _version="2.11.0"
+
+ def migrate(self):
+ set_active_user(1)
+ set_active_company(1)
+ fnames=['branch_id','prefix']
+ seqs=dict([(x['branch_id'][0],x['prefix']) for x in get_model("sequence").search_read([['type','=','clinic_hdcase']],fnames)])
+ print('seqs ',seqs)
+ count=0
+ for hdcase in get_model('clinic.hd.case').search_browse([]):
+ seq=seqs[hdcase.branch_id.id]
+ rp=seq.split("/")[-1].replace("-","")
+ if '/' in hdcase.number and hdcase.number!='/':
+ if seq not in hdcase.number:
+ pf=hdcase.number.split('-')[0].split("/")[-1]
+ new_hdcase_number=hdcase.number.replace(pf,rp)
+ new_visit_number=hdcase.visit_id.number.replace(pf,rp)
+ print(hdcase.number, new_hdcase_number,hdcase.department_id.name)
+ print(hdcase.visit_id.number, new_visit_number, hdcase.visit_id.department_id.name)
+ hdcase.write({
+ 'number': new_hdcase_number,
+ })
+ hdcase.visit_id.write({
+ 'number': new_visit_number,
+ })
+ print('-'*100)
+ #print(seq, ' : ', hdcase.number, hdcase.visit_id.number, hdcase.date, hdcase.patient_id.name)
+ count+=1
+ print('total unmatch', count)
+
+Migration.register()
diff --git a/netforce_clinic/migrations/conv_bal.py b/netforce_clinic/migrations/conv_bal.py
index 869303e..3311db6 100644
--- a/netforce_clinic/migrations/conv_bal.py
+++ b/netforce_clinic/migrations/conv_bal.py
@@ -9,14 +9,43 @@ class Migration(migration.Migration):
def migrate(self):
set_active_user(1)
set_active_company(1)
- #for mv in get_model("account.move").search_browse([['number','ilike', 'OPEN']]):
- #mv.to_draft()
- #mv.delete()
+
+ # delete old account payable
+ dom=[
+ ['memo','=','Conversion balance 2015-06-30'],
+ ['type','=','in'],
+ ['state','=','waiting_payment'],
+ ]
+ for inv in get_model('account.invoice').search_browse(dom):
+ print('delete invoice... ', inv.number)
+ inv.to_draft()
+ inv.delete()
+
+ # delete old account rereivable
+ dom=[
+ ['memo','=','Conversion balance 2015-06-30'],
+ ['type','=','out'],
+ ['state','=','waiting_payment'],
+ ]
+ for inv in get_model('account.invoice').search_browse(dom):
+ print('delete invoice... ', inv.number)
+ inv.to_draft()
+ inv.delete()
+ # remove journal entry
+ dom=[
+ ['number','=','OPENING ENTRY'],
+ ]
+ for move in get_model('account.move').search_browse(dom):
+ print('delete accout.move... ', move.number)
+ move.to_draft()
+ move.delete()
+
cbv_id=24
cbv=get_model("conv.bal").browse(cbv_id)
cbv.write({
'date_fmt': '%Y-%m-%d',
'file': 'tb.csv',
+ 'date': '2015-06-30',
})
print("import acc file (step 1) running ...")
get_model("conv.bal").import_acc_file([cbv.id],context={})
@@ -39,7 +68,8 @@ class Migration(migration.Migration):
print("import purch file (step 3) running ...")
cbv.write({
'file': 'ap.csv',
- 'date_fmt': '%d/%m/%Y',
+ #'date_fmt': '%d/%m/%Y',
+ 'date_fmt': '%Y-%m-%d',
})
get_model("conv.bal").import_purch_file([cbv.id],context={})
get_model("conv.bal").import_purch([cbv.id],context={})
diff --git a/netforce_clinic/migrations/del_gi.py b/netforce_clinic/migrations/del_gi.py
new file mode 100644
index 0000000..3d6d2b5
--- /dev/null
+++ b/netforce_clinic/migrations/del_gi.py
@@ -0,0 +1,50 @@
+import time
+
+from netforce.model import get_model
+from netforce import migration
+from netforce.access import set_active_user, set_active_company
+
+class Migration(migration.Migration):
+ _name="clinic.del.gi"
+ _version="2.12.0"
+
+ def migrate(self):
+ set_active_user(1)
+ set_active_company(1)
+ #fmt='%Y-%m-%d %H:%M:%S'
+ #datenow=time.strftime(fmt)
+ dom=[
+ ['date','>=','2015-01-01 00:00:00'],
+ ['date','<=','2015-06-30 23:59:59'],
+ ['type','=','out'],
+ ]
+ count=0
+ for pick in get_model('stock.picking').search_browse(dom):
+ print('del ', pick.date, pick.id, pick.number)
+ pick.delete()
+ count+=1
+
+ print("Delete From 2015-01-01 to 2015-06-30 Total is: ", count)
+
+ rows=open("/tmp/del_gi.csv","r").read()
+ ids=[]
+ for row in rows.split("\n"):
+ try:
+ r=row.split(",")
+ idtxt=r[1]
+ if idtxt.isnumeric():
+ ids.append(int(idtxt))
+ except Exception as e:
+ print("ERROR ", e)
+ count=0
+ for id in ids:
+ pick=get_model('stock.picking').browse(id)
+ try:
+ print('del ', pick.date, pick.id, pick.number)
+ pick.delete()
+ except Exception as e:
+ print("ERROR ",e)
+ count+=1
+ print("Delete from file Total: ",count)
+
+Migration.register()
diff --git a/netforce_clinic/migrations/rename_dbl_hdcase_number.py b/netforce_clinic/migrations/rename_dbl_hdcase_number.py
new file mode 100644
index 0000000..5c3b392
--- /dev/null
+++ b/netforce_clinic/migrations/rename_dbl_hdcase_number.py
@@ -0,0 +1,28 @@
+import time
+
+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.rename.dbl.hdcase.number"
+ _version="2.12.2"
+
+ def migrate(self):
+ db=get_connection()
+ res=db.query("""
+ select c, number from (select count(number) as c,number from clinic_hd_case group by number order by number) as r1 where c > 1;
+ """)
+ for r in res:
+ number=r['number']
+ if number!='/':
+ count=1
+ for hdcase in get_model('clinic.hd.case').search_browse([['number','=',number]]):
+ hdcase.write({
+ 'number': number+"."+str(count),
+ })
+ count+=1
+ print(r)
+
+Migration.register()
diff --git a/netforce_clinic/migrations/repost_invoice.py b/netforce_clinic/migrations/repost_invoice.py
index 94fd6d9..ac0f8ba 100644
--- a/netforce_clinic/migrations/repost_invoice.py
+++ b/netforce_clinic/migrations/repost_invoice.py
@@ -39,7 +39,6 @@ class Migration(migration.Migration):
'state': 'draft',
})
ids=list(hdcase_ids)
-
for seq in get_model("sequence").search_browse([['type','in',['cust_invoice','clinic_invoice_noclaim']]]):
for run in seq.running:
run.delete()
diff --git a/netforce_clinic/migrations/restore_picking.py b/netforce_clinic/migrations/restore_picking.py
new file mode 100644
index 0000000..8c06148
--- /dev/null
+++ b/netforce_clinic/migrations/restore_picking.py
@@ -0,0 +1,36 @@
+import time
+
+from netforce.model import get_model
+from netforce import migration
+from netforce.access import set_active_user, set_active_company
+
+class Migration(migration.Migration):
+ _name="clinic.restore.picking"
+ _version="2.12.1"
+
+ def migrate(self):
+ set_active_user(1)
+ set_active_company(1)
+ #remove all good issued from dlz
+ total_del=0
+ for dlz in get_model('clinic.dialyzer').search_browse([]):
+ for pick in dlz.pickings:
+ print('del pick ',pick.number)
+ pick.delete()
+ total_del+=1
+ print('total delete ', total_del)
+ fmt='%Y-%m-%d %H:%M:%S'
+ datenow=time.strftime(fmt)
+ dom=[
+ ['date','>=','2015-01-01'],
+ ['date','<=',datenow],
+ ]
+ for hdcase in get_model("clinic.hd.case").search_browse(dom):
+ if not hdcase.pickings:
+ print('gen picking for %s in %s'%(hdcase.number, hdcase.date))
+ ctx={
+ 'migrate':True,
+ }
+ hdcase.make_pickings(context=ctx)
+
+Migration.register()
diff --git a/netforce_clinic/migrations/tb_ap_import.py b/netforce_clinic/migrations/tb_ap_import.py
new file mode 100644
index 0000000..207e573
--- /dev/null
+++ b/netforce_clinic/migrations/tb_ap_import.py
@@ -0,0 +1,75 @@
+from netforce.model import get_model
+from netforce import migration
+from netforce.access import set_active_user, set_active_company
+
+class Migration(migration.Migration):
+ _name="clinic.tb.ap.import"
+ _version="2.10.0"
+
+ def migrate(self):
+ set_active_user(1)
+ set_active_company(1)
+ #for mv in get_model("account.move").search_browse([['number','ilike', 'OPEN']]):
+ #mv.to_draft()
+ #mv.delete()
+ cbv_id=24
+ cbv=get_model("conv.bal").browse(cbv_id)
+ cbv.write({
+ 'date_fmt': '%Y-%m-%d',
+ 'file': 'tb.csv',
+ 'date': '2015-06-30',
+ })
+ print("import acc file (step 1) running ...")
+ get_model("conv.bal").import_acc_file([cbv.id],context={})
+ get_model("conv.bal").import_acc([cbv.id],context={})
+
+ #print("import sale file (step 2)running ...")
+ #del_ids=get_model("conv.sale.invoice").search([["conv_id","=",cbv.id]])
+ #get_model('conv.sale.invoice').delete(del_ids)
+ #for ar_file in ['ar_fee','ar_epo','ar_srv','ar_other']:
+ #cbv.write({
+ #'date_fmt': '%d/%m/%Y',
+ #'file': '%s.csv'%(ar_file),
+ #})
+ #ctx={
+ #'is_append': True,
+ #}
+ #get_model("conv.bal").import_sale_file([cbv.id],context=ctx)
+ #get_model("conv.bal").import_sale([cbv.id],context={})
+
+ print("import purch file (step 3) running ...")
+ cbv.write({
+ 'file': 'ap.csv',
+ #'date_fmt': '%d/%m/%Y',
+ 'date_fmt': '%Y-%m-%d',
+ })
+ get_model("conv.bal").import_purch_file([cbv.id],context={})
+ get_model("conv.bal").import_purch([cbv.id],context={})
+
+ cbv.write({
+ 'date_fmt': '%Y-%m-%d',
+ })
+ # delete old account payable
+ dom=[
+ ['memo','=','Conversion balance 2015-06-30'],
+ ['type','=','in'],
+ ['state','=','waiting_payment'],
+ ]
+ for inv in get_model('account.invoice').search_browse(dom):
+ print('delete invoice... ', inv.number)
+ inv.to_draft()
+ inv.delete()
+ print(">> next 3")
+ print("create_open_entry...")
+ ctx={
+ 'tb_ap_only': True,
+ }
+ cbv.create_open_entry(context=ctx)
+ #print("create_sale_invoices...")
+ #cbv.create_sale_invoices()
+ print("create_purch_invoices...")
+ cbv.create_purch_invoices()
+ print("Done!")
+ return True
+
+Migration.register()
diff --git a/netforce_clinic/models/base_user.py b/netforce_clinic/models/base_user.py
index f5e51eb..95b9cab 100644
--- a/netforce_clinic/models/base_user.py
+++ b/netforce_clinic/models/base_user.py
@@ -14,4 +14,5 @@ class User(Model):
_defaults={
'auto_load_dpt': True,
}
+
User.register()
diff --git a/netforce_clinic/models/change_visit.py b/netforce_clinic/models/change_visit.py
index d4e6e55..3f52e6d 100644
--- a/netforce_clinic/models/change_visit.py
+++ b/netforce_clinic/models/change_visit.py
@@ -41,6 +41,7 @@ class ChangeVisit(Model):
def do_change(self,ids,context):
obj=self.browse(ids)[0]
+ context['branch_id']=obj.department_id.branch_id.id
dom=[
['visit_date','=',obj.visit_date],
['patient_id','=',obj.patient_id.id],
@@ -60,7 +61,7 @@ class ChangeVisit(Model):
'time_stop': obj.time_stop,
'visit_date': obj.visit_date,
'state': 'pending',
- })
+ },context=context)
obj.visit_id.to_draft()
obj.visit_id.cancel()
visit=get_model("clinic.visit").browse(new_id)
diff --git a/netforce_clinic/models/conv_bal.py b/netforce_clinic/models/conv_bal.py
index 0f12683..730b6f2 100644
--- a/netforce_clinic/models/conv_bal.py
+++ b/netforce_clinic/models/conv_bal.py
@@ -7,6 +7,10 @@ from netforce.utils import get_file_path
class ConvBal(Model):
_inherit="conv.bal"
+ _fields={
+ 'track_id': fields.Many2One("account.track.categ","Track-1"),
+ 'department_id': fields.Many2One("clinic.department","Department"),
+ }
def create_sale_invoices(self,ids,context={}):
obj=self.browse(ids)[0]
@@ -54,40 +58,25 @@ class ConvBal(Model):
else:
get_model("account.invoice").create(vals)
- def _import_sale_file(self,ids,context):
+ def import_sale_file(self,ids,context):
obj=self.browse(ids)[0]
path=get_file_path(obj.file)
data=open(path).read()
rd=csv.reader(StringIO(data))
headers=next(rd)
headers=[h.strip() for h in headers]
- del_ids=get_model("conv.sale.invoice").search([["conv_id","=",obj.id]])
- get_model("conv.sale.invoice").delete(del_ids)
+ if not context.get('is_append'):
+ del_ids=get_model("conv.sale.invoice").search([["conv_id","=",obj.id]])
+ get_model("conv.sale.invoice").delete(del_ids)
for row in rd:
- #print("row",row)
- row+="," #XXX append blank column for Amount Cur
+ print("row",row)
line=dict(zip(headers,row))
- #print("line",line)
- track_id=None
- department_id=None
- department_name=line.get("Department")
- if department_name:
- for dpt in get_model("clinic.department").search_browse([['name','=',department_name]]):
- department_id=dpt.id
- track_id=dpt.branch_id.track_id.id
+ print("line",line)
if not line.get("Number"):
continue
number=line["Number"].strip()
if not number:
continue
-
- ##XXX remove invoice
- #for inv in get_model('account.invoice').search_browse([['number','=', number]]):
- #print('number --> ', number)
- #inv.to_draft()
- #inv.delete()
- #continue
-
ref=line["Reference"].strip()
contact_name=line["Contact"].strip()
res=get_model("partner").search([["name","=",contact_name]])
@@ -98,81 +87,34 @@ class ConvBal(Model):
due_date=datetime.datetime.strptime(line["Due Date"].strip(),obj.date_fmt).strftime("%Y-%m-%d")
amount_due=float(line["Amount Due"].strip().replace(",","") or 0)
acc_code=line["Account"].strip()
+ res=get_model("account.account").search([["code","=",acc_code]])
+ if not res:
+ raise Exception("Account code not found: %s"%acc_code)
+ acc_id=res[0]
amount_cur=float(line["Amount Cur"].strip().replace(",","") or 0)
- acc_codes=acc_code.split(",")
- amts=[] #XXX
- for m in line['Memo'].split(","):
- amt=m.split(":")[1]
- amt=amt.strip()
- if amt:
- amt=float(amt)
- amts.append(amt)
- if len(acc_codes) > 1:
- count=0
- print("*"*80)
- for acc_code in acc_codes:
- acc_code=acc_code.strip()
- res=get_model("account.account").search([["code","=",acc_code]])
- if not res:
- raise Exception("Account code not found: %s"%acc_code)
- acc_id=res[0]
- amount_due=amts[count]
- vals={
- "conv_id": obj.id,
- "number": number,
- "ref": ref,
- "contact_id": contact_id,
- "date": date,
- "due_date": due_date,
- "amount_due": amount_due,
- "account_id": acc_id,
- "amount_cur": amount_due, #XXX
- 'track_id': track_id,
- 'department_id': department_id,
- }
- get_model("conv.sale.invoice").create(vals)
- count+=1
- elif len(amts) >= 1 and len(acc_codes)<=1:
- acc_code=acc_codes[0].strip()
- res=get_model("account.account").search([["code","=",acc_code]])
- if not res:
- raise Exception("Account code not found: %s"%acc_code)
- acc_id=res[0]
- for amt in amts:
- amount_due=amt
- vals={
- "conv_id": obj.id,
- "number": number,
- "ref": ref,
- "contact_id": contact_id,
- "date": date,
- "due_date": due_date,
- "amount_due": amount_due,
- "account_id": acc_id,
- "amount_cur": amount_due, #XXX
- 'track_id': track_id,
- 'department_id': department_id,
- }
- get_model("conv.sale.invoice").create(vals)
- else:
- res=get_model("account.account").search([["code","=",acc_code]])
- if not res:
- raise Exception("Account code not found: %s"%acc_code)
- acc_id=res[0]
- vals={
- "conv_id": obj.id,
- "number": number,
- "ref": ref,
- "contact_id": contact_id,
- "date": date,
- "due_date": due_date,
- "amount_due": amount_due,
- "account_id": acc_id,
- "amount_cur": amount_cur,
- 'track_id': track_id,
- 'department_id': department_id,
- }
- get_model("conv.sale.invoice").create(vals)
+ vals={
+ "conv_id": obj.id,
+ "number": number,
+ "ref": ref,
+ "contact_id": contact_id,
+ "date": date,
+ "due_date": due_date,
+ "amount_due": amount_due,
+ "account_id": acc_id,
+ "amount_cur": amount_cur,
+ }
+ department_name=line['Department']
+ track_name=line['Track-1']
+ if department_name:
+ for department in get_model("clinic.department").search_browse([['name','=',department_name]]):
+ vals['department_id']=department.id
+ branch=department.branch_id
+ track=branch.track_id
+ vals['track_id']=track.id
+ elif track_name:
+ for track_id in get_model("account.track.categ").search([['name','=',track_name]]):
+ vals['track_id']=track_id
+ get_model("conv.sale.invoice").create(vals)
return {
"next": {
"name": "conv_bal",
diff --git a/netforce_clinic/models/department.py b/netforce_clinic/models/department.py
index c223c93..ffc549c 100644
--- a/netforce_clinic/models/department.py
+++ b/netforce_clinic/models/department.py
@@ -91,7 +91,7 @@ class Department(Model):
['clinic.sickbed','department_id.code','='],
['clinic.shop','department_id.code','='],
['clinic.department','code','='], #XXX
- ['clinic.dialyzer','department_id.code','='],
+ #['clinic.dialyzer','department_id.code','='], # support to use different location
['clinic.schedule','department_id.code','='],
]
for obj in self.browse(ids):
diff --git a/netforce_clinic/models/dialyzer.py b/netforce_clinic/models/dialyzer.py
index 6dca684..518776a 100644
--- a/netforce_clinic/models/dialyzer.py
+++ b/netforce_clinic/models/dialyzer.py
@@ -2,6 +2,7 @@ import time
from netforce.model import Model, fields, get_model
from netforce.access import get_active_company, get_active_user, set_active_user
+from netforce.database import get_connection
class Dialyzer(Model):
_name="clinic.dialyzer"
@@ -9,7 +10,17 @@ class Dialyzer(Model):
_audit_log=True
_name_field="number"
_multi_company=True
-
+
+ def _get_user(self,ids,context={}):
+ res={}
+ db=get_connection()
+ for r in db.query("""select id,create_uid, write_uid from clinic_dialyzer where id in %s""",tuple(ids)):
+ res[r['id']]={
+ 'create_user_id': r['create_uid'],
+ 'write_user_id': r['write_uid'],
+ }
+ return res
+
_fields={
"name": fields.Char("Name",search=True),
"number": fields.Char("Number",required=True,search=True),
@@ -32,6 +43,8 @@ class Dialyzer(Model):
"hd_cases_dlz": fields.One2Many("clinic.hd.case.dialyzer","dialyzer_id","Dialyzer History",domain=[['hd_case_id.state','in','waiting_payment','paid']]),
'department_id': fields.Many2One("clinic.department","Department",search=True),
"membrane_type": fields.Selection([("unsub","Unsub cellul"),("sub","Sub cellul"),("synthetic","Synthetic")],"Membrane Type"),
+ 'write_user_id': fields.Many2One("base.user","Updated By",function="_get_user",function_multi=True),
+ 'create_user_id': fields.Many2One("base.user","Create By",function="_get_user",function_multi=True),
}
def _get_number(self,context={}):
@@ -117,63 +130,64 @@ class Dialyzer(Model):
st=get_model("clinic.setting").browse(1)
stock_journal=st.stock_journal_id
- wh_loc_id=None
- cust_loc_id=None
- department=obj.department_id
- if department:
- stock_journal=department.pick_out_journal_id
- if stock_journal:
- wh_loc_id=stock_journal.location_from_id.id
- cust_loc_id=stock_journal.location_to_id.id
- print("get location from stock journal %s "%(stock_journal.name))
+ if st.dlz_picking_auto:
+ wh_loc_id=None
+ cust_loc_id=None
+ department=obj.department_id
+ if department:
+ stock_journal=department.pick_out_journal_id
+ if stock_journal:
+ wh_loc_id=stock_journal.location_from_id.id
+ cust_loc_id=stock_journal.location_to_id.id
+ print("get location from stock journal %s "%(stock_journal.name))
- if not stock_journal:
- raise Exception("Not found stock journal")
+ if not stock_journal:
+ raise Exception("Not found stock journal")
+ pick_vals={
+ "type": "out",
+ 'journal_id': stock_journal.id,
+ 'date': obj.date,
+ "ref": obj.number,
+ "related_id": "clinic.dialyzer,%s"%obj.id,
+ "partner_id": obj.patient_id.partner_id.id,
+ "ship_address_id": ship_address_id,
+ "lines": [],
+ "state": "draft",
+ }
- pick_vals={
- "type": "out",
- 'journal_id': stock_journal.id,
- 'date': obj.date,
- "ref": obj.number,
- "related_id": "clinic.dialyzer,%s"%obj.id,
- "partner_id": obj.patient_id.partner_id.id,
- "ship_address_id": ship_address_id,
- "lines": [],
- "state": "draft",
- }
-
- if not cust_loc_id:
- res=get_model("stock.location").search([["type","=","customer"]])
- if not res:
- raise Exception("Customer location not found")
- cust_loc_id=res[0]
-
- prod=obj.product_id
- if not wh_loc_id:
- wh_loc_id=prod.location_id.id # product -> tab inventory -> warehouse filed
- if not wh_loc_id:
- res=get_model("stock.location").search([["type","=","internal"]])
+ if not cust_loc_id:
+ res=get_model("stock.location").search([["type","=","customer"]])
if not res:
- raise Exception("Warehouse not found")
- wh_loc_id=res[0]
+ raise Exception("Customer location not found")
+ cust_loc_id=res[0]
+
+ prod=obj.product_id
+ if not wh_loc_id:
+ wh_loc_id=prod.location_id.id # product -> tab inventory -> warehouse filed
+ if not wh_loc_id:
+ res=get_model("stock.location").search([["type","=","internal"]])
+ if not res:
+ raise Exception("Warehouse not found")
+ wh_loc_id=res[0]
+
+ if prod.type=='stock':
+ line_vals={
+ "product_id": prod.id,
+ "qty": 1,
+ "uom_id": prod.uom_id.id,
+ "location_from_id": wh_loc_id,
+ "location_to_id": cust_loc_id,
+ }
+ pick_vals["lines"].append(("create",line_vals))
+ picking_obj=get_model("stock.picking")
+ context={
+ 'pick_type': 'out',
+ 'journal_id': pick_vals['journal_id'],
+ }
+ pick_id=picking_obj.create(pick_vals,context=context)
+ pick=picking_obj.browse(pick_id)
+ pick.set_done([pick_id])
- if prod.type=='stock':
- line_vals={
- "product_id": prod.id,
- "qty": 1,
- "uom_id": prod.uom_id.id,
- "location_from_id": wh_loc_id,
- "location_to_id": cust_loc_id,
- }
- pick_vals["lines"].append(("create",line_vals))
- picking_obj=get_model("stock.picking")
- context={
- 'pick_type': 'out',
- 'journal_id': pick_vals['journal_id'],
- }
- pick_id=picking_obj.create(pick_vals,context=context)
- pick=picking_obj.browse(pick_id)
- pick.set_done([pick_id])
number=obj.number.replace("/","")
if not number:
department=obj.department_id
diff --git a/netforce_clinic/models/hd_case.py b/netforce_clinic/models/hd_case.py
index 9546245..bd51cb6 100644
--- a/netforce_clinic/models/hd_case.py
+++ b/netforce_clinic/models/hd_case.py
@@ -288,7 +288,7 @@ class HDCase(Model):
def _get_number(self,context={}):
while 1:
- seq_id=get_model("sequence").find_sequence(type="clinic_hdcase")
+ seq_id=get_model("sequence").find_sequence(type="clinic_hdcase",context=context)
num=get_model("sequence").get_next_number(seq_id,context=context)
if not num:
return None
@@ -319,7 +319,8 @@ class HDCase(Model):
"date": lambda *a: time.strftime("%Y-%m-%d"),
"time_start": lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"),
"time_stop": lambda *a: time.strftime("%Y-%m-%d %H:%M:%S"),
- 'number': '/',
+ #'number': '/',
+ 'number': _get_number,
"company_id": lambda *a: get_active_company(),
'hd_acc': 'o',
'hd_mode': 'chronic',
@@ -757,11 +758,12 @@ class HDCase(Model):
})
def make_pickings(self,ids,context={}):
+ st=get_model('clinic.setting').browse(1)
+ if not st.hdcase_picking_auto:
+ return
obj=self.browse(ids[0])
- # no picking
if not obj.lines:
return
-
patient=obj.patient_id
partner=patient.partner_id
if not partner:
@@ -773,7 +775,6 @@ class HDCase(Model):
break
if not ship_address_id:
patient.simple_address()
- #raise Exception("contact %s dont'have address with type shipping"%partner.name)
# default journal
cust_loc_id=None
wh_loc_id=None
@@ -785,7 +786,6 @@ class HDCase(Model):
if stock_journal:
wh_loc_id=stock_journal.location_from_id.id
cust_loc_id=stock_journal.location_to_id.id
- print("get location from stock journal %s "%(stock_journal.name))
pick_vals={
"type": "out",
'journal_id': stock_journal.id,
@@ -802,8 +802,6 @@ class HDCase(Model):
if not res:
raise Exception("Customer location not found")
cust_loc_id=res[0]
-
- #XXX
no_lines=context.get('no_line') or False
if no_lines:
return
@@ -817,24 +815,26 @@ class HDCase(Model):
prod=line.product_id
if prod.type != 'stock':
continue
+ if not st.dlz_picking_auto and prod.categ_id.code=='DLZ':
+ continue
# check orginal product
prod_code=prod.code.split("-")[0]
if patient.type_id.main_product:
if len(prod_code)>1:
prods=get_model('product').search_browse(['code','=',prod_code])
- if not prods:
- raise Exception("Can not create good issue: product code %s is not found!"%prod_code)
- prod=prods[0]
+ if not context.get('migrate'):
+ if not prods:
+ raise Exception("Can not create goods issue: product code %s is not found!"%prod_code)
+ prod=prods[0]
+ else:
+ continue
if prod_ids and prod.id not in prod_ids or prod.id in prod_exist_ids:
continue
prod_exist_ids.append(prod.id)
- #XXX
dpt_prods=get_model('clinic.department.product').get_location(obj.department_id.id,prod.id)
if dpt_prods:
- print("get location from menu department products")
wh_loc_id=dpt_prods.get('wh_loc_id')
cust_loc_id=dpt_prods.get('cust_loc_id')
- #pick_vals['journal_id']=dpt_prods.get('journal_id')
if not wh_loc_id:
wh_loc_id=prod.location_id.id
if wh_loc_id:
@@ -915,9 +915,6 @@ class HDCase(Model):
use_time=dlz_line.use_time or 0
max_use_time=dlz_line.max_use_time or 0
desc=dlz_line.description or ''
- #TODO when we to draft after approve hdcase it will update the wrong use time
- #if use_time > (dlz.use_time or 0):
- #continue
if is_decrease:
use_time-=1
vals={
@@ -958,7 +955,7 @@ class HDCase(Model):
cycle_item_ids=cycle_item.search(dom)
cycle_item_id=None
if cycle_item_ids:
- cycle_item_id=cycle_item_ids[0]
+ cycle_item_id=cycle_item_ids[-1]
else:
cycle_item_id=cycle_item.create({
'date': obj.date,
@@ -1014,7 +1011,6 @@ class HDCase(Model):
obj.make_invoices(context=context)
obj.post_invoices(context=context)
obj.create_cycle_item()
- #obj.do_expense(context=context)
vals={
"state":"waiting_payment", # for government
}
@@ -1024,6 +1020,7 @@ class HDCase(Model):
date=obj.date
vals['time_stop']='%s %s'%(date,timenow)
obj.write(vals)
+ obj.recompute_labor_cost()
if context.get("called"):
return obj.id
return {
@@ -1060,8 +1057,10 @@ class HDCase(Model):
def undo(self,ids,context={}):
obj=self.browse(ids)[0]
context['is_decrease']=True
- # in case to draft
- obj.update_usetime(context=context)
+ # should not reset use time if not the day of treatment is not today
+ datenow=time.strftime("%Y-%m-%d")
+ if obj.date==datenow:
+ obj.update_usetime(context=context)
for line in obj.lines:
line.write({
'state': 'draft',
@@ -1084,7 +1083,7 @@ class HDCase(Model):
payment.delete()
for pm_line in obj.payment_lines:
pm_line.delete()
-
+ #XXX remove
for exp in obj.expenes:
exp.delete()
@@ -1097,7 +1096,7 @@ class HDCase(Model):
obj.sickbed_id.write({
'available': False,
})
-
+ obj.recompute_labor_cost()
return {
'next': {
'name': 'clinic_hd_case',
@@ -1106,7 +1105,16 @@ class HDCase(Model):
},
'flash': '%s has been undo'%obj.number,
}
-
+
+ def recompute_labor_cost(self,ids,context={}):
+ for obj in self.browse(ids):
+ cit=obj.cycle_item_id
+ # recompute labor cost
+ if cit.state=='validated':
+ for lc in get_model("clinic.labor.cost").search_browse([['cycle_item_id','=',cit.id]]):
+ lc.compute()
+
+
def view_payment(self,ids,context={}):
print("clinic_view_payment")
return {
@@ -1306,7 +1314,20 @@ class HDCase(Model):
}
def new_dialyzer(self,ids,context={}):
+ '''
+ drop old one and create new dlz
+ '''
obj=self.browse(ids)[0]
+ if context.get('drop_old'):
+ for dlz_line in obj.dialyzers:
+ dlz=dlz_line.dialyzer_id
+ dlz_line.write({
+ 'use_time': dlz.use_time,
+ })
+ dlz.write({
+ 'state': 'drop',
+ })
+
is_wiz=context.get("is_wiz")
dlz_vals={}
if is_wiz:
@@ -1500,7 +1521,7 @@ class HDCase(Model):
#break
return vals
- def create(self,vals,**kw):
+ def create(self,vals,context):
patient_id=vals['patient_id']
if 'vascular_acc' in vals.keys():
patient=get_model("clinic.patient").browse(patient_id)
@@ -1509,7 +1530,7 @@ class HDCase(Model):
})
vals=self.get_staff_line(vals,patient_id)
vals=self.get_hct(vals,patient_id)
- new_id=super().create(vals,**kw)
+ new_id=super().create(vals,context=context)
self.function_store([new_id])
return new_id
diff --git a/netforce_clinic/models/hd_case_dialyzer.py b/netforce_clinic/models/hd_case_dialyzer.py
index 7adfee1..030bb32 100644
--- a/netforce_clinic/models/hd_case_dialyzer.py
+++ b/netforce_clinic/models/hd_case_dialyzer.py
@@ -14,6 +14,13 @@ class HDCaseDialyzerLine(Model):
}
return res
+ def _get_dlz_state(self,ids,context={}):
+ res={}
+ for obj in self.browse(ids):
+ dlz=obj.dialyzer_id
+ res[obj.id]=dlz.state
+ return res
+
_fields={
"hd_case_id": fields.Many2One("clinic.hd.case","HDCase",on_delete="cascade"),
"dialyzer_type": fields.Selection([("low","low flux"),("high","high flux"),("dbl","dbl hifulx")],"Dialyzer Type"),
@@ -24,7 +31,8 @@ class HDCaseDialyzerLine(Model):
"membrane_type": fields.Selection([("unsub","Unsub cellul"),("sub","Sub cellul"),("synthetic","Synthetic")],"Membrane Type"),
'hdcase_date': fields.Date('Date', function="_get_all",function_multi=True),
"hdcase_state": fields.Selection([("draft","Draft"),('waiting_treatment','Waiting Treatment'),("in_progress","In Progress"),("completed","Finish Treatment"),('paid','Paid'),("waiting_payment","Waiting Payment"),("discountinued","Discountinued"),("cancelled","Cancelled")],"Status",required=True,function="_get_all",function_multi=True),
- 'nurse_id': fields.Many2One('clinic.staff', 'Nurse',function="_get_all",function_multi=True),
+ 'nurse_id': fields.Many2One('clinic.staff', 'Use by',function="_get_all",function_multi=True),
+ "state": fields.Selection([("new","New"),("active","Active"),("drop","Drop"),("expire","Expire"),('cancelled','Cancelled')],"Status",function="_get_dlz_state"),
}
_order="hd_case_id.date desc"
diff --git a/netforce_clinic/models/hd_case_payment.py b/netforce_clinic/models/hd_case_payment.py
index ce18120..1856c3b 100644
--- a/netforce_clinic/models/hd_case_payment.py
+++ b/netforce_clinic/models/hd_case_payment.py
@@ -65,6 +65,7 @@ class HDCasePayment(Model):
obj.write({
'pay_amount': hd_case.amount,
})
+ hd_case.recompute_labor_cost()
return {
'next': {
'name': 'clinic_hd_case',
@@ -85,6 +86,7 @@ class HDCasePayment(Model):
'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 "")
diff --git a/netforce_clinic/models/hd_case_popup_dlz.py b/netforce_clinic/models/hd_case_popup_dlz.py
index 74765c5..a4e9a41 100644
--- a/netforce_clinic/models/hd_case_popup_dlz.py
+++ b/netforce_clinic/models/hd_case_popup_dlz.py
@@ -12,6 +12,7 @@ class HDCasePopupDlz(Model):
"exp_date": fields.Date("Expiry Date"),
"note": fields.Text("Note"),
"membrane_type": fields.Selection([("unsub","Unsub cellul"),("sub","Sub cellul"),("synthetic","Synthetic")],"Membrane Type"),
+ 'drop_old': fields.Boolean("Drop Old Dialyzer"),
}
def __get_hd_case_id(self,context={}):
@@ -45,6 +46,7 @@ class HDCasePopupDlz(Model):
'membrane_type': membrane_type,
'max_use_time': max_use_time,
'product_id': product_id,
+ 'drop_old': True,
}
print('res', res)
return res
@@ -56,6 +58,7 @@ class HDCasePopupDlz(Model):
if hd_case:
context['is_wiz']=True
context['pop_id']=obj.id
+ context['drop_old']=obj.drop_old
res=hd_case.new_dialyzer(context=context)
print('res ', res)
return res
diff --git a/netforce_clinic/models/labor_cost.py b/netforce_clinic/models/labor_cost.py
index 8606871..1a09a25 100644
--- a/netforce_clinic/models/labor_cost.py
+++ b/netforce_clinic/models/labor_cost.py
@@ -140,7 +140,8 @@ class LaborCost(Model):
for line in item.lines:
nurse=line.nurse_id
- level=line.level_id or nurse.level_id
+ #level=line.level_id or nurse.level_id
+ level=nurse.level_id
if not level:
raise Exception("Please specify level %s for %s"%(nurse.name,item.name))
levels[level.id]['total']+=1
@@ -281,7 +282,10 @@ class LaborCost(Model):
# cost's nurses
for line in item.lines:
nurse=line.nurse_id
- level=line.level_id or nurse.level_id
+ #level=line.level_id or nurse.level_id
+ level=nurse.level_id
+ if not level:
+ raise Exception("Please specify level for %s"%nurse.name)
vals=levels.get(level.id)
rate,amt,qty=0.0,0.0,0
level_id=level.id
diff --git a/netforce_clinic/models/patient.py b/netforce_clinic/models/patient.py
index cb1730b..643cf89 100644
--- a/netforce_clinic/models/patient.py
+++ b/netforce_clinic/models/patient.py
@@ -175,7 +175,6 @@ class Patient(Model):
"vascular_acc": fields.Many2One("clinic.vascular.access","Vascular Ac."),
'state': fields.Selection([['admit','Admit'],['dispose','Dispose']],'State'),
'walkin': fields.Selection([['yes','Yes'],['no','No']],"Walkin"),
- #'department_names': fields.Text("Departments",function="_get_department_names"),
'location': fields.Char("Location"), #to filter
'cw_time': fields.DateTime("Cycle Updated"),
'cw_uid': fields.Many2One("base.user"," Cycle Edit"),
@@ -376,6 +375,7 @@ class Patient(Model):
else:
vals['state']='admit'
vals['rm_remain_visit']=False
+ vals['resign_date']=None
ctx={}
if 'active' in vals.keys():
if not vals['active']:
diff --git a/netforce_clinic/models/payment_matching.py b/netforce_clinic/models/payment_matching.py
index 69d10a1..531764d 100644
--- a/netforce_clinic/models/payment_matching.py
+++ b/netforce_clinic/models/payment_matching.py
@@ -301,10 +301,10 @@ class PaymentMatching(Model):
pc=0
if total_invoice:
pc=(total_match_invoice/total_invoice)*100
- if inv_match_ids and obj:
- obj.write({
- 'inv_ids': str(inv_match_ids),
- })
+ #if inv_match_ids and obj:
+ #obj.write({
+ #'inv_ids': str(inv_match_ids),
+ #})
data={
'lines': lines,
'date_from': date_from,
diff --git a/netforce_clinic/models/print_labor_cost.py b/netforce_clinic/models/print_labor_cost.py
index e663afd..14534d0 100644
--- a/netforce_clinic/models/print_labor_cost.py
+++ b/netforce_clinic/models/print_labor_cost.py
@@ -5,14 +5,31 @@ from calendar import monthrange
from netforce.model import Model,fields,get_model
from netforce.database import get_active_db, get_connection
-from netforce.access import get_active_user
+from netforce.access import get_active_user, get_active_company
import netforce.config as config
class PrintLaborCost(Model):
_name="clinic.print.labor.cost"
- _string="Print Report Labor Cost"
-
+ _string="Report Labor Cost"
+
+ def _get_name(self,ids,context={}):
+ res={}
+ for obj in self.browse(ids):
+ year_frm,month_frm,day_frm=obj.date_from.split("-")
+ year_to,month_to,day_to=obj.date_to.split("-")
+ name=''.join([year_frm,month_frm,day_frm,month_to,day_to])
+ if obj.cycle_id:
+ name+=obj.cycle_id.name
+ if obj.branch_id:
+ name+=obj.branch_id.name
+ if obj.department_id:
+ name+=obj.department_id.name
+ name+='-'+obj.staff_type
+ res[obj.id]=name
+ return res
+
_fields={
+ "name": fields.Char("Name",function="_get_name"),
"date": fields.Date("Month"),
"period_id": fields.Many2One("clinic.period.line","Period"),
"date_from": fields.Date("From", required=True),
@@ -31,9 +48,46 @@ class PrintLaborCost(Model):
'ot_report_id': fields.Many2One("clinic.report.labor.cost.overtime","Overtime Report"),
'report_summary': fields.File("Summary"),
'report_labor_cost': fields.File("Labor Cost"),
+ 'state': fields.Selection([['draft','Draft'],['waiting_doc','Waiting Document'],['done','Done']],'State'),
+ 'company_id': fields.Many2One('company','Company'),
+ 'zip_file': fields.File("File"),
}
- def reload(self,ids,context={}):
+ def _get_date_from(self,context={}):
+ year,month,day=time.strftime("%Y-%m-%d").split("-")
+ #return '%s-%s-01'%(year,month)
+ return '%s-%s-%s'%(year,month,day)
+
+ def _get_date_to(self,context={}):
+ year,month,day=time.strftime("%Y-%m-%d").split("-")
+ weekday, total_day=monthrange(int(year), int(month))
+ #return "%s-%s-%s"%(year,month,total_day)
+ return "%s-%s-%s"%(year,month,day)
+
+ def default_get(self,field_names=None,context={},**kw):
+ defaults=context.get("defaults",{})
+ date_from=defaults.get("date_from", self._get_date_from())
+ date_to=defaults.get("date_to", self._get_date_to())
+ print('defaults ', defaults)
+ yearnow=date_from.split("-")[0]
+ for period in get_model('clinic.period').search_browse([['name','=',yearnow]]):
+ for line in period.lines:
+ if line.state=='open':
+ period_id=line.id
+ date_from=line.date_start
+ date_to=line.date_stop
+ break
+ res={
+ 'period_id': period_id,
+ 'date': time.strftime("%Y-%m-%d"),
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'state': 'draft',
+ 'company_id': get_active_company(),
+ }
+ return res
+
+ def reset_data(self,ids,context={}):
obj=self.browse(ids)[0]
context['defaults']={
'date_from': obj.date_from,
@@ -66,32 +120,26 @@ class PrintLaborCost(Model):
})
def do_generate(self,ids,context={}):
- dom=[
- ['model', '=','clinic.print.labor.cost'],
- ['method','=','generate_report'],
- ]
- for cj in get_model('cron.job').search_browse(dom):
- cj.write({
- 'state': 'waiting',
- })
- vals={
- 'to_id': get_active_user(),
- 'subject': 'Generate Report',
- 'body': """
- Please wait until report is generated.
- """,
- }
- get_model("message").create(vals)
- return {
- 'next': {
- 'type': 'reload',
- }
- }
+ self.trigger(ids,"do_gen")
+
+ def wkf_gen_report(self,context={},**kw):
+ print("#"*80)
+ trigger_ids=context.get("trigger_ids")
+ if not trigger_ids:
+ raise Exception("Missing trigger ids")
+ print("trigger_ids",trigger_ids)
+ self.generate_report(trigger_ids,context,**kw)
def generate_report(self,ids,context={}):
+ db=get_connection()
obj=self.browse(ids)[0]
+ obj.write({
+ 'state': 'waiting_doc',
+ 'zip_file': None,
+ })
+ db.commit()
# clear and reload
- obj.reload()
+ obj.reset_data()
def load_report(fname,link):
host=config.config['host']
port=config.config['port']
@@ -100,11 +148,15 @@ class PrintLaborCost(Model):
req=urllib.request.Request(link)
response=urllib.request.urlopen(req)
data=response.read()
- dbname=get_active_db()
- fdir=os.path.join("static","db",dbname,"files")
- open(os.path.join(fdir,fname),"wb").write(data)
+ fpath=os.path.join('/tmp/labor_cost',fname)
+ open(fpath,"wb").write(data)
+
+ dbname=get_active_db()
+ fdir=os.path.join("static","db",dbname,"files")
+ tmp_dir='/tmp/labor_cost'
+ if not os.path.isdir(tmp_dir):
+ os.system("mkdir %s"%(tmp_dir))
- db=get_connection()
sum_id=obj.sum_report_id.id
if not sum_id:
sum_id=get_model('clinic.report.labor.cost.summary').create({
@@ -182,15 +234,14 @@ class PrintLaborCost(Model):
report_lines=[
{'report_file': 'report_detail','model': 'clinic.report.labor.cost.detail', 'report_id': obj.dt_report_id.id,'field_name': 'dt_report_id'},
{'report_file': 'report_sub_detail','model': 'clinic.report.labor.cost.sub.detail', 'report_id': obj.sub_dt_report_id.id,'field_name': 'sub_dt_report_id'},
- #{'report_file': 'report_daily','model': 'clinic.report.labor.cost.daily', 'report_id': obj.dl_report_id.id,'field_name': 'dl_report_id'},
- #{'report_file': 'report_ot','model': 'clinic.report.labor.cost.overtime', 'report_id': obj.ot_report_id.id,'field_name': 'ot_report_id'},
]
for line in obj.lines:
staff=line.staff_id
for report_line in report_lines:
- name=staff.number or staff.name or staff.id
+ name='%s-%s'%(staff.first_name,staff.number)
+ name=name.replace(" ","-")
fname='%s-%s.xlsx'%(name,report_line['report_file'])
- report_file=report_line['report_file']
+ print('fname ---> ', fname)
report_model=report_line['model']
report_template=report_model.replace(".","_").replace("clinic_","")
report_id=report_line['report_id']
@@ -227,52 +278,35 @@ class PrintLaborCost(Model):
db.commit()
link='report_export_xls?model=%s&template=%s&active_id=%s'%(report_model,report_template,report_obj.id)
load_report(fname,link)
- line.write({
- report_file: fname,
- })
db.commit()
- print("Done!")
+
+ os.system("cp -rf %s ."%tmp_dir)
+
+ os.system("cp merge.py labor_cost/")
+ os.system("python labor_cost/merge.py labor_cost %s"%(obj.name))
+ os.system("rm labor_cost/*.py")
+ os.system("rm labor_cost/*.xlsx")
+
+ os.system("mv labor_cost %s"%obj.name)
+ os.system("zip %s.zip %s/*"%(obj.name,obj.name))
+ os.system("mv %s.zip %s/"%(obj.name,fdir))
+ os.system("rm -r %s*"%(obj.name))
+ os.system("rm %s/*"%tmp_dir)
+
+ obj.write({
+ 'zip_file': '%s.zip'%obj.name,
+ 'state': 'done',
+ })
+
vals={
'to_id': get_active_user(),
'subject': 'Generate Report',
'body': """
- Finish to generate report.
+ Generate labor cost report for successfully.
""",
}
get_model("message").create(vals)
db.commit()
-
- def _get_date_from(self,context={}):
- year,month,day=time.strftime("%Y-%m-%d").split("-")
- #return '%s-%s-01'%(year,month)
- return '%s-%s-%s'%(year,month,day)
-
- def _get_date_to(self,context={}):
- year,month,day=time.strftime("%Y-%m-%d").split("-")
- weekday, total_day=monthrange(int(year), int(month))
- #return "%s-%s-%s"%(year,month,total_day)
- return "%s-%s-%s"%(year,month,day)
-
- def default_get(self,field_names=None,context={},**kw):
- defaults=context.get("defaults",{})
- date_from=defaults.get("date_from", self._get_date_from())
- date_to=defaults.get("date_to", self._get_date_to())
- print('defaults ', defaults)
- yearnow=date_from.split("-")[0]
- for period in get_model('clinic.period').search_browse([['name','=',yearnow]]):
- for line in period.lines:
- if line.state=='open':
- period_id=line.id
- date_from=line.date_start
- date_to=line.date_stop
- break
- res={
- 'period_id': period_id,
- 'date': time.strftime("%Y-%m-%d"),
- 'date_from': date_from,
- 'date_to': date_to,
- }
- return res
def onchange_date(self,context={}):
data=context['data']
diff --git a/netforce_clinic/models/report_account_hd_case_summary.py b/netforce_clinic/models/report_account_hd_case_summary.py
index 5ded9b8..58203bd 100644
--- a/netforce_clinic/models/report_account_hd_case_summary.py
+++ b/netforce_clinic/models/report_account_hd_case_summary.py
@@ -216,8 +216,13 @@ class ReportAccountHDCaseSummary(Model):
records[hdcase_id]['misc']+=amt
else:
records[hdcase_id]['misc']+=amt
- lines=[]
+ #print('merge product categ of ivr, fine and dlz to misc')
+ records[hdcase_id]['misc']+=records[hdcase_id]['ivr']
+ records[hdcase_id]['misc']+=records[hdcase_id]['fine']
+ records[hdcase_id]['misc']+=records[hdcase_id]['dlz']
+
+ lines=[]
# nurse would like to see only receipt
del_invoice=False
del_receipt=False
diff --git a/netforce_clinic/models/report_cycle_item.py b/netforce_clinic/models/report_cycle_item.py
index 9d01d74..ce6517f 100644
--- a/netforce_clinic/models/report_cycle_item.py
+++ b/netforce_clinic/models/report_cycle_item.py
@@ -19,6 +19,7 @@ class ReportCycleItem(Model):
"ptype_id": fields.Many2One("clinic.patient.type","Patient Type"),
'branch_id': fields.Many2One("clinic.branch","Branch"),
'department_id': fields.Many2One("clinic.department","Department"),
+ 'sort_by': fields.Selection([['hdcase_number','HDCase Number'],['pname','Patient Name'],['mdc_name','EPO']],'Sort By'),
}
def default_get(self,field_names=None,context={},**kw):
@@ -51,6 +52,7 @@ class ReportCycleItem(Model):
'branch_id': branch_id,
'department_id': department_id,
'ptype_id': ptype_id,
+ 'sort_by': 'mdc_name',
}
print('report.cycle.item.defautls', res)
return res
@@ -67,6 +69,7 @@ class ReportCycleItem(Model):
print('date_from ', date_from)
month=date_from.split("-")[1]
cycle_id=None
+ sort_by='mdc_name'
if ids:
obj=self.browse(ids)[0]
month=obj.date_from.split("-")[1]
@@ -76,6 +79,7 @@ class ReportCycleItem(Model):
department_id=obj.department_id.id
cycle_id=obj.cycle_id.id
ptype_id=obj.ptype_id.id
+ sort_by=obj.sort_by or 'mdc_name'
# new patient of this month
dom=[]
dom.append(['date','>=',date_from])
@@ -98,17 +102,20 @@ class ReportCycleItem(Model):
ptypes={}
for ptype in get_model("clinic.patient.type").search_read([],['name']):
ptypes[ptype['name'] or ""]=0
+ cycle_check={}
for citem in get_model('clinic.cycle.item').search_browse(dom,order="date"):
cycle=citem.cycle_id
date=citem.date
key='%s-%s'%(date,cycle.id)
if key not in cycles.keys():
cycles[key]=[]
+ cycle_check[key]=0
for line in citem.lines:
nurse=line.nurse_id
cycles[key].append({
'name': nurse.name,
'first_name': nurse.first_name or "",
+ 'cycle_item_id': citem.id,
})
for hdcase in citem.hd_cases:
if hdcase.state not in ('paid', 'waiting_payment'):
@@ -120,6 +127,8 @@ class ReportCycleItem(Model):
ptype=patient.type_id
if ptype_id and ptype_id!=ptype.id:
continue
+ key='%s-%s'%(hdcase.date,hdcase.cycle_id.id)
+ cycle_check[key]+=1
ptypes[ptype.name or ""]+=1
doctor=hdcase.doctor_id
cycle=hdcase.cycle_id
@@ -165,7 +174,7 @@ class ReportCycleItem(Model):
'mdc': hdcase.mdc,
'hdcase_number': reformat_number(hdcase.number),
'hdcase_id': hdcase.id,
- 'mdc_name': hdcase.mdc_name or hdcase.epo,
+ 'mdc_name': hdcase.mdc_name or hdcase.epo or '',
'iron_name': hdcase.iron_name or '',
'fee': abs(hdcase.fee),
'dlz_name': hdcase.dlz_name,
@@ -194,6 +203,7 @@ class ReportCycleItem(Model):
branch=get_model("clinic.branch").browse(branch_id)
company_name+=" ("+branch.name+")"
nlines=[]
+ clines=[]
index=0
old=[]
total_fee=0
@@ -221,7 +231,6 @@ class ReportCycleItem(Model):
sub_mdc+=x['mdc'] or 0
if not epos.get(x['mdc_name']):
epos[x['mdc_name']]=0
- #XXX
if not epos.get(x['iron_name']):
epos[x['iron_name']]=0
epos[x['iron_name']]+=x['total_ivr'] or 0 #XXX
@@ -245,12 +254,58 @@ class ReportCycleItem(Model):
key='%s-%s'%(date,cid)
cres=cycles[key]
line['nurse']=''
+ more_lines=[]
if index < len(cres):
line['nurse']=cres[index]['name']
line['nfirst_name']=cres[index]['first_name']
- nlines.append(line)
+ if index+1==cycle_check[key]:
+ for i in range(index+1,len(cres)):
+ more_lines.append({
+ 'nurse': cres[i]['name'],
+ 'nfirst_name': cres[i]['first_name'],
+ 'ctid': cres[i]['cycle_item_id'],
+ })
+ #nlines.append(line)
+ clines.append(line)
+ # if nurse more that cres, should show name of nurses
+ nlines+=more_lines
if no==count:
epo_items=[{'name': k, 'qty': v} for k,v in epos.items() if k ]
+ #sort item
+ clines=sorted(clines,key=lambda cl: cl[sort_by])
+ no=1
+ index=len(nlines)
+ date_txt=''
+ cseq_txt=''
+ nurse_items=[]
+ for cline in clines:
+ if cline.get('nfirst_name'):
+ nurse_items.append({
+ 'nurse': cline.get('nurse'),
+ 'nfirst_name': cline.get('nfirst_name'),
+ 'ctid': cline.get('ctid'),
+ })
+ cline['nurse']=''
+ cline['nfirst_name']=''
+ cline['ctid']=''
+ if cline.get('cseq_txt'):
+ date_txt=cline.get('date_txt')
+ cseq_txt=cline.get('cseq_txt')
+ cline['date_txt']=''
+ cline['cseq_txt']=''
+ cline['no']=no
+ nlines.append(cline)
+ no+=1
+ nlines[index]['date_txt']=date_txt
+ nlines[index]['cseq_txt']=cseq_txt
+ for nurse_item in nurse_items:
+ nlines[index].update({
+ 'nurse': nurse_item['nurse'],
+ 'nfirst_name': nurse_item['nfirst_name'],
+ 'ctid': nurse_item['ctid'],
+ })
+ index+=1
+ clines=[]
nlines.append({
'sub': 'show',
'is_sub': True,
diff --git a/netforce_clinic/models/report_hd_case_detail.py b/netforce_clinic/models/report_hd_case_detail.py
index 692b514..64de81c 100644
--- a/netforce_clinic/models/report_hd_case_detail.py
+++ b/netforce_clinic/models/report_hd_case_detail.py
@@ -201,7 +201,7 @@ class ReportHDCaseDetail(Model):
dom.append(['reg_date','>=',time_start])
dom.append(['reg_date','<=',time_stop])
dom.append(['walkin','=',"no"])
- dom.append(['dispose','=',False])
+ #dom.append(['dispose','=',False])
if branch_id:
dom.append(['branch_id','=',branch_id])
if department_id:
diff --git a/netforce_clinic/models/report_labor_cost.py b/netforce_clinic/models/report_labor_cost.py
index 80f064c..2fe7531 100644
--- a/netforce_clinic/models/report_labor_cost.py
+++ b/netforce_clinic/models/report_labor_cost.py
@@ -41,7 +41,9 @@ class ReportLaborCost(Model):
report_type=defaults.get("report_type","cross")
print('defaults ', defaults)
yearnow=date_from.split("-")[0]
- for period in get_model('clinic.period').search_browse([['name','=',yearnow]]):
+ period_id=None
+ #for period in get_model('clinic.period').search_browse([['name','=',yearnow]]):
+ for period in get_model('clinic.period').search_browse([[]]):
for line in period.lines:
if line.state=='open':
period_id=line.id
diff --git a/netforce_clinic/models/report_labor_cost_summary.py b/netforce_clinic/models/report_labor_cost_summary.py
index 1bcc0d6..971069c 100644
--- a/netforce_clinic/models/report_labor_cost_summary.py
+++ b/netforce_clinic/models/report_labor_cost_summary.py
@@ -134,6 +134,7 @@ class ReportLaborCostSummary(Model):
dpt=citem.department_id
qty=line.qty or 0
total_hdcase+=qty
+ print("total_hdcase ", total_hdcase)
amt=line.amount or 0
staff=line.staff_id
categ_name=''
diff --git a/netforce_clinic/models/report_recent_patient.py b/netforce_clinic/models/report_recent_patient.py
index 23917a6..c423d33 100644
--- a/netforce_clinic/models/report_recent_patient.py
+++ b/netforce_clinic/models/report_recent_patient.py
@@ -72,7 +72,7 @@ class ReportRecentPatient(Model):
dom.append(['reg_date','>=',time_start])
dom.append(['reg_date','<=',time_stop])
dom.append(['walkin','=',"no"])
- dom.append(['dispose','=',False])
+ #dom.append(['dispose','=',False])
if branch_id:
dom.append(['branch_id','=',branch_id])
if department_id:
diff --git a/netforce_clinic/models/sequence.py b/netforce_clinic/models/sequence.py
index cdb61ae..61da104 100644
--- a/netforce_clinic/models/sequence.py
+++ b/netforce_clinic/models/sequence.py
@@ -69,14 +69,16 @@ class Sequence(Model):
user=get_model('base.user').browse(user_id)
dpt=user.department_id
branch=user.branch_id
- if dpt:
+ if context.get('branch_id'):
+ comp_dom=comp_dom+[["branch_id","=",context['branch_id']]]
+ elif dpt:
branch_id=dpt.branch_id.id
comp_dom=comp_dom+[["branch_id","=",branch_id]]
elif branch:
branch_id=branch.id
comp_dom=comp_dom+[["branch_id","=",branch_id]]
- elif context.get('branch_id'):
- comp_dom=comp_dom+[["branch_id","=",context['branch_id']]]
+ #elif context.get('branch_id'):
+ #comp_dom=comp_dom+[["branch_id","=",context['branch_id']]]
print('com_dom ', comp_dom)
res=self.search(comp_dom,order="id")
if res:
diff --git a/netforce_clinic/models/setting.py b/netforce_clinic/models/setting.py
index 907a73f..9a542d0 100644
--- a/netforce_clinic/models/setting.py
+++ b/netforce_clinic/models/setting.py
@@ -64,6 +64,8 @@ class ClinicSetting(Model):
'staff_from_id': fields.Many2One("clinic.staff","Staff From"),
'staff_to_id': fields.Many2One("clinic.staff","Staff To"),
'product_categ_view': fields.Many2Many("product.categ","Product Category View"),
+ 'hdcase_picking_auto': fields.Boolean("HDCase Auto Picking"),
+ 'dlz_picking_auto': fields.Boolean("DLZ Auto Picking"),
}
_defaults={
diff --git a/netforce_clinic/models/visit.py b/netforce_clinic/models/visit.py
index eda35cb..c075edf 100644
--- a/netforce_clinic/models/visit.py
+++ b/netforce_clinic/models/visit.py
@@ -58,7 +58,7 @@ class Visit(Model):
def _get_number(self,context={}):
while 1:
seq_type='clinic_visit'
- seq_id=get_model("sequence").find_sequence(type=seq_type)
+ seq_id=get_model("sequence").find_sequence(type=seq_type,context=context)
if not seq_id:
raise Exception("Can not found sequence %s"%seq_type)
num=get_model("sequence").get_next_number(seq_id,context=context)
@@ -203,10 +203,13 @@ class Visit(Model):
hd_case_id=None
if obj.hd_cases:
hd_case=obj.hd_cases[0]
+ # prevent duplicate staff: del old staff
+ for staff in hd_case.staffs:
+ staff.delete()
hd_case.write(vals)
hd_case_id=hd_case.id
else:
- hd_case_id=hd_case_obj.create(vals)
+ hd_case_id=hd_case_obj.create(vals,context=context)
if context.get("called"): #XXX call outside
return hd_case_id
@@ -476,8 +479,8 @@ class Visit(Model):
'flash': 'Visit\'s %s has been cancelled'%obj.patient_id.name
}
- def create(self, vals,**kw):
- new_id=super().create(vals,**kw)
+ def create(self, vals,context):
+ new_id=super().create(vals,context=context)
self.function_store([new_id])
return new_id
diff --git a/netforce_clinic/models/visit_board.py b/netforce_clinic/models/visit_board.py
index fafea9f..b7f556e 100644
--- a/netforce_clinic/models/visit_board.py
+++ b/netforce_clinic/models/visit_board.py
@@ -86,6 +86,7 @@ class VisitBoard(Model):
defaults=self.default_get(context=context)
department_id=defaults.get("department_id",None)
branch_id=defaults.get("branch_id",None)
+ context['branch_id']=branch_id
state=defaults.get("state",'pending')
if ids:
obj=self.browse(ids)[0]
@@ -96,6 +97,7 @@ class VisitBoard(Model):
doctor_id=obj.doctor_id.id
department_id=obj.department_id.id
branch_id=obj.branch_id.id
+ context['branch_id']=branch_id
state=obj.state
# auto generate visit day to day
def auto_gen_visit(dom=[]):
@@ -147,7 +149,7 @@ class VisitBoard(Model):
'visit_date': date_txt,
'state': 'pending',
}
- visit_id=get_model("clinic.visit").create(vals)
+ visit_id=get_model("clinic.visit").create(vals,context=context)
print('create new visit %s for %s'%(visit_id,pt.name))
time_start='%s 00:00:00'%(date_from)
time_stop='%s 23:59:59'%(date_to)
diff --git a/netforce_clinic/reports/cust_invoice.odt b/netforce_clinic/reports/cust_invoice.odt
index 17429e7..a9036b6 100644
Binary files a/netforce_clinic/reports/cust_invoice.odt and b/netforce_clinic/reports/cust_invoice.odt differ
diff --git a/netforce_clinic/reports/report_labor_cost.xlsx b/netforce_clinic/reports/report_labor_cost.xlsx
index 7afae3d..57c4f2e 100644
Binary files a/netforce_clinic/reports/report_labor_cost.xlsx and b/netforce_clinic/reports/report_labor_cost.xlsx differ
diff --git a/netforce_clinic/reports/report_labor_cost_detail.xlsx b/netforce_clinic/reports/report_labor_cost_detail.xlsx
index d98c749..de92a0f 100644
Binary files a/netforce_clinic/reports/report_labor_cost_detail.xlsx and b/netforce_clinic/reports/report_labor_cost_detail.xlsx differ
diff --git a/netforce_clinic/reports/report_labor_cost_sub_detail.xlsx b/netforce_clinic/reports/report_labor_cost_sub_detail.xlsx
index dd20236..23d3615 100644
Binary files a/netforce_clinic/reports/report_labor_cost_sub_detail.xlsx and b/netforce_clinic/reports/report_labor_cost_sub_detail.xlsx differ
diff --git a/netforce_clinic/reports/report_labor_cost_summary.xlsx b/netforce_clinic/reports/report_labor_cost_summary.xlsx
index 8abc1cb..a5797c0 100644
Binary files a/netforce_clinic/reports/report_labor_cost_summary.xlsx and b/netforce_clinic/reports/report_labor_cost_summary.xlsx differ
diff --git a/netforce_clinic/todo.txt b/netforce_clinic/todo.txt
index aff5c34..5dd8b32 100644
--- a/netforce_clinic/todo.txt
+++ b/netforce_clinic/todo.txt
@@ -1 +1,7 @@
-- move patient to antother location
+redesign print payment & invoice from hdcase
+ - print payment
+ - direct payment
+ - invoice payment
+
+migration:
+ match invoice less than 2015-06-30 to hdcase