1946 lines
73 KiB
PHP
1946 lines
73 KiB
PHP
<?php
|
|
class Crunchbutton_Chart_User extends Crunchbutton_Chart {
|
|
|
|
public $unit = 'users';
|
|
public $description = 'Users';
|
|
|
|
public $groups = array(
|
|
|
|
'group-new-users' => array(
|
|
'title' => 'New Users',
|
|
'tags' => array( 'main' ),
|
|
'charts' => array(
|
|
'users-new-per-day' => array( 'title' => 'Day', 'interval' => 'day', 'type' => 'column', 'method' => 'newByDay', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'newByDayByCommunityGrouped' ), array( 'title' => 'Cohort', 'type' => 'cohort', 'method' => 'newByDayCohort' ) ) ),
|
|
'users-new-per-week' => array( 'title' => 'Week', 'interval' => 'week', 'type' => 'column', 'method' => 'newByWeek', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'newByWeekByCommunityGrouped' ), array( 'title' => 'Cohort', 'type' => 'cohort', 'method' => 'newByWeekCohort' ) ), 'default' => true ),
|
|
'users-new-per-month' => array( 'title' => 'Month', 'interval' => 'month', 'type' => 'column', 'method' => 'newByMonth', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'newByMonthByCommunityGrouped' ), array( 'title' => 'Cohort', 'type' => 'cohort', 'method' => 'newByMonthCohort' ) ) ),
|
|
)
|
|
),
|
|
'group-historical-new-users' => array(
|
|
'title' => 'New + Unchurned Users',
|
|
'tags' => array( 'detailed-analytics' ),
|
|
'charts' => array(
|
|
'users-new-per-day-historical' => array( 'title' => 'Day', 'interval' => 'day', 'type' => 'column', 'method' => 'newByDayHistorical' ),
|
|
'users-new-per-week-historical' => array( 'title' => 'Week', 'interval' => 'week', 'type' => 'column', 'method' => 'newByWeekHistorical' ),
|
|
'users-new-per-month-historical' => array( 'title' => 'Month', 'interval' => 'month', 'type' => 'column', 'method' => 'newByMonthHistorical' ),
|
|
)
|
|
),
|
|
'group-new-users-community' => array(
|
|
'title' => 'New Users',
|
|
'tags' => array( 'reps' ),
|
|
'charts' => array(
|
|
'users-new-per-day-by-community' => array( 'title' => 'Day', 'interval' => 'day', 'type' => 'column-community', 'method' => 'newByDayByCommunity' ),
|
|
'users-new-per-week-by-community' => array( 'title' => 'Week', 'interval' => 'week', 'type' => 'column-community', 'method' => 'newByWeekByCommunity', 'default' => true ),
|
|
'users-new-per-month-by-community' => array( 'title' => 'Month', 'interval' => 'month', 'type' => 'column-community', 'method' => 'newByMonthByCommunity' ),
|
|
)
|
|
),
|
|
'group-new-users-restaurant' => array(
|
|
'title' => 'New Users',
|
|
'tags' => array( 'reps' ),
|
|
'charts' => array(
|
|
'users-new-per-day-by-restaurant' => array( 'title' => 'Day', 'interval' => 'day', 'type' => 'column-restaurant', 'method' => 'newByDayByRestaurant' ),
|
|
'users-new-per-week-by-restaurant' => array( 'title' => 'Week', 'interval' => 'week', 'type' => 'column-restaurant', 'method' => 'newByWeekByRestaurant', 'default' => true ),
|
|
'users-new-per-month-by-restaurant' => array( 'title' => 'Month', 'interval' => 'month', 'type' => 'column-restaurant', 'method' => 'newByMonthByRestaurant' ),
|
|
)
|
|
),
|
|
'group-users-repeat-community' => array(
|
|
'title' => 'Repeat Orders',
|
|
'tags' => array( 'reps' ),
|
|
'charts' => array(
|
|
'orders-repeat-day-by-community' => array( 'title' => 'Day', 'interval' => 'day', 'type' => 'column-community', 'method' => 'repeatPerDayByCommunity' ),
|
|
'orders-repeat-week-by-community' => array( 'title' => 'Week', 'interval' => 'week', 'type' => 'column-community', 'method' => 'repeatPerWeekByCommunity', 'default' => true ),
|
|
'orders-repeat-month-by-community' => array( 'title' => 'Month', 'interval' => 'month', 'type' => 'column-community', 'method' => 'repeatPerMonthByCommunity' ),
|
|
)
|
|
),
|
|
'group-users-repeat-restaurant' => array(
|
|
'title' => 'Repeat Orders',
|
|
'tags' => array( 'reps' ),
|
|
'charts' => array(
|
|
'orders-repeat-day-by-restaurant' => array( 'title' => 'Day', 'interval' => 'day', 'type' => 'column-restaurant', 'method' => 'repeatPerDayByRestaurant' ),
|
|
'orders-repeat-week-by-restaurant' => array( 'title' => 'Week', 'interval' => 'week', 'type' => 'column-restaurant', 'method' => 'repeatPerWeekByRestaurant', 'default' => true ),
|
|
'orders-repeat-month-by-restaurant' => array( 'title' => 'Month', 'interval' => 'month', 'type' => 'column-restaurant', 'method' => 'repeatPerMonthByRestaurant' ),
|
|
)
|
|
),
|
|
'group-users-repeat' => array(
|
|
'title' => 'Repeat Orders',
|
|
'tags' => array( 'main' ),
|
|
'charts' => array(
|
|
'orders-repeat-day' => array( 'title' => 'Day', 'interval' => 'day', 'type' => 'column', 'method' => 'repeatPerDay', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'repeatPerDayByCommunityGrouped' ) ) ),
|
|
'orders-repeat-week' => array( 'title' => 'Week', 'interval' => 'week', 'type' => 'column', 'method' => 'repeatPerWeek', 'default' => true, 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'repeatPerWeekByCommunityGrouped' ) ) ),
|
|
'orders-repeat-month' => array( 'title' => 'Month', 'interval' => 'month', 'type' => 'column', 'method' => 'repeatPerMonth', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'repeatPerMonthByCommunityGrouped' ) ) ),
|
|
)
|
|
),
|
|
'group-users-reclaimed' => array(
|
|
'tags' => array( 'detailed-analytics' ),
|
|
'title' => 'Reclaimed Users',
|
|
'charts' => array(
|
|
'users-reclaimed-per-day' => array( 'title' => 'Day', 'interval' => 'day', 'type' => 'column', 'method' => 'reclaimedByDay' ),
|
|
'users-reclaimed-per-week' => array( 'title' => 'Week', 'interval' => 'week', 'type' => 'column', 'method' => 'reclaimedByWeek' ),
|
|
'users-reclaimed-per-month' => array( 'title' => 'Month', 'interval' => 'month', 'type' => 'column', 'method' => 'reclaimedByMonth' ),
|
|
)
|
|
),
|
|
|
|
'group-users-track-frequece' => array(
|
|
'title' => 'Track User Frequency',
|
|
'tags' => array( 'detailed-analytics' ),
|
|
'charts' => array(
|
|
'users-track-frequece' => array( 'title' => 'Users', 'interval' => 'week', 'type' => 'area', 'method' => 'trackFrequence' ),
|
|
)
|
|
),
|
|
|
|
'group-new-users-per-active-user' => array(
|
|
'title' => 'New Users per Active Users',
|
|
'tags' => array( 'main' ),
|
|
'charts' => array(
|
|
'users-new-per-active-users-per-day' => array( 'title' => 'Day', 'interval' => 'day', 'type' => 'column', 'method' => 'newPerActiveByDay' ),
|
|
'users-new-per-active-users-per-week' => array( 'title' => 'Week', 'interval' => 'week', 'type' => 'column', 'method' => 'newPerActiveByWeek', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'newPerActiveByWeekByCommunity' ) ), 'default' => true ),
|
|
'users-new-per-active-users-per-month' => array( 'title' => 'Month', 'interval' => 'month', 'type' => 'column', 'method' => 'newPerActiveByMonth', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'newPerActiveByMonthByCommunity' ) ) )
|
|
)
|
|
),
|
|
|
|
'group-unique-users' => array(
|
|
'title' => 'Unique Users',
|
|
'charts' => array(
|
|
'users-unique-per-day' => array( 'title' => 'Day', 'interval' => 'day', 'type' => 'column', 'method' => 'uniqueByDay', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'uniqueByDayByCommunity' ) ) ),
|
|
'users-unique-per-week' => array( 'title' => 'Week', 'interval' => 'week', 'type' => 'column', 'method' => 'uniqueByWeek', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'uniqueByWeekByCommunity' ) ) ),
|
|
'users-unique-per-month' => array( 'title' => 'Month', 'interval' => 'month', 'type' => 'column', 'method' => 'uniqueByMonth', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'uniqueByMonthByCommunity' ) ) ),
|
|
)
|
|
),
|
|
|
|
'group-active-users' => array(
|
|
'title' => 'Active Users',
|
|
'tags' => array( 'investors' ),
|
|
'charts' => array(
|
|
'users-active-per-day' => array( 'title' => 'Day', 'type' => 'column', 'interval' => 'day', 'method' => 'activeByDay', 'filters' => array( array( 'title' => 'Cohort', 'type' => 'cohort', 'method' => 'activeByDayCohort' ) ) ),
|
|
'users-active-per-week' => array( 'title' => 'Week', 'type' => 'column', 'interval' => 'week', 'method' => 'activeByWeek', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'activeByWeekByCommunity' ), array( 'title' => 'Cohort', 'type' => 'cohort', 'method' => 'activeByWeekCohort' ) ) ),
|
|
'users-active-per-month' => array( 'title' => 'Month', 'type' => 'column', 'interval' => 'month', 'method' => 'activeByMonth', 'filters' => array( array( 'title' => 'Community', 'type' => 'community', 'method' => 'activeByMonthByCommunity' ), array( 'title' => 'Cohort', 'type' => 'cohort', 'method' => 'activeByMonthCohort' ) ) ),
|
|
)
|
|
),
|
|
);
|
|
|
|
public function __construct() {
|
|
parent::__construct();
|
|
}
|
|
|
|
public function activeHistoricalByDay( $render = false ){
|
|
|
|
$query = [];
|
|
|
|
$allMonths = $this->allDays();
|
|
|
|
$now = time();
|
|
|
|
for( $i = $this->from_day -1 ; $i < $this->to_day; $i++ ){
|
|
$day = $allMonths[ $i ];
|
|
|
|
$days = floor( ( $now - strtotime( $day ) ) / ( 60 * 60 * 24 ) ) + $this->activeUsersInterval;
|
|
|
|
$query[] = "SELECT '{$day}' AS Day,
|
|
COUNT(*) AS Total FROM
|
|
( SELECT DISTINCT( o.phone ) FROM `order` o WHERE o.date <= '{$day}' ) a,
|
|
( SELECT DISTINCT( o.phone ) FROM `order` o WHERE o.date >= NOW() - INTERVAL $days DAY ) b
|
|
WHERE a.phone = b.phone";
|
|
}
|
|
|
|
$parsedData = $this->parseDataDaysSimple( join( ' UNION ', $query ), $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function activeByDay( $render = false ){
|
|
|
|
$query = [];
|
|
|
|
$allMonths = $this->allDays();
|
|
|
|
for( $i = $this->from_day -1 ; $i < $this->to_day; $i++ ){
|
|
$day = $allMonths[ $i ];
|
|
$query[] = "SELECT '{$day}' AS Day,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT o.phone,
|
|
o.date,
|
|
o.id_user
|
|
FROM `order` o
|
|
WHERE o.date <= '{$day}'
|
|
AND o.date >= '{$day}' - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY o.phone ) ActiveUsers";
|
|
}
|
|
|
|
$parsedData = $this->parseDataDaysSimple( join( ' UNION ', $query ), $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function activeByDayCohort( $render = false ){
|
|
$id_chart_cohort = $_GET[ 'id_chart_cohort' ];
|
|
$cohort_type = $_GET[ 'cohort_type' ];
|
|
|
|
switch ( $cohort_type ) {
|
|
case 'cohort':
|
|
$allWeeks = $this->allWeeks();
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$id_chart_cohort = $_GET[ 'id_chart_cohort' ];
|
|
$cohort_type = $_GET[ 'cohort_type' ];
|
|
|
|
$cohort = Crunchbutton_Chart_Cohort::get( $id_chart_cohort, $cohort_type );
|
|
|
|
$cohortQuery = $cohort->toQuery();
|
|
|
|
$allDays = $this->allDays();
|
|
|
|
for( $i = $this->from_day -1 ; $i < $this->to_day; $i++ ){
|
|
$day = $allDays[ $i ];
|
|
$query .= $union . "SELECT '{$day}' AS Day,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
c.name
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE o.date <= '{$day}'
|
|
AND o.date >= '{$day}' - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
{$this->queryOnlyCommunties}
|
|
{$cohortQuery}
|
|
GROUP BY u.phone ) ActiveUsers";
|
|
$union = ' UNION ';
|
|
}
|
|
break;
|
|
|
|
case 'months':
|
|
|
|
$month_cohort = $id_chart_cohort;
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$allDays = $this->allDays();
|
|
|
|
for( $i = $this->from_day -1 ; $i < $this->to_day; $i++ ){
|
|
$day = $allDays[ $i ];
|
|
|
|
$query .= $union . "SELECT '{$day}' AS Day,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
c.name
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE o.date <= '{$day}'
|
|
AND o.date >= '{$day}' - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
{$this->queryOnlyCommunties}
|
|
AND o.date >= '{$month_cohort}-01'
|
|
AND o.phone IN( SELECT o.phone
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
o.phone
|
|
FROM `order` o
|
|
GROUP BY o.phone) orders ON o.id_order = orders.id_order
|
|
AND DATE_FORMAT(o.date ,'%Y-%m') = '{$month_cohort}' )
|
|
GROUP BY u.phone ) ActiveUsers";
|
|
$union = ' UNION ';
|
|
}
|
|
break;
|
|
|
|
case 'giftcard':
|
|
|
|
$giftcard_group = $id_chart_cohort;
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$allDays = $this->allDays();
|
|
|
|
for( $i = $this->from_day -1 ; $i < $this->to_day; $i++ ){
|
|
$day = $allDays[ $i ];
|
|
|
|
$query .= $union . "SELECT '{$day}' AS Day,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
c.name
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE o.date <= '{$day}'
|
|
AND o.date >= '{$day}' - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
{$this->queryOnlyCommunties}
|
|
AND o.phone IN ( SELECT DISTINCT( u.phone ) FROM credit c
|
|
INNER JOIN promo_group_promo pg ON pg.id_promo_group = {$giftcard_group} AND pg.id_promo = c.id_promo
|
|
INNER JOIN user u ON u.id_user = c.id_user )
|
|
GROUP BY u.phone ) ActiveUsers";
|
|
$union = ' UNION ';
|
|
}
|
|
break;
|
|
}
|
|
|
|
$parsedData = $this->parseDataDaysSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function activeByMonth( $render = false ){
|
|
|
|
$query = [];
|
|
|
|
$allMonths = $this->allMonths();
|
|
for( $i = $this->from_month -1 ; $i < $this->to_month; $i++ ){
|
|
$month = $allMonths[ $i ];
|
|
$query[] = "SELECT '{$month}' AS Month,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT o.phone,
|
|
o.date,
|
|
o.id_user
|
|
FROM `order` o
|
|
WHERE o.date <= LAST_DAY( STR_TO_DATE( '{$month}', '%Y-%m' ) )
|
|
AND o.date >= '{$month}-01' - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY o.phone ) ActiveUsers";
|
|
}
|
|
|
|
$parsedData = $this->parseDataMonthSimple( join( ' UNION ', $query ), $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function activeByMonthCohort( $render = false ){
|
|
|
|
$id_chart_cohort = $_GET[ 'id_chart_cohort' ];
|
|
$cohort_type = $_GET[ 'cohort_type' ];
|
|
|
|
switch ( $cohort_type ) {
|
|
case 'cohort':
|
|
$cohort = Crunchbutton_Chart_Cohort::get( $id_chart_cohort, $cohort_type );
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$cohortQuery = $cohort->toQuery();
|
|
|
|
$allMonths = $this->allMonths();
|
|
|
|
for( $i = $this->from_month -1 ; $i < $this->to_month; $i++ ){
|
|
$month = $allMonths[ $i ];
|
|
$query .= $union . "SELECT '{$month}' AS Month,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
c.name
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE o.date <= LAST_DAY( STR_TO_DATE( '{$month}', '%Y-%m' ) )
|
|
AND o.date >= '{$month}-01' - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
{$this->queryOnlyCommunties}
|
|
{$cohortQuery}
|
|
GROUP BY u.phone ) ActiveUsers";
|
|
|
|
$union = ' UNION ';
|
|
}
|
|
break;
|
|
|
|
case 'months':
|
|
|
|
$month_cohort = $id_chart_cohort;
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$allMonths = $this->allMonths();
|
|
|
|
for( $i = $this->from_month -1 ; $i < $this->to_month; $i++ ){
|
|
$month = $allMonths[ $i ];
|
|
$query .= $union . "SELECT '{$month}' AS Month,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
c.name
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE o.date <= LAST_DAY( STR_TO_DATE( '{$month}', '%Y-%m' ) )
|
|
AND o.date >= '{$month}-01' - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
{$this->queryOnlyCommunties}
|
|
AND o.date >= '{$month_cohort}-01'
|
|
AND o.phone IN( SELECT o.phone
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
o.phone
|
|
FROM `order` o
|
|
GROUP BY o.phone) orders ON o.id_order = orders.id_order
|
|
AND DATE_FORMAT(o.date ,'%Y-%m') = '{$month_cohort}' )
|
|
GROUP BY u.phone ) ActiveUsers";
|
|
$union = ' UNION ';
|
|
}
|
|
break;
|
|
|
|
case 'giftcard':
|
|
|
|
$giftcard_group = $id_chart_cohort;
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$allMonths = $this->allMonths();
|
|
|
|
for( $i = $this->from_month -1 ; $i < $this->to_month; $i++ ){
|
|
$month = $allMonths[ $i ];
|
|
$query .= $union . "SELECT '{$month}' AS Month,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
c.name
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE o.date <= LAST_DAY( STR_TO_DATE( '{$month}', '%Y-%m' ) )
|
|
AND o.date >= '{$month}-01' - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
{$this->queryOnlyCommunties}
|
|
AND o.phone IN ( SELECT DISTINCT( u.phone ) FROM credit c
|
|
INNER JOIN promo_group_promo pg ON pg.id_promo_group = {$giftcard_group} AND pg.id_promo = c.id_promo
|
|
INNER JOIN user u ON u.id_user = c.id_user )
|
|
GROUP BY u.phone ) ActiveUsers";
|
|
$union = ' UNION ';
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
$parsedData = $this->parseDataMonthSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function reclaimedByDay( $render = false ){
|
|
|
|
$query = "SELECT day AS Day,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
(SELECT last.total AS total,
|
|
lastbutone.id_order AS id_order_last_but_one,
|
|
lastbutone.date AS date_last_but_one,
|
|
last.id_order AS id_order_last,
|
|
last.date AS date_last,
|
|
lastbutone.phone AS phone,
|
|
DATE_FORMAT(last.date ,'%Y-%m-%d') AS day,
|
|
DATEDIFF(last.date, lastbutone.date) AS days
|
|
FROM
|
|
(SELECT *
|
|
FROM
|
|
(SELECT count(*) AS total,
|
|
max(orders.id_order) AS id_order,
|
|
max(orders.date) AS date,
|
|
orders.phone
|
|
FROM
|
|
(SELECT o.id_order,
|
|
o.date, o.phone
|
|
FROM `order` o) orders
|
|
GROUP BY phone HAVING total > 1) orders) last
|
|
INNER JOIN
|
|
(SELECT o.id_order,
|
|
o.phone,
|
|
o.date
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT MAX(o.id_order) AS id_order ,
|
|
o.phone,
|
|
o.date
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT id_order,
|
|
phone
|
|
FROM
|
|
(SELECT count(*) AS total,
|
|
max(id_order) AS id_order,
|
|
phone
|
|
FROM `order`
|
|
GROUP BY phone HAVING total > 1) orders) last ON last.phone = o.phone
|
|
AND last.id_order > o.id_order
|
|
GROUP BY phone) lastbutone ON lastbutone.id_order = o.id_order) lastbutone ON last.phone = lastbutone.phone) orders
|
|
WHERE days >= {$this->activeUsersInterval}
|
|
AND day BETWEEN '{$this->dayFrom}' AND '{$this->dayTo}'
|
|
GROUP BY day";
|
|
|
|
$parsedData = $this->parseDataDaysSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function reclaimedByMonth( $render = false ){
|
|
|
|
$query = "SELECT month AS Month,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
(SELECT last.total AS total,
|
|
lastbutone.id_order AS id_order_last_but_one,
|
|
lastbutone.date AS date_last_but_one,
|
|
last.id_order AS id_order_last,
|
|
last.date AS date_last,
|
|
lastbutone.phone AS phone,
|
|
DATE_FORMAT( last.date ,'%Y-%m') AS month,
|
|
DATEDIFF(last.date, lastbutone.date) AS days
|
|
FROM
|
|
(SELECT *
|
|
FROM
|
|
(SELECT count(*) AS total,
|
|
max(orders.id_order) AS id_order,
|
|
max(orders.date) AS date,
|
|
orders.phone
|
|
FROM
|
|
(SELECT o.id_order,
|
|
o.date, o.phone
|
|
FROM `order` o) orders
|
|
GROUP BY phone HAVING total > 1) orders) last
|
|
INNER JOIN
|
|
(SELECT o.id_order,
|
|
o.phone,
|
|
o.date
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT MAX(o.id_order) AS id_order ,
|
|
o.phone,
|
|
o.date
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT id_order,
|
|
phone
|
|
FROM
|
|
(SELECT count(*) AS total,
|
|
max(id_order) AS id_order,
|
|
phone
|
|
FROM `order`
|
|
GROUP BY phone HAVING total > 1) orders) last ON last.phone = o.phone
|
|
AND last.id_order > o.id_order
|
|
GROUP BY phone) lastbutone ON lastbutone.id_order = o.id_order) lastbutone ON last.phone = lastbutone.phone) orders
|
|
WHERE days >= {$this->activeUsersInterval}
|
|
AND month BETWEEN '{$this->monthFrom}' AND '{$this->monthTo}'
|
|
GROUP BY month";
|
|
|
|
$parsedData = $this->parseDataMonthSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function reclaimedByWeek( $render = false ){
|
|
|
|
$query = "SELECT yearweek AS Week,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
(SELECT last.total AS total,
|
|
lastbutone.id_order AS id_order_last_but_one,
|
|
lastbutone.date AS date_last_but_one,
|
|
last.id_order AS id_order_last,
|
|
last.date AS date_last,
|
|
lastbutone.phone AS phone,
|
|
YEARWEEK(last.date) AS yearweek,
|
|
DATEDIFF(last.date, lastbutone.date) AS days
|
|
FROM
|
|
(SELECT *
|
|
FROM
|
|
(SELECT count(*) AS total,
|
|
max(orders.id_order) AS id_order,
|
|
max(orders.date) AS date,
|
|
orders.phone
|
|
FROM
|
|
(SELECT o.id_order,
|
|
o.date, o.phone
|
|
FROM `order` o) orders
|
|
GROUP BY phone HAVING total > 1) orders) last
|
|
INNER JOIN
|
|
(SELECT o.id_order,
|
|
o.phone,
|
|
o.date
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT MAX(o.id_order) AS id_order ,
|
|
o.phone,
|
|
o.date
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT id_order,
|
|
phone
|
|
FROM
|
|
(SELECT count(*) AS total,
|
|
max(id_order) AS id_order,
|
|
phone
|
|
FROM `order`
|
|
GROUP BY phone HAVING total > 1) orders) last ON last.phone = o.phone
|
|
AND last.id_order > o.id_order
|
|
GROUP BY phone) lastbutone ON lastbutone.id_order = o.id_order) lastbutone ON last.phone = lastbutone.phone) orders
|
|
WHERE days >= {$this->activeUsersInterval}
|
|
AND yearweek >= {$this->weekFrom}
|
|
AND yearweek <= {$this->weekTo}
|
|
GROUP BY yearweek";
|
|
|
|
$parsedData = $this->parseDataWeeksSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function activeByWeek( $render = false ){
|
|
|
|
$allWeeks = $this->allWeeks();
|
|
|
|
$query = [];
|
|
for( $i = $this->from -1 ; $i < $this->to; $i++ ){
|
|
$week = $allWeeks[ $i ];
|
|
|
|
$query[] = "SELECT '{$week}' AS Week,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT o.phone,
|
|
o.date,
|
|
o.id_user
|
|
FROM `order` o
|
|
WHERE o.date <= STR_TO_DATE('{$week} Saturday', '%X%V %W')
|
|
AND o.date >= STR_TO_DATE('{$week} Saturday', '%X%V %W') - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY o.phone) ActiveUsers";
|
|
}
|
|
|
|
$parsedData = $this->parseDataWeeksSimple( join( ' UNION ', $query ), $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function activeByWeekCohort( $render = false ){
|
|
|
|
$id_chart_cohort = $_GET[ 'id_chart_cohort' ];
|
|
$cohort_type = $_GET[ 'cohort_type' ];
|
|
|
|
switch ( $cohort_type ) {
|
|
case 'cohort':
|
|
$allWeeks = $this->allWeeks();
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$id_chart_cohort = $_GET[ 'id_chart_cohort' ];
|
|
$cohort_type = $_GET[ 'cohort_type' ];
|
|
|
|
$cohort = Crunchbutton_Chart_Cohort::get( $id_chart_cohort, $cohort_type );
|
|
|
|
$cohortQuery = $cohort->toQuery();
|
|
|
|
for( $i = $this->from -1 ; $i < $this->to; $i++ ){
|
|
$week = $allWeeks[ $i ];
|
|
|
|
$query .= $union . "SELECT '{$week}' AS Week,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
c.name
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE o.date <= STR_TO_DATE('{$week} Saturday', '%X%V %W')
|
|
AND o.date >= STR_TO_DATE('{$week} Saturday', '%X%V %W') - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
{$cohortQuery}
|
|
GROUP BY u.phone) ActiveUsers";
|
|
$union = ' UNION ';
|
|
}
|
|
break;
|
|
|
|
case 'months':
|
|
|
|
$month_cohort = $id_chart_cohort;
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$allWeeks = $this->allWeeks();
|
|
|
|
for( $i = $this->from -1 ; $i < $this->to; $i++ ){
|
|
$week = $allWeeks[ $i ];
|
|
|
|
$query .= $union . "SELECT '{$week}' AS Week,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
c.name
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE o.date <= STR_TO_DATE('{$week} Saturday', '%X%V %W')
|
|
AND o.date >= STR_TO_DATE('{$week} Saturday', '%X%V %W') - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
AND o.date >= '{$month_cohort}-01'
|
|
AND o.phone IN( SELECT o.phone
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
o.phone
|
|
FROM `order` o
|
|
GROUP BY o.phone) orders ON o.id_order = orders.id_order
|
|
AND DATE_FORMAT(o.date ,'%Y-%m') = '{$month_cohort}' )
|
|
GROUP BY u.phone) ActiveUsers";
|
|
$union = ' UNION ';
|
|
}
|
|
break;
|
|
|
|
case 'giftcard':
|
|
|
|
$giftcard_group = $id_chart_cohort;
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$allWeeks = $this->allWeeks();
|
|
|
|
for( $i = $this->from -1 ; $i < $this->to; $i++ ){
|
|
$week = $allWeeks[ $i ];
|
|
|
|
$query .= $union . "SELECT '{$week}' AS Week,
|
|
COUNT(*) AS Total
|
|
FROM
|
|
( SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
c.name
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE o.date <= STR_TO_DATE('{$week} Saturday', '%X%V %W')
|
|
AND o.date >= STR_TO_DATE('{$week} Saturday', '%X%V %W') - INTERVAL {$this->activeUsersInterval} DAY
|
|
{$this->queryExcludeUsers}
|
|
AND o.phone IN ( SELECT DISTINCT( u.phone ) FROM credit c
|
|
INNER JOIN promo_group_promo pg ON pg.id_promo_group = {$giftcard_group} AND pg.id_promo = c.id_promo
|
|
INNER JOIN user u ON u.id_user = c.id_user )
|
|
GROUP BY u.phone) ActiveUsers";
|
|
$union = ' UNION ';
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
$parsedData = $this->parseDataWeeksSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newPerActiveByWeekByCommunity( $render = false ){
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$allWeeks = $this->allWeeks();
|
|
|
|
for( $i = $this->from -1 ; $i < $this->to; $i++ ){
|
|
$week = $allWeeks[ $i ];
|
|
$query .= $union . "SELECT ActiveUsers.Label AS Week,
|
|
CAST( NewUsers.NewUsers / ActiveUsers.ActiveUsers AS DECIMAL(14, 2) ) AS 'Total',
|
|
ActiveUsers.Community AS 'Group',
|
|
'Users',
|
|
ActiveUsers.ActiveUsers,
|
|
NewUsers.NewUsers
|
|
FROM
|
|
(SELECT '{$week}' AS Label,
|
|
COUNT(*) AS ActiveUsers,
|
|
community AS Community
|
|
FROM
|
|
(SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE o.date <= STR_TO_DATE('{$week} Saturday', '%X%V %W')
|
|
AND o.date >= STR_TO_DATE('{$week} Sunday', '%X%V %W') - INTERVAL {$this->activeUsersInterval} DAY
|
|
AND r.community IS NOT NULL
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) ActiveUsers
|
|
GROUP BY Community) ActiveUsers
|
|
LEFT JOIN
|
|
( SELECT '{$week}' AS Label,
|
|
COUNT(*) AS NewUsers,
|
|
community AS Community
|
|
FROM
|
|
(SELECT COUNT(*) orders,
|
|
u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE o.date <= STR_TO_DATE('{$week} Saturday', '%X%V %W')
|
|
{$this->queryExcludeUsers}
|
|
AND r.community IS NOT NULL
|
|
GROUP BY u.phone HAVING orders = 1) Orders
|
|
WHERE Orders.date BETWEEN STR_TO_DATE('{$week} Sunday', '%X%V %W') AND STR_TO_DATE('{$week} Saturday', '%X%V %W')
|
|
GROUP BY Orders.community ) NewUsers ON NewUsers.Label = ActiveUsers.Label
|
|
AND NewUsers.Community = ActiveUsers.Community
|
|
GROUP BY ActiveUsers.Community";
|
|
$union = ' UNION ';
|
|
$count++;
|
|
}
|
|
|
|
$parsedData = $this->parseDataWeeksGroup( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
|
|
}
|
|
|
|
public function newPerActiveByMonthByCommunity( $render = false ){
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$allMonths = $this->allMonths();
|
|
|
|
for( $i = $this->from_month -1 ; $i < $this->to_month; $i++ ){
|
|
$month = $allMonths[ $i ];
|
|
$query .= $union . "SELECT ActiveUsers.Label AS Month,
|
|
CAST( NewUsers.NewUsers / ActiveUsers.ActiveUsers AS DECIMAL(14, 2) ) AS 'Total',
|
|
ActiveUsers.Community AS 'Group',
|
|
'Users',
|
|
ActiveUsers.ActiveUsers,
|
|
NewUsers.NewUsers
|
|
FROM
|
|
(SELECT '{$month}' AS Label,
|
|
COUNT(*) AS ActiveUsers,
|
|
community AS Community
|
|
FROM
|
|
(SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE o.date <= LAST_DAY( STR_TO_DATE( '{$month}', '%Y-%m' ) )
|
|
AND o.date >= '{$month}-01' - INTERVAL {$this->activeUsersInterval} DAY
|
|
AND r.community IS NOT NULL
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) ActiveUsers
|
|
GROUP BY Community) ActiveUsers
|
|
LEFT JOIN
|
|
( SELECT '{$month}' AS Label,
|
|
COUNT(*) AS NewUsers,
|
|
community AS Community
|
|
FROM
|
|
(SELECT COUNT(*) orders,
|
|
u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE o.date <= LAST_DAY( STR_TO_DATE( '{$month}', '%Y-%m' ) )
|
|
{$this->queryExcludeUsers}
|
|
AND r.community IS NOT NULL
|
|
GROUP BY u.phone HAVING orders = 1) Orders
|
|
WHERE Orders.date BETWEEN '{$month}-01' AND LAST_DAY( STR_TO_DATE( '{$month}', '%Y-%m' ) )
|
|
GROUP BY Orders.community ) NewUsers ON NewUsers.Label = ActiveUsers.Label
|
|
AND NewUsers.Community = ActiveUsers.Community
|
|
GROUP BY ActiveUsers.Community";
|
|
$union = ' UNION ';
|
|
$count++;
|
|
}
|
|
|
|
$parsedData = $this->parseDataMonthGroup( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
|
|
}
|
|
|
|
public function newPerActiveByDayByCommunity( $render = false ){
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$allDays = $this->allDays();
|
|
|
|
for( $i = $this->from_day -1 ; $i < $this->to_day; $i++ ){
|
|
$day = $allDays[ $i ];
|
|
$query .= $union . "SELECT ActiveUsers.Label AS Day,
|
|
CAST( NewUsers.NewUsers / ActiveUsers.ActiveUsers AS DECIMAL(14, 2) ) AS 'Total',
|
|
ActiveUsers.Community AS 'Group',
|
|
'Users',
|
|
ActiveUsers.ActiveUsers,
|
|
NewUsers.NewUsers
|
|
FROM
|
|
(SELECT '{$day}' AS Label,
|
|
COUNT(*) AS ActiveUsers,
|
|
community AS Community
|
|
FROM
|
|
(SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE o.date <= '{$day}'
|
|
AND o.date >= '{$day}' - INTERVAL {$this->activeUsersInterval} DAY
|
|
AND r.community IS NOT NULL
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) ActiveUsers
|
|
GROUP BY Community) ActiveUsers
|
|
LEFT JOIN
|
|
( SELECT '{$day}' AS Label,
|
|
COUNT(*) AS NewUsers,
|
|
community AS Community
|
|
FROM
|
|
(SELECT COUNT(*) orders,
|
|
u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE o.date <= '{$day}'
|
|
{$this->queryExcludeUsers}
|
|
AND r.community IS NOT NULL
|
|
GROUP BY u.phone HAVING orders = 1) Orders
|
|
WHERE Orders.date = '{$day}'
|
|
GROUP BY Orders.community ) NewUsers ON NewUsers.Label = ActiveUsers.Label
|
|
AND NewUsers.Community = ActiveUsers.Community
|
|
GROUP BY ActiveUsers.Community";
|
|
$union = ' UNION ';
|
|
$count++;
|
|
}
|
|
|
|
$parsedData = $this->parseDataDaysGroup( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
|
|
}
|
|
|
|
public function activeByWeekByCommunity( $render = false ){
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$allWeeks = $this->allWeeks();
|
|
|
|
for( $i = $this->from -1 ; $i < $this->to; $i++ ){
|
|
$week = $allWeeks[ $i ];
|
|
$query .= $union . "SELECT '{$week}' AS Week,
|
|
COUNT(*) AS Total,
|
|
community AS 'Group'
|
|
FROM
|
|
( SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE o.date <= STR_TO_DATE('{$week} Saturday', '%X%V %W')
|
|
AND o.date >= STR_TO_DATE('{$week} Sunday', '%X%V %W') - INTERVAL {$this->activeUsersInterval} DAY
|
|
AND r.community IS NOT NULL
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) ActiveUsers
|
|
GROUP BY ActiveUsers.community";
|
|
$union = ' UNION ';
|
|
}
|
|
|
|
$parsedData = $this->parseDataWeeksGroup( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function activeByMonthByCommunity( $render = false ){
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$allMonths = $this->allMonths();
|
|
|
|
for( $i = $this->from_month -1 ; $i < $this->to_month; $i++ ){
|
|
$month = $allMonths[ $i ];
|
|
$query .= $union . "SELECT DATE_FORMAT( date ,'%Y-%m') AS Month,
|
|
COUNT(*) AS Total,
|
|
community AS 'Group'
|
|
FROM
|
|
( SELECT u.phone,
|
|
o.date,
|
|
u.id_user,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE o.date <= LAST_DAY( STR_TO_DATE( '{$month}', '%Y-%m' ) )
|
|
AND o.date >= '{$month}-01' - INTERVAL {$this->activeUsersInterval} DAY
|
|
AND r.community IS NOT NULL
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone ) ActiveUsers
|
|
GROUP BY ActiveUsers.community";
|
|
$union = ' UNION ';
|
|
}
|
|
|
|
$parsedData = $this->parseDataMonthGroup( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function uniqueByWeekByCommunity( $render = false ){
|
|
|
|
$query = "SELECT YEARWEEK(date) AS `Week`,
|
|
COUNT(DISTINCT((u.phone))) AS Total,
|
|
r.community AS `Group`
|
|
FROM `order` o
|
|
LEFT JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE YEARWEEK(o.date) >= {$this->weekFrom} AND YEARWEEK(o.date) <= {$this->weekTo}
|
|
AND r.community IS NOT NULL
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY YEARWEEK(o.date),
|
|
r.community
|
|
ORDER BY YEARWEEK(o.date) DESC";
|
|
|
|
$parsedData = $this->parseDataWeeksGroup( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function uniqueByDayByCommunity( $render = false ){
|
|
|
|
$query = "SELECT DATE_FORMAT( o.date ,'%Y-%m-%d') AS Day,
|
|
COUNT(DISTINCT((u.phone))) AS Total,
|
|
r.community AS `Group`
|
|
FROM `order` o
|
|
LEFT JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE o.date >= '{$this->dayFrom}' AND o.date <= '{$this->dayTo}'
|
|
AND r.community IS NOT NULL
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY DATE_FORMAT( o.date ,'%Y-%m-%d'),
|
|
r.community
|
|
ORDER BY DATE_FORMAT( o.date ,'%Y-%m-%d') DESC";
|
|
|
|
$parsedData = $this->parseDataDaysGroup( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function uniqueByMonthByCommunity( $render = false ){
|
|
|
|
$query = "SELECT DATE_FORMAT( o.date ,'%Y-%m') AS Month,
|
|
COUNT(DISTINCT((u.phone))) AS Total,
|
|
r.community AS `Group`
|
|
FROM `order` o
|
|
LEFT JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE o.date >= '{$this->monthFrom}-01' AND o.date <= LAST_DAY( STR_TO_DATE( '{$this->monthTo}', '%Y-%m' ) )
|
|
AND r.community IS NOT NULL
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY DATE_FORMAT( o.date ,'%Y-%m'),
|
|
r.community
|
|
ORDER BY DATE_FORMAT( o.date ,'%Y-%m') DESC";
|
|
|
|
$parsedData = $this->parseDataMonthGroup( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newPerActiveByWeek( $render = false ){
|
|
|
|
$activeUsers = $this->activeByWeek();
|
|
$newUsers = $this->newByWeek();
|
|
|
|
$data = [];
|
|
for( $i = 0; $i < sizeof( $activeUsers ); $i++ ){
|
|
$active = $activeUsers[ $i ]->Total;
|
|
$new = $newUsers[ $i ]->Total;
|
|
|
|
if( $active != 0 && $new != 0 ){
|
|
$result = $new / $active;
|
|
} else {
|
|
$result = 0;
|
|
}
|
|
$data[] = ( object ) array( 'Label' => $activeUsers[ $i ]->Label, 'Total' => number_format( $result, 2 ), 'Type' => 'Total' );
|
|
}
|
|
|
|
if( $render ){
|
|
return array( 'data' => $data, 'unit' => $this->unit );
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
public function newPerActiveByDay( $render = false ){
|
|
|
|
$activeUsers = $this->activeByDay();
|
|
$newUsers = $this->newByDay();
|
|
|
|
$data = [];
|
|
for( $i = 0; $i < sizeof( $activeUsers ); $i++ ){
|
|
$active = $activeUsers[ $i ]->Total;
|
|
$new = $newUsers[ $i ]->Total;
|
|
|
|
if( $active != 0 && $new != 0 ){
|
|
$result = $new / $active;
|
|
} else {
|
|
$result = 0;
|
|
}
|
|
$data[] = ( object ) array( 'Label' => $activeUsers[ $i ]->Label, 'Total' => number_format( $result, 2 ), 'Type' => 'Total' );
|
|
}
|
|
|
|
if( $render ){
|
|
return array( 'data' => $data, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
public function newPerActiveByMonth( $render = false ){
|
|
|
|
$activeUsers = $this->activeByMonth();
|
|
$newUsers = $this->newByMonth();
|
|
|
|
$data = [];
|
|
for( $i = 0; $i < sizeof( $activeUsers ); $i++ ){
|
|
$active = $activeUsers[ $i ]->Total;
|
|
$new = $newUsers[ $i ]->Total;
|
|
|
|
if( $active != 0 && $new != 0 ){
|
|
$result = $new / $active;
|
|
} else {
|
|
$result = 0;
|
|
}
|
|
$data[] = ( object ) array( 'Label' => $activeUsers[ $i ]->Label, 'Total' => number_format( $result, 2 ), 'Type' => 'Total' );
|
|
}
|
|
|
|
if( $render ){
|
|
return array( 'data' => $data, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
public function uniqueByDay( $render = false ){
|
|
|
|
$query = "SELECT DATE_FORMAT( o.date ,'%Y-%m-%d') AS Day,
|
|
COUNT( DISTINCT( ( u.phone ) ) ) AS Total
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE
|
|
o.date >= '{$this->dayFrom}' AND o.date <= '{$this->dayTo}'
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY Day
|
|
ORDER BY Day ASC";
|
|
|
|
$parsedData = $this->parseDataDaysSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function uniqueByWeek( $render = false ){
|
|
|
|
$query = "SELECT YEARWEEK(date) AS `Week`,
|
|
COUNT( DISTINCT( ( u.phone ) ) ) AS Total
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE YEARWEEK(o.date) >= {$this->weekFrom} AND YEARWEEK(o.date) <= {$this->weekTo}
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY YEARWEEK(o.date)
|
|
ORDER BY YEARWEEK(o.date) DESC";
|
|
|
|
$parsedData = $this->parseDataWeeksSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function uniqueByMonth( $render = false ){
|
|
|
|
$query = "SELECT DATE_FORMAT( o.date ,'%Y-%m') AS Month,
|
|
COUNT( DISTINCT( ( u.phone ) ) ) AS Total
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE
|
|
o.date >= '{$this->monthFrom}-01' AND o.date <= LAST_DAY( STR_TO_DATE( '{$this->monthTo}', '%Y-%m' ) )
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY Month
|
|
ORDER BY Month ASC";
|
|
|
|
$parsedData = $this->parseDataMonthSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function trackFrequence( $render = false ){
|
|
|
|
$allWeeks = $this->allWeeks();
|
|
|
|
$query = '';
|
|
$union = '';
|
|
|
|
$_data = [];
|
|
|
|
for( $i = $this->from -1 ; $i < $this->to; $i++ ){
|
|
$week = $allWeeks[ $i ];
|
|
$_data[ $week ] = array(
|
|
'Power' => 0,
|
|
'Weekly' => 0,
|
|
'Bi-Weekly' => 0,
|
|
'Tri-Weekly' => 0,
|
|
'Monthly' => 0
|
|
);
|
|
$query .= $union .
|
|
"SELECT YEARWEEK(date) AS `Week`,
|
|
u.phone AS 'Phone'
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE YEARWEEK(o.date) = {$week}
|
|
{$this->queryExcludeUsers}";
|
|
$union = ' UNION ';
|
|
}
|
|
|
|
$users = c::db()->get( $query );
|
|
|
|
foreach( $users as $user ){
|
|
|
|
$week = $user->Week;
|
|
|
|
$query = "SELECT * FROM
|
|
( SELECT o.date AS day1 FROM `order` o WHERE o.phone = '{$user->Phone}' AND YEARWEEK(o.date) <= {$user->Week} ORDER BY id_order DESC LIMIT 3, 1 ) day1,
|
|
( SELECT o.date AS day2 FROM `order` o WHERE o.phone = '{$user->Phone}' AND YEARWEEK(o.date) <= {$user->Week} ORDER BY id_order DESC LIMIT 1 ) day2";
|
|
$days = c::db()->get( $query );
|
|
$days = $days->_items[0];
|
|
|
|
if( $days ){
|
|
|
|
$interval = date_diff( date_create( $days->day1 ), date_create( $days->day2 ) );
|
|
$days = intval( $interval->format('%d') );
|
|
|
|
if( $days <= 4 ){ $_data[ $week ][ 'Power' ]++; }
|
|
if( $days > 4 && $days <= 11 ){ $_data[ $week ][ 'Weekly' ]++; }
|
|
if( $days > 11 && $days <= 18 ){ $_data[ $week ][ 'Bi-Weekly' ]++; }
|
|
if( $days > 18 && $days <= 25 ){ $_data[ $week ][ 'Tri-Weekly' ]++; }
|
|
if( $days > 25 ){ $_data[ $week ][ 'Monthly' ]++; }
|
|
}
|
|
}
|
|
|
|
$data = [];
|
|
foreach( $_data as $week => $info ){
|
|
foreach( $info as $type => $value ){
|
|
$data[] = ( object ) array( 'Label' => $week, 'Total' => $value, 'Type' => $type );
|
|
}
|
|
}
|
|
|
|
if( $render ){
|
|
return array( 'data' => $data, 'unit' => $this->unit, 'hideGroups' => true );
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
public function newByMonth( $render = false ){
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m') AS Month
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1 = 1
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m') HAVING Month BETWEEN '{$this->monthFrom}' AND '{$this->monthTo}'";
|
|
|
|
$parsedData = $this->parseDataMonthSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByMonthByCommunityGrouped( $render = false ){
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m') AS Month,
|
|
community AS `Group`
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE r.community IS NOT NULL
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m') HAVING Month BETWEEN '{$this->monthFrom}' AND '{$this->monthTo}'";
|
|
|
|
$parsedData = $this->parseDataMonthGroup( $query, $this->description );
|
|
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByDayByCommunityGrouped( $render = false ){
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m-%d') AS Day,
|
|
community AS `Group`
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE r.community IS NOT NULL
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m-%d') HAVING Day BETWEEN '{$this->dayFrom}' AND '{$this->dayTo}'";
|
|
|
|
$parsedData = $this->parseDataDaysGroup( $query, $this->description );
|
|
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByDayHistorical( $render = false ){
|
|
$newUsers = $this->newByDay();
|
|
$usersReclaimed = $this->reclaimedByDay();
|
|
$activeUsers = $this->activeByDay();
|
|
$data = [];
|
|
for( $i = 0; $i < count( $newUsers ); $i++ ){
|
|
$data[] = ( object ) array(
|
|
'Label' => $newUsers[ $i ]->Label,
|
|
'Total' => ( ( $newUsers[ $i ]->Total + $usersReclaimed[ $i ]->Total ) / $activeUsers[ $i ]->Total ),
|
|
'Type' => $newUsers[ $i ]->Type,
|
|
);
|
|
}
|
|
if( $render ){
|
|
return array( 'data' => $data, 'unit' => 'Users', 'interval' => 'day' );
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
public function newByWeekHistorical( $render = false ){
|
|
$newUsers = $this->newByWeek();
|
|
$usersReclaimed = $this->reclaimedByWeek();
|
|
$activeUsers = $this->activeByWeek();
|
|
$data = [];
|
|
for( $i = 0; $i < count( $newUsers ); $i++ ){
|
|
$data[] = ( object ) array(
|
|
'Label' => $newUsers[ $i ]->Label,
|
|
'Total' => ( ( $newUsers[ $i ]->Total + $usersReclaimed[ $i ]->Total ) / $activeUsers[ $i ]->Total ),
|
|
'Type' => $newUsers[ $i ]->Type,
|
|
);
|
|
}
|
|
if( $render ){
|
|
return array( 'data' => $data, 'unit' => 'Users', 'interval' => 'week' );
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
public function newByMonthHistorical( $render = false ){
|
|
$newUsers = $this->newByMonth();
|
|
$usersReclaimed = $this->reclaimedByMonth();
|
|
$activeUsers = $this->activeByMonth();
|
|
$data = [];
|
|
for( $i = 0; $i < count( $newUsers ); $i++ ){
|
|
$data[] = ( object ) array(
|
|
'Label' => $newUsers[ $i ]->Label,
|
|
'Total' => ( ( $newUsers[ $i ]->Total + $usersReclaimed[ $i ]->Total ) / $activeUsers[ $i ]->Total ),
|
|
'Type' => $newUsers[ $i ]->Type,
|
|
);
|
|
}
|
|
if( $render ){
|
|
return array( 'data' => $data, 'unit' => 'Users', 'interval' => 'month' );
|
|
}
|
|
return $data;
|
|
}
|
|
public function newByDay( $render = false ){
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m-%d') AS Day
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1=1
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m-%d') HAVING Day BETWEEN '{$this->dayFrom}' AND '{$this->dayTo}'";
|
|
|
|
$parsedData = $this->parseDataDaysSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByMonthCohort( $render = false ){
|
|
|
|
$id_chart_cohort = $_GET[ 'id_chart_cohort' ];
|
|
$cohort_type = $_GET[ 'cohort_type' ];
|
|
|
|
switch ( $cohort_type ) {
|
|
case 'cohort':
|
|
|
|
$cohort = Crunchbutton_Chart_Cohort::get( $id_chart_cohort, $cohort_type ) ;
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m') AS Month
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1 = 1
|
|
{$this->queryExcludeUsers}
|
|
{$cohort->toQuery()}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m') HAVING Month BETWEEN '{$this->monthFrom}' AND '{$this->monthTo}'";
|
|
break;
|
|
|
|
case 'months':
|
|
$month = $id_chart_cohort;
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m') AS Month
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1 = 1
|
|
AND DATE_FORMAT(o.date ,'%Y-%m') = '{$month}'
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m') HAVING Month BETWEEN '{$this->monthFrom}' AND '{$this->monthTo}'";
|
|
break;
|
|
|
|
case 'giftcard':
|
|
$giftcard_group = $id_chart_cohort;
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m') AS Month
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1 = 1
|
|
AND o.phone IN ( SELECT DISTINCT( u.phone ) FROM credit c
|
|
INNER JOIN promo_group_promo pg ON pg.id_promo_group = {$giftcard_group} AND pg.id_promo = c.id_promo
|
|
INNER JOIN user u ON u.id_user = c.id_user )
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m') HAVING Month BETWEEN '{$this->monthFrom}' AND '{$this->monthTo}'";
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
$parsedData = $this->parseDataMonthSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByDayCohort( $render = false ){
|
|
|
|
$id_chart_cohort = $_GET[ 'id_chart_cohort' ];
|
|
$cohort_type = $_GET[ 'cohort_type' ];
|
|
|
|
switch ( $cohort_type ) {
|
|
case 'cohort':
|
|
$cohort = Crunchbutton_Chart_Cohort::get( $id_chart_cohort, $cohort_type );
|
|
$cohortQuery = $cohort->toQuery();
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m-%d') AS Day
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1=1
|
|
{$this->queryExcludeUsers}
|
|
{$cohort->toQuery()}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m-%d') HAVING Day BETWEEN '{$this->dayFrom}' AND '{$this->dayTo}'";
|
|
break;
|
|
|
|
case 'months':
|
|
$month = $id_chart_cohort;
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m-%d') AS Day
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1=1
|
|
AND DATE_FORMAT(o.date ,'%Y-%m') = '{$month}'
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m-%d') HAVING Day BETWEEN '{$this->dayFrom}' AND '{$this->dayTo}'";
|
|
break;
|
|
case 'giftcard':
|
|
$giftcard_group = $id_chart_cohort;
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m-%d') AS Day
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1=1
|
|
AND o.phone IN ( SELECT DISTINCT( u.phone ) FROM credit c
|
|
INNER JOIN promo_group_promo pg ON pg.id_promo_group = {$giftcard_group} AND pg.id_promo = c.id_promo
|
|
INNER JOIN user u ON u.id_user = c.id_user )
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m-%d') HAVING Day BETWEEN '{$this->dayFrom}' AND '{$this->dayTo}'";
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
$parsedData = $this->parseDataDaysSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByWeekCohort( $render = false ){
|
|
|
|
$id_chart_cohort = $_GET[ 'id_chart_cohort' ];
|
|
$cohort_type = $_GET[ 'cohort_type' ];
|
|
|
|
switch ( $cohort_type ) {
|
|
case 'cohort':
|
|
$cohort = Crunchbutton_Chart_Cohort::get( $id_chart_cohort, $cohort_type );
|
|
$query = "SELECT SUM(1) AS Total,
|
|
YEARWEEK(o.date) AS Week
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1=1
|
|
{$this->queryExcludeUsers}
|
|
{$cohort->toQuery()}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY YEARWEEK(o.date) HAVING Week BETWEEN '{$this->weekFrom}' AND '{$this->weekTo}'";
|
|
break;
|
|
|
|
case 'months':
|
|
$month = $id_chart_cohort;
|
|
$query = "SELECT SUM(1) AS Total,
|
|
YEARWEEK(o.date) AS Week
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1=1
|
|
AND DATE_FORMAT(o.date ,'%Y-%m') = '{$month}'
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY YEARWEEK(o.date) HAVING Week BETWEEN '{$this->weekFrom}' AND '{$this->weekTo}'";
|
|
break;
|
|
case 'giftcard':
|
|
$giftcard_group = $id_chart_cohort;
|
|
$query = "SELECT SUM(1) AS Total,
|
|
YEARWEEK(o.date) AS Week
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1=1
|
|
AND o.phone IN ( SELECT DISTINCT( u.phone ) FROM credit c
|
|
INNER JOIN promo_group_promo pg ON pg.id_promo_group = {$giftcard_group} AND pg.id_promo = c.id_promo
|
|
INNER JOIN user u ON u.id_user = c.id_user )
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY YEARWEEK(o.date) HAVING Week BETWEEN '{$this->weekFrom}' AND '{$this->weekTo}'";
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
$parsedData = $this->parseDataWeeksSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByWeek( $render = false ){
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
YEARWEEK(o.date) AS Week
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN community c ON o.id_community = c.id_community {$this->queryExcludeCommunties}
|
|
WHERE 1=1
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY YEARWEEK(o.date) HAVING Week BETWEEN '{$this->weekFrom}' AND '{$this->weekTo}'";
|
|
$parsedData = $this->parseDataWeeksSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByMonthByRestaurant( $render = false ){
|
|
|
|
$restaurant = $_REQUEST[ 'restaurant' ];
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m') AS Month,
|
|
restaurant AS `Group`
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone,
|
|
r.name as restaurant
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE r.id_restaurant = '{$restaurant}'
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m') HAVING Month BETWEEN '{$this->monthFrom}' AND '{$this->monthTo}'";
|
|
|
|
$parsedData = $this->parseDataMonthSimple( $query, $this->description );
|
|
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByMonthByCommunity( $render = false ){
|
|
|
|
$community = $_REQUEST[ 'community' ];
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m') AS Month,
|
|
community AS `Group`
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE REPLACE(r.community, ' ', '-') = '{$community}'
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m') HAVING Month BETWEEN '{$this->monthFrom}' AND '{$this->monthTo}'";
|
|
|
|
$parsedData = $this->parseDataMonthSimple( $query, $this->description );
|
|
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'month' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByDayByRestaurant( $render = false ){
|
|
|
|
$restaurant = $_REQUEST[ 'restaurant' ];
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m-%d') AS Day,
|
|
restaurant AS `Group`
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone,
|
|
r.name as restaurant
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE r.id_restaurant = '{$restaurant}'
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m-%d') HAVING Day BETWEEN '{$this->dayFrom}' AND '{$this->dayTo}'";
|
|
|
|
$parsedData = $this->parseDataDaysSimple( $query, $this->description );
|
|
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByDayByCommunity( $render = false ){
|
|
|
|
$community = $_REQUEST[ 'community' ];
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
DATE_FORMAT(o.date ,'%Y-%m-%d') AS Day,
|
|
community AS `Group`
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE REPLACE(r.community, ' ', '-') = '{$community}'
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone) orders ON o.id_order = orders.id_order
|
|
GROUP BY DATE_FORMAT(o.date ,'%Y-%m-%d') HAVING Day BETWEEN '{$this->dayFrom}' AND '{$this->dayTo}'";
|
|
|
|
$parsedData = $this->parseDataDaysSimple( $query, $this->description );
|
|
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit, 'interval' => 'day' );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByWeekByRestaurant( $render = false ){
|
|
|
|
$restaurant = $_REQUEST[ 'restaurant' ];
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
YEARWEEK(o.date) AS Week,
|
|
restaurant AS `Group`
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone,
|
|
r.name as restaurant
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE r.id_restaurant = '{$restaurant}'
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone, r.name) orders ON o.id_order = orders.id_order
|
|
GROUP BY YEARWEEK(o.date) HAVING Week BETWEEN '{$this->weekFrom}' AND '{$this->weekTo}'";
|
|
$parsedData = $this->parseDataWeeksSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByWeekByCommunity( $render = false ){
|
|
|
|
$community = $_REQUEST[ 'community' ];
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
YEARWEEK(o.date) AS Week,
|
|
community AS `Group`
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE REPLACE(r.community, ' ', '-') = '{$community}'
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone, r.community) orders ON o.id_order = orders.id_order
|
|
GROUP BY YEARWEEK(o.date) HAVING Week BETWEEN '{$this->weekFrom}' AND '{$this->weekTo}'";
|
|
|
|
$parsedData = $this->parseDataWeeksSimple( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function newByWeekByCommunityGrouped( $render = false ){
|
|
|
|
$query = "SELECT SUM(1) AS Total,
|
|
YEARWEEK(o.date) AS Week,
|
|
community AS `Group`
|
|
FROM `order` o
|
|
INNER JOIN
|
|
(SELECT min(id_order) id_order,
|
|
u.phone,
|
|
r.community
|
|
FROM `order` o
|
|
INNER JOIN user u ON u.id_user = o.id_user
|
|
LEFT JOIN restaurant r ON r.id_restaurant = o.id_restaurant
|
|
WHERE r.community IS NOT NULL
|
|
{$this->queryExcludeUsers}
|
|
GROUP BY u.phone, r.community) orders ON o.id_order = orders.id_order
|
|
GROUP BY YEARWEEK(o.date) HAVING Week BETWEEN '{$this->weekFrom}' AND '{$this->weekTo}'";
|
|
|
|
$parsedData = $this->parseDataWeeksGroup( $query, $this->description );
|
|
if( $render ){
|
|
return array( 'data' => $parsedData, 'unit' => $this->unit );
|
|
}
|
|
return $parsedData;
|
|
}
|
|
|
|
public function repeatPerDay( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerDay( false ), 'unit' =>$order->unit, 'interval' => 'day' );
|
|
}
|
|
|
|
public function repeatPerDayByCommunityGrouped( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerDayByCommunityGrouped( false ), 'unit' =>$order->unit, 'interval' => 'day' );
|
|
}
|
|
|
|
public function repeatPerDayByCommunity( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerDayByCommunity( false ), 'unit' =>$order->unit, 'interval' => 'day' );
|
|
}
|
|
|
|
public function repeatPerWeek( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerWeek( false ), 'unit' =>$order->unit, 'interval' => 'week' );
|
|
}
|
|
|
|
public function repeatPerWeekByCommunityGrouped( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerWeekByCommunityGrouped( false ), 'unit' =>$order->unit, 'interval' => 'week' );
|
|
}
|
|
|
|
public function repeatPerWeekByCommunity( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerWeekByCommunity( false ), 'unit' =>$order->unit, 'interval' => 'week' );
|
|
}
|
|
|
|
public function repeatPerWeekByRestaurant( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerWeekByRestaurant( false ), 'unit' =>$order->unit, 'interval' => 'week' );
|
|
}
|
|
|
|
public function repeatPerDayByRestaurant( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerDayByRestaurant( false ), 'unit' =>$order->unit, 'interval' => 'day' );
|
|
}
|
|
|
|
public function repeatPerMonthByRestaurant( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerMonthByRestaurant( false ), 'unit' =>$order->unit, 'interval' => 'month' );
|
|
}
|
|
|
|
public function repeatPerMonth( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerMonth( false ), 'unit' =>$order->unit, 'interval' => 'month' );
|
|
}
|
|
|
|
public function repeatPerMonthByCommunityGrouped( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerMonthByCommunityGrouped( false ), 'unit' =>$order->unit, 'interval' => 'month' );
|
|
}
|
|
|
|
public function repeatPerMonthByCommunity( $render = false ){
|
|
$order = new Crunchbutton_Chart_Order();
|
|
return array( 'data' => $order->repeatPerMonthByCommunity( false ), 'unit' =>$order->unit, 'interval' => 'month' );
|
|
}
|
|
} |