src/Front/Modules/Cart/Service/CartService.php line 345
<?phpnamespace App\Front\Modules\Cart\Service;use Symfony\Component\HttpFoundation\RequestStack;use Symfony\Component\Form\Form;use Doctrine\Persistence\ManagerRegistry;use App\Admin\Modules\OnlineService\Service\CreatorPriceListService as AdminCreatorPriceListService;use App\Admin\Modules\OnlineService\Entity\OnlineService;use App\Admin\Modules\OnlineService\Entity\OnlineServiceCreatorCategoryItem;use App\Modules\User\Service\UserService;use App\Front\Modules\OnlineService\Service\OnlineServiceService;use App\Front\Modules\OnlineService\Service\OnlineServiceRepositoryService;class CartService{const ITEM_TYPE_ONLINE_SERVICE = 1;const ITEM_TYPE_CREATOR_ONLINE_SERVICE = 2;private $_requestStack;private $_doctrine;private $_adminCreatorPriceListService;private $_userService;private $_onlineServiceService;private $_onlineServiceRepositoryService;private $_sessionKey = 'cart';public function __construct(RequestStack $requestStack,ManagerRegistry $doctrine,AdminCreatorPriceListService $adminCreatorPriceListService,UserService $userService,OnlineServiceService $onlineServiceService,OnlineServiceRepositoryService $onlineServiceRepositoryService){$this->_requestStack = $requestStack;$this->_doctrine = $doctrine;$this->_adminCreatorPriceListService = $adminCreatorPriceListService;$this->_userService = $userService;$this->_onlineServiceService = $onlineServiceService;$this->_onlineServiceRepositoryService = $onlineServiceRepositoryService;}private static $_cartDetails;public function getDetails(){if (self::$_cartDetails === null){$data = array_merge($this->_getData(), array('online_services' => array(),'creator_online_services' => array(),'contract_preview_step_active' => false,'vat' => array(),'total_quantity' => 0,'total_items_price' => 0,'total_items_gross_price' => 0,'total_gross_price' => 0));if ($data['items']){foreach($data['items'] as $cartItemId => $cartItemData){switch($cartItemData['type']){case self::ITEM_TYPE_ONLINE_SERVICE:$service = $this->_onlineServiceRepositoryService->find($cartItemData['id']);if (!$service)continue 2;$cartItemData['service_data'] = $this->_onlineServiceService->getDetails($service);if (!isset($data['online_services'][$service->getCategory()->getId()])){$data['online_services'][$service->getCategory()->getId()] = array('entity' => $service->getCategory(),'services' => array(),'total_price' => 0,'total_gross_price' => 0);}$data['online_services'][$service->getCategory()->getId()]['services'][$cartItemId] = $cartItemData;$data['online_services'][$service->getCategory()->getId()]['total_price'] += $cartItemData['service_data']['price'];$data['online_services'][$service->getCategory()->getId()]['total_gross_price'] += $cartItemData['service_data']['gross_price'];$data['total_quantity'] += $cartItemData['quantity'];$data['total_items_price'] += $cartItemData['service_data']['price'];$data['total_items_gross_price'] += $cartItemData['service_data']['gross_price'];$data['items'][$cartItemId] = &$data['online_services'][$service->getCategory()->getId()]['services'][$cartItemId];if (!in_array($cartItemData['service_data']['vat'], $data['vat']))$data['vat'][] = $cartItemData['service_data']['vat'];break;case self::ITEM_TYPE_CREATOR_ONLINE_SERVICE:$item = $this->_doctrine->getRepository(OnlineServiceCreatorCategoryItem::class)->find($cartItemData['id']);if (!$item)continue 2;$priceListItemData = $this->_adminCreatorPriceListService->getItemDetails($item->getPriceListItem());$cartItemData = array_merge($cartItemData, array('entity' => $item,'vat' => $priceListItemData['vat'],'gross_price' => $priceListItemData['gross_price']));if (!isset($data['creator_online_services'][$item->getCategory()->getId()])){$data['creator_online_services'][$item->getCategory()->getId()] = array('entity' => $item->getCategory(),'items' => array(),'total_price' => 0,'total_gross_price' => 0);}$data['creator_online_services'][$item->getCategory()->getId()]['items'][$cartItemId] = $cartItemData;$data['creator_online_services'][$item->getCategory()->getId()]['total_price'] += $item->getPriceListItem()->getPrice();$data['creator_online_services'][$item->getCategory()->getId()]['total_gross_price'] += $cartItemData['gross_price'];$data['total_quantity'] += $cartItemData['quantity'];$data['total_items_price'] += $item->getPriceListItem()->getPrice();$data['total_items_gross_price'] += $cartItemData['gross_price'];$data['items'][$cartItemId] = &$data['creator_online_services'][$item->getCategory()->getId()]['items'][$cartItemId];if (!in_array($cartItemData['vat'], $data['vat']))$data['vat'][] = $cartItemData['vat'];break;default:throw new \Exception('Nieznany typ produktu.');}}if ($data['creator_online_services'])$data['contract_preview_step_active'] = true;$data['total_gross_price'] = $data['total_items_gross_price'];// voucherif ($data['voucher']){if ($data['voucher']['is_percentage']){$data['voucher']['amount'] = round($data['voucher']['value'] / 100 * $data['total_gross_price'], 2);$data['total_gross_price'] -= $data['voucher']['amount'];}else{$data['voucher']['amount'] = $data['voucher']['value'];$data['total_gross_price'] = max($data['total_gross_price'] - $data['voucher']['amount'], 0);}}}self::$_cartDetails = $data;}return self::$_cartDetails;}public function addItem(OnlineService|OnlineServiceCreatorCategoryItem $item, $quantity = 1, &$totalQuantity = null){$cartData = $this->_getData();if ($item instanceof OnlineService)$itemType = self::ITEM_TYPE_ONLINE_SERVICE;elseif ($item instanceof OnlineServiceCreatorCategoryItem)$itemType = self::ITEM_TYPE_CREATOR_ONLINE_SERVICE;elsethrow new \Exception('Nieznay typ produktu.');$itemId = $itemType . '_' . $item->getId();if (isset($cartData['items'][$itemId])){if (in_array($itemType, [self::ITEM_TYPE_ONLINE_SERVICE, self::ITEM_TYPE_CREATOR_ONLINE_SERVICE])){$cartData['items'][$itemId]['quantity'] = 1;$totalQuantity = 1;}else{$cartData['items'][$itemId]['quantity'] += $quantity;$totalQuantity = $cartData['items'][$itemId]['quantity'];}$this->_setData($cartData);return true;}$itemData = array('id' => $item->getId(),'type' => $itemType,'quantity' => $quantity);$cartData['items'][$itemId] = $itemData;$totalQuantity = $quantity;$this->_setData($cartData);return true;}public function deleteItem($id){$cartData = $this->_getData();unset($cartData['items'][$id]);$this->_setData($cartData);}public function updateCartFromForm(Form $form){$formType = $form->getConfig()->getType()->getInnerType();$cartData = $this->_getData();// pozycje w koszykuforeach(array_keys($cartData['items']) as $itemId){$itemExists = false;$idParts = explode('_', $itemId);if (count($idParts) == 2){switch($idParts[0]){case self::ITEM_TYPE_ONLINE_SERVICE:$itemExists = in_array($itemId, array_keys($form['onlineServices']->getData()));break;case self::ITEM_TYPE_CREATOR_ONLINE_SERVICE:$itemExists = in_array($itemId, array_keys($form['creatorOnlineServices']->getData()));break;}}if (!$itemExists)unset($cartData['items'][$itemId]);}$this->_setData($cartData);$formType->cartData = $this->getDetails();}public function setAccountData(Form $form){$cartData = $this->_getData();$cartData['account_data'] = array('email' => $form['email']->getData(),'password' => $form['password']->getData());$this->_setData($cartData);}public function setClientData(Form $form){$cartData = $this->_getData();// dane klienta$cartData['client_data'] = $form->getData();unset($cartData['client_data']['delivery']);$this->_setData($cartData);}public function setPaymentData(Form $form){$data = $this->_getData();$data['payment_data'] = $form->getData();$this->_setData($data);}public function setVoucher(?string $id = null, ?string $number = null, ?float $value = null, ?bool $isPercentageValue = null){$cartData = $this->_getData();$cartData['voucher'] = $id ? array('id' => $id,'number' => $number,'is_percentage' => $isPercentageValue,'value' => $value) : null;$this->_setData($cartData);}public function setUserPanelCartView(bool $set){$data = $this->_getData();$data['is_user_panel_cart'] = $set;$this->_setData($data);}public function isValid(){$data = $this->getDetails();if (!$this->_userService->getLoggedUser(false) && empty($data['account_data']))return false;if (empty($data['items']) || empty($data['client_data']))return false;return true;}public function clear(){$oldData = $this->_getData();$this->_setData(null);$data = $this->_getData();$data['is_user_panel_cart'] = $oldData['is_user_panel_cart'];$this->_setData($data);}private function _getData(){$data = $this->_requestStack->getSession()->get($this->_sessionKey);if (!$data){$data = array('items' => array(),'account_data' => null,'client_data' => null,'voucher' => null,'is_user_panel_cart' => false);}return $data;}private function _setData($data){self::$_cartDetails = null;$this->_requestStack->getSession()->set($this->_sessionKey, $data);}}