payment
parent
d2e0bd55c2
commit
6bdbe444b2
|
@ -6,6 +6,7 @@
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
<field name="duration"/>
|
<field name="duration"/>
|
||||||
<field name="sequence"/>
|
<field name="sequence"/>
|
||||||
|
<field name="color"/>
|
||||||
<related>
|
<related>
|
||||||
<field name="cycle_items"/>
|
<field name="cycle_items"/>
|
||||||
<field name="visits"/>
|
<field name="visits"/>
|
||||||
|
|
|
@ -2,4 +2,5 @@
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
<field name="duration"/>
|
<field name="duration"/>
|
||||||
<field name="sequence"/>
|
<field name="sequence"/>
|
||||||
|
<field name="color"/>
|
||||||
</list>
|
</list>
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
<field name="wednesday" span="4"/>
|
<field name="wednesday" span="4"/>
|
||||||
<field name="thursday" span="4"/>
|
<field name="thursday" span="4"/>
|
||||||
<field name="friday" span="4"/>
|
<field name="friday" span="4"/>
|
||||||
|
<field name="sathurday" span="4"/>
|
||||||
|
<field name="sunday" span="4"/>
|
||||||
<field name="lines" nolabel="1">
|
<field name="lines" nolabel="1">
|
||||||
<list>
|
<list>
|
||||||
<field name="patient_id"/>
|
<field name="patient_id"/>
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<foot replace="1">
|
<foot replace="1">
|
||||||
<button string="Import Data" method="import_sc" type="primary" icon="arrow-right"/>
|
<button string="Import Data" method="import_sc" type="primary" icon="arrow-right"/>
|
||||||
<!--<button string="Match Invoice" method="match_invoice_sc" icon="retweet" type="default"/>-->
|
<!--<button string="Match Invoice" method="match_invoice_sc" icon="retweet" type="default"/>-->
|
||||||
<button string="Pay Invoice" method="post_sc" icon="ok" type="success"/>
|
<button string="Approve" method="approve_sc" icon="ok" type="success"/>
|
||||||
<button string="Clear" method="clear_sc" type="danger" icon="remove"/>
|
<button string="Clear" method="clear_sc" type="danger" icon="remove"/>
|
||||||
</foot>
|
</foot>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -14,6 +14,7 @@ class Cycle(Model):
|
||||||
'visits': fields.One2Many("clinic.visit","cycle_id", "Visits"),
|
'visits': fields.One2Many("clinic.visit","cycle_id", "Visits"),
|
||||||
'cycle_items': fields.One2Many("clinic.cycle.item","cycle_id", "Cycle Items"),
|
'cycle_items': fields.One2Many("clinic.cycle.item","cycle_id", "Cycle Items"),
|
||||||
'var_k': fields.Float("K"),
|
'var_k': fields.Float("K"),
|
||||||
|
'color': fields.Char("Color"),
|
||||||
}
|
}
|
||||||
|
|
||||||
_defaults={
|
_defaults={
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import re
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from netforce.model import Model, fields, get_model
|
from netforce.model import Model, fields, get_model
|
||||||
|
@ -63,6 +64,7 @@ class CycleItem(Model):
|
||||||
}
|
}
|
||||||
|
|
||||||
def compute(self,ids,context={}):
|
def compute(self,ids,context={}):
|
||||||
|
# XXX should compute after hd case done
|
||||||
for obj in self.browse(ids):
|
for obj in self.browse(ids):
|
||||||
vals={
|
vals={
|
||||||
'nurse_lines': [],
|
'nurse_lines': [],
|
||||||
|
@ -138,22 +140,80 @@ class CycleItem(Model):
|
||||||
},
|
},
|
||||||
'flash': 'Compute OK',
|
'flash': 'Compute OK',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def reduce_formular(self,line_strs=None):
|
||||||
|
def get_lines(line_str):
|
||||||
|
return line_strs.replace("\n","").replace(" ","").split(",")
|
||||||
|
line2=[]
|
||||||
|
m='/(\d+)'
|
||||||
|
for line in get_lines(line_strs):
|
||||||
|
res=re.findall(m,line)
|
||||||
|
if res:
|
||||||
|
x1=res[0]
|
||||||
|
line=line.replace("/%s"%x1,"")
|
||||||
|
line=line.replace("(","")
|
||||||
|
line=line.replace(")","")
|
||||||
|
p1='x'
|
||||||
|
res=re.findall(p1,line)
|
||||||
|
if res:
|
||||||
|
line=line.replace("x",'x/%s'%x1)
|
||||||
|
p2='[-,+,*]\d+'
|
||||||
|
res=re.findall(p2,line)
|
||||||
|
if res:
|
||||||
|
for r in res:
|
||||||
|
x2=float(r)/float(x1)
|
||||||
|
x2=x2> 0 and '+%s'%x2 or x2
|
||||||
|
line=line.replace(r,str(x2))
|
||||||
|
if line:
|
||||||
|
line2.append(line)
|
||||||
|
return line2
|
||||||
|
|
||||||
|
def match_value(self,items):
|
||||||
|
for qty, f in items:
|
||||||
|
p1='x'
|
||||||
|
res=re.findall(p1,f)
|
||||||
|
if res:
|
||||||
|
f=f.replace("x",'%sx'%qty)
|
||||||
|
|
||||||
|
p2='([-,+,*])(\d+)'
|
||||||
|
res=re.findall(p2,f)
|
||||||
|
#XXX
|
||||||
|
if res:
|
||||||
|
#print('res ', res)
|
||||||
|
sym=res[0][0]
|
||||||
|
v=res[0][1]
|
||||||
|
sym_v=''.join([sym,str(int(v)*int(qty))])
|
||||||
|
old_v=''.join([sym,str(int(v))])
|
||||||
|
#print('-'*50)
|
||||||
|
#print(f)
|
||||||
|
#print(old_v, " ", sym_v)
|
||||||
|
f=f.replace('%s'%str(old_v),'%s'%str(sym_v))
|
||||||
|
#print(f)
|
||||||
|
#print('-'*50)
|
||||||
|
print(f)
|
||||||
|
|
||||||
def onchange_line(self,context={}):
|
def onchange_line(self,context={}):
|
||||||
data=context['data']
|
data=context['data']
|
||||||
path=context["path"]
|
path=context["path"]
|
||||||
line=get_data_path(data,path,parent=True)
|
line=get_data_path(data,path,parent=True)
|
||||||
|
#pt=data['pt'] or 0.0
|
||||||
|
#k=data['var_k'] or 0.0
|
||||||
|
#x=(pt*k+n2*100+n3*250-n4*25-n5*25+n6*75)/(n1+n2+n3+0.5*(n4+n5+n6))
|
||||||
#qty=line.get("qty")
|
#qty=line.get("qty")
|
||||||
#rate=line.get("rate")
|
#rate=line.get("rate")
|
||||||
total=0.0
|
total=0.0
|
||||||
|
items=[]
|
||||||
|
values=[]
|
||||||
for line in data['nurse_lines']:
|
for line in data['nurse_lines']:
|
||||||
#line['amount']=(line['qty'] or 0) * (line['rate'] or 0.0)
|
|
||||||
formular=line['formular']
|
formular=line['formular']
|
||||||
print(formular)
|
values.append(line['qty'])
|
||||||
|
items.append(formular)
|
||||||
qty=line['qty']
|
qty=line['qty']
|
||||||
rate=line['rate']
|
rate=line['rate']
|
||||||
line['amount']=qty*rate
|
line['amount']=qty*rate
|
||||||
total+=line['amount']
|
total+=line['amount']
|
||||||
|
formulars=self.reduce_formular(','.join(items))
|
||||||
|
res=self.match_value(list(zip(values,formulars)))
|
||||||
data['total']=total
|
data['total']=total
|
||||||
data['total_amount']=data['total_pt']*(data['var_k'] or 0)
|
data['total_amount']=data['total_pt']*(data['var_k'] or 0)
|
||||||
data['total_balance']=data['total_amount']-data['total']
|
data['total_balance']=data['total_amount']-data['total']
|
||||||
|
|
|
@ -27,6 +27,8 @@ class GenVisit(Model):
|
||||||
'wednesday': fields.Boolean("Wednesdays"),
|
'wednesday': fields.Boolean("Wednesdays"),
|
||||||
'thursday': fields.Boolean("Thursdays"),
|
'thursday': fields.Boolean("Thursdays"),
|
||||||
'friday': fields.Boolean("Fridays"),
|
'friday': fields.Boolean("Fridays"),
|
||||||
|
'sathurday': fields.Boolean("Sathurday"),
|
||||||
|
'sunday': fields.Boolean("Sunday"),
|
||||||
'doctor_id': fields.Many2One("clinic.doctor","Doctor"),
|
'doctor_id': fields.Many2One("clinic.doctor","Doctor"),
|
||||||
'nurse_id': fields.Many2One("clinic.nurse","Nurse"),
|
'nurse_id': fields.Many2One("clinic.nurse","Nurse"),
|
||||||
'department_id': fields.Many2One("clinic.department","Department"),
|
'department_id': fields.Many2One("clinic.department","Department"),
|
||||||
|
@ -93,6 +95,8 @@ class GenVisit(Model):
|
||||||
obj.wednesday and 3 or 0,
|
obj.wednesday and 3 or 0,
|
||||||
obj.thursday and 4 or 0,
|
obj.thursday and 4 or 0,
|
||||||
obj.friday and 5 or 0,
|
obj.friday and 5 or 0,
|
||||||
|
obj.sathurday and 6 or 0,
|
||||||
|
obj.sunday and 7 or 0,
|
||||||
]
|
]
|
||||||
days=[day for day in days if day]
|
days=[day for day in days if day]
|
||||||
if not days:
|
if not days:
|
||||||
|
|
|
@ -196,9 +196,6 @@ class ImportPayment(Model):
|
||||||
fname=obj.file
|
fname=obj.file
|
||||||
fpath=get_file_path(fname)
|
fpath=get_file_path(fname)
|
||||||
print("fpath ", fpath)
|
print("fpath ", fpath)
|
||||||
|
|
||||||
def test_sc(self,ids,context={}):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def clear_sc(self,ids,context={}):
|
def clear_sc(self,ids,context={}):
|
||||||
sc_ids=get_model("clinic.data.sc").search([])
|
sc_ids=get_model("clinic.data.sc").search([])
|
||||||
|
@ -218,7 +215,7 @@ class ImportPayment(Model):
|
||||||
'result': 'Match OK',
|
'result': 'Match OK',
|
||||||
})
|
})
|
||||||
|
|
||||||
def post_sc(self,ids,context={}):
|
def approve_sc(self,ids,context={}):
|
||||||
settings=get_model("settings").browse(1)
|
settings=get_model("settings").browse(1)
|
||||||
account_id=settings.ap_sc_id.id
|
account_id=settings.ap_sc_id.id
|
||||||
if not account_id:
|
if not account_id:
|
||||||
|
|
|
@ -17,6 +17,7 @@ class NurseCateg(Model):
|
||||||
"company_id": lambda *a: get_active_company(),
|
"company_id": lambda *a: get_active_company(),
|
||||||
'sequence': 0,
|
'sequence': 0,
|
||||||
'type': 'doctor',
|
'type': 'doctor',
|
||||||
|
'formular': '',
|
||||||
}
|
}
|
||||||
|
|
||||||
_order="sequence"
|
_order="sequence"
|
||||||
|
|
|
@ -1,171 +1,3 @@
|
||||||
====
|
formalar
|
||||||
-todo:
|
tick:
|
||||||
- make script to import hd case
|
find all -> replace -> multiple x
|
||||||
|
|
||||||
---
|
|
||||||
question:
|
|
||||||
- can filter field in related
|
|
||||||
find dialyzer automatic after confirm visit
|
|
||||||
====
|
|
||||||
- import data
|
|
||||||
- payment
|
|
||||||
- NHSO
|
|
||||||
- SSO
|
|
||||||
=====
|
|
||||||
select diaylizer at treatment page -> ok
|
|
||||||
=====
|
|
||||||
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
|
|
||||||
######
|
|
||||||
- import payment
|
|
||||||
- visit planing
|
|
||||||
######
|
|
||||||
========
|
|
||||||
Account Receivable -> invoice
|
|
||||||
find account id
|
|
||||||
1. partner
|
|
||||||
2. product line
|
|
||||||
3. settings
|
|
||||||
Account Payable -> payment
|
|
||||||
|
|
||||||
!!! import data
|
|
||||||
- remove payment
|
|
||||||
set account payable
|
|
||||||
|
|
||||||
issue:
|
|
||||||
date of visit is not copy after click from calendar
|
|
||||||
======
|
|
||||||
!!! this night
|
|
||||||
- import payment
|
|
||||||
setting account
|
|
||||||
- debit
|
|
||||||
- credit
|
|
||||||
patient
|
|
||||||
- type
|
|
||||||
-nhso สปสช
|
|
||||||
- center office of healthcare information
|
|
||||||
- sc ประักนสังคม
|
|
||||||
- mg
|
|
||||||
|
|
||||||
task
|
|
||||||
1. find invoice
|
|
||||||
2. match invoice
|
|
||||||
- date, number for patient (HN)
|
|
||||||
3. if have invoice create payment if not review input data again
|
|
||||||
4. post payment to journal
|
|
||||||
|
|
||||||
===========================
|
|
||||||
- main
|
|
||||||
- create journal entry from file import
|
|
||||||
- detail (if have some time need to approve)
|
|
||||||
- defind state for each step
|
|
||||||
- visit
|
|
||||||
- treatment
|
|
||||||
- dializer
|
|
||||||
- defind flow of each step
|
|
||||||
- patient
|
|
||||||
- new
|
|
||||||
- load default data
|
|
||||||
- one2many
|
|
||||||
- visit
|
|
||||||
-> split date and time ->ok
|
|
||||||
-> state
|
|
||||||
- draft
|
|
||||||
- confirmed
|
|
||||||
- should select dialyzer before treament
|
|
||||||
- buttons -> ok
|
|
||||||
- confirm
|
|
||||||
- state : draft -> waiting treatment
|
|
||||||
- do treatment
|
|
||||||
- state : waiting treatment ->
|
|
||||||
- cancel visit -> ok
|
|
||||||
- print visit -> ok
|
|
||||||
|
|
||||||
- treament
|
|
||||||
- visit planing
|
|
||||||
- find visit of patient which state is close
|
|
||||||
- print invoice
|
|
||||||
- pay for normal person
|
|
||||||
-> how ???
|
|
||||||
- make payment
|
|
||||||
|
|
||||||
- time start/stop -> ok
|
|
||||||
- only time
|
|
||||||
- date treament ->ok
|
|
||||||
- color (check state)
|
|
||||||
- if fail -> red
|
|
||||||
- cancelled
|
|
||||||
- make next appointment -> ok
|
|
||||||
- state
|
|
||||||
- ready to treatment
|
|
||||||
- paid -> no because not realte to accounting
|
|
||||||
- many2one for dializer
|
|
||||||
- list show percent of progress bar
|
|
||||||
- plaining visit !!!
|
|
||||||
- select next day to visit
|
|
||||||
- copy data to visit
|
|
||||||
- after click complete
|
|
||||||
- day [monday, tueday, wedsday, thursday, friday]
|
|
||||||
- time
|
|
||||||
- dialyzer
|
|
||||||
- import payment
|
|
||||||
- import
|
|
||||||
- create payment with invoice that found
|
|
||||||
- post
|
|
||||||
- undo
|
|
||||||
=======
|
|
||||||
|
|
||||||
sequence (support multi company) -> ok
|
|
||||||
- visit
|
|
||||||
- hd case
|
|
||||||
- create invoice after validate ->ok
|
|
||||||
- create stock picking -> no
|
|
||||||
- doctor
|
|
||||||
- nurse
|
|
||||||
- patient
|
|
||||||
create new hd case after confirm visit ->ok
|
|
||||||
question?
|
|
||||||
- how cycle running?
|
|
||||||
- treatment
|
|
||||||
- 1 cycle take how long ?
|
|
||||||
issue:
|
|
||||||
hd case should link only 1 dialyzer -> should not copy 2 time
|
|
||||||
|
|
||||||
create journal entry
|
|
||||||
-> ok
|
|
||||||
|
|
||||||
sunday
|
|
||||||
todo:
|
|
||||||
- need to close all issue:
|
|
||||||
https://docs.google.com/spreadsheets/d/1GDl9vCswHlD1MMfVwRS504keIz9NYL8VhUZlSPDEJvk/edit?usp=drive_web
|
|
||||||
payment
|
|
||||||
- personal
|
|
||||||
- government
|
|
||||||
|
|
||||||
set visible for each staus
|
|
||||||
|
|
||||||
======= import data
|
|
||||||
- flow
|
|
||||||
1. select sheet
|
|
||||||
2. select columns
|
|
||||||
3. load data -> load payment
|
|
||||||
4. review data -> review payment
|
|
||||||
5. import data -> post payment
|
|
||||||
6. done
|
|
||||||
- issue
|
|
||||||
load excel is very slow
|
|
||||||
|
|
Loading…
Reference in New Issue