You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							222 lines
						
					
					
						
							8.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							222 lines
						
					
					
						
							8.6 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################# | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | |
| # | |
| #    You can modify it under the terms of the GNU LESSER | |
| #    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | |
| # | |
| #    This program is distributed in the hope that it will be useful, | |
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
| #    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | |
| #    (LGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################# | |
| try: | |
|     import qrcode | |
| except ImportError: | |
|     qrcode = None | |
| try: | |
|     import base64 | |
| except ImportError: | |
|     base64 = None | |
| from io import BytesIO | |
| 
 | |
| from odoo import models, fields, api, _ | |
| from odoo.exceptions import UserError | |
| 
 | |
| 
 | |
| class Partners(models.Model): | |
|     """Extends the res.partner model to include QR code functionality.""" | |
|     _inherit = 'res.partner' | |
| 
 | |
|     sequence = fields.Char(string="QR Sequence", readonly=True) | |
|     qr = fields.Binary(string="QR Code") | |
| 
 | |
|     def init(self): | |
|         """Initialize the QR sequence for customer partners with a combination | |
|         of 'DEF', partner's name (without spaces), and partner's ID.""" | |
|         for record in self.env['res.partner'].search( | |
|                 [('customer_rank', '=', True)]): | |
|             name = record.name.replace(" ", "") | |
|             record.sequence = 'DEF' + name.upper() + str(record.id) | |
| 
 | |
|     @api.model | |
|     def create(self, vals): | |
|         """Create a new partner record and assign a unique QR sequence to it.""" | |
|         prefix = self.env['ir.config_parameter'].sudo().get_param( | |
|             'customer_product_qr.config.customer_prefix') | |
|         if not prefix: | |
|             raise UserError(_('Set A Customer Prefix In General Settings')) | |
|         prefix = str(prefix) | |
|         seq = prefix + self.env['ir.sequence'].next_by_code( | |
|             'res.partner') or '/' | |
|         vals['sequence'] = seq | |
|         return super(Partners, self).create(vals) | |
| 
 | |
|     @api.depends('sequence') | |
|     def generate_qr(self): | |
|         """Generate a QR code based on the partner's sequence and store it in | |
|         the 'qr' field of the partner record.""" | |
|         if qrcode and base64: | |
|             if not self.sequence: | |
|                 prefix = self.env['ir.config_parameter'].sudo().get_param( | |
|                     'customer_product_qr.config.customer_prefix') | |
|                 if not prefix: | |
|                     raise UserError( | |
|                         _('Set A Customer Prefix In General Settings')) | |
|                 prefix = str(prefix) | |
|                 self.sequence = prefix + self.env['ir.sequence'].next_by_code( | |
|                     'res.partner') or '/' | |
|             qr = qrcode.QRCode( | |
|                 version=1, | |
|                 error_correction=qrcode.constants.ERROR_CORRECT_L, | |
|                 box_size=10, | |
|                 border=4, | |
|             ) | |
|             qr.add_data(self.sequence) | |
|             qr.make(fit=True) | |
|             img = qr.make_image() | |
|             temp = BytesIO() | |
|             img.save(temp, format="PNG") | |
|             qr_image = base64.b64encode(temp.getvalue()) | |
|             self.write({'qr': qr_image}) | |
|             return self.env.ref( | |
|                 'customer_product_qrcode.print_qr').report_action(self, data={ | |
|                 'data': self.id, 'type': 'cust'}) | |
|         else: | |
|             raise UserError( | |
|                 _('Necessary Requirements To Run This Operation Is Not Satisfied')) | |
| 
 | |
|     def get_partner_by_qr(self, **args): | |
|         return self.env['res.partner'].search([('sequence', '=', self.id), ], | |
|                                               limit=1).id | |
| 
 | |
| 
 | |
| class Products(models.Model): | |
|     """Extends the product.product model to include QR code functionality.""" | |
|     _inherit = 'product.product' | |
| 
 | |
|     sequence = fields.Char(string="QR Sequence", readonly=True) | |
|     qr = fields.Binary(string="QR Code") | |
| 
 | |
|     @api.model | |
|     def create(self, vals): | |
|         """Create a new product and assign a unique QR sequence and QR code | |
|         to it.""" | |
|         prefix = self.env['ir.config_parameter'].sudo().get_param( | |
|             'customer_product_qr.config.product_prefix') | |
|         if not prefix: | |
|             raise UserError(_('Set A Product Prefix In General Settings')) | |
|         prefix = str(prefix) | |
|         seq = prefix + self.env['ir.sequence'].next_by_code( | |
|             'product.product') or '/' | |
|         vals['sequence'] = seq | |
|         qr = qrcode.QRCode( | |
|             version=1, | |
|             error_correction=qrcode.constants.ERROR_CORRECT_L, | |
|             box_size=10, | |
|             border=4, | |
|         ) | |
|         qr.add_data(vals['sequence']) | |
|         qr.make(fit=True) | |
|         img = qr.make_image() | |
|         temp = BytesIO() | |
|         img.save(temp, format="PNG") | |
|         qr_image = base64.b64encode(temp.getvalue()) | |
|         vals.update({'qr': qr_image}) | |
|         return super(Products, self).create(vals) | |
| 
 | |
|     @api.depends('sequence') | |
|     def generate_qr(self): | |
|         """Generate a QR code based on the product's sequence and store it in | |
|         the 'qr' field of the product.""" | |
|         if qrcode and base64: | |
|             if not self.sequence: | |
|                 prefix = self.env['ir.config_parameter'].sudo().get_param( | |
|                     'customer_product_qr.config.product_prefix') | |
|                 if not prefix: | |
|                     raise UserError( | |
|                         _('Set A Customer Prefix In General Settings')) | |
|                 prefix = str(prefix) | |
|                 self.sequence = prefix + self.env['ir.sequence'].next_by_code( | |
|                     'product.product') or '/' | |
|             qr = qrcode.QRCode( | |
|                 version=1, | |
|                 error_correction=qrcode.constants.ERROR_CORRECT_L, | |
|                 box_size=10, | |
|                 border=4, | |
|             ) | |
|             qr.add_data(self.sequence) | |
|             qr.make(fit=True) | |
|             img = qr.make_image() | |
|             temp = BytesIO() | |
|             img.save(temp, format="PNG") | |
|             qr_image = base64.b64encode(temp.getvalue()) | |
|             self.write({'qr': qr_image}) | |
|             return self.env.ref( | |
|                 'customer_product_qrcode.print_qr2').report_action(self, data={ | |
|                 'data': self.id, 'type': 'prod'}) | |
|         else: | |
|             raise UserError( | |
|                 _('Necessary Requirements To Run This Operation Is Not Satisfied')) | |
| 
 | |
|     def get_product_by_qr(self, **args): | |
|         """Retrieve a product based on the provided QR sequence.""" | |
|         return self.env['product.product'].search( | |
|             [('sequence', '=', self.id), ], limit=1).id | |
| 
 | |
| 
 | |
| class ProductTemplate(models.Model): | |
|     """Extends the product.template model to generate QR codes for all | |
|     related product variants.""" | |
|     _inherit = 'product.template' | |
| 
 | |
|     def generate_qr(self): | |
|         """Generate QR codes for all product variants associated with the | |
|         product template.""" | |
|         product = self.env['product.product'].search( | |
|             [('product_tmpl_id', '=', self.id), ]) | |
|         for rec in product: | |
|             rec.generate_qr() | |
|         return self.env.ref('customer_product_qrcode.print_qr2').report_action( | |
|             self, data={'data': self.id, 'type': 'all'}) | |
| 
 | |
| 
 | |
| class ResConfigSettings(models.TransientModel): | |
|     """Extends the res.config.settings model to include configuration | |
|     settings for QR code prefixes.""" | |
|     _inherit = 'res.config.settings' | |
| 
 | |
|     customer_prefix = fields.Char(string="Customer QR Prefix") | |
|     product_prefix = fields.Char(string="Product QR Prefix") | |
| 
 | |
|     def get_values(self): | |
|         """fRetrieve the current configuration values for QR code prefixes.""" | |
|         res = super(ResConfigSettings, self).get_values() | |
|         customer_prefix = self.env["ir.config_parameter"].get_param( | |
|             "customer_product_qr.config.customer_prefix") | |
|         product_prefix = self.env["ir.config_parameter"].get_param( | |
|             "customer_product_qr.config.product_prefix") | |
|         res.update({ | |
|             'customer_prefix': customer_prefix if type( | |
|                 customer_prefix) else False, | |
|             'product_prefix': product_prefix if type(product_prefix) else False | |
|         } | |
|         ) | |
|         return res | |
| 
 | |
|     def set_values(self): | |
|         """Set the configuration values for QR code prefixes.""" | |
|         self.env['ir.config_parameter'].sudo().set_param( | |
|             'customer_product_qr.config.customer_prefix', self.customer_prefix) | |
|         self.env['ir.config_parameter'].sudo().set_param( | |
|             'customer_product_qr.config.product_prefix', self.product_prefix) | |
|         super(ResConfigSettings, self).set_values()
 | |
| 
 |