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,133 +784,111 @@ class Cron ...@@ -784,133 +784,111 @@ 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'); $listRecurringContracts = null;
$this->_adyenLogger->addAdyenNotificationCronjob(
__('CustomerReference is: %1 and storeId is %2 and RecurringDetailsReference is %3', $customerReference, $storeId, $recurringDetailReference)
if ($billingAgreement && $billingAgreement->getAgreementId() > 0 && $billingAgreement->isValid()) { );
try {
$listRecurringContracts = $this->_adyenPaymentRequest->getRecurringContractsForShopper(
$customerReference, $storeId
);
$contractDetail = null;
// get current Contract details and get list of all current ones
$recurringReferencesList = [];
try { if (!$listRecurringContracts) {
$billingAgreement->addOrderRelation($this->_order); throw new \Exception("Empty list recurring contracts");
$billingAgreement->setStatus($billingAgreement::STATUS_ACTIVE); }
$billingAgreement->setIsObjectChanged(true); // Find the reference on the list
$this->_order->addRelatedObject($billingAgreement); foreach ($listRecurringContracts as $rc) {
$message = __('Used existing billing agreement #%s.', $billingAgreement->getReferenceId()); $recurringReferencesList[] = $rc['recurringDetailReference'];
} catch (Exception $e) { if (isset($rc['recurringDetailReference']) &&
// could be that it is already linked to this order $rc['recurringDetailReference'] == $recurringDetailReference) {
$message = __('Used existing billing agreement #%s.', $billingAgreement->getReferenceId()); $contractDetail = $rc;
}
} }
} else {
$this->_order->getPayment()->setBillingAgreementData(
[
'billing_agreement_id' => $recurringDetailReference,
'method_code' => $this->_order->getPayment()->getMethodCode(),
]
);
// create new object if ($contractDetail == null) {
$billingAgreement = $this->_billingAgreementFactory->create(); $this->_adyenLogger->addAdyenNotificationCronjob(print_r($listRecurringContracts, 1));
$billingAgreement->setStoreId($this->_order->getStoreId()); $message = __(
$billingAgreement->importOrderPayment($this->_order->getPayment()); 'Failed to create billing agreement for this order ' .
'(listRecurringCall did not contain contract)'
);
throw new \Exception($message);
}
// get all data for this contract by doing a listRecurringCall $billingAgreements = $this->_billingAgreementCollectionFactory->create();
$customerReference = $billingAgreement->getCustomerReference(); $billingAgreements->addFieldToFilter('customer_id', $customerReference);
$storeId = $billingAgreement->getStoreId();
/* // Get collection and update existing agreements
* for quest checkout users we can't save this in the billing agreement
* because it is linked to customer
*/
if ($customerReference && $storeId) {
$listRecurringContracts = null; foreach ($billingAgreements as $updateBillingAgreement) {
try { if (!in_array($updateBillingAgreement->getReferenceId(), $recurringReferencesList)) {
$listRecurringContracts = $this->_adyenPaymentRequest->getRecurringContractsForShopper( $updateBillingAgreement->setStatus(
$customerReference, $storeId \Adyen\Payment\Model\Billing\Agreement::STATUS_CANCELED
);
$updateBillingAgreement->save();
} else {
$updateBillingAgreement->setStatus(
\Adyen\Payment\Model\Billing\Agreement::STATUS_ACTIVE
); );
} catch(\Exception $exception) { $updateBillingAgreement->save();
$this->_adyenLogger->addAdyenNotificationCronjob($exception->getMessage());
} }
}
$contractDetail = null; // Get or create billing agreement
// get current Contract details and get list of all current ones $billingAgreement = $this->_billingAgreementFactory->create();
$recurringReferencesList = []; $billingAgreement->load($recurringDetailReference, 'reference_id');
$message = __('Updated billing agreement #%1.', $recurringDetailReference);
if ($listRecurringContracts) { // check if BA exists
foreach ($listRecurringContracts as $rc) { if (!($billingAgreement && $billingAgreement->getAgreementId() > 0 && $billingAgreement->isValid())) {
$recurringReferencesList[] = $rc['recurringDetailReference']; // create new
if (isset($rc['recurringDetailReference']) && $this->_adyenLogger->addAdyenNotificationCronjob("Creating new Billing Agreement");
$rc['recurringDetailReference'] == $recurringDetailReference) { $this->_order->getPayment()->setBillingAgreementData(
$contractDetail = $rc; [
} 'billing_agreement_id' => $recurringDetailReference,
} 'method_code' => $this->_order->getPayment()->getMethodCode(),
} ]
);
if ($contractDetail != null) { $billingAgreement = $this->_billingAgreementFactory->create();
// update status of all the current saved agreements in magento $billingAgreement->setStoreId($this->_order->getStoreId());
$billingAgreements = $this->_billingAgreementCollectionFactory->create(); $billingAgreement->importOrderPayment($this->_order->getPayment());
$billingAgreements->addFieldToFilter('customer_id', $customerReference); $message = __('Created billing agreement #%1.', $recurringDetailReference);
}
// get collection else {
$this->_adyenLogger->addAdyenNotificationCronjob("Using existing Billing Agreement");
foreach ($billingAgreements as $updateBillingAgreement) { $billingAgreement->setIsObjectChanged(true);
if (!in_array($updateBillingAgreement->getReferenceId(), $recurringReferencesList)) { }
$updateBillingAgreement->setStatus(
\Adyen\Payment\Model\Billing\Agreement::STATUS_CANCELED
);
$updateBillingAgreement->save();
} else {
$updateBillingAgreement->setStatus(
\Adyen\Payment\Model\Billing\Agreement::STATUS_ACTIVE
);
$updateBillingAgreement->save();
}
}
// add this billing agreement
$billingAgreement->parseRecurringContractData($contractDetail);
if ($billingAgreement->isValid()) {
$message = __('Created billing agreement #%1.', $billingAgreement->getReferenceId());
// save into sales_billing_agreement_order
$billingAgreement->addOrderRelation($this->_order);
// add to order to save agreement
$this->_order->addRelatedObject($billingAgreement);
} else {
$message = __('Failed to create billing agreement for this order.');
}
// Populate billing agreement data
$billingAgreement->parseRecurringContractData($contractDetail);
if ($billingAgreement->isValid()) {
} else { // save into sales_billing_agreement_order
$this->_adyenLogger->addAdyenNotificationCronjob( $billingAgreement->addOrderRelation($this->_order);
'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)'
);
}
$comment = $this->_order->addStatusHistoryComment($message); // add to order to save agreement
$this->_order->addRelatedObject($comment); $this->_order->addRelatedObject($billingAgreement);
} else {
$message = __('Failed to create billing agreement for this order.');
throw new \Exception($message);
} }
} catch(\Exception $exception) {
$message = $exception->getMessage();
} }
$this->_adyenLogger->addAdyenNotificationCronjob($message);
$comment = $this->_order->addStatusHistoryComment($message);
$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