<?php
declare(strict_types=1);
namespace App\Admin;
use App\Enums\ClassificacaoDespesaEnum;
use App\Enums\TipoContaPagarEnum;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\AdminBundle\Show\ShowMapper;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
final class CentroCustoAdmin extends AbstractAdmin
{
protected function configureRoutes(RouteCollection $collection)
{
$collection->add('relatorioCentroCusto');
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$datagridMapper
->add('titulo','doctrine_orm_callback',[
'label'=>'Título',
'callback' => array($this, 'filterTitulo'),
])
->add('isReceita', 'doctrine_orm_callback', [
'label' => 'Tipo',
'callback' => [$this, 'filterIsReceita'],
'field_type' => ChoiceType::class,
'field_options' => [
'choices' => [
'RECEITA' => true, // Envia `true`
'DESPESA' => false, // Envia `false`
],
'expanded' => false, // Dropdown select (true para radio buttons)
'multiple' => false, // Apenas uma opção pode ser escolhida
'placeholder' => 'Selecione um tipo',
],
])
// ->add('classificacao','doctrine_orm_callback',[
// 'label'=>'Classificação',
// 'callback' => array($this, 'filterclassificacao'),
// ])
->add('classificacao', 'doctrine_orm_choice', [
'field_options' => [
'choices' => ClassificacaoDespesaEnum::getAssociatedValues(),
'expanded' => false,
'multiple' => false,
],
'field_type' => ChoiceType::class,
])
;
}
public function filterIsReceita($queryBuilder, $alias, $field, $value)
{
if (!isset($value['value']) || $value['value'] === '') {
return;
}
// Converte o valor para booleano correto (true para Receita, false para Despesa)
$isReceita = filter_var($value['value'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
// Aplica o filtro na query
$queryBuilder
->andWhere("$alias.$field = :isReceita")
->setParameter('isReceita', $isReceita);
return true;
}
public function filterTitulo($queryBuilder, $alias, $field, $value)
{
if (!$value['value']) {
return;
}
$value = mb_strtolower($value['value']);
$queryBuilder
->andWhere("LOWER($alias.titulo) LIKE :nome" )
->setParameter('nome', "%$value%");
return true;
}
public function filterclassificacao($queryBuilder, $alias, $field, $value)
{
if (!$value['value']) {
return;
}
$value = mb_strtolower($value['value']);
$queryBuilder
->andWhere("LOWER($alias.classificacao) LIKE :nome" )
->setParameter('nome', "%$value%");
return true;
}
protected function configureListFields(ListMapper $listMapper): void
{
$listMapper
->add('id')
->add('titulo', null, ['label'=>'Título'])
->add('classificacao', null, ['label'=>'Classificação'])
->add('isReceita', null, ['label'=>'Tipo','template'=>'CentroCusto/list_tipo.html.twig'])
->add('metaPercentualSobreFaturamento', null, [
'label' => 'Meta Percentual',
'template' => 'CentroCusto/list_meta_percentual.html.twig', // Usa o novo template
])
->add('_action', null, [
'actions' => [
'show' => [],
'edit' => [],
'delete' => [],
],
]);
}
protected function configureFormFields(FormMapper $formMapper): void
{
$formMapper
->add('titulo', null, ['label'=>'Título'])
->add('isReceita', null, ['label'=>'É receita'])
->add('classificacao')
->add('classificacao', ChoiceType::class, [
'label' => 'Classificação',
'placeholder' => '-- Selecione --',
'choices' => ClassificacaoDespesaEnum::getAssociatedValues(),
])
->add('descricao', null, ['label'=>'Descrição'])
->add('metaPercentualSobreFaturamento', MoneyType::class, [
'label' => 'Meta Percentual Sobre Faturamento',
'currency' => 'BRL',
'grouping' => true,
'required' => false,
'help'=>'* Informar Somente quando a classificação for do tipo DESPESA.',
'attr' => ['class' => 'usePercentPromocaoValor maskMoney'],
])
;
}
protected function configureShowFields(ShowMapper $showMapper): void
{
$showMapper
->add('id')
->add('titulo', null, ['label'=>'Título'])
->add('classificacao', null, ['label'=>'Classificação'])
->add('descricao', null, ['label'=>'Descrição'])
;
}
}