<?php
namespace App\Service;
use App\Entity\Offer;
use App\Repository\OfferRepository;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class OfferService extends BaseService
{
/**
* @param OfferRepository $repository
*/
public function __construct(
OfferRepository $repository,
BaseService $baseService,
UrlGeneratorInterface $urlGenerator,
TranslatorInterface $translator
) {
$this->reflectFromParent($baseService);
$this->repository = $repository;
$this->urlGenerator = $urlGenerator;
$this->translator = $translator;
}
public function filterJob($request)
{
$requestData = null;
if ($request) {
foreach ($request as $key => $value) {
if (empty($value)) continue;
if ($key == 'contract') {
$requestData['filter_' . $key] = $value;
}
if (in_array($key, ['expertise', 'campuses', 'skill'])) {
$requestData['memberOf_' . $key] = $value;
}
}
}
return $this->repository->getListAll($requestData);
}
public function getListAll($requestData)
{
return $this->repository->getListAll($requestData);
}
public function getBySlug($slug, $request)
{
return $this->repository->getBySlug($slug, $request);
}
public function getById($id)
{
return $this->repository->getById($id);
}
public function getUrl($entity, $review = null)
{
$url = $this->urlGenerator->generate('job_board.detail', [
'slug' => $entity->getSlug()
], UrlGeneratorInterface::ABSOLUTE_URL);
if ($review) {
$url .= '?review=1';
}
return $this->urlHelper->getAbsoluteUrl($url);
}
public function uploadFile(UploadedFile $fileUpload, $folder)
{
$newMedia = $this->mediaService->uploadFile($fileUpload, $folder);
return $newMedia['path'];
}
public function addEntity($request)
{
$input = [];
$input['status'] = Offer::STATUS_INACTIVE;
if ($request->request->get('offerType')) {
if (count($request->get('offerType')) > 1) {
$input['offerType'] = Offer::OFFER_TYPE_ALL;
} else {
$input['offerType'] = array_values($request->request->get('offerType'))[0];
}
$request->request->remove('offerType');
}
// Upload logo
$logo = $request->files->get('logo');
if ($logo) {
$input['logo'] = $this->uploadFile($logo, $this->container->getParameter('dir.offer_logo'));
$request->files->remove('logo');
}
// Upload description File
$descriptionFile = $request->files->get('descriptionFile');
if ($descriptionFile) {
$input['descriptionFile'] = $this->uploadFile($descriptionFile, $this->container->getParameter('dir.offer_files'));
$request->files->remove('descriptionFile');
}
$entity = $this->add($request, $input, null, 'ENTITY', false, ['offerTitle'], true);
// Update code
$this->updateGenerateCode($entity);
if ($entity) {
$this->sendMailOffer($this->autoMapper->map($entity, 'App\DTO\Offer\OfferOutput'));
}
return $this->autoMapper->map($entity, 'App\DTO\Offer\OfferOutputList');
}
public function updateEntity($request)
{
$input = [];
$entity = $this->get($request->get('id'));
if ($request->request->get('offerType')) {
if (count($request->get('offerType')) > 1) {
$input['offerType'] = Offer::OFFER_TYPE_ALL;
} else {
$input['offerType'] = array_values($request->request->get('offerType'))[0];
}
$request->request->remove('offerType');
}
// Remove logo
if ($request->get('removeLogo')) {
$this->removeLogo($entity);
}
// Upload logo
$logo = $request->files->get('logo');
if ($logo) {
$input['logo'] = $this->uploadFile($logo, $this->container->getParameter('dir.offer_logo'));
$request->files->remove('logo');
}
// Remove file
if ($request->get('removeFile')) {
$this->removeFile($entity);
}
// Upload description File
$descriptionFile = $request->files->get('descriptionFile');
if ($descriptionFile) {
$input['descriptionFile'] = $this->uploadFile($descriptionFile, $this->container->getParameter('dir.offer_files'));
$request->files->remove('descriptionFile');
}
$entity = $this->update($entity, $request, $input, null, 'ENTITY', false, true);
return $this->autoMapper->map($entity, 'App\DTO\Offer\OfferOutput');
}
public function updateGenerateCode($entity)
{
if (!$entity->getId()) return;
$code = 'ESTI' . str_pad($entity->getId(), 4, '0', STR_PAD_LEFT);
$entity->setCode($code);
$this->repository->save($entity);
}
public function updateStatus($request)
{
$entity = $this->get($request->get('id'));
$status = $request->get('status');
$entity->setStatus($status);
$this->repository->save($entity);
return $this->autoMapper->map($entity, 'App\DTO\Offer\OfferOutputList');
}
public function deleteEntity($id)
{
$entity = $this->get($id);
$logo = $entity->getLogo() ?? null;
$pathDescriptionFile = $entity->getDescriptionFile() ?? null;
$this->delete($entity);
if ($logo) {
$this->mediaService->deleteFile($logo);
}
if ($pathDescriptionFile) {
$this->mediaService->deleteFile($pathDescriptionFile);
}
return true;
}
public function removeLogo($entity)
{
$fileName = $entity->getLogo() ?? null;
if ($fileName) {
$this->mediaService->deleteFile($fileName);
}
$entity->setLogo(null);
$this->entityManager->flush();
return;
}
public function removeFile($entity)
{
$fileName = $entity->getDescriptionFile() ?? null;
if ($fileName) {
$this->mediaService->deleteFile($fileName);
}
$entity->setDescriptionFile(null);
$this->entityManager->flush();
return;
}
public function sendMailOffer($offer)
{
if (!empty($offer->campuses)) {
$offer->campuses = implode(', ', array_column($offer->campuses, 'name'));
}
if (!empty($offer->skill)) {
$offer->skill = implode(', ', array_column($offer->skill, 'name'));
}
if (!empty($offer->expertise)) {
$offer->expertise = implode(', ', array_column($offer->expertise, 'name'));
}
if (is_int($offer->offerType)) {
$arrOfferType = [0 => 'Téléphone', 1 => 'Email', 2 => 'Téléphone, Email'];
$offer->offerType = $arrOfferType[$offer->offerType];
}
$subjectMail = $this->translator->trans('offer.mail.title');
$bodyMail = $this->container->get('twig')->render('email/offer/offer.html.twig', [
'offer' => $offer
]);
$recipientsString = $this->container->getParameter('mail.contact.recipients');
$this->sendMail(explode(",", $recipientsString), $subjectMail, $bodyMail);
}
}