[IMP] website_sale: Add google analytics on checkout process
authorJeremy Kersten <jke@odoo.com>
Wed, 9 Jul 2014 15:45:40 +0000 (17:45 +0200)
committerJeremy Kersten <jke@odoo.com>
Wed, 9 Jul 2014 15:45:40 +0000 (17:45 +0200)
addons/website/views/website_templates.xml
addons/website_sale/controllers/main.py
addons/website_sale/static/src/js/website_sale_tracking.js [new file with mode: 0644]
addons/website_sale/views/templates.xml

index d0c4231..2e3bc4e 100644 (file)
             <t t-call-assets="website.assets_frontend"/>
 
             <t t-raw="head or ''" name='layout_head'/>
+            <t t-if="website.google_analytics_key">
+                <script>
+                    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+                    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+                    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+                    })(window,document,'script','//www.google-analytics.com/analytics.js','_gaw');
+
+                    _gaw('create',_.str.trim('<t t-esc="website.google_analytics_key"/>'));
+                    _gaw('send','pageview');
+                </script>
+            </t>
         </head>
         <body>
             <div id="wrapwrap">
                     </div>
                 </footer>
             </div>
-            <t t-if="website.google_analytics_key">
-                <script>
-                    (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
-                    function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
-                    e=o.createElement(i);r=o.getElementsByTagName(i)[0];
-                    e.src='//www.google-analytics.com/analytics.js';
-                    r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
-                    ga('create',_.str.trim('<t t-esc="website.google_analytics_key"/>'));
-                    ga('send','pageview');
-                </script>
-            </t>
         </body>
     </html>
 </template>
index a6bcd15..525530f 100644 (file)
@@ -759,5 +759,30 @@ class website_sale(http.Controller):
         product = product_obj.browse(request.cr, request.uid, id, context=request.context)
         return product.write({'website_size_x': x, 'website_size_y': y})
 
+    @http.route(['/shop/tracking_last_order'], type='json', auth="public")
+    def tracking_cart(self, **post):
+        """ return JS code for google analytics"""
+        cr, uid, context = request.cr, request.uid, request.context
+        ret = {}
+        sale_order_id = request.session.get('sale_last_order_id')
+        if sale_order_id:
+            order = request.registry['sale.order'].browse(cr, SUPERUSER_ID, sale_order_id, context=context)
+            ret['transaction'] = {
+                'id': sale_order_id,
+                'affiliation': order.company_id.name,
+                'revenue': order.amount_total,
+                'currency': order.currency_id.name
+            }
+            ret['lines'] = []
+            for line in order.order_line:
+                if not line.is_delivery:
+                    ret['lines'].append({
+                        'id': line.order_id and line.order_id.id,
+                        'name': line.product_id.categ_id and line.product_id.categ_id.name or '-',
+                        'sku': line.product_id.id,
+                        'quantity': line.product_uom_qty,
+                        'price': line.price_unit,
+                    })
+        return ret
 
 # vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/website_sale/static/src/js/website_sale_tracking.js b/addons/website_sale/static/src/js/website_sale_tracking.js
new file mode 100644 (file)
index 0000000..8ff5a5a
--- /dev/null
@@ -0,0 +1,67 @@
+$(document).ready(function () {
+
+    // Watching a product
+    if ($("#product_detail.oe_website_sale").length) {
+        prod_id = $("input[name='product_id']").attr('value');
+        vpv("/stats/ecom/product_view/" + prod_id);
+    }
+
+    // Add a product into the cart
+    $(".oe_website_sale form[action='/shop/cart/update'] a.a-submit").on('click', function(o) {
+        prod_id = $("input[name='product_id']").attr('value');
+        vpv("/stats/ecom/product_add_to_cart/" + prod_id);
+    });
+
+    // Start checkout
+    $(".oe_website_sale a[href='/shop/checkout']").on('click', function(o) {
+        vpv("/stats/ecom/customer_checkout");
+    });
+
+    $(".oe_website_sale div.oe_cart a[href^='/web?redirect'][href$='/shop/checkout']").on('click', function(o) {
+        vpv("/stats/ecom/customer_signin");
+    });
+
+    $(".oe_website_sale form[action='/shop/confirm_order'] a.a-submit").on('click', function(o) {
+        if ($("#top_menu > li > a[href='/web/login']").length){
+            vpv("/stats/ecom/customer_signup");
+        }
+        vpv("/stats/ecom/order_checkout");
+    });
+
+    $(".oe_website_sale form[target='_self'] button[type=submit]").on('click', function(o) {
+        var method = $("#payment_method input[name=acquirer]:checked").nextAll("span:first").text();
+        vpv("/stats/ecom/order_payment/" + method);
+    });
+
+    if ($(".oe_website_sale div.oe_cart div.oe_website_sale_tx_status").length) {
+        track_ga('require', 'ecommerce');
+
+        order_id = $(".oe_website_sale div.oe_cart div.oe_website_sale_tx_status").data("order-id");
+        vpv("/stats/ecom/order_confirmed/" + order_id);
+
+        openerp.jsonRpc("/shop/tracking_last_order/").then(function(o) {
+            track_ga('ecommerce:clear');
+
+            if (o.transaction && o.lines) {
+                track_ga('ecommerce:addTransaction', o.transaction);
+                _.forEach(o.lines, function(line) {
+                    track_ga('ecommerce:addItem', line);
+                });
+            }
+            track_ga('ecommerce:send');
+        });
+    }
+
+    function vpv(page){ //virtual page view
+        track_ga('send', 'pageview', {
+          'page': page,
+          'title': document.title,
+        });
+    }
+
+    function track_ga() {
+        website_ga = this._gaw || function(){};
+        website_ga.apply(this, arguments);
+    }
+
+});
index 28f4d3e..d36951e 100644 (file)
 <template id="product" name="Product">
   <t t-call="website.layout">
       <t t-set="head">
+          <script type="text/javascript" src="/website_sale/static/src/js/website_sale_tracking.js"></script>
           <script type="text/javascript" src="/website_sale/static/src/js/website_sale.js"></script>
           <link rel='stylesheet' href='/website_sale/static/src/css/website_sale.css'/>
           <link rel='stylesheet' href='/website_sale/static/src/css/website_mail.css'/>
   <t t-call="website.layout">
       <t t-set="head">
           <script type="text/javascript" src="/website_sale/static/src/js/website_sale.js"></script>
+          <script type="text/javascript" src="/website_sale/static/src/js/website_sale_tracking.js"></script>
           <link rel='stylesheet' href='/website_sale/static/src/css/website_sale.css'/>
           <t t-raw="head or ''"/>
       </t>
   <t t-call="website.layout">
     <t t-set="head">
         <script type="text/javascript" src="/website_sale/static/src/js/website_sale.js"></script>
+        <script type="text/javascript" src="/website_sale/static/src/js/website_sale_tracking.js"></script>
         <link rel='stylesheet' href='/website_sale/static/src/css/website_sale.css'/>
         <t t-raw="head or ''"/>
     </t>
   <t t-call="website.layout">
       <t t-set="head">
           <script type="text/javascript" src="/website_sale/static/src/js/website_sale.js"></script>
+          <script type="text/javascript" src="/website_sale/static/src/js/website_sale_tracking.js"></script>
           <script type="text/javascript" src="/website_sale/static/src/js/website_sale_payment.js"></script>
           <link rel='stylesheet' href='/website_sale/static/src/css/website_sale.css'/>
           <t t-raw="head or ''"/>
       <t t-set="head">
           <link rel='stylesheet' href='/website_sale/static/src/css/website_sale.css'/>
           <script type="text/javascript" src="/website_sale/static/src/js/website_sale_validate.js"></script>
+          <script type="text/javascript" src="/website_sale/static/src/js/website_sale_tracking.js"></script>
           <t t-raw="head or ''"/>
       </t>
       <t t-set="additional_title">Shop - Confirmed</t>