select('op.*, o.currency') ->addSelect('JSON_EXTRACT(o.note_admin, "$.payment_data") AS order_payment_data') ->from('order_payments', 'op') ->join('op', 'orders', 'o', 'o.id = op.id_order') ->where(Operator::equals(['op.id' => $paymentId])) ->execute()->fetchAssociative(); if (empty($orderPaymentRow)) { return null; } $orderPayment = new OrderPayment($this->entityUtil->createEntity($this->prepareOrderPayment($orderPaymentRow), OrderPaymentEntity::class)); return $orderPayment; } public function getOrderPayments(?Parameters $filter = null): ?OrderPaymentCollection { $qb = sqlQueryBuilder() ->select('op.*, o.currency') ->addSelect('JSON_EXTRACT(o.note_admin, "$.payment_data") AS order_payment_data') ->from('order_payments', 'op') ->join('op', 'orders', 'o', 'o.id = op.id_order'); if ($filter?->getData()) { $qb->andWhere(Operator::andX($this->orderUtil->getOrdersFilterSpecs($filter->getData()))); } $orderPaymentRows = $qb->execute()->fetchAllAssociative(); if (empty($orderPaymentRows)) { return null; } $orderPayments = ApiUtil::wrapItems( array_map(fn ($paymentRow) => $this->entityUtil->createEntity($this->prepareOrderPayment($paymentRow), OrderPaymentEntity::class), $orderPaymentRows), OrderPayment::class ); return new OrderPaymentCollection($orderPayments); } private function prepareOrderPayment(array $orderPayment): array { $orderPayment['price'] = new Price(toDecimal($orderPayment['price']), Contexts::get(CurrencyContext::class)->getOrDefault($orderPayment['currency']), '0'); $orderPayment['date'] = new \DateTimeImmutable($orderPayment['date']); $orderPayment['payment_data'] = json_decode($orderPayment['payment_data'] ?? '', true) ?: []; $orderPayment['order_payment_data'] = json_decode($orderPayment['order_payment_data'] ?? '', true) ?: []; return $orderPayment; } public function orderPaymentCreate(OrderPaymentInput $orderPayment): OrderPaymentMutateResponse { $order = new \Order(); if (!$order->createFromDB($orderPayment->orderId)) { throw new GraphQLNotFoundException('Order not found.'); } $paymentId = $order->insertPayment( price: $orderPayment->price, note: $orderPayment->note, date: $orderPayment->date, method: $orderPayment->method ? $orderPayment->method->value : 0, payment_data: json_encode(['transactionID' => $orderPayment->transactionId]) ); if (!$paymentId) { throw new GraphQLNotFoundException('Create payment failed.'); } return QueryHint::withRouteToMaster(fn () => new OrderPaymentMutateResponse(true, $this->getOrderPayment((int) $paymentId))); } }