20 changed files with 946 additions and 0 deletions
@ -0,0 +1,17 @@ |
|||
OH Reward/Warning |
|||
--------------------- |
|||
Supporting Addon for Open HRMS, Managing Official Announcements |
|||
|
|||
Connect with experts |
|||
-------------------- |
|||
|
|||
If you have any question/queries/additional works on OpenHRMS or this module, You can drop an email directly to Cybrosys. |
|||
|
|||
Contacts |
|||
-------- |
|||
info - info@cybrosys.com |
|||
Jesni Banu - jesni@cybrosys.in |
|||
|
|||
Website: |
|||
https://www.openhrms.com |
|||
https://www.cybrosys.com |
@ -0,0 +1,6 @@ |
|||
## Module <hr_reward_warning> |
|||
|
|||
#### 30.03.2018 |
|||
#### Version 10.0.1.0.0 |
|||
##### ADD |
|||
- Initial commit for OpenHrms Project |
@ -0,0 +1,26 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# A part of OpenHRMS Project <https://www.openhrms.com> |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
|||
# Author: Jesni Banu (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
from . import models |
|||
|
|||
|
|||
|
@ -0,0 +1,47 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# A part of OpenHRMS Project <https://www.openhrms.com> |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
|||
# Author: Jesni Banu (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
{ |
|||
'name': 'OHRMS Official Announcements', |
|||
'version': '10.0.1.0.0', |
|||
'summary': """Managing Official Announcements""", |
|||
'description': 'This module helps you to manage hr official announcements', |
|||
'category': 'Generic Modules/Human Resources', |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'website': "https://www.openhrms.com", |
|||
'depends': ['base', 'hr_payroll'], |
|||
'data': [ |
|||
'security/ir.model.access.csv', |
|||
'security/reward_security.xml', |
|||
'views/hr_reward_warning_view.xml', |
|||
'views/hr_employee_view.xml', |
|||
'data/reward_rule.xml', |
|||
'reports/letter.xml', |
|||
], |
|||
'demo': [], |
|||
'images': ['static/description/banner.jpg'], |
|||
'license': 'AGPL-3', |
|||
'installable': True, |
|||
'auto_install': False, |
|||
'application': False, |
|||
} |
@ -0,0 +1,29 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<record id="hr_payslip_rule_warning" model="hr.salary.rule"> |
|||
<field name="code">SWR</field> |
|||
<field name="name">Warning Amount</field> |
|||
<field name="category_id" ref="hr_payroll.DED"/> |
|||
<field name="amount_select">code</field> |
|||
<field name="amount_python_compute">result = -(payslip.warning_amount)</field> |
|||
<field name="appears_on_payslip" eval="True"/> |
|||
<field name="sequence" eval="190"/> |
|||
</record> |
|||
|
|||
<record id="hr_payslip_rule_reward" model="hr.salary.rule"> |
|||
<field name="code">SRR</field> |
|||
<field name="name">Reward</field> |
|||
<field name="category_id" ref="hr_payroll.ALW"/> |
|||
<field name="amount_select">code</field> |
|||
<field name="amount_python_compute">result = payslip.reward_amount</field> |
|||
<field name="appears_on_payslip" eval="True"/> |
|||
<field name="sequence" eval="190"/> |
|||
</record> |
|||
|
|||
<record id="hr_payroll.structure_base" model="hr.payroll.structure"> |
|||
<field eval="[(4, ref('hr_payslip_rule_warning')), (4, ref('hr_payslip_rule_reward'))]" |
|||
name="rule_ids"/> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,26 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# A part of OpenHRMS Project <https://www.openhrms.com> |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
|||
# Author: Jesni Banu (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
from . import hr_warning |
|||
from . import hr_employee |
|||
|
|||
|
@ -0,0 +1,202 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# A part of OpenHRMS Project <https://www.openhrms.com> |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
|||
# Author: Jesni Banu (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
from odoo import models, fields, api, _ |
|||
|
|||
|
|||
class HrRewardWarning(models.Model): |
|||
_inherit = 'hr.employee' |
|||
|
|||
warning_count = fields.Integer(compute='_warning_count', string='# Warnings') |
|||
reward_count = fields.Integer(compute='_reward_count', string='# Rewards') |
|||
ann_count = fields.Integer(compute='_ann_count', string='# Announcements') |
|||
letter_count = fields.Integer(compute='_letter_count', string='# Letters') |
|||
|
|||
@api.multi |
|||
def _warning_count(self): |
|||
for each in self: |
|||
warning_ids = self.env['hr.reward.warning'].sudo().search([('employee_id', '=', each.id), |
|||
('hr_type', '=', 'warning'), |
|||
('state', 'in', ('approved', 'done'))]) |
|||
each.warning_count = len(warning_ids) |
|||
|
|||
@api.multi |
|||
def _letter_count(self): |
|||
for each in self: |
|||
letter_ids = self.env['hr.reward.warning'].sudo().search([('employee_id', '=', each.id), |
|||
('hr_type', '=', 'letter'), |
|||
('state', 'in', ('approved', 'done'))]) |
|||
each.letter_count = len(letter_ids) |
|||
|
|||
@api.multi |
|||
def _reward_count(self): |
|||
for each in self: |
|||
reward_ids = self.env['hr.reward.warning'].sudo().search([('employee_id', '=', each.id), |
|||
('hr_type', '=', 'reward'), |
|||
('state', 'in', ('approved', 'done'))]) |
|||
each.reward_count = len(reward_ids) |
|||
|
|||
@api.multi |
|||
def _ann_count(self): |
|||
for each in self: |
|||
ann_ids = self.env['hr.reward.warning'].sudo().search([('is_announcement', '=', True), |
|||
('state', 'in', ('approved', 'done'))]) |
|||
each.ann_count = len(ann_ids) |
|||
|
|||
@api.multi |
|||
def warning_view(self): |
|||
for each1 in self: |
|||
warning_obj = self.env['hr.reward.warning'].sudo().search([('employee_id', '=', each1.id), |
|||
('hr_type', '=', 'warning'), |
|||
('state', 'in', ('approved', 'done'))]) |
|||
warning_ids = [] |
|||
for each in warning_obj: |
|||
warning_ids.append(each.id) |
|||
view_id = self.env.ref('hr_reward_warning.view_hr_reward_warning_form').id |
|||
if warning_ids: |
|||
if len(warning_ids) <= 1: |
|||
value = { |
|||
'view_type': 'form', |
|||
'view_mode': 'form', |
|||
'res_model': 'hr.reward.warning', |
|||
'view_id': view_id, |
|||
'type': 'ir.actions.act_window', |
|||
'name': _('Warnings'), |
|||
'res_id': warning_ids and warning_ids[0] |
|||
} |
|||
else: |
|||
value = { |
|||
'domain': str([('id', 'in', warning_ids)]), |
|||
'view_type': 'form', |
|||
'view_mode': 'tree,form', |
|||
'res_model': 'hr.reward.warning', |
|||
'view_id': False, |
|||
'type': 'ir.actions.act_window', |
|||
'name': _('Warnings'), |
|||
'res_id': warning_ids |
|||
} |
|||
|
|||
return value |
|||
|
|||
@api.multi |
|||
def letter_view(self): |
|||
for each1 in self: |
|||
letter_obj = self.env['hr.reward.warning'].sudo().search([('employee_id', '=', each1.id), |
|||
('hr_type', '=', 'letter'), |
|||
('state', 'in', ('approved', 'done'))]) |
|||
letter_ids = [] |
|||
for each in letter_obj: |
|||
letter_ids.append(each.id) |
|||
view_id = self.env.ref('hr_reward_warning.view_hr_reward_warning_form').id |
|||
if letter_ids: |
|||
if len(letter_ids) <= 1: |
|||
value = { |
|||
'view_type': 'form', |
|||
'view_mode': 'form', |
|||
'res_model': 'hr.reward.warning', |
|||
'view_id': view_id, |
|||
'type': 'ir.actions.act_window', |
|||
'name': _('Letters'), |
|||
'res_id': letter_ids and letter_ids[0] |
|||
} |
|||
else: |
|||
value = { |
|||
'domain': str([('id', 'in', letter_ids)]), |
|||
'view_type': 'form', |
|||
'view_mode': 'tree,form', |
|||
'res_model': 'hr.reward.warning', |
|||
'view_id': False, |
|||
'type': 'ir.actions.act_window', |
|||
'name': _('Letters'), |
|||
'res_id': letter_ids |
|||
} |
|||
|
|||
return value |
|||
|
|||
@api.multi |
|||
def reward_view(self): |
|||
for each1 in self: |
|||
reward_obj = self.env['hr.reward.warning'].sudo().search([('employee_id', '=', each1.id), |
|||
('hr_type', '=', 'reward'), |
|||
('state', 'in', ('approved', 'done'))]) |
|||
reward_ids = [] |
|||
for each in reward_obj: |
|||
reward_ids.append(each.id) |
|||
view_id = self.env.ref('hr_reward_warning.view_hr_reward_warning_form').id |
|||
if reward_ids: |
|||
if len(reward_ids) <= 1: |
|||
value = { |
|||
'view_type': 'form', |
|||
'view_mode': 'form', |
|||
'res_model': 'hr.reward.warning', |
|||
'view_id': view_id, |
|||
'type': 'ir.actions.act_window', |
|||
'name': _('Rewards'), |
|||
'res_id': reward_ids and reward_ids[0] |
|||
} |
|||
else: |
|||
value = { |
|||
'domain': str([('id', 'in', reward_ids)]), |
|||
'view_type': 'form', |
|||
'view_mode': 'tree,form', |
|||
'res_model': 'hr.reward.warning', |
|||
'view_id': False, |
|||
'type': 'ir.actions.act_window', |
|||
'name': _('Rewards'), |
|||
'res_id': reward_ids |
|||
} |
|||
|
|||
return value |
|||
|
|||
@api.multi |
|||
def announcement_view(self): |
|||
for each1 in self: |
|||
ann_obj = self.env['hr.reward.warning'].sudo().search([('is_announcement', '=', True), |
|||
('state', 'in', ('approved', 'done'))]) |
|||
ann_ids = [] |
|||
for each in ann_obj: |
|||
ann_ids.append(each.id) |
|||
view_id = self.env.ref('hr_reward_warning.view_hr_reward_warning_form').id |
|||
if ann_ids: |
|||
if len(ann_ids) <= 1: |
|||
value = { |
|||
'view_type': 'form', |
|||
'view_mode': 'form', |
|||
'res_model': 'hr.reward.warning', |
|||
'view_id': view_id, |
|||
'type': 'ir.actions.act_window', |
|||
'name': _('Announcements'), |
|||
'res_id': ann_ids and ann_ids[0] |
|||
} |
|||
else: |
|||
value = { |
|||
'domain': str([('id', 'in', ann_ids)]), |
|||
'view_type': 'form', |
|||
'view_mode': 'tree,form', |
|||
'res_model': 'hr.reward.warning', |
|||
'view_id': False, |
|||
'type': 'ir.actions.act_window', |
|||
'name': _('Announcements'), |
|||
'res_id': ann_ids |
|||
} |
|||
|
|||
return value |
@ -0,0 +1,246 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# A part of OpenHRMS Project <https://www.openhrms.com> |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
|||
# Author: Jesni Banu (<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
from datetime import datetime |
|||
from odoo import models, fields, api, _ |
|||
|
|||
|
|||
class HrRewardWarning(models.Model): |
|||
_name = 'hr.reward.warning' |
|||
_description = 'HR Reward Warning' |
|||
_inherit = ['mail.thread', 'ir.needaction_mixin'] |
|||
|
|||
@api.multi |
|||
def reject(self): |
|||
self.state = 'rejected' |
|||
|
|||
@api.model |
|||
def create(self, vals): |
|||
if vals.get('hr_type') == 'reward': |
|||
vals['name'] = self.env['ir.sequence'].next_by_code('hr.loan.reward') |
|||
elif vals.get('hr_type') == 'warning': |
|||
vals['name'] = self.env['ir.sequence'].next_by_code('hr.loan.warning') |
|||
elif vals.get('hr_type') == 'letter': |
|||
vals['name'] = self.env['ir.sequence'].next_by_code('hr.loan.letter') |
|||
if vals.get('is_announcement'): |
|||
vals['name'] = self.env['ir.sequence'].next_by_code('hr.loan.announcement') |
|||
return super(HrRewardWarning, self).create(vals) |
|||
|
|||
@api.multi |
|||
def sent(self): |
|||
self.state = 'to_approve' |
|||
|
|||
@api.multi |
|||
def set_to_draft(self): |
|||
self.state = 'draft' |
|||
|
|||
@api.multi |
|||
def approve(self): |
|||
letter = _('<table><tr colspan="2"><td>%s</td></tr><tr><td><h4><b>Approved by</b></h4><br/>%s</td>' |
|||
'<td></td></tr></table>') % (self.letter, self.env.user.signature) |
|||
partner_ids = [] |
|||
if self.letter: |
|||
self.letter = letter |
|||
if self.hr_type == 'warning': |
|||
subject = 'Warning: ' + self.reason |
|||
body = '' |
|||
elif self.hr_type == 'reward': |
|||
subject = 'Reward: ' + self.reason |
|||
body = _('<h3>Congrats %s<br/></h3>') % self.employee_id.name |
|||
elif self.hr_type == 'letter': |
|||
subject = 'Letter: ' + self.reason |
|||
body = '' |
|||
if self.is_announcement: |
|||
subject = 'Announcement: ' + self.reason |
|||
body = '' |
|||
if self.is_announcement: |
|||
email_to = self.env.user.email |
|||
emp_obj = self.env['hr.employee'].search([]) |
|||
for each in emp_obj: |
|||
if each.work_email: |
|||
email_to = email_to + ',' + each.work_email |
|||
if each.user_id: |
|||
partner_ids.append(each.user_id.partner_id.id) |
|||
main_content = { |
|||
'subject': subject, |
|||
'author_id': self.env.user.partner_id.id, |
|||
'body_html': body + self.letter, |
|||
'email_to': email_to, |
|||
} |
|||
else: |
|||
if self.employee_id.user_id: |
|||
partner_ids.append(self.employee_id.user_id.partner_id.id) |
|||
main_content = { |
|||
'subject': subject, |
|||
'author_id': self.env.user.partner_id.id, |
|||
'body_html': body + self.letter, |
|||
'email_to': self.employee_id.work_email, |
|||
} |
|||
mail_id = self.env['mail.mail'].create(main_content) |
|||
if self.attachment_id: |
|||
att_ids = [] |
|||
for each in self.attachment_id: |
|||
att_ids.append(each.id) |
|||
mail_id.write({'attachment_ids': [(6, 0, [aid for aid in att_ids])]}) |
|||
mail_id.send() |
|||
mail_id.mail_message_id.write({'needaction_partner_ids': [(4, pid) for pid in partner_ids]}) |
|||
mail_id.mail_message_id.write({'partner_ids': [(4, pid) for pid in partner_ids]}) |
|||
self.state = 'approved' |
|||
|
|||
@api.multi |
|||
def set_to_done(self): |
|||
self.state = 'done' |
|||
|
|||
name = fields.Char(string='Code No:') |
|||
company_id = fields.Many2one('res.company', 'Company', readonly=True, |
|||
default=lambda self: self.env.user.company_id) |
|||
email_send = fields.Boolean(default=False, invisible=1, track_visibility='always', copy=False) |
|||
is_announcement = fields.Boolean(string='Is general Announcement?') |
|||
requested_date = fields.Date(string='Requested Date', default=datetime.now().strftime('%Y-%m-%d')) |
|||
employee_id = fields.Many2one('hr.employee', string='Employee', readonly=True, |
|||
states={'draft': [('readonly', False)]}) |
|||
hr_type = fields.Selection([('warning', 'Warning'), ('reward', 'Reward'), ('letter', 'Letter')], string='Type', |
|||
readonly=True, states={'draft': [('readonly', False)]}) |
|||
amount = fields.Float(string='Amount') |
|||
attachment_id = fields.Many2many('ir.attachment', 'doc_warning_rel', 'doc_id', 'attach_id4', |
|||
string="Attachment", help='You can attach the copy of your Letter') |
|||
reason = fields.Text(string='Title', readonly=True, states={'draft': [('readonly', False)]}, required=True) |
|||
letter = fields.Html(string='Letter', readonly=True, states={'draft': [('readonly', False)]}) |
|||
state = fields.Selection([('draft', 'Draft'), ('to_approve', 'Waiting For Approval'), ('approved', 'Approved'), |
|||
('done', 'Done'), ('rejected', 'Refused')], string='Status', default='draft', |
|||
track_visibility='always') |
|||
month_of_action = fields.Selection([('1', 'January'), ('2', 'February'), ('3', 'March'), |
|||
('4', 'April'), ('5', 'May'), ('6', 'June'), |
|||
('7', 'July'), ('8', 'August'), ('9', 'September'), |
|||
('10', 'October'), ('11', 'November'), ('12', 'December')], |
|||
help="Month of action for to generate payslip", |
|||
string='Requested Month', readonly=True, states={'draft': [('readonly', False)]}) |
|||
|
|||
|
|||
class HrEmployeeWarningAttachment(models.Model): |
|||
_inherit = 'ir.attachment' |
|||
|
|||
doc_warning_rel = fields.Many2many('hr.reward.warning', 'attachment_id', 'attach_id4', 'doc_id', |
|||
string="Attachment", invisible=1) |
|||
|
|||
|
|||
class RewardHrPayslip(models.Model): |
|||
_inherit = 'hr.payslip' |
|||
|
|||
warning_amount = fields.Float('Warning Amount', compute='add_warning', store='True') |
|||
reward_amount = fields.Float('Reward Amount', compute='add_reward', store='True') |
|||
|
|||
@api.multi |
|||
def action_payslip_done(self): |
|||
for each in self: |
|||
current_month = datetime.strptime(each.date_from, "%Y-%m-%d").month |
|||
if each.warning_amount: |
|||
warnings = self.env['hr.reward.warning'].search([('employee_id', '=', each.employee_id.id), |
|||
('state', '=', 'approved'), |
|||
('hr_type', '=', 'warning'), |
|||
('month_of_action', '=', current_month)]) |
|||
for each1 in warnings: |
|||
each1.write({'state': 'done'}) |
|||
if each.reward_amount: |
|||
rewards = self.env['hr.reward.warning'].search([('employee_id', '=', each.employee_id.id), |
|||
('state', '=', 'approved'), |
|||
('hr_type', '=', 'reward'), |
|||
('month_of_action', '=', current_month)]) |
|||
for each1 in rewards: |
|||
each1.write({'state': 'done'}) |
|||
return super(RewardHrPayslip, self).action_payslip_done() |
|||
|
|||
@api.depends('employee_id') |
|||
def add_warning(self): |
|||
for each in self: |
|||
warning_amount = 0 |
|||
current_month = datetime.strptime(each.date_from, "%Y-%m-%d").month |
|||
warnings = self.env['hr.reward.warning'].search([('employee_id', '=', each.employee_id.id), |
|||
('state', '=', 'approved'), |
|||
('hr_type', '=', 'warning'), |
|||
('month_of_action', '=', current_month)]) |
|||
for each1 in warnings: |
|||
warning_amount += each1.amount |
|||
each.warning_amount = warning_amount |
|||
|
|||
@api.depends('employee_id') |
|||
def add_reward(self): |
|||
for each in self: |
|||
reward_amount = 0 |
|||
current_month = datetime.strptime(each.date_from, "%Y-%m-%d").month |
|||
rewards = self.env['hr.reward.warning'].search([('employee_id', '=', each.employee_id.id), |
|||
('state', '=', 'approved'), |
|||
('hr_type', '=', 'reward'), |
|||
('month_of_action', '=', current_month)]) |
|||
for each1 in rewards: |
|||
reward_amount += each1.amount |
|||
each.reward_amount = reward_amount |
|||
|
|||
|
|||
class WizardSendMail(models.TransientModel): |
|||
_name = 'wizard.send.mail' |
|||
|
|||
@api.multi |
|||
def send_now(self): |
|||
context = self._context |
|||
reward_obj = self.env['hr.reward.warning'].search([('id', '=', context.get('reward_id'))]) |
|||
partner_ids = [] |
|||
if reward_obj.hr_type == 'warning': |
|||
subject = 'Warning: ' + reward_obj.reason |
|||
elif reward_obj.hr_type == 'reward': |
|||
subject = 'Reward: ' + reward_obj.reason |
|||
elif reward_obj.hr_type == 'letter': |
|||
subject = 'Letter: ' + reward_obj.reason |
|||
if reward_obj.is_announcement: |
|||
subject = 'Announcement: ' + reward_obj.reason |
|||
if not reward_obj.is_announcement: |
|||
if self.department_ids: |
|||
body = 'Hi Team, <br/>' |
|||
email_to = self.env.user.email |
|||
email_ids = [] |
|||
for each in self.department_ids: |
|||
for each1 in each.member_ids: |
|||
if each1.work_email: |
|||
if each1.work_email not in email_ids: |
|||
email_ids.append(each1.work_email) |
|||
email_to = email_to + ',' + each1.work_email |
|||
if each1.user_id: |
|||
if each1.user_id not in partner_ids: |
|||
partner_ids.append(each1.user_id.partner_id.id) |
|||
main_content = { |
|||
'subject': subject, |
|||
'author_id': self.env.user.partner_id.id, |
|||
'body_html': body + reward_obj.letter, |
|||
'email_to': email_to, |
|||
} |
|||
mail_id = self.env['mail.mail'].create(main_content) |
|||
if reward_obj.attachment_id: |
|||
att_ids = [] |
|||
for each in reward_obj.attachment_id: |
|||
att_ids.append(each.id) |
|||
mail_id.write({'attachment_ids': [(6, 0, [aid for aid in att_ids])]}) |
|||
mail_id.send() |
|||
mail_id.mail_message_id.write({'needaction_partner_ids': [(4, pid) for pid in partner_ids]}) |
|||
mail_id.mail_message_id.write({'partner_ids': [(4, pid) for pid in partner_ids]}) |
|||
reward_obj.write({'email_send': True}) |
|||
|
|||
department_ids = fields.Many2many('hr.department', string='Departments') |
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<odoo> |
|||
<data> |
|||
<template id="reward_warning_letter"> |
|||
<t t-call="report.html_container"> |
|||
<t t-foreach="docs" t-as="obj"> |
|||
<t t-call="report.external_layout"> |
|||
<div class="page"> |
|||
<t t-raw="obj.letter"/> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
</t> |
|||
</template> |
|||
<report |
|||
string="Letter" |
|||
id="reward_letter" |
|||
model="hr.reward.warning" |
|||
report_type="qweb-pdf" |
|||
name="hr_reward_warning.reward_warning_letter" |
|||
file="hr_reward_warning.reward_warning_letter" |
|||
/> |
|||
</data> |
|||
</odoo> |
|
@ -0,0 +1,9 @@ |
|||
<?xml version="1.0" ?> |
|||
<odoo> |
|||
<record id="property_rule_reward" model="ir.rule"> |
|||
<field name="name">Reward Multi Company</field> |
|||
<field name="model_id" ref="model_hr_reward_warning"/> |
|||
<field eval="True" name="global"/> |
|||
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field> |
|||
</record> |
|||
</odoo> |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 122 KiB |
After Width: | Height: | Size: 221 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 106 KiB |
After Width: | Height: | Size: 36 KiB |
@ -0,0 +1,87 @@ |
|||
<section class="oe_container"> |
|||
<div class="oe_row"> |
|||
<h2 class="oe_slogan">OpenHRMS</h2> |
|||
<h3 class="oe_slogan">Most advanced open source HR management software</h3> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced oe_mt32"> |
|||
<div class="oe_span"> |
|||
<div class="oe_demo oe_picture oe_screenshot"> |
|||
<a href="https://www.openhrms.com/#request-demo"> |
|||
<img src="HRMS-BUTTON.png"> |
|||
</a> |
|||
<div class="oe_demo_footer oe_centeralign">Online Demo</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan">OH Official Announcements</h2> |
|||
<h3 class="oe_slogan">Manages Official Announcements</h3> |
|||
<h4 class="oe_slogan"><a href="https://www.cybrosys.com">Cybrosys Technologies</a> </h4> |
|||
</div> |
|||
<div class="oe_row oe_spaced" style="padding-left:65px;"> |
|||
<h4>Features:</h4> |
|||
<div> |
|||
<span style="color:green;"> ☑ </span> Managing Official Announcements.<br/> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_picture"> |
|||
<h3 class="oe_slogan">Overview</h3> |
|||
<p class="oe_mt32 text-justify" style="text-align: center;"> |
|||
This module helps you to manage official announcements. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<div class="oe_demo oe_picture oe_screenshot"> |
|||
<img style="border:8px solid white;" src="hr_reward.png"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<div class="row section-content"> |
|||
<div class="col-md-6 img-content"> |
|||
<h3>Our Odoo Services</h3> |
|||
</div> |
|||
<div class="bc-span col-md-12"> |
|||
<div class="inner-span"> |
|||
<a target="_blank" href="https://www.openhrms.com"> |
|||
<img class="img-border img-responsive thumbnail" src="cybro-service.png"> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<section class="oe_container"> |
|||
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2> |
|||
<div class="oe_slogan" style="margin-top:10px !important;"> |
|||
<div> |
|||
<a class="btn btn-primary btn-lg mt8" |
|||
style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com"><i |
|||
class="fa fa-envelope"></i> Email </a> <a |
|||
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
|||
href="https://www.cybrosys.com/contact/"><i |
|||
class="fa fa-phone"></i> Contact Us </a> <a |
|||
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
|||
href="https://www.cybrosys.com/odoo-customization-and-installation/"><i |
|||
class="fa fa-check-square"></i> Request Customization </a> |
|||
</div> |
|||
<br> |
|||
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block"> |
|||
</div> |
|||
</section> |
|||
|
@ -0,0 +1,26 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<record model="ir.ui.view" id="reward_hr_employee_inherit_form_view"> |
|||
<field name="name">hr.employee.form.inherit.view</field> |
|||
<field name="model">hr.employee</field> |
|||
<field name="inherit_id" ref="hr.view_employee_form"/> |
|||
<field name="arch" type="xml"> |
|||
<div class="oe_button_box" position="inside"> |
|||
<button class="oe_stat_button" name="warning_view" type="object" icon="fa-exclamation-triangle"> |
|||
<field string="Warnings" name="warning_count" widget="statinfo"/> |
|||
</button> |
|||
<button class="oe_stat_button" name="reward_view" type="object" icon="fa-thumbs-up"> |
|||
<field string="Rewards" name="reward_count" widget="statinfo"/> |
|||
</button> |
|||
<button class="oe_stat_button" name="announcement_view" type="object" icon="fa-bullhorn"> |
|||
<field string="Announcements" name="ann_count" widget="statinfo"/> |
|||
</button> |
|||
<button class="oe_stat_button" name="letter_view" type="object" icon="fa-envelope"> |
|||
<field string="Letters" name="letter_count" widget="statinfo"/> |
|||
</button> |
|||
</div> |
|||
</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,197 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<record id="seq_hr_reward_seq" model="ir.sequence"> |
|||
<field name="name">Reward Code</field> |
|||
<field name="code">hr.loan.reward</field> |
|||
<field name="prefix">RS</field> |
|||
<field eval="4" name="padding" /> |
|||
</record> |
|||
|
|||
<record id="seq_hr_warning_seq" model="ir.sequence"> |
|||
<field name="name">Warning Code</field> |
|||
<field name="code">hr.loan.warning</field> |
|||
<field name="prefix">WS</field> |
|||
<field eval="4" name="padding" /> |
|||
</record> |
|||
|
|||
<record id="seq_hr_letter_seq" model="ir.sequence"> |
|||
<field name="name">Letter Code</field> |
|||
<field name="code">hr.loan.letter</field> |
|||
<field name="prefix">LS</field> |
|||
<field eval="4" name="padding" /> |
|||
</record> |
|||
|
|||
<record id="seq_hr_ga_seq" model="ir.sequence"> |
|||
<field name="name">Announcement</field> |
|||
<field name="code">hr.loan.announcement</field> |
|||
<field name="prefix">GA</field> |
|||
<field eval="4" name="padding" /> |
|||
</record> |
|||
|
|||
<record model='ir.ui.view' id='wizard_share_form'> |
|||
<field name="name">wizard.send.mail.form</field> |
|||
<field name="model">wizard.send.mail</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Share Letter"> |
|||
<group> |
|||
<group> |
|||
<field name="department_ids" widget="many2many_tags"/> |
|||
</group> |
|||
</group> |
|||
<footer> |
|||
<button name="send_now" string="Send" type="object" class="oe_highlight"/> |
|||
or |
|||
<button string="Cancel" class="oe_link" special="cancel" /> |
|||
</footer> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record model='ir.actions.act_window' id='wizard_share_act'> |
|||
<field name="name">Share Letter</field> |
|||
<field name="res_model">wizard.send.mail</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_mode">form</field> |
|||
<field name="view_id" ref="wizard_share_form"/> |
|||
<field name="target">new</field> |
|||
</record> |
|||
|
|||
<record id="view_hr_reward_warning_form" model="ir.ui.view"> |
|||
<field name="name">hr.reward.warning.form</field> |
|||
<field name="model">hr.reward.warning</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Announcements"> |
|||
<header> |
|||
<button string="Send For Approval" type="object" name="sent" groups="hr.group_hr_user" |
|||
attrs="{'invisible': [('state','not in',('draft'))]}"/> |
|||
<button string="Approve" groups="hr.group_hr_manager" type="object" name="approve" |
|||
attrs="{'invisible': [('state','not in',('to_approve'))]}"/> |
|||
<button string="Refuse" class="btn-primary" groups="hr.group_hr_manager" type="object" |
|||
name="reject" states="to_approve"/> |
|||
<button string="Set to Draft" type="object" name="set_to_draft" groups="hr.group_hr_user" |
|||
attrs="{'invisible': [('state','not in',('rejected'))]}"/> |
|||
<button string="Share" type="action" name="%(wizard_share_act)d" groups="hr.group_hr_user" |
|||
context="{'reward_id':id,'employee_id':employee_id}" |
|||
attrs="{'invisible': ['|',('state','not in',('approved')),('email_send','=',True)]}"/> |
|||
<button string="Set to Done" type="object" name="set_to_done" groups="hr.group_hr_user" |
|||
attrs="{'invisible': ['|',('state','not in',('approved')), |
|||
('hr_type','!=',('letter')), |
|||
('is_announcement','=',False)]}"/> |
|||
<field name="state" widget="statusbar" statusbar_visible="draft,to_approve,approved,done"/> |
|||
</header> |
|||
<sheet> |
|||
<label for="is_announcement"/> |
|||
<div> |
|||
<field name="is_announcement"/> |
|||
</div> |
|||
<h1> |
|||
<label for="name"/> |
|||
<div> |
|||
<field name="name" class="oe_inline" readonly="1"/> |
|||
</div> |
|||
</h1> |
|||
<group> |
|||
<label for="reason"/> |
|||
<div> |
|||
<field name="reason"/> |
|||
</div> |
|||
</group> |
|||
<group> |
|||
<group> |
|||
<field name="employee_id" attrs="{'invisible': [('is_announcement','=',True)], |
|||
'required': [('is_announcement','=',False)]}"/> |
|||
<field name="hr_type" attrs="{'invisible': [('is_announcement','=',True)], |
|||
'required': [('is_announcement','=',False)]}"/> |
|||
<field name="month_of_action" attrs="{'invisible': ['|',('hr_type','=',('letter')), |
|||
('is_announcement','=',True)], |
|||
'required': [('hr_type','!=',('letter')), |
|||
('is_announcement','=',False)]}"/> |
|||
<field name="attachment_id" widget="many2many_binary" class="oe_inline"/> |
|||
</group> |
|||
<group> |
|||
<field name="requested_date" readonly="1"/> |
|||
<field name="email_send" invisible="1"/> |
|||
<field name="amount" attrs="{'invisible': ['|',('hr_type','=',('letter')), |
|||
('is_announcement','=',True)]}"/> |
|||
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/> |
|||
</group> |
|||
</group> |
|||
<notebook> |
|||
<page name="letter" string="Letter"> |
|||
<field name="letter"/> |
|||
</page> |
|||
</notebook> |
|||
</sheet> |
|||
<div class="oe_chatter"> |
|||
<field name="message_follower_ids" widget="mail_followers"/> |
|||
<field name="message_ids" widget="mail_thread"/> |
|||
</div> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_hr_reward_warning_tree" model="ir.ui.view"> |
|||
<field name="name">hr.reward.warning.tree</field> |
|||
<field name="model">hr.reward.warning</field> |
|||
<field name="arch" type="xml"> |
|||
<tree decoration-info="state == 'draft'" colors="grey:state == 'rejected';green:state == 'approved';red:state == 'to_approve';"> |
|||
<field name="name"/> |
|||
<field name="reason"/> |
|||
<field name="employee_id"/> |
|||
<field name="hr_type"/> |
|||
<field name="month_of_action"/> |
|||
<field name="state"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_hr_reward_warning_search" model="ir.ui.view"> |
|||
<field name="name">hr.reward.warning.search</field> |
|||
<field name="model">hr.reward.warning</field> |
|||
<field name="arch" type="xml"> |
|||
<search string="Announcements"> |
|||
<field name="name"/> |
|||
<field name="is_announcement"/> |
|||
<field name="reason"/> |
|||
<field name="employee_id"/> |
|||
<field name="hr_type"/> |
|||
<field name="month_of_action"/> |
|||
<field name="state"/> |
|||
<separator/> |
|||
<filter name="approved_rewards" string="Approved Letters" domain="[('state', '=', 'approved')]"/> |
|||
<filter name="general_announcements" string="General Announcements" domain="[('is_announcement', '=',True)]"/> |
|||
<filter name="warnings" string="Warnings" domain="[('hr_type', '=', 'warning')]"/> |
|||
<filter name="letters" string="Letters" domain="[('hr_type', '=', 'letter')]"/> |
|||
<filter name="rewards" string="Rewards" domain="[('hr_type', '=', 'reward')]"/> |
|||
<group expand="0" string="Group By"> |
|||
<filter string="Status" domain="[]" context="{'group_by':'state'}"/> |
|||
<filter string="Employee" domain="[]" context="{'group_by':'employee_id'}"/> |
|||
<filter string="Type" domain="[]" context="{'group_by':'hr_type'}"/> |
|||
<filter string="Month of Action" domain="[]" context="{'group_by':'month_of_action'}"/> |
|||
</group> |
|||
</search> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="action_hr_reward_warning" model="ir.actions.act_window"> |
|||
<field name="name">Announcements</field> |
|||
<field name="res_model">hr.reward.warning</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_mode">tree,form</field> |
|||
<field name="search_view_id" ref="view_hr_reward_warning_search"/> |
|||
<field name="help" type="html"> |
|||
<p class="oe_view_nocontent_create"> |
|||
Click to Create a New Record. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
|
|||
<menuitem id="hr_reward_warning" parent="hr.menu_hr_root" |
|||
groups="hr.group_hr_user,hr.group_hr_manager" |
|||
name="Official Announcements" sequence="15"/> |
|||
<menuitem action="action_hr_reward_warning" id="hr_reward_warning_sub_menu" parent="hr_reward_warning" |
|||
groups="hr.group_hr_user,hr.group_hr_manager" |
|||
name="Announcements" sequence="1"/> |
|||
</data> |
|||
</odoo> |
Loading…
Reference in new issue