queryExcludeCommunties} {$this->queryExcludeUsers} AND c.id_community IN (1, 4) GROUP BY DATE_FORMAT(CONVERT_TZ(`date`, '-8:00', '-5:00'), '%W'), c.id_community ORDER BY DATE_FORMAT(CONVERT_TZ(`date`, '-8:00', '-5:00'), '%Y%m%d'), c.id_community"; $data = c::db()->get( $query ); if( $render ){ return array( 'data' => $data, 'unit' => $this->unity ); } return $data; } public function byMonth( $render = false ){ $query = "SELECT DATE_FORMAT( o.date ,'%Y-%m') AS Month, COUNT(*) 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 WHERE o.date >= '{$this->monthFrom}-01' AND o.date <= LAST_DAY( STR_TO_DATE( '{$this->monthTo}', '%Y-%m' ) ) {$this->queryExcludeCommunties} {$this->queryExcludeUsers} GROUP BY Month ORDER BY Month ASC"; $parsedData = $this->parseDataMonthSimple( $query, $this->description ); if( $render ){ return array( 'data' => $parsedData, 'unit' => $this->unity, 'interval' => 'month' ); } return $parsedData; } public function byWeek( $render = false ){ $query = "SELECT YEARWEEK(date) AS Week, COUNT(*) 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 WHERE YEARWEEK(o.date) >= {$this->weekFrom} AND YEARWEEK(o.date) <= {$this->weekTo} {$this->queryExcludeCommunties} {$this->queryExcludeUsers} GROUP BY YEARWEEK(date) ORDER BY YEARWEEK(date) ASC"; $parsedData = $this->parseDataWeeksSimple( $query, $this->description ); if( $render ){ return array( 'data' => $parsedData, 'unit' => $this->unity ); } return $parsedData; } public function byWeekPerCommunity( $render = false ){ $query = "SELECT YEARWEEK(date) AS Week, COUNT(*) AS Total, c.name AS 'Group' 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 WHERE YEARWEEK(o.date) >= {$this->weekFrom} AND YEARWEEK(o.date) <= {$this->weekTo} {$this->queryExcludeCommunties} {$this->queryOnlyCommunties} {$this->queryExcludeUsers} GROUP BY YEARWEEK(date), c.name ORDER BY YEARWEEK(date) DESC"; $parsedData = $this->parseDataWeeksGroup( $query, $this->description ); if( $render ){ return array( 'data' => $parsedData, 'unit' => $this->unity ); } return $parsedData; } public function byUsersPerMonth( $render = false ){ $query = "SELECT DATE_FORMAT( o.date ,'%Y-%m') AS Month, CAST(COUNT(*) / COUNT(DISTINCT((u.phone))) AS DECIMAL(14, 2)) 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 WHERE o.date >= '{$this->monthFrom}-01' AND o.date <= LAST_DAY( STR_TO_DATE( '{$this->monthTo}', '%Y-%m' ) ) {$this->queryExcludeCommunties} {$this->queryExcludeUsers} GROUP BY Month ORDER BY Month ASC"; $parsedData = $this->parseDataMonthSimple( $query, $this->description ); if( $render ){ return array( 'data' => $parsedData, 'unit' => $this->unity, 'interval' => 'month' ); } return $parsedData; } public function byUsersPerWeek( $render = false ){ $query = "SELECT YEARWEEK(date) AS Week, CAST(COUNT(*) / COUNT(DISTINCT((u.phone))) AS DECIMAL(14, 2)) 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 WHERE YEARWEEK(o.date) >= {$this->weekFrom} AND YEARWEEK(o.date) <= {$this->weekTo} {$this->queryExcludeCommunties} {$this->queryExcludeUsers} GROUP BY YEARWEEK(date) ORDER BY YEARWEEK(date) DESC"; $parsedData = $this->parseDataWeeksSimple( $query, $this->description ); if( $render ){ return array( 'data' => $parsedData, 'unit' => $this->unity ); } return $parsedData; } public function repeatByActiveuserByWeek( $render = false ){ $user = new Crunchbutton_Chart_User(); $activeUsers = $user->activeByWeek(); $newUsers = $user->newByWeek(); $orders = $this->byWeek(); $data = []; for( $i = 0; $i < sizeof( $activeUsers ); $i++ ){ $active = $activeUsers[ $i ]->Total; $order = $orders[ $i ]->Total; $new = $newUsers[ $i ]->Total; if( $i - 1 >= 0 ){ $activePrev = $activeUsers[ $i - 1 ]->Total; } else { $activePrev = 0; } // Formula (Orders minus New Users) / (Active Users) | Active Users = ( average of the current week and previous week's Active Users ) $activeUsersAvg = ( $active + $activePrev ) / 2; $ordersMinusNewUsers = $order - $new; if( $ordersMinusNewUsers != 0 && $activeUsersAvg != 0 ){ $result = ( $order - $new ) / ( $activeUsersAvg ); } else { $result = 0; } $data[] = ( object ) array( 'Label' => $activeUsers[ $i ]->Label, 'Total' => number_format( $result, 4 ), 'Type' => 'Total' ); } if( $render ){ return array( 'data' => $data, 'unit' => $this->unity ); } return $data; } }