<?php
namespace App\Admin;
use App\Entity\SaidaAlmoxarifado;
use App\Services\ToolService;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\AdminBundle\Form\Type\ModelAutocompleteType;
use Sonata\Form\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Sonata\AdminBundle\Form\Type\ModelType;
final class SaidaAlmoxarifadoAdmin extends AbstractAdmin
{
private $movService;
public function __construct($code, $class, $baseControllerName, ToolService $movService)
{
parent::__construct($code, $class, $baseControllerName);
$this->movService = $movService;
}
protected function configureFormFields(FormMapper $formMapper)
{
/** @var SaidaAlmoxarifado $subject */
$subject = $this->getSubject();
$isManutencao = $subject && $subject->getMotivo() === 'MANUTENCAO';
$formMapper
->with('Dados')
->add('motivo', ChoiceType::class, [
'choices' => [
'Ordem de Serviço' => 'OS',
'Manutenção' => 'MANUTENCAO'
],
'placeholder' => '-- Selecione o Motivo --',
'label' => 'Motivo da Saída',
'required' => true,
])
->add('os', ModelType::class, [
'placeholder' => '-- Selecione --',
'label' => 'Ordem de serviço',
'required' => !$isManutencao,
'expanded' => false,
'multiple' => false,
'btn_add'=>false,
'help' => $isManutencao ? 'OS não é obrigatória para saídas de manutenção' : ''
])
->add('liberadoPor', TextType::class, [
'label' => 'Liberado por',
'required' => false,
'attr' => ['placeholder' => 'Nome de quem liberou']
])
->add('retiradoPor', TextType::class, [
'label' => 'Retirado por',
'required' => false,
'attr' => ['placeholder' => 'Nome de quem retirou']
])
->add('status', ChoiceType::class, [
'choices' => ['OPEN'=>'OPEN', 'PARCIAL'=>'PARCIAL', 'FECHADA'=>'FECHADA'],
'disabled' => true,
])
->end()
->with('Itens da Saída')
->add('itens', CollectionType::class, [
'label' => 'Itens da Saída',
'by_reference' => false,
], [
'edit' => 'inline',
'inline' => 'table'
])
->end();
}
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('id')
->add('motivo')
->add('os')
->add('retiradoPor')
->add('liberadoPor')
->add('status')
->add('createdAt')
->add('_action', null, [
'actions' => [
'show' => [],
'edit' => [],
'delete' => [],
]
])
;
}
protected function configureShowFields(ShowMapper $showMapper)
{
$showMapper
->with('Informações da Saída', ['class' => 'col-md-6'])
->add('id', null, ['label' => 'ID'])
->add('motivo', null, ['label' => 'Motivo da Saída'])
->add('os', null, ['label' => 'Ordem de Serviço'])
->add('liberadoPor', null, ['label' => 'Liberado por'])
->add('retiradoPor', null, ['label' => 'Retirado por'])
->add('status', null, ['label' => 'Status'])
->add('createdAt', null, ['label' => 'Data de Criação', 'format' => 'd/m/Y H:i'])
->end()
->with('Itens da Saída', ['class' => 'col-md-12'])
->add('itens', null, [
'label' => 'Itens',
'template' => 'SaidaAlmoxarifado/show_itens.html.twig'
])
->end()
;
}
public function prePersist($saida)
{
foreach ($saida->getItens() as $item) {
$item->setSaida($saida);
}
try {
$this->movService->registrarSaida($saida);
} catch (\DomainException $e) {
$this->renderErroQuantidade($e->getMessage());
}
}
public function preUpdate($saida)
{
// Você pode bloquear edição se fechada
if ($saida->getStatus() === 'FECHADA') {
throw new \RuntimeException('Saída fechada não pode ser editada.');
}
foreach ($saida->getItens() as $item) {
$item->setSaida($saida);
}
try {
$this->movService->registrarSaida($saida);
} catch (\DomainException $e) {
$this->renderErroQuantidade($e->getMessage());
}
}
private function renderErroQuantidade($mensagem)
{
// Renderiza template de erro e interrompe execução
echo \Symfony\Component\HttpFoundation\Response::create(
$this->getConfigurationPool()->getContainer()->get('twig')->render(
'SaidaAlmoxarifado/erro_quantidade.html.twig',
['mensagem' => nl2br($mensagem)]
)
)->send();
exit;
}
}