mirror of
https://github.com/opensupports/opensupports.git
synced 2025-07-28 16:24:42 +02:00
Merged in OS-144Stats-Architecture (pull request #119)
OS-144stats architecture
This commit is contained in:
commit
cadd5a663e
@ -9,6 +9,7 @@ require_once 'system/get-logs.php';
|
|||||||
require_once 'system/get-mail-templates.php';
|
require_once 'system/get-mail-templates.php';
|
||||||
require_once 'system/edit-mail-template.php';
|
require_once 'system/edit-mail-template.php';
|
||||||
require_once 'system/recover-mail-template.php';
|
require_once 'system/recover-mail-template.php';
|
||||||
|
require_once 'system/get-stats.php';
|
||||||
require_once 'system/disable-registration.php';
|
require_once 'system/disable-registration.php';
|
||||||
require_once 'system/enable-registration.php';
|
require_once 'system/enable-registration.php';
|
||||||
|
|
||||||
@ -27,5 +28,6 @@ $systemControllerGroup->addController(new EditMailTemplateController);
|
|||||||
$systemControllerGroup->addController(new RecoverMailTemplateController);
|
$systemControllerGroup->addController(new RecoverMailTemplateController);
|
||||||
$systemControllerGroup->addController(new DisableRegistrationController);
|
$systemControllerGroup->addController(new DisableRegistrationController);
|
||||||
$systemControllerGroup->addController(new EnableRegistrationController);
|
$systemControllerGroup->addController(new EnableRegistrationController);
|
||||||
|
$systemControllerGroup->addController(new GetStatsController);
|
||||||
|
|
||||||
$systemControllerGroup->finalize();
|
$systemControllerGroup->finalize();
|
@ -1,5 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
use Respect\Validation\Validator as DataValidator;
|
|
||||||
|
|
||||||
class EditSettingsController extends Controller {
|
class EditSettingsController extends Controller {
|
||||||
const PATH = '/edit-settings';
|
const PATH = '/edit-settings';
|
||||||
|
141
server/controllers/system/get-stats.php
Normal file
141
server/controllers/system/get-stats.php
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
<?php
|
||||||
|
use Respect\Validation\Validator as DataValidator;
|
||||||
|
|
||||||
|
class GetStatsController extends Controller {
|
||||||
|
const PATH = '/get-stats';
|
||||||
|
|
||||||
|
public function validations() {
|
||||||
|
return [
|
||||||
|
'permission' => 'staff_1',
|
||||||
|
'requestData' => [
|
||||||
|
'period' => [
|
||||||
|
'validation' => DataValidator::in(['week', 'month', 'quarter', 'year']),
|
||||||
|
'error' => ERRORS::INVALID_PERIOD
|
||||||
|
]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handler() {
|
||||||
|
$this->generationNewStats();
|
||||||
|
|
||||||
|
$staffId = Controller::request('staffId');
|
||||||
|
|
||||||
|
if($staffId) {
|
||||||
|
if($staffId !== Controller::getLoggedUser()->id && !Controller::isStaffLogged(3)) {
|
||||||
|
Response::respondError(ERRORS::NO_PERMISSION);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->getStaffStat();
|
||||||
|
} else {
|
||||||
|
$this->getGeneralStat();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generationNewStats() {
|
||||||
|
$lastStatDay = Setting::getSetting('last-stat-day');
|
||||||
|
$previousCurrentDate = floor(Date::getPreviousDate() / 10000);
|
||||||
|
$currentDate = floor(Date::getCurrentDate() / 10000);
|
||||||
|
|
||||||
|
if($lastStatDay->value !== $previousCurrentDate) {
|
||||||
|
|
||||||
|
$begin = new DateTime($lastStatDay->value);
|
||||||
|
$end = new DateTime($currentDate);
|
||||||
|
|
||||||
|
$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 = $currentDate;
|
||||||
|
$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;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $daysToRetrieve;
|
||||||
|
}
|
||||||
|
}
|
@ -41,7 +41,8 @@ class InitSettingsController extends Controller {
|
|||||||
'max-size' => 0,
|
'max-size' => 0,
|
||||||
'title' => 'Support Center',
|
'title' => 'Support Center',
|
||||||
'url' => 'http://www.opensupports.com/support',
|
'url' => 'http://www.opensupports.com/support',
|
||||||
'registration' => true
|
'registration' => true,
|
||||||
|
'last-stat-day' => '20170101' //TODO: get current date
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,4 +35,5 @@ class ERRORS {
|
|||||||
const INVALID_TEMPLATE = 'INVALID_TEMPLATE';
|
const INVALID_TEMPLATE = 'INVALID_TEMPLATE';
|
||||||
const INVALID_SUBJECT = 'INVALID_SUBJECT';
|
const INVALID_SUBJECT = 'INVALID_SUBJECT';
|
||||||
const INVALID_BODY = 'INVALID_BODY';
|
const INVALID_BODY = 'INVALID_BODY';
|
||||||
|
const INVALID_PERIOD = 'INVALID_PERIOD';
|
||||||
}
|
}
|
||||||
|
@ -3,4 +3,8 @@ class Date {
|
|||||||
public static function getCurrentDate() {
|
public static function getCurrentDate() {
|
||||||
return date('YmdHi');
|
return date('YmdHi');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getPreviousDate() {
|
||||||
|
return date('YmdHi', strtotime(' -1 day '));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,8 @@ class Log extends DataStore {
|
|||||||
'type',
|
'type',
|
||||||
'authorUser',
|
'authorUser',
|
||||||
'authorStaff',
|
'authorStaff',
|
||||||
'to'
|
'to',
|
||||||
|
'date'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -22,7 +23,8 @@ class Log extends DataStore {
|
|||||||
|
|
||||||
$log->setProperties(array(
|
$log->setProperties(array(
|
||||||
'type' => $type,
|
'type' => $type,
|
||||||
'to' => $to
|
'to' => $to,
|
||||||
|
'date' => Date::getCurrentDate()
|
||||||
));
|
));
|
||||||
|
|
||||||
if($author instanceof User) {
|
if($author instanceof User) {
|
||||||
@ -44,7 +46,8 @@ class Log extends DataStore {
|
|||||||
'name' => $author->name,
|
'name' => $author->name,
|
||||||
'id' => $author->id,
|
'id' => $author->id,
|
||||||
'staff' => $author instanceof Staff
|
'staff' => $author instanceof Staff
|
||||||
]
|
],
|
||||||
|
'date' => $this->date
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -18,13 +18,15 @@ class Staff extends DataStore {
|
|||||||
'level',
|
'level',
|
||||||
'sharedDepartmentList',
|
'sharedDepartmentList',
|
||||||
'sharedTicketList',
|
'sharedTicketList',
|
||||||
'lastLogin'
|
'lastLogin',
|
||||||
|
'ownStatList'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDefaultProps() {
|
public function getDefaultProps() {
|
||||||
return [
|
return [
|
||||||
'level' => 1
|
'level' => 1,
|
||||||
|
'ownStatList' => new DataStoreList()
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
25
server/models/Stat.php
Normal file
25
server/models/Stat.php
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
class Stat extends DataStore {
|
||||||
|
const TABLE = 'stat';
|
||||||
|
|
||||||
|
public static function getProps() {
|
||||||
|
return array (
|
||||||
|
'date',
|
||||||
|
'type',
|
||||||
|
'general',
|
||||||
|
'value'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDefaultProps() {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
public function toArray() {
|
||||||
|
return [
|
||||||
|
'date' => $this->date,
|
||||||
|
'type' => $this->type,
|
||||||
|
'general' => $this->general,
|
||||||
|
'value' => $this->value
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,7 @@ require 'uri'
|
|||||||
require 'mysql'
|
require 'mysql'
|
||||||
require 'json'
|
require 'json'
|
||||||
require 'mechanize'
|
require 'mechanize'
|
||||||
|
require 'date'
|
||||||
require './libs.rb'
|
require './libs.rb'
|
||||||
require './scripts.rb'
|
require './scripts.rb'
|
||||||
|
|
||||||
@ -53,3 +54,4 @@ require './system/edit-mail-template.rb'
|
|||||||
require './system/recover-mail-template.rb'
|
require './system/recover-mail-template.rb'
|
||||||
require './system/disable-registration.rb'
|
require './system/disable-registration.rb'
|
||||||
require './system/enable-registration.rb'
|
require './system/enable-registration.rb'
|
||||||
|
require './system/get-stats.rb'
|
||||||
|
@ -29,6 +29,10 @@ class Database
|
|||||||
|
|
||||||
return queryResponse.fetch_hash
|
return queryResponse.fetch_hash
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def query(query_string)
|
||||||
|
return @connection.query(query_string);
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
$database = Database.new
|
$database = Database.new
|
||||||
|
137
tests/system/get-stats.rb
Normal file
137
tests/system/get-stats.rb
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
describe'/system/get-stats' do
|
||||||
|
request('/user/logout')
|
||||||
|
Scripts.login($staff[:email], $staff[:password], true)
|
||||||
|
|
||||||
|
it 'should get stats' do
|
||||||
|
|
||||||
|
d = Date.today.prev_day
|
||||||
|
yesterday = d.strftime("%Y%m%d%H%M")
|
||||||
|
d = Date.today.prev_day.prev_day
|
||||||
|
yesterday2 = d.strftime("%Y%m%d%H%M")
|
||||||
|
d = Date.today.prev_day.prev_day.prev_day
|
||||||
|
yesterday3 = d.strftime("%Y%m%d%H%M")
|
||||||
|
|
||||||
|
#day 1
|
||||||
|
for i in 0..5
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'SIGNUP', NULL, " + yesterday3 + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..0
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'CREATE_TICKET', NULL, " + yesterday3 + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..1
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'CLOSE', NULL, " + yesterday3 + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..2
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'COMMENT', NULL, " + yesterday3 + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..8
|
||||||
|
$database.query("INSERT INTO ticketevent VALUES('', 'CLOSE', NULL, " + yesterday3 + ", NULL, NULL, 1);")
|
||||||
|
end
|
||||||
|
for i in 0..4
|
||||||
|
$database.query("INSERT INTO ticketevent VALUES('', 'ASSIGN', NULL, " + yesterday3 + ", NULL, NULL, 1);")
|
||||||
|
end
|
||||||
|
|
||||||
|
#day 2
|
||||||
|
for i in 0..7
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'SIGNUP', NULL, " + yesterday2 + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..2
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'CREATE_TICKET', NULL, " + yesterday2 + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..9
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'CLOSE', NULL, " + yesterday2 + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..2
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'COMMENT', NULL, " + yesterday2 + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..10
|
||||||
|
$database.query("INSERT INTO ticketevent VALUES('', 'CLOSE', NULL, " + yesterday2 + ", NULL, NULL, 1);")
|
||||||
|
end
|
||||||
|
for i in 0..2
|
||||||
|
$database.query("INSERT INTO ticketevent VALUES('', 'ASSIGN', NULL, " + yesterday2 + ", NULL, NULL, 1);")
|
||||||
|
end
|
||||||
|
|
||||||
|
#day 3
|
||||||
|
for i in 0..0
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'SIGNUP', NULL, " + yesterday + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..1
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'CREATE_TICKET', NULL, " + yesterday + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..4
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'CLOSE', NULL, " + yesterday + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..7
|
||||||
|
$database.query("INSERT INTO log VALUES('', 'COMMENT', NULL, " + yesterday + ", NULL, NULL);")
|
||||||
|
end
|
||||||
|
for i in 0..3
|
||||||
|
$database.query("INSERT INTO ticketevent VALUES('', 'CLOSE', NULL, " + yesterday + ", NULL, NULL, 1);")
|
||||||
|
end
|
||||||
|
for i in 0..7
|
||||||
|
$database.query("INSERT INTO ticketevent VALUES('', 'ASSIGN', NULL, " + yesterday + ", NULL, NULL, 1);")
|
||||||
|
end
|
||||||
|
|
||||||
|
@result = request('/system/get-stats', {
|
||||||
|
csrf_userid: $csrf_userid,
|
||||||
|
csrf_token: $csrf_token,
|
||||||
|
period: 'week'
|
||||||
|
})
|
||||||
|
|
||||||
|
def assertData(position, date, type, value)
|
||||||
|
(@result['data'][position]['date']).should.equal(date)
|
||||||
|
(@result['data'][position]['type']).should.equal(type)
|
||||||
|
(@result['data'][position]['value']).should.equal(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
assertData(11, '20170109', 'CREATE_TICKET', '1')
|
||||||
|
assertData(10, '20170109', 'CLOSE', '2')
|
||||||
|
assertData(9, '20170109', 'SIGNUP', '6')
|
||||||
|
assertData(8, '20170109', 'COMMENT', '3')
|
||||||
|
|
||||||
|
|
||||||
|
assertData(7, '20170110', 'CREATE_TICKET', '3')
|
||||||
|
assertData(6, '20170110', 'CLOSE', '10')
|
||||||
|
assertData(5, '20170110', 'SIGNUP', '8')
|
||||||
|
assertData(4, '20170110', 'COMMENT', '3')
|
||||||
|
|
||||||
|
assertData(3, '20170111', 'CREATE_TICKET', '2')
|
||||||
|
assertData(2, '20170111', 'CLOSE', '5')
|
||||||
|
assertData(1, '20170111', 'SIGNUP', '1')
|
||||||
|
assertData(0, '20170111', 'COMMENT', '8')
|
||||||
|
|
||||||
|
|
||||||
|
@result = request('/system/get-stats', {
|
||||||
|
csrf_userid: $csrf_userid,
|
||||||
|
csrf_token: $csrf_token,
|
||||||
|
period: 'week',
|
||||||
|
staffId: '1'
|
||||||
|
})
|
||||||
|
assertData(0, '20170111', 'CLOSE', '4')
|
||||||
|
assertData(1, '20170111', 'ASSIGN', '8')
|
||||||
|
assertData(2, '20170110', 'CLOSE', '11')
|
||||||
|
assertData(3, '20170110', 'ASSIGN', '3')
|
||||||
|
|
||||||
|
assertData(4, '20170109', 'CLOSE', '9')
|
||||||
|
assertData(5, '20170109', 'ASSIGN', '5')
|
||||||
|
assertData(6, '20170108', 'CLOSE', '0')
|
||||||
|
assertData(7, '20170108', 'ASSIGN', '0')
|
||||||
|
|
||||||
|
assertData(8, '20170107', 'CLOSE', '0')
|
||||||
|
assertData(9, '20170107', 'ASSIGN', '0')
|
||||||
|
assertData(10, '20170106', 'CLOSE', '0')
|
||||||
|
assertData(11, '20170106', 'ASSIGN', '0')
|
||||||
|
|
||||||
|
assertData(12, '20170105', 'CLOSE', '0')
|
||||||
|
assertData(13, '20170105', 'ASSIGN', '0')
|
||||||
|
assertData(14, '20170104', 'CLOSE', '0')
|
||||||
|
assertData(15, '20170104', 'ASSIGN', '0')
|
||||||
|
|
||||||
|
assertData(16, '20170103', 'CLOSE', '0')
|
||||||
|
assertData(17, '20170103', 'ASSIGN', '0')
|
||||||
|
assertData(18, '20170102', 'CLOSE', '0')
|
||||||
|
assertData(19, '20170102', 'ASSIGN', '0')
|
||||||
|
|
||||||
|
assertData(20, '20170101', 'CLOSE', '0')
|
||||||
|
assertData(21, '20170101', 'ASSIGN', '0')
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user