<?php
namespace App\Entity\GDA;
use JsonSerializable;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use App\Entity\Commun\DateNaissanceTrait;
/**
* @ORM\Entity(repositoryClass="App\Repository\GDA\EnfantRepository")
* @ORM\Table(name="efc.gda_enfant")
*/
class Enfant implements JsonSerializable
{
// <editor-fold defaultstate="collapsed" desc="Attributs privés">
use DateNaissanceTrait;
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORM\Column(type="string", length=50)
* @Assert\Regex(pattern="/^[A-Za-zÀ-ž ',-]{0,50}$/", message="Les caractères spéciaux ne sont pas acceptés.")
*/
private $nom_famille;
/**
* @ORM\Column(type="string", length=50)
* @Assert\Regex(pattern="/^[A-Za-zÀ-ž ',-]{0,50}$/", message="Les caractères spéciaux ne sont pas acceptés.")
*/
private $prenom;
/**
* @ORM\Column(type="string", length=1)
* @Assert\Regex(pattern="/^[FIM]$/", message="Feminin, Indetermine, Masculin")
*/
private $sexe;
/**
* @ORM\OneToMany(targetEntity="Accueil", mappedBy="enfant")
* @ORM\OrderBy({"date_debut" = "DESC","date_fin" = "DESC"})
*/
private $accueils;
/**
* @Assert\Valid
* @ORM\OneToMany(targetEntity="ResponsableLegal", mappedBy="enfant", cascade={"persist", "remove"})
* @ORM\OrderBy({"numero" = "ASC"})
*/
private $responsables_legaux;
// </editor-fold>
// <editor-fold desc="Accesseurs">
function getId()
{
return $this->id;
}
function getNomFamille()
{
return $this->nom_famille;
}
function getPrenom()
{
return $this->prenom;
}
function getSexe()
{
return $this->sexe;
}
function getAccueils()
{
return $this->accueils;
}
function getResponsablesLegaux()
{
return $this->responsables_legaux;
}
public function setNomFamille($nomFamille)
{
// TODO factoriser dans trait personne
$this->nom_famille = strtoupper($nomFamille);
return $this;
}
public function setPrenom($prenom)
{
// TODO factoriser dans trait personne
$prenomCapitalizeHyphenated = implode('-', array_map('ucwords', explode('-', strtolower($prenom))));
$this->prenom = $prenomCapitalizeHyphenated;
return $this;
}
public function setSexe($sexe)
{
$this->sexe = $sexe;
return $this;
}
public function setAccueils($accueils)
{
$this->accueils = $accueils;
return $this;
}
public function setResponsablesLegaux($responsablesLegaux)
{
$this->responsables_legaux = $responsablesLegaux;
return $this;
}
/**
* Obtient le libellé pour le sexe de l'enfant
*
* @return void
*/
function getSexeTexte()
{
switch ($this->sexe) {
case 'F':
$sexeTexte = "Féminin";
break;
case 'M':
$sexeTexte = "Masculin";
break;
default:
$sexeTexte = "Indéterminé";
break;
}
return $sexeTexte;
}
/**
* Indique si l'enfant est de sexe féminin
*
* @return boolean
*/
function isFeminin(){
return $this->sexe == 'F';
}
/**
* Obtient la liste des accueils actifs
* @return boolean
*/
public function getAccueilsActif()
{
$accueilsActifs = array();
foreach ($this->accueils as $accueil) {
if ($accueil->getDateFin() === null || $accueil->getDateFin() >= new \DateTime()) {
$accueilsActifs[] = $accueil;
}
}
return $accueilsActifs;
}
/*
* Vérifier que le responsable légal n'est pas le dernier responsable lié à l'enfant
*/
public function hasUnSeulResponsableLegal()
{
$responsables = $this->getResponsablesLegaux();
return $responsables->count() <= 1;
}
// </editor-fold>
// <editor-fold desc="Méthodes publiques">
/**
* Constructor
*/
public function __construct()
{ }
/**
* Obtient une nouvelle instance d'Enfant, initialisée à partir du tableau associatif fourni en paramètre
*
* @param array $data
* @return Enfant
*/
public static function createFromArray(array $data)
{
$newInstance = new Enfant();
return $newInstance->initFromArray($data);
}
/**
* mappe les propriétés sur l'instance à partir d'un tableau associatif
*
* @param array $data
* @return void
*/
public function initFromArray(array $data)
{
foreach ($data as $prop => $value) {
$this->{$prop} = $value;
}
return $this;
}
public function __toString()
{
return json_encode($this->jsonSerialize());
}
/*
* Implémentation de JsonSerializable
* Ne liste que les champs modifiables par les utilisateurs
*/
public function jsonSerialize()
{
return [
'id' => $this->id,
'nom_famille' => $this->nom_famille,
'prenom' => $this->prenom,
'date_naissance' => $this->date_naissance === null ? null : $this->date_naissance->format('d-m-Y'),
'responsables_legaux' => array_map(function ($rl) {
return $rl->jsonSerialize();
}, is_array($this->responsables_legaux) ? $this->responsables_legaux : $this->responsables_legaux->toArray())
];
}
// </editor-fold>
}