<?php
namespace App\Application\Internit\SolicitacaoBundle\Entity;
use App\Application\Internit\ProfissionalBundle\Entity\Profissional;
use App\Application\Internit\SolicitacaoBundle\Repository\SolicitacaoRepository;
use App\Application\Internit\StatusSolicitacaoBundle\Entity\StatusSolicitacao;
use App\Application\Internit\TipoSolicitacaoBundle\Entity\Assunto;
use App\Application\Internit\TipoSolicitacaoBundle\Entity\TipoSolicitacao;
use App\Application\Internit\PeriodoAgendamentoBundle\Entity\PeriodoAgendamento;
use App\Application\Internit\AndamentoSolicitacaoBundle\Entity\AndamentoSolicitacao;
use App\Application\Internit\UnidadeBundle\Entity\Unidade;
use App\Application\Internit\ClienteBundle\Entity\Cliente;
use App\Application\Project\ContentBundle\Entity\BaseEntity;
use App\Application\Project\SecurityAdminBundle\Entity\UserAdmin;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use App\Entity\SonataMediaGallery;
use App\Entity\SonataMediaMedia;
use Doctrine\ORM\Mapping as ORM;
use DateTime;
/** Info: */
#[ORM\Table(name: 'solicitacao')]
#[ORM\Entity(repositoryClass: SolicitacaoRepository::class)]
#[UniqueEntity('id')]
#[ORM\HasLifecycleCallbacks]
class Solicitacao extends BaseEntity
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(name: 'id', type: 'integer', unique: true, nullable: false)]
private ?int $id = null;
#[ORM\Column(name: 'codigo', type: 'string', unique: true, nullable: true)]
private ?string $codigo = null;
#[Assert\NotNull]
#[Assert\NotBlank]
#[ORM\Column(name: 'mensagem', type: 'text', unique: false, nullable: false)]
private string $mensagem;
#[Assert\NotNull]
#[Assert\NotBlank]
##[Assert\Date]
#[ORM\Column(name: 'data', type: 'date', unique: false, nullable: false)]
private DateTime $data;
##[Assert\NotNull]
##[Assert\NotBlank]
#[ORM\ManyToOne(targetEntity: TipoSolicitacao::class)]
#[ORM\JoinColumn(name: 'tipoSolicitacao_id', referencedColumnName: 'id', onDelete: 'SET NULL')]
private TipoSolicitacao|null $tipoSolicitacao = null;
#[ORM\ManyToOne(targetEntity: Assunto::class)]
#[ORM\JoinColumn(name: 'assunto_id', referencedColumnName: 'id', onDelete: 'SET NULL')]
private Assunto|null $assunto = null;
#[Assert\NotNull]
#[Assert\NotBlank]
#[ORM\ManyToOne(targetEntity: PeriodoAgendamento::class)]
#[ORM\JoinColumn(name: 'periodoAgendamento_id', referencedColumnName: 'id', onDelete: 'SET NULL')]
private PeriodoAgendamento|null $periodoAgendamento = null;
#[ORM\OneToMany(mappedBy: 'solicitacao', targetEntity: AndamentoSolicitacao::class)]
private Collection $andamentoSolicitacao;
#[Assert\NotNull]
#[Assert\NotBlank]
#[ORM\ManyToOne(targetEntity: Unidade::class)]
#[ORM\JoinColumn(name: 'unidade_id', referencedColumnName: 'id', onDelete: 'SET NULL')]
private Unidade|null $unidade = null;
#[Assert\NotNull]
#[Assert\NotBlank]
#[ORM\ManyToOne(targetEntity: Cliente::class)]
#[ORM\JoinColumn(name: 'cliente_id', referencedColumnName: 'id', onDelete: 'SET NULL')]
private Cliente|null $cliente = null;
#[ORM\ManyToOne(targetEntity: UserAdmin::class)]
#[ORM\JoinColumn(name: 'responsavelAtendimento', referencedColumnName: 'id', onDelete: 'SET NULL')]
private UserAdmin|null $responsavelAtendimento = null;
#[ORM\Column(name: 'respondidoAdmin', type: 'boolean', unique: false, nullable: true)]
private ?bool $respondidoAdmin = true;
#[ORM\ManyToOne(targetEntity: SonataMediaGallery::class, cascade: ['persist'])]
private mixed $anexos;
#[ORM\ManyToOne(targetEntity: StatusSolicitacao::class)]
#[ORM\JoinColumn(name: 'status_atual', referencedColumnName: 'id', onDelete: 'SET NULL')]
private StatusSolicitacao|null $statusAtual = null;
#[Assert\NotNull]
#[Assert\NotBlank]
#[ORM\Column(name: 'ultimaInteracao', type: 'string', unique: false, nullable: true)]
private ?string $ultimaInteracao = null;
private mixed $multipleUpload;
private $empreendimento;
private $bloco;
#[ORM\PrePersist]
public function onPrePersist(): void
{
$this->updateStatusAtual();
parent::onPrePersist();
}
#[ORM\PreUpdate]
public function onPreUpdate(): void
{
$this->updateStatusAtual();
parent::onPreUpdate();
}
public function __construct()
{
$this->andamentoSolicitacao = new ArrayCollection();
$this->updateStatusAtual();
}
public function updateStatusAtual()
{
/** @var $andamento AndamentoSolicitacao */
//$andamentoAtual = $this->andamentoSolicitacao->last();
//$this->setStatusAtual(($andamentoAtual)? $andamentoAtual->getStatusSolicitacao() : null);
}
public function getId(): ?int
{
return $this->id;
}
public function getCodigo(): ?string
{
return $this->codigo;
}
public function setCodigo(?string $codigo): void
{
$this->codigo = $codigo;
}
public function getMensagem(): string
{
return $this->mensagem;
}
public function setMensagem(string $mensagem): void
{
$this->mensagem = $mensagem;
}
public function getData(): DateTime
{
return $this->data;
}
public function setData(DateTime $data): void
{
$this->data = $data;
}
public function getTipoSolicitacao(): ?TipoSolicitacao
{
return $this->tipoSolicitacao;
}
public function setTipoSolicitacao(?TipoSolicitacao $tipoSolicitacao): void
{
$this->tipoSolicitacao = $tipoSolicitacao;
}
public function getAssunto(): ?Assunto
{
return $this->assunto;
}
public function setAssunto(?Assunto $assunto): void
{
$this->assunto = $assunto;
}
public function getPeriodoAgendamento(): ?PeriodoAgendamento
{
return $this->periodoAgendamento;
}
public function setPeriodoAgendamento(?PeriodoAgendamento $periodoAgendamento): void
{
$this->periodoAgendamento = $periodoAgendamento;
}
public function getAndamentoSolicitacao(): Collection
{
return $this->andamentoSolicitacao;
}
public function setAndamentoSolicitacao(Collection $andamentoSolicitacao): void
{
$this->andamentoSolicitacao = $andamentoSolicitacao;
}
public function getEmpreendimento()
{
return $this->empreendimento;
}
public function setEmpreendimento($empreendimento): void
{
$this->empreendimento = $empreendimento;
}
public function getBloco()
{
return $this->bloco;
}
public function setBloco($bloco): void
{
$this->bloco = $bloco;
}
public function getUnidade(): ?Unidade
{
return $this->unidade;
}
public function setUnidade(?Unidade $unidade): void
{
$this->unidade = $unidade;
}
public function getResponsavelAtendimento(): ?UserAdmin
{
return $this->responsavelAtendimento;
}
public function setResponsavelAtendimento(?UserAdmin $responsavelAtendimento): void
{
$this->responsavelAtendimento = $responsavelAtendimento;
}
public function getCliente(): ?Cliente
{
return $this->cliente;
}
public function setCliente(?Cliente $cliente): void
{
$this->cliente = $cliente;
}
public function getUltimaInteracao(): ?string
{
return $this->ultimaInteracao;
}
public function setUltimaInteracao(?string $ultimaInteracao): void
{
$this->ultimaInteracao = $ultimaInteracao;
}
public function getAnexos(): mixed
{
return $this->anexos;
}
public function setAnexos(mixed $anexos): void
{
$this->anexos = $anexos;
}
public function getMultipleUpload(): mixed
{
return $this->multipleUpload;
}
public function setMultipleUpload(mixed $multipleUpload): void
{
$this->multipleUpload = $multipleUpload;
}
public function getRespondidoAdmin(): ?bool
{
return $this->respondidoAdmin;
}
public function setRespondidoAdmin(?bool $respondidoAdmin): void
{
$this->respondidoAdmin = $respondidoAdmin;
}
public function getStatusAtual(): ?StatusSolicitacao
{
return $this->statusAtual;
}
public function setStatusAtual(?StatusSolicitacao $statusAtual): void
{
$this->statusAtual = $statusAtual;
}
public function getOs(): array
{
$result = [];
/** @var $andamento AndamentoSolicitacao */
foreach ($this->getAndamentoSolicitacao() as $andamento)
{
if(!$andamento->getAgendamento())
continue;
foreach ($andamento->getAgendamento()->getOrdemServicos() as $os)
{
$result[] = $os;
}
}
return $result;
}
/**
* @return Profissional[]
*/
public function getAllProffisionais(): array
{
$profissionais = [];
/** @var $andamento AndamentoSolicitacao */
foreach ($this->getAndamentoSolicitacao() as $andamento) {
if($andamento->getAgendamento()) {
foreach ($andamento->getAgendamento()->getProfissionais() as $profissional) {
$profissionais[] = $profissional;
}
}
}
return array_unique($profissionais, SORT_REGULAR);
}
}