improve labor cost report
parent
da37172298
commit
4cda6b2cac
|
@ -9,7 +9,7 @@
|
||||||
<group span="6" columns="1">
|
<group span="6" columns="1">
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<b>Note: </b> For Quick Matching, Please Define Branch.
|
<b>Note: </b> For Quick Matching, Please Enter Branch.
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</group>
|
</group>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from . import clinic_setting
|
from . import clinic_setting
|
||||||
|
from . import hdcase
|
||||||
#from . import remove_conv_bal
|
#from . import remove_conv_bal
|
||||||
#from . import import_acc
|
#from . import import_acc
|
||||||
#from . import update_labor_cost_line
|
#from . import update_labor_cost_line
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from netforce.model import get_model
|
||||||
|
from netforce import migration
|
||||||
|
from netforce.access import set_active_user, get_active_user, set_active_company, get_active_company
|
||||||
|
|
||||||
|
class Migration(migration.Migration):
|
||||||
|
_name="clinic.hd.case"
|
||||||
|
_version="2.11.0"
|
||||||
|
|
||||||
|
def migrate(self):
|
||||||
|
user_id=get_active_user()
|
||||||
|
company_id=get_active_company()
|
||||||
|
set_active_company(1)
|
||||||
|
set_active_user(1)
|
||||||
|
for hdcase in get_model("clinic.hd.case").search_browse([]):
|
||||||
|
note=hdcase.note or ''
|
||||||
|
note='%s '%note
|
||||||
|
vals={
|
||||||
|
'note': note,
|
||||||
|
}
|
||||||
|
hdcase.write(vals)
|
||||||
|
set_active_company(company_id)
|
||||||
|
set_active_user(user_id)
|
||||||
|
return True
|
||||||
|
|
||||||
|
Migration.register()
|
|
@ -64,9 +64,16 @@ class HDCase(Model):
|
||||||
type_code=obj.patient_id.type_id.code
|
type_code=obj.patient_id.type_id.code
|
||||||
if obj.patient_id.type_id.hct_include:
|
if obj.patient_id.type_id.hct_include:
|
||||||
include=True
|
include=True
|
||||||
|
staff_id=None
|
||||||
|
for sline in obj.staffs:
|
||||||
|
staff=sline.staff_id
|
||||||
|
if staff and sline.priop=='personal':
|
||||||
|
staff_id=staff.id
|
||||||
|
break
|
||||||
res[obj.id]={
|
res[obj.id]={
|
||||||
'hct_include': include,
|
'hct_include': include,
|
||||||
'type_code': type_code,
|
'type_code': type_code,
|
||||||
|
'doctor_id2': staff_id,
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
@ -235,6 +242,7 @@ class HDCase(Model):
|
||||||
"hct_msg" : fields.Char("",function="_get_hct_msg",store=True),
|
"hct_msg" : fields.Char("",function="_get_hct_msg",store=True),
|
||||||
'hct_include': fields.Boolean("HCT Include", function="_get_store", function_multi=True,store=True),
|
'hct_include': fields.Boolean("HCT Include", function="_get_store", function_multi=True,store=True),
|
||||||
'type_code': fields.Char("Product Code", function="_get_store", function_multi=True,store=True),
|
'type_code': fields.Char("Product Code", function="_get_store", function_multi=True,store=True),
|
||||||
|
'doctor_id2': fields.Many2One("clinic.staff","Doctor2", function="_get_store", function_multi=True,store=True),
|
||||||
"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),
|
"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),
|
||||||
"staffs": fields.One2Many("clinic.hd.case.staff","hd_case_id","Staffs"),
|
"staffs": fields.One2Many("clinic.hd.case.staff","hd_case_id","Staffs"),
|
||||||
"comments": fields.One2Many("message","related_id","Comments"), "company_id": fields.Many2One("company","Company"),
|
"comments": fields.One2Many("message","related_id","Comments"), "company_id": fields.Many2One("company","Company"),
|
||||||
|
|
|
@ -77,7 +77,7 @@ class MatchingHDCase(Model):
|
||||||
state="all"
|
state="all"
|
||||||
if ids:
|
if ids:
|
||||||
obj=self.browse(ids)[0]
|
obj=self.browse(ids)[0]
|
||||||
state=obj.state
|
state=obj.state or "all"
|
||||||
date_from=obj.date_from
|
date_from=obj.date_from
|
||||||
date_to=obj.date_to
|
date_to=obj.date_to
|
||||||
branch_id=obj.branch_id.id
|
branch_id=obj.branch_id.id
|
||||||
|
@ -319,8 +319,15 @@ class MatchingHDCase(Model):
|
||||||
date=''
|
date=''
|
||||||
if date_from==date_to:
|
if date_from==date_to:
|
||||||
date=date_from
|
date=date_from
|
||||||
|
nlines=[]
|
||||||
|
no=1
|
||||||
|
for line in sorted(lines,key=lambda x: x.get('date')):
|
||||||
|
line['no']=no
|
||||||
|
nlines.append(line)
|
||||||
|
no+=1
|
||||||
data={
|
data={
|
||||||
'lines': sorted(lines,key=lambda x: x.get('date')),
|
'state': state,
|
||||||
|
'lines': nlines,
|
||||||
'date_from': date_from,
|
'date_from': date_from,
|
||||||
'date_to': date_to,
|
'date_to': date_to,
|
||||||
'date': date,
|
'date': date,
|
||||||
|
|
|
@ -21,13 +21,15 @@ class ReportLaborCost(Model):
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_date_from(self,context={}):
|
def _get_date_from(self,context={}):
|
||||||
year,month=time.strftime("%Y-%m").split("-")
|
year,month,day=time.strftime("%Y-%m-%d").split("-")
|
||||||
return '%s-%s-01'%(year,month)
|
#return '%s-%s-01'%(year,month)
|
||||||
|
return '%s-%s-%s'%(year,month,day)
|
||||||
|
|
||||||
def _get_date_to(self,context={}):
|
def _get_date_to(self,context={}):
|
||||||
year,month,day=time.strftime("%Y-%m-%d").split("-")
|
year,month,day=time.strftime("%Y-%m-%d").split("-")
|
||||||
weekday, total_day=monthrange(int(year), int(month))
|
weekday, total_day=monthrange(int(year), int(month))
|
||||||
return "%s-%s-%s"%(year,month,total_day)
|
#return "%s-%s-%s"%(year,month,total_day)
|
||||||
|
return "%s-%s-%s"%(year,month,day)
|
||||||
|
|
||||||
def default_get(self,field_names=None,context={},**kw):
|
def default_get(self,field_names=None,context={},**kw):
|
||||||
defaults=context.get("defaults",{})
|
defaults=context.get("defaults",{})
|
||||||
|
@ -227,10 +229,22 @@ class ReportLaborCost(Model):
|
||||||
brch_id=vals['branch_id']
|
brch_id=vals['branch_id']
|
||||||
walkin_qty=vals['walkin_qty']
|
walkin_qty=vals['walkin_qty']
|
||||||
cost=(walkin_qty+qty)*cost_per_case
|
cost=(walkin_qty+qty)*cost_per_case
|
||||||
|
dom1=[
|
||||||
|
['department_id','=',dpt_id],
|
||||||
|
['branch_id','=',brch_id],
|
||||||
|
['date','>=',date_from],
|
||||||
|
['date','<=',date_to],
|
||||||
|
['state','in',['waiting_payment','paid']],
|
||||||
|
]
|
||||||
|
dom2=dom1+[['doctor_id2.number','=','']]
|
||||||
|
dom3=dom1+[['doctor_id2.number','!=','']]
|
||||||
dlines.append({
|
dlines.append({
|
||||||
'name': dt_name,
|
'name': dt_name,
|
||||||
'qty': qty,
|
'qty': "{0:.2f}".format(round(qty,2)),
|
||||||
'qty2': walkin_qty,
|
'qty2': "{0:.2f}".format(round(walkin_qty,2)),
|
||||||
|
'walkin_qty': walkin_qty,
|
||||||
|
'option_qty': 'mode=list&search_domain=%s&tab_no=0'%replace_quote('%s'%(dom3)),
|
||||||
|
'option_qty2': 'mode=list&search_domain=%s&tab_no=0'%replace_quote('%s'%(dom2)),
|
||||||
'total_qty': walkin_qty+qty,
|
'total_qty': walkin_qty+qty,
|
||||||
'cost': cost,
|
'cost': cost,
|
||||||
'total': 0,
|
'total': 0,
|
||||||
|
@ -250,22 +264,39 @@ class ReportLaborCost(Model):
|
||||||
'branch_id':None,
|
'branch_id':None,
|
||||||
'staff_type': 'doctor',
|
'staff_type': 'doctor',
|
||||||
}]+sorted(dlines,key=lambda x: x['name'])
|
}]+sorted(dlines,key=lambda x: x['name'])
|
||||||
|
dom4=[
|
||||||
|
['date','>=',date_from],
|
||||||
|
['date','<=',date_to],
|
||||||
|
['state','in',['waiting_payment','paid']],
|
||||||
|
['doctor_id2.number','!=',''],
|
||||||
|
]
|
||||||
|
if department_id:
|
||||||
|
dom4.append(['department_id','=',department_id])
|
||||||
|
if branch_id:
|
||||||
|
dom4.append(['branch_id','=',branch_id])
|
||||||
|
dom5=dom4+[['doctor_id2.number','=','']]
|
||||||
dlines.append({
|
dlines.append({
|
||||||
'name': 'รวม',
|
'name': 'รวม',
|
||||||
'qty': 0,
|
'qty': 0,
|
||||||
'qty2': 0,
|
'qty2': 0,
|
||||||
'total_qty':0,
|
'total_qty':0,
|
||||||
'cost': 0,
|
'cost': 0,
|
||||||
|
'walkin_qty': 0,
|
||||||
'staff_type': 'doctor',
|
'staff_type': 'doctor',
|
||||||
'cycle_id': cycle_id,
|
'cycle_id': cycle_id,
|
||||||
'branch_id': branch_id,
|
'branch_id': branch_id,
|
||||||
'department_id': department_id,
|
'department_id': department_id,
|
||||||
|
'option_qty': 'mode=list&search_domain=%s&tab_no=0'%replace_quote('%s'%(dom4)),
|
||||||
|
'option_qty2': 'mode=list&search_domain=%s&tab_no=0'%replace_quote('%s'%(dom5)),
|
||||||
})
|
})
|
||||||
for dline in dlines[1:-1]:
|
for dline in dlines[1:-1]:
|
||||||
dlines[-1]['qty']+=dline['qty'] or 0
|
dlines[-1]['qty']+=float(dline['qty']) or 0
|
||||||
dlines[-1]['qty2']+=dline['qty2'] or 0
|
dlines[-1]['qty2']+=float(dline['qty2']) or 0
|
||||||
dlines[-1]['total_qty']+=dline['total_qty'] or 0
|
dlines[-1]['total_qty']+=dline['total_qty'] or 0
|
||||||
dlines[-1]['cost']+=dline['cost'] or 0
|
dlines[-1]['cost']+=dline['cost'] or 0
|
||||||
|
dlines[-1]['walkin_qty']+=float(dline['qty2']) or 0
|
||||||
|
dlines[-1]['qty']="{0:.2f}".format(round(dlines[-1]['qty'],2)) #total
|
||||||
|
dlines[-1]['qty2']="{0:.2f}".format(round(dlines[-1]['qty2'],2)) #total
|
||||||
|
|
||||||
nlines.append({
|
nlines.append({
|
||||||
'name': 'พยาบาล',
|
'name': 'พยาบาล',
|
||||||
|
|
|
@ -161,20 +161,6 @@ class ClinicSetting(Model):
|
||||||
if user_id !=1:
|
if user_id !=1:
|
||||||
print("Only admin!!")
|
print("Only admin!!")
|
||||||
return
|
return
|
||||||
pts=set()
|
|
||||||
for vst in get_model("clinic.visit").search_browse([['doctor_id','=',None],['patient_id.dispose','=',False]]):
|
|
||||||
pt=vst.patient_id
|
|
||||||
dt=vst.doctor_id
|
|
||||||
if not dt and pt.doctor_id:
|
|
||||||
vst.write({
|
|
||||||
'doctor_id': pt.doctor_id.id,
|
|
||||||
})
|
|
||||||
pts.update({pt.name})
|
|
||||||
print('-'*50)
|
|
||||||
for pt in pts:
|
|
||||||
print(pt)
|
|
||||||
print('-'*50)
|
|
||||||
|
|
||||||
#obj=self.browse(ids)[0]
|
#obj=self.browse(ids)[0]
|
||||||
#obj.del_duplicate_staff()
|
#obj.del_duplicate_staff()
|
||||||
#obj.merge_staff()
|
#obj.merge_staff()
|
||||||
|
|
|
@ -11,6 +11,27 @@
|
||||||
<span class="label label-default">Not Match: {{total_unmatch}}</span>
|
<span class="label label-default">Not Match: {{total_unmatch}}</span>
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
<!--
|
||||||
|
{{#ifeq state "all"}}
|
||||||
|
<tr>
|
||||||
|
<th colspan="15" style="text-align:center">
|
||||||
|
<span class="label label-primary">Total: {{total}}</span>
|
||||||
|
<span class="label label-success">Match: {{total_match}}</span>
|
||||||
|
<span class="label label-default">Not Match: {{total_unmatch}}</span>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
{{else}}
|
||||||
|
<tr>
|
||||||
|
<th colspan="15" style="text-align:center">
|
||||||
|
{{#ifeq state "not_match"}}
|
||||||
|
<span class="label label-default">Total: {{total_unmatch}}</span>
|
||||||
|
{{else}}
|
||||||
|
<span class="label label-success">Total: {{total_match}}</span>
|
||||||
|
{{/ifeq}}
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
{{/ifeq}}
|
||||||
|
-->
|
||||||
<tr>
|
<tr>
|
||||||
<th colspan="10" style="text-align:center;background-color:#f9e37d;">Import File</th>
|
<th colspan="10" style="text-align:center;background-color:#f9e37d;">Import File</th>
|
||||||
<th colspan="5" style="text-align:center;background-color:#2d6ed2;color:white">Netforce</th>
|
<th colspan="5" style="text-align:center;background-color:#2d6ed2;color:white">Netforce</th>
|
||||||
|
@ -76,7 +97,7 @@
|
||||||
</table>
|
</table>
|
||||||
{{#if message}}
|
{{#if message}}
|
||||||
<strong>
|
<strong>
|
||||||
File Math Only:
|
Day Required:
|
||||||
<span style="color:red">
|
<span style="color:red">
|
||||||
{{message}}
|
{{message}}
|
||||||
</strong>
|
</strong>
|
||||||
|
|
|
@ -71,7 +71,9 @@
|
||||||
{{#if desc}}
|
{{#if desc}}
|
||||||
<th style="text-align:left;width:10%">{{qty}}</th>
|
<th style="text-align:left;width:10%">{{qty}}</th>
|
||||||
{{else}}
|
{{else}}
|
||||||
<td style="text-align:right">{{currency qty}}</td>
|
<td style="text-align:right">
|
||||||
|
{{view "link" string=qty action="clinic_hd_case" action_options=option_qty}}
|
||||||
|
</td>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -80,7 +82,13 @@
|
||||||
{{#if desc}}
|
{{#if desc}}
|
||||||
<th style="text-align:left;width:10%">{{qty2}}</th>
|
<th style="text-align:left;width:10%">{{qty2}}</th>
|
||||||
{{else}}
|
{{else}}
|
||||||
<td style="text-align:right">{{currency qty2}}</td>
|
<td style="text-align:right">
|
||||||
|
{{#if walkin_qty}}
|
||||||
|
{{view "link" string=qty2 action="clinic_hd_case" action_options=option_qty2}}
|
||||||
|
{{else}}
|
||||||
|
0.00
|
||||||
|
{{/if}}
|
||||||
|
</td>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</tr>
|
</tr>
|
||||||
|
|
Loading…
Reference in New Issue