src/Admin/ServicoBoletimMedicaoAdmin.php line 21

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Admin;
  4. use App\Entity\ServicoPropostaComercial;
  5. use Doctrine\ORM\QueryBuilder;
  6. use Sonata\AdminBundle\Admin\AbstractAdmin;
  7. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  8. use Sonata\AdminBundle\Datagrid\ListMapper;
  9. use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
  10. use Sonata\AdminBundle\Form\FormMapper;
  11. use Sonata\AdminBundle\Route\RouteCollection;
  12. use Sonata\AdminBundle\Show\ShowMapper;
  13. use Symfony\Component\Form\Extension\Core\Type\MoneyType;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\HttpFoundation\RedirectResponse;
  16. use Symfony\Component\HttpFoundation\Request;
  17. final class ServicoBoletimMedicaoAdmin extends AbstractAdmin
  18. {
  19.     protected $datagridValues = [
  20.         '_page'         => 1,
  21.         '_sort_order'   => 'DESC',
  22.         '_sort_by'      => 'id',
  23.         '_per_page'     => 50
  24.     ];
  25.     protected $maxPerPage 50;
  26.     protected $perPageOptions = [2550100200];
  27.     protected function configureRoutes(RouteCollection $collection)
  28.     {
  29.         $collection->add('editableList');
  30.         $collection->add('updateQuantidade'$this->getRouterIdParameter().'/update-quantidade');
  31.     }
  32.     protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
  33.     {
  34.         $datagridMapper
  35.             ->add('id')
  36.             ->add('boletim.numero'null, ['label' => 'Número BM'])
  37.             ->add('proposta.numero'null, ['label' => 'Número Proposta'])
  38.             ->add('quantidade')
  39.             ;
  40.     }
  41.     protected function configureListFields(ListMapper $listMapper): void
  42.     {
  43.         $listMapper
  44.             ->add('boletim.numero'null, ['label' => 'Número BM'])
  45.             ->add('proposta.numero'null, ['label' => 'Nº Proposta'])
  46.             ->add('servico.servico.titulo'null, ['label' => 'Título do Serviço'])
  47.             ->add('servico.valor'null, ['label' => 'Valor'])
  48.             ->add('quantidade'null, ['editable' => true])
  49.             ->add('_action'null, [
  50.                 'actions' => [
  51.                     'show' => [],
  52.                     'edit' => [],
  53.                 ],
  54.             ]);
  55.     }
  56.     protected function configureFormFields(FormMapper $formMapper): void
  57.     {
  58.         $formMapper
  59.             ->add('servico'null, ['label'=>'Serviço','disabled' => true])
  60.             ->add('quantidade'MoneyType::class, [
  61.                 'label' => 'Quantidade do Serviço',
  62.                 'currency' => 'BRL',
  63.                 'grouping' => true,
  64.                 'required' => false,
  65.                 'help'=>'* Este valor será usado somente nesse boletim.',
  66.                 'attr' => ['class' => 'notusesimbolvaluefloat maskMoney'],
  67.             ])
  68.             ;
  69.     }
  70.     protected function configureShowFields(ShowMapper $showMapper): void
  71.     {
  72.         $showMapper
  73.             ->add('id')
  74.             ->add('quantidade')
  75.             ;
  76.     }
  77.     /**
  78.      * Otimização de query para evitar N+1 queries
  79.      */
  80.     protected function configureQuery(ProxyQueryInterface $query): ProxyQueryInterface
  81.     {
  82.         $query parent::configureQuery($query);
  83.         
  84.         $rootAlias current($query->getRootAliases());
  85.         $query
  86.             ->leftJoin($rootAlias '.boletim''bm')
  87.             ->leftJoin($rootAlias '.proposta''prop')
  88.             ->leftJoin($rootAlias '.servico''spc')
  89.             ->leftJoin('spc.servico''s')
  90.             ->addSelect('bm, prop, spc, s');
  91.         
  92.         return $query;
  93.     }
  94.     public function updateQuantidadeAction(Request $request)
  95.     {
  96.         $id $request->get($this->admin->getIdParameter());
  97.         $object $this->admin->getObject($id);
  98.         if (!$object) {
  99.             return new JsonResponse(['success' => false'message' => 'Objeto não encontrado'], 404);
  100.         }
  101.         try {
  102.             $quantidade $request->request->get('quantidade');
  103.             $valor $request->request->get('valor');
  104.             $servicoId $request->request->get('servicoId');
  105.             
  106.             if ($quantidade === null) {
  107.                 return new JsonResponse(['success' => false'message' => 'Quantidade não fornecida'], 400);
  108.             }
  109.             
  110.             // Atualizar quantidade do ServicoBoletimMedicao
  111.             $object->setQuantidade((float) $quantidade);
  112.             
  113.             // Se o valor foi fornecido, atualizar o valor no ServicoPropostaComercial
  114.             if ($valor !== null && $servicoId) {
  115.                 $em $this->getConfigurationPool()->getContainer()->get('doctrine')->getManager();
  116.                 $servicoPropostaComercial $em->getRepository(ServicoPropostaComercial::class)->find($servicoId);
  117.                 if ($servicoPropostaComercial) {
  118.                     $servicoPropostaComercial->setValor((float) $valor);
  119.                 }
  120.             }
  121.             
  122.             $this->admin->update($object);
  123.             
  124.             return new JsonResponse([
  125.                 'success' => true,
  126.                 'message' => 'Dados atualizados com sucesso',
  127.                 'quantidade' => $object->getQuantidade(),
  128.                 'valor' => $valor
  129.             ]);
  130.         } catch (\Exception $e) {
  131.             return new JsonResponse([
  132.                 'success' => false,
  133.                 'message' => 'Erro ao atualizar: ' $e->getMessage()
  134.             ], 500);
  135.         }
  136.     }
  137. }