src/BackendBundle/Helper/JobMarketHelper.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\BackendBundle\Helper;
  3. use DateTime;
  4. use Doctrine\DBAL\Connection;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Doctrine\ORM\Query;
  7. use App\BackendBundle\Helper\MediaHelper;
  8. use App\Entity\Address;
  9. use App\Entity\CompanyLocation;
  10. use App\Entity\CompanyProfile;
  11. use App\Entity\Contact;
  12. use App\Entity\Job;
  13. use App\Entity\JobMarket;
  14. use App\Entity\JobMarketApplyType;
  15. use App\Entity\JobMarketPositionType;
  16. use App\Entity\JobMarketStartType;
  17. use App\Entity\JobMarketState;
  18. use App\Entity\JobMarketViewType;
  19. use App\Entity\User;
  20. class JobMarketHelper {
  21.     private EntityManagerInterface $em;
  22.     private Connection $connection;
  23.     private MediaHelper $mediaHelper;
  24.     public function __construct(EntityManagerInterface $emMediaHelper $mediaHelper) {
  25.         $this->em $em;
  26.         $this->connection $this->em->getConnection();
  27.         $this->mediaHelper $mediaHelper;
  28.     }
  29.     public function createJobOffer($data) {
  30.         $jobOffer = new JobMarket();
  31.         $jobOffer->setName($data['name']);
  32.         $jobOffer->setImage($data['image']);
  33.         $jobOffer->setCustomAdvertismentImage($data['customAdvertismentImage']);
  34.         $jobOffer->setJobMarketPositionType($this->getJobMarketPositionTypeById($data['jobMarketPositionTypeId']));
  35.         $jobOffer->setJobMarketApplyType($this->getJobMarketApplyTypeById($data['jobMarketApplyTypeId']));
  36.         $jobOffer->setJobMarketStartType($this->getJobMarketStartTypeById($data['jobMarketStartTypeId']));
  37.         $jobOffer->setCompanyProfile($data['companyProfile']);
  38.         $jobOffer->setUser($data['user']);
  39.         $jobOffer->setContact($data['contact']);
  40.         foreach ($data['addresses'] as $address) {
  41.             $jobOffer->addAddress($address);
  42.         }
  43.         foreach ($data['jobs'] as $job) {
  44.             $jobOffer->addJob($job);
  45.         }
  46.         $jobOffer->setNumberOfPositions($data['numberOfPositions']);
  47.         $jobOffer->setStartDate($data['startDate']);
  48.         $jobOffer->setApplyUntil($data['applyUntil']);
  49.         $jobOffer->setDescription($data['description']);
  50.         $jobOffer->setRequirements($data['requirements']);
  51.         $jobOffer->setSalary($data['salary']);
  52.         $jobOffer->setDetails($data['details']);
  53.         $jobOffer->setOpenDate($data['openDate']);
  54.         $jobOffer->setClosedDate($data['closedDate']);
  55.         $jobOffer->setUrl($data['url']);
  56.         $jobOffer->setAdditionalInfo($data['additionalInfo']);
  57.         $jobOffer->setJobMarketState($this->getJobMarketStateById($data['jobMarketStateId']));
  58.         $this->em->persist($jobOffer);
  59.         $this->em->flush();
  60.         return $jobOffer;
  61.     }
  62.     public function deleteFull(JobMarket $jobMarket) {
  63.         $customAdvertismentMedia $jobMarket->getCustomAdvertismentImage();
  64.         $this->deleteJobMarketAddressMappings($jobMarket);
  65.         $this->em->remove($jobMarket);
  66.         $this->em->flush();
  67.         
  68.         if (!empty($customAdvertismentMedia)) {
  69.             $this->mediaHelper->deleteMedia($customAdvertismentMedianulltrue);
  70.         }        
  71.     }
  72.     private function deleteJobMarketAddressMappings(JobMarket $jobMarket) {
  73.         $jobMarketID $jobMarket->getId();
  74.         $sql "DELETE FROM job_market_address_mapping WHERE job_market_id=:jmid";
  75.         $stmt $this->connection->prepare($sql);
  76.         $stmt->bindValue('jmid'$jobMarketID);
  77.         $stmt->execute();
  78.     }
  79.     public function editJobOffer(JobMarket $jobOffer$data) {
  80.         $jobOffer->setName($data['name']);
  81.         $jobOffer->setImage($data['image']);
  82.         $jobOffer->setCustomAdvertismentImage($data['customAdvertismentImage']);
  83.         $jobOffer->setJobMarketPositionType($this->getJobMarketPositionTypeById($data['jobMarketPositionTypeId']));
  84.         $jobOffer->setJobMarketApplyType($this->getJobMarketApplyTypeById($data['jobMarketApplyTypeId']));
  85.         $jobOffer->setJobMarketStartType($this->getJobMarketStartTypeById($data['jobMarketStartTypeId']));
  86.         $jobOffer->setCompanyProfile($data['companyProfile']);
  87.         $jobOffer->setUser($data['user']);
  88.         $jobOffer->setContact($data['contact']);
  89.         $jobOffer->getAddresses()->clear();
  90.         foreach ($data['addresses'] as $address) {
  91.             $jobOffer->addAddress($address);
  92.         }
  93.         $jobOffer->getJobs()->clear();
  94.         foreach ($data['jobs'] as $job) {
  95.             $jobOffer->addJob($job);
  96.         }
  97.         if ($data['image'] != null) {
  98.             $jobOffer->setImage($data['image']);
  99.         }
  100.         $jobOffer->setNumberOfPositions($data['numberOfPositions']);
  101.         $jobOffer->setStartDate($data['startDate']);
  102.         $jobOffer->setApplyUntil($data['applyUntil']);
  103.         $jobOffer->setDescription($data['description']);
  104.         $jobOffer->setRequirements($data['requirements']);
  105.         $jobOffer->setSalary($data['salary']);
  106.         $jobOffer->setDetails($data['details']);
  107.         $jobOffer->setOpenDate($data['openDate']);
  108.         $jobOffer->setClosedDate($data['closedDate']);
  109.         $jobOffer->setUrl($data['url']);
  110.         $jobOffer->setAdditionalInfo($data['additionalInfo']);
  111.         $this->em->persist($jobOffer);
  112.         $this->em->flush();
  113.         return $jobOffer;
  114.     }
  115.     public function getJobOfferById($id) {
  116.         return $this->em->getRepository(JobMarket::class)->findOneBy(array('id' => $id));
  117.     }
  118.     public function getJobOffersByCompanyProfile(CompanyProfile $companyProfile null$jobOfferStateArray null$filterDates true) {
  119.         if (empty($companyProfile)) {
  120.             return null;
  121.         }
  122.         $companyProfileID $companyProfile->getId();
  123.         $whereDates '';
  124.         if ($filterDates) {
  125.             $whereDates 'AND j.open_date <= :now AND j.closed_date >= :now';
  126.         }
  127.         $whereStates $this->getJobOffersStateWhere($jobOfferStateArray);
  128.         $sqlText "SELECT j FROM App\Entity\JobMarket j "
  129.                 "LEFT JOIN j.companyProfile as cp "
  130.                 "WHERE cp.id = :companyProfileID "
  131.                 "$whereDates $whereStates"
  132.                 "ORDER BY j.name ASC";
  133.         $query $this->em->createQuery($sqlText);
  134.         $query->setParameter('companyProfileID'$companyProfileID);
  135.         if ($filterDates) {
  136.             $query->setParameter('now', new DateTime());
  137.         }
  138.         if (!empty($jobOfferStateArray)) {
  139.             $index 0;
  140.             foreach ($jobOfferStateArray as $jobOfferState) {
  141.                 $query->setParameter('state' $index$jobOfferState);
  142.                 $index++;
  143.             }
  144.         }
  145.         $result $query->getResult();
  146.         return $result;
  147.     }
  148.     private function getJobOffersStateWhere($jobOfferStateArray) {
  149.         if (empty($jobOfferStateArray)) {
  150.             return '';
  151.         }
  152.         $sqlText ' AND (';
  153.         $index 0;
  154.         foreach ($jobOfferStateArray as $jobOfferState) {
  155.             if ($index 0) {
  156.                 $sqlText .= ' OR ';
  157.             }
  158.             $sqlText .= 'j.jobMarketState = :state' $index;
  159.             $index++;
  160.         }
  161.         $sqlText .= ')';
  162.         return $sqlText;
  163.     }
  164.     public function getJobOffersByUser(User $user$jobOfferStateArray) {
  165.         $sqlText 'SELECT j FROM App\Entity\JobMarket j 
  166.                         WHERE j.user = :user';
  167.         if ($jobOfferStateArray != null) {
  168.             $sqlText .= ' AND (';
  169.             $index 0;
  170.             foreach ($jobOfferStateArray as $jobOfferState) {
  171.                 if ($index 0) {
  172.                     $sqlText .= ' OR ';
  173.                 }
  174.                 $sqlText .= 'j.jobMarketState = :state' $index;
  175.                 $index++;
  176.             }
  177.             $sqlText .= ')';
  178.         }
  179.         $query $this->em->createQuery($sqlText);
  180.         $query->setParameter('user'$user);
  181.         if ($jobOfferStateArray != null) {
  182.             $index 0;
  183.             foreach ($jobOfferStateArray as $jobOfferState) {
  184.                 $query->setParameter('state' $index$jobOfferState);
  185.                 $index++;
  186.             }
  187.         }
  188.         $result $query->getResult();
  189.         return $result;
  190.     }
  191.     public function getJobOffersByLimitOffset($limit$offset) {
  192.         $dql 'SELECT jm '
  193.                 'FROM App\Entity\JobMarket jm '
  194.                 'JOIN jm.jobMarketState state '
  195.                 'WHERE state.id = 1 AND jm.closed_date > :now '
  196.                 'ORDER BY jm.id ASC';
  197.         /* @var $query Query */
  198.         $query $this->em->createQuery($dql);
  199.         $now = new DateTime();
  200.         $query->setParameter("now"$now);
  201.         $query->setMaxResults($limit);
  202.         $query->setFirstResult($offset);
  203.         return $query->getResult();
  204.     }
  205.     public function getActiveJobOffersByJob(Job $job) {
  206.         $sqlText 'SELECT jm FROM App\Entity\JobMarket jm
  207.                     JOIN jm.jobs jobs
  208.                     JOIN jm.jobMarketState state
  209.                     WHERE jobs = :job
  210.                     AND state.id = 1
  211.                     AND jm.closed_date >= CURRENT_TIMESTAMP()';
  212.         $query $this->em->createQuery($sqlText);
  213.         $query->setParameter('job'$job);
  214.         $result $query->getResult();
  215.         return $result;
  216.     }
  217.     public function getJobMarketStateById($id) {
  218.         return $this->em->getRepository(JobMarketState::class)->findOneBy(array('id' => $id));
  219.     }
  220.     public function getJobMarketPositionTypeById($id) {
  221.         return $this->em->getRepository(JobMarketPositionType::class)->findOneBy(array('id' => $id));
  222.     }
  223.     public function getJobMarketPositionTypeByString($strText) {
  224.         $strLower strtolower($strText);
  225.         switch ($strLower) {
  226.             case "lehrstelle":
  227.                 return $this->getJobMarketPositionTypeById(1);
  228.             case "ferialjob":
  229.                 return $this->getJobMarketPositionTypeById(2);
  230.             case "praktikum":
  231.                 return $this->getJobMarketPositionTypeById(3);
  232.             default:
  233.                 return null;
  234.         }
  235.     }
  236.     public function getJobMarketPositionTypes() {
  237.         return $this->em->getRepository(JobMarketPositionType::class)->findBy(array(), array('position' => 'ASC'));
  238.     }
  239.     public function getJobMarketApplyTypeById($id) {
  240.         return $this->em->getRepository(JobMarketApplyType::class)->findOneBy(array('id' => $id));
  241.     }
  242.     public function getJobMarketApplyTypes() {
  243.         return $this->em->getRepository(JobMarketApplyType::class)->findBy(array('isVisible' => true), array('description' => 'ASC'));
  244.     }
  245.     public function getJobMarketApplyTypeByString($strText) {
  246.         $strLower strtolower($strText);
  247.         switch ($strLower) {
  248.             case "online":
  249.                 return $this->getJobMarketApplyTypeById(1);
  250.             case "email":
  251.                 return $this->getJobMarketApplyTypeById(2);
  252.             case "postal":
  253.                 return $this->getJobMarketApplyTypeById(4);
  254.             default:
  255.                 return null;
  256.         }
  257.     }
  258.     public function getJobMarketViewTypeByID($id) {
  259.         return $this->em->getRepository(JobMarketViewType::class)->find($id);
  260.     }
  261.     public function getJobMarketViewTypeByString($strText) {
  262.         $strLower strtolower($strText);
  263.         switch ($strLower) {
  264.             case "default":
  265.                 return $this->getJobMarketViewTypeById(1);
  266.             case "pdf":
  267.                 return $this->getJobMarketViewTypeById(2);
  268.             default:
  269.                 return null;
  270.         }
  271.     }
  272.     public function getJobMarketStartTypeById($id) {
  273.         return $this->em->getRepository(JobMarketStartType::class)->findOneBy(array('id' => $id));
  274.     }
  275.     public function getJobMarketByAddress(Address $address null) {
  276.         if (empty($address)) {
  277.             return null;
  278.         }
  279.         $addressID $address->getId();
  280.         $sqlText "SELECT jm "
  281.                 "FROM App\Entity\JobMarket jm "
  282.                 "JOIN jm.addresses address "
  283.                 "WHERE address.id = :addressid";
  284.         $query $this->em->createQuery($sqlText);
  285.         $query->setParameter('addressid'$addressID);
  286.         return $query->getResult();
  287.     }
  288.     public function getJobMarketsByContact(Contact $contact) {
  289.         return $this->em->getRepository(JobMarket::class)->findOneBy(array('contact' => $contact));
  290.     }
  291.     public function getJobMarketsByCompanyProfile(CompanyProfile $companyProfile) {
  292.         return $this->em->getRepository(JobMarket::class)->findBy(array('companyProfile' => $companyProfile), array('name' => 'ASC'));
  293.     }
  294.     public function increaseViewCount(JobMarket $jobMarket) {
  295.         $id $jobMarket->getId();
  296.         $newViewCount $jobMarket->getViewCount() + 1;
  297.         $connection $this->em->getConnection();
  298.         $sql "UPDATE job_market SET view_count=:viewcount WHERE id=:id";
  299.         $stmt $connection->prepare($sql);
  300.         $stmt->bindValue('id'$id);
  301.         $stmt->bindValue('viewcount'$newViewCount);
  302.         $stmt->execute();
  303.     }
  304.     public function isCompanyLocationInUse(CompanyLocation $companyLocation) {
  305.         $address $companyLocation->getAddress();
  306.         if (empty($address)) {
  307.             return false;
  308.         }
  309.         $addressID $address->getId();
  310.         $sql "SELECT count(*) as numEntries FROM job_market_address_mapping WHERE address_id=$addressID";
  311.         $arrResult $this->connection->query($sql)->fetchAll();
  312.         if ($arrResult[0]['numEntries'] > 0) {
  313.             return true;
  314.         }
  315.         return false;
  316.     }
  317.     public function isContactInUse(Contact $contact null) {
  318.         if (empty($contact)) {
  319.             return false;
  320.         }
  321.         $contactID $contact->getId();
  322.         $sql "SELECT count(*) as numEntries FROM job_market WHERE contact_id=$contactID";
  323.         $arrResult $this->connection->query($sql)->fetchAll();
  324.         if ($arrResult[0]['numEntries'] > 0) {
  325.             return true;
  326.         }
  327.         return false;
  328.     }
  329.     public function setState(JobMarket $jobMarketJobMarketState $state) {
  330.         $stateID $state->getId();
  331.         
  332.         // $stateID 3 = delete
  333.         if ($stateID == 3) {
  334.             $this->deleteFull($jobMarket);
  335.         } else {
  336.             $jobMarket->setJobMarketState($state);
  337.             $this->em->persist($jobMarket);
  338.             $this->em->flush();
  339.         }
  340.     }
  341. }