| @ -0,0 +1,49 @@ | |||||
|  | .. image:: https://img.shields.io/badge/license-LGPL--3-blue.svg | ||||
|  |     :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html | ||||
|  |     :alt: License: LGPL-3 | ||||
|  | 
 | ||||
|  | Certificate And License With Expiry Management | ||||
|  | ============================================== | ||||
|  | This module allow to manage certificates and licenses. | ||||
|  | 
 | ||||
|  | Configuration | ||||
|  | ============= | ||||
|  | * No configuration is required | ||||
|  | 
 | ||||
|  | License | ||||
|  | ======= | ||||
|  | Lesser General Public License v3.0 (LGPL v3) | ||||
|  | (http://www.gnu.org/licenses/lgpl-3.0-standalone.html) | ||||
|  | 
 | ||||
|  | Company | ||||
|  | ------- | ||||
|  | * `Cybrosys Techno Solutions <https://cybrosys.com/>`__ | ||||
|  | 
 | ||||
|  | Credits | ||||
|  | ------- | ||||
|  | * Developer: | ||||
|  |             (V15) Ranjith R, | ||||
|  |             (V16) Albin P J, | ||||
|  | Contact: odoo@cybrosys.com | ||||
|  | 
 | ||||
|  | Contacts | ||||
|  | -------- | ||||
|  | * Mail Contact : odoo@cybrosys.com | ||||
|  | * Website : https://cybrosys.com | ||||
|  | 
 | ||||
|  | Bug Tracker | ||||
|  | ----------- | ||||
|  | Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. | ||||
|  | 
 | ||||
|  | Maintainer | ||||
|  | ========== | ||||
|  | .. image:: https://cybrosys.com/images/logo.png | ||||
|  |    :target: https://cybrosys.com | ||||
|  | 
 | ||||
|  | This module is maintained by Cybrosys Technologies. | ||||
|  | 
 | ||||
|  | For support and more information, please visit `Our Website <https://cybrosys.com/>`__ | ||||
|  | 
 | ||||
|  | Further information | ||||
|  | =================== | ||||
|  | HTML Description: `<static/description/index.html>`__ | ||||
| @ -0,0 +1,23 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 . import controllers | ||||
|  | from . import models | ||||
| @ -0,0 +1,77 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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/>. | ||||
|  | # | ||||
|  | ############################################################################### | ||||
|  | { | ||||
|  |     'name': 'Certificate And License With Expiry Management', | ||||
|  |     'version': '15.0.1.0.0', | ||||
|  |     'category': 'Document Management', | ||||
|  |     'summary': """Certificate And License With Expiry Management helps you  | ||||
|  |                 to manage certificates and licenses""", | ||||
|  |     'description': """We can manage the certificates and licenses  | ||||
|  |                 using this module""", | ||||
|  |     'author': 'Cybrosys Techno Solutions', | ||||
|  |     'company': 'Cybrosys Techno Solutions', | ||||
|  |     'maintainer': 'Cybrosys Techno Solutions', | ||||
|  |     'website': "https://www.cybrosys.com", | ||||
|  |     'depends': ['project', 'contacts', 'website', 'product'], | ||||
|  |     'data': [ | ||||
|  |         'security/certificates_license_expiry_groups.xml', | ||||
|  |         'security/certificates_security.xml', | ||||
|  |         'security/license_security.xml', | ||||
|  |         'security/ir.model.access.csv', | ||||
|  |         'data/ir_sequence_data.xml', | ||||
|  |         'data/ir_cron_data.xml', | ||||
|  |         'data/certificates_mail_template_data.xml', | ||||
|  |         'data/license_mail_template_data.xml', | ||||
|  |         'views/certificates_license_menus.xml', | ||||
|  |         'views/certificates_views.xml', | ||||
|  |         'views/license_views.xml', | ||||
|  |         'views/certificates_portal.xml', | ||||
|  |         'views/res_partner_views.xml', | ||||
|  |         'views/license_portal.xml', | ||||
|  |         'views/certificates_search.xml', | ||||
|  |         'views/license_search.xml', | ||||
|  |         'report/certificates_reports.xml', | ||||
|  |         'report/license_reports.xml', | ||||
|  |         'report/certificates_templates.xml', | ||||
|  |         'report/license_templates.xml', | ||||
|  |     ], | ||||
|  |     'demo': [ | ||||
|  |         'demo/certificates_license_types_demo.xml', | ||||
|  |         'demo/certificates_license_tags_demo.xml', | ||||
|  |     ], | ||||
|  |     'assets': { | ||||
|  |         'web.assets_backend': [ | ||||
|  |             'certificate_license_expiry/static/src/css/certificate_license.css', | ||||
|  |         ], | ||||
|  |         'web.assets_frontend': [ | ||||
|  |             'certificate_license_expiry/static/src/js/certificates_group_by.js', | ||||
|  |             'certificate_license_expiry/static/src/js/certificates_search.js', | ||||
|  |             'certificate_license_expiry/static/src/js/license_group_by.js', | ||||
|  |             'certificate_license_expiry/static/src/js/license_search.js', | ||||
|  |         ], | ||||
|  |     }, | ||||
|  |     'images': ['static/description/banner.png'], | ||||
|  |     'license': 'LGPL-3', | ||||
|  |     'installable': True, | ||||
|  |     'auto_install': False, | ||||
|  |     'application': True, | ||||
|  | } | ||||
| @ -0,0 +1,27 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 . import certificates | ||||
|  | from . import certificates_group_by | ||||
|  | from . import certificates_search | ||||
|  | from . import license | ||||
|  | from . import license_group_by | ||||
|  | from . import license_search | ||||
| @ -0,0 +1,74 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 http | ||||
|  | from odoo.http import request | ||||
|  | from odoo.addons.portal.controllers import portal | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class MyCertificates(http.Controller): | ||||
|  |     """It returns the login person""" | ||||
|  | 
 | ||||
|  |     def _get_tickets_domain(self): | ||||
|  |         """It returns the login person""" | ||||
|  |         return [('customer_id', '=', request.env.user.partner_id.id)] | ||||
|  | 
 | ||||
|  |     @http.route(['/my/certificates'], type='http', auth="user", website=True) | ||||
|  |     def get_my_certificates(self): | ||||
|  |         """Take values from certificates and render to portal tree template """ | ||||
|  |         domain = self._get_tickets_domain() | ||||
|  |         certificates = request.env['certificates'].sudo().search(domain) | ||||
|  |         values = { | ||||
|  |             'certificates': certificates, | ||||
|  |             'page_name': 'certificate', | ||||
|  |         } | ||||
|  |         return request.render( | ||||
|  |             "certificate_license_expiry.portal_my_certificates", values) | ||||
|  | 
 | ||||
|  |     @http.route(['/my/certificates/form/<int:cer_id>'], type='http', | ||||
|  |                 auth="user", website=True) | ||||
|  |     def get_my_certificates_form(self, cer_id): | ||||
|  |         """Take values from certificates and render to portal form | ||||
|  |         template.It also passes the id in the root for rendering the | ||||
|  |         corresponding form template""" | ||||
|  |         certificates = request.env['certificates'].sudo().search( | ||||
|  |             [('id', '=', cer_id)]) | ||||
|  |         values = { | ||||
|  |             'my_certificates': certificates, | ||||
|  |             'page_name': 'certificate_view', | ||||
|  |         } | ||||
|  |         return request.render( | ||||
|  |             "certificate_license_expiry.certificates_portal_form_template", | ||||
|  |             values) | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class Return(portal.CustomerPortal): | ||||
|  |     """This will take the count of total certificates""" | ||||
|  | 
 | ||||
|  |     def _prepare_home_portal_values(self, counters): | ||||
|  |         """This will return the certificates count""" | ||||
|  |         values = super(Return, self)._prepare_home_portal_values(counters) | ||||
|  |         certificates = request.env['certificates'].sudo().search_count( | ||||
|  |             [('customer_id', '=', request.env.user.partner_id.id)]) | ||||
|  |         values.update({ | ||||
|  |             'certificates': certificates | ||||
|  |         }) | ||||
|  |         return values | ||||
| @ -0,0 +1,79 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 http | ||||
|  | from odoo.http import request | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class CertificatesGroupBy(http.Controller): | ||||
|  |     """This is used to certificates group by in tree view""" | ||||
|  | 
 | ||||
|  |     @http.route(['/certificatesgroupby'], type='json', auth="public", | ||||
|  |                 website=True) | ||||
|  |     def certificates_group_by(self, **kwargs): | ||||
|  |         """Call from rpc for group by, and it returns the corresponding | ||||
|  |         values""" | ||||
|  |         context = [] | ||||
|  |         group_value = kwargs.get("search_value") | ||||
|  |         if group_value == '0': | ||||
|  |             certificates = request.env["certificates"].sudo().search( | ||||
|  |                 [('customer_id', '=', request.env.user.partner_id.id)]) | ||||
|  |             values = { | ||||
|  |                 'certificates': certificates, | ||||
|  |             } | ||||
|  |             response = http.Response( | ||||
|  |                 template='certificate_license_expiry.portal_my_certificates_tree', | ||||
|  |                 qcontext=values) | ||||
|  |             return response.render() | ||||
|  |         if group_value == '1': | ||||
|  |             context = [] | ||||
|  |             type_ids = request.env['certificates.types'].sudo().search([]) | ||||
|  |             for types in type_ids: | ||||
|  |                 certificates_ids = request.env['certificates'].sudo().search([ | ||||
|  |                     ('certificates_types_id', '=', types.id), | ||||
|  |                     ('customer_id', '=', request.env.user.partner_id.id) | ||||
|  |                 ]) | ||||
|  |                 if certificates_ids: | ||||
|  |                     context.append({ | ||||
|  |                         'name': types.certificate_type, | ||||
|  |                         'data': certificates_ids | ||||
|  |                     }) | ||||
|  |         if group_value == '2': | ||||
|  |             context = [] | ||||
|  |             tag_ids = request.env['certificates.tags'].sudo().search([]) | ||||
|  |             for tags in tag_ids: | ||||
|  |                 certificates_ids = request.env['certificates'].sudo().search([ | ||||
|  |                     ('certificates_tags_ids', '=', tags.id), | ||||
|  |                     ('customer_id', '=', request.env.user.partner_id.id) | ||||
|  |                 ]) | ||||
|  |                 if certificates_ids: | ||||
|  |                     context.append({ | ||||
|  |                         'name': tags.certificates_tags, | ||||
|  |                         'data': certificates_ids | ||||
|  |                     }) | ||||
|  |         values = { | ||||
|  |             'certificates': context, | ||||
|  |         } | ||||
|  |         response = http.Response( | ||||
|  |             template='certificate_license_expiry' | ||||
|  |                      '.certificates_group_by_template', | ||||
|  |             qcontext=values) | ||||
|  |         return response.render() | ||||
| @ -0,0 +1,48 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 http | ||||
|  | from odoo.http import request | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class MyCertificatesSearch(http.Controller): | ||||
|  |     """This is used to search feature in certificates portal tree view""" | ||||
|  | 
 | ||||
|  |     @http.route(['/certificatesearch'], type='json', auth="public", | ||||
|  |                 website=True) | ||||
|  |     def certificates_search(self, **kwargs): | ||||
|  |         """It gives the values and return the response to corresponding | ||||
|  |         template""" | ||||
|  |         search_value = kwargs.get("search_value") | ||||
|  |         if not search_value: | ||||
|  |             certificates = request.env["certificates"].sudo().search( | ||||
|  |                 [('customer_id', '=', request.env.user.partner_id.id)]) | ||||
|  |         else: | ||||
|  |             certificates = request.env["certificates"].sudo().search( | ||||
|  |                 [('certificate_number', 'ilike', search_value), | ||||
|  |                  ('customer_id', '=', request.env.user.partner_id.id)]) | ||||
|  |         values = { | ||||
|  |             'certificates': certificates, | ||||
|  |         } | ||||
|  |         response = http.Response( | ||||
|  |             template='certificate_license_expiry.portal_my_certificates_tree', | ||||
|  |             qcontext=values) | ||||
|  |         return response.render() | ||||
| @ -0,0 +1,72 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 http | ||||
|  | from odoo.http import request | ||||
|  | from odoo.addons.portal.controllers import portal | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class MyLicense(http.Controller): | ||||
|  |     """It returns the login person""" | ||||
|  | 
 | ||||
|  |     def _get_tickets_domain(self): | ||||
|  |         """It returns the login person""" | ||||
|  |         return [('customer_id', '=', request.env.user.partner_id.id)] | ||||
|  | 
 | ||||
|  |     @http.route(['/my/license'], type='http', auth="user", website=True) | ||||
|  |     def get_my_license(self): | ||||
|  |         """Take values from licenses and render to portal tree template """ | ||||
|  |         domain = self._get_tickets_domain() | ||||
|  |         license = request.env['license'].sudo().search(domain) | ||||
|  |         values = {'license': license, | ||||
|  |                   'page_name': 'license', | ||||
|  |                   } | ||||
|  |         return request.render( | ||||
|  |             "certificate_license_expiry.portal_my_license", values) | ||||
|  | 
 | ||||
|  |     @http.route(['/my/license/form/<int:lic_id>'], type='http', auth="user", | ||||
|  |                 website=True) | ||||
|  |     def get_my_license_form(self, lic_id): | ||||
|  |         """Take values from license and render to portal form template.It | ||||
|  |         also passes the id in the root for rendering the corresponding form | ||||
|  |         template""" | ||||
|  |         license = request.env['license'].sudo().search([('id', '=', lic_id)]) | ||||
|  |         values = { | ||||
|  |             'my_license': license, | ||||
|  |             'page_name': 'license_view', | ||||
|  |         } | ||||
|  |         return request.render( | ||||
|  |             "certificate_license_expiry.license_portal_form_template", | ||||
|  |             values) | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class Return(portal.CustomerPortal): | ||||
|  |     """This will take the count of total license""" | ||||
|  | 
 | ||||
|  |     def _prepare_home_portal_values(self, counters): | ||||
|  |         """This will return the license count""" | ||||
|  |         values = super(Return, self)._prepare_home_portal_values(counters) | ||||
|  |         license = request.env['license'].sudo().search_count( | ||||
|  |             [('customer_id', '=', request.env.user.partner_id.id)]) | ||||
|  |         values.update({ | ||||
|  |             'license': license | ||||
|  |         }) | ||||
|  |         return values | ||||
| @ -0,0 +1,77 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 http | ||||
|  | from odoo.http import request | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class LicenseGroupBy(http.Controller): | ||||
|  |     """This is used to license group by in tree view""" | ||||
|  | 
 | ||||
|  |     @http.route(['/licensegroupby'], type='json', auth="public", website=True) | ||||
|  |     def license_group_by(self, **kwargs): | ||||
|  |         """Call from rpc for group by, and it returns the corresponding | ||||
|  |         values""" | ||||
|  |         context = [] | ||||
|  |         group_value = kwargs.get("search_value") | ||||
|  |         if group_value == '0': | ||||
|  |             license = request.env["license"].sudo().search( | ||||
|  |                 [('customer_id', '=', request.env.user.partner_id.id)]) | ||||
|  |             values = { | ||||
|  |                 'license': license, | ||||
|  |             } | ||||
|  |             response = http.Response( | ||||
|  |                 template='certificate_license_expiry.portal_my_license_tree', | ||||
|  |                 qcontext=values) | ||||
|  |             return response.render() | ||||
|  |         if group_value == '1': | ||||
|  |             context = [] | ||||
|  |             type_ids = request.env['license.types'].sudo().search([]) | ||||
|  |             for types in type_ids: | ||||
|  |                 license_ids = request.env['license'].sudo().search([ | ||||
|  |                     ('license_types_id', '=', types.id), | ||||
|  |                     ('customer_id', '=', request.env.user.partner_id.id) | ||||
|  |                 ]) | ||||
|  |                 if license_ids: | ||||
|  |                     context.append({ | ||||
|  |                         'name': types.license_type, | ||||
|  |                         'data': license_ids | ||||
|  |                     }) | ||||
|  |         if group_value == '2': | ||||
|  |             context = [] | ||||
|  |             tag_ids = request.env['license.tags'].sudo().search([]) | ||||
|  |             for tags in tag_ids: | ||||
|  |                 license_ids = request.env['license'].sudo().search([ | ||||
|  |                     ('license_tags_ids', '=', tags.id), | ||||
|  |                     ('customer_id', '=', request.env.user.partner_id.id) | ||||
|  |                 ]) | ||||
|  |                 if license_ids: | ||||
|  |                     context.append({ | ||||
|  |                         'name': tags.license_tags_ids, | ||||
|  |                         'data': license_ids | ||||
|  |                     }) | ||||
|  |         values = { | ||||
|  |             'license': context, | ||||
|  |         } | ||||
|  |         response = http.Response( | ||||
|  |             template='certificate_license_expiry.license_group_by_template', | ||||
|  |             qcontext=values) | ||||
|  |         return response.render() | ||||
| @ -0,0 +1,46 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 http | ||||
|  | from odoo.http import request | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class MyLicenseSearch(http.Controller): | ||||
|  |     """This is used to search feature in license portal tree view""" | ||||
|  | 
 | ||||
|  |     @http.route(['/licensesearch'], type='json', auth="public", website=True) | ||||
|  |     def license_search(self, **kwargs): | ||||
|  |         """It gives the values and return the response to corresponding | ||||
|  |         template""" | ||||
|  |         search_value = kwargs.get("search_value") | ||||
|  |         license = request.env["license"].sudo().search( | ||||
|  |             [('customer_id', '=', | ||||
|  |               request.env.user.partner_id.id)]) if not search_value else \ | ||||
|  |         request.env["license"].sudo().search( | ||||
|  |             [('license_number', 'ilike', search_value), | ||||
|  |              ('customer_id', '=', request.env.user.partner_id.id)]) | ||||
|  |         values = { | ||||
|  |             'license': license, | ||||
|  |         } | ||||
|  |         response = http.Response( | ||||
|  |             template='certificate_license_expiry.portal_my_license_tree', | ||||
|  |             qcontext=values) | ||||
|  |         return response.render() | ||||
| @ -0,0 +1,123 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <!--Mail Template to send when the certificate is expired--> | ||||
|  |     <record id="email_template_certificate" model="mail.template"> | ||||
|  |         <field name="name">Certificate Expiry Mail</field> | ||||
|  |         <field name="model_id" ref="model_certificates"/> | ||||
|  |         <field name="subject">Certificate Expiry</field> | ||||
|  |         <field name="body_html" type="html"> | ||||
|  |             <div style="margin: 0px; padding: 0px;"> | ||||
|  |                 <p style="margin: 0px; padding: 0px; font-size: 13px;"> | ||||
|  |                     <strong>Hello, | ||||
|  |                         <br/> | ||||
|  |                     </strong> | ||||
|  |                     <strong> | ||||
|  |                         <span t-esc="object.customer_id.name"/> | ||||
|  |                         Your Certificate Is Expired | ||||
|  |                     </strong> | ||||
|  |                 </p> | ||||
|  |             </div> | ||||
|  |             <br/> | ||||
|  |             <table width="100%" | ||||
|  |                    style="color: #454748; font-size: 12px; border-collapse: collapse;"> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;"> | ||||
|  |                         <h2> | ||||
|  |                             <t t-esc="object.certificate_number"/> | ||||
|  |                         </h2> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Certificate</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.name"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Start Date</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.start_date"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Expire Date</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.expire_date"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Certificate Type</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.certificates_types_id.certificate_type"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Issued by</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.issued_company_id.name"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Project</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.project_id.name"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Task</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.task_id.name"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Product</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.product_id.name"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Status</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.state"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |             </table> | ||||
|  |         </field> | ||||
|  |     </record> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,27 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <!--Scheduled action to check whether the Certificate is expired or not--> | ||||
|  |     <record id="certificate_expiry_action" model="ir.cron"> | ||||
|  |         <field name="name">Certificate Expiry</field> | ||||
|  |         <field name="model_id" ref="model_certificates"/> | ||||
|  |         <field name="state">code</field> | ||||
|  |         <field name="code">model.certificate_expiry_action()</field> | ||||
|  |         <field name="user_id" ref="base.user_root"/> | ||||
|  |         <field name="interval_number">1</field> | ||||
|  |         <field name="interval_type">days</field> | ||||
|  |         <field name="numbercall">-1</field> | ||||
|  |         <field name="doall" eval="False"/> | ||||
|  |     </record> | ||||
|  |     <!--Scheduled action to check whether the License is expired or not--> | ||||
|  |     <record id="license_expiry_action" model="ir.cron"> | ||||
|  |         <field name="name">License Expiry</field> | ||||
|  |         <field name="model_id" ref="model_license"/> | ||||
|  |         <field name="state">code</field> | ||||
|  |         <field name="code">model.license_expiry_action()</field> | ||||
|  |         <field name="user_id" ref="base.user_root"/> | ||||
|  |         <field name="interval_number">1</field> | ||||
|  |         <field name="interval_type">days</field> | ||||
|  |         <field name="numbercall">-1</field> | ||||
|  |         <field name="doall" eval="False"/> | ||||
|  |     </record> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,27 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <data noupdate="1"> | ||||
|  |         <!--Sequence Code of the Certificates--> | ||||
|  |         <record id="sequence_certificate" model="ir.sequence"> | ||||
|  |             <field name="name">Certificate</field> | ||||
|  |             <field name="code">certificates</field> | ||||
|  |             <field name="active">True</field> | ||||
|  |             <field name="prefix">CER</field> | ||||
|  |             <field name="padding">5</field> | ||||
|  |             <field name="number_next">1</field> | ||||
|  |             <field name="number_increment">1</field> | ||||
|  |             <field name="company_id" eval="False"/> | ||||
|  |         </record> | ||||
|  |         <!--Sequence Code of the Licenses--> | ||||
|  |         <record id="sequence_license" model="ir.sequence"> | ||||
|  |             <field name="name">License</field> | ||||
|  |             <field name="code">license</field> | ||||
|  |             <field name="active">True</field> | ||||
|  |             <field name="prefix">LIC</field> | ||||
|  |             <field name="padding">5</field> | ||||
|  |             <field name="number_next">1</field> | ||||
|  |             <field name="number_increment">1</field> | ||||
|  |             <field name="company_id" eval="False"/> | ||||
|  |         </record> | ||||
|  |     </data> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,123 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <!--Mail Template to send when the license is expired--> | ||||
|  |     <record id="email_template_license" model="mail.template"> | ||||
|  |         <field name="name">License Expiry Mail</field> | ||||
|  |         <field name="model_id" ref="model_license"/> | ||||
|  |         <field name="subject">License Expiry</field> | ||||
|  |         <field name="body_html" type="html"> | ||||
|  |             <div style="margin: 0px; padding: 0px;"> | ||||
|  |                 <p style="margin: 0px; padding: 0px; font-size: 13px;"> | ||||
|  |                     <strong>Hello, | ||||
|  |                         <br/> | ||||
|  |                     </strong> | ||||
|  |                     <strong> | ||||
|  |                         <span t-esc="object.customer_id.name"/> | ||||
|  |                         Your License Is Expired | ||||
|  |                     </strong> | ||||
|  |                 </p> | ||||
|  |             </div> | ||||
|  |             <br/> | ||||
|  |             <table width="100%" | ||||
|  |                    style="color: #454748; font-size: 12px; border-collapse: collapse;"> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;"> | ||||
|  |                         <h2> | ||||
|  |                             <t t-esc="object.license_number"/> | ||||
|  |                         </h2> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>License</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.name"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Start Date</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.start_date"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Expire Date</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.expire_date"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>License Type</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.license_types_id.license_type"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Issued by</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.issued_company_id.name"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Project</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.project_id.name"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Task</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.task_id.name"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Product</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.product_id.name"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |                 <tr style="border-bottom: 1px solid #636363;"> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong>Status</strong> | ||||
|  |                     </td> | ||||
|  |                     <td style="width: 150px;border-right: 1px solid #636363;border-left: 1px solid #636363;"> | ||||
|  |                         <strong> | ||||
|  |                             <t t-esc="object.state"/> | ||||
|  |                         </strong> | ||||
|  |                     </td> | ||||
|  |                 </tr> | ||||
|  |             </table> | ||||
|  |         </field> | ||||
|  |     </record> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,45 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <data noupdate="1"> | ||||
|  |         <!--Demo Data to create in model certificate.tags--> | ||||
|  |         <record id="certificate_tag_1" model="certificates.tags"> | ||||
|  |             <field name="certificates_tags">New</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model certificate.tags--> | ||||
|  |         <record id="certificate_tag_2" model="certificates.tags"> | ||||
|  |             <field name="certificates_tags">Old</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model certificate.tags--> | ||||
|  |         <record id="certificate_tag_3" model="certificates.tags"> | ||||
|  |             <field name="certificates_tags">Information</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model certificate.tags--> | ||||
|  |         <record id="certificate_tag_4" model="certificates.tags"> | ||||
|  |             <field name="certificates_tags">Online</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model certificate.tags--> | ||||
|  |         <record id="certificate_tag_5" model="certificates.tags"> | ||||
|  |             <field name="certificates_tags">Others</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model license.tags--> | ||||
|  |         <record id="license_tag_1" model="license.tags"> | ||||
|  |             <field name="license_tags_ids">New</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model license.tags--> | ||||
|  |         <record id="license_tag_2" model="license.tags"> | ||||
|  |             <field name="license_tags_ids">Old</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model license.tags--> | ||||
|  |         <record id="license_tag_3" model="license.tags"> | ||||
|  |             <field name="license_tags_ids">Information</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model license.tags--> | ||||
|  |         <record id="license_tag_4" model="license.tags"> | ||||
|  |             <field name="license_tags_ids">Online</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model license.tags--> | ||||
|  |         <record id="license_tag_5" model="license.tags"> | ||||
|  |             <field name="license_tags_ids">Other</field> | ||||
|  |         </record> | ||||
|  |     </data> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,53 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <data noupdate="1"> | ||||
|  |         <!--Demo Data to create in model certificates.types--> | ||||
|  |         <record id="certificate_type_1" model="certificates.types"> | ||||
|  |             <field name="certificate_type">Personal</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model certificates.types--> | ||||
|  |         <record id="certificate_type_2" model="certificates.types"> | ||||
|  |             <field name="certificate_type">Professional</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model certificates.types--> | ||||
|  |         <record id="certificate_type_3" model="certificates.types"> | ||||
|  |             <field name="certificate_type">Experience</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model certificates.types--> | ||||
|  |         <record id="certificate_type_4" model="certificates.types"> | ||||
|  |             <field name="certificate_type">Birth</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model certificates.types--> | ||||
|  |         <record id="certificate_type_5" model="certificates.types"> | ||||
|  |             <field name="certificate_type">Degree</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model certificates.types--> | ||||
|  |         <record id="certificate_type_6" model="certificates.types"> | ||||
|  |             <field name="certificate_type">Business</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model license.types--> | ||||
|  |         <record id="license_type_1" model="license.types"> | ||||
|  |             <field name="license_type">Personal</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model license.types--> | ||||
|  |         <record id="license_type_2" model="license.types"> | ||||
|  |             <field name="license_type">Professional</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model license.types--> | ||||
|  |         <record id="license_type_3" model="license.types"> | ||||
|  |             <field name="license_type">Operating</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model license.types--> | ||||
|  |         <record id="license_type_4" model="license.types"> | ||||
|  |             <field name="license_type">Premises</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model license.types--> | ||||
|  |         <record id="license_type_5" model="license.types"> | ||||
|  |             <field name="license_type">Course</field> | ||||
|  |         </record> | ||||
|  |         <!--Demo Data to create in model license.types--> | ||||
|  |         <record id="license_type_6" model="license.types"> | ||||
|  |             <field name="license_type">Business</field> | ||||
|  |         </record> | ||||
|  |     </data> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,7 @@ | |||||
|  | ## Module <certificate_license_expiry> | ||||
|  | 
 | ||||
|  | #### 22.07.2024 | ||||
|  | #### Version 15.0.1.0.0 | ||||
|  | #### ADD | ||||
|  | 
 | ||||
|  | - Initial commit for Certificate And License With Expiry Management | ||||
| @ -0,0 +1,24 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 . import certificates | ||||
|  | from . import license | ||||
|  | from . import res_partner | ||||
| @ -0,0 +1,212 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 random import randint | ||||
|  | from odoo import api, fields, models, _ | ||||
|  | from odoo.exceptions import ValidationError | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class Certificates(models.Model): | ||||
|  |     """This will give all about certificates such as fields etc""" | ||||
|  |     _name = 'certificates' | ||||
|  |     _description = "Certificates" | ||||
|  |     _inherit = ["mail.thread", "mail.activity.mixin"] | ||||
|  | 
 | ||||
|  |     state = fields.Selection( | ||||
|  |         selection=[('new', 'New'), ('active', 'Active'), | ||||
|  |                    ('expired_soon', 'Expiring Soon'), ('expired', 'Expired')], | ||||
|  |         string="State", default='new', help="Sates of certificate") | ||||
|  |     name = fields.Char(string='Name', required=True, help="Name of certificate") | ||||
|  |     certificate_number = fields.Char(string="Certificate Number", | ||||
|  |                                      readonly=True, copy=False, | ||||
|  |                                      default='New', help="Sequence number") | ||||
|  |     customer_id = fields.Many2one('res.partner', string="Customer", | ||||
|  |                                   required=True, help="Name of the customer") | ||||
|  |     certificates_types_id = fields.Many2one('certificates.types', | ||||
|  |                                             string="Certificates Types", | ||||
|  |                                             required=True, help="Type of the " | ||||
|  |                                                                 "certificate") | ||||
|  |     start_date = fields.Date(string="Start Date", required=True, | ||||
|  |                              default=fields.Date.today(), help="Certificate " | ||||
|  |                                                                "start date") | ||||
|  |     expire_date = fields.Date(string="Expire Date", help="Certificate expiry " | ||||
|  |                                                          "date") | ||||
|  |     issued_company_id = fields.Many2one('res.company', string="Issued By", | ||||
|  |                                         required=True, | ||||
|  |                                         help="Certificate issued by " | ||||
|  |                                              "which company") | ||||
|  |     certificates_tags_ids = fields.Many2many('certificates.tags', string="Tags", | ||||
|  |                                              help="Tags of the certificate") | ||||
|  |     project_id = fields.Many2one('project.project', string="Project", | ||||
|  |                                  required=True, | ||||
|  |                                  help="Project corresponding to the " | ||||
|  |                                       "certificate") | ||||
|  |     task_id = fields.Many2one('project.task', string="Task", | ||||
|  |                               domain="[('project_id', '=', project_id)]", | ||||
|  |                               required=True, | ||||
|  |                               help="Task corresponding to the certificate") | ||||
|  |     product_id = fields.Many2one('product.product', string="Product", | ||||
|  |                                  required=True, | ||||
|  |                                  help="Product corresponding to the " | ||||
|  |                                       "certificate") | ||||
|  |     user_id = fields.Many2one('res.users', string="Responsible Person", | ||||
|  |                               required=True, | ||||
|  |                               default=lambda self: self.env.user, | ||||
|  |                               help="Responsible user of the certificate") | ||||
|  |     company_id = fields.Many2one('res.company', string="Company", | ||||
|  |                                  default=lambda self: self.env.company, | ||||
|  |                                  readonly=True, | ||||
|  |                                  help="Company corresponding to the " | ||||
|  |                                       "certificate") | ||||
|  |     expire_remainder_day = fields.Integer(string="Expire Reminder Day", | ||||
|  |                                           help="Certificate expire remainder " | ||||
|  |                                                "day") | ||||
|  |     login_user_id = fields.Many2one('res.users', string='Login User', | ||||
|  |                                     default=lambda self: self.env.user, | ||||
|  |                                     readonly=True, | ||||
|  |                                     help="ID of the logged in user") | ||||
|  |     internal_notes = fields.Text(string="Internal Notes", | ||||
|  |                                  help="Internal notes of the certificate") | ||||
|  |     description = fields.Text(string="Description", required=True, | ||||
|  |                               help="Description of the certificate") | ||||
|  |     achievements = fields.Text(string="Achievements", | ||||
|  |                                help="Achievements in the certificate") | ||||
|  |     has_expired = fields.Boolean(string="Expired Certificate", | ||||
|  |                                  help="Becomes True if the certificate " | ||||
|  |                                       "has expired") | ||||
|  | 
 | ||||
|  |     @api.model | ||||
|  |     def create(self, vals): | ||||
|  |         """This is used to get the certificate number""" | ||||
|  |         if vals.get('certificate_number', 'New') == 'New': | ||||
|  |             vals['certificate_number'] = self.env['ir.sequence'].next_by_code( | ||||
|  |                 'certificates') or 'New' | ||||
|  |         result = super(Certificates, self).create(vals) | ||||
|  |         return result | ||||
|  | 
 | ||||
|  |     @api.constrains('start_date', 'expire_date') | ||||
|  |     def _constrains_certificate_start_date_expire_date(self): | ||||
|  |         """This will give validation at the time of expired date and start | ||||
|  |         date have any problem""" | ||||
|  |         if self.start_date and self.expire_date: | ||||
|  |             if (self.start_date > self.expire_date or fields.Date.today() > | ||||
|  |                     self.expire_date): | ||||
|  |                 raise ValidationError(_('Expire Date Is Not Valid')) | ||||
|  | 
 | ||||
|  |     def active_certificate(self): | ||||
|  |         """It changes the state into active""" | ||||
|  |         self.state = 'active' | ||||
|  | 
 | ||||
|  |     def action_active_certificate(self): | ||||
|  |         """It returns the certificate tree view""" | ||||
|  |         return { | ||||
|  |             'name': 'Active', | ||||
|  |             'view_mode': 'tree', | ||||
|  |             'res_model': 'certificates', | ||||
|  |             'type': 'ir.actions.act_window', | ||||
|  |             'domain': [('state', '=', 'active')], | ||||
|  |             'context': "{'create': False}" | ||||
|  |         } | ||||
|  | 
 | ||||
|  |     def certificate_expiry_action(self): | ||||
|  |         """This function is from scheduled action, it will send mail | ||||
|  |         notification and change the state based on condition given below""" | ||||
|  |         certificates = self.env['certificates'].search( | ||||
|  |             [('has_expired', '=', False)]) | ||||
|  |         today = fields.Date.today() | ||||
|  |         for rec in certificates: | ||||
|  |             if rec.expire_date and today >= fields.Date.subtract( | ||||
|  |                     rec.expire_date, days=rec.expire_remainder_day): | ||||
|  |                 rec.state = 'expired_soon' | ||||
|  |             if rec.expire_date and today >= rec.expire_date and rec.state != 'expired': | ||||
|  |                 email_values = { | ||||
|  |                     'email_cc': False, | ||||
|  |                     'auto_delete': True, | ||||
|  |                     'recipient_ids': [], | ||||
|  |                     'partner_ids': [], | ||||
|  |                     'scheduled_date': False, | ||||
|  |                     'email_to': rec.customer_id.email | ||||
|  |                 } | ||||
|  |                 template = self.env.ref( | ||||
|  |                     'certificate_license_expiry.email_template_certificate') | ||||
|  |                 template.send_mail(rec.id, force_send=True, | ||||
|  |                                    email_values=email_values) | ||||
|  |                 rec.state = 'expired' | ||||
|  |                 rec.has_expired = True | ||||
|  | 
 | ||||
|  |     def action_create_certificate_pdf_report(self): | ||||
|  |         """This is used to get pdf report and passes the values to template""" | ||||
|  |         data = { | ||||
|  |             'record_name': self.name, | ||||
|  |             'record_certificate_number': self.certificate_number, | ||||
|  |             'record_customer_name': self.customer_id.name, | ||||
|  |             'record_certificate_type': self.certificates_types_id.certificate_type, | ||||
|  |             'record_start_date': self.start_date, | ||||
|  |             'record_expire_date': self.expire_date, | ||||
|  |             'record_issued_by': self.issued_company_id.name, | ||||
|  |             'record_project': self.project_id.name, | ||||
|  |             'record_task': self.task_id.name, | ||||
|  |             'record_user': self.user_id.name, | ||||
|  |             'record_company': self.company_id.name, | ||||
|  |             'record_internal_notes': self.internal_notes, | ||||
|  |             'record_description': self.description, | ||||
|  |             'record_achievements': self.achievements, | ||||
|  |             'record_expire_remainder_day': self.expire_remainder_day, | ||||
|  |             'record_product': self.product_id.name, | ||||
|  |             'record_state': self.state | ||||
|  |         } | ||||
|  |         return self.env.ref( | ||||
|  |             'certificate_license_expiry.action_certificate_report').report_action( | ||||
|  |             None, data=data) | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class CertificatesType(models.Model): | ||||
|  |     """This is certificates type model, it is a sub model of the | ||||
|  |     certificates""" | ||||
|  |     _name = 'certificates.types' | ||||
|  |     _description = "Certificates Type" | ||||
|  |     _rec_name = 'certificate_type' | ||||
|  | 
 | ||||
|  |     certificate_type = fields.Char(string="Certificate Type", required=True, | ||||
|  |                                    help="Type of certificate") | ||||
|  |     _sql_constraints = [( | ||||
|  |         'certificate_type_unique', 'unique(certificate_type)', | ||||
|  |         'Already existing certificate type!')] | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class CertificateTags(models.Model): | ||||
|  |     """This is certificates tags model, it is a sub model of the | ||||
|  |     certificates""" | ||||
|  |     _name = 'certificates.tags' | ||||
|  |     _description = "Certificate Tag" | ||||
|  |     _rec_name = 'certificates_tags' | ||||
|  | 
 | ||||
|  |     def _get_default_color(self): | ||||
|  |         """This will give the colors to the corresponding field""" | ||||
|  |         return randint(1, 11) | ||||
|  | 
 | ||||
|  |     certificates_tags = fields.Char(string="Certificate Tag", required=True, | ||||
|  |                                     help="Tags of certificate") | ||||
|  |     _sql_constraints = [( | ||||
|  |         'certificate_tag_unique', 'unique(certificates_tags)', | ||||
|  |         'Already existing certificate tag!')] | ||||
|  |     color = fields.Integer(string="Color", default=_get_default_color, | ||||
|  |                            help="Color of tags") | ||||
| @ -0,0 +1,191 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 random import randint | ||||
|  | from odoo import api, fields, models, _ | ||||
|  | from odoo.exceptions import ValidationError | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class License(models.Model): | ||||
|  |     """This will give all about license such as fields etc""" | ||||
|  |     _name = 'license' | ||||
|  |     _description = "License" | ||||
|  |     _inherit = ["mail.thread", "mail.activity.mixin"] | ||||
|  | 
 | ||||
|  |     state = fields.Selection( | ||||
|  |         selection=[('new', 'New'), ('active', 'Active'), | ||||
|  |                    ('expired_soon', 'Expiring Soon'), ('expired', 'Expired')], | ||||
|  |         string="State", default='new', help="Sates of certificate") | ||||
|  |     name = fields.Char(string='Name', required=True, help="Name of certificate") | ||||
|  |     license_number = fields.Char(string="Certificate Number", readonly=True, | ||||
|  |                                  copy=False, default='New', | ||||
|  |                                  help="Sequence number") | ||||
|  |     customer_id = fields.Many2one('res.partner', string="Customer", | ||||
|  |                                   required=True, help="Customer") | ||||
|  |     license_types_id = fields.Many2one('license.types', | ||||
|  |                                        string="License Types", required=True, | ||||
|  |                                        help="Type of the " | ||||
|  |                                             "license") | ||||
|  |     start_date = fields.Date(string="Start Date", required=True, | ||||
|  |                              default=fields.Date.today(), help="License" | ||||
|  |                                                                "start date") | ||||
|  |     expire_date = fields.Date(string="Expire Date", required=True, | ||||
|  |                               default=fields.Date.today(), | ||||
|  |                               help="License expiry " | ||||
|  |                                    "date") | ||||
|  |     issued_company_id = fields.Many2one('res.company', string="Issued By", | ||||
|  |                                         required=True, help="License issued by " | ||||
|  |                                                             "which company") | ||||
|  |     license_tags_ids = fields.Many2many('license.tags', string="Tags", | ||||
|  |                                         help="Tags") | ||||
|  |     project_id = fields.Many2one('project.project', string="Project", | ||||
|  |                                  required=True, help="Project") | ||||
|  |     task_id = fields.Many2one('project.task', string="Task", | ||||
|  |                               domain="[('project_id', '=', project_id)]", | ||||
|  |                               required=True, help="Task") | ||||
|  |     product_id = fields.Many2one('product.product', string="Product", | ||||
|  |                                  required=True, help="Product") | ||||
|  |     user_id = fields.Many2one('res.users', string="Responsible Person", | ||||
|  |                               required=True, | ||||
|  |                               default=lambda self: self.env.user, help="User") | ||||
|  |     company_id = fields.Many2one('res.company', string="Company", | ||||
|  |                                  default=lambda self: self.env.company, | ||||
|  |                                  readonly=True, help="Company") | ||||
|  |     expire_remainder_day = fields.Integer(string="Expire Reminder Day", | ||||
|  |                                           help="License expire remainder" | ||||
|  |                                                "day") | ||||
|  |     login_user_id = fields.Many2one('res.users', string='Login User', | ||||
|  |                                     default=lambda self: self.env.user, | ||||
|  |                                     readonly=True, help="Login user") | ||||
|  |     internal_notes = fields.Text(string="Internal Notes", help="Internal notes") | ||||
|  |     description = fields.Text(string="Description", help="Description") | ||||
|  |     achievements = fields.Text(string="Achievements", help="Achievements") | ||||
|  |     has_expired = fields.Boolean(string="Expired License", | ||||
|  |                                  help="Becomes True if the License " | ||||
|  |                                       "has expired") | ||||
|  | 
 | ||||
|  |     @api.model | ||||
|  |     def create(self, vals): | ||||
|  |         """This is used to get the license number""" | ||||
|  |         if vals.get('license_number', 'New') == 'New': | ||||
|  |             vals['license_number'] = self.env['ir.sequence'].next_by_code( | ||||
|  |                 'license') or 'New' | ||||
|  |         result = super(License, self).create(vals) | ||||
|  |         return result | ||||
|  | 
 | ||||
|  |     @api.constrains('start_date', 'expire_date') | ||||
|  |     def _constrains_license_start_date_expire_date(self): | ||||
|  |         """This will give validation at the time of expired date and start | ||||
|  |         date have any problem""" | ||||
|  |         if self.start_date and self.expire_date: | ||||
|  |             if self.start_date > self.expire_date or fields.Date.today() > self.expire_date: | ||||
|  |                 raise ValidationError(_('Expire Date Is Not Valid')) | ||||
|  | 
 | ||||
|  |     def active_license(self): | ||||
|  |         """It changes the state into active""" | ||||
|  |         self.state = 'active' | ||||
|  | 
 | ||||
|  |     def action_active_license(self): | ||||
|  |         """It returns the license tree view""" | ||||
|  |         return { | ||||
|  |             'name': 'Active', | ||||
|  |             'view_mode': 'tree', | ||||
|  |             'res_model': 'license', | ||||
|  |             'type': 'ir.actions.act_window', | ||||
|  |             'domain': [('state', '=', 'active')], | ||||
|  |             'context': "{'create': False}" | ||||
|  |         } | ||||
|  | 
 | ||||
|  |     def license_expiry_action(self): | ||||
|  |         """This function is from scheduled action, it will send mail | ||||
|  |         notification and change the state based on condition given below""" | ||||
|  |         license = self.env['license'].search([('has_expired', '=', False)]) | ||||
|  |         today = fields.Date.today() | ||||
|  |         for rec in license: | ||||
|  |             if today >= fields.Date.subtract( | ||||
|  |                     rec.expire_date, days=rec.expire_remainder_day): | ||||
|  |                 rec.state = 'expired_soon' | ||||
|  |             if today >= rec.expire_date and rec.state != 'expired': | ||||
|  |                 email_values = { | ||||
|  |                     'email_cc': False, | ||||
|  |                     'auto_delete': True, | ||||
|  |                     'recipient_ids': [], | ||||
|  |                     'partner_ids': [], | ||||
|  |                     'scheduled_date': False, | ||||
|  |                     'email_to': rec.customer_id.email | ||||
|  |                 } | ||||
|  |                 template = self.env.ref( | ||||
|  |                     'certificate_license_expiry.email_template_license') | ||||
|  |                 template.send_mail(rec.id, force_send=True, | ||||
|  |                                    email_values=email_values) | ||||
|  |                 rec.state = 'expired' | ||||
|  |                 rec.has_expired = True | ||||
|  | 
 | ||||
|  |     def action_create_license_pdf_report(self): | ||||
|  |         """This is used to get pdf report and passes the values to template""" | ||||
|  |         data = { | ||||
|  |             'record_name': self.name, | ||||
|  |             'record_license_number': self.license_number, | ||||
|  |             'record_customer': self.customer_id.name, | ||||
|  |             'record_license_type': self.license_types_id.license_type, | ||||
|  |             'record_start_date': self.start_date, | ||||
|  |             'record_expire_date': self.expire_date, | ||||
|  |             'record_issued_by_': self.issued_company_id.name, | ||||
|  |             'record_project': self.project_id.name, | ||||
|  |             'record_task': self.task_id.name, | ||||
|  |             'record_user': self.user_id.name, | ||||
|  |             'record_company': self.company_id.name, | ||||
|  |             'record_internal_notes': self.internal_notes, | ||||
|  |             'record_description': self.description, | ||||
|  |             'record_achievements': self.achievements, | ||||
|  |             'record_expire_remainder_day': self.expire_remainder_day, | ||||
|  |             'record_product': self.product_id.name, | ||||
|  |             'record_state': self.state | ||||
|  |         } | ||||
|  |         return self.env.ref( | ||||
|  |             'certificate_license_expiry.action_license_report').report_action( | ||||
|  |             None, data=data) | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class LicenseType(models.Model): | ||||
|  |     """This is license type model, it is a sub model of the license """ | ||||
|  |     _name = 'license.types' | ||||
|  |     _description = "License Type" | ||||
|  |     _rec_name = 'license_type' | ||||
|  | 
 | ||||
|  |     license_type = fields.Char(string="License Type", required=True, | ||||
|  |                                help="Type of license") | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class LicenseTags(models.Model): | ||||
|  |     """This is license tags model, it is a sub model of the license """ | ||||
|  |     _name = 'license.tags' | ||||
|  |     _description = "License Tag" | ||||
|  |     _rec_name = 'license_tags_ids' | ||||
|  | 
 | ||||
|  |     def _get_default_color(self): | ||||
|  |         """This will give the colors to the corresponding field""" | ||||
|  |         return randint(1, 11) | ||||
|  | 
 | ||||
|  |     license_tags_ids = fields.Char(string="License Tag", required=True, | ||||
|  |                                    help="Tags fpr license") | ||||
|  |     color = fields.Integer(string="Color", default=_get_default_color, | ||||
|  |                            help="Color of tags") | ||||
| @ -0,0 +1,70 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################### | ||||
|  | # | ||||
|  | #  Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #  Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #  Author: Ranjith R (odoo@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 models, api, fields | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class ResPartner(models.Model): | ||||
|  |     _inherit = 'res.partner' | ||||
|  | 
 | ||||
|  |     certificate_count = fields.Integer(string="Certificate Count", | ||||
|  |                                        compute='_compute_total_certificates' | ||||
|  |                                                '_count', | ||||
|  |                                        help="Count of certificates") | ||||
|  |     license_count = fields.Integer(string="License Count", | ||||
|  |                                    compute='_compute_total_license_count', | ||||
|  |                                    help="Count of license") | ||||
|  | 
 | ||||
|  |     @api.depends('license_count') | ||||
|  |     def _compute_total_certificates_count(self): | ||||
|  |         """We can get the count of certificates""" | ||||
|  |         self.certificate_count = self.env[ | ||||
|  |             'certificates'].search_count([('customer_id', '=', self.id)]) | ||||
|  | 
 | ||||
|  |     @api.depends('certificate_count') | ||||
|  |     def _compute_total_license_count(self): | ||||
|  |         """We can get the count of license""" | ||||
|  |         self.license_count = self.env[ | ||||
|  |             'license'].search_count([('customer_id', '=', self.id)]) | ||||
|  | 
 | ||||
|  |     def show_certificates(self): | ||||
|  |         """We can see the certificate in tree and form view""" | ||||
|  |         self.ensure_one() | ||||
|  |         return { | ||||
|  |             'type': 'ir.actions.act_window', | ||||
|  |             'name': 'Certificates', | ||||
|  |             'view_mode': 'tree,form', | ||||
|  |             'res_model': 'certificates', | ||||
|  |             'domain': [('customer_id', '=', self.id)], | ||||
|  |             'context': "{'create': False}" | ||||
|  |         } | ||||
|  | 
 | ||||
|  |     def show_license(self): | ||||
|  |         """We can see the certificate in tree and form view""" | ||||
|  |         self.ensure_one() | ||||
|  |         return { | ||||
|  |             'type': 'ir.actions.act_window', | ||||
|  |             'name': 'License', | ||||
|  |             'view_mode': 'tree,form', | ||||
|  |             'res_model': 'license', | ||||
|  |             'domain': [('customer_id', '=', self.id)], | ||||
|  |             'context': "{'create': False}" | ||||
|  |         } | ||||
| @ -0,0 +1,25 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <!--Report Action to print the PDF Report of the Certificate--> | ||||
|  |     <record id="action_certificate_report" model="ir.actions.report"> | ||||
|  |         <field name="name">Certificate Report</field> | ||||
|  |         <field name="model">certificates</field> | ||||
|  |         <field name="report_type">qweb-pdf</field> | ||||
|  |         <field name="report_name">certificate_license_expiry.report_certificates</field> | ||||
|  |         <field name="report_file">certificate_license_expiry.report_certificates</field> | ||||
|  |         <field name="binding_type">report</field> | ||||
|  |     </record> | ||||
|  |     <!--Server Action to print the PDF Report of the Certificate--> | ||||
|  |     <record model="ir.actions.server" id="action_create_certificate_pdf_report"> | ||||
|  |         <field name="name">PDF Report</field> | ||||
|  |         <field name="model_id" | ||||
|  |                ref="certificate_license_expiry.model_certificates"/> | ||||
|  |         <field name="binding_model_id" | ||||
|  |                ref="certificate_license_expiry.model_certificates"/> | ||||
|  |         <field name="binding_view_types">form</field> | ||||
|  |         <field name="state">code</field> | ||||
|  |         <field name="code"> | ||||
|  |             action = records.action_create_certificate_pdf_report() | ||||
|  |         </field> | ||||
|  |     </record> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,150 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <!--Template of the Certificate Report--> | ||||
|  |     <template id="report_certificates"> | ||||
|  |         <t t-call="web.external_layout"> | ||||
|  |             <t t-call="web.html_container"> | ||||
|  |                 <div class="page"> | ||||
|  |                     <h1 style="color:black;align:center">Certificate Report</h1> | ||||
|  |                     <table class="table"> | ||||
|  |                         <tr> | ||||
|  |                             <h2 style="color:black"> | ||||
|  |                                 <t t-esc="record_name"/> | ||||
|  |                             </h2> | ||||
|  |                         </tr> | ||||
|  |                     </table> | ||||
|  |                     <table class="table"> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Certificate Number</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_certificate_number"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Customer/Supplier/Contact</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_customer_name"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Certificates Types</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_certificate_type"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Start Date</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_start_date"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Expired Date</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_expire_date"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Issued By</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_issued_by"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Project</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_project"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Task</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_task"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Product</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_product"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Responsible Person</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_user"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Company</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_company"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Expire Remainder Day</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_expire_remainder_day"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Status</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_state"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Internal Notes</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_internal_notes"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Description</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_description"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Achievements</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_achievements"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                     </table> | ||||
|  |                 </div> | ||||
|  |             </t> | ||||
|  |         </t> | ||||
|  |     </template> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,24 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <!--Report Action to print the PDF Report of the License--> | ||||
|  |     <record id="action_license_report" model="ir.actions.report"> | ||||
|  |         <field name="name">License Report</field> | ||||
|  |         <field name="model">license</field> | ||||
|  |         <field name="report_type">qweb-pdf</field> | ||||
|  |         <field name="report_name">certificate_license_expiry.report_license</field> | ||||
|  |         <field name="report_file">certificate_license_expiry.report_license</field> | ||||
|  |         <field name="binding_type">report</field> | ||||
|  |     </record> | ||||
|  |     <!--Server Action to print the PDF Report of the License--> | ||||
|  |     <record model="ir.actions.server" id="action_create_licence_pdf_report"> | ||||
|  |         <field name="name">PDF Report</field> | ||||
|  |         <field name="model_id" ref="certificate_license_expiry.model_license"/> | ||||
|  |         <field name="binding_model_id" | ||||
|  |                ref="certificate_license_expiry.model_license"/> | ||||
|  |         <field name="binding_view_types">form</field> | ||||
|  |         <field name="state">code</field> | ||||
|  |         <field name="code"> | ||||
|  |             action = records.action_create_license_pdf_report() | ||||
|  |         </field> | ||||
|  |     </record> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,150 @@ | |||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||
|  | <odoo> | ||||
|  |     <!--Template of the Certificate Report--> | ||||
|  |     <template id="report_license"> | ||||
|  |         <t t-call="web.external_layout"> | ||||
|  |             <t t-call="web.html_container"> | ||||
|  |                 <div class="page"> | ||||
|  |                     <h1 style="color:black;align:center">License Report</h1> | ||||
|  |                     <table class="table"> | ||||
|  |                         <tr> | ||||
|  |                             <h2 style="color:black"> | ||||
|  |                                 <t t-esc="record_name"/> | ||||
|  |                             </h2> | ||||
|  |                         </tr> | ||||
|  |                     </table> | ||||
|  |                     <table class="table"> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>License Number</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_license_number"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Customer/Supplier/Contact</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_customer"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>License Types</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_license_type"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Start Date</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_start_date"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Expired Date</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_expire_date"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Issued By</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_issued_by_"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Project</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_project"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Task</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_task"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Product</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_product"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Responsible Person</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_user"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Company</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_company"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Expire Remainder Day</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_expire_remainder_day"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Status</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_state"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Internal Notes</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_internal_notes"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Description</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_description"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                         <tr> | ||||
|  |                             <td> | ||||
|  |                                 <strong>Achievements</strong> | ||||
|  |                             </td> | ||||
|  |                             <td> | ||||
|  |                                 <t t-esc="record_achievements"/> | ||||
|  |                             </td> | ||||
|  |                         </tr> | ||||
|  |                     </table> | ||||
|  |                 </div> | ||||
|  |             </t> | ||||
|  |         </t> | ||||
|  |     </template> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,29 @@ | |||||
|  | <?xml version="1.0" encoding="UTF-8" ?> | ||||
|  | <odoo> | ||||
|  |     <!--Category for the groups--> | ||||
|  |     <record model="ir.module.category" id="certificate_license_expiry"> | ||||
|  |         <field name="name">Certificates License Expiry</field> | ||||
|  |         <field name="description">Access For Certificates License Expiry Module | ||||
|  |         </field> | ||||
|  |         <field name="sequence">10</field> | ||||
|  |     </record> | ||||
|  |     <!--Group for the Customer--> | ||||
|  |     <record id="certificates_license_expiry_group_customer" model="res.groups"> | ||||
|  |         <field name="name">Customer</field> | ||||
|  |         <field name="category_id" | ||||
|  |                ref="certificate_license_expiry.certificate_license_expiry"/> | ||||
|  |     </record> | ||||
|  |     <!--Group for the Manager--> | ||||
|  |     <record id="certificate_license_expiry_group_manager" model="res.groups"> | ||||
|  |         <field name="name">Manager</field> | ||||
|  |         <field name="category_id" | ||||
|  |                ref="certificate_license_expiry.certificate_license_expiry"/> | ||||
|  |         <field name="implied_ids" | ||||
|  |                eval="[(4, ref('certificates_license_expiry_group_customer'))]"/> | ||||
|  |     </record> | ||||
|  |     <!--Assigning the Manager group for the default user--> | ||||
|  |     <record id="base.default_user" model="res.users"> | ||||
|  |         <field name="groups_id" | ||||
|  |                eval="[(4,ref('certificate_license_expiry_group_manager'))]"/> | ||||
|  |     </record> | ||||
|  | </odoo> | ||||
| @ -0,0 +1,30 @@ | |||||
|  | <?xml version="1.0" encoding="UTF-8" ?> | ||||
|  | <odoo> | ||||
|  |     <!--Record rule of the model certificates for the managers--> | ||||
|  |     <record id="certificates_rule_manager" model="ir.rule"> | ||||
|  |         <field name="name">Certificates Manager</field> | ||||
|  |         <field ref="model_certificates" name="model_id"/> | ||||
|  |         <field name="domain_force">[(1,'=',1)]</field> | ||||
|  |         <field name="groups" | ||||
|  |                eval="[(4, ref('certificate_license_expiry.certificate_license_expiry_group_manager'))]"/> | ||||
|  |         <field name="perm_read" eval="True"/> | ||||
|  |         <field name="perm_write" eval="True"/> | ||||
|  |         <field name="perm_create" eval="True"/> | ||||
|  |         <field name="perm_unlink" eval="True"/> | ||||
|  |         <field name="active" eval="True"/> | ||||
|  |     </record> | ||||
|  |     <!--Record rule of the model certificates for the customers--> | ||||
|  |     <record id="certificates_rule_customer" model="ir.rule"> | ||||
|  |         <field name="name">Certificates Customer</field> | ||||
|  |         <field ref="model_certificates" name="model_id"/> | ||||
|  |         <field name="domain_force">[('customer_id','=',user.partner_id.id)] | ||||
|  |         </field> | ||||
|  |         <field name="groups" | ||||
|  |                eval="[(4, ref('certificate_license_expiry.certificates_license_expiry_group_customer'))]"/> | ||||
|  |         <field name="perm_read" eval="True"/> | ||||
|  |         <field name="perm_write" eval="False"/> | ||||
|  |         <field name="perm_create" eval="False"/> | ||||
|  |         <field name="perm_unlink" eval="False"/> | ||||
|  |         <field name="active" eval="True"/> | ||||
|  |     </record> | ||||
|  | </odoo> | ||||
| 
 | 
| @ -0,0 +1,30 @@ | |||||
|  | <?xml version="1.0" encoding="UTF-8" ?> | ||||
|  | <odoo> | ||||
|  |     <!--Record rule of the model license for the Manager--> | ||||
|  |     <record id="license_rule_manager" model="ir.rule"> | ||||
|  |         <field name="name">License Manager</field> | ||||
|  |         <field ref="model_license" name="model_id"/> | ||||
|  |         <field name="domain_force">[(1,'=',1)]</field> | ||||
|  |         <field name="groups" | ||||
|  |                eval="[(4, ref('certificate_license_expiry.certificate_license_expiry_group_manager'))]"/> | ||||
|  |         <field name="perm_read" eval="True"/> | ||||
|  |         <field name="perm_write" eval="True"/> | ||||
|  |         <field name="perm_create" eval="True"/> | ||||
|  |         <field name="perm_unlink" eval="True"/> | ||||
|  |         <field name="active" eval="True"/> | ||||
|  |     </record> | ||||
|  |     <!--Record rule of the model license for the Customer--> | ||||
|  |     <record id="license_rule_customer" model="ir.rule"> | ||||
|  |         <field name="name">License Customer</field> | ||||
|  |         <field ref="model_license" name="model_id"/> | ||||
|  |         <field name="domain_force">[('customer_id','=',user.partner_id.id)] | ||||
|  |         </field> | ||||
|  |         <field name="groups" | ||||
|  |                eval="[(4, ref('certificate_license_expiry.certificates_license_expiry_group_customer'))]"/> | ||||
|  |         <field name="perm_read" eval="True"/> | ||||
|  |         <field name="perm_write" eval="False"/> | ||||
|  |         <field name="perm_create" eval="False"/> | ||||
|  |         <field name="perm_unlink" eval="False"/> | ||||
|  |         <field name="active" eval="True"/> | ||||
|  |     </record> | ||||
|  | </odoo> | ||||
| After Width: | Height: | Size: 3.6 KiB | 
| After Width: | Height: | Size: 310 B | 
| After Width: | Height: | Size: 1.3 KiB | 
| After Width: | Height: | Size: 1.4 KiB | 
| After Width: | Height: | Size: 576 B | 
| After Width: | Height: | Size: 733 B | 
| After Width: | Height: | Size: 911 B | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 673 B | 
| After Width: | Height: | Size: 878 B | 
| After Width: | Height: | Size: 653 B | 
| After Width: | Height: | Size: 905 B | 
| After Width: | Height: | Size: 839 B | 
| After Width: | Height: | Size: 427 B | 
| After Width: | Height: | Size: 627 B | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 988 B | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 1.5 KiB | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.9 KiB | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 2.1 KiB | 
| After Width: | Height: | Size: 4.4 KiB | 
| After Width: | Height: | Size: 589 B | 
| After Width: | Height: | Size: 3.4 KiB | 
| After Width: | Height: | Size: 1.7 KiB | 
| After Width: | Height: | Size: 2.3 KiB | 
| After Width: | Height: | Size: 967 B | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 3.8 KiB | 
| After Width: | Height: | Size: 5.0 KiB | 
| After Width: | Height: | Size: 58 KiB | 
| After Width: | Height: | Size: 57 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 60 KiB | 
| After Width: | Height: | Size: 58 KiB | 
| After Width: | Height: | Size: 57 KiB | 
| After Width: | Height: | Size: 114 KiB | 
| After Width: | Height: | Size: 154 KiB | 
| After Width: | Height: | Size: 111 KiB | 
| After Width: | Height: | Size: 149 KiB | 
| After Width: | Height: | Size: 156 KiB | 
| After Width: | Height: | Size: 160 KiB | 
| After Width: | Height: | Size: 102 KiB | 
| After Width: | Height: | Size: 177 KiB | 
| After Width: | Height: | Size: 158 KiB | 
| After Width: | Height: | Size: 158 KiB | 
| After Width: | Height: | Size: 91 KiB | 
| After Width: | Height: | Size: 90 KiB | 
| After Width: | Height: | Size: 130 KiB | 
| After Width: | Height: | Size: 135 KiB | 
| After Width: | Height: | Size: 158 KiB | 
| After Width: | Height: | Size: 59 KiB | 
| After Width: | Height: | Size: 135 KiB | 
| After Width: | Height: | Size: 161 KiB | 
| After Width: | Height: | Size: 176 KiB | 
| After Width: | Height: | Size: 342 KiB | 
| After Width: | Height: | Size: 154 KiB | 
| After Width: | Height: | Size: 97 KiB | 
| After Width: | Height: | Size: 125 KiB | 
| After Width: | Height: | Size: 113 KiB | 
| After Width: | Height: | Size: 127 KiB | 
| After Width: | Height: | Size: 102 KiB | 
| After Width: | Height: | Size: 99 KiB | 
| After Width: | Height: | Size: 149 KiB | 
| After Width: | Height: | Size: 333 KiB | 
| After Width: | Height: | Size: 332 KiB | 
| After Width: | Height: | Size: 150 KiB |