matching payment
parent
7afa9d7840
commit
2e99a673eb
|
@ -5,7 +5,6 @@
|
||||||
<item string="Account Patient" action="clinic_setting_account_patient"/>
|
<item string="Account Patient" action="clinic_setting_account_patient"/>
|
||||||
<item string="HD Case Expense" action="clinic_report_account_hd_case_summary"/>
|
<item string="HD Case Expense" action="clinic_report_account_hd_case_summary"/>
|
||||||
<item string="RD Shop Expense" action="clinic_report_account_shop"/>
|
<item string="RD Shop Expense" action="clinic_report_account_shop"/>
|
||||||
<item string="HD Cases Matching" action="clinic_matching_hdcase_acc"/>
|
|
||||||
<item string="Payment Matching" action="clinic_matching_payment"/>
|
<item string="Payment Matching" action="clinic_matching_payment"/>
|
||||||
<item string="Payment Invoices" action="clinic_invoice_payment"/>
|
<item string="Payment Invoices" action="clinic_invoice_payment"/>
|
||||||
<divider/>
|
<divider/>
|
||||||
|
@ -20,6 +19,7 @@
|
||||||
</item>
|
</item>
|
||||||
<item string="Matching">
|
<item string="Matching">
|
||||||
<item string="Payment Matching" action="clinic_payment_matching"/>
|
<item string="Payment Matching" action="clinic_payment_matching"/>
|
||||||
|
<item string="HD Cases Matching" action="clinic_matching_hdcase_acc"/>
|
||||||
</item>
|
</item>
|
||||||
</item>
|
</item>
|
||||||
<item string="Financial Settings" position="after">
|
<item string="Financial Settings" position="after">
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
<list>
|
<list>
|
||||||
<field name="hdcase_date"/>
|
<field name="hdcase_date"/>
|
||||||
<field name="use_time"/>
|
<field name="use_time"/>
|
||||||
|
<field name="nurse_id"/>
|
||||||
</list>
|
</list>
|
||||||
<form>
|
<form>
|
||||||
<field name="hd_case_id"/>
|
<field name="hd_case_id"/>
|
||||||
|
|
|
@ -29,7 +29,7 @@ class Dialyzer(Model):
|
||||||
"visit_id": fields.Many2One("clinic.visit","Visit",search=True),
|
"visit_id": fields.Many2One("clinic.visit","Visit",search=True),
|
||||||
"hd_case_id": fields.Many2One("clinic.hd.case","HD Case",search=True),
|
"hd_case_id": fields.Many2One("clinic.hd.case","HD Case",search=True),
|
||||||
"hd_cases": fields.One2Many("clinic.hd.case","dlz_id","HD Case"), #TODO funtion to get hd case
|
"hd_cases": fields.One2Many("clinic.hd.case","dlz_id","HD Case"), #TODO funtion to get hd case
|
||||||
"hd_cases_dlz": fields.One2Many("clinic.hd.case.dialyzer","dialyzer_id","Dialyzer History"),
|
"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),
|
'department_id': fields.Many2One("clinic.department","Department",search=True),
|
||||||
"membrane_type": fields.Selection([("unsub","Unsub cellul"),("sub","Sub cellul"),("synthetic","Synthetic")],"Membrane Type"),
|
"membrane_type": fields.Selection([("unsub","Unsub cellul"),("sub","Sub cellul"),("synthetic","Synthetic")],"Membrane Type"),
|
||||||
}
|
}
|
||||||
|
|
|
@ -894,9 +894,14 @@ class HDCase(Model):
|
||||||
obj=self.browse(ids)[0]
|
obj=self.browse(ids)[0]
|
||||||
# TODO pop to note
|
# TODO pop to note
|
||||||
obj.write({"state":"cancelled"})
|
obj.write({"state":"cancelled"})
|
||||||
|
|
||||||
|
#FIXME should use history to get the last time time and it should drop automatical
|
||||||
def update_usetime(self,ids,context={}):
|
def update_usetime(self,ids,context={}):
|
||||||
|
datenow=time.strftime("%Y-%m-%d")
|
||||||
for obj in self.browse(ids):
|
for obj in self.browse(ids):
|
||||||
|
# in case to draft
|
||||||
|
if obj.date < datenow:
|
||||||
|
continue
|
||||||
is_decrease=context.get('is_decrease')
|
is_decrease=context.get('is_decrease')
|
||||||
for dlz_line in obj.dialyzers:
|
for dlz_line in obj.dialyzers:
|
||||||
dlz=dlz_line.dialyzer_id
|
dlz=dlz_line.dialyzer_id
|
||||||
|
@ -1050,6 +1055,7 @@ class HDCase(Model):
|
||||||
def undo(self,ids,context={}):
|
def undo(self,ids,context={}):
|
||||||
obj=self.browse(ids)[0]
|
obj=self.browse(ids)[0]
|
||||||
context['is_decrease']=True
|
context['is_decrease']=True
|
||||||
|
# in case to draft
|
||||||
obj.update_usetime(context=context)
|
obj.update_usetime(context=context)
|
||||||
for line in obj.lines:
|
for line in obj.lines:
|
||||||
line.write({
|
line.write({
|
||||||
|
|
|
@ -6,9 +6,11 @@ class HDCaseDialyzerLine(Model):
|
||||||
def _get_all(self,ids,context={}):
|
def _get_all(self,ids,context={}):
|
||||||
res={}
|
res={}
|
||||||
for obj in self.browse(ids):
|
for obj in self.browse(ids):
|
||||||
hdcase_date=obj.hd_case_id.date
|
hdcase=obj.hd_case_id
|
||||||
res[obj.id]={
|
res[obj.id]={
|
||||||
'hdcase_date': hdcase_date,
|
'hdcase_date': hdcase.date,
|
||||||
|
'hdcase_state': hdcase.state,
|
||||||
|
'nurse_id': hdcase.nurse_id.id,
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
@ -21,6 +23,8 @@ class HDCaseDialyzerLine(Model):
|
||||||
"max_use_time":fields.Integer("Max use time"),
|
"max_use_time":fields.Integer("Max use time"),
|
||||||
"membrane_type": fields.Selection([("unsub","Unsub cellul"),("sub","Sub cellul"),("synthetic","Synthetic")],"Membrane Type"),
|
"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_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),
|
||||||
}
|
}
|
||||||
|
|
||||||
_order="hd_case_id.date desc"
|
_order="hd_case_id.date desc"
|
||||||
|
|
|
@ -11,7 +11,6 @@ class PaymentMatching(Model):
|
||||||
_string="Payment Matching"
|
_string="Payment Matching"
|
||||||
_transient=True
|
_transient=True
|
||||||
|
|
||||||
|
|
||||||
_fields={
|
_fields={
|
||||||
'name': fields.Char("Name"),
|
'name': fields.Char("Name"),
|
||||||
"date": fields.Date("Month"),
|
"date": fields.Date("Month"),
|
||||||
|
@ -26,6 +25,7 @@ class PaymentMatching(Model):
|
||||||
'patient_type_id': fields.Many2One("clinic.patient.type","Patient Type",required=True),
|
'patient_type_id': fields.Many2One("clinic.patient.type","Patient Type",required=True),
|
||||||
'pcode': fields.Char("Code",required=True),
|
'pcode': fields.Char("Code",required=True),
|
||||||
'hcode_id': fields.Many2One("clinic.hospital","HCode"),
|
'hcode_id': fields.Many2One("clinic.hospital","HCode"),
|
||||||
|
'inv_ids': fields.Text("Invoice ids"),
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_date_from(self,context={}):
|
def _get_date_from(self,context={}):
|
||||||
|
@ -49,18 +49,25 @@ class PaymentMatching(Model):
|
||||||
date_from=line.date_start
|
date_from=line.date_start
|
||||||
date_to=line.date_stop
|
date_to=line.date_stop
|
||||||
break
|
break
|
||||||
tids=get_model('clinic.patient.type').search([['default','=',True]])
|
|
||||||
patient_type_id=None
|
patient_type_id=None
|
||||||
if tids:
|
pcode='SSO'
|
||||||
patient_type_id=tids[0]
|
for ptype in get_model('clinic.patient.type').search_read([['default','=',True]],['code']):
|
||||||
|
pcode=ptype['code']
|
||||||
|
patient_type_id=ptype['id']
|
||||||
|
hdcode_id=None
|
||||||
|
for hid in get_model("clinic.hospital").search([]):
|
||||||
|
hdcode_id=hid
|
||||||
|
break
|
||||||
res={
|
res={
|
||||||
'period_id': period_id,
|
'period_id': period_id,
|
||||||
'date': time.strftime("%Y-%m-%d"),
|
'date': time.strftime("%Y-%m-%d"),
|
||||||
'date_from': date_from,
|
'date_from': date_from,
|
||||||
'date_to': date_to,
|
'date_to': date_to,
|
||||||
'inv_state': 'waiting_payment',
|
#'inv_state': 'waiting_payment',
|
||||||
'view_type': 'invoice',
|
'view_type': 'invoice',
|
||||||
'patient_type_id': patient_type_id,
|
'patient_type_id': patient_type_id,
|
||||||
|
'pcode': pcode,
|
||||||
|
'hcode_id': hdcode_id,
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
@ -121,6 +128,7 @@ class PaymentMatching(Model):
|
||||||
inv_state=defaults.get('inv_state')
|
inv_state=defaults.get('inv_state')
|
||||||
view_type=defaults.get('view_type')
|
view_type=defaults.get('view_type')
|
||||||
pcode=''
|
pcode=''
|
||||||
|
obj=None
|
||||||
if ids:
|
if ids:
|
||||||
obj=self.browse(ids)[0]
|
obj=self.browse(ids)[0]
|
||||||
date_from=obj.date_from
|
date_from=obj.date_from
|
||||||
|
@ -143,13 +151,15 @@ class PaymentMatching(Model):
|
||||||
dom=[
|
dom=[
|
||||||
['date','>=',date_from],
|
['date','>=',date_from],
|
||||||
['date','<=',date_to],
|
['date','<=',date_to],
|
||||||
['state','=',inv_state],
|
|
||||||
]
|
]
|
||||||
|
if inv_state:
|
||||||
|
dom.append(['state','=',inv_state])
|
||||||
if branch_id and not department_id:
|
if branch_id and not department_id:
|
||||||
dom.append(['department_id.branch_id','=',branch_id])
|
dom.append(['department_id.branch_id','=',branch_id])
|
||||||
elif department_id:
|
elif department_id:
|
||||||
dom.append(['department_id','=',department_id])
|
dom.append(['department_id','=',department_id])
|
||||||
field_names=['date','number','amount_due','patient_id']
|
print('dom ', dom)
|
||||||
|
field_names=['date','number','amount_total','amount_due','patient_id','state']
|
||||||
for inv in get_model('account.invoice').search_read(dom,field_names):
|
for inv in get_model('account.invoice').search_read(dom,field_names):
|
||||||
vals={
|
vals={
|
||||||
'id': inv['id'],
|
'id': inv['id'],
|
||||||
|
@ -170,6 +180,7 @@ class PaymentMatching(Model):
|
||||||
vals[field_name]=inv[field_name]
|
vals[field_name]=inv[field_name]
|
||||||
invoices.append(vals)
|
invoices.append(vals)
|
||||||
return invoices
|
return invoices
|
||||||
|
inv_match_ids=[]
|
||||||
if view_type=='invoice':
|
if view_type=='invoice':
|
||||||
lines=get_invoices()
|
lines=get_invoices()
|
||||||
total_invoice=len(lines)
|
total_invoice=len(lines)
|
||||||
|
@ -214,12 +225,16 @@ class PaymentMatching(Model):
|
||||||
if inv['patient_id']:
|
if inv['patient_id']:
|
||||||
# check card no first then HN finally patient name
|
# check card no first then HN finally patient name
|
||||||
if pid==inv['patient_cid'] or hn==inv['patient_hn'] or name_nospace==inv['patient_nospace_name']:
|
if pid==inv['patient_cid'] or hn==inv['patient_hn'] or name_nospace==inv['patient_nospace_name']:
|
||||||
inv_amt=inv['amount_due']
|
#inv_amt=inv['amount_due']
|
||||||
|
inv_amt=inv['amount_total']
|
||||||
inv_date=inv['date']
|
inv_date=inv['date']
|
||||||
if inv_date==date and inv_amt==line_vals[item_amt]:
|
if inv_date==date and inv_amt==line_vals[item_amt]:
|
||||||
line_vals['inv_%s'%(item_amt)]=inv['number']
|
line_vals['inv_%s'%(item_amt)]=inv['number']
|
||||||
line_vals['inv_%s_id'%(item_amt)]=inv['id']
|
line_vals['inv_%s_id'%(item_amt)]=inv['id']
|
||||||
total_match_invoice+=1
|
line_vals['inv_%s_state'%(item_amt)]=inv['state']
|
||||||
|
if inv['state']=='waiting_payment':
|
||||||
|
inv_match_ids.append(inv['id'])
|
||||||
|
total_match_invoice+=1
|
||||||
break
|
break
|
||||||
lines.append(line_vals)
|
lines.append(line_vals)
|
||||||
no+=1
|
no+=1
|
||||||
|
@ -267,6 +282,7 @@ class PaymentMatching(Model):
|
||||||
'epo': 0,
|
'epo': 0,
|
||||||
'inv_id': None,
|
'inv_id': None,
|
||||||
'inv_number': '',
|
'inv_number': '',
|
||||||
|
'inv_state': '',
|
||||||
'no': no,
|
'no': no,
|
||||||
}
|
}
|
||||||
for inv in invoices:
|
for inv in invoices:
|
||||||
|
@ -275,13 +291,20 @@ class PaymentMatching(Model):
|
||||||
if date==inv['date'] and fee==inv['amount_due']:
|
if date==inv['date'] and fee==inv['amount_due']:
|
||||||
vals['inv_id']=inv['id']
|
vals['inv_id']=inv['id']
|
||||||
vals['inv_number']=inv['number']
|
vals['inv_number']=inv['number']
|
||||||
total_match_invoice+=1
|
vals['inv_state']=inv['state']
|
||||||
|
if inv['state']=='waiting_payment':
|
||||||
|
inv_match_ids.append(inv['id'])
|
||||||
|
total_match_invoice+=1
|
||||||
break
|
break
|
||||||
lines.append(vals)
|
lines.append(vals)
|
||||||
no+=1
|
no+=1
|
||||||
pc=0
|
pc=0
|
||||||
if total_invoice:
|
if total_invoice:
|
||||||
pc=(total_match_invoice/total_invoice)*100
|
pc=(total_match_invoice/total_invoice)*100
|
||||||
|
if inv_match_ids and obj:
|
||||||
|
obj.write({
|
||||||
|
'inv_ids': str(inv_match_ids),
|
||||||
|
})
|
||||||
data={
|
data={
|
||||||
'lines': lines,
|
'lines': lines,
|
||||||
'date_from': date_from,
|
'date_from': date_from,
|
||||||
|
@ -292,7 +315,8 @@ class PaymentMatching(Model):
|
||||||
'total_srv': total_srv,
|
'total_srv': total_srv,
|
||||||
'total_invoice': total_invoice,
|
'total_invoice': total_invoice,
|
||||||
'total_match_invoice': total_match_invoice,
|
'total_match_invoice': total_match_invoice,
|
||||||
'total_match_invoice_in_pc': pc,
|
'pc_match': pc,
|
||||||
|
'pc_unmatch': 100-pc,
|
||||||
'total_unmatch_invoice': total_invoice-total_match_invoice,
|
'total_unmatch_invoice': total_invoice-total_match_invoice,
|
||||||
'total_amount': total_amount,
|
'total_amount': total_amount,
|
||||||
'view_type': view_type,
|
'view_type': view_type,
|
||||||
|
|
|
@ -1,17 +1,31 @@
|
||||||
<div class="row" style="margin-top:10px;">
|
<div class="row" style="margin-top:10px;">
|
||||||
|
<div class="progress">
|
||||||
|
<div class="progress-bar progress-bar-success" role="progressbar" style="width:{{currency pc_match}}%">
|
||||||
|
{{currency pc_match}}% Match (success)
|
||||||
|
</div>
|
||||||
|
<div class="progress-bar progress-bar-danger" role="progressbar" style="width:{{currency pc_unmatch}}%">
|
||||||
|
{{currency pc_unmatch}}% Un Match (fail)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
<table class="table table-bordered">
|
<table class="table table-bordered">
|
||||||
<thead>
|
<thead>
|
||||||
<th style="text-align:center">Total Item</th>
|
<th style="text-align:center;width:25%">Total Item Waiting To Matching</th>
|
||||||
<th style="text-align:center">Total Invoice</th>
|
<th style="text-align:center;width:25%">Total Invoice</th>
|
||||||
<th style="text-align:center">Match</th>
|
<th style="text-align:center;width:25%">Match</th>
|
||||||
<th style="text-align:center">Un Match</th>
|
<th style="text-align:center;width:25%">Un Match</th>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="text-align:center">{{currency total_item}}</td>
|
<td style="text-align:center">{{currency total_item}}</td>
|
||||||
<td style="text-align:center">{{currency total_invoice}}</td>
|
<td style="text-align:center">{{currency total_invoice}}</td>
|
||||||
<td style="text-align:center">{{currency total_match_invoice}}</td>
|
<td style="text-align:center">
|
||||||
<td style="text-align:center">{{currency total_unmatch_invoice}}</td>
|
{{currency total_match_invoice}}
|
||||||
|
</td>
|
||||||
|
<td style="text-align:center">
|
||||||
|
{{currency total_unmatch_invoice}}
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@ -65,7 +79,11 @@
|
||||||
<td>
|
<td>
|
||||||
<a style="text-decoration:None" href="ui#form_view_xml=cust_invoice_form&active_id={{inv_fee_id}}&name=cust_invoice&mode=form" target="_blank">
|
<a style="text-decoration:None" href="ui#form_view_xml=cust_invoice_form&active_id={{inv_fee_id}}&name=cust_invoice&mode=form" target="_blank">
|
||||||
{{#if inv_fee_id}}
|
{{#if inv_fee_id}}
|
||||||
<span class="label label-info">
|
{{#ifeq inv_fee_state "paid"}}
|
||||||
|
<span class="label label-success">
|
||||||
|
{{else}}
|
||||||
|
<span class="label label-info">
|
||||||
|
{{/ifeq}}
|
||||||
{{inv_fee}}
|
{{inv_fee}}
|
||||||
</span>
|
</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
Loading…
Reference in New Issue