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] . "
");
}
}
}
}
}
}
?>