<?php
namespace App\Entity\Offer;
use App\Entity\Application;
use App\Entity\Item\Item;
use App\Entity\Order\Orders;
use App\Entity\Package\Package;
use App\Entity\SharedOffer;
use App\Entity\Traits\IdTrait;
use App\Entity\Traits\TimeStampAbleTrait;
use App\Entity\User\User;
use App\Utils\Slug\Slug;
use App\Utils\UniqShortUuid\shortUuid;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\EntityManagerInterface;
use Ramsey\Uuid\Uuid;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Repository\Offer\OfferRepository;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=OfferRepository::class)
* @ORM\HasLifecycleCallbacks
*/
class Offer
{
use IdTrait;
use TimeStampAbleTrait;
public const STATUS_GREEN = 'text-success';
public const STATUS_RED = 'text-alert';
const ZERO = 0;
const ONE = 1;
const TWO = 2;
const THREE = 3;
const FOUR = 4;
const FIVE = 5;
const SIX = 6;
const SEVEN = 7;
/**
* @ORM\OneToMany(targetEntity=OfferItem::class, mappedBy="offer")
*/
private $offerItems;
/**
* @ORM\OneToOne(targetEntity=OfferCompany::class)
*/
private ?OfferCompany $offerCompany = null;
/**
* @ORM\Column(type="json", nullable="true")
*/
private ?array $searchParams = [];
/**
* @ORM\Column(type="string", length="255", nullable="true")
*/
private ?string $offerNamePL = '';
/**
* @ORM\Column(type="string", length="255", nullable="true")
*/
private ?string $offerNameEN = '';
/**
* @ORM\Column(type="string", length="255", nullable="true")
*/
private ?string $offerLevelPL = '';
/**
* @ORM\Column(type="string", length="255", nullable="true")
*/
private ?string $offerLevelEN = '';
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private ?DateTime $publishedAt;
/**
* @ORM\Column(type="datetime", nullable=true, options={"default" : null})
*/
private ?DateTime $boostDate;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private ?DateTime $activeUntil;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private ?DateTime $updateInsteps;
/**
* @ORM\OneToMany(targetEntity=Application::class, mappedBy="offer")
* @ORM\JoinColumn(nullable=true)
*/
private $application;
/**
* @ORM\OneToMany(targetEntity=OfferLinkList::class, mappedBy="offer")
*/
private $offerLinkList;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $shortOfferCode;
/**
* @ORM\OneToMany(targetEntity=SharedOffer::class, mappedBy="offer")
*/
private $sharedOffers;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $creator;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $language;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $numberOfInsteps;
/**
* @ORM\ManyToOne(targetEntity=Package::class)
*/
private ?Package $package;
/**
* @ORM\ManyToOne(targetEntity=Offer::class, inversedBy="offers")
*/
private ?Offer $offer;
/**
* @ORM\OneToMany(targetEntity=Offer::class, mappedBy="offer", cascade={"persist","remove","refresh"})
*/
private $offers;
/**
* @ORM\ManyToOne(targetEntity=Orders::class)
*/
private ?Orders $order;
/**
* @ORM\Column(type="text", nullable=true)
*/
private ?string $keywords;
/**
* @ORM\Column(type="boolean")
*/
private bool $visible;
public function __construct(
/**
* @ORM\Column(type="string", length="255", nullable="true")
*/
private ?string $temporaryId,
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private ?bool $done,
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private ?bool $active,
/**
* @ORM\Column(type="string", length="255", nullable="true")
*/
private ?string $step,
/**
* @ORM\Column(type="string", length="255", nullable="true")
*/
private ?string $email,
/**
* @ORM\Column(type="string", length="255", nullable="true")
*/
private ?string $categoryId,
/**
* @ORM\ManyToOne(targetEntity=User::class)
*/
private ?User $user,
/**
* @ORM\Column(type="integer", nullable="true")
*/
private ?int $numberOfApplication,
/**
* @ORM\Column(type="string", length="255", nullable="true")
*/
private ?string $accessKey,
/**
* @ORM\Column(type="json", nullable="true")
*/
private ?array $salaryData,
/**
* @ORM\Column(type="json", nullable="true")
*/
private ?array $workData,
){
$this->offerItems = new ArrayCollection();
$this->application = new ArrayCollection();
$this->offerLinkList = new ArrayCollection();
$this->sharedOffers = new ArrayCollection();
$this->offer_search = new ArrayCollection();
$this->visible = true;
}
public function __clone()
{
$this->id = null;
$this->offerCompany = null;
$this->temporaryId = null;
$this->numberOfApplication = null;
$this->shortOfferCode = null;
$this->done = null;
$this->active = false;
}
public function cloneObject(?OfferCompany $offerCompany): self
{
$clone = clone $this;
$clone->offerCompany = $offerCompany;
$clone->temporaryId = Uuid::uuid4()->toString();
$clone->numberOfApplication = 0;
$clone->shortOfferCode = shortUuid::shortUuid();
$clone->done = false;
$clone->active = false;
return $clone;
}
public function cloneChild(
?OfferCompany $offerCompany,
int $key,
?Offer $mainOffer,
): self
{
$clone = clone $this;
$clone->offerCompany = $offerCompany;
$clone->temporaryId = Uuid::uuid4()->toString();
$clone->numberOfApplication = 0;
$clone->shortOfferCode = shortUuid::shortUuid();
$clone->publishedAt = new DateTime();
$clone->done = $mainOffer ? $mainOffer->getDone() : false;
$clone->active = $mainOffer ? $mainOffer->getActive() : false;
$clone->childData = [];
$offerWorkData = $clone->getWorkData();
$offerSearchParams = $clone->getSearchParams();
$this->createWorkDataWithKey($offerWorkData, $key);
$this->createSearchParamsWithKey($offerWorkData, $offerSearchParams, $key);
$clone->setWorkData($offerWorkData);
$clone->setSearchParams($offerSearchParams);
if(is_null($mainOffer) === false){
$clone->setOffer($mainOffer);
}
return $clone;
}
public function addOfferItemsToOffer(Offer $offer, array $offerItems): void
{
foreach($offerItems as $offerItem){
$offer->addItem($offerItem);
}
}
/**
* @return DateTime|null
*/
public function getBoostDate(): ?DateTime
{
return $this->boostDate;
}
/**
* @param DateTime|null $boostDate
*/
public function setBoostDate(?DateTime $boostDate): void
{
$this->boostDate = $boostDate;
}
/**
* @return string|null
*/
public function getEmail(): ?string
{
return $this->email;
}
/**
* @param string|null $email
*/
public function setEmail(?string $email): void
{
$this->email = $email;
}
/**
* @return OfferCompany|null
*/
public function getOfferCompany(): ?OfferCompany
{
return $this->offerCompany;
}
/**
* @param OfferCompany|null $offerCompany
*/
public function setOfferCompany(?OfferCompany $offerCompany): void
{
$this->offerCompany = $offerCompany;
}
/**
* @return Collection
*/
public function getOfferItems(): Collection
{
return $this->offerItems;
}
public function addItem(OfferItem $offerItem): self
{
if(!$this->offerItems->contains($offerItem)){
$this->offerItems[] = $offerItem;
$offerItem->setOffer($this);
}
return $this;
}
public function removeItem(OfferItem $offerItem): self
{
if ($this->offerItems->removeElement($offerItem)) {
// set the owning side to null (unless already changed)
if ($offerItem->getOffer() === $this) {
$offerItem->setOffer(null);
}
}
return $this;
}
/**
* @return array|null
*/
public function getSalaryData(): ?array
{
return $this->salaryData;
}
/**
* @param array|null $salaryData
*/
public function setSalaryData(?array $salaryData): self
{
$this->salaryData = $salaryData;
return $this;
}
/**
* @return array|null
*/
public function getWorkData(): ?array
{
return $this->workData;
}
/**
* @param array|null $workData
*/
public function setWorkData(?array $workData): self
{
$this->workData = $workData;
return $this;
}
public function getOffer(): ?Offer
{
return $this->offer;
}
public function setOffer(?Offer $offer): self
{
$this->offer = $offer;
return $this;
}
public function getOffers()
{
return $this->offers;
}
public function addOffers(Offer $offer): self
{
if (!$this->offers->contains($offer)) {
$this->offers[] = $offer;
$offer->setOffer($this);
}
return $this;
}
public function removeOffers(Offer $offer): self
{
if ($this->offers->removeElement($offer)) {
if ($offer->getOffer() === $this) {
$offer->setOffer(null);
}
}
return $this;
}
public function changeChildOffersActive(bool $active): void
{
foreach ($this->getOffers() as $offer) {
$offer->setActive($active);
}
}
public function changeChildOffersPublishedAt(DateTime $publishedAt): void
{
if (false === $this->isMainOffer()) {
return;
}
foreach ($this->getOffers() as $offer) {
$offer->setPublishedAt($publishedAt);
}
}
/**
* @return array|null
*/
public function getSearchParams(): ?array
{
return $this->searchParams;
}
/**
* @param array|null $workData
*/
public function setSearchParams(?array $searchParams): self
{
$this->searchParams = $searchParams;
return $this;
}
/**
* @return string|null
*/
public function getTemporaryId(): ?string
{
return $this->temporaryId;
}
/**
* @param string|null $temporaryId
*/
public function setTemporaryId(?string $temporaryId): self
{
$this->temporaryId = $temporaryId;
return $this;
}
/**
* @return bool|null
*/
public function getDone(): ?bool
{
return $this->done;
}
/**
* @param bool|null $done
*/
public function setDone(?bool $done): self
{
$this->done = $done;
return $this;
}
/**
* @return bool|null
*/
public function getActive(): ?bool
{
return $this->active;
}
/**
* @param bool|null $active
*/
public function setActive(?bool $active): self
{
$this->active = $active;
return $this;
}
/**
* @return string|null
*/
public function getStep(): ?string
{
return $this->step;
}
/**
* @param string|null $step
*/
public function setStep(?string $step): self
{
$this->step = $step;
return $this;
}
/**
* @return string|null
*/
public function getCategoryId(): ?string
{
return $this->categoryId;
}
/**
* @param string|null $categoryId
*/
public function setCategoryId(?string $categoryId): self
{
$this->categoryId = $categoryId;
return $this;
}
/**
* @return string|null
*/
public function getOfferNamePL(): ?string
{
return $this->offerNamePL;
}
/**
* @param string|null $offerNamePL
*/
public function setOfferNamePL(?string $offerNamePL): self
{
$this->offerNamePL = $offerNamePL;
return $this;
}
/**
* @return string|null
*/
public function getOfferNameEN(): ?string
{
return $this->offerNameEN;
}
/**
* @param string|null $offerNameEN
*/
public function setOfferNameEN(?string $offerNameEN): self
{
$this->offerNameEN = $offerNameEN;
return $this;
}
/**
* @return int|null
*/
public function getNumberOfApplication(): ?int
{
return $this->numberOfApplication;
}
/**
* @param int|null $numberOfApplication
*/
public function setNumberOfApplication(?int $numberOfApplication): self
{
$this->numberOfApplication = $numberOfApplication;
return $this;
}
public function getCreatedAtAsString(): ?string
{
return $this->createdAt->format('d.m.Y');
}
public function getActiveUntil(): ?DateTime
{
return $this->activeUntil;
}
public function setActiveUntil(?DateTime $activeUntil): self
{
$this->activeUntil = $activeUntil;
return $this;
}
public function getPublishedAtAsString(): ?string
{
if(is_null($this->publishedAt)){ return null; }
return $this->publishedAt->format('d.m.Y');
}
public function getOfferCompanyName(): ?string
{
$companyData = $this->getOfferCompany();
if(is_null($companyData)) { return null; }
$invoiceData = $companyData->getInvoiceData();
if(is_null($invoiceData)){ return null; }
return $invoiceData->getName();
}
public function getCityNameFromWorkData(): ?string
{
$response = '';
$workData = $this->getWorkData();
if(is_null($workData)){ return null; }
if(false === isset($workData['address'])){ return null; }
if(false === isset($workData['address']['city'])){ return null; };
if(is_array($workData['address']['city'])){
$lastKey = count($workData['address']['city']);
foreach ($workData['address']['city'] as $key => $city){
if($lastKey !== $key + 1){
$response .= $city.', ';
}else{
$response .= $city;
}
}
return $response;
}else{
return $workData['address']['city'];
}
}
public function resetSalaryData(string $categoryType): void{
$this->setSalaryData(null);
}
public function resetWorkData(string $categoryType): void{
$this->setWorkData(null);
}
public function setOfferNameFromItem(Item $item): void{
$this
->setOfferNamePL($item->getName())
->setOfferNameEN($item->getNameEn());
}
public function setOfferNameFromNull(): void{
$this
->setOfferNamePL(null)
->setOfferNameEN(null);
}
public function setOfferLevelFromNull(): void{
$this
->setOfferLevelPL(null)
->setOfferLevelEN(null);
}
public function setOfferLevelFromItem(Item $item): void{
$this
->setOfferLevelPL($item->getName())
->setOfferLevelEN($item->getNameEn());
}
/**
* @return DateTime|null
*/
public function getPublishedAt(): ?DateTime
{
return $this->publishedAt;
}
/**
* @param DateTime|null $publishedAt
*/
public function setPublishedAt(?DateTime $publishedAt): self
{
$this->publishedAt = $publishedAt;
return $this;
}
/**
* @return DateTime|null
*/
public function getUpdateInsteps(): ?DateTime
{
return $this->updateInsteps;
}
/**
* @param DateTime|null $updateInsteps
*/
public function setUpdateInsteps(?DateTime $updateInsteps): self
{
$this->updateInsteps = $updateInsteps;
return $this;
}
/**
* @return User|null
*/
public function getUser(): ?User
{
return $this->user;
}
/**
* @param User|null $user
*/
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
/**
* @return string|null
*/
public function getOfferLevelPL(): ?string
{
return $this->offerLevelPL;
}
/**
* @param string|null $offerLevelPL
*/
public function setOfferLevelPL(?string $offerLevelPL): self
{
$this->offerLevelPL = $offerLevelPL;
return $this;
}
/**
* @return Collection|Application[]
*/
public function getApplication(): Collection
{
return $this->application;
}
public function addApplication(Application $application): self
{
if (!$this->application->contains($application)) {
$this->application[] = $application;
$application->setOffer($this);
}
return $this;
}
/**
* @return string|null
*/
public function getOfferLevelEN(): ?string
{
return $this->offerLevelEN;
}
/**
* @param string|null $offerLevelEN
*/
public function setOfferLevelEN(?string $offerLevelEN): self
{
$this->offerLevelEN = $offerLevelEN;
return $this;
}
/**
* @return string|null
*/
public function getAccessKey(): ?string
{
return $this->accessKey;
}
/**
* @param string|null $accessKey
*/
public function setAccessKey(?string $accessKey): self
{
$this->accessKey = $accessKey;
return $this;
}
public function removeApplication(Application $application): self
{
if ($this->application->removeElement($application)) {
// set the owning side to null (unless already changed)
if ($application->getOffer() === $this) {
$application->setOffer(null);
}
}
return $this;
}
/**
* @return Collection|OfferLinkList[]
*/
public function getOfferLinkList(): Collection
{
return $this->offerLinkList;
}
public function addOfferLinkList(OfferLinkList $offerLinkList): self
{
if (!$this->offerLinkList->contains($offerLinkList)) {
$this->offerLinkList[] = $offerLinkList;
$offerLinkList->setOffer($this);
}
return $this;
}
public function removeOfferLinkList(OfferLinkList $offerLinkList): self
{
if ($this->offerLinkList->removeElement($offerLinkList)) {
// set the owning side to null (unless already changed)
if ($offerLinkList->getOffer() === $this) {
$offerLinkList->setOffer(null);
}
}
return $this;
}
public function getShortOfferCode(): ?string
{
return $this->shortOfferCode;
}
public function setShortOfferCode(?string $shortOfferCode): self
{
$this->shortOfferCode = $shortOfferCode;
return $this;
}
/**
* @return string|null
*/
public function getChildCity(): ?string
{
return $this->childCity;
}
/**
* @param string|null $childCity
*/
public function setChildCity(?string $childCity): self
{
$this->childCity = $childCity;
return $this;
}
/**
* @return array|null
*/
public function getChildData(): ?array
{
return $this->childData;
}
/**
* @param array|null $childData
*/
public function setChildData(?array $childData): self
{
$this->childData = $childData;
return $this;
}
public function getWorkDataStringByLocale(string $locale, TranslatorInterface $translator): string
{
$workDataString = '';
$workData = $this->getWorkData();
if(is_null($workData)) {
return $workDataString;
}
if (isset($workData['address'])) {
unset($workData['address']);
}
if(isset($workData['additional_data'])){
foreach ($workData['additional_data'] as $workDataExtra) {
if(false === isset($workDataExtra['checked'])){ continue; }
if ($workDataExtra['checked']) {
$name = $workDataExtra[$locale] ?? null;
if(is_null($name)) {
continue;
}
$name = strtolower($name);
$name = Slug::slug($name);
$workDataString .= $name . '.';
}
}
unset($workData['additional_data']);
}
foreach ($workData as $workDataKey => $workDataElement) {
if(false === isset($workDataElement['checked'])){ continue; }
if ($workDataElement['checked']) {
$toTrans = $this->getTransTextFromWorkData($workDataKey);
$name = $translator->trans($toTrans, [], null, $locale);
$name = strtolower($name);
$name = Slug::slug($name);
$workDataString .= $name . '.';
}
}
return $workDataString;
}
public function getPackage(): ?Package
{
return $this->package;
}
public function setPackage(?Package $package): self
{
$this->package = $package;
return $this;
}
public function getOrder(): ?Orders
{
return $this->order;
}
public function setOrder(?Orders $order): self
{
$this->order = $order;
return $this;
}
public function getWorkDataPlString(TranslatorInterface $translator): string
{
return $this->getWorkDataStringByLocale('pl', $translator);
}
public function getWorkDataEnString(TranslatorInterface $translator): string
{
return $this->getWorkDataStringByLocale('en', $translator);
}
public function getSalaryStringByLocale(string $locale, TranslatorInterface $translator): string
{
$salaryString = '';
$salaryData = $this->getSalaryData();
if(is_null($salaryData)) {
return '';
}
foreach($salaryData as $salaryDataKey => $salaryDataElement){
$checked = $salaryDataElement['checked'] ?? false;
if(false === $checked) {
continue;
}
$currency = $salaryDataElement['currency'] ?? null;
$salaryString .= $currency . '.';
$toTrans = $this->getTransTextFromSalary($salaryDataKey);
$name = $translator->trans($toTrans, [], null, $locale);
$name = strtolower($name);
$name = Slug::slug($name);
$salaryString .= $name . '.';
}
return $salaryString;
}
public function getSalaryPlString(TranslatorInterface $translator): string
{
return $this->getSalaryStringByLocale('pl', $translator);
}
public function getSalaryEnString(TranslatorInterface $translator): string
{
return $this->getSalaryStringByLocale('en', $translator);
}
private function getTransTextFromWorkData(string $workDataElement): string
{
return match ($workDataElement) {
'part_time' => 'USER_ZONE.OFFER.WORK_DATA.TYPES_LOW_CASE.TYPE_1',
'remote_work' => 'USER_ZONE.OFFER.WORK_DATA.TYPES_LOW_CASE.TYPE_2',
'flex_work_hour' => 'USER_ZONE.OFFER.WORK_DATA.TYPES_LOW_CASE.TYPE_3',
'shift_work' => 'USER_ZONE.OFFER.WORK_DATA.TYPES_LOW_CASE.TYPE_4',
'delegation' => 'USER_ZONE.OFFER.WORK_DATA.TYPES_LOW_CASE.TYPE_5',
'recruitment_remote' => 'USER_ZONE.OFFER.WORK_DATA.TYPES_LOW_CASE.TYPE_6',
};
}
private function getTransTextFromSalary(int $salaryElement): string{
return match ($salaryElement){
0 => 'USER_ZONE.HOME_PAGE.SELECT_CONTRACT_DROPDOWN_FILTER_2',
1 => 'USER_ZONE.HOME_PAGE.SELECT_CONTRACT_DROPDOWN_FILTER_5',
2 => 'USER_ZONE.HOME_PAGE.SELECT_CONTRACT_DROPDOWN_FILTER_4',
3 => 'USER_ZONE.HOME_PAGE.SELECT_CONTRACT_DROPDOWN_FILTER_3',
4 => 'USER_ZONE.HOME_PAGE.SELECT_CONTRACT_DROPDOWN_FILTER_6',
};
}
public function getSalarySlug(string $locale, TranslatorInterface $translator, string $searchKey): string
{
$toTrans = $this->getTransTextFromSalary($searchKey);
$name = $translator->trans($toTrans, [], null, $locale);
$name = strtolower($name);
return Slug::slug($name);
}
public function getWorkDataForAnotherPoint(): array
{
$worksDataArray = [];
$worksData = $this->getWorkData();
if(is_null($worksData)){ return $worksDataArray; }
if (isset($worksData['address'])) { unset($worksData['address']); }
if(isset($worksData['additional_data'])){
foreach ($worksData['additional_data'] as $workDataExtra) {
if(false === isset($workDataExtra['checked'])){ continue; }
if ($workDataExtra['checked']) {
$plName = $workDataExtra['pl'] ?? null;
$enName = $workDataExtra['en'] ?? null;
$name = !is_null($plName) && !empty($plName) ? Slug::slug($plName) : Slug::slug($enName);
$worksDataArray[] = $name;
}
}
unset($worksData['additional_data']);
}
foreach ($worksData as $workDataKey => $workData) {
if(false === isset($workData['checked'])){ continue; }
if ($workData['checked']) {
$newWorkDataKey = $this->replaceUnderscoreToHyphen($workDataKey);
$worksDataArray[] = $newWorkDataKey;
}
}
return $worksDataArray;
}
public function getIndustryPLSlug(): ?string
{
$searchParams = $this->getIndustryFromSearchParams();
if(is_null($searchParams)){ return null; }
return $searchParams['pl']['name'] ?? null;
}
public function getIndustryENSlug(): ?string
{
$searchParams = $this->getIndustryFromSearchParams();
if(is_null($searchParams)){ return null; }
return $searchParams['en']['name'] ?? null;
}
public function getPointFromLevenshtein(array $search, string $industryPL, string $industryEN, int $levenshteinDivider): float
{
$points = 0.0;
foreach($search as $searchElement){
$industryPLPoint = levenshtein($searchElement, $industryPL);
$industryENPoint = levenshtein($searchElement, $industryEN);
$itemPoints = $this->getHighestValueFromTwo($industryPLPoint, $industryENPoint);
$points += (1/$itemPoints) * 100;
}
return $points/$levenshteinDivider;
}
private function getIndustryFromSearchParams(): ?array{
$industry = null;
$searchParams = $this->getSearchParams();
if(isset($searchParams['industry'])){ $industry = $searchParams['industry']; }
if(is_null($industry)){ return null; }
return $industry;
}
public function getItemsForTechnologyPoint(): array
{
$itemsFromOffer = [];
$offerItems = $this->getOfferItems()->toArray();
foreach($offerItems as $offerItem){
$itemsFromOfferItems = $offerItem->getItems()->toArray();
foreach($itemsFromOfferItems as $item){
$itemsFromOffer[] = $item;
}
}
return $itemsFromOffer;
}
public function getLocationForLocationPoint(): string
{
$city = $this->getCityNameFromWorkData();
return Slug::slug($city);
}
public function getOfferNamePLSlug(): string
{
return Slug::slug($this->getOfferNamePL());
}
public function getOfferNameENSlug(): string
{
return Slug::slug($this->getOfferNameEN());
}
public function getSalaryForSalaryPoint(int $hourInMonth): array
{
$salary = [];
$salaryData = $this->getSalaryData();
if(is_null($salaryData)){ return []; }
foreach($salaryData as $salaryDataKey => $salaryDataElement){
$checked = $salaryDataElement['checked'] ?? false;
if(false === $checked){ continue; }
$period = $salaryDataElement['period'] ?? null;
$from = $salaryDataElement['from'] ?? null;
$to = $salaryDataElement['to'] ?? null;
$currency = $salaryDataElement['currency'] ?? null;
$type = $this->getType($salaryDataKey);
$fromWithPeriod = $this->getFromForSalaryTypePoint($period, $from, $hourInMonth);
$toWithPeriod = $this->getToForSalaryTypePoint($period, $to, $hourInMonth);
$salary[] = ['currency' => $currency, 'type' => $type, 'from' => $fromWithPeriod, 'to' => $toWithPeriod];
}
return $salary;
}
public function getSearchParamsForSearchPoint(): array
{
$data = [];
$searchParams = $this->getSearchParams();
foreach($searchParams as $searchParamsKey => $searchParamsElement){
if(is_array($searchParamsElement)){
if($searchParamsKey === 'items'){
$en = $searchParamsElement['en'] ?? '';
$pl = $searchParamsElement['pl'] ?? '';
$itemsDataEn = explode('.', $en);
$itemsDataPl = explode('.', $pl);
foreach ($itemsDataEn as $itemEn){
if($itemEn !== '') {
$itemEn = str_replace('-', ' ', $itemEn);
$data[] = strtolower($itemEn);
}
}
foreach ($itemsDataPl as $itemPl){
if($itemPl !== ''){
$itemPl = str_replace('-', ' ', $itemPl);
$data[] = strtolower($itemPl);
}
}
}
if($searchParamsKey === 'company'){
$companyName = $searchParamsElement['name'] ?? null;
if(false === is_null($companyName)){
$companyName = str_replace(['Ą', 'Ć', 'Ę', 'Ł', 'Ń', 'Ó', 'Ś', 'Ź', 'Ż'], ['ą', 'ć', 'ę', 'ł', 'ń', 'ó', 'ś', 'ź', 'ż'], $companyName);
$data[] = strtolower($companyName);
}
}
if($searchParamsKey === 'industry'){
$industryEn = $searchParamsElement['en']['name'] ?? null;
$industryPl = $searchParamsElement['pl']['name'] ?? null;
if(false === is_null($industryEn)){
$industryEn = str_replace('-', ' ', $industryEn);
$data[] = strtolower($industryEn);
}
if(false === is_null($industryPl)){
$industryPl = str_replace('-', ' ', $industryPl);
$data[] = strtolower($industryPl);
}
}
if($searchParamsKey === 'workData') {
$en = $searchParamsElement['en'] ?? '';
$pl = $searchParamsElement['pl'] ?? '';
$itemsDataEn = explode('.', $en);
$itemsDataPl = explode('.', $pl);
foreach ($itemsDataEn as $itemEn){
if($itemEn !== '') {
$itemEn = str_replace('-', ' ', $itemEn);
$data[] = strtolower($itemEn);
}
}
foreach ($itemsDataPl as $itemPl){
if($itemPl !== ''){
$itemPl = str_replace('-', ' ', $itemPl);
$data[] = strtolower($itemPl);
}
}
}
if($searchParamsKey === 'salary') {
$en = $searchParamsElement['en'] ?? '';
$pl = $searchParamsElement['pl'] ?? '';
$itemsDataEn = explode('.', $en);
$itemsDataPl = explode('.', $pl);
foreach ($itemsDataEn as $itemEn){
if($itemEn !== '') {
$itemEn = str_replace('-', ' ', $itemEn);
$data[] = strtolower($itemEn);
}
}
foreach ($itemsDataPl as $itemPl){
if($itemPl !== ''){
$itemPl = str_replace('-', ' ', $itemPl);
$data[] = strtolower($itemPl);
}
}
}
continue;
}
$data[] = strtolower($searchParamsElement);
}
$data = array_unique($data);
return $data;
}
private function getType(int $type): string{
return match ($type){
0 => 'umowa_o_prace',
1 => 'b2b',
2 => 'umowa_zlecenie',
3 => 'umowa_o_dzielo',
4 => 'staz_praktyka',
};
}
private function getFromForSalaryTypePoint(?string $period, ?string $from, int $hourInMonth): float{
$correctPeriod = $this->getCorrectPeriod($period, $hourInMonth);
return ($correctPeriod * intval($from));
}
private function getToForSalaryTypePoint(?string $period, ?string $to, int $hourInMonth): float{
$correctPeriod = $this->getCorrectPeriod($period, $hourInMonth);
return ($correctPeriod * intval($to));
}
private function getCorrectPeriod(?string $period, int $hourInMonth): float{
$period = intval($period);
return match ($period) {
0 => 1,
1 => $hourInMonth,
2 => (1 / 12),
default => 1
};
}
private function replaceUnderscoreToHyphen(string $word): string
{
$word = strtolower($word);
return str_replace('_', '-', $word);
}
private function getHighestValueFromTwo(?int $first, ?int $second): int{
if(is_null($first)) { $first = 0; }
if(is_null($second)){ $second = 0; }
return max($first, $second);
}
/**
* @return Collection<int, SharedOffer>
*/
public function getSharedOffers(): Collection
{
return $this->sharedOffers;
}
public function addSharedOffer(SharedOffer $sharedOffer): self
{
if (!$this->sharedOffers->contains($sharedOffer)) {
$this->sharedOffers[] = $sharedOffer;
$sharedOffer->setOfferId($this);
}
return $this;
}
public function removeSharedOffer(SharedOffer $sharedOffer): self
{
if ($this->sharedOffers->removeElement($sharedOffer)) {
// set the owning side to null (unless already changed)
if ($sharedOffer->getOfferId() === $this) {
$sharedOffer->setOfferId(null);
}
}
return $this;
}
public function getCreator(): ?string
{
return $this->creator;
}
public function setCreator(?string $creator): self
{
$this->creator = $creator;
return $this;
}
public function getLanguage(): ?string
{
return $this->language;
}
public function setLanguage(?string $language): self
{
$this->language = $language;
return $this;
}
public function getNumberOfInsteps()
{
return $this->numberOfInsteps;
}
public function setNumberOfInsteps($numberOfInsteps): self
{
$this->numberOfInsteps = $numberOfInsteps;
return $this;
}
public function getChildLocations(): array
{
$response = [];
foreach ($this->getOffers() as $childOffer){
if(is_null($childOffer->getWorkData()['address']['city'] ?? null) === false) {
if (is_array($childOffer->getWorkData()['address']['city']) === false) {
$response[] = $childOffer->getWorkData()['address']['city'] ?? '';
}
}
}
return array_unique($response);
}
public function isMainOffer(): bool
{
return false === $this->getOffers()->isEmpty();
}
public function createManyChildOffer(EntityManagerInterface $entityManager, Offer $cloneOffer = null): array
{
$cities = $this->getWorkData()['address']['city'] ?? [];
$offerCreateLength = count($cities);
$childOffers = [];
if ($offerCreateLength > 1) {
foreach ($cities as $key => $city) {
$childOffer = $this->cloneChild(
null,
$key,
$cloneOffer
);
$childOffers[] = $childOffer;
if (is_null($cloneOffer)) {
$this->addOffers($childOffer);
} else {
$cloneOffer->addOffers($childOffer);
}
$entityManager->persist($childOffer);
$entityManager->persist($this);
$entityManager->flush();
}
}
return $childOffers;
}
public function createLocationAndGetOffer(): array
{
$response = [];
$workData = $this->getWorkData();
if(is_null($workData)){ return []; }
if(false === isset($workData['address'])){ return []; }
if(false === isset($workData['address']['city'])){ return []; };
if(is_array($workData['address']['city'])){
$lastKey = count($workData['address']['city']);
foreach ($workData['address']['city'] as $key => $city){
if($lastKey !== $key + 1){
$response[] = [
'name'=> $city.', ',
'offer' => $this->getOfferByCityName($city),
];
}else{
$response[] = [
'name'=> $city,
'offer' => $this->getOfferByCityName($city),
];
}
}
return $response;
}else{
$city = $workData['address']['city'];
$response[] = [
'name'=> $city,
'offer' => $this->getOfferByCityName($city),
];
return $response;
}
}
public function getOfferByCityName(string $cityName): ?Offer
{
foreach ($this->getOffers() ?? [] as $childOffer){
if(is_array($childOffer->getWorkData()['address']['city'] ?? []) === false){
if($childOffer->getWorkData()['address']['city'] === $cityName){
return $childOffer;
}
}
}
return null;
}
public function createChildOffer(EntityManagerInterface $entityManager , int $key): Offer
{
$childOffer = $this->cloneChild(
null,
$key,
$this
);
$this->addOffers($childOffer);
$entityManager->persist($childOffer);
$entityManager->persist($this);
$entityManager->flush();
return $childOffer;
}
private function createSearchParamsWithKey(?array &$offerWorkData, array &$searchParams, int $key): void
{
if(is_null($offerWorkData)){
return;
}
if(is_array($offerWorkData['address']['city'])){
$searchParams['city'] = Slug::slug($offerWorkData['address']['city'][$key] ?? '');
}else{
$searchParams['city'] = Slug::slug($offerWorkData['address']['city'] ?? '');
}
if(is_array($offerWorkData['address']['country'])){
$searchParams['country'] = Slug::slug($offerWorkData['address']['country'][$key] ?? '');
}else{
$searchParams['country'] = Slug::slug($offerWorkData['address']['country'] ?? '');
}
}
private function createWorkDataWithKey(?array &$offerWorkData, int $key): void
{
if(is_null($offerWorkData)){
return;
}
if(is_array($offerWorkData['address']['country'])){
$offerWorkData['address']['country'] = $offerWorkData['address']['country'][$key] ?? '';
}
if(is_array($offerWorkData['address']['pl_name'])){
$offerWorkData['address']['pl_name'] = $offerWorkData['address']['pl_name'][$key] ?? '';
}
if(is_array($offerWorkData['address']['city'])){
$offerWorkData['address']['city'] = $offerWorkData['address']['city'][$key] ?? '';
}
if(is_array($offerWorkData['address']['street'])){
$offerWorkData['address']['street'] = $offerWorkData['address']['street'][$key] ?? '';
}
if(is_array($offerWorkData['address']['lat'])){
$offerWorkData['address']['lat'] = $offerWorkData['address']['lat'][$key] ?? '';
}
if(is_array($offerWorkData['address']['lnt'])){
$offerWorkData['address']['lnt'] = $offerWorkData['address']['lnt'][$key] ?? '';
}
}
public function editUserChildOffer(Offer $offer, ?User $user): void
{
if($offer->getOffers()){
foreach ($offer->getOffers() as $childOffer){
$childOffer->setUser($user);
}
}
}
public function editOrderChildOffer(Offer $offer, ?Orders $order): void
{
if($offer->getOffers()){
foreach ($offer->getOffers() as $childOffer){
$childOffer->setOrder($order);
}
}
}
public function getStatusColor(): string
{
if ($this->getActive()) {
return self::STATUS_GREEN;
}
return self::STATUS_RED;
}
public function updateOfferChildActiveAndDone(): void
{
if ($this->getOffers()) {
foreach ($this->getOffers() as $childOffer) {
$childOffer->setActive($this->getActive());
$childOffer->setDone($this->getDone());
}
}
}
public function setKeywordsChildOffer(): void
{
if ($this->getOffers()) {
foreach ($this->getOffers() as $childOffer) {
$childOffer->generateKeywords();
}
}
}
public function generateKeywords(): void
{
$keywords = '';
$searchParams = $this->getSearchParams();
if (empty($searchParams) || !isset($searchParams['items'])) {
return;
}
$anotherKeywords= '';
foreach ($searchParams['another'] ?? [] as $another) {
$anotherKeywords .= $another.'.';
}
$cityKeywords = $searchParams['city'];
if (is_array($cityKeywords)) {
$cityKeywords = '';
foreach ($searchParams['city'] as $city) {
$cityKeywords .= $city.'.';
}
} else {
$cityKeywords .= '.';
}
$countryKeywords = $searchParams['country'];
if (is_array($countryKeywords)) {
$countryKeywords = '';
foreach ($searchParams['country'] as $country) {
$countryKeywords .= $country.'.';
}
} else {
$countryKeywords .= '.';
}
$keywords .= $cityKeywords;
$keywords .= $anotherKeywords;
$keywords .= $countryKeywords;
$keywords .= $searchParams['industry']['en']['name'].'.';
$keywords .= ($searchParams['industry']['pl']['name'] ?? '').'.';
$keywords .= ($searchParams['workData']['en'] ?? '').'.';
$keywords .= ($searchParams['workData']['pl'] ?? '').'.';
$keywords .= ($searchParams['company']['slug'] ?? '').'.';
$keywords .= ($searchParams['salary']['en'] ?? '').'.';
$keywords .= ($searchParams['salary']['pl'] ?? '').'.';
$keywords .= ($searchParams['items']['en'] ?? '').'.';
$keywords .= ($searchParams['items']['pl'] ?? '');
$this->keywords = $keywords;
}
public function isVisible(): bool
{
return $this->visible;
}
public function setVisible(bool $visible): self
{
$this->visible = $visible;
return $this;
}
}