<?php
declare(strict_types=1);
namespace App\Admin;
use App\Enums\StatusContratoEnum;
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\Show\ShowMapper;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\Form\Validator\ErrorElement;
final class ContratoClienteAdmin extends BaseAdmin
{
/**
* TODO
* Saber se o contrato vincula com uma proposta ou com um cliente;
* Formatar Contrato;
*/
protected $datagridValues = [
'_page' => 1,
'_sort_order' => 'DESC',
'_sort_by' => 'createdAt',
'_per_page' => 1000
];
protected function configureRoutes(RouteCollection $collection)
{
$collection->add('contratoPdf');
}
/**
* @param ErrorElement $errorElement
* @param ContratoCliente $object
*/
public function validate(ErrorElement $errorElement, $object)
{
$container = $this->getConfigurationPool()->getContainer();
$em = $container->get('doctrine.orm.entity_manager');
// // Verifica se o contrato já foi assinado
// if($object->getStatus()==StatusContratoEnum::ASSINADO) {
// $errorElement->with('status')->addViolation('Ops! Este contrato já foi assinado e não pode ser alterada.');
// }
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$datagridMapper
->add('cliente','doctrine_orm_callback',[
'label'=>'Cliente - Razão Social',
'callback' => array($this, 'filterCliente')
])
->add('status')
;
}
public function filterCliente($queryBuilder, $alias, $field, $value)
{
if (!$value['value']) {
return;
}
$value = mb_strtolower($value['value']);
$queryBuilder
->join("$alias.cliente","cli")
->andWhere("LOWER(cli.razaoSocial) LIKE :nome" )
->setParameter('nome', "%$value%");
return true;
}
protected function configureListFields(ListMapper $listMapper): void
{
$listMapper
->add('status',null, ['label'=>'Status do Contrato'])
->add('cliente.razaoSocial')
->add('proposta', null, ['label'=>'Proposta Comercial'])
->add('_action', null, [
'actions' => [
'show' => [],
'edit' => [],
'delete' => [],
'contratoPdf' => [
'template' => 'ContratoCliente/list__action_pdfContrato.html.twig',
]
],
]);
}
protected function configureFormFields(FormMapper $formMapper): void
{
/** @var ContratoCliente $contrato */
$contrato = $this->getSubject();
$fileFieldOptionsContrato = [
'data_class' => null,
'required' => false,
'label' => 'Contrato Assinado',
'help' => '',
];
if (!is_null($contrato) && $contrato->getContrato() != '') {
$fileFieldOptionsContrato['help'] = '<a href="/'.$contrato->getContrato().'" target="_blank" class="btn btn-warning"/><i class="fa fa-eye" aria-hidden="true"></i> Visualizar Contrato</a>';
}
$fileFieldOptionsContratoAnexo = [
'data_class' => null,
'required' => false,
'label' => 'Contrato Anexo',
'help' => '',
];
if (!is_null($contrato) && $contrato->getContratoAnexo() != '') {
$fileFieldOptionsContratoAnexo['help'] = '<a href="/'.$contrato->getContratoAnexo().'" target="_blank" class="btn btn-primary"/><i class="fa fa-eye" aria-hidden="true"></i> Visualizar Anexo</a>';
}
$formMapper
->add('cliente', ModelType::class, [
'placeholder' => '-- Selecione --',
'label' => 'Cliente',
'required' => true,
'expanded' => false,
'multiple' => false,
'btn_add' => false
])
->add('proposta', ModelType::class, [
'placeholder' => '-- Selecione --',
'label' => 'Proposta Comercial',
'disabled' => false,
'required' => true,
'expanded' => false,
'multiple' => false,
'btn_add' => false,
])
->add('status', ChoiceType::class, [
'choices' => StatusContratoEnum::getAssociatedValues(),
])
->add('contratoFile', FileType::class, [
'constraints' => [new Assert\File([
'mimeTypes' => [
'application/pdf',
'application/x-pdf'
],
'mimeTypesMessage' => 'O sistema só aceita arquivos no formato .pdf'
])],
'label' => 'Contrato Assinado',
'help' => $fileFieldOptionsContrato['help'],
'required' => false,
])
->add('contratoAnexoFile', FileType::class, [
'constraints' => [new Assert\File([
'mimeTypes' => [
'application/pdf',
'application/x-pdf'
],
'mimeTypesMessage' => 'O sistema só aceita arquivos no formato .pdf'
])],
'label' => 'Contrato Anexo',
'help' => $fileFieldOptionsContratoAnexo['help'],
'required' => false,
])
;
}
protected function configureShowFields(ShowMapper $showMapper): void
{
$showMapper
->add('id')
;
}
public function prePersist($object)
{
ini_set('upload_max_filesize', '10M');
$object->setCadastradoPor($this->getUserLogado());
$object->setCreatedAt(new \DateTime('now'));
$object->setUpdatedAt(new \DateTime('now'));
parent::prePersist($object); // TODO: Change the autogenerated stub
if($object->getContratoFile()){
$this->manageFilesUploadContrato($object);
}
if($object->getContratoAnexoFile()){
$this->manageFilesUploadContratoAnexo($object);
}
}
public function preUpdate($object)
{
ini_set('upload_max_filesize', '10M');
$object->setUpdatedAt(new \DateTime('now'));
parent::preUpdate($object); // TODO: Change the autogenerated stub
if($object->getContratoFile()){
$this->manageFilesUploadContrato($object);
}
if($object->getContratoAnexoFile()){
$this->manageFilesUploadContratoAnexo($object);
}
}
public function postRemove($object)
{
parent::postRemove($object); // TODO: Change the autogenerated stub
if($object->getContratoFile()){
if (file_exists($object->getContratoFile())) {
@unlink($object->getContrato());
}
}
if($object->getContratoAnexoFile()){
if (file_exists($object->getContratoAnexoFile())) {
@unlink($object->getContratoAnexo());
}
}
}
/**
* @param ContratoCliente $obj
* @return ContratoCliente
*/
private function manageFilesUploadContrato($obj)
{
$file = $obj->getContratoFile();
$nameFile = $filename = md5(date('Y-m-d H:i:s:u')).".".$file->getClientOriginalExtension();
$uploadPath = "uploads/contratos-clientes";
$file->move($uploadPath, $nameFile);
$obj->setContrato($uploadPath . "/" . $filename);
$obj->setContratoOriginal($uploadPath . "/" . $filename);
}
/**
* @param ContratoCliente $obj
* @return ContratoCliente
*/
private function manageFilesUploadContratoAnexo($obj)
{
$file = $obj->getContratoAnexoFile();
$nameFile = $filename = md5(date('Y-m-d H:i:s:u')).".".$file->getClientOriginalExtension();
$uploadPath = "uploads/contratos-clientes-anexo";
$file->move($uploadPath, $nameFile);
$obj->setContratoAnexo($uploadPath . "/" . $filename);
$obj->setContratoAnexoOriginal($uploadPath . "/" . $filename);
}
}