src/Admin/CentroCustoAdmin.php line 18

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Admin;
  4. use App\Enums\ClassificacaoDespesaEnum;
  5. use App\Enums\TipoContaPagarEnum;
  6. use Sonata\AdminBundle\Admin\AbstractAdmin;
  7. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  8. use Sonata\AdminBundle\Datagrid\ListMapper;
  9. use Sonata\AdminBundle\Form\FormMapper;
  10. use Sonata\AdminBundle\Route\RouteCollection;
  11. use Sonata\AdminBundle\Show\ShowMapper;
  12. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  13. use Symfony\Component\Form\Extension\Core\Type\MoneyType;
  14. final class CentroCustoAdmin extends AbstractAdmin
  15. {
  16.     protected function configureRoutes(RouteCollection $collection)
  17.     {
  18.         $collection->add('relatorioCentroCusto');
  19.     }
  20.     protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
  21.     {
  22.         $datagridMapper
  23.             ->add('titulo','doctrine_orm_callback',[
  24.                 'label'=>'Título',
  25.                 'callback'   => array($this'filterTitulo'),
  26.             ])
  27.             ->add('isReceita''doctrine_orm_callback', [
  28.                 'label' => 'Tipo',
  29.                 'callback' => [$this'filterIsReceita'],
  30.                 'field_type' => ChoiceType::class,
  31.                 'field_options' => [
  32.                     'choices' => [
  33.                         'RECEITA' => true,  // Envia `true`
  34.                         'DESPESA' => false// Envia `false`
  35.                     ],
  36.                     'expanded' => false// Dropdown select (true para radio buttons)
  37.                     'multiple' => false// Apenas uma opção pode ser escolhida
  38.                     'placeholder' => 'Selecione um tipo',
  39.                 ],
  40.             ])
  41.             // ->add('classificacao','doctrine_orm_callback',[
  42.             //     'label'=>'Classificação',
  43.             //     'callback'   => array($this, 'filterclassificacao'),
  44.             // ])
  45.             ->add('classificacao''doctrine_orm_choice', [
  46.                 'field_options' => [
  47.                     'choices' => ClassificacaoDespesaEnum::getAssociatedValues(),
  48.                     'expanded' => false,
  49.                     'multiple' => false,
  50.                 ],
  51.                 'field_type' => ChoiceType::class,
  52.             ])
  53.             ;
  54.     }
  55.     
  56.     public function filterIsReceita($queryBuilder$alias$field$value)
  57.     {
  58.         if (!isset($value['value']) || $value['value'] === '') {
  59.             return;
  60.         }
  61.     
  62.         // Converte o valor para booleano correto (true para Receita, false para Despesa)
  63.         $isReceita filter_var($value['value'], FILTER_VALIDATE_BOOLEANFILTER_NULL_ON_FAILURE);
  64.     
  65.         // Aplica o filtro na query
  66.         $queryBuilder
  67.             ->andWhere("$alias.$field = :isReceita")
  68.             ->setParameter('isReceita'$isReceita);
  69.     
  70.         return true;
  71.     }
  72.     public function filterTitulo($queryBuilder$alias$field$value)
  73.     {
  74.         if (!$value['value']) {
  75.             return;
  76.         }
  77.         $value mb_strtolower($value['value']);
  78.         $queryBuilder
  79.             ->andWhere("LOWER($alias.titulo) LIKE :nome" )
  80.             ->setParameter('nome'"%$value%");
  81.         return true;
  82.     }
  83.     public function filterclassificacao($queryBuilder$alias$field$value)
  84.     {
  85.         if (!$value['value']) {
  86.             return;
  87.         }
  88.         $value mb_strtolower($value['value']);
  89.         $queryBuilder
  90.             ->andWhere("LOWER($alias.classificacao) LIKE :nome" )
  91.             ->setParameter('nome'"%$value%");
  92.         return true;
  93.     }
  94.     protected function configureListFields(ListMapper $listMapper): void
  95.     {
  96.         $listMapper
  97.             ->add('id')
  98.             ->add('titulo'null, ['label'=>'Título'])
  99.             ->add('classificacao'null, ['label'=>'Classificação'])
  100.             ->add('isReceita'null, ['label'=>'Tipo','template'=>'CentroCusto/list_tipo.html.twig'])
  101.             ->add('metaPercentualSobreFaturamento'null, [
  102.                 'label' => 'Meta Percentual',
  103.                 'template' => 'CentroCusto/list_meta_percentual.html.twig'// Usa o novo template
  104.             ])
  105.             ->add('_action'null, [
  106.                 'actions' => [
  107.                     'show' => [],
  108.                     'edit' => [],
  109.                     'delete' => [],
  110.                 ],
  111.             ]);
  112.     }
  113.     protected function configureFormFields(FormMapper $formMapper): void
  114.     {
  115.         $formMapper
  116.             ->add('titulo'null, ['label'=>'Título'])
  117.             ->add('isReceita'null, ['label'=>'É receita'])
  118.             ->add('classificacao')
  119.             ->add('classificacao'ChoiceType::class, [
  120.                 'label' => 'Classificação',
  121.                 'placeholder' => '-- Selecione --',
  122.                 'choices' => ClassificacaoDespesaEnum::getAssociatedValues(),
  123.             ])
  124.             ->add('descricao'null, ['label'=>'Descrição'])
  125.             ->add('metaPercentualSobreFaturamento'MoneyType::class, [
  126.                 'label' => 'Meta Percentual Sobre Faturamento',
  127.                 'currency' => 'BRL',
  128.                 'grouping' => true,
  129.                 'required' => false,
  130.                 'help'=>'* Informar Somente quando a classificação for do tipo DESPESA.',
  131.                 'attr' => ['class' => 'usePercentPromocaoValor maskMoney'],
  132.             ])
  133.             ;
  134.     }
  135.     protected function configureShowFields(ShowMapper $showMapper): void
  136.     {
  137.         $showMapper
  138.             ->add('id')
  139.             ->add('titulo'null, ['label'=>'Título'])
  140.             ->add('classificacao'null, ['label'=>'Classificação'])
  141.             ->add('descricao'null, ['label'=>'Descrição'])
  142.             ;
  143.     }
  144. }