<?php
declare(strict_types=1);
namespace App\Admin;
use App\Entity\BoletimMedicao;
use App\Entity\ServicoBoletimMedicao;
use App\Enums\StatusBoletimEnum;
use App\Enums\StatusContaFinanceiro;
use App\Form\Type\AlertType;
use Doctrine\ORM\Query\Expr\Base;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Exception\ModelManagerException;
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\CollectionType;
use Sonata\Form\Type\DateTimePickerType;
use Sonata\Form\Validator\ErrorElement;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use function Sodium\add;
final class BoletimMedicaoAdmin extends BaseAdmin
{
protected $datagridValues = [
'_page' => 1,
'_sort_order' => 'DESC',
'_sort_by' => 'createdAt',
'_per_page' => 1000
];
public function getTemplate($name)
{
if ($name === 'edit') {
return 'BoletinsMedicao/edit.html.twig';
}
return parent::getTemplate($name);
}
protected function configureRoutes(RouteCollection $collection)
{
$collection->add('boletimPdf');
$collection->add('boletimPdfEmail');
$collection->add('gerarFianceiro');
$collection->add('alteraStatusBm');
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$datagridMapper
->add('id')
->add('numero')
->add('os.proposta.numero', null, ['label'=>'Número Proposta'])
->add('status','doctrine_orm_callback', array(
'label' => 'Status',
'callback' => function($queryBuilder, $alias, $field, $value) {
if (!$value['value']) {
return;
}
$queryBuilder->andWhere($alias.'.status = :status');
$queryBuilder->setParameter('status',$value['value']);
return true;
}
), ChoiceType::class, array(
'choices' => StatusBoletimEnum::getAssociatedValues()
))
->add('os','doctrine_orm_callback',[
'label'=>'Cliente',
'callback' => array($this, 'filterBMCliente'),
//'field_type' => 'text',
])
->add('createdAt', null,['label'=>'Data de Cadastro'])
;
}
// Filtro de condomínio por logradouro
public function filterBMCliente($queryBuilder, $alias, $field, $value)
{
if (!$value['value']) {
return;
}
$value = mb_strtolower($value['value']);
$queryBuilder
->join("$alias.os","sos")
->join("sos.proposta","prop")
->join("prop.cliente","cli")
//->andWhere("UNACCENT(LOWER(cli.razaoSocial)) LIKE UNACCENT(:nome)" )
->andWhere("LOWER(cli.razaoSocial) LIKE :nome" )
->setParameter('nome', "%$value%");
return true;
}
function preUpdate($object)
{
parent::preUpdate($object); // TODO: Change the autogenerated stub
}
public function prePersist($object)
{
$object->setCadastradoPor($this->getUserLogado());
parent::prePersist($object); // TODO: Change the autogenerated stub
}
// function validate(ErrorElement $errorElement, $object)
// {
// /** @var BoletimMedicao $object */
// parent::validate($errorElement, $object); // TODO: Change the autogenerated stub
//
// if($object){
// if($object->getAprovadoEm() instanceof \DateTime){
// $errorElement->with('numero')->addViolation('Este boletim de medição não pode ser modificado pois já foi aprovado e encaminhado para o departamento financeiro.')->end();
// }
// }
//
// }
protected function configureListFields(ListMapper $listMapper): void
{
$listMapper
->add('status', null, ['label'=>'Status', 'template'=>'BoletinsMedicao/status_list.html.twig'])
//->add('status', null, ['label'=>'Status','template'=>'BoletinsMedicao/status_sinalizador_list.html.twig'])
->add('numero', null, ['label'=>'Número BM'])
->addIdentifier('os.proposta.numero', null, ['label'=>'Nº Proposta', 'template'=>'BoletinsMedicao/numero_proposta.html.twig'])
->addIdentifier('os.proposta.cliente.razaoSocial', null, ['label'=>'Cliente'])
->add('createdAt', null, ['label'=>'Data Cadastro'])
//->add('servicos', null, ['label'=>'Qtd Serviços', 'template'=>'BoletinsMedicao/servicos_link.html.twig'])
->add('_action', null, [
'actions' => [
//'show' => [],
'edit' => [],
'delete' => [],
'boletimPdf' => [
'template' => 'BoletinsMedicao/list__action_pdfBoletim.html.twig',
],
'gerarFianceiro' => [
'template' => 'BoletinsMedicao/list__action_gerarFianceiro.html.twig',
]
],
]);
}
protected function configureFormFields(FormMapper $formMapper): void
{
$bo = $this->getSubject();
// if($bo instanceof BoletimMedicao){
// if($bo->getAprovadoEm() instanceof \DateTime) {
// $formMapper->add('alert',AlertType::class, ['mapped'=>false,'data'=>'Esse boletim de medição já foi aprovado e já foi passado para o financeiro','label'=>false,'attr'=>['class'=>'hide_label']]);
// }
// }
$formMapper
->add('os', ModelType::class, [
'placeholder' => '-- Selecione --',
'label' => 'Ordem de Serviço',
'disabled' => false,
'required' => true,
'expanded' => false,
'multiple' => false,
'btn_add' => false,
])
->add('numero',null, ['label'=>'Número','attr'=>['readonly'=>false]])
->add('status', ChoiceType::class, [
'choices' => StatusBoletimEnum::getAssociatedValues()
])
->add('cobrarART',null, ['label'=>'Cobrar ART'])
->add('isCobraRelatorioTecnico', null, ['label'=>"Cobrar Relatório Técnico"])
->add('percentualRelatorioTecnico', MoneyType::class, [
'label' => 'Percentual Relatório Técnico',
'currency' => 'BRL',
'grouping' => true,
'required' => false,
'help'=>'* Este valor será usado somente nessa proposta.',
'attr' => ['class' => 'usePercentPromocaoValor maskMoney'],
])
->add('valorDesconto', MoneyType::class, [
'label' => 'Valor adicional para desconto',
'currency' => 'BRL',
'grouping' => true,
'required' => false,
'help' => 'Pode ser usando para ISS, por exemplo. Será descontado do total da medição, com os impostos.',
'attr' => ['class' => 'maskMoney'],
])
->add('labelValorAdicionalDesconto',null, ['label'=>'Título do valor adicional de desconto'])
->add('notas', null, ['label'=>"Notas/Observações",'attr'=>['style'=>"height:200px", 'class'=>'editorHtml']])
->add('destinatarioEmail', null, ['label'=>"Email destinatário"])
//->add('aprovadoEm', DateTimePickerType::class,['dp_use_seconds'=>false, 'dp_use_current'=> true, 'format'=>"DD/MM/YYYY HH:mm", 'label'=>'Data da Aprovação', 'required'=>false])
;
}
protected function configureShowFields(ShowMapper $showMapper): void
{
$showMapper
->add('id')
->add('createdAt')
->add('updatedAt')
;
}
function postPersist($object)
{
/** @var BoletimMedicao $object */
parent::postPersist($object); // TODO: Change the autogenerated stub
$container = $this->getConfigurationPool()->getContainer();
$em = $container->get('doctrine.orm.entity_manager');
// Adicionar os serviços da proposta da os no BM
foreach ($object->getOs()->getProposta()->getServicos() as $servico) {
$quantidade = ($servico->getQuantidade()) ? $servico->getQuantidade() : 1;
$servicoBoletim = (new ServicoBoletimMedicao())
->setServico($servico)
->setProposta($object->getOs()->getProposta())
->setBoletim($object)
->setQuantidade($quantidade);
$em->persist($servicoBoletim);
$em->flush();
$object->addServico($servicoBoletim);
}
}
function preRemove($object)
{
//parent::preRemove($object); // TODO: Change the autogenerated stub
//$this->getRequest()->getSession()->getFlashBag()->add('sonata_flash_error','Not delete super user');
//throw new ModelManagerException();
}
}