setApplicationName("ateliers"); $client->setAuthConfig($KEY_FILE_LOCATION); $client->setScopes(['https://www.googleapis.com/auth/analytics.readonly']); $this->__analytics = new Google_Service_AnalyticsReporting($client); $this->__def_ga_config = array( 'view_id' => "$view_id", 'start' => "30daysAgo", 'end' => "today", 'pageSize' => 1000000000, // depends on what index you put this custom dimension 'connectedUserDimension' => 'ga:'.$connected_user_dim, ); $this->__rep_data_cat = array( // "total_per_user_type_and_date_rep" => array( // "mets" => array( // 'users', 'sessions','sessionDuration','pageViews','uniquePageviews' // ), // "dims" => array('date'), // ), "session_pageviews_bouncerate" => array( "mets" => array( 'sessions','sessionDuration','pageViews','uniquePageviews', 'bounceRate' ), "dims" => array('userType', 'date'), ), "visitors" => array( "mets" => array('users'), "dims" => array('browser', 'date', 'deviceCategory', 'userType'), ), // "bounce_rate" => array( // "mets" => array('bounceRate'), // "dims" => array('date'), // ), "connected_users" => array( "mets" => array('users', 'sessions','sessionDuration','pageViews','uniquePageviews', 'bounceRate'), "dims" => array('date', $connected_user_dim), ), "events" => array( "mets" => array('totalEvents'), "dims" => array('eventAction', 'eventCategory', 'eventLabel', 'date', 'userType'), ), "sources" => array( "dims" => array('source','sourceMedium','date', 'channelGrouping'), ), // "event_page_views" => array( // "mets" => array('totalEvents', 'eventValue'), // "dims" => array('eventAction', 'eventCategory', 'eventLabel', 'date'), // ), ); } private function setCategory($report_category) { $category = array(); switch ($report_category) { case 'all_garep': $category = $this->__rep_data_cat; break; default: $category = array($this->__rep_data_cat[$report_category]); break; } return $category; } private function set_ga_date($date){ $d = DateTime::createFromFormat('Y-m-d', $date); $is_date = $d && $d->format('Y-m-d') === $date; $days = '-0'; if (!$is_date) { $n_date = strtolower($date); switch ($n_date) { case 'today': $days = '-0'; break; case 'yesterday': $days = '-1'; break; case '7daysago': $days = '-7'; break; case '30daysago': $days = '-30'; break; } return date('Y-m-d', strtotime("$days days")); } else { return $date; } } public function getStoreGAData($db, $start ='', $end ='', $pageSize ='', $order ='', $report_category = 'all_garep') { // set the database connection $this->__db = $db; $category_met_dims = $this->setCategory($report_category); // Create the DateRange object. $dateRange = new Google_Service_AnalyticsReporting_DateRange(); $dateRange->setStartDate( empty($start)?$this->__def_ga_config['start']:$start ); $dateRange->setEndDate( empty($end)?$this->__def_ga_config['end']:$end ); // get categories foreach ($category_met_dims as $category => $met_dims) { $ga_mets = array(); $ga_dims = array(); // get and initialize metrics if (isset($met_dims['mets'])) { for ($i=0; $i < count($met_dims['mets']) ; $i++) { // Create the Metrics object. $ga_mets[$i] = new Google_Service_AnalyticsReporting_Metric(); $ga_mets[$i]->setExpression("ga:{$met_dims['mets'][$i]}"); $ga_mets[$i]->setAlias("{$met_dims['mets'][$i]}"); } } // create the dimension objects for ($i=0; $i < count($met_dims['dims']) ; $i++) { // Create the Metrics object. $ga_dims[$i] = new Google_Service_AnalyticsReporting_Dimension(); $ga_dims[$i]->setName("ga:{$met_dims['dims'][$i]}"); } // Create the ReportRequest object. $request = new Google_Service_AnalyticsReporting_ReportRequest(); $request->setViewId($this->__def_ga_config['view_id']); $request->setDateRanges($dateRange); $request->setDimensions($ga_dims); $request->setMetrics($ga_mets); $request->setPageSize( empty($pageSize)?$this->__def_ga_config['pageSize']:$pageSize ); $body = new Google_Service_AnalyticsReporting_GetReportsRequest(); $body->setReportRequests( array( $request) ); // $this->printResults($this->__analytics->reports->batchGet( $body )); $this->storeResults($category, $this->__analytics->reports->batchGet( $body )); } } private function storeResults($category, $reports){ for ( $reportIndex = 0; $reportIndex < count( $reports ); $reportIndex++ ) { $report = $reports[ $reportIndex ]; $header = $report->getColumnHeader(); $dimensionHeaders = $header->getDimensions(); $metricHeaders = $header->getMetricHeader()->getMetricHeaderEntries(); $rows = $report->getData()->getRows(); $query_data = array(); $visitor_for_current_date_inserted = 0; for ( $rowIndex = 0; $rowIndex < count($rows); $rowIndex++) { $rep_data = array(); $row = $rows[ $rowIndex ]; $dimensions = $row->getDimensions(); $metrics = $row->getMetrics(); for ($i = 0; $i < count($dimensionHeaders) && $i < count($dimensions); $i++) { if ( $dimensionHeaders[$i] == 'ga:userType' || $dimensionHeaders[$i] == $this->__def_ga_config['connectedUserDimension'] ) { switch ($dimensions[$i]) { case 'New Visitor': $user = 1; break; case 'Returning Visitor': $user = 2; break; case 'Total users': $user = 0; break; default: // 3 means connected users $user = 3; break; } $rep_data['dims'][$dimensionHeaders[$i]] = $user; } else { $rep_data['dims'][$dimensionHeaders[$i]] = ($dimensions[$i]); } // print($dimensionHeaders[$i] . ": " . $dimensions[$i] . "\n"); } for ($j = 0; $j < count($metrics); $j++) { $values = $metrics[$j]->getValues(); for ($k = 0; $k < count($values); $k++) { $entry = $metricHeaders[$k]; $rep_data['mets'][$entry->getName()] = ($values[$k]); // print($entry->getName() . ": " . $values[$k] . "\n"); } } // echo "$category"; // echo var_dump($rep_data).'
'; $this->__db->trans_start(); $ga_queries = array(); $date = $rep_data['dims']['ga:date']; $q = 0; if (isset($rep_data['dims']['ga:userType'])) { $utype = $rep_data['dims']['ga:userType']; } if (isset($rep_data['dims'][$this->__def_ga_config['connectedUserDimension']])) { $utype = $rep_data['dims'][$this->__def_ga_config['connectedUserDimension']]; } switch ($category) { case 'session_pageviews_bouncerate': // insert users report data // $ga_queries[$q++] = "INSERT INTO ga_visitors(vis_rdata, vis_rdate, user_type) VALUES( // {$rep_data['mets']['users']}, // '$date', $utype // ) ON DUPLICATE KEY UPDATE vis_rdata = {$rep_data['mets']['users']}"; // insert sessions report data $query_data[$q] = array( $rep_data['mets']['sessions'], $date, 0, $utype, $rep_data['mets']['sessions'] ); $ga_queries[$q++] = "INSERT IGNORE INTO ga_sessions(sess_rdata, sess_rdate, sess_rtype, user_type) VALUES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE sess_rdata = ?"; // insert sessions duration report data $query_data[$q] = array( $rep_data['mets']['sessionDuration'], $date, 1, $utype, $rep_data['mets']['sessionDuration'] ); $ga_queries[$q++] = "INSERT IGNORE INTO ga_sessions(sess_rdata, sess_rdate, sess_rtype, user_type) VALUES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE sess_rdata = ?"; // pageviews report data $query_data[$q] = array( $rep_data['mets']['pageViews'], $date, 0, $utype, $rep_data['mets']['pageViews'] ); $ga_queries[$q++] = "INSERT IGNORE INTO ga_pageviews(pv_rdata, pv_rdate, pv_rtype, user_type) VALUES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE pv_rdata = ?"; // unique pageviews report data $query_data[$q] = array( $rep_data['mets']['uniquePageviews'], $date, 1, $utype, $rep_data['mets']['uniquePageviews'] ); $ga_queries[$q++] = "INSERT IGNORE INTO ga_pageviews(pv_rdata, pv_rdate, pv_rtype, user_type) VALUES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE pv_rdata = ?"; // insert bounce rate data $query_data[$q] = array( $rep_data['mets']['bounceRate'], $date, $utype, $rep_data['mets']['bounceRate'] ); $ga_queries[$q++] = "INSERT INTO ga_bounce_rate(bcr_rdata, bcr_rdate, user_type) VALUES( ?, ?, ? ) ON DUPLICATE KEY UPDATE bcr_rdata = ?"; break; case 'visitors': // insert visitors report data $query_data[$q] = array( $rep_data['mets']['users'], $date, $utype, $rep_data['dims']['ga:browser'], $rep_data['dims']['ga:deviceCategory'], $rep_data['mets']['users'] ); $ga_queries[$q++] = "INSERT INTO ga_visitors(vis_rdata, vis_rdate, user_type, br_rtype, dv_rtype) VALUES( ?, ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE vis_rdata = ?"; break; case 'connected_users': // for connected users // insert sessions data $query_data[$q] = array( $rep_data['mets']['sessions'], $date, 0, $utype, $rep_data['mets']['sessions'], ); $ga_queries[$q++] = "INSERT IGNORE INTO ga_sessions(sess_rdata, sess_rdate, sess_rtype, user_type) VALUES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE sess_rdata = ?"; // insert sessions duration report data $query_data[$q] = array( $rep_data['mets']['sessionDuration'], $date, 1, $utype, $rep_data['mets']['sessionDuration'] ); $ga_queries[$q++] = "INSERT IGNORE INTO ga_sessions(sess_rdata, sess_rdate, sess_rtype, user_type) VALUES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE sess_rdata = ?"; // pageviews report data $query_data[$q] = array( $rep_data['mets']['pageViews'], $date, 0, $utype, $rep_data['mets']['pageViews'] ); $ga_queries[$q++] = "INSERT IGNORE INTO ga_pageviews(pv_rdata, pv_rdate, pv_rtype, user_type) VALUES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE pv_rdata = ?"; // unique pageviews report data $query_data[$q] = array( $rep_data['mets']['uniquePageviews'], $date, 1, $utype, $rep_data['mets']['uniquePageviews'] ); $ga_queries[$q++] = "INSERT IGNORE INTO ga_pageviews(pv_rdata, pv_rdate, pv_rtype, user_type) VALUES( ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE pv_rdata = ?"; // insert bounce rate data $query_data[$q] = array( $rep_data['mets']['bounceRate'], $date, $utype, $rep_data['mets']['bounceRate'] ); $ga_queries[$q++] = "INSERT INTO ga_bounce_rate(bcr_rdata, bcr_rdate, user_type) VALUES( ?, ?, ? ) ON DUPLICATE KEY UPDATE bcr_rdata = ?"; break; case 'events': // insert visitors report data $insert_data = true; if ( ($rep_data['dims']['ga:eventCategory'] == 'fo_filter' && ( !is_numeric($rep_data['dims']['ga:eventAction']) || !in_array($rep_data['dims']['ga:eventLabel'], array('filter-city', 'filter-type', 'filter-month')) )) ) { $insert_data = false; } if ( ($rep_data['dims']['ga:eventCategory'] == 'event_page_views' && ( !is_numeric($rep_data['dims']['ga:eventLabel']) || !in_array($rep_data['dims']['ga:eventAction'], array('Connected' // , 'Returning', 'New' )) || empty($rep_data['dims']['ga:eventLabel']) )) ) { $insert_data = false; } if ($insert_data) { if ( $rep_data['dims']['ga:eventCategory'] == 'EventPageview' || $rep_data['dims']['ga:eventCategory'] == 'event_page_views' ) { switch ($rep_data['dims']['ga:eventAction']) { case 'Connected': $utype = 3; break; // case 'New': // $ut = 1; // break; // case 'Returning': // $ut = 2; // break; // case 'Total': // $ut = 0; // break; default: // 3 means connected users // $ut = 3; break; } $rep_data['dims']['ga:eventLabel'] = str_replace('Event ID : (','',$rep_data['dims']['ga:eventLabel']); $rep_data['dims']['ga:eventLabel'] = (int)(str_replace(')','',$rep_data['dims']['ga:eventLabel'])); $query_data[$q] = array( $rep_data['mets']['totalEvents'], $rep_data['dims']['ga:eventLabel'], $date, 0, $utype, $rep_data['mets']['totalEvents'], ); $ga_queries[$q++] = "INSERT INTO ga_events_view(ev_rdata, ev_eventid, ev_rdate, ev_rtype, user_type) VALUES( ?, ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE ev_rdata = ?"; } else { $query_data[$q] = array( $rep_data['mets']['totalEvents'], $rep_data['dims']['ga:eventAction'], $rep_data['dims']['ga:eventLabel'], $rep_data['dims']['ga:eventCategory'], $date, $utype, $rep_data['mets']['totalEvents'] ); $ga_queries[$q++] = "INSERT INTO ga_events(gev_rdata, gev_raction, gev_rdatalabel, gev_rcategory ,gev_rdate, user_type) VALUES( ?, ?, ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE gev_rdata = ?"; } } break; case 'sources': // insert visitors report data $query_data[$q] = array( $rep_data['mets']['ga:visits'], $rep_data['dims']['ga:source'], $rep_data['dims']['ga:sourceMedium'], $rep_data['dims']['ga:channelGrouping'], $date, $rep_data['mets']['ga:visits'] ); $ga_queries[$q++] = "INSERT INTO ga_source_mediums(gsm_rdata, gsm_rsource, gsm_rsourcem, gsm_rchannelgroup, gsm_rdate) VALUES( ?, ?, ?, ?, ? ) ON DUPLICATE KEY UPDATE gsm_rdata = ?"; break; default: // code... break; } foreach ($ga_queries as $key => $value) { $successful = $this->__db->query($value, $query_data[$key]); if (!$successful) { // $this->__db->rollback(); // return false; } } $this->__db->trans_complete(); } } } public function getStoreConnectedUsers($start = '', $end ='') { $start = $this->set_ga_date($start); $end = $this->set_ga_date($end); $this->__db->trans_start(); $query = "INSERT IGNORE INTO ga_visitors(vis_rdata, br_rtype, dv_rtype, vis_rdate, user_type) SELECT COUNT(DISTINCT CASE WHEN ul.user_id IS NULL THEN 0 ELSE ul.user_id END) AS vis_rdata, (CASE WHEN ul.user_agent IS NULL THEN 'Others' -- REGEXP_REPLACE is only available in mysql version 8, upgrading mysql version is advisable before using this function on preprod or prod -- ELSE trim(REGEXP_REPLACE(ul.user_agent,'[0-9.]+','')) ELSE ul.user_agent END) AS br_rtype, (CASE WHEN ul.device IS NULL THEN 'Others' ELSE ul.device END) AS dv_rtype , DATE_FORMAT(ul.date_time, '%Y-%m-%d') vis_rdate, 3 FROM user_login_history ul INNER JOIN user u USING(user_id) WHERE ul.description = 'LOGIN' AND u.role_id = 3 AND DATE_FORMAT(ul.date_time, '%Y-%m-%d') >= '$start' AND DATE_FORMAT(ul.date_time, '%Y-%m-%d') <= '$end' GROUP BY DATE_FORMAT(ul.date_time, '%Y-%m-%d'), ul.user_agent, ul.device ON DUPLICATE KEY UPDATE vis_rdata = vis_rdata"; if ($this->__db->query($query)) { $this->__db->trans_complete(); } $this->setMissingUserTypeValueToZero(); } private function setMissingUserTypeValueToZero() { $user_types = array( // "all" => 0, "new" => 1, "known" => 2, //or returning, old "connected" => 3 ); $queries = array(); $q = 0; // prepare queries for each user type foreach ($user_types as $key => $utype) { // visitors $queries[$q++] = "INSERT IGNORE INTO ga_visitors(vis_rdate, vis_rdata, br_rtype, dv_rtype, user_type) SELECT DISTINCT vis_rdate, 0, 'UNDEFINED', 'UNDEFINED', $utype FROM ga_visitors gv WHERE vis_rdate NOT IN ( SELECT vis_rdate FROM ga_visitors WHERE user_type = $utype AND vis_rdata > 0 ) ON DUPLICATE KEY UPDATE vis_rdata = 0"; // sessions $queries[$q++] = "INSERT IGNORE INTO ga_sessions(sess_rdate, sess_rdata, sess_rtype, user_type) SELECT DISTINCT sess_rdate, 0, 0, $utype FROM ga_sessions WHERE sess_rdate NOT IN ( SELECT sess_rdate FROM ga_sessions WHERE user_type = $utype AND sess_rdata > 0 ) ON DUPLICATE KEY UPDATE sess_rdata = 0"; // sessions duration $queries[$q++] = "INSERT IGNORE INTO ga_sessions(sess_rdate, sess_rdata, sess_rtype, user_type) SELECT DISTINCT sess_rdate, 0, 1, $utype FROM ga_sessions WHERE sess_rdate NOT IN ( SELECT sess_rdate FROM ga_sessions WHERE user_type = $utype AND sess_rdata > 0 ) ON DUPLICATE KEY UPDATE sess_rdata = 0"; // pageviews $queries[$q++] = "INSERT IGNORE INTO ga_pageviews(pv_rdate, pv_rdata, pv_rtype, user_type) SELECT DISTINCT pv_rdate, 0, 0, $utype FROM ga_pageviews WHERE pv_rdate NOT IN ( SELECT pv_rdate FROM ga_pageviews WHERE user_type = $utype AND pv_rdata > 0 ) ON DUPLICATE KEY UPDATE pv_rdata = 0"; // unique pageviews $queries[$q++] = "INSERT IGNORE INTO ga_pageviews(pv_rdate, pv_rdata, pv_rtype, user_type) SELECT DISTINCT pv_rdate, 0, 1, $utype FROM ga_pageviews WHERE pv_rdate NOT IN ( SELECT pv_rdate FROM ga_pageviews WHERE user_type = $utype AND pv_rdata > 0 ) ON DUPLICATE KEY UPDATE pv_rdata = 0"; // event views $queries[$q++] = "INSERT IGNORE INTO ga_events_view(ev_rdate, ev_rdata, ev_rtype, user_type, ev_eventid) SELECT DISTINCT ev_rdate, 0, 0, $utype, 0 FROM ga_events_view WHERE ev_rdate NOT IN ( SELECT ev_rdate FROM ga_events_view WHERE user_type = $utype AND ev_rdata > 0 ) ON DUPLICATE KEY UPDATE ev_rdata = 0"; // bounce rate $queries[$q++] = "INSERT IGNORE INTO ga_bounce_rate(bcr_rdate, bcr_rdata, user_type) SELECT DISTINCT bcr_rdate, 0, $utype FROM ga_bounce_rate WHERE bcr_rdate NOT IN ( SELECT bcr_rdate FROM ga_bounce_rate WHERE user_type = $utype AND bcr_rdata > 0 ) ON DUPLICATE KEY UPDATE bcr_rdata = 0"; } // execute the queries $this->__db->trans_start(); foreach ($queries as $key => $query) { $this->__db->query($query); if (!$this->__db->query($query)) { $this->__db->rollback(); break; } } $this->__db->trans_complete(); } private function printResults($reports) { echo var_dump($reports); for ( $reportIndex = 0; $reportIndex < count( $reports ); $reportIndex++ ) { $report = $reports[ $reportIndex ]; $header = $report->getColumnHeader(); $dimensionHeaders = $header->getDimensions(); $metricHeaders = $header->getMetricHeader()->getMetricHeaderEntries(); $rows = $report->getData()->getRows(); for ( $rowIndex = 0; $rowIndex < count($rows); $rowIndex++) { $row = $rows[ $rowIndex ]; $dimensions = $row->getDimensions(); $metrics = $row->getMetrics(); for ($i = 0; $i < count($dimensionHeaders) && $i < count($dimensions); $i++) { print($dimensionHeaders[$i] . ": " . $dimensions[$i] . "
"); } for ($j = 0; $j < count($metrics); $j++) { $values = $metrics[$j]->getValues(); for ($k = 0; $k < count($values); $k++) { $entry = $metricHeaders[$k]; print($entry->getName() . ": " . $values[$k] . "
"); } } } } } } ?>