<?php
namespace EADPlataforma\Controller\Admin;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use EADPlataforma\Entity\Configuration;
use EADPlataforma\Entity\TransactionItem;
use EADPlataforma\Entity\LessonLog;
use EADPlataforma\Entity\LessonLogOrigin;
use EADPlataforma\Entity\CourseCertificate;
use EADPlataforma\Entity\Enrollment;
use EADPlataforma\Entity\Commission;
use EADPlataforma\Entity\Session;
use EADPlataforma\Entity\User;
use EADPlataforma\Entity\UserSubscription;
use EADPlataforma\Entity\Eadmin\Banner;
use EADPlataforma\Enum\AbstractEnum;
use EADPlataforma\Enum\TransactionEnum;
use EADPlataforma\Enum\TransactionItemEnum;
use EADPlataforma\Enum\Eadmin\BannerEnum;
use EADPlataforma\Enum\ErrorEnum;
/**
* @Route(
* path = "/admin/dashboard",
* schemes = {"https","http"}
* )
* @Cache(
* maxage = "0",
* smaxage = "0",
* expires = "now",
* public = false
* )
*/
class DashboardController extends AbstractController {
public function getEntityClass(){
return Configuration::class;
}
/**
* @Route(
* path = "/general",
* methods = {"GET"}
* )
*/
public function getDashboardGeneral(Request $request) {
$permission = $this->userPermissionUtil->getPermission("dashboard", "see");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$userCommissionId = null;
if($this->userPermissionUtil->isMiddle($permission)){
$userCommissionId = $this->user->getId();
}
$this->requestUtil->setRequest($request)->setData();
$bannerRepository = $this->emEadmin->getRepository(Banner::class);
$plan = $this->configuration->getPlan();
$fileService = $this->generalService->getService('FileService');
$data = (object)[
"configPercentInfo" => $this->configuration->getPercentConfigurationSchool(),
"planName" => ($plan ? $plan->getTitle() : null),
"diskPercent" => $fileService->getClientSpaceDisk()->diskPercent,
"banners" => $bannerRepository->findBanners(BannerEnum::DASHBOARD),
];
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/payments",
* methods = {"GET"}
* )
*/
public function getDashboardPayments(Request $request) {
$permission = $this->userPermissionUtil->getPermission("dashboard", "see");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$userCommissionId = null;
if($this->userPermissionUtil->isMiddle($permission)){
$userCommissionId = $this->user->getId();
}
$this->requestUtil->setRequest($request)->setData();
$period = (int)$this->requestUtil->getField('period');
$dateStart = null;
$dateEnd = null;
$data = [];
if($period != AbstractEnum::FILTER_PERIOD_All){
$dateTimeUtil = $this->generalService->getUtil('DateTimeUtil');
$dates = $dateTimeUtil->periodDate(
$period,
$this->requestUtil->getField('dateStart'),
$this->requestUtil->getField('dateEnd')
);
$dateStart = $dates->dateStart;
$dateEnd = $dates->dateEnd;
}
$transactionItemRepository = $this->em->getRepository(TransactionItem::class);
$commissionRepository = $this->em->getRepository(Commission::class);
$commissions = [];
if($this->userPermissionUtil->isHigh($permission)){
$commissions = $commissionRepository->getComissionDash($dateStart, $dateEnd);
}
$data = (object)[
"configPercentInfo" => $this->configuration->getPercentConfigurationSchool(),
"commissions" => $commissions
];
$dataStatus = (object)[
"approved" => TransactionEnum::APPROVED,
"waiting" => TransactionEnum::WAITING,
"canceled" => TransactionEnum::CANCELED,
];
$dataProduct = (object)[
"course" => TransactionItemEnum::COURSE,
"subscription" => TransactionItemEnum::SUBSCRIPTION,
"combo" => TransactionItemEnum::COMBO,
"period" => TransactionItemEnum::PERIOD,
"support" => TransactionItemEnum::SUPPORT,
"certificate" => TransactionItemEnum::CERTIFICATE,
//"live" => TransactionItemEnum::LIVE,
"charge" => TransactionItemEnum::CHARGE,
];
foreach ($dataStatus as $key => $status) {
$data->{$key} = (object)[
"number" => $transactionItemRepository->countTransactionItens(
$status,
null,
null,
$userCommissionId,
$dateStart,
$dateEnd
),
"amount" => $transactionItemRepository->sumTransactionItens(
$status,
null,
null,
$userCommissionId,
$dateStart,
$dateEnd
),
];
}
foreach ($dataProduct as $key => $productType) {
$data->{$key} = (object)[
"number" => $transactionItemRepository->countTransactionItens(
TransactionEnum::APPROVED,
$productType,
null,
$userCommissionId,
$dateStart,
$dateEnd
),
"amount" => $transactionItemRepository->sumTransactionItens(
TransactionEnum::APPROVED,
$productType,
null,
$userCommissionId,
$dateStart,
$dateEnd
),
];
}
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/school",
* methods = {"GET"}
* )
*/
public function getDashboardSchool(Request $request) {
$permission = $this->userPermissionUtil->getPermission("dashboard", "see");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$userCommissionId = null;
if($this->userPermissionUtil->isMiddle($permission)){
$userCommissionId = $this->user->getId();
}
$this->requestUtil->setRequest($request)->setData();
$period = (int)$this->requestUtil->getField('period');
$dateStart = null;
$dateEnd = null;
$data = [];
if($period != AbstractEnum::FILTER_PERIOD_All){
$dateTimeUtil = $this->generalService->getUtil('DateTimeUtil');
$dates = $dateTimeUtil->periodDate(
$period,
$this->requestUtil->getField('dateStart'),
$this->requestUtil->getField('dateEnd')
);
$dateStart = $dates->dateStart;
$dateEnd = $dates->dateEnd;
}
$userRepository = $this->em->getRepository(User::class);
$sessionRepository = $this->em->getRepository(Session::class);
$lessonLogOriginRepository = $this->em->getRepository(LessonLogOrigin::class);
$uSRepository = $this->em->getRepository(UserSubscription::class);
$enrollmentRepository = $this->em->getRepository(Enrollment::class);
$courseCertificateRepository = $this->em->getRepository(CourseCertificate::class);
$data = [
"userNewTotal" => $userRepository->getNewUsersNumber($dateStart, $dateEnd),
"userActiveTotal" => $sessionRepository->getAllActiveUserSession($dateStart, $dateEnd),
"enrollmentTotal" => $enrollmentRepository->getEnrollmentNumber(
$dateStart,
$dateEnd
),
"lessonsCompleteTotal" => $lessonLogOriginRepository->countLessonLogOriginComplete(
$dateStart,
$dateEnd
),
"certificateTotal" => $courseCertificateRepository->getCourseCertificateNumber(
$dateStart,
$dateEnd
),
"userSubscriptionActiveTotal" => $uSRepository->getUserSubscriptionActiveNumber(
$dateStart,
$dateEnd
),
"userSubscriptionCanceledTotal" => $uSRepository->getUserSubscriptionCanceledNumber(
$dateStart,
$dateEnd
),
];
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/graph/payments",
* methods = {"GET"},
* )
*/
public function getPaymentsGraph(Request $request) {
$permission = $this->userPermissionUtil->getPermission("dashboard", "see");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$userCommissionId = null;
if($this->userPermissionUtil->isMiddle($permission)){
$userCommissionId = $this->user->getId();
}
$this->requestUtil->setRequest($request)->setData();
$filterDateRegister = (int)$this->requestUtil->getField('filterDateRegister');
$period = (int)$this->requestUtil->getField('period');
$dateStart = null;
$dateEnd = null;
if($period != AbstractEnum::FILTER_PERIOD_All){
$dateTimeUtil = $this->generalService->getUtil('DateTimeUtil');
$dates = $dateTimeUtil->periodDate(
$period,
$this->requestUtil->getField('dateStart'),
$this->requestUtil->getField('dateEnd')
);
$dateStart = $dates->dateStart;
$dateEnd = $dates->dateEnd;
}
$transactionItemRepository = $this->em->getRepository(TransactionItem::class);
$data = [
"dataGraphNumber" => $transactionItemRepository->getTransactionItemGraphNumber(
$dateStart,
$dateEnd,
$filterDateRegister,
$userCommissionId
),
"dataGraphValue" => $transactionItemRepository->getTransactionItemGraphValue(
$dateStart,
$dateEnd,
$filterDateRegister,
$userCommissionId
)
];
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/graph/school",
* methods = {"GET"},
* )
*/
public function getGraphSchool(Request $request) {
$permission = $this->userPermissionUtil->getPermission("dashboard", "see");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$filterDateRegister = (int)$this->requestUtil->getField('filterDateRegister');
$period = (int)$this->requestUtil->getField('period');
$dateStart = null;
$dateEnd = null;
if($period != AbstractEnum::FILTER_PERIOD_All){
$dateTimeUtil = $this->generalService->getUtil('DateTimeUtil');
$dates = $dateTimeUtil->periodDate(
$period,
$this->requestUtil->getField('dateStart'),
$this->requestUtil->getField('dateEnd')
);
$dateStart = $dates->dateStart;
$dateEnd = $dates->dateEnd;
}
$userRepository = $this->em->getRepository(User::class);
$sessionRepository = $this->em->getRepository(Session::class);
$userSubscriptionRepository = $this->em->getRepository(UserSubscription::class);
$dataGraphNewUser = $userRepository->getNewUsersGraph(
$dateStart,
$dateEnd,
$filterDateRegister
);
$dataGraphActiveUser = $sessionRepository->getActiveUserGraph(
$dateStart,
$dateEnd,
$filterDateRegister
);
$seriesCategory = [];
foreach ($dataGraphNewUser as $key => $item) {
$item = (object)$item;
$seriesCategory[$item->date] = (object)[
"new" => $item->total,
"active" => 0,
];
}
foreach ($dataGraphActiveUser as $key => $item) {
$item = (object)$item;
if(!empty($seriesCategory[$item->date])){
$seriesCategory[$item->date]->active = $item->total;
}else{
$seriesCategory[$item->date] = (object)[
"new" => 0,
"active" => $item->total,
];
}
}
ksort($seriesCategory, SORT_STRING);
$dataActive = $userSubscriptionRepository->getUserSubscriptionGraphActive(
$dateStart,
$dateEnd,
$filterDateRegister
);
$dataReactivation = $userSubscriptionRepository->getUserSubscriptionGraphReactivation(
$dateStart,
$dateEnd,
$filterDateRegister
);
$dataCanceled = $userSubscriptionRepository->getUserSubscriptionGraphCanceled(
$dateStart,
$dateEnd,
$filterDateRegister
);
$dataGraphUserSubscription = [];
foreach ($dataActive as $key => $item) {
$item['active'] = (int)$item['active'];
$item['canceled'] = (int)$item['canceled'];
$key_r = $userSubscriptionRepository->searchPositionFromField(
'date',
$item['date'],
$dataReactivation
);
if(!empty($dataCanceled[$key_r])){
$item['active'] = $item['active'] + $dataReactivation[$key_r]['active'];
unset($dataReactivation[$key_r]);
}
$key_c = $userSubscriptionRepository->searchPositionFromField(
'date',
$item['date'],
$dataCanceled
);
if(!empty($dataCanceled[$key_c])){
$item['canceled'] = $item['canceled'] + $dataCanceled[$key_c]['canceled'];
unset($dataCanceled[$key_c]);
}
$dataGraphUserSubscription[] = $item;
}
$dates = [];
$dataGraphUserSubscription = array_merge(
$dataGraphUserSubscription,
$dataReactivation,
$dataCanceled
);
foreach ($dataGraphUserSubscription as $key => $item) {
$dates[] = $item['date'];
}
array_multisort($dates, SORT_ASC, $dataGraphUserSubscription);
$data = [
"dataGraphUserSubscription" => $dataGraphUserSubscription,
"seriesCategory" => $seriesCategory
];
return $this->eadResponse($data);
}
}