Merge pull request #1843 from expsa/dev_hamed_attendances
update attendance reports, add wizard for promotion
This commit is contained in:
commit
fa07980992
|
|
@ -3,7 +3,9 @@
|
|||
<data>
|
||||
<template id="employee_attendance_report_template">
|
||||
<div class="page" style="font-size:17pt">
|
||||
<center><h2 style="font-weight:bold">تقرير الحضور و الانصراف للعام </h2></center>
|
||||
<center>
|
||||
<h2 style="font-weight:bold">تقرير الحضور و الانصراف للعام</h2>
|
||||
</center>
|
||||
<br/>
|
||||
<t t-foreach="mykey" t-as="key">
|
||||
|
||||
|
|
@ -40,18 +42,28 @@
|
|||
</template>
|
||||
<template id="absent_attendance_report_template">
|
||||
<div class="page" style="font-size:14pt">
|
||||
<center><h2 style="font-weight:bold">
|
||||
تقرير الغياب
|
||||
<br/>
|
||||
جميع الموظفين- تفصيلي
|
||||
</h2></center>
|
||||
<center>
|
||||
<h2 style="font-weight:bold">
|
||||
تقرير الغياب
|
||||
<br/>
|
||||
جميع الموظفين- تفصيلي
|
||||
</h2>
|
||||
</center>
|
||||
<br/>
|
||||
<table style="width:100%">
|
||||
<tr>
|
||||
<td><h4 style="font-weight:bold"> من تاريخ </h4></td>
|
||||
<td><t t-esc="date_start"/></td>
|
||||
<td><h4 style="font-weight:bold">إلى </h4></td>
|
||||
<td><t t-esc="date_end"/></td>
|
||||
<td>
|
||||
<h4 style="font-weight:bold">من تاريخ</h4>
|
||||
</td>
|
||||
<td>
|
||||
<t t-esc="date_start"/>
|
||||
</td>
|
||||
<td>
|
||||
<h4 style="font-weight:bold">إلى</h4>
|
||||
</td>
|
||||
<td>
|
||||
<t t-esc="date_end"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br/>
|
||||
|
|
@ -60,7 +72,9 @@
|
|||
<table style="width:100%">
|
||||
<tr>
|
||||
<td style="font-weight:bold">الادارة</td>
|
||||
<td style="color:black"><t t-esc="key"/></td>
|
||||
<td style="color:black">
|
||||
<t t-esc="key"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br/>
|
||||
|
|
@ -93,7 +107,9 @@
|
|||
<td style=" border-bottom: 1px solid gray; border-left: 1px solid white;padding: 1px;font-size:0.8em;background-color: white;color: black;width:20%;text-align:center">
|
||||
<t t-esc="line['date']"/>
|
||||
</td>
|
||||
<td style="border-bottom: 1px solid gray; border-left: 1px solid white;color:white;width:15%">.</td>
|
||||
<td style="border-bottom: 1px solid gray; border-left: 1px solid white;color:white;width:15%">
|
||||
.
|
||||
</td>
|
||||
</tr>
|
||||
</t>
|
||||
</tbody>
|
||||
|
|
@ -104,33 +120,47 @@
|
|||
<template id="late_attendance_report_template">
|
||||
<t t-foreach="mykey" t-as="key">
|
||||
<div class="page" style="font-size:12pt" dir="rtl">
|
||||
<center><h2 style="font-weight:bold">تقرير بالحضور والانصراف تفصيلى</h2></center>
|
||||
<center>
|
||||
<h2 style="font-weight:bold">تقرير بالحضور والانصراف تفصيلى</h2>
|
||||
</center>
|
||||
<br/>
|
||||
<table style="width:100%;float:right">
|
||||
<tr style="width:100%;">
|
||||
<td style="font-weight:bold;width:25%;text-align:right"> من تاريخ:</td>
|
||||
<td style="width:25%;text-align:right"><t t-esc="date_start"/></td>
|
||||
<td style="font-weight:bold;width:25%;text-align:right"> الى:</td>
|
||||
<td style="width:25%;text-align:right"><t t-esc="date_end"/></td>
|
||||
<td style="font-weight:bold;width:25%;text-align:right">من تاريخ:</td>
|
||||
<td style="width:25%;text-align:right">
|
||||
<t t-esc="date_start"/>
|
||||
</td>
|
||||
<td style="font-weight:bold;width:25%;text-align:right">الى:</td>
|
||||
<td style="width:25%;text-align:right">
|
||||
<t t-esc="date_end"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr style="width:100%;">
|
||||
<td style="width:25%;font-weight:bold;text-align:right">رقم الموظف </td>
|
||||
<td style="width:25%;color:black;text-align:right"><t t-esc="emp_data[key][0]['emp_no']"/></td>
|
||||
<td style="width:25%;font-weight:bold;text-align:right">المسمى الوظيفى </td>
|
||||
<td style="width:25%;color:black;text-align:right"><t t-esc="emp_data[key][0]['job']"/></td>
|
||||
<td style="width:25%;font-weight:bold;text-align:right">رقم الموظف</td>
|
||||
<td style="width:25%;color:black;text-align:right">
|
||||
<t t-esc="emp_data[key][0]['emp_no']"/>
|
||||
</td>
|
||||
<td style="width:25%;font-weight:bold;text-align:right">المسمى الوظيفى</td>
|
||||
<td style="width:25%;color:black;text-align:right">
|
||||
<t t-esc="emp_data[key][0]['job']"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr style="width:100%;">
|
||||
<td style="width:25%;font-weight:bold;text-align:right"> اسم الموظف </td>
|
||||
<td style="width:25%;color:black;text-align:right"><t t-esc="key"/></td>
|
||||
<td style="width:25%;font-weight:bold;text-align:right">الادارة </td>
|
||||
<td style="width:25%;color:black;text-align:right"><t t-esc="emp_data[key][0]['department']"/></td>
|
||||
<td style="width:25%;font-weight:bold;text-align:right">اسم الموظف</td>
|
||||
<td style="width:25%;color:black;text-align:right">
|
||||
<t t-esc="key"/>
|
||||
</td>
|
||||
<td style="width:25%;font-weight:bold;text-align:right">الادارة</td>
|
||||
<td style="width:25%;color:black;text-align:right">
|
||||
<t t-esc="emp_data[key][0]['department']"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br/>
|
||||
<br/>
|
||||
<table class="table table-condensed" style="width:100%">
|
||||
<thead style="width:100%;">
|
||||
<tr style="width:100%;text-align:center;">
|
||||
<tr style="width:100%;text-align:center;">
|
||||
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:10%;text-align:center;">
|
||||
التاريخ
|
||||
</th>
|
||||
|
|
@ -173,10 +203,10 @@
|
|||
<t t-esc="line['day']"/>
|
||||
</td>
|
||||
<td style="border:1px solid gray;padding: 1px;font-size:0.8em;background-color: white;color: black;width:10%;text-align:center">
|
||||
<t t-esc= "'%02d:%02d' % (int(str(line['sig_in']).split('.')[0]), int(float(str('%.2f' % line['sig_in']).split('.')[1])/100*60))"/>
|
||||
<t t-esc="'%02d:%02d' % (int(str(line['sig_in']).split('.')[0]), int(float(str('%.2f' % line['sig_in']).split('.')[1])/100*60))"/>
|
||||
</td>
|
||||
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: white;color: black;width:10%;text-align:center">
|
||||
<t t-esc= "'%02d:%02d' % (int(str(line['sig_out']).split('.')[0]), int(float(str('%.2f' % line['sig_out']).split('.')[1])/100*60))"/>
|
||||
<t t-esc="'%02d:%02d' % (int(str(line['sig_out']).split('.')[0]), int(float(str('%.2f' % line['sig_out']).split('.')[1])/100*60))"/>
|
||||
</td>
|
||||
<t t-if=" line['lateness'] > 0">
|
||||
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: white;color: red;width:5%;text-align:center">
|
||||
|
|
@ -223,6 +253,26 @@
|
|||
</tr>
|
||||
</t>
|
||||
</tbody>
|
||||
|
||||
<tfoot>
|
||||
<tr style="text-align:center;font-weight:bold;background-color:#d9edf7;">
|
||||
<td colspan="4" style="border: 1px solid gray; padding: 1px; font-size:0.8em;">المجموع
|
||||
</td>
|
||||
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;">
|
||||
<t t-esc="'%02d:%02d' % (int(str(sum(line['lateness'] for line in data[key])).split('.')[0]), int(float(str('%.2f' % sum(line['lateness'] for line in data[key])).split('.')[1])/100*60))"/>
|
||||
</td>
|
||||
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;">
|
||||
<t t-esc="'%02d:%02d' % (int(str(sum(line['early_exit'] for line in data[key])).split('.')[0]), int(float(str('%.2f' % sum(line['early_exit'] for line in data[key])).split('.')[1])/100*60))"/>
|
||||
</td>
|
||||
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;">
|
||||
<t t-esc="'%02d:%02d' % (int(str(sum(line['extra_hours'] for line in data[key])).split('.')[0]), int(float(str('%.2f' % sum(line['extra_hours'] for line in data[key])).split('.')[1])/100*60))"/>
|
||||
</td>
|
||||
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;">
|
||||
<t t-esc="'%02d:%02d' % (int(str(sum(line['office_hours'] for line in data[key])).split('.')[0]), int(float(str('%.2f' % sum(line['office_hours'] for line in data[key])).split('.')[1])/100*60))"/>
|
||||
</td>
|
||||
<td colspan="2" style="border: 1px solid gray;padding: 1px;font-size:0.8em;">--</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
<table class="table table-condensed" style="width:100%">
|
||||
<tr>
|
||||
|
|
@ -230,7 +280,7 @@
|
|||
مجموع التأخير والتقصير
|
||||
</td>
|
||||
<td style=" border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: white;color: black;text-align:center;">
|
||||
<t t-esc="total[key]['total_late_early'].split('.')[0]" />
|
||||
<t t-esc="total[key]['total_late_early'].split('.')[0]"/>
|
||||
|
||||
</td>
|
||||
|
||||
|
|
@ -238,7 +288,7 @@
|
|||
اجمالى ايام الغياب
|
||||
</td>
|
||||
<td style=" border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: white;color: black;text-align:center;">
|
||||
<t t-esc="total[key]['total_absent']" />
|
||||
<t t-esc="total[key]['total_absent']"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
|
@ -248,7 +298,7 @@
|
|||
<td style=" border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: white;color: black;text-align:center;">
|
||||
<t t-esc="total[key]['total_extra_hours'].split('.')[0]"/>
|
||||
</td>
|
||||
<td style=" border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: white;color: black;text-align:center;">
|
||||
<td style=" border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: white;color: black;text-align:center;">
|
||||
اجمالى الاجازات والانتدابات
|
||||
</td>
|
||||
<td style=" border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: white;color: black;text-align:center;">
|
||||
|
|
@ -258,8 +308,12 @@
|
|||
</table>
|
||||
<table style="width:100%;float:center">
|
||||
<tr style="width:100%;">
|
||||
<td style="width:50%;color:black;text-align:center"><t t-esc="print_date"/></td>
|
||||
<td style="width:50%;color:black;text-align:center"><t t-esc="print_user"/></td>
|
||||
<td style="width:50%;color:black;text-align:center">
|
||||
<t t-esc="print_date"/>
|
||||
</td>
|
||||
<td style="width:50%;color:black;text-align:center">
|
||||
<t t-esc="print_user"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -259,6 +259,8 @@ class AttendancesReportXls(models.AbstractModel):
|
|||
sheet.write(row, n + 8, _('Notes'), format2)
|
||||
sheet.write(row, n + 9, _('Shift'), format2)
|
||||
data_row = row + 1
|
||||
total_lateness = total_early_exit = total_extra_hours = total_office_hours = 0.0
|
||||
|
||||
for line in final_dic[key]:
|
||||
|
||||
sheet.merge_range(row - 3, h_col + 1,row - 3,h_col + 2, emp_data[key][0]['emp_no'], format2)
|
||||
|
|
@ -283,17 +285,32 @@ class AttendancesReportXls(models.AbstractModel):
|
|||
|
||||
sheet.write(data_row, n + 8,line['note'], format2)
|
||||
sheet.write(data_row, n + 9, line['calendar_id'], format2)
|
||||
total_lateness += float(line['lateness'])
|
||||
total_early_exit += float(line['early_exit'])
|
||||
total_extra_hours += float(line['extra_hours'])
|
||||
total_office_hours += float(line['office_hours'])
|
||||
data_row += 1
|
||||
sheet.write(data_row+1, n+4, _('Total lateness'), format2)
|
||||
|
||||
sheet.write(data_row + 1, n + 3, _('الاجمالي'), format2)
|
||||
sheet.write(data_row + 1, n + 4, '{0:02.0f}:{1:02.0f}'.format(*divmod(total_lateness * 60, 60)),
|
||||
format2)
|
||||
sheet.write(data_row + 1, n + 5, '{0:02.0f}:{1:02.0f}'.format(*divmod(total_early_exit * 60, 60)),
|
||||
format2)
|
||||
sheet.write(data_row + 1, n + 6, '{0:02.0f}:{1:02.0f}'.format(*divmod(total_extra_hours * 60, 60)),
|
||||
format2)
|
||||
sheet.write(data_row + 1, n + 7, '{0:02.0f}:{1:02.0f}'.format(*divmod(total_office_hours * 60, 60)),
|
||||
format2)
|
||||
|
||||
sheet.write(data_row+3, n+4, _('Total lateness'), format2)
|
||||
# sheet.set_column(data_row,data_row, 15)
|
||||
sheet.write(data_row+1, n + 5, str(total[key]['total_late_early'].split('.')[0]), format2)
|
||||
sheet.write(data_row+1, n + 6, _('Total Absent'), format2)
|
||||
sheet.write(data_row+1, n + 7, str(total[key]['total_absent']), format2)
|
||||
sheet.write(data_row+3, n + 5, str(total[key]['total_late_early'].split('.')[0]), format2)
|
||||
sheet.write(data_row+3, n + 6, _('Total Absent'), format2)
|
||||
sheet.write(data_row+3, n + 7, str(total[key]['total_absent']), format2)
|
||||
size -= 2
|
||||
sheet.write(data_row + 2, n+4, _('Total Extra'), format2)
|
||||
sheet.write(data_row + 2, n + 5, str(total[key]['total_extra_hours'].split('.')[0]), format2)
|
||||
sheet.write(data_row + 2, n + 6, _('Total Leave'), format2)
|
||||
sheet.write(data_row + 2, n + 7, total[key]['total_leave'], format2)
|
||||
sheet.write(data_row + 4, n+4, _('Total Extra'), format2)
|
||||
sheet.write(data_row + 4, n + 5, str(total[key]['total_extra_hours'].split('.')[0]), format2)
|
||||
sheet.write(data_row + 4, n + 6, _('Total Leave'), format2)
|
||||
sheet.write(data_row + 4, n + 7, total[key]['total_leave'], format2)
|
||||
n += 1
|
||||
row += size + 3 + tot_size
|
||||
elif type == 'absent':
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@
|
|||
'views/hr_salary_menus.xml',
|
||||
'wizard/payslip_monthly_report_view.xml',
|
||||
'wizard/payroll_bank_report_view.xml',
|
||||
'wizard/employee_selection_wizard.xml',
|
||||
|
||||
|
||||
# reports templates
|
||||
|
|
|
|||
|
|
@ -39,6 +39,32 @@ class EmployeeReward(models.Model):
|
|||
company_id = fields.Many2one('res.company', string='Company',
|
||||
default=lambda self: self.env.company)
|
||||
|
||||
def action_add_employees(self):
|
||||
self.ensure_one()
|
||||
ctx = dict(self.env.context)
|
||||
if not self.id:
|
||||
ctx.update({
|
||||
'default_reward_vals': {
|
||||
'name': self.name,
|
||||
}
|
||||
})
|
||||
else:
|
||||
ctx['default_employee_reward_id'] = self.id
|
||||
|
||||
if self.percentage:
|
||||
ctx['default_percentage'] = self.percentage
|
||||
|
||||
ctx['default_employee_id'] = self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1)
|
||||
|
||||
return {
|
||||
'name': 'Add Employees to Reward',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'employee.selection.wizard',
|
||||
'type': 'ir.actions.act_window',
|
||||
'target': 'new',
|
||||
'context': ctx,
|
||||
}
|
||||
|
||||
@api.onchange('amount')
|
||||
def chick_amount_positive(self):
|
||||
for item in self:
|
||||
|
|
|
|||
|
|
@ -35,4 +35,5 @@ access_related_salary_amount_officer,related_salary_amount_officer,model_related
|
|||
access_related_salary_amount_emp,related_salary_amount_emp,model_related_salary_amount,base.group_user,1,0,0,0
|
||||
access_payroll_bank_wiz_user,access_payroll_bank_wiz_user,model_payroll_bank_wiz,hr.group_hr_user,1,1,1,0
|
||||
access_payslip_monthly_report_user,access_payslip_monthly_report_user,model_payslip_monthly_report,hr.group_hr_user,1,1,1,0
|
||||
access_employee_selection_wizard_hr_manager,employee.selection.wizard.hr.manager,model_employee_selection_wizard,,1,1,1,1
|
||||
|
||||
|
|
|
|||
|
|
|
@ -30,6 +30,11 @@
|
|||
states="draft,submitted"
|
||||
class="oe_highlight"
|
||||
groups="hr.group_hr_user, hr.group_hr_manager"/>
|
||||
|
||||
<button string="Add Employees" type="object" name="action_add_employees"
|
||||
class="oe_highlight"
|
||||
groups="hr.group_hr_user, hr.group_hr_manager"/>
|
||||
|
||||
<button string="Refuse" type="object" name="action_refuse"
|
||||
states="submitted,hrm"
|
||||
class="oe_highlight"
|
||||
|
|
@ -43,20 +48,21 @@
|
|||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="transfer_type" attrs="{'readonly':[('state','not in',('draft','submitted'))]}" required="1"/>
|
||||
<field name="transfer_type"
|
||||
attrs="{'readonly':[('state','not in',('draft','submitted'))]}" required="1"/>
|
||||
<field name="reward_type" attrs="{'readonly':[('state','!=','draft')]}" required="1"/>
|
||||
<field name="allowance_name" attrs="{'invisible':[('reward_type','!=','allowance')], 'readonly':[('state','not in',('draft','submitted'))],
|
||||
'required': [('reward_type', '=', 'allowance')]}"/>
|
||||
|
||||
|
||||
<field name="account_id" string="Account" attrs="{'invisible':['|',('transfer_type','!=','accounting'),('state', '!=', 'hrm')],
|
||||
<field name="account_id" string="Account" attrs="{'invisible':['|',('transfer_type','!=','accounting'),('state', '!=', 'hrm')],
|
||||
'readonly':[('state','!=','hrm')], 'required': [('transfer_type', '=', 'accounting'),('state', '=', 'hrm')]}"/>
|
||||
<field name="journal_id" string="Journal" attrs="{'invisible':['|',('transfer_type','!=','accounting'),('state', '!=', 'hrm')],
|
||||
<field name="journal_id" string="Journal" attrs="{'invisible':['|',('transfer_type','!=','accounting'),('state', '!=', 'hrm')],
|
||||
'readonly':[('state','!=','hrm')], 'required': [('transfer_type', '=', 'accounting'),('state', '=', 'hrm')]}"/>
|
||||
<field name="benefits_discounts" attrs="{'invisible':[('transfer_type','!=','payroll')], 'readonly':[('state','!=','submitted')],
|
||||
<field name="benefits_discounts" attrs="{'invisible':[('transfer_type','!=','payroll')], 'readonly':[('state','!=','submitted')],
|
||||
'required': [('transfer_type', '=', 'payroll'),('state','=','submitted')]}"/>
|
||||
|
||||
<field name="date_from" attrs="{'invisible':[('transfer_type','!=','payroll')], 'readonly':[('state','!=','submitted')],
|
||||
<field name="date_from" attrs="{'invisible':[('transfer_type','!=','payroll')], 'readonly':[('state','!=','submitted')],
|
||||
'required': [('transfer_type', '=', 'payroll'),('state','=','submitted')]}"/>
|
||||
<field name="date_to" attrs="{'invisible':[('transfer_type','!=','payroll')], 'readonly':[('state','!=','submitted')],
|
||||
'required': [('transfer_type', '=', 'payroll'),('state','=','submitted')]}"/>
|
||||
|
|
@ -68,9 +74,14 @@
|
|||
<field name="amount" required="1"
|
||||
attrs="{'invisible':[('reward_type','!=','amount')], 'readonly':[('state','!=','draft')]}"/>
|
||||
|
||||
<field name="check_appraisal" attrs="{'readonly':[('state','not in',('draft','submitted'))]}" groups="hr.group_hr_user, hr.group_hr_manager"/>
|
||||
<field name="percentage" attrs="{'readonly':[('state','!=','draft')],'invisible':[('check_appraisal','=',True)]}"/>
|
||||
<field name="reward_once" attrs="{'readonly':[('state','not in',('draft','submitted'))]}" groups="hr.group_hr_user, hr.group_hr_manager"/>
|
||||
<field name="check_appraisal"
|
||||
attrs="{'readonly':[('state','not in',('draft','submitted'))]}"
|
||||
groups="hr.group_hr_user, hr.group_hr_manager"/>
|
||||
<field name="percentage"
|
||||
attrs="{'readonly':[('state','!=','draft')],'invisible':[('check_appraisal','=',True)]}"/>
|
||||
<field name="reward_once"
|
||||
attrs="{'readonly':[('state','not in',('draft','submitted'))]}"
|
||||
groups="hr.group_hr_user, hr.group_hr_manager"/>
|
||||
<field name="company_id" groups="base.group_multi_company" readonly="1"/>
|
||||
</group>
|
||||
</group>
|
||||
|
|
@ -79,9 +90,11 @@
|
|||
attrs="{'readonly':['|','|',('state','=','submitted'),('state','=','done'),('state','=','refused')], 'required': [('state', '=', 'hrm')]}">
|
||||
<tree string="Employee Reward and Allowances" editable="bottom">
|
||||
<field name="employee_id"/>
|
||||
<field name="account_id" string="Account" groups="hr_base.group_executive_manager,hr.group_hr_user"
|
||||
attrs="{'readonly':[('reward_state','!=','hrm')],'invisible':[('parent.transfer_type','!=','accounting')]}" />
|
||||
<field name="journal_id" string="Journal" groups="hr_base.group_executive_manager,hr.group_hr_user"
|
||||
<field name="account_id" string="Account"
|
||||
groups="hr_base.group_executive_manager,hr.group_hr_user"
|
||||
attrs="{'readonly':[('reward_state','!=','hrm')],'invisible':[('parent.transfer_type','!=','accounting')]}"/>
|
||||
<field name="journal_id" string="Journal"
|
||||
groups="hr_base.group_executive_manager,hr.group_hr_user"
|
||||
attrs="{'readonly':[('reward_state','!=','hrm')],'invisible':[('parent.transfer_type','!=','accounting')]}"/>
|
||||
<field name="amount" groups="hr_base.group_executive_manager,hr.group_hr_user"/>
|
||||
<field name="percentage"/>
|
||||
|
|
@ -102,7 +115,8 @@
|
|||
<field name="name">Employee Reward and Allowances</field>
|
||||
<field name="model">hr.employee.reward</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree decoration-success="state=='done'" decoration-info="state == 'draft'" string="Employee Reward and Allowances">
|
||||
<tree decoration-success="state=='done'" decoration-info="state == 'draft'"
|
||||
string="Employee Reward and Allowances">
|
||||
<field name="date" widget="date"/>
|
||||
<field name="allowance_reason"/>
|
||||
<field name="reward_type"/>
|
||||
|
|
|
|||
|
|
@ -8,3 +8,4 @@
|
|||
|
||||
from . import payslip_monthly_report
|
||||
from . import payroll_bank_report
|
||||
from . import employee_selection_wizard
|
||||
|
|
|
|||
|
|
@ -0,0 +1,81 @@
|
|||
from odoo import api, fields, models, _
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class EmployeeSelectionWizard(models.TransientModel):
|
||||
_name = 'employee.selection.wizard'
|
||||
_description = 'Employee Selection Wizard'
|
||||
|
||||
|
||||
employee_ids = fields.Many2many(
|
||||
'hr.employee',
|
||||
string='Employees',
|
||||
required=True,
|
||||
)
|
||||
|
||||
employee_reward_id = fields.Many2one(comodel_name='hr.employee.reward',string='Employee_reward_id')
|
||||
|
||||
@api.onchange('employee_ids')
|
||||
def _onchange_employee_ids(self):
|
||||
return {
|
||||
'domain': {
|
||||
'employee_ids': [
|
||||
('id', 'not in', self.employee_ids.ids),
|
||||
('active', '=', True)
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
def _get_active_employee_reward(self):
|
||||
reward_id = self.env.context.get('default_employee_reward_id')
|
||||
if not reward_id and self.env.context.get('active_model') == 'hr.employee.reward':
|
||||
reward_id = self.env.context.get('active_id')
|
||||
return reward_id
|
||||
|
||||
def action_confirm(self):
|
||||
"""
|
||||
Action to add employees to current employee reward record
|
||||
"""
|
||||
self.ensure_one()
|
||||
|
||||
# Get the current reward record or create a new one
|
||||
reward = self.env['hr.employee.reward'].browse(self._get_active_employee_reward())
|
||||
|
||||
if not reward.exists():
|
||||
# Get values from context
|
||||
reward_vals = self.env.context.get('default_reward_vals', {})
|
||||
reward = self.env['hr.employee.reward'].create(reward_vals)
|
||||
|
||||
print('percentage >>>>>>', self.env.context.get('default_reward_vals', {}))
|
||||
|
||||
# Prepare values for reward lines
|
||||
vals_list = [
|
||||
{
|
||||
'employee_id': employee.id,
|
||||
'employee_reward_id': reward.id,
|
||||
}
|
||||
for employee in self.employee_ids
|
||||
]
|
||||
existing_employees = reward.line_ids_reward.mapped('employee_id').ids
|
||||
duplicate_employees = set(self.employee_ids.ids) & set(existing_employees)
|
||||
|
||||
if duplicate_employees:
|
||||
duplicate_names = self.env['hr.employee'].browse(list(duplicate_employees)).mapped('name')
|
||||
raise ValidationError(_(
|
||||
"The following employees are already in reward lines: %s" % ', '.join(duplicate_names)
|
||||
))
|
||||
|
||||
# Create all records in a single operation
|
||||
reward.write({
|
||||
'line_ids_reward': [(0, 0, vals) for vals in vals_list]
|
||||
})
|
||||
for line in reward.line_ids_reward:
|
||||
fields = ['percentage', 'account_id', 'journal_id']
|
||||
default_values = line.sudo().default_get(fields)
|
||||
|
||||
# Apply the default values to the line
|
||||
line.write(default_values)
|
||||
line.sudo().get_percentage_appraisal()
|
||||
line.sudo()._compute_calculate_amount()
|
||||
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="view_employee_selection_wizard_form" model="ir.ui.view">
|
||||
<field name="name">employee.selection.wizard.form</field>
|
||||
<field name="model">employee.selection.wizard</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Select Employees">
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="employee_ids"
|
||||
options="{'no_create': True, 'no_create_edit': True}"/>
|
||||
<field name="employee_reward_id" invisible="1"/>
|
||||
</group>
|
||||
</sheet>
|
||||
<footer>
|
||||
<button name="action_confirm"
|
||||
string="Add"
|
||||
type="object"
|
||||
class="btn-primary"/>
|
||||
<button string="Cancel"
|
||||
class="btn-secondary"
|
||||
special="cancel"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Action to open the wizard -->
|
||||
<record id="action_employee_selection_wizard" model="ir.actions.act_window">
|
||||
<field name="name">Select Employees</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">employee.selection.wizard</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -46,7 +46,17 @@ class HrPayrollRaise(models.Model):
|
|||
|
||||
new_salary = fields.Float(string='New Basic Salary', store=True)
|
||||
|
||||
is_required = fields.Boolean(string='Is Required', compute='_compute_is_required',)
|
||||
|
||||
|
||||
@api.depends('employee_id', 'employee_id.employee_type_id', 'employee_id.employee_type_id.salary_type')
|
||||
def _compute_is_required(self):
|
||||
for rec in self:
|
||||
rec.is_required = False
|
||||
if rec.employee_id and rec.employee_id.employee_type_id and rec.employee_id.employee_type_id.salary_type == 'amount':
|
||||
rec.is_required = True
|
||||
|
||||
|
||||
#@api.onchange('employee_id','percentage_raises')
|
||||
@api.onchange('employee_id','percentage_bonus','percentage_raises')
|
||||
def onchange_employee(self):
|
||||
|
|
|
|||
|
|
@ -50,10 +50,11 @@
|
|||
<field name="last_raises" readonly="1" string="Last Raise"/>
|
||||
</group>
|
||||
<group col="2">
|
||||
<field name="is_required" invisible="1" />
|
||||
<field name="scale_id" required="1" readonly="1" force_save="1"/>
|
||||
<field name="level_id" required="1" readonly="1" force_save="1"/>
|
||||
<field name="group_id" required="1" readonly="1" force_save="1"/>
|
||||
<field name="degree_id" required="1" readonly="1" force_save="1"/>
|
||||
<field name="level_id" attrs="{'required': [('is_required', '!=', False)]}" force_save="1"/>
|
||||
<field name="group_id" attrs="{'required': [('is_required', '!=', False)]}" force_save="1"/>
|
||||
<field name="degree_id" attrs="{'required': [('is_required', '!=', False)]}" force_save="1"/>
|
||||
<field name="last_raise_date" readonly="1" force_save="1"/>
|
||||
|
||||
<field name="current_salary" readonly="1" force_save="1" invisible="0"/>
|
||||
|
|
|
|||
Loading…
Reference in New Issue