<?php
namespace App\Service;
use App\Entity\Dish;
use App\Entity\DishCategory;
use App\Entity\Wine;
use App\Entity\WineCategory;
use App\Entity\Beer;
use App\Entity\BeerCategory;
use App\Entity\Drink;
use App\Entity\DrinkCategory;
use App\Entity\Menu;
use App\Entity\MenuCategory;
use App\Entity\MenuInnerCategory;
use App\Entity\ProductCategoryPosition;
use App\Entity\Institution;
use App\Entity\WinePairing;
use App\Entity\BeerPairing;
use App\Entity\Allergen;
use App\Entity\Label;
use App\Entity\Grape;
use App\Entity\LocaleFront;
use App\Entity\InstitutionLocaleFront;
use App\Entity\InstitutionReview;
use App\Entity\Contest;
use App\Entity\ContestPrize;
use App\Entity\ContestCompany;
use App\Entity\ContestTicket;
use App\Entity\Subscription;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Common\Collections\Criteria;
use Doctrine\Common\Collections\Collection;
class MobileAppSerializeService
{
private EntityManagerInterface $em;
private SerializeService $serializeService;
private $appLanguage;
public function __construct(
EntityManagerInterface $em,
SerializeService $serializeService
) {
$this->em = $em;
$this->serializeService = $serializeService;
$this->appLanguage = null;
}
/**
* @param string $language
* @return void
*/
public function setAppLanguage(string $language): void
{
$this->appLanguage = $language;
}
/**
* @param string|null $language
* @return void
*/
public function setLanguage(?string $language): void
{
$requestedLocaleFront = $this->em->getRepository(LocaleFront::class)->findBy(array('tag' => $language));
if ($requestedLocaleFront) {
$this->setAppLanguage($requestedLocaleFront[0]->getTag());
}
}
/**
* @param Collection $translations
* @return object|null $translation
*/
public function getTranslation(Collection $translations): object|null
{
$currentLocale = $this->em->getRepository(LocaleFront::class)->findBy(array('tag' => $this->appLanguage))[0];
$criteria = Criteria::create()
->where(Criteria::expr()->eq('localeFront', $currentLocale));
return $translations->matching($criteria)->first();
}
/**
* @param LocaleFront|null $localeFront
* @param Collection|InstitutionLocaleFront[] $institutionLocaleFronts
* @return array|null
*/
public function serializeLanguage(?LocaleFront $localeFront, Collection $institutionLocaleFronts)
{
if (!$localeFront) {
return null;
}
$isDefault = false;
$validated = false;
foreach ($institutionLocaleFronts as $institutionLocaleFront) {
if ($institutionLocaleFront->getLocaleFront()->getId() == $localeFront->getId()) {
$validated = true;
if ($institutionLocaleFront->getIsDefault()) {
$isDefault = true;
}
}
}
return [
'name' => $localeFront->getName(),
'original_name' => $localeFront->getOriginalName(),
'tag' => $localeFront->getTag(),
'isDefault' => $isDefault,
'validated' => $validated,
];
}
/**
* @param Dish|null $dish
* @return array|null
*/
public function serializeDishOverview(?Dish $dish)
{
if (!$dish) {
return null;
}
if ($dish->isActive()) {
$dishTranslations = $dish->getDishTranslations();
$document = $this->serializeService->serializeDocument($dish->getImage(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
$allergens = [];
foreach ($dish->getAllergens() as $allergen) {
$allergens[] = $allergen->getId();
}
$verifiedReducedPrice = Tools::getVerifiedReducedPrice(
$dish->getReducedPrice(),
$dish->getReducedPriceStart(),
$dish->getReducedPriceEnd()
);
return [
'id' => $dish->getId(),
'type' => "DISH",
'name' => $this->getTranslation($dishTranslations)->getName(),
'price' => $dish->getSellingPriceTtc(),
'reducedPrice' => $verifiedReducedPrice,
'description' => $this->getTranslation($dishTranslations)->getDescription(),
'category' => $this->getTranslation($dish->getDishCategory()->getDishCategoryTranslations())->getName(),
'image' => $document,
'allergens' => $allergens,
];
}
}
/**
* @param Wine|null $wine
* @return array|null
*/
public function serializeWineOverview(?Wine $wine)
{
if (!$wine) {
return null;
}
if ($wine->isActive()) {
$wineTranslations = $wine->getWineTranslations();
$appName = null;
$name = $this->getTranslation($wineTranslations)->getName();
$appelation = $this->getTranslation($wineTranslations)->getAppellation();
!is_null($name) ? $appName = $name . ' - ' . $appelation : $appName = $appelation;
$winePrices = [];
foreach ($wine->getWinePrices() as $winePrice) {
$winePrices[] = $this->serializeService->serializeWinePrice($winePrice);
}
$wineColor = null;
if ($wine->getWineColor() !== null) {
$wineColor = [
'id' => $wine->getWineColor()->getId(),
'name' => $this->getTranslation($wine->getWineColor()->getWineColorTranslations())->getName(),
];
}
$document = $this->serializeService->serializeDocument($wine->getImage(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
return [
'id' => $wine->getId(),
'type' => "WINE",
'name' => $appName,
'winery' => $this->getTranslation($wineTranslations)->getWinery(),
'color' => $wineColor,
'vintage' => $wine->getVintage(),
'prices' => $winePrices,
'image' => $document,
];
}
}
/**
* @param Beer|null $beer
* @return array|null
*/
public function serializeBeerOverview(?Beer $beer)
{
if (!$beer) {
return null;
}
if ($beer->isActive()) {
$beerTranslations = $beer->getBeerTranslations();
$beerPrices = [];
foreach ($beer->getBeerPrices() as $beerPrice) {
$beerPrices[] = $this->serializeService->serializeBeerPrice($beerPrice);
}
$beerColor = null;
if ($beer->getBeerColor() !== null) {
$beerColor = [
'id' => $beer->getBeerColor()->getId(),
'name' => $this->getTranslation($beer->getBeerColor()->getBeerColorTranslations())->getName(),
];
}
$document = $this->serializeService->serializeDocument($beer->getImage(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
return [
'id' => $beer->getId(),
'type' => "BEER",
'name' => $this->getTranslation($beerTranslations)->getName(),
'color' => $beerColor,
'description' => $this->getTranslation($beerTranslations)->getDescription(),
'prices' => $beerPrices,
'image' => $document,
];
}
}
/**
* @param Drink|null $drink
* @return array|null
*/
public function serializeDrinkOverview(?Drink $drink)
{
if (!$drink) {
return null;
}
if ($drink->isActive()) {
$drinkTranslations = $drink->getDrinkTranslations();
$drinkPrices = [];
foreach ($drink->getDrinkPrices() as $drinkPrice) {
$drinkPrices[] = $this->serializeService->serializeDrinkPrice($drinkPrice);
}
$document = $this->serializeService->serializeDocument($drink->getImage(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
return [
'id' => $drink->getId(),
'type' => "DRINK",
'name' => $this->getTranslation($drinkTranslations)->getName(),
'description' => $this->getTranslation($drinkTranslations)->getDescription(),
'prices' => $drinkPrices,
'image' => $document,
];
}
}
/**
* @param Menu|null $menu
* @return array|null
*/
public function serializeMenuOverview(?Menu $menu)
{
if (!$menu) {
return null;
}
if ($menu->isActive()) {
$menuTranslations = $menu->getMenuTranslations();
$menuInnerCategories = [];
foreach ($menu->getInnerCategories() as $innerCategory) {
$serializedMenuInnerCategory = $this->serializeMenuInnerCategoryOverview($innerCategory);
if (count($serializedMenuInnerCategory['data']) > 0) {
$menuInnerCategories[] = $serializedMenuInnerCategory;
}
}
$document = $this->serializeService->serializeDocument($menu->getImage(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
$verifiedReducedPrice = Tools::getVerifiedReducedPrice(
$menu->getReducedPrice(),
$menu->getReducedPriceStart(),
$menu->getReducedPriceEnd()
);
return [
'id' => $menu->getId(),
'type' => "MENU",
'name' => $this->getTranslation($menuTranslations)->getName(),
'description' => $this->getTranslation($menuTranslations)->getDescription(),
'price' => (!is_null($menu->getSellingPriceTtc()) ? $menu->getSellingPriceTtc() . '€' : null),
'reducedPrice' => (!is_null($verifiedReducedPrice) ? $verifiedReducedPrice . '€' : null),
'products' => $menuInnerCategories,
'image' => $document,
];
}
}
/**
* @param MenuInnerCategory|null $menuInnerCategory
* @return array|null
*/
public function serializeMenuInnerCategoryOverview(?MenuInnerCategory $menuInnerCategory)
{
if (!$menuInnerCategory) {
return null;
}
$list = [];
foreach ($menuInnerCategory->getMenuInnerCategoryDishes() as $menuInnerCategoryDish) {
$dish = $menuInnerCategoryDish->getDish();
if ($dish && $dish->isActive()) {
$list[] = [
'id' => $dish->getId(),
'type' => 'DISH',
'position' => $menuInnerCategoryDish->getPosition(),
];
}
}
foreach ($menuInnerCategory->getMenuInnerCategoryWines() as $menuInnerCategoryWine) {
$wine = $menuInnerCategoryWine->getWine();
if ($wine && $wine->isActive()) {
$list[] = [
'id' => $wine->getId(),
'type' => 'WINE',
'position' => $menuInnerCategoryWine->getPosition(),
];
}
}
foreach ($menuInnerCategory->getMenuInnerCategoryBeers() as $menuInnerCategoryBeer) {
$beer = $menuInnerCategoryBeer->getBeer();
if ($beer && $beer->isActive()) {
$list[] = [
'id' => $beer->getId(),
'type' => 'BEER',
'position' => $menuInnerCategoryBeer->getPosition(),
];
}
}
foreach ($menuInnerCategory->getMenuInnerCategoryDrinks() as $menuInnerCategoryDrink) {
$drink = $menuInnerCategoryDrink->getDrink();
if ($drink && $drink->isActive()) {
$list[] = [
'id' => $drink->getId(),
'type' => 'DRINK',
'position' => $menuInnerCategoryDrink->getPosition(),
];
}
}
//sort list by item position
usort($list, function ($item1, $item2) {
return $item1['position'] <=> $item2['position'];
});
return [
'key' => $menuInnerCategory->getId(),
'title' => $this->getTranslation($menuInnerCategory->getMenuInnerCategoryTranslations())->getName(),
'data' => $list,
];
}
/**
* @param MenuInnerCategory|null $menuInnerCategory
* @return array|null
*/
public function serializeMenuInnerCategory(?MenuInnerCategory $menuInnerCategory)
{
if (!$menuInnerCategory) {
return null;
}
$list = [];
foreach ($menuInnerCategory->getMenuInnerCategoryDishes() as $menuInnerCategoryDish) {
$dish = $menuInnerCategoryDish->getDish();
if ($dish && $dish->isActive()) {
$arrayDish = $this->serializeDishOverview($dish);
$arrayDish['position'] = $menuInnerCategoryDish->getPosition();
$list[] = $arrayDish;
}
}
foreach ($menuInnerCategory->getMenuInnerCategoryWines() as $menuInnerCategoryWine) {
$wine = $menuInnerCategoryWine->getWine();
if ($wine && $wine->isActive()) {
$arrayWine = $this->serializeWineOverview($menuInnerCategoryWine->getWine());
$arrayWine['position'] = $menuInnerCategoryWine->getPosition();
$list[] = $arrayWine;
}
}
foreach ($menuInnerCategory->getMenuInnerCategoryBeers() as $menuInnerCategoryBeer) {
$beer = $menuInnerCategoryBeer->getBeer();
if ($beer && $beer->isActive()) {
$arrayBeer = $this->serializeBeerOverview($menuInnerCategoryBeer->getBeer());
$arrayBeer['position'] = $menuInnerCategoryBeer->getPosition();
$list[] = $arrayBeer;
}
}
foreach ($menuInnerCategory->getMenuInnerCategoryDrinks() as $menuInnerCategoryDrink) {
$drink = $menuInnerCategoryDrink->getDrink();
if ($drink && $drink->isActive()) {
$arrayDrink = $this->serializeDrinkOverview($menuInnerCategoryDrink->getDrink());
$arrayDrink['position'] = $menuInnerCategoryDrink->getPosition();
$list[] = $arrayDrink;
}
}
//sort list by item position
usort($list, function ($item1, $item2) {
return $item1['position'] <=> $item2['position'];
});
return [
'key' => $menuInnerCategory->getId(),
'title' => $this->getTranslation($menuInnerCategory->getMenuInnerCategoryTranslations())->getName(),
'data' => $list,
];
}
/**
* @param Dish|null $dish
* @param string $language
* @return array|null
*/
public function serializeDish(?Dish $dish, ?string $language)
{
if (!$dish) {
return null;
}
// Set the language
$this->setLanguage($language);
if ($dish->isActive() && $this->appLanguage) {
$dishTranslations = $dish->getDishTranslations();
$allergens = [];
foreach ($dish->getAllergens() as $allergen) {
$allergens[] = $this->serializeAllergen($allergen);
}
$labels = [];
foreach ($dish->getLabels() as $label) {
$labels[] = $this->serializeLabel($label);
}
$winePairings = [];
foreach ($dish->getWinePairings() as $winePairing) {
$serializedWinePairing = $this->serializeWinePairing($winePairing, false, true, null);
if (!is_null($serializedWinePairing)) {
$winePairings[] = $serializedWinePairing;
}
}
// Sort pairings from best to worst association
usort($winePairings, function ($item1, $item2) {
return $item1['value'] <= $item2['value'];
});
$beerPairings = [];
foreach ($dish->getBeerPairings() as $beerPairing) {
$serializedBeerPairing = $this->serializeBeerPairing($beerPairing, false, true, null);
if (!is_null($serializedBeerPairing)) {
$beerPairings[] = $serializedBeerPairing;
}
}
// Sort pairings from best to worst association
usort($beerPairings, function ($item1, $item2) {
return $item1['value'] <= $item2['value'];
});
$document = $this->serializeService->serializeDocument($dish->getImage(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
$verifiedReducedPrice = Tools::getVerifiedReducedPrice(
$dish->getReducedPrice(),
$dish->getReducedPriceStart(),
$dish->getReducedPriceEnd()
);
return [
'id' => $dish->getId(),
'type' => "DISH",
'name' => $this->getTranslation($dishTranslations)->getName(),
'price' => $dish->getSellingPriceTtc(),
'reducedPrice' => $verifiedReducedPrice,
'category' => $this->getTranslation($dish->getDishCategory()->getDishCategoryTranslations())->getName(),
'description' => $this->getTranslation($dishTranslations)->getDescription(),
'additionalInformation' => $this->getTranslation($dishTranslations)->getAdditionalInformation(),
'ingredients' => [],
'allergens' => $allergens,
'labels' => $labels,
'image' => $document,
'winePairings' => $winePairings,
'beerPairings' => $beerPairings,
];
}
}
/**
* @param Wine|null $wine
* @param string $language
* @return array|null
*/
public function serializeWine(?Wine $wine, ?string $language)
{
if (!$wine) {
return null;
}
// Set the language
$this->setLanguage($language);
if ($wine->isActive() && $this->appLanguage) {
$wineTranslations = $wine->getWineTranslations();
$appName = null;
$name = $this->getTranslation($wineTranslations)->getName();
$appelation = $this->getTranslation($wineTranslations)->getAppellation();
!is_null($name) ? $appName = $name . ' - ' . $appelation : $appName = $appelation;
$grapes = [];
foreach ($wine->getGrapes() as $grape) {
$grapes[] = $this->serializeGrape($grape);
}
$labels = [];
foreach ($wine->getLabels() as $label) {
$labels[] = $this->serializeLabel($label);
}
$winePrices = [];
foreach ($wine->getWinePrices() as $winePrice) {
$winePrices[] = $this->serializeService->serializeWinePrice($winePrice);
}
$winePairings = [];
foreach ($wine->getWinePairings() as $winePairing) {
$serializedWinePairing = $this->serializeWinePairing($winePairing, true, false, null);
if (!is_null($serializedWinePairing)) {
$winePairings[] = $serializedWinePairing;
}
}
// Sort pairings from best to worst association
usort($winePairings, function ($item1, $item2) {
return $item1['value'] <= $item2['value'];
});
$wineColor = null;
if ($wine->getWineColor() !== null) {
$wineColor = [
'id' => $wine->getWineColor()->getId(),
'name' => $this->getTranslation($wine->getWineColor()->getWineColorTranslations())->getName(),
];
}
$document = $this->serializeService->serializeDocument($wine->getImage(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
return [
'id' => $wine->getId(),
'type' => 'WINE',
'name' => $appName,
'winery' => $this->getTranslation($wineTranslations)->getWinery(),
'category' => $this->getTranslation($wine->getWineCategory()->getWineCategoryTranslations())->getName(),
'grapes' => $grapes,
'labels' => $labels,
'color' => $wineColor,
'vintage' => $wine->getVintage(),
'description' => $this->getTranslation($wineTranslations)->getDescription(),
'strength' => $wine->getStrength(),
'sweetness' => $wine->getSweetness(),
'tannins' => $wine->getTannins(),
'fruity' => $wine->getFruity(),
'video' => $wine->getVideo(),
'review' => $this->getTranslation($wineTranslations)->getReview(),
'reviewFile' => $this->serializeService->serializeDocument($wine->getReviewFile()),
'image' => $document,
'organic' => $wine->getOrganic(),
'local' => $wine->getLocal(),
'prices' => $winePrices,
'winePairings' => $winePairings,
];
}
}
/**
* @param Beer|null $beer
* @param string $language
* @return array|null
*/
public function serializeBeer(?Beer $beer, ?string $language)
{
if (!$beer) {
return null;
}
// Set the language
$this->setLanguage($language);
if ($beer->isActive() && $this->appLanguage) {
$beerTranslations = $beer->getBeerTranslations();
$labels = [];
foreach ($beer->getLabels() as $label) {
$labels[] = $this->serializeLabel($label);
}
$beerPrices = [];
foreach ($beer->getBeerPrices() as $beerPrice) {
$beerPrices[] = $this->serializeService->serializeBeerPrice($beerPrice);
}
$beerPairings = [];
foreach ($beer->getBeerPairings() as $beerPairing) {
$serializedBeerPairing = $this->serializeBeerPairing($beerPairing, true, false, null);
if (!is_null($serializedBeerPairing)) {
$beerPairings[] = $serializedBeerPairing;
}
}
// Sort pairings from best to worst association
usort($beerPairings, function ($item1, $item2) {
return $item1['value'] <= $item2['value'];
});
$beerColor = null;
if ($beer->getBeerColor() !== null) {
$beerColor = [
'id' => $beer->getBeerColor()->getId(),
'name' => $this->getTranslation($beer->getBeerColor()->getBeerColorTranslations())->getName(),
];
}
$document = $this->serializeService->serializeDocument($beer->getImage(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
return [
'id' => $beer->getId(),
'type' => 'BEER',
'name' => $this->getTranslation($beerTranslations)->getName(),
'category' => $this->getTranslation($beer->getBeerCategory()->getBeerCategoryTranslations())->getName(),
'color' => $beerColor,
'description' => $this->getTranslation($beerTranslations)->getDescription(),
'review' => $this->getTranslation($beerTranslations)->getReview(),
'reviewFile' => $this->serializeService->serializeDocument($beer->getReviewFile()),
'image' => $document,
'prices' => $beerPrices,
'labels' => $labels,
'beerPairings' => $beerPairings,
];
}
}
/**
* @param Drink|null $drink
* @param string $language
* @return array|null
*/
public function serializeDrink(?Drink $drink, ?string $language)
{
if (!$drink) {
return null;
}
// Set the language
$this->setLanguage($language);
if ($drink->isActive() && $this->appLanguage) {
$drinkTranslations = $drink->getDrinkTranslations();
$labels = [];
foreach ($drink->getLabels() as $label) {
$labels[] = $this->serializeLabel($label);
}
$drinkPrices = [];
foreach ($drink->getDrinkPrices() as $drinkPrice) {
$drinkPrices[] = $this->serializeService->serializeDrinkPrice($drinkPrice);
}
$document = $this->serializeService->serializeDocument($drink->getImage(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
return [
'id' => $drink->getId(),
'type' => 'DRINK',
'name' => $this->getTranslation($drinkTranslations)->getName(),
'category' => $this->getTranslation($drink->getDrinkCategory()->getDrinkCategoryTranslations())->getName(),
'description' => $this->getTranslation($drinkTranslations)->getDescription(),
'image' => $document,
'active' => $drink->isActive(),
'prices' => $drinkPrices,
'labels' => $labels,
];
}
}
/**
* @param Menu|null $menu
* @param string $language
* @return array|null
*/
public function serializeMenu(?Menu $menu, ?string $language)
{
if (!$menu) {
return null;
}
// Set the language
$this->setLanguage($language);
$menuInnerCategories = [];
foreach ($menu->getInnerCategories() as $innerCategory) {
$serializedMenuInnerCategory = $this->serializeMenuInnerCategory($innerCategory);
if (count($serializedMenuInnerCategory['data']) > 0) {
$menuInnerCategories[] = $serializedMenuInnerCategory;
}
}
$document = $this->serializeService->serializeDocument($menu->getImage(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
$verifiedReducedPrice = Tools::getVerifiedReducedPrice(
$menu->getReducedPrice(),
$menu->getReducedPriceStart(),
$menu->getReducedPriceEnd()
);
if ($menu->isActive() && $this->appLanguage) {
$menuTranslations = $menu->getMenuTranslations();
return [
'id' => $menu->getId(),
'type' => "MENU",
'name' => $this->getTranslation($menuTranslations)->getName(),
'description' => $this->getTranslation($menuTranslations)->getDescription(),
'price' => (!is_null($menu->getSellingPriceTtc()) ? $menu->getSellingPriceTtc() . '€' : null),
'reducedPrice' => (!is_null($verifiedReducedPrice) ? $verifiedReducedPrice . '€' : null),
'products' => $menuInnerCategories,
'image' => $document,
];
}
}
/**
* @param Institution|null $institution
* @return array|null
*/
public function serializeInstitution(?Institution $institution)
{
if (!$institution) {
return null;
}
$openingHours = [];
foreach ($institution->getOpeningHours() as $openingHour) {
$openingHours[] = $this->serializeService->serializeInstitutionOpeningHour($openingHour);
}
$document = $this->serializeService->serializeDocument($institution->getLogo(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
$gallery = [];
foreach ($institution->getGallery() as $galleryImage) {
$serializedGalleryImage = $this->serializeService->serializeDocument($galleryImage, true, [
['width' => 1000, 'height' => 1000],
]);
$serializedGalleryImage['src'] = strstr($serializedGalleryImage['thumbnails']['1000_1000'], '/media');
$gallery[] = $serializedGalleryImage;
}
return [
'id' => $institution->getId(),
'name' => $institution->getName(),
'url' => $institution->getUrl(),
'phone' => $institution->getPhone(),
'logo' => $document,
'facebook' => $institution->getFacebook(),
'instagram' => $institution->getInstagram(),
'description' => $institution->getDescription(),
'openingHours' => $openingHours,
'gallery' => $gallery,
];
}
/**
* @param Institution|null $institution
* @param string $language
* @return array|null
*/
public function serializeInstitutionOverview(?Institution $institution, ?string $language)
{
if (!$institution) {
return null;
}
// Set the language
$this->setLanguage($language);
if ($this->appLanguage) {
// Array of every products of the institution (dishes, wines, drinks, menus)
$products = [];
$sectionId = -1;
// Gather every products (dish, wine, beer, drink and menu) into one and only array
$productCategories = [];
// Only add non empty categories
foreach ($institution->getDishCategories() as $dishCategory) {
if (count($dishCategory->getDishes()) > 0) {
$productCategories[] = $dishCategory;
}
}
foreach ($institution->getWineCategories() as $wineCategory) {
if (count($wineCategory->getWines()) > 0) {
$productCategories[] = $wineCategory;
}
}
foreach ($institution->getBeerCategories() as $beerCategory) {
if (count($beerCategory->getBeers()) > 0) {
$productCategories[] = $beerCategory;
}
}
foreach ($institution->getDrinkCategories() as $drinkCategory) {
if (count($drinkCategory->getDrinks()) > 0) {
$productCategories[] = $drinkCategory;
}
}
foreach ($institution->getMenuCategories() as $menuCategory) {
if (count($menuCategory->getMenus()) > 0) {
$productCategories[] = $menuCategory;
}
}
// Retrieves products category positions
$productCategoryPositions = $institution->getProductCategoryPositions();
// Function that retrieves the position of a product category (based on its type)
// (N.B. position 0 is weirdly put at the end... + 1 to each of them easily solves the matter)
$getProductCategoryPosition = function($productCategory) use ($productCategoryPositions) {
switch ($productCategory) {
case ($productCategory instanceof DishCategory):
foreach($productCategoryPositions as $productCategoryPosition) {
if ('DISH-CATEGORY-' . $productCategory->getId() == $productCategoryPosition->getProductCategory()) {
return $productCategoryPosition->getPosition() + 1;
}
}
return null;
case ($productCategory instanceof WineCategory):
foreach($productCategoryPositions as $productCategoryPosition) {
if ('WINE-CATEGORY-' . $productCategory->getId() == $productCategoryPosition->getProductCategory()) {
return $productCategoryPosition->getPosition() + 1;
}
}
return null;
case ($productCategory instanceof BeerCategory):
foreach($productCategoryPositions as $productCategoryPosition) {
if ('BEER-CATEGORY-' . $productCategory->getId() == $productCategoryPosition->getProductCategory()) {
return $productCategoryPosition->getPosition() + 1;
}
}
return null;
case ($productCategory instanceof DrinkCategory):
foreach($productCategoryPositions as $productCategoryPosition) {
if ('DRINK-CATEGORY-' . $productCategory->getId() == $productCategoryPosition->getProductCategory()) {
return $productCategoryPosition->getPosition() + 1;
}
}
return null;
case ($productCategory instanceof MenuCategory):
foreach($productCategoryPositions as $productCategoryPosition) {
if ('MENU-CATEGORY-' . $productCategory->getId() == $productCategoryPosition->getProductCategory()) {
return $productCategoryPosition->getPosition() + 1;
}
}
return null;
}
};
// Sorting function (each categories do not necessarely have a position)
$sortByProductCategoryPosition = function ($a, $b) use ($getProductCategoryPosition) {
$aPos = $getProductCategoryPosition($a);
$bPos = $getProductCategoryPosition($b);
if ($aPos && $bPos) {
return $aPos - $bPos;
} else if ($aPos && $bPos == null) {
return -1;
} else if ($aPos == null && $bPos) {
return 1;
} else {
return 0;
}
};
usort($productCategories, $sortByProductCategoryPosition);
// Function that retrieves the name of the product category (based on its type)
function getProductCategoryName($productCategory, $globalContext) {
switch ($productCategory) {
case ($productCategory instanceof DishCategory):
return $globalContext->getTranslation($productCategory->getDishCategoryTranslations())->getName();
case ($productCategory instanceof WineCategory):
return $globalContext->getTranslation($productCategory->getWineCategoryTranslations())->getName();
case ($productCategory instanceof BeerCategory):
return $globalContext->getTranslation($productCategory->getBeerCategoryTranslations())->getName();
case ($productCategory instanceof DrinkCategory):
return $globalContext->getTranslation($productCategory->getDrinkCategoryTranslations())->getName();
case ($productCategory instanceof MenuCategory):
return $globalContext->getTranslation($productCategory->getMenuCategoryTranslations())->getName();
}
}
$imageOnEachHighlightedProduct = true;
$serializedHighlightedProducts = [];
foreach ($productCategories as $productCategory) {
$serializedProducts = [];
$capacities = [];
$sectionId++;
switch ($productCategory) {
case ($productCategory instanceof DishCategory):
foreach ($productCategory->getDishes() as $dish) {
$serializedProduct = $this->serializeDish($dish, $language);
if (!is_null($serializedProduct)) {
$serializedProduct['sectionId'] = $sectionId;
$serializedProducts[] = $serializedProduct;
if ($dish->getHighlight()) {
$serializedProduct['type'] = "OFFER-DISH";
$serializedHighlightedProducts[] = $serializedProduct;
if (!isset($serializedProduct['image']) || is_null($serializedProduct['image']['id'])) {
$imageOnEachHighlightedProduct = false;
}
}
}
}
break;
case ($productCategory instanceof WineCategory):
foreach ($productCategory->getWines() as $wine) {
foreach ($wine->getWinePrices() as $winePrice) {
$capacity = $winePrice->getCapacity();
if (!is_null($capacity)) {
if (!isset($capacities[$capacity->getId()])) {
$capacities[$capacity->getId()] = $capacity->getName();
}
}
}
$serializedProduct = $this->serializeWine($wine, $language);
if (!is_null($serializedProduct)) {
$serializedProduct['sectionId'] = $sectionId;
$serializedProducts[] = $serializedProduct;
if ($wine->getHighlight()) {
$serializedProduct['type'] = "OFFER-WINE";
$serializedHighlightedProducts[] = $serializedProduct;
if (!isset($serializedProduct['image']) || is_null($serializedProduct['image']['id'])) {
$imageOnEachHighlightedProduct = false;
}
}
}
}
break;
case ($productCategory instanceof BeerCategory):
foreach ($productCategory->getBeers() as $beer) {
foreach ($beer->getBeerPrices() as $beerPrice) {
$capacity = $beerPrice->getCapacity();
if (!is_null($capacity)) {
if (!isset($capacities[$capacity->getId()])) {
$capacities[$capacity->getId()] = $capacity->getName();
}
}
}
$serializedProduct = $this->serializeBeer($beer, $language);
if (!is_null($serializedProduct)) {
$serializedProduct['sectionId'] = $sectionId;
$serializedProducts[] = $serializedProduct;
if ($beer->getHighlight()) {
$serializedProduct['type'] = "OFFER-BEER";
$serializedHighlightedProducts[] = $serializedProduct;
if (!isset($serializedProduct['image']) || is_null($serializedProduct['image']['id'])) {
$imageOnEachHighlightedProduct = false;
}
}
}
}
break;
case ($productCategory instanceof DrinkCategory):
foreach ($productCategory->getDrinks() as $drink) {
foreach ($drink->getDrinkPrices() as $drinkPrice) {
$capacity = $drinkPrice->getCapacity();
if (!is_null($capacity)) {
if (!isset($capacities[$capacity->getId()])) {
$capacities[$capacity->getId()] = $capacity->getName();
}
}
}
$serializedProduct = $this->serializeDrink($drink, $language);
if (!is_null($serializedProduct)) {
$serializedProduct['sectionId'] = $sectionId;
$serializedProducts[] = $serializedProduct;
if ($drink->getHighlight()) {
$serializedProduct['type'] = "OFFER-DRINK";
$serializedHighlightedProducts[] = $serializedProduct;
if (!isset($serializedProduct['image']) || is_null($serializedProduct['image']['id'])) {
$imageOnEachHighlightedProduct = false;
}
}
}
}
break;
case ($productCategory instanceof MenuCategory):
foreach ($productCategory->getMenus() as $menu) {
$serializedProduct = $this->serializeMenuOverview($menu);
if (!is_null($serializedProduct)) {
$serializedProduct['sectionId'] = $sectionId;
$serializedProducts[] = $serializedProduct;
if ($menu->getHighlight()) {
$serializedProduct['type'] = "OFFER-MENU";
$serializedHighlightedProducts[] = $serializedProduct;
if (!isset($serializedProduct['image']) || is_null($serializedProduct['image']['id'])) {
$imageOnEachHighlightedProduct = false;
}
}
}
}
break;
}
// Check if the serializedProducts is not empty before adding anything (each product can be deactivated)
if (count($serializedProducts) > 0) {
$product = [
'id' => $sectionId,
'type' => 'SECTION',
'name' => getProductCategoryName($productCategory, $this),
];
if (count($capacities) > 0) {
$product['capacities'] = $capacities;
}
$products[] = $product;
array_push($products, ...$serializedProducts);
} else {
$sectionId--;
}
}
if (count($serializedHighlightedProducts) > 0) {
// Increments sections id (only when the institution has highlighted products)
foreach($products as $key => $product){
$products[$key]['type'] == 'SECTION' ? $products[$key]['id']++ : $products[$key]['sectionId']++;
}
// Different display depending on whether all the items have an image attached or not
// Therefore, different data construction to avoid unecessary processing in the app
if ($imageOnEachHighlightedProduct) {
array_unshift($products, [
'id' => 0,
'type' => "OFFERS",
'sectionId' => 0,
'items' => $serializedHighlightedProducts,
]);
} else {
for ($i = (count($serializedHighlightedProducts) - 1); $i >= 0; $i--) {
$serializedHighlightedProducts[$i]['sectionId'] = 0;
array_unshift($products, $serializedHighlightedProducts[$i]);
}
}
array_unshift($products, [
'id' => 0,
'type' => 'SECTION',
'name' => 'Offres du jour',
]);
}
$document = $this->serializeService->serializeDocument($institution->getLogo(), true, [
['width' => 1000, 'height' => 1000],
]);
$document['src'] = strstr($document['thumbnails']['1000_1000'], '/media');
// Allergens
$institutionAllergens = [];
$allergens = $this->em->getRepository(Allergen::class)->findBy([], ['id' => 'ASC']);
foreach ($allergens as $allergen) {
$institutionAllergens[] = $this->serializeAllergen($allergen);
}
// Languages
$languages = [];
$localeFronts = $this->em->getRepository(LocaleFront::class)->findBy([], ['originalName' => 'ASC']);
$institutionLocaleFronts = $institution->getInstitutionLocaleFronts();
foreach ($localeFronts as $localeFront) {
$languages[] = $this->serializeLanguage($localeFront, $institutionLocaleFronts);
}
//functionalities
$functionalities = [];
$currentSubscription = $institution->getUser()->getCurrentSubscription();
//check if user got free trial premium sub
$isFreePremiumTrialValid = false;
foreach ($institution->getUser()->getUserSubscriptions() as $subscription) {
if ($subscription->isFree() && $subscription->getFinishedAt() > new \DateTime()) {
$isFreePremiumTrialValid = true;
}
}
//if user still has free premium trial valid : get premium subscription functionalities
if ($isFreePremiumTrialValid) {
$freeSubscription = $this->em->getRepository(Subscription::class)->findOneBy(['constName' => 'ADVANCED']);
if ($freeSubscription) {
$functionalities = $freeSubscription->getFunctionalities();
}
}
//else get current subscription functionalities
else if ($currentSubscription && $currentSubscription->isValid()) {
$functionalities = $currentSubscription->getSubscription()->getFunctionalities();
}
return [
'id' => $institution->getId(),
'name' => $institution->getName(),
'logo' => $document,
'description' => $institution->getDescription(),
'products' => $products,
'allergens' => $institutionAllergens,
'languages' => $languages,
'functionalities' => $functionalities,
];
}
}
/**
* @param Institution|null $institution
* @return array|null
*/
public function serializeSupportedDataLanguages(Institution $institution)
{
$languages = [];
$localeFronts = $this->em->getRepository(LocaleFront::class)->findBy([], ['originalName' => 'ASC']);
$institutionLocaleFronts = $institution->getInstitutionLocaleFronts();
foreach ($localeFronts as $localeFront) {
$languages[] = $this->serializeLanguage($localeFront, $institutionLocaleFronts);
}
return $languages;
}
/**
* @param Institution|null $institution
* @return array|null
*/
public function serializeFunctionalities(Institution $institution)
{
$functionalities = [];
$currentSubscription = $institution->getUser()->getCurrentSubscription();
//check if user got free trial premium sub
$isFreePremiumTrialValid = false;
foreach ($institution->getUser()->getUserSubscriptions() as $subscription) {
if ($subscription->isFree() && $subscription->getFinishedAt() > new \DateTime()) {
$isFreePremiumTrialValid = true;
}
}
//if user still has free premium trial valid : get premium subscription functionalities
if ($isFreePremiumTrialValid) {
$freeSubscription = $this->em->getRepository(Subscription::class)->findOneBy(['constName' => 'ADVANCED']);
if ($freeSubscription) {
$functionalities = $freeSubscription->getFunctionalities();
}
}
//else get current subscription functionalities
else if ($currentSubscription && $currentSubscription->isValid()) {
$functionalities = $currentSubscription->getSubscription()->getFunctionalities();
}
return $functionalities;
}
/**
* @param Institution|null $institution
* @return array|null
*/
public function serializeInstitutionPersonalization(?Institution $institution)
{
if (!$institution) {
return null;
}
$institutionAppPersonalization = $institution->getInstitutionAppPersonalization();
if (!$institutionAppPersonalization) {
return null;
}
return [
'id' => $institutionAppPersonalization->getId(),
'primaryColor' => $institutionAppPersonalization->getPrimaryColor(),
'primaryVariantColor' => $institutionAppPersonalization->getPrimaryVariantColor(),
'textOverPrimaryColor' => $institutionAppPersonalization->getTextOverPrimaryColor(),
];
}
/**
* @param Allergen|null $allergen
* @return array|null
*/
public function serializeAllergen(?Allergen $allergen)
{
return [
'id' => $allergen->getId(),
'name' => $this->getTranslation($allergen->getAllergenTranslations())->getName(),
];
}
/**
* @param Label|null $label
* @return array|null
*/
public function serializeLabel(?Label $label)
{
return [
'id' => $label->getId(),
'name' => $this->getTranslation($label->getLabelTranslations())->getName(),
];
}
/**
* @param Grape|null $grape
* @return array|null
*/
public function serializeGrape(?Grape $grape)
{
if (!$grape) {
return null;
}
return [
'id' => $grape->getId(),
'name' => $this->getTranslation($grape->getGrapeTranslations())->getName(),
];
}
/**
* @param WinePairing $winePairing
* @param bool|null $dish
* @param bool|null $wine
* @param bool|null $language
* @return array|null
*/
public function serializeWinePairing(WinePairing $winePairing, ?bool $dish, ?bool $wine, ?string $language)
{
if (!$winePairing) {
return null;
}
// Set the language if not already defined
if ($this->appLanguage == null) {
$this->setLanguage($language);
}
if ($this->appLanguage) {
$pairing = [
'id' => $winePairing->getId(),
'value' => $winePairing->getValue(),
];
if (!is_null($dish) && $dish) {
$dish = $this->em->getRepository(Dish::class)->find($winePairing->getDish()->getId());
if ($dish && $dish->isActive()) {
$pairing['dish'] = $this->serializeDishOverview($dish);
}
else $pairing = null;
}
if (!is_null($wine) && $wine) {
$wine = $this->em->getRepository(Wine::class)->find($winePairing->getWine()->getId());
if ($wine && $wine->isActive()) {
$pairing['wine'] = $this->serializeWineOverview($wine);
}
else $pairing = null;
}
return $pairing;
}
}
/**
* @param BeerPairing $beerPairing
* @param bool|null $dish
* @param bool|null $beer
* @param bool|null $language
* @return array|null
*/
public function serializeBeerPairing(BeerPairing $beerPairing, ?bool $dish, ?bool $beer, ?string $language)
{
if (!$beerPairing) {
return null;
}
// Set the language if not already defined
if ($this->appLanguage == null) {
$this->setLanguage($language);
}
if ($this->appLanguage) {
$pairing = [
'id' => $beerPairing->getId(),
'value' => $beerPairing->getValue(),
];
if (!is_null($dish) && $dish) {
$dish = $this->em->getRepository(Dish::class)->find($beerPairing->getDish()->getId());
if ($dish && $dish->isActive()) {
$pairing['dish'] = $this->serializeDishOverview($dish);
}
else $pairing = null;
}
if (!is_null($beer) && $beer) {
$beer = $this->em->getRepository(Beer::class)->find($beerPairing->getBeer()->getId());
if ($beer && $beer->isActive()) {
$pairing['beer'] = $this->serializeBeerOverview($beer);
}
else $pairing = null;
}
return $pairing;
}
}
/**
* @param InstitutionReview|null $institutionReview
* @return array|null
*/
public function serializeInstitutionReview(InstitutionReview $institutionReview)
{
if (!$institutionReview) {
return null;
}
return [
'id' => $institutionReview->getId(),
'institutionId' => $institutionReview->getInstitution()->getId(),
'userAppId' => $institutionReview->getUserAppId(),
'rating' => $institutionReview->getRating(),
'comments' => $institutionReview->getComments(),
'date' => $institutionReview->getDate(),
];
}
/**
* @param ContestPrize|null $prize
* @return array|null
*/
public function serializePrize(?ContestPrize $prize)
{
if (!$prize) {
return null;
}
return [
'id' => $prize->getId(),
'name' => $prize->getName(),
'ticketNumber' => $prize->getTicketNumber(),
'value' => $prize->getValue()
];
}
/**
* @param ContestCompany|null $company
* @return array|null
*/
public function serializeCompany(?ContestCompany $company)
{
if (!$company) {
return null;
}
return [
'id' => $company->getId(),
'status' => $company->getStatus(),
'name' => $company->getName(),
'shareCapital' => $company->getShareCapital(),
'siren' => $company->getSiren(),
'registerCity' => $company->getRegisterCity(),
'address' => $company->getAddress(),
'postalCode' => $company->getPostalCode(),
'city' => $company->getCity(),
'country' => $company->getCountry()
];
}
/**
* @param Contest|null $contest
* @return array|null
*/
public function serializeContest(?Contest $contest)
{
if (!$contest) {
return null;
}
$prizes = [];
foreach ($contest->getContestPrizes() as $prize) {
$prizes[] = $this->serializePrize($prize);
}
return [
'id' => $contest->getId(),
'startDate' => $contest->getStartDate()->getTimestamp(),
'endDate' => $contest->getEndDate()->getTimestamp(),
'startTime' => $contest->getStartTime()->getTimestamp(),
'endTime' => $contest->getEndTime()->getTimestamp(),
'expirationDate' => $contest->getExpirationDate()->getTimestamp(),
'entryLimitTime' => $contest->getEntryLimitTime(),
'prizes' => $prizes,
'automaticDistribution' => $contest->getAutomaticDistribution(),
'company' => $this->serializeCompany($contest->getContestCompany())
];
}
/**
* @param ContestTicket|null $contestTicket
* @return array|null
*/
public function serializeTicket(?ContestTicket $contestTicket)
{
if (!$contestTicket) {
return null;
}
$now = new \DateTime('now');
$expirationDate = $contestTicket->getContest()->getExpirationDate();
if ($now > $expirationDate) {
$isExpired = true;
}
else {
$isExpired = false;
}
return [
'id' => $contestTicket->getId(),
'hash' => $contestTicket->getHash(),
'isClaimed' => $contestTicket->getIsClaimed(),
'wonAt' => $contestTicket->getWonAt() ? $contestTicket->getWonAt()->getTimestamp() : null,
'claimedAt' => $contestTicket->getClaimedAt() ? $contestTicket->getClaimedAt()->getTimestamp() : null,
'expirationDate' => $contestTicket->getContest()->getExpirationDate()->getTimestamp(),
'isExpired' => $isExpired,
'prize' => $contestTicket->getContestPrize()->getName(),
'description' => $contestTicket->getContestPrize()->getDescription(),
'value' => $contestTicket->getContestPrize()->getValue(),
'userAppId' => $contestTicket->getUserAppId(),
'contestId' => $contestTicket->getContest()->getId(),
'institutionId' => $contestTicket->getContest()->getInstitution()->getId(),
];
}
}