<?php
namespace App\BackendBundle\Helper;
use Doctrine\ORM\EntityManagerInterface;
use App\BackendBundle\Helper\GraphQlCommonHelper;
use App\BackendBundle\Helper\GraphQlCompanyHelper;
use App\BackendBundle\Helper\GraphQlJobHelper;
use App\BackendBundle\Model\GraphQL\JobMarket as JobMarketGQL;
use App\BackendBundle\Model\GraphQL\JobMarketAdditionalInfo as JobMarketAdditionalInfoGQL;
use App\Entity\JobMarket;
use App\Entity\JobMarketStartType;
class GraphQlJobMarketHelper {
private EntityManagerInterface $em;
private GraphQlCommonHelper $graphqlCommonHelper;
private GraphQlCompanyHelper $graphqlCompanyHelper;
private GraphQlJobHelper $graphqlJobHelper;
public function __construct(EntityManagerInterface $em, GraphQlCommonHelper $graphqlCommonHelper, GraphQlCompanyHelper $graphqlCompanyHelper,
GraphQlJobHelper $graphqlJobHelper) {
$this->em = $em;
$this->graphqlCommonHelper = $graphqlCommonHelper;
$this->graphqlCompanyHelper = $graphqlCompanyHelper;
$this->graphqlJobHelper = $graphqlJobHelper;
}
public function prepareJobMarket(JobMarket $jobMarket) {
$jobMarketGQL = new JobMarketGQL();
$jobMarketGQL->setId($jobMarket->getId());
$jobMarketGQL->setName($jobMarket->getName());
$jobMarketGQL->setNumberOfPositions($jobMarket->getNumberOfPositions());
$jobMarketGQL->setDescription($jobMarket->getDescription());
$jobMarketGQL->setDetails($jobMarket->getDetails());
$jobMarketGQL->setUrl($jobMarket->getUrl());
$jobMarketGQL->setRequirements($jobMarket->getRequirements());
$jobMarketGQL->setSalary($jobMarket->getSalary());
$jobMarketGQL->setAdditionalInfo($this->getAdditionalInfo($jobMarket));
$jobMarketGQL->setStartDate($this->graphqlCommonHelper->getDateString($jobMarket->getStartDate()));
$jobMarketGQL->setApplyUntil($this->graphqlCommonHelper->getDateString($jobMarket->getApplyUntil()));
$jobMarketGQL->setOpenDate($this->graphqlCommonHelper->getDateString($jobMarket->getOpenDate()));
$jobMarketGQL->setCloseDate($this->graphqlCommonHelper->getDateString($jobMarket->getClosedDate()));
$jobMarketGQL->setContact($this->graphqlCommonHelper->getContact($jobMarket->getContact()));
$jobMarketGQL->setPositionType($this->getPositionType($jobMarket));
$jobMarketGQL->setApplyType($this->getApplyType($jobMarket));
$jobMarketGQL->setOnlineUrl($jobMarket->getUrl());
$jobMarketGQL->setStartType($this->getStartType($jobMarket));
$jobMarketGQL->setViewCount($jobMarket->getViewCount());
$jobMarketGQL->setApplicationCount($jobMarket->getApplicationCount());
$stateGQL = $this->getStateGQL($jobMarket);
$jobMarketGQL->setState($stateGQL);
$this->addAddresses($jobMarket, $jobMarketGQL);
$this->addJobMarketJobs($jobMarket, $jobMarketGQL);
$this->addJobMarketProfile($jobMarket, $jobMarketGQL);
$this->addJobMarketImage($jobMarket, $jobMarketGQL);
$this->addJobMarketCustomMedia($jobMarket, $jobMarketGQL);
return $jobMarketGQL;
}
public function prepareJobMarketReduced(JobMarket $jobMarket) {
$jobMarketGQL = new JobMarketGQL();
$jobMarketGQL->setId($jobMarket->getId());
$jobMarketGQL->setName($jobMarket->getName());
$jobMarketGQL->setPositionType($this->getPositionType($jobMarket));
$jobMarketGQL->setNumberOfPositions($jobMarket->getNumberOfPositions());
$addresses = $jobMarket->getAddresses();
foreach ($addresses as $address) {
$addressGQL = $this->graphqlCommonHelper->getAddress($address);
if (empty($addressGQL)) {
continue;
}
$jobMarketGQL->addAddress($addressGQL);
}
$jobs = $jobMarket->getJobs();
foreach ($jobs as $job) {
$jobSimpleGQL = $this->graphqlJobHelper->getJobSimple($job);
if (empty($jobSimpleGQL)) {
continue;
}
$jobMarketGQL->addJob($jobSimpleGQL);
}
return $jobMarketGQL;
}
private function getStateGQL(JobMarket $jobMarket) {
/* @var $jobMarketState JobMarketState */
$jobMarketState = $jobMarket->getJobMarketState();
if (empty($jobMarketState)) {
return "NOTSET";
}
$stateID = $jobMarketState->getId();
switch ($stateID) {
case 1:
return "ACTIVE";
case 2:
return "INACTIVE";
case 3:
return "DELETED";
case 4:
return "DRAFT";
default:
return "NOTSET";
}
}
private function getAdditionalInfo(JobMarket $jobMarket) {
$additionalInfoSrc = $jobMarket->getAdditionalInfo();
if (empty($additionalInfoSrc)) {
return null;
}
$objJson = json_decode($additionalInfoSrc);
$additionalInfoGQL = new JobMarketAdditionalInfoGQL();
$additionalInfoGQL->setFrom($objJson->from);
$additionalInfoGQL->setTo($objJson->to);
$additionalInfoGQL->setWorkFrom($objJson->workFrom);
$additionalInfoGQL->setWorkTo($objJson->workTo);
$additionalInfoGQL->setAge($objJson->age);
return $additionalInfoGQL;
}
private function getPositionType(JobMarket $jobMarket) {
$positionType = $jobMarket->getJobMarketPositionType();
if (empty($positionType)) {
return null;
}
return strtoupper($positionType->getName());
}
public function getStartTypeByString($strStartType) {
$lowStartType = strtolower($strStartType);
switch ($lowStartType) {
case "anytime":
return $this->em->getRepository(JobMarketStartType::class)->find(2);
case "consent":
return $this->em->getRepository(JobMarketStartType::class)->find(3);
case "date":
return $this->em->getRepository(JobMarketStartType::class)->find(1);
}
return null;
}
private function getApplyType(JobMarket $jobMarket) {
$applyType = $jobMarket->getJobMarketApplyType();
if (empty($applyType)) {
return null;
}
$applyTypeID = $applyType->getId();
switch ($applyTypeID) {
case 1:
return 'ONLINE';
case 2:
return 'EMAIL';
case 3:
return 'PHONE';
case 4:
return 'POSTAL';
}
return '';
}
private function getStartType(JobMarket $jobMarket) {
$startType = $jobMarket->getJobMarketStartType();
if (empty($startType)) {
return null;
}
$startTypeID = $startType->getId();
switch ($startTypeID) {
case 1:
return 'DATE';
case 2:
return 'ANYTIME';
case 3:
return 'CONSENT';
}
return '';
}
private function addAddresses(JobMarket $jobMarket, JobMarketGQL $jobMarketGQL) {
$addresses = $jobMarket->getAddresses();
foreach ($addresses as $address) {
$addressGQL = $this->graphqlCommonHelper->getAddress($address);
$jobMarketGQL->addAddress($addressGQL);
}
}
private function addJobMarketJobs(JobMarket $jobMarket, JobMarketGQL $jobMarketGQL) {
$jobsSrc = $jobMarket->getJobs();
if (count($jobsSrc) == 0) {
return;
}
if (count($jobsSrc) == 1) {
$jobSimpleGQL = $this->graphqlJobHelper->getJobSimple($jobsSrc[0]);
$jobMarketGQL->addJob($jobSimpleGQL);
return;
}
/* in the ui max 2 jobs can be selected */
if (count($jobsSrc) >= 2) {
/* @var $job1 Job */
$job1 = $jobsSrc[0];
/* @var $job2 Job */
$job2 = $jobsSrc[1];
$sort = strcmp($job1->getName(), $job2->getName());
/* if sort -1 or 0 then job1 name is alphabetically before job2 name */
if ($sort > 0) {
$temp = $job1;
$job1 = $job2;
$job2 = $temp;
}
$jobSimple1GQL = $this->graphqlJobHelper->getJobSimple($job1);
$jobMarketGQL->addJob($jobSimple1GQL);
$jobSimple2GQL = $this->graphqlJobHelper->getJobSimple($job2);
$jobMarketGQL->addJob($jobSimple2GQL);
}
}
private function addJobMarketProfile(JobMarket $jobMarket, JobMarketGQL $jobMarketGQL) {
$jobMarketProfile = $jobMarket->getCompanyProfile();
$companyProfile = $this->graphqlCompanyHelper->getCompanyProfileJobMarket($jobMarketProfile);
$jobMarketGQL->setCompanyProfile($companyProfile);
}
private function addJobMarketImage(JobMarket $jobMarket, JobMarketGQL $jobMarketGQL) {
$jobMarketImage = $jobMarket->getImage();
$image = $this->graphqlCommonHelper->generateThumbnails($jobMarketImage);
$jobMarketGQL->setImage($image);
}
private function addJobMarketCustomMedia(JobMarket $jobMarket, JobMarketGQL $jobMarketGQL) {
/* @var $customMedia Media */
$customMedia = $jobMarket->getCustomAdvertismentImage();
if (empty($customMedia)) {
return;
}
$customMediaGQL = null;
/* it is only either pdf or image */
if ($customMedia->isPDF()) {
$customMediaGQL = $this->graphqlCommonHelper->getMediaDocument($customMedia);
} else {
$customMediaGQL = $this->graphqlCommonHelper->getMediaImage($customMedia);
}
$jobMarketGQL->setCustomMedia($customMediaGQL);
}
}