<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\BaremaRepository")
*/
class Barema
{
use TimestampableEntity;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private ?int $id=null;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Length(max=255)
*/
private string $name;
/**
* @ORM\Column(type="text", nullable=true)
*/
private ?string $observacoes=null;
/**
* @ORM\Column(type="boolean")
*/
private bool $isAtivo = true;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Edital", mappedBy="barema")
*/
private Collection $editais;
/**
* @ORM\Column(type="json")
*/
private array $formacaoAcademica = [['descricao' => '', 'unidade' => 'Título', 'pontos' => 10, 'maximo' => 40]];
/**
* @ORM\Column(type="integer")
* @Assert\PositiveOrZero()
*/
private int $notaFormacaoAcademica = 30;
/**
* @ORM\Column(type="integer")
* @Assert\PositiveOrZero()
*/
private int $notaFormacaoAcademicaDoutorado = 20;
/**
* @ORM\Column(type="json")
*/
private array $atuacaoProfissional = [['descricao' => '', 'unidade' => 'Ano', 'pontos' => 10, 'maximo' => 40]];
/**
* @ORM\Column(type="integer")
* @Assert\PositiveOrZero()
*/
private int $notaAtuacaoProfissional = 30;
/**
* @ORM\Column(type="integer")
* @Assert\PositiveOrZero()
*/
private int $notaAtuacaoProfissionalDoutorado = 20;
/**
* @ORM\Column(type="json")
*/
private array $producaoAcademica = [['descricao' => '', 'unidade' => 'Artigo', 'pontos' => 10, 'maximo' => 40]];
/**
* @ORM\Column(type="integer")
* @Assert\PositiveOrZero()
*/
private int $notaProducaoAcademica = 40;
/**
* @ORM\Column(type="integer")
* @Assert\PositiveOrZero()
*/
private int $notaProducaoAcademicaDoutorado = 60;
public function __construct()
{
$this->editais = new ArrayCollection();
}
public function __toString(): string
{
return $this->name . ($this->isAtivo ? '' : ' (desativado)');
}
/**
* Processa as definições das avaliações e atribui índices baseados em MD5 para cada uma.
* Esses índices são usados para mapear as respostas na inscrição.
*/
public function normalizarAvaliacoes()
{
$this->setFormacaoAcademica($this->normalizar($this->getFormacaoAcademica(), 'formacao'));
$this->setAtuacaoProfissional($this->normalizar($this->getAtuacaoProfissional(), 'atuacao'));
$this->setProducaoAcademica($this->normalizar($this->getProducaoAcademica(), 'producao'));
}
/**
* Ordena a lista de itens, considerando o marcador de posição, que é excluído no final.
* Indexa por uma chave MD5 baseada na Descrição.
* @param array $lista
* @param string $salt
* @return array
*/
protected function normalizar(array $lista, string $salt): array {
$normal = [];
uksort($lista, function($a, $b) use ($lista) {
$_a = array_key_exists('ordem', $lista[$a]) ? $lista[$a]['ordem'] : $a;
$_b = array_key_exists('ordem', $lista[$b]) ? $lista[$b]['ordem'] : $b;
if ($_a < $_b) return -1;
elseif ($_a > $_b) return 1;
else return 0;
});
foreach ($lista as $avaliacao) {
$md5 = md5($salt.$avaliacao['descricao']);
$avaliacao['chave'] = $md5;
$normal[] = $avaliacao;
}
return $normal;
}
public function notaMaximaMestrado(): int
{
return $this->notaAtuacaoProfissional + $this->notaFormacaoAcademica + $this->notaProducaoAcademica;
}
public function notaMaximaDoutorado(): int
{
return $this->notaAtuacaoProfissionalDoutorado + $this->notaFormacaoAcademicaDoutorado + $this->notaProducaoAcademicaDoutorado;
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getObservacoes(): ?string
{
return $this->observacoes;
}
public function setObservacoes(?string $observacoes): self
{
$this->observacoes = $observacoes;
return $this;
}
public function getIsAtivo(): bool
{
return $this->isAtivo;
}
public function setIsAtivo(bool $isAtivo): self
{
$this->isAtivo = $isAtivo;
return $this;
}
/**
* @return Collection|Edital[]
*/
public function getEditais(): Collection
{
return $this->editais;
}
public function addEdital(Edital $edital): self
{
if (!$this->editais->contains($edital)) {
$this->editais[] = $edital;
$edital->setBarema($this);
}
return $this;
}
public function removeEdital(Edital $edital): self
{
if ($this->editais->contains($edital)) {
$this->editais->removeElement($edital);
// set the owning side to null (unless already changed)
if ($edital->getBarema() === $this) {
$edital->setBarema(null);
}
}
return $this;
}
public function getFormacaoAcademica(): array
{
return $this->formacaoAcademica;
}
public function setFormacaoAcademica(array $formacaoAcademica): self
{
$this->formacaoAcademica = $formacaoAcademica;
return $this;
}
public function getNotaFormacaoAcademica(): int
{
return $this->notaFormacaoAcademica;
}
public function setNotaFormacaoAcademica(int $notaFormacaoAcademica): self
{
$this->notaFormacaoAcademica = $notaFormacaoAcademica;
return $this;
}
public function getNotaFormacaoAcademicaDoutorado(): int
{
return $this->notaFormacaoAcademicaDoutorado;
}
public function setNotaFormacaoAcademicaDoutorado(int $notaFormacaoAcademicaDoutorado): self
{
$this->notaFormacaoAcademicaDoutorado = $notaFormacaoAcademicaDoutorado;
return $this;
}
public function getAtuacaoProfissional(): array
{
return $this->atuacaoProfissional;
}
public function setAtuacaoProfissional(array $atuacaoProfissional): self
{
$this->atuacaoProfissional = $atuacaoProfissional;
return $this;
}
public function getNotaAtuacaoProfissional(): int
{
return $this->notaAtuacaoProfissional;
}
public function setNotaAtuacaoProfissional(int $notaAtuacaoProfissional): self
{
$this->notaAtuacaoProfissional = $notaAtuacaoProfissional;
return $this;
}
public function getNotaAtuacaoProfissionalDoutorado(): int
{
return $this->notaAtuacaoProfissionalDoutorado;
}
public function setNotaAtuacaoProfissionalDoutorado(int $notaAtuacaoProfissionalDoutorado): self
{
$this->notaAtuacaoProfissionalDoutorado = $notaAtuacaoProfissionalDoutorado;
return $this;
}
public function getProducaoAcademica(): array
{
return $this->producaoAcademica;
}
public function setProducaoAcademica(array $producaoAcademica): self
{
$this->producaoAcademica = $producaoAcademica;
return $this;
}
public function getNotaProducaoAcademica(): int
{
return $this->notaProducaoAcademica;
}
public function setNotaProducaoAcademica(int $notaProducaoAcademica): self
{
$this->notaProducaoAcademica = $notaProducaoAcademica;
return $this;
}
public function getNotaProducaoAcademicaDoutorado(): int
{
return $this->notaProducaoAcademicaDoutorado;
}
public function setNotaProducaoAcademicaDoutorado(int $notaProducaoAcademicaDoutorado): self
{
$this->notaProducaoAcademicaDoutorado = $notaProducaoAcademicaDoutorado;
return $this;
}
}