We will be off from 27/1 (Monday) to 31/1 (Friday) (GMT +7) for our Tet Holiday (Lunar New Year) in our country

Commit dd1334c7 authored by Aleffio's avatar Aleffio

PW-243: reworked Cron.php to update ExpiryDate on existing billing agreements.

parent f8b022c4
...@@ -784,66 +784,29 @@ class Cron ...@@ -784,66 +784,29 @@ class Cron
} }
} }
break; break;
case Notification::RECURRING_CONTRACT:
case Notification::RECURRING_CONTRACT:
// storedReferenceCode // storedReferenceCode
$recurringDetailReference = $this->_pspReference; $recurringDetailReference = $this->_pspReference;
// check if there is already a BillingAgreement $storeId = $this->_order->getStoreId();
$billingAgreement = $this->_billingAgreementFactory->create(); $customerReference = $this->_order->getCustomerId();
$billingAgreement->load($recurringDetailReference, 'reference_id');
if ($billingAgreement && $billingAgreement->getAgreementId() > 0 && $billingAgreement->isValid()) {
try {
$billingAgreement->addOrderRelation($this->_order);
$billingAgreement->setStatus($billingAgreement::STATUS_ACTIVE);
$billingAgreement->setIsObjectChanged(true);
$this->_order->addRelatedObject($billingAgreement);
$message = __('Used existing billing agreement #%s.', $billingAgreement->getReferenceId());
} catch (Exception $e) {
// could be that it is already linked to this order
$message = __('Used existing billing agreement #%s.', $billingAgreement->getReferenceId());
}
} else {
$this->_order->getPayment()->setBillingAgreementData(
[
'billing_agreement_id' => $recurringDetailReference,
'method_code' => $this->_order->getPayment()->getMethodCode(),
]
);
// create new object
$billingAgreement = $this->_billingAgreementFactory->create();
$billingAgreement->setStoreId($this->_order->getStoreId());
$billingAgreement->importOrderPayment($this->_order->getPayment());
// get all data for this contract by doing a listRecurringCall
$customerReference = $billingAgreement->getCustomerReference();
$storeId = $billingAgreement->getStoreId();
/*
* for quest checkout users we can't save this in the billing agreement
* because it is linked to customer
*/
if ($customerReference && $storeId) {
$listRecurringContracts = null; $listRecurringContracts = null;
$this->_adyenLogger->addAdyenNotificationCronjob(
__('CustomerReference is: %1 and storeId is %2 and RecurringDetailsReference is %3', $customerReference, $storeId, $recurringDetailReference)
);
try { try {
$listRecurringContracts = $this->_adyenPaymentRequest->getRecurringContractsForShopper( $listRecurringContracts = $this->_adyenPaymentRequest->getRecurringContractsForShopper(
$customerReference, $storeId $customerReference, $storeId
); );
} catch(\Exception $exception) {
$this->_adyenLogger->addAdyenNotificationCronjob($exception->getMessage());
}
$contractDetail = null; $contractDetail = null;
// get current Contract details and get list of all current ones // get current Contract details and get list of all current ones
$recurringReferencesList = []; $recurringReferencesList = [];
if ($listRecurringContracts) { if (!$listRecurringContracts) {
throw new \Exception("Empty list recurring contracts");
}
// Find the reference on the list
foreach ($listRecurringContracts as $rc) { foreach ($listRecurringContracts as $rc) {
$recurringReferencesList[] = $rc['recurringDetailReference']; $recurringReferencesList[] = $rc['recurringDetailReference'];
if (isset($rc['recurringDetailReference']) && if (isset($rc['recurringDetailReference']) &&
...@@ -851,14 +814,20 @@ class Cron ...@@ -851,14 +814,20 @@ class Cron
$contractDetail = $rc; $contractDetail = $rc;
} }
} }
if ($contractDetail == null) {
$this->_adyenLogger->addAdyenNotificationCronjob(print_r($listRecurringContracts, 1));
$message = __(
'Failed to create billing agreement for this order ' .
'(listRecurringCall did not contain contract)'
);
throw new \Exception($message);
} }
if ($contractDetail != null) {
// update status of all the current saved agreements in magento
$billingAgreements = $this->_billingAgreementCollectionFactory->create(); $billingAgreements = $this->_billingAgreementCollectionFactory->create();
$billingAgreements->addFieldToFilter('customer_id', $customerReference); $billingAgreements->addFieldToFilter('customer_id', $customerReference);
// get collection // Get collection and update existing agreements
foreach ($billingAgreements as $updateBillingAgreement) { foreach ($billingAgreements as $updateBillingAgreement) {
if (!in_array($updateBillingAgreement->getReferenceId(), $recurringReferencesList)) { if (!in_array($updateBillingAgreement->getReferenceId(), $recurringReferencesList)) {
...@@ -874,10 +843,34 @@ class Cron ...@@ -874,10 +843,34 @@ class Cron
} }
} }
// add this billing agreement // Get or create billing agreement
$billingAgreement = $this->_billingAgreementFactory->create();
$billingAgreement->load($recurringDetailReference, 'reference_id');
$message = __('Updated billing agreement #%1.', $recurringDetailReference);
// check if BA exists
if (!($billingAgreement && $billingAgreement->getAgreementId() > 0 && $billingAgreement->isValid())) {
// create new
$this->_adyenLogger->addAdyenNotificationCronjob("Creating new Billing Agreement");
$this->_order->getPayment()->setBillingAgreementData(
[
'billing_agreement_id' => $recurringDetailReference,
'method_code' => $this->_order->getPayment()->getMethodCode(),
]
);
$billingAgreement = $this->_billingAgreementFactory->create();
$billingAgreement->setStoreId($this->_order->getStoreId());
$billingAgreement->importOrderPayment($this->_order->getPayment());
$message = __('Created billing agreement #%1.', $recurringDetailReference);
}
else {
$this->_adyenLogger->addAdyenNotificationCronjob("Using existing Billing Agreement");
$billingAgreement->setIsObjectChanged(true);
}
// Populate billing agreement data
$billingAgreement->parseRecurringContractData($contractDetail); $billingAgreement->parseRecurringContractData($contractDetail);
if ($billingAgreement->isValid()) { if ($billingAgreement->isValid()) {
$message = __('Created billing agreement #%1.', $billingAgreement->getReferenceId());
// save into sales_billing_agreement_order // save into sales_billing_agreement_order
$billingAgreement->addOrderRelation($this->_order); $billingAgreement->addOrderRelation($this->_order);
...@@ -886,31 +879,16 @@ class Cron ...@@ -886,31 +879,16 @@ class Cron
$this->_order->addRelatedObject($billingAgreement); $this->_order->addRelatedObject($billingAgreement);
} else { } else {
$message = __('Failed to create billing agreement for this order.'); $message = __('Failed to create billing agreement for this order.');
throw new \Exception($message);
} }
} catch(\Exception $exception) {
} else { $message = $exception->getMessage();
$this->_adyenLogger->addAdyenNotificationCronjob(
'Failed to create billing agreement for this order ' .
'(listRecurringCall did not contain contract)'
);
$this->_adyenLogger->addAdyenNotificationCronjob(
__('recurringDetailReference in notification is %1', $recurringDetailReference)
);
$this->_adyenLogger->addAdyenNotificationCronjob(
__('CustomerReference is: %1 and storeId is %2', $customerReference, $storeId)
);
$this->_adyenLogger->addAdyenNotificationCronjob(print_r($listRecurringContracts, 1));
$message = __(
'Failed to create billing agreement for this order ' .
'(listRecurringCall did not contain contract)'
);
} }
$this->_adyenLogger->addAdyenNotificationCronjob($message);
$comment = $this->_order->addStatusHistoryComment($message); $comment = $this->_order->addStatusHistoryComment($message);
$this->_order->addRelatedObject($comment); $this->_order->addRelatedObject($comment);
}
}
break; break;
default: default:
$this->_adyenLogger->addAdyenNotificationCronjob( $this->_adyenLogger->addAdyenNotificationCronjob(
...@@ -976,7 +954,7 @@ class Cron ...@@ -976,7 +954,7 @@ class Cron
} }
} else { } else {
$this->_adyenLogger->addAdyenNotificationCronjob( $this->_adyenLogger->addAdyenNotificationCronjob(
'Did not create a credit memo for this order becasue refund is done through Magento' 'Did not create a credit memo for this order because refund is done through Magento'
); );
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment