<?php
namespace App\Controller;
use App\Entity\Document\Share;
use App\Entity\Facture\Facturation;
use App\Entity\Facture\FacturationItem;
use App\Entity\Favorites\Category;
use App\Entity\Favorites\Item;
use App\Entity\Keyi;
use App\Entity\Pdfdoc;
use App\Entity\Postit;
use App\Entity\Project\ClientUploadFile;
use App\Entity\Statvps;
use App\Entity\TMA\SiteToPing;
use App\Entity\TMA\VPSdisk;
use App\Entity\TodoTicket;
use App\Form\TodoQuickTicketType;
use App\Helper\Tools;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Facture\Facture;
use App\Entity\Document\File;
class DefaultController extends AbstractController
{
/**
* @Route("/", name="homepage")
*/
public function index(Request $request)
{
$em = $this->getDoctrine()->getManager();
// quick todo
$todo = new TodoTicket();
$todo->setPriority(1);
$form = $this->createForm(TodoQuickTicketType::class, $todo);
$form->handleRequest($request);
$allTodos = $em->getRepository(TodoTicket::class)->findMyTodo($this->getUser()->getId());
if ($form->isSubmitted() && $form->isValid()) {
$newOrder = (int) count($allTodos) + 1;
$todo->setCreationDate(new \DateTime());
$todo->setUpdateDate(new \DateTime());
$todo->setUniqid(Tools::generateStrongPassword(30, false, 'ld'));
$todo->setTorder($newOrder);
$todo->setTcolumn(1);
$todo->setSharecreated(0);
$todo->setUser($this->getUser());
$em->persist($todo);
$em->flush();
return $this->redirectToRoute('all_todo');
}
$factures = $em->getRepository(Facture::class)->findAll();
$ftab = array();
$y = date('Y')-2;
while ($y <= date('Y')) {
$m = 1;
while ($m <= 12) {
if($y == date('Y') && $m > date('m')) {
break;
}
if($m < 10) {
$mm = '0'.$m;
} else {
$mm = $m;
}
$ftab[$y.'-'.$mm] = array(
'month' => $y.'-'.$mm,
'total' => 0,
'Kelkiicom' => 0,
'Printfeu' => 0,
'GeekEtBiocom' => 0,
'NerdPixcom' => 0
);
$m++;
}
$y++;
}
$now = new \DateTime();
$tab = [];
$ytab = [];
$i6total = 0;
$real6total = 0;
$randmmonth = rand(4,12);
$randmmonth = 12;
$unpayed = false;
/** @var Facture $facture */
foreach ($factures as $facture) {
// check for unpayed
if($facture->getStatus() == Facture::FACTURE_SENDED) {
$interval = date_diff($facture->getCreated(), new \DateTime());
$intervalint = $interval->format('%a');
if($intervalint > 40) {
$unpayed[] = ['days' => $intervalint, 'facture' => $facture];
}
}
$month = $facture->getCreated()->format('Y-m');
if(isset($ftab[$month]) && ($facture->getStatus() == Facture::FACTURE_PAYED || $facture->getStatus() == Facture::FACTURE_SENDED)) {
$companys = ['Kelkii.com', 'Printf.eu', 'GeekEtBio.com', 'NerdPix.com'];
foreach ($companys as $company) {
if ($facture->getCompany() == $company) {
$sub = $ftab[$month][str_replace('.', '', $company)] + $facture->getPrice();
$ftab[$month][str_replace('.', '', $company)] = $sub;
}
}
$total = $ftab[$month]['total'] + $facture->getPrice();
$ftab[$month]['total'] = $total;
}
if($facture->getFactureLink() && ($facture->getStatus() == Facture::FACTURE_PAYED || $facture->getStatus() == Facture::FACTURE_SENDED)) {
$year = date_format($facture->getCreated(), 'Y');
$trimestre = ceil(date_format($facture->getCreated(), 'n') / 3);
if($facture->getFacturedOnFlo()) {
if(isset($tab[$year.$trimestre]['f'])) {
$tab[$year.$trimestre]['f'] = $tab[$year.$trimestre]['f'] + $facture->getPrice();
} else {
$tab[$year.$trimestre]['f'] = $facture->getPrice();
$tab[$year.$trimestre]['year'] = $year;
$tab[$year.$trimestre]['trimestre'] = $trimestre;
}
} else {
if(isset($tab[$year.$trimestre]['v'])) {
$tab[$year.$trimestre]['v'] = $tab[$year.$trimestre]['v'] + $facture->getPrice();
} else {
$tab[$year.$trimestre]['v'] = $facture->getPrice();
$tab[$year.$trimestre]['year'] = $year;
$tab[$year.$trimestre]['trimestre'] = $trimestre;
}
}
if(isset($ytab[$year]['ca'])) {
$ytab[$year]['ca'] = $ytab[$year]['ca'] + $facture->getPrice();
} else {
$ytab[$year]['ca'] = $facture->getPrice();
$ytab[$year]['year'] = $year;
}
}
// 6 total
if(($facture->getStatus() == Facture::FACTURE_PAYED || $facture->getStatus() == Facture::FACTURE_SENDED)) {
$diff = $facture->getCreated()->diff($now);
if ($diff->y === 0 && $diff->m < $randmmonth){
$real6total = $real6total + $facture->getPrice();
if($facture->getFactureLink()) {
$i6total = $i6total + $facture->getPrice();
}
}
}
}
$files = $em->getRepository(File::class)->findAll();
$filecount = 0;
$size = 0;
/** @var File $file */
foreach ($files as $file) {
$size += $file->getSize();
++$filecount;
}
// get current stats
$now = new \DateTime("now");
$pings = Tools::getFileContent('https://stats.kelkii.com/kelapi/v1/stats/ESDHSTUSFqsdqzQGTQGHSqDQsfQSDFQZEfqSGQgghQTQRGgQRGQRFDQHSRG', true);
$domains = Tools::getFileContent('https://stats.kelkii.com/kelapi/v1/domains/ESDHSTUSFqsdqzQGTQGHSqDQsfQSDFQZEfqSGQgghQTQRGgQRGQRFDQHSRG', true);
$daysData = [];
$cities = [];
$weekData = Tools::getFileContent('https://stats.kelkii.com/kelapi/v1/stats/week/stats/42ESDHSTUSdfghdfdfEfqSGQgghQTQRGgQRGQRFDQHSRG', true);
if($weekData) {
$weekData = json_decode($weekData, true);
foreach ($weekData as $dateYmd => $dayDateData) {
$daysData[$dateYmd]['day'] = date("d/m/Y", strtotime($dateYmd));
if(isset($dayDateData['app.kelkii.com'])) {
$appToday = $dayDateData['app.kelkii.com'];
foreach ($appToday as $ip => $dataApp) {
$trackIp = $dataApp['trackIp'];
if(!$trackIp) {
$query = json_decode(file_get_contents('https://stats.kelkii.com/kelapi/v1/get-ip-infos/'.$ip.'/42ESDHSzea742QGHSqDQsfQSDFQZEfqSGQgghQTQRGgQRGQRFDQHSRG'), true);
if(isset($query['city'])) {
$trackIp = $query['city'].' - '. $query['regionName'].' - '. $query['isp'] . ' - calc';
} else {
$trackIp = 'No traking data';
}
}
$daysData[$dateYmd]['data'][$ip] = [
'count' => $dataApp['count'],
'access' => $dataApp['access'],
'location' => $trackIp
];
if((bool) $dataApp['access']) {
if(strlen($dataApp['trackIp']) > 5) {
$city = explode(' - ', $dataApp['trackIp']);
if(is_array($city)) {
if(isset($city[0])) {
$cityName = strtolower($city[0]);
$cities[$cityName] = ucfirst($cityName);
}
}
}
}
}
} else {
$daysData[$dateYmd]['data'] = false;
$cities['error'] = 'Error VPS Stats !';
}
}
}
$vps = ['vps1', 'vps2'];
$vpsValues = [];
foreach ($vps as $item) {
$file = __DIR__ .'/../../../vps_stats_depot/' . $item . '.txt';
$value = substr(file_get_contents($file), -6);
$value = filter_var($value,FILTER_SANITIZE_NUMBER_INT);
$timevalue = new \DateTime(date("Y/m/d H:i", filemtime($file)));
$vpsValues[$item] = $value;
$vpsValues[$item.'time'] = $timevalue;
$vpsValues[$item.'ping'] = $now->diff($timevalue)->h;
}
$dockervps = ['dockervps1', 'dockervps2'];
$dockervpsValues = [];
foreach ($dockervps as $item) {
$file = __DIR__ .'/../../../vps_stats_depot/' . $item . '.txt';
$timevalue = new \DateTime(date("Y/m/d H:i", filemtime($file)));
$dockervpsValues[$item] = file_get_contents($file);
$dockervpsValues[$item.'time'] = $timevalue;
$dockervpsValues[$item.'ping'] = $now->diff($timevalue)->h;
}
// dump
$yesterday = $now->modify('-1 day')->format('Ymd');
$countDump = 0;
$yesterdayDump = false;
$yesterdayDumpSize = 0;
foreach (scandir(__DIR__.'/../../dumps/') as $fileDump) {
if (strpos($fileDump, ".zip") !== false) {
++$countDump;
if (!$yesterdayDump && strpos($fileDump, $yesterday) !== false) {
$yesterdayDump = true;
$yesterdayDumpSize = filesize(__DIR__.'/../../dumps/'.$fileDump);
}
}
}
// backup
// $zipBackupError = false;
// $zipBackupFile = realpath(__DIR__.'/../../').'/backup.zip';
// $zipBackupTime = new \DateTime(date("Y/m/d H:i", @filemtime($zipBackupFile)));
//
// if($now->diff($zipBackupTime)->d > 1) {
// $zipBackupError = true;
// }
// dump mysql sur vps2
$dir = __DIR__ .'/../../../vps_stats_depot/';
$dumps = preg_grep('~^dump-bdds-vps2-.*\.sql.gz$~', scandir($dir));
$dumpsinfo = [];
foreach ($dumps as $dump) {
$key = new \DateTime(date("Y/m/d H:i", filemtime($dir.$dump)));
$dumpsinfo[$key->format('YmdHi')] = filesize($dir.$dump);
}
krsort($dumpsinfo);
$currentdumpsize = array_shift($dumpsinfo);
$previousdumpsize = array_shift($dumpsinfo);
$bddprogress = 'eq';
if($currentdumpsize > $previousdumpsize) {
$bddprogress = 'more';
} elseif ($currentdumpsize < $previousdumpsize) {
$bddprogress = 'less';
}
// mysql uptime
$file = __DIR__ .'/../../../vps_stats_depot/mysqlstatus.txt';
$uptimeMysql = 0;
$uptimeinfo = explode(' ', file_get_contents($file));
if(isset($uptimeinfo[1])) {
$uptimeMysql = (int) $uptimeinfo[1];
}
$timestampmysqluptime = new \DateTime(date("Y/m/d H:i", filemtime($file)));
$vpsinfos = json_decode(Tools::getFileContent('https://stats.kelkii.com/vps/vpsinfo/42ESDHSTUSFqsdqzQGTQGHSqDQsfQSDFQZEfqSGQggTQRGgQRGQRFDQHSRG', true, 600), true);
$vpsinfosdata = [];
if (!empty($vpsinfos)) {
foreach ($vpsinfos as $vpsinfo) {
if (isset($vpsinfo['vpsId']) && isset($vpsinfo['mem_usage'])) {
$vpsinfosdata[$vpsinfo['vpsId']] = $vpsinfo['mem_usage'];
}
}
}
return $this->render('default/index.html.twig', [
'pings' => json_decode($pings, true),
'domains' => json_decode($domains, true),
'daysData' => $daysData,
'myip' => $_SERVER['REMOTE_ADDR'],
'favorites' => $em->getRepository(Item::class)->findBy(['highlighted' => 1]),
'vpsValues' => $vpsValues,
'vpsinfos' => $vpsinfosdata,
'dockervpsValues' => $dockervpsValues,
// 'vpsStats' => $vpsStats,
'unpayed' => $unpayed,
'bddprogress' => $bddprogress,
'timestampmysqluptime' => $timestampmysqluptime,
'uptimeMysql' => $uptimeMysql,
'cities' => $cities,
'size' => $size,
'count' => $filecount,
'countshare' => count($em->getRepository(Share::class)->findAll()),
'ftab' => array_reverse($ftab),
'factures' => $factures,
'trimestres' => array_reverse($tab),
'real6total' => $real6total/$randmmonth,
'i6total' => $i6total/$randmmonth,
'randmmonth' => $randmmonth,
'yesterdayDump' => $yesterdayDump,
'yesterdayDumpSize' => $yesterdayDumpSize,
'countDump' => $countDump,
// 'zipBackupSize' => @filesize($zipBackupFile),
// 'zipBackupError' => $zipBackupError,
'ca' => array_reverse($ytab),
'form' => $form->createView(),
'pageParams' => [
'title' => 'Home',
'size' => 5,
'breadcrumbs' => []
],
]);
}
/**
* @Route("/demo")
*/
public function demo()
{
$data = 'ok';
return $this->render('default/demo.html.twig', [
'data' => $data,
]);
}
public function notifications() {
return $this->render('notifications.html.twig');
}
public function catchinfos () {
return $this->render('default/error.html.twig');
}
public function bookmarks() {
$em = $this->getDoctrine()->getManager();
$topBookmarksCategories = $em->getRepository(Category::class)->findBy(['parent' => null, 'user' => $this->getUser()], ['title' => 'ASC']);
return $this->render('default/bookmarks.html.twig', [
'topBookmarksCategories' => $topBookmarksCategories
]);
}
/**
* @Route("/search", name="search_page", methods={"POST"})
*/
public function search(Request $request)
{
$em = $this->getDoctrine()->getManager();
$search = $request->request->get('search');
$postits = $em->getRepository(Postit::class)->searchPostit($search, $this->getUser()->getId());
$documents = $em->getRepository(File::class)->searchFile($search);
$favoris = $em->getRepository(Item::class)->searchItem($search);
$todos = $em->getRepository(TodoTicket::class)->searchMyTodo($this->getUser()->getId(), $search);
$keyi = $em->getRepository(Keyi::class)->findBy(['user' => $this->getUser()]);
$facturations = $em->getRepository(Facturation::class)->findAll();
$documentsclient = $em->getRepository(ClientUploadFile::class)->searchFile($search);
$pdfdocs = $em->getRepository(Pdfdoc::class)->searchFile($search);
$resultKeys = [];
/**
* @var Keyi $onekey
*/
foreach ($keyi as $onekey) {
if (strpos(strtolower($onekey->getEPData()), strtolower($search)) !== false) {
$resultKeys[] = $onekey;
} elseif (strpos(strtolower($onekey->getName()), strtolower($search)) !== false) {
$resultKeys[] = $onekey;
}
}
$resultsFacturation = [];
/**
* @var Facturation $facturation
*/
foreach ($facturations as $facturation) {
$allItems = '';
/**
* @var FacturationItem $item
*/
foreach ($facturation->getItems() as $item) {
$allItems .= $item->getDescription();
}
if (strpos(strtolower($facturation->getRealid()), strtolower($search)) !== false) {
$resultsFacturation[] = $facturation;
} elseif (strpos(strtolower($facturation->getRealfactureid()), strtolower($search)) !== false) {
$resultsFacturation[] = $facturation;
} elseif (strpos(strtolower($facturation->getName()), strtolower($search)) !== false) {
$resultsFacturation[] = $facturation;
} elseif (strpos(strtolower($facturation->getHypotheses()), strtolower($search)) !== false) {
$resultsFacturation[] = $facturation;
} elseif (strpos(strtolower($allItems), strtolower($search)) !== false) {
$resultsFacturation[] = $facturation;
}
}
return $this->render('default/search.html.twig', array(
'postits' => $postits,
'documents' => $documents,
'documentsclient' => $documentsclient,
'pdfdocs' => $pdfdocs,
'todos' => $todos,
'favoris' => $favoris,
'facturations' => $resultsFacturation,
'resultKeys' => $resultKeys,
'pageParams' => [
'title' => $search,
'domain' => 'search',
'breadcrumbs' => []
],
));
}
/**
* @Route("/ajax/vps_docker_popin/{vpsid}", name="vps_docker_popin")
*/
public function vpsDockerPopin($vpsid, EntityManagerInterface $entityManager)
{
$item = 'dockervps'.$vpsid;
$dockervpsValues = [];
$dir = __DIR__ .'/../../../vps_stats_depot/';
$file = $dir . $item . '.txt';
$timevalue = new \DateTime(date("Y/m/d H:i", filemtime($file)));
// parse containers
$containers = [];
foreach (file($file) as $line) {
$linedata = explode('_', $line);
$containers[$linedata[0]][] = str_replace($linedata[0].'_', '', $line);
}
$dockervpsValues['containers'] = $containers;
$dockervpsValues['containerstime'] = $timevalue;
$backups = preg_grep('~^backup-vps'.$vpsid.'-.*\.zip$~', scandir($dir));
$backupsinfo = [];
foreach ($backups as $backup) {
$key = new \DateTime(date("Y/m/d H:i", filemtime($dir.$backup)));
$backupsinfo[$key->format('YmdHi')] = [
'name' => $backup,
'time' => new \DateTime(date("Y/m/d H:i", filemtime($dir.$backup))),
'size' => filesize($dir.$backup)
];
}
krsort($backupsinfo);
$sizeinfo = [];
foreach (file($dir.'dockersizevps'.$vpsid.'.txt') as $line) {
$data = explode('/', $line);
$sizeinfo[str_replace(array("\r\n", "\r", "\n", "\t"," "), '', end($data))] = str_replace(array("\r\n", "\r", "\n", "\t"," "), '', $data[0]);
}
$sizeinfoold = [];
foreach (file($dir.'dockersizevps'.$vpsid.'-old.txt') as $line) {
$data = explode('/', $line);
$sizeinfoold[str_replace(array("\r\n", "\r", "\n", "\t"," "), '', end($data))] = str_replace(array("\r\n", "\r", "\n", "\t"," "), '', $data[0]);
}
$sizeinfooldold = [];
foreach (file($dir.'dockersizevps'.$vpsid.'-oldold.txt') as $line) {
$data = explode('/', $line);
$sizeinfooldold[str_replace(array("\r\n", "\r", "\n", "\t"," "), '', end($data))] = str_replace(array("\r\n", "\r", "\n", "\t"," "), '', $data[0]);
}
$sizehisto = [];
foreach ($entityManager->getRepository(VPSdisk::class)->findBy(['vps' => $vpsid]) as $onehisto) {
$sizehisto[] = [
'logDate' => $onehisto->getLogDate()->format('Y-m-d'),
'percent' => $onehisto->getPercent(),
];
}
$vpsinfo = json_decode(file_get_contents('https://stats.kelkii.com/vps/get/42ESDHSTUSFqsdqzQGTQGHSqDQsfQSDFQZEfqSGQggTQRGgQRGQRFDQHSRG/'.$vpsid));
$vpsdockerinfo = json_decode(file_get_contents('https://stats.kelkii.com/vpsdocker/get/42ESDHSTUSFqsdqzQGTQGHSqDQsfQSDFQZEfqSGQggTQRGgQRGQRFDQHSRG/'.$vpsid));
return $this->render('default/vpspopin.html.twig', array(
'vpsid' => $vpsid,
'sizehisto' => $sizehisto,
'backups' => $backupsinfo,
'sizeinfo' => $sizeinfo,
'vpsinfo' => $vpsinfo,
'vpsdockerinfo' => $vpsdockerinfo,
'vpsinfolastping' => end($vpsinfo),
'sizeinfoold' => $sizeinfoold,
'sizeinfooldold' => $sizeinfooldold,
'dockervpsValues' => $dockervpsValues,
));
}
/**
* @Route("/ajax/bdd_docker_popin/{vpsid}", name="bdd_docker_popin")
*/
public function bddDockerPopin($vpsid)
{
$dir = __DIR__ .'/../../../vps_stats_depot/';
// dump de la bdd mysql sur vps2
$dumps = preg_grep('~^dump-bdds-vps'.$vpsid.'-.*\.sql.gz$~', scandir($dir));
$dumpsinfo = [];
foreach ($dumps as $dump) {
$key = new \DateTime(date("Y/m/d H:i", filemtime($dir.$dump)));
$dumpsinfo[$key->format('YmdHi')] = [
'name' => $dump,
'time' => new \DateTime(date("Y/m/d H:i", filemtime($dir.$dump))),
'size' => filesize($dir.$dump)
];
}
krsort($dumpsinfo);
// bdd mysql size
$mysqlsize = false;
$allbdds = false;
$bddsizefile = $dir.'vps'.$vpsid.'bddsize.txt';
if(file_exists($bddsizefile)) {
foreach (file($bddsizefile) as $line) {
$linedata = explode("\t", $line);
$onesize = $linedata[0];
$bdd = trim(preg_replace('/\s\s+/', ' ', $linedata[1]));
if($bdd == "/var/lib/mysql") {
$mysqlsize = (int) $onesize * 1024;
} elseif($bdd != '/var/lib/mysql/sys' && $bdd != '/var/lib/mysql/performance_schema' && $bdd != '/var/lib/mysql/mysql' && $bdd != '/var/lib/mysql/phpmyadmin') {
$allbdds[str_replace('/var/lib/mysql/', '', $bdd)] = (int) $onesize * 1024;
}
}
}
$timestamp = new \DateTime(date("Y/m/d H:i", filemtime($bddsizefile)));
// mysql uptime
$file = __DIR__ .'/../../../vps_stats_depot/mysqlstatus.txt';
$uptimeMysql = false;
$uptimeinfo = explode(' ', file_get_contents($file));
if(isset($uptimeinfo[1])) {
$uptimeMysql = Tools::secondsToTime($uptimeinfo[1]);
}
$timestampmysqluptime = new \DateTime(date("Y/m/d H:i", filemtime($file)));
$vpsqueriesinfo = json_decode(file_get_contents('https://stats.kelkii.com/vpsqueries/getqueries/42ESDHSTUSFqsdqzQGTQGHSqDQsfQSDFQZEfqSGQggTQRGgQRGQRFDQHSRG'));
return $this->render('default/bddpopin.html.twig', array(
'vpsid' => $vpsid,
'allbdds' => $allbdds,
'bddsizefile' => $mysqlsize,
'dumps' => $dumpsinfo,
'timestamp' => $timestamp,
'uptimeMysql' => $uptimeMysql,
'timestampmysqluptime' => $timestampmysqluptime,
'vpsqueriesinfo' => $vpsqueriesinfo,
));
}
/**
* @Route("/dumpmysql/onserver/dl/{file}", name="dl_dump_mysql")
*/
public function dlDumpMysql(Request $request, $file)
{
set_time_limit(300);
$file = urldecode($file);
$chunksize = 5 * (1024 * 1024); //5 MB (= 5 242 880 bytes) per one chunk of file.
$filename = __DIR__ .'/../../../vps_stats_depot/'.$file;
$size = intval(sprintf("%u", filesize($filename)));
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.$size);
header('Content-Disposition: attachment;filename="'.basename($filename).'"');
if($size > $chunksize)
{
$handle = fopen($filename, 'rb');
while (!feof($handle))
{
print(@fread($handle, $chunksize));
ob_flush();
flush();
}
fclose($handle);
}
else readfile($filename);
exit;
}
}