<?php
namespace App\Controller\Admin;
use App\Controller\Admin\Filter\HcpFilter;
use App\Entity\Order;
use App\Service\CsvExporter;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
use EasyCorp\Bundle\EasyAdminBundle\Field\MoneyField;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
use EasyCorp\Bundle\EasyAdminBundle\Factory\FilterFactory;
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
use EasyCorp\Bundle\EasyAdminBundle\Filter\DateTimeFilter;
use EasyCorp\Bundle\EasyAdminBundle\Filter\EntityFilter;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Symfony\Component\HttpFoundation\RequestStack;
class OrderCrudController extends AbstractCrudController
{
private AdminUrlGenerator $adminUrlGenerator;
private RequestStack $requestStack;
public function __construct(AdminUrlGenerator $adminUrlGenerator, RequestStack $requestStack)
{
$this->adminUrlGenerator = $adminUrlGenerator;
$this->requestStack = $requestStack;
}
public static function getEntityFqcn(): string
{
return Order::class;
}
public function configureFields(string $pageName): iterable
{
return [
IdField::new('orderId', 'Order ID')
->setMaxLength(16),
DateField::new('date', 'Order Date'),
// CollectionField::new('orderItems'),
MoneyField::new('total', 'Total Price')
->setCurrency('AUD')
->setStoredAsCents(false),
MoneyField::new('shippingCost', 'Shipping Cost')
->setCurrency('AUD')
->setStoredAsCents(false),
TextField::new('hcp', 'HCP'),
AssociationField::new('customer', 'Patient'),
TextField::new('paymentStatus', 'Order Status'),
TextField::new('orderLink')
->renderAsHtml(),
];
}
public function configureFilters(Filters $filters): Filters
{
return $filters
->add('hcp')
->add(DateTimeFilter::new('date'))
->add('paymentStatus')
;
}
public function configureActions(Actions $actions): Actions
{
$exportAction = Action::new('export')
->linkToUrl(function () {
$request = $this->requestStack->getCurrentRequest();
return $this->adminUrlGenerator->setAll($request->query->all())
->setAction('export')
->generateUrl();
})
->addCssClass('btn btn-success')
->setIcon('fa fa-download')
->createAsGlobalAction();
return parent::configureActions($actions)
->add(Crud::PAGE_INDEX, $exportAction)
->remove(Crud::PAGE_INDEX, Action::NEW)
->disable(Action::NEW, Action::DELETE)
;
}
public function configureExportFields(): iterable
{
return [
IdField::new('orderId')
->setMaxLength(16),
DateField::new('date'),
CollectionField::new('orderItems'),
// MoneyField::new('total')
// ->setCurrency('AUD')
// ->setStoredAsCents(false),
TextField::new('hcp', 'HCP'),
AssociationField::new('customer', 'Patient'),
TextField::new('paymentStatus'),
];
}
/**
* Export CSV with fields given
*/
public function export(AdminContext $context, CsvExporter $csvExporter)
{
$fields = FieldCollection::new($this->configureExportFields());
$filters = $this->container->get(FilterFactory::class)->create($context->getCrud()->getFiltersConfig(), $fields, $context->getEntity());
$queryBuilder = $this->createIndexQueryBuilder($context->getSearch(), $context->getEntity(), $fields, $filters);
$date = new \DateTime();
$datetimeString = $date->format('Y-m-d-H-i-s');
return $csvExporter->createOrderResponseFromQueryBuilder($queryBuilder, $fields, sprintf('orders_%s.csv', $datetimeString));
}
}