<?php

namespace AppBundle\Entity\Product;

use AppBundle\Entity\Billing\AccessIntangible;
use AppBundle\Entity\Billing\EducationalProjectIntangible;
use AppBundle\Entity\Education\EducationCurriculum;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Dunglas\ApiBundle\Annotation\Iri;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
use AppBundle\Validator\Constraints\Booking as OpentalentEventAssert;
/**
 * Service ou produit à facturer (cours)
 *
 * @Iri("http://schema.org/Intangible")
 */
#[ORM\Entity]
class Intangible extends AbstractProduct
{
    /**
     * @var string
     */
    #[ORM\Column(type: 'string', length: 100, nullable: false)]
    #[Assert\NotNull]
    #[Assert\Type(type: 'string')]
    #[Groups(['intangible', 'access_details_accessintangibles', 'educational_project_intangible_list', 'access_intangible_list', 'intangible_list', 'educationalproject_details_educationalprojectintangibles', 'access_intangible_list_intangible'])]
    private $label;
    /**
     * @var string
     */
    #[ORM\Column(type: 'string', nullable: true)]
    #[Assert\Type(type: 'string')]
    #[Assert\Choice(callback: ['\AppBundle\Enum\Billing\PeriodicityTypeEnum', 'toArray'])]
    #[Groups(['intangible', 'educational_project_intangible_list', 'access_intangible_list', 'intangible_list', 'access_intangible_list_intangible'])]
    private $billingPeriodicityType;
    /**
     * @var string
     */
    #[ORM\Column(type: 'string', nullable: true)]
    #[Assert\Type(type: 'string')]
    #[Assert\Choice(callback: ['\AppBundle\Enum\Billing\PeriodicityEnum', 'toArray'])]
    #[Groups(['intangible', 'educational_project_intangible_list', 'access_intangible_list', 'intangible_list', 'access_intangible_list_intangible'])]
    private $billingPeriodicity;
    /**
     * @var bool
     */
    #[ORM\Column(type: 'boolean', options: ['default' => true])]
    #[Assert\Type(type: 'boolean')]
    #[Assert\NotNull]
    #[Groups(['intangible', 'educational_project_intangible_list', 'access_intangible_list', 'intangible_list', 'access_intangible_list_intangible'])]
    private $isActive = true;
    /**
     * @var \DateTime
     */
    #[ORM\Column(type: 'datetime', nullable: true)]
    #[Assert\DateTime]
    #[Groups(['intangible'])]
    private $archiveDate;
    /**
     * @var string
     */
    #[ORM\Column(type: 'string', length: 7, nullable: true)]
    #[Assert\Length(max: 7, maxMessage: 'invalid-max-length')]
    #[Assert\Type(type: 'string')]
    #[Groups(['intangible', 'intangible_list', 'access_intangible_list_intangible'])]
    private $accountingCode;
    /**
     * @var int
     */
    #[ORM\Column(type: 'integer', nullable: true)]
    #[Assert\Type(type: 'integer', message: 'invalid-integer')]
    #[Groups(['intangible', 'intangible_list', 'access_intangible_list_intangible'])]
    private $nature;
    /**
     * @var string
     */
    #[ORM\Column(type: 'string', length: 200, nullable: true)]
    #[Assert\Type(type: 'string')]
    #[Groups(['intangible', 'intangible_list', 'access_intangible_list_intangible'])]
    private $accountingCodelabel;
    /**
     * @var bool
     */
    #[ORM\Column(type: 'boolean', options: ['default' => true])]
    #[Assert\Type(type: 'boolean')]
    #[Assert\NotNull]
    #[Groups(['intangible', 'access_intangible_list_intangible'])]
    private $applyVat = true;
    /**
     * @var float
     */
    #[ORM\Column(type: 'float', nullable: true)]
    #[Assert\Type(type: 'float')]
    #[Groups(['intangible', 'intangible_list', 'access_intangible_list_intangible'])]
    private $amountVat;
    /**
     * @var EducationCurriculum
     */
    #[ORM\ManyToMany(targetEntity: 'AppBundle\Entity\Education\EducationCurriculum')]
    #[ORM\JoinTable]
    #[Groups(['intangible_educationcurriculum', 'intangible_list', 'access_intangible_list_intangible'])]
    private $educationCurriculums;
    /**
     * @var IntangiblePriceAndDiscount
     */
    #[Assert\Valid]
    #[ORM\OneToOne(targetEntity: 'IntangiblePriceAndDiscount', cascade: ['persist'], orphanRemoval: true, fetch: 'EAGER')]
    #[ORM\JoinColumn(nullable: true)]
    #[Groups(['intangible', 'educational_project_intangible_list', 'access_intangible_list', 'intangible_list', 'access_intangible_list_intangible'])]
    private $intangiblePriceAndDiscount;
    /**
     * @var string
     */
    #[ORM\Column(type: 'string', nullable: true)]
    #[Assert\Type(type: 'string')]
    #[Assert\Choice(callback: ['\AppBundle\Enum\Education\EducationTypeEnum', 'toArray'])]
    #[Groups(['intangible'])]
    private $domain;
    /**
     * @var ArrayCollection<AccessIntangible>
     */
    #[ORM\OneToMany(targetEntity: 'AppBundle\Entity\Billing\AccessIntangible', mappedBy: 'intangible', orphanRemoval: true, cascade: ['persist'])]
    #[Groups(['intangible_accessintangible'])]
    private $accessIntangibles;
    public function __construct()
    {
        parent::__construct();
        $this->educationCurriculums = new ArrayCollection();
    }
    /**
     * Set label
     *
     * @param string $label
     *
     * @return Intangible
     */
    public function setLabel($label)
    {
        $this->label = $label;

        return $this;
    }
    /**
     * Get label
     *
     * @return string
     */
    public function getLabel()
    {
        return $this->label;
    }
    /**
     * Set billingPeriodicity
     *
     * @param string $billingPeriodicity
     *
     * @return Intangible
     */
    public function setBillingPeriodicity($billingPeriodicity)
    {
        $this->billingPeriodicity = $billingPeriodicity;

        return $this;
    }
    /**
     * Get billingPeriodicity
     *
     * @return string
     */
    public function getBillingPeriodicity()
    {
        return $this->billingPeriodicity;
    }
    /**
     * Set isActive
     *
     * @param boolean $isActive
     *
     * @return Intangible
     */
    public function setIsActive($isActive)
    {
        $this->isActive = $isActive;

        return $this;
    }
    /**
     * Get isActive
     *
     * @return boolean
     */
    public function getIsActive()
    {
        return $this->isActive;
    }
    /**
     * Set archiveDate
     *
     * @param \DateTime $archiveDate
     *
     * @return Intangible
     */
    public function setArchiveDate($archiveDate)
    {
        $this->archiveDate = $archiveDate;

        return $this;
    }
    /**
     * Get archiveDate
     *
     * @return \DateTime
     */
    public function getArchiveDate()
    {
        return $this->archiveDate;
    }
    /**
     * Set accountingCode
     *
     * @param integer $accountingCode
     *
     * @return Intangible
     */
    public function setAccountingCode($accountingCode)
    {
        $this->accountingCode = $accountingCode;

        return $this;
    }
    /**
     * Get accountingCode
     *
     * @return integer
     */
    public function getAccountingCode()
    {
        return $this->accountingCode;
    }
    /**
     * Set nature
     *
     * @param integer $nature
     *
     * @return Intangible
     */
    public function setNature($nature)
    {
        $this->nature = $nature;

        return $this;
    }
    /**
     * Get nature
     *
     * @return integer
     */
    public function getNature()
    {
        return $this->nature;
    }
    /**
     * Set accountingCodelabel
     *
     * @param string $accountingCodelabel
     *
     * @return Intangible
     */
    public function setAccountingCodelabel($accountingCodelabel)
    {
        $this->accountingCodelabel = $accountingCodelabel;

        return $this;
    }
    /**
     * Get accountingCodelabel
     *
     * @return string
     */
    public function getAccountingCodelabel()
    {
        return $this->accountingCodelabel;
    }
    /**
     * Set applyVat
     *
     * @param boolean $applyVat
     *
     * @return Intangible
     */
    public function setApplyVat($applyVat)
    {
        $this->applyVat = $applyVat;

        return $this;
    }
    /**
     * Get applyVat
     *
     * @return boolean
     */
    public function getApplyVat()
    {
        return $this->applyVat;
    }
    /**
     * Set amountVat
     *
     * @param float $amountVat
     *
     * @return Intangible
     */
    public function setAmountVat($amountVat)
    {
        $this->amountVat = floatval($amountVat);

        return $this;
    }
    /**
     * Get amountVat
     *
     * @return float
     */
    public function getAmountVat()
    {
        return $this->amountVat;
    }
    /**
     * Set intangiblePriceAndDiscount
     *
     * @param \AppBundle\Entity\Product\IntangiblePriceAndDiscount $intangiblePriceAndDiscount
     *
     * @return Intangible
     */
    public function setIntangiblePriceAndDiscount(\AppBundle\Entity\Product\IntangiblePriceAndDiscount $intangiblePriceAndDiscount = null)
    {
        $this->intangiblePriceAndDiscount = $intangiblePriceAndDiscount;

        return $this;
    }
    /**
     * Get intangiblePriceAndDiscount
     *
     * @return \AppBundle\Entity\Product\IntangiblePriceAndDiscount
     */
    public function getIntangiblePriceAndDiscount()
    {
        return $this->intangiblePriceAndDiscount;
    }
    /**
     * Set billingPeriodicityType
     *
     * @param string $billingPeriodicityType
     *
     * @return Intangible
     */
    public function setBillingPeriodicityType($billingPeriodicityType)
    {
        $this->billingPeriodicityType = $billingPeriodicityType;

        return $this;
    }
    /**
     * Get billingPeriodicityType
     *
     * @return string
     */
    public function getBillingPeriodicityType()
    {
        return $this->billingPeriodicityType;
    }
    /**
     * Add educationalProjectIntangible
     *
     * @param \AppBundle\Entity\Billing\EducationalProjectIntangible $educationalProjectIntangible
     *
     * @return Intangible
     */
    public function addEducationalProjectIntangible(\AppBundle\Entity\Billing\EducationalProjectIntangible $educationalProjectIntangible)
    {
        $this->educationalProjectIntangible[] = $educationalProjectIntangible;

        return $this;
    }
    /**
     * Remove educationalProjectIntangible
     *
     * @param \AppBundle\Entity\Billing\EducationalProjectIntangible $educationalProjectIntangible
     */
    public function removeEducationalProjectIntangible(\AppBundle\Entity\Billing\EducationalProjectIntangible $educationalProjectIntangible)
    {
        $this->educationalProjectIntangible->removeElement($educationalProjectIntangible);
    }
    /**
     * Get educationalProjectIntangible
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getEducationalProjectIntangible()
    {
        return $this->educationalProjectIntangible;
    }
    /**
     * Add educationCurriculum
     *
     * @param \AppBundle\Entity\Education\EducationCurriculum $educationCurriculum
     *
     * @return Intangible
     */
    public function addEducationCurriculum(\AppBundle\Entity\Education\EducationCurriculum $educationCurriculum)
    {
        $this->educationCurriculums[] = $educationCurriculum;

        return $this;
    }
    /**
     * Remove educationCurriculum
     *
     * @param \AppBundle\Entity\Education\EducationCurriculum $educationCurriculum
     */
    public function removeEducationCurriculum(\AppBundle\Entity\Education\EducationCurriculum $educationCurriculum)
    {
        $this->educationCurriculums->removeElement($educationCurriculum);
    }
    /**
     * Get educationCurriculums
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getEducationCurriculums()
    {
        return $this->educationCurriculums;
    }
    /**
     * Set domain
     *
     * @param string $domain
     *
     * @return Intangible
     */
    public function setDomain($domain)
    {
        $this->domain = $domain;

        return $this;
    }
    /**
     * Get domain
     *
     * @return string
     */
    public function getDomain()
    {
        return $this->domain;
    }
    /**
     * Add accessIntangible
     *
     * @param \AppBundle\Entity\Billing\AccessIntangible $accessIntangible
     *
     * @return Intangible
     */
    public function addAccessIntangible(\AppBundle\Entity\Billing\AccessIntangible $accessIntangible)
    {
        $this->accessIntangibles[] = $accessIntangible;

        return $this;
    }
    /**
     * Remove accessIntangible
     *
     * @param \AppBundle\Entity\Billing\AccessIntangible $accessIntangible
     */
    public function removeAccessIntangible(\AppBundle\Entity\Billing\AccessIntangible $accessIntangible)
    {
        $this->accessIntangibles->removeElement($accessIntangible);
    }
    /**
     * Get accessIntangibles
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getAccessIntangibles()
    {
        return $this->accessIntangibles;
    }
}
