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