<?php
namespace App\Entity;
use App\Repository\PcPostulacionRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use DateTime;
use DateTimeInterface;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity(repositoryClass: PcPostulacionRepository::class)]
class PcPostulacion
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[Assert\Type(type: "integer", message: "El monto requerido debe ser un número entero")]
#[Assert\GreaterThanOrEqual(value: 0, message: "El monto requerido no puede ser negativo")]
#[ORM\Column(type: "integer", nullable: true)]
private ?int $monto_requerido = 0;
#[ORM\Column]
private array $formulario_postulacion = [];
#[ORM\Column]
private array $documentos_postulacion = [];
#[Assert\Length(max: 255, maxMessage: "El certificado de postulación no puede superar los 255 caracteres")]
#[ORM\Column(type: 'string', length: 255, nullable:true)]
private $certificado_postulacion;
#[ORM\Column(type: 'boolean', nullable:true)]
private $resultado_admisibilidad;
#[Assert\Length(max: 255, maxMessage: "El estado de admisibilidad no puede superar los 255 caracteres")]
#[ORM\Column(type: 'string', length: 255, nullable:true)]
private $estado_admisibilidad;
#[ORM\Column]
private array $formulario_admisibilidad = [];
#[ORM\Column(type: 'decimal', precision:10, scale:3, nullable:true)]
private $nota_final_evaluacion = null;
#[ORM\Column]
private array $formulario_evaluacion = [];
#[Assert\Length(max: 255, maxMessage: "El estado de evaluación no puede superar los 255 caracteres")]
#[ORM\Column(type: 'string', length: 255, nullable:true)]
private $estado_evaluacion;
#[ORM\Column]
private array $formulario_seleccion = [];
#[Assert\Length(max: 255, maxMessage: "El estado de selección no puede superar los 255 caracteres")]
#[ORM\Column(type: 'string', length: 255, nullable:true)]
private $estado_seleccion;
#[ORM\Column(type: 'boolean', nullable:true)]
private $resultado_seleccion;
#[Assert\Type(type: "integer", message: "El monto requerido debe ser un número entero")]
#[Assert\GreaterThanOrEqual(value: 0, message: "El monto requerido no puede ser negativo")]
#[ORM\Column(type: "integer", nullable: true)]
private ?int $monto_adjudicado = null;
#[ORM\Column]
private array $documentos = [];
#[ORM\ManyToOne(targetEntity: "App\Entity\PcConvocatorias", inversedBy: 'postulacion')]
#[ORM\JoinColumn(nullable: false)]
private $convocatoria;
#[ORM\ManyToOne(targetEntity: "App\Entity\PcPuntoCultura", inversedBy: 'postulacion')]
#[ORM\JoinColumn(nullable: false)]
private $puntoCultura;
#[Assert\Length(max: 255, maxMessage: "El estado no puede superar los 255 caracteres")]
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private $estado;
#[ORM\ManyToOne(targetEntity: "App\Entity\User", inversedBy: 'postulacion_admisibilidad')]
private ?User $usuario_admisibilidad;
#[ORM\ManyToOne(targetEntity: "App\Entity\User", inversedBy: 'postulacion_evaluacion')]
private ?User $usuario_evaluacion;
#[ORM\ManyToOne(targetEntity: "App\Entity\User", inversedBy: 'postulacion_seleccion')]
private ?User $usuario_seleccion;
#[ORM\Column(type: 'datetime',nullable:true)]
private $createdAt;
#[ORM\Column(type: 'datetime',nullable:true)]
private $updatedAt;
#[ORM\Column(type: 'datetime',nullable:true)]
private $postulatedAt;
#[ORM\Column(type: 'datetime',nullable:true)]
private $admisibilidad_at;
#[ORM\Column(type: 'datetime',nullable:true)]
private $evaluacion_at;
#[ORM\Column(type: 'datetime',nullable:true)]
private $seleccion_at;
public function getId(): ?int
{
return $this->id;
}
public function getMontoRequerido(): ?int
{
return $this->monto_requerido;
}
public function setMontoRequerido(?int $monto_requerido): self
{
$this->monto_requerido = $monto_requerido;
return $this;
}
public function getFormularioPostulacion(): array
{
return $this->formulario_postulacion;
}
public function setFormularioPostulacion(array $formulario_postulacion): self
{
$this->formulario_postulacion = $formulario_postulacion;
return $this;
}
public function getDocumentosPostulacion(): array
{
return $this->documentos_postulacion;
}
public function setDocumentosPostulacion(array $documentos_postulacion): self
{
$this->documentos_postulacion = $documentos_postulacion;
return $this;
}
public function getCertificadoPostulacion(): ?string
{
return $this->certificado_postulacion;
}
public function setCertificadoPostulacion(?string $certificado_postulacion): self
{
$this->certificado_postulacion = $certificado_postulacion;
return $this;
}
public function getResultadoAdmisibilidad(): ?bool
{
return $this->resultado_admisibilidad;
}
public function setResultadoAdmisibilidad(?bool $resultado_admisibilidad): self
{
$this->resultado_admisibilidad = $resultado_admisibilidad;
return $this;
}
public function getEstadoAdmisibilidad(): ?string
{
return $this->estado_admisibilidad;
}
public function setEstadoAdmisibilidad(?string $estado_admisibilidad): self
{
$this->estado_admisibilidad = $estado_admisibilidad;
return $this;
}
public function getFormularioAdmisibilidad(): array
{
return $this->formulario_admisibilidad;
}
public function setFormularioAdmisibilidad(array $formulario_admisibilidad): self
{
$this->formulario_admisibilidad = $formulario_admisibilidad;
return $this;
}
public function getNotaFinalEvaluacion(): ?float
{
return $this->nota_final_evaluacion !== null ? (float) $this->nota_final_evaluacion : null;
}
public function setNotaFinalEvaluacion(?float $nota_final_evaluacion): self
{
$this->nota_final_evaluacion = $nota_final_evaluacion;
return $this;
}
public function getFormularioEvaluacion(): array
{
return $this->formulario_evaluacion;
}
public function setFormularioEvaluacion(array $formulario_evaluacion): self
{
$this->formulario_evaluacion = $formulario_evaluacion;
return $this;
}
public function getEstadoEvaluacion(): ?string
{
return $this->estado_evaluacion;
}
public function setEstadoEvaluacion(?string $estado_evaluacion): self
{
$this->estado_evaluacion = $estado_evaluacion;
return $this;
}
public function getFormularioSeleccion(): array
{
return $this->formulario_seleccion;
}
public function setFormularioSeleccion(array $formulario_seleccion): self
{
$this->formulario_seleccion = $formulario_seleccion;
return $this;
}
public function getEstadoSeleccion(): ?string
{
return $this->estado_seleccion;
}
public function setEstadoSeleccion(?string $estado_seleccion): self
{
$this->estado_seleccion = $estado_seleccion;
return $this;
}
public function getResultadoSeleccion(): ?bool
{
return $this->resultado_seleccion;
}
public function setResultadoSeleccion(?bool $resultado_seleccion): self
{
$this->resultado_seleccion = $resultado_seleccion;
return $this;
}
public function getMontoAdjudicado(): ?int
{
return $this->monto_adjudicado;
}
public function setMontoAdjudicado(?int $monto_adjudicado): self
{
$this->monto_adjudicado = $monto_adjudicado;
return $this;
}
public function getDocumentos(): array
{
return $this->documentos;
}
public function setDocumentos(array $documentos): self
{
$this->documentos = $documentos;
return $this;
}
public function getConvocatoria()
{
return $this->convocatoria;
}
public function setConvocatoria($convocatoria): self
{
$this->convocatoria = $convocatoria;
return $this;
}
public function getPuntoCultura()
{
return $this->puntoCultura;
}
public function setPuntoCultura($puntoCultura): self
{
$this->puntoCultura = $puntoCultura;
return $this;
}
public function getEstado(): ?string
{
return $this->estado;
}
public function setEstado(?string $estado): self
{
$this->estado = $estado;
return $this;
}
public function __toString(){
return $this->getNombre();
}
/**
* @return DateTimeInterface|null
* @throws Exception
*/
public function getCreatedAt(): ?DateTimeInterface
{
return $this->createdAt ?? new DateTime();
}
/**
* @param DateTimeInterface $createdAt
* @return $this
*/
public function setCreatedAt(DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
/**
* @return DateTimeInterface|null
*/
public function getUpdatedAt(): ?DateTimeInterface
{
return $this->updatedAt ?? new DateTime();
}
/**
* @param DateTimeInterface $updatedAt
* @return $this
*/
public function setUpdatedAt(DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function updateTimestamps(): void
{
$now = new DateTime();
$this->setUpdatedAt($now);
if ($this->getId() === null) {
$this->setCreatedAt($now);
}
}
public function getPostulatedAt(): ?\DateTimeInterface
{
return $this->postulatedAt;
}
public function setPostulatedAt(?\DateTimeInterface $postulatedAt): self
{
$this->postulatedAt = $postulatedAt;
return $this;
}
public function getAdmisibilidadAt(): ?\DateTimeInterface
{
return $this->admisibilidad_at;
}
public function setAdmisibilidadAt(?\DateTimeInterface $admisibilidad_at): self
{
$this->admisibilidad_at = $admisibilidad_at;
return $this;
}
public function getEvaluacionAt(): ?\DateTimeInterface
{
return $this->evaluacion_at;
}
public function setEvaluacionAt(?\DateTimeInterface $evaluacion_at): self
{
$this->evaluacion_at = $evaluacion_at;
return $this;
}
public function getSeleccionAt(): ?\DateTimeInterface
{
return $this->seleccion_at;
}
public function setSeleccionAt(?\DateTimeInterface $seleccion_at): self
{
$this->seleccion_at = $seleccion_at;
return $this;
}
public function getUsuarioAdmisibilidad(): ?User
{
return $this->usuario_admisibilidad;
}
public function setUsuarioAdmisibilidad(?User $usuarioAdmisibilidad): self
{
$this->usuario_admisibilidad = $usuarioAdmisibilidad;
return $this;
}
public function getUsuarioEvaluacion(): ?User
{
return $this->usuario_evaluacion;
}
public function setUsuarioEvaluacion(?User $usuarioEvaluacion): self
{
$this->usuario_evaluacion = $usuarioEvaluacion;
return $this;
}
public function getUsuarioSeleccion(): ?User
{
return $this->usuario_seleccion;
}
public function setUsuarioSeleccion(?User $usuarioSeleccion): self
{
$this->usuario_seleccion = $usuarioSeleccion;
return $this;
}
public function isEditableAdmisibilidad(): ?bool {
return ($this->estado == 'send'
&& $this->estado_admisibilidad !== 'send'
&& $this->getConvocatoria()->getEstado() == '2');
}
public function isEditableEvaluacion(): ?bool {
return ($this->estado == 'send'
&& $this->estado_admisibilidad == 'send'
&& $this->resultado_admisibilidad
&& $this->estado_evaluacion !== 'send'
&& $this->getConvocatoria()->getEstado() == '2');
}
public function isEditableSeleccion(): ?bool {
$convocatoriaEntidad = $this->getConvocatoria();
return ($this->estado == 'send'
&& $this->estado_admisibilidad == 'send'
&& $this->resultado_admisibilidad
&& $this->getNotaFinalEvaluacion() >= $convocatoriaEntidad->getPuntajeEvalCorte()
&& $this->estado_evaluacion == 'send'
&& $this->estado_seleccion !== 'send'
&& $convocatoriaEntidad->getEstado() == '2');
}
public function getEtapaPostulacion(){
$convocatoriaEntidad = $this->getConvocatoria();
if($convocatoriaEntidad->getEstado() == '1'){
return 'En postulación';
} else if($convocatoriaEntidad->getEstado() == '2'){
if($this->isEditableAdmisibilidad()){
return 'Admisibilidad';
} else if ($this->isEditableEvaluacion()) {
return 'Evaluación';
} else if ($this->isEditableSeleccion()) {
return 'Selección';
} else {
return 'Cerrado';
}
} else {
return 'Cerrado';
}
}
public function getResultadoPostulacion(){
$convocatoriaEntidad = $this->getConvocatoria();
$estadoConvocatoria = $convocatoriaEntidad->getEstado();
$estadoPostulacion = $this->getEstado();
$estadoAdmisibilidad = $this->getEstadoAdmisibilidad();
$estadoEvaluacion = $this->getEstadoEvaluacion();
$estadoSeleccion = $this->getEstadoSeleccion();
$esAdmisible = $this->getResultadoAdmisibilidad();
$esSeleccion = $this->getResultadoSeleccion();
$esEvaluacion = $this->getNotaFinalEvaluacion() >= $convocatoriaEntidad->getPuntajeEvalCorte();
$estado = 'Guardado';
// En postulacion
if($estadoPostulacion == 'send'){
$estado = 'Enviado';
}
// Evaluacion
if(!empty($estadoAdmisibilidad)){
if($estadoAdmisibilidad == 'send') {
if($esAdmisible){
$estado = 'Admisible';
}else{
$estado = 'No admisible';
}
} else {
$estado = 'en proceso de admisibilidad';
}
}
if(!empty($estadoEvaluacion)){
if($estadoEvaluacion == 'send') {
if($esEvaluacion){
$estado = 'Evaluación aprobada';
} else {
$estado = 'Evaluación no aprobada';
}
} else {
$estado = 'en proceso de evaluación';
}
}
if(!empty($estadoSeleccion)){
if($estadoSeleccion == 'send') {
if($esSeleccion){
$estado = 'Seleccionada';
}else{
$estado = 'No seleccionada';
}
} else {
$estado = 'en proceso de selección';
}
}
return $estado;
}
}