<?php
namespace App\Controller\Institution;
use App\Controller\BaseController;
use App\Entity\Addressing\Country;
use App\Entity\Addressing\County;
use App\Entity\Institution\Product;
use App\Entity\Institution\ProductType;
use App\Manager\BitbagStatic\BlockManager;
use App\Manager\Cart\CartManager;
use App\Manager\Institution\InstitutionManager;
use App\Manager\Partner\PartnerManager;
use App\Service\Institution\ArrApiService;
use App\Service\Institution\OrderProductService;
use App\Service\StaticPagesBitbagService;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class ProductController extends BaseController
{
public function indexAction(Request $request): Response
{
$request->getSession()->remove('iframeSourceLink');
$slug = $request->get('slug');
/** @var Product $product */
$product = $this->getEntityManager()->getRepository(Product::class)->findBySlug($slug);
$country = $this->getEntityManager()->getRepository(Country::class)->find(Country::RO_COUNTRY_ID);
$counties = $this->getEntityManager()->getRepository(County::class)->findAllByCountryForSelect($country);
$productAsArray = $product->toArray();
$productAsArray['hasLegalPerson'] = $product->getProductType()->getInstitution()->isLegalPerson();
$productAsArray['hasPhysicalPerson'] = $product->getProductType()->getInstitution()->isPhysicalPerson();
$productAsArray['physicalIBANs'] = $product->getProductType()->getPhysicalIBANs();
$productAsArray['legalIBANs'] = $product->getProductType()->getLegalIBANs();
$productAsArray['isArr'] = $product->getProductType()->getCode() == ProductType::ARR_CODE;
$productAsArray['category'] = $product->getProductType()->getCategory();
$selectedCountyCode = $request->get('county')
? explode('-', $request->get('county'))[1] : null;
if (strlen($selectedCountyCode) <= 2) {
foreach ($counties as $county) {
if (strtoupper($county['value']) == strtoupper($selectedCountyCode)) {
$productAsArray['selectedCounty'] = strtoupper($county['value']);
}
}
}
if ($request->get('city')) {
$parts = explode('-', $request->get('city'));
$cityId = $parts[sizeof($parts) - 1];
if ($cityId) {
$productAsArray['selectedCity'] = (int)$cityId;
}
}
if ($publicToken = $request->get('partnerPublicToken')) {
$partnerService = $this->getContainer()->get('app.service.partner.partner');
$partnerService->verifyToken($request, PartnerManager::CAN_ISSUE_FINES_INDEX);
$partner = $partnerService->retrievePartner($publicToken);
if ($product->getProductType()->getCategory() === ProductType::CATEGORY_FINE) {
$routeName = 'app_shop_fines_iframe';
} else {
$routeName = 'app_shop_tariffs_iframe';
}
$request->getSession()->set('iframeSourceLink',
$this->generateUrl($routeName, ['partnerPublicToken' => $partner->getPublicToken()])
);
CartManager::removeAllProductsFromCartBySession($request->getSession());
}
return $this->render('@templates/Institution/product.html.twig', [
'publicToken' => $publicToken,
'product' => $productAsArray,
'accordionBlocksFaq' => StaticPagesBitbagService::getAllFilteredBlocksAsArray($this->getEntityManager(),
$product->getProductType()->getCategory() == ProductType::CATEGORY_FINE ?
BlockManager::BLOCK_ACCORDION_TEXT_FINES_CODE_PATTERN :
BlockManager::BLOCK_ACCORDION_TEXT_TARIFFS_CODE_PATTERN),
'keywordsForSeo' => StaticPagesBitbagService::getFirstFilteredBlocks($this->getEntityManager(),
$product->getProductType()->getCategory() == ProductType::CATEGORY_FINE ?
BlockManager::BLOCK_SEO_META_FINES_KEYWORD_CODE_PATTERN :
BlockManager::BLOCK_SEO_META_TARIFFS_KEYWORD_CODE_PATTERN),
'descriptionForSeo' => StaticPagesBitbagService::getFirstFilteredBlocks($this->getEntityManager(),
$product->getProductType()->getCategory() == ProductType::CATEGORY_FINE ?
BlockManager::BLOCK_SEO_META_FINES_DESCRIPTION_CODE_PATTERN :
BlockManager::BLOCK_SEO_META_TARIFFS_DESCRIPTION_CODE_PATTERN),
'counties' => $counties
]);
}
public function tariffsVerifyCnpCode(Request $request): Response
{
$arrService = new ArrApiService($this->getDoctrine()->getManager());
$product = $this->getEntityManager()->getRepository(Product::class)
->findBySlug($request->get('slug'));
$data = $arrService->getAll($product, $request->get('customerCNP'));
if (empty($data)) {
return new JsonResponse(['result' => false, 'message' => 'CNP invalid', 'errorCode' => 'no_data_for_cnp']);
}
return new JsonResponse(['result' => true, 'message' => 'CNP valid', 'data' => $data]);
}
public function retrieveProductsByCountyAndCityAction(Request $request): Response
{
if (!($countyCode = $request->get('county'))) {
return new JsonResponse();
}
$cityId = $request->get('city') ? (int)$request->get('city') : null;
$countyText = $request->get('countyText') ? trim($request->get('countyText')) : null;
$cityText = $request->get('cityText') ? trim($request->get('cityText')) : null;
$router = $this->getContainer()->get('router');
$type = $request->get('type');
$publicToken = $request->getSession()->get(PartnerManager::SESSION_PARTNER_PUBLIC_TOKEN_NAME);
$products = InstitutionManager::getProductsByLocation(
$this->getEntityManager(), $router, $type, $countyCode, $countyText, $cityId, $cityText, $publicToken
);
return $this->json($products);
}
public function submitData(): Response
{
/** @var OrderProductService $orderProductService */
$orderProductService = $this->getContainer()->get('app.service.institution.order_product');
$response = $orderProductService->storeNewProductInCart(
$this->getEntityManager(),
$this->getContainer()->getParameter('kernel.project_dir')
);
return new JsonResponse($response);
}
public function removeFromCart(): Response
{
/** @var OrderProductService $orderProductService */
$orderProductService = $this->getContainer()->get('app.service.institution.order_product');
$result = $orderProductService->removeFromCartSession();
return new JsonResponse(['result' => $result]);
}
public function fines(Request $request): Response
{
return $this->renderList($request, ['title' => 'Plata Amenzi', 'category' => 'fines', 'type' => 'fine']);
}
public function tariffs(Request $request): Response
{
return $this->renderList($request, ['title' => 'Plata Tarife', 'category' => 'tariffs', 'type' => 'tariff']);
}
private function renderList(Request $request, array $params): Response
{
$params = $this->addProductToParams($request, $params);
return $this->render('@templates/Front/Institution/list.html.twig', $params);
}
public function finesIframe(Request $request): Response
{
$partnerService = $this->getContainer()->get('app.service.partner.partner');
$partnerService->verifyToken($request, PartnerManager::CAN_ISSUE_FINES_INDEX);
$partner = $partnerService->retrievePartner($request->get('partnerPublicToken'));
$request->getSession()->set('iframeSourceLink', $this->generateUrl('app_shop_fines_iframe', [
'partnerPublicToken' => $partner->getPublicToken()
]));
return $this->renderIframe($request, [
'title' => 'Plata Amenzi',
'category' => 'fines',
'type' => 'fine',
'publicToken' => $partner->getPublicToken(),
]);
}
public function tariffsIframe(Request $request): Response
{
$partnerService = $this->getContainer()->get('app.service.partner.partner');
$partnerService->verifyToken($request, PartnerManager::CAN_ISSUE_FINES_INDEX);
$partner = $partnerService->retrievePartner($request->get('partnerPublicToken'));
$request->getSession()->set('iframeSourceLink', $this->generateUrl('app_shop_tariffs_iframe', [
'partnerPublicToken' => $partner->getPublicToken()
]));
return $this->renderIframe($request, [
'title' => 'Plata Tarife',
'category' => 'tariffs',
'type' => 'tariff',
'publicToken' => $partner->getPublicToken(),
]);
}
private function renderIframe(Request $request, array $params): Response
{
PartnerManager::checkQRCodeFlow($request);
$params = $this->addProductToParams($request, $params);
return $this->render('@templates/Front/Institution/iframe.html.twig', $params);
}
private function addProductToParams(Request $request, array $params): array
{
$country = $this->getEntityManager()->getRepository(Country::class)->find(Country::RO_COUNTRY_ID);
$params['counties'] = $this->getEntityManager()->getRepository(County::class)->findAllByCountryForSelect($country);
if (!($productSlug = $request->get('slug'))) {
$params['product'] = null;
} else {
/** @var Product $product */
$product = $this->getEntityManager()->getRepository(Product::class)->findBySlug($productSlug);
$params['product'] = $product->toArray();
$params['product']['hasLegalPerson'] = $product->getProductType()->getInstitution()->isLegalPerson();
$params['product']['hasPhysicalPerson'] = $product->getProductType()->getInstitution()->isPhysicalPerson();
$params['product']['physicalIBANs'] = $product->getProductType()->getPhysicalIBANs();
$params['product']['legalIBANs'] = $product->getProductType()->getLegalIBANs();
$params['product']['isArr'] = $product->getProductType()->getCode() == ProductType::ARR_CODE;
$params['product']['category'] = $product->getProductType()->getCategory();
}
return $params;
}
}