Skip to content

Commit

Permalink
CET-480/feat: Support new fulfilments endpoint in Magento plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
brtkwr committed Oct 23, 2024
1 parent faf58a1 commit a4a9928
Show file tree
Hide file tree
Showing 9 changed files with 185 additions and 219 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,8 @@
.direnv/
.envrc

# PHP
.php-cs-fixer.cache
auth.json
vendor/
composer.lock
62 changes: 24 additions & 38 deletions Block/Adminhtml/Order/View.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

use Magento\Sales\Block\Adminhtml\Order\View as OrderView;
use Two\Gateway\Api\Config\RepositoryInterface as ConfigRepository;
use Two\Gateway\Service\Api\Adapter as Adapter;

/**
* Order View Block
Expand All @@ -20,10 +21,16 @@ class View extends OrderView
*/
public $configRepository;

/**
* @var Adapter
*/
private $apiAdapter;

/**
* View constructor.
*
* @param ConfigRepository $configRepository
* @param Adapter $adapter
* @param \Magento\Backend\Block\Widget\Context $context
* @param \Magento\Framework\Registry $registry
* @param \Magento\Sales\Model\Config $salesConfig
Expand All @@ -32,60 +39,39 @@ class View extends OrderView
*/
public function __construct(
ConfigRepository $configRepository,
Adapter $apiAdapter,
\Magento\Backend\Block\Widget\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Sales\Model\Config $salesConfig,
\Magento\Sales\Helper\Reorder $reorderHelper,
array $data = []
) {
$this->configRepository = $configRepository;
$this->apiAdapter = $apiAdapter;
parent::__construct($context, $registry, $salesConfig, $reorderHelper, $data);
}

/**
* Get payment additional data
*
* @return array
*/
public function getAdditionalData(): array
{
$order = $this->getOrder();
$payment = $order->getPayment();
return $payment->getAdditionalInformation();
}

/**
* Get Two Credit Note Url
*
* @param array $data
*
* @return string
*/
public function getTwoCreditNoteUrl(array $data): string
{
$order = $this->getOrder();
$billingAddress = $order->getBillingAddress();
$langParams = $billingAddress->getCountryId() == 'NO' ? '?lang=nb_NO' : '?lang=en_US';

return isset($data['gateway_data']['credit_note_url'])
? $data['gateway_data']['credit_note_url'] . $langParams
: '';
}

/**
* Get Two Credit Invoice Url
* Get Two Fulfillments
*
* @param array $data
*
* @return string
* @return array
*/
public function getTwoInvoiceUrl(array $data): string
public function getTwoOrderFulfillments(): array
{
$order = $this->getOrder();
$billingAddress = $order->getBillingAddress();
$langParams = $billingAddress->getCountryId() == 'NO' ? '?lang=nb_NO' : '?lang=en_US';
$response = $this->apiAdapter->execute(
"/v1/order/" . $order->getTwoOrderId() . "/fulfillments",
[],
'GET'
);
$error = $order->getPayment()->getMethodInstance()->getErrorFromResponse($response);
if ($error) {
return [];
}

return (isset($data['gateway_data']['invoice_url'])) ? $data['gateway_data']['invoice_url'] . $langParams : '';
return $response;
}

/**
Expand All @@ -95,9 +81,9 @@ public function getTwoInvoiceUrl(array $data): string
*
* @return string
*/
public function getTwoOrderId(array $data): string
public function getTwoOrderId(): string
{
return (isset($data['gateway_data']['external_order_id'])) ? $data['gateway_data']['external_order_id'] : '';
return $this->getOrder()->getTwoOrderId();
}

/**
Expand Down
109 changes: 59 additions & 50 deletions Model/Two.php
Original file line number Diff line number Diff line change
Expand Up @@ -227,9 +227,9 @@ public function authorize(InfoInterface $payment, $amount)
);
}

$twoOrderId = $response['id'];
$order->setTwoOrderId($twoOrderId);
$order->setTwoOrderReference($orderReference);
$order->setTwoOrderId($response['id']);
$payload['gateway_data']['external_order_id'] = $response['id'];
$payload['gateway_data']['external_order_status'] = $response['external_order_status'];
$payload['gateway_data']['original_order_id'] = $response['original_order_id'];
$payload['gateway_data']['state'] = $response['state'];
Expand All @@ -242,7 +242,7 @@ public function authorize(InfoInterface $payment, $amount)
unset($payload['merchant_urls']);

$payment->setAdditionalInformation($payload);
$payment->setTransactionId($response['external_order_id'])
$payment->setTransactionId($twoOrderId)
->setIsTransactionClosed(0)
->setIsTransactionPending(true);
$this->urlCookie->set($response['payment_url']);
Expand Down Expand Up @@ -327,10 +327,6 @@ public function getErrorFromResponse(array $response): ?Phrase
return $this->_getMessageWithTrace($message, $traceID);
}

if (empty($response['id'])) {
return $this->_getMessageWithTrace($generalError, $traceID);
}

return null;
}

Expand Down Expand Up @@ -403,6 +399,28 @@ public function cancel(InfoInterface $payment)
return $this;
}

private function isWholeOrderInvoiced(OrderInterface $order): bool
{
foreach ($order->getAllVisibleItems() as $orderItem) {
/** @var Order\Item $orderItem */
if ($orderItem->getQtyInvoiced() < $orderItem->getQtyOrdered()) {
return false;
}
}

return true;
}

/**
* @param OrderInterface $order
* @return bool
*/
private function isPartialOrder(OrderInterface $order): bool
{
$additionalInformation = $order->getPayment()->getAdditionalInformation();
return $additionalInformation['gateway_data']['partial_order'] ?? false;
}

/**
* @inheritDoc
*/
Expand All @@ -417,20 +435,11 @@ public function capture(InfoInterface $payment, $amount)
__('Could not initiate capture with %1', $this->configRepository::PROVIDER)
);
}
$orderItems = $order->getAllVisibleItems();
$wholeOrderInvoiced = 1;
if ($orderItems) {
foreach ($orderItems as $item) {
if ($item->getQtyInvoiced() < $item->getQtyOrdered()) {
$wholeOrderInvoiced = 0;
break;
}
}
}

if ($wholeOrderInvoiced == 1) {
$response = $this->apiAdapter->execute('/v1/order/' . $twoOrderId . '/fulfilled');
} else {
$payload = [];
$isWholeOrderInvoiced = $this->isWholeOrderInvoiced($order);
$isPartialOrder = $this->isPartialOrder($order);
if (!$isWholeOrderInvoiced || $isPartialOrder) {
$invoices = $order->getInvoiceCollection();
$totalInvoices = count($invoices);
$cnt = 1;
Expand All @@ -441,22 +450,20 @@ public function capture(InfoInterface $payment, $amount)
}
$cnt++;
}
$remainItemInvoice = $payment->getOrder()->prepareInvoice();
$response = $this->partialMainOrder($order, $createdInvoice, $remainItemInvoice);
$payload = [
'partial' => $this->composeCapture->execute($createdInvoice),
];
}
$response = $this->apiAdapter->execute('/v1/order/' . $twoOrderId . '/fulfillments', $payload);

if (!empty($response) && isset($response['id'])) {
$payment->setTransactionId($response['id'])->setIsTransactionClosed(0);
if (!empty($response) && isset($response['fulfilled_order']['id'])) {
$payment->setTransactionId($response['fulfilled_order']['id'])->setIsTransactionClosed(0);
} else {
$payment->setIsTransactionClosed(0);
}
$this->parseFulfillResponse($response, $order);
$payment->save();

$error = $this->getErrorFromResponse($response);
if ($error) {
throw new LocalizedException($error);
}
$this->parseFulfillResponse($response, $order);
} else {
throw new LocalizedException(__('The capture action is not available.'));
}
Expand All @@ -480,14 +487,12 @@ public function canCapture()
* @return array
* @throws LocalizedException
*/
public function partialMainOrder(Order $order, ?Order\Invoice $invoice, Order\Invoice $remainItemInvoice): array
public function partialFulfill(Order $order, ?Order\Invoice $invoice): array
{
$twoOrderId = $order->getTwoOrderId();
$payload['partially_fulfilled_order'] = $this->composeCapture->execute($invoice);
$payload['remained_order'] = $this->composeCapture->execute($remainItemInvoice);

/* Partially fulfill order*/
return $this->apiAdapter->execute('/v1/order/' . $twoOrderId . '/fulfilled', $payload);
return $this->apiAdapter->execute('/v1/order/' . $twoOrderId . '/fulfillments', $payload);
}

/**
Expand All @@ -500,29 +505,37 @@ public function partialMainOrder(Order $order, ?Order\Invoice $invoice, Order\In
*/
private function parseFulfillResponse(array $response, Order $order): void
{
$error = $order->getPayment()->getMethodInstance()->getErrorFromResponse($response);
$error = $this->getErrorFromResponse($response);

if ($error) {
throw new LocalizedException($error);
}

if (empty($response['invoice_details'] ||
empty($response['invoice_details']['invoice_number']))) {
if (empty($response['fulfilled_order'] ||
empty($response['fulfilled_order']['id']))) {
return;
}

$partialOrder = !empty($response['remained_order']);
$additionalInformation = $order->getPayment()->getAdditionalInformation();
$additionalInformation['gateway_data']['invoice_number'] = $response['invoice_details']['invoice_number'];
$additionalInformation['gateway_data']['invoice_url'] = $response['invoice_url'];
if ($partialOrder) {
$additionalInformation['gateway_data']['partial_order'] = true;
}
$additionalInformation['marked_completed'] = true;

$order->getPayment()->setAdditionalInformation($additionalInformation);

$comment = __(
'%1 order marked as completed with invoice number %2',
$this->configRepository::PROVIDER,
$response['invoice_details']['invoice_number'],
);
if ($partialOrder) {
$comment = __(
'%1 order marked as partially completed.',
$this->configRepository::PROVIDER,
);
} else {
$comment = __(
'%1 order marked as completed.',
$this->configRepository::PROVIDER,
);
}

$this->addStatusToOrderHistory($order, $comment->render());
}

Expand Down Expand Up @@ -565,7 +578,7 @@ public function refund(InfoInterface $payment, $amount)

$payload = $this->composeRefund->execute(
$payment->getCreditmemo(),
(double)$amount,
(float)$amount,
$order
);
$response = $this->apiAdapter->execute(
Expand All @@ -587,15 +600,11 @@ public function refund(InfoInterface $payment, $amount)
$reason
);
$this->addOrderComment($order, $message);
throw new LocalizedException(
throw new LocalizedException(
$message
);
}

$additionalInformation = $payment->getAdditionalInformation();
$additionalInformation['gateway_data']['credit_note_url'] = $response['credit_note_url'];
$payment->setAdditionalInformation($additionalInformation);

$comment = __(
'Successfully refunded order with %1 for order ID: %2. Refund reference: %3',
$this->configRepository::PROVIDER,
Expand Down
Loading

0 comments on commit a4a9928

Please sign in to comment.