getTitle()]); } public function getBodyVariables(): array { $vars = parent::getBodyVariables(); $vars['user'] = $this->userContext->getActive(); $mainRequest = $this->requestStack->getMainRequest(); $this->id_delivery = $mainRequest->get('delivery_id') ?? false; $this->id_payment = $mainRequest->get('payment_id') ?? false; $vars['deliveries'] = $this->getDeliveries(); $vars['payments'] = $this->getPayments(); if ($this->id_delivery) { $vars['deliveries'][$this->id_delivery]->storeDeliveryInfo(getVal($this->id_delivery, $mainRequest->get('delivery_data'))); } $vars['payment_id'] = $this->id_payment; $vars['delivery_id'] = $this->id_delivery; return $vars; } public function submitForm() { $user = $this->userContext->getActive(); $userId = $user->id; $userVerification = sqlQueryBuilder()->select('*')->from('users_age_verification')->where(Operator::equals(['id_user' => $userId])) ->execute()->fetchAssociative(); $mainRequest = $this->requestStack->getMainRequest(); if ($mainRequest->get('submitOrder') === null) { return false; } $data = $mainRequest->get('data'); $id_delivery = $mainRequest->get('delivery_id'); $id_payment = explode('-', $mainRequest->get('payment_id', ''))[0] ?? false; if ($data['email'] ?? false) { $data['name'] ??= $user->invoice['name'] ?? ''; $data['surname'] ??= $user->invoice['surname'] ?? ''; } $order = null; $id_product = \Settings::getDefault()['age_verify']['package']['product']; if ($userVerification === false || (empty($userVerification['id_order']) && $userVerification['legal_age'] != 'Y')) { $deliveryType = $this->getDeliveryType($id_delivery, $id_payment); if (!$deliveryType) { return; } $purchaseState = $this->createPurchaseState(); $product = new \Product($id_product); $product->createFromDB(); $purchaseItem = new ProductPurchaseItem( $id_product, null, 1, PriceCalculator::toPrice($product->getProductPrice()) ); $purchaseItem->setProduct($product); $purchaseState->addProduct($purchaseItem) ->setDeliveryTypeId($deliveryType->id); $delivery_data = $mainRequest->get('delivery_data'); $deliveryInfo = []; if ($delivery_data[$id_delivery] ?? false) { $deliveryInfo = $purchaseState->getDeliveryType()->getDelivery()->storeDeliveryInfo($delivery_data[$id_delivery]); } $purchaseState->setCustomData([ 'order' => [ 'id_user' => $user->id, 'invoice_name' => $user->invoice['name'] ?? '', 'invoice_surname' => $user->invoice['surname'] ?? '', 'invoice_firm' => $user->invoice['firm'] ?? '', 'invoice_ico' => $user->invoice['ico'] ?? '', 'invoice_dic' => $user->invoice['dic'] ?? '', 'invoice_street' => $user->invoice['street'] ?? '', 'invoice_city' => $user->invoice['city'] ?? '', 'invoice_zip' => $user->invoice['zip'] ?? '', 'invoice_country' => $user->invoice['country'] ?? '', 'invoice_phone' => $user->invoice['phone'] ?? '', 'invoice_email' => $user->invoice['email'] ?? '', 'invoice_state' => $user->invoice['state'] ?? '', 'delivery_name' => $data['name'] ?? '', 'delivery_surname' => $data['surname'] ?? '', 'delivery_street' => $data['street'] ?? '', 'delivery_city' => $data['city'] ?? '', 'delivery_zip' => $data['zip'] ?? '', 'delivery_phone' => $data['phone'] ?? '', 'date_created' => date('Y-m-d H:i:s'), 'date_updated' => date('Y-m-d H:i:s'), 'note_admin' => json_encode(['delivery_data' => $deliveryInfo]), ], 'age_verification' => true, ]); $order = $this->purchaseUtil->createOrderFromPurchaseState($purchaseState); $orderEvent = new OrderEvent($order); $this->eventDispatcher->dispatch($orderEvent, OrderEvent::ORDER_FINISHED); if (!empty($order)) { sqlQueryBuilder()->insert('users_age_verification') ->directValues([ 'id_user' => $userId, 'verification_type' => 'package', 'id_order' => $order->id, ]) ->onDuplicateKeyUpdate(['id_user' => 'id_user', 'id_order']) ->execute(); if ($birthdate = $mainRequest->get('cart_data')['birthdate'] ?? false) { sqlQueryBuilder()->update('users')->directValues([ 'birthdate' => $birthdate, ])->where(Operator::equals(['id' => $userId]))->execute(); } } else { throw new AgeVerificationException('Failed to create order.'); } } elseif (!empty($userVerification['id_order'])) { addUserMessage(translate('orderAlreadyCreated', 'AgeVerify')); throw new RedirectException(path('ageVerify')); } return $order; } public function getDeliveries(): array { if (empty($this->deliveries)) { $deliveryTypes = array_filter(\DeliveryType::getAll(), function ($deliveryType) { return $deliveryType->getDelivery()->getCustomData()['balikobot']['require_full_age'] ?? false; }); foreach ($deliveryTypes as $deliveryType) { $delivery = $deliveryType->getDelivery(); if ($delivery->accept($this->getProductPrice(), false)) { $this->deliveries[$deliveryType->id_delivery] = $delivery; } } } return $this->deliveries; } public function getPayments(): array { if (empty($this->payments)) { $deliveryTypes = array_filter(\DeliveryType::getAll(true), function ($deliveryType) { return ($deliveryType->getDelivery()->getCustomData()['balikobot']['require_full_age'] ?? false) && $deliveryType->id_delivery == $this->id_delivery; }); foreach ($deliveryTypes as $deliveryType) { $payment = $deliveryType->getPayment(); if ($payment->accept($this->getProductPrice(), false)) { $this->payments[$deliveryType->id_payment] = [ 'class' => $payment, 'name' => $payment->getName(), 'exception' => $payment->exception, 'photo' => $payment->getPhoto(null), 'enabled' => \Payment::isEnabled($payment->class), ]; } } } return $this->payments; } public function getDeliveryPrice($id) { /** @var Price $price */ $price = $this->getDeliveries()[$id]->getPrice(); return ServiceContainer::getService(PriceWrapper::class)->setObject($price); } public function getPaymentPrice($id) { foreach (\DeliveryType::getAll() as $deliveryType) { if ($deliveryType->id_payment == $id) { $price = $deliveryType->price_payment; } } return ServiceContainer::getService(PriceWrapper::class)->setObject($price); } protected function getProductPrice() { if (!$this->product_price) { $product = new \Product(); $product->createFromDB(\Settings::getDefault()['age_verify']['package']['product']); $this->product_price = $product->getProductPrice(); } return $this->product_price; } protected function getDeliveryType($id_delivery, $id_payment): ?\DeliveryType { foreach (\DeliveryType::getAll(false) as $deliveryType) { if ($deliveryType->id_delivery == $id_delivery && $deliveryType->id_payment == $id_payment) { $delivery = $deliveryType->getDelivery(); $delivery->accept($this->getProductPrice(), false); return $deliveryType; } } return null; } protected function createPurchaseState(): PurchaseState { return new PurchaseState([]); } }