<?php
declare(strict_types=1);
namespace App\Admin;
use App\Entity\ImagemRelatorio;
use App\Entity\RelatorioTecnico;
use App\Enums\StatusOrdemServicoEnum;
use App\Form\Type\FotosType;
use App\Model\ImageCacheDescriber;
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\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Validator\Constraints as Assert;
final class RelatorioTecnicoAdmin extends BaseAdmin
{
protected $datagridValues = [
'_page' => 1,
'_sort_order' => 'DESC',
'_sort_by' => 'createdAt',
'_per_page' => 1000
];
public function __construct($code, $class, $baseControllerName)
{
parent::__construct($code, $class, $baseControllerName);
$this->imagensUpload = [
new ImageCacheDescriber('logoOriginal', 'logo', 'logoFile', 'thumb_400px'),
];
}
protected function configureRoutes(RouteCollection $collection)
{
$collection->add('relatorioPdf');
$collection->add('relatorioPdfEmail');
$collection->add('uploadImage');
$collection->add('deleteImage');
$collection->add('updateImage');
$collection->add('udpateAcessoRelatorioCliente');
$collection->add('openpdf');
}
public function postRemove($object)
{
parent::postRemove($object); // TODO: Change the autogenerated stub
if($object->getRelatorioAnexoFile()){
if (file_exists($object->getRelatorioAnexoFile())) {
@unlink($object->getRelatorioAnexo());
}
}
}
public function prePersist($object)
{
ini_set('upload_max_filesize', '10M');
/** @var RelatorioTecnico $object */
parent::prePersist($object); // TODO: Change the autogenerated stub
$object->setStatus('gerado');
$object->setCadastradoPor($this->getUserLogado());
if($object->getIsFinalizado()){
$object->setFinalizadoEm(new \DateTime('now'));
$object->getOrdemServico()->setStatus(StatusOrdemServicoEnum::CONCLUIDA);
}
if($object->getRelatorioAnexoFile()){
$this->manageFilesUploadRelatorioAnexo($object);
}
}
public function preUpdate($object)
{
// if($object->getIsFinalizado()===TRUE){
// exit('Este relatorio nao pode ser editado porque ja foi finalizado!');
// }
parent::preUpdate($object); // TODO: Change the autogenerated stub
if($object->getIsFinalizado()){
$object->setFinalizadoEm(new \DateTime('now'));
$object->getOrdemServico()->setStatus(StatusOrdemServicoEnum::CONCLUIDA);
}
if($object->getRelatorioAnexoFile()){
if($object->getRelatorioAnexo()){
if (file_exists($object->getRelatorioAnexo())) {
@unlink($object->getRelatorioAnexo());
}
}
$this->manageFilesUploadRelatorioAnexo($object);
}
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$datagridMapper
->add('ordemServico.proposta.numero', null, ['label'=>'Número Ordem de Serviço'])
->add('ordemServico.proposta.anoProposta', null, ['label'=>'Ano Ordem de Serviço'])
->add('cliente','doctrine_orm_callback',[
'label'=>'Cliente Razao Social',
'callback' => array($this, 'filterCliente'),
//'field_type' => 'text',
])
->add('createdAt', null, ['label'=>'Data de Cadastro'])
;
}
public function filterCliente($queryBuilder, $alias, $field, $value)
{
if (!$value['value']) {
return;
}
$value = mb_strtolower($value['value']);
$queryBuilder
->leftJoin("$alias.ordemServico","os")
->leftJoin("os.proposta","prop")
->leftJoin("prop.cliente","cli")
//->andWhere("UNACCENT(LOWER(cli.razaoSocial)) LIKE UNACCENT(:nome)" )
->andWhere("LOWER(cli.razaoSocial) LIKE :nome" )
->setParameter('nome', "%$value%");
return true;
}
protected function configureListFields(ListMapper $listMapper): void
{
$listMapper
->add('ordemServico.proposta.numeroFormatado', null, ['label'=>'OS'])
->add('ordemServico.proposta.cliente.razaoSocial', null, ['label'=>'Cliente'])
->add('createdAt', null, ['label'=>'Data de Cadastro'])
->add('_action', null, [
'actions' => [
//'show' => [],
'edit' => [],
'delete' => [],
'relatorioPdf' => [
'template' => 'RelatoriosTecnicos/list__action_pdfRelatorioTecnico.html.twig',
],
],
]);
}
protected function configureFormFields(FormMapper $formMapper): void
{
/** @var RelatorioTecnico $relatorio */
$relatorio = $this->getSubject();
$imgReq = false;
$fileFieldOptions = [
'data_class' => null,
'required' => $imgReq,
'label' => 'Imagem do Resumo dos Resultados',
];
$fileFieldOptionsRelatorioAnexo = [
'data_class' => null,
'required' => false,
'label' => 'Anexo de Relatório',
'help' => '',
];
if (!is_null($relatorio) && $relatorio->getRelatorioAnexo() != '') {
$fileFieldOptionsRelatorioAnexo['help'] = '<a href="/'.$relatorio->getRelatorioAnexo().'" target="_blank" class="btn btn-warning"/><i class="fa fa-eye" aria-hidden="true"></i> Visualizar</a>';
}
if (!is_null($relatorio) && $relatorio->getLogo() != '') {
$fileFieldOptions['help'] = '<img src="' . $relatorio->getLogo() .
'" class="admin-preview img-thumbnail" style="max-width:150px;max-height:250px;"/>';
}
$formMapper
->add('ordemServico', ModelType::class, [
'placeholder' => '-- Selecione --',
'label' => 'Ordem de Serviço',
'required' => true,
'expanded' => false,
'multiple' => false,
])
->add('numeroBm',null,['label'=>'Número do BM', 'required'=> true])
->add('relatorioAnexoFile', FileType::class, [
'constraints' => [new Assert\File([
'mimeTypes' => [
'application/pdf',
'application/x-pdf'
],
'mimeTypesMessage' => 'O sistema só aceita arquivos no formato .pdf'
])],
'label' => 'Anexo de Relatório',
'help' => $fileFieldOptionsRelatorioAnexo['help'],
'required' => false,
])
->add('logoFile', FileType::class, $fileFieldOptions)
->add('responsavel',null,['label'=>'Engenheiro'])
->add('laboratorista',null,['label'=>'Laboratorista'])
->add('conclusao',null,['label'=>'Conclusão'])
->add('isFinalizado',null,['label'=>'Relatório Final'])
->add('destinatarioNome', null, ['label'=>"Nome destinatário"])
->add('destinatarioEmail', null, ['label'=>"Email destinatário"]);
if($relatorio instanceof RelatorioTecnico) {
$formMapper->add('imagensrelatorio',FotosType::class, ['label'=>false]);
}
// ->add('imagensrelatorio', CollectionType::class, [
// 'label' => 'Serviços Solicitados',
// 'by_reference' => false,
// ], [
// 'edit' => 'inline',
// 'inline' => 'table',
//// 'sortable' => 'posicao',
// ])
// ->add('status', ChoiceType::class, [
// 'choices' => [
// 'Gerado' => 'gerado',
// 'Bloqueado' => 'bloqueado',
// 'Em Avaliação' => 'em_avaliacao',
// 'Cancelado' => 'cancelado',
// 'Enviado para o Cliente' => 'enviado_cliente'
// ]
// ])
;
}
// 4 partes:
// ano:
// os:
// tres algarismo
protected function configureShowFields(ShowMapper $showMapper): void
{
$showMapper
->add('id')
->add('createdAt')
->add('status')
->add('enviadoParaClienteEm')
;
}
/**
* @param RelatorioTecnico $obj
* @return RelatorioTecnico
*/
private function manageFilesUploadRelatorioAnexo($obj)
{
$file = $obj->getRelatorioAnexoFile();
$nameFile = $filename = md5(date('Y-m-d H:i:s:u')).".".$file->getClientOriginalExtension();
$uploadPath = "uploads/anexo-relatorios-tecnicos";
$file->move($uploadPath, $nameFile);
$obj->setRelatorioAnexoOriginal($uploadPath . "/" . $filename);
$obj->setRelatorioAnexo($uploadPath . "/" . $filename);
}
}