You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							237 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							237 lines
						
					
					
						
							10 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################# | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | |
| # | |
| #    You can modify it under the terms of the GNU LESSER | |
| #    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | |
| # | |
| #    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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | |
| #    (LGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################# | |
| from odoo import api, fields, models, _ | |
| 
 | |
| 
 | |
| class EmployeeIdeas(models.Model): | |
|     """This class is used for creating ideas under the idea type""" | |
|     _name = 'employee.idea' | |
|     _description = 'Employee Ideas' | |
|     _inherit = 'mail.thread' | |
|     _rec_name = "reference_no" | |
| 
 | |
|     def get_employee_name(self): | |
|         """This function is used to get the name of current employee""" | |
|         employee_rec_id = self.env['hr.employee'].search( | |
|             [('user_id', '=', self.env.user.id)]) | |
|         return employee_rec_id | |
| 
 | |
|     def get_idea_type_domain(self): | |
|         """This function is used to get the idea types""" | |
|         employee_rec_id = self.env['hr.employee'].search( | |
|             [('user_id', '=', self.env.user.id)]) | |
|         idea_type_list = [] | |
|         employee_dept = employee_rec_id.department_id | |
|         idea_type_rec = self.idea_type_id.search([]) | |
|         for rec in idea_type_rec: | |
|             department_rec = rec.hr_department_ids.ids | |
|             if employee_dept.id in department_rec: | |
|                 idea_type_list.append(rec.id) | |
|         return [('id', 'in', idea_type_list)] | |
| 
 | |
|     title = fields.Char(string="Title", help='Title of your idea', | |
|                         required=True) | |
|     employee_id = fields.Many2one('hr.employee', string='Employee', | |
|                                   help='Employee created the idea', | |
|                                   default=get_employee_name) | |
|     idea_type_id = fields.Many2one('idea.type', help='Idea type of the idea', | |
|                                    domain=get_idea_type_domain, | |
|                                    required=True) | |
|     details = fields.Text(string="Details", | |
|                           help='Enter the details of your idea', required=True) | |
|     vote_count = fields.Integer(compute='_compute_vote_count', help='Shows the ' | |
|                                                                     'number of ' | |
|                                                                     'votes ' | |
|                                                                     'obtained') | |
|     is_vote = fields.Boolean(string="Voted", compute='_compute_is_vote', | |
|                              help='Shows whether the employee is voted or not') | |
|     state = fields.Selection(selection=[('draft', 'Draft'), | |
|                                         ('approval', 'Approval'), | |
|                                         ('post', 'Posted'), | |
|                                         ('rejected', 'Rejected')], | |
|                              default='draft', help='Stages of ideas') | |
|     reference_no = fields.Char(string='Order Reference', readonly=True, | |
|                                copy=False, help='Sequence number', | |
|                                default=lambda self: _('New')) | |
|     employee_vote_ids = fields.One2many('give.vote', 'employee_ideas_id', | |
|                                         string="Vote", | |
|                                         help='Connect with the model give.vote ' | |
|                                              'to check the voting status of ' | |
|                                              'employee') | |
|     have_minimum_vote = fields.Text(string='Status', help='This field shows, ' | |
|                                                           'that whether the ' | |
|                                                           'idea has minimum ' | |
|                                                           'vote or not') | |
|     is_visible_give_vote = fields.Boolean(string='Visible Give Vote', | |
|                                           compute='_compute_is_visible_give_vote', | |
|                                           help='Check whether need to show' | |
|                                                'the Give Vote button ') | |
|     company_id = fields.Many2one('res.company', help='Company', readonly=True, | |
|                                  default=lambda self: self.env.company) | |
|     is_send_approval_visibility = fields.Boolean(string="send approval", | |
|                                                  readonly=False, | |
|                                                  compute='_compute_is_send_approval_visibility', | |
|                                                  help='Check Whether, need to' | |
|                                                       ' show the Send ' | |
|                                                       'Approval button for' | |
|                                                       ' employee', store=True) | |
| 
 | |
|     @api.model | |
|     def create(self, vals): | |
|         """This function create the reference number""" | |
|         if vals.get('reference_no', _('New')) == _('New'): | |
|             vals['reference_no'] = self.env['ir.sequence'].next_by_code( | |
|                 'employee.idea') or _('New') | |
|         res = super(EmployeeIdeas, self).create(vals) | |
|         return res | |
| 
 | |
|     def _compute_is_send_approval_visibility(self): | |
|         """This function is used to determine the visibility of send for | |
|         approval button""" | |
|         for rec in self: | |
|             if rec.create_uid.id == self.env.user.id: | |
|                 rec.is_send_approval_visibility = True | |
|             else: | |
|                 rec.is_send_approval_visibility = False | |
| 
 | |
|     def action_send_approval(self): | |
|         """Change the state of a record in to Post""" | |
|         self.write({'state': 'approval'}) | |
| 
 | |
|     def action_approve(self): | |
|         """Change the state of a record in to Approved""" | |
|         self.write({'state': 'post'}) | |
| 
 | |
|     def action_reject(self): | |
|         """Change the state of a record in to Rejected""" | |
|         self.write({'state': 'rejected'}) | |
| 
 | |
|     def action_give_vote(self): | |
|         """This function opens a wizard while click on 'Give Vote' button, | |
|          where provides an interface to vote or to comment""" | |
|         employee = self.env['hr.employee'].search( | |
|             [('user_id', '=', self.env.user.id)] | |
|         ) | |
|         give_votes_rec = self.env['give.vote'].create({ | |
|             'employee_id': employee.id, | |
|             'reference': self.reference_no, | |
|             'employee_ideas_id': self.id | |
|         }) | |
|         return { | |
|             'name': 'Give Vote', | |
|             'type': 'ir.actions.act_window', | |
|             'res_model': 'give.vote', | |
|             'view_mode': 'form', | |
|             'res_id': give_votes_rec.id, | |
|             'target': 'new' | |
|         } | |
| 
 | |
|     def _compute_is_vote(self): | |
|         """This function is used to allow an employee to do single vote""" | |
|         employee = self.env['hr.employee'].search( | |
|             [('user_id', '=', self.env.user.id)]) | |
|         self.is_vote = False | |
|         for rec in self: | |
|             vote_employee = rec.employee_vote_ids.search( | |
|                 [('reference', '=', rec.reference_no), | |
|                  ('status', '=', 'Voted')]) | |
|             if not vote_employee: | |
|                 rec.is_vote = False | |
|             else: | |
|                 for record in vote_employee: | |
|                     if employee.id == record.employee_id.id: | |
|                         rec.is_vote = True | |
|                     else: | |
|                         rec.is_vote = False | |
| 
 | |
|     def _compute_vote_count(self): | |
|         """ This compute function used to count the number of votes get to a | |
|         particular idea""" | |
|         for rec in self: | |
|             rec.vote_count = self.employee_vote_ids.search_count( | |
|                 [('employee_ideas_id', '=', self.id), ('is_vote', '=', 'True')]) | |
|         if self.vote_count >= self.idea_type_id.minimum_vote: | |
|             self.have_minimum_vote = 'Go with this' | |
|         else: | |
|             self.have_minimum_vote = 'Does not have minimum vote' | |
| 
 | |
|     def _compute_is_visible_give_vote(self): | |
|         """This function is used to make visible the Give Vote button only to | |
|         the employees, who are in specified department""" | |
|         employee = self.env['hr.employee'].search( | |
|             [('user_id', '=', self.env.user.id)] | |
|         ) | |
|         for rec in self: | |
|             rec.is_visible_give_vote = False | |
|             if rec.create_uid.id == self.env.user.id: | |
|                 rec.is_visible_give_vote = False | |
|                 break | |
|             department = rec.idea_type_id.hr_department_ids.ids | |
|             if employee.department_id.id in department: | |
|                 rec.is_visible_give_vote = True | |
| 
 | |
|     def action_get_votes_of_idea(self): | |
|         """This function is used to return the tree view showing the votes | |
|         gained while clicking the smart button""" | |
|         self.ensure_one() | |
|         return { | |
|             'type': 'ir.actions.act_window', | |
|             'name': 'Votes', | |
|             'view_mode': 'list', | |
|             'res_model': 'give.vote', | |
|             'target': 'current', | |
|             'domain': [('employee_ideas_id', '=', self.id), | |
|                        ('status', '=', 'Voted')], | |
|             'context': {"create": False} | |
|         } | |
| 
 | |
|     def action_get_comments_of_idea(self): | |
|         """This function is used to return the tree view  showing the comments | |
|        """ | |
|         self.ensure_one() | |
|         return { | |
|             'type': 'ir.actions.act_window', | |
|             'name': 'Comments', | |
|             'view_mode': 'list', | |
|             'res_model': 'give.vote', | |
|             'target': 'current', | |
|             'domain': [('employee_ideas_id', '=', self.id), | |
|                        ('status', '=', 'Commented')], | |
|             'context': {"create": False} | |
|         } | |
| 
 | |
|     def action_print(self): | |
|         """This function is responsible for the printing pdf reports""" | |
|         query = """ | |
|                 select reference_no,hr_employee.name,title,details, | |
|                 employee_idea.state | |
|                 from employee_idea | |
|                 inner join hr_employee on employee_id=hr_employee.id | |
|                 where employee_idea.id = %s | |
|                 """ % self.id | |
|         self.env.cr.execute(query) | |
|         data = { | |
|             'query_fetch': self.env.cr.dictfetchall(), | |
|         } | |
|         return self.env.ref( | |
|             'employee_ideas.employee_idea_action_report').report_action(None, | |
|                                                                         data=data)
 | |
| 
 |