From 868d08ecb235622893bbf479af490a1817525e17 Mon Sep 17 00:00:00 2001 From: AntonyAntonio Date: Thu, 12 Jan 2017 02:50:45 -0300 Subject: [PATCH] Guillermo - stats architecture [skip ci] --- server/controllers/system/get-stats.php | 138 +++++++++++++++++++++--- server/data/ERRORS.php | 1 + server/models/Staff.php | 5 +- server/models/Stat.php | 8 ++ 4 files changed, 134 insertions(+), 18 deletions(-) diff --git a/server/controllers/system/get-stats.php b/server/controllers/system/get-stats.php index d8349663..5c83c8d7 100644 --- a/server/controllers/system/get-stats.php +++ b/server/controllers/system/get-stats.php @@ -1,34 +1,140 @@ 'staff_1', - 'requestData' => [] + 'requestData' => [ + 'period' => [ + 'validation' => DataValidator::in(['week', 'month', 'quarter', 'year']), + 'error' => ERRORS::INVALID_PERIOD + ] + ] ]; } public function handler() { - $begin = new DateTime(Setting::getSetting('last-stat-day')->value); - $end = new DateTime(Date::getCurrentDate()); + $this->generationNewStats(); - $interval = new DateInterval('P1D'); - $dateRange = new DatePeriod($begin, $interval ,$end); + $staffId = Controller::request('staffId'); - foreach($dateRange as $date){ - $numberOfTickets = Log::count('type=? AND date LIKE ?',['CREATE_TICKET', $date->format('Ymd') . '%']); - $stat = new Stat(); + if($staffId) { + if($staffId !== Controller::getLoggedUser()->id && !Controller::isStaffLogged(3)) { + Response::respondError(ERRORS::NO_PERMISSION); + return; + } - $stat->setProperties([ - 'date' => $date->format('Ymd'), - 'type' => 'CREATE_TICKET', - 'general' => 1, - 'value' => $numberOfTickets, - ]); - $stat->store(); + $this->getStaffStat(); + } else { + $this->getGeneralStat(); + } + } + + public function generationNewStats() { + $lastStatDay = Setting::getSetting('last-stat-day'); + $previousCurrentDate = floor(Date::getCurrentDate()/10000)-1; + + if($lastStatDay->value !== $previousCurrentDate) { + + $begin = new DateTime($lastStatDay->value); + $end = new DateTime($previousCurrentDate); + + $interval = new DateInterval('P1D'); + $dateRange = new DatePeriod($begin, $interval ,$end); + + $staffList = Staff::getAll(); + + foreach($dateRange as $date) { + $this->generateGeneralStat('CREATE_TICKET', $date); + $this->generateGeneralStat('CLOSE', $date); + $this->generateGeneralStat('SIGNUP', $date); + $this->generateGeneralStat('COMMENT', $date); + + foreach($staffList as $staff) { + $assignments = Ticketevent::count('type=? AND author_staff_id=? AND date LIKE ?',['ASSIGN',$staff->id, $date->format('Ymd') . '%']); + $closed = Ticketevent::count('type=? AND author_staff_id=? AND date LIKE ?',['CLOSE',$staff->id, $date->format('Ymd') . '%']); + + $statAssign = new Stat(); + $statAssign->setProperties([ + 'date' => $date->format('Ymd'), + 'type' => 'ASSIGN', + 'general' => 0, + 'value' => $assignments, + ]); + + $statClose = new Stat(); + $statClose->setProperties([ + 'date' => $date->format('Ymd'), + 'type' => 'CLOSE', + 'general' => 0, + 'value' => $closed, + ]); + + $staff->ownStatList->add($statAssign); + $staff->ownStatList->add($statClose); + + $staff->store(); + } + } + + $lastStatDay->value = $previousCurrentDate; + $lastStatDay->store(); + } + } + + public function generateGeneralStat($type, $date) { + $value = Log::count('type=? AND date LIKE ?',[$type, $date->format('Ymd') . '%']); + $stat = new Stat(); + + $stat->setProperties([ + 'date' => $date->format('Ymd'), + 'type' => $type, + 'general' => 1, + 'value' => $value, + ]); + + $stat->store(); + } + + public function getGeneralStat() { + $daysToRetrieve = $this->getDaysToRetrieve(); + + $statList = Stat::find('general=\'1\' ORDER BY id desc LIMIT ? ', [4 * $daysToRetrieve]); + + Response::respondSuccess($statList->toArray()); + } + + public function getStaffStat() { + $staffId = Controller::request('staffId'); + $daysToRetrieve = $this->getDaysToRetrieve(); + + $statList = Stat::find('general=\'0\' AND staff_id=? ORDER BY id desc LIMIT ? ', [$staffId, 4 * $daysToRetrieve]); + + Response::respondSuccess($statList->toArray()); + } + + public function getDaysToRetrieve() { + $period = Controller::request('period'); + $daysToRetrieve = 0; + + switch ($period) { + case 'week': + $daysToRetrieve = 7; + break; + case 'month': + $daysToRetrieve = 30; + break; + case 'quarter': + $daysToRetrieve = 90; + break; + case 'year': + $daysToRetrieve = 365; + break; } - Response::respondSuccess(); + return $daysToRetrieve; } } \ No newline at end of file diff --git a/server/data/ERRORS.php b/server/data/ERRORS.php index e0052543..4b7507cf 100644 --- a/server/data/ERRORS.php +++ b/server/data/ERRORS.php @@ -35,4 +35,5 @@ class ERRORS { const INVALID_TEMPLATE = 'INVALID_TEMPLATE'; const INVALID_SUBJECT = 'INVALID_SUBJECT'; const INVALID_BODY = 'INVALID_BODY'; + const INVALID_PERIOD = 'INVALID_PERIOD'; } diff --git a/server/models/Staff.php b/server/models/Staff.php index 9ec69341..13c3d7a8 100644 --- a/server/models/Staff.php +++ b/server/models/Staff.php @@ -19,13 +19,14 @@ class Staff extends DataStore { 'sharedDepartmentList', 'sharedTicketList', 'lastLogin', - 'sharedStatList' + 'ownStatList' ]; } public function getDefaultProps() { return [ - 'level' => 1 + 'level' => 1, + 'ownStatList' => new DataStoreList() ]; } diff --git a/server/models/Stat.php b/server/models/Stat.php index 08e90572..97f85649 100644 --- a/server/models/Stat.php +++ b/server/models/Stat.php @@ -14,4 +14,12 @@ class Stat extends DataStore { public function getDefaultProps() { return array(); } + public function toArray() { + return [ + 'date' => $this->date, + 'type' => $this->type, + 'general' => $this->general, + 'value' => $this->value + ]; + } } \ No newline at end of file