src/Modules/VoucherCart/Service/CartService.php line 160

  1. <?php
  2. namespace App\Modules\VoucherCart\Service;
  3. use Symfony\Component\HttpFoundation\RequestStack;
  4. use Symfony\Contracts\Translation\TranslatorInterface;
  5. use Symfony\Component\Form\Form;
  6. use App\Modules\VoucherCart\Service\PredefinedVoucherService;
  7. class CartService
  8. {
  9.     private $_requestStack;
  10.     private $_translator;
  11.     private $_predefinedVoucherService;
  12.     private $_sessionKey 'voucher_cart';
  13.     private $_translationDomain 'voucherCart';
  14.     
  15.     public function __construct(
  16.             RequestStack $requestStack,
  17.             TranslatorInterface $translator,
  18.             PredefinedVoucherService $predefinedVoucherService)
  19.     {
  20.         $this->_requestStack $requestStack;
  21.         $this->_translator $translator;
  22.         $this->_predefinedVoucherService $predefinedVoucherService;
  23.     }
  24.     
  25.     public function getDetails()
  26.     {
  27.         $data $this->_getData();
  28.         $data['total_price'] = 0;
  29.         
  30.         foreach($data['vouchers'] as $key => $voucherData)
  31.         {
  32.             if ($voucherData['is_predefined'])
  33.             {
  34.                 $predefinedVoucherData $this->_predefinedVoucherService->getDetails($voucherData['data']['id'], false);
  35.                 
  36.                 $voucherData['name'] = $predefinedVoucherData['package']->getNameInCart();
  37.             }
  38.             else
  39.                 $voucherData['name'] = $this->_translator->trans('Voucher kwotowy', [], $this->_translationDomain);
  40.             
  41.             $data['vouchers'][$key] = $voucherData;
  42.             
  43.             $data['total_price'] += $voucherData['price'] * $voucherData['quantity'];
  44.         }
  45.         
  46.         return $data;
  47.     }
  48.     
  49.     public function isEmpty()
  50.     {
  51.         return empty($this->_getData()['vouchers']);
  52.     }
  53.     
  54.     public function addVoucher(Form $form, &$errorMessage null)
  55.     {
  56.         $errorMessage null;
  57.         $formType $form->getConfig()->getType()->getInnerType();
  58.         $voucherData $form->getData();
  59.         $cartVoucherData = array(
  60.             'is_predefined' => false,
  61.             'image_url' => $formType->settingsData['image_url'],
  62.             'price' => $voucherData['amount'],
  63.             'quantity' => $voucherData['quantity'],
  64.             'data' => $voucherData
  65.         );
  66.         $cartData $this->_getData();
  67.         
  68.         if (!$this->_validateVoucher($cartData$cartVoucherData$formType->settingsData['entity']->getPackage()->getCurrencyCode(), $errorMessage))
  69.             return false;
  70.         
  71.         $cartData['vouchers'][] = $cartVoucherData;
  72.         
  73.         $this->_setData($cartData);
  74.         
  75.         return true;
  76.     }
  77.     
  78.     public function addPredefinedVoucher(array $voucherData$quantity 1, &$errorMessage null)
  79.     {
  80.         $errorMessage null;
  81.         $cartVoucherData = array(
  82.             'is_predefined' => true,
  83.             'image_url' => $voucherData['image_url'],
  84.             'price' => $voucherData['price'],
  85.             'quantity' => $quantity,
  86.             'data' => array('id' => $voucherData['id'])
  87.         );
  88.         $cartData $this->_getData();
  89.         if (!$this->_validateVoucher($cartData$cartVoucherData$voucherData['package']->getCurrencyCode(), $errorMessage))
  90.             return false;
  91.         $cartData['vouchers'][] = $cartVoucherData;
  92.         
  93.         $this->_setData($cartData);
  94.         
  95.         return true;
  96.     }
  97.     
  98.     private function _validateVoucher(array &$cartData, array &$cartVoucherData$currencyCode, &$errorMessage)
  99.     {
  100.         if ($cartData['currency_code'] == '')
  101.             $cartData['currency_code'] = $currencyCode;
  102.         elseif ($currencyCode != $cartData['currency_code'])
  103.         {
  104.             $errorMessage $this->_translator->trans('Koszyk nie może zawierać voucherów wielowalutowych.', [], $this->_translationDomain);
  105.             return false;
  106.         }
  107.         
  108.         return true;
  109.     }
  110.     
  111.     public function updateCartFromForm(Form $form)
  112.     {
  113.         $formType $form->getConfig()->getType()->getInnerType();
  114.         
  115.         $cartData $this->_getData();
  116.         foreach(array_keys($cartData['vouchers']) as $cartVoucherIndex)
  117.         {
  118.             if (!in_array($cartVoucherIndexarray_keys($form['vouchers']->getData())))
  119.                 unset($cartData['vouchers'][$cartVoucherIndex]);
  120.         }
  121.         
  122.         foreach($form['vouchers'] as $index => $voucherForm)
  123.         {
  124.             if (!isset($cartData['vouchers'][$index]))
  125.                 continue;
  126.             
  127.             $cartData['vouchers'][$index]['quantity'] = max($voucherForm['quantity']->getData(), 1);
  128.         }
  129.         
  130.         if (!$cartData['vouchers'])
  131.             $cartData['currency_code'] = null;
  132.         
  133.         $cartData['payment_method'] = $form['paymentMethod']->getData();
  134.         $this->_setData($cartData);
  135.         $formType->cartData $this->getDetails();
  136.     }
  137.     
  138.     public function clear()
  139.     {
  140.         $this->_setData(null);
  141.     }
  142.     
  143.     private function _getData()
  144.     {
  145.         $data $this->_requestStack->getSession()->get($this->_sessionKey);
  146.         
  147.         if (!$data)
  148.         {
  149.             $data = array(
  150.                 'vouchers' => array(),
  151.                 'currency_code' => null,
  152.                 'payment_method' => null
  153.             );
  154.         }
  155.         
  156.         return $data;
  157.     }
  158.     
  159.     private function _setData($data)
  160.     {
  161.         $this->_requestStack->getSession()->set($this->_sessionKey$data);
  162.     }
  163. }