<?php
namespace App\Controller;
use App\Controller\DefaultValuesController;
use App\Entity\AllegroCategory;
use App\Entity\AllegroOffer;
use App\Entity\AllegroShippingRate;
use App\Entity\StanMag;
use App\Entity\StanMagAllegroParams;
use App\Entity\SystemConfig;
use App\Form\StanMagType;
use App\Integration\Marketplace\Allegro\AllegroRestApi;
use Doctrine\ORM\Query\ResultSetMapping;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\QueryBuilder;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/stanmag")
*/
class StanMagController extends AbstractController
{
private LoggerInterface $logger;
private TranslatorInterface $translator;
public function __construct(TranslatorInterface $translator, LoggerInterface $logger)
{
$this->translator = $translator;
$this->logger = $logger;
$this->logger->debug($this->logPrefix(__METHOD__).' ');
}
public static function getName($translator)
{
return $translator->trans("StanMag");
}
public static function getAdminName()
{
return "stanmag";
}
/**
* @Route("/", name="app_stanmag_index", methods={"GET"})
* @param ManagerRegistry $managerRegistry
* @return Response
*/
public function indexServer(ManagerRegistry $managerRegistry): Response
{
/** @var EntityManager $dm */
$dm = $managerRegistry->getManager();
$items = null;
return $this->render('app/stanMag/index.html.twig', [
'items' => $items,
'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
'categoryTitle' => self::getName($this->translator),
'adminMenu' => self::getAdminName(),
]);
}
/**
* @Route("/{id}/details", name="app_stanmag_show", methods={"GET"})
* @param string $id
* @param ManagerRegistry $managerRegistry
* @return Response
*/
public function show(string $id, ManagerRegistry $managerRegistry): Response
{
/** @var EntityManager $dm */
$dm = $managerRegistry->getManager();
/** @var StanMag $item */
$id = preg_replace("/-/","/",$id);
$item = $dm->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
$images = [];
if ($item) {
$images = $dm->getRepository(StanMag::class)->getStanMagSisdPhotos($item);
}
$eligible = $this->isEligibleForAllegro($id, $managerRegistry);
return $this->render('app/stanMag/show.html.twig', [
'item' => $item,
'images' => $images,
'eligible' => $eligible,
'path' => [],
'children' => [],
'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
'categoryTitle' => self::getName($this->translator),
'adminMenu' => self::getAdminName(),
]);
}
// -- with AGG PIPELINE -------
/**
* @Route("/find", name="app_stanmag_find", methods={"GET"})
* @param Request $request
* @param ManagerRegistry $managerRegistry
* @return Response
*/
public function findJson(Request $request, ManagerRegistry $managerRegistry): Response
{
/** @var EntityManager $dm */
$dm = $managerRegistry->getManager();
$alias = "s";
$prefix = $alias.'.';
$columns = $request->query->get('columns',null);
$draw = $request->query->getInt('draw',0);
$start = $request->query->getInt('start',0);
$length = $request->query->getInt('length',50);
$order = $request->query->get('order',null);
$orderBy = null;$orderDir = null;
if ($order) {
$orderColumnId = $order[0]['column'];
$orderDirection = $order[0]['dir'];
$orderBy = ($columns && isset($columns[$orderColumnId]['name'])) ? $prefix.$columns[$orderColumnId]['name'] : null;
$orderDir = ($orderDirection && $orderDirection == 'asc') ? 'ASC' : 'DESC';
}
$searchValue = "";
$searchField = $prefix.'nazwa';
$search = $request->query->all('search');
if ($search) {
$searchValue = trim($search['value']);
if ((int)$searchValue > 0) {
$searchField = $prefix.'nrEtykiety';
}
}
$countTotal = $dm->getRepository(StanMag::class)->count([]);
$criteria = [
];
// $rsm = new ResultSetMapping();
// $rsm->addEntityResult('StanMag', 's');
$queryFiltered = $dm->createQueryBuilder();
$queryFilteredCount = $dm->createQueryBuilder();
//$queryFiltered = $dm->createNativeQuery("select * from StanMag s where nrEtykiety like '%".$searchValue."%'", $rsm);
$fields = [];
$fields[] = $alias."."."nrEtykiety";
$fields[] = $alias."."."kodLokalizacji";
$fields[] = $alias."."."nazwa";
$fields[] = $alias."."."opisTowaru";
$fields[] = $alias."."."ilosc";
$fields[] = $alias."."."cena";
$fields[] = $alias."."."usun";
//implode(", ",$fields)
// Get Total Filtered Count of records based on search criteria
$queryFiltered
->select('s','m','st')
//->select(implode(",",$fields),'m','st')
// ->select(" ".implode(",",$fields))
// ->addSelect('m')
// ->addSelect('st')
->from(StanMag::class, $alias)
->leftJoin($alias.'.model', 'm')
->leftJoin($alias.'.stanMagStatus', 'st');
$queryFiltered->where('1=1');
$queryFilteredCount->select('count(s.nrEtykiety)')->from(StanMag::class, $alias)->where('1=1');
if(strlen($searchValue) > 0) {
if ($searchField == 'nrEtykiety') {
$queryFiltered->andWhere(
// $searchField." like '".$searchValue."%'"
$queryFiltered->expr()->like('lower('.$searchField.')', "'".strtolower($searchValue)."%'")
);
$queryFilteredCount->andWhere(
// $searchField." like '".$searchValue."%'"
$queryFilteredCount->expr()->like('lower('.$searchField.')', "'".strtolower($searchValue)."%'")
//$queryFilteredCount->expr()->like($searchField, "'".$searchValue."%'")
);
//$queryFiltered->field($searchField)->equals(new \MongoDB\BSON\Regex('^'.$searchValue.''));
} else {
$queryFiltered->andWhere(
// $queryFiltered->expr()->like($searchField, "'%".$searchValue."%'")
$queryFiltered->expr()->like('lower('.$searchField.')', "'%".strtolower($searchValue)."%'")
// $searchField." like '%".$searchValue."%'"
);
$queryFilteredCount->andWhere(
$queryFilteredCount->expr()->like('lower('.$searchField.')', "'%".strtolower($searchValue)."%'")
//$queryFilteredCount->expr()->like($searchField, "'%".$searchValue."%'")
// $searchField." like '%".$searchValue."%'"
);
}
}
$countFiltered = $queryFilteredCount->getQuery()->getSingleScalarResult();
//$items = $queryFiltered->getQuery()->getSQL();
//var_dump($items);die();
//$query = $queryFiltered;
//$res = $queryFiltered->getQuery()->select('count(s.nrEtykiety)')->getArrayResult();
//$countFiltered = (isset($res)) ? count($res) : 0;
if ($orderBy && $orderDir) $queryFiltered->orderBy($orderBy,$orderDir);
$items = $queryFiltered->getQuery()
->setFirstResult($start)
->setMaxResults($length)
->getArrayResult();
//$items = $items->getArrayResult();
//print_r($items);die();
if (!is_array($items)) $items = [];
$output = [
'draw' => $draw,
'search' => $search,
'order' => $order,
'recordsTotal' => $countTotal,
'recordsFiltered' => $countFiltered,
'data' => $items
];
$output = $this->container->get('serializer')->serialize($output,'json');
return new JsonResponse($output,200,[],true);
}
// -- with AGG PIPELINE END -------
/**
* @Route("/{id}/edit", name="app_stanmag_edit", methods={"GET","POST"})
*/
public function edit(Request $request, string $id, ManagerRegistry $managerRegistry): Response
{
/** @var EntityManager $dm */
$dm = $managerRegistry->getManager();
$id = preg_replace("/-/","/",$id);
$item = $dm->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
$form = $this->createForm(StanMagType::class, $item);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$dm->flush();
return $this->redirectToRoute('app_stanmag_show', ['id' => $item->getSlug() ]);
}
return $this->render('app/stanMag/edit.html.twig', [
'item' => $item,
'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
'categoryTitle' => self::getName($this->translator),
'form' => $form->createView(),
'adminMenu' => self::getAdminName(),
]);
}
/**
* @Route("/new", name="app_stanmag_new", methods={"GET","POST"})
*/
public function new(Request $request, ManagerRegistry $managerRegistry): Response
{
/** @var EntityManager $dm */
$dm = $managerRegistry->getManager();
$item = new StanMag();
$form = $this->createForm(StanMagType::class, $item);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$dm->persist($item);
$dm->flush();
return $this->redirectToRoute('app_stanmag_index');
}
return $this->render('app/stanMag/new.html.twig', [
'item' => $item,
'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
'categoryTitle' => self::getName($this->translator),
'form' => $form->createView(),
'adminMenu' => self::getAdminName(),
]);
}
/**
* @Route("/{id}/allegro-publish/{productId}", name="app_stanmag_allegro_publish", methods={"GET"})
*/
public function publishOnAllegroFindProduct(Request $request, ManagerRegistry $managerRegistry, string $id, string $productId = ''): Response
{
/** @var EntityManager $em */
$em = $managerRegistry->getManager();
$id = preg_replace("/-/","/",$id);
//$productId = preg_replace("/-/","/",$id);
/** @var StanMag $item */
$item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
if (null === $item) {
return $this->redirectToRoute('app_stanmag_index');
}
$eligible = $this->isEligibleForAllegro($id, $managerRegistry);
if ($eligible['status'] == 0) {
// return error message;
return $this->redirectToRoute('app_stanmag_show', ['id' => $item->getSlug() ]);
}
$source = ($item->getKodLokalizacji() == 12) ? "waw" : "gru";
if ($item->getKodLokalizacji() == 99) $source = "aga";
$allegroClientId = $em->getRepository(SystemConfig::class)->getParameter('allegroClientId','allegro');
$allegroClientSecret = $em->getRepository(SystemConfig::class)->getParameter('allegroClientSecret','allegro');
$allegroAccessToken = $em->getRepository(SystemConfig::class)->getParameter('allegroAccessToken.'.$source,'allegro');
$api = new AllegroRestApi();
$api->setAccessToken($allegroAccessToken)
->setClientId($allegroClientId)
->setClientSecret($allegroClientSecret);
// if product ID provided
// if strlet productId == 0 - find the product form
// if productID == 0 - nno product, propose a product and present the form
// else - pull the product info from Allegro and present the form
$categoryId = 0;
if ($item->getCatalog() && $item->getCatalog()->getCatalogMapping()->getAllegroCategory()) {
$categoryId = $item->getCatalog()->getCatalogMapping()->getAllegroCategory()->getId();
}
// pull previously saved parameters from StanMagAllegroParams table
$prev = $em->getRepository(StanMag::class)->getAllegroParams($item);
if (strlen($productId) > 0) {
if($productId == '0') {
// raise form with no product
$product = null;
} else {
$product = $api->getProduct($productId);
if (!isset($product['id']) || !isset($product['parameters'])) {
// unable to pull the product through from Allegro
$product = null;
// unable to find the product, redirect back to product selection
return $this->redirectToRoute('app_stanmag_allegro_publish', ['id' => $item->getSlug() ]);
}
if (isset($product['category']['id'])) {
$categoryId = $product['category']['id'];
}
}
$categoryParams = $api->getParamsForCategory($categoryId);
// pre-populate parameters for the product based on the priority:
// global default parameters
// catalog parameters
// product parameters
//$titleDefault = substr(htmlspecialchars($item->getModel()->getMake()->getName()." ".$item->getModel()->getMake()." ".$item->getCatalog()->getKeywords()), 0, 75);
//$titleDefault = substr(htmlspecialchars($item->getModel()->getFullName()." ".$item->getCatalog()->getKeywords()), 0, 75);
$titleDefault = substr(htmlspecialchars($item->getModel()->getFullName()." ".$item->getName()), 0, 75)."";
// $keywords = (null !== $item->getCatalog() && strlen($item->getCatalog()->getKeywords()) > 0 ) ? $item->getCatalog()->getKeywords()." " : $item->getName();
// $defaultTitle = substr(htmlspecialchars($item->getModel()." "." ".$keywords), 0, 75);
// $titleDefault = (strlen($item->getTytulAukcji()) > 0) ? $item->getTytulAukcji() : $defaultTitle;
$title = (strlen($item->getTytulAukcji()) > 0) ? $item->getTytulAukcji() : $titleDefault;
$defaults = [
'global' => [
'Producent części' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultProducent','allegro'),
'Typ samochodu' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultTypSamochodu','allegro'),
'Stan' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultStan','allegro'),
'Wersja' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultWersja','allegro'),
'Produkt wprowadzony do obrotu na terenie UE przed 13.12.2024' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultObrotUE','allegro'),
'Jakość części (zgodnie z GVO)' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultJakoscGVO','allegro'),
]
];
$defaults['prev'] = $prev;
$defaults['title'] = trim($title);
$defaults['description'] = '';
// get default shipping rate
$defaultConfig = $em->getRepository(SystemConfig::class)->getParameter('allegroDefaults.'.$source,'allegro', true);
if (isset($defaultConfig['shipping'])) {
$defaults['delivery']['shippingRate'] = ''.$defaultConfig['shipping'];
}
$rateId = $item->getCatalog()->getCatalogMapping()->getAllegroShippingRate($source);
if (null !== $rateId && strlen($rateId) > 0) {
$defaults['delivery']['shippingRate'] = $rateId;
} else {
//$error = true; $errorMessage[] = "Unable to find shipping rate";
}
// using previous shipping rate
if (isset($prev['shippingRate']) && strlen($prev['shippingRate']) > 0) {
$defaults['delivery']['shippingRate'] = $prev['shippingRate'];
}
// get shipping rates for the localisation
$shippingRates = $em->getRepository(AllegroShippingRate::class)->findBy(['source' => $source],['name' =>'ASC']);
/** @var AllegroShippingRate $_rate */
foreach ($shippingRates as $_rate) {
$defaults['delivery']['shippingRates'][ $_rate->getId() ] = $_rate->getName();
}
$catalogDefaults = $item->getCatalog()->getCatalogMapping()->getAllegroDefaultValues();
if (count($catalogDefaults)> 0) {
foreach ($catalogDefaults as $_id => $_catalogDefault) {
if ($_catalogDefault != '') {
$defaults[$_id]['value'] = $_catalogDefault;
$defaults[$_id]['source'] = 'catalog';
}
}
}
if (is_array($categoryParams)) {
foreach($categoryParams as $categoryParam) {
$id = $categoryParam['id'];
if ($categoryParam['name'] == 'Numer katalogowy części' ) {
$nrOEM = $item->getNrOem();
if (strlen($nrOEM) < 1) $nrOEM = 'AK-'.$item->getSlug();
$defaults[$id]['value'] = $nrOEM;
$defaults[$id]['source'] = 'generic-oem';
}
// found global default value by name; values in global defaults are text so additional checks need to be done by name, not ID
if (isset($defaults['global'][ $categoryParam['name'] ])) {
$defaults[$id]['value'] = $defaults['global'][ $categoryParam['name'] ];
$defaults[$id]['source'] = 'global';
if ($categoryParam['name'] == 'Producent części' && $categoryParam['type'] == 'dictionary') {
foreach($categoryParam['dictionary'] as $dictionary) {
if (strtolower($dictionary['value']) == strtolower($item->getModel()->getMake()->getName())) {
$defaults[$id]['value'] = $dictionary['value'];
$defaults[$id]['source'] = 'make';
} else if (strtolower($dictionary['value']) == strtolower($item->getModel()->getMake()->getName())." oe") {
$defaults[$id]['value'] = $dictionary['value'];
$defaults[$id]['source'] = 'make';
}
}
}
}
// we have catalog defaults
if(isset($catalogDefault[ $id ])) {
$defaults[$id]['value'] = $catalogDefault;
$defaults[$id]['source'] = 'catalog';
}
if (isset($product['parameters'])) {
foreach($product['parameters'] as $productParameter) {
if ($productParameter['id'] == $id) {
if (isset($productParameter['valuesIds'][0])) {
$defaults[$id]['value'] = $productParameter['valuesIds'][0];
} elseif (isset($productParameter['values'][0])) {
$defaults[$id]['value'] = $productParameter['values'][0];
}
$defaults[$id]['source'] = 'product';
}
}
}
}
} else {
die("Error: no params for category $categoryId");
}
if (count($prev)> 0) {
foreach ($prev as $_default) {
if(isset($_default['id'])) {
if (is_array($_default['valuesIds'])) {
$_defaultValue = $_default['valuesIds'][0];
} elseif (is_array($_default['values'])) {
$_defaultValue = $_default['values'][0];
} else {
$_defaultValue = null;
}
if(null !== $_defaultValue) {
$defaults[$_default['id']]['value'] = $_defaultValue;
$defaults[$_default['id']]['source'] = 'previous';
}
}
}
}
//
// if (count($catalogDefaults)> 0) {
// foreach ($catalogDefaults as $id => $catalogDefault) {
// if ($catalogDefault != '') {
// $defaults[$id]['value'] = $catalogDefault;
// $defaults[$id]['source'] = 'catalog';
// }
// }
// }
return $this->render('app/stanMag/allegro-publish-form.html.twig', [
'item' => $item,
'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
'categoryTitle' => self::getName($this->translator),
'adminMenu' => self::getAdminName(),
'product' => $product,
'defaults' => $defaults,
'productId' => $productId,
'categoryId' => $categoryId,
'raw' => [
'id' => $id,
'categoryParams' => $categoryParams,
// 'products' => $products,
// 'params' => $params,
],
]);
} else {
// find product
$keywords = (null !== $item->getCatalog() && strlen($item->getCatalog()->getKeywords()) > 0 ) ? $item->getCatalog()->getKeywords()." " : $item->getName();
$defaultTitle = substr(htmlspecialchars($item->getModel()." "." ".$keywords), 0, 75);
//$defaultTitle = substr(htmlspecialchars($item->getModel()->getFullName()." ".$item->getName()), 0, 75)." ***";
$title = (strlen($item->getTytulAukcji()) > 0) ? $item->getTytulAukcji() : $defaultTitle;
$defaultPhrase = $item->getModel()->getFullName()." ".$item->getCatalog()->getName();
// prev
$prevProduct = null;
if (isset($prev['productId']) && strlen($prev['productId']) > 1) {
$prevProduct = $api->getProduct($prev['productId']);
}
$description = (strlen($item->getOpisTowaru()) > 0) ? $item->getOpisTowaru() : '';
return $this->render('app/stanMag/allegro-publish-find-product.html.twig', [
'item' => $item,
'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
'categoryTitle' => self::getName($this->translator),
'adminMenu' => self::getAdminName(),
'defaults' => [
'title' => $title,
'description' => $description,
'phrase' => $defaultPhrase,
],
'prevProduct' => $prevProduct,
'raw' => [
'productId' => $productId,
'id' => $id,
// 'products' => $products,
// 'params' => $params,
],
]);
}
}
/**
* @Route("/{id}/allegro-test", name="app_stanmag_test", methods={"GET"})
*/
public function test(Request $request, string $id, ManagerRegistry $managerRegistry)
{
/** @var EntityManager $em */
$em = $managerRegistry->getManager();
$id = preg_replace("/-/","/",$id);
//$productId = preg_replace("/-/","/",$id);
/** @var StanMag $item */
$item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
return $this->render('app/stanMag/allegro-publish.html.twig', [
'item' => $item,
'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
'categoryTitle' => self::getName($this->translator),
'adminMenu' => self::getAdminName(),
'defaults' => [
'title' => '',
'description' => '',
'phrase' => '',
],
'raw' => [
'productId' => '',
'id' => '',
// 'products' => $products,
// 'params' => $params,
],
]);
}
/**
* @Route("/{id}/allegro-publish-post", name="app_stanmag_allegro_publish_post", methods={"POST"})
*/
// the actual posting of the offer on Allegro
public function publishOnAllegroPOST(Request $request, string $id, ManagerRegistry $managerRegistry): Response
{
//print_r($_POST);die();
/** @var EntityManager $em */
$em = $managerRegistry->getManager();
$id = preg_replace("/-/","/",$id);
/** @var StanMag $item */
$item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
$eligible = $this->isEligibleForAllegro($id, $managerRegistry);
if ($eligible['status'] == 0) {
// return error message;
return $this->redirectToRoute('app_stanmag_show', ['id' => $item->getSlug() ]);
}
$source = ($item->getKodLokalizacji() == 12) ? "waw" : "gru";
$imagePathPrefix = "https://presim.pl/image/catalog/photos/";
if ($item->getKodLokalizacji() == 99) {
$source = "aga";
$imagePathPrefix = "https://ak20.autoczesci.market/photos/";
}
//$imagePathPrefix = $em->getRepository(SystemConfig::class)->getParameter('photoRootPath','master');
$allegroClientId = $em->getRepository(SystemConfig::class)->getParameter('allegroClientId','allegro');
$allegroClientSecret = $em->getRepository(SystemConfig::class)->getParameter('allegroClientSecret','allegro');
$allegroAccessToken = $em->getRepository(SystemConfig::class)->getParameter('allegroAccessToken.'.$source,'allegro');
$api = new AllegroRestApi();
$api->setAccessToken($allegroAccessToken)
->setClientId($allegroClientId)
->setClientSecret($allegroClientSecret);
$error = false;
$errorMessage = [];
if (!$item->isAvailable()) {
//$error = true;
$errorMessage[] = "Item not available";}
$_photos = $item->getStanMagPhotos();
if (count($_photos) < 1 ) {$error = true; $errorMessage[] = "No photos available";}
$output = [];
$output['id'] = $id;
$output['post'] = $_POST;
// ------ INITIAL API REQUEST --------
$apiRequest = [
'name' => trim($_POST['title']),
'language' => 'pl-PL',
'category' => [ 'id' => $_POST['category'] ],
'taxSettings' => [ 'rates' => [ [ 'rate' => '23.00', 'countryCode' => 'PL'] ] ],
'payments' => ['invoice' => 'VAT'],
'stock' => [ 'available' => 1, 'unit' => 'UNIT' ],
'publication' => [ 'duration' => null, 'status' => 'INACTIVE', ],
'sellingMode' => [
'format' => 'BUY_NOW', 'startingPrice' => null, 'minimalPrice' => null,
'price' => ['amount' => (100*$item->getCena())/100,'currency' => 'PLN']
],
'external' => ['id' => trim($item->getNrEtykiety())],
'location' => ['countryCode' => 'PL'],
];
// ------ DEFAULT VALUES --------
// get default values
// allegroDefaults.waw
$defaults = $em->getRepository(SystemConfig::class)->getParameter('allegroDefaults.'.$source,'allegro', true);
if (isset($defaults['city']) && isset($defaults['postcode']) && isset($defaults['province'])) {
$apiRequest['location'] = [
'city' => ''.$defaults['city'],
'postCode' => ''.$defaults['postcode'],
'province' => ''.$defaults['province'],
'countryCode' => $defaults['country'],
];
} else { $error = true; $errorMessage[] = "City, postcode or province is required";}
if (isset($defaults['impliedWarranty']) && isset($defaults['returnPolicy']) && isset($defaults['warranty'])) {
$apiRequest['afterSalesServices'] = [
'impliedWarranty' => ['id' => '' . $defaults['impliedWarranty']],
'returnPolicy' => ['id' => '' . $defaults['returnPolicy']],
'warranty' => ['id' => '' . $defaults['warranty']],
];
} else { $error = true; $errorMessage[] = "Implied Warranty or Return Policy is required";}
if (isset($defaults['shipping']) && isset($defaults['handlingTime'])) {
$apiRequest['delivery'] = [
'shippingRates' => ['id' => ''.$defaults['shipping']],
'handlingTime' => 'PT'.$defaults['handlingTime'].'H',
];
} else { $error = true; $errorMessage[] = "Shipping rates or handling Time is required";}
$rateId = $item->getCatalog()->getCatalogMapping()->getAllegroShippingRate($source);
if (null !== $rateId && strlen($rateId) > 0) {
$apiRequest['delivery']['shippingRates'] = ['id' => $rateId];
} else {
//$error = true; $errorMessage[] = "Unable to find shipping rate";
}
$shippingRate = $_POST['shippingRate'];
if (strlen($shippingRate) > 0) {
$apiRequest['delivery']['shippingRates'] = ['id' => $shippingRate];
}
// ------ PARAMETERS --------
$allegroProduct = trim($_POST['product']);
$productRequiredParameters = $api->getProductParamsForCategory($_POST['category']);
$productParameters = [];
foreach($_POST['params'] as $key => $val) {
if (strlen($val) > 0) {
if (strstr(''.$val, ''.$key)) {
$parameter = [ 'id' => $key, 'valuesIds' => [$val], 'values' => null, 'rangeValue' => null ];
} else {
//$parameter = [ 'id' => $key, 'valuesIds' => [], 'values' => [(string)$val], 'rangeValue' => null ];
$parameter = [ 'id' => $key, 'valuesIds' => null, 'values' => [(string)$val], 'rangeValue' => null ];
}
// if not XX
if (array_key_exists($key, $productRequiredParameters)) {
if ($key == '127415' && strlen($allegroProduct) > 1 ) continue;
$productParameters[] = $parameter;
} else {
$apiRequest['parameters'][] = $parameter;
}
}
}
// ------ PRODUCT --------
// Product info
// $responsible_name = 'autokasacja';
// $responsible_name = $defaults['responsiblePerson'];
// offer with product
if (strlen($allegroProduct) > 0) {
$productSet = [];
$productSet[0] = [
'product' => [
// 'id' => trim($allegroProduct),
'parameters' => $productParameters,
'images' => null,
],
'quantity' => ['value' => 1],
'responsiblePerson' => ['id' => $defaults['responsiblePerson'] ],
//'safetyInformation' => ['type' => 'NO_SAFETY_INFORMATION'],
'safetyInformation' => ['type' => 'TEXT', 'description' => 'Produkt wprowadzony do obrotu przed 13.12.2024'],
'marketedBeforeGPSRObligation' => true,
];
if (isset($defaults['responsibleProducer'])) $productSet[0]['responsibleProducer'] = ['id' => $defaults['responsibleProducer'] ];
if ($allegroProduct == '0') {
// add name instead of ID
$productSet[0]['product']['name'] = $item->getModel()->getFullName()." ".$item->getCatalog()->getName();
// add main image
if ($item->getPrimaryPhoto()) {
$photo = $imagePathPrefix . $item->getPrimaryPhoto()->getPhotoPath();
// send photo to Allegro, retrieve URL
$img = $this->curl_get_file_contents($photo);
$result = $api->postImage($img);
if (!isset($result['location'])) {
$error = true; $errorMessage[] = "unexpected API call result: [".json_encode($result)."] ";
} else {
$productSet[0]['product']['images'][0] = $result['location'];
}
} else { $error = true; $errorMessage[] = "Primary photo not found";}
} elseif(strlen($allegroProduct) > 1) {
//$productSet[0]['id'] = trim($allegroProduct);
$productSet[0]['product']['id'] = trim($allegroProduct);
}
$apiRequest['productSet'] = $productSet;
}
// main photo
// @TODO: create array of images to extract image URLs from Allegro
// @TODO: POST IMAGES before setting up the content here. URLs of images only;
$photos = [];
if ($item->getPrimaryPhoto()) {
$photo = $imagePathPrefix . $item->getPrimaryPhoto()->getPhotoPath();
// send photo to Allegro, retrieve URL
$img = $this->curl_get_file_contents( $photo);
$result = $api->postImage($img);
if (!isset($result['location'])) {
$error = true; $errorMessage[] = "unexpected API call result: [".json_encode($result)."] ";
} else {
$photos[0] = $result['location'];
}
} else { $error = true; $errorMessage[] = "Primary photo not found";}
if (count($_photos)>0) {
$i = 0;
foreach ($_photos as $_photo) {
if ($_photo->getIsPrimary() != 1) {
$i++;
if ($i >= 16) continue; // Allegro limit - 16 photos max
$photo = $imagePathPrefix . $_photo->getPhotoPath();
$img = $this->curl_get_file_contents( $photo);
$result = $api->postImage($img);
if (!isset($result['location'])) {
$error = true; $errorMessage[] = "unexpected API call result for photo $i : [".json_encode($result)."] ";
} else {
$photos[$i] = $result['location'];
}
}
}
} else { $error = true; $errorMessage[] = "Photos not available";}
// print_r($result);die();
// Offer Content
$apiRequest['description']['sections'] = [];
$apiRequest['description']['sections'][] = [
'items' => [
['type' => 'IMAGE', 'url' => $photos[0],],
['type' => 'TEXT', 'content' =>'<h1>'.$item->getNazwa().'</h1><p>do <b>'.$item->getModel().'</b></p>']
]
];
$template = $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultTemplate','allegro');
$content = $this->replacePlaceholders($template,$item);
$content = str_replace('%%OPIS%%',$_POST['description'],$content);
// save description and title in StanMag table
//$item->sdtOpisTowaru
$item->setOpisTowaru(trim($_POST['description']));
$item->setTytulAukcji(trim($_POST['title']));
$em->persist($item);
// if secondary image exists
if (isset($photos[1]) && strlen($photos[1]) > 1) {
$apiRequest['description']['sections'][] = [
'items' => [
['type' => 'TEXT', 'content' => ''.$content],
['type' => 'IMAGE', 'url' => ''.$photos[1],]
]
];
} else {
$apiRequest['description']['sections'][] = [
'items' => [
['type' => 'TEXT', 'content' => ''.$content]
]
];
}
$apiRequest['images'] = [];
// additional photos loop
// images
foreach($photos as $i => $photo) {
$image = (isset($photo)) ? ['url' => $photo] : null;
if ($image) {
$apiRequest['images'][$i] = $photo;
if ($i > 1) $apiRequest['description']['sections'][] = [
'items' => [
['type' => 'IMAGE', 'url' => $photo,]
]
];
}
}
$output['api_request'] = $apiRequest;
$auction_id = 0;
if ($error) {
$output['error'] = $errorMessage;
} else {
$result = $api->post('/sale/product-offers/',$apiRequest);
$output['api_result'] = $result;
$auction_id = (isset($result['id'])) ? (int)$result['id'] : 0;
if (isset($result['errors']) && count($result['errors']) > 0 ) {
$output['api_activate_result'] = "ERROR. Unable to activate";
$output['api_delete_result'] = $result;
} else {
if (isset($result['validation']['errors']) && count($result['validation']['errors']) < 1 && $auction_id > 0) {
$result = $api->publishOffersOnAllegro(array($auction_id));
$output['api_activate_result'] = $result;
if ($auction_id > 0) {
$category = $em->getRepository(AllegroCategory::class)->findOneBy(['id'=>$_POST['category']]);
$auction = new AllegroOffer();
//$auction->setCategory();
$auction->setId($auction_id);
$auction->setName(trim($_POST['title']));
if ($category)
$auction->setCategory($category);
$auction->setStanmag($item);
$auction->setQuantity(1);
$auction->setPrice((100*$item->getCena())/100);
$auction->setExternal($item->getNrEtykiety());
$auction->setStatus('PLACEHOLDER');
$em->persist($auction);
$em->flush();
$allegroParams = [];
// storing chosen product id
$allegroParams['productId'] = $allegroProduct;
// storing chosen shipping rate
$allegroParams['shippingRate'] = (isset($apiRequest['delivery']['shippingRates']['id'])) ? $apiRequest['delivery']['shippingRates']['id'] : '';
if(is_array($productParameters)) {
foreach ($productParameters as $productParameter) {
$allegroParams[$productParameter['id']] = $productParameter;
}
}
$em->getRepository(StanMag::class)->setAllegroParams($item,$auction_id,$allegroParams);
}
} else {
$output['api_activate_result'] = "ERROR. Unable to activate";
// remove INACTIVE;
$result = $api->deleteOfferFromAllegro($auction_id);
$output['api_delete_result'] = $result;
}
}
}
return $this->render('app/stanMag/allegro-publish-confirm.html.twig', [
'item' => $item,
'breadcrumbTitle' => DefaultValuesController::getBreadcrumbTitle(),
'categoryTitle' => self::getName($this->translator),
'adminMenu' => self::getAdminName(),
'auctionId' => $auction_id,
'request' => $_POST,
'result' => $output,
]);
// $output = $this->container->get('serializer')->serialize($output,'json');
// return new JsonResponse($output,200,[],true);
}
/**
* @Route("/{id}/allegroFindProduct", name="app_stanmag_find_allegro_product", methods={"GET"})
* @param Request $request
* @param ManagerRegistry $managerRegistry
* @return Response
*/
public function findAllegroProduct(Request $request, string $id, ManagerRegistry $managerRegistry): Response
{
/** @var EntityManager $dm */
$em = $managerRegistry->getManager();
$phrase = $request->query->get('phrase', "");
$id = preg_replace("/-/","/",$id);
$item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
$source = ($item->getKodLokalizacji() == 12) ? "waw" : "gru";
if ($item->getKodLokalizacji() == 99) $source = "aga";
$allegroClientId = $em->getRepository(SystemConfig::class)->getParameter('allegroClientId','allegro');
$allegroClientSecret = $em->getRepository(SystemConfig::class)->getParameter('allegroClientSecret','allegro');
$allegroAccessToken = $em->getRepository(SystemConfig::class)->getParameter('allegroAccessToken.'.$source,'allegro');
$api = new AllegroRestApi();
$api->setAccessToken($allegroAccessToken)
->setClientId($allegroClientId)
->setClientSecret($allegroClientSecret);
if ($phrase == "") {
$phrase = (strlen($item->getNrOem()) > 0) ? $item->getNrOem() : $item->getName()." ".$item->getModel()->getName();
$phrase = (strlen($item->getNrOem()) > 0) ? $item->getNrOem() : $item->getName()." ";
}
//$products = $api->getProducts($item->getCatalog()->getCatalogMapping()->getAllegroCategory()->getId(),$phrase);
$products = $api->getProducts(3,$phrase);
$output = [];
$output['phrase'] = $phrase;
$output['total'] = 0;
$output['products'] = [];
if (count($products) > 0) {
foreach ($products as $_product) {
$product = [
'id' => $_product['id'],
'name' => $_product['name'],
];
$product['category_id'] = (isset($_product['category']['id'])) ? $_product['category']['id'] : "";
$product['category_title'] = "";
if (strlen($product['category_id']) > 0) {
$category = $em->getRepository(AllegroCategory::class)->find($product['category_id']);
//$product['category_title'] = $category->getName();
$product['category_title'] = $category->getPathString();
}
$product['img_url'] = (is_array($_product['images']) && isset($_product['images'][0]['url'])) ? $_product['images'][0]['url'] : "";
if (isset($_product['parameters']) && is_array($_product['parameters'])) {
foreach ($_product['parameters'] as $_parameter) {
if ( in_array($_parameter['id'],['127415', '215858','247835','225693'])) {
$product['parameters'][$_parameter['id']] = $_parameter['name'];
// $product['parameters'][$_parameter['id']]['id'] = $_parameter['id'];
// $product['parameters'][$_parameter['id']]['name'] = $_parameter['name'];
// $product['parameters'][$_parameter['id']]['value'] = $_parameter['valuesLabels'];
$product['params'][$_parameter['name']] = $_parameter['valuesLabels'];
}
}
}
$output['products'][$product['id']] = $product;
}
$output['total'] = count($output['products']);
}
$output = $this->container->get('serializer')->serialize($output,'json');
return new JsonResponse($output,200,[],true);
}
/**
* @Route("/{id}/allegroGetProduct", name="app_stanmag_get_allegro_product", methods={"GET"})
* @param Request $request
* @param ManagerRegistry $managerRegistry
* @return Response
*/
public function getAllegroProduct(Request $request, string $id, ManagerRegistry $managerRegistry): Response
{
/** @var EntityManager $dm */
$em = $managerRegistry->getManager();
$categoryId = $request->query->get('category_id', "");
$id = preg_replace("/-/","/",$id);
$item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
$source = ($item->getKodLokalizacji() == 12) ? "waw" : "gru";
if ($item->getKodLokalizacji() == 99) $source = "aga";
$allegroClientId = $em->getRepository(SystemConfig::class)->getParameter('allegroClientId','allegro');
$allegroClientSecret = $em->getRepository(SystemConfig::class)->getParameter('allegroClientSecret','allegro');
$allegroAccessToken = $em->getRepository(SystemConfig::class)->getParameter('allegroAccessToken.'.$source,'allegro');
$api = new AllegroRestApi();
$api->setAccessToken($allegroAccessToken)
->setClientId($allegroClientId)
->setClientSecret($allegroClientSecret);
if ($categoryId == "") {
$categoryId = $item->getCatalog()->getCatalogMapping()->getAllegroCategory()->getId();
}
$result = $api->getParamsForCategory($categoryId);
$output = [];
$output['category_id'] = $categoryId;
$output['total'] = 0;
$output['parameters'] = [];
// @TODO: get default values from Stanmag or Katalog;
$defaults = [
'global' => [
'Producent części' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultProducent','allegro'),
'Typ samochodu' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultTypSamochodu','allegro'),
'Stan' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultStan','allegro'),
'Wersja' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultWersja','allegro'),
'Produkt wprowadzony do obrotu na terenie UE przed 13.12.2024' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultObrotUE','allegro'),
'Jakość części (zgodnie z GVO)' => $em->getRepository(SystemConfig::class)->getParameter('allegroDefaultJakoscGVO','allegro'),
]
];
$catalogDefaults = $item->getCatalog()->getCatalogMapping()->getAllegroDefaultValues();
if (count($catalogDefaults)> 0) {
foreach ($catalogDefaults as $id => $catalogDefault) {
if ($catalogDefault != '')
$defaults[$id] = $catalogDefault;
}
}
if (isset($result) && is_array($result)) {
foreach ($result as $_parameter) {
$output['parameters'][$_parameter['id']]['id'] = $_parameter['id'];
$output['parameters'][$_parameter['id']]['name'] = $_parameter['name'];
$output['parameters'][$_parameter['id']]['type'] = $_parameter['type'];
$output['parameters'][$_parameter['id']]['required'] = $_parameter['required'];
if (isset($defaults[$_parameter['id']])) {
$output['parameters'][$_parameter['id']]['value'] = $defaults[$_parameter['id']];
} elseif(array_key_exists($_parameter['name'], $defaults['global'])) {
$output['parameters'][$_parameter['id']]['value'] = $defaults['global'][$_parameter['name']];
// check Producent Czesci;
foreach($_parameter['dictionary'] as $dictionary) {
if (isset($dictionary['value']) && isset($dictionary['id']) && strtolower($dictionary['value']) == strtolower($item->getModel()->getMake()->getName())) {
$output['parameters'][$_parameter['id']]['value'] = $dictionary['id'];
}
}
} else {
$output['parameters'][$_parameter['id']]['value'] = '';
}
if (isset($_parameter['dictionary']) && is_array($_parameter['dictionary'])) {
$output['parameters'][$_parameter['id']]['dictionary'] = $_parameter['dictionary'];
}
}
}
$output['total'] = count($output['parameters']);
//$output = $result;
$output = $this->container->get('serializer')->serialize($output,'json');
return new JsonResponse($output,200,[],true);
}
/**
* @Route("/{id}/syncPhotos", name="app_stanmag_sync_photos", methods={"GET"})
* @param string $id
* @param ManagerRegistry $managerRegistry
* @return Response
*/
public function syncPhotos(string $id, ManagerRegistry $managerRegistry): Response
{
/** @var EntityManager $em */
$em = $managerRegistry->getManager();
/** @var StanMag $item */
$id = preg_replace("/-/","/",$id);
$item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
$sync = [];
if ($item) {
$sync = $em->getRepository(StanMag::class)->syncPhotosFromSource($item, 1);
}
//print_r($sync);die();
return $this->redirectToRoute("app_stanmag_show",['id'=>$item->getSlug()]);
}
/**
* @Route("/{id}/syncData", name="app_stanmag_sync_data", methods={"GET"})
* @param string $id
* @param ManagerRegistry $managerRegistry
* @return Response
*/
public function syncData(string $id, ManagerRegistry $managerRegistry): Response
{
/** @var EntityManager $em */
$em = $managerRegistry->getManager();
/** @var StanMag $item */
$id = preg_replace("/-/","/",$id);
$item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
$sync = [];
if ($item) {
$sync = $em->getRepository(StanMag::class)->getStanMagSisdPhotos($item);
if (isset($sync['data']) && is_array($sync['data'])) {
$em->getRepository(StanMag::class)->executeProcessItemStanmag($sync['data'],false);
}
}
//print_r($sync);die();
return $this->redirectToRoute("app_stanmag_show",['id'=>$item->getSlug()]);
}
private function isEligibleForAllegro(string $id, ManagerRegistry $managerRegistry): array
{
$output = [];
$error = false;
$errorMessage = [];
/** @var EntityManager $em */
$em = $managerRegistry->getManager();
$id = preg_replace("/-/","/",$id);
/** @var StanMag $item */
$item = $em->getRepository(StanMag::class)->findOneBy(['nrEtykiety'=> $id]);
if (!$item) {
$error = true; $errorMessage[] = "Stanmag not found";
} else {
$source = ($item->getKodLokalizacji() == 12) ? "waw" : "gru";
if ($item->getKodLokalizacji() == 99) $source = "aga";
if (!$item->isAvailable()) {$error = true;$errorMessage[] = "Item not available";}
$offers = $item->getAllegroOffers();
if (count($offers) > 0 ) {
foreach ($offers as $offer) {
if ($offer->getStatus() == 'ACTIVE' || $offer->getStatus() == 'INACTIVE' || $offer->getStatus() == 'PLACEHOLDER') {
//if ($offer->getStatus() == 'ACTIVE' ) {
$error = true;$errorMessage[] = "Active Allegro auction exists.";
}
}
}
if (count($item->getStanMagPhotos()) < 1 ) {$error = true; $errorMessage[] = "No photos available";}
if (!$item->getPrimaryPhoto()) {$error = true; $errorMessage[] = "Primary photo not found";}
// ------ DEFAULT VALUES --------
// get default values
// allegroDefaults.waw
$defaults = $em->getRepository(SystemConfig::class)->getParameter('allegroDefaults.'.$source,'allegro', true);
if (isset($defaults['city']) && isset($defaults['postcode']) && isset($defaults['province'])) {
} else { $error = true; $errorMessage[] = "City, postcode or province is required";}
if (isset($defaults['impliedWarranty']) && isset($defaults['returnPolicy']) && isset($defaults['warranty'])) {
} else { $error = true; $errorMessage[] = "Implied Warranty or Return Policy is required";}
if (isset($defaults['handlingTime'])) {
} else { $error = true; $errorMessage[] = "Handling Time is required";}
$rateId = $item->getCatalog()->getCatalogMapping()->getAllegroShippingRate($source);
if (null !== $rateId && strlen($rateId) > 0) {
} elseif(isset($defaults['shipping'])) {
} else { $error = true; $errorMessage[] = "Unable to find shipping rate";}
}
if ($error) {
$output['status'] = 0;
$output['error'] = $errorMessage;
} else {
$output['status'] = 1;
}
return $output;
// $output = $this->container->get('serializer')->serialize($output,'json');
// return new JsonResponse($output,200,[],true);
}
function curl_get_file_contents($URL)
{
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_URL, $URL);
$contents = curl_exec($c);
curl_close($c);
if ($contents) return $contents;
else return FALSE;
}
public function replacePlaceholders($template, StanMag $item) {
$content_new = $template;
$rocznik = $item->getRocznik();
$content_new = str_replace('%%NAZWA_KATALOG%%',$item->getCatalog(),$content_new);
$content_new = str_replace('%%NAZWA%%',$item->getNazwa(),$content_new);
$content_new = str_replace('%%MARKA%%',$item->getModel()->getMake(),$content_new);
$content_new = str_replace('%%MODEL%%',$item->getModel(),$content_new);
$content_new = str_replace('%%NUMER_ORYGINALU%%',$item->getNrOem(),$content_new);
$content_new = str_replace('%%ROCZNIK%%',$item->getModel()->getYearFrom()." - ".$item->getModel()->getYearTo(),$content_new);
if ($rocznik > 0) {
$content_new = str_replace('%%ROK_PRODUKCJI%%', $item->getRocznik(), $content_new);
} else {
$content_new = str_replace('%%ROK_PRODUKCJI%%', " ", $content_new);
}
if ($item->getVehicle() && strlen($item->getVehicle()->getNumerNadwozia()) > 0) {
$content_new = str_replace('%%NR_NADWOZIA%%', $item->getVehicle()->getNumerNadwozia(), $content_new);
} else {
$content_new = str_replace('%%NR_NADWOZIA%%', "", $content_new);
}
$content_new = str_replace('%%NR_ETYKIETY%%',$item->getNrEtykiety(),$content_new);
//$content_new = str_replace('%%OPIS%%',$item->getOpisTowaru(),$content_new);
return $content_new;
}
private function logPrefix($message)
{
$limit = 70;
$content = explode("::",$message);
$len = $limit - strlen($content[0]);
return $content[0].str_pad(' '.$content[1],$len,'.',STR_PAD_LEFT).' ';
}
}