<?php

namespace OfficeBrain\Bundle\CompanyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Validator\Constraints as Assert;
use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Exclude;

/**
 * Entity For Company @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
 * @author OfficeBrain 4493
 */

/**
 * Company
 *
 * @ORM\Table(name="tbl_company_master")
 * @ORM\Entity(repositoryClass="OfficeBrain\Bundle\CompanyBundle\Entity\CompanyRepository")
 * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
 * @ExclusionPolicy("none")
 */
class Company
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="bigint",length=20, options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * Bidirectional (OWNING SIDE - FK)
     * @ORM\ManyToOne(targetEntity="\OfficeBrain\Bundle\CompanyBundle\Entity\Company", inversedBy="child")
     * @ORM\JoinColumn(name="parent_id", nullable=true)
     */
    protected $parent;
    
    /**
     * Bidirectional (OWNING SIDE - FK)
     * @Exclude
     * @ORM\ManyToOne(targetEntity="\OfficeBrain\Bundle\UserBundle\Entity\User", inversedBy="company" )
     * @ORM\JoinColumn(name="user_id", nullable=false)
     */
    protected $userc;

    /**
     * @var string
     * @ORM\Column(name="company_name", type="string", length=255, options={"collate"="utf8_unicode_ci"} , nullable=true)
     * @Assert\NotBlank(message="admin.company.companyname.not_blank")
     */
    private $companyName;

    /**
     * @var string
     * @ORM\Column(name="company_asi_number", type="string", length=100, options={"collate"="utf8_unicode_ci"} , nullable=true)
     * @Assert\NotBlank(message="admin.company.companyasi.not_blank")
     */
    private $companyAsiNumber;

    /**
     * @var string
     * @ORM\Column(name="company_number", type="string", length=100, options={"collate"="utf8_unicode_ci"} , nullable=true)
     * @Assert\NotBlank(message="admin.company.companynumber.not_blank")
     */
    private $companyNumber;

    /**
     * @var string
     * @ORM\Column(name="email", type="string", length=150, options={"collate"="utf8_unicode_ci"} , nullable=true)
     * @Assert\NotBlank(message="admin.company.email.not_blank")
     * @Assert\Regex(
     *   pattern="/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/",
     *   match=true,
     *   message="admin.company.valid.invalid_email"
     * )
     */
    private $email;

    /**
     * @var string
     * @ORM\Column(name="company_logo", type="string", length=255, options={"collate"="utf8_unicode_ci"},nullable=true , nullable=true)
     */
    private $companyLogo;
    
    /**
     * @var string
     * @ORM\Column(name="company_logo_url", type="string", length=255, options={"collate"="utf8_unicode_ci"},nullable=true , nullable=true)
     */
    private $companyLogoUrl;

    /**
     * @var string
     * @ORM\Column(name="street1", type="string", length=255, options={"collate"="utf8_unicode_ci"} , nullable=true)
     * @Assert\NotBlank(message="admin.company.address.not_blank")
     */
    private $street1;

    /**
     * @var string
     * @ORM\Column(name="street2", type="string", length=255, options={"collate"="utf8_unicode_ci"},nullable=true)
     */
    private $street2;

    /**
     * @var integer
     *
     * @ORM\Column(name="country_id", type="bigint" ,length=20 ,options={"unsigned"=true} , nullable=true)
     * @Assert\NotBlank(message="admin.company.country.not_blank")
     */
    private $countryId;

    /**
     * @var integer
     * @ORM\Column(name="state_id", type="bigint" ,length=20 ,options={"unsigned"=true} , nullable=true)
     * @Assert\NotBlank(message="admin.company.state.not_blank")
     */
    private $stateId;

    /**
     * @var integer
     * @ORM\Column(name="city_id", type="bigint" ,length=20 ,options={"unsigned"=true} , nullable=true)
     * @Assert\NotBlank(message="admin.company.city.not_blank")
     */
    private $cityId;

    /**
     * @var string
     *
     * @ORM\Column(name="zipcode", type="string", length=50, options={"collate"="utf8_unicode_ci"} , nullable=true)
     * @Assert\NotBlank(message="admin.company.zipcode.not_blank")
     */
    private $zipcode;

    /**
     * @var string
     * @ORM\Column(name="extension", type="string", length=50, options={"collate"="utf8_unicode_ci"},nullable=true)
     */
    private $extension;

    /**
     * @var string
     * @ORM\Column(name="phone", type="string", length=50, options={"collate"="utf8_unicode_ci"},nullable=true)
     */
    private $phone;

    /**
     * @var string
     * @ORM\Column(name="mobile", type="string", length=50, options={"collate"="utf8_unicode_ci"},nullable=true)
     */
    private $mobile;

    /**
     * @var string
     * @ORM\Column(name="fax", type="string", length=255, options={"collate"="utf8_unicode_ci"},nullable=true)
     */
    private $fax;

    /**
     * @var string
     * @ORM\Column(name="website", type="string", length=255, options={"collate"="utf8_unicode_ci"},nullable=true)
     * @Assert\Regex(pattern="/^(https?:\/\/|http?:\/\/|HTTPS?:\/\/|HTTP?:\/\/)?([\da-zA-Z\.-]+)\.([a-zA-Z\.]{2,6})([\/\w \.-]*)*\/?$/",   match=true,   message="admin.company.valid.invalid_website" )
     */
    private $website;

    /**
     * @var integer
     * @ORM\Column(name="erp_id", type="bigint" ,length=20 ,options={"unsigned"=true} , nullable=true)
     */
    private $erpId;

    /**
     * @var datetime
     *
     * @Gedmo\Timestampable()
     * @ORM\Column(name="created_at",type="datetime",nullable=true)
     */
    protected $createdAt;

    /**
     * @var datetime
     *
     * @Gedmo\Timestampable()
     * @ORM\Column( name="updated_at", type="datetime",nullable=true)
     */
    protected $updatedAt;


    /**
     * @var datetime
     *
     * @ORM\Column(name="deleted_at",type="datetime",  nullable=true)
     */
    protected $deletedAt;

    /**
     * @var integer
     * @ORM\Column(name="created_uid", type="bigint" ,length=20 ,options={"unsigned"=true},nullable=true)
     */
    private $createdUid;

    /**
     * @var integer
     * @ORM\Column(name="updated_uid", type="bigint" ,length=20 ,options={"unsigned"=true},nullable=true)
     */
    private $updatedUid;

    /**
     * @var integer
     * @ORM\Column(name="deleted_uid", type="bigint" ,length=20 ,options={"unsigned"=true},nullable=true)
     */
    private $deletedUid;


    /**
     * @Exclude
     * @ORM\OneToMany(targetEntity="\OfficeBrain\Bundle\UserBundle\Entity\User", mappedBy="userCompany")
     * @ORM\JoinColumn(nullable=false)
     */
    protected $companyUser;

    /**
     * @Exclude
     * @ORM\OneToMany(targetEntity="\OfficeBrain\Bundle\CompanyBundle\Entity\Company", mappedBy="parent")
     * @ORM\JoinColumn(nullable=false)
     */
    protected $child;
    
    /**
     * @var integer
     * @ORM\Column(name="status", type="boolean",options={"default"=1},nullable=true)
     */
    protected $status;
    
    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }


    /**
     * Constructor
     */
    public function __construct()
    {
        $this->companyUser = new \Doctrine\Common\Collections\ArrayCollection();
        $this->child = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Set companyName
     *
     * @param string $companyName
     * @return Company
     */
    public function setCompanyName($companyName)
    {
        $this->companyName = $companyName;

        return $this;
    }

    /**
     * Get companyName
     *
     * @return string
     */
    public function getCompanyName()
    {
        return $this->companyName;
    }

    /**
     * Set companyAsiNumber
     *
     * @param string $companyAsiNumber
     * @return Company
     */
    public function setCompanyAsiNumber($companyAsiNumber)
    {
        $this->companyAsiNumber = $companyAsiNumber;

        return $this;
    }

    /**
     * Get companyAsiNumber
     *
     * @return string
     */
    public function getCompanyAsiNumber()
    {
        return $this->companyAsiNumber;
    }

    /**
     * Set companyNumber
     *
     * @param string $companyNumber
     * @return Company
     */
    public function setCompanyNumber($companyNumber)
    {
        $this->companyNumber = $companyNumber;

        return $this;
    }

    /**
     * Get companyNumber
     *
     * @return string
     */
    public function getCompanyNumber()
    {
        return $this->companyNumber;
    }

    /**
     * Set email
     *
     * @param string $email
     * @return Company
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

    /**
     * Get email
     *
     * @return string
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * Set companyLogo
     *
     * @param string $companyLogo
     * @return Company
     */
    public function setCompanyLogo($companyLogo)
    {
        $this->companyLogo = $companyLogo;

        return $this;
    }

    /**
     * Get companyLogo
     *
     * @return string
     */
    public function getCompanyLogo()
    {
        return $this->companyLogo;
    }

    /**
     * Set street1
     *
     * @param string $street1
     * @return Company
     */
    public function setStreet1($street1)
    {
        $this->street1 = $street1;

        return $this;
    }

    /**
     * Get street1
     *
     * @return string
     */
    public function getStreet1()
    {
        return $this->street1;
    }

    /**
     * Set street2
     *
     * @param string $street2
     * @return Company
     */
    public function setStreet2($street2)
    {
        $this->street2 = $street2;

        return $this;
    }

    /**
     * Get street2
     *
     * @return string
     */
    public function getStreet2()
    {
        return $this->street2;
    }

    /**
     * Set countryId
     *
     * @param integer $countryId
     * @return Company
     */
    public function setCountryId($countryId)
    {
        $this->countryId = $countryId;

        return $this;
    }

    /**
     * Get countryId
     *
     * @return integer
     */
    public function getCountryId()
    {
        return $this->countryId;
    }

    /**
     * Set stateId
     *
     * @param integer $stateId
     * @return Company
     */
    public function setStateId($stateId)
    {
        $this->stateId = $stateId;

        return $this;
    }

    /**
     * Get stateId
     *
     * @return integer
     */
    public function getStateId()
    {
        return $this->stateId;
    }

    /**
     * Set cityId
     *
     * @param integer $cityId
     * @return Company
     */
    public function setCityId($cityId)
    {
        $this->cityId = $cityId;

        return $this;
    }

    /**
     * Get cityId
     *
     * @return integer
     */
    public function getCityId()
    {
        return $this->cityId;
    }

    /**
     * Set zipcode
     *
     * @param string $zipcode
     * @return Company
     */
    public function setZipcode($zipcode)
    {
        $this->zipcode = $zipcode;

        return $this;
    }

    /**
     * Get zipcode
     *
     * @return string
     */
    public function getZipcode()
    {
        return $this->zipcode;
    }

    /**
     * Set extension
     *
     * @param string $extension
     * @return Company
     */
    public function setExtension($extension)
    {
        $this->extension = $extension;

        return $this;
    }

    /**
     * Get extension
     *
     * @return string
     */
    public function getExtension()
    {
        return $this->extension;
    }

    /**
     * Set phone
     *
     * @param string $phone
     * @return Company
     */
    public function setPhone($phone)
    {
        $this->phone = $phone;

        return $this;
    }

    /**
     * Get phone
     *
     * @return string
     */
    public function getPhone()
    {
        return $this->phone;
    }

    /**
     * Set mobile
     *
     * @param string $mobile
     * @return Company
     */
    public function setMobile($mobile)
    {
        $this->mobile = $mobile;

        return $this;
    }

    /**
     * Get mobile
     *
     * @return string
     */
    public function getMobile()
    {
        return $this->mobile;
    }

    /**
     * Set fax
     *
     * @param string $fax
     * @return Company
     */
    public function setFax($fax)
    {
        $this->fax = $fax;

        return $this;
    }

    /**
     * Get fax
     *
     * @return string
     */
    public function getFax()
    {
        return $this->fax;
    }

    /**
     * Set website
     *
     * @param string $website
     * @return Company
     */
    public function setWebsite($website)
    {
        $this->website = $website;

        return $this;
    }

    /**
     * Get website
     *
     * @return string
     */
    public function getWebsite()
    {
        return $this->website;
    }

    /**
     * Set erpId
     *
     * @param integer $erpId
     * @return Company
     */
    public function setErpId($erpId)
    {
        $this->erpId = $erpId;

        return $this;
    }

    /**
     * Get erpId
     *
     * @return integer
     */
    public function getErpId()
    {
        return $this->erpId;
    }

    /**
     * Set createdAt
     *
     * @param \DateTime $createdAt
     * @return Company
     */
    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;

        return $this;
    }

    /**
     * Get createdAt
     *
     * @return \DateTime
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * Set updatedAt
     *
     * @param \DateTime $updatedAt
     * @return Company
     */
    public function setUpdatedAt($updatedAt)
    {
        $this->updatedAt = $updatedAt;

        return $this;
    }

    /**
     * Get updatedAt
     *
     * @return \DateTime
     */
    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    /**
     * Set deletedAt
     *
     * @param \DateTime $deletedAt
     * @return Company
     */
    public function setDeletedAt($deletedAt)
    {
        $this->deletedAt = $deletedAt;

        return $this;
    }

    /**
     * Get deletedAt
     *
     * @return \DateTime
     */
    public function getDeletedAt()
    {
        return $this->deletedAt;
    }

    /**
     * Set createdUid
     *
     * @param integer $createdUid
     * @return Company
     */
    public function setCreatedUid($createdUid)
    {
        $this->createdUid = $createdUid;

        return $this;
    }

    /**
     * Get createdUid
     *
     * @return integer
     */
    public function getCreatedUid()
    {
        return $this->createdUid;
    }

    /**
     * Set updatedUid
     *
     * @param integer $updatedUid
     * @return Company
     */
    public function setUpdatedUid($updatedUid)
    {
        $this->updatedUid = $updatedUid;

        return $this;
    }

    /**
     * Get updatedUid
     *
     * @return integer
     */
    public function getUpdatedUid()
    {
        return $this->updatedUid;
    }

    /**
     * Set deletedUid
     *
     * @param integer $deletedUid
     * @return Company
     */
    public function setDeletedUid($deletedUid)
    {
        $this->deletedUid = $deletedUid;

        return $this;
    }

    /**
     * Get deletedUid
     *
     * @return integer
     */
    public function getDeletedUid()
    {
        return $this->deletedUid;
    }

    /**
     * Set userc
     *
     * @param \OfficeBrain\Bundle\UserBundle\Entity\User $userc
     * @return Company
     */
    public function setUserc(\OfficeBrain\Bundle\UserBundle\Entity\User $userc)
    {
        $this->userc = $userc;

        return $this;
    }

    /**
     * Get userc
     *
     * @return \OfficeBrain\Bundle\UserBundle\Entity\User
     */
    public function getUserc()
    {
        return $this->userc;
    }

    /**
     * Add companyUser
     *
     * @param \OfficeBrain\Bundle\UserBundle\Entity\User $companyUser
     * @return Company
     */
    public function addCompanyUser($companyUser)
    {
        $this->companyUser[] = $companyUser;

        return $this;
    }

    /**
     * Remove companyUser
     *
     * @param \OfficeBrain\Bundle\UserBundle\Entity\User $companyUser
     */
    public function removeCompanyUser($companyUser)
    {
        $this->companyUser->removeElement($companyUser);
    }

    /**
     * Get companyUser
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getCompanyUser()
    {
        return $this->companyUser;
    }

    /**
     * Add child
     *
     * @param \OfficeBrain\Bundle\CompanyBundle\Entity\Company $child
     * @return Company
     */
    public function addChild($child)
    {
        $this->child[] = $child;

        return $this;
    }

    /**
     * Remove child
     *
     * @param \OfficeBrain\Bundle\CompanyBundle\Entity\Company $child
     */
    public function removeChild($child)
    {
        $this->child->removeElement($child);
    }

    /**
     * Get child
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getChild()
    {
        return $this->child;
    }
    public function getStatus()
    {
        return $this->status;
    }
    public function setStatus($status)
    {
        $this->status = $status;
        return $this;
    }

    /**
     * Set companyLogoUrl
     *
     * @param string $companyLogoUrl
     * @return Company
     */
    public function setCompanyLogoUrl($companyLogoUrl)
    {
        $this->companyLogoUrl = $companyLogoUrl;

        return $this;
    }

    /**
     * Get companyLogoUrl
     *
     * @return string 
     */
    public function getCompanyLogoUrl()
    {
        return $this->companyLogoUrl;
    }

    /**
     * Set parent
     *
     * @param \OfficeBrain\Bundle\CompanyBundle\Entity\Company $parent
     * @return Company
     */
    public function setParent(\OfficeBrain\Bundle\CompanyBundle\Entity\Company $parent = null)
    {
        $this->parent = $parent;

        return $this;
    }

    /**
     * Get parent
     *
     * @return \OfficeBrain\Bundle\CompanyBundle\Entity\Company 
     */
    public function getParent()
    {
        return $this->parent;
    }
}
