<?php
declare(strict_types=1);
namespace App\Admin;
use App\Entity\InterrupcaoOs;
use App\Entity\OrdemDeServico;
use App\Entity\PropostaComercial;
use App\Enums\ClassificacaoDespesaEnum;
use App\Enums\StatusOrdemServicoEnum;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Form\Type\ModelType;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\Form\Type\DatePickerType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Sonata\Form\Type\DateRangePickerType;
final class OrdemDeServicoAdmin extends BaseAdmin
{
protected $datagridValues = [
'_page' => 1,
'_sort_order' => 'DESC',
'_sort_by' => 'createdAt',
'_per_page' => 1000
];
protected function configureRoutes(RouteCollection $collection)
{
$collection->add('osPdf');
$collection->add('relatorioDiarioObraPdf');
$collection->add('addBoletim');
$collection->add('centroCusto');
$collection->add('cronograma');
$collection->add('salvaPercentualServico');
$collection->add('relatorioCp');
$collection->add('relatorioCpv2');
$collection->add('relatoriosCps');
$collection->add('acompanhamentoMoldagem');
$collection->add('getamostra');
$collection->add('putamostra');
$collection->add('salvaordem');
$collection->add('salvaordemitem');
$collection->add('alterastatus');
$collection->add('salvarpesquisa');
$collection->add('addConcretagem');
$collection->add('equipamentosForaAlmoxarifado');
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$datagridMapper
->add('cliente','doctrine_orm_callback',[
'label'=>'Cliente Razao Social',
'callback' => array($this, 'filterCliente'),
//'field_type' => 'text',
])
->add('proposta.numero',null, ['label'=>'Proposta Número'])
->add('proposta.anoProposta',null, ['label'=>'Proposta Ano'])
//->add('createdAt', null, ['label'=>'Criado em'])
->add('createdAt', 'doctrine_orm_datetime_range', ['label'=>'Data de criação', 'field_type'=> DateRangePickerType::class])
->add('status')
;
}
// Filtro de condomínio por logradouro
public function filterCliente($queryBuilder, $alias, $field, $value)
{
if (!$value['value']) {
return;
}
$value = mb_strtolower($value['value']);
$queryBuilder
->join("$alias.proposta","prop")
->join("prop.cliente","cli")
->andWhere("LOWER(cli.razaoSocial) LIKE :nome" )
->setParameter('nome', "%$value%");
return true;
}
protected function configureListFields(ListMapper $listMapper): void
{
$listMapper
->add('id', null, ['label'=>'ID'])
->add('proposta.cliente.razaoSocial', null, ['label'=>'Cliente'])
->add('proposta.titulo', null, ['label'=>'Proposta', 'template'=>'Os/titulo_proposta.html.twig'])
->add('proposta.numero', null, ['label'=>'Nº Proposta','template'=>'Os/numero_proposta.html.twig'])
->add('createdAt', null, ['label'=>'Criado em'])
->add('status', null, ['label'=>'Status', 'template'=>'Os/change_status_os_list.html.twig'])
->add('_action', null, [
'actions' => [
//'show' => [],
'edit' => ['template' => 'Os/menu_select.html.twig'],
'delete' => [],
'osPdf' => [
'template' => 'Os/list__action_pdfOs.html.twig',
],
// 'relatorioDiarioObraPdf' => [
// 'template' => 'Os/list__action_pdfRelatorioDiarioObra.html.twig',
// ],
// 'centroCusto' => [
// 'template' => 'Os/list__action_centroCusto.html.twig',
// ],
// 'cronograma' => [
// 'template' => 'Os/list__action_cronograma.html.twig',
// ],
],
]);
}
protected function configureFormFields(FormMapper $formMapper): void
{
$formMapper
->add('proposta', ModelType::class, [
'placeholder' => '-- Selecione --',
'label' => 'Proposta',
'required' => true,
'expanded' => false,
'multiple' => false,
//'query' => $this->getPropostaQuery(),
], ['attr' => ['disabled' => true]])
->add('status', ChoiceType::class, [
'choices' => StatusOrdemServicoEnum::getAssociatedValues(),
])
->add('cno', null, ['label' => 'CNO', 'required' => false])
->add('previsaoEntrega', DatePickerType::class, ['label' => 'Data prevista de entrega', 'required' => false])
->add('finalizadaEm', DatePickerType::class, ['label' => 'Data de conclusão', 'required' => false])
->add('observacoes', null, ['label' => "Observações", 'required' => false, 'attr' => ['class' => 'editorHtml']]);
}
private function getPropostaQuery(): \Doctrine\ORM\QueryBuilder
{
$container = $this->getConfigurationPool()->getContainer();
$em = $container->get('doctrine.orm.entity_manager');
// Obtenha o repositório da entidade associada
$repository = $em->getRepository(PropostaComercial::class);
// Crie o QueryBuilder para retornar apenas propostas com haveNewVersion = false
$qb = $repository->createQueryBuilder('p');
$qb->where(
$qb->expr()->orX(
$qb->expr()->eq('p.haveNewVersion', ':haveNewVersion'),
$qb->expr()->isNull('p.haveNewVersion')
)
)
->setParameter('haveNewVersion', false);
return $qb;
}
protected function configureShowFields(ShowMapper $showMapper): void
{
$showMapper
->add('createdAt')
->add('status')
->add('observacoes')
->add('updatedAt')
;
}
public function preUpdate($object)
{
/** @var OrdemDeServico $object */
parent::preUpdate($object); // TODO: Change the autogenerated stub
$container = $this->getConfigurationPool()->getContainer();
$em = $container->get('doctrine.orm.entity_manager');
// Cria um registro de interrupção
// Se uma OS for mudada para interrompida
if($object->getStatus() == StatusOrdemServicoEnum::INTERROMPIDA){
$interrupcao = (new InterrupcaoOs())
->setCreatedAt(new \DateTime('now'))
->setStatus(StatusOrdemServicoEnum::INTERROMPIDA)
->setOs($object)
->setIsLida(false)
;
$em->persist($interrupcao);
$em->flush();
} else { // Qualquer outro status
// Pega a última interrupção não lida
$interrupcaoEntity = $em->getRepository(InterrupcaoOs::class)->findOneBy(['os'=>$object,'isLida'=>false]);
if($interrupcaoEntity instanceof InterrupcaoOs){
// Calcula o intervalo de interrução
$dataUltimaInterrupcao = $interrupcaoEntity->getCreatedAt();
$today = new \DateTime('now');
$dateInterval = $dataUltimaInterrupcao->diff($today);
$diasNaOs = (int)$object->getDiasInterrupcoes();
$diasInterrompida = (int)$dateInterval->days;
$totalInterrupcao = $diasNaOs+$diasInterrompida;
$object->setDiasInterrupcoes($totalInterrupcao);
$interrupcaoEntity->setIsLida(true);
$interrupcaoEntity->setLidaAt(new \DateTime('now'));
$em->flush();
}
}
// Atualiza dias de interrupção da os
if(!$object->getFinalizadaEm() instanceof \DateTime && $object->getStatus() == StatusOrdemServicoEnum::CONCLUIDA){
if(!$object->getFinalizadaEm() instanceof \DateTime){
$object->setFinalizadaEm(new \DateTime('now'));
}
}
return $object;
}
public function prePersist($object)
{
$object->setCadastradoPor($this->getUserLogado());
parent::prePersist($object); // TODO: Change the autogenerated stub
}
}