<?php
namespace App\Controller;
use App\Core\AccManager;
use App\Core\Messages;
use App\Core\Models\Events\PageLoaded;
use App\Core\Models\Events\UserSettingsSave;
use App\Core\Models\Quest\AbstractedQuest;
use App\Core\ResearchManager;
use App\WHO\Models\Quest\Report01UpdateManual;
use App\WHO\Models\QuestLine;
use App\WHO\Models\Report\ReportAgentAwaiting;
use App\WHO\Models\Report\ReportCoAwaiting;
use App\WHO\SettingsManager;
use App\MyStore\API\MSJF;
use App\WHO\Models\UserSettings;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Twig\Environment;
/**
* Controller used to manage qrCodes.
*
* @Route("/who")
*
*/
class WHOController extends AbstractController
{
use \App\Core\TraitExecSQL;
public function __construct()
{
@session_start();
}
/**
* @Route("/settings/save", methods="POST", name="whoSettingsPersists")
*/
public function whoSettingsPersists(
Request $request,
SettingsManager $settingsManager,
AccManager $accManager,
MSJF $MSJF
): Response {
if (!$accManager->currentAccId(0)) {
return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
}
$answer = ['result' => false, 'error' => 'Внутренняя ошибка сервера, мы уже работаем над ее исправлением!'];
if ($accManager->isAdmin()) {
try {
$data = file_get_contents('php://input');
$accId = $accManager->currentAccId();
if (($accId) > 0) {
$data = \json_decode($data, true);
if (isset($data['settings'])) {
$s = $data['settings'];
$us = new UserSettings();
$us::fillFromDB($us, $s);
if (1) {
/**
* @TODO зарефакторить эту отправку сообщений клиенту через квесты.
* Нужно уметь отправлять напрямую, наверное.
*/
$ql = new AbstractedQuest($accManager);
$ql->msgManager->reg('UPDATE_SETTINGS');
}
if ($saveAnswer = $settingsManager->persists($us)) {
$answer = [
'result' => true,
'settings' => $settingsManager->loadSettings()
];
/**
* если установлена галочка, пробуем проставить вебхук на приемку.
*/
if ($us->report01UpdateByWebhooks || $us->isCreateTaskByWebhook) {
try {
$whs = $MSJF->webhook()->all();
} catch (\Throwable $t) {
$this->logException($t);
}
if ($accId == 104) {
$answer['d'] = 1;
}
if (is_array($whs)) {
$MSJF->webhook()->create(
MSJF::DT_SUPPLY,
'https://' . $_SERVER['HTTP_HOST'],
$accManager->currentAccId()
);
// $ql->msgManager->reg($_SERVER['HTTP_HOST'].'::'.$accManager->currentAccId());
} else {
$ql->msgManager->reg(
'Для установки вебхуков приложению требуются права администратора. Переустановите приложение, пожалуйста.'
);
}
} else {
$isDeleted = false;
try {
$whs = $MSJF->webhook()->all();
} catch (\Throwable $t) {
$this->logException($t);
}
if ($accId == 104) {
$answer['d'] = is_array($whs);
}
if (is_array($whs)) {
foreach ($whs as $wh) {
if ($wh->entityType == MSJF::DT_SUPPLY && stripos(
$wh->url,
$_SERVER['HTTP_HOST'],
) !== false) {
$MSJF->webhook()->delete($wh->id);
$isDeleted = true;
}
}
}
if ($isDeleted) {
$ql->msgManager->reg('Вебхуки успешно удалены.');
}
}
} else {
$answer = ['result' => false, 'error' => $settingsManager->getLog()];
}
} else {
$answer = [
'result' => false,
'error' => 'Ошибка разбора запроса. Попробуйте обновить страницу и повторить.'
];
}
} else {
$answer['error'] = 'Сессия завершена из-за отсутствия активности, обновите страницу';
}
} catch (\Throwable $t) {
$answer = ['result' => false, 'error' => $t->getMessage(), 'trace' => $t->getTraceAsString()];
}
} else {
$answer['error'] = 'Только администратор аккаунта может изменять настройки.';
}
return new JsonResponse($answer);
}
/**
* @Route("/settings", methods="GET", name="whoSettings")
*/
public function whoSettings(
Request $request,
SettingsManager $settingsManager,
AccManager $accManager,
MSJF $MSJF
): Response {
if (!$accManager->currentAccId(false)) {
return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
}
$MSJF->setAccount($accManager);
$this->fireEventPageLoad($accManager);
$answer = $this->generateDefTemplateAnswer($accManager, $settingsManager);
$answer['settings'] = json_decode($answer['settings']);
try {
$answer['settings']->employees = $MSJF->employee()->toSelect()->all();
usleep(500);
$answer['settings']->coStatesAsOptions = $MSJF->states()->forDocument(MSJF::DT_CUSTOMER_ORDER)->toSelect(
)->all();
} catch (\Throwable $t) {
sleep(1);
try {
$answer['settings']->coStatesAsOptions = $MSJF->states()->forDocument(
MSJF::DT_CUSTOMER_ORDER
)->toSelect()->all();
} catch (\Throwable $t) {
$this->logException($t);
}
}
$answer['settings'] = json_encode($answer['settings']);
return $this->render('who/settings.html.twig', $answer);
}
/**
* @Route("/settings/get", methods="GET", name="whoSettingsGet")
*/
public function whoSettingsGet(
Request $request,
SettingsManager $settingsManager,
AccManager $accManager,
MSJF $MSJF
): Response {
//-- проще мотануть вот эту дичь, чем создавать запросы ИМХО.
$answer = $this->generateDefTemplateAnswer($accManager, $settingsManager, false);
$answer['settings'] = json_decode($answer['settings']);
$answer['settings']->coStatesAsOptions = $MSJF->states()->forDocument(MSJF::DT_CUSTOMER_ORDER)->toSelect()->all(
);
// $answer['accId'] = $accManager->currentAccId();
// $answer['settings']->miBPMS = rand(0,1);
// $answer['settings']->miReports = rand(0,1);
return new JsonResponse($answer);
}
/**
* @Route("/report01", methods="GET", name="whoReport01")
*/
public function whoReport01(Request $request, AccManager $accManager, SettingsManager $settingsManager): Response
{
$this->fireEventPageLoad($accManager);
$answer = $this->generateDefTemplateAnswer($accManager, $settingsManager);
return $this->render('who/report01.html.twig', $answer);
}
/**
* @Route("/report01/get", methods="GET", name="whoReports01Get")
*/
public function whoReports01Get(
Request $request,
AccManager $accManager
): Response {
if (!$accManager->currentAccId()) {
return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
}
$report = new ReportCoAwaiting($accManager);
$reportData = $report->getReportData();
//$reportData['result'] = array_slice( $reportData['result'] ,0,1);
if (is_array($reportData) && $reportData['updated']) {
$reportData['updatedDate'] = date('d.m.Y H:i', $reportData['updated'] ?? 0);
} else {
$reportData = ['updatedDate' => 0];
}
return new JsonResponse([
'report01' => $reportData,
'd' => date('Y-m-d'),
//'l' => $report->getLog()
]
);
}
/**
* запрос на обновление данных по отчету.
* @Route("/report01/reload", methods="POST", name="whoReports01Reload")
*/
public function whoReports01Reload(
Request $request,
AccManager $accManager
): Response {
$this->fireEventPageLoad($accManager);
if (!$accManager->currentAccId()) {
return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
}
$updater = new Report01UpdateManual($accManager);
$updater->install();
return new JsonResponse([
]
);
}
/**
* @Route("/report02", methods="GET", name="whoReport02")
*/
public function whoReport02(Request $request, AccManager $accManager, SettingsManager $settingsManager): Response
{
$this->fireEventPageLoad($accManager);
/** @var Environment $twig */
$twig = $this->container->get('twig');
try {
$twig->setCache(false);
$twig->enableAutoReload();
} catch (\Throwable $t) {
print_r($t->getMessage());
die();
}
$answer = $this->generateDefTemplateAnswer($accManager, $settingsManager);
return $this->render('who/report02.html.twig', $answer);
}
/**
* @Route("/report02/get", methods="GET", name="whoReports02Get")
*/
public function whoReports02Get(
Request $request,
AccManager $accManager
): Response {
if (!$accManager->currentAccId()) {
return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
}
$report = new ReportAgentAwaiting($accManager);
$reportData = $report->getReportData();
if (is_array($reportData) && $reportData['updated']) {
$reportData['updatedDate'] = date('d.m.Y H:i', $reportData['updated'] ?? 0);
} else {
$reportData = ['updatedDate' => 0];
}
/**
* подсчет потоварной статистики.
* @TODO перенести это в формирование отчета!
*/
$byAssortmentId = [];
$rData = $reportData['result'];
if (is_array($rData)) {
foreach ($rData as $supplierInfo) {
foreach ($supplierInfo['positions'] as $order) {
$assortmentId = $order['position']['assortment']['id'];
$storeId = $order['store']['id'];
if (!isset($byAssortmentId[$assortmentId])) {
$byAssortmentId[$assortmentId] = [];
}
if (!isset($byAssortmentId[$assortmentId][$storeId])) {
$byAssortmentId[$assortmentId][$storeId] = [
'assortment' => $order['position']['assortment'],
'quantity' => 0,
'intransit' => 0,
'stock' => 0,
'expectedDate' => $order['position']['expectedDate'] ?? '-',
'storeName' => $order['store']['name'],
];
}
$byAssortmentId[$assortmentId][$storeId]['stock'] = $order['position']['stock']['quantity'];
$byAssortmentId[$assortmentId][$storeId]['quantity'] += $order['position']['quantity'];
$byAssortmentId[$assortmentId][$storeId]['intransit'] = $order['position']['stock']['intransit'];
}
}
}
$reportData['assortment'] = $byAssortmentId;
return new JsonResponse([
'report02' => $reportData,
'd' => date('Y-m-d'),
//'l' => $report->getLog()
]
);
}
/**
* отменяет всё, что было сделано в аккаунте.
* @Route("/reset", methods="POST", name="whoSettingsReset")
*/
public function whoSettingsReset(
Request $request,
SettingsManager $settingsManager,
AccManager $accManager
): Response {
if (!$accManager->currentAccId()) {
return new JsonResponse(['error' => 'Сессия завершена, обновите страничку и повторите операцию']);
}
$answer = ['result' => false, 'error' => 'Внутренняя ошибка сервера, мы уже работаем над ее исправлением!'];
if ($accManager->isAdmin()) {
try {
$data = file_get_contents('php://input');
$accId = $accManager->currentAccId();
if (($accId) > 0) {
$data = \json_decode($data, true);
$us = new UserSettings();
$sm = new SettingsManager($accManager);
$sm->persists($us);
$ql = new QuestLine($accManager);
$ql->fillLine4Acc(['Core', 'WHO']);
$msg = new Messages($accManager);
$msg->reg('База данных аккаунта очищена, все настройки удалены');
$msg->reg('UPDATE_SETTINGS');
if ($saveAnswer = $settingsManager->persists($us)) {
$response = $this->forward('App\Controller\WHOController::whoSettingsGet', [
]);
return $response;
} else {
$answer = ['result' => false, 'error' => $settingsManager->getLog()];
}
} else {
$answer = [
'result' => false,
'error' => 'Ошибка разбора запроса. Попробуйте обновить страницу и повторить.'
];
}
} catch (\Throwable $t) {
$answer = ['result' => false, 'error' => $t->getMessage(), 'trace' => $t->getTraceAsString()];
}
} else {
$answer['error'] = 'Только администратор аккаунта может изменять настройки.';
}
return new JsonResponse($answer);
}
public function generateDefTemplateAnswer(
AccManager $accManager,
SettingsManager $settingsManager,
$isRegEvent = true
) {
$settings = $settingsManager->loadSettings();
$questLine = new QuestLine($accManager);
$settings->activeQuests = $questLine->getActiveQuests();
$settings->role = $accManager->isAdmin() ? 'admin' : 'user';
$settings->expCurrent = $questLine->calcCurrentExp();
$settings->expMax = 2000;
$settings->lvl = 0;
$settings->version = 220301;
$settings->company = $accManager->getName4Acc($accManager->currentAccId());
$settings->sid = session_id();
$settings->accId = $accManager->currentAccId();
return [
'settings' => \json_encode($settings),
'role' => $accManager->isAdmin() ? 'admin' : 'user',
];
}
protected function fireEventPageLoad(AccManager $accManager)
{
if ($accId = $accManager->currentAccId()) {
$questLine = new QuestLine($accManager);
try {
$pageRoute = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];
} catch (\Throwable $t) {
$this->logException($t);
$pageRoute = '';
}
try {
$e = (new PageLoaded())->setRoute($pageRoute);
$questLine->fireEvent($e);
} catch (\Throwable $t) {
$this->logException($t);
}
return $pageRoute;
} else {
return false;
}
}
/**
* @Route("/laboratory", methods="GET", name="whoLabs")
*/
public function whoLabs(
Request $request,
SettingsManager $settingsManager,
AccManager $accManager,
MSJF $MSJF
): Response {
//$accManager->setAccId($_SESSION['ad']);
$accManager->currentAccId();
$MSJF->setAccount($accManager);
$this->fireEventPageLoad($accManager);
$answer = $this->generateDefTemplateAnswer($accManager, $settingsManager);
$answer['settings'] = json_decode($answer['settings']);
$answer['settings'] = json_encode($answer['settings']);
return $this->render('who/lab.html.twig', $answer);
}
/**
* @Route("/research/get", methods="GET", name="whoLabGetResearch")
*/
public function whoLabGetResearch(
Request $request,
SettingsManager $settingsManager,
AccManager $accManager,
ResearchManager $researchManager
): Response {
if (!$accManager->currentAccId()) {
die('Сессия завершена из-за отсутствия активности, обновите страничку и повторите операцию');
}
$this->fireEventPageLoad($accManager);
$answer = [
'research' => $researchManager->load(1)
];
return new JsonResponse($answer);
}
/**
* @Route("/empl/test", methods="GET", name="whoTest")
*/
public function whoTest(
Request $request,
SettingsManager $settingsManager,
AccManager $accManager,
MSJF $MSJF
): Response {
var_dump($accManager->currentAccId());
if (!$accManager->currentAccId()) {
die('Сессия завершена из-за отсутствия активности, обновите страничку и повторите операцию');
}
$MSJF->setAccount($accManager);
$this->fireEventPageLoad($accManager);
$answer = $this->generateDefTemplateAnswer($accManager, $settingsManager);
$answer['settings'] = json_decode($answer['settings']);
$answer['settings']->coStatesAsOptions = $MSJF->states()->forDocument(MSJF::DT_CUSTOMER_ORDER)->toSelect()->all(
);
$answer['settings'] = json_encode($answer['settings']);
$customerController = 'App\Controller\Customer\User' . $_SESSION['ad'] . 'Controller::' . ($_GET['ac'] ?? 'defAction');
$response = $this->forward($customerController, ['answer' => $answer]);
return $response;
}
/**
* @Route("/ping", methods="GET", name="whoPingMessages")
*/
public function whoPingMessages(
Request $request,
SettingsManager $settingsManager,
AccManager $accManager,
Messages $messages
): Response {
$answer = ['result' => false, 'error' => 'Внутренняя ошибка сервера, мы уже работаем над ее исправлением!'];
if (!$accManager->currentAccId()) {
$answer['error'] = 'Сессия завершена из-за отсутствия активности, обновите страницу';
}
$answer = ['result' => true];
unset($answer['error']);
$msg = $messages->getMessages4UI();
//$msg[1] = 'EMIT_on-update-users';
//$msg[1] = 'UPDATE_SETTINGS';
if (sizeof($msg)) {
$answer['messages'] = $msg;
}
//
$answer['s'] = $accManager->currentAccId();
return new JsonResponse($answer);
}
protected function _cleanTwigCache(): void
{
/** @var Environment $twig */
$twig = $this->container->get('twig');
try {
$twig->setCache(false);
$twig->enableAutoReload();
} catch (\Throwable $t) {
print_r($t->getMessage());
die();
}
}
}