<?php
namespace App\Controller;
use App\Entity\AlgoliaReindexRequest;
use App\Entity\CarteCadeau;
use App\Entity\Devise;
use App\Entity\Genres;
use App\Entity\GiftCreditsPromoCode;
use App\Entity\GiftMembership;
use App\Entity\GiftProduct;
use App\Entity\Produit;
use App\Entity\ProduitPrix;
use App\Entity\Promotion;
use App\Entity\Tier;
use App\Entity\Transaction;
use App\Entity\User;
use App\Entity\UserProduits;
use App\Entity\UserPromotions;
use App\Entity\UserWishlists;
use App\Service\FileService;
use App\Service\HookManager;
use App\Service\MailService;
use App\Service\StringManager;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Dompdf\Dompdf;
use Dompdf\Options;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
use GuzzleHttp\Client as ApiClient;
use Psr\Log\LoggerInterface;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
use Algolia\SearchBundle\SearchService;
class ApiController extends AbstractController
{
const TOKEN_VALIDITY_DURATION = 12 * 3600;
public $domain = 'https://bookdoreille.b-cdn.net/';
/**
* @var HookManager
*/
private $hookManager;
private $logger;
protected $searchService;
public function __construct(
EntityManagerInterface $em,
FileService $file_service,
UserPasswordHasherInterface $encoder,
MailService $mail_service,
ContainerBagInterface $container,
HookManager $hookManager,
LoggerInterface $logger,
SearchService $searchService
)
{
$this->em = $em;
$this->file_service = $file_service;
$this->encoder = $encoder;
$this->mail_service = $mail_service;
$this->params = array();
$this->container = $container;
$this->hookManager = $hookManager;
$this->logger = $logger;
$this->searchService = $searchService;
}
/**
* @Route("/api/profil/update", name="api_update_profil")
*/
public function update_profil(Request $request): JsonResponse
{
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if ($userToken != null && (time() - $userToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION) {
try {
$user = $userToken->getUser();
$user->setNom($request->request->get('nom'))
->setPrenom($request->request->get('prenom'))
->setRaisonSociale($request->request->get('raison_sociale'))
->setAdressePostale($request->request->get('adresse_postale'))
->setCodePostal($request->request->get('code_postal'))
->setVille($request->request->get('ville'))
->setPays($request->request->get('pays'))
->setOptinNouveautes($request->request->get('newsletter'));
$this->em->persist($user);
$this->em->flush();
} catch (Exception $e) {
return new JsonResponse(array("error" => "Une erreur s'est produite: " . $e->getMessage()));
}
return new JsonResponse(array('success' => true));
}
return new JsonResponse(array("error" => "Une erreur s'est produite, veuillez vous relogger"));
}
/**
* @Route("/api/get_zip_token", name="api_get_zip_token")
*/
public function get_zip_token(Request $request): JsonResponse
{
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if ($userToken != null && (time() - $userToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION) {
}
return new JsonResponse(array('error' => "Erreur - veuillez vous relogger"));
}
/**
* @Route("/api/register", name="api_register")
*/
public function register(Request $request): JsonResponse
{
if ($request->request->get('password') != null && $request->request->get('email') != null) {
try {
$existing_user = $this->em->getRepository('App:User')->findOneBy(array('email' => $request->request->get('email')));
if ($existing_user == null) {
$password = $request->request->get('password');
$user = new User;
$user->setPrenom($request->request->get('prenom'))
->setNom($request->request->get('nom'))
->setEmail($request->request->get('email'))
->setDateCreated(new \DateTime())
->setUsername($user->getEmail())
->setRole('user');
$this->em->persist($user);
$encodedPassword = $this->encoder->hashPassword($user, $password);
$user->setPassword($encodedPassword);
$this->em->persist($user);
$this->em->flush();
$this->validateAndAssignGiftCards($request->request->get('email'), $user);
$this->validateAndAssignGiftProducts($request->request->get('email'), $user);
if ($request->request->get('isCa') == 1) {
$bytes = random_bytes(16);
$memberstack_password = bin2hex($bytes);
$user->setCodeAbo($memberstack_password);
$this->em->persist($user);
if ($this->container->get('parameter_bag')->get('app.env') == "dev") {
$api_key = "pk_sb_2fa87d3fadccd90794ac";
} else {
$api_key = "pk_baa2568b3eae41eb6fa0";
}
$client = new ApiClient([
'headers' => ['Content-Type' => 'application/json', 'x-api-key' => $api_key]
]);
try {
$response = $client->post(
'https://client.memberstack.com/auth/signup',
['body' => json_encode(
[
'email' => $user->getEmail(),
'password' => $memberstack_password,
'plans' => []
]
)]
);
} catch (Exception $e) {
return new JsonResponse(array('success' => false, 'error' => 'Compte crée, mais création memberstack échouée ' . $e->getMessage()));
}
$this->em->flush();
} else {
$this->hookManager->hookCreateUser($user);
}
return new JsonResponse(array('success' => true));
} else {
return new JsonResponse(array('success' => false, 'error' => 'Un compte avec cet email existe déjà '));
}
} catch (Exception $e) {
return new JsonResponse(array('success' => false, 'error' => 'Une erreur est survenue'));
}
}
return new JsonResponse(array('success' => false, 'error' => 'Paramètres email ou mot de passe manquant'));
}
private function validateAndAssignGiftCards($email, $user): void
{
if ($email && $user) {
$giftCards = $this->em->getRepository(CarteCadeau::class)->getUsersCardsNotRegistered($email);
foreach ($giftCards as $giftCard) {
$giftCard = $this->em->getRepository(CarteCadeau::class)->find($giftCard["id"]);
if ($giftCard) {
$destinatairesTemp = json_decode($giftCard->getDestinatairesTemp(), true);
$currentDate = new DateTime();
if (!empty($destinatairesTemp['date_reception']) && !empty($destinatairesTemp['email'])) {
$dateReception = DateTime::createFromFormat('d/m/Y', $destinatairesTemp['date_reception']);
if ($dateReception < $currentDate) {
$giftCard->setUtilisateurDestinataire($user);
$giftCard->setEtat("valide");
$this->em->persist($giftCard);
}
}
}
}
$this->em->flush();
}
}
private function validateAndAssignGiftProducts($email, $user): void
{
if ($email && $user) {
$unassignedGiftProducts = $this->em->getRepository('App:GiftProduct')->findBy(['redeemed' => false, 'validated' => true]);
for ($i = 0; $i < count($unassignedGiftProducts); $i++) {
if ($unassignedGiftProducts[$i]->getRecipientEmail() === $email) {
$unassignedGiftProducts[$i]->setRecipient($user);
$this->em->persist($unassignedGiftProducts[$i]);
$this->createUserProduct($user, $unassignedGiftProducts[$i]->getProduct());
}
}
$this->em->flush();
}
}
private function createUserProduct($user, $product): void
{
if ($user && $product) {
$userProduct = new UserProduits();
$userProduct
->setUser($user)
->setProduit($product)
->setDateActivation(new \DateTime);
$this->em->persist($userProduct);
$productsWishlist = $this->em->getRepository('App:UserWishlists')->findOneBy(array('produit' => $product, 'user' => $user));
if ($productsWishlist != null) {
$this->em->remove($productsWishlist);
}
$this->em->flush();
}
}
/**
* @Route("/api/password_forgot", name="api_password_forgot")
*/
public function api_password_forgot(Request $request): JsonResponse
{
if ($request->request->get('email') != null) {
$test = $this->em->getRepository('App:User')->findOneBy(array('email' => $request->request->get('email')));
if ($test == false) {
return new JsonResponse(array('success' => false, 'error' => "L'email ne correspond à aucun compte"));
} else {
$token = uniqid() . hash('md5', $test->getEmail());
$test->setTokenReset($token);
$this->em->persist($test);
$this->em->flush();
//return new JsonResponse(array('success' => true, 'token_password' => $token));
$destinataire = $test->getEmail();
$content = $this->renderView(
'Mail/password_retrieve.html.twig',
array(
'token' => $token
)
);
//$content = $this->render('Mail/validation_commande.html.twig');
$subject = "Récupération de mot de passe Book d'Oreille";
try {
$tt = $this->mail_service->sendTransacEmail($destinataire, $content, $subject);
return new JsonResponse(array('success' => true, 'error' => "Un email de récupération a été envoyé"));
} catch (Exception $e) {
return new JsonResponse(array('success' => false, 'error' => "Une erreur est survenue"));
}
}
}
return new JsonResponse(array('success' => false, 'error' => "Merci de préciser l'email du compte"));
}
/**
* @Route("/api/password_change", name="api_password_change")
*/
public function api_password_change(Request $request): JsonResponse
{
if ($request->request->get('token_password') != null && $request->request->get('password') != null) {
$user = $this->em->getRepository("App:User")->findOneBy(array('token_reset' => $request->request->get('token_password')));
$encodedPassword = $this->encoder->hashPassword($user, $request->request->get('password'));
$user->setTokenReset(null)
->setPassword($encodedPassword);
$this->em->persist($user);
$this->em->flush();
return new JsonResponse(array('success' => true, 'error' => 'Mot de passe modifié'));
}
return new JsonResponse(array('success' => false, 'error' => 'Des paramètres sont manquants'));
}
/**
* @Route("/api/categories-narra", name="api_get_categories_narra")
*/
public function api_get_categories_narra(Request $request): JsonResponse
{
return new JsonResponse($this->em->getRepository(Produit::class)->countCategorieNarra());
}
/**
* @Route("/api/password_token", name="api_password_token")
*/
public function api_password_token(Request $request): JsonResponse
{
if ($request->request->get('email') != null) {
$test = $this->em->getRepository(User::class)->findOneBy(array('email' => $request->request->get('email')));
if ($test == false) {
return new JsonResponse(array('success' => false, 'error' => "L'email ne correspond à aucun compte"));
} else {
$token = uniqid() . hash('md5', $test->getEmail());
$test->setTokenReset($token);
$this->em->persist($test);
$this->em->flush();
return new JsonResponse(array('success' => true, 'token' => $token));
}
}
return new JsonResponse(array('success' => false, 'error' => "Merci de préciser l'email du compte"));
}
/**
* @Route("/api/password_validation", name="api_password_validation")
*/
public function api_password_validation(Request $request): JsonResponse
{
if ($request->request->get('token_password') != null && $request->request->get('password') != null && $request->request->get('site') == "narra") {
$user = $this->em->getRepository(User::class)->findOneBy(array('token_reset' => $request->request->get('token_password')));
$encodedPassword = $this->encoder->hashPassword($user, $request->request->get('password'));
$user->setTokenReset(null)
->setPassword($encodedPassword);
$this->em->persist($user);
$this->em->flush();
return new JsonResponse(array('success' => true, 'error' => 'Mot de passe modifié'));
}
return new JsonResponse(array('success' => false, 'error' => 'Des paramètres sont manquants ou erronés'));
}
/**
* @Route("/api/contenus", name="api_get_contenus")
*/
public function getApiContenus(Request $request): JsonResponse
{
$results = array();
$first_date = $request->query->get('first_date');
$end_date = $request->query->get('end_date');
$date_debut = false;
$date_fin = false;
if ($first_date != null) {
$date_debut = date_create_from_format('Y-m-d', $first_date);
}
if ($end_date != null) {
$date_fin = date_create_from_format('Y-m-d', $end_date);
}
$prixlitteraires = $this->em->getRepository('App:PrixLitteraire')->getAll($date_debut, $date_fin);
$array_object = array();
foreach ($prixlitteraires as $object) {
$tmp = array(
'obj_id' => $object->getId(),
'nom_prix' => $object->getLibelleFr(),
'description' => $object->getDescriptionFr()
);
array_push($array_object, $tmp);
}
$results['prixlitteraires'] = $array_object;
$categories = $this->em->getRepository('App:GroupeGenres')->findAll();
$array_object = array();
foreach ($categories as $object) {
$tmp = array(
'obj_id' => $object->getId(),
'nom_genre' => $object->getLibelleFr()
);
array_push($array_object, $tmp);
}
$results['categories'] = $array_object;
$genres = $this->em->getRepository('App:Genres')->getAll($date_debut, $date_fin);
$array_object = array();
foreach ($genres as $object) {
$tmp = array(
'obj_id' => $object->getId(),
'nom_genre' => $object->getLibelleFr(),
'description' => $object->getDescriptionFr(),
'parent' => ($object->getGroupe() != null) ? $object->getGroupe()->getId() : null
);
array_push($array_object, $tmp);
}
$results['genres'] = $array_object;
$sousgenres = $this->em->getRepository('App:SousGenres')->getAll($date_debut, $date_fin);
$array_object = array();
foreach ($sousgenres as $object) {
$tmp = array(
'obj_id' => $object->getId(),
'id_genre' => ($object->getGenre() != null) ? $object->getGenre()->getId() : null,
'nom_genre' => $object->getLibelleFr(),
'description' => $object->getDescriptionFr()
);
array_push($array_object, $tmp);
}
$results['sousgenres'] = $array_object;
$publics = $this->em->getRepository('App:Publics')->getAll($date_debut, $date_fin);
$array_object = array();
foreach ($publics as $object) {
$tmp = array(
'obj_id' => $object->getId(),
'nom_public' => $object->getLibelleFr(),
);
array_push($array_object, $tmp);
}
$results['publics'] = $array_object;
$publics_jeunesse = $this->em->getRepository('App:PublicsJeunesse')->getAll($date_debut, $date_fin);
$array_object = array();
foreach ($publics_jeunesse as $object) {
$tmp = array(
'obj_id' => $object->getId(),
'nom_public_jeunesse' => $object->getLibelleFr(),
);
array_push($array_object, $tmp);
}
$results['publics_jeunesse'] = $array_object;
$themes = $this->em->getRepository('App:Theme')->getAll($date_debut, $date_fin);
$array_object = array();
foreach ($themes as $object) {
$tmp = array(
'obj_id' => $object->getId(),
'nom_theme' => $object->getLibelleFr(),
);
array_push($array_object, $tmp);
}
$results['themes'] = $array_object;
$versions = $this->em->getRepository('App:Version')->getAll($date_debut, $date_fin);
$array_object = array();
foreach ($versions as $object) {
$tmp = array(
'obj_id' => $object->getId(),
'nom_version' => $object->getLibelleFr(),
);
array_push($array_object, $tmp);
}
$results['versions'] = $array_object;
return new JsonResponse($results);
}
/**
* @Route("/api/narrators", name="api_get_narrators")
*/
public function getNarrators(Request $request): JsonResponse
{
$country = $request->query->get('country');
$narrators = $this->em->getRepository(Tier::class)->getNarrators($country);
$arrayNarrators = array();
foreach ($narrators as $narratorData) {
$narrator = $narratorData[0];
$productCount = $narratorData['productCount'];
$tmp = array(
'id' => $narrator->getId(),
'products_count' => $productCount,
'first_name' => $narrator->getPrenom(),
'last_name' => $narrator->getNom(),
'slug' => $narrator->getAlgoliaName()
);
$arrayNarrators[] = $tmp;
}
return new JsonResponse($arrayNarrators);
}
/**
* @Route("/api/tiers/{slug}", name="api_get_tier_by_slug")
*/
public function getTierBySlug($slug): JsonResponse
{
$tier = $this->em->getRepository(Tier::class)->findOneBy(array('algolia_name' => $slug));
$tierNormalized = array(
'id' => $tier->getId(),
'image_name' => $tier->getImageName()
);
return new JsonResponse($tierNormalized);
}
/**
* @Route("/api/authors", name="api_get_authors")
*/
public function getAuthors(Request $request): JsonResponse
{
$country = $request->query->get('country');
$authors = $this->em->getRepository(Tier::class)->getAuthors($country);
$arrayAuthors = array();
foreach ($authors as $authorData) {
$author = $authorData[0];
$productCount = $authorData['productCount'];
$tmp = array(
'id' => $author->getId(),
'products_count' => $productCount,
'first_name' => $author->getPrenom(),
'last_name' => $author->getNom(),
'slug' => $author->getAlgoliaName()
);
$arrayAuthors[] = $tmp;
}
return new JsonResponse($arrayAuthors);
}
/**
* @Route("/api/tiers", name="api_get_tiers")
*/
public function getApiTiers(Request $request): JsonResponse
{
$first_date = $request->query->get('first_date');
$end_date = $request->query->get('end_date');
$date_debut = false;
$date_fin = false;
if ($first_date != null) {
$date_debut = date_create_from_format('Y-m-d', $first_date);
}
if ($end_date != null) {
$date_fin = date_create_from_format('Y-m-d', $end_date);
}
$editeur = $request->query->get('editeur');
$tiers = $this->em->getRepository(Tier::class)->getTiers($date_debut, $date_fin);
$array_tiers = array();
foreach ($tiers as $tier) {
if ($editeur == 1) {
if ($tier->getEditeurProduits()->count() > 0) {
$nbProductCa = $tier->getEditeurProduits()->filter(function (Produit $product) {
return $product->getBoolCad() && $product->getActive();
})->count();
$tmp = array(
'obj_id' => $tier->getId(),
'date_creation' => ($tier->getDateCreation() != null) ? $tier->getDateCreation()->format('c') : null,
'date_modification' => ($tier->getDateUpdate() != null) ? $tier->getDateUpdate()->format('c') : null,
'titre' => $tier->getPrenom() . ' ' . $tier->getNom(),
'description' => $tier->getDescriptionFr(),
'image' => $this->domain . 'contributeurs/' . $tier->getImageName(),
'credit_image' => $tier->getCopyrightImage(),
'nombre_produit' => $tier->getEditeurProduits()->count(),
'nombre_produit_ca' => $nbProductCa,
'algolia_name' => $tier->getAlgoliaName()
);
$array_tiers[] = $tmp;
}
} else {
$tmp = array(
'obj_id' => $tier->getId(),
'date_creation' => ($tier->getDateCreation() != null) ? $tier->getDateCreation()->format('c') : null,
'date_modification' => ($tier->getDateUpdate() != null) ? $tier->getDateUpdate()->format('c') : null,
'titre' => $tier->getPrenom() . ' ' . $tier->getNom(),
'description' => $tier->getDescriptionFr(),
'image' => $this->domain . 'contributeurs/' . $tier->getImageName(),
'credit_image' => $tier->getCopyrightImage(),
'algolia_name' => $tier->getAlgoliaName()
);
$array_tiers[] = $tmp;
}
}
return new JsonResponse($array_tiers);
}
/**
* @Route("/api/tiers/{id}", name="api_get_tiers_detail")
*/
public function getApiTiersDetail(Request $request, $id): JsonResponse
{
$tier = $this->em->getRepository('App:Tier')->find($id);
if ($tier !== null) {
//Id des titres
$titres_id = array();
foreach ($tier->getProduitsArtistes() as $produit) {
array_push($titres_id, array('id' => $produit->getId(), 'type' => 'artiste'));
}
foreach ($tier->getProduitsAuteurs() as $produit) {
array_push($titres_id, array('id' => $produit->getId(), 'type' => 'auteur'));
}
foreach ($tier->getProduitsTraducteurs() as $produit) {
array_push($titres_id, array('id' => $produit->getId(), 'type' => 'traducteur'));
}
foreach ($tier->getProduitsInterpretes() as $produit) {
array_push($titres_id, array('id' => $produit->getId(), 'type' => 'interprete'));
}
foreach ($tier->getProduitsCompositeurs() as $produit) {
array_push($titres_id, array('id' => $produit->getId(), 'type' => 'compositeur'));
}
foreach ($tier->getProduitsIllustrateurs() as $produit) {
array_push($titres_id, array('id' => $produit->getId(), 'type' => 'illustrateur'));
}
foreach ($tier->getProduitsRealisateurs() as $produit) {
array_push($titres_id, array('id' => $produit->getId(), 'type' => 'realisateur'));
}
$tmp = array(
'obj_id' => $tier->getId(),
'date_creation' => ($tier->getDateCreation() != null) ? $tier->getDateCreation()->format('c') : null,
'date_modification' => ($tier->getDateUpdate() != null) ? $tier->getDateUpdate()->format('c') : null,
'titre' => $tier->getPrenom() . ' ' . $tier->getNom(),
'description' => $tier->getDescriptionFr(),
'image' => $this->domain . 'contributeurs/' . $tier->getImageName(),
'credit_image' => $tier->getCopyrightImage(),
'audiobooks' => $titres_id,
);
return new JsonResponse($tmp);
} else {
return new JsonResponse(array('error' => 'not found'));
}
}
/**
* @Route("/api/selections", name="api_get_selections")
*/
public function getApiSelections(Request $request): JsonResponse
{
$first_date = $request->query->get('first_date');
$end_date = $request->query->get('end_date');
$date_debut = false;
$date_fin = false;
if ($first_date != null) {
$date_debut = date_create_from_format('Y-m-d', $first_date);
}
if ($end_date != null) {
$date_fin = date_create_from_format('Y-m-d', $end_date);
}
$selections = $this->em->getRepository('App:Selection')->getApiSelections($date_debut, $date_fin);
$array_selections = array();
foreach ($selections as $selection) {
$titres_id = array();
foreach ($selection->getProduits() as $p) {
array_push($titres_id, $p->getId());
}
$tmp = array(
'date_creation' => ($selection->getDateCreated() != null) ? $selection->getDateCreated()->format('c') : null,
'date_modification' => ($selection->getDateUpdate() != null) ? $selection->getDateUpdate()->format('c') : null,
'titre' => $selection->getLibelleFr(),
'description' => $selection->getDescriptionFr(),
'parent' => ($selection->getParent() != null) ? $selection->getParent()->getLibelleFr() : null,
'audiobooks' => $titres_id,
);
array_push($array_selections, $tmp);
}
return new JsonResponse($array_selections);
}
/**
* @Route("/api/genres", name="api_get_genres")
*/
public function apiGenres(Request $request): JsonResponse
{
$country = $request->query->get('country');
$results = $this->em->getRepository(Genres::class)->getAllGenresWithProductCount('fr', $country);
return new JsonResponse($results);
}
/**
* @Route("/api/audiobooks", name="api_get_audiobooks")
*/
public function apiAudiobooks(Request $request): JsonResponse
{
$first_date = $request->query->get('first_date');
$end_date = $request->query->get('end_date');
$type = $request->query->get('type');
$orderBy = $request->query->get('orderBy');
$country = $request->query->get('country');
$limit = $request->query->get('limit');
$ids = $request->query->get('ids', []);
$genres = $request->query->get('genres', []);
$publisher = $request->query->get('publisher');
$decodedGenres = array_map('urldecode', (array)$genres);
$contributorSlug = $request->query->get('contributorSlug');
$authorSlug = $request->query->get('authorSlug');
$narratorSlug = $request->query->get('narratorSlug');
$date_debut = false;
$date_fin = false;
if ($first_date != null) {
$date_debut = date_create_from_format('Y-m-d', $first_date);
}
if ($end_date != null) {
$date_fin = date_create_from_format('Y-m-d', $end_date);
}
if ($type !== null) {
$produits = $this->em->getRepository(Produit::class)->getProducts(
'fr',
$limit,
0,
$orderBy,
$country,
$type,
$ids,
$decodedGenres,
$publisher,
$contributorSlug,
$authorSlug,
$narratorSlug
);
} else {
$produits = $this->em->getRepository(Produit::class)->getApiAll($date_debut, $date_fin);
}
$results = $this->processProducts($produits, $type, $country);
return new JsonResponse($results);
}
/**
* @Route("/api/audiobooks-urls", name="api_get_audiobooks_urls")
*/
public function apiAudiobooksUrls(Request $request): JsonResponse
{
$country = $request->query->get('country');
$limit = $request->query->get('limit');
$produits = $this->em->getRepository(Produit::class)->getProductsUrls($country, $limit);
$results = [];
foreach ($produits as $p) {
$tmp = array(
'obj_id' => $p['id'],
'alias_url' => $p['alias_url'],
);
$results[] = $tmp;
}
return new JsonResponse($results);
}
/**
* @Route("/api/audiobook/{slug}", name="api_get_audiobook_by_slug")
*/
public function apiAudiobookBySlug($slug): JsonResponse
{
$audiobook = $this->em->getRepository(Produit::class)->findOneBy(array(
'alias_url' => $slug
));
$results = $this->processProducts([$audiobook], '', '');
if (count($results) > 0) {
return new JsonResponse(array('success' => true, 'audiobook' => $results[0]));
} else {
return new JsonResponse(array('error' => true));
}
}
/**
* @Route("/api/audiobooks/{id}", name="api_get_audiobooks_detail")
*/
public function apiAudiobookDetail($id): JsonResponse
{
$book = $this->em->getRepository(Produit::class)->find($id);
if ($book != null) {
$categories = array();
$categories_id = array();
$genres = array();
if ($book->getGenre1() != null) {
if ($book->getGenre1()->getGroupe() != null) {
array_push($categories_id, $book->getGenre1()->getGroupe()->getId());
}
array_push($genres, $book->getGenre1()->getId());
}
if ($book->getGenre2() != null) {
if ($book->getGenre2()->getGroupe() != null) {
array_push($categories_id, $book->getGenre2()->getGroupe()->getId());
}
array_push($genres, $book->getGenre2()->getId());
}
$categories_id = array_unique($categories_id);
foreach ($categories_id as $id) {
$groupegenre = $this->em->getRepository('App:GroupeGenres')->find($id);
array_push($categories, array('id' => $groupegenre->getId()));
}
$sousgenres = array();
if ($book->getSousgenre1() != null) {
array_push($sousgenres, $book->getSousgenre1()->getId());
}
if ($book->getSousgenre2() != null) {
array_push($sousgenres, $book->getSousgenre2()->getId());
}
$themes = array();
foreach ($book->getThemes() as $theme) {
array_push($themes, $theme->getId());
}
$jeunesse = array();
if ($book->getPublics() != null && $book->getPublics()->getId() == 3) {
$jeunesse = array(
'detail_jeunesse' => ($book->getPublicsJeunesse() != null) ? $book->getPublicsJeunesse()->getLibelleFr() : null,
'age_min' => $book->getJeunesseAgeMin(),
'age_max' => $book->getJeunesseAgeMin()
);
}
$auteurs = array();
foreach ($book->getAuteurs() as $tier) {
//if($tier->getActive() == true){
array_push($auteurs, $tier->getId());
//}
}
$interpretes = array();
foreach ($book->getInterpretes() as $tier) {
//if($tier->getActive() == true){
array_push($interpretes, $tier->getId());
//}
}
$traducteurs = array();
foreach ($book->getTraducteurs() as $tier) {
//if($tier->getActive() == true){
array_push($traducteurs, $tier->getId());
//}
}
$illustrateurs = array();
foreach ($book->getIllustrateurs() as $tier) {
//if($tier->getActive() == true){
array_push($illustrateurs, $tier->getId());
//}
}
$compositeurs = array();
foreach ($book->getCompositeurs() as $tier) {
//if($tier->getActive() == true){
array_push($compositeurs, $tier->getId());
//}
}
$bookrixlitteraires = array();
foreach ($book->getPrixLitteraires() as $tier) {
array_push($bookrixlitteraires, $tier->getId());
}
$arr_prix_vente = $this->em->getRepository(ProduitPrix::class)->getProductPrice($book->getId());
$bookrix_vente = null;
$date_fin_precommande = null;
if ($arr_prix_vente != null) {
$bookrix_vente = $arr_prix_vente['prix_ttc'];
if ($arr_prix_vente['precommande']) {
$date_fin_precommande = ($arr_prix_vente['date_fin'] != null) ? $arr_prix_vente['date_fin']->format('c') : null;
}
}
$arr_prix_vente_ca = $this->em->getRepository(ProduitPrix::class)->getProductPrice($book->getId(), 'CAD');
$bookrix_vente_ca = null;
if ($arr_prix_vente_ca != null) {
$bookrix_vente_ca = $arr_prix_vente_ca['prix_ttc'];
}
$tmp = array(
'obj_id' => $book->getId(),
'active' => $book->getActive(),
'id_pipe_drive' => $book->getIdCrm(),
'image_hd' => $this->domain . 'produit/hd/' . $book->getImageHdName(),
'alt_image' => $book->getCopyrightImage(),
'titre_fr' => $book->getTitreFr(),
'sous_titre_fr' => $book->getSousTitreFr(),
'titre_original' => $book->getTitreOriginal(),
'serie' => array(
'serie_id' => ($book->getSerie() != null) ? $book->getSerie()->getId() : null,
'serie_titre' => ($book->getSerie() != null) ? $book->getSerie()->getTitre() : null,
'tome' => $book->getNumeroTome(),
'categories' => $categories,
'genres' => $genres,
'sousgenres' => $sousgenres
),
'themes' => $themes,
'public' => ($book->getPublics() != null) ? $book->getPublics()->getLibelleFr() : null,
'jeunesse' => $jeunesse,
'auteurs' => $auteurs,
'interpretes' => $interpretes,
'traducteurs' => $traducteurs,
'illustrateurs' => $illustrateurs,
'compositeurs' => $compositeurs,
'prix_litteraires' => $bookrixlitteraires,
'editeur' => ($book->getEditor() != null) ? $book->getEditor()->getId() : null,
'fournisseur' => ($book->getFournisseur() != null) ? $book->getFournisseur()->getId() : null,
'version' => ($book->getVersion() != null) ? $book->getVersion()->getLibelleFr() : null,
'duree' => $book->getDureeMin(),
'collection' => ($book->getCollection() != null) ? $book->getCollection()->getLibelleFr() : null,
'type_realisation' => ($book->getTypeRealisation() != null) ? $book->getTypeRealisation()->getLibelleFr() : null,
'ean_telechargement' => $book->getEanTelechargement(),
'ean_cd' => $book->getEanCd(),
'resume' => $book->getResumeFr(),
'url_presentation_origine' => $book->getUrlOriginePresentationFr(),
'tracklist' => $book->getEnrichissementsFr(),
'coup_de_coeur_libraire' => $book->getCoupDeCoeurLibraire(),
'video_html' => $book->getVideo(),
'url_extrait' => $this->file_service->getUrlExtrait($book->getId()),
'annee_production' => $book->getAnneeProduction(),
'annee_edition' => $book->getAnneeEdition(),
'copyright' => $book->getCopyright(),
'has_chapitre_gratuit' => $book->getBoolChapitreGratuit(),
'langue_audio' => $book->getLangueSources(),
'langue_originale' => $book->getLangueOriginale(),
'prix_reference' => $book->getPrixReference(),
'prix_reference_ca' => $book->getPrixReferenceCa(),
'prix_vente' => $bookrix_vente,
'prix_vente_ca' => $bookrix_vente_ca,
'date_fin_precommande' => $date_fin_precommande,
'is_new' => $book->getTitreALaUne(),
'is_bestseller' => $book->getBestSeller(),
'is_bestseller_ca' => $book->getBestSellerCa(),
'is_exclu_numerique' => $book->getProduitAppel(),
'date_creation' => ($book->getDateCreation() != null) ? $book->getDateCreation()->format('c') : null,
'date_modification' => ($book->getDateUpdate() != null) ? $book->getDateUpdate()->format('c') : null
);
return new JsonResponse($tmp);
} else {
return new JsonResponse(array('error' => 'not found'));
}
}
/**
* @Route("/api/mybooks", name="api_my_books")
*/
public function getMyApiBooks(Request $request): JsonResponse
{
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if ($userToken != null && (time() - $userToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION) {
//Ok lister livres du user
$get = $request->query;
$order = $get->get('order');
$order_sort = $get->get('order_sort');
$offset = ($get->get('page') - 1) * $get->get('rows');
$user_id = $userToken->getUser()->getId();
$results_final = array();
if ($get->get('type') == 'freechapters') {
$results_final = $this->em->getRepository('App:UserChapitreGratuit')->getUserProduits($user_id, $offset, $get->get('rows'), $order, $order_sort);
} else if ($get->get('type') == 'wishlist') {
$results_final = $this->em->getRepository('App:UserWishlists')->getUserProduits($user_id, $offset, $get->get('rows'), $order, $order_sort);
} else {
$results_final = $this->em->getRepository('App:UserProduits')->getApiUserProduits($user_id, $offset, $get->get('rows'), $order, $order_sort);
}
return new JsonResponse($results_final);
}
return new JsonResponse(array("error" => "Une erreur s'est produite, veuillez vous relogger"));
}
/**
* @Route("/api/invoices", name="get_invoices")
*/
public function get_invoices(Request $request): JsonResponse
{
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if ($userToken != null && (time() - $userToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION) {
$array_invoices = array();
$orders = $this->em->getRepository('App:Transaction')
->getUserTransactions($userToken->getUser()->getId());
foreach ($orders as $order) {
$facture_url = $this->generateUrl('account_pdf_facture', array('reference' => $order['reference_interne']));
$array_invoices[] = array(
"reference" => $order['reference_interne'],
"date" => $order['date'],
"montant" => $order['montant_ttc_reel'],
"facture" => $facture_url
);
}
return new JsonResponse(array("success" => true, "datas" => $array_invoices));
}
return new JsonResponse(array('error' => "Erreur - veuillez vous relogger"));
}
/**
* @Route("/api/invoices/{reference}", name="account_pdf_facture")
*/
public function account_pdf_facture(Request $request, $reference): JsonResponse
{
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if ($userToken != null && (time() - $userToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION) {
$this->logger->error('Create pdf ($userToken)', [$userToken]);
$this->params['show_menu'] = 0;
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Arial');
$dompdf = new Dompdf($pdfOptions);
$order = $this->em->getRepository('App:Transaction')->findOneBy(array(
'reference_interne' => $reference
));
$orderItems = array();
$items = $order->getTransactionItems();
$this->logger->error('Create pdf ($order)', [$order]);
foreach ($items as $i) {
if ($i->getCarteCadeau() != null) {
$tmp = array(
'reference' => 'CARTECADEAU-' . $i->getCarteCadeau()->getCode(),
'title' => "Carte cadeau " . $i->getCarteCadeau()->getUtilisateurDestinataire()->getEmail(),
'quantite' => 1,
'prix_ht' => $i->getCarteCadeau()->getValeur(),
'prix_ttc' => $i->getCarteCadeau()->getValeur()
);
} else if ($i->getGiftMembership() != null) {
$this->logger->error('Create pdf ($i->getGiftMembership())', [$i->getGiftMembership()]);
$tmp = array(
'reference' => 'ABONNEMENTCADEAU-' . $i->getGiftMembership()->getMonths(),
'title' => "Abonnement cadeau " . $i->getGiftMembership()->getSender()->getEmail(),
'quantite' => 1,
'prix_ht' => round($i->getGiftMembership()->getAmountTTC() / 1.14975, 2),
'prix_ttc' => $i->getGiftMembership()->getAmountTTC()
);
} else {
$tmp = array(
'reference' => 'BKDO-' . str_pad($i->getProduit()->getId(), 6, "0", STR_PAD_LEFT),
'title' => $i->getProduit()->getTitreFr(),
'quantite' => 1,
'prix_ht' => $i->getPrixHt(),
'prix_ttc' => $i->getPrixTtc()
);
}
array_push($orderItems, $tmp);
}
$montant_tva_5 = $this->em->getRepository('App:TransactionItems')->getSumTvaMontant($order->getId(), '5.50');
$montant_tva_20 = $this->em->getRepository('App:TransactionItems')->getSumTvaMontant($order->getId(), '20.00');
$promo = $order->getMontantBonAchat();
$soustotal = $order->getMontantTtcNominal();
$html = $this->renderView('Main/account/invoice.html.twig', [
'isCa' => $this->isCa,
'items' => $orderItems,
'sous_total_ttc' => $soustotal,
'promo' => $promo,
'reference' => $reference,
'date' => $order->getDate(),
'client_prenom' => $userToken->getUser()->getPrenom(),
'client_nom' => $userToken->getUser()->getNom(),
'montant_tva_5' => $montant_tva_5,
'montant_tva_20' => $montant_tva_20,
'ttc_reel' => $order->getMontantTtcReel()
]);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
return new Response($dompdf->stream("facture_" . $reference . ".pdf", [
"Attachment" => true
]));
}
return new JsonResponse(array('error' => "Erreur - veuillez vous relogger"));
}
/**
* @Route("/api/wishlist/add", name="add_wishlit")
*/
public function add_wishlist(Request $request): JsonResponse
{
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if ($userToken != null && (time() - $userToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION) {
$produit = $this->em->getRepository(Produit::class)->find($request->request->get('book_id'));
if ($produit != null) {
$wishlist = $this->em->getRepository('App:UserWishlists')->findOneBy(array('user' => $userToken->getUser(), 'produit' => $produit));
if ($wishlist != null) {
return new JsonResponse(array('error' => "Erreur - produit déjà dans la liste de souhait"));
} else {
$wishlist = new UserWishlists;
$wishlist->setUser($userToken->getUser())
->setProduit($produit)
->setDate(new \DateTime);;
$this->em->persist($wishlist);
$this->em->flush();
return new JsonResponse(array('success' => "Produit ajouté à la liste de souhait"));
}
} else {
return new JsonResponse(array('error' => "Erreur - produit non trouvé"));
}
} else {
return new JsonResponse(array('error' => "Erreur - veuillez vous relogger"));
}
}
/**
* @Route("/api/wishlist/remove", name="remove_wishlit")
*/
public function remove_wishlist(Request $request): JsonResponse
{
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if ($userToken != null && (time() - $userToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION) {
$produit = $this->em->getRepository(Produit::class)->find($request->request->get('book_id'));
if ($produit != null) {
$wishlist = $this->em->getRepository('App:UserWishlists')->findOneBy(array('user' => $userToken->getUser(), 'produit' => $produit));
if ($wishlist != null) {
$this->em->remove($wishlist);
$this->em->flush();
return new JsonResponse(array('success' => "Produit retiré de la liste de souhait"));
} else {
return new JsonResponse(array('error' => "Erreur - produit non trouvé dans la liste de souhait"));
}
} else {
return new JsonResponse(array('error' => "Erreur - produit non trouvé"));
}
} else {
return new JsonResponse(array('error' => "Erreur - veuillez vous relogger"));
}
}
/**
* @Route("/api/creategiftcard", name="create_gift_card")
* @throws Exception
*/
public function create_gift_card(Request $request, StringManager $stringManager): JsonResponse
{
$post = $request->request;
$carte = new CarteCadeau;
$date = new \DateTime;
if ($this->getUser() != null) {
$carte->setUtilisateurAcheteur($this->getUser());
}
$currency = $request->request->get('currency');
$devise = $this->em->getRepository('App:Devise')->findOneByCode(strtoupper($currency));
$temps = json_encode(array(
'prenom' => $post->get('prenom'),
'email' => $post->get('email'),
'rue' => $post->get('rue'),
'codePostal' => $post->get('codePostal'),
'ville' => $post->get('ville'),
'pays' => $post->get('pays'),
'date_reception' => $post->get('date')
));
$endDate = new \DateTime();
$endDate->add(new \DateInterval('P1Y'));
if (strtoupper($currency) === 'CAD') {
$endDate = new \DateTime('2100-01-01');
}
$carte
->setDestinatairesTemp($temps)
->setCanal($post->get('sendMethod'))
->setEtat('projet')
->setValeur($post->get('amount'))
->setMessage($post->get('message'))
->setSoldeUtilise(0)
->setDevise($devise)
->setDateAchat($date)
->setDateCreation(new \DateTime('now'))
->setDateLimite($endDate)
->setService($devise->getCode() === "CAD" ? 2 : 1);
if ($devise->getCode() === "CAD") {
$carte->setCode('CARTE' . $stringManager->generateRandomCode());
} else {
$carte->setCode('BCARTE' . $stringManager->generateRandomCode(5));
}
if ($request->files->get('illustration_custom') != null) {
$file = $request->files->get('illustration_custom');
try {
$file->move('../public/images_carte_cadeau/', $file->getClientOriginalName());
$carte->setImage($file->getClientOriginalName());
} catch (FileException $e) {
return new JsonResponse(array('error' => 'upload image problem'));
}
} else {
if ($devise->getCode() !== 'CAD') {
if ($post->get('illustration_1') != null && $post->get('illustration_1') !== "null") {
$carte->setImage('A.jpg');
} else if ($post->get('illustration_2') != null && $post->get('illustration_2') !== "null") {
$carte->setImage('B.jpg');
} else if ($post->get('illustration_3') != null && $post->get('illustration_3') !== "null") {
$carte->setImage('C.jpg');
} else if ($post->get('illustration_4') != null && $post->get('illustration_4') !== "null") {
$carte->setImage('D.jpg');
} else if ($post->get('illustration_5') != null && $post->get('illustration_5') !== "null") {
$carte->setImage('E.jpg');
} else {
$carte->setImage('A.jpg');
}
}
}
$this->em->persist($carte);
$this->em->flush();
return new JsonResponse(array('giftcard' => $carte->getId()));
}
/**
* @Route("/api/create-gift-membership", name="create_gift_membership")
* @throws Exception
*/
public function create_gift_membership(Request $request): JsonResponse
{
$post = $request->request;
$giftMembership = new GiftMembership;
$date = new \DateTime;
$currency = $post->get('currency');
$emailSender = $post->get('emailSender');
$emailRecipient = $post->get('emailRecipient');
$firstName = $post->get('firstName');
$amount = $post->get('amount');
$message = $post->get('message');
$sendDate = $post->get('sendDate');
$sendDateObject = new \DateTime($sendDate);
$devise = $this->em->getRepository('App:Devise')->findOneBy(array('code' => strtoupper($currency)));
$recipient = $this->em->getRepository('App:User')->findOneBy(array('email' => $emailRecipient));
if ($recipient !== null) {
$giftMembership->setRecipient($recipient);
}
$sender = $this->em->getRepository('App:User')->findOneBy(array('email' => $emailSender));
if ($sender !== null) {
$giftMembership->setSender($sender);
}
$giftMembership->setRecipientEmail($emailRecipient);
$giftMembership->setMessage($message);
$giftMembership->setDevise($devise);
$giftMembership->setDateToSend($sendDateObject);
$giftMembership->setMonths($amount);
$giftMembership->setRecipientFirstName($firstName);
$giftMembership->setCreationDate($date);
$this->em->persist($giftMembership);
$this->em->flush();
return new JsonResponse(array('gift_membership' => $giftMembership->getId()));
}
/**
* @Route("/api/create-gift-product", name="create_gift_product")
* @throws Exception
*/
public function create_gift_product(Request $request): JsonResponse
{
$post = $request->request;
$giftProduct = new GiftProduct();
$date = new \DateTime;
$emailSender = $post->get('emailSender');
$idAudiobook = $post->get('idAudiobook');
$currency = $post->get('currency');
$emailRecipient = $post->get('emailRecipient');
$firstName = $post->get('firstName');
$message = $post->get('message');
$devise = $this->em->getRepository('App:Devise')->findOneBy(array('code' => strtoupper($currency)));
$recipient = $this->em->getRepository('App:User')->findOneBy(array('email' => $emailRecipient));
$audiobook = $this->em->getRepository(Produit::class)->find($idAudiobook);
$giftProductOwned = $this->em->getRepository('App:GiftProduct')->findOneBy(array('recipientEmail' => $emailRecipient, 'product' => $audiobook, 'validated' => true));
$productOwned = false;
if ($recipient !== null) {
$productOwned = $this->em->getRepository('App:UserProduits')->findOneBy(array('user' => $recipient, 'produit' => $audiobook));
}
if ($giftProductOwned || $productOwned) {
return new JsonResponse(array('error' => 'Ce livre audio appartient déjà au destinataire. Vous pouvez en choisir un autre.'));
}
if ($recipient !== null) {
$giftProduct->setRecipient($recipient);
}
$giftProduct->setRecipientEmail($emailRecipient);
$giftProduct->setMessage($message);
$giftProduct->setDevise($devise);
$giftProduct->setRecipientFirstName($firstName);
$giftProduct->setCreationDate($date);
$giftProduct->setValidated(false);
$giftProduct->setRedeemed(false);
$giftProduct->setProduct($audiobook);
if ($emailSender !== null && $emailSender !== '') {
$senderEntity = $this->em->getRepository('App:User')->findOneBy(array('email' => $emailSender));
if ($senderEntity) {
$giftProduct->setSender($senderEntity);
}
}
$this->em->persist($giftProduct);
$this->em->flush();
return new JsonResponse(array('gift_product' => $giftProduct->getId()));
}
/**
* @Route("/api/create-algolia-reindex-request", name="create_algolia_reindex_request")
* @throws Exception
*/
public function create_algolia_reindex_request(Request $request): JsonResponse
{
$algoliaReindexRequest = new AlgoliaReindexRequest();
$algoliaReindexRequest->setCreationDatetime(new \Datetime);
$algoliaReindexRequest->setExecuted(true);
$this->em->persist($algoliaReindexRequest);
$this->em->flush();
$products = $this->em->getRepository(Produit::class)->findBy(array('active' => '1'));
$this->searchService->clear(Produit::class);
$this->searchService->index($this->em, $products);
return new JsonResponse(array('success' => 'Algolia reindexing has been triggered. The process will be completed in about five minutes. You can close this window.'));
}
/**
* @Route("/api/trigger-narra-build", name="trigger_narra_build")
* @throws Exception
* @throws TransportExceptionInterface
*/
public function trigger_narra_build(Request $request): JsonResponse
{
try {
$webhookUrl = 'https://webhooks.amplify.ca-central-1.amazonaws.com/prod/webhooks?id=d326e603-d700-437e-8c5e-8da37b64e4a4&token=jRs7xWa2Q1veQOjCeTRQGR3eQt3CTiKJEIAtL4SYVw';
if ($_ENV['APP_ENV'] === 'dev') {
$webhookUrl = 'https://webhooks.amplify.ca-central-1.amazonaws.com/prod/webhooks?id=68c46f87-a1b8-4cca-a975-b453606355f4&token=mDnXkPDBjpubMmIOSwr3GmFAnCk85ZpJHNaDmSgOOk';
}
$httpClient = HttpClient::create();
$headers = ['Content-Type' => 'application/json'];
$response = $httpClient->request('POST', $webhookUrl, [
'headers' => $headers,
]);
if ($response->getStatusCode() === 200 || $response->getStatusCode() === 202 || $response->getStatusCode() === 201) {
return new JsonResponse(['success' => 'Webhook triggered successfully']);
} else {
$this->logger->error('Response Content', [$response->getStatusCode()]);
return new JsonResponse(['error' => 'Failed to trigger webhook'], 500);
}
} catch (\Exception $e) {
$this->logger->error('Exception', [$e->getMessage()]);
return new JsonResponse(['error' => $e->getMessage()], 500);
}
}
/**
* @Route("/api/pointsfidelite", name="get_pointsfidelite")
*/
public function get_pointsfidelite(Request $request): JsonResponse
{
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if ($userToken != null && (time() - $userToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION) {
return new JsonResponse(array('points' => $userToken->getUser()->getFidelite()));
}
return new JsonResponse(array("error" => "Une erreur s'est produite, veuillez vous relogger"));
}
/**
* @Route("/api/coupons", name="get_mescoupons")
*/
public function get_mescoupons(Request $request): JsonResponse
{
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if ($userToken != null && (time() - $userToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION) {
$coupons = $this->em->getRepository('App:Promotion')->findBy(array('user_allowed' => $userToken->getUser()->getId()));
$results = array();
foreach ($coupons as $promo) {
$c = array(
'code' => $promo->getCode(),
'valeur' => $promo->getValeur(),
'date_limite' => $promo->getDateFin()
);
$up = $this->em->getRepository('App:Transaction')->findOneBy(array('client' => $userToken->getUser(), 'code_bon_achat' => $promo->getCode()));
if ($up != null) {
$c['use'] = true;
} else {
$c['use'] = false;
}
array_push($results, $c);
}
$giftCards = $this->em->getRepository('App:CarteCadeau')->getUsersCards($userToken->getUser()->getId());
$giftCardsPrint = $this->em->getRepository('App:CarteCadeau')->getUsersCardsPrint($userToken->getUser()->getId());
foreach ($giftCardsPrint as &$giftCardPrint) {
$giftCardPrint['transaction_reference'] = "";
$transactionItem = $this->em->getRepository('App:TransactionItems')->findOneBy([
'cartecadeau' => $giftCardPrint['id'],
]);
if ($transactionItem) {
$transaction = $this->em->getRepository('App:Transaction')->findOneBy([
'id' => $transactionItem->getTransaction(),
]);
if ($transaction) {
$giftCardPrint['transaction_reference'] = $transaction->getReferenceInterne();
}
}
}
return new JsonResponse(array('coupons' => $results, 'giftcards' => $giftCards, 'giftCardsPrint' => $giftCardsPrint));
}
return new JsonResponse(array("error" => "Une erreur s'est produite, veuillez vous relogger"));
}
/**
* @Route("/api/price/validate", name="price_validate")
*/
public function price_validate(Request $request): JsonResponse
{
$products = $request->request->get('products');
$devise = $this->em->getRepository(Devise::class)->find(4);
$results = array();
foreach ($products as $product_id) {
$product = $this->em->getRepository(Produit::class)->findOneBy(['id' => (int)$product_id]);
if ($product == null) {
array_push($results, array(
'id' => $product_id,
'prix' => "price not found"
));
} else {
$prix = $product->getPrix();
$datejour = new \DateTime();
$prices_ca = array();
foreach ($prix as $pp) {
if ($pp->getDevise()->getCode() == "CAD") {
if ($pp->getDateFin() == null || $pp->getDateFin() >= $datejour) {
array_push($prices_ca, array(
'prix' => $pp->getPrixTtc(),
'date' => $pp->getDateFin(),
'precommande' => $pp->getPrecommande(),
'tva' => ($pp->getTva() != null) ? $pp->getTva()->getTaux() : null
));
}
}
}
usort($prices_ca, $this->build_sorter('date'));
if (empty($prices_ca)) {
array_push($results, array(
'id' => $product_id,
'prix' => "price not found"
));
} else {
array_push($results, array(
'id' => $product_id,
'prix' => $prices_ca[0]['prix']
));
}
}
}
return new JsonResponse($results);
}
private
function build_sorter($key): \Closure
{
return function ($a, $b) use ($key) {
//si null
if ($a[$key] == null) {
return 1;
} else if ($b[$key] == null) {
return -1;
}
if ($a[$key] > $b[$key]) {
return -1;
} else {
return 1;
}
};
}
private function build_sorter_prices($key): \Closure
{
return function ($a, $b) use ($key) {
if ($a[$key] === null && $b[$key] === null) {
return $b['id'] <=> $a['id'];
} else if ($a[$key] === null) {
return 1;
} else if ($b[$key] === null) {
return -1;
}
return $a[$key] <=> $b[$key]; // Otherwise, compare ending dates
};
}
/**
* @Route("/api/coupons/check", name="api_check_code_promo")
*
* CAUTION!!!
* In this function there is a misuse of the total_ttc variable name that may cause confusion for the CAD version.
* total_ttc = total price with taxes included
* total_ht = total price without taxes
*/
public
function api_check_code_promo(Request $request): JsonResponse
{
$post = $request->request;
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if ($userToken != null && (time() - $userToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION) {
$array_products = json_decode($post->get('cart_products'), true);
if ($post->get('cart_products') == null || !$array_products || $post->get('code_promo') == null || $post->get('ttc_total') == null) {
return new JsonResponse(array('error' => 'Problem de paramètres'));
}
$cart_products = $array_products['products'];
$json = array();
$json['error'] = "";
$tvas = array(
'5.500' => 0,
'20.000' => 0,
'14.975' => 0,
'0.000' => 0
);
$total_ttc = (float)$post->get('ttc_total');
$total_ht = $total_ttc; // This is helpful only for CAD
if ($post->get('isCa') == 1) {
$total_ht = $total_ttc / (1 + 14.975 / 100);
}
$campagne_b = false;
$ccadeau = false;
$devise_id = 1;
$devise_code = 'EUR';
if ($post->get('isCa') == 1) {
$devise_id = 4;
$devise_code = "CAD";
}
$promo = $this->em->getRepository(Promotion::class)->getCartPromo($post->get('code_promo'), $devise_id);
if ($promo == null) {
$promo = $this->em->getRepository('App:CampagneCode')->getCartPromo($post->get('code_promo'));
if ($promo != null) {
$campagne_b = true;
}
}
if ($promo == null) {
$promo = $this->em->getRepository(CarteCadeau::class)->getCartPromo($post->get('code_promo'), $devise_id);
if (!$promo) {
$promo = $this->em->getRepository(CarteCadeau::class)->getGiftCardPrint($post->get('code_promo'), $devise_id);
}
if ($promo != null) {
$promo['type_valeur'] = 0;
$promo['payeur'] = 'bookdoreille';
if ($promo['solde_utilise'] >= $promo['valeur']) {
$promo['valeur'] = 0;
return new JsonResponse(array(
'error' => 'Votre carte cadeau n\'a pas de solde.'
));
} else {
$promo['valeur'] = $promo['valeur'] - $promo['solde_utilise'];
}
$ccadeau = true;
}
}
if ($promo != null) {
$json['devise'] = $devise_id;
$json['type_valeur'] = $promo['type_valeur'];
$montant_promo = $promo['valeur'];
$check_promo = $this->em->getRepository(UserPromotions::class)->getPromoUser($promo['id'], $userToken->getUser()->getId());
if (!$campagne_b) {
if ($ccadeau === false && $check_promo != null) {
return new JsonResponse(array('error' => 'Désolé, ce code a déja été utilisé.'));
}
} else {
$campagnecode = $this->em->getRepository('App:CampagneCode')
->findOneBy(array('code' => $post->get('code_promo')));
$check_promo = $this->em->getRepository('App:UserCampagnes')
->findOneBy(array('campagne_code' => $campagnecode));
if ($check_promo != null) {
return new JsonResponse(array(
'error' => 'Le code saisit correspond à un code promo: Désolé, ce code a déja été utilisé'
));
}
}
$users = $this->em->getRepository(Promotion::class)->getPromoUsers($promo['id']);
$b = true;
if ($ccadeau === false && $campagne_b === false && $users != null) {
$b = false;
if ($users['id'] == $userToken->getUser()->getId()) {
$b = true;
}
}
if ($b === true) {
if ($ccadeau === false) {
if ($campagne_b === false) {
$products = $this->em->getRepository('App:Promotion')->getPromoProducts($promo['id']);
} else {
$products = $this->em->getRepository('App:CampagnePromo')->getPromoProducts($promo['id']);
}
} else {
$products = array();
}
if (!empty($products)) {
$a = false;
$pallowed = array();
$ttc_promo = 0;
foreach ($products as $p) {
if (array_key_exists($p['id'], $cart_products)) {
$pallowed[] = $p['id'];
if ($devise_id === 4) {
$ttc_promo += $cart_products[$p['id']]/1.14975;
} else {
$ttc_promo += $cart_products[$p['id']];
}
$a = true;
}
}
if ($a) {
if ($promo['type_valeur'] == 0) {
$total_ttc = $total_ttc - $promo['valeur'];
if (($total_ttc) <= 0) {
if ($post->get('ttc_total') > $promo['valeur']) {
$montant_promo = $promo['valeur'];
if ($devise_id === 4) {
$total_ttc = ($post->get('ttc_total') / (1 + 0.14975)) - $promo['valeur'];
} else {
$total_ttc = $post->get('ttc_total') - $promo['valeur'];
}
} else {
if ($devise_id === 4) {
$montant_promo = ($post->get('ttc_total') / (1 + 0.14975));
} else {
$montant_promo = $post->get('ttc_total');
}
$total_ttc = 0;
}
} else {
foreach ($cart_products as $id => $amount) {
$montant_part = 0;
if (in_array($id, $pallowed)) {
$part = $amount / $ttc_promo * 100;
$montant_part = $montant_promo * $part / 100;
}
$prix = $this->em->getRepository('App:ProduitPrix')->getProductPrice($id, $devise_code);
$prix_ht = ($amount - $montant_part) / (1 + $prix['taux'] / 100);
$tva = round($prix_ht * ($prix['taux'] / 100), 2);
$tvas[$prix['taux']] += $tva;
if ($post->get('isCa') == 1) {
$tvas['5.000'] = round($prix_ht * (5 / 100), 2);
$tvas['9.975'] = round($prix_ht * (9.975 / 100), 2);
}
}
}
$rtva = array();
foreach ($tvas as $key => $val) {
$tvva = $this->em->getRepository('App:Tva')->findOneByTaux($key);
$tva_id = null;
if ($tvva != null) {
$tva_id = $tvva->getId();
}
array_push($rtva, array('id' => $tva_id, 'taux' => $key, 'val' => round($val, 2)));
}
$json['montant_promo'] = round($montant_promo, 2);
$json['total_ttc'] = round($total_ttc, 2);
$json['tvas'] = $rtva;
} else {
$montant_promo = $ttc_promo * ($montant_promo / 100);
foreach ($cart_products as $id => $amount) {
$montant_part = 0;
if (in_array($id, $pallowed)) {
$part = $amount / $ttc_promo * 100;
$montant_part = $montant_promo * $part / 100;
}
$prix = $this->em->getRepository('App:ProduitPrix')->getProductPrice($id, $devise_code);
$prix_ht = ($amount - $montant_part) / (1 + $prix['taux'] / 100);
$tva = round($prix_ht * ($prix['taux'] / 100), 2);
$tvas[$prix['taux']] += $tva;
if ($post->get('isCa') == 1) {
$tvas['5.000'] = round($prix_ht * (5 / 100), 2);
$tvas['9.975'] = round($prix_ht * (9.975 / 100), 2);
}
}
$rtva = array();
foreach ($tvas as $key => $val) {
$tvva = $this->em->getRepository('App:Tva')->findOneByTaux($key);
$tva_id = null;
if ($tvva != null) {
$tva_id = $tvva->getId();
}
$rtva[] = array('id' => $tva_id, 'taux' => $key, 'val' => round($val, 2));
}
$total_ttc = $total_ttc - $montant_promo;
$json['montant_promo'] = round($montant_promo, 2);
$json['total_ttc'] = round($total_ttc, 2);
$json['tvas'] = $rtva;
}
} else {
return new JsonResponse(array('error' => "Le code que vous avez renseigné n'est pas valable sur le(s) produit(s) que vous avez choisi"));
}
} else {
if ($ccadeau === false && $check_promo != null) {
return new JsonResponse(array('error' => 'Désolé, ce code a déja été utilisé.'));
}
if ($promo['type_valeur'] == 0) {
$test_ttc = $total_ttc - $montant_promo;
if (($test_ttc) <= 0) {
if ($post->get('ttc_total') > $promo['valeur']) {
$montant_promo = $promo['valeur'];
if ($devise_id === 4) {
$total_ttc = ($post->get('ttc_total') / (1 + 0.14975)) - $promo['valeur'];
} else {
$total_ttc = $post->get('ttc_total') - $promo['valeur'];
}
} else {
$montant_promo = $post->get('ttc_total');
$total_ttc = 0;
}
} else {
foreach ($cart_products as $id => $amount) {
$part = $amount / $total_ttc * 100;
$montant_part = $montant_promo * $part / 100;
$prix = $this->em->getRepository('App:ProduitPrix')->getProductPrice($id, $devise_code);
if ($prix == null) {
return new JsonResponse(array('error' => 'Produit inexistant'));
}
$prix_ht = $amount - $montant_part / (1 + $prix['taux'] / 100);
$tva = round($prix_ht * ($prix['taux'] / 100), 2);
$tvas[$prix['taux']] += $tva;
if ($post->get('isCa') == 1) {
$tvas['5.000'] = round($prix_ht * (5 / 100), 2);
$tvas['9.975'] = round($prix_ht * (9.975 / 100), 2);
}
}
$total_ttc = $total_ttc - $montant_promo;
}
$rtva = array();
foreach ($tvas as $key => $val) {
$tvva = $this->em->getRepository('App:Tva')->findOneByTaux($key);
$tva_id = null;
if ($tvva != null) {
$tva_id = $tvva->getId();
}
array_push($rtva, array('id' => $tva_id, 'taux' => $key, 'val' => round($val, 2)));
}
$json['montant_promo'] = round($montant_promo, 2);
} else {
if ($post->get('isCa') == 1) {
$promo_reel = $total_ht * ($montant_promo / 100);
} else {
$promo_reel = $total_ttc * ($montant_promo / 100);
}
foreach ($cart_products as $id => $amount) {
$part = $amount / $total_ttc * 100;
$montant_part = $promo_reel * $part / 100;
$prix = $this->em->getRepository(ProduitPrix::class)->getProductPrice($id, $devise_code);
if ($prix == null) {
return new JsonResponse(array('error' => 'Produit inexistant'));
}
$prix_ht = ($amount - $montant_part) / (1 + $prix['taux'] / 100);
$tva = round($prix_ht * ($prix['taux'] / 100), 2);
$tvas[$prix['taux']] += $tva;
if ($post->get('isCa') == 1) {
$tvas['5.000'] = round($prix_ht * (5 / 100), 2);
$tvas['9.975'] = round($prix_ht * (9.975 / 100), 2);
}
}
$rtva = array();
foreach ($tvas as $key => $val) {
$tvva = $this->em->getRepository('App:Tva')->findOneByTaux($key);
$tva_id = null;
if ($tvva != null) {
$tva_id = $tvva->getId();
}
$rtva[] = array('id' => $tva_id, 'taux' => $key, 'val' => round($val, 2));
}
$total_ttc = $total_ttc - $total_ttc * ($montant_promo / 100);
if ($post->get('isCa') == 1) {
$total_ht = $total_ht - $total_ht * ($montant_promo / 100);
}
$json['montant_promo'] = round($promo_reel, 2);
}
$json['total_ht'] = round($total_ht, 2); // This is helpful only for CAD
$json['total_ttc'] = round($total_ttc, 2);
$json['tvas'] = $rtva;
}
} else {
return new JsonResponse(array('error' => "Vous n'ètes pas autorisé à utiliser ce code promo"));
}
} else {
return new JsonResponse(array('error' => "Le code que vous avez renseigné n'est pas valable, merci de vérifier votre saisie..."));
}
return new JsonResponse($json);
}
return new JsonResponse(array("error" => "Une erreur s'est produite, veuillez vous relogger"));
}
/**
* @Route("/api/check-promo-code-credits", name="api_check_promo_code_credits")
*/
public
function api_check_promo_code_credits(Request $request): JsonResponse
{
$post = $request->request;
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if (!$userToken) {
return new JsonResponse(['error' => 'Operation not permitted'], Response::HTTP_UNAUTHORIZED);
}
$code = $post->get('code');
if (!$code) {
return new JsonResponse(['error' => 'codeInvalid'], Response::HTTP_BAD_REQUEST);
}
$codeObject = $this->em->getRepository(GiftCreditsPromoCode::class)->findOneBy(array('code' => $code));
if (!$codeObject) {
return new JsonResponse(['error' => 'codeInvalid'], Response::HTTP_BAD_REQUEST);
}
if ($codeObject->isRedeemed()) {
return new JsonResponse(['error' => 'codeRedeemed'], Response::HTTP_BAD_REQUEST);
}
$creditsCount = $codeObject->getCredits();
$userObject = $userToken->getUser();
$userCredits = $userObject->getCredits();
$userObject->setCredits($userCredits + $creditsCount);
$this->em->persist($userObject);
$codeObject->setRedeemed(true);
$codeObject->setRecipient($userObject);
$this->em->persist($codeObject);
$this->em->flush();
$currentYear = date('Y');
$httpClient = HttpClient::create();
$message = '{
"key": "'. $_ENV['MANDRILL_API_KEY_CA'] .'",
"template_name": "credit-redeemed-notification",
"template_content": [],
"message": {
"from_email": "communication@narra.audio",
"from_name": "Narra",
"to": [
{
"email": "'.$userObject->getEmail().'",
"name": "'.$userObject->getPrenom().'",
"type": "to"
}
],
"subject": "Votre crédit est maintenant activé !",
"merge_language": "mailchimp",
"global_merge_vars": [
{
"name": "COMPANY",
"content": "Narra"
},
{
"name": "CURRENT_YEAR",
"content": "'.$currentYear.'"
}
]
}
}';
try {
$response = $httpClient->request('POST', 'https://mandrillapp.com/api/1.0/messages/send-template', [
'headers' => [
'Content-Type' => 'application/json',
],
'body' => $message,
]);
$statusCode = $response->getStatusCode();
if ($statusCode !== 200) {
$this->logger->error('Mailchimp Webhook request failed with status code: ' . $statusCode);
}
} catch (TransportExceptionInterface $e) {
$this->logger->error('Mailchimp Webhook request failed with error: ' . $e->getMessage());
}
return new JsonResponse(['success' => true, 'credits' => $creditsCount], Response::HTTP_OK);
}
/**
* @Route("/api/newpromofidelite", name="add_newpromofidelite")
*/
public
function add_newpromofidelite(Request $request): JsonResponse
{
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if ($userToken != null && (time() - $userToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION) {
$json = array();
if ($userToken->getUser() != null && $userToken->getUser()->getFidelite() >= 10) {
$date = new \DateTime;
$points = $userToken->getUser()->getFidelite();
$valeur = $points / 10;
$devise = $this->em->getRepository('App:Devise')->find(1);
$payeur = $this->em->getRepository('App:PromotionPayeur')->find(1);
$code = 'PF' . $this->generer_code_carte_cadeau(8);
$date_fin = new \DateTime;
$date_fin->modify('+1 year');
$promotion = new Promotion;
$promotion
->setCode($code)
->setDateDebut($date)
->setDateFin($date_fin)
->setValeur($valeur)
->setTypeValeur(0)
->setPayeur('bookdoreille')
->setDevise($devise)
->setService($devise->getCode() === "CAD" ? 2 : 1)
->setMultiUser(false)
->setPromotionPayeur($payeur)
->setUserAllowed($userToken->getUser());
$this->em->persist($promotion);
$user = $userToken->getUser();
$user->setFidelite(0);
$this->em->persist($user);
$this->em->flush();
$json['success'] = true;
$json['code'] = $code;
} else {
$json['success'] = false;
$json['message'] = "Vous n'avez pas de points fidélité";
}
return new JsonResponse($json);
}
return new JsonResponse(array("error" => "Une erreur s'est produite, veuillez vous relogger"));
}
private
function generer_code_carte_cadeau($length = 8): string
{
$chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$string = '';
for ($i = 0; $i < $length; $i++) {
$string .= $chars[rand(0, strlen($chars) - 1)];
}
return $string;
}
private function processProducts($produits, $type, $country): array
{
$results = array();
if (count($produits) > 0 && $produits[0] !== null) {
foreach ($produits as $p) {
$categories = array();
$categories_id = array();
$genresSerie = array();
if ($p->getGenre1() != null) {
if ($p->getGenre1()->getGroupe() != null) {
$categories_id[] = $p->getGenre1()->getGroupe()->getId();
}
$genresSerie[] = $p->getGenre1()->getId();
}
if ($p->getGenre2() != null) {
if ($p->getGenre2()->getGroupe() != null) {
$categories_id[] = $p->getGenre2()->getGroupe()->getId();
}
$genresSerie[] = $p->getGenre2()->getId();
}
$categories_id = array_unique($categories_id);
foreach ($categories_id as $id) {
$groupegenre = $this->em->getRepository('App:GroupeGenres')->find($id);
$categories[] = array('id' => $groupegenre->getId());
}
$sousGenresSerie = array();
if ($p->getSousgenre1() != null) {
$sousGenresSerie[] = $p->getSousgenre1()->getId();
}
if ($p->getSousgenre2() != null) {
$sousGenresSerie[] = $p->getSousgenre2()->getId();
}
$themes = array();
foreach ($p->getThemes() as $theme) {
$themes[] = $theme->getId();
}
$jeunesse = array();
if ($p->getPublics() != null && $p->getPublics()->getId() == 3) {
$jeunesse = array(
'detail_jeunesse' => ($p->getPublicsJeunesse() != null) ? $p->getPublicsJeunesse()->getLibelleFr() : null,
'age_min' => $p->getJeunesseAgeMin(),
'age_max' => $p->getJeunesseAgeMin()
);
}
$auteurs = array();
$authorsDetails = array();
foreach ($p->getAuteurs() as $tier) {
$auteurs[] = $tier->getId();
$authorsDetails[] = array(
"name" => $tier->getPrenom() . " " . $tier->getNom(),
"pseudonyme" => $tier->getPseudonyme(),
"uri" => $tier->getAlgoliaName(),
"id" => $tier->getId(),
"image" => $tier->getImageName()
);
}
$interpretes = array();
$interpretersDetails = array();
foreach ($p->getInterpretes() as $tier) {
$interpretes[] = $tier->getId();
$interpretersDetails[] = array(
"name" => $tier->getPrenom() . " " . $tier->getNom(),
"pseudonyme" => $tier->getPseudonyme(),
"uri" => $tier->getAlgoliaName(),
"id" => $tier->getId(),
"image" => $tier->getImageName()
);
}
$publisher = $p->getEditor();
$publisherDetails = [];
if ($publisher != null) {
$publisherDetails = array(
"name" => $publisher->getPrenom() . " " . $publisher->getNom(),
"slug" => $publisher->getAlgoliaName(),
);
}
$traducteurs = array();
foreach ($p->getTraducteurs() as $tier) {
$traducteurs[] = $tier->getId();
}
$illustrateurs = array();
foreach ($p->getIllustrateurs() as $tier) {
$illustrateurs[] = $tier->getId();
}
$compositeurs = array();
foreach ($p->getCompositeurs() as $tier) {
$compositeurs[] = $tier->getId();
}
$prixlitteraires = array();
foreach ($p->getPrixLitteraires() as $tier) {
$prixlitteraires[] = $tier->getId();
}
$arr_prix_vente = $this->em->getRepository(ProduitPrix::class)->getProductPrice($p->getId());
$prix_vente = null;
$date_fin_precommande = null;
if ($arr_prix_vente != null) {
$prix_vente = $arr_prix_vente['prix_ttc'];
if ($arr_prix_vente['precommande']) {
$date_fin_precommande = ($arr_prix_vente['date_fin'] != null) ? $arr_prix_vente['date_fin'] : null;
}
}
$arr_prix_vente_ca = $this->em->getRepository(ProduitPrix::class)->getProductPrice($p->getId(), 'CAD');
$prix_vente_ca = null;
if ($arr_prix_vente_ca != null) {
$prix_vente_ca = $arr_prix_vente_ca['prix_ttc'];
}
$prix = $p->getPrix();
$datejour = new \DateTime();
$prices = array();
$prices_ca = array();
$tva = null;
foreach ($prix as $pp) {
if ($pp->getDevise()->getCode() == "CAD") {
if ($pp->getDateFin() == null || $pp->getDateFin() >= $datejour) {
$prices_ca[] = array(
'id' => $pp->getId(),
'prix' => $pp->getPrixTtc(),
'date' => $pp->getDateFin(),
'precommande' => $pp->getPrecommande(),
'tva' => ($pp->getTva() != null) ? $pp->getTva()->getTaux() : null
);
}
} else {
if ($pp->getDateFin() == null || $pp->getDateFin() >= $datejour) {
$prices[] = array(
'id' => $pp->getId(),
'prix' => $pp->getPrixTtc(),
'date' => $pp->getDateFin(),
'precommande' => $pp->getPrecommande(),
'tva' => ($pp->getTva() != null) ? $pp->getTva()->getTaux() : null
);
}
}
}
usort($prices, $this->build_sorter_prices('date'));
$precommande = false;
if (empty($prices)) {
} else {
$tva = $prices[0]['tva'];
$precommande = $prices[0]['precommande'];
}
usort($prices_ca, $this->build_sorter_prices('date'));
$precommandeCa = false;
if (empty($prices_ca)) {
} else {
$precommandeCa = $prices_ca[0]['precommande'];
}
$genres = [
$p->getGenre1(),
$p->getGenre2(),
$p->getSousgenre1(),
$p->getSousgenre2()
];
foreach ($genres as &$genre) {
if ($genre !== null) {
$genre = $genre->getLibelleFr();
}
}
$genres = array_values(array_filter($genres));
$editor = $p->getEditor();
$editorName = [];
if ($editor != null) {
$editorName = array(
"name" => $editor->getPrenom() . " " . $editor->getNom(),
"slug" => $editor->getAlgoliaName(),
);
}
$collectionDatas = [];
if ($p->getCollection()) {
$collectionDatas[] = [
'libelle' => $p->getCollection()->getLibelleFr(),
'description' => $p->getCollection()->getDescriptionFr(),
];
}
$translatorDatas = [];
if ($p->getTraducteurs()) {
foreach ($p->getTraducteurs() as $translator) {
if ($translator) {
$translatorDatas[] = [
'name' => $translator->getNom() . "-" . $translator->getPrenom(),
'uri' => $translator->getNom() . "-" . $translator->getPrenom(),
'algolia_name' => $translator->getAlgoliaName(),
];
}
}
}
$directorDatas = [];
if ($p->getRealisateurs()) {
foreach ($p->getRealisateurs() as $director) {
if ($director) {
$directorDatas[] = [
'name' => $director->getNom() . "-" . $director->getPrenom(),
'uri' => $director->getNom() . "-" . $director->getPrenom(),
'algolia_name' => $director->getAlgoliaName(),
];
}
}
}
$compositorDatas = [];
if ($p->getCompositeurs()) {
foreach ($p->getCompositeurs() as $compositor) {
if ($compositor) {
$compositorDatas[] = [
'name' => $compositor->getNom() . "-" . $compositor->getPrenom(),
'uri' => $compositor->getNom() . "-" . $compositor->getPrenom(),
'algolia_name' => $compositor->getAlgoliaName(),
];
}
}
}
$prix_streaming = $p->getPrixStreaming();
$prices_streaming = array();
$price_streaming = null;
$tva_streaming = null;
$simultaneite_streaming = null;
$nb_prets_streaming = null;
$duree_exploitation_streaming = null;
$duree_pret_streaming = null;
foreach ($prix_streaming as $pp) {
if ($pp->getDateFin() == null || $pp->getDateFin() >= $datejour) {
$prices_streaming[] = array(
'prix' => $pp->getPrix(),
'date' => $pp->getDateFin(),
'tva' => ($pp->getTva() != null) ? $pp->getTva()->getTaux() : null,
'simultaneite' => $pp->getSimultaneite(),
'nb_prets' => $pp->getNombrePret(),
'duree_exploitation' => $pp->getDureeAnnee(),
'duree_pret' => $pp->getDureePret()
);
}
}
usort($prices_streaming, $this->build_sorter('date'));
if (empty($prices_streaming)) {
} else {
$price_streaming = $prices_streaming[0]['prix'];
$tva_streaming = $prices_streaming[0]['tva'];
$simultaneite_streaming = $prices_streaming[0]['simultaneite'];
$nb_prets_streaming = $prices_streaming[0]['nb_prets'];
$duree_exploitation_streaming = $prices_streaming[0]['duree_exploitation'];
$duree_pret_streaming = $prices_streaming[0]['duree_pret'];
}
$prix_education = $p->getPrixEducation();
$prices_education = array();
$price_education = null;
$tva_education = null;
$simultaneite_education = null;
$nb_prets_education = null;
$duree_exploitation_education = null;
$duree_pret_education = null;
foreach ($prix_education as $pp) {
if ($pp->getDateFin() == null || $pp->getDateFin() >= $datejour) {
$prices_education[] = array(
'prix' => $pp->getPrix(),
'date' => $pp->getDateFin(),
'tva' => ($pp->getTva() != null) ? $pp->getTva()->getTaux() : null,
'simultaneite' => $pp->getSimultaneite(),
'nb_prets' => $pp->getNombrePret(),
'duree_exploitation' => $pp->getDureeAnnee(),
'duree_pret' => $pp->getDureePret()
);
}
}
usort($prices_education, $this->build_sorter('date'));
if (empty($prices_education)) {
} else {
$price_education = $prices_education[0]['prix'];
$tva_education = $prices_education[0]['tva'];
$simultaneite_education = $prices_education[0]['simultaneite'];
$nb_prets_education = $prices_education[0]['nb_prets'];
$duree_exploitation_education = $prices_education[0]['duree_exploitation'];
$duree_pret_education = $prices_education[0]['duree_pret'];
}
$tmp = array(
'obj_id' => $p->getId(),
'active' => $p->getActive(),
'id_pipe_drive' => $p->getIdCrm(),
'image_hd' => $this->domain . 'produit/hd/' . $p->getImageHdName(),
'image_hd_name' => $p->getImageHdName(),
'alt_image' => $p->getCopyrightImage(),
'titre_fr' => $p->getTitreFr(),
'sous_titre_fr' => $p->getSousTitreFr(),
'titre_original' => $p->getTitreOriginal(),
'serie' => array(
'serie_id' => ($p->getSerie() != null) ? $p->getSerie()->getId() : null,
'serie_titre' => ($p->getSerie() != null) ? $p->getSerie()->getTitre() : null,
'tome' => $p->getNumeroTome(),
'categories' => $categories,
'genres' => $genresSerie,
'sousgenres' => $sousGenresSerie
),
'themes' => $themes,
'public' => ($p->getPublics() != null) ? $p->getPublics()->getLibelleFr() : null,
'jeunesse' => $jeunesse,
'auteurs' => $auteurs,
'authors_details' => $authorsDetails,
'interpretes' => $interpretes,
'interpreters_details' => $interpretersDetails,
'traducteurs' => $traducteurs,
'illustrateurs' => $illustrateurs,
'compositeurs' => $compositeurs,
'prix_litteraires' => $prixlitteraires,
'editeur' => ($p->getEditor() != null) ? $p->getEditor()->getId() : null,
'publisher_details' => $publisherDetails,
'fournisseur' => ($p->getFournisseur() != null) ? $p->getFournisseur()->getId() : null,
'version' => ($p->getVersion() != null) ? $p->getVersion()->getLibelleFr() : null,
'duree' => $p->getDureeMin(),
'collection' => ($p->getCollection() != null) ? $p->getCollection()->getLibelleFr() : null,
'type_realisation' => ($p->getTypeRealisation() != null) ? $p->getTypeRealisation()->getLibelleFr() : null,
'ean_telechargement' => $p->getEanTelechargement(),
'ean_cd' => $p->getEanCd(),
'resume' => $p->getResumeFr(),
'url_presentation_origine' => $p->getUrlOriginePresentationFr(),
'tracklist' => $p->getEnrichissementsFr(),
'coup_de_coeur_libraire' => $p->getCoupDeCoeurLibraire(),
'video_html' => $p->getVideo(),
'url_extrait' => $this->file_service->getUrlExtrait($p->getId()),
'annee_production' => $p->getAnneeProduction(),
'annee_edition' => $p->getAnneeEdition(),
'copyright' => $p->getCopyright(),
'has_chapitre_gratuit' => $p->getBoolChapitreGratuit(),
'langue_audio' => $p->getLangueSources(),
'langue_originale' => $p->getLangueOriginale(),
'prix_reference' => $p->getPrixReference(),
'prix_reference_ca' => $p->getPrixReferenceCa(),
'prix_vente' => $prix_vente,
'prix_vente_ca' => $prix_vente_ca,
'date_fin_precommande' => $date_fin_precommande,
'is_new' => $p->getTitreALaUne(),
'is_bestseller' => $p->getBestSeller(),
'is_bestseller_ca' => $p->getBestSellerCa(),
'is_exclu_numerique' => $p->getProduitAppel(),
'date_creation' => ($p->getDateCreation() != null) ? $p->getDateCreation()->format('c') : null,
'date_modification' => ($p->getDateUpdate() != null) ? $p->getDateUpdate()->format('c') : null,
'alias_url' => $p->getAliasUrl(),
'promotion' => $p->getPrixReference() != null && $p->getPrixReference() != $prix_vente,
'promotion_ca' => $p->getPrixReferenceCa() != null && $p->getPrixReferenceCa() != $prix_vente_ca,
'taux_tva' => $tva,
'preorder' => $precommande,
'preorder_ca' => $precommandeCa,
'genres' => $genres,
'editor' => $editorName,
'id' => $p->getId(),
'activate' => $p->getActive(),
'activate_free_chapter' => $p->getBoolChapitreGratuit(),
'date_updated' => $p->getDateUpdate(),
'date_updated_timestamp' => $p->getDateUpdate() ? $p->getDateUpdate()->getTimestamp() : null,
'exclus' => $p->getProduitAppel(),
'title_on_page_one' => $p->getTitreALaUne(),
'bibliostream' => $p->getBibliostream(),
'isCa' => $p->getBoolCad(),
'isEur' => $p->getBoolEur(),
'tome' => $p->getNumeroTome(),
'url_origin' => $p->getUrlOriginePresentationFr(),
'video' => $p->getVideo(),
'year_edition' => $p->getAnneeEdition(),
'year_production' => $p->getAnneeProduction(),
'collections' => $collectionDatas,
'duree_min' => $p->getDureeMin(),
'isbn' => $p->getIsbn(),
'editor_number' => $p->getNumeroEditeur(),
'ean_download' => $p->getEanTelechargement(),
'ean_lend' => $p->getEanPret(),
'ean' => $p->getEanTelechargement(),
'abonnement' => $p->getAbonnement(),
'abonnementCT' => $p->getIsAbonnementCT(),
'isJeunesse' => $jeunesse,
'translator' => $translatorDatas,
'director' => $directorDatas,
'compositor' => $compositorDatas,
'image_liste_uri' => $p->getImageListeName(),
'image_hd_uri' => $p->getImageHdName(),
'product_uri' => $p->getAliasUrl(),
'news' => $p->getTitreALaUne(),
'bestseller' => $p->getBestSeller(),
'bestseller_ca' => $p->getBestSellerCa(),
'most_pre_purchased' => $p->getMostPrePurchased(),
'most_pre_purchased_ca' => $p->getMostPrePurchasedCa(),
'date_creation_timestamp' => $p->getDateCreation()->getTimestamp(),
'date_fin_precommande_ca' => $p->getDateFinPrecommandeCa(),
'duration' => intval($p->getDureeMin()),
'prix_pnb' => (float)$price_streaming,
'tva_pnb' => (float)$tva_streaming,
'simultaneite_pnb' => $simultaneite_streaming,
'nb_prets_pnb' => $nb_prets_streaming,
'duree_exploitation_pnb' => $duree_exploitation_streaming,
'duree_pret_pnb' => $duree_pret_streaming,
'nb_tracks' => $p->getNbTracks(),
'nb_audio_file' => $p->getNbAudioFiles(),
'weight' => $p->getPoids(),
'prix_pns' => (float)$price_education,
'tva_pns' => (float)$tva_education,
'simultaneite_pns' => $simultaneite_education,
'nb_prets_pns' => $nb_prets_education,
'duree_exploitation_pns' => $duree_exploitation_education,
'duree_pret_pns' => $duree_pret_education,
'coup_de_coeur' => $p->getCoupDeCoeurLibraire(),
'coup_de_coeur_ca' => $p->getCoupDeCoeurLibraireCa(),
'cat1A' => $p->getCat1A(),
'cat2A' => $p->getCat2A(),
'cat1B' => $p->getCat1B(),
'cat2B' => $p->getCat2B(),
'cat3' => $p->getCat3(),
'livre_d_ici' => $p->getLivreDIci(),
);
if ($type === 'preorder') {
if (($country === 'fr' && $precommande === true) || ($country === 'ca' && $precommandeCa === true)) {
$results[] = $tmp;
}
} else {
$results[] = $tmp;
}
}
}
return $results;
}
/**
* @Route("/api/download-invoice", name="download_invoice")
*/
public function downloadInvoice(Request $request): JsonResponse {
$token = $request->headers->get('token');
$userToken = $this->em->getRepository('App:AuthToken')->findOneBy(array('value' => $token));
if (!$request->request->get('idTransaction') || !$userToken) {
return new JsonResponse(array("error" => true, "message" => "Transaction ID or user token were not found."), 500);
}
$transaction = $this->em->getRepository(Transaction::class)->findOneBy(array('reference_interne' => $request->request->get('idTransaction')));
if (!$transaction) {
return new JsonResponse(array("error" => true, "message" => "Transaction entity not found."), 500);
}
$devise = $transaction->getDevise();
$deviseId = $devise->getId();
$user = $transaction->getClient();
$cartObject = json_decode($transaction->getCartJson());
if ($cartObject && $deviseId === 4) {
$productsCart = $cartObject->items;
$cartObject->giftMemberships = [];
} else {
$cartObject = new \stdClass();
$cartObject->subscriptionDiscount = 0;
$cartObject->discount = 0;
$cartObject->isGiftCard = false;
$cartObject->giftCards = [];
$cartObject->credits_cart = 0;
$cartObject->giftMemberships = [];
$codePromo = $transaction->getCodeBonAchat();
$promo = $this->em->getRepository('App:Promotion')->getCartPromo($codePromo, $deviseId);
if ($promo === null) {
$promo = $this->em->getRepository('App:CampagneCode')->getCartPromo($codePromo);
if ($promo === null) {
$promo = $this->em->getRepository('App:CarteCadeau')->getCartPromo($codePromo, $deviseId);
if ($promo) {
$cartObject->isGiftCard = true;
}
}
}
if ($cartObject->isGiftCard && $deviseId === 4) {
$cartObject->subtotal = $transaction->getMontantHtNominal();
} else {
$cartObject->subtotal = $transaction->getMontantHtReel();
}
$cartObject->total = $transaction->getMontantTtcReel();
if ($promo) {
$cartObject->discount = $transaction->getMontantBonAchat();
}
$productsCart = [];
$transactionItems = $this->em->getRepository('App:TransactionItems')->findBy([
'transaction' => $transaction,
]);
$cartObject->tps = 0;
$cartObject->tvq = 0;
foreach ($transactionItems as $transactionItem) {
$product = $transactionItem->getProduit();
$giftCard = $transactionItem->getCartecadeau();
$transactionType = $transactionItem->getType();
$transactionTypeId = $transactionType->getId();
if ($product) {
$productTemp = new \stdClass();
$productTemp->id = $product->getId();
$productTemp->title = $product->getTitreFr();
$productTemp->price_no_discount = $transactionItem->getPrixTtc();
$productsCart[] = $productTemp;
if ($deviseId === 1) {
$cartObject->tps += $transactionItem->getTvaMontant();
} else if ($deviseId === 4) {
$priceWithoutTaxes = $transactionItem->getTtcReel()/1.14975;
$cartObject->tps += $priceWithoutTaxes * (5/100);
$cartObject->tvq += $priceWithoutTaxes * (9.975/100);
}
} else if ($giftCard) {
$productTemp = new \stdClass();
$productTemp->id = $giftCard->getId();
$productTemp->title = 'Carte cadeau';
$productTemp->price = $giftCard->getValeur();
$cartObject->giftCards[] = $productTemp;
} else if ($transactionTypeId === 4) {
$giftMembership = $transactionItem->getGiftMembership();
$productTemp = new \stdClass();
$productTemp->id = $giftMembership->getId();
$productTemp->title = 'Abonnement cadeau (' . $giftMembership->getMonths() . ' mois)';
$productTemp->price = $transactionItem->getHtReel();
$cartObject->tps += $transactionItem->getHtReel() * (5/100);
$cartObject->tvq += $transactionItem->getHtReel() * (9.975/100);
$cartObject->giftMemberships[] = $productTemp;
}
}
if ($transaction->getCredits()) {
$cartObject->credits_cart = $transaction->getCredits();
}
}
$decimalSeparator = '.';
$thousandsSeparator = ',';
if ($deviseId === 4) {
$decimalSeparator = ',';
$thousandsSeparator = '.';
}
$subtotal = number_format($cartObject->subtotal, 2, $decimalSeparator, $thousandsSeparator);
if ($cartObject->subtotal >= 0 && $cartObject->subtotal < 10) {
$subtotal = '0' . $subtotal;
}
$tps = number_format($cartObject->tps, 2, $decimalSeparator, $thousandsSeparator);
if ($cartObject->tps >= 0 && $cartObject->tps < 10) {
$tps = '0' . $tps;
}
$tvq = number_format($cartObject->tvq, 2, $decimalSeparator, $thousandsSeparator);
if ($cartObject->tvq >= 0 && $cartObject->tvq < 10) {
$tvq = '0' . $tvq;
}
$total = number_format($cartObject->total, 2, $decimalSeparator, $thousandsSeparator);
if ($cartObject->total >= 0 && $cartObject->total < 10) {
$total = '0' . $total;
}
$discountPromo = "";
$discountGiftCard = "";
$subscriptionDiscount = "";
$productsFinal = [];
if ($cartObject->subscriptionDiscount != 0) {
$subscriptionDiscount .= number_format($cartObject->subscriptionDiscount, 2, $decimalSeparator, $thousandsSeparator);
if ($cartObject->subscriptionDiscount >= 0 && $cartObject->subscriptionDiscount < 10) {
$subscriptionDiscount = '0' . $subscriptionDiscount;
}
}
if ($cartObject->isGiftCard && $cartObject->discount != 0) {
$discountGiftCard .= number_format($cartObject->discount, 2, $decimalSeparator, $thousandsSeparator);
if ($cartObject->discount >= 0 && $cartObject->discount < 10) {
$discountGiftCard = '0' . $discountGiftCard;
}
}
if (!$cartObject->isGiftCard && $cartObject->discount != 0) {
$discountPromo .= number_format($cartObject->discount, 2, $decimalSeparator, $thousandsSeparator);
if ($cartObject->discount >= 0 && $cartObject->discount < 10) {
$discountPromo = '0' . $discountPromo;
}
}
$counter = 0;
foreach ($productsCart as $product) {
$productEntity = $this->em->getRepository('App:Produit')->find($product->id);
$productsFinal[$counter]["title"] = $product->title;
$productsFinal[$counter]["ean"] = $productEntity->getEanTelechargement();
$productsFinal[$counter]["quantity"] = 1;
if ($deviseId === 1) {
$productsFinal[$counter]["price"] = number_format($product->price_no_discount, 2, $decimalSeparator, $thousandsSeparator);
} else if ($deviseId === 4) {
$productsFinal[$counter]["price"] = number_format($product->price_no_discount/1.14975, 2, $decimalSeparator, $thousandsSeparator) . ' $';
if (($product->price_no_discount/1.14975) >= 0 && ($product->price_no_discount/1.14975) < 10) {
$productsFinal[$counter]["price"] = '0' . $productsFinal[$counter]["price"];
}
}
$counter++;
}
if ($cartObject->credits_cart != 0) {
$productsFinal[$counter]["ean"] = 'CREDITS'.($cartObject->credits_cart*5);
$productsFinal[$counter]["title"] = 'Lot de '.($cartObject->credits_cart*5).' crédits';
$productsFinal[$counter]["price"] = number_format($cartObject->credits_cart*74.99, 2, $decimalSeparator, $thousandsSeparator) . ' $';
$productsFinal[$counter]["quantity"] = 1;
$counter++;
}
foreach ($cartObject->giftCards as $giftCard) {
$productsFinal[$counter]["ean"] = $giftCard->id;
$productsFinal[$counter]["title"] = "Carte cadeau";
if ($deviseId === 1) {
$productsFinal[$counter]["price"] = $giftCard->price;
} else if ($deviseId === 4) {
$productsFinal[$counter]["price"] = number_format($giftCard->price, 2, $decimalSeparator, $thousandsSeparator) . ' $';
}
$productsFinal[$counter]["quantity"] = 1;
$counter++;
}
foreach ($cartObject->giftMemberships as $giftMembership) {
$productsFinal[$counter]["ean"] = $giftMembership->id;
$productsFinal[$counter]["title"] = $giftMembership->title;
$productsFinal[$counter]["price"] = number_format($giftMembership->price, 2, $decimalSeparator, $thousandsSeparator) . ' $';;
$productsFinal[$counter]["quantity"] = 1;
$counter++;
}
$productsJsonString = '';
$counter = 0;
foreach ($productsFinal as $product) {
$productsJsonString .= '{
"ean": "'.$product['ean'].'",
"quantity": "'.$product['quantity'].'",
"product": "'.$product['title'].'",
"price": "'.$product['price'].'"
}';
if ($counter != (sizeof($productsFinal) - 1)) {
$productsJsonString .= ',';
}
$counter++;
}
$downloadURL = '';
$client = HttpClient::create();
$templateId = '';
if ($deviseId === 1) {
$templateId = 'C18B2177-2FF8-431E-8CA7-19DC99B67388';
} else if ($deviseId === 4) {
$templateId = 'D28EC1E5-E228-45D7-947A-767F344EAEF1';
}
try {
$res = $client->request('POST', "https://api.pdfmonkey.io/api/v1/documents", [
'headers' => [
'Authorization' => 'Bearer ' . $_ENV["PDFMONKEY_API_KEY"],
'Content-Type' => 'application/json'
],
'body' => '{
"document": {
"document_template_id": "'.$templateId.'",
"status": "pending",
"payload": {
"client_name": "'.$user->getPrenom().' '.$user->getNom().'",
"client_address": "'.$user->getAdressePostale().'",
"client_city": "'.$user->getVille().'",
"client_zip": "'.$user->getCodePostal().'",
"client_state": "'.$user->getProvince().'",
"client_country": "'.$user->getPays().'",
"client_email": "'.$user->getEmail().'",
"date": "'.$transaction->getDate()->format('d/m/Y').'",
"transaction": "'.$transaction->getReferenceInterne().'",
"payment_mode": "'.$transaction->getTerminal().' (Carte)",
"promo_code": "'.$transaction->getCodeBonAchat().'",
"promo_discount": "'.$discountPromo.'",
"membership_discount": "'.$subscriptionDiscount.'",
"gift_card_discount": "'.$discountGiftCard.'",
"subtotal": "'.$subtotal.'",
"tps": "'.$tps.'",
"tvq": "'.$tvq.'",
"total": "'.$total.'",
"item": [{
"produit":[
'.$productsJsonString.'
]}
]
}
}
}'
]);
$jsonString = $res->getContent();
$documentData = json_decode($jsonString, true);
if ($documentData) {
$counter = 0;
while (true) {
sleep(2);
$res = $client->request('GET', "https://api.pdfmonkey.io/api/v1/document_cards/" . $documentData["document"]["id"], [
'headers' => [
'Authorization' => 'Bearer ' . $_ENV["PDFMONKEY_API_KEY"],
'Content-Type' => 'application/json'
]
]);
$jsonString = $res->getContent();
$documentCardData = json_decode($jsonString, true);
if ($documentCardData['document_card']['download_url'] !== null) {
$downloadURL = $documentCardData['document_card']['download_url'];
break;
}
if ($counter > 10) {
break;
}
$counter++;
}
} else {
return new JsonResponse(array("error" => true, "message" => "No document data."), 500);
}
} catch (Exception|RedirectionExceptionInterface|TransportExceptionInterface|ClientExceptionInterface|ServerExceptionInterface $e) {
return new JsonResponse(array("error" => true, "message" => $e->getMessage()), 500);
}
return new JsonResponse(array("success" => true, "message" => "Success", "downloadURL" => $downloadURL), 200);
}
}