<?php
namespace App\Controller\Admin;
use App\Entity\Color;
use App\Entity\Commission;
use App\Entity\Coupon;
use App\Entity\Discount;
use App\Entity\DiscountName;
use App\Entity\DiscountType;
use App\Entity\Mailing;
use App\Entity\MailingList;
use App\Entity\MailingLog;
use App\Entity\Orden;
use App\Entity\PaymentMethod;
use App\Entity\Payout;
use App\Entity\PercentOff;
use App\Entity\PlatformFee;
use App\Entity\Product;
use App\Entity\Programa;
use App\Entity\ProgramaType;
use App\Entity\PromoCode;
use App\Entity\PromoCodeUsage;
use App\Entity\Provider;
use App\Entity\ProviderType;
use App\Entity\Rate;
use App\Entity\Restriction;
use App\Entity\SendgridJob;
use App\Entity\Solicitud;
use App\Entity\SolicitudPublica;
use App\Entity\Subscription;
use App\Entity\SubscriptionStatus;
use App\Entity\Tax;
use App\Entity\TaxRecord;
use App\Entity\Transaction;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
use EasyCorp\Bundle\EasyAdminBundle\Config\UserMenu;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Serializer\Normalizer\DataUriNormalizer;
use Symfony\Component\Workflow\Registry;
use Symfony\Component\Workflow\WorkflowInterface;
class DashboardController extends AbstractDashboardController
{
private $em;
private $generator;
/**
* @var Registry
*/
private $registry;
public function __construct(EntityManagerInterface $em, AdminUrlGenerator $generator, Registry $registry)
{
$this->em = $em;
$this->generator = $generator;
$this->registry = $registry;
}
public function configureAssets(): Assets
{
$r = parent::configureAssets();
// $r->addCssFile('https://cdn.jsdelivr.net/npm/uikit@3.15.19/dist/css/uikit.min.css')
// ->addJsFile('https://cdn.jsdelivr.net/npm/uikit@3.15.19/dist/js/uikit.min.js')
// ->addJsFile('https://cdn.jsdelivr.net/npm/uikit@3.15.19/dist/js/uikit-icons.min.js')
// ;
return $r;
}
public function configureCrud(): Crud
{
$r = parent::configureCrud();
return $r
->showEntityActionsAsDropdown(false)
->setPaginatorPageSize(50)
;
}
public function configureActions(): Actions
{
$r = parent::configureActions();
return $r
->remove('index', 'delete')
;
}
public function getCurrentMonth()
{
$f = new \DateTime();
return $f->format('M Y');
}
public function getPreviousMonth()
{
$f = new \DateTime();
$f2 = $f->sub(new \DateInterval('P1M'));
return $f->format('M Y');
}
/**
* @Route("/admin", name="admin")
*/
public function index(): Response
{
$r1 = []; $r2 = [];
$pcs = $this->em->getRepository(PromoCode::class)->findAll();
if($pcs){
foreach ($pcs as $pc){
$f = new \DateTime();
$f1 = $f->format('m');
$fa = $f->format('M Y');
$pcus = $this->em->getRepository(PromoCodeUsage::class)->findMonthUsage($pc, $f1);
foreach ($pcus as $pcu){
$var = 0;
$var = $pcu[1] * $pc->getCommission()->getValor();
if($var > 0)$r1[$fa][$pc->getContent()] = ['qty' => $pcu[1], 'comision' => $var];
}
$f2 = $f->sub(new \DateInterval('P1M'));
$fb = $f->format('M Y');
$pcus = $this->em->getRepository(PromoCodeUsage::class)->findMonthUsage($pc, $f2->format('m'));
foreach ($pcus as $pcu){
$var = 0;
$var = $pcu[1] * $pc->getCommission()->getValor();
if($var > 0)$r1[$fa][$pc->getContent()] = ['qty' => $pcu[1], 'comision' => $var];
}
}
}
$rs = [];
for($i = 0; $i <7; $i++){
$f1 = new \DateTime();
$f1->setDate(date('Y'), date('m')-$i, 1);
$r = $this->em->getRepository(Subscription::class)->fetchSubsByDateRange(-$i );
$rs[$f1->format('F Y')] = [count($r), $this->makeSubsLink(SubsDetailCrudController::class, 'int', -$i)];
}
$rs2 = [];
for($i = 0; $i <4; $i++){
$f1 = new \DateTime();
$f1->setDate(date('Y'), date('m')+$i, 1);
$r = $this->em->getRepository(Subscription::class)->fetchSubsByDateRange(+$i );
$rs2[$f1->format('F Y')] = [count($r), $this->makeSubsLink(SubsDetailCrudController::class, 'int', $i)];
}
$ordenes = $this->em->getRepository(Orden::class)->findBy(['currentPlace' => 'Pagada']);
return $this->render('admin/dashboard.html.twig', [
'venc' => $rs,
'venc2' => $rs2,
'vencidas' => [
'mes1' => $r2,
'mes2' => $r1,
],
'recientes' => [
'count' => $this->em->getRepository(Subscription::class)->fetchRecientes(true),
'link' => $this->makeSubsLink(SubscriptionCrudController::class, 'int', 'prox3')
],
'ordenes' => [
'count' => count($ordenes),
'link' => $this->makeSubsLink(OrdenCrudController::class, 'abiertas', 1)
],
'solicitudes' => [
'count' => count($this->em->getRepository(Solicitud::class)->findAbiertas()),
'link' => $this->makeSubsLink(SolicitudCrudController::class, 'abierta', 1)
]
]);
}
protected function makeSubsLink($class, $key, $value)
{
$link = $this->generator->setAction('index')->setController($class)->set($key, $value);
$r = $link->generateUrl();
$this->generator->unsetAll();
return $r;
}
public function configureUserMenu(UserInterface $user): UserMenu
{
$r = parent::configureUserMenu($user);
$acct = MenuItem::linkToRoute('Mi Cuenta', null, 'app_account');
return $r->addMenuItems([$acct]);
}
public function configureDashboard(): Dashboard
{
return Dashboard::new()
->disableUrlSignatures()
->setTitle('Dvpr2022');
}
public function configureMenuItems(): iterable
{
$url = $this->generator->unsetAll()->set('url','https://dvpr.computechapps.com');
yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home');
yield MenuItem::linkToCrud('Solicitudes de Reservación', 'fa fa-home', Solicitud::class)
->setQueryParameter('abierta', 1)
->setController(SolicitudCrudController::class);
yield MenuItem::linkToCrud('Solicitudes Socios', 'fa fa-home', SolicitudPublica::class)
->setController(SolicitudPublicaSocioCrudController::class);
yield MenuItem::linkToCrud('Solicitudes no Socios', 'fa fa-home', SolicitudPublica::class)
->setController(SolicitudPublicaCrudController::class);
// yield MenuItem::linkToCrud('Solicitudes no Socios', 'fa fa-home', Solicitud::class)
// ->setQueryParameter('shi', 1)
// ->setController(SolicitudNoSocioCrudController::class);
yield MenuItem::subMenu('Users', 'fa fa-user')
->setSubItems([
MenuItem::linkToCrud('Users', '', User::class)
->setQueryParameter('usertype', 'user'),
MenuItem::linkToCrud('Users Activos', '', User::class)
->setQueryParameter('status', 'Activo'),
MenuItem::linkToCrud('Users Activos 15d', '', User::class)
->setQueryParameter('status', 'Activo 15d'),
MenuItem::linkToCrud('Users Vencidos', '', User::class)
->setQueryParameter('status', 'Vencido'),
MenuItem::linkToCrud('Users Vencidos 180d', '', User::class)
->setQueryParameter('status', 'Vencido 180d'),
MenuItem::linkToCrud('Admin Users', '', User::class)
->setQueryParameter('usertype', 'admin')
]);
yield MenuItem::subMenu('Subscriptions', 'fa fa-copy')
->setSubItems([
MenuItem::linkToCrud('General', 'fa fa-home', Subscription::class),
MenuItem::linkToCrud('Activas', 'fa fa-home', Subscription::class)
->setQueryParameter('status', 1),
// MenuItem::linkToCrud('Activas 15d', 'fa fa-home', Subscription::class)
// ->setQueryParameter('place', 'Activa 15d'),
MenuItem::linkToCrud('Vencidas', 'fa fa-home', Subscription::class)
->setQueryParameter('status', 2),
// MenuItem::linkToCrud('Vencidas 180d', 'fa fa-home', Subscription::class)
// ->setQueryParameter('place', 'Vencida 180d'),
MenuItem::linkToCrud('Archivadas', 'fa fa-home', Subscription::class)
->setQueryParameter('status', 3),
// MenuItem::linkToCrud('Recientes', 'fa fa-home', Subscription::class)
// ->setQueryParameter('int', 'prox3'),
]);
// yield MenuItem::linkToCrud('Mailing', 'fa fa-envelope', Mailing::class);
yield MenuItem::subMenu('Promo Codes', 'fa fa-copy')
->setSubItems([
MenuItem::linkToCrud('Individuos', 'fa fa-code', PromoCode::class)
->setQueryParameter('sendgrid', 0),
MenuItem::linkToCrud('Sendgrid', 'fa fa-code', PromoCode::class)
->setQueryParameter('sendgrid', 1),
]);
yield MenuItem::section('');
yield MenuItem::subMenu('Mailing', 'fa fa-copy')
->setSubItems([
MenuItem::linkToRoute('Mailing Dashboard', 'fa fa-envelope', 'app_mailing'),
MenuItem::linkToCrud('Mailing Lists', 'fa fa-list', MailingList::class),
MenuItem::linkToCrud('Users SendGrid', '', User::class)
->setQueryParameter('sendgrid', 1),
MenuItem::linkToCrud('Users SendGrid Pending', '', User::class)
->setQueryParameter('sendgrid', 4),
MenuItem::linkToCrud('Users SendGrid Renovados', '', User::class)
->setQueryParameter('sendgrid', 5),
MenuItem::linkToCrud('Users no SendGrid', '', User::class)
->setQueryParameter('sendgrid', 0),
MenuItem::linkToCrud('Users no SendGrid Pending', '', User::class)
->setQueryParameter('sendgrid', 3),
MenuItem::linkToCrud('Uploading SendGrid', '', User::class)
->setQueryParameter('sendgrid', 2),
MenuItem::linkToCrud('SendGrid Jobs', '', SendgridJob::class),
]);
yield MenuItem::section('Admin');
yield MenuItem::linkToCrud('Ordenes', 'fa fa-money', Orden::class);
yield MenuItem::linkToCrud('Transacciones', 'fa fa-money', Transaction::class);
yield MenuItem::linkToCrud('Programas', 'fa fa-home', Programa::class)
->setQueryParameter('activa', 1);
yield MenuItem::linkToCrud('Productos', 'fa fa-home', Product::class)
->setQueryParameter('activa', 1);
yield MenuItem::linkToCrud('Provider', 'fa fa-home', Provider::class)
->setQueryParameter('activa', 1);
yield MenuItem::linkToCrud('Mailing Log', 'fa fa-money', MailingLog::class);
// yield MenuItem::linkToCrud('Promo Code Usage', 'fa fa-home', PromoCodeUsage::class);
yield MenuItem::linkToCrud('Payouts Pendientes', 'fa fa-home', Payout::class)
->setQueryParameter('currentPlace', 'unpaid');
yield MenuItem::subMenu('Archivo' , 'fa fa-folder-open')
->setSubItems([
MenuItem::linkToCrud('Payouts Pagados', 'fa fa-home', Payout::class)
->setQueryParameter('currentPlace', 'paid'),
MenuItem::linkToCrud('Programas', 'fa fa-home', Programa::class)
->setQueryParameter('activa', 0),
MenuItem::linkToCrud('Subscripciones', 'fa fa-home', Subscription::class)
->setQueryParameter('place', 'Archivada'),
MenuItem::linkToCrud('Productos', 'fa fa-home', Product::class)
->setQueryParameter('activa', 0),
MenuItem::linkToCrud('Provider', 'fa fa-home', Provider::class)
->setQueryParameter('activa', 0),
MenuItem::linkToCrud('Tax Record' , 'fa fa-cog', TaxRecord::class),
MenuItem::linkToCrud('Solicitudes de Reservación', 'fa fa-home', Solicitud::class)
->setQueryParameter('abierta', 0)
->setController(SolicitudCrudController::class)
]);
yield MenuItem::subMenu('Promo Code Usage')
->setSubItems([
MenuItem::linkToCrud( $this->getCurrentMonth(), 'fa fa-calendar', PromoCodeUsage::class)
->setQueryParameter('month', 'current'),
MenuItem::linkToCrud( $this->getPreviousMonth(), 'fa fa-calendar', PromoCodeUsage::class)
->setQueryParameter('month', 'previous')
]);
yield MenuItem::subMenu('Settings', 'fa fa-cogs')
->setSubItems([
MenuItem::linkToCrud('Taxes', 'fa fa-cog', Tax::class),
MenuItem::linkToCrud('Payment Methods', 'fa fa-cog', PaymentMethod::class),
MenuItem::linkToCrud('Platform Fees', 'fa fa-cog', PlatformFee::class),
MenuItem::linkToCrud('ProgramaTypes', 'fa fa-cog', ProgramaType::class),
MenuItem::linkToCrud('Provider Types', 'fa fa-cog', ProviderType::class),
MenuItem::linkToCrud('Rates', 'fa fa-cog', Rate::class),
MenuItem::linkToCrud('Discount', 'fa fa-cog', Discount::class),
MenuItem::linkToCrud('Discount Names', 'fa fa-cog', DiscountName::class),
MenuItem::linkToCrud('Discount Types', 'fa fa-cog', DiscountType::class),
MenuItem::linkToCrud('Restrictions', 'fa fa-cog', Restriction::class),
MenuItem::linkToCrud('Colors', 'fa fa-cog', Color::class),
MenuItem::linkToCrud('Commissions', 'fa fa-cog', Commission::class),
MenuItem::linkToCrud('Percents Off', 'fa fa-cog', PercentOff::class),
MenuItem::linkToCrud('Sendgrid Jobs', 'fa fa-cog', SendgridJob::class),
]);
}
//filters[fechaDeUso][comparison]=between
//&filters[fechaDeUso][value][month]=9
//&filters[fechaDeUso][value][day]=1
//&filters[fechaDeUso][value][year]=2022
//&filters[fechaDeUso][value2][month]=9
//&filters[fechaDeUso][value2][day]=30
//&filters[fechaDeUso][value2][year]=2022
}