We will work on Apr 26th (Saturday) and will be off from Apr 30th (Wednesday) until May 2nd (Friday) for public holiday 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