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.
		
		
		
		
		
			
		
			
				
					
					
						
							158 lines
						
					
					
						
							6.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							158 lines
						
					
					
						
							6.6 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Gokul PI (<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/>.
							 | 
						|
								#
							 | 
						|
								#############################################################################
							 | 
						|
								import requests
							 | 
						|
								from odoo import models, _
							 | 
						|
								from odoo.exceptions import UserError
							 | 
						|
								from odoo.http import request
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class SaleOrder(models.Model):
							 | 
						|
								    """Extends the functionality of sale orders by adding
							 | 
						|
								       additional analytics tracking upon confirmation and cart update."""
							 | 
						|
								    _inherit = 'sale.order'
							 | 
						|
								
							 | 
						|
								    def action_confirm(self):
							 | 
						|
								        """Supering the function to send analytics data of the sale order.
							 | 
						|
								        :return: Result of confirming the sale order."""
							 | 
						|
								        res = super().action_confirm()
							 | 
						|
								        enable_analytics = self.env[
							 | 
						|
								            'ir.config_parameter'].sudo().get_param(
							 | 
						|
								            'google_analytics_odoo.enable_analytics')
							 | 
						|
								        measurement_id = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								            'google_analytics_odoo.measurement_id_analytics')
							 | 
						|
								        api_secret = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								            'google_analytics_odoo.api_secret')
							 | 
						|
								        if enable_analytics:
							 | 
						|
								            url = f"https://www.google-analytics.com/mp/collect?measurement_id={measurement_id}&api_secret={api_secret}"
							 | 
						|
								            data = {
							 | 
						|
								                "client_id": str(self.partner_id.id),
							 | 
						|
								                "events": [{
							 | 
						|
								                    "name": "Sales_Order",
							 | 
						|
								                    "params": {
							 | 
						|
								                        "Number": self.name,
							 | 
						|
								                        "Customer": self.partner_id.name,
							 | 
						|
								                        "Amount": self.amount_total,
							 | 
						|
								                    }
							 | 
						|
								                }]
							 | 
						|
								            }
							 | 
						|
								            requests.post(url, json=data)
							 | 
						|
								        return res
							 | 
						|
								
							 | 
						|
								    def _cart_update(self, product_id, line_id=None, add_qty=0, set_qty=0,
							 | 
						|
								                     **kwargs):
							 | 
						|
								        """ Updates the cart and sends analytics data.
							 | 
						|
								
							 | 
						|
								            :param product_id: ID of the product to be updated.
							 | 
						|
								            :param line_id: ID of the order line.
							 | 
						|
								            :param add_qty: Quantity to be added.
							 | 
						|
								            :param set_qty: Quantity to be set.
							 | 
						|
								            :param kwargs: Additional keyword arguments.
							 | 
						|
								            :return: Result of updating the cart."""
							 | 
						|
								        self.ensure_one()
							 | 
						|
								        self = self.with_company(self.company_id)
							 | 
						|
								        if self.state != 'draft':
							 | 
						|
								            request.session.pop('sale_order_id', None)
							 | 
						|
								            request.session.pop('website_sale_cart_quantity', None)
							 | 
						|
								            raise UserError(
							 | 
						|
								                _('It is forbidden to modify a sales order which is not in draft status.'))
							 | 
						|
								        product = self.env['product.product'].browse(product_id).exists()
							 | 
						|
								        if add_qty and (not product or not product._is_add_to_cart_allowed()):
							 | 
						|
								            raise UserError(
							 | 
						|
								                _("The given product does not exist therefore it cannot be added to cart."))
							 | 
						|
								        if line_id is not False:
							 | 
						|
								            order_line = self._cart_find_product_line(product_id, line_id,
							 | 
						|
								                                                      **kwargs)[:1]
							 | 
						|
								        else:
							 | 
						|
								            order_line = self.env['sale.order.line']
							 | 
						|
								        try:
							 | 
						|
								            if add_qty:
							 | 
						|
								                add_qty = int(add_qty)
							 | 
						|
								        except ValueError:
							 | 
						|
								            add_qty = 1
							 | 
						|
								        try:
							 | 
						|
								            if set_qty:
							 | 
						|
								                set_qty = int(set_qty)
							 | 
						|
								        except ValueError:
							 | 
						|
								            set_qty = 0
							 | 
						|
								        quantity = 0
							 | 
						|
								        if set_qty:
							 | 
						|
								            quantity = set_qty
							 | 
						|
								        elif add_qty is not None:
							 | 
						|
								            if order_line:
							 | 
						|
								                quantity = order_line.product_uom_qty + (add_qty or 0)
							 | 
						|
								            else:
							 | 
						|
								                quantity = add_qty or 0
							 | 
						|
								        if quantity > 0:
							 | 
						|
								            quantity, warning = self._verify_updated_quantity(
							 | 
						|
								                order_line,
							 | 
						|
								                product_id,
							 | 
						|
								                quantity,
							 | 
						|
								                **kwargs,
							 | 
						|
								            )
							 | 
						|
								        else:
							 | 
						|
								            # If the line will be removed anyway, there is no need to verify
							 | 
						|
								            # the requested quantity update.
							 | 
						|
								            warning = ''
							 | 
						|
								        self._remove_delivery_line()
							 | 
						|
								        order_line = self._cart_update_order_line(product_id, quantity,
							 | 
						|
								                                                  order_line, **kwargs)
							 | 
						|
								        if (order_line
							 | 
						|
								            and order_line.price_unit == 0
							 | 
						|
								            and self.website_id.prevent_zero_price_sale
							 | 
						|
								            and product.detailed_type not in self.env[
							 | 
						|
								            'product.template']._get_product_types_allow_zero_price()
							 | 
						|
								        ):
							 | 
						|
								            raise UserError(_(
							 | 
						|
								                "The given product does not have a price therefore it cannot be added to cart.",
							 | 
						|
								            ))
							 | 
						|
								        enable_analytics = self.env[
							 | 
						|
								            'ir.config_parameter'].sudo().get_param(
							 | 
						|
								            'google_analytics_odoo.enable_analytics'),
							 | 
						|
								        measurement_id = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								            'google_analytics_odoo.measurement_id_analytics')
							 | 
						|
								        api_secret = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								            'google_analytics_odoo.api_secret')
							 | 
						|
								        if enable_analytics:
							 | 
						|
								            url = f"https://www.google-analytics.com/mp/collect?measurement_id={measurement_id}&api_secret={api_secret}"
							 | 
						|
								            data = {
							 | 
						|
								                "client_id": str(self.env.user.partner_id.id),
							 | 
						|
								                "events": [{
							 | 
						|
								                    "name": "Add_To_Cart",
							 | 
						|
								                    "params": {
							 | 
						|
								                        "Product_Name": order_line.name_short,
							 | 
						|
								                        'Customer': request.env.user.name,
							 | 
						|
								                        "Quantity": order_line.product_qty,
							 | 
						|
								                        "Amount": order_line.price_unit,
							 | 
						|
								                        "Total_Price": order_line.price_total,
							 | 
						|
								                        "Discount": order_line.discount,
							 | 
						|
								                        "Total_Tax": order_line.price_tax,
							 | 
						|
								                    }
							 | 
						|
								                }]
							 | 
						|
								            }
							 | 
						|
								            requests.post(url, json=data)
							 | 
						|
								        return {
							 | 
						|
								            'line_id': order_line.id,
							 | 
						|
								            'quantity': quantity,
							 | 
						|
								            'option_ids': list(set(order_line.option_line_ids.filtered(
							 | 
						|
								                lambda l: l.order_id == order_line.order_id).ids)),
							 | 
						|
								            'warning': warning,
							 | 
						|
								        }
							 | 
						|
								
							 |