Version Notes
Ampersand_PaymentGateway v0.1.4
Download this release
Release Info
Developer | Magento Core Team |
Extension | Ampersand_PaymentGateway |
Version | 0.1.4 |
Comparing to | |
See all releases |
Version 0.1.4
- app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription.php +20 -0
- app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription/Edit.php +31 -0
- app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription/Edit/Form.php +103 -0
- app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription/Grid.php +174 -0
- app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription/Order.php +20 -0
- app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription/Order/Grid.php +151 -0
- app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/System/Config/Fieldset/Hint.php +23 -0
- app/code/core/Ampersand/PaymentGateway/Block/Checkout/Cart/Subscription.php +67 -0
- app/code/core/Ampersand/PaymentGateway/Block/Checkout/Onepage/Review/Subscription.php +37 -0
- app/code/core/Ampersand/PaymentGateway/Block/Customer/Account/Subscription.php +165 -0
- app/code/core/Ampersand/PaymentGateway/Block/Payment/Form/BillingAgreement.php +110 -0
- app/code/core/Ampersand/PaymentGateway/Block/Payment/Form/BillingAgreementCheckbox.php +16 -0
- app/code/core/Ampersand/PaymentGateway/Block/Payment/Form/BillingAgreementCv2.php +16 -0
- app/code/core/Ampersand/PaymentGateway/Block/Payment/Form/Redirect.php +77 -0
- app/code/core/Ampersand/PaymentGateway/Block/Payment/Form/Subscription.php +16 -0
- app/code/core/Ampersand/PaymentGateway/Block/Payment/Info/Redirect.php +47 -0
- app/code/core/Ampersand/PaymentGateway/Block/Redirect/Form.php +84 -0
- app/code/core/Ampersand/PaymentGateway/Block/Redirect/Iframe.php +82 -0
- app/code/core/Ampersand/PaymentGateway/Block/Redirect/Location.php +65 -0
- app/code/core/Ampersand/PaymentGateway/Helper/Data.php +492 -0
- app/code/core/Ampersand/PaymentGateway/Helper/Subscription.php +168 -0
- app/code/core/Ampersand/PaymentGateway/Model/Adapter/Abstract.php +264 -0
- app/code/core/Ampersand/PaymentGateway/Model/Adapter/Direct/Agreement/ManageInterface.php +13 -0
- app/code/core/Ampersand/PaymentGateway/Model/Adapter/Direct/AuthCaptureInterface.php +108 -0
- app/code/core/Ampersand/PaymentGateway/Model/Adapter/Direct/PartialInterface.php +33 -0
- app/code/core/Ampersand/PaymentGateway/Model/Adapter/Direct/RefundInterface.php +33 -0
- app/code/core/Ampersand/PaymentGateway/Model/Adapter/Interface.php +105 -0
- app/code/core/Ampersand/PaymentGateway/Model/Adapter/Redirect/Agreement/ManageInterface.php +8 -0
- app/code/core/Ampersand/PaymentGateway/Model/Adapter/Redirect/AuthCaptureInterface.php +68 -0
- app/code/core/Ampersand/PaymentGateway/Model/Adapter/Redirect/PartialInterface.php +33 -0
- app/code/core/Ampersand/PaymentGateway/Model/Adapter/Redirect/RefundInterface.php +33 -0
- app/code/core/Ampersand/PaymentGateway/Model/Agreement.php +164 -0
- app/code/core/Ampersand/PaymentGateway/Model/Compatibility/Mage/Sales/Model/Order/Payment.php +130 -0
- app/code/core/Ampersand/PaymentGateway/Model/Config/Abstract.php +88 -0
- app/code/core/Ampersand/PaymentGateway/Model/Cron.php +46 -0
- app/code/core/Ampersand/PaymentGateway/Model/Email.php +281 -0
- app/code/core/Ampersand/PaymentGateway/Model/Exception/DenyPayment.php +14 -0
- app/code/core/Ampersand/PaymentGateway/Model/Exception/Error.php +56 -0
- app/code/core/Ampersand/PaymentGateway/Model/Method/AgreementAbstract.php +450 -0
- app/code/core/Ampersand/PaymentGateway/Model/Method/DirectAbstract.php +383 -0
- app/code/core/Ampersand/PaymentGateway/Model/Method/RedirectAbstract.php +316 -0
- app/code/core/Ampersand/PaymentGateway/Model/Observer.php +145 -0
- app/code/core/Ampersand/PaymentGateway/Model/Resource/Agreement.php +29 -0
- app/code/core/Ampersand/PaymentGateway/Model/Resource/Agreement/Collection.php +34 -0
- app/code/core/Ampersand/PaymentGateway/Model/Resource/Subscription.php +29 -0
- app/code/core/Ampersand/PaymentGateway/Model/Resource/Subscription/Collection.php +107 -0
- app/code/core/Ampersand/PaymentGateway/Model/Resource/Subscription/Order.php +30 -0
- app/code/core/Ampersand/PaymentGateway/Model/Resource/Subscription/Order/Collection.php +14 -0
- app/code/core/Ampersand/PaymentGateway/Model/Resource/Transaction.php +29 -0
- app/code/core/Ampersand/PaymentGateway/Model/Resource/Transaction/Collection.php +39 -0
- app/code/core/Ampersand/PaymentGateway/Model/Service/Abstract.php +1738 -0
- app/code/core/Ampersand/PaymentGateway/Model/Service/Direct/AgreementAbstract.php +187 -0
- app/code/core/Ampersand/PaymentGateway/Model/Service/DirectAbstract.php +43 -0
- app/code/core/Ampersand/PaymentGateway/Model/Service/Redirect/AgreementAbstract.php +174 -0
- app/code/core/Ampersand/PaymentGateway/Model/Service/RedirectAbstract.php +58 -0
- app/code/core/Ampersand/PaymentGateway/Model/Source/AgreementMethod.php +42 -0
- app/code/core/Ampersand/PaymentGateway/Model/Source/CardType.php +97 -0
- app/code/core/Ampersand/PaymentGateway/Model/Source/OrderStatus.php +35 -0
- app/code/core/Ampersand/PaymentGateway/Model/Source/PaymentAction.php +58 -0
- app/code/core/Ampersand/PaymentGateway/Model/Source/SubscriptionPeriods.php +65 -0
- app/code/core/Ampersand/PaymentGateway/Model/Subscription.php +151 -0
- app/code/core/Ampersand/PaymentGateway/Model/Subscription/Order.php +29 -0
- app/code/core/Ampersand/PaymentGateway/Model/Transaction.php +175 -0
- app/code/core/Ampersand/PaymentGateway/Model/Utility/Cleanup.php +62 -0
- app/code/core/Ampersand/PaymentGateway/Model/Utility/Subscription.php +348 -0
- app/code/core/Ampersand/PaymentGateway/Model/Versioning.php +27 -0
- app/code/core/Ampersand/PaymentGateway/changelog.txt +12 -0
- app/code/core/Ampersand/PaymentGateway/controllers/Adminhtml/Subscription/OrderController.php +36 -0
- app/code/core/Ampersand/PaymentGateway/controllers/Adminhtml/SubscriptionController.php +92 -0
- app/code/core/Ampersand/PaymentGateway/controllers/Checkout/Cart/SubscriptionController.php +103 -0
- app/code/core/Ampersand/PaymentGateway/controllers/Checkout/OnepageController.php +81 -0
- app/code/core/Ampersand/PaymentGateway/controllers/Customer/Account/SubscriptionController.php +121 -0
- app/code/core/Ampersand/PaymentGateway/controllers/RedirectController.php +38 -0
- app/code/core/Ampersand/PaymentGateway/etc/adminhtml.xml +65 -0
- app/code/core/Ampersand/PaymentGateway/etc/config.xml +300 -0
- app/code/core/Ampersand/PaymentGateway/etc/system.xml +184 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-install-0.0.1.php +21 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.1-0.0.2.php +9 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.10-0.0.11.php +9 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.11-0.0.12.php +10 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.12-0.0.13.php +9 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.13-0.0.14.php +9 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.2-0.0.3.php +9 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.3-0.0.4.php +23 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.4-0.0.5.php +9 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.5-0.0.6.php +9 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.6-0.0.7.php +34 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.7-0.0.8.php +12 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.8-0.0.9.php +12 -0
- app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.9-0.0.10.php +9 -0
- app/code/local/Ampersand/BillingAgreementFix/Rewrite/Mage/Paypal/Helper/Data.php +28 -0
- app/code/local/Ampersand/BillingAgreementFix/Rewrite/Mage/Paypal/Model/Express/Checkout.php +37 -0
- app/code/local/Ampersand/BillingAgreementFix/Rewrite/Mage/Paypal/Model/Method/Agreement.php +27 -0
- app/code/local/Ampersand/BillingAgreementFix/Rewrite/Mage/Sales/Block/Payment/Form/Billing/Agreement.php +31 -0
- app/code/local/Ampersand/BillingAgreementFix/Rewrite/Mage/Sales/Model/Billing/Agreement.php +26 -0
- app/code/local/Ampersand/BillingAgreementFix/etc/config.xml +37 -0
- app/design/adminhtml/base/default/layout/ampersand_paymentgateway.xml +8 -0
- app/design/adminhtml/base/default/template/ampersand_paymentgateway/system/config/fieldset/hint.phtml +4 -0
- app/design/frontend/base/default/layout/ampersand_paymentgateway.xml +77 -0
- app/design/frontend/base/default/template/ampersand_paymentgateway/checkout/cart/subscription.phtml +45 -0
- app/design/frontend/base/default/template/ampersand_paymentgateway/checkout/onepage/review/subscription.phtml +8 -0
- app/design/frontend/base/default/template/ampersand_paymentgateway/customer/account/subscription.phtml +83 -0
- app/design/frontend/base/default/template/ampersand_paymentgateway/payment/form/billing-agreement-checkbox.phtml +29 -0
- app/design/frontend/base/default/template/ampersand_paymentgateway/payment/form/billing-agreement-cv2.phtml +10 -0
- app/design/frontend/base/default/template/ampersand_paymentgateway/payment/form/redirect.phtml +21 -0
- app/design/frontend/base/default/template/ampersand_paymentgateway/redirect/form.phtml +23 -0
- app/design/frontend/base/default/template/ampersand_paymentgateway/redirect/iframe.phtml +6 -0
- app/design/frontend/base/default/template/ampersand_paymentgateway/redirect/location.phtml +12 -0
- app/design/frontend/base/default/template/ampersand_paymentgateway/sales/payment/form/billing/agreement.phtml +42 -0
- app/etc/modules/Ampersand_BillingAgreementFix.xml +9 -0
- app/etc/modules/Ampersand_PaymentGateway.xml +23 -0
- app/locale/en_US/template/email/ampersand_paymentgateway/notification.html +25 -0
- app/locale/en_US/template/email/ampersand_paymentgateway/subscription_reminder.html +43 -0
- js/ampersand_paymentgateway/validation.js +11 -0
- package.xml +18 -0
- skin/adminhtml/base/default/ampersand_paymentgateway/css/styles.css +16 -0
- skin/adminhtml/base/default/ampersand_paymentgateway/images/logo.gif +0 -0
- skin/frontend/base/default/ampersand_paymentgateway/css/cart.css +1 -0
- skin/frontend/base/default/ampersand_paymentgateway/css/checkout.css +2 -0
app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription.php
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Adminhtml_Subscription
|
3 |
+
extends Mage_Adminhtml_Block_Widget_Grid_Container
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Initialize the grid container.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
public function __construct()
|
11 |
+
{
|
12 |
+
$this->_controller = 'subscription';
|
13 |
+
$this->_blockGroup = 'ampersand_paymentgateway_admin';
|
14 |
+
$this->_headerText = Mage::helper('ampersand_paymentgateway')->__('Subscriptions');
|
15 |
+
|
16 |
+
parent::__construct();
|
17 |
+
|
18 |
+
$this->_removeButton('add');
|
19 |
+
}
|
20 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription/Edit.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Adminhtml_Subscription_Edit
|
3 |
+
extends Mage_Adminhtml_Block_Widget_Form_Container
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Prepare the form container.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
public function __construct()
|
11 |
+
{
|
12 |
+
$this->_controller = 'subscription';
|
13 |
+
$this->_blockGroup = 'ampersand_paymentgateway_admin';
|
14 |
+
$this->_mode = 'edit';
|
15 |
+
|
16 |
+
$this->_headerText = Mage::helper('ampersand_paymentgateway')->__('Edit Subscription');
|
17 |
+
|
18 |
+
parent::__construct();
|
19 |
+
|
20 |
+
$this->_removeButton('delete');
|
21 |
+
|
22 |
+
$this->_addButton('save_and_continue_edit', array(
|
23 |
+
'label' => Mage::helper('ampersand_paymentgateway')->__('Save and Continue Edit'),
|
24 |
+
'onclick' => "editForm.submit('{$this->getUrl('*/*/*', array(
|
25 |
+
'_current' => true,
|
26 |
+
'continue' => '1',
|
27 |
+
))}');",
|
28 |
+
'class' => 'save',
|
29 |
+
), 2);
|
30 |
+
}
|
31 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription/Edit/Form.php
ADDED
@@ -0,0 +1,103 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Adminhtml_Subscription_Edit_Form
|
3 |
+
extends Mage_Adminhtml_Block_Widget_Form
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Prepare the form.
|
7 |
+
*
|
8 |
+
* @return Ampersand_PaymentGateway_Block_Adminhtml_Subscription_Edit_Form
|
9 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
10 |
+
*/
|
11 |
+
protected function _prepareForm()
|
12 |
+
{
|
13 |
+
$form = new Varien_Data_Form(array(
|
14 |
+
'id' => 'edit_form',
|
15 |
+
'action' => $this->getUrl('*/*/*', array(
|
16 |
+
'_current' => true,
|
17 |
+
'continue' => 0,
|
18 |
+
)),
|
19 |
+
'method' => 'post',
|
20 |
+
));
|
21 |
+
$form->setUseContainer(true);
|
22 |
+
$this->setForm($form);
|
23 |
+
|
24 |
+
$fieldset = $form->addFieldset('general', array(
|
25 |
+
'legend' => $this->__('Subscription details'),
|
26 |
+
'comment' => $this->__('Only fields which can be modified are displayed. Please take care when making changes.'),
|
27 |
+
));
|
28 |
+
|
29 |
+
$this->_addFieldsToFieldset($fieldset, array(
|
30 |
+
'is_active' => array(
|
31 |
+
'label' => $this->__('Is Active?'),
|
32 |
+
'input' => 'text',
|
33 |
+
'required' => true,
|
34 |
+
'note' => '1 for active. 0 for inactive.',
|
35 |
+
),
|
36 |
+
'frequency' => array(
|
37 |
+
'label' => $this->__('Frequency'),
|
38 |
+
'input' => 'text',
|
39 |
+
'required' => true,
|
40 |
+
'note' => 'Subscription frequency in days.',
|
41 |
+
),
|
42 |
+
'next_order_date' => array(
|
43 |
+
'label' => $this->__('Next Order Date'),
|
44 |
+
'input' => 'text',
|
45 |
+
'required' => true,
|
46 |
+
'note' => 'Next order date in format YYYY-MM-DD HH:MM:SS.',
|
47 |
+
),
|
48 |
+
));
|
49 |
+
|
50 |
+
return $this;
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Add fields to the fieldset.
|
55 |
+
*
|
56 |
+
* @return Ampersand_PaymentGateway_Block_Adminhtml_Subscription_Edit_Form
|
57 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
58 |
+
*/
|
59 |
+
protected function _addFieldsToFieldset(Varien_Data_Form_Element_Fieldset $fieldset, $fields)
|
60 |
+
{
|
61 |
+
$requestData = new Varien_Object($this->getRequest()->getPost('object'));
|
62 |
+
|
63 |
+
foreach ($fields as $name => $_data) {
|
64 |
+
if ($requestValue = $requestData->getData($name)) {
|
65 |
+
$_data['value'] = $requestValue;
|
66 |
+
}
|
67 |
+
|
68 |
+
$_data['title'] = $_data['label'];
|
69 |
+
$_data['name'] = "object[$name]";
|
70 |
+
|
71 |
+
if (!array_key_exists('value', $_data)) {
|
72 |
+
$_data['value'] = $this->_getSubscription()->getData($name);
|
73 |
+
}
|
74 |
+
|
75 |
+
if ('note' == $_data['input'] && !array_key_exists('text', $_data)) {
|
76 |
+
$_data['text'] = $_data['value'];
|
77 |
+
}
|
78 |
+
|
79 |
+
$element = $fieldset->addField($name, $_data['input'], $_data);
|
80 |
+
}
|
81 |
+
|
82 |
+
return $this;
|
83 |
+
}
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Retrieve the current subscription,
|
87 |
+
*
|
88 |
+
* @return Ampersand_PaymentGateway_Model_Subscription
|
89 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
90 |
+
*/
|
91 |
+
protected function _getSubscription()
|
92 |
+
{
|
93 |
+
if (!$this->hasSubscription()) {
|
94 |
+
$subscription = Mage::getModel('ampersand_paymentgateway/subscription');
|
95 |
+
if ($id = $this->getRequest()->getParam('id')) {
|
96 |
+
$subscription->load($id);
|
97 |
+
}
|
98 |
+
$this->setSubscription($subscription);
|
99 |
+
}
|
100 |
+
|
101 |
+
return $this->getData('subscription');
|
102 |
+
}
|
103 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription/Grid.php
ADDED
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Adminhtml_Subscription_Grid
|
3 |
+
extends Mage_Adminhtml_Block_Widget_Grid
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Initialize the grid.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
public function __construct()
|
11 |
+
{
|
12 |
+
parent::__construct();
|
13 |
+
|
14 |
+
$this->setId('subscription_grid');
|
15 |
+
$this->setUseAjax(true);
|
16 |
+
$this->setDefaultSort('created_at');
|
17 |
+
$this->setDefaultDir('DESC');
|
18 |
+
$this->setSaveParametersInSession(true);
|
19 |
+
}
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Prepare the grid collection.
|
23 |
+
*
|
24 |
+
* @return Ampersand_PaymentGateway_Block_Adminhtml_Subscription_Grid
|
25 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
26 |
+
*/
|
27 |
+
protected function _prepareCollection()
|
28 |
+
{
|
29 |
+
$collection = Mage::getResourceModel('ampersand_paymentgateway/subscription_collection');
|
30 |
+
|
31 |
+
// join the customer table
|
32 |
+
$collection->joinLeft(
|
33 |
+
'customer/entity',
|
34 |
+
'`customer/entity`.`entity_id`=`main_table`.`customer_id`',
|
35 |
+
'email'
|
36 |
+
);
|
37 |
+
|
38 |
+
// join the order table
|
39 |
+
$collection->joinLeft(
|
40 |
+
'sales/order',
|
41 |
+
'`sales/order`.`entity_id`=`main_table`.`order_id`',
|
42 |
+
'increment_id'
|
43 |
+
);
|
44 |
+
|
45 |
+
$this->setCollection($collection);
|
46 |
+
|
47 |
+
return parent::_prepareCollection();
|
48 |
+
}
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Prepare the grid columns.
|
52 |
+
*
|
53 |
+
* @return Ampersand_PaymentGateway_Block_Adminhtml_Subscription_Grid
|
54 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
55 |
+
*/
|
56 |
+
protected function _prepareColumns()
|
57 |
+
{
|
58 |
+
$this->addColumn('entity_id', array(
|
59 |
+
'header' => $this->_getHelper()->__('ID'),
|
60 |
+
'type' => 'number',
|
61 |
+
'index' => 'entity_id',
|
62 |
+
'filter_index' => '`main_table`.`entity_id`',
|
63 |
+
'width' => '1px',
|
64 |
+
));
|
65 |
+
|
66 |
+
$this->addColumn('created_at', array(
|
67 |
+
'header' => $this->_getHelper()->__('Created'),
|
68 |
+
'type' => 'datetime',
|
69 |
+
'index' => 'created_at',
|
70 |
+
'filter_index' => '`main_table`.`created_at`',
|
71 |
+
'width' => '1px',
|
72 |
+
));
|
73 |
+
|
74 |
+
$this->addColumn('email', array(
|
75 |
+
'header' => $this->_getHelper()->__('Customer Email'),
|
76 |
+
'type' => 'text',
|
77 |
+
'index' => 'email',
|
78 |
+
'filter_index' => '`customer/entity`.`email`',
|
79 |
+
'width' => '1px',
|
80 |
+
));
|
81 |
+
|
82 |
+
$this->addColumn('increment_id', array(
|
83 |
+
'header' => $this->_getHelper()->__('Master Order #'),
|
84 |
+
'type' => 'number',
|
85 |
+
'index' => 'increment_id',
|
86 |
+
'filter_index' => '`sales/order`.`increment_id`',
|
87 |
+
'width' => '1px',
|
88 |
+
));
|
89 |
+
|
90 |
+
$this->addColumn('frequency', array(
|
91 |
+
'header' => $this->_getHelper()->__('Frequency (days)'),
|
92 |
+
'type' => 'number',
|
93 |
+
'index' => 'frequency',
|
94 |
+
'filter_index' => '`main_table`.`frequency`',
|
95 |
+
'width' => '1px',
|
96 |
+
));
|
97 |
+
|
98 |
+
$this->addColumn('remaining_updates_current', array(
|
99 |
+
'header' => $this->_getHelper()->__('Remaining Orders'),
|
100 |
+
'type' => 'number',
|
101 |
+
'index' => 'remaining_updates_current',
|
102 |
+
'filter_index' => '`main_table`.`remaining_updates_current`',
|
103 |
+
'getter' => 'getRemainingSubscriptions',
|
104 |
+
'width' => '1px',
|
105 |
+
));
|
106 |
+
|
107 |
+
$this->addColumn('next_order_date', array(
|
108 |
+
'header' => $this->_getHelper()->__('Next Order Date'),
|
109 |
+
'type' => 'date',
|
110 |
+
'index' => 'next_order_date',
|
111 |
+
'filter_index' => '`main_table`.`next_order_date`',
|
112 |
+
'width' => '1px',
|
113 |
+
));
|
114 |
+
|
115 |
+
$this->addColumn('is_active', array(
|
116 |
+
'header' => $this->_getHelper()->__('Active?'),
|
117 |
+
'type' => 'number',
|
118 |
+
'index' => 'is_active',
|
119 |
+
'filter_index' => '`main_table`.`is_active`',
|
120 |
+
'width' => '1px',
|
121 |
+
));
|
122 |
+
|
123 |
+
$this->addColumn('is_reminder_sent', array(
|
124 |
+
'header' => $this->_getHelper()->__('Reminder Sent?'),
|
125 |
+
'type' => 'number',
|
126 |
+
'index' => 'is_reminder_sent',
|
127 |
+
'filter_index' => '`main_table`.`is_reminder_sent`',
|
128 |
+
'width' => '1px',
|
129 |
+
));
|
130 |
+
|
131 |
+
$this->addColumn('action', array(
|
132 |
+
'header' => $this->_getHelper()->__('Action'),
|
133 |
+
'width' => '50px',
|
134 |
+
'type' => 'action',
|
135 |
+
'actions' => array(
|
136 |
+
array(
|
137 |
+
'caption' => $this->_getHelper()->__('Edit'),
|
138 |
+
'url' => array(
|
139 |
+
'base' => '*/*/edit',
|
140 |
+
),
|
141 |
+
'field' => 'id'
|
142 |
+
),
|
143 |
+
),
|
144 |
+
'filter' => false,
|
145 |
+
'sortable' => false,
|
146 |
+
'index' => 'entity_id',
|
147 |
+
'width' => '1px',
|
148 |
+
));
|
149 |
+
|
150 |
+
return parent::_prepareColumns();
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* Retrieve the URL to redirect to when the grid row is clicked.
|
155 |
+
*
|
156 |
+
* @return string
|
157 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
158 |
+
*/
|
159 |
+
public function getRowUrl($row)
|
160 |
+
{
|
161 |
+
return $this->getUrl('*/*/edit', array('id' => $row->getId()));
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* Retrieve the helper.
|
166 |
+
*
|
167 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
168 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
169 |
+
*/
|
170 |
+
protected function _getHelper()
|
171 |
+
{
|
172 |
+
return Mage::helper('ampersand_paymentgateway');
|
173 |
+
}
|
174 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription/Order.php
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Adminhtml_Subscription_Order
|
3 |
+
extends Mage_Adminhtml_Block_Widget_Grid_Container
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Initialize the grid container.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
public function __construct()
|
11 |
+
{
|
12 |
+
$this->_controller = 'subscription_order';
|
13 |
+
$this->_blockGroup = 'ampersand_paymentgateway_admin';
|
14 |
+
$this->_headerText = Mage::helper('ampersand_paymentgateway')->__('Subscription Orders');
|
15 |
+
|
16 |
+
parent::__construct();
|
17 |
+
|
18 |
+
$this->_removeButton('add');
|
19 |
+
}
|
20 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/Subscription/Order/Grid.php
ADDED
@@ -0,0 +1,151 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Adminhtml_Subscription_Order_Grid
|
3 |
+
extends Mage_Adminhtml_Block_Widget_Grid
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Initialize the grid.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
public function __construct()
|
11 |
+
{
|
12 |
+
parent::__construct();
|
13 |
+
|
14 |
+
$this->setId('subscription_order_grid');
|
15 |
+
$this->setUseAjax(true);
|
16 |
+
$this->setDefaultSort('created_at');
|
17 |
+
$this->setDefaultDir('DESC');
|
18 |
+
$this->setSaveParametersInSession(true);
|
19 |
+
}
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Prepare the grid collection.
|
23 |
+
*
|
24 |
+
* @return Ampersand_PaymentGateway_Block_Adminhtml_Subscription_Order_Grid
|
25 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
26 |
+
*/
|
27 |
+
protected function _prepareCollection()
|
28 |
+
{
|
29 |
+
$collection = Mage::getResourceModel('ampersand_paymentgateway/subscription_order_collection');
|
30 |
+
|
31 |
+
// join the subscription table
|
32 |
+
$collection->join(
|
33 |
+
'ampersand_paymentgateway/subscription',
|
34 |
+
'`ampersand_paymentgateway/subscription`.`entity_id`=`main_table`.`subscription_id`',
|
35 |
+
'customer_id'
|
36 |
+
);
|
37 |
+
|
38 |
+
// join the customer table
|
39 |
+
$collection->join(
|
40 |
+
'customer/entity',
|
41 |
+
'`customer/entity`.`entity_id`=`ampersand_paymentgateway/subscription`.`customer_id`',
|
42 |
+
'email'
|
43 |
+
);
|
44 |
+
|
45 |
+
// join the order table
|
46 |
+
$collection->join(
|
47 |
+
'sales/order',
|
48 |
+
'`sales/order`.`entity_id`=`main_table`.`order_id`',
|
49 |
+
'increment_id'
|
50 |
+
);
|
51 |
+
|
52 |
+
$this->setCollection($collection);
|
53 |
+
|
54 |
+
return parent::_prepareCollection();
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Prepare the grid columns.
|
59 |
+
*
|
60 |
+
* @return Ampersand_PaymentGateway_Block_Adminhtml_Subscription_Order_Grid
|
61 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
62 |
+
*/
|
63 |
+
protected function _prepareColumns()
|
64 |
+
{
|
65 |
+
$this->addColumn('entity_id', array(
|
66 |
+
'header' => $this->_getHelper()->__('ID'),
|
67 |
+
'type' => 'number',
|
68 |
+
'index' => 'entity_id',
|
69 |
+
'width' => '1px',
|
70 |
+
));
|
71 |
+
|
72 |
+
$this->addColumn('created_at', array(
|
73 |
+
'header' => $this->_getHelper()->__('Created'),
|
74 |
+
'type' => 'datetime',
|
75 |
+
'index' => 'created_at',
|
76 |
+
'width' => '1px',
|
77 |
+
));
|
78 |
+
|
79 |
+
$this->addColumn('subscription_id', array(
|
80 |
+
'header' => $this->_getHelper()->__('Subscription ID'),
|
81 |
+
'type' => 'number',
|
82 |
+
'index' => 'subscription_id',
|
83 |
+
'width' => '1px',
|
84 |
+
));
|
85 |
+
|
86 |
+
$this->addColumn('increment_id', array(
|
87 |
+
'header' => $this->_getHelper()->__('Order #'),
|
88 |
+
'type' => 'number',
|
89 |
+
'index' => 'increment_id',
|
90 |
+
'width' => '1px',
|
91 |
+
));
|
92 |
+
|
93 |
+
$this->addColumn('email', array(
|
94 |
+
'header' => $this->_getHelper()->__('Customer Email'),
|
95 |
+
'type' => 'text',
|
96 |
+
'index' => 'email',
|
97 |
+
'width' => '1px',
|
98 |
+
));
|
99 |
+
|
100 |
+
$this->addColumn('view_order', array(
|
101 |
+
'header' => $this->_getHelper()->__('View Order'),
|
102 |
+
'width' => '50px',
|
103 |
+
'type' => 'action',
|
104 |
+
'actions' => array(
|
105 |
+
array(
|
106 |
+
'caption' => $this->_getHelper()->__('Order'),
|
107 |
+
'url' => array(
|
108 |
+
'base' => 'adminhtml/sales_order/view',
|
109 |
+
),
|
110 |
+
'field' => 'order_id'
|
111 |
+
),
|
112 |
+
),
|
113 |
+
'filter' => false,
|
114 |
+
'sortable' => false,
|
115 |
+
'index' => 'order_id',
|
116 |
+
'width' => '1px',
|
117 |
+
));
|
118 |
+
|
119 |
+
$this->addColumn('view_subscription', array(
|
120 |
+
'header' => $this->_getHelper()->__('View Subsctiption'),
|
121 |
+
'width' => '50px',
|
122 |
+
'type' => 'action',
|
123 |
+
'actions' => array(
|
124 |
+
array(
|
125 |
+
'caption' => $this->_getHelper()->__('Subscription'),
|
126 |
+
'url' => array(
|
127 |
+
'base' => 'ampersand_paymentgateway_admin/subscription/edit',
|
128 |
+
),
|
129 |
+
'field' => 'id'
|
130 |
+
),
|
131 |
+
),
|
132 |
+
'filter' => false,
|
133 |
+
'sortable' => false,
|
134 |
+
'index' => 'subscription_id',
|
135 |
+
'width' => '1px',
|
136 |
+
));
|
137 |
+
|
138 |
+
return parent::_prepareColumns();
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Retrieve the helper.
|
143 |
+
*
|
144 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
145 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
146 |
+
*/
|
147 |
+
protected function _getHelper()
|
148 |
+
{
|
149 |
+
return Mage::helper('ampersand_paymentgateway');
|
150 |
+
}
|
151 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Adminhtml/System/Config/Fieldset/Hint.php
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Adminhtml_System_Config_Fieldset_Hint
|
3 |
+
extends Mage_Adminhtml_Block_Abstract
|
4 |
+
implements Varien_Data_Form_Element_Renderer_Interface
|
5 |
+
{
|
6 |
+
/**
|
7 |
+
* Location of our hint template file.
|
8 |
+
*
|
9 |
+
* @var string $_template
|
10 |
+
*/
|
11 |
+
protected $_template = 'ampersand_paymentgateway/system/config/fieldset/hint.phtml';
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Render fieldset html.
|
15 |
+
*
|
16 |
+
* @param Varien_Data_Form_Element_Abstract $element
|
17 |
+
* @return string
|
18 |
+
*/
|
19 |
+
public function render(Varien_Data_Form_Element_Abstract $element)
|
20 |
+
{
|
21 |
+
return $this->toHtml();
|
22 |
+
}
|
23 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Checkout/Cart/Subscription.php
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Checkout_Cart_Subscription
|
3 |
+
extends Mage_Core_Block_Template
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Retrieve whether subscriptions are available.
|
7 |
+
*
|
8 |
+
* @return bool
|
9 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
10 |
+
*/
|
11 |
+
public function isActive()
|
12 |
+
{
|
13 |
+
return $this->_getHelper()->isActive(true);
|
14 |
+
}
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Retrieve whether the customer is logged in.
|
18 |
+
*
|
19 |
+
* @return bool
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function isLoggedIn()
|
23 |
+
{
|
24 |
+
return Mage::helper('customer')->isLoggedIn();
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Retrieve the available periods.
|
29 |
+
*
|
30 |
+
* @return array
|
31 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
32 |
+
*/
|
33 |
+
public function getPeriods()
|
34 |
+
{
|
35 |
+
$options = Mage::getModel('ampersand_paymentgateway/source_subscriptionPeriods')
|
36 |
+
->toOptionArray();
|
37 |
+
|
38 |
+
array_unshift($options, array(
|
39 |
+
'value' => 'do_not_subscribe',
|
40 |
+
'label' => $this->_getHelper()->__('None'),
|
41 |
+
));
|
42 |
+
|
43 |
+
return $options;
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Retrieve the selected period.
|
48 |
+
*
|
49 |
+
* @return string
|
50 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
51 |
+
*/
|
52 |
+
public function getSubscriptionPeriod()
|
53 |
+
{
|
54 |
+
return $this->_getHelper()->getSubscriptionData('period');
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Retrieve the subscription helper.
|
59 |
+
*
|
60 |
+
* @return Ampersand_PaymentGateway_Helper_Subscription
|
61 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
62 |
+
*/
|
63 |
+
protected function _getHelper()
|
64 |
+
{
|
65 |
+
return Mage::helper('ampersand_paymentgateway/subscription');
|
66 |
+
}
|
67 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Checkout/Onepage/Review/Subscription.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Checkout_Onepage_Review_Subscription
|
3 |
+
extends Mage_Core_Block_Template
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Has the customer selected to create a subscription for this order.
|
7 |
+
*
|
8 |
+
* @return bool
|
9 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
10 |
+
*/
|
11 |
+
public function isActive()
|
12 |
+
{
|
13 |
+
return $this->_getHelper()->getSubscriptionData('active');
|
14 |
+
}
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Retrieve details of the customers selections.
|
18 |
+
*
|
19 |
+
* @return Ampersand_Object
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function getSubscriptionInfo()
|
23 |
+
{
|
24 |
+
return new Ampersand_Object($this->_getHelper()->getSubscriptionData());
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Retrieve the subscription helper.
|
29 |
+
*
|
30 |
+
* @return Ampersand_PaymentGateway_Helper_Subscription
|
31 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
32 |
+
*/
|
33 |
+
protected function _getHelper()
|
34 |
+
{
|
35 |
+
return Mage::helper('ampersand_paymentgateway/subscription');
|
36 |
+
}
|
37 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Customer/Account/Subscription.php
ADDED
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Customer_Account_Subscription
|
3 |
+
extends Mage_Core_Block_Template
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Initialize collection of subscriptions for the logged in customer.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
protected function _construct()
|
11 |
+
{
|
12 |
+
$subscriptions = Mage::getModel('ampersand_paymentgateway/subscription')->getCollection()
|
13 |
+
->addFieldToFilter('customer_id', $this->_getCustomerId())
|
14 |
+
->addFieldToFilter('is_active', '1')
|
15 |
+
->setOrder('created_at', 'DESC');
|
16 |
+
|
17 |
+
$this->setSubscriptions($subscriptions);
|
18 |
+
}
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Initialize the pager.
|
22 |
+
*
|
23 |
+
* @return Ampersand_PaymentGateway_Block_Customer_Account_Subscription
|
24 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
25 |
+
*/
|
26 |
+
protected function _prepareLayout()
|
27 |
+
{
|
28 |
+
parent::_prepareLayout();
|
29 |
+
|
30 |
+
$pager = $this->getLayout()->createBlock(
|
31 |
+
'page/html_pager',
|
32 |
+
'ampersand_paymentgateway_subscription_pager'
|
33 |
+
);
|
34 |
+
$pager->setCollection($this->getSubscriptions());
|
35 |
+
$this->setChild('pager', $pager);
|
36 |
+
$this->getSubscriptions()->load();
|
37 |
+
|
38 |
+
return $this;
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Retrieve the pager.
|
43 |
+
*
|
44 |
+
* @return string
|
45 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
46 |
+
*/
|
47 |
+
public function getPagerHtml()
|
48 |
+
{
|
49 |
+
return $this->getChildHtml('pager');
|
50 |
+
}
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Retrieve an order given an order ID.
|
54 |
+
*
|
55 |
+
* @param int $orderId
|
56 |
+
* @return Mage_Sales_Model_Order
|
57 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
58 |
+
*/
|
59 |
+
public function getOrder($orderId)
|
60 |
+
{
|
61 |
+
return Mage::getModel('sales/order')->load($orderId);
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Retrieve an order URL given an order object or ID.
|
66 |
+
*
|
67 |
+
* @param mixed $order
|
68 |
+
* @return string
|
69 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
70 |
+
*/
|
71 |
+
public function getOrderUrl($order)
|
72 |
+
{
|
73 |
+
if (!$order instanceof Mage_Sales_Model_Order) {
|
74 |
+
$order = $this->getOrder($order);
|
75 |
+
}
|
76 |
+
|
77 |
+
return Mage::getUrl('sales/order/view', array('order_id' => $order->getId()));
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Retrieve the name of the payment gateway from a payment code.
|
82 |
+
*
|
83 |
+
* @param string $code
|
84 |
+
* @return string
|
85 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
86 |
+
*/
|
87 |
+
public function getPaymentMethod($code)
|
88 |
+
{
|
89 |
+
return Mage::getStoreConfig(
|
90 |
+
Mage_Payment_Helper_Data::XML_PATH_PAYMENT_METHODS . '/' . $code . '/title'
|
91 |
+
);
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Retrieve more information about a billing agreement.
|
96 |
+
*
|
97 |
+
* @param int $agreementId
|
98 |
+
* @return Ampersand_PaymentGateway_Model_Agreement
|
99 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
100 |
+
*/
|
101 |
+
public function getPaymentMethodCardDetails($agreementId)
|
102 |
+
{
|
103 |
+
return Mage::getModel('ampersand_paymentgateway/agreement')->getCollection()
|
104 |
+
->addFieldToFilter('entity_id', $agreementId)
|
105 |
+
->getFirstItem();
|
106 |
+
}
|
107 |
+
|
108 |
+
/**
|
109 |
+
* Retrieve friendly name of Magento card types.
|
110 |
+
*
|
111 |
+
* @param string $type
|
112 |
+
* @return string
|
113 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
114 |
+
*/
|
115 |
+
public function getCardType($type)
|
116 |
+
{
|
117 |
+
return Mage::getSingleton('ampersand_paymentgateway/source_cardType')
|
118 |
+
->getMagentoCardType($type);
|
119 |
+
}
|
120 |
+
|
121 |
+
/**
|
122 |
+
* Retrieve the URL for a customer to cancel a subscription.
|
123 |
+
* Note: The subscription ID needs to be appended to this URL.
|
124 |
+
*
|
125 |
+
* @return string
|
126 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
127 |
+
*/
|
128 |
+
public function getCancelUrl()
|
129 |
+
{
|
130 |
+
return Mage::getUrl(
|
131 |
+
'customer/account/subscriptions',
|
132 |
+
array(
|
133 |
+
'action' => 'cancel',
|
134 |
+
)
|
135 |
+
);
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Retrieve the URL for a customer to skip a subscription order.
|
140 |
+
* Note: The subscription ID needs to be appended to this URL.
|
141 |
+
*
|
142 |
+
* @return string
|
143 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
144 |
+
*/
|
145 |
+
public function getSkipNextUrl()
|
146 |
+
{
|
147 |
+
return Mage::getUrl(
|
148 |
+
'customer/account/subscriptions',
|
149 |
+
array(
|
150 |
+
'action' => 'skip',
|
151 |
+
)
|
152 |
+
);
|
153 |
+
}
|
154 |
+
|
155 |
+
/**
|
156 |
+
* Retrieve the logged in customer ID.
|
157 |
+
*
|
158 |
+
* @return int
|
159 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
160 |
+
*/
|
161 |
+
protected function _getCustomerId()
|
162 |
+
{
|
163 |
+
return Mage::helper('customer')->getCustomer()->getId();
|
164 |
+
}
|
165 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Payment/Form/BillingAgreement.php
ADDED
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* @todo this file does not belong here, should be same as Magento, but possibly:
|
4 |
+
* Ampersand_PaymentGateway_Block_Sales_Payment_Form_Billing_Agreement
|
5 |
+
*/
|
6 |
+
class Ampersand_PaymentGateway_Block_Payment_Form_BillingAgreement
|
7 |
+
extends Ampersand_BillingAgreementFix_Rewrite_Mage_Sales_Block_Payment_Form_Billing_Agreement
|
8 |
+
{
|
9 |
+
/**
|
10 |
+
* Set the default template for the form.
|
11 |
+
*
|
12 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
13 |
+
*/
|
14 |
+
public function __construct()
|
15 |
+
{
|
16 |
+
parent::__construct();
|
17 |
+
$this->setTemplate('ampersand_paymentgateway/sales/payment/form/billing/agreement.phtml');
|
18 |
+
}
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Retrieve available customer billing agreements
|
22 |
+
*
|
23 |
+
* @return array
|
24 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
25 |
+
*/
|
26 |
+
public function getBillingAgreements()
|
27 |
+
{
|
28 |
+
$billingAgreements = parent::getBillingAgreements();
|
29 |
+
|
30 |
+
$collection = Mage::getModel('ampersand_paymentgateway/agreement')->getCollection()
|
31 |
+
->addFieldToFilter('reference_id', $billingAgreements);
|
32 |
+
|
33 |
+
$ampersandAgreements = array();
|
34 |
+
foreach ($collection as $_agreement) {
|
35 |
+
$this->_prepareAgreementData($_agreement);
|
36 |
+
$ampersandAgreements[$_agreement->getReferenceId()] = $_agreement;
|
37 |
+
}
|
38 |
+
|
39 |
+
foreach ($billingAgreements as $_id => &$_referenceId) {
|
40 |
+
if (!array_key_exists($_referenceId, $ampersandAgreements)) {
|
41 |
+
unset($billingAgreements[$_id]);
|
42 |
+
} else {
|
43 |
+
$_referenceId = $ampersandAgreements[$_referenceId];
|
44 |
+
}
|
45 |
+
}
|
46 |
+
|
47 |
+
return $billingAgreements;
|
48 |
+
}
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Retrieve friendly name of Magento card types.
|
52 |
+
*
|
53 |
+
* @param string $type
|
54 |
+
* @return string
|
55 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
56 |
+
*/
|
57 |
+
public function getCardType($type)
|
58 |
+
{
|
59 |
+
return Mage::getSingleton('ampersand_paymentgateway/source_cardType')
|
60 |
+
->getMagentoCardType($type);
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Retrieve card details from reference ID if they are not explicitly stored.
|
65 |
+
*
|
66 |
+
* @param Ampersand_PaymentGateway_Model_Agreement $agreement
|
67 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
68 |
+
*/
|
69 |
+
protected function _prepareAgreementData($agreement)
|
70 |
+
{
|
71 |
+
$referenceId = $agreement->getReferenceId();
|
72 |
+
|
73 |
+
// Format of Reference ID = 1234567890-****1234-01-2000
|
74 |
+
$referenceIdParts = false;
|
75 |
+
$pattern = '#\d{10}-\*{4}\d{4}-\d{2}-\d{4}#';
|
76 |
+
if (preg_match($pattern, $referenceId) === 1) {
|
77 |
+
$referenceIdParts = explode('-', $referenceId);
|
78 |
+
}
|
79 |
+
|
80 |
+
$data = array(
|
81 |
+
'card_type' => 'Unknown',
|
82 |
+
'card_last_four' => $referenceIdParts ? substr($referenceIdParts[1], -4) : '????',
|
83 |
+
'card_expiry_month' => $referenceIdParts ? $referenceIdParts[2] : '??',
|
84 |
+
'card_expiry_year' => $referenceIdParts ? $referenceIdParts[3] : '????',
|
85 |
+
);
|
86 |
+
|
87 |
+
foreach ($data as $_field => $_defaultValue) {
|
88 |
+
if ($agreement->getData($_field) == '') {
|
89 |
+
$agreement->setData($_field, $_defaultValue);
|
90 |
+
}
|
91 |
+
}
|
92 |
+
|
93 |
+
return $this;
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Render block HTML
|
98 |
+
*
|
99 |
+
* @return string
|
100 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
101 |
+
*/
|
102 |
+
protected function _toHtml()
|
103 |
+
{
|
104 |
+
Mage::dispatchEvent('payment_form_block_to_html_before', array(
|
105 |
+
'block' => $this
|
106 |
+
));
|
107 |
+
|
108 |
+
return parent::_toHtml();
|
109 |
+
}
|
110 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Payment/Form/BillingAgreementCheckbox.php
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Payment_Form_BillingAgreementCheckbox
|
3 |
+
extends Mage_Core_Block_Template
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Set the default template for the block.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
protected function _construct()
|
11 |
+
{
|
12 |
+
parent::_construct();
|
13 |
+
|
14 |
+
$this->setTemplate('ampersand_paymentgateway/payment/form/billing-agreement-checkbox.phtml');
|
15 |
+
}
|
16 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Payment/Form/BillingAgreementCv2.php
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Payment_Form_BillingAgreementCv2
|
3 |
+
extends Mage_Core_Block_Template
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Set the default template for the block.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
protected function _construct()
|
11 |
+
{
|
12 |
+
parent::_construct();
|
13 |
+
|
14 |
+
$this->setTemplate('ampersand_paymentgateway/payment/form/billing-agreement-cv2.phtml');
|
15 |
+
}
|
16 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Payment/Form/Redirect.php
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Payment_Form_Redirect extends Mage_Payment_Block_Form
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Set the default template for the form.
|
6 |
+
*
|
7 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
8 |
+
*/
|
9 |
+
protected function _construct()
|
10 |
+
{
|
11 |
+
parent::_construct();
|
12 |
+
|
13 |
+
$this->setTemplate('ampersand_paymentgateway/payment/form/redirect.phtml');
|
14 |
+
}
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Retrieve whether credit card type is required for this payment method.
|
18 |
+
*
|
19 |
+
* @return bool
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function isCcTypeRequired()
|
23 |
+
{
|
24 |
+
return $this->getMethod()->getIsCcTypeRequired();
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Retrieve availables credit card types
|
29 |
+
*
|
30 |
+
* @return array
|
31 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
32 |
+
*/
|
33 |
+
public function getCcAvailableTypes()
|
34 |
+
{
|
35 |
+
$types = $this->_getConfig()->getCcTypes();
|
36 |
+
|
37 |
+
if ($method = $this->getMethod()) {
|
38 |
+
$availableTypes = $method->getConfigData('cctypes');
|
39 |
+
if ($availableTypes) {
|
40 |
+
$availableTypes = explode(',', $availableTypes);
|
41 |
+
foreach ($types as $code => $name) {
|
42 |
+
if (!in_array($code, $availableTypes)) {
|
43 |
+
unset($types[$code]);
|
44 |
+
}
|
45 |
+
}
|
46 |
+
}
|
47 |
+
}
|
48 |
+
|
49 |
+
return $types;
|
50 |
+
}
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Retrieve payment configuration object
|
54 |
+
*
|
55 |
+
* @return Mage_Payment_Model_Config
|
56 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
57 |
+
*/
|
58 |
+
protected function _getConfig()
|
59 |
+
{
|
60 |
+
return Mage::getSingleton('payment/config');
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Render block HTML
|
65 |
+
*
|
66 |
+
* @return string
|
67 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
68 |
+
*/
|
69 |
+
protected function _toHtml()
|
70 |
+
{
|
71 |
+
Mage::dispatchEvent('payment_form_block_to_html_before', array(
|
72 |
+
'block' => $this
|
73 |
+
));
|
74 |
+
|
75 |
+
return parent::_toHtml();
|
76 |
+
}
|
77 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Payment/Form/Subscription.php
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Payment_Form_Subscription
|
3 |
+
extends Mage_Core_Block_Template
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Set the default template for the block.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
protected function _construct()
|
11 |
+
{
|
12 |
+
parent::_construct();
|
13 |
+
|
14 |
+
$this->setTemplate('ampersand_paymentgateway/payment/form/subscription.phtml');
|
15 |
+
}
|
16 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Payment/Info/Redirect.php
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Payment_Info_Redirect extends Mage_Payment_Block_Info
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Retrieve credit card type name.
|
6 |
+
*
|
7 |
+
* @return string
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
public function getCcTypeName()
|
11 |
+
{
|
12 |
+
$ccType = $this->getInfo()->getCcType();
|
13 |
+
|
14 |
+
$types = Mage::getSingleton('payment/config')->getCcTypes();
|
15 |
+
if (isset($types[$ccType])) {
|
16 |
+
return $types[$ccType];
|
17 |
+
}
|
18 |
+
|
19 |
+
return (empty($ccType)) ? Mage::helper('payment')->__('N/A') : $ccType;
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Prepare credit card related payment info.
|
24 |
+
*
|
25 |
+
* @param Varien_Object|array $transport
|
26 |
+
* @return Varien_Object
|
27 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
28 |
+
*/
|
29 |
+
protected function _prepareSpecificInformation($transport = null)
|
30 |
+
{
|
31 |
+
if (null !== $this->_paymentSpecificInformation) {
|
32 |
+
return $this->_paymentSpecificInformation;
|
33 |
+
}
|
34 |
+
|
35 |
+
$transport = parent::_prepareSpecificInformation($transport);
|
36 |
+
|
37 |
+
$data = array();
|
38 |
+
|
39 |
+
$method = $this->getMethod();
|
40 |
+
|
41 |
+
if ($method->getIsCcTypeRequired() && ($ccType = $this->getCcTypeName())) {
|
42 |
+
$data[Mage::helper('payment')->__('Credit Card Type')] = $ccType;
|
43 |
+
}
|
44 |
+
|
45 |
+
return $transport->setData(array_merge($data, $transport->getData()));
|
46 |
+
}
|
47 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Redirect/Form.php
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Redirect_Form extends Mage_Core_Block_Template
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Session keys for redirect information.
|
6 |
+
*/
|
7 |
+
const SESSION_KEY_REDIRECT_URL = 'ampersand_paymentgateway_redirect_form_url';
|
8 |
+
const SESSION_KEY_REDIRECT_DATA = 'ampersand_paymentgateway_redirect_form_data';
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Set the default template for the redirect form.
|
12 |
+
*
|
13 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
14 |
+
*/
|
15 |
+
protected function _construct()
|
16 |
+
{
|
17 |
+
parent::_construct();
|
18 |
+
|
19 |
+
$this->setTemplate('ampersand_paymentgateway/redirect/form.phtml');
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Retrieve the page title.
|
24 |
+
*
|
25 |
+
* @return string
|
26 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
27 |
+
*/
|
28 |
+
public function getTitle()
|
29 |
+
{
|
30 |
+
if (!$this->hasTitle()) {
|
31 |
+
$this->setData('title', 'Please wait while you are redirected...');
|
32 |
+
}
|
33 |
+
|
34 |
+
return $this->getData('title');
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Retrieve the Redirect URL value stored from the response.
|
39 |
+
*
|
40 |
+
* @return string
|
41 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
42 |
+
*/
|
43 |
+
public function getRedirectUrl()
|
44 |
+
{
|
45 |
+
return $this->_getHelper()->getAndClearSessionKey(self::SESSION_KEY_REDIRECT_URL);
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Set any hidden fields to be posted in the redirect POST.
|
50 |
+
*
|
51 |
+
* @return array
|
52 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
53 |
+
*/
|
54 |
+
public function getHiddenFields()
|
55 |
+
{
|
56 |
+
return $this->_getHelper()->getAndClearSessionKey(self::SESSION_KEY_REDIRECT_DATA);
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Retrieve the message to display if no redirect URL was provided.
|
61 |
+
*
|
62 |
+
* @return string
|
63 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
64 |
+
*/
|
65 |
+
public function getNoRedirectUrlMessage()
|
66 |
+
{
|
67 |
+
if (!$this->hasNoRedirectUrlMessage()) {
|
68 |
+
$this->setData('no_redirect_url_message', 'Unable to redirect.');
|
69 |
+
}
|
70 |
+
|
71 |
+
return $this->getData('no_redirect_url_message');
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Retrieve the helper class.
|
76 |
+
*
|
77 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
78 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
79 |
+
*/
|
80 |
+
protected function _getHelper()
|
81 |
+
{
|
82 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
83 |
+
}
|
84 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Redirect/Iframe.php
ADDED
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Redirect_Iframe extends Mage_Core_Block_Template
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Set the default template for the iframe container.
|
6 |
+
*
|
7 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
8 |
+
*/
|
9 |
+
protected function _construct()
|
10 |
+
{
|
11 |
+
parent::_construct();
|
12 |
+
|
13 |
+
$this->setTemplate('ampersand_paymentgateway/redirect/iframe.phtml');
|
14 |
+
}
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Set the iframe source by frontname/controller/action.
|
18 |
+
*
|
19 |
+
* @param string $route
|
20 |
+
* @param array $params
|
21 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
22 |
+
*/
|
23 |
+
public function setSrcByRoute($route, $params = array())
|
24 |
+
{
|
25 |
+
$params['_forced_secure'] = true;
|
26 |
+
$this->setSrc(Mage::getUrl($route, $params));
|
27 |
+
|
28 |
+
return $this;
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Retrieve the iframe source.
|
33 |
+
*
|
34 |
+
* @return string
|
35 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
36 |
+
*/
|
37 |
+
public function getSrc()
|
38 |
+
{
|
39 |
+
return $this->getData('src');
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Retrieve the iframe width.
|
44 |
+
*
|
45 |
+
* @return string
|
46 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
47 |
+
*/
|
48 |
+
public function getWidth()
|
49 |
+
{
|
50 |
+
if (!$this->hasWidth()) {
|
51 |
+
$this->setWidth('100%');
|
52 |
+
}
|
53 |
+
|
54 |
+
return $this->getData('width');
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Retrieve the iframe height.
|
59 |
+
*
|
60 |
+
* @return string
|
61 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
62 |
+
*/
|
63 |
+
public function getHeight()
|
64 |
+
{
|
65 |
+
if (!$this->hasHeight()) {
|
66 |
+
$this->setHeight('500px');
|
67 |
+
}
|
68 |
+
|
69 |
+
return $this->getData('height');
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Retrieve the helper class.
|
74 |
+
*
|
75 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
76 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
77 |
+
*/
|
78 |
+
protected function _getHelper()
|
79 |
+
{
|
80 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
81 |
+
}
|
82 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Block/Redirect/Location.php
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Block_Redirect_Location extends Mage_Core_Block_Template
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Registry key for setting the iframe redirect URL.
|
6 |
+
*/
|
7 |
+
const REGISTRY_KEY_REDIRECT_URL = 'ampersand_paymentgateway_redirect_location_url';
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Set the default template for the redirect.
|
11 |
+
*
|
12 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
13 |
+
*/
|
14 |
+
protected function _construct()
|
15 |
+
{
|
16 |
+
parent::_construct();
|
17 |
+
|
18 |
+
$this->setTemplate('ampersand_paymentgateway/redirect/location.phtml');
|
19 |
+
}
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Retrieve the page title.
|
23 |
+
*
|
24 |
+
* @return string
|
25 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
26 |
+
*/
|
27 |
+
public function getTitle()
|
28 |
+
{
|
29 |
+
if (!$this->hasTitle()) {
|
30 |
+
$this->setData('title', 'Please wait while you are redirected...');
|
31 |
+
}
|
32 |
+
|
33 |
+
return $this->getData('title');
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Retrieve the redirect url.
|
38 |
+
*
|
39 |
+
* @return string
|
40 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
41 |
+
*/
|
42 |
+
public function getRedirectUrl()
|
43 |
+
{
|
44 |
+
if (!$this->hasRedirectUrl()) {
|
45 |
+
if (!$redirectUrl = Mage::registry(self::REGISTRY_KEY_REDIRECT_URL)) {
|
46 |
+
// added the homepage URL here to prevent infinite redirect loop
|
47 |
+
$redirectUrl = Mage::getUrl();
|
48 |
+
}
|
49 |
+
$this->setData('redirect_url', $redirectUrl);
|
50 |
+
}
|
51 |
+
|
52 |
+
return $this->getData('redirect_url');
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Retrieve the helper class.
|
57 |
+
*
|
58 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
59 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
60 |
+
*/
|
61 |
+
protected function _getHelper()
|
62 |
+
{
|
63 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
64 |
+
}
|
65 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Helper/Data.php
ADDED
@@ -0,0 +1,492 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Helper_Data extends Mage_Core_Helper_Abstract
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Registry key for the unique transaction reference.
|
6 |
+
*/
|
7 |
+
const REGISTRY_KEY_UNIQUE_TRANSACTION_REFERENCE = 'ampersand_unique_transaction_reference';
|
8 |
+
const REGISTRY_KEY_BILLING_AGREEMENT_CV2 = 'ampersand_billing_agreement_cv2';
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Session keys for customers selections during checkout.
|
12 |
+
*/
|
13 |
+
const SESSION_KEY_BILLING_AGREEMENT_SELECTION = 'ampersand_paymentgateway_billing_agreement_selection';
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Max number of decimal places for price formatting.
|
17 |
+
*/
|
18 |
+
const MAX_DECIMAL_PLACES = 2;
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Registry key for storing redirect URL.
|
22 |
+
*/
|
23 |
+
const REGISTRY_KEY_REDIRECT_URL = 'ampersand_paymentgateway_redirect_url';
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Customer facing failure messages.
|
27 |
+
*/
|
28 |
+
protected $_failureMessages = array(
|
29 |
+
Ampersand_PaymentGateway_Model_Service_Abstract::FAILURE_TYPE_DENIED
|
30 |
+
=> 'Your order was unsuccessful. Payment has not been taken and your order will not be processed.',
|
31 |
+
Ampersand_PaymentGateway_Model_Service_Abstract::FAILURE_TYPE_ERROR
|
32 |
+
=> 'An unexpected error occured. Please contact customer services quoting the above reference number.',
|
33 |
+
);
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Cache of removed session values after first accessed.
|
37 |
+
*
|
38 |
+
* @var array $_cache
|
39 |
+
*/
|
40 |
+
protected $_cache = array();
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Generate a unique identifier for the transaction.
|
44 |
+
*
|
45 |
+
* @param Varien_Object $order
|
46 |
+
* @return string
|
47 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
48 |
+
*/
|
49 |
+
public function getUniqueTransactionReference(Varien_Object $order = null)
|
50 |
+
{
|
51 |
+
$uniqueTransactionReference
|
52 |
+
= Mage::registry(self::REGISTRY_KEY_UNIQUE_TRANSACTION_REFERENCE);
|
53 |
+
|
54 |
+
if (!is_null($uniqueTransactionReference)) {
|
55 |
+
return $uniqueTransactionReference;
|
56 |
+
}
|
57 |
+
|
58 |
+
if (!$order->getIncrementId()) {
|
59 |
+
throw new Exception(
|
60 |
+
$this->__('Order required to generate unique transaction reference.')
|
61 |
+
);
|
62 |
+
}
|
63 |
+
|
64 |
+
$uniqueTransactionReference = $this->_generateUniqueString($order->getIncrementId());
|
65 |
+
$this->setUniqueTransactionReference($uniqueTransactionReference);
|
66 |
+
|
67 |
+
return $uniqueTransactionReference;
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Return a unique string based on time, random numbers, or some other algorithm.
|
72 |
+
*
|
73 |
+
* @param string $prefix
|
74 |
+
* @return string
|
75 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
76 |
+
*/
|
77 |
+
protected function _generateUniqueString($prefix)
|
78 |
+
{
|
79 |
+
return $prefix . '-' . time() . '-' . mt_rand(111111,999999);
|
80 |
+
}
|
81 |
+
|
82 |
+
/**
|
83 |
+
* Force the value for a unique identifier for the transaction.
|
84 |
+
*
|
85 |
+
* @param string $newTransactionReference
|
86 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
87 |
+
*/
|
88 |
+
public function setUniqueTransactionReference($newTransactionReference)
|
89 |
+
{
|
90 |
+
$uniqueTransactionReference
|
91 |
+
= Mage::registry(self::REGISTRY_KEY_UNIQUE_TRANSACTION_REFERENCE);
|
92 |
+
|
93 |
+
if (!is_null($uniqueTransactionReference)) {
|
94 |
+
throw new Exception(
|
95 |
+
$this->__('A unique transaction reference has already been set.')
|
96 |
+
);
|
97 |
+
}
|
98 |
+
|
99 |
+
Mage::register(
|
100 |
+
self::REGISTRY_KEY_UNIQUE_TRANSACTION_REFERENCE,
|
101 |
+
$newTransactionReference
|
102 |
+
);
|
103 |
+
|
104 |
+
return $this;
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* Retrieve the number of decimal places assumed in formatAmount().
|
109 |
+
* Countries with no decimal places, like JPY, will not contain a decimal point.
|
110 |
+
*
|
111 |
+
* @return int
|
112 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
113 |
+
*/
|
114 |
+
public function getDecimalPlaces()
|
115 |
+
{
|
116 |
+
$localeCode = Mage::app()->getLocale()->getLocaleCode();
|
117 |
+
$currencyCode = Mage::app()->getStore()->getCurrentCurrencyCode();
|
118 |
+
|
119 |
+
// we need access to external entities to get this locale data
|
120 |
+
$entityLoaderStatus = libxml_disable_entity_loader(false);
|
121 |
+
|
122 |
+
$decimalPlaces = Zend_Locale_Data::getContent($localeCode, 'currencyfraction', $currencyCode);
|
123 |
+
if ($decimalPlaces === false) {
|
124 |
+
$decimalPlaces = Zend_Locale_Data::getContent($localeCode, 'currencyfraction');
|
125 |
+
}
|
126 |
+
|
127 |
+
// reset libxml_entity_loader status back to what it was before
|
128 |
+
libxml_disable_entity_loader($entityLoaderStatus);
|
129 |
+
|
130 |
+
if ($decimalPlaces > self::MAX_DECIMAL_PLACES) {
|
131 |
+
$decimalPlaces = self::MAX_DECIMAL_PLACES;
|
132 |
+
}
|
133 |
+
|
134 |
+
return $decimalPlaces;
|
135 |
+
}
|
136 |
+
|
137 |
+
/**
|
138 |
+
* Retrieve the region code if available for the provided address country.
|
139 |
+
*
|
140 |
+
* @param Varien_Object $address
|
141 |
+
* @return string
|
142 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
143 |
+
*/
|
144 |
+
public function getRegionCode(Varien_Object $address = null)
|
145 |
+
{
|
146 |
+
if (!is_object($address) || !$address->getCountryId() || !$address->getRegionCode()) {
|
147 |
+
return null;
|
148 |
+
}
|
149 |
+
|
150 |
+
$region = $this->_getRegion($address->getCountryId(), $address->getRegionCode());
|
151 |
+
return ($region instanceof Mage_Directory_Model_Region) ? $region->getCode() : null;
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* Retrieve the region name if available for the provided address country.
|
156 |
+
*
|
157 |
+
* @param Varien_Object $address
|
158 |
+
* @return string
|
159 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
160 |
+
*/
|
161 |
+
public function getRegionName(Varien_Object $address = null)
|
162 |
+
{
|
163 |
+
if (!is_object($address) || !$address->getCountryId() || !$address->getRegionCode()) {
|
164 |
+
return null;
|
165 |
+
}
|
166 |
+
|
167 |
+
$region = $this->_getRegion($address->getCountryId(), $address->getRegionCode());
|
168 |
+
return ($region instanceof Mage_Directory_Model_Region) ? $region->getName() : null;
|
169 |
+
}
|
170 |
+
|
171 |
+
/**
|
172 |
+
* Retrieve a region object by country code and region code.
|
173 |
+
*
|
174 |
+
* @param string $countryCode
|
175 |
+
* @param string $regionCode
|
176 |
+
* @return string
|
177 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
178 |
+
*/
|
179 |
+
protected function _getRegion($countryCode, $regionCode)
|
180 |
+
{
|
181 |
+
return Mage::getModel('directory/country')
|
182 |
+
->loadByCode($countryCode)
|
183 |
+
->getRegionCollection()
|
184 |
+
->addFieldToFilter('code', $regionCode)
|
185 |
+
->getFirstItem();
|
186 |
+
}
|
187 |
+
|
188 |
+
/**
|
189 |
+
* Retrieve the current customers IP address.
|
190 |
+
*
|
191 |
+
* @return string
|
192 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
193 |
+
*/
|
194 |
+
public function getClientIpAddress()
|
195 |
+
{
|
196 |
+
return Mage::app()->getRequest()->getClientIp();
|
197 |
+
}
|
198 |
+
|
199 |
+
/**
|
200 |
+
* Retrieve the current customers session ID.
|
201 |
+
*
|
202 |
+
* @return string
|
203 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
204 |
+
*/
|
205 |
+
public function getSessionId()
|
206 |
+
{
|
207 |
+
/**
|
208 |
+
* @todo Use Magento functionality to achieve this
|
209 |
+
*/
|
210 |
+
return session_id();
|
211 |
+
}
|
212 |
+
|
213 |
+
/**
|
214 |
+
* Retrieve the current customers HTTP ACCEPT value.
|
215 |
+
*
|
216 |
+
* @return string
|
217 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
218 |
+
*/
|
219 |
+
public function getHttpAccept()
|
220 |
+
{
|
221 |
+
/**
|
222 |
+
* @todo Use Magento functionality to achieve this
|
223 |
+
*/
|
224 |
+
return array_key_exists('HTTP_ACCEPT', $_SERVER) ? $_SERVER['HTTP_ACCEPT'] : '';
|
225 |
+
}
|
226 |
+
|
227 |
+
/**
|
228 |
+
* Retrieve the current customers HTTP USER AGENT value.
|
229 |
+
*
|
230 |
+
* @return string
|
231 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
232 |
+
*/
|
233 |
+
public function getHttpUserAgent()
|
234 |
+
{
|
235 |
+
/**
|
236 |
+
* @todo Use Magento functionality to achieve this
|
237 |
+
*/
|
238 |
+
return array_key_exists('HTTP_USER_AGENT', $_SERVER) ? $_SERVER['HTTP_USER_AGENT'] : '';
|
239 |
+
}
|
240 |
+
|
241 |
+
/**
|
242 |
+
* Retrieve the order items which are not children.
|
243 |
+
*
|
244 |
+
* @param Mage_Sales_Model_Order $order
|
245 |
+
* @return array
|
246 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
247 |
+
*/
|
248 |
+
public function getOrderItems(Mage_Sales_Model_Order $order)
|
249 |
+
{
|
250 |
+
return $order->getItemsCollection(array(), true);
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Save customers selection for creating a billing agreement.
|
255 |
+
*
|
256 |
+
* @param string $selection
|
257 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
258 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
259 |
+
*/
|
260 |
+
public function setBillingAgreementSelection($selection)
|
261 |
+
{
|
262 |
+
$selection = $selection == '1' ? true : false;
|
263 |
+
$this->addSessionData(self::SESSION_KEY_BILLING_AGREEMENT_SELECTION, $selection);
|
264 |
+
|
265 |
+
return $this;
|
266 |
+
}
|
267 |
+
|
268 |
+
/**
|
269 |
+
* Retrieve customers selection for creating a billing agreement.
|
270 |
+
*
|
271 |
+
* @return bool
|
272 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
273 |
+
*/
|
274 |
+
public function getBillingAgreementSelection()
|
275 |
+
{
|
276 |
+
// retrieve the selection made by the customer
|
277 |
+
$selection = $this->_getSession()->getData(self::SESSION_KEY_BILLING_AGREEMENT_SELECTION);
|
278 |
+
if (is_null($selection)) {
|
279 |
+
$selection = false;
|
280 |
+
}
|
281 |
+
|
282 |
+
// force billing agreement if subscription selected
|
283 |
+
if ($selection == false) {
|
284 |
+
$subscriptionSelected = Mage::helper('ampersand_paymentgateway/subscription')
|
285 |
+
->getSubscriptionData('active');
|
286 |
+
if ($subscriptionSelected == true) {
|
287 |
+
$selection = true;
|
288 |
+
$this->setBillingAgreementSelection($selection);
|
289 |
+
}
|
290 |
+
}
|
291 |
+
|
292 |
+
return $selection;
|
293 |
+
}
|
294 |
+
|
295 |
+
/**
|
296 |
+
* Temporarily store the billing agreement CV2 in memory.
|
297 |
+
*
|
298 |
+
* @param string $cv2
|
299 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
300 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
301 |
+
*/
|
302 |
+
public function setBillingAgreementCv2($cv2)
|
303 |
+
{
|
304 |
+
Mage::register(self::REGISTRY_KEY_BILLING_AGREEMENT_CV2, $cv2);
|
305 |
+
|
306 |
+
return $this;
|
307 |
+
}
|
308 |
+
|
309 |
+
/**
|
310 |
+
* Retrieve the billing agreement CV2 from memory.
|
311 |
+
*
|
312 |
+
* @return string
|
313 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
314 |
+
*/
|
315 |
+
public function getBillingAgreementCv2()
|
316 |
+
{
|
317 |
+
return Mage::registry(self::REGISTRY_KEY_BILLING_AGREEMENT_CV2);
|
318 |
+
}
|
319 |
+
|
320 |
+
/**
|
321 |
+
* Set the redirect URL.
|
322 |
+
*
|
323 |
+
* @param string $redirect
|
324 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
325 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
326 |
+
*/
|
327 |
+
public function setRedirectUrl($redirect)
|
328 |
+
{
|
329 |
+
Mage::unregister(self::REGISTRY_KEY_REDIRECT_URL);
|
330 |
+
Mage::register(self::REGISTRY_KEY_REDIRECT_URL, $redirect);
|
331 |
+
|
332 |
+
return $this;
|
333 |
+
}
|
334 |
+
|
335 |
+
/**
|
336 |
+
* Retrieve the redirect URL.
|
337 |
+
*
|
338 |
+
* @return string
|
339 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
340 |
+
*/
|
341 |
+
public function getRedirectUrl()
|
342 |
+
{
|
343 |
+
$redirect = Mage::registry(self::REGISTRY_KEY_REDIRECT_URL);
|
344 |
+
Mage::unregister(self::REGISTRY_KEY_REDIRECT_URL);
|
345 |
+
|
346 |
+
return $redirect;
|
347 |
+
}
|
348 |
+
|
349 |
+
/**
|
350 |
+
* Retrieve error message based on type.
|
351 |
+
*
|
352 |
+
* @param string $type
|
353 |
+
* @return string
|
354 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
355 |
+
*/
|
356 |
+
public function getErrorMessage($type)
|
357 |
+
{
|
358 |
+
$message = array_key_exists($type, $this->_failureMessages)
|
359 |
+
? $this->_failureMessages[$type]
|
360 |
+
: $this->_failureMessages[Ampersand_PaymentGateway_Model_Service_Abstract::FAILURE_TYPE_ERROR];
|
361 |
+
|
362 |
+
return $this->__($message);
|
363 |
+
}
|
364 |
+
|
365 |
+
/**
|
366 |
+
* Set the error message to inform the customer what went wrong on the failure page.
|
367 |
+
*
|
368 |
+
* @param string $message
|
369 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
370 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
371 |
+
*/
|
372 |
+
public function setSessionErrorMessage($message)
|
373 |
+
{
|
374 |
+
$this->_getSession()->setErrorMessage($message);
|
375 |
+
|
376 |
+
return $this;
|
377 |
+
}
|
378 |
+
|
379 |
+
/**
|
380 |
+
* Repopulate the cart with order items.
|
381 |
+
*
|
382 |
+
* @param Mage_Sales_Model_Order $order
|
383 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
384 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
385 |
+
*/
|
386 |
+
public function reorder($order)
|
387 |
+
{
|
388 |
+
/**
|
389 |
+
* @todo retrieve other orders (multishipping)
|
390 |
+
*/
|
391 |
+
|
392 |
+
if (is_null($order)) {
|
393 |
+
return $this;
|
394 |
+
}
|
395 |
+
|
396 |
+
$cart = Mage::getSingleton('checkout/cart');
|
397 |
+
if ($cart->getItemsCount() > 0) {
|
398 |
+
return $this;
|
399 |
+
}
|
400 |
+
|
401 |
+
if (!$order instanceof Mage_Sales_Model_Order) {
|
402 |
+
$order = Mage::getModel('sales/order')->load($order);
|
403 |
+
}
|
404 |
+
if (!$order->getId()) {
|
405 |
+
return $this;
|
406 |
+
}
|
407 |
+
|
408 |
+
foreach ($order->getItemsCollection() as $_item) {
|
409 |
+
try {
|
410 |
+
$cart->addOrderItem($_item);
|
411 |
+
} catch (Exception $e) {
|
412 |
+
// nothing to do
|
413 |
+
}
|
414 |
+
}
|
415 |
+
|
416 |
+
$cart->save();
|
417 |
+
|
418 |
+
return $this;
|
419 |
+
}
|
420 |
+
|
421 |
+
/**
|
422 |
+
* Add session data.
|
423 |
+
*
|
424 |
+
* @param mixed $key
|
425 |
+
* @param mixed $value
|
426 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
427 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
428 |
+
*/
|
429 |
+
public function addSessionData($key, $value = null)
|
430 |
+
{
|
431 |
+
if (is_array($key)) {
|
432 |
+
$this->_getSession()->addData($key);
|
433 |
+
} else {
|
434 |
+
$this->_getSession()->setData($key, $value);
|
435 |
+
}
|
436 |
+
|
437 |
+
return $this;
|
438 |
+
}
|
439 |
+
|
440 |
+
/**
|
441 |
+
* Retrieve session data.
|
442 |
+
*
|
443 |
+
* @param string $key
|
444 |
+
* @return mixed
|
445 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
446 |
+
*/
|
447 |
+
public function getSessionData($key = null)
|
448 |
+
{
|
449 |
+
return $this->_getSession()->getData($key);
|
450 |
+
}
|
451 |
+
|
452 |
+
/**
|
453 |
+
* Retrieve a value from the session and remove it.
|
454 |
+
*
|
455 |
+
* @param string $key
|
456 |
+
* @return mixed
|
457 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
458 |
+
*/
|
459 |
+
public function getAndClearSessionKey($key)
|
460 |
+
{
|
461 |
+
if (!array_key_exists($key, $this->_cache)) {
|
462 |
+
$this->_cache[$key] = $this->_getSession()->getData($key);
|
463 |
+
$this->_getSession()->setData($key, null);
|
464 |
+
}
|
465 |
+
|
466 |
+
return $this->_cache[$key];
|
467 |
+
}
|
468 |
+
|
469 |
+
/**
|
470 |
+
* Reset any items related to a single transaction.
|
471 |
+
*
|
472 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
473 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
474 |
+
*/
|
475 |
+
public function resetPaymentGateway()
|
476 |
+
{
|
477 |
+
Mage::unregister(self::REGISTRY_KEY_UNIQUE_TRANSACTION_REFERENCE);
|
478 |
+
|
479 |
+
return $this;
|
480 |
+
}
|
481 |
+
|
482 |
+
/**
|
483 |
+
* Retrieve the checkout session.
|
484 |
+
*
|
485 |
+
* @return Mage_Checkout_Model_Session
|
486 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
487 |
+
*/
|
488 |
+
protected function _getSession()
|
489 |
+
{
|
490 |
+
return Mage::getSingleton('checkout/session');
|
491 |
+
}
|
492 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Helper/Subscription.php
ADDED
@@ -0,0 +1,168 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Helper_Subscription extends Mage_Core_Helper_Abstract
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Session keys for customers selections during checkout.
|
6 |
+
*/
|
7 |
+
const SESSION_KEY_SUBSCRIPTION_DATA = 'ampersand_paymentgateway_subscription_data';
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Retrieve whether subscriptions are active.
|
11 |
+
*
|
12 |
+
* @return bool
|
13 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
14 |
+
*/
|
15 |
+
public function isActive($checkForAvailableMethod = false)
|
16 |
+
{
|
17 |
+
if (!Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()) {
|
18 |
+
return false;
|
19 |
+
}
|
20 |
+
|
21 |
+
// check for at least one available payment method supporting subscriptions
|
22 |
+
if ($checkForAvailableMethod) {
|
23 |
+
$found = false;
|
24 |
+
$storeMethods = Mage::helper('payment')->getStoreMethods(
|
25 |
+
Mage::app()->getStore(),
|
26 |
+
Mage::getSingleton('checkout/session')->getQuote()
|
27 |
+
);
|
28 |
+
foreach ($storeMethods as $_method) {
|
29 |
+
if ($this->getCanManageSubscriptions($_method)) {
|
30 |
+
// ensure we have at least one method that can manage subscriptions
|
31 |
+
$found = true;
|
32 |
+
break;
|
33 |
+
}
|
34 |
+
}
|
35 |
+
if (!$found) {
|
36 |
+
return false;
|
37 |
+
}
|
38 |
+
}
|
39 |
+
|
40 |
+
return Mage::getStoreConfig('ampersand_paymentgateway/subscription/active') == '1';
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Retrieve subscription frequency from period.
|
45 |
+
*
|
46 |
+
* @param string $period
|
47 |
+
* @return string
|
48 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
49 |
+
*/
|
50 |
+
public function getSubscriptionFrequency($period)
|
51 |
+
{
|
52 |
+
return Mage::getStoreConfig("ampersand_paymentgateway/subscription/frequency_{$period}");
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Add to customers selection data for creating a subscription.
|
57 |
+
*
|
58 |
+
* @param array $data
|
59 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
60 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
61 |
+
*/
|
62 |
+
public function addSubscriptionData(array $data)
|
63 |
+
{
|
64 |
+
foreach ($data as $_key => $_value) {
|
65 |
+
$this->setSubscriptionData($_key, $_value);
|
66 |
+
}
|
67 |
+
|
68 |
+
return $this;
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Save customers selection data for creating a subscription.
|
73 |
+
*
|
74 |
+
* @param mixed $key
|
75 |
+
* @param mixed $value
|
76 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
77 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
78 |
+
*/
|
79 |
+
public function setSubscriptionData($key, $value = null)
|
80 |
+
{
|
81 |
+
$data = $this->getSubscriptionData();
|
82 |
+
|
83 |
+
if (is_array($key)) {
|
84 |
+
$data = $key;
|
85 |
+
} else {
|
86 |
+
$data[$key] = $value;
|
87 |
+
}
|
88 |
+
|
89 |
+
Mage::helper('ampersand_paymentgateway/data')
|
90 |
+
->addSessionData(self::SESSION_KEY_SUBSCRIPTION_DATA, $data);
|
91 |
+
|
92 |
+
return $this;
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Retrieve customers selection data for creating a subscription.
|
97 |
+
*
|
98 |
+
* @param string $key
|
99 |
+
* @return bool
|
100 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
101 |
+
*/
|
102 |
+
public function getSubscriptionData($key = null)
|
103 |
+
{
|
104 |
+
if (!$this->isActive(true)) {
|
105 |
+
return is_null($key) ? array() : null;
|
106 |
+
}
|
107 |
+
|
108 |
+
// subscriptions are only available to logged in customers
|
109 |
+
if (!Mage::helper('customer')->isLoggedIn()) {
|
110 |
+
return is_null($key) ? array() : null;
|
111 |
+
}
|
112 |
+
|
113 |
+
$data = Mage::helper('ampersand_paymentgateway/data')
|
114 |
+
->getSessionData(self::SESSION_KEY_SUBSCRIPTION_DATA);
|
115 |
+
|
116 |
+
if (!is_array($data)) {
|
117 |
+
return array();
|
118 |
+
}
|
119 |
+
|
120 |
+
if (is_null($key)) {
|
121 |
+
return $data;
|
122 |
+
}
|
123 |
+
|
124 |
+
return array_key_exists($key, $data) ? $data[$key] : null;
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Determine whether a payment method can manage subscriptions.
|
129 |
+
*
|
130 |
+
* This includes whether a non-agreement method can create a billing agreement as
|
131 |
+
* part of the checkout process, which in turn would have an associated subscription.
|
132 |
+
*
|
133 |
+
* @param Mage_Payment_Model_Method_Abstract $paymentMethod
|
134 |
+
* @return bool
|
135 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
136 |
+
*/
|
137 |
+
public function getCanManageSubscriptions($paymentMethod)
|
138 |
+
{
|
139 |
+
if (!$paymentMethod->getCanManageSubscriptions()) {
|
140 |
+
// if the current method cannot trigger billing agreements, no subscription can happen
|
141 |
+
if (!$paymentMethod->getCanTriggerBillingAgreementCreation()) {
|
142 |
+
return false;
|
143 |
+
}
|
144 |
+
|
145 |
+
// if the current method does not have an associated ba, no subscription can happen
|
146 |
+
$baMethodCode = $paymentMethod->getConfigData('billing_agreement_method_code');
|
147 |
+
if ($baMethodCode == '') {
|
148 |
+
return false;
|
149 |
+
}
|
150 |
+
|
151 |
+
// if the associated ba cannot manage subscriptions, no subscription can happen
|
152 |
+
$paymentMethod = Mage::helper('payment')->getMethodInstance($baMethodCode);
|
153 |
+
if (!$paymentMethod instanceof Ampersand_PaymentGateway_Model_Method_AgreementAbstract
|
154 |
+
|| $paymentMethod->getConfigData('active') != '1'
|
155 |
+
|| !$paymentMethod->getCanManageSubscriptions())
|
156 |
+
{
|
157 |
+
return false;
|
158 |
+
}
|
159 |
+
}
|
160 |
+
|
161 |
+
// note: $paymentMethod could either be the provided method or related agreement method
|
162 |
+
if ($paymentMethod->getConfigData('can_manage_subscriptions') != '1') {
|
163 |
+
return false;
|
164 |
+
}
|
165 |
+
|
166 |
+
return true;
|
167 |
+
}
|
168 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Adapter/Abstract.php
ADDED
@@ -0,0 +1,264 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
abstract class Ampersand_PaymentGateway_Model_Adapter_Abstract
|
3 |
+
extends Ampersand_Object
|
4 |
+
implements Ampersand_PaymentGateway_Model_Adapter_Interface
|
5 |
+
{
|
6 |
+
/**
|
7 |
+
* Payment object.
|
8 |
+
*
|
9 |
+
* @var Varien_Object $_payment
|
10 |
+
*/
|
11 |
+
protected $_payment;
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Order object.
|
15 |
+
*
|
16 |
+
* @var Varien_Object $_order
|
17 |
+
*/
|
18 |
+
protected $_order;
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Response object.
|
22 |
+
*
|
23 |
+
* @var Varien_Object $_response
|
24 |
+
*/
|
25 |
+
protected $_response;
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Reference transaction object.
|
29 |
+
*
|
30 |
+
* @var Ampersand_PaymentGateway_Model_Transaction $_transaction
|
31 |
+
*/
|
32 |
+
protected $_transaction;
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Debug object.
|
36 |
+
*
|
37 |
+
* @var Ampersand_Integration_Debug_DebugInterface $_debug
|
38 |
+
*/
|
39 |
+
protected $_debug;
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Queue of service messages defined by the Payment Gateway adapter.
|
43 |
+
*
|
44 |
+
* @var array $_serviceMessages
|
45 |
+
*/
|
46 |
+
protected $_serviceMessages = array();
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Transformed redirect data.
|
50 |
+
*
|
51 |
+
* @var array $_transformedRedirectData
|
52 |
+
*/
|
53 |
+
protected $_transformedRedirectData = array();
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Store the payment object against this adapter so it can be accessed elsewhere.
|
57 |
+
*
|
58 |
+
* @param Varien_Object $payment
|
59 |
+
* @return Ampersand_PaymentGateway_Model_Adapter_Abstract
|
60 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
61 |
+
*/
|
62 |
+
public function setPayment(Varien_Object $payment)
|
63 |
+
{
|
64 |
+
$this->_payment = $payment;
|
65 |
+
|
66 |
+
return $this;
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Retrieve the payment object stored against this service.
|
71 |
+
*
|
72 |
+
* @return Varien_Object
|
73 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
74 |
+
*/
|
75 |
+
public function getPayment()
|
76 |
+
{
|
77 |
+
return $this->_payment;
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Store the order object against this adapter so it can be accessed elsewhere.
|
82 |
+
*
|
83 |
+
* @param Varien_Object $order
|
84 |
+
* @return Ampersand_PaymentGateway_Model_Adapter_Abstract
|
85 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
86 |
+
*/
|
87 |
+
public function setOrder(Varien_Object $order)
|
88 |
+
{
|
89 |
+
$this->_order = $order;
|
90 |
+
|
91 |
+
return $this;
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Retrieve the order object stored against this adapter.
|
96 |
+
*
|
97 |
+
* @return Varien_Object
|
98 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
99 |
+
*/
|
100 |
+
public function getOrder()
|
101 |
+
{
|
102 |
+
return $this->_order;
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Set the transformed redirect data against the adapter for use elsewhere.
|
107 |
+
*
|
108 |
+
* @param array $data
|
109 |
+
* @return Ampersand_PaymentGateway_Model_Adapter_Abstract
|
110 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
111 |
+
*/
|
112 |
+
public function setTransformedRedirectData($data)
|
113 |
+
{
|
114 |
+
$this->_transformedRedirectData = $data;
|
115 |
+
|
116 |
+
return $this;
|
117 |
+
}
|
118 |
+
|
119 |
+
/**
|
120 |
+
* Retrieve the transformed redirect data.
|
121 |
+
*
|
122 |
+
* @return array
|
123 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
124 |
+
*/
|
125 |
+
public function getTransformedRedirectData()
|
126 |
+
{
|
127 |
+
return $this->_transformedRedirectData;
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Store the Payment Gateway response against this adapter so it can be accessed elsewhere.
|
132 |
+
*
|
133 |
+
* @param Varien_Object $response
|
134 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
135 |
+
*/
|
136 |
+
public function setResponse(Varien_Object $response)
|
137 |
+
{
|
138 |
+
$this->_response = $response;
|
139 |
+
|
140 |
+
return $this;
|
141 |
+
}
|
142 |
+
|
143 |
+
/**
|
144 |
+
* Retrieve the Payment Gateway response stored against this adapter.
|
145 |
+
*
|
146 |
+
* @return Varien_Object
|
147 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
148 |
+
*/
|
149 |
+
public function getResponse()
|
150 |
+
{
|
151 |
+
return $this->_response;
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* Store the reference transaction against this adapter so it can be accessed elsewhere.
|
156 |
+
*
|
157 |
+
* @param Ampersand_PaymentGateway_Model_Transaction $transaction
|
158 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
159 |
+
*/
|
160 |
+
public function setTransaction(Ampersand_PaymentGateway_Model_Transaction $transaction)
|
161 |
+
{
|
162 |
+
$this->_transaction = $transaction;
|
163 |
+
|
164 |
+
return $this;
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* Retrieve the reference transaction stored against this adapter.
|
169 |
+
*
|
170 |
+
* @return Ampersand_PaymentGateway_Model_Transaction
|
171 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
172 |
+
*/
|
173 |
+
public function getTransaction()
|
174 |
+
{
|
175 |
+
return $this->_transaction;
|
176 |
+
}
|
177 |
+
|
178 |
+
/**
|
179 |
+
* Store the debug object against this adapter so it can be accessed elsewhere.
|
180 |
+
*
|
181 |
+
* @param Ampersand_Integration_Debug_DebugInterface $debug
|
182 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
183 |
+
*/
|
184 |
+
public function setDebug(Ampersand_Integration_Debug_DebugInterface $debug)
|
185 |
+
{
|
186 |
+
$this->_debug = $debug;
|
187 |
+
|
188 |
+
return $this;
|
189 |
+
}
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Retrieve the debug object stored against this adapter.
|
193 |
+
*
|
194 |
+
* @return Ampersand_Integration_Debug_DebugInterface
|
195 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
196 |
+
*/
|
197 |
+
public function getDebug()
|
198 |
+
{
|
199 |
+
return $this->_debug;
|
200 |
+
}
|
201 |
+
|
202 |
+
/**
|
203 |
+
* Add a new service message to be called, including the name, the adapter method to retrieve
|
204 |
+
* the data from and the adapter method to callback to with the message response.
|
205 |
+
*
|
206 |
+
* @param string $name
|
207 |
+
* @param string $dataMethod
|
208 |
+
* @param string $callbackMethod
|
209 |
+
* @return Ampersand_PaymentGateway_Model_Adapter_Abstract
|
210 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
211 |
+
*/
|
212 |
+
public function addServiceMessageToQueue($name, $dataMethod = null, $callbackMethod = null)
|
213 |
+
{
|
214 |
+
if (is_null($dataMethod)) {
|
215 |
+
$dataMethod = 'dataFor' . Ampersand_Object::camelize($name);
|
216 |
+
}
|
217 |
+
|
218 |
+
if (is_null($callbackMethod)) {
|
219 |
+
$callbackMethod = 'callbackFor' . Ampersand_Object::camelize($name);
|
220 |
+
}
|
221 |
+
|
222 |
+
$this->_serviceMessages[] = array(
|
223 |
+
'name' => $name,
|
224 |
+
'data' => $dataMethod,
|
225 |
+
'callback' => $callbackMethod,
|
226 |
+
);
|
227 |
+
|
228 |
+
return $this;
|
229 |
+
}
|
230 |
+
|
231 |
+
/**
|
232 |
+
* Retrieve the next service message from the queue.
|
233 |
+
*
|
234 |
+
* @return array
|
235 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
236 |
+
*/
|
237 |
+
public function getNextServiceMessage()
|
238 |
+
{
|
239 |
+
$message = array_shift($this->_serviceMessages);
|
240 |
+
return !empty($message) ? $message : false;
|
241 |
+
}
|
242 |
+
|
243 |
+
/**
|
244 |
+
* Retrieve the method code for the associated billing agreement payment method.
|
245 |
+
*
|
246 |
+
* @return string
|
247 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
248 |
+
*/
|
249 |
+
public function getBillingAgreementMethodCode()
|
250 |
+
{
|
251 |
+
return false;
|
252 |
+
}
|
253 |
+
|
254 |
+
/**
|
255 |
+
* Retrieve whether any redirects should use an iframe.
|
256 |
+
*
|
257 |
+
* @return bool
|
258 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
259 |
+
*/
|
260 |
+
public function getIsUseIframe()
|
261 |
+
{
|
262 |
+
return true;
|
263 |
+
}
|
264 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Adapter/Direct/Agreement/ManageInterface.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
interface Ampersand_PaymentGateway_Model_Adapter_Direct_Agreement_ManageInterface
|
3 |
+
extends Ampersand_PaymentGateway_Model_Adapter_Interface
|
4 |
+
{
|
5 |
+
public function prepareBillingAgreementRequest();
|
6 |
+
|
7 |
+
public function getBillingAgreementCredentials();
|
8 |
+
|
9 |
+
/**
|
10 |
+
* @todo this should really be here, but is an optional feature...
|
11 |
+
*/
|
12 |
+
// public function prepareBillingAgreementCancel();
|
13 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Adapter/Direct/AuthCaptureInterface.php
ADDED
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
interface Ampersand_PaymentGateway_Model_Adapter_Direct_AuthCaptureInterface
|
3 |
+
extends Ampersand_PaymentGateway_Model_Adapter_Interface
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Retrieve the payment transaction ID to be saved against a Magento payment.
|
7 |
+
*
|
8 |
+
* This method should only return a value if the transaction is completed without the need
|
9 |
+
* for a redirect to a third party system and the transaction completes immediately.
|
10 |
+
*
|
11 |
+
* @return string
|
12 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
13 |
+
*/
|
14 |
+
public function getTransactionReference();
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Queue any service messages to be sent to the Payment Gateway by calling
|
18 |
+
* Ampersand_PaymentGateway_Model_Adapter_Abstract::addServiceMessageToQueue().
|
19 |
+
*
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function prepareRegisterRequest();
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Retrieve any additional information contained in the Payment Gateway register response that
|
26 |
+
* should be saved against the transaction. This could be some information that is required in
|
27 |
+
* the Payment Gateway callback, or required to perform refunds or additional transactions.
|
28 |
+
*
|
29 |
+
* @return array
|
30 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
31 |
+
*/
|
32 |
+
public function getTransactionDataFromRegister();
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Based on the register response from the Payment Gateway,
|
36 |
+
* determine whether 3D Secure authentication is required for this transaction.
|
37 |
+
*
|
38 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
39 |
+
*/
|
40 |
+
public function isThreedSecureRequired();
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Retrieve the MD value required for 3D Secure authentication from the callback response.
|
44 |
+
*
|
45 |
+
* @return string
|
46 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
47 |
+
*/
|
48 |
+
public function getMd();
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Retrieve the ACS URL value required for 3D Secure authentication from the callback response.
|
52 |
+
*
|
53 |
+
* @return string
|
54 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
55 |
+
*/
|
56 |
+
public function getAcsUrl();
|
57 |
+
|
58 |
+
/**
|
59 |
+
* Retrieve the PAREQ value required for 3D Secure authentication from the callback response.
|
60 |
+
*
|
61 |
+
* @return string
|
62 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
63 |
+
*/
|
64 |
+
public function getPareq();
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Retrieve the service message to be called upon completion of 3D Secure authentication.
|
68 |
+
*
|
69 |
+
* @return string
|
70 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
71 |
+
*/
|
72 |
+
public function getTermUrlMessageName();
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Retrieve the method code for the associated billing agreement payment method.
|
76 |
+
*
|
77 |
+
* @return string
|
78 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
79 |
+
*/
|
80 |
+
public function getBillingAgreementMethodCode();
|
81 |
+
|
82 |
+
/**
|
83 |
+
* Retrieve whether any redirects should use an iframe.
|
84 |
+
*
|
85 |
+
* @return bool
|
86 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
87 |
+
*/
|
88 |
+
public function getIsUseIframe();
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Queue any service messages to be sent to the Payment Gateway by calling
|
92 |
+
* Ampersand_PaymentGateway_Model_Adapter_Abstract::addServiceMessageToQueue().
|
93 |
+
*
|
94 |
+
* @param string
|
95 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
96 |
+
*/
|
97 |
+
public function processCallbackResponse();
|
98 |
+
|
99 |
+
/**
|
100 |
+
* Retrieve any additional information contained in the Payment Gateway callback response that
|
101 |
+
* should be saved against the transaction. This could be some information that is required to
|
102 |
+
* perform refunds or additional transactions.
|
103 |
+
*
|
104 |
+
* @return array
|
105 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
106 |
+
*/
|
107 |
+
public function getTransactionDataFromCallback();
|
108 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Adapter/Direct/PartialInterface.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
interface Ampersand_PaymentGateway_Model_Adapter_Direct_PartialInterface
|
3 |
+
extends Ampersand_PaymentGateway_Model_Adapter_Interface
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Queue any service messages to be sent to the Payment Gateway by calling
|
7 |
+
* Ampersand_PaymentGateway_Model_Adapter_Abstract::addServiceMessageToQueue().
|
8 |
+
*
|
9 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
10 |
+
*/
|
11 |
+
public function prepareRegisterRequest();
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Retrieve the payment transaction ID to be saved against a Magento payment.
|
15 |
+
*
|
16 |
+
* This method should only return a value if the transaction is completed without the need
|
17 |
+
* for a redirect to a third party system and the transaction completes immediately.
|
18 |
+
*
|
19 |
+
* @return string
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function getTransactionReference();
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Retrieve any additional information contained in the Payment Gateway register response that
|
26 |
+
* should be saved against the transaction. This could be some information that is required in
|
27 |
+
* the Payment Gateway callback, or required to perform refunds or additional transactions.
|
28 |
+
*
|
29 |
+
* @return array
|
30 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
31 |
+
*/
|
32 |
+
public function getTransactionDataFromRegister();
|
33 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Adapter/Direct/RefundInterface.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
interface Ampersand_PaymentGateway_Model_Adapter_Direct_RefundInterface
|
3 |
+
extends Ampersand_PaymentGateway_Model_Adapter_Interface
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Queue any service messages to be sent to the Payment Gateway by calling
|
7 |
+
* Ampersand_PaymentGateway_Model_Adapter_Abstract::addServiceMessageToQueue().
|
8 |
+
*
|
9 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
10 |
+
*/
|
11 |
+
public function prepareRegisterRequest();
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Retrieve the payment transaction ID to be saved against a Magento payment.
|
15 |
+
*
|
16 |
+
* This method should only return a value if the transaction is completed without the need
|
17 |
+
* for a redirect to a third party system and the transaction completes immediately.
|
18 |
+
*
|
19 |
+
* @return string
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function getTransactionReference();
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Retrieve any additional information contained in the Payment Gateway register response that
|
26 |
+
* should be saved against the transaction. This could be some information that is required in
|
27 |
+
* the Payment Gateway callback, or required to perform refunds or additional transactions.
|
28 |
+
*
|
29 |
+
* @return array
|
30 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
31 |
+
*/
|
32 |
+
public function getTransactionDataFromRegister();
|
33 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Adapter/Interface.php
ADDED
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
interface Ampersand_PaymentGateway_Model_Adapter_Interface
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Store the payment object against this adapter so it can be accessed elsewhere.
|
6 |
+
*
|
7 |
+
* @param Varien_Object $payment
|
8 |
+
* @return Ampersand_PaymentGateway_Model_Adapter_Abstract
|
9 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
10 |
+
*/
|
11 |
+
public function setPayment(Varien_Object $payment);
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Retrieve the payment object stored against this service.
|
15 |
+
*
|
16 |
+
* @return Varien_Object
|
17 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
18 |
+
*/
|
19 |
+
public function getPayment();
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Store the order object against this adapter so it can be accessed elsewhere.
|
23 |
+
*
|
24 |
+
* @param Varien_Object $order
|
25 |
+
* @return Ampersand_PaymentGateway_Model_Adapter_Abstract
|
26 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
27 |
+
*/
|
28 |
+
public function setOrder(Varien_Object $order);
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Retrieve the order object stored against this adapter.
|
32 |
+
*
|
33 |
+
* @return Varien_Object
|
34 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
35 |
+
*/
|
36 |
+
public function getOrder();
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Store the Payment Gateway response against this adapter so it can be accessed elsewhere.
|
40 |
+
*
|
41 |
+
* @param Varien_Object $response
|
42 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
43 |
+
*/
|
44 |
+
public function setResponse(Varien_Object $response);
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Retrieve the Payment Gateway response stored against this adapter.
|
48 |
+
*
|
49 |
+
* @return Varien_Object
|
50 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
51 |
+
*/
|
52 |
+
public function getResponse();
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Store the reference transaction against this adapter so it can be accessed elsewhere.
|
56 |
+
*
|
57 |
+
* @param Ampersand_PaymentGateway_Model_Transaction $transaction
|
58 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
59 |
+
*/
|
60 |
+
public function setTransaction(Ampersand_PaymentGateway_Model_Transaction $transaction);
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Retrieve the reference transaction stored against this adapter.
|
64 |
+
*
|
65 |
+
* @return Ampersand_PaymentGateway_Model_Transaction
|
66 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
67 |
+
*/
|
68 |
+
public function getTransaction();
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Store the debug object against this adapter so it can be accessed elsewhere.
|
72 |
+
*
|
73 |
+
* @param Ampersand_Integration_Debug_DebugInterface $debug
|
74 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
75 |
+
*/
|
76 |
+
public function setDebug(Ampersand_Integration_Debug_DebugInterface $debug);
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Retrieve the debug object stored against this adapter.
|
80 |
+
*
|
81 |
+
* @return Ampersand_Integration_Debug_DebugInterface
|
82 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
83 |
+
*/
|
84 |
+
public function getDebug();
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Add a new service message to be called, including the name, the adapter method to retrieve
|
88 |
+
* the data from and the adapter method to callback to with the message response.
|
89 |
+
*
|
90 |
+
* @param string $name
|
91 |
+
* @param string $dataMethod
|
92 |
+
* @param string $callbackMethod
|
93 |
+
* @return Ampersand_PaymentGateway_Model_Adapter_Abstract
|
94 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
95 |
+
*/
|
96 |
+
public function addServiceMessageToQueue($name, $dataMethod = null, $callbackMethod = null);
|
97 |
+
|
98 |
+
/**
|
99 |
+
* Retrieve the next service message from the queue.
|
100 |
+
*
|
101 |
+
* @return array
|
102 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
103 |
+
*/
|
104 |
+
public function getNextServiceMessage();
|
105 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Adapter/Redirect/Agreement/ManageInterface.php
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
interface Ampersand_PaymentGateway_Model_Adapter_Redirect_Agreement_ManageInterface
|
3 |
+
extends Ampersand_PaymentGateway_Model_Adapter_Interface
|
4 |
+
{
|
5 |
+
public function prepareBillingAgreementRequest();
|
6 |
+
|
7 |
+
public function getBillingAgreementCredentials();
|
8 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Adapter/Redirect/AuthCaptureInterface.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
interface Ampersand_PaymentGateway_Model_Adapter_Redirect_AuthCaptureInterface
|
3 |
+
extends Ampersand_PaymentGateway_Model_Adapter_Interface
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Retrieve the payment transaction ID to be saved against a Magento payment.
|
7 |
+
*
|
8 |
+
* This method should only return a value if the transaction is completed without the need
|
9 |
+
* for a redirect to a third party system and the transaction completes immediately.
|
10 |
+
*
|
11 |
+
* @return string
|
12 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
13 |
+
*/
|
14 |
+
public function getTransactionReference();
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Queue any service messages to be sent to the Payment Gateway by calling
|
18 |
+
* Ampersand_PaymentGateway_Model_Adapter_Abstract::addServiceMessageToQueue().
|
19 |
+
*
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function prepareRegisterRequest();
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Retrieve any additional information contained in the Payment Gateway register response that
|
26 |
+
* should be saved against the transaction. This could be some information that is required in
|
27 |
+
* the Payment Gateway callback, or required to perform refunds or additional transactions.
|
28 |
+
*
|
29 |
+
* @return array
|
30 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
31 |
+
*/
|
32 |
+
public function getTransactionDataFromRegister();
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Retrieve the method code for the associated billing agreement payment method.
|
36 |
+
*
|
37 |
+
* @return string
|
38 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
39 |
+
*/
|
40 |
+
public function getBillingAgreementMethodCode();
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Retrieve whether any redirects should use an iframe.
|
44 |
+
*
|
45 |
+
* @return bool
|
46 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
47 |
+
*/
|
48 |
+
public function getIsUseIframe();
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Queue any service messages to be sent to the Payment Gateway by calling
|
52 |
+
* Ampersand_PaymentGateway_Model_Adapter_Abstract::addServiceMessageToQueue().
|
53 |
+
*
|
54 |
+
* @param string
|
55 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
56 |
+
*/
|
57 |
+
public function processCallbackResponse();
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Retrieve any additional information contained in the Payment Gateway callback response that
|
61 |
+
* should be saved against the transaction. This could be some information that is required to
|
62 |
+
* perform refunds or additional transactions.
|
63 |
+
*
|
64 |
+
* @return array
|
65 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
66 |
+
*/
|
67 |
+
public function getTransactionDataFromCallback();
|
68 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Adapter/Redirect/PartialInterface.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
interface Ampersand_PaymentGateway_Model_Adapter_Redirect_PartialInterface
|
3 |
+
extends Ampersand_PaymentGateway_Model_Adapter_Interface
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Queue any service messages to be sent to the Payment Gateway by calling
|
7 |
+
* Ampersand_PaymentGateway_Model_Adapter_Abstract::addServiceMessageToQueue().
|
8 |
+
*
|
9 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
10 |
+
*/
|
11 |
+
public function prepareRegisterRequest();
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Retrieve the payment transaction ID to be saved against a Magento payment.
|
15 |
+
*
|
16 |
+
* This method should only return a value if the transaction is completed without the need
|
17 |
+
* for a redirect to a third party system and the transaction completes immediately.
|
18 |
+
*
|
19 |
+
* @return string
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function getTransactionReference();
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Retrieve any additional information contained in the Payment Gateway register response that
|
26 |
+
* should be saved against the transaction. This could be some information that is required in
|
27 |
+
* the Payment Gateway callback, or required to perform refunds or additional transactions.
|
28 |
+
*
|
29 |
+
* @return array
|
30 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
31 |
+
*/
|
32 |
+
public function getTransactionDataFromRegister();
|
33 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Adapter/Redirect/RefundInterface.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
interface Ampersand_PaymentGateway_Model_Adapter_Redirect_RefundInterface
|
3 |
+
extends Ampersand_PaymentGateway_Model_Adapter_Interface
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Queue any service messages to be sent to the Payment Gateway by calling
|
7 |
+
* Ampersand_PaymentGateway_Model_Adapter_Abstract::addServiceMessageToQueue().
|
8 |
+
*
|
9 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
10 |
+
*/
|
11 |
+
public function prepareRegisterRequest();
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Retrieve the payment transaction ID to be saved against a Magento payment.
|
15 |
+
*
|
16 |
+
* This method should only return a value if the transaction is completed without the need
|
17 |
+
* for a redirect to a third party system and the transaction completes immediately.
|
18 |
+
*
|
19 |
+
* @return string
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function getTransactionReference();
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Retrieve any additional information contained in the Payment Gateway register response that
|
26 |
+
* should be saved against the transaction. This could be some information that is required in
|
27 |
+
* the Payment Gateway callback, or required to perform refunds or additional transactions.
|
28 |
+
*
|
29 |
+
* @return array
|
30 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
31 |
+
*/
|
32 |
+
public function getTransactionDataFromRegister();
|
33 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Agreement.php
ADDED
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Agreement extends Mage_Core_Model_Abstract
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Prefix of model events names
|
6 |
+
*
|
7 |
+
* @var string
|
8 |
+
*/
|
9 |
+
protected $_eventPrefix = 'ampersand_paymentgateway_agreement';
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Parameter name in event
|
13 |
+
*
|
14 |
+
* In observe method you can use $observer->getEvent()->getObject() in this case
|
15 |
+
*
|
16 |
+
* @var string
|
17 |
+
*/
|
18 |
+
protected $_eventObject = 'agreement';
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Initialise model.
|
22 |
+
*
|
23 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
24 |
+
*/
|
25 |
+
protected function _construct()
|
26 |
+
{
|
27 |
+
$this->_init('ampersand_paymentgateway/agreement');
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Load the agreement by service and billing agreement id, ensuring there is only one match.
|
32 |
+
*
|
33 |
+
* @param string $serviceCode
|
34 |
+
* @param string $referenceId
|
35 |
+
* @return Ampersand_PaymentGateway_Model_Agreement
|
36 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
37 |
+
*/
|
38 |
+
public function loadByReferenceId($serviceCode, $referenceId)
|
39 |
+
{
|
40 |
+
$collection = $this->getCollection()
|
41 |
+
->addFieldToFilter('service_code', $serviceCode)
|
42 |
+
->addFieldToFilter('reference_id', $referenceId);
|
43 |
+
|
44 |
+
if ($collection->count() !== 1) {
|
45 |
+
throw new Exception($this->_getHelper()
|
46 |
+
->__("Unable to load agreement for Billing Agreement ID '{$referenceId}'"));
|
47 |
+
}
|
48 |
+
|
49 |
+
$id = $collection->getFirstItem()->getId();
|
50 |
+
$this->load($id);
|
51 |
+
|
52 |
+
return $this;
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Retrieve additional information from the agreement.
|
57 |
+
*
|
58 |
+
* @param string $key
|
59 |
+
* @return string
|
60 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
61 |
+
*/
|
62 |
+
public function getAdditionalInformation($key = null)
|
63 |
+
{
|
64 |
+
$agreementData = $this->getData('additional_information');
|
65 |
+
|
66 |
+
if (is_null($key)) {
|
67 |
+
return $agreementData;
|
68 |
+
}
|
69 |
+
|
70 |
+
return array_key_exists($key, $agreementData) ? $agreementData[$key] : null;
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Retrieve additional information from the agreement.
|
75 |
+
*
|
76 |
+
* @param mixed $key
|
77 |
+
* @param string $value
|
78 |
+
* @return string
|
79 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
80 |
+
*/
|
81 |
+
public function addAdditionalInformation($key, $value = null)
|
82 |
+
{
|
83 |
+
if (is_array($key)) {
|
84 |
+
foreach ($key as $_key => $_value) {
|
85 |
+
$this->addAdditionalInformation($_key, $_value);
|
86 |
+
}
|
87 |
+
}
|
88 |
+
|
89 |
+
$agreementData = $this->getData('additional_information');
|
90 |
+
$agreementData[$key] = $value;
|
91 |
+
|
92 |
+
return $this;
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Retrieve additional information from the agreement.
|
97 |
+
*
|
98 |
+
* @param string $key
|
99 |
+
* @return string
|
100 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
101 |
+
*/
|
102 |
+
public function unsAdditionalInformation($key)
|
103 |
+
{
|
104 |
+
$agreementData = $this->getData('additional_information');
|
105 |
+
if (!array_key_exists($key, $agreementData)) {
|
106 |
+
return $this;
|
107 |
+
}
|
108 |
+
|
109 |
+
unset($agreementData[$key]);
|
110 |
+
$this->setData('additional_information', $agreementData);
|
111 |
+
|
112 |
+
return $this;
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Serialize the additional_information attribute value.
|
117 |
+
*
|
118 |
+
* @return Ampersand_PaymentGateway_Model_Agreement
|
119 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
120 |
+
*/
|
121 |
+
protected function _beforeSave()
|
122 |
+
{
|
123 |
+
$additionalInformation = $this->getData('additional_information');
|
124 |
+
if (is_array($additionalInformation)) {
|
125 |
+
foreach ($additionalInformation as &$_data) {
|
126 |
+
$_data = Mage::helper('core')->encrypt($_data);
|
127 |
+
}
|
128 |
+
$this->setData('additional_information', serialize($additionalInformation));
|
129 |
+
}
|
130 |
+
|
131 |
+
return parent::_beforeSave();
|
132 |
+
}
|
133 |
+
|
134 |
+
/**
|
135 |
+
* Unserialize the additional_information attribute value.
|
136 |
+
*
|
137 |
+
* @return Ampersand_PaymentGateway_Model_Agreement
|
138 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
139 |
+
*/
|
140 |
+
protected function _afterLoad()
|
141 |
+
{
|
142 |
+
$additionalInformation = $this->getData('additional_information');
|
143 |
+
if ($additionalInformation != '') {
|
144 |
+
$additionalInformationData = unserialize($additionalInformation);
|
145 |
+
foreach ($additionalInformationData as &$_data) {
|
146 |
+
$_data = Mage::helper('core')->decrypt($_data);
|
147 |
+
}
|
148 |
+
$this->setData('additional_information', $additionalInformationData);
|
149 |
+
}
|
150 |
+
|
151 |
+
return parent::_afterLoad();
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* Retrieve the helper class.
|
156 |
+
*
|
157 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
158 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
159 |
+
*/
|
160 |
+
protected function _getHelper()
|
161 |
+
{
|
162 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
163 |
+
}
|
164 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Compatibility/Mage/Sales/Model/Order/Payment.php
ADDED
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Compatibility_Mage_Sales_Model_Order_Payment
|
3 |
+
extends Mage_Sales_Model_Order_Payment
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Pulled together from Mage_Sales_Model_Order_Payment in Magento EE 1.12.0.0,
|
7 |
+
* as this method does not exist in Magento versions before EE 1.9.0.0.
|
8 |
+
*
|
9 |
+
* @param Mage_Sales_Model_Order_Payment $payment
|
10 |
+
* @param string $action
|
11 |
+
* @return Mage_Sales_Model_Order_Payment
|
12 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
13 |
+
*/
|
14 |
+
public function registerPaymentReviewAction($payment, $action)
|
15 |
+
{
|
16 |
+
$order = $payment->getOrder();
|
17 |
+
|
18 |
+
$transactionId = $payment->getLastTransId();
|
19 |
+
$invoice = $this->_getInvoiceForTransactionId($order, $transactionId);
|
20 |
+
|
21 |
+
$result = null;
|
22 |
+
$message = null;
|
23 |
+
|
24 |
+
switch ($action) {
|
25 |
+
case Ampersand_PaymentGateway_Model_Service_Abstract::PAYMENT_ACCEPT:
|
26 |
+
if ($payment->getMethodInstance()->setStore($order->getStoreId())->acceptPayment($payment)) {
|
27 |
+
$result = true;
|
28 |
+
$message = Mage::helper('ampersand_paymentgateway')->__('Approved the payment online.');
|
29 |
+
} else {
|
30 |
+
$result = -1;
|
31 |
+
$message = Mage::helper('ampersand_paymentgateway')->__('There is no need to approve this payment.');
|
32 |
+
}
|
33 |
+
break;
|
34 |
+
|
35 |
+
case Ampersand_PaymentGateway_Model_Service_Abstract::PAYMENT_DENY:
|
36 |
+
if ($payment->getMethodInstance()->setStore($order->getStoreId())->denyPayment($payment)) {
|
37 |
+
$result = false;
|
38 |
+
$message = Mage::helper('ampersand_paymentgateway')->__('Denied the payment online.');
|
39 |
+
} else {
|
40 |
+
$result = -1;
|
41 |
+
$message = Mage::helper('ampersand_paymentgateway')->__('There is no need to deny this payment.');
|
42 |
+
}
|
43 |
+
break;
|
44 |
+
|
45 |
+
default:
|
46 |
+
throw new Exception('Not implemented.');
|
47 |
+
break;
|
48 |
+
}
|
49 |
+
|
50 |
+
$message = $payment->_prependMessage($message);
|
51 |
+
|
52 |
+
if ($transactionId) {
|
53 |
+
$message .= ' ' . Mage::helper('ampersand_paymentgateway')
|
54 |
+
->__('Transaction ID: "%s".', $transactionId);
|
55 |
+
}
|
56 |
+
|
57 |
+
// process payment in case of positive or negative result, or add a comment
|
58 |
+
if (-1 === $result) { // switch won't work with such $result!
|
59 |
+
$order->addStatusHistoryComment($message);
|
60 |
+
} elseif (true === $result) {
|
61 |
+
if ($invoice) {
|
62 |
+
$invoice->pay();
|
63 |
+
$payment->_updateTotals(array('base_amount_paid_online' => $invoice->getBaseGrandTotal()));
|
64 |
+
$order->addRelatedObject($invoice);
|
65 |
+
}
|
66 |
+
if ($order->getState() == Mage_Sales_Model_Order::STATE_HOLDED) {
|
67 |
+
$this->_unhold($order, $message);
|
68 |
+
} else {
|
69 |
+
$order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true, $message);
|
70 |
+
}
|
71 |
+
} elseif (false === $result) {
|
72 |
+
if ($invoice) {
|
73 |
+
$invoice->cancel();
|
74 |
+
$order->addRelatedObject($invoice);
|
75 |
+
}
|
76 |
+
$order->setState(Mage_Sales_Model_Order::STATE_PROCESSING);
|
77 |
+
$order->registerCancellation($message, false);
|
78 |
+
}
|
79 |
+
|
80 |
+
return $this;
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Pulled together from Mage_Sales_Model_Order_Payment in Magento EE 1.12.0.0,
|
85 |
+
* as this method does not exist in Magento versions before EE 1.9.0.0.
|
86 |
+
*
|
87 |
+
* @param Mage_Sales_Model_Order $order
|
88 |
+
* @param string $transactionId
|
89 |
+
* @return Mage_Sales_Model_Order_Invoice
|
90 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
91 |
+
*/
|
92 |
+
protected function _getInvoiceForTransactionId($order, $transactionId)
|
93 |
+
{
|
94 |
+
foreach ($order->getInvoiceCollection() as $invoice) {
|
95 |
+
if ($invoice->getTransactionId() == $transactionId) {
|
96 |
+
$invoice->load($invoice->getId()); // to make sure all data will properly load (maybe not required)
|
97 |
+
return $invoice;
|
98 |
+
}
|
99 |
+
}
|
100 |
+
|
101 |
+
foreach ($order->getInvoiceCollection() as $invoice) {
|
102 |
+
if ($invoice->getState() == Mage_Sales_Model_Order_Invoice::STATE_OPEN
|
103 |
+
&& $invoice->load($invoice->getId())
|
104 |
+
) {
|
105 |
+
$invoice->setTransactionId($transactionId);
|
106 |
+
return $invoice;
|
107 |
+
}
|
108 |
+
}
|
109 |
+
|
110 |
+
return false;
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Slightly modified Mage_Sales_Model_Order::unhold() method so we can add the message at the
|
115 |
+
* same time as updating the state and status, so we don't get two entries in the comments.
|
116 |
+
*
|
117 |
+
* @param Mage_Sales_Model_Order $order
|
118 |
+
* @param string $message
|
119 |
+
* @return Ampersand_PaymentGateway_Model_Compatibility_Mage_Sales_Model_Order_Payment
|
120 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
121 |
+
*/
|
122 |
+
protected function _unhold($order, $message = null)
|
123 |
+
{
|
124 |
+
$order->setState($order->getHoldBeforeState(), $order->getHoldBeforeStatus(), $message, false);
|
125 |
+
$order->setHoldBeforeState(null);
|
126 |
+
$order->setHoldBeforeStatus(null);
|
127 |
+
|
128 |
+
return $this;
|
129 |
+
}
|
130 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Config/Abstract.php
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
abstract class Ampersand_PaymentGateway_Model_Config_Abstract
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Payment method code.
|
6 |
+
*
|
7 |
+
* @var string $_paymentMethodCode
|
8 |
+
*/
|
9 |
+
protected $_paymentMethodCode = null;
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Payment Gateway addresses.
|
13 |
+
*
|
14 |
+
* @var array $_gatewayAddresses
|
15 |
+
*/
|
16 |
+
protected $_gatewayAddresses = array();
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Retrieve gateway URL based on service, current mode and type of request.
|
20 |
+
*
|
21 |
+
* @param string $type
|
22 |
+
* @return string
|
23 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
24 |
+
*/
|
25 |
+
public function getGatewayAddress($type)
|
26 |
+
{
|
27 |
+
$mode = $this->getMode();
|
28 |
+
|
29 |
+
if (!array_key_exists($mode, $this->_gatewayAddresses)
|
30 |
+
|| !array_key_exists($type, $this->_gatewayAddresses[$mode])) {
|
31 |
+
throw new Exception($this->_getHelper()
|
32 |
+
->__("Unable to retrieve gateway address for {$mode} / {$type}."));
|
33 |
+
}
|
34 |
+
|
35 |
+
return $this->_gatewayAddresses[$mode][$type];
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Retrieve payment gateway mode.
|
40 |
+
*
|
41 |
+
* @return string
|
42 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
43 |
+
*/
|
44 |
+
public function getMode()
|
45 |
+
{
|
46 |
+
return $this->_getStoreConfig('mode');
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Set the appropriate config against the service object for easy access in message XML files.
|
51 |
+
*
|
52 |
+
* @param Varien_Object $object
|
53 |
+
* @return Varien_Object
|
54 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
55 |
+
*/
|
56 |
+
public function addConfigToService(Varien_Object $object)
|
57 |
+
{
|
58 |
+
$object->setConfig($this);
|
59 |
+
|
60 |
+
return $object;
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Retrieve Magento store config setting.
|
65 |
+
*
|
66 |
+
* @return string
|
67 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
68 |
+
*/
|
69 |
+
protected function _getStoreConfig($node)
|
70 |
+
{
|
71 |
+
if (is_null($this->_paymentMethodCode)) {
|
72 |
+
throw new Exception('Payment method code is required.');
|
73 |
+
}
|
74 |
+
|
75 |
+
return Mage::getStoreConfig("payment/{$this->_paymentMethodCode}/{$node}");
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Retrieve the helper class.
|
80 |
+
*
|
81 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
82 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
83 |
+
*/
|
84 |
+
protected function _getHelper()
|
85 |
+
{
|
86 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
87 |
+
}
|
88 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Cron.php
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Cron
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Cleanup orders, such as incomplete payments that were redirected to 3D Secure.
|
6 |
+
*
|
7 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
8 |
+
*/
|
9 |
+
public function orderCleanup()
|
10 |
+
{
|
11 |
+
if (!Mage::getStoreConfig('ampersand_paymentgateway/cleanup/active')) {
|
12 |
+
return;
|
13 |
+
}
|
14 |
+
|
15 |
+
$hours = Mage::getStoreConfig('ampersand_paymentgateway/cleanup/order_timeframe');
|
16 |
+
Mage::getModel('ampersand_paymentgateway/utility_cleanup')->cancelPaymentReviewOrders($hours);
|
17 |
+
}
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Process subscription reminders.
|
21 |
+
*
|
22 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
23 |
+
*/
|
24 |
+
public function processSubscriptionReminders()
|
25 |
+
{
|
26 |
+
if (!Mage::helper('ampersand_paymentgateway/subscription')->isActive()) {
|
27 |
+
return;
|
28 |
+
}
|
29 |
+
|
30 |
+
Mage::getModel('ampersand_paymentgateway/utility_subscription')->sendReminders();
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Process subscriptions.
|
35 |
+
*
|
36 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
37 |
+
*/
|
38 |
+
public function processSubscriptions()
|
39 |
+
{
|
40 |
+
if (!Mage::helper('ampersand_paymentgateway/subscription')->isActive()) {
|
41 |
+
return;
|
42 |
+
}
|
43 |
+
|
44 |
+
Mage::getModel('ampersand_paymentgateway/utility_subscription')->process();
|
45 |
+
}
|
46 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Email.php
ADDED
@@ -0,0 +1,281 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Email
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Notification types.
|
6 |
+
*/
|
7 |
+
const NOTIFICATION_TYPE_WARNING = 'warning';
|
8 |
+
const NOTIFICATION_TYPE_CRITICAL = 'critical';
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Notification email settings.
|
12 |
+
*/
|
13 |
+
const XML_PATH_NOTIFICATION_EMAIL_BASE = 'ampersand_paymentgateway/notification/';
|
14 |
+
const XML_PATH_NOTIFICATION_EMAIL_TEMPLATE = 'email_template';
|
15 |
+
const XML_PATH_NOTIFICATION_EMAIL_IDENTITY = 'email_identity';
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Data for email content.
|
19 |
+
*/
|
20 |
+
protected $_title = '';
|
21 |
+
protected $_summary = '';
|
22 |
+
protected $_exception = null;
|
23 |
+
protected $_items = array();
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Send an email of type warning.
|
27 |
+
*
|
28 |
+
* @return bool
|
29 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
30 |
+
*/
|
31 |
+
public function sendWarning()
|
32 |
+
{
|
33 |
+
return $this->_send(self::NOTIFICATION_TYPE_WARNING);
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Send an email of type critical.
|
38 |
+
*
|
39 |
+
* @return bool
|
40 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
41 |
+
*/
|
42 |
+
public function sendCritical()
|
43 |
+
{
|
44 |
+
return $this->_send(self::NOTIFICATION_TYPE_CRITICAL);
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Set the email title.
|
49 |
+
*
|
50 |
+
* @param string $title
|
51 |
+
* @return Ampersand_PaymentGateway_Model_Email
|
52 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
53 |
+
*/
|
54 |
+
public function setTitle($title)
|
55 |
+
{
|
56 |
+
$this->_title = $title;
|
57 |
+
|
58 |
+
return $this;
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Set the email summary.
|
63 |
+
*
|
64 |
+
* @param string $summary
|
65 |
+
* @return Ampersand_PaymentGateway_Model_Email
|
66 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
67 |
+
*/
|
68 |
+
public function setSummary($summary)
|
69 |
+
{
|
70 |
+
$this->_summary = $summary;
|
71 |
+
|
72 |
+
return $this;
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Set the related exception.
|
77 |
+
*
|
78 |
+
* @param Exception $exception
|
79 |
+
* @return Ampersand_PaymentGateway_Model_Email
|
80 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
81 |
+
*/
|
82 |
+
public function setException(Exception $exception)
|
83 |
+
{
|
84 |
+
$this->_exception = $exception;
|
85 |
+
|
86 |
+
return $this;
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Add email data by name and value.
|
91 |
+
*
|
92 |
+
* @param string $name
|
93 |
+
* @param string $value
|
94 |
+
* @return Ampersand_PaymentGateway_Model_Email
|
95 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
96 |
+
*/
|
97 |
+
public function addItem($name, $value)
|
98 |
+
{
|
99 |
+
$this->_items[] = array(
|
100 |
+
'name' => $name,
|
101 |
+
'value' => $value,
|
102 |
+
);
|
103 |
+
|
104 |
+
return $this;
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* Reset all email data.
|
109 |
+
*
|
110 |
+
* @return Ampersand_PaymentGateway_Model_Email
|
111 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
112 |
+
*/
|
113 |
+
public function reset()
|
114 |
+
{
|
115 |
+
$this->_title = '';
|
116 |
+
$this->_summary = '';
|
117 |
+
$this->_exception = null;
|
118 |
+
$this->_items = array();
|
119 |
+
|
120 |
+
return $this;
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Send a transactional email.
|
125 |
+
*
|
126 |
+
* @param string $type
|
127 |
+
* @return bool
|
128 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
129 |
+
*/
|
130 |
+
protected function _send($type)
|
131 |
+
{
|
132 |
+
// turn translation off
|
133 |
+
$translate = Mage::getSingleton('core/translate');
|
134 |
+
$translate->setTranslateInline(false);
|
135 |
+
|
136 |
+
// set the template
|
137 |
+
$template = Mage::getStoreConfig(
|
138 |
+
self::XML_PATH_NOTIFICATION_EMAIL_BASE
|
139 |
+
. self::XML_PATH_NOTIFICATION_EMAIL_TEMPLATE
|
140 |
+
);
|
141 |
+
|
142 |
+
// set the identity
|
143 |
+
$identity = Mage::getStoreConfig(
|
144 |
+
self::XML_PATH_NOTIFICATION_EMAIL_BASE
|
145 |
+
. self::XML_PATH_NOTIFICATION_EMAIL_IDENTITY
|
146 |
+
);
|
147 |
+
|
148 |
+
// set the design config
|
149 |
+
$designConfig = array(
|
150 |
+
'area' => 'frontend',
|
151 |
+
'store' => Mage::app()->getStore()->getId()
|
152 |
+
);
|
153 |
+
|
154 |
+
// retrieve email content
|
155 |
+
$emailData = array(
|
156 |
+
'title' => $this->_getTitle(),
|
157 |
+
'summary' => $this->_getSummary(),
|
158 |
+
'base_url' => Mage::getBaseUrl(),
|
159 |
+
'items' => $this->_getItems(),
|
160 |
+
'exception_message' => $this->_getExceptionMessage(),
|
161 |
+
'exception_trace' => $this->_getExceptionTrace(),
|
162 |
+
);
|
163 |
+
|
164 |
+
// retrieve all of the email addresses to send to
|
165 |
+
$emailAddresses = $this->_getEmailAddresses(
|
166 |
+
self::XML_PATH_NOTIFICATION_EMAIL_BASE . $type
|
167 |
+
);
|
168 |
+
|
169 |
+
// send the emails
|
170 |
+
foreach ($emailAddresses as $_emailAddress) {
|
171 |
+
Mage::getModel('core/email_template')
|
172 |
+
->setDesignConfig($designConfig)
|
173 |
+
->sendTransactional($template, $identity, $_emailAddress, $_emailAddress, $emailData);
|
174 |
+
}
|
175 |
+
|
176 |
+
// reset translation
|
177 |
+
$translate->setTranslateInline(true);
|
178 |
+
|
179 |
+
/**
|
180 |
+
* @todo need to determine successes / failures and return them
|
181 |
+
*/
|
182 |
+
return true;
|
183 |
+
}
|
184 |
+
|
185 |
+
/**
|
186 |
+
* Retrieve the email title.
|
187 |
+
*
|
188 |
+
* @return string
|
189 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
190 |
+
*/
|
191 |
+
protected function _getTitle()
|
192 |
+
{
|
193 |
+
$title = strip_tags($this->_title);
|
194 |
+
if ($title == '') {
|
195 |
+
$title = 'Ampersand PaymentGateway notification';
|
196 |
+
}
|
197 |
+
|
198 |
+
return $title;
|
199 |
+
}
|
200 |
+
|
201 |
+
/**
|
202 |
+
* Retrieve the summary.
|
203 |
+
*
|
204 |
+
* @return string
|
205 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
206 |
+
*/
|
207 |
+
protected function _getSummary()
|
208 |
+
{
|
209 |
+
return nl2br($this->_summary);
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* Retrieve the email data items.
|
214 |
+
*
|
215 |
+
* @return string
|
216 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
217 |
+
*/
|
218 |
+
protected function _getItems()
|
219 |
+
{
|
220 |
+
$items = '';
|
221 |
+
|
222 |
+
foreach ($this->_items as $_item) {
|
223 |
+
$items .= "<strong>{$_item['name']}:</strong><br />{$_item['value']}<br /><br />";
|
224 |
+
}
|
225 |
+
|
226 |
+
return $items;
|
227 |
+
}
|
228 |
+
|
229 |
+
/**
|
230 |
+
* Retrieve the exception message, if provided.
|
231 |
+
*
|
232 |
+
* @return string
|
233 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
234 |
+
*/
|
235 |
+
protected function _getExceptionMessage()
|
236 |
+
{
|
237 |
+
$exception = $this->_exception;
|
238 |
+
if (!$exception instanceof Exception) {
|
239 |
+
return '';
|
240 |
+
}
|
241 |
+
|
242 |
+
return $exception->getMessage();
|
243 |
+
}
|
244 |
+
|
245 |
+
/**
|
246 |
+
* Retrieve the exception trace, if provided.
|
247 |
+
*
|
248 |
+
* @return string
|
249 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
250 |
+
*/
|
251 |
+
protected function _getExceptionTrace()
|
252 |
+
{
|
253 |
+
$exception = $this->_exception;
|
254 |
+
if (!$exception instanceof Exception) {
|
255 |
+
return '';
|
256 |
+
}
|
257 |
+
|
258 |
+
return nl2br($exception->getTraceAsString());
|
259 |
+
}
|
260 |
+
|
261 |
+
/**
|
262 |
+
* Retrieve array of email addresses from path, which are stored comma seperated.
|
263 |
+
*
|
264 |
+
* @param string $path
|
265 |
+
* @return array
|
266 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
267 |
+
*/
|
268 |
+
protected function _getEmailAddresses($path)
|
269 |
+
{
|
270 |
+
$emails = array();
|
271 |
+
|
272 |
+
foreach (explode(',', Mage::getStoreConfig($path)) as $_emailAddress) {
|
273 |
+
$_emailAddress = strtolower(trim($_emailAddress));
|
274 |
+
if ($_emailAddress != '') {
|
275 |
+
$emails[] = $_emailAddress;
|
276 |
+
}
|
277 |
+
}
|
278 |
+
|
279 |
+
return $emails;
|
280 |
+
}
|
281 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Exception/DenyPayment.php
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* This exception should be used when something has occured during a transaction which
|
4 |
+
* means you want to deny the payment and update the order to cancelled.
|
5 |
+
*
|
6 |
+
* Examples of this are when a customer has failed 3D Secure authentication,
|
7 |
+
* pressed the cancel button whilst on the payment gateway pages, or when the
|
8 |
+
* payment gateway response stating the bank has declined the payment.
|
9 |
+
*/
|
10 |
+
class Ampersand_PaymentGateway_Model_Exception_DenyPayment
|
11 |
+
extends Ampersand_PaymentGateway_Model_Exception_Error
|
12 |
+
{
|
13 |
+
|
14 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Exception/Error.php
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* This exception should be used when something has gone wrong during a transaction, meaning
|
4 |
+
* the transaction cannot be completed, however you have handled the error appropriately.
|
5 |
+
*
|
6 |
+
* Examples of this are when an invalid response is returned from the payment gateway or
|
7 |
+
* some security fields to not match to suggest the message might have been tampered with.
|
8 |
+
*/
|
9 |
+
class Ampersand_PaymentGateway_Model_Exception_Error extends Exception
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* Error data associated with the exception.
|
13 |
+
*
|
14 |
+
* @var array $_errorData
|
15 |
+
*/
|
16 |
+
protected $_errorData = array();
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Initialise exception.
|
20 |
+
*
|
21 |
+
* @param string $message
|
22 |
+
* @param string $code
|
23 |
+
* @param array $data
|
24 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
25 |
+
*/
|
26 |
+
public function __construct($message, $code = '0', $data = array())
|
27 |
+
{
|
28 |
+
$this->setErrorData($data);
|
29 |
+
parent::__construct($message, (int)$code);
|
30 |
+
}
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Set some error data associated with the exception.
|
34 |
+
*
|
35 |
+
* @param array $data
|
36 |
+
* @return Ampersand_PaymentGateway_Model_Exception_Error
|
37 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
38 |
+
*/
|
39 |
+
public function setErrorData($data)
|
40 |
+
{
|
41 |
+
$this->_errorData = $data;
|
42 |
+
|
43 |
+
return $this;
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Retrieve the error data associated with the exception.
|
48 |
+
*
|
49 |
+
* @return array
|
50 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
51 |
+
*/
|
52 |
+
public function getErrorData()
|
53 |
+
{
|
54 |
+
return $this->_errorData;
|
55 |
+
}
|
56 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Method/AgreementAbstract.php
ADDED
@@ -0,0 +1,450 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if (!Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()) {
|
3 |
+
abstract class Ampersand_PaymentGateway_Model_Method_AgreementAbstract
|
4 |
+
{
|
5 |
+
public function isAvailable($quote = null)
|
6 |
+
{
|
7 |
+
return false;
|
8 |
+
}
|
9 |
+
|
10 |
+
public function setStore($store)
|
11 |
+
{
|
12 |
+
return $this;
|
13 |
+
}
|
14 |
+
}
|
15 |
+
} else {
|
16 |
+
abstract class Ampersand_PaymentGateway_Model_Method_AgreementAbstract
|
17 |
+
extends Mage_Sales_Model_Payment_Method_Billing_AgreementAbstract
|
18 |
+
implements Mage_Payment_Model_Billing_Agreement_MethodInterface
|
19 |
+
{
|
20 |
+
/**
|
21 |
+
* Object keys.
|
22 |
+
*/
|
23 |
+
const OBJECT_KEY_IS_SUBSCRIPTION = 'ampersand_paymentgateway_is_subscription';
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Transport fields.
|
27 |
+
*/
|
28 |
+
const TRANSPORT_BILLING_AGREEMENT_CV2 = 'billing_agreement_cv2';
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Magento payment block types.
|
32 |
+
*
|
33 |
+
* @var string
|
34 |
+
*/
|
35 |
+
protected $_formBlockType = 'ampersand_paymentgateway/payment_form_billingAgreement';
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Payment Method features
|
39 |
+
*
|
40 |
+
* @var bool
|
41 |
+
*/
|
42 |
+
protected $_isGateway = true;
|
43 |
+
protected $_canOrder = false;
|
44 |
+
protected $_canAuthorize = false;
|
45 |
+
protected $_canCapture = false;
|
46 |
+
protected $_canCapturePartial = false;
|
47 |
+
protected $_canRefund = false;
|
48 |
+
protected $_canRefundInvoicePartial = false;
|
49 |
+
protected $_canVoid = false;
|
50 |
+
protected $_canUseInternal = false;
|
51 |
+
protected $_canUseCheckout = true;
|
52 |
+
protected $_canUseForMultishipping = false;
|
53 |
+
protected $_isInitializeNeeded = false;
|
54 |
+
protected $_canFetchTransactionInfo = false;
|
55 |
+
protected $_canReviewPayment = false;
|
56 |
+
protected $_canCreateBillingAgreement = false;
|
57 |
+
protected $_canManageRecurringProfiles = false;
|
58 |
+
protected $_canCancelInvoice = false;
|
59 |
+
protected $_canSaveCc = false;
|
60 |
+
protected $_canManageSubscriptions = false;
|
61 |
+
protected $_canCallbackAccessSession = true;
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Does this method support billing agreement updates.
|
65 |
+
*
|
66 |
+
* @var bool $_canUpdateBillingAgreement
|
67 |
+
*/
|
68 |
+
protected $_canUpdateBillingAgreement = false;
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Ampersand Integration service for the Payment Gateway.
|
72 |
+
*
|
73 |
+
* @var Ampersand_PaymentGateway_Model_Service_Abstract $_service
|
74 |
+
*/
|
75 |
+
protected $_service = null;
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Due to a bug in Magento we have to check that there are agreements available
|
79 |
+
* for this particular method. Magento simply checks for any agreements.
|
80 |
+
*
|
81 |
+
* @param Mage_Sales_Model_Quote $quote
|
82 |
+
* @return bool
|
83 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
84 |
+
*/
|
85 |
+
protected function _isAvailable($quote)
|
86 |
+
{
|
87 |
+
if (!is_object($quote) || !$quote->getCustomer()) {
|
88 |
+
return false;
|
89 |
+
}
|
90 |
+
|
91 |
+
$collection = Mage::getModel('sales/billing_agreement')
|
92 |
+
->getAvailableCustomerBillingAgreements($quote->getCustomer()->getId())
|
93 |
+
->addFieldToFilter('method_code', $this->_code);
|
94 |
+
|
95 |
+
return $collection->count() > 0;
|
96 |
+
}
|
97 |
+
|
98 |
+
/**
|
99 |
+
* Assign data to info model instance
|
100 |
+
*
|
101 |
+
* @param mixed $data
|
102 |
+
* @return Mage_Payment_Model_Info
|
103 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
104 |
+
*/
|
105 |
+
public function assignData($data)
|
106 |
+
{
|
107 |
+
$result = parent::assignData($data);
|
108 |
+
|
109 |
+
// correctly assign additional information, if provided
|
110 |
+
$additionalInformation = array();
|
111 |
+
if (is_array($data)) {
|
112 |
+
$additionalInformation = array_key_exists('additional_information', $data)
|
113 |
+
? $data['additional_information']
|
114 |
+
: array();
|
115 |
+
} elseif ($data instanceof Varien_Object) {
|
116 |
+
$additionalInformation = $data->getData('additional_information');
|
117 |
+
}
|
118 |
+
if (is_array($additionalInformation)) {
|
119 |
+
foreach ($additionalInformation as $_key => $_value) {
|
120 |
+
$this->getInfoInstance()->setAdditionalInformation($_key, $_value);
|
121 |
+
}
|
122 |
+
}
|
123 |
+
|
124 |
+
// update the billing agreement CV2 if provided
|
125 |
+
$billingAgreementCv2 = '';
|
126 |
+
$key = self::TRANSPORT_BILLING_AGREEMENT_CV2;;
|
127 |
+
if (is_array($data) && array_key_exists($key, $data)) {
|
128 |
+
$billingAgreementCv2 = $data[$key];
|
129 |
+
} elseif ($data instanceof Varien_Object) {
|
130 |
+
$billingAgreementCv2 = $data->getData($key);
|
131 |
+
}
|
132 |
+
Mage::helper('ampersand_paymentgateway')->setBillingAgreementCv2($billingAgreementCv2);
|
133 |
+
|
134 |
+
return $result;
|
135 |
+
}
|
136 |
+
|
137 |
+
/**
|
138 |
+
* Init billing agreement
|
139 |
+
*
|
140 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
141 |
+
* @return Ampersand_PaymentGateway_Model_Method_Agreement_Direct
|
142 |
+
*/
|
143 |
+
public function initBillingAgreementToken(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
144 |
+
{
|
145 |
+
$this->getService()->initBillingAgreementToken($agreement);
|
146 |
+
|
147 |
+
return $this;
|
148 |
+
}
|
149 |
+
|
150 |
+
/**
|
151 |
+
* Retrieve billing agreement customer details by token
|
152 |
+
*
|
153 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
154 |
+
* @return array
|
155 |
+
*/
|
156 |
+
public function getBillingAgreementTokenInfo(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
157 |
+
{
|
158 |
+
/**
|
159 |
+
* @todo where is this information saved?
|
160 |
+
* looks like we have to save this in some manually created table?
|
161 |
+
*/
|
162 |
+
return $this->getService()->getBillingAgreementTokenInfo($agreement);
|
163 |
+
}
|
164 |
+
|
165 |
+
/**
|
166 |
+
* Create billing agreement by token specified in request
|
167 |
+
*
|
168 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
169 |
+
* @return Ampersand_PaymentGateway_Model_Method_Agreement_Direct
|
170 |
+
*/
|
171 |
+
public function placeBillingAgreement(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
172 |
+
{
|
173 |
+
$this->getService()->placeBillingAgreement($agreement);
|
174 |
+
|
175 |
+
return $this;
|
176 |
+
}
|
177 |
+
|
178 |
+
/**
|
179 |
+
* Update billing agreement status.
|
180 |
+
* This is currently only called by Mage_Sales_Model_Billing_Agreement::cancel().
|
181 |
+
*
|
182 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
183 |
+
* @return Ampersand_PaymentGateway_Model_Method_Agreement_Direct
|
184 |
+
*/
|
185 |
+
public function updateBillingAgreementStatus(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
186 |
+
{
|
187 |
+
if (!$this->canUpdateBillingAgreement()) {
|
188 |
+
return $this;
|
189 |
+
}
|
190 |
+
|
191 |
+
Mage::dispatchEvent(
|
192 |
+
'ampersand_paymentgateway_update_billing_agreement_status_before',
|
193 |
+
array('agreement' => $agreement)
|
194 |
+
);
|
195 |
+
|
196 |
+
switch ($agreement->getStatus()) {
|
197 |
+
case Mage_Sales_Model_Billing_Agreement::STATUS_CANCELED:
|
198 |
+
$this->getService()->cancelBillingAgreement($agreement);
|
199 |
+
break;
|
200 |
+
|
201 |
+
default:
|
202 |
+
break;
|
203 |
+
}
|
204 |
+
|
205 |
+
return $this;
|
206 |
+
}
|
207 |
+
|
208 |
+
/**
|
209 |
+
* Authorize payment.
|
210 |
+
*
|
211 |
+
* @param Varien_Object $payment
|
212 |
+
* @param float $amount
|
213 |
+
* @return Ampersand_PaymentGateway_Model_Method_Agreement_Direct
|
214 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
215 |
+
*/
|
216 |
+
public function authorize(Varien_Object $payment, $amount)
|
217 |
+
{
|
218 |
+
parent::authorize($payment, $amount);
|
219 |
+
|
220 |
+
if ($payment->getAdditionalInformation(self::OBJECT_KEY_IS_SUBSCRIPTION) === true) {
|
221 |
+
$this->getService()->subscriptionAuthorize($payment, $amount);
|
222 |
+
} else {
|
223 |
+
$this->getService()->authorize($payment, $amount);
|
224 |
+
}
|
225 |
+
|
226 |
+
return $this;
|
227 |
+
}
|
228 |
+
|
229 |
+
/**
|
230 |
+
* Capture payment.
|
231 |
+
*
|
232 |
+
* @param Varien_Object $payment
|
233 |
+
* @param float $amount
|
234 |
+
* @return Ampersand_PaymentGateway_Model_Method_Agreement_Direct
|
235 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
236 |
+
*/
|
237 |
+
public function capture(Varien_Object $payment, $amount)
|
238 |
+
{
|
239 |
+
parent::capture($payment, $amount);
|
240 |
+
|
241 |
+
if ($payment->getAdditionalInformation(self::OBJECT_KEY_IS_SUBSCRIPTION) === true) {
|
242 |
+
$this->getService()->subscriptionCapture($payment, $amount);
|
243 |
+
} else {
|
244 |
+
$this->getService()->capture($payment, $amount);
|
245 |
+
}
|
246 |
+
|
247 |
+
return $this;
|
248 |
+
}
|
249 |
+
|
250 |
+
/**
|
251 |
+
* Refund payment.
|
252 |
+
*
|
253 |
+
* @param Varien_Object $payment
|
254 |
+
* @param float $amount
|
255 |
+
* @return Ampersand_PaymentGateway_Model_Method_Agreement_Direct
|
256 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
257 |
+
*/
|
258 |
+
public function refund(Varien_Object $payment, $amount)
|
259 |
+
{
|
260 |
+
parent::refund($payment, $amount);
|
261 |
+
|
262 |
+
$this->getService()->refund($payment, $amount);
|
263 |
+
|
264 |
+
return $this;
|
265 |
+
}
|
266 |
+
|
267 |
+
/**
|
268 |
+
* Retrieve a method specific error message by code.
|
269 |
+
*
|
270 |
+
* @param string $code
|
271 |
+
* @param array $data
|
272 |
+
* @return string
|
273 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
274 |
+
*/
|
275 |
+
public function getErrorMessage($code, $data = array())
|
276 |
+
{
|
277 |
+
return false;
|
278 |
+
}
|
279 |
+
|
280 |
+
/**
|
281 |
+
* Attempt to accept a payment that is under review.
|
282 |
+
*
|
283 |
+
* @param Mage_Payment_Model_Info $payment
|
284 |
+
* @return bool
|
285 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
286 |
+
*/
|
287 |
+
public function acceptPayment(Mage_Payment_Model_Info $payment)
|
288 |
+
{
|
289 |
+
if (method_exists(get_parent_class(), 'acceptPayment')) {
|
290 |
+
parent::acceptPayment($payment);
|
291 |
+
} else {
|
292 |
+
if (is_null($this->_canReviewPayment) || !$this->_canReviewPayment) {
|
293 |
+
Mage::throwException(Mage::helper('ampersand_paymentgateway')
|
294 |
+
->__('The payment review action is unavailable.'));
|
295 |
+
}
|
296 |
+
}
|
297 |
+
|
298 |
+
if (true !== $payment->getData(Ampersand_PaymentGateway_Model_Service_Abstract::PAYMENT_ACCEPT)) {
|
299 |
+
Mage::throwException($this->_getPaymentGatewayHelper()
|
300 |
+
->__('Online payments cannot be accepted manually.'));
|
301 |
+
}
|
302 |
+
|
303 |
+
$requiredState = Mage::getModel('ampersand_paymentgateway/versioning')
|
304 |
+
->getPaymentReviewOrderState();
|
305 |
+
|
306 |
+
if ($payment->getOrder()->getStatus() !== $requiredState) {
|
307 |
+
$comment = $payment->getOrder()->addStatusHistoryComment($this->_getPaymentGatewayHelper()
|
308 |
+
->__('Warning: An attempt was made to accept this payment.'));
|
309 |
+
$comment->save();
|
310 |
+
|
311 |
+
throw new Exception($this->_getPaymentGatewayHelper()
|
312 |
+
->__("Only orders with status '{$requiredState}' can be accepted online."));
|
313 |
+
}
|
314 |
+
|
315 |
+
return true;
|
316 |
+
}
|
317 |
+
|
318 |
+
/**
|
319 |
+
* Attempt to deny a payment that is under review.
|
320 |
+
*
|
321 |
+
* @param Mage_Payment_Model_Info $payment
|
322 |
+
* @return bool
|
323 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
324 |
+
*/
|
325 |
+
public function denyPayment(Mage_Payment_Model_Info $payment)
|
326 |
+
{
|
327 |
+
if (method_exists(get_parent_class(), 'denyPayment')) {
|
328 |
+
parent::denyPayment($payment);
|
329 |
+
} else {
|
330 |
+
if (is_null($this->_canReviewPayment) || !$this->_canReviewPayment) {
|
331 |
+
Mage::throwException(Mage::helper('ampersand_paymentgateway')
|
332 |
+
->__('The payment review action is unavailable.'));
|
333 |
+
}
|
334 |
+
}
|
335 |
+
|
336 |
+
if (true !== $payment->getData(Ampersand_PaymentGateway_Model_Service_Abstract::PAYMENT_DENY)) {
|
337 |
+
Mage::throwException($this->_getPaymentGatewayHelper()
|
338 |
+
->__('Online payments cannot be denied manually.'));
|
339 |
+
}
|
340 |
+
|
341 |
+
$requiredState = Mage::getModel('ampersand_paymentgateway/versioning')
|
342 |
+
->getPaymentReviewOrderState();
|
343 |
+
|
344 |
+
if ($payment->getOrder()->getStatus() !== $requiredState) {
|
345 |
+
$comment = $payment->getOrder()->addStatusHistoryComment($this->_getPaymentGatewayHelper()
|
346 |
+
->__('Warning: An attempt was made to deny this payment.'));
|
347 |
+
$comment->save();
|
348 |
+
|
349 |
+
throw new Exception($this->_getPaymentGatewayHelper()
|
350 |
+
->__("Only orders with status '{$requiredState}' can be denied online."));
|
351 |
+
}
|
352 |
+
|
353 |
+
return true;
|
354 |
+
}
|
355 |
+
|
356 |
+
/**
|
357 |
+
* Retrieve the redirect URL.
|
358 |
+
*
|
359 |
+
* @return string
|
360 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
361 |
+
*/
|
362 |
+
public function getOrderPlaceRedirectUrl()
|
363 |
+
{
|
364 |
+
return $this->_getPaymentGatewayHelper()->getRedirectUrl();
|
365 |
+
}
|
366 |
+
|
367 |
+
/**
|
368 |
+
* Retrieve the Ampersand Integration service for the Payment Gateway.
|
369 |
+
*
|
370 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
371 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
372 |
+
*/
|
373 |
+
public function getService()
|
374 |
+
{
|
375 |
+
if (is_null($this->_service)) {
|
376 |
+
$this->_service = $this->_getService();
|
377 |
+
$this->_service->setMethodInstance($this);
|
378 |
+
}
|
379 |
+
|
380 |
+
return $this->_service;
|
381 |
+
}
|
382 |
+
|
383 |
+
/**
|
384 |
+
* This method must be implemented to retrieve the Ampersand Integration service
|
385 |
+
* associated with a particular payment method.
|
386 |
+
*
|
387 |
+
* This service must extend Ampersand_PaymentGateway_Model_Service.
|
388 |
+
*
|
389 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
390 |
+
*/
|
391 |
+
abstract protected function _getService();
|
392 |
+
|
393 |
+
/**
|
394 |
+
* Accessor method for payment method property values.
|
395 |
+
*
|
396 |
+
* @return mixed
|
397 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
398 |
+
*/
|
399 |
+
public function getPropertyValue($property)
|
400 |
+
{
|
401 |
+
return property_exists($this, $property) ? $this->$property : null;
|
402 |
+
}
|
403 |
+
|
404 |
+
/**
|
405 |
+
* Can this method update a billing agreement in the Payment Gateway.
|
406 |
+
*
|
407 |
+
* @return bool
|
408 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
409 |
+
*/
|
410 |
+
public function canUpdateBillingAgreement()
|
411 |
+
{
|
412 |
+
return $this->_canUpdateBillingAgreement;
|
413 |
+
}
|
414 |
+
|
415 |
+
/**
|
416 |
+
* Can this method be used for order subscriptions.
|
417 |
+
* Only billing agreement methods can manage subscroptions.
|
418 |
+
*
|
419 |
+
* @return bool
|
420 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
421 |
+
*/
|
422 |
+
public function getCanManageSubscriptions()
|
423 |
+
{
|
424 |
+
return $this->_canManageSubscriptions;
|
425 |
+
}
|
426 |
+
|
427 |
+
/**
|
428 |
+
* Can the callback notification access the customer session.
|
429 |
+
* This is required for customer error messages, repopulating cart, etc.
|
430 |
+
*
|
431 |
+
* @return bool
|
432 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
433 |
+
*/
|
434 |
+
public function getCanCallbackAccessSession()
|
435 |
+
{
|
436 |
+
return $this->_canCallbackAccessSession;
|
437 |
+
}
|
438 |
+
|
439 |
+
/**
|
440 |
+
* Retrieve the Payment Gateway helper.
|
441 |
+
*
|
442 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
443 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
444 |
+
*/
|
445 |
+
protected function _getPaymentGatewayHelper()
|
446 |
+
{
|
447 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
448 |
+
}
|
449 |
+
}
|
450 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Method/DirectAbstract.php
ADDED
@@ -0,0 +1,383 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
abstract class Ampersand_PaymentGateway_Model_Method_DirectAbstract
|
3 |
+
extends Mage_Payment_Model_Method_Cc
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Custom card types.
|
7 |
+
*/
|
8 |
+
const AMPERSAND_CARTES_BANCAIRES = 'AMPERSAND_CARTES_BANCAIRES';
|
9 |
+
const AMPERSAND_MASTERCARD_DEBIT = 'AMPERSAND_MASTERCARD_DEBIT';
|
10 |
+
const AMPERSAND_VISA_DELTA = 'AMPERSAND_VISA_DELTA';
|
11 |
+
const AMPERSAND_VISA_ELECTRON = 'AMPERSAND_VISA_ELECTRON';
|
12 |
+
const AMPERSAND_VISA_PURCHASING = 'AMPERSAND_VISA_PURCHASING';
|
13 |
+
const AMPERSAND_LASER = 'AMPERSAND_LASER';
|
14 |
+
const AMPERSAND_DINERS_CLUB = 'AMPERSAND_DINERS_CLUB';
|
15 |
+
const AMPERSAND_VPAY = 'AMPERSAND_VPAY';
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Payment Method features
|
19 |
+
*
|
20 |
+
* @var bool
|
21 |
+
*/
|
22 |
+
protected $_isGateway = true;
|
23 |
+
protected $_canOrder = false;
|
24 |
+
protected $_canAuthorize = false;
|
25 |
+
protected $_canCapture = false;
|
26 |
+
protected $_canCapturePartial = false;
|
27 |
+
protected $_canRefund = false;
|
28 |
+
protected $_canRefundInvoicePartial = false;
|
29 |
+
protected $_canVoid = false;
|
30 |
+
protected $_canUseInternal = false;
|
31 |
+
protected $_canUseCheckout = true;
|
32 |
+
protected $_canUseForMultishipping = false;
|
33 |
+
protected $_isInitializeNeeded = false;
|
34 |
+
protected $_canFetchTransactionInfo = false;
|
35 |
+
protected $_canReviewPayment = false;
|
36 |
+
protected $_canCreateBillingAgreement = false;
|
37 |
+
protected $_canManageRecurringProfiles = false;
|
38 |
+
protected $_canCancelInvoice = false;
|
39 |
+
protected $_canSaveCc = false;
|
40 |
+
protected $_canCallbackAccessSession = true;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Ampersand Integration service for the Payment Gateway.
|
44 |
+
*
|
45 |
+
* @var Ampersand_PaymentGateway_Model_Service_Abstract $_service
|
46 |
+
*/
|
47 |
+
protected $_service = null;
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Can this method trigger a billing agreement creation.
|
51 |
+
*
|
52 |
+
* @var bool $_canTriggerBillingAgreementCreation
|
53 |
+
*/
|
54 |
+
protected $_canTriggerBillingAgreementCreation = false;
|
55 |
+
|
56 |
+
/**
|
57 |
+
* Validation for credit card number of custom card types.
|
58 |
+
* Note: Any changes here must also be reflected in ampersand_paymentgateway/validation.js
|
59 |
+
*
|
60 |
+
* @var array $_ampersandCustomCcNumberRegex
|
61 |
+
*/
|
62 |
+
protected $_ampersandCustomCcNumberRegex = array(
|
63 |
+
self::AMPERSAND_CARTES_BANCAIRES => false,
|
64 |
+
self::AMPERSAND_MASTERCARD_DEBIT => false,
|
65 |
+
self::AMPERSAND_VISA_DELTA => false,
|
66 |
+
self::AMPERSAND_VISA_ELECTRON => false,
|
67 |
+
self::AMPERSAND_VISA_PURCHASING => false,
|
68 |
+
self::AMPERSAND_LASER => false,
|
69 |
+
self::AMPERSAND_DINERS_CLUB => false,
|
70 |
+
self::AMPERSAND_VPAY => false,
|
71 |
+
);
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Validation for CSV number of custom card types.
|
75 |
+
* Note: Any changes here must also be reflected in ampersand_paymentgateway/validation.js
|
76 |
+
*
|
77 |
+
* @var array $_ampersandCustomCcNumberRegex
|
78 |
+
*/
|
79 |
+
protected $_ampersandCustomCsvRegex = array(
|
80 |
+
self::AMPERSAND_CARTES_BANCAIRES => '/^([0-9]{3}|[0-9]{4})?$/',
|
81 |
+
self::AMPERSAND_MASTERCARD_DEBIT => '/^([0-9]{3}|[0-9]{4})?$/',
|
82 |
+
self::AMPERSAND_VISA_DELTA => '/^([0-9]{3}|[0-9]{4})?$/',
|
83 |
+
self::AMPERSAND_VISA_ELECTRON => '/^([0-9]{3}|[0-9]{4})?$/',
|
84 |
+
self::AMPERSAND_VISA_PURCHASING => '/^([0-9]{3}|[0-9]{4})?$/',
|
85 |
+
self::AMPERSAND_LASER => '/^([0-9]{3}|[0-9]{4})?$/',
|
86 |
+
self::AMPERSAND_DINERS_CLUB => '/^([0-9]{3}|[0-9]{4})?$/',
|
87 |
+
self::AMPERSAND_VPAY => '/^([0-9]{3}|[0-9]{4})?$/',
|
88 |
+
);
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Assign data to info model instance
|
92 |
+
*
|
93 |
+
* @param mixed $data
|
94 |
+
* @return Mage_Payment_Model_Info
|
95 |
+
*/
|
96 |
+
public function assignData($data)
|
97 |
+
{
|
98 |
+
parent::assignData($data);
|
99 |
+
|
100 |
+
if (!($data instanceof Varien_Object)) {
|
101 |
+
$data = new Varien_Object($data);
|
102 |
+
}
|
103 |
+
|
104 |
+
$this->_getPaymentGatewayHelper()->setBillingAgreementSelection($data->getBillingAgreementSelection());
|
105 |
+
|
106 |
+
return $this;
|
107 |
+
}
|
108 |
+
|
109 |
+
/**
|
110 |
+
* Validate payment method information object
|
111 |
+
*
|
112 |
+
* @param Mage_Payment_Model_Info $info
|
113 |
+
* @return Mage_Payment_Model_Abstract
|
114 |
+
*/
|
115 |
+
public function validate()
|
116 |
+
{
|
117 |
+
$info = $this->getInfoInstance();
|
118 |
+
|
119 |
+
// we are only interested in validating custom card types here
|
120 |
+
if (!array_key_exists($info->getCcType(), $this->_ampersandCustomCcNumberRegex)) {
|
121 |
+
return parent::validate();
|
122 |
+
}
|
123 |
+
|
124 |
+
// remove credit card number delimiters such as "-" and space
|
125 |
+
$ccNumber = preg_replace('/[\-\s]+/', '', $info->getCcNumber());
|
126 |
+
$info->setCcNumber($ccNumber);
|
127 |
+
|
128 |
+
// validate the entered card number
|
129 |
+
$ccTypeRegExp = $this->_ampersandCustomCcNumberRegex[$info->getCcType()];
|
130 |
+
if ($ccTypeRegExp && (!$ccNumber || !preg_match($ccTypeRegExp, $ccNumber))) {
|
131 |
+
Mage::throwException($this->_getPaymentGatewayHelper()->__('Credit card number mismatch with credit card type.'));
|
132 |
+
}
|
133 |
+
|
134 |
+
// validate the CSV number
|
135 |
+
if ($this->hasVerification() && array_key_exists($info->getCcType(), $this->_ampersandCustomCsvRegex)) {
|
136 |
+
$verifcationRegEx = $this->_ampersandCustomCsvRegex[$info->getCcType()];
|
137 |
+
if (!$info->getCcCid() || !preg_match($verifcationRegEx, $info->getCcCid())) {
|
138 |
+
Mage::throwException($this->_getPaymentGatewayHelper()->__('Please enter a valid credit card verification number.'));
|
139 |
+
}
|
140 |
+
}
|
141 |
+
|
142 |
+
// validate the expiry date
|
143 |
+
if (!$this->_validateExpDate($info->getCcExpYear(), $info->getCcExpMonth())) {
|
144 |
+
Mage::throwException($this->_getPaymentGatewayHelper()->__('Incorrect credit card expiration date.'));
|
145 |
+
}
|
146 |
+
|
147 |
+
return $this;
|
148 |
+
}
|
149 |
+
|
150 |
+
/**
|
151 |
+
* Authorize payment.
|
152 |
+
*
|
153 |
+
* @param Varien_Object $payment
|
154 |
+
* @param float $amount
|
155 |
+
* @return Ampersand_PaymentGateway_Model_Method_Direct
|
156 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
157 |
+
*/
|
158 |
+
public function authorize(Varien_Object $payment, $amount)
|
159 |
+
{
|
160 |
+
parent::authorize($payment, $amount);
|
161 |
+
|
162 |
+
$this->getService()->authorize($payment, $amount);
|
163 |
+
|
164 |
+
return $this;
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* Capture payment.
|
169 |
+
*
|
170 |
+
* @param Varien_Object $payment
|
171 |
+
* @param float $amount
|
172 |
+
* @return Ampersand_PaymentGateway_Model_Method_Direct
|
173 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
174 |
+
*/
|
175 |
+
public function capture(Varien_Object $payment, $amount)
|
176 |
+
{
|
177 |
+
parent::capture($payment, $amount);
|
178 |
+
|
179 |
+
$this->getService()->capture($payment, $amount);
|
180 |
+
|
181 |
+
return $this;
|
182 |
+
}
|
183 |
+
|
184 |
+
/**
|
185 |
+
* Refund payment.
|
186 |
+
*
|
187 |
+
* @param Varien_Object $payment
|
188 |
+
* @param float $amount
|
189 |
+
* @return Ampersand_PaymentGateway_Model_Method_Direct
|
190 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
191 |
+
*/
|
192 |
+
public function refund(Varien_Object $payment, $amount)
|
193 |
+
{
|
194 |
+
parent::refund($payment, $amount);
|
195 |
+
|
196 |
+
$this->getService()->refund($payment, $amount);
|
197 |
+
|
198 |
+
return $this;
|
199 |
+
}
|
200 |
+
|
201 |
+
/**
|
202 |
+
* Retrieve a method specific error message by code.
|
203 |
+
*
|
204 |
+
* @param string $code
|
205 |
+
* @param array $data
|
206 |
+
* @return string
|
207 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
208 |
+
*/
|
209 |
+
public function getErrorMessage($code, $data = array())
|
210 |
+
{
|
211 |
+
return false;
|
212 |
+
}
|
213 |
+
|
214 |
+
/**
|
215 |
+
* Attempt to accept a payment that is under review.
|
216 |
+
*
|
217 |
+
* @param Mage_Payment_Model_Info $payment
|
218 |
+
* @return bool
|
219 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
220 |
+
*/
|
221 |
+
public function acceptPayment(Mage_Payment_Model_Info $payment)
|
222 |
+
{
|
223 |
+
if (method_exists(get_parent_class(), 'acceptPayment')) {
|
224 |
+
parent::acceptPayment($payment);
|
225 |
+
} else {
|
226 |
+
if (is_null($this->_canReviewPayment) || !$this->_canReviewPayment) {
|
227 |
+
Mage::throwException(Mage::helper('ampersand_paymentgateway')
|
228 |
+
->__('The payment review action is unavailable.'));
|
229 |
+
}
|
230 |
+
}
|
231 |
+
|
232 |
+
if (true !== $payment->getData(Ampersand_PaymentGateway_Model_Service_Abstract::PAYMENT_ACCEPT)) {
|
233 |
+
Mage::throwException($this->_getPaymentGatewayHelper()
|
234 |
+
->__('Online payments cannot be accepted manually.'));
|
235 |
+
}
|
236 |
+
|
237 |
+
$requiredState = Mage::getModel('ampersand_paymentgateway/versioning')
|
238 |
+
->getPaymentReviewOrderState();
|
239 |
+
|
240 |
+
if ($payment->getOrder()->getStatus() !== $requiredState) {
|
241 |
+
$comment = $payment->getOrder()->addStatusHistoryComment($this->_getPaymentGatewayHelper()
|
242 |
+
->__('Warning: An attempt was made to accept this payment.'));
|
243 |
+
$comment->save();
|
244 |
+
|
245 |
+
throw new Exception($this->_getPaymentGatewayHelper()
|
246 |
+
->__("Only orders with status '{$requiredState}' can be accepted online."));
|
247 |
+
}
|
248 |
+
|
249 |
+
return true;
|
250 |
+
}
|
251 |
+
|
252 |
+
/**
|
253 |
+
* Attempt to deny a payment that is under review.
|
254 |
+
*
|
255 |
+
* @param Mage_Payment_Model_Info $payment
|
256 |
+
* @return bool
|
257 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
258 |
+
*/
|
259 |
+
public function denyPayment(Mage_Payment_Model_Info $payment)
|
260 |
+
{
|
261 |
+
if (method_exists(get_parent_class(), 'denyPayment')) {
|
262 |
+
parent::denyPayment($payment);
|
263 |
+
} else {
|
264 |
+
if (is_null($this->_canReviewPayment) || !$this->_canReviewPayment) {
|
265 |
+
Mage::throwException(Mage::helper('ampersand_paymentgateway')
|
266 |
+
->__('The payment review action is unavailable.'));
|
267 |
+
}
|
268 |
+
}
|
269 |
+
|
270 |
+
if (true !== $payment->getData(Ampersand_PaymentGateway_Model_Service_Abstract::PAYMENT_DENY)) {
|
271 |
+
Mage::throwException($this->_getPaymentGatewayHelper()
|
272 |
+
->__('Online payments cannot be denied manually.'));
|
273 |
+
}
|
274 |
+
|
275 |
+
$requiredState = Mage::getModel('ampersand_paymentgateway/versioning')
|
276 |
+
->getPaymentReviewOrderState();
|
277 |
+
|
278 |
+
if ($payment->getOrder()->getStatus() !== $requiredState) {
|
279 |
+
$comment = $payment->getOrder()->addStatusHistoryComment($this->_getPaymentGatewayHelper()
|
280 |
+
->__('Warning: An attempt was made to deny this payment.'));
|
281 |
+
$comment->save();
|
282 |
+
|
283 |
+
throw new Exception($this->_getPaymentGatewayHelper()
|
284 |
+
->__("Only orders with status '{$requiredState}' can be denied online."));
|
285 |
+
}
|
286 |
+
|
287 |
+
return true;
|
288 |
+
}
|
289 |
+
|
290 |
+
/**
|
291 |
+
* Retrieve the redirect URL.
|
292 |
+
*
|
293 |
+
* @return string
|
294 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
295 |
+
*/
|
296 |
+
public function getOrderPlaceRedirectUrl()
|
297 |
+
{
|
298 |
+
return $this->_getPaymentGatewayHelper()->getRedirectUrl();
|
299 |
+
}
|
300 |
+
|
301 |
+
/**
|
302 |
+
* Retrieve the Ampersand Integration service for the Payment Gateway.
|
303 |
+
*
|
304 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
305 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
306 |
+
*/
|
307 |
+
public function getService()
|
308 |
+
{
|
309 |
+
if (is_null($this->_service)) {
|
310 |
+
$this->_service = $this->_getService();
|
311 |
+
$this->_service->setMethodInstance($this);
|
312 |
+
}
|
313 |
+
|
314 |
+
return $this->_service;
|
315 |
+
}
|
316 |
+
|
317 |
+
/**
|
318 |
+
* This method must be implemented to retrieve the Ampersand Integration service
|
319 |
+
* associated with a particular payment method.
|
320 |
+
*
|
321 |
+
* This service must extend Ampersand_PaymentGateway_Model_Service.
|
322 |
+
*
|
323 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
324 |
+
*/
|
325 |
+
abstract protected function _getService();
|
326 |
+
|
327 |
+
/**
|
328 |
+
* Accessor method for payment method property values.
|
329 |
+
*
|
330 |
+
* @return mixed
|
331 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
332 |
+
*/
|
333 |
+
public function getPropertyValue($property)
|
334 |
+
{
|
335 |
+
return property_exists($this, $property) ? $this->$property : null;
|
336 |
+
}
|
337 |
+
|
338 |
+
/**
|
339 |
+
* Can this method trigger a billing agreement creation.
|
340 |
+
*
|
341 |
+
* @return bool
|
342 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
343 |
+
*/
|
344 |
+
public function getCanTriggerBillingAgreementCreation()
|
345 |
+
{
|
346 |
+
return $this->_canTriggerBillingAgreementCreation;
|
347 |
+
}
|
348 |
+
|
349 |
+
/**
|
350 |
+
* Can this method be used for order subscriptions.
|
351 |
+
* Only billing agreement methods can manage subscroptions.
|
352 |
+
*
|
353 |
+
* @return bool
|
354 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
355 |
+
*/
|
356 |
+
final public function getCanManageSubscriptions()
|
357 |
+
{
|
358 |
+
return false;
|
359 |
+
}
|
360 |
+
|
361 |
+
/**
|
362 |
+
* Can the callback notification access the customer session.
|
363 |
+
* This is required for customer error messages, repopulating cart, etc.
|
364 |
+
*
|
365 |
+
* @return bool
|
366 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
367 |
+
*/
|
368 |
+
public function getCanCallbackAccessSession()
|
369 |
+
{
|
370 |
+
return $this->_canCallbackAccessSession;
|
371 |
+
}
|
372 |
+
|
373 |
+
/**
|
374 |
+
* Retrieve the Payment Gateway helper.
|
375 |
+
*
|
376 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
377 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
378 |
+
*/
|
379 |
+
protected function _getPaymentGatewayHelper()
|
380 |
+
{
|
381 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
382 |
+
}
|
383 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Method/RedirectAbstract.php
ADDED
@@ -0,0 +1,316 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
abstract class Ampersand_PaymentGateway_Model_Method_RedirectAbstract
|
3 |
+
extends Mage_Payment_Model_Method_Abstract
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Magento payment block types.
|
7 |
+
*
|
8 |
+
* @var string
|
9 |
+
*/
|
10 |
+
protected $_formBlockType = 'ampersand_paymentgateway/payment_form_redirect';
|
11 |
+
protected $_infoBlockType = 'ampersand_paymentgateway/payment_info_redirect';
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Payment Method features
|
15 |
+
*
|
16 |
+
* @var bool
|
17 |
+
*/
|
18 |
+
protected $_isGateway = true;
|
19 |
+
protected $_canOrder = false;
|
20 |
+
protected $_canAuthorize = false;
|
21 |
+
protected $_canCapture = false;
|
22 |
+
protected $_canCapturePartial = false;
|
23 |
+
protected $_canRefund = false;
|
24 |
+
protected $_canRefundInvoicePartial = false;
|
25 |
+
protected $_canVoid = false;
|
26 |
+
protected $_canUseInternal = false;
|
27 |
+
protected $_canUseCheckout = true;
|
28 |
+
protected $_canUseForMultishipping = false;
|
29 |
+
protected $_isInitializeNeeded = false;
|
30 |
+
protected $_canFetchTransactionInfo = false;
|
31 |
+
protected $_canReviewPayment = false;
|
32 |
+
protected $_canCreateBillingAgreement = false;
|
33 |
+
protected $_canManageRecurringProfiles = false;
|
34 |
+
protected $_canCancelInvoice = false;
|
35 |
+
protected $_canSaveCc = false;
|
36 |
+
protected $_isCcTypeRequired = false;
|
37 |
+
protected $_canCallbackAccessSession = false;
|
38 |
+
|
39 |
+
/**
|
40 |
+
* Ampersand Integration service for the Payment Gateway.
|
41 |
+
*
|
42 |
+
* @var Ampersand_PaymentGateway_Model_Service_Abstract $_service
|
43 |
+
*/
|
44 |
+
protected $_service = null;
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Can this method trigger a billing agreement creation.
|
48 |
+
*
|
49 |
+
* @var bool $_canTriggerBillingAgreementCreation
|
50 |
+
*/
|
51 |
+
protected $_canTriggerBillingAgreementCreation = false;
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Assign data to info model instance
|
55 |
+
*
|
56 |
+
* @param mixed $data
|
57 |
+
* @return Mage_Payment_Model_Info
|
58 |
+
*/
|
59 |
+
public function assignData($data)
|
60 |
+
{
|
61 |
+
parent::assignData($data);
|
62 |
+
|
63 |
+
if (!($data instanceof Varien_Object)) {
|
64 |
+
$data = new Varien_Object($data);
|
65 |
+
}
|
66 |
+
|
67 |
+
$this->_getPaymentGatewayHelper()->setBillingAgreementSelection($data->getBillingAgreementSelection());
|
68 |
+
|
69 |
+
return $this;
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Authorize payment.
|
74 |
+
*
|
75 |
+
* @param Varien_Object $payment
|
76 |
+
* @param float $amount
|
77 |
+
* @return Ampersand_PaymentGateway_Model_Method_Redirect
|
78 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
79 |
+
*/
|
80 |
+
public function authorize(Varien_Object $payment, $amount)
|
81 |
+
{
|
82 |
+
parent::authorize($payment, $amount);
|
83 |
+
|
84 |
+
$this->getService()->authorize($payment, $amount);
|
85 |
+
|
86 |
+
return $this;
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Capture payment.
|
91 |
+
*
|
92 |
+
* @param Varien_Object $payment
|
93 |
+
* @param float $amount
|
94 |
+
* @return Ampersand_PaymentGateway_Model_Method_Redirect
|
95 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
96 |
+
*/
|
97 |
+
public function capture(Varien_Object $payment, $amount)
|
98 |
+
{
|
99 |
+
parent::capture($payment, $amount);
|
100 |
+
|
101 |
+
$this->getService()->capture($payment, $amount);
|
102 |
+
|
103 |
+
return $this;
|
104 |
+
}
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Refund payment.
|
108 |
+
*
|
109 |
+
* @param Varien_Object $payment
|
110 |
+
* @param float $amount
|
111 |
+
* @return Ampersand_PaymentGateway_Model_Method_Redirect
|
112 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
113 |
+
*/
|
114 |
+
public function refund(Varien_Object $payment, $amount)
|
115 |
+
{
|
116 |
+
parent::refund($payment, $amount);
|
117 |
+
|
118 |
+
$this->getService()->refund($payment, $amount);
|
119 |
+
|
120 |
+
return $this;
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Retrieve a method specific error message by code.
|
125 |
+
*
|
126 |
+
* @param string $code
|
127 |
+
* @param array $data
|
128 |
+
* @return string
|
129 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
130 |
+
*/
|
131 |
+
public function getErrorMessage($code, $data = array())
|
132 |
+
{
|
133 |
+
return false;
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Attempt to accept a payment that is under review.
|
138 |
+
*
|
139 |
+
* @param Mage_Payment_Model_Info $payment
|
140 |
+
* @return bool
|
141 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
142 |
+
*/
|
143 |
+
public function acceptPayment(Mage_Payment_Model_Info $payment)
|
144 |
+
{
|
145 |
+
if (method_exists(get_parent_class(), 'acceptPayment')) {
|
146 |
+
parent::acceptPayment($payment);
|
147 |
+
} else {
|
148 |
+
if (is_null($this->_canReviewPayment) || !$this->_canReviewPayment) {
|
149 |
+
Mage::throwException(Mage::helper('ampersand_paymentgateway')
|
150 |
+
->__('The payment review action is unavailable.'));
|
151 |
+
}
|
152 |
+
}
|
153 |
+
|
154 |
+
if (true !== $payment->getData(Ampersand_PaymentGateway_Model_Service_Abstract::PAYMENT_ACCEPT)) {
|
155 |
+
Mage::throwException($this->_getPaymentGatewayHelper()
|
156 |
+
->__('Online payments cannot be accepted manually.'));
|
157 |
+
}
|
158 |
+
|
159 |
+
$requiredState = Mage::getModel('ampersand_paymentgateway/versioning')
|
160 |
+
->getPaymentReviewOrderState();
|
161 |
+
|
162 |
+
if ($payment->getOrder()->getStatus() !== $requiredState) {
|
163 |
+
$comment = $payment->getOrder()->addStatusHistoryComment($this->_getPaymentGatewayHelper()
|
164 |
+
->__('Warning: An attempt was made to accept this payment.'));
|
165 |
+
$comment->save();
|
166 |
+
|
167 |
+
throw new Exception($this->_getPaymentGatewayHelper()
|
168 |
+
->__("Only orders with status '{$requiredState}' can be accepted online."));
|
169 |
+
}
|
170 |
+
|
171 |
+
return true;
|
172 |
+
}
|
173 |
+
|
174 |
+
/**
|
175 |
+
* Attempt to deny a payment that is under review.
|
176 |
+
*
|
177 |
+
* @param Mage_Payment_Model_Info $payment
|
178 |
+
* @return bool
|
179 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
180 |
+
*/
|
181 |
+
public function denyPayment(Mage_Payment_Model_Info $payment)
|
182 |
+
{
|
183 |
+
if (method_exists(get_parent_class(), 'denyPayment')) {
|
184 |
+
parent::denyPayment($payment);
|
185 |
+
} else {
|
186 |
+
if (is_null($this->_canReviewPayment) || !$this->_canReviewPayment) {
|
187 |
+
Mage::throwException(Mage::helper('ampersand_paymentgateway')
|
188 |
+
->__('The payment review action is unavailable.'));
|
189 |
+
}
|
190 |
+
}
|
191 |
+
|
192 |
+
if (true !== $payment->getData(Ampersand_PaymentGateway_Model_Service_Abstract::PAYMENT_DENY)) {
|
193 |
+
Mage::throwException($this->_getPaymentGatewayHelper()
|
194 |
+
->__('Online payments cannot be denied manually.'));
|
195 |
+
}
|
196 |
+
|
197 |
+
$requiredState = Mage::getModel('ampersand_paymentgateway/versioning')
|
198 |
+
->getPaymentReviewOrderState();
|
199 |
+
|
200 |
+
if ($payment->getOrder()->getStatus() !== $requiredState) {
|
201 |
+
$comment = $payment->getOrder()->addStatusHistoryComment($this->_getPaymentGatewayHelper()
|
202 |
+
->__('Warning: An attempt was made to deny this payment.'));
|
203 |
+
$comment->save();
|
204 |
+
|
205 |
+
throw new Exception($this->_getPaymentGatewayHelper()
|
206 |
+
->__("Only orders with status '{$requiredState}' can be denied online."));
|
207 |
+
}
|
208 |
+
|
209 |
+
return true;
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* Retrieve the redirect URL.
|
214 |
+
*
|
215 |
+
* @return string
|
216 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
217 |
+
*/
|
218 |
+
public function getOrderPlaceRedirectUrl()
|
219 |
+
{
|
220 |
+
return $this->_getPaymentGatewayHelper()->getRedirectUrl();
|
221 |
+
}
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Retrieve the Ampersand Integration service for the Payment Gateway.
|
225 |
+
*
|
226 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
227 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
228 |
+
*/
|
229 |
+
public function getService()
|
230 |
+
{
|
231 |
+
if (is_null($this->_service)) {
|
232 |
+
$this->_service = $this->_getService();
|
233 |
+
$this->_service->setMethodInstance($this);
|
234 |
+
}
|
235 |
+
|
236 |
+
return $this->_service;
|
237 |
+
}
|
238 |
+
|
239 |
+
/**
|
240 |
+
* This method must be implemented to retrieve the Ampersand Integration service
|
241 |
+
* associated with a particular payment method.
|
242 |
+
*
|
243 |
+
* This service must extend Ampersand_PaymentGateway_Model_Service.
|
244 |
+
*
|
245 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
246 |
+
*/
|
247 |
+
abstract protected function _getService();
|
248 |
+
|
249 |
+
/**
|
250 |
+
* Accessor method for payment method property values.
|
251 |
+
*
|
252 |
+
* @return mixed
|
253 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
254 |
+
*/
|
255 |
+
public function getPropertyValue($property)
|
256 |
+
{
|
257 |
+
return property_exists($this, $property) ? $this->$property : null;
|
258 |
+
}
|
259 |
+
|
260 |
+
/**
|
261 |
+
* Can this method trigger a billing agreement creation.
|
262 |
+
*
|
263 |
+
* @return bool
|
264 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
265 |
+
*/
|
266 |
+
public function getCanTriggerBillingAgreementCreation()
|
267 |
+
{
|
268 |
+
return $this->_canTriggerBillingAgreementCreation;
|
269 |
+
}
|
270 |
+
|
271 |
+
/**
|
272 |
+
* Can this method be used for order subscriptions.
|
273 |
+
* Only billing agreement methods can manage subscroptions.
|
274 |
+
*
|
275 |
+
* @return bool
|
276 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
277 |
+
*/
|
278 |
+
final public function getCanManageSubscriptions()
|
279 |
+
{
|
280 |
+
return false;
|
281 |
+
}
|
282 |
+
|
283 |
+
/**
|
284 |
+
* Can the callback notification access the customer session.
|
285 |
+
* This is required for customer error messages, repopulating cart, etc.
|
286 |
+
*
|
287 |
+
* @return bool
|
288 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
289 |
+
*/
|
290 |
+
public function getCanCallbackAccessSession()
|
291 |
+
{
|
292 |
+
return $this->_canCallbackAccessSession;
|
293 |
+
}
|
294 |
+
|
295 |
+
/**
|
296 |
+
* Should this method display credit card type for selection.
|
297 |
+
*
|
298 |
+
* @return bool
|
299 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
300 |
+
*/
|
301 |
+
public function getIsCcTypeRequired()
|
302 |
+
{
|
303 |
+
return $this->_isCcTypeRequired;
|
304 |
+
}
|
305 |
+
|
306 |
+
/**
|
307 |
+
* Retrieve the Payment Gateway helper.
|
308 |
+
*
|
309 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
310 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
311 |
+
*/
|
312 |
+
protected function _getPaymentGatewayHelper()
|
313 |
+
{
|
314 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
315 |
+
}
|
316 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Observer.php
ADDED
@@ -0,0 +1,145 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Observer
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Append forms related to billing agreements.
|
6 |
+
*
|
7 |
+
* @param Varien_Event_Observer $observer
|
8 |
+
* @return Ampersand_PaymentGateway_Model_Observer
|
9 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
10 |
+
*/
|
11 |
+
public function appendBillingAgreementForms(Varien_Event_Observer $observer)
|
12 |
+
{
|
13 |
+
if (!Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()) {
|
14 |
+
return $this;
|
15 |
+
}
|
16 |
+
|
17 |
+
if (!$this->_getIsCustomerLoggedIn()) {
|
18 |
+
return $this;
|
19 |
+
}
|
20 |
+
|
21 |
+
$block = $observer->getEvent()->getBlock();
|
22 |
+
|
23 |
+
$this->_appendBillingAgreementCheckboxBlock($block);
|
24 |
+
$this->_appendBillingAgreementCv2Block($block);
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Append billing agreement checkbox.
|
29 |
+
*
|
30 |
+
* @param Mage_Core_Block_Abstract $block
|
31 |
+
* @return Ampersand_PaymentGateway_Model_Observer
|
32 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
33 |
+
*/
|
34 |
+
protected function _appendBillingAgreementCheckboxBlock($block)
|
35 |
+
{
|
36 |
+
$paymentMethod = $block->getMethod();
|
37 |
+
|
38 |
+
// check if the payment method has an assocaited agreement
|
39 |
+
$baMethodCode = $paymentMethod->getConfigData('billing_agreement_method_code');
|
40 |
+
if ($baMethodCode == '' || !$paymentMethod->getCanTriggerBillingAgreementCreation()) {
|
41 |
+
return $this;
|
42 |
+
}
|
43 |
+
|
44 |
+
// ensure the associated BA is active
|
45 |
+
$baPaymentMethod = Mage::helper('payment')->getMethodInstance($baMethodCode);
|
46 |
+
if (!$baPaymentMethod instanceof Ampersand_PaymentGateway_Model_Method_AgreementAbstract
|
47 |
+
|| $baPaymentMethod->getConfigData('active') != '1')
|
48 |
+
{
|
49 |
+
return $this;
|
50 |
+
}
|
51 |
+
|
52 |
+
$billingAgreementCheckboxBlock = Mage::app()->getLayout()
|
53 |
+
->createBlock('ampersand_paymentgateway/payment_form_billingAgreementCheckbox');
|
54 |
+
|
55 |
+
if ($this->_getSubscriptionHelper()->getSubscriptionData('active')) {
|
56 |
+
$billingAgreementCheckboxBlock->setForceBillingAgreement(true);
|
57 |
+
}
|
58 |
+
|
59 |
+
$block->append($billingAgreementCheckboxBlock);
|
60 |
+
|
61 |
+
return $this;
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Append billing agreement CV2 field.
|
66 |
+
*
|
67 |
+
* @param Mage_Core_Block_Abstract $block
|
68 |
+
* @return Ampersand_PaymentGateway_Model_Observer
|
69 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
70 |
+
*/
|
71 |
+
protected function _appendBillingAgreementCv2Block($block)
|
72 |
+
{
|
73 |
+
$paymentMethod = $block->getMethod();
|
74 |
+
|
75 |
+
if (!$paymentMethod instanceof Ampersand_PaymentGateway_Model_Method_AgreementAbstract) {
|
76 |
+
return $this;
|
77 |
+
}
|
78 |
+
|
79 |
+
$billingAgreementCv2Block = Mage::app()->getLayout()
|
80 |
+
->createBlock('ampersand_paymentgateway/payment_form_billingAgreementCv2');
|
81 |
+
|
82 |
+
$block->append($billingAgreementCv2Block);
|
83 |
+
|
84 |
+
return $this;
|
85 |
+
}
|
86 |
+
|
87 |
+
/**
|
88 |
+
* Apply restrictions to available payment methods.
|
89 |
+
*
|
90 |
+
* @param Varien_Event_Observer $observer
|
91 |
+
* @return Ampersand_PaymentGateway_Model_Observer
|
92 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
93 |
+
*/
|
94 |
+
public function updateAvailablePaymentMethods(Varien_Event_Observer $observer)
|
95 |
+
{
|
96 |
+
$block = $observer->getEvent()->getBlock();
|
97 |
+
if (!$block instanceof Mage_Payment_Block_Form_Container) {
|
98 |
+
return $this;
|
99 |
+
}
|
100 |
+
|
101 |
+
if (!Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()) {
|
102 |
+
return $this;
|
103 |
+
}
|
104 |
+
|
105 |
+
if (!$this->_getSubscriptionHelper()->getSubscriptionData('active')) {
|
106 |
+
return $this;
|
107 |
+
}
|
108 |
+
|
109 |
+
if (!$this->_getIsCustomerLoggedIn()) {
|
110 |
+
return;
|
111 |
+
}
|
112 |
+
|
113 |
+
$methods = $block->getMethods();
|
114 |
+
foreach ($methods as $_key => $_method) {
|
115 |
+
if (!$this->_getSubscriptionHelper()->getCanManageSubscriptions($_method)) {
|
116 |
+
unset($methods[$_key]);
|
117 |
+
$block->unsetChild('payment.method.' . $_method->getCode());
|
118 |
+
}
|
119 |
+
}
|
120 |
+
$block->setMethods($methods);
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Determine whether a customer is currently logged in.
|
125 |
+
*
|
126 |
+
* @return bool
|
127 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
128 |
+
*/
|
129 |
+
protected function _getIsCustomerLoggedIn()
|
130 |
+
{
|
131 |
+
$customer = Mage::getSingleton('customer/session')->getCustomer();
|
132 |
+
return (($customer instanceof Mage_Customer_Model_Customer) && $customer->getId()) ? true : false;
|
133 |
+
}
|
134 |
+
|
135 |
+
/**
|
136 |
+
* Retrieve the Payment Gateway subscription helper.
|
137 |
+
*
|
138 |
+
* @return Ampersand_PaymentGateway_Helper_Subscription
|
139 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
140 |
+
*/
|
141 |
+
protected function _getSubscriptionHelper()
|
142 |
+
{
|
143 |
+
return Mage::helper('ampersand_paymentgateway/subscription');
|
144 |
+
}
|
145 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Resource/Agreement.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Resource_Agreement extends Mage_Core_Model_Mysql4_Abstract
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Initialise resource model.
|
6 |
+
*
|
7 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
8 |
+
*/
|
9 |
+
protected function _construct()
|
10 |
+
{
|
11 |
+
$this->_init('ampersand_paymentgateway/agreement', 'entity_id');
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Automatically set the created and updated times.
|
16 |
+
*
|
17 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
18 |
+
*/
|
19 |
+
protected function _prepareDataForSave(Mage_Core_Model_Abstract $object)
|
20 |
+
{
|
21 |
+
$now = now();
|
22 |
+
if (!$object->getId() || $object->isObjectNew()) {
|
23 |
+
$object->setCreatedAt($now);
|
24 |
+
}
|
25 |
+
$object->setUpdatedAt($now);
|
26 |
+
|
27 |
+
return parent::_prepareDataForSave($object);
|
28 |
+
}
|
29 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Resource/Agreement/Collection.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Resource_Agreement_Collection
|
3 |
+
extends Mage_Core_Model_Mysql4_Collection_Abstract
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Initialise collection.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
protected function _construct()
|
11 |
+
{
|
12 |
+
$this->_init('ampersand_paymentgateway/agreement');
|
13 |
+
}
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Unserialize the additional_information attribute value
|
17 |
+
*
|
18 |
+
* @return Ampersand_PaymentGateway_Model_Resource_Agreement_Collection
|
19 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
20 |
+
*/
|
21 |
+
protected function _afterLoad()
|
22 |
+
{
|
23 |
+
foreach ($this->_items as $_item) {
|
24 |
+
$_additionalInformation = $_item->getData('additional_information');
|
25 |
+
if ($_additionalInformation != '') {
|
26 |
+
$_item->setData('additional_information', unserialize($_additionalInformation));
|
27 |
+
}
|
28 |
+
}
|
29 |
+
|
30 |
+
parent::_afterLoad();
|
31 |
+
|
32 |
+
return $this;
|
33 |
+
}
|
34 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Resource/Subscription.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Resource_Subscription extends Mage_Core_Model_Mysql4_Abstract
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Initialise resource model.
|
6 |
+
*
|
7 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
8 |
+
*/
|
9 |
+
protected function _construct()
|
10 |
+
{
|
11 |
+
$this->_init('ampersand_paymentgateway/subscription', 'entity_id');
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Automatically set the created and updated times.
|
16 |
+
*
|
17 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
18 |
+
*/
|
19 |
+
protected function _prepareDataForSave(Mage_Core_Model_Abstract $object)
|
20 |
+
{
|
21 |
+
$now = now();
|
22 |
+
if (!$object->getId() || $object->isObjectNew()) {
|
23 |
+
$object->setCreatedAt($now);
|
24 |
+
}
|
25 |
+
$object->setUpdatedAt($now);
|
26 |
+
|
27 |
+
return parent::_prepareDataForSave($object);
|
28 |
+
}
|
29 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Resource/Subscription/Collection.php
ADDED
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Resource_Subscription_Collection
|
3 |
+
extends Ampersand_Core_Model_Mysql4_Collection_Abstract
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Initialise collection.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
protected function _construct()
|
11 |
+
{
|
12 |
+
$this->_init('ampersand_paymentgateway/subscription');
|
13 |
+
}
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Filter the subscriptions that are active.
|
17 |
+
*
|
18 |
+
* @return Ampersand_PaymentGateway_Model_Resource_Subscription_Collection
|
19 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
20 |
+
*/
|
21 |
+
public function filterActive()
|
22 |
+
{
|
23 |
+
$this->addFieldToFilter('is_active', '1');
|
24 |
+
|
25 |
+
return $this;
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Filter the subscriptions that are ready to be reminded.
|
30 |
+
*
|
31 |
+
* @return Ampersand_PaymentGateway_Model_Resource_Subscription_Collection
|
32 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
33 |
+
*/
|
34 |
+
public function filterReadyToSendReminder()
|
35 |
+
{
|
36 |
+
$this->addFieldToFilter('is_reminder_sent', '0');
|
37 |
+
|
38 |
+
$filterDate = $this->_getFilterDate($this->_getLeadTime() + $this->_getReminderTime());
|
39 |
+
$this->addFieldToFilter('next_order_date', array('lt' => $filterDate));
|
40 |
+
|
41 |
+
return $this;
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Filter the subscriptions that are ready to be processed.
|
46 |
+
*
|
47 |
+
* @return Ampersand_PaymentGateway_Model_Resource_Subscription_Collection
|
48 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
49 |
+
*/
|
50 |
+
public function filterReadyToProcess()
|
51 |
+
{
|
52 |
+
$filterDate = $this->_getFilterDate($this->_getLeadTime());
|
53 |
+
$this->addFieldToFilter('next_order_date', array('lt' => $filterDate));
|
54 |
+
|
55 |
+
return $this;
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* Format the filter date, given a number of days lead time.
|
60 |
+
*
|
61 |
+
* @param int $days
|
62 |
+
* @return string
|
63 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
64 |
+
*/
|
65 |
+
protected function _getFilterDate($days = 0)
|
66 |
+
{
|
67 |
+
return date('Y-m-d H:i:s', strtotime("+{$days} days"));
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Retrieve the reminder time for order creation.
|
72 |
+
*
|
73 |
+
* @return int
|
74 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
75 |
+
*/
|
76 |
+
protected function _getReminderTime()
|
77 |
+
{
|
78 |
+
$reminderTime = Mage::getStoreConfig('ampersand_paymentgateway/subscription/reminder_time');
|
79 |
+
|
80 |
+
if (!Mage::helper('ampersand_core/validate')->isInt($reminderTime) || $reminderTime < 0) {
|
81 |
+
Mage::throwException(
|
82 |
+
'A value must be provided for the reminder time in hours.'
|
83 |
+
);
|
84 |
+
}
|
85 |
+
|
86 |
+
return $reminderTime;
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Retrieve the lead time for order creation.
|
91 |
+
*
|
92 |
+
* @return int
|
93 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
94 |
+
*/
|
95 |
+
protected function _getLeadTime()
|
96 |
+
{
|
97 |
+
$leadTime = Mage::getStoreConfig('ampersand_paymentgateway/subscription/lead_time');
|
98 |
+
|
99 |
+
if (!Mage::helper('ampersand_core/validate')->isInt($leadTime) || $leadTime < 0) {
|
100 |
+
Mage::throwException(
|
101 |
+
'A value must be provided for the lead time in hours.'
|
102 |
+
);
|
103 |
+
}
|
104 |
+
|
105 |
+
return $leadTime;
|
106 |
+
}
|
107 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Resource/Subscription/Order.php
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Resource_Subscription_Order
|
3 |
+
extends Mage_Core_Model_Mysql4_Abstract
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Initialise resource model.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
protected function _construct()
|
11 |
+
{
|
12 |
+
$this->_init('ampersand_paymentgateway/subscription_order', 'entity_id');
|
13 |
+
}
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Automatically set the created and updated times.
|
17 |
+
*
|
18 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
19 |
+
*/
|
20 |
+
protected function _prepareDataForSave(Mage_Core_Model_Abstract $object)
|
21 |
+
{
|
22 |
+
$now = now();
|
23 |
+
if (!$object->getId() || $object->isObjectNew()) {
|
24 |
+
$object->setCreatedAt($now);
|
25 |
+
}
|
26 |
+
$object->setUpdatedAt($now);
|
27 |
+
|
28 |
+
return parent::_prepareDataForSave($object);
|
29 |
+
}
|
30 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Resource/Subscription/Order/Collection.php
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Resource_Subscription_Order_Collection
|
3 |
+
extends Mage_Core_Model_Mysql4_Collection_Abstract
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Initialise collection.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
protected function _construct()
|
11 |
+
{
|
12 |
+
$this->_init('ampersand_paymentgateway/subscription_order');
|
13 |
+
}
|
14 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Resource/Transaction.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Resource_Transaction extends Mage_Core_Model_Mysql4_Abstract
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Initialise resource model.
|
6 |
+
*
|
7 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
8 |
+
*/
|
9 |
+
protected function _construct()
|
10 |
+
{
|
11 |
+
$this->_init('ampersand_paymentgateway/transaction', 'entity_id');
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Automatically set the created and updated times.
|
16 |
+
*
|
17 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
18 |
+
*/
|
19 |
+
protected function _prepareDataForSave(Mage_Core_Model_Abstract $object)
|
20 |
+
{
|
21 |
+
$now = now();
|
22 |
+
if (!$object->getId() || $object->isObjectNew()) {
|
23 |
+
$object->setCreatedAt($now);
|
24 |
+
}
|
25 |
+
$object->setUpdatedAt($now);
|
26 |
+
|
27 |
+
return parent::_prepareDataForSave($object);
|
28 |
+
}
|
29 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Resource/Transaction/Collection.php
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Resource_Transaction_Collection
|
3 |
+
extends Mage_Core_Model_Mysql4_Collection_Abstract
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Initialise collection.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
protected function _construct()
|
11 |
+
{
|
12 |
+
$this->_init('ampersand_paymentgateway/transaction');
|
13 |
+
}
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Unserialize the additional_information attribute value
|
17 |
+
*
|
18 |
+
* @return Ampersand_PaymentGateway_Model_Resource_Transaction_Collection
|
19 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
20 |
+
*/
|
21 |
+
protected function _afterLoad()
|
22 |
+
{
|
23 |
+
foreach ($this->_items as $_item) {
|
24 |
+
$_additionalInformation = $_item->getData('additional_information');
|
25 |
+
if ($_additionalInformation != '') {
|
26 |
+
$_item->setData('additional_information', unserialize($_additionalInformation));
|
27 |
+
}
|
28 |
+
|
29 |
+
$_subscriptionData = $_item->getData('subscription_data');
|
30 |
+
if ($_subscriptionData != '') {
|
31 |
+
$_item->setData('subscription_data', unserialize($_subscriptionData));
|
32 |
+
}
|
33 |
+
}
|
34 |
+
|
35 |
+
parent::_afterLoad();
|
36 |
+
|
37 |
+
return $this;
|
38 |
+
}
|
39 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Service/Abstract.php
ADDED
@@ -0,0 +1,1738 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
abstract class Ampersand_PaymentGateway_Model_Service_Abstract
|
3 |
+
extends Ampersand_Integration_Model_Service
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Additional transaction type definitions.
|
7 |
+
* Where possible these should match Mage_Sales_Model_Order_Payment_Transaction constants.
|
8 |
+
*/
|
9 |
+
const TRANSACTION_TYPE_AUTH = 'authorization';
|
10 |
+
const TRANSACTION_TYPE_CAPTURE = 'capture';
|
11 |
+
const TRANSACTION_TYPE_PARTIAL = 'partial';
|
12 |
+
const TRANSACTION_TYPE_AGREEMENT_MANAGE = 'manage';
|
13 |
+
const TRANSACTION_TYPE_REFUND = 'refund';
|
14 |
+
const TRANSACTION_TYPE_SUBSCRIPTION_AUTH = 'subscription_authorization';
|
15 |
+
const TRANSACTION_TYPE_SUBSCRIPTION_CAPTURE = 'subscription_capture';
|
16 |
+
const TRANSACTION_TYPE_SUBSCRIPTION_PARTIAL = 'subscription_partial';
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Constants for validating Payment accept or deny requests.
|
20 |
+
*/
|
21 |
+
const PAYMENT_ACCEPT = 'ampersand_paymentgateway_payment_accept';
|
22 |
+
const PAYMENT_DENY = 'ampersand_paymentgateway_payment_deny';
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Constants for storing information against a payment object.
|
26 |
+
*/
|
27 |
+
const PAYMENT_OBJECT_FIELD_PAYMENT_AMOUNT = 'payment_amount';
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Added this constant for backwards compatability with < EE 1.9.0.0.
|
31 |
+
* Should match value of Mage_Sales_Model_Order_Payment_Transaction::RAW_DETAILS
|
32 |
+
*/
|
33 |
+
const PAYMENT_TRANSACTION_RAW_DETAILS = 'raw_details_info';
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Failure types.
|
37 |
+
*/
|
38 |
+
const FAILURE_TYPE_DENIED = 'denied';
|
39 |
+
const FAILURE_TYPE_ERROR = 'error';
|
40 |
+
const FAILURE_TYPE_NONE = 'none';
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Payment method instance.
|
44 |
+
*
|
45 |
+
* @var Mage_Payment_Model_Method_Abstract $_methodInstance
|
46 |
+
*/
|
47 |
+
protected $_methodInstance;
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Payment Gateway adapter.
|
51 |
+
*
|
52 |
+
* @var array $_adapter
|
53 |
+
*/
|
54 |
+
protected $_adapter = array();
|
55 |
+
|
56 |
+
/**
|
57 |
+
* Order object.
|
58 |
+
*
|
59 |
+
* @var Varien_Object $_order
|
60 |
+
*/
|
61 |
+
protected $_order;
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Response object.
|
65 |
+
*
|
66 |
+
* @var Varien_Object $_response
|
67 |
+
*/
|
68 |
+
protected $_response;
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Payment object.
|
72 |
+
*
|
73 |
+
* @var Varien_Object
|
74 |
+
*/
|
75 |
+
protected $_payment;
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Transaction reference object.
|
79 |
+
*
|
80 |
+
* @var Ampersand_PaymentGateway_Model_Transaction $_transaction
|
81 |
+
*/
|
82 |
+
protected $_transaction;
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Current transaction type.
|
86 |
+
*
|
87 |
+
* @var string $_transactionType
|
88 |
+
*/
|
89 |
+
protected $_transactionType;
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Current transaction reference.
|
93 |
+
*
|
94 |
+
* @var string $_transactionReference
|
95 |
+
*/
|
96 |
+
protected $_transactionReference;
|
97 |
+
|
98 |
+
/**
|
99 |
+
* Ampersand Integration debug object.
|
100 |
+
*
|
101 |
+
* @var Ampersand_Integration_Debug_DebugInterface $_debug
|
102 |
+
*/
|
103 |
+
protected $_debug;
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Allowed transaction types.
|
107 |
+
*
|
108 |
+
* @var array $_allowedTransactionTypes
|
109 |
+
*/
|
110 |
+
protected $_allowedTransactionTypes = array(
|
111 |
+
self::TRANSACTION_TYPE_AUTH,
|
112 |
+
self::TRANSACTION_TYPE_CAPTURE,
|
113 |
+
self::TRANSACTION_TYPE_REFUND,
|
114 |
+
self::TRANSACTION_TYPE_PARTIAL,
|
115 |
+
self::TRANSACTION_TYPE_AGREEMENT_MANAGE,
|
116 |
+
self::TRANSACTION_TYPE_SUBSCRIPTION_AUTH,
|
117 |
+
self::TRANSACTION_TYPE_SUBSCRIPTION_CAPTURE,
|
118 |
+
self::TRANSACTION_TYPE_SUBSCRIPTION_PARTIAL,
|
119 |
+
);
|
120 |
+
|
121 |
+
/**
|
122 |
+
* Flag to determine whether redirect is required.
|
123 |
+
*
|
124 |
+
* @var bool $_redirectRequired
|
125 |
+
*/
|
126 |
+
protected $_redirectRequired = false;
|
127 |
+
|
128 |
+
/**
|
129 |
+
* Authorize payment service message.
|
130 |
+
*
|
131 |
+
* @param Varien_Object $payment
|
132 |
+
* @param float $amount
|
133 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
134 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
135 |
+
*/
|
136 |
+
public function authorize(Varien_Object $payment, $amount)
|
137 |
+
{
|
138 |
+
$this->_addParentTransactionDataToPayment($payment);
|
139 |
+
|
140 |
+
$this->setTransactionType(self::TRANSACTION_TYPE_AUTH);
|
141 |
+
|
142 |
+
$this->_setPayment($payment);
|
143 |
+
$this->_setOrder($payment->getOrder());
|
144 |
+
$payment->setData(self::PAYMENT_OBJECT_FIELD_PAYMENT_AMOUNT, $amount);
|
145 |
+
|
146 |
+
$transactionReference = $this->getAdapter()->getTransactionReference();
|
147 |
+
$this->setTransactionReference($transactionReference);
|
148 |
+
if ($transactionReference == '') {
|
149 |
+
throw new Exception('Unable to retrieve transaction reference from adapter.');
|
150 |
+
}
|
151 |
+
|
152 |
+
$this->_addBillingAgreementDataToPayment($payment);
|
153 |
+
|
154 |
+
try {
|
155 |
+
$this->_beforePrepareRegisterRequest();
|
156 |
+
$this->getAdapter()->prepareRegisterRequest();
|
157 |
+
$this->_processServiceMessages();
|
158 |
+
} catch (Exception $e) {
|
159 |
+
// retrieve custom exception message if available
|
160 |
+
if ($methodException = $this->_getMethodException($e)) {
|
161 |
+
$e = $methodException;
|
162 |
+
}
|
163 |
+
|
164 |
+
// create a flag against the message
|
165 |
+
$this->_updateMessageForFailure($e);
|
166 |
+
|
167 |
+
// re-throw
|
168 |
+
throw $e;
|
169 |
+
}
|
170 |
+
|
171 |
+
$this->_processRegisterRedirect();
|
172 |
+
|
173 |
+
$payment
|
174 |
+
->setIsTransactionClosed(false)
|
175 |
+
->setShouldCloseParentTransaction(false)
|
176 |
+
->setTransactionId($transactionReference)
|
177 |
+
->setTransactionAdditionalInfo(
|
178 |
+
self::PAYMENT_TRANSACTION_RAW_DETAILS,
|
179 |
+
$this->getAdapter()->getTransactionDataFromRegister()
|
180 |
+
);
|
181 |
+
|
182 |
+
if ($this->_redirectRequired == false) {
|
183 |
+
$this->_processBillingAgreement();
|
184 |
+
$this->_addBillingAgreementToOrder();
|
185 |
+
$this->_createSubscription();
|
186 |
+
}
|
187 |
+
|
188 |
+
$this->_prepareCustomerNote();
|
189 |
+
|
190 |
+
return $this;
|
191 |
+
}
|
192 |
+
|
193 |
+
/**
|
194 |
+
* Capture payment service message.
|
195 |
+
*
|
196 |
+
* @param Varien_Object $payment
|
197 |
+
* @param float $amount
|
198 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
199 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
200 |
+
*/
|
201 |
+
public function capture(Varien_Object $payment, $amount)
|
202 |
+
{
|
203 |
+
$this->_addParentTransactionDataToPayment($payment);
|
204 |
+
|
205 |
+
if ($payment->hasParentTransactionData()) {
|
206 |
+
$this->setTransactionType(self::TRANSACTION_TYPE_PARTIAL);
|
207 |
+
return $this->_partialCapture($payment, $amount);
|
208 |
+
} else {
|
209 |
+
$this->setTransactionType(self::TRANSACTION_TYPE_CAPTURE);
|
210 |
+
return $this->_authorizeAndCapture($payment, $amount);
|
211 |
+
}
|
212 |
+
}
|
213 |
+
|
214 |
+
/**
|
215 |
+
* Authorize and capture service message.
|
216 |
+
*
|
217 |
+
* @param Varien_Object $payment
|
218 |
+
* @param float $amount
|
219 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
220 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
221 |
+
*/
|
222 |
+
protected function _authorizeAndCapture(Varien_Object $payment, $amount)
|
223 |
+
{
|
224 |
+
$this->_setPayment($payment);
|
225 |
+
$this->_setOrder($payment->getOrder());
|
226 |
+
$payment->setData(self::PAYMENT_OBJECT_FIELD_PAYMENT_AMOUNT, $amount);
|
227 |
+
|
228 |
+
$transactionReference = $this->getAdapter()->getTransactionReference();
|
229 |
+
$this->setTransactionReference($transactionReference);
|
230 |
+
if ($transactionReference == '') {
|
231 |
+
throw new Exception('Unable to retrieve transaction reference from adapter.');
|
232 |
+
}
|
233 |
+
|
234 |
+
$this->_addBillingAgreementDataToPayment($payment);
|
235 |
+
|
236 |
+
try {
|
237 |
+
$this->_beforePrepareRegisterRequest();
|
238 |
+
$this->getAdapter()->prepareRegisterRequest();
|
239 |
+
$this->_processServiceMessages();
|
240 |
+
} catch (Exception $e) {
|
241 |
+
// retrieve custom exception message if available
|
242 |
+
if ($methodException = $this->_getMethodException($e)) {
|
243 |
+
$e = $methodException;
|
244 |
+
}
|
245 |
+
|
246 |
+
// create a flag against the message
|
247 |
+
$this->_updateMessageForFailure($e);
|
248 |
+
|
249 |
+
// re-throw
|
250 |
+
throw $e;
|
251 |
+
}
|
252 |
+
|
253 |
+
$this->_processRegisterRedirect();
|
254 |
+
|
255 |
+
$payment
|
256 |
+
->setIsTransactionClosed(false)
|
257 |
+
->setShouldCloseParentTransaction(false)
|
258 |
+
->setTransactionId($transactionReference)
|
259 |
+
->setTransactionAdditionalInfo(
|
260 |
+
self::PAYMENT_TRANSACTION_RAW_DETAILS,
|
261 |
+
$this->getAdapter()->getTransactionDataFromRegister()
|
262 |
+
);
|
263 |
+
|
264 |
+
if ($this->_redirectRequired == false) {
|
265 |
+
$this->_processBillingAgreement();
|
266 |
+
$this->_addBillingAgreementToOrder();
|
267 |
+
$this->_createSubscription();
|
268 |
+
}
|
269 |
+
|
270 |
+
$this->_prepareCustomerNote();
|
271 |
+
|
272 |
+
return $this;
|
273 |
+
}
|
274 |
+
|
275 |
+
/**
|
276 |
+
* Partial capture of a previously authorized payment.
|
277 |
+
*
|
278 |
+
* @param Varien_Object $payment
|
279 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
280 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
281 |
+
*/
|
282 |
+
protected function _partialCapture(Varien_Object $payment, $amount)
|
283 |
+
{
|
284 |
+
$this->_setPayment($payment);
|
285 |
+
$this->_setOrder($payment->getOrder());
|
286 |
+
$payment->setData(self::PAYMENT_OBJECT_FIELD_PAYMENT_AMOUNT, $amount);
|
287 |
+
|
288 |
+
$transactionReference = $this->getAdapter()->getTransactionReference();
|
289 |
+
$transactionReference = $this->_incrementTransactionId($payment, $transactionReference);
|
290 |
+
$this->setTransactionReference($transactionReference);
|
291 |
+
if ($transactionReference == '') {
|
292 |
+
throw new Exception('Unable to retrieve transaction reference from adapter.');
|
293 |
+
}
|
294 |
+
|
295 |
+
$this->_addBillingAgreementDataToPayment($payment);
|
296 |
+
|
297 |
+
try {
|
298 |
+
$this->_beforePrepareRegisterRequest();
|
299 |
+
$this->getAdapter()->prepareRegisterRequest();
|
300 |
+
$this->_processServiceMessages();
|
301 |
+
} catch (Exception $e) {
|
302 |
+
// retrieve custom exception message if available
|
303 |
+
if ($methodException = $this->_getMethodException($e)) {
|
304 |
+
$e = $methodException;
|
305 |
+
}
|
306 |
+
|
307 |
+
// create a flag against the message
|
308 |
+
$this->_updateMessageForFailure($e);
|
309 |
+
|
310 |
+
// re-throw
|
311 |
+
throw $e;
|
312 |
+
}
|
313 |
+
|
314 |
+
$payment
|
315 |
+
->setIsTransactionClosed(false)
|
316 |
+
->setShouldCloseParentTransaction(false)
|
317 |
+
->setTransactionId($transactionReference)
|
318 |
+
->setTransactionAdditionalInfo(
|
319 |
+
self::PAYMENT_TRANSACTION_RAW_DETAILS,
|
320 |
+
$this->getAdapter()->getTransactionDataFromRegister()
|
321 |
+
);
|
322 |
+
|
323 |
+
return $this;
|
324 |
+
}
|
325 |
+
|
326 |
+
/**
|
327 |
+
* Authorize payment service message, triggered by a subscription.
|
328 |
+
*
|
329 |
+
* @param Varien_Object $payment
|
330 |
+
* @param float $amount
|
331 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
332 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
333 |
+
*/
|
334 |
+
public function subscriptionAuthorize(Varien_Object $payment, $amount)
|
335 |
+
{
|
336 |
+
if (!$this->_getSubscriptionHelper()->isActive()) {
|
337 |
+
throw new Exception('Subscriptions are disabled due to configuration settings.');
|
338 |
+
}
|
339 |
+
|
340 |
+
$this->setTransactionType(self::TRANSACTION_TYPE_SUBSCRIPTION_AUTH);
|
341 |
+
return $this->_subscriptionTransaction($payment, $amount);
|
342 |
+
}
|
343 |
+
|
344 |
+
/**
|
345 |
+
* Capture payment service message, triggered by a subscription.
|
346 |
+
*
|
347 |
+
* @param Varien_Object $payment
|
348 |
+
* @param float $amount
|
349 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
350 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
351 |
+
*/
|
352 |
+
public function subscriptionCapture(Varien_Object $payment, $amount)
|
353 |
+
{
|
354 |
+
if (!$this->_getSubscriptionHelper()->isActive()) {
|
355 |
+
throw new Exception('Subscriptions are disabled due to configuration settings.');
|
356 |
+
}
|
357 |
+
|
358 |
+
$this->_addParentTransactionDataToPayment($payment);
|
359 |
+
|
360 |
+
if ($payment->hasParentTransactionData()) {
|
361 |
+
$this->setTransactionType(self::TRANSACTION_TYPE_SUBSCRIPTION_PARTIAL);
|
362 |
+
return $this->_partialCapture($payment, $amount);
|
363 |
+
} else {
|
364 |
+
$this->setTransactionType(self::TRANSACTION_TYPE_SUBSCRIPTION_CAPTURE);
|
365 |
+
return $this->_subscriptionTransaction($payment, $amount);
|
366 |
+
}
|
367 |
+
}
|
368 |
+
|
369 |
+
/**
|
370 |
+
* Common subscription logic between authorize and capture methods.
|
371 |
+
*
|
372 |
+
* @param Varien_Object $payment
|
373 |
+
* @param float $amount
|
374 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
375 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
376 |
+
*/
|
377 |
+
protected function _subscriptionTransaction(Varien_Object $payment, $amount)
|
378 |
+
{
|
379 |
+
$this->_setPayment($payment);
|
380 |
+
$this->_setOrder($payment->getOrder());
|
381 |
+
$payment->setData(self::PAYMENT_OBJECT_FIELD_PAYMENT_AMOUNT, $amount);
|
382 |
+
|
383 |
+
$transactionReference = $this->getAdapter()->getTransactionReference();
|
384 |
+
$this->setTransactionReference($transactionReference);
|
385 |
+
if ($transactionReference == '') {
|
386 |
+
throw new Exception('Unable to retrieve transaction reference from adapter.');
|
387 |
+
}
|
388 |
+
|
389 |
+
$this->_addBillingAgreementDataToPayment($payment);
|
390 |
+
|
391 |
+
try {
|
392 |
+
$this->_beforePrepareRegisterRequest();
|
393 |
+
$this->getAdapter()->prepareRegisterRequest();
|
394 |
+
$this->_processServiceMessages();
|
395 |
+
} catch (Exception $e) {
|
396 |
+
// retrieve custom exception message if available
|
397 |
+
if ($methodException = $this->_getMethodException($e)) {
|
398 |
+
$e = $methodException;
|
399 |
+
}
|
400 |
+
|
401 |
+
// create a flag against the message
|
402 |
+
$this->_updateMessageForFailure($e);
|
403 |
+
|
404 |
+
// re-throw
|
405 |
+
throw $e;
|
406 |
+
}
|
407 |
+
|
408 |
+
$payment
|
409 |
+
->setIsTransactionClosed(false)
|
410 |
+
->setShouldCloseParentTransaction(false)
|
411 |
+
->setTransactionId($transactionReference)
|
412 |
+
->setTransactionAdditionalInfo(
|
413 |
+
self::PAYMENT_TRANSACTION_RAW_DETAILS,
|
414 |
+
$this->getAdapter()->getTransactionDataFromRegister()
|
415 |
+
);
|
416 |
+
|
417 |
+
$this->_addBillingAgreementToOrder();
|
418 |
+
|
419 |
+
return $this;
|
420 |
+
}
|
421 |
+
|
422 |
+
/**
|
423 |
+
* Refund payment service message.
|
424 |
+
*
|
425 |
+
* @param Varien_Object $payment
|
426 |
+
* @param float $amount
|
427 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
428 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
429 |
+
*/
|
430 |
+
public function refund(Varien_Object $payment, $amount)
|
431 |
+
{
|
432 |
+
$payment->setData(self::PAYMENT_OBJECT_FIELD_PAYMENT_AMOUNT, $amount);
|
433 |
+
|
434 |
+
$this->_addParentTransactionDataToPayment($payment);
|
435 |
+
$this->_addBillingAgreementDataToPayment($payment);
|
436 |
+
|
437 |
+
$this->setTransactionType(self::TRANSACTION_TYPE_REFUND);
|
438 |
+
|
439 |
+
$this->_setPayment($payment);
|
440 |
+
$this->_setOrder($payment->getOrder());
|
441 |
+
|
442 |
+
$transactionReference = $this->getAdapter()->getTransactionReference();
|
443 |
+
$transactionReference = $this->_incrementTransactionId($payment, $transactionReference);
|
444 |
+
$this->setTransactionReference($transactionReference);
|
445 |
+
if ($transactionReference == '') {
|
446 |
+
throw new Exception('Unable to retrieve transaction reference from adapter.');
|
447 |
+
}
|
448 |
+
|
449 |
+
try {
|
450 |
+
$this->_beforePrepareRegisterRequest();
|
451 |
+
$this->getAdapter()->prepareRegisterRequest();
|
452 |
+
$this->_processServiceMessages();
|
453 |
+
} catch (Exception $e) {
|
454 |
+
// retrieve custom exception message if available
|
455 |
+
if ($methodException = $this->_getMethodException($e)) {
|
456 |
+
$e = $methodException;
|
457 |
+
}
|
458 |
+
|
459 |
+
// create a flag against the message
|
460 |
+
$this->_updateMessageForFailure($e);
|
461 |
+
|
462 |
+
// re-throw
|
463 |
+
throw $e;
|
464 |
+
}
|
465 |
+
|
466 |
+
$payment
|
467 |
+
->setIsTransactionClosed(false)
|
468 |
+
->setShouldCloseParentTransaction(false)
|
469 |
+
->setTransactionId($transactionReference)
|
470 |
+
->setTransactionAdditionalInfo(
|
471 |
+
self::PAYMENT_TRANSACTION_RAW_DETAILS,
|
472 |
+
$this->getAdapter()->getTransactionDataFromRegister()
|
473 |
+
);
|
474 |
+
|
475 |
+
return $this;
|
476 |
+
}
|
477 |
+
|
478 |
+
/**
|
479 |
+
* Add related transaction data to payment object.
|
480 |
+
*
|
481 |
+
* @param Varien_Object $payment
|
482 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
483 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
484 |
+
*/
|
485 |
+
protected function _addParentTransactionDataToPayment(Varien_Object $payment)
|
486 |
+
{
|
487 |
+
if ($parentTransactionId = $payment->getParentTransactionId()) {
|
488 |
+
$parentTransaction = $payment->getTransaction($parentTransactionId);
|
489 |
+
$parentTransactionData = $parentTransaction->getAdditionalInformation();
|
490 |
+
$payment->setParentTransactionData(
|
491 |
+
$parentTransactionData[self::PAYMENT_TRANSACTION_RAW_DETAILS]
|
492 |
+
);
|
493 |
+
}
|
494 |
+
|
495 |
+
return $this;
|
496 |
+
}
|
497 |
+
|
498 |
+
/**
|
499 |
+
* Add related billing agreement data to payment object.
|
500 |
+
*
|
501 |
+
* @param Varien_Object $payment
|
502 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
503 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
504 |
+
*/
|
505 |
+
protected function _addBillingAgreementDataToPayment(Varien_Object $payment)
|
506 |
+
{
|
507 |
+
if (!Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()) {
|
508 |
+
return $this;
|
509 |
+
}
|
510 |
+
|
511 |
+
if (!$payment->getMethodInstance()->canManageBillingAgreements()) {
|
512 |
+
return $this;
|
513 |
+
}
|
514 |
+
|
515 |
+
$billingAgreement = Mage::getModel('ampersand_paymentgateway/agreement')
|
516 |
+
->loadByReferenceId(
|
517 |
+
$this->_getServiceCode(),
|
518 |
+
$payment->getAdditionalInformation('ba_reference_id')
|
519 |
+
);
|
520 |
+
|
521 |
+
/**
|
522 |
+
* @todo NOTE: setting this as billing_agreement_data causes payment to try and create a new
|
523 |
+
* billing agreement on completion in Mage_Sales_Model_Order_Payment::_createBillingAgreement()
|
524 |
+
*/
|
525 |
+
$billingAgreementCredentials = $billingAgreement->getAdditionalInformation();
|
526 |
+
|
527 |
+
$cv2Field = Ampersand_PaymentGateway_Model_Method_AgreementAbstract
|
528 |
+
::TRANSPORT_BILLING_AGREEMENT_CV2;
|
529 |
+
$billingAgreementCredentials[$cv2Field]= $this->_getHelper()->getBillingAgreementCv2();
|
530 |
+
$payment->setBillingAgreementCredentials($billingAgreementCredentials);
|
531 |
+
|
532 |
+
return $this;
|
533 |
+
}
|
534 |
+
|
535 |
+
/**
|
536 |
+
* Process all queued service messages.
|
537 |
+
*
|
538 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
539 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
540 |
+
*/
|
541 |
+
protected function _processServiceMessages()
|
542 |
+
{
|
543 |
+
while ($_message = $this->getAdapter()->getNextServiceMessage()) {
|
544 |
+
$this->_setResponse(
|
545 |
+
$this->sendMessage(
|
546 |
+
$_message['name'],
|
547 |
+
$this->getAdapter()->{$_message['data']}()
|
548 |
+
)
|
549 |
+
);
|
550 |
+
$this->_setDebug($this->getLastMessageDebug());
|
551 |
+
$this->getAdapter()->{$_message['callback']}();
|
552 |
+
|
553 |
+
$this->_updateMessageState(Ampersand_Integration_Flag_FlagInterface::TYPE_SUCCESS);
|
554 |
+
}
|
555 |
+
|
556 |
+
return $this;
|
557 |
+
}
|
558 |
+
|
559 |
+
/**
|
560 |
+
* Retrieve payment method specific error message for exception.
|
561 |
+
*
|
562 |
+
* @param Exception $e
|
563 |
+
* @return Exception $e
|
564 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
565 |
+
*/
|
566 |
+
protected function _getMethodException(Exception $e)
|
567 |
+
{
|
568 |
+
$code = (string)$e->getCode();
|
569 |
+
if ($code == '0') {
|
570 |
+
return false;
|
571 |
+
}
|
572 |
+
|
573 |
+
$errorData = array();
|
574 |
+
if ($e instanceof Ampersand_PaymentGateway_Model_Exception_Error) {
|
575 |
+
$errorData = $e->getErrorData();
|
576 |
+
}
|
577 |
+
$message = (string)$this->getMethodInstance()->getErrorMessage($code, $errorData);
|
578 |
+
if ($message == '') {
|
579 |
+
return false;
|
580 |
+
}
|
581 |
+
|
582 |
+
return new Mage_Core_Exception($message, $code, $e);
|
583 |
+
}
|
584 |
+
|
585 |
+
/**
|
586 |
+
* Check existing transactions and increment if the provided ID already exists.
|
587 |
+
*
|
588 |
+
* @param Mage_Sales_Model_Order_Payment $payment
|
589 |
+
* @param string $transactionId
|
590 |
+
* @return string
|
591 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
592 |
+
*/
|
593 |
+
protected function _incrementTransactionId(Mage_Sales_Model_Order_Payment $payment, $transactionId)
|
594 |
+
{
|
595 |
+
if (!$payment->getTransaction($transactionId)) {
|
596 |
+
return $transactionId;
|
597 |
+
}
|
598 |
+
|
599 |
+
$_parts = explode('-', $transactionId);
|
600 |
+
|
601 |
+
if (Mage::helper('ampersand_core/validate')->isInt(end($_parts))) {
|
602 |
+
$lastNumber = array_pop($_parts);
|
603 |
+
$_parts[] = $lastNumber + 1;
|
604 |
+
} else {
|
605 |
+
$_parts[] = '1';
|
606 |
+
}
|
607 |
+
|
608 |
+
$transactionId = implode('-', $_parts);
|
609 |
+
|
610 |
+
return $this->_incrementTransactionId($payment, $transactionId);
|
611 |
+
}
|
612 |
+
|
613 |
+
/**
|
614 |
+
* Perform any tasks that must be run before the service messages are processed.
|
615 |
+
*
|
616 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
617 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
618 |
+
*/
|
619 |
+
protected function _beforePrepareRegisterRequest()
|
620 |
+
{
|
621 |
+
$termUrlData = array();
|
622 |
+
|
623 |
+
$termUrlMessageNames = $this->getAdapter()->getTermUrlData();
|
624 |
+
if (is_array($termUrlMessageNames)) {
|
625 |
+
foreach ($termUrlMessageNames as $_field => $_messageName) {
|
626 |
+
$termUrlData[$_field] = $this->_buildTermUrl($_messageName);
|
627 |
+
}
|
628 |
+
}
|
629 |
+
|
630 |
+
$this->_getPayment()->setTermUrlData($termUrlData);
|
631 |
+
|
632 |
+
return $this;
|
633 |
+
}
|
634 |
+
|
635 |
+
/**
|
636 |
+
* If the Payment Gateway requires a redirect to complete the transaction, collect the
|
637 |
+
* required information from the adapter and set the redirect URL to the appropriate value.
|
638 |
+
*
|
639 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
640 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
641 |
+
*/
|
642 |
+
protected function _processRegisterRedirect()
|
643 |
+
{
|
644 |
+
return $this;
|
645 |
+
}
|
646 |
+
|
647 |
+
/**
|
648 |
+
* For any payment method involving a redirect to a third party we save a reference to
|
649 |
+
* retrieve the related payment and order information during the Payment Gateway callback.
|
650 |
+
*
|
651 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
652 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
653 |
+
*/
|
654 |
+
protected function _saveTransactionReference()
|
655 |
+
{
|
656 |
+
$transaction = Mage::getModel('ampersand_paymentgateway/transaction')
|
657 |
+
->setData(array(
|
658 |
+
'service_code' => $this->_serviceCode,
|
659 |
+
'transaction_reference' => $this->getTransactionReference(),
|
660 |
+
'payment_id' => $this->_getPayment()->getId(),
|
661 |
+
'order_id' => $this->_getOrder()->getId(),
|
662 |
+
'transaction_type' => $this->getTransactionType(),
|
663 |
+
'payment_amount' => $this->_getPayment()->getData(self::PAYMENT_OBJECT_FIELD_PAYMENT_AMOUNT),
|
664 |
+
'additional_information' => $this->getAdapter()->getTransactionDataFromRegister(),
|
665 |
+
'subscription_data' => $this->_getSubscriptionHelper()->getSubscriptionData(),
|
666 |
+
))
|
667 |
+
->save();
|
668 |
+
|
669 |
+
$this->_setTransaction($transaction);
|
670 |
+
|
671 |
+
return $this;
|
672 |
+
}
|
673 |
+
|
674 |
+
protected function _buildTermUrl($messageName)
|
675 |
+
{
|
676 |
+
$termUrl = Mage::getUrl(
|
677 |
+
'ampersand_integration' . '/'
|
678 |
+
. $this->getServiceCode() . '/'
|
679 |
+
. $messageName,
|
680 |
+
array(
|
681 |
+
'_forced_secure' => true,
|
682 |
+
'transaction_type' => $this->getTransactionType(),
|
683 |
+
'transaction_reference' => $this->getTransactionReference(),
|
684 |
+
)
|
685 |
+
);
|
686 |
+
|
687 |
+
return $termUrl;
|
688 |
+
}
|
689 |
+
|
690 |
+
/**
|
691 |
+
* Add error flag to message.
|
692 |
+
*
|
693 |
+
* @param Exception $e
|
694 |
+
* @param Ampersand_Integration_Debug_DebugInterface $debug
|
695 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
696 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
697 |
+
*/
|
698 |
+
protected function _updateMessageForFailure(Exception $e,
|
699 |
+
Ampersand_Integration_Debug_DebugInterface $debug = null)
|
700 |
+
{
|
701 |
+
// update the message status
|
702 |
+
$this->_updateMessageState(Ampersand_Integration_Flag_FlagInterface::TYPE_CRITICAL);
|
703 |
+
|
704 |
+
// prepare the flag data
|
705 |
+
$flagData = array(
|
706 |
+
'message_id' => $this->getLastMessageId(),
|
707 |
+
'short_text' => $e->getMessage(),
|
708 |
+
'text' => $e->getTraceAsString(),
|
709 |
+
'type' => Ampersand_Integration_Flag_FlagInterface::TYPE_CRITICAL,
|
710 |
+
);
|
711 |
+
|
712 |
+
$lastMessageDebug = $this->getLastMessageDebug();
|
713 |
+
if ($lastMessageDebug instanceof Ampersand_Integration_Debug_DebugInterface) {
|
714 |
+
$lastMessageDebug->setState(Ampersand_Integration_Flag_FlagInterface::TYPE_CRITICAL);
|
715 |
+
$this->createFlag($flagData);
|
716 |
+
|
717 |
+
/**
|
718 |
+
* if a debug was provided, but a message has been processed since with errors,
|
719 |
+
* update the original debug for success since it is not the point of failure.
|
720 |
+
*/
|
721 |
+
if (!is_null($debug)) {
|
722 |
+
$debug->setState(Ampersand_Integration_Flag_FlagInterface::TYPE_SUCCESS);
|
723 |
+
}
|
724 |
+
} else if (!is_null($debug)) {
|
725 |
+
$debug->setState(Ampersand_Integration_Flag_FlagInterface::TYPE_CRITICAL);
|
726 |
+
$flag = new Ampersand_Integration_Flag($flagData);
|
727 |
+
$debug->addFlag($flag);
|
728 |
+
}
|
729 |
+
|
730 |
+
return $this;
|
731 |
+
}
|
732 |
+
|
733 |
+
protected function _processRedirect($url, $data)
|
734 |
+
{
|
735 |
+
$this->_getSession()->addData(array(
|
736 |
+
Ampersand_PaymentGateway_Block_Redirect_Form::SESSION_KEY_REDIRECT_URL => $url,
|
737 |
+
Ampersand_PaymentGateway_Block_Redirect_Form::SESSION_KEY_REDIRECT_DATA => $data,
|
738 |
+
));
|
739 |
+
|
740 |
+
if ($this->getAdapter()->getIsUseIframe()) {
|
741 |
+
$redirectUrlPath = 'ampersand_paymentgateway/redirect/iframe';
|
742 |
+
} else {
|
743 |
+
$redirectUrlPath = 'ampersand_paymentgateway/redirect/form';
|
744 |
+
}
|
745 |
+
|
746 |
+
$this->_getHelper()->setRedirectUrl(
|
747 |
+
Mage::getUrl($redirectUrlPath, array('_forced_secure' => true))
|
748 |
+
);
|
749 |
+
|
750 |
+
$this->_redirectRequired = true;
|
751 |
+
|
752 |
+
return $this;
|
753 |
+
}
|
754 |
+
|
755 |
+
/**
|
756 |
+
* Link the billing agreement to the current order.
|
757 |
+
*
|
758 |
+
* @param bool $saveAgreement
|
759 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
760 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
761 |
+
*/
|
762 |
+
protected function _addBillingAgreementToOrder($saveAgreement = false)
|
763 |
+
{
|
764 |
+
if (!Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()) {
|
765 |
+
return $this;
|
766 |
+
}
|
767 |
+
|
768 |
+
$billingAgreementId = $this->_getPayment()->getAdditionalInformation('ba_agreement_id');
|
769 |
+
if (!$billingAgreementId) {
|
770 |
+
return $this;
|
771 |
+
}
|
772 |
+
|
773 |
+
$salesBillingAgreement = Mage::getModel('sales/billing_agreement')
|
774 |
+
->load($billingAgreementId);
|
775 |
+
|
776 |
+
$order = $this->_getOrder();
|
777 |
+
|
778 |
+
$order->addRelatedObject($salesBillingAgreement);
|
779 |
+
|
780 |
+
$salesBillingAgreement->setIsObjectChanged(true);
|
781 |
+
$salesBillingAgreement->addOrderRelation($order->getId());
|
782 |
+
|
783 |
+
/**
|
784 |
+
* We need to call getPaymentMethodInstance() to instantiate property
|
785 |
+
* Mage_Payment_Model_Billing_AgreementAbstract::_paymentMethodInstance
|
786 |
+
* in order for isValid() to succeed in earlier versions of Magento.
|
787 |
+
*/
|
788 |
+
$salesBillingAgreement->getPaymentMethodInstance();
|
789 |
+
|
790 |
+
if ($saveAgreement) {
|
791 |
+
$salesBillingAgreement->save();
|
792 |
+
}
|
793 |
+
|
794 |
+
return $this;
|
795 |
+
}
|
796 |
+
|
797 |
+
/**
|
798 |
+
* Update the customer note related to this order.
|
799 |
+
*
|
800 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
801 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
802 |
+
*/
|
803 |
+
protected function _prepareCustomerNote()
|
804 |
+
{
|
805 |
+
$order = $this->_getOrder();
|
806 |
+
$noteStack = new Ampersand_Stack();
|
807 |
+
if ($defaultNote = $order->getCustomerNote()) {
|
808 |
+
$noteStack->addToStack($defaultNote, 'default');
|
809 |
+
}
|
810 |
+
|
811 |
+
// subscription creation notice
|
812 |
+
if (Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()
|
813 |
+
&& $this->_getSubscriptionHelper()->getSubscriptionData('active'))
|
814 |
+
{
|
815 |
+
$message = $this->_getHelper()->__(
|
816 |
+
'A %s subscription will be created for this order.',
|
817 |
+
$this->_getSubscriptionHelper()->getSubscriptionData('period')
|
818 |
+
);
|
819 |
+
|
820 |
+
$noteStack->addToStack("<strong>{$message}</strong>", 'subscription');
|
821 |
+
}
|
822 |
+
|
823 |
+
// provide opportunity for third party applications to update
|
824 |
+
Mage::dispatchEvent(
|
825 |
+
'ampersand_paymentgateway_prepare_customer_note',
|
826 |
+
array(
|
827 |
+
'order' => $order,
|
828 |
+
'note_stack' => $noteStack,
|
829 |
+
)
|
830 |
+
);
|
831 |
+
|
832 |
+
// prepare and set the note
|
833 |
+
$note = implode('<br /><br />', $noteStack->getStack());
|
834 |
+
$order->setCustomerNote($note);
|
835 |
+
|
836 |
+
return $this;
|
837 |
+
}
|
838 |
+
|
839 |
+
/**
|
840 |
+
* Handle the callback from the Payment Gateway. For direct payment methods this might be
|
841 |
+
* the 3D Secure response data, and for redirect payment methods this would be the overall
|
842 |
+
* success or failure of the transaction.
|
843 |
+
*
|
844 |
+
* @param Ampersand_Integration_Debug_DebugInterface $debug
|
845 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
846 |
+
*/
|
847 |
+
public function callback(Ampersand_Integration_Debug_DebugInterface $debug)
|
848 |
+
{
|
849 |
+
try {
|
850 |
+
// initialise objects
|
851 |
+
$this->_initCallback($debug);
|
852 |
+
|
853 |
+
// process the callback response and any additional messages
|
854 |
+
$this->getAdapter()->processCallbackResponse();
|
855 |
+
$this->_processServiceMessages();
|
856 |
+
|
857 |
+
// update the transaction data and accept the payment
|
858 |
+
$this->_updateTransactionAfterCallback();
|
859 |
+
$this->_acceptPayment();
|
860 |
+
|
861 |
+
// update the redirect url from failure page to success page
|
862 |
+
$this->_getHelper()->setRedirectUrl($this->_getRedirectSuccessUrl());
|
863 |
+
|
864 |
+
// update the incoming message for success
|
865 |
+
$debug->setState(Ampersand_Integration_Flag_FlagInterface::TYPE_SUCCESS);
|
866 |
+
|
867 |
+
// create a new billing agreement with the credentials used for this transaction
|
868 |
+
$this->_processBillingAgreement();
|
869 |
+
|
870 |
+
// create a subscription if a valid billing agreement is related to this order
|
871 |
+
$this->_createSubscription();
|
872 |
+
} catch (Ampersand_PaymentGateway_Model_Exception_DenyPayment $e) {
|
873 |
+
// no need to log the exception here, as it is a genuine denied transaction
|
874 |
+
// Mage::logException($e);
|
875 |
+
|
876 |
+
// process the failure redirect URL and error messages
|
877 |
+
$this->_processCallbackFailure($e, self::FAILURE_TYPE_DENIED, $debug);
|
878 |
+
|
879 |
+
// update the transaction data and deny the payment
|
880 |
+
$this->_updateTransactionAfterCallback();
|
881 |
+
$this->_denyPayment();
|
882 |
+
|
883 |
+
// re-populate the customers basket
|
884 |
+
$this->_getHelper()->reorder($this->_getOrder());
|
885 |
+
} catch (Ampersand_PaymentGateway_Model_Exception_Error $e) {
|
886 |
+
// something went wrong with the transaction, but we have handled it appropriately
|
887 |
+
Mage::logException($e);
|
888 |
+
|
889 |
+
// process the failure redirect URL and error messages
|
890 |
+
$this->_processCallbackFailure($e, self::FAILURE_TYPE_ERROR, $debug);
|
891 |
+
|
892 |
+
// re-populate the customers basket
|
893 |
+
$this->_getHelper()->reorder($this->_getOrder());
|
894 |
+
} catch (Exception $e) {
|
895 |
+
// something went wrong that we were not expecting
|
896 |
+
Mage::logException($e);
|
897 |
+
|
898 |
+
// process the failure redirect URL and error messages
|
899 |
+
$this->_processCallbackFailure($e, self::FAILURE_TYPE_ERROR, $debug);
|
900 |
+
|
901 |
+
// notify the administrator of this critical issue, since payment could have been taken
|
902 |
+
$this->_notifyCriticalError($e, $debug);
|
903 |
+
|
904 |
+
// re-populate the customers basket
|
905 |
+
$this->_getHelper()->reorder($this->_getOrder());
|
906 |
+
}
|
907 |
+
|
908 |
+
// initialize response data
|
909 |
+
$responseData = array();
|
910 |
+
|
911 |
+
// retrieve the callback redirect url
|
912 |
+
$redirectUrl = $this->_getHelper()->getRedirectUrl();
|
913 |
+
$callbackRedirectUrl = $this->_getCallbackRedirectUrl($redirectUrl);
|
914 |
+
|
915 |
+
// update the controller to redirect or update the response data
|
916 |
+
if ($this->_isSetControllerRedirect()) {
|
917 |
+
Mage::helper('ampersand_integration/message')
|
918 |
+
->setControllerRedirectUrl($callbackRedirectUrl);
|
919 |
+
} else {
|
920 |
+
$responseData['redirect_url'] = $redirectUrl;
|
921 |
+
$responseData['callback_redirect_url'] = $callbackRedirectUrl;
|
922 |
+
$responseData['exception'] = isset($e) ? $e : self::FAILURE_TYPE_NONE;
|
923 |
+
}
|
924 |
+
|
925 |
+
return $responseData;
|
926 |
+
}
|
927 |
+
|
928 |
+
/**
|
929 |
+
* Initialise objects required for payment handling after callback.
|
930 |
+
*
|
931 |
+
* @param Ampersand_Integration_Debug_DebugInterface $debug
|
932 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
933 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
934 |
+
*/
|
935 |
+
protected function _initCallback(Ampersand_Integration_Debug_DebugInterface $debug)
|
936 |
+
{
|
937 |
+
$this->setTransactionType(Mage::app()->getRequest()->getParam('transaction_type'));
|
938 |
+
|
939 |
+
$transactionReference = Mage::app()->getRequest()->getParam('transaction_reference');
|
940 |
+
$this->setTransactionReference($transactionReference);
|
941 |
+
|
942 |
+
$this->_setDebug($debug);
|
943 |
+
$response = $debug->getRequestObject();
|
944 |
+
$this->_setResponse($response);
|
945 |
+
|
946 |
+
$transaction = Mage::getModel('ampersand_paymentgateway/transaction')
|
947 |
+
->loadByServiceTransactionReference($this->_serviceCode, $transactionReference);
|
948 |
+
$this->_setTransaction($transaction);
|
949 |
+
if ($transaction->getTransactionType() != $this->getTransactionType()) {
|
950 |
+
throw new Exception($this->_getHelper()
|
951 |
+
->__("Transaction type '{$this->getTransactionType()}' does not match expected '{$transaction->getTransactionType()}'."));
|
952 |
+
}
|
953 |
+
|
954 |
+
$order = Mage::getModel('sales/order')->load($transaction->getOrderId());
|
955 |
+
$this->_setOrder($order);
|
956 |
+
if (!$order->getId()) {
|
957 |
+
throw new Exception($this->_getHelper()
|
958 |
+
->__("Unable to load order for Transaction '{$transactionReference}'"));
|
959 |
+
}
|
960 |
+
|
961 |
+
/**
|
962 |
+
* @todo overlap here with Ampersand_PaymentGateway_Model_Method_Xxx::accept() / deny()
|
963 |
+
*/
|
964 |
+
$requiredState = Mage::getModel('ampersand_paymentgateway/versioning')
|
965 |
+
->getPaymentReviewOrderState();
|
966 |
+
if ($order->getStatus() !== $requiredState) {
|
967 |
+
$comment = $order->addStatusHistoryComment($this->_getHelper()
|
968 |
+
->__('Warning: A payment gateway callback occured for this order.'));
|
969 |
+
$comment->save();
|
970 |
+
|
971 |
+
throw new Exception($this->_getHelper()
|
972 |
+
->__("Only orders with status '{$requiredState}' can be accepted or denied."));
|
973 |
+
}
|
974 |
+
|
975 |
+
$payment = Mage::getModel('sales/order_payment')->load($transaction->getPaymentId());
|
976 |
+
$payment->setOrder($order);
|
977 |
+
$this->_setPayment($payment);
|
978 |
+
if (!$payment->getId()) {
|
979 |
+
throw new Exception($this->_getHelper()
|
980 |
+
->__("Unable to load payment for Transaction '{$transactionReference}'"));
|
981 |
+
}
|
982 |
+
$this->setMethodInstance($payment->getMethodInstance());
|
983 |
+
|
984 |
+
/**
|
985 |
+
* @todo Test if we 'must' save here, or if we can just associate with the order?
|
986 |
+
*/
|
987 |
+
// assign the billing agreement to the order
|
988 |
+
$this->_addBillingAgreementToOrder(true);
|
989 |
+
|
990 |
+
return $this;
|
991 |
+
}
|
992 |
+
|
993 |
+
/**
|
994 |
+
* Set the failure redirect and failure error messages.
|
995 |
+
*
|
996 |
+
* @param Exception $e
|
997 |
+
* @param string $type
|
998 |
+
* @param Ampersand_Integration_Debug_DebugInterface $debug
|
999 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1000 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1001 |
+
*/
|
1002 |
+
protected function _processCallbackFailure(Exception $e, $type,
|
1003 |
+
Ampersand_Integration_Debug_DebugInterface $debug)
|
1004 |
+
{
|
1005 |
+
// set the redirect url to the failure page
|
1006 |
+
$redirectUrl = $this->_getRedirectFailureUrl($type, $e->getCode());
|
1007 |
+
$this->_getHelper()->setRedirectUrl($redirectUrl);
|
1008 |
+
|
1009 |
+
// set the error message to inform the customer what went wrong
|
1010 |
+
$errorMessage = $this->_getHelper()->getErrorMessage($type);
|
1011 |
+
if ($methodException = $this->_getMethodException($e)) {
|
1012 |
+
$e = $methodException;
|
1013 |
+
$errorMessage = $e->getMessage();
|
1014 |
+
}
|
1015 |
+
$this->_getHelper()->setSessionErrorMessage($errorMessage);
|
1016 |
+
|
1017 |
+
// save against the transaction in case notification cannot access session
|
1018 |
+
$transaction = $this->_getTransaction();
|
1019 |
+
if ($transaction instanceof Ampersand_PaymentGateway_Model_Transaction
|
1020 |
+
&& $transaction->getId()
|
1021 |
+
&& (string)$transaction->getErrorMessage() == '') {
|
1022 |
+
// fully load and save in case this has been altered
|
1023 |
+
Mage::getModel('ampersand_paymentgateway/transaction')
|
1024 |
+
->load($transaction->getId())
|
1025 |
+
->setErrorMessage($errorMessage)
|
1026 |
+
->save();
|
1027 |
+
}
|
1028 |
+
|
1029 |
+
// create a flag against the message
|
1030 |
+
$this->_updateMessageForFailure($e, $debug);
|
1031 |
+
|
1032 |
+
return $this;
|
1033 |
+
}
|
1034 |
+
|
1035 |
+
/**
|
1036 |
+
* Update the payment transaction with data from the callback.
|
1037 |
+
*
|
1038 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1039 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1040 |
+
*/
|
1041 |
+
protected function _updateTransactionAfterCallback()
|
1042 |
+
{
|
1043 |
+
$transaction = $this->_getPayment()->getTransaction(
|
1044 |
+
$this->getTransactionReference()
|
1045 |
+
);
|
1046 |
+
|
1047 |
+
$transaction
|
1048 |
+
->setIsClosed(false)
|
1049 |
+
->setShouldCloseParentTransaction(false)
|
1050 |
+
->setAdditionalInformation(
|
1051 |
+
self::PAYMENT_TRANSACTION_RAW_DETAILS,
|
1052 |
+
$this->getAdapter()->getTransactionDataFromCallback()
|
1053 |
+
); // no chain as setTransactionAdditionalInfo() returns null
|
1054 |
+
|
1055 |
+
$transaction->save();
|
1056 |
+
|
1057 |
+
return $this;
|
1058 |
+
}
|
1059 |
+
|
1060 |
+
/**
|
1061 |
+
* If the transaction was successful in the Payment Gateway, accept the payment in Magento.
|
1062 |
+
*
|
1063 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1064 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1065 |
+
*/
|
1066 |
+
protected function _acceptPayment()
|
1067 |
+
{
|
1068 |
+
$payment = $this->_getPayment()
|
1069 |
+
->setData(self::PAYMENT_ACCEPT, true);
|
1070 |
+
|
1071 |
+
if (method_exists($payment, 'accept')) {
|
1072 |
+
$payment->accept();
|
1073 |
+
} else {
|
1074 |
+
Mage::getModel('ampersand_paymentgateway/compatibility_mage_sales_model_order_payment')
|
1075 |
+
->registerPaymentReviewAction($payment, self::PAYMENT_ACCEPT);
|
1076 |
+
}
|
1077 |
+
|
1078 |
+
$order = $this->_getOrder()
|
1079 |
+
->sendNewOrderEmail()
|
1080 |
+
->save();
|
1081 |
+
|
1082 |
+
/**
|
1083 |
+
* We must set the order status (not state) manually here as default status forced in
|
1084 |
+
* Mage_Sales_Model_Order_Payment::registerPaymentReviewAction()
|
1085 |
+
*/
|
1086 |
+
$orderStatus = $payment->getMethodInstance()->getConfigData('order_status');
|
1087 |
+
if ($orderStatus != '' && $orderStatus != $order->getStatus()) {
|
1088 |
+
$order->setStatus($orderStatus);
|
1089 |
+
$comment = $order->addStatusHistoryComment($this->_getHelper()
|
1090 |
+
->__("Order status updated."));
|
1091 |
+
$comment->save();
|
1092 |
+
|
1093 |
+
// need to perform this save after the previous one for logical comment history
|
1094 |
+
$order->save();
|
1095 |
+
}
|
1096 |
+
|
1097 |
+
return $this;
|
1098 |
+
}
|
1099 |
+
|
1100 |
+
/**
|
1101 |
+
* If the transaction failed in the Payment Gateway, deny the payment in Magento.
|
1102 |
+
*
|
1103 |
+
* Magento will first set the state to PROCESSING before setting the appropriate state for
|
1104 |
+
* a denied payment order. See the bottom of Mage_Sales_Model_Order_Invoice::cancel().
|
1105 |
+
*
|
1106 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1107 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1108 |
+
*/
|
1109 |
+
protected function _denyPayment()
|
1110 |
+
{
|
1111 |
+
$payment = $this->_getPayment()
|
1112 |
+
->setData(self::PAYMENT_DENY, true);
|
1113 |
+
|
1114 |
+
if (method_exists($payment, 'deny')) {
|
1115 |
+
$payment->deny();
|
1116 |
+
} else {
|
1117 |
+
Mage::getModel('ampersand_paymentgateway/compatibility_mage_sales_model_order_payment')
|
1118 |
+
->registerPaymentReviewAction($payment, self::PAYMENT_DENY);
|
1119 |
+
}
|
1120 |
+
|
1121 |
+
$this->_getOrder()->save();
|
1122 |
+
|
1123 |
+
return $this;
|
1124 |
+
}
|
1125 |
+
|
1126 |
+
/**
|
1127 |
+
* Create or update a billing agreement if applicable.
|
1128 |
+
* @todo Need to also save this against transaction reference in case we dont have session.
|
1129 |
+
*
|
1130 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1131 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1132 |
+
*/
|
1133 |
+
protected function _processBillingAgreement()
|
1134 |
+
{
|
1135 |
+
if (!Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()) {
|
1136 |
+
return $this;
|
1137 |
+
}
|
1138 |
+
|
1139 |
+
try {
|
1140 |
+
if ($this->_getHelper()->getBillingAgreementSelection() !== true) {
|
1141 |
+
return $this;
|
1142 |
+
}
|
1143 |
+
|
1144 |
+
$customer = $this->_getCustomer();
|
1145 |
+
if (!$customer->getId()) {
|
1146 |
+
return $this;
|
1147 |
+
}
|
1148 |
+
|
1149 |
+
if (!$methodCode = $this->getAdapter()->getBillingAgreementMethodCode()) {
|
1150 |
+
return $this;
|
1151 |
+
}
|
1152 |
+
|
1153 |
+
/**
|
1154 |
+
* @todo this can actually be triggered in Magento:
|
1155 |
+
* Mage_Sales_Model_Order_Payment::_createBillingAgreement()
|
1156 |
+
*/
|
1157 |
+
$salesBillingAgreement = Mage::getModel('sales/billing_agreement')
|
1158 |
+
->setMethodCode($methodCode)
|
1159 |
+
->setPayment($this->_getPayment())
|
1160 |
+
->setCustomer($customer)
|
1161 |
+
->setStoreId($this->_getOrder()->getStoreId())
|
1162 |
+
->place();
|
1163 |
+
|
1164 |
+
$this->_getPayment()->setBillingAgreementObject($salesBillingAgreement);
|
1165 |
+
} catch (Exception $e) {
|
1166 |
+
Mage::logException($e);
|
1167 |
+
|
1168 |
+
Mage::getModel('ampersand_paymentgateway/email')
|
1169 |
+
->setTitle('Billing Agreement creation failed.')
|
1170 |
+
->setSummary(__METHOD__)
|
1171 |
+
->addItem('Order ID', $this->_getOrder()->getId())
|
1172 |
+
->sendWarning();
|
1173 |
+
}
|
1174 |
+
|
1175 |
+
return $this;
|
1176 |
+
}
|
1177 |
+
|
1178 |
+
/**
|
1179 |
+
* Create a new subscription if applicable.
|
1180 |
+
*
|
1181 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1182 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1183 |
+
*/
|
1184 |
+
protected function _createSubscription()
|
1185 |
+
{
|
1186 |
+
if (!Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()) {
|
1187 |
+
return $this;
|
1188 |
+
}
|
1189 |
+
|
1190 |
+
if (!$this->_getSubscriptionHelper()->isActive()) {
|
1191 |
+
return $this;
|
1192 |
+
}
|
1193 |
+
|
1194 |
+
// retrieve subscription data from the session or transaction
|
1195 |
+
$transaction = $this->_getTransaction();
|
1196 |
+
if (!is_null($transaction)) {
|
1197 |
+
$subscriptionData = $transaction->getSubscriptionData();
|
1198 |
+
} else {
|
1199 |
+
$subscriptionData = $this->_getSubscriptionHelper()->getSubscriptionData();
|
1200 |
+
}
|
1201 |
+
if (!is_array($subscriptionData)) {
|
1202 |
+
return $this;
|
1203 |
+
}
|
1204 |
+
|
1205 |
+
// prepare the values we are interested in
|
1206 |
+
$active = array_key_exists('active', $subscriptionData)
|
1207 |
+
? $subscriptionData['active'] : false;
|
1208 |
+
$period = array_key_exists('period', $subscriptionData)
|
1209 |
+
? $subscriptionData['period'] : '';
|
1210 |
+
$remainingUpdates = array_key_exists('remaining_updates', $subscriptionData)
|
1211 |
+
? $subscriptionData['remaining_updates'] : null;
|
1212 |
+
|
1213 |
+
// nothing to do if subscription not active
|
1214 |
+
if ($active !== true) {
|
1215 |
+
return $this;
|
1216 |
+
}
|
1217 |
+
|
1218 |
+
$billingAgreement = null;
|
1219 |
+
if ($agreementId = $this->_getPayment()->getAdditionalInformation('ba_agreement_id')) {
|
1220 |
+
// the billing agreement was used to purchase this order
|
1221 |
+
$billingAgreement = Mage::getModel('sales/billing_agreement')->load($agreementId);
|
1222 |
+
} else {
|
1223 |
+
// the billing agreement was created during the processing of this order
|
1224 |
+
$billingAgreement = $this->_getPayment()->getBillingAgreementObject();
|
1225 |
+
}
|
1226 |
+
|
1227 |
+
if (!is_object($billingAgreement) || !$billingAgreement->getId()) {
|
1228 |
+
Mage::getModel('ampersand_paymentgateway/email')
|
1229 |
+
->setTitle('Subscription creation failed.')
|
1230 |
+
->setSummary(__METHOD__)
|
1231 |
+
->addItem('Order ID', $this->_getOrder()->getId())
|
1232 |
+
->sendWarning();
|
1233 |
+
|
1234 |
+
return $this;
|
1235 |
+
}
|
1236 |
+
|
1237 |
+
$order = $this->_getOrder();
|
1238 |
+
|
1239 |
+
Mage::getModel('ampersand_paymentgateway/subscription')
|
1240 |
+
->addData(array(
|
1241 |
+
'order_id' => $order->getId(),
|
1242 |
+
'agreement_id' => $billingAgreement->getId(),
|
1243 |
+
'method_code' => $billingAgreement->getMethodCode(),
|
1244 |
+
'frequency' => $this->_getSubscriptionHelper()->getSubscriptionFrequency($period),
|
1245 |
+
'frequency_type' => 'days', // @todo hard coded until we need different types
|
1246 |
+
'customer_id' => $order->getCustomerId(),
|
1247 |
+
'is_active' => '1',
|
1248 |
+
'is_reminder_sent' => '0',
|
1249 |
+
))
|
1250 |
+
->setRemainingUpdates($remainingUpdates)
|
1251 |
+
->updateNextOrderDate()
|
1252 |
+
->save();
|
1253 |
+
|
1254 |
+
return $this;
|
1255 |
+
}
|
1256 |
+
|
1257 |
+
/**
|
1258 |
+
* Update an Ampersand Integration message with a success flag.
|
1259 |
+
*
|
1260 |
+
* @param string $state
|
1261 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1262 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1263 |
+
*/
|
1264 |
+
protected function _updateMessageState($state)
|
1265 |
+
{
|
1266 |
+
$lastMessageId = $this->getLastMessageId();
|
1267 |
+
if (is_null($lastMessageId)) {
|
1268 |
+
return $this;
|
1269 |
+
}
|
1270 |
+
|
1271 |
+
Mage::getModel('ampersand_integration/message')
|
1272 |
+
->load($lastMessageId)
|
1273 |
+
->setState($state)
|
1274 |
+
->save();
|
1275 |
+
|
1276 |
+
return $this;
|
1277 |
+
}
|
1278 |
+
|
1279 |
+
/**
|
1280 |
+
* Send a critical email and raise an Integration flag to alert administrators of this issue.
|
1281 |
+
*
|
1282 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1283 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1284 |
+
*/
|
1285 |
+
protected function _notifyCriticalError(Exception $exception,
|
1286 |
+
Ampersand_Integration_Debug_DebugInterface $debug)
|
1287 |
+
{
|
1288 |
+
// initialize email model
|
1289 |
+
$emailModel = Mage::getModel('ampersand_paymentgateway/email');
|
1290 |
+
|
1291 |
+
// prepare the email data
|
1292 |
+
$emailModel
|
1293 |
+
->setTitle(
|
1294 |
+
$this->_serviceCode
|
1295 |
+
. ' :: Order failure when payment may have already been processed.'
|
1296 |
+
)
|
1297 |
+
->setSummary(
|
1298 |
+
'Order processing failed in Magento, '
|
1299 |
+
. 'but payment may have already been taken from the customer.'
|
1300 |
+
)
|
1301 |
+
->setException($exception)
|
1302 |
+
->addItem('Service Code', $this->_serviceCode)
|
1303 |
+
->addItem('Transaction Reference', $this->_transactionReference);
|
1304 |
+
|
1305 |
+
// append order information
|
1306 |
+
$order = $this->_getOrder();
|
1307 |
+
if ($order instanceof Mage_Sales_Model_Order) {
|
1308 |
+
$emailModel
|
1309 |
+
->addItem('Order ID', $order->getId())
|
1310 |
+
->addItem('Order Increment ID', $order->getIncrementId())
|
1311 |
+
->addItem(
|
1312 |
+
'Order Link',
|
1313 |
+
Mage::getUrl(
|
1314 |
+
'adminhtml/sales_order/view',
|
1315 |
+
array('_forced_secure' => true, 'order_id' => $order->getId())
|
1316 |
+
)
|
1317 |
+
)
|
1318 |
+
->addItem(
|
1319 |
+
'Customer Name',
|
1320 |
+
$order->getCustomerFirstname() . ' ' . $order->getCustomerLastname()
|
1321 |
+
)
|
1322 |
+
->addItem('Customer Email', $order->getCustomerEmail());
|
1323 |
+
} else {
|
1324 |
+
$emailModel->addItem('Order Information', 'Unavailable');
|
1325 |
+
}
|
1326 |
+
|
1327 |
+
// send the email
|
1328 |
+
$emailModel->sendCritical();
|
1329 |
+
|
1330 |
+
return $this;
|
1331 |
+
}
|
1332 |
+
|
1333 |
+
/**
|
1334 |
+
* Retrieve the callback redirect url.
|
1335 |
+
*
|
1336 |
+
* @param string $redirectUrl
|
1337 |
+
* @return string
|
1338 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1339 |
+
*/
|
1340 |
+
protected function _getCallbackRedirectUrl($redirectUrl)
|
1341 |
+
{
|
1342 |
+
// we do not always have an adapter at this point
|
1343 |
+
try {
|
1344 |
+
$adapter = $this->getAdapter();
|
1345 |
+
} catch (Exception $e) {
|
1346 |
+
// no adapter defined
|
1347 |
+
$adapter = null;
|
1348 |
+
}
|
1349 |
+
|
1350 |
+
/**
|
1351 |
+
* @todo use iframe or not is a config option for the payment method,
|
1352 |
+
* it doesn't actaully belong in the adapter (or service for that matter).
|
1353 |
+
*/
|
1354 |
+
|
1355 |
+
// if no adapter, assume they used iFrame so we always get a redirect
|
1356 |
+
if (is_null($adapter) || $adapter->getIsUseIframe()) {
|
1357 |
+
$callbackRedirectUrl = Mage::getUrl(
|
1358 |
+
'ampersand_paymentgateway/redirect/location',
|
1359 |
+
array('_forced_secure' => true)
|
1360 |
+
);
|
1361 |
+
|
1362 |
+
// we have to append this as a query string due to the value being a URL
|
1363 |
+
if (strpos($callbackRedirectUrl, '?') !== FALSE) {
|
1364 |
+
$callbackRedirectUrl .= '&';
|
1365 |
+
} else {
|
1366 |
+
$callbackRedirectUrl .= '?';
|
1367 |
+
}
|
1368 |
+
$callbackRedirectUrl .= 'redirect_url=' . $redirectUrl;
|
1369 |
+
} else {
|
1370 |
+
$callbackRedirectUrl = $redirectUrl;
|
1371 |
+
}
|
1372 |
+
|
1373 |
+
return $callbackRedirectUrl;
|
1374 |
+
}
|
1375 |
+
|
1376 |
+
/**
|
1377 |
+
* Whether to redirect the customer after the payment gateway callback.
|
1378 |
+
* If this is set to false, the redirect url will be passed back to the callback message.
|
1379 |
+
*
|
1380 |
+
* @return bool
|
1381 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1382 |
+
*/
|
1383 |
+
protected function _isSetControllerRedirect()
|
1384 |
+
{
|
1385 |
+
/**
|
1386 |
+
* @todo this has nothing to do with service, should be a payment method option
|
1387 |
+
*/
|
1388 |
+
|
1389 |
+
return true;
|
1390 |
+
}
|
1391 |
+
|
1392 |
+
/**
|
1393 |
+
* Retrieve the URL for redirecting a failed transaction.
|
1394 |
+
*
|
1395 |
+
* @return string
|
1396 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1397 |
+
*/
|
1398 |
+
protected function _getRedirectFailureUrl($failureType = self::FAILURE_TYPE_ERROR, $errorCode = null)
|
1399 |
+
{
|
1400 |
+
return Mage::getUrl(
|
1401 |
+
'ampersand_paymentgateway/checkout_onepage/failure',
|
1402 |
+
array(
|
1403 |
+
'_forced_secure' => true,
|
1404 |
+
)
|
1405 |
+
);
|
1406 |
+
}
|
1407 |
+
|
1408 |
+
/**
|
1409 |
+
* Retrieve the URL for redirecting a successful transaction.
|
1410 |
+
*
|
1411 |
+
* @return string
|
1412 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1413 |
+
*/
|
1414 |
+
protected function _getRedirectSuccessUrl()
|
1415 |
+
{
|
1416 |
+
return Mage::getUrl(
|
1417 |
+
'checkout/onepage/success',
|
1418 |
+
array(
|
1419 |
+
'_forced_secure' => true,
|
1420 |
+
)
|
1421 |
+
);
|
1422 |
+
}
|
1423 |
+
|
1424 |
+
/**
|
1425 |
+
* Retrieve the last message id, first checking for a valid object from getLastMessageDebug().
|
1426 |
+
*
|
1427 |
+
* @return string
|
1428 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1429 |
+
*/
|
1430 |
+
public function getLastMessageId()
|
1431 |
+
{
|
1432 |
+
$lastMessageDebug = $this->getLastMessageDebug();
|
1433 |
+
if (!$lastMessageDebug instanceof Ampersand_Integration_Debug_DebugInterface) {
|
1434 |
+
return null;
|
1435 |
+
}
|
1436 |
+
|
1437 |
+
return $lastMessageDebug->getMessageId();
|
1438 |
+
}
|
1439 |
+
|
1440 |
+
/**
|
1441 |
+
* Set the transaction type.
|
1442 |
+
*
|
1443 |
+
* @param string $transactionType
|
1444 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1445 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1446 |
+
*/
|
1447 |
+
public function setTransactionType($transactionType)
|
1448 |
+
{
|
1449 |
+
if (!in_array($transactionType, $this->_allowedTransactionTypes)) {
|
1450 |
+
throw new Exception("Invalid transaction type: {$transactionType}");
|
1451 |
+
}
|
1452 |
+
|
1453 |
+
$this->_transactionType = $transactionType;
|
1454 |
+
|
1455 |
+
return $this;
|
1456 |
+
}
|
1457 |
+
|
1458 |
+
/**
|
1459 |
+
* Retrieve the transaction type.
|
1460 |
+
*
|
1461 |
+
* @return string
|
1462 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1463 |
+
*/
|
1464 |
+
public function getTransactionType()
|
1465 |
+
{
|
1466 |
+
return $this->_transactionType;
|
1467 |
+
}
|
1468 |
+
|
1469 |
+
/**
|
1470 |
+
* Set the transaction reference.
|
1471 |
+
*
|
1472 |
+
* @param string $transactionReference
|
1473 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1474 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1475 |
+
*/
|
1476 |
+
public function setTransactionReference($transactionReference)
|
1477 |
+
{
|
1478 |
+
if (!$transactionReference) {
|
1479 |
+
throw new Exception('Transaction reference not provided.');
|
1480 |
+
}
|
1481 |
+
|
1482 |
+
if ($this->_transactionReference && $transactionReference != $this->_transactionReference) {
|
1483 |
+
throw new Exception('Transaction reference already set.');
|
1484 |
+
}
|
1485 |
+
|
1486 |
+
$this->_transactionReference = $transactionReference;
|
1487 |
+
|
1488 |
+
return $this;
|
1489 |
+
}
|
1490 |
+
|
1491 |
+
/**
|
1492 |
+
* Retrieve the transaction reference.
|
1493 |
+
*
|
1494 |
+
* @return string
|
1495 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1496 |
+
*/
|
1497 |
+
public function getTransactionReference()
|
1498 |
+
{
|
1499 |
+
if ($this->_transactionReference == '') {
|
1500 |
+
throw new Exception('Transaction reference not set.');
|
1501 |
+
}
|
1502 |
+
|
1503 |
+
return $this->_transactionReference;
|
1504 |
+
}
|
1505 |
+
|
1506 |
+
/**
|
1507 |
+
* Store the payment method instance against this service so it can be accessed elsewhere.
|
1508 |
+
*
|
1509 |
+
* @param Mage_Payment_Model_Method_Abstract $payment
|
1510 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1511 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1512 |
+
*/
|
1513 |
+
public function setMethodInstance(Mage_Payment_Model_Method_Abstract $methodInstance)
|
1514 |
+
{
|
1515 |
+
if (!$methodInstance instanceof Mage_Payment_Model_Method_Abstract) {
|
1516 |
+
throw new Exception('Invalid payment method instance provided.');
|
1517 |
+
}
|
1518 |
+
|
1519 |
+
$this->_methodInstance = $methodInstance;
|
1520 |
+
|
1521 |
+
return $this;
|
1522 |
+
}
|
1523 |
+
|
1524 |
+
/**
|
1525 |
+
* Retrieve the payment method instance stored against this service.
|
1526 |
+
*
|
1527 |
+
* @return Mage_Payment_Model_Method_Abstract
|
1528 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1529 |
+
*/
|
1530 |
+
public function getMethodInstance()
|
1531 |
+
{
|
1532 |
+
return $this->_methodInstance;
|
1533 |
+
}
|
1534 |
+
|
1535 |
+
/**
|
1536 |
+
* Retrieve the Payment Gateway adapter.
|
1537 |
+
*
|
1538 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1539 |
+
*/
|
1540 |
+
public function getAdapter()
|
1541 |
+
{
|
1542 |
+
$transactionType = $this->getTransactionType();
|
1543 |
+
if (empty($transactionType)) {
|
1544 |
+
throw new Exception('Transaction type not set.');
|
1545 |
+
}
|
1546 |
+
|
1547 |
+
if (!array_key_exists($transactionType, $this->_adapter)
|
1548 |
+
|| is_null($this->_adapter[$transactionType]))
|
1549 |
+
{
|
1550 |
+
$this->_adapter[$transactionType] = $this->_getAdapter($transactionType);
|
1551 |
+
if (is_null($this->_adapter[$transactionType])) {
|
1552 |
+
throw new Exception("Adapter not found for transaction type '{$transactionType}'.");
|
1553 |
+
}
|
1554 |
+
}
|
1555 |
+
|
1556 |
+
return $this->_adapter[$transactionType];
|
1557 |
+
}
|
1558 |
+
|
1559 |
+
/**
|
1560 |
+
* Implement this method to retrieve the Payment Gateway adapter with getAdapter().
|
1561 |
+
* This adapter must implement Ampersand_PaymentGateway_Model_Adapter_Interface.
|
1562 |
+
*
|
1563 |
+
* @param string $transactionType
|
1564 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1565 |
+
*/
|
1566 |
+
abstract protected function _getAdapter($transactionType);
|
1567 |
+
|
1568 |
+
/**
|
1569 |
+
* Store the payment object against this service so it can be accessed elsewhere.
|
1570 |
+
*
|
1571 |
+
* @param Varien_Object $payment
|
1572 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1573 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1574 |
+
*/
|
1575 |
+
protected function _setPayment(Varien_Object $payment)
|
1576 |
+
{
|
1577 |
+
$this->_payment = $payment;
|
1578 |
+
$this->getAdapter()->setPayment($payment);
|
1579 |
+
|
1580 |
+
return $this;
|
1581 |
+
}
|
1582 |
+
|
1583 |
+
/**
|
1584 |
+
* Retrieve the payment object stored against this service.
|
1585 |
+
*
|
1586 |
+
* @return Varien_Object
|
1587 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1588 |
+
*/
|
1589 |
+
protected function _getPayment()
|
1590 |
+
{
|
1591 |
+
return $this->_payment;
|
1592 |
+
}
|
1593 |
+
|
1594 |
+
/**
|
1595 |
+
* Store the order object against this service so it can be accessed elsewhere.
|
1596 |
+
*
|
1597 |
+
* @param Varien_Object $order
|
1598 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1599 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1600 |
+
*/
|
1601 |
+
protected function _setOrder(Varien_Object $order)
|
1602 |
+
{
|
1603 |
+
$this->_order = $order;
|
1604 |
+
$this->getAdapter()->setOrder($order);
|
1605 |
+
|
1606 |
+
return $this;
|
1607 |
+
}
|
1608 |
+
|
1609 |
+
/**
|
1610 |
+
* Retrieve the order object stored against this service.
|
1611 |
+
*
|
1612 |
+
* @return Varien_Object
|
1613 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1614 |
+
*/
|
1615 |
+
protected function _getOrder()
|
1616 |
+
{
|
1617 |
+
return $this->_order;
|
1618 |
+
}
|
1619 |
+
|
1620 |
+
/**
|
1621 |
+
* Store the response object against this service so it can be accessed elsewhere.
|
1622 |
+
*
|
1623 |
+
* @param Varien_Object $order
|
1624 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1625 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1626 |
+
*/
|
1627 |
+
protected function _setResponse(Varien_Object $response)
|
1628 |
+
{
|
1629 |
+
$this->_response = $response;
|
1630 |
+
$this->getAdapter()->setResponse($response);
|
1631 |
+
|
1632 |
+
return $this;
|
1633 |
+
}
|
1634 |
+
|
1635 |
+
/**
|
1636 |
+
* Retrieve the response object stored against this service.
|
1637 |
+
*
|
1638 |
+
* @return Varien_Object
|
1639 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1640 |
+
*/
|
1641 |
+
protected function _getResponse()
|
1642 |
+
{
|
1643 |
+
return $this->_response;
|
1644 |
+
}
|
1645 |
+
|
1646 |
+
/**
|
1647 |
+
* Store the reference transaction object against this service so it can be accessed elsewhere.
|
1648 |
+
*
|
1649 |
+
* @param Ampersand_PaymentGateway_Model_Transaction $transaction
|
1650 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
1651 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1652 |
+
*/
|
1653 |
+
protected function _setTransaction(Ampersand_PaymentGateway_Model_Transaction $transaction)
|
1654 |
+
{
|
1655 |
+
$this->_transaction = $transaction;
|
1656 |
+
$this->getAdapter()->setTransaction($transaction);
|
1657 |
+
|
1658 |
+
return $this;
|
1659 |
+
}
|
1660 |
+
|
1661 |
+
/**
|
1662 |
+
* Retrieve the reference transaction object stored against this service.
|
1663 |
+
*
|
1664 |
+
* @return Ampersand_PaymentGateway_Model_Transaction
|
1665 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1666 |
+
*/
|
1667 |
+
protected function _getTransaction()
|
1668 |
+
{
|
1669 |
+
return $this->_transaction;
|
1670 |
+
}
|
1671 |
+
|
1672 |
+
/**
|
1673 |
+
* Store the debug object against this service so it can be accessed elsewhere.
|
1674 |
+
*
|
1675 |
+
* @param Ampersand_Integration_Debug_DebugInterface $debug
|
1676 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1677 |
+
*/
|
1678 |
+
protected function _setDebug(Ampersand_Integration_Debug_DebugInterface $debug)
|
1679 |
+
{
|
1680 |
+
$this->_debug = $debug;
|
1681 |
+
$this->getAdapter()->setDebug($debug);
|
1682 |
+
}
|
1683 |
+
|
1684 |
+
/**
|
1685 |
+
* Retrieve the debug object stored against this service.
|
1686 |
+
*
|
1687 |
+
* @return Ampersand_Integration_Debug_DebugInterface
|
1688 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1689 |
+
*/
|
1690 |
+
protected function _getDebug()
|
1691 |
+
{
|
1692 |
+
return $this->_debug;
|
1693 |
+
}
|
1694 |
+
|
1695 |
+
/**
|
1696 |
+
* Retrieve the current customer.
|
1697 |
+
*
|
1698 |
+
* @return Mage_Customer_Model_Customer
|
1699 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1700 |
+
*/
|
1701 |
+
protected function _getCustomer()
|
1702 |
+
{
|
1703 |
+
return Mage::getSingleton('customer/session')->getCustomer();
|
1704 |
+
}
|
1705 |
+
|
1706 |
+
/**
|
1707 |
+
* Retrieve the Payment Gateway helper.
|
1708 |
+
*
|
1709 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
1710 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1711 |
+
*/
|
1712 |
+
protected function _getHelper()
|
1713 |
+
{
|
1714 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
1715 |
+
}
|
1716 |
+
|
1717 |
+
/**
|
1718 |
+
* Retrieve the Payment Gateway subscription helper.
|
1719 |
+
*
|
1720 |
+
* @return Ampersand_PaymentGateway_Helper_Subscroiption
|
1721 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1722 |
+
*/
|
1723 |
+
protected function _getSubscriptionHelper()
|
1724 |
+
{
|
1725 |
+
return Mage::helper('ampersand_paymentgateway/subscription');
|
1726 |
+
}
|
1727 |
+
|
1728 |
+
/**
|
1729 |
+
* Retrieve the checkout session.
|
1730 |
+
*
|
1731 |
+
* @return Mage_Checkout_Model_Session
|
1732 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
1733 |
+
*/
|
1734 |
+
protected function _getSession()
|
1735 |
+
{
|
1736 |
+
return Mage::getSingleton('checkout/session');
|
1737 |
+
}
|
1738 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Service/Direct/AgreementAbstract.php
ADDED
@@ -0,0 +1,187 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
abstract class Ampersand_PaymentGateway_Model_Service_Direct_AgreementAbstract
|
3 |
+
extends Ampersand_PaymentGateway_Model_Service_DirectAbstract
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* This method is only ever called from
|
7 |
+
* Mage_Sales_Billing_AgreementController::startWizardAction
|
8 |
+
*
|
9 |
+
* When using the Wizard, this method is called to define the redirect URL that the customer
|
10 |
+
* will be sent to in order to create a new billing token.
|
11 |
+
*
|
12 |
+
* For direct we should redirect to our own controller for collecting card details.
|
13 |
+
* For redirect we can forward the customer on to the payment gateway.
|
14 |
+
*
|
15 |
+
* The end of the process should be a post with the payment_method and token to
|
16 |
+
* Mage_Sales_Billing_AgreementController::returnWizardAction
|
17 |
+
*
|
18 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
19 |
+
* @return Ampersand_PaymentGateway_Model_Service_Direct_AgreementAbstract
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function initBillingAgreementToken(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
23 |
+
{
|
24 |
+
return $this;
|
25 |
+
|
26 |
+
// $api = $this->_pro->getApi()
|
27 |
+
// ->setReturnUrl($agreement->getReturnUrl())
|
28 |
+
// ->setCancelUrl($agreement->getCancelUrl())
|
29 |
+
// ->setBillingType($this->_pro->getApi()->getBillingAgreementType());
|
30 |
+
//
|
31 |
+
// $api->callSetCustomerBillingAgreement();
|
32 |
+
// $agreement->setRedirectUrl(
|
33 |
+
// $this->_pro->getConfig()->getStartBillingAgreementUrl($api->getToken())
|
34 |
+
// );
|
35 |
+
// return $this;
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Don't really see the point of this method, since placeBillingAgreement() is
|
40 |
+
* called immediately afterwards, we might as well put all of our logic in there...
|
41 |
+
*
|
42 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
43 |
+
* @return Ampersand_PaymentGateway_Model_Service_Direct_AgreementAbstract
|
44 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
45 |
+
*/
|
46 |
+
public function getBillingAgreementTokenInfo(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
47 |
+
{
|
48 |
+
return $this;
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Create a billing agreement with the payment gateway.
|
53 |
+
*
|
54 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
55 |
+
* @return Ampersand_PaymentGateway_Model_Service_Direct_AgreementAbstract
|
56 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
57 |
+
*/
|
58 |
+
public function placeBillingAgreement(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
59 |
+
{
|
60 |
+
$this->_setTransactionType();
|
61 |
+
$this->getAdapter()->setPayment($agreement->getPayment());
|
62 |
+
|
63 |
+
try {
|
64 |
+
$this->getAdapter()->prepareBillingAgreementRequest();
|
65 |
+
$this->_processServiceMessages();
|
66 |
+
$this->_saveBillingAgreement($agreement);
|
67 |
+
} catch (Exception $e) {
|
68 |
+
// retrieve custom exception message if available
|
69 |
+
if ($methodException = $this->_getMethodException($e)) {
|
70 |
+
$e = $methodException;
|
71 |
+
}
|
72 |
+
|
73 |
+
// create a flag against the message
|
74 |
+
$this->_updateMessageForFailure($e);
|
75 |
+
|
76 |
+
// re-throw
|
77 |
+
throw $e;
|
78 |
+
}
|
79 |
+
|
80 |
+
return $this;
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Cancel a billing agreement.
|
85 |
+
*
|
86 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
87 |
+
* @return Ampersand_PaymentGateway_Model_Service_Direct_AgreementAbstract
|
88 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
89 |
+
*/
|
90 |
+
public function cancelBillingAgreement(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
91 |
+
{
|
92 |
+
$this->_setTransactionType();
|
93 |
+
|
94 |
+
// retrieve the additional information for this agreement
|
95 |
+
$ampersandAgreement = Mage::getModel('ampersand_paymentgateway/agreement')
|
96 |
+
->loadByReferenceId($agreement->getMethodCode(), $agreement->getReferenceId());
|
97 |
+
$this->getAdapter()->setAgreement($ampersandAgreement);
|
98 |
+
|
99 |
+
try {
|
100 |
+
$this->getAdapter()->prepareBillingAgreementCancel();
|
101 |
+
$this->_processServiceMessages();
|
102 |
+
} catch (Exception $e) {
|
103 |
+
// retrieve custom exception message if available
|
104 |
+
if ($methodException = $this->_getMethodException($e)) {
|
105 |
+
$e = $methodException;
|
106 |
+
}
|
107 |
+
|
108 |
+
// create a flag against the message
|
109 |
+
$this->_updateMessageForFailure($e);
|
110 |
+
|
111 |
+
// re-throw
|
112 |
+
throw $e;
|
113 |
+
}
|
114 |
+
|
115 |
+
return $this;
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Save the billing agreement data for use in future transactions,
|
120 |
+
* linked to the Magento billing agreement by a unique reference ID.
|
121 |
+
*
|
122 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
123 |
+
* @return Ampersand_PaymentGateway_Model_Service_Direct_AgreementAbstract
|
124 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
125 |
+
*/
|
126 |
+
protected function _saveBillingAgreement(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
127 |
+
{
|
128 |
+
$this->_setTransactionType();
|
129 |
+
|
130 |
+
$agreement->setBillingAgreementId($this->_generateBillingAgreementId($agreement));
|
131 |
+
|
132 |
+
Mage::getModel('ampersand_paymentgateway/agreement')
|
133 |
+
->setServiceCode($agreement->getMethodCode())
|
134 |
+
->setReferenceId($agreement->getBillingAgreementId())
|
135 |
+
->setCustomerId($agreement->getCustomer()->getId())
|
136 |
+
->setStoreId($agreement->getStoreId())
|
137 |
+
->setAdditionalInformation($this->getAdapter()->getBillingAgreementCredentials())
|
138 |
+
->setCardType($agreement->getPayment()->getCcType())
|
139 |
+
->setCardLastFour($agreement->getPayment()->getCcLast4())
|
140 |
+
->setCardExpiryMonth(str_pad($agreement->getPayment()->getCcExpMonth(), 2, 0, STR_PAD_LEFT))
|
141 |
+
->setCardExpiryYear($agreement->getPayment()->getCcExpYear())
|
142 |
+
->save();
|
143 |
+
|
144 |
+
return $this;
|
145 |
+
}
|
146 |
+
|
147 |
+
/**
|
148 |
+
* Generate a unique billing agreemend reference for a customer and card combination.
|
149 |
+
* The maximum length of the billing agreement ID is 32 characters.
|
150 |
+
*
|
151 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
152 |
+
* @return string
|
153 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
154 |
+
*/
|
155 |
+
protected function _generateBillingAgreementId(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
156 |
+
{
|
157 |
+
/**
|
158 |
+
* @todo
|
159 |
+
* - remove the stars as they are irrelevant
|
160 |
+
* - crossover here between direct and redirect.
|
161 |
+
* - this should also be available to be used as externally (eg. for Realex) ?
|
162 |
+
*/
|
163 |
+
$payment = $agreement->getPayment();
|
164 |
+
|
165 |
+
$billingAgreementId = time() . '-';
|
166 |
+
$billingAgreementId .= '****' . $payment->getCcLast4() . '-';
|
167 |
+
$billingAgreementId .= str_pad($payment->getCcExpMonth(), 2, '0', STR_PAD_LEFT) . '-';
|
168 |
+
$billingAgreementId .= $payment->getCcExpYear();
|
169 |
+
|
170 |
+
return $billingAgreementId;
|
171 |
+
}
|
172 |
+
|
173 |
+
/**
|
174 |
+
* Set the current transaction type for creating a new agreement.
|
175 |
+
*
|
176 |
+
* @return Ampersand_PaymentGateway_Model_Service_Direct_AgreementAbstract
|
177 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
178 |
+
*/
|
179 |
+
public function _setTransactionType()
|
180 |
+
{
|
181 |
+
$this->setTransactionType(
|
182 |
+
Ampersand_PaymentGateway_Model_Service_Abstract::TRANSACTION_TYPE_AGREEMENT_MANAGE
|
183 |
+
);
|
184 |
+
|
185 |
+
return $this;
|
186 |
+
}
|
187 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Service/DirectAbstract.php
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
abstract class Ampersand_PaymentGateway_Model_Service_DirectAbstract
|
3 |
+
extends Ampersand_PaymentGateway_Model_Service_Abstract
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* If the Payment Gateway requires a redirect to complete the transaction, collect the
|
7 |
+
* required information from the adapter and set the redirect URL to the appropriate value.
|
8 |
+
*
|
9 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
10 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
11 |
+
*/
|
12 |
+
protected function _processRegisterRedirect()
|
13 |
+
{
|
14 |
+
if (!$this->getAdapter()->isThreedSecureRequired()) {
|
15 |
+
return $this;
|
16 |
+
}
|
17 |
+
|
18 |
+
$md = $this->getAdapter()->getMd();
|
19 |
+
$acsUrl = $this->getAdapter()->getAcsUrl();
|
20 |
+
$pareq = $this->getAdapter()->getPareq();
|
21 |
+
|
22 |
+
if (!$md || !$acsUrl || !$pareq) {
|
23 |
+
throw new Exception($this->_getHelper()
|
24 |
+
->__('Payment failed. Invalid 3D Secure information returned by Gateway.'));
|
25 |
+
}
|
26 |
+
|
27 |
+
// save a transaction reference so we can access the payment upon callback
|
28 |
+
$this->_saveTransactionReference();
|
29 |
+
|
30 |
+
// set the payment to pending in Magento, awaiting an accept or deny response
|
31 |
+
$this->_getPayment()->setIsTransactionPending(true);
|
32 |
+
|
33 |
+
// prepare 3D Secure redirect
|
34 |
+
$threedSecureData = array(
|
35 |
+
'MD' => $md,
|
36 |
+
'PaReq' => $pareq,
|
37 |
+
'TermUrl' => $this->_buildTermUrl($this->getAdapter()->getTermUrlMessageName()),
|
38 |
+
);
|
39 |
+
$this->_processRedirect($acsUrl, $threedSecureData);
|
40 |
+
|
41 |
+
return $this;
|
42 |
+
}
|
43 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Service/Redirect/AgreementAbstract.php
ADDED
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
abstract class Ampersand_PaymentGateway_Model_Service_Redirect_AgreementAbstract
|
3 |
+
extends Ampersand_PaymentGateway_Model_Service_RedirectAbstract
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* This method is only ever called from
|
7 |
+
* Mage_Sales_Billing_AgreementController::startWizardAction
|
8 |
+
*
|
9 |
+
* When using the Wizard, this method is called to define the redirect URL that the customer
|
10 |
+
* will be sent to in order to create a new billing token.
|
11 |
+
*
|
12 |
+
* For direct we should redirect to our own controller for collecting card details.
|
13 |
+
* For redirect we can forward the customer on to the payment gateway.
|
14 |
+
*
|
15 |
+
* The end of the process should be a post with the payment_method and token to
|
16 |
+
* Mage_Sales_Billing_AgreementController::returnWizardAction
|
17 |
+
*
|
18 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
19 |
+
* @return Ampersand_PaymentGateway_Model_Service_Redirect_AgreementAbstract
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function initBillingAgreementToken(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
23 |
+
{
|
24 |
+
return $this;
|
25 |
+
|
26 |
+
// $api = $this->_pro->getApi()
|
27 |
+
// ->setReturnUrl($agreement->getReturnUrl())
|
28 |
+
// ->setCancelUrl($agreement->getCancelUrl())
|
29 |
+
// ->setBillingType($this->_pro->getApi()->getBillingAgreementType());
|
30 |
+
//
|
31 |
+
// $api->callSetCustomerBillingAgreement();
|
32 |
+
// $agreement->setRedirectUrl(
|
33 |
+
// $this->_pro->getConfig()->getStartBillingAgreementUrl($api->getToken())
|
34 |
+
// );
|
35 |
+
// return $this;
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Don't really see the point of this method, since placeBillingAgreement() is
|
40 |
+
* called immediately afterwards, we might as well put all of our logic in there...
|
41 |
+
*
|
42 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
43 |
+
* @return Ampersand_PaymentGateway_Model_Service_Redirect_AgreementAbstract
|
44 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
45 |
+
*/
|
46 |
+
public function getBillingAgreementTokenInfo(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
47 |
+
{
|
48 |
+
return $this;
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Create a billing agreement with the payment gateway.
|
53 |
+
*
|
54 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
55 |
+
* @return Ampersand_PaymentGateway_Model_Service_Redirect_AgreementAbstract
|
56 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
57 |
+
*/
|
58 |
+
public function placeBillingAgreement(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
59 |
+
{
|
60 |
+
$this->_setTransactionType();
|
61 |
+
$this->getAdapter()->setPayment($agreement->getPayment());
|
62 |
+
|
63 |
+
try {
|
64 |
+
$this->getAdapter()->prepareBillingAgreementRequest();
|
65 |
+
$this->_processServiceMessages();
|
66 |
+
$this->_saveBillingAgreement($agreement);
|
67 |
+
} catch (Exception $e) {
|
68 |
+
// retrieve custom exception message if available
|
69 |
+
if ($methodException = $this->_getMethodException($e)) {
|
70 |
+
$e = $methodException;
|
71 |
+
}
|
72 |
+
|
73 |
+
// create a flag against the message
|
74 |
+
$this->_updateMessageForFailure($e);
|
75 |
+
|
76 |
+
// re-throw
|
77 |
+
throw $e;
|
78 |
+
}
|
79 |
+
|
80 |
+
return $this;
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Cancel a billing agreement.
|
85 |
+
*
|
86 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
87 |
+
* @return Ampersand_PaymentGateway_Model_Service_Redirect_AgreementAbstract
|
88 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
89 |
+
*/
|
90 |
+
public function cancelBillingAgreement(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
91 |
+
{
|
92 |
+
$this->_setTransactionType();
|
93 |
+
|
94 |
+
// retrieve the additional information for this agreement
|
95 |
+
$ampersandAgreement = Mage::getModel('ampersand_paymentgateway/agreement')
|
96 |
+
->loadByReferenceId($agreement->getMethodCode(), $agreement->getReferenceId());
|
97 |
+
$this->getAdapter()->setAgreement($ampersandAgreement);
|
98 |
+
|
99 |
+
$this->getAdapter()->prepareBillingAgreementCancel();
|
100 |
+
$this->_processServiceMessages();
|
101 |
+
|
102 |
+
return $this;
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Save the billing agreement data for use in future transactions,
|
107 |
+
* linked to the Magento billing agreement by a unique reference ID.
|
108 |
+
*
|
109 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
110 |
+
* @return Ampersand_PaymentGateway_Model_Service_Redirect_AgreementAbstract
|
111 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
112 |
+
*/
|
113 |
+
protected function _saveBillingAgreement(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
114 |
+
{
|
115 |
+
$this->_setTransactionType();
|
116 |
+
|
117 |
+
$agreement->setBillingAgreementId($this->_generateBillingAgreementId($agreement));
|
118 |
+
|
119 |
+
Mage::getModel('ampersand_paymentgateway/agreement')
|
120 |
+
->setServiceCode($agreement->getMethodCode())
|
121 |
+
->setReferenceId($agreement->getBillingAgreementId())
|
122 |
+
->setCustomerId($agreement->getCustomer()->getId())
|
123 |
+
->setStoreId($agreement->getStoreId())
|
124 |
+
->setAdditionalInformation($this->getAdapter()->getBillingAgreementCredentials())
|
125 |
+
->setCardType($agreement->getPayment()->getCcType())
|
126 |
+
->setCardLastFour($agreement->getPayment()->getCcLast4())
|
127 |
+
->setCardExpiryMonth(str_pad($agreement->getPayment()->getCcExpMonth(), 2, 0, STR_PAD_LEFT))
|
128 |
+
->setCardExpiryYear($agreement->getPayment()->getCcExpYear())
|
129 |
+
->save();
|
130 |
+
|
131 |
+
return $this;
|
132 |
+
}
|
133 |
+
|
134 |
+
/**
|
135 |
+
* Generate a unique billing agreemend reference for a customer and card combination.
|
136 |
+
* The maximum length of the billing agreement ID is 32 characters.
|
137 |
+
*
|
138 |
+
* @param Mage_Payment_Model_Billing_AgreementAbstract $agreement
|
139 |
+
* @return string
|
140 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
141 |
+
*/
|
142 |
+
protected function _generateBillingAgreementId(Mage_Payment_Model_Billing_AgreementAbstract $agreement)
|
143 |
+
{
|
144 |
+
/**
|
145 |
+
* @todo
|
146 |
+
* - remove the stars as they are irrelevant
|
147 |
+
* - crossover here between direct and redirect.
|
148 |
+
* - this should also be available to be used as externally (eg. for Realex) ?
|
149 |
+
*/
|
150 |
+
$payment = $agreement->getPayment();
|
151 |
+
|
152 |
+
$billingAgreementId = time() . '-';
|
153 |
+
$billingAgreementId .= '****' . $payment->getCcLast4() . '-';
|
154 |
+
$billingAgreementId .= str_pad($payment->getCcExpMonth(), 2, '0', STR_PAD_LEFT) . '-';
|
155 |
+
$billingAgreementId .= $payment->getCcExpYear();
|
156 |
+
|
157 |
+
return $billingAgreementId;
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* Set the current transaction type for creating a new agreement.
|
162 |
+
*
|
163 |
+
* @return Ampersand_PaymentGateway_Model_Service_Redirect_AgreementAbstract
|
164 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
165 |
+
*/
|
166 |
+
public function _setTransactionType()
|
167 |
+
{
|
168 |
+
$this->setTransactionType(
|
169 |
+
Ampersand_PaymentGateway_Model_Service_Abstract::TRANSACTION_TYPE_AGREEMENT_MANAGE
|
170 |
+
);
|
171 |
+
|
172 |
+
return $this;
|
173 |
+
}
|
174 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Service/RedirectAbstract.php
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
abstract class Ampersand_PaymentGateway_Model_Service_RedirectAbstract
|
3 |
+
extends Ampersand_PaymentGateway_Model_Service_Abstract
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* If the Payment Gateway requires a redirect to complete the transaction, collect the
|
7 |
+
* required information from the adapter and set the redirect URL to the appropriate value.
|
8 |
+
*
|
9 |
+
* @return Ampersand_PaymentGateway_Model_Service_Abstract
|
10 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
11 |
+
*/
|
12 |
+
protected function _processRegisterRedirect()
|
13 |
+
{
|
14 |
+
$redirectUrl = $this->getAdapter()->getRedirectUrl();
|
15 |
+
|
16 |
+
$redirectData = array_merge(
|
17 |
+
$this->_transformRedirectData(),
|
18 |
+
$this->_getPayment()->getTermUrlData()
|
19 |
+
);
|
20 |
+
$this->getAdapter()->setTransformedRedirectData($redirectData);
|
21 |
+
|
22 |
+
if (!$redirectUrl || empty($redirectData)) {
|
23 |
+
throw new Exception($this->_getHelper()->__('Insufficient redirect data provided.'));
|
24 |
+
}
|
25 |
+
|
26 |
+
// save a transaction reference so we can access the payment upon callback
|
27 |
+
$this->_saveTransactionReference();
|
28 |
+
|
29 |
+
// set the payment to pending in Magento, awaiting an accept or deny response
|
30 |
+
$this->_getPayment()->setIsTransactionPending(true);
|
31 |
+
|
32 |
+
// prepare redirect to payment gateway
|
33 |
+
$this->_processRedirect($redirectUrl, $redirectData);
|
34 |
+
|
35 |
+
return $this;
|
36 |
+
}
|
37 |
+
|
38 |
+
protected function _transformRedirectData()
|
39 |
+
{
|
40 |
+
$nodeName = $this->getAdapter()->getTransformRedirectDataNodeName();
|
41 |
+
if ($nodeName == '') {
|
42 |
+
return array();
|
43 |
+
}
|
44 |
+
|
45 |
+
$messageXml = Mage::getSingleton('ampersand_integration/config')->getTypesXml('outgoing');
|
46 |
+
|
47 |
+
$mapConfig = new Ampersand_Map_Config();
|
48 |
+
$mapConfig->addXml($messageXml)
|
49 |
+
->setNodeToMap($this->getServiceCode() . ':' . $nodeName);
|
50 |
+
|
51 |
+
$result = Ampersand_Map::map($mapConfig, $this->_getPayment());
|
52 |
+
$mappedXml = $result->getOutput();
|
53 |
+
|
54 |
+
$transformedRedirectData = Ampersand_Render::renderArray($mappedXml);
|
55 |
+
|
56 |
+
return $transformedRedirectData;
|
57 |
+
}
|
58 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Source/AgreementMethod.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Source_AgreementMethod
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Allowed billing agreement methods.
|
6 |
+
*
|
7 |
+
* @var array $_allowedMethods
|
8 |
+
*/
|
9 |
+
protected $_allowedMethods = array();
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Retrieve the options.
|
13 |
+
*
|
14 |
+
* @return array
|
15 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
16 |
+
*/
|
17 |
+
public function toOptionArray()
|
18 |
+
{
|
19 |
+
$options = array(
|
20 |
+
array(
|
21 |
+
'value' => '',
|
22 |
+
'label' => 'None',
|
23 |
+
),
|
24 |
+
);
|
25 |
+
|
26 |
+
if (!Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()) {
|
27 |
+
return $options;
|
28 |
+
}
|
29 |
+
|
30 |
+
foreach (Mage::helper('payment')->getAllBillingAgreementMethods() as $_code => $_name) {
|
31 |
+
if (empty($this->_allowedMethods)
|
32 |
+
|| in_array($_code, $this->_allowedMethods)) {
|
33 |
+
$options[] = array(
|
34 |
+
'value' => $_code,
|
35 |
+
'label' => $_name
|
36 |
+
);
|
37 |
+
}
|
38 |
+
}
|
39 |
+
|
40 |
+
return $options;
|
41 |
+
}
|
42 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Source/CardType.php
ADDED
@@ -0,0 +1,97 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Source_CardType extends Mage_Payment_Model_Source_Cctype
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Gateway supported credit cards.
|
6 |
+
* The key : value pairs are Magento Code : Gateway Code.
|
7 |
+
*
|
8 |
+
* @var array $_supportedCcTypes
|
9 |
+
*/
|
10 |
+
protected $_supportedCcTypes = array(
|
11 |
+
'AE' => 'American Express',
|
12 |
+
'VI' => 'Visa',
|
13 |
+
'MC' => 'MasterCard',
|
14 |
+
'DI' => 'Discover',
|
15 |
+
'SM' => 'Maestro/Switch',
|
16 |
+
'SO' => 'Solo',
|
17 |
+
'JCB' => 'JCB',
|
18 |
+
// 'OT' => 'Other',
|
19 |
+
Ampersand_PaymentGateway_Model_Method_DirectAbstract::AMPERSAND_CARTES_BANCAIRES => 'Cartes Bancaires',
|
20 |
+
Ampersand_PaymentGateway_Model_Method_DirectAbstract::AMPERSAND_MASTERCARD_DEBIT => 'MasterCard Debit',
|
21 |
+
Ampersand_PaymentGateway_Model_Method_DirectAbstract::AMPERSAND_VISA_DELTA => 'Visa Delta',
|
22 |
+
Ampersand_PaymentGateway_Model_Method_DirectAbstract::AMPERSAND_VISA_ELECTRON => 'Visa Electron',
|
23 |
+
Ampersand_PaymentGateway_Model_Method_DirectAbstract::AMPERSAND_VISA_PURCHASING => 'Visa Purchasing',
|
24 |
+
Ampersand_PaymentGateway_Model_Method_DirectAbstract::AMPERSAND_LASER => 'Laser',
|
25 |
+
Ampersand_PaymentGateway_Model_Method_DirectAbstract::AMPERSAND_DINERS_CLUB => 'Diners Club',
|
26 |
+
Ampersand_PaymentGateway_Model_Method_DirectAbstract::AMPERSAND_VPAY => 'V Pay',
|
27 |
+
);
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Retrieve the options.
|
31 |
+
*
|
32 |
+
* @return array
|
33 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
34 |
+
*/
|
35 |
+
public function toOptionArray()
|
36 |
+
{
|
37 |
+
$this->setAllowedTypes(array_keys($this->getSupportedCardTypes()));
|
38 |
+
|
39 |
+
return parent::toOptionArray();
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Retrieve supported credit card types.
|
44 |
+
*
|
45 |
+
* @return array
|
46 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
47 |
+
*/
|
48 |
+
public function getSupportedCardTypes()
|
49 |
+
{
|
50 |
+
return $this->_supportedCcTypes;
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Retrieve the payment gateway specific card type.
|
55 |
+
*
|
56 |
+
* @param string $type
|
57 |
+
* @return string
|
58 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
59 |
+
*/
|
60 |
+
public function getGatewayCardType($type)
|
61 |
+
{
|
62 |
+
$supportedCardTypes = $this->getSupportedCardTypes();
|
63 |
+
|
64 |
+
if (!array_key_exists($type, $supportedCardTypes)) {
|
65 |
+
throw new Exception(
|
66 |
+
$this->_getHelper()->__("Gateway does not support card type '{$type}'.")
|
67 |
+
);
|
68 |
+
}
|
69 |
+
|
70 |
+
return $supportedCardTypes[$type];
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Retrieve friendly name of Magento card types.
|
75 |
+
*
|
76 |
+
* @param string $type
|
77 |
+
* @return string
|
78 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
79 |
+
*/
|
80 |
+
public function getMagentoCardType($type)
|
81 |
+
{
|
82 |
+
return array_key_exists($type, $this->_supportedCcTypes)
|
83 |
+
? $this->_supportedCcTypes[$type]
|
84 |
+
: $type;
|
85 |
+
}
|
86 |
+
|
87 |
+
/**
|
88 |
+
* Retrieve the PaymentGateway helper class.
|
89 |
+
*
|
90 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
91 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
92 |
+
*/
|
93 |
+
protected function _getHelper()
|
94 |
+
{
|
95 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
96 |
+
}
|
97 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Source/OrderStatus.php
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Source_OrderStatus
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Supported Magento new order statuses.
|
6 |
+
*
|
7 |
+
* @var array $_stateStatuses
|
8 |
+
*/
|
9 |
+
protected $_stateStatuses = array(
|
10 |
+
Mage_Sales_Model_Order::STATE_NEW,
|
11 |
+
Mage_Sales_Model_Order::STATE_PROCESSING,
|
12 |
+
);
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Retrieve the options.
|
16 |
+
*
|
17 |
+
* @return array
|
18 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
19 |
+
*/
|
20 |
+
public function toOptionArray()
|
21 |
+
{
|
22 |
+
$statuses = Mage::getSingleton('sales/order_config')
|
23 |
+
->getStateStatuses($this->_stateStatuses);
|
24 |
+
|
25 |
+
$options = array();
|
26 |
+
foreach ($statuses as $code => $label) {
|
27 |
+
$options[] = array(
|
28 |
+
'value' => $code,
|
29 |
+
'label' => $label
|
30 |
+
);
|
31 |
+
}
|
32 |
+
|
33 |
+
return $options;
|
34 |
+
}
|
35 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Source/PaymentAction.php
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Source_PaymentAction extends Mage_Payment_Model_Method_Abstract
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Allowed payment actions.
|
6 |
+
*
|
7 |
+
* @var array $_allowedActions
|
8 |
+
*/
|
9 |
+
protected $_allowedActions = array(
|
10 |
+
self::ACTION_AUTHORIZE,
|
11 |
+
self::ACTION_AUTHORIZE_CAPTURE,
|
12 |
+
);
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Available payment actions.
|
16 |
+
*
|
17 |
+
* @var array $_actions
|
18 |
+
*/
|
19 |
+
protected $_actions = array(
|
20 |
+
self::ACTION_AUTHORIZE => 'Authorize Only',
|
21 |
+
self::ACTION_AUTHORIZE_CAPTURE => 'Authorize and Capture',
|
22 |
+
);
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Retrieve the options.
|
26 |
+
*
|
27 |
+
* @return array
|
28 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
29 |
+
*/
|
30 |
+
public function toOptionArray()
|
31 |
+
{
|
32 |
+
$paymentActions = array();
|
33 |
+
|
34 |
+
foreach ($this->_allowedActions as $_action) {
|
35 |
+
if (!array_key_exists($_action, $this->_actions)) {
|
36 |
+
continue;
|
37 |
+
}
|
38 |
+
|
39 |
+
$paymentActions[] = array(
|
40 |
+
'value' => $_action,
|
41 |
+
'label' => $this->_getHelper()->__($this->_actions[$_action])
|
42 |
+
);
|
43 |
+
}
|
44 |
+
|
45 |
+
return $paymentActions;
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Retrieve the PaymentGateway helper class.
|
50 |
+
*
|
51 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
52 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
53 |
+
*/
|
54 |
+
protected function _getHelper()
|
55 |
+
{
|
56 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
57 |
+
}
|
58 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Source/SubscriptionPeriods.php
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Source_SubscriptionPeriods
|
3 |
+
extends Mage_Payment_Model_Method_Abstract
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Period values.
|
7 |
+
*/
|
8 |
+
const WEEKLY = 'weekly';
|
9 |
+
const MONTHLY = 'monthly';
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Available subscription periods.
|
13 |
+
*
|
14 |
+
* @var array $_periods
|
15 |
+
*/
|
16 |
+
protected $_periods = array(
|
17 |
+
self::WEEKLY => 'Weekly',
|
18 |
+
self::MONTHLY => 'Monthly',
|
19 |
+
);
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Retrieve the options.
|
23 |
+
*
|
24 |
+
* @return array
|
25 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
26 |
+
*/
|
27 |
+
public function toOptionArray()
|
28 |
+
{
|
29 |
+
$periods = array();
|
30 |
+
|
31 |
+
foreach ($this->_periods as $_value => $_label) {
|
32 |
+
$periods[] = array(
|
33 |
+
'value' => $_value,
|
34 |
+
'label' => $this->_getHelper()->__($_label)
|
35 |
+
);
|
36 |
+
}
|
37 |
+
|
38 |
+
return $periods;
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Retrieve the allowed options.
|
43 |
+
*
|
44 |
+
* @return array
|
45 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
46 |
+
*/
|
47 |
+
public function getAllowedOptions()
|
48 |
+
{
|
49 |
+
/**
|
50 |
+
* @todo limit this in admin panel
|
51 |
+
*/
|
52 |
+
return array_keys($this->_periods);
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Retrieve the PaymentGateway helper class.
|
57 |
+
*
|
58 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
59 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
60 |
+
*/
|
61 |
+
protected function _getHelper()
|
62 |
+
{
|
63 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
64 |
+
}
|
65 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Subscription.php
ADDED
@@ -0,0 +1,151 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Subscription extends Mage_Core_Model_Abstract
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Effectively infinite value for remaining updates.
|
6 |
+
*/
|
7 |
+
const REMAINING_UPDATES_MAX = 999999999;
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Prefix of model events names
|
11 |
+
*
|
12 |
+
* @var string
|
13 |
+
*/
|
14 |
+
protected $_eventPrefix = 'ampersand_paymentgateway_subscription';
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Parameter name in event
|
18 |
+
*
|
19 |
+
* In observe method you can use $observer->getEvent()->getObject() in this case
|
20 |
+
*
|
21 |
+
* @var string
|
22 |
+
*/
|
23 |
+
protected $_eventObject = 'subscription';
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Initialise model.
|
27 |
+
*
|
28 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
29 |
+
*/
|
30 |
+
protected function _construct()
|
31 |
+
{
|
32 |
+
$this->_init('ampersand_paymentgateway/subscription');
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Set the number of times this subscription can have its nextOrderData generated.
|
37 |
+
* If no value is provided, a non-expiring subscription is assumed.
|
38 |
+
*
|
39 |
+
* @param int $remainingUpdates
|
40 |
+
* @return Ampersand_PaymentGateway_Model_Subscription
|
41 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
42 |
+
*/
|
43 |
+
public function setRemainingUpdates($remainingUpdates = null)
|
44 |
+
{
|
45 |
+
if (is_null($remainingUpdates)) {
|
46 |
+
$remainingUpdates = self::REMAINING_UPDATES_MAX;
|
47 |
+
}
|
48 |
+
|
49 |
+
$this->addData(array(
|
50 |
+
'remaining_updates_orig' => $remainingUpdates,
|
51 |
+
'remaining_updates_current' => $remainingUpdates,
|
52 |
+
));
|
53 |
+
|
54 |
+
return $this;
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Retrieve the number of remaining updates +1 to signify the number of remaining subscriptions.
|
59 |
+
*
|
60 |
+
* @return int
|
61 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
62 |
+
*/
|
63 |
+
public function getRemainingSubscriptions()
|
64 |
+
{
|
65 |
+
return $this->getRemainingUpdatesCurrent() + 1;
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Calculate the next order date for this subscription.
|
70 |
+
*
|
71 |
+
* @return Ampersand_PaymentGateway_Model_Subscription
|
72 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
73 |
+
*/
|
74 |
+
public function updateNextOrderDate()
|
75 |
+
{
|
76 |
+
$startDate = $this->getStartDate();
|
77 |
+
if ($startDate == '') {
|
78 |
+
$startDate = date('Y-m-d H:i:s');
|
79 |
+
$this->setStartDate($startDate);
|
80 |
+
}
|
81 |
+
|
82 |
+
$nextOrderDate = $this->getNextOrderDate();
|
83 |
+
if ($nextOrderDate != '') {
|
84 |
+
$startDate = $nextOrderDate;
|
85 |
+
}
|
86 |
+
|
87 |
+
$frequency = $this->getFrequency();
|
88 |
+
|
89 |
+
$newTimeStamp = strtotime($startDate . " +{$frequency} days");
|
90 |
+
$newNextOrderDate = date('Y-m-d H:i:s', $newTimeStamp);
|
91 |
+
|
92 |
+
$this->setNextOrderDate($newNextOrderDate);
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Note that the number saved as remaining_updates_current is not the same
|
96 |
+
* as the number of orders remaining under this subscription. It is the number
|
97 |
+
* of times we can call this function, updateNextOrderData(), and therefore
|
98 |
+
* the number of remaining orders is actually remaining_updates_current + 1.
|
99 |
+
*/
|
100 |
+
$remainingUpdates = $this->getRemainingUpdatesCurrent() - 1;
|
101 |
+
if ($remainingUpdates < 0) {
|
102 |
+
$this->setIsActive(0);
|
103 |
+
}
|
104 |
+
$this->setRemainingUpdatesCurrent($remainingUpdates);
|
105 |
+
|
106 |
+
return $this;
|
107 |
+
}
|
108 |
+
|
109 |
+
/**
|
110 |
+
* Reset relevant fields for calculating order dates.
|
111 |
+
*
|
112 |
+
* @return Ampersand_PaymentGateway_Model_Subscription
|
113 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
114 |
+
*/
|
115 |
+
public function resetDateCalculationData()
|
116 |
+
{
|
117 |
+
$this->setStartDate(null);
|
118 |
+
$this->setNextOrderDate(null);
|
119 |
+
$this->setRemainingUpdatesCurrent($this->getRemainingUpdatesOrig());
|
120 |
+
|
121 |
+
return $this;
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Cancel the subscription.
|
126 |
+
*
|
127 |
+
* @return Ampersand_PaymentGateway_Model_Subscription
|
128 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
129 |
+
*/
|
130 |
+
public function cancel()
|
131 |
+
{
|
132 |
+
$this->setIsActive(false)
|
133 |
+
->save();
|
134 |
+
|
135 |
+
return $this;
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Skip the next order date.
|
140 |
+
*
|
141 |
+
* @return Ampersand_PaymentGateway_Model_Subscription
|
142 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
143 |
+
*/
|
144 |
+
public function skipNext()
|
145 |
+
{
|
146 |
+
$this->updateNextOrderDate()
|
147 |
+
->save();
|
148 |
+
|
149 |
+
return $this;
|
150 |
+
}
|
151 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Subscription/Order.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Subscription_Order extends Mage_Core_Model_Abstract
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Prefix of model events names
|
6 |
+
*
|
7 |
+
* @var string
|
8 |
+
*/
|
9 |
+
protected $_eventPrefix = 'ampersand_paymentgateway_subscription_order';
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Parameter name in event
|
13 |
+
*
|
14 |
+
* In observe method you can use $observer->getEvent()->getObject() in this case
|
15 |
+
*
|
16 |
+
* @var string
|
17 |
+
*/
|
18 |
+
protected $_eventObject = 'subscription_order';
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Initialise model.
|
22 |
+
*
|
23 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
24 |
+
*/
|
25 |
+
protected function _construct()
|
26 |
+
{
|
27 |
+
$this->_init('ampersand_paymentgateway/subscription_order');
|
28 |
+
}
|
29 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Transaction.php
ADDED
@@ -0,0 +1,175 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Transaction extends Mage_Core_Model_Abstract
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Initialise model.
|
6 |
+
*
|
7 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
8 |
+
*/
|
9 |
+
protected function _construct()
|
10 |
+
{
|
11 |
+
$this->_init('ampersand_paymentgateway/transaction');
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Load the transaction by service code and reference, ensuring there is only one match.
|
16 |
+
*
|
17 |
+
* @param string $serviceCode
|
18 |
+
* @param string $transactionReference
|
19 |
+
* @return Ampersand_PaymentGateway_Model_Transaction
|
20 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
21 |
+
*/
|
22 |
+
public function loadByServiceTransactionReference($serviceCode, $transactionReference)
|
23 |
+
{
|
24 |
+
$collection = $this->getCollection()
|
25 |
+
->addFieldToFilter('service_code', $serviceCode)
|
26 |
+
->addFieldToFilter('transaction_reference', $transactionReference);
|
27 |
+
|
28 |
+
if ($collection->count() !== 1) {
|
29 |
+
throw new Exception($this->_getHelper()
|
30 |
+
->__("Unable to load transaction for reference '{$transactionReference}'"));
|
31 |
+
}
|
32 |
+
|
33 |
+
$id = $collection->getFirstItem()->getId();
|
34 |
+
$this->load($id);
|
35 |
+
|
36 |
+
return $this;
|
37 |
+
}
|
38 |
+
|
39 |
+
/**
|
40 |
+
* Load the transaction by order ID, ensuring there is only one match.
|
41 |
+
*
|
42 |
+
* @param string $orderId
|
43 |
+
* @return Ampersand_PaymentGateway_Model_Transaction
|
44 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
45 |
+
*/
|
46 |
+
public function loadByOrder($orderId)
|
47 |
+
{
|
48 |
+
$collection = $this->getCollection()
|
49 |
+
->addFieldToFilter('order_id', $orderId);
|
50 |
+
|
51 |
+
if ($collection->count() !== 1) {
|
52 |
+
throw new Exception($this->_getHelper()
|
53 |
+
->__("Unable to load transaction for order ID '{$orderId}'"));
|
54 |
+
}
|
55 |
+
|
56 |
+
$id = $collection->getFirstItem()->getId();
|
57 |
+
$this->load($id);
|
58 |
+
|
59 |
+
return $this;
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Retrieve additional information from the transaction.
|
64 |
+
*
|
65 |
+
* @param string $key
|
66 |
+
* @return string
|
67 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
68 |
+
*/
|
69 |
+
public function getAdditionalInformation($key = null)
|
70 |
+
{
|
71 |
+
$transactionData = $this->getData('additional_information');
|
72 |
+
|
73 |
+
if (is_null($key)) {
|
74 |
+
return $transactionData;
|
75 |
+
}
|
76 |
+
|
77 |
+
return array_key_exists($key, $transactionData) ? $transactionData[$key] : null;
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Retrieve additional information from the transaction.
|
82 |
+
*
|
83 |
+
* @param mixed $key
|
84 |
+
* @param string $value
|
85 |
+
* @return string
|
86 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
87 |
+
*/
|
88 |
+
public function addAdditionalInformation($key, $value = null)
|
89 |
+
{
|
90 |
+
if (is_array($key)) {
|
91 |
+
foreach ($key as $_key => $_value) {
|
92 |
+
$this->addAdditionalInformation($_key, $_value);
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
$additionalInformation = $this->getData('additional_information');
|
97 |
+
$additionalInformation[$key] = $value;
|
98 |
+
$this->setData('additional_information', $additionalInformation);
|
99 |
+
|
100 |
+
return $this;
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Retrieve additional information from the transaction.
|
105 |
+
*
|
106 |
+
* @param string $key
|
107 |
+
* @return string
|
108 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
109 |
+
*/
|
110 |
+
public function unsAdditionalInformation($key)
|
111 |
+
{
|
112 |
+
$transactionData = $this->getData('additional_information');
|
113 |
+
if (!array_key_exists($key, $transactionData)) {
|
114 |
+
return $this;
|
115 |
+
}
|
116 |
+
|
117 |
+
unset($transactionData[$key]);
|
118 |
+
$this->setData('additional_information', $transactionData);
|
119 |
+
|
120 |
+
return $this;
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Serialize any array attribute values.
|
125 |
+
*
|
126 |
+
* @return Ampersand_PaymentGateway_Model_Transaction
|
127 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
128 |
+
*/
|
129 |
+
protected function _beforeSave()
|
130 |
+
{
|
131 |
+
$additionalInformation = $this->getData('additional_information');
|
132 |
+
if (is_array($additionalInformation)) {
|
133 |
+
$this->setData('additional_information', serialize($additionalInformation));
|
134 |
+
}
|
135 |
+
|
136 |
+
$subscriptionData = $this->getData('subscription_data');
|
137 |
+
if (is_array($subscriptionData)) {
|
138 |
+
$this->setData('subscription_data', serialize($subscriptionData));
|
139 |
+
}
|
140 |
+
|
141 |
+
return parent::_beforeSave();
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Unserialize any array attribute values.
|
146 |
+
*
|
147 |
+
* @return Ampersand_PaymentGateway_Model_Transaction
|
148 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
149 |
+
*/
|
150 |
+
protected function _afterLoad()
|
151 |
+
{
|
152 |
+
$additionalInformation = $this->getData('additional_information');
|
153 |
+
if ($additionalInformation != '') {
|
154 |
+
$this->setData('additional_information', unserialize($additionalInformation));
|
155 |
+
}
|
156 |
+
|
157 |
+
$subscriptionData = $this->getData('subscription_data');
|
158 |
+
if ($subscriptionData != '') {
|
159 |
+
$this->setData('subscription_data', unserialize($subscriptionData));
|
160 |
+
}
|
161 |
+
|
162 |
+
return parent::_afterLoad();
|
163 |
+
}
|
164 |
+
|
165 |
+
/**
|
166 |
+
* Retrieve the helper class.
|
167 |
+
*
|
168 |
+
* @return Ampersand_PaymentGateway_Helper_Data
|
169 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
170 |
+
*/
|
171 |
+
protected function _getHelper()
|
172 |
+
{
|
173 |
+
return Mage::helper('ampersand_paymentgateway/data');
|
174 |
+
}
|
175 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Utility/Cleanup.php
ADDED
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Utility_Cleanup
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Cancel orders that remain in the payment_review state longer than a defined period of time.
|
6 |
+
*
|
7 |
+
* @param type $hours
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
public function cancelPaymentReviewOrders($hours)
|
11 |
+
{
|
12 |
+
if (!Mage::helper('ampersand_core/validate')->isInt($hours) || $hours < 1) {
|
13 |
+
Mage::throwException(
|
14 |
+
'A value must be provided for the age, in hours, of orders to cancel.'
|
15 |
+
);
|
16 |
+
}
|
17 |
+
|
18 |
+
$reviewState = Mage::getModel('ampersand_paymentgateway/versioning')
|
19 |
+
->getPaymentReviewOrderState();
|
20 |
+
|
21 |
+
$lastUpdated = date('Y-m-d H:i:s', strtotime("-{$hours} hours"));
|
22 |
+
$orderCollection = Mage::getModel('sales/order')->getCollection()
|
23 |
+
->addAttributeToFilter('state', $reviewState)
|
24 |
+
->addAttributeToFilter('updated_at', array('lt' => $lastUpdated))
|
25 |
+
->addAttributeToSort('entity_id', 'ASC');
|
26 |
+
|
27 |
+
foreach ($orderCollection as $_order) {
|
28 |
+
try {
|
29 |
+
$_order = Mage::getModel('sales/order')->load($_order->getId());
|
30 |
+
if ($_order->getState() != $reviewState) {
|
31 |
+
continue;
|
32 |
+
}
|
33 |
+
|
34 |
+
$_payment = $_order->getPayment();
|
35 |
+
|
36 |
+
if (substr($_payment->getMethod(), 0, 10) != 'ampersand_') {
|
37 |
+
continue;
|
38 |
+
}
|
39 |
+
|
40 |
+
$_payment->setData(Ampersand_PaymentGateway_Model_Service_Abstract::PAYMENT_DENY, true);
|
41 |
+
|
42 |
+
if (method_exists($_payment, 'deny')) {
|
43 |
+
$_payment->deny();
|
44 |
+
} else {
|
45 |
+
Mage::getModel('ampersand_paymentgateway/compatibility_mage_sales_model_order_payment')
|
46 |
+
->registerPaymentReviewAction($_payment, Ampersand_PaymentGateway_Model_Service_Abstract::PAYMENT_DENY);
|
47 |
+
}
|
48 |
+
|
49 |
+
$_order->save();
|
50 |
+
|
51 |
+
$_comment = $_order->addStatusHistoryComment(
|
52 |
+
Mage::helper('ampersand_paymentgateway')->__(
|
53 |
+
"Order cancelled as not converted within {$hours} hours."
|
54 |
+
)
|
55 |
+
);
|
56 |
+
$_comment->save();
|
57 |
+
} catch (Exception $e) {
|
58 |
+
Mage::logException($e);
|
59 |
+
}
|
60 |
+
}
|
61 |
+
}
|
62 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Utility/Subscription.php
ADDED
@@ -0,0 +1,348 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Utility_Subscription
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Subscription reminder email settings.
|
6 |
+
*/
|
7 |
+
const XML_PATH_REMINDER_EMAIL_TEMPLATE = 'ampersand_paymentgateway/subscription/email_template';
|
8 |
+
const XML_PATH_REMINDER_EMAIL_IDENTITY = 'ampersand_paymentgateway/subscription/email_identity';
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Process subscription reminders.
|
12 |
+
*
|
13 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
14 |
+
*/
|
15 |
+
public function sendReminders()
|
16 |
+
{
|
17 |
+
// add ampersand_paymentgateway event area
|
18 |
+
Mage::app()->addEventArea('ampersand_paymentgateway');
|
19 |
+
|
20 |
+
// if billing agreements are not available, we cannot process subscriptions
|
21 |
+
if (!Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()) {
|
22 |
+
return $this;
|
23 |
+
}
|
24 |
+
|
25 |
+
// retrieve a collection of subscription orders ready to be reminded
|
26 |
+
$collection = Mage::getModel('ampersand_paymentgateway/subscription')
|
27 |
+
->getCollection()
|
28 |
+
->filterActive()
|
29 |
+
->filterReadyToSendReminder();
|
30 |
+
|
31 |
+
// turn translation off
|
32 |
+
$translate = Mage::getSingleton('core/translate');
|
33 |
+
$translate->setTranslateInline(false);
|
34 |
+
|
35 |
+
// set the template and identity
|
36 |
+
$template = Mage::getStoreConfig(self::XML_PATH_REMINDER_EMAIL_TEMPLATE);
|
37 |
+
$identity = Mage::getStoreConfig(self::XML_PATH_REMINDER_EMAIL_IDENTITY);
|
38 |
+
|
39 |
+
// start store emulation process to get the current settings
|
40 |
+
$appEmulation = Mage::getSingleton('core/app_emulation');
|
41 |
+
$initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation(
|
42 |
+
Mage::app()->getStore()->getId()
|
43 |
+
);
|
44 |
+
|
45 |
+
foreach ($collection as $_subscription) {
|
46 |
+
try {
|
47 |
+
// validate the subscription
|
48 |
+
$this->_validateSubscription($_subscription);
|
49 |
+
|
50 |
+
// retrieve the order which was first used to create the subscription
|
51 |
+
$_order = Mage::getModel('sales/order')->load($_subscription->getOrderId());
|
52 |
+
$this->_validateOrder($_order);
|
53 |
+
|
54 |
+
// retrieve the customer
|
55 |
+
$_customer = Mage::getModel('customer/customer')
|
56 |
+
->load($_subscription->getCustomerId());
|
57 |
+
$this->_validateCustomer($_customer);
|
58 |
+
|
59 |
+
// retrieve email content
|
60 |
+
$emailData = array(
|
61 |
+
'order' => $_order,
|
62 |
+
'customer' => $_customer,
|
63 |
+
'subscription' => $_subscription,
|
64 |
+
);
|
65 |
+
|
66 |
+
// set the design config
|
67 |
+
$designConfig = array(
|
68 |
+
'area' => 'frontend',
|
69 |
+
'store' => $_order->getStoreId(),
|
70 |
+
);
|
71 |
+
|
72 |
+
// start store emulation process
|
73 |
+
$appEmulation->startEnvironmentEmulation($_order->getStoreId());
|
74 |
+
|
75 |
+
// send the email
|
76 |
+
$emailTemplate = Mage::getModel('core/email_template')
|
77 |
+
->setStoreId($_order->getStoreId())
|
78 |
+
->setDesignConfig($designConfig)
|
79 |
+
->sendTransactional(
|
80 |
+
$template,
|
81 |
+
$identity,
|
82 |
+
$_customer->getEmail(),
|
83 |
+
$_customer->getEmail(),
|
84 |
+
$emailData
|
85 |
+
);
|
86 |
+
|
87 |
+
// check if the send was successful
|
88 |
+
if ($emailTemplate->getSentSuccess() !== true) {
|
89 |
+
throw new Exception('Email sending failure.');
|
90 |
+
}
|
91 |
+
|
92 |
+
// update the subscription
|
93 |
+
$_subscription->setIsReminderSent('1')->save();
|
94 |
+
} catch (Exception $reminderException) {
|
95 |
+
// we want to log the exception, but continue processing other subscriptions
|
96 |
+
Mage::logException($reminderException);
|
97 |
+
|
98 |
+
// send a warning email
|
99 |
+
try {
|
100 |
+
$warningEmail = Mage::getModel('ampersand_paymentgateway/email')
|
101 |
+
->setTitle('Subscription reminder email sending failed.')
|
102 |
+
->setSummary(__METHOD__)
|
103 |
+
->setException($reminderException)
|
104 |
+
->addItem('Subscription ID', $_subscription->getId());
|
105 |
+
|
106 |
+
// API exceptions sometimes contain additional information
|
107 |
+
if ($reminderException instanceof Mage_Api_Exception
|
108 |
+
&& $reminderException->getCustomMessage())
|
109 |
+
{
|
110 |
+
$warningEmail->addItem(
|
111 |
+
'Custom Message',
|
112 |
+
$reminderException->getCustomMessage()
|
113 |
+
);
|
114 |
+
}
|
115 |
+
|
116 |
+
$warningEmail->sendWarning();
|
117 |
+
} catch (Exception $emailException) {
|
118 |
+
Mage::logException($emailException);
|
119 |
+
}
|
120 |
+
}
|
121 |
+
}
|
122 |
+
|
123 |
+
// reset translation
|
124 |
+
$translate->setTranslateInline(true);
|
125 |
+
|
126 |
+
// Stop store emulation process
|
127 |
+
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Process any subscriptions that are ready to have orders created.
|
132 |
+
*
|
133 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
134 |
+
*/
|
135 |
+
public function process()
|
136 |
+
{
|
137 |
+
// add ampersand_paymentgateway event area
|
138 |
+
Mage::app()->addEventArea('ampersand_paymentgateway');
|
139 |
+
|
140 |
+
// if billing agreements are not available, we cannot process subscriptions
|
141 |
+
if (!Mage::getModel('ampersand_paymentgateway/versioning')->isBillingAgreementAvailable()) {
|
142 |
+
return $this;
|
143 |
+
}
|
144 |
+
|
145 |
+
// retrieve a collection of subscription orders ready to be processed
|
146 |
+
$collection = Mage::getModel('ampersand_paymentgateway/subscription')
|
147 |
+
->getCollection()
|
148 |
+
->filterActive()
|
149 |
+
->filterReadyToProcess();
|
150 |
+
|
151 |
+
foreach ($collection as $_subscription) {
|
152 |
+
try {
|
153 |
+
$this->_validateSubscription($_subscription);
|
154 |
+
|
155 |
+
// retrieve the order which was first used to create the subscription
|
156 |
+
$_order = Mage::getModel('sales/order')->load($_subscription->getOrderId());
|
157 |
+
$this->_validateOrder($_order);
|
158 |
+
|
159 |
+
// create the quote based on the order we already have
|
160 |
+
$_quoteId = Mage::getModel('ampersand_api/sales_quote')
|
161 |
+
->createFromOrder($_order->getId());
|
162 |
+
|
163 |
+
// update the quote with our amendments
|
164 |
+
$_quote = Mage::getModel('sales/quote')->loadByIdWithoutStore($_quoteId);
|
165 |
+
|
166 |
+
// prepare the payment data
|
167 |
+
$_paymentData = array(
|
168 |
+
'method' => $_subscription->getMethodCode(),
|
169 |
+
'ba_agreement_id' => $_subscription->getAgreementId(),
|
170 |
+
'additional_information' => array(
|
171 |
+
Ampersand_PaymentGateway_Model_Method_AgreementAbstract
|
172 |
+
::OBJECT_KEY_IS_SUBSCRIPTION => true,
|
173 |
+
),
|
174 |
+
);
|
175 |
+
$_quote->getPayment()->importData($_paymentData);
|
176 |
+
|
177 |
+
// allow external modules to modify the quote before creating the order
|
178 |
+
Mage::dispatchEvent(
|
179 |
+
'ampersand_paymentgateway_subscription_order_create_before',
|
180 |
+
array(
|
181 |
+
'order' => $_order,
|
182 |
+
'quote' => $_quote,
|
183 |
+
'subscription' => $_subscription,
|
184 |
+
)
|
185 |
+
);
|
186 |
+
|
187 |
+
// collect totals and save quote instance to database
|
188 |
+
$_quote->setTotalsCollectedFlag(false)->collectTotals()->save();
|
189 |
+
|
190 |
+
// reset the payment gateway for each subscription order
|
191 |
+
Mage::helper('ampersand_paymentgateway')->resetPaymentGateway();
|
192 |
+
|
193 |
+
// convert the quote to an order
|
194 |
+
$_orderData = array(
|
195 |
+
'relation_parent_id' => $_order->getId(),
|
196 |
+
'relation_parent_real_id' => $_order->getIncrementId(),
|
197 |
+
);
|
198 |
+
$_orderId = Mage::getModel('ampersand_api/sales_quote')
|
199 |
+
->convertToOrder($_quote->getId(), $_orderData);
|
200 |
+
|
201 |
+
// write the order to the subscription history
|
202 |
+
Mage::getModel('ampersand_paymentgateway/subscription_order')
|
203 |
+
->addData(array(
|
204 |
+
'subscription_id' => $_subscription->getId(),
|
205 |
+
'order_id' => $_orderId,
|
206 |
+
))
|
207 |
+
->save();
|
208 |
+
|
209 |
+
// update the next order date on the subscription we just processed
|
210 |
+
Mage::getModel('ampersand_paymentgateway/subscription')
|
211 |
+
->load($_subscription->getId())
|
212 |
+
->updateNextOrderDate()
|
213 |
+
->setIsReminderSent('0')
|
214 |
+
->save();
|
215 |
+
|
216 |
+
// send order confirmation email as the very last step
|
217 |
+
$_newOrder = Mage::getModel('sales/order')->load($_orderId);
|
218 |
+
$_newOrder->sendNewOrderEmail();
|
219 |
+
} catch (Exception $subscriptionException) {
|
220 |
+
// we want to log the exception, but continue processing other subscriptions
|
221 |
+
Mage::logException($subscriptionException);
|
222 |
+
|
223 |
+
// send a warning email
|
224 |
+
try {
|
225 |
+
$warningEmail = Mage::getModel('ampersand_paymentgateway/email')
|
226 |
+
->setTitle('Subscription order generation failed.')
|
227 |
+
->setSummary(__METHOD__)
|
228 |
+
->setException($subscriptionException)
|
229 |
+
->addItem('Subscription ID', $_subscription->getId());
|
230 |
+
|
231 |
+
// API exceptions sometimes contain additional information
|
232 |
+
if ($subscriptionException instanceof Mage_Api_Exception
|
233 |
+
&& $subscriptionException->getCustomMessage())
|
234 |
+
{
|
235 |
+
$warningEmail->addItem(
|
236 |
+
'Custom Message',
|
237 |
+
$subscriptionException->getCustomMessage()
|
238 |
+
);
|
239 |
+
}
|
240 |
+
|
241 |
+
$warningEmail->sendWarning();
|
242 |
+
} catch (Exception $emailException) {
|
243 |
+
Mage::logException($emailException);
|
244 |
+
}
|
245 |
+
}
|
246 |
+
}
|
247 |
+
}
|
248 |
+
|
249 |
+
/**
|
250 |
+
* Validate customer.
|
251 |
+
*
|
252 |
+
* @param Mage_Customer_Model_Customer $customer
|
253 |
+
* @return Ampersand_PaymentGateway_Model_Utility_Subscription
|
254 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
255 |
+
*/
|
256 |
+
protected function _validateCustomer($customer)
|
257 |
+
{
|
258 |
+
// validate all required fields
|
259 |
+
$requiredFields = array(
|
260 |
+
'entity_id',
|
261 |
+
'email',
|
262 |
+
);
|
263 |
+
foreach ($requiredFields as $_field) {
|
264 |
+
if ($customer->getData($_field) == '') {
|
265 |
+
throw new Exception(
|
266 |
+
"Invalid data for '{$_field}' of Customer ID: {$customer->getId()}."
|
267 |
+
);
|
268 |
+
}
|
269 |
+
}
|
270 |
+
|
271 |
+
return $this;
|
272 |
+
}
|
273 |
+
|
274 |
+
/**
|
275 |
+
* Validate subscription.
|
276 |
+
*
|
277 |
+
* @param Ampersand_PaymentGateway_Model_Subscription $subscription
|
278 |
+
* @return Ampersand_PaymentGateway_Model_Utility_Subscription
|
279 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
280 |
+
*/
|
281 |
+
protected function _validateSubscription($subscription)
|
282 |
+
{
|
283 |
+
// validate all required fields
|
284 |
+
$requiredFields = array(
|
285 |
+
'entity_id',
|
286 |
+
'order_id',
|
287 |
+
'agreement_id',
|
288 |
+
'method_code',
|
289 |
+
'frequency',
|
290 |
+
'frequency_type',
|
291 |
+
'next_order_date',
|
292 |
+
'is_active',
|
293 |
+
'customer_id',
|
294 |
+
'remaining_updates_orig',
|
295 |
+
'remaining_updates_current',
|
296 |
+
);
|
297 |
+
foreach ($requiredFields as $_field) {
|
298 |
+
if ($subscription->getData($_field) == '') {
|
299 |
+
throw new Exception(
|
300 |
+
"Invalid data for '{$_field}' of Subscription ID: {$subscription->getId()}."
|
301 |
+
);
|
302 |
+
}
|
303 |
+
}
|
304 |
+
|
305 |
+
// a date with 1970 indicates something has gone wrong
|
306 |
+
$nextOrderDate = $subscription->getNextOrderDate();
|
307 |
+
if (substr($nextOrderDate, 0, 4) == '1970') {
|
308 |
+
throw new Exception(
|
309 |
+
"Invalid next order date: {$nextOrderDate}"
|
310 |
+
);
|
311 |
+
}
|
312 |
+
|
313 |
+
// ensure the related billing agreement is active
|
314 |
+
$agreementId = $subscription->getAgreementId();
|
315 |
+
$agreement = Mage::getModel('sales/billing_agreement')->load($agreementId);
|
316 |
+
if ($agreement->getStatus() != Mage_Sales_Model_Billing_Agreement::STATUS_ACTIVE) {
|
317 |
+
throw new Exception(
|
318 |
+
"Billing agreement does not exist or has been cancelled: {$agreementId}"
|
319 |
+
);
|
320 |
+
}
|
321 |
+
|
322 |
+
return $this;
|
323 |
+
}
|
324 |
+
|
325 |
+
/**
|
326 |
+
* Validate order.
|
327 |
+
*
|
328 |
+
* @param Mage_Sales_Model_Order $order
|
329 |
+
* @return Ampersand_PaymentGateway_Model_Utility_Subscription
|
330 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
331 |
+
*/
|
332 |
+
protected function _validateOrder($order)
|
333 |
+
{
|
334 |
+
// validate all required fields
|
335 |
+
$requiredFields = array(
|
336 |
+
'entity_id',
|
337 |
+
);
|
338 |
+
foreach ($requiredFields as $_field) {
|
339 |
+
if ($order->getData($_field) == '') {
|
340 |
+
throw new Exception(
|
341 |
+
"Invalid data for '{$_field}' of Order ID: {$order->getId()}."
|
342 |
+
);
|
343 |
+
}
|
344 |
+
}
|
345 |
+
|
346 |
+
return $this;
|
347 |
+
}
|
348 |
+
}
|
app/code/core/Ampersand/PaymentGateway/Model/Versioning.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Model_Versioning extends Ampersand_Core_Model_Versioning
|
3 |
+
{
|
4 |
+
public function isBillingAgreementAvailable()
|
5 |
+
{
|
6 |
+
if (
|
7 |
+
$this->compare(Ampersand_Core_Model_Versioning::EDITION_CE, '1.4.1.0')
|
8 |
+
|| $this->compare(Ampersand_Core_Model_Versioning::EDITION_EE, '1.9.0.0')
|
9 |
+
) {
|
10 |
+
return true;
|
11 |
+
}
|
12 |
+
|
13 |
+
return false;
|
14 |
+
}
|
15 |
+
|
16 |
+
public function getPaymentReviewOrderState()
|
17 |
+
{
|
18 |
+
if (
|
19 |
+
$this->compare(Ampersand_Core_Model_Versioning::EDITION_CE, '1.4.1.0')
|
20 |
+
|| $this->compare(Ampersand_Core_Model_Versioning::EDITION_EE, '1.9.0.0')
|
21 |
+
) {
|
22 |
+
return Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW;
|
23 |
+
}
|
24 |
+
|
25 |
+
return Mage_Sales_Model_Order::STATE_HOLDED;
|
26 |
+
}
|
27 |
+
}
|
app/code/core/Ampersand/PaymentGateway/changelog.txt
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
24/01/2013 - v0.1.4 - Improved error logging on billing agreement creation failure.
|
2 |
+
|
3 |
+
16/01/2013 - v0.1.3 - Moved cron expressions to system configuration.
|
4 |
+
|
5 |
+
16/01/2013 - v0.1.2 - Updated Ampersand_PaymentGateway_Block_Payment_Form_BillingAgreement to depend
|
6 |
+
on changes from Ampersand_BillingAgreementFix due to billing agreements from
|
7 |
+
incorrect methods appearing on the checkout pages.
|
8 |
+
|
9 |
+
16/01/2013 - v0.1.1 - Improved integration message logging and flags,
|
10 |
+
and added custom error message functionality to all transaction types.
|
11 |
+
|
12 |
+
07/01/2013 - v0.1.0 - Initial release.
|
app/code/core/Ampersand/PaymentGateway/controllers/Adminhtml/Subscription/OrderController.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Adminhtml_Subscription_OrderController
|
3 |
+
extends Mage_Adminhtml_Controller_Action
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Display the subscription order grid container.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
public function indexAction()
|
11 |
+
{
|
12 |
+
if ($this->getRequest()->getQuery('ajax')) {
|
13 |
+
$this->_forward('grid');
|
14 |
+
return;
|
15 |
+
}
|
16 |
+
|
17 |
+
$this->loadLayout()
|
18 |
+
->_addContent(
|
19 |
+
$this->getLayout()->createBlock('ampersand_paymentgateway_admin/subscription_order')
|
20 |
+
)
|
21 |
+
->renderLayout();
|
22 |
+
}
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Display the subscription order grid for use in AJAX requests.
|
26 |
+
*
|
27 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
28 |
+
*/
|
29 |
+
public function gridAction()
|
30 |
+
{
|
31 |
+
$this->getResponse()->setBody(
|
32 |
+
$this->loadLayout()->getLayout()
|
33 |
+
->createBlock('ampersand_paymentgateway_admin/subscription_order_grid')->toHtml()
|
34 |
+
);
|
35 |
+
}
|
36 |
+
}
|
app/code/core/Ampersand/PaymentGateway/controllers/Adminhtml/SubscriptionController.php
ADDED
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Adminhtml_SubscriptionController
|
3 |
+
extends Mage_Adminhtml_Controller_Action
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Only these fields can be directly modified from the admin panel.
|
7 |
+
*
|
8 |
+
* @var array $_adminEditableFields
|
9 |
+
*/
|
10 |
+
protected $_adminEditableFields = array(
|
11 |
+
'is_active',
|
12 |
+
'next_order_date',
|
13 |
+
'frequency',
|
14 |
+
);
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Display the subscription grid container.
|
18 |
+
*
|
19 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
20 |
+
*/
|
21 |
+
public function indexAction()
|
22 |
+
{
|
23 |
+
if ($this->getRequest()->getQuery('ajax')) {
|
24 |
+
$this->_forward('grid');
|
25 |
+
return;
|
26 |
+
}
|
27 |
+
|
28 |
+
$this->loadLayout()
|
29 |
+
->_addContent(
|
30 |
+
$this->getLayout()->createBlock('ampersand_paymentgateway_admin/subscription')
|
31 |
+
)
|
32 |
+
->renderLayout();
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Display the subscription grid for use in AJAX requests.
|
37 |
+
*
|
38 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
39 |
+
*/
|
40 |
+
public function gridAction()
|
41 |
+
{
|
42 |
+
$this->getResponse()->setBody(
|
43 |
+
$this->loadLayout()
|
44 |
+
->getLayout()
|
45 |
+
->createBlock('ampersand_paymentgateway_admin/subscription_grid')->toHtml()
|
46 |
+
);
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Process modifications to the subscription from the admin panel form.
|
51 |
+
*
|
52 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
53 |
+
*/
|
54 |
+
public function editAction()
|
55 |
+
{
|
56 |
+
$subscriptionId = $this->getRequest()->getParam('id', false);
|
57 |
+
$subscription = Mage::getModel('ampersand_paymentgateway/subscription')
|
58 |
+
->load($subscriptionId);
|
59 |
+
|
60 |
+
if (!$subscription->getId()) {
|
61 |
+
$this->_getSession()->addError(
|
62 |
+
"Unable to load subscription with ID '{$subscriptionId}'."
|
63 |
+
);
|
64 |
+
$this->_redirect('*/*/index');
|
65 |
+
return;
|
66 |
+
}
|
67 |
+
|
68 |
+
if ($postData = $this->getRequest()->getPost('object')) {
|
69 |
+
foreach ($postData as $_field => $_value) {
|
70 |
+
if (!in_array($_field, $this->_adminEditableFields)) {
|
71 |
+
unset($postData[$_field]);
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
$subscription->addData($postData)->save();
|
76 |
+
$this->_getSession()->addSuccess('Subscription saved successfully.');
|
77 |
+
|
78 |
+
if ($this->getRequest()->getParam('continue')) {
|
79 |
+
$this->_redirect('*/*/*', array('id' => $subscription->getId(), '_current'=>true));
|
80 |
+
return;
|
81 |
+
}
|
82 |
+
|
83 |
+
$this->_redirect('*/*/index');
|
84 |
+
}
|
85 |
+
|
86 |
+
$this->loadLayout()
|
87 |
+
->_addContent(
|
88 |
+
$this->getLayout()->createBlock('ampersand_paymentgateway_admin/subscription_edit')
|
89 |
+
)
|
90 |
+
->renderLayout();
|
91 |
+
}
|
92 |
+
}
|
app/code/core/Ampersand/PaymentGateway/controllers/Checkout/Cart/SubscriptionController.php
ADDED
@@ -0,0 +1,103 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_Checkout_Cart_SubscriptionController
|
3 |
+
extends Mage_Core_Controller_Front_Action
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Action predispatch.
|
7 |
+
*
|
8 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
9 |
+
*/
|
10 |
+
public function preDispatch()
|
11 |
+
{
|
12 |
+
parent::preDispatch();
|
13 |
+
|
14 |
+
if (!$this->_getHelper()->isActive()) {
|
15 |
+
$this->_redirect('customer/account');
|
16 |
+
return;
|
17 |
+
}
|
18 |
+
}
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Process the customers selections for order subscription.
|
22 |
+
*
|
23 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
24 |
+
*/
|
25 |
+
public function postAction()
|
26 |
+
{
|
27 |
+
$error = false;
|
28 |
+
|
29 |
+
$request = $this->getRequest();
|
30 |
+
if ($this->getRequest()->getPost()) {
|
31 |
+
$remove = $request->getPost('remove');
|
32 |
+
$period = $request->getPost('period');
|
33 |
+
if ($period == 'do_not_subscribe') {
|
34 |
+
$remove = '1';
|
35 |
+
}
|
36 |
+
|
37 |
+
if ($remove == '1') {
|
38 |
+
$this->_getHelper()->setSubscriptionData(array());
|
39 |
+
$this->_addSuccess('Subscription removed successfuly.');
|
40 |
+
$this->_redirect('checkout/cart/index');
|
41 |
+
return;
|
42 |
+
}
|
43 |
+
|
44 |
+
$allowedPeriods = Mage::getModel('ampersand_paymentgateway/source_subscriptionPeriods')
|
45 |
+
->getAllowedOptions();
|
46 |
+
if (!in_array($period, $allowedPeriods)) {
|
47 |
+
$error = true;
|
48 |
+
$this->_addError('Invalid subscription period selected.');
|
49 |
+
}
|
50 |
+
|
51 |
+
if ($error == false) {
|
52 |
+
$this->_getHelper()->setSubscriptionData(array(
|
53 |
+
'active' => true,
|
54 |
+
'period' => $period,
|
55 |
+
));
|
56 |
+
$this->_addSuccess('Order subscription selections updated successfuly.');
|
57 |
+
}
|
58 |
+
} else {
|
59 |
+
$this->_addError('Unable to update subscription selections.');
|
60 |
+
}
|
61 |
+
|
62 |
+
$this->_redirect('checkout/cart/index');
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Inform the customer of success.
|
67 |
+
*
|
68 |
+
* @param string $message
|
69 |
+
* @return Ampersand_PaymentGateway_Checkout_Cart_SubscriptionController
|
70 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
71 |
+
*/
|
72 |
+
protected function _addSuccess($message)
|
73 |
+
{
|
74 |
+
Mage::getSingleton('core/session')->addSuccess($message);
|
75 |
+
|
76 |
+
return $this;
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Inform the customer of failure.
|
81 |
+
*
|
82 |
+
* @param string $message
|
83 |
+
* @return Ampersand_PaymentGateway_Checkout_Cart_SubscriptionController
|
84 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
85 |
+
*/
|
86 |
+
protected function _addError($message)
|
87 |
+
{
|
88 |
+
Mage::getSingleton('core/session')->addError($message);
|
89 |
+
|
90 |
+
return $this;
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Retrieve the subscription helper.
|
95 |
+
*
|
96 |
+
* @return Ampersand_PaymentGateway_Helper_Subscription
|
97 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
98 |
+
*/
|
99 |
+
protected function _getHelper()
|
100 |
+
{
|
101 |
+
return Mage::helper('ampersand_paymentgateway/subscription');
|
102 |
+
}
|
103 |
+
}
|
app/code/core/Ampersand/PaymentGateway/controllers/Checkout/OnepageController.php
ADDED
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
require_once('Mage/Checkout/controllers/OnepageController.php');
|
3 |
+
class Ampersand_PaymentGateway_Checkout_OnepageController extends Mage_Checkout_OnepageController
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* States which indicate a successful order.
|
7 |
+
*
|
8 |
+
* @var array $_orderSuccessStates
|
9 |
+
*/
|
10 |
+
protected $_orderSuccessStates = array(
|
11 |
+
Mage_Sales_Model_Order::STATE_PROCESSING,
|
12 |
+
Mage_Sales_Model_Order::STATE_COMPLETE,
|
13 |
+
);
|
14 |
+
|
15 |
+
/**
|
16 |
+
* Payment Gateways can optionally use this action for a single redirect URL.
|
17 |
+
* Success or failure will be determined by the order status, and the customer is forwarded.
|
18 |
+
*
|
19 |
+
* Note: preferably the payment gateway determines the final URL instead of using this action.
|
20 |
+
*
|
21 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
22 |
+
*/
|
23 |
+
public function completeAction()
|
24 |
+
{
|
25 |
+
/**
|
26 |
+
* @todo handle multishipping
|
27 |
+
*/
|
28 |
+
|
29 |
+
// set defaults (use null when value matches current context)
|
30 |
+
$module = null;
|
31 |
+
$controller = null;
|
32 |
+
$action = 'failure';
|
33 |
+
$params = $this->getRequest()->getParams();
|
34 |
+
|
35 |
+
// determine whether the last order placed by this customer was successful
|
36 |
+
$lastOrderId = $this->getOnepage()->getCheckout()->getLastOrderId();
|
37 |
+
$order = Mage::getModel('sales/order')->load($lastOrderId);
|
38 |
+
if ($order->getId() && in_array($order->getState(), $this->_orderSuccessStates)) {
|
39 |
+
$module = 'checkout';
|
40 |
+
$controller = 'onepage';
|
41 |
+
$action = 'success';
|
42 |
+
}
|
43 |
+
|
44 |
+
// forward to the provided location
|
45 |
+
$this->_forward($action, $controller, $module, $params);
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Customised failure page for when the payment method does not have access
|
50 |
+
* to the customers session during the callback notification.
|
51 |
+
*
|
52 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
53 |
+
*/
|
54 |
+
public function failureAction()
|
55 |
+
{
|
56 |
+
// retrieve the last order ID for this customer
|
57 |
+
$lastOrderId = $this->getOnepage()->getCheckout()->getLastOrderId();
|
58 |
+
if (!$lastOrderId) {
|
59 |
+
return parent::failureAction();
|
60 |
+
}
|
61 |
+
|
62 |
+
// retrieve the transaction related to this order
|
63 |
+
try {
|
64 |
+
$transaction = Mage::getModel('ampersand_paymentgateway/transaction')
|
65 |
+
->loadByOrder($lastOrderId);
|
66 |
+
} catch (Exception $e) {
|
67 |
+
return parent::failureAction();
|
68 |
+
}
|
69 |
+
|
70 |
+
// initialise the helper
|
71 |
+
$helper = Mage::helper('ampersand_paymentgateway/data');
|
72 |
+
|
73 |
+
// set the error message to display to the customer
|
74 |
+
$helper->setSessionErrorMessage($transaction->getErrorMessage());
|
75 |
+
|
76 |
+
// repopulate the customers basket
|
77 |
+
$helper->reorder($lastOrderId);
|
78 |
+
|
79 |
+
return parent::failureAction();
|
80 |
+
}
|
81 |
+
}
|
app/code/core/Ampersand/PaymentGateway/controllers/Customer/Account/SubscriptionController.php
ADDED
@@ -0,0 +1,121 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
require_once('Mage/Customer/controllers/AccountController.php');
|
3 |
+
class Ampersand_PaymentGateway_Customer_Account_SubscriptionController
|
4 |
+
extends Mage_Customer_AccountController
|
5 |
+
{
|
6 |
+
/**
|
7 |
+
* Action predispatch.
|
8 |
+
*
|
9 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
10 |
+
*/
|
11 |
+
public function preDispatch()
|
12 |
+
{
|
13 |
+
parent::preDispatch();
|
14 |
+
|
15 |
+
if (!$this->_getHelper()->isActive()) {
|
16 |
+
$this->_redirect('customer/account');
|
17 |
+
return;
|
18 |
+
}
|
19 |
+
}
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Display the index page.
|
23 |
+
*
|
24 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
25 |
+
*/
|
26 |
+
public function indexAction()
|
27 |
+
{
|
28 |
+
$this->loadLayout();
|
29 |
+
$this->_initLayoutMessages('customer/session');
|
30 |
+
|
31 |
+
$this->getLayout()->getBlock('head')->setTitle($this->__('My Subscriptions'));
|
32 |
+
|
33 |
+
if ($block = $this->getLayout()->getBlock('customer.account.link.back')) {
|
34 |
+
$block->setRefererUrl($this->_getRefererUrl());
|
35 |
+
}
|
36 |
+
|
37 |
+
$this->renderLayout();
|
38 |
+
}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Cancel the subscription.
|
42 |
+
*
|
43 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
44 |
+
*/
|
45 |
+
public function cancelAction()
|
46 |
+
{
|
47 |
+
if ($subscription = $this->_getSubscription()) {
|
48 |
+
$subscription->cancel();
|
49 |
+
|
50 |
+
$this->_getSession()->addSuccess(
|
51 |
+
$this->_getHelper()->__('Subscription cancelled successfully.')
|
52 |
+
);
|
53 |
+
}
|
54 |
+
|
55 |
+
$this->_redirect('customer/account/subscriptions');
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* Skip the next subscription date.
|
60 |
+
*
|
61 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
62 |
+
*/
|
63 |
+
public function skipAction()
|
64 |
+
{
|
65 |
+
if ($subscription = $this->_getSubscription()) {
|
66 |
+
$subscription->skipNext();
|
67 |
+
|
68 |
+
$this->_getSession()->addSuccess(
|
69 |
+
$this->_getHelper()->__('Subscription next order date updated successfully.')
|
70 |
+
);
|
71 |
+
}
|
72 |
+
|
73 |
+
$this->_redirect('customer/account/subscriptions');
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Retrieve the current subscription.
|
78 |
+
*
|
79 |
+
* @return Ampersand_PaymentGateway_Model_Subscription
|
80 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
81 |
+
*/
|
82 |
+
protected function _getSubscription()
|
83 |
+
{
|
84 |
+
$subscription = false;
|
85 |
+
|
86 |
+
if ($subscriptionId = $this->getRequest()->getParam('id', false)) {
|
87 |
+
$subscription = Mage::getModel('ampersand_paymentgateway/subscription')
|
88 |
+
->load($subscriptionId);
|
89 |
+
|
90 |
+
// check logged in customer has access to this subscription
|
91 |
+
$customerId = $this->_getCustomerId();
|
92 |
+
if (!$customerId || $subscription->getCustomerId() != $customerId) {
|
93 |
+
$subscription = false;
|
94 |
+
}
|
95 |
+
}
|
96 |
+
|
97 |
+
return $subscription;
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Retrieve the logged in customer id.
|
102 |
+
*
|
103 |
+
* @return int
|
104 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
105 |
+
*/
|
106 |
+
protected function _getCustomerId()
|
107 |
+
{
|
108 |
+
return Mage::helper('customer')->getCustomer()->getId();
|
109 |
+
}
|
110 |
+
|
111 |
+
/**
|
112 |
+
* Retrieve the subscription helper.
|
113 |
+
*
|
114 |
+
* @return Ampersand_PaymentGateway_Helper_Subscription
|
115 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
116 |
+
*/
|
117 |
+
protected function _getHelper()
|
118 |
+
{
|
119 |
+
return Mage::helper('ampersand_paymentgateway/subscription');
|
120 |
+
}
|
121 |
+
}
|
app/code/core/Ampersand/PaymentGateway/controllers/RedirectController.php
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_PaymentGateway_RedirectController extends Mage_Core_Controller_Front_Action
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Display the form which will be auto-submitted to redirect the customer.
|
6 |
+
*
|
7 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
8 |
+
*/
|
9 |
+
public function formAction()
|
10 |
+
{
|
11 |
+
$this->loadLayout()->renderLayout();
|
12 |
+
}
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Display a page with an iframe containing the above formAction() content.
|
16 |
+
*
|
17 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
18 |
+
*/
|
19 |
+
public function iframeAction()
|
20 |
+
{
|
21 |
+
$this->loadLayout()->renderLayout();
|
22 |
+
}
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Display a page which will set the top browser window location to a provided URL.
|
26 |
+
*
|
27 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
28 |
+
*/
|
29 |
+
public function locationAction()
|
30 |
+
{
|
31 |
+
Mage::register(
|
32 |
+
Ampersand_PaymentGateway_Block_Redirect_Location::REGISTRY_KEY_REDIRECT_URL,
|
33 |
+
$this->getRequest()->getParam('redirect_url')
|
34 |
+
);
|
35 |
+
|
36 |
+
$this->loadLayout()->renderLayout();
|
37 |
+
}
|
38 |
+
}
|
app/code/core/Ampersand/PaymentGateway/etc/adminhtml.xml
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<menu>
|
4 |
+
<sales>
|
5 |
+
<children>
|
6 |
+
<ampersand_paymentgateway_subscriptions translate="title" module="ampersand_paymentgateway">
|
7 |
+
<title>Subscriptions</title>
|
8 |
+
<sort_order>75</sort_order>
|
9 |
+
<depends>
|
10 |
+
<module>Ampersand_PaymentGateway</module>
|
11 |
+
</depends>
|
12 |
+
<children>
|
13 |
+
<subscription_manage translate="title" module="ampersand_paymentgateway">
|
14 |
+
<title>Manage Subscriptions</title>
|
15 |
+
<sort_order>10</sort_order>
|
16 |
+
<action>ampersand_paymentgateway_admin/subscription</action>
|
17 |
+
</subscription_manage>
|
18 |
+
<subscription_orders translate="title" module="ampersand_paymentgateway">
|
19 |
+
<title>Subscriptions Orders</title>
|
20 |
+
<sort_order>20</sort_order>
|
21 |
+
<action>ampersand_paymentgateway_admin/subscription_order</action>
|
22 |
+
</subscription_orders>
|
23 |
+
</children>
|
24 |
+
</ampersand_paymentgateway_subscriptions>
|
25 |
+
</children>
|
26 |
+
</sales>
|
27 |
+
</menu>
|
28 |
+
<acl>
|
29 |
+
<resources>
|
30 |
+
<admin>
|
31 |
+
<children>
|
32 |
+
<system>
|
33 |
+
<children>
|
34 |
+
<config>
|
35 |
+
<children>
|
36 |
+
<ampersand_paymentgateway translate="title" module="ampersand_paymentgateway">
|
37 |
+
<title>Payment Gateways</title>
|
38 |
+
</ampersand_paymentgateway>
|
39 |
+
</children>
|
40 |
+
</config>
|
41 |
+
</children>
|
42 |
+
</system>
|
43 |
+
<sales>
|
44 |
+
<children>
|
45 |
+
<ampersand_paymentgateway_subscriptions translate="title" module="ampersand_paymentgateway">
|
46 |
+
<title>Subscriptions</title>
|
47 |
+
<sort_order>75</sort_order>
|
48 |
+
<children>
|
49 |
+
<subscription_manage translate="title" module="ampersand_paymentgateway">
|
50 |
+
<title>Manage Subscriptions</title>
|
51 |
+
<sort_order>10</sort_order>
|
52 |
+
</subscription_manage>
|
53 |
+
<subscription_orders translate="title" module="ampersand_paymentgateway">
|
54 |
+
<title>Subscriptions Orders</title>
|
55 |
+
<sort_order>20</sort_order>
|
56 |
+
</subscription_orders>
|
57 |
+
</children>
|
58 |
+
</ampersand_paymentgateway_subscriptions>
|
59 |
+
</children>
|
60 |
+
</sales>
|
61 |
+
</children>
|
62 |
+
</admin>
|
63 |
+
</resources>
|
64 |
+
</acl>
|
65 |
+
</config>
|
app/code/core/Ampersand/PaymentGateway/etc/config.xml
ADDED
@@ -0,0 +1,300 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<Ampersand_PaymentGateway>
|
5 |
+
<version>0.1.4</version>
|
6 |
+
</Ampersand_PaymentGateway>
|
7 |
+
</modules>
|
8 |
+
<global>
|
9 |
+
<blocks>
|
10 |
+
<ampersand_paymentgateway>
|
11 |
+
<class>Ampersand_PaymentGateway_Block</class>
|
12 |
+
</ampersand_paymentgateway>
|
13 |
+
<ampersand_paymentgateway_admin>
|
14 |
+
<class>Ampersand_PaymentGateway_Block_Adminhtml</class>
|
15 |
+
</ampersand_paymentgateway_admin>
|
16 |
+
</blocks>
|
17 |
+
<helpers>
|
18 |
+
<ampersand_paymentgateway>
|
19 |
+
<class>Ampersand_PaymentGateway_Helper</class>
|
20 |
+
</ampersand_paymentgateway>
|
21 |
+
</helpers>
|
22 |
+
<models>
|
23 |
+
<ampersand_paymentgateway>
|
24 |
+
<class>Ampersand_PaymentGateway_Model</class>
|
25 |
+
<resourceModel>ampersand_paymentgateway_resource</resourceModel>
|
26 |
+
</ampersand_paymentgateway>
|
27 |
+
<ampersand_paymentgateway_resource>
|
28 |
+
<class>Ampersand_PaymentGateway_Model_Resource</class>
|
29 |
+
<entities>
|
30 |
+
<agreement><table>ampersand_paymentgateway_agreement</table></agreement>
|
31 |
+
<transaction><table>ampersand_paymentgateway_transaction</table></transaction>
|
32 |
+
<subscription><table>ampersand_paymentgateway_subscription</table></subscription>
|
33 |
+
<subscription_order><table>ampersand_paymentgateway_subscription_order</table></subscription_order>
|
34 |
+
</entities>
|
35 |
+
</ampersand_paymentgateway_resource>
|
36 |
+
</models>
|
37 |
+
<resources>
|
38 |
+
<ampersand_paymentgateway_setup>
|
39 |
+
<setup>
|
40 |
+
<module>Ampersand_PaymentGateway</module>
|
41 |
+
</setup>
|
42 |
+
<connection>
|
43 |
+
<use>core_setup</use>
|
44 |
+
</connection>
|
45 |
+
</ampersand_paymentgateway_setup>
|
46 |
+
<ampersand_paymentgateway_write>
|
47 |
+
<connection>
|
48 |
+
<use>core_write</use>
|
49 |
+
</connection>
|
50 |
+
</ampersand_paymentgateway_write>
|
51 |
+
<ampersand_paymentgateway_read>
|
52 |
+
<connection>
|
53 |
+
<use>core_read</use>
|
54 |
+
</connection>
|
55 |
+
</ampersand_paymentgateway_read>
|
56 |
+
</resources>
|
57 |
+
<events>
|
58 |
+
<core_block_abstract_prepare_layout_after>
|
59 |
+
<observers>
|
60 |
+
<ampersand_paymentgateway>
|
61 |
+
<type>singleton</type>
|
62 |
+
<class>ampersand_paymentgateway/observer</class>
|
63 |
+
<method>updateAvailablePaymentMethods</method>
|
64 |
+
</ampersand_paymentgateway>
|
65 |
+
</observers>
|
66 |
+
</core_block_abstract_prepare_layout_after>
|
67 |
+
<payment_form_block_to_html_before>
|
68 |
+
<observers>
|
69 |
+
<ampersand_paymentgateway>
|
70 |
+
<type>singleton</type>
|
71 |
+
<class>ampersand_paymentgateway/observer</class>
|
72 |
+
<method>appendBillingAgreementForms</method>
|
73 |
+
</ampersand_paymentgateway>
|
74 |
+
</observers>
|
75 |
+
</payment_form_block_to_html_before>
|
76 |
+
</events>
|
77 |
+
<template>
|
78 |
+
<email>
|
79 |
+
<ampersand_paymentgateway_notification translate="label" module="ampersand_paymentgateway">
|
80 |
+
<label>Payment Gateway Issue Notification</label>
|
81 |
+
<file>ampersand_paymentgateway/notification.html</file>
|
82 |
+
<type>html</type>
|
83 |
+
</ampersand_paymentgateway_notification>
|
84 |
+
<ampersand_paymentgateway_subscription_reminder translate="label" module="ampersand_paymentgateway">
|
85 |
+
<label>Payment Gateway Subscription Reminder</label>
|
86 |
+
<file>ampersand_paymentgateway/subscription_reminder.html</file>
|
87 |
+
<type>html</type>
|
88 |
+
</ampersand_paymentgateway_subscription_reminder>
|
89 |
+
</email>
|
90 |
+
</template>
|
91 |
+
<payment>
|
92 |
+
<cc>
|
93 |
+
<types>
|
94 |
+
<AMPERSAND_CARTES_BANCAIRES>
|
95 |
+
<code>AMPERSAND_CARTES_BANCAIRES</code>
|
96 |
+
<name>Cartes Bancaires</name>
|
97 |
+
<order>2003</order>
|
98 |
+
</AMPERSAND_CARTES_BANCAIRES>
|
99 |
+
<AMPERSAND_MASTERCARD_DEBIT>
|
100 |
+
<code>AMPERSAND_MASTERCARD_DEBIT</code>
|
101 |
+
<name>MasterCard Debit</name>
|
102 |
+
<order>2004</order>
|
103 |
+
</AMPERSAND_MASTERCARD_DEBIT>
|
104 |
+
<AMPERSAND_VISA_DELTA>
|
105 |
+
<code>AMPERSAND_VISA_DELTA</code>
|
106 |
+
<name>Visa Delta</name>
|
107 |
+
<order>2005</order>
|
108 |
+
</AMPERSAND_VISA_DELTA>
|
109 |
+
<AMPERSAND_VISA_ELECTRON>
|
110 |
+
<code>AMPERSAND_VISA_ELECTRON</code>
|
111 |
+
<name>Visa Electron</name>
|
112 |
+
<order>2006</order>
|
113 |
+
</AMPERSAND_VISA_ELECTRON>
|
114 |
+
<AMPERSAND_VISA_PURCHASING>
|
115 |
+
<code>AMPERSAND_VISA_PURCHASING</code>
|
116 |
+
<name>Visa Purchasing</name>
|
117 |
+
<order>2007</order>
|
118 |
+
</AMPERSAND_VISA_PURCHASING>
|
119 |
+
<AMPERSAND_LASER>
|
120 |
+
<code>AMPERSAND_LASER</code>
|
121 |
+
<name>Laser</name>
|
122 |
+
<order>2008</order>
|
123 |
+
</AMPERSAND_LASER>
|
124 |
+
<AMPERSAND_DINERS_CLUB>
|
125 |
+
<code>AMPERSAND_DINERS_CLUB</code>
|
126 |
+
<name>Diners Club</name>
|
127 |
+
<order>2009</order>
|
128 |
+
</AMPERSAND_DINERS_CLUB>
|
129 |
+
<AMPERSAND_VPAY>
|
130 |
+
<code>AMPERSAND_VPAY</code>
|
131 |
+
<name>V Pay</name>
|
132 |
+
<order>2010</order>
|
133 |
+
</AMPERSAND_VPAY>
|
134 |
+
</types>
|
135 |
+
</cc>
|
136 |
+
</payment>
|
137 |
+
<rewrite>
|
138 |
+
<ampersand_paymentgateway_customer_account_subscription_cancel>
|
139 |
+
<from>#^/?customer/account/subscriptions/action/cancel(.+)#</from>
|
140 |
+
<to>/payment-gateway/customer_account_subscription/cancel$1</to>
|
141 |
+
</ampersand_paymentgateway_customer_account_subscription_cancel>
|
142 |
+
<ampersand_paymentgateway_customer_account_subscription_skip>
|
143 |
+
<from>#^/?customer/account/subscriptions/action/skip(.+)#</from>
|
144 |
+
<to>/payment-gateway/customer_account_subscription/skip$1</to>
|
145 |
+
</ampersand_paymentgateway_customer_account_subscription_skip>
|
146 |
+
<ampersand_paymentgateway_customer_account_subscription>
|
147 |
+
<from>#^/?customer/account/subscriptions#</from>
|
148 |
+
<to>/payment-gateway/customer_account_subscription/index</to>
|
149 |
+
</ampersand_paymentgateway_customer_account_subscription>
|
150 |
+
</rewrite>
|
151 |
+
</global>
|
152 |
+
<admin>
|
153 |
+
<routers>
|
154 |
+
<ampersand_paymentgateway_admin>
|
155 |
+
<use>admin</use>
|
156 |
+
<args>
|
157 |
+
<module>Ampersand_PaymentGateway_Adminhtml</module>
|
158 |
+
<frontName>payment-gateway-admin</frontName>
|
159 |
+
</args>
|
160 |
+
</ampersand_paymentgateway_admin>
|
161 |
+
</routers>
|
162 |
+
</admin>
|
163 |
+
<frontend>
|
164 |
+
<routers>
|
165 |
+
<ampersand_paymentgateway>
|
166 |
+
<use>standard</use>
|
167 |
+
<args>
|
168 |
+
<module>Ampersand_PaymentGateway</module>
|
169 |
+
<frontName>payment-gateway</frontName>
|
170 |
+
</args>
|
171 |
+
</ampersand_paymentgateway>
|
172 |
+
</routers>
|
173 |
+
<layout>
|
174 |
+
<updates>
|
175 |
+
<ampersand_paymentgateway>
|
176 |
+
<file>ampersand_paymentgateway.xml</file>
|
177 |
+
</ampersand_paymentgateway>
|
178 |
+
</updates>
|
179 |
+
</layout>
|
180 |
+
</frontend>
|
181 |
+
<adminhtml>
|
182 |
+
<layout>
|
183 |
+
<updates>
|
184 |
+
<ampersand_paymentgateway>
|
185 |
+
<file>ampersand_paymentgateway.xml</file>
|
186 |
+
</ampersand_paymentgateway>
|
187 |
+
</updates>
|
188 |
+
</layout>
|
189 |
+
</adminhtml>
|
190 |
+
<crontab>
|
191 |
+
<jobs>
|
192 |
+
<ampersand_paymentgateway_orderCleanup>
|
193 |
+
<schedule>
|
194 |
+
<config_path>ampersand_paymentgateway/cron_expressions/order_cleanup</config_path>
|
195 |
+
</schedule>
|
196 |
+
<run>
|
197 |
+
<model>ampersand_paymentgateway/cron::orderCleanup</model>
|
198 |
+
</run>
|
199 |
+
</ampersand_paymentgateway_orderCleanup>
|
200 |
+
<ampersand_paymentgateway_processSubscriptions>
|
201 |
+
<schedule>
|
202 |
+
<config_path>ampersand_paymentgateway/cron_expressions/process_subscriptions</config_path>
|
203 |
+
</schedule>
|
204 |
+
<run>
|
205 |
+
<model>ampersand_paymentgateway/cron::processSubscriptions</model>
|
206 |
+
</run>
|
207 |
+
</ampersand_paymentgateway_processSubscriptions>
|
208 |
+
<ampersand_paymentgateway_processSubscriptionReminders>
|
209 |
+
<schedule>
|
210 |
+
<config_path>ampersand_paymentgateway/cron_expressions/process_subscription_reminders</config_path>
|
211 |
+
</schedule>
|
212 |
+
<run>
|
213 |
+
<model>ampersand_paymentgateway/cron::processSubscriptionReminders</model>
|
214 |
+
</run>
|
215 |
+
</ampersand_paymentgateway_processSubscriptionReminders>
|
216 |
+
</jobs>
|
217 |
+
</crontab>
|
218 |
+
<default>
|
219 |
+
<ampersand_paymentgateway>
|
220 |
+
<notification>
|
221 |
+
<email_identity>general</email_identity>
|
222 |
+
<email_template>ampersand_paymentgateway_notification</email_template>
|
223 |
+
</notification>
|
224 |
+
<cleanup>
|
225 |
+
<active>1</active>
|
226 |
+
<order_timeframe>24</order_timeframe>
|
227 |
+
</cleanup>
|
228 |
+
<subscription>
|
229 |
+
<active>0</active>
|
230 |
+
<frequency_weekly>7</frequency_weekly>
|
231 |
+
<frequency_monthly>28</frequency_monthly>
|
232 |
+
<lead_time>0</lead_time>
|
233 |
+
<reminder_time>1</reminder_time>
|
234 |
+
<email_identity>general</email_identity>
|
235 |
+
<email_template>ampersand_paymentgateway_subscription_reminder</email_template>
|
236 |
+
</subscription>
|
237 |
+
<cron_expressions>
|
238 |
+
<order_cleanup>*/5 * * * *</order_cleanup>
|
239 |
+
<process_subscriptions>30 * * * *</process_subscriptions>
|
240 |
+
<process_subscription_reminders>* 4 * * *</process_subscription_reminders>
|
241 |
+
</cron_expressions>
|
242 |
+
</ampersand_paymentgateway>
|
243 |
+
</default>
|
244 |
+
<ampersand_paymentgateway>
|
245 |
+
<events>
|
246 |
+
|
247 |
+
<!-- START: Mage_Downloadable frontend -->
|
248 |
+
<sales_order_item_save_commit_after>
|
249 |
+
<observers>
|
250 |
+
<downloadable_observer>
|
251 |
+
<class>downloadable/observer</class>
|
252 |
+
<method>saveDownloadableOrderItem</method>
|
253 |
+
</downloadable_observer>
|
254 |
+
</observers>
|
255 |
+
</sales_order_item_save_commit_after>
|
256 |
+
<sales_order_save_commit_after>
|
257 |
+
<observers>
|
258 |
+
<downloadable_observer>
|
259 |
+
<class>downloadable/observer</class>
|
260 |
+
<method>setLinkStatus</method>
|
261 |
+
</downloadable_observer>
|
262 |
+
</observers>
|
263 |
+
</sales_order_save_commit_after>
|
264 |
+
<checkout_type_onepage_save_order_after>
|
265 |
+
<observers>
|
266 |
+
<checkout_type_onepage_save_order_after>
|
267 |
+
<class>downloadable/observer</class>
|
268 |
+
<method>setHasDownloadableProducts</method>
|
269 |
+
</checkout_type_onepage_save_order_after>
|
270 |
+
</observers>
|
271 |
+
</checkout_type_onepage_save_order_after>
|
272 |
+
<checkout_type_multishipping_create_orders_single>
|
273 |
+
<observers>
|
274 |
+
<checkout_type_multishipping_create_orders_single>
|
275 |
+
<class>downloadable/observer</class>
|
276 |
+
<method>setHasDownloadableProducts</method>
|
277 |
+
</checkout_type_multishipping_create_orders_single>
|
278 |
+
</observers>
|
279 |
+
</checkout_type_multishipping_create_orders_single>
|
280 |
+
<checkout_allow_guest>
|
281 |
+
<observers>
|
282 |
+
<checkout_allow_guest>
|
283 |
+
<class>downloadable/observer</class>
|
284 |
+
<method>isAllowedGuestCheckout</method>
|
285 |
+
</checkout_allow_guest>
|
286 |
+
</observers>
|
287 |
+
</checkout_allow_guest>
|
288 |
+
<product_option_renderer_init>
|
289 |
+
<observers>
|
290 |
+
<downloadable_observer>
|
291 |
+
<class>downloadable/observer</class>
|
292 |
+
<method>initOptionRenderer</method>
|
293 |
+
</downloadable_observer>
|
294 |
+
</observers>
|
295 |
+
</product_option_renderer_init>
|
296 |
+
<!-- END: Mage_Downloadable frontend -->
|
297 |
+
|
298 |
+
</events>
|
299 |
+
</ampersand_paymentgateway>
|
300 |
+
</config>
|
app/code/core/Ampersand/PaymentGateway/etc/system.xml
ADDED
@@ -0,0 +1,184 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<sections>
|
4 |
+
<payment>
|
5 |
+
<groups>
|
6 |
+
<ampersand_paymentgateway_hint>
|
7 |
+
<frontend_model>ampersand_paymentgateway/adminhtml_system_config_fieldset_hint</frontend_model>
|
8 |
+
<sort_order>9999</sort_order>
|
9 |
+
<show_in_default>1</show_in_default>
|
10 |
+
<show_in_website>1</show_in_website>
|
11 |
+
<show_in_store>1</show_in_store>
|
12 |
+
</ampersand_paymentgateway_hint>
|
13 |
+
</groups>
|
14 |
+
</payment>
|
15 |
+
<ampersand_paymentgateway translate="label" module="ampersand_paymentgateway">
|
16 |
+
<label>Payment Gateways</label>
|
17 |
+
<tab>ampersand_commerce</tab>
|
18 |
+
<frontend_type>text</frontend_type>
|
19 |
+
<sort_order>150</sort_order>
|
20 |
+
<show_in_default>1</show_in_default>
|
21 |
+
<show_in_website>1</show_in_website>
|
22 |
+
<show_in_store>1</show_in_store>
|
23 |
+
<groups>
|
24 |
+
<notification translate="label" module="ampersand_paymentgateway">
|
25 |
+
<label>Issue Notification</label>
|
26 |
+
<comment>Please enter comma seperated email addresses to be contacted in each of the scenarios relating to payment gateways. eg. <em>foo@bar.com, joe@bloggs.co.uk, etc.</em></comment>
|
27 |
+
<sort_order>10</sort_order>
|
28 |
+
<show_in_default>1</show_in_default>
|
29 |
+
<show_in_website>1</show_in_website>
|
30 |
+
<show_in_store>1</show_in_store>
|
31 |
+
<fields>
|
32 |
+
<email_identity translate="label">
|
33 |
+
<label>Email Sender</label>
|
34 |
+
<frontend_type>select</frontend_type>
|
35 |
+
<source_model>adminhtml/system_config_source_email_identity</source_model>
|
36 |
+
<sort_order>10</sort_order>
|
37 |
+
<show_in_default>1</show_in_default>
|
38 |
+
<show_in_website>1</show_in_website>
|
39 |
+
<show_in_store>0</show_in_store>
|
40 |
+
</email_identity>
|
41 |
+
<critical translate="label">
|
42 |
+
<label>Critical Issues</label>
|
43 |
+
<frontend_type>text</frontend_type>
|
44 |
+
<sort_order>20</sort_order>
|
45 |
+
<show_in_default>1</show_in_default>
|
46 |
+
<show_in_website>1</show_in_website>
|
47 |
+
<show_in_store>0</show_in_store>
|
48 |
+
<comment>eg. Magento encountered a problem when payment might have been already taken from customer.</comment>
|
49 |
+
</critical>
|
50 |
+
<warning translate="label">
|
51 |
+
<label>Warning Issues</label>
|
52 |
+
<frontend_type>text</frontend_type>
|
53 |
+
<sort_order>30</sort_order>
|
54 |
+
<show_in_default>1</show_in_default>
|
55 |
+
<show_in_website>1</show_in_website>
|
56 |
+
<show_in_store>0</show_in_store>
|
57 |
+
<comment>eg. The generation of a subscription order failed.</comment>
|
58 |
+
</warning>
|
59 |
+
</fields>
|
60 |
+
</notification>
|
61 |
+
<cleanup translate="label" module="ampersand_paymentgateway">
|
62 |
+
<label>Cleanup Tasks</label>
|
63 |
+
<sort_order>20</sort_order>
|
64 |
+
<show_in_default>1</show_in_default>
|
65 |
+
<show_in_website>0</show_in_website>
|
66 |
+
<show_in_store>0</show_in_store>
|
67 |
+
<fields>
|
68 |
+
<active translate="label">
|
69 |
+
<label>Enabled</label>
|
70 |
+
<frontend_type>select</frontend_type>
|
71 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
72 |
+
<sort_order>10</sort_order>
|
73 |
+
<show_in_default>1</show_in_default>
|
74 |
+
<show_in_website>1</show_in_website>
|
75 |
+
<show_in_store>0</show_in_store>
|
76 |
+
</active>
|
77 |
+
<order_timeframe translate="label">
|
78 |
+
<label>Order Timeframe</label>
|
79 |
+
<frontend_type>text</frontend_type>
|
80 |
+
<sort_order>20</sort_order>
|
81 |
+
<show_in_default>1</show_in_default>
|
82 |
+
<show_in_website>0</show_in_website>
|
83 |
+
<show_in_store>0</show_in_store>
|
84 |
+
<comment>This is the amount of time, in hours, to allow an order to be in the payment_review/on_hold state, before it is automatically cancelled.</comment>
|
85 |
+
</order_timeframe>
|
86 |
+
</fields>
|
87 |
+
</cleanup>
|
88 |
+
<subscription translate="label" module="ampersand_paymentgateway">
|
89 |
+
<label>Subscriptions</label>
|
90 |
+
<sort_order>30</sort_order>
|
91 |
+
<show_in_default>1</show_in_default>
|
92 |
+
<show_in_website>1</show_in_website>
|
93 |
+
<show_in_store>0</show_in_store>
|
94 |
+
<fields>
|
95 |
+
<active translate="label">
|
96 |
+
<label>Enabled</label>
|
97 |
+
<frontend_type>select</frontend_type>
|
98 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
99 |
+
<sort_order>10</sort_order>
|
100 |
+
<show_in_default>1</show_in_default>
|
101 |
+
<show_in_website>1</show_in_website>
|
102 |
+
<show_in_store>0</show_in_store>
|
103 |
+
</active>
|
104 |
+
<frequency_weekly translate="label">
|
105 |
+
<label>Days in a Week</label>
|
106 |
+
<frontend_type>text</frontend_type>
|
107 |
+
<sort_order>20</sort_order>
|
108 |
+
<show_in_default>1</show_in_default>
|
109 |
+
<show_in_website>1</show_in_website>
|
110 |
+
<show_in_store>0</show_in_store>
|
111 |
+
</frequency_weekly>
|
112 |
+
<frequency_monthly translate="label">
|
113 |
+
<label>Days in a Month</label>
|
114 |
+
<frontend_type>text</frontend_type>
|
115 |
+
<sort_order>30</sort_order>
|
116 |
+
<show_in_default>1</show_in_default>
|
117 |
+
<show_in_website>1</show_in_website>
|
118 |
+
<show_in_store>0</show_in_store>
|
119 |
+
</frequency_monthly>
|
120 |
+
<lead_time translate="label">
|
121 |
+
<label>Lead Time</label>
|
122 |
+
<frontend_type>text</frontend_type>
|
123 |
+
<sort_order>40</sort_order>
|
124 |
+
<show_in_default>1</show_in_default>
|
125 |
+
<show_in_website>1</show_in_website>
|
126 |
+
<show_in_store>0</show_in_store>
|
127 |
+
<comment>The number of days before each subscription date to process the subscription order.</comment>
|
128 |
+
</lead_time>
|
129 |
+
<email_identity translate="label">
|
130 |
+
<label>Reminder Email Sender</label>
|
131 |
+
<frontend_type>select</frontend_type>
|
132 |
+
<source_model>adminhtml/system_config_source_email_identity</source_model>
|
133 |
+
<sort_order>50</sort_order>
|
134 |
+
<show_in_default>1</show_in_default>
|
135 |
+
<show_in_website>1</show_in_website>
|
136 |
+
<show_in_store>0</show_in_store>
|
137 |
+
</email_identity>
|
138 |
+
<reminder_time translate="label">
|
139 |
+
<label>Reminder Time</label>
|
140 |
+
<frontend_type>text</frontend_type>
|
141 |
+
<sort_order>60</sort_order>
|
142 |
+
<show_in_default>1</show_in_default>
|
143 |
+
<show_in_website>1</show_in_website>
|
144 |
+
<show_in_store>0</show_in_store>
|
145 |
+
<comment>The number of days before each subscription date to remind the customer of the subscription order.</comment>
|
146 |
+
</reminder_time>
|
147 |
+
</fields>
|
148 |
+
</subscription>
|
149 |
+
<cron_expressions translate="label comment">
|
150 |
+
<label>Cron Expressions</label>
|
151 |
+
<frontend_type>text</frontend_type>
|
152 |
+
<sort_order>40</sort_order>
|
153 |
+
<show_in_default>1</show_in_default>
|
154 |
+
<show_in_website>0</show_in_website>
|
155 |
+
<show_in_store>0</show_in_store>
|
156 |
+
<comment><![CDATA[<strong>These are advanced settings - do not modify unless you fully understand cron expressions.</strong>]]></comment>
|
157 |
+
<fields>
|
158 |
+
<order_cleanup translate="label">
|
159 |
+
<label>Order Cleanup</label>
|
160 |
+
<sort_order>10</sort_order>
|
161 |
+
<show_in_default>1</show_in_default>
|
162 |
+
<show_in_website>0</show_in_website>
|
163 |
+
<show_in_store>0</show_in_store>
|
164 |
+
</order_cleanup>
|
165 |
+
<process_subscriptions translate="label">
|
166 |
+
<label>Process Subscriptions</label>
|
167 |
+
<sort_order>20</sort_order>
|
168 |
+
<show_in_default>1</show_in_default>
|
169 |
+
<show_in_website>0</show_in_website>
|
170 |
+
<show_in_store>0</show_in_store>
|
171 |
+
</process_subscriptions>
|
172 |
+
<process_subscription_reminders translate="label">
|
173 |
+
<label>Process Subscription Reminders</label>
|
174 |
+
<sort_order>30</sort_order>
|
175 |
+
<show_in_default>1</show_in_default>
|
176 |
+
<show_in_website>0</show_in_website>
|
177 |
+
<show_in_store>0</show_in_store>
|
178 |
+
</process_subscription_reminders>
|
179 |
+
</fields>
|
180 |
+
</cron_expressions>
|
181 |
+
</groups>
|
182 |
+
</ampersand_paymentgateway>
|
183 |
+
</sections>
|
184 |
+
</config>
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-install-0.0.1.php
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
CREATE TABLE `{$this->getTable('ampersand_paymentgateway/transaction')}` (
|
6 |
+
`entity_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
7 |
+
`created_at` DATETIME NOT NULL,
|
8 |
+
`updated_at` DATETIME NOT NULL,
|
9 |
+
`service_code` VARCHAR(255) NOT NULL,
|
10 |
+
`transaction_reference` VARCHAR(255) NOT NULL,
|
11 |
+
`payment_id` INT(10) NOT NULL,
|
12 |
+
`order_id` INT(10) NOT NULL,
|
13 |
+
PRIMARY KEY (`entity_id`),
|
14 |
+
UNIQUE KEY (`service_code`, `transaction_reference`),
|
15 |
+
INDEX (`transaction_reference`),
|
16 |
+
INDEX (`payment_id`),
|
17 |
+
INDEX (`order_id`)
|
18 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
19 |
+
");
|
20 |
+
|
21 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.1-0.0.2.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/transaction')}`
|
6 |
+
ADD `additional_information` TEXT NULL;
|
7 |
+
");
|
8 |
+
|
9 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.10-0.0.11.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/transaction')}`
|
6 |
+
ADD `subscription_data` TEXT NULL;
|
7 |
+
");
|
8 |
+
|
9 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.11-0.0.12.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/subscription')}`
|
6 |
+
ADD `remaining_updates_orig` INT(10) DEFAULT NULL,
|
7 |
+
ADD `remaining_updates_current` INT(10) DEFAULT NULL;
|
8 |
+
");
|
9 |
+
|
10 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.12-0.0.13.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/subscription')}`
|
6 |
+
ADD `is_reminder_sent` TINYINT(1) DEFAULT '0';
|
7 |
+
");
|
8 |
+
|
9 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.13-0.0.14.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/transaction')}`
|
6 |
+
ADD `error_message` TEXT NULL;
|
7 |
+
");
|
8 |
+
|
9 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.2-0.0.3.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/transaction')}`
|
6 |
+
ADD `transaction_type` VARCHAR(20) NULL;
|
7 |
+
");
|
8 |
+
|
9 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.3-0.0.4.php
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
CREATE TABLE `{$this->getTable('ampersand_paymentgateway/agreement')}` (
|
6 |
+
`entity_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
7 |
+
`created_at` DATETIME NOT NULL,
|
8 |
+
`updated_at` DATETIME NOT NULL,
|
9 |
+
`service_code` VARCHAR(255) NOT NULL,
|
10 |
+
`reference_id` VARCHAR(32) NOT NULL,
|
11 |
+
`token` VARCHAR(255) NOT NULL,
|
12 |
+
`customer_id` INT(10) NOT NULL,
|
13 |
+
`store_id` SMALLINT(5) NOT NULL,
|
14 |
+
`additional_information` TEXT NULL,
|
15 |
+
PRIMARY KEY (`entity_id`),
|
16 |
+
UNIQUE KEY (`service_code`, `reference_id`),
|
17 |
+
UNIQUE KEY (`token`),
|
18 |
+
INDEX (`customer_id`),
|
19 |
+
INDEX (`store_id`)
|
20 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
21 |
+
");
|
22 |
+
|
23 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.4-0.0.5.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/agreement')}`
|
6 |
+
DROP `token`;
|
7 |
+
");
|
8 |
+
|
9 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.5-0.0.6.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/transaction')}`
|
6 |
+
ADD `payment_amount` DECIMAL(12,4) NULL;
|
7 |
+
");
|
8 |
+
|
9 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.6-0.0.7.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
CREATE TABLE `{$this->getTable('ampersand_paymentgateway/subscription')}` (
|
6 |
+
`entity_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
7 |
+
`created_at` DATETIME NOT NULL,
|
8 |
+
`updated_at` DATETIME NOT NULL,
|
9 |
+
`order_id` INT(10) NOT NULL,
|
10 |
+
`agreement_id` INT(10) NOT NULL,
|
11 |
+
`method_code` VARCHAR(32) NOT NULL,
|
12 |
+
`frequency` VARCHAR(10) NOT NULL,
|
13 |
+
`frequency_type` VARCHAR(10) NOT NULL,
|
14 |
+
`start_date` DATETIME NOT NULL,
|
15 |
+
`next_order_date` DATETIME NOT NULL,
|
16 |
+
`is_active` TINYINT(1) NOT NULL,
|
17 |
+
PRIMARY KEY (`entity_id`),
|
18 |
+
UNIQUE KEY (`order_id`)
|
19 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
20 |
+
");
|
21 |
+
|
22 |
+
$this->run("
|
23 |
+
CREATE TABLE `{$this->getTable('ampersand_paymentgateway/subscription_order')}` (
|
24 |
+
`entity_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
25 |
+
`created_at` DATETIME NOT NULL,
|
26 |
+
`updated_at` DATETIME NOT NULL,
|
27 |
+
`subscription_id` INT(10) NOT NULL,
|
28 |
+
`order_id` INT(10) NOT NULL,
|
29 |
+
PRIMARY KEY (`entity_id`),
|
30 |
+
UNIQUE KEY (`subscription_id`, `order_id`)
|
31 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
32 |
+
");
|
33 |
+
|
34 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.7-0.0.8.php
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/subscription')}`
|
6 |
+
DROP INDEX `order_id`;
|
7 |
+
|
8 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/subscription')}`
|
9 |
+
ADD INDEX (`order_id`);
|
10 |
+
");
|
11 |
+
|
12 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.8-0.0.9.php
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/agreement')}`
|
6 |
+
ADD `card_type` VARCHAR(255) NULL,
|
7 |
+
ADD `card_last_four` VARCHAR(4) NULL,
|
8 |
+
ADD `card_expiry_month` VARCHAR(2) NULL,
|
9 |
+
ADD `card_expiry_year` VARCHAR(4) NULL;
|
10 |
+
");
|
11 |
+
|
12 |
+
$this->endSetup();
|
app/code/core/Ampersand/PaymentGateway/sql/ampersand_paymentgateway_setup/mysql4-upgrade-0.0.9-0.0.10.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$this->startSetup();
|
3 |
+
|
4 |
+
$this->run("
|
5 |
+
ALTER TABLE `{$this->getTable('ampersand_paymentgateway/subscription')}`
|
6 |
+
ADD `customer_id` INT(10) NOT NULL;
|
7 |
+
");
|
8 |
+
|
9 |
+
$this->endSetup();
|
app/code/local/Ampersand/BillingAgreementFix/Rewrite/Mage/Paypal/Helper/Data.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_BillingAgreementFix_Rewrite_Mage_Paypal_Helper_Data extends Mage_Paypal_Helper_Data
|
3 |
+
{
|
4 |
+
/**
|
5 |
+
* Rewritten to check for a specific payment method.
|
6 |
+
*
|
7 |
+
* @param Mage_Paypal_Model_Config $config
|
8 |
+
* @param int $customerId
|
9 |
+
* @return bool
|
10 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
11 |
+
*/
|
12 |
+
public function shouldAskToCreateBillingAgreement(Mage_Paypal_Model_Config $config, $customerId)
|
13 |
+
{
|
14 |
+
if (null === self::$_shouldAskToCreateBillingAgreement) {
|
15 |
+
self::$_shouldAskToCreateBillingAgreement = false;
|
16 |
+
if ($customerId && $config->shouldAskToCreateBillingAgreement()) {
|
17 |
+
$methodCode = Mage_Paypal_Model_Config::METHOD_BILLING_AGREEMENT;
|
18 |
+
$needToCreateForCustomer = Mage::getModel('sales/billing_agreement')
|
19 |
+
->needToCreateForCustomer($customerId, $methodCode);
|
20 |
+
|
21 |
+
if ($needToCreateForCustomer) {
|
22 |
+
self::$_shouldAskToCreateBillingAgreement = true;
|
23 |
+
}
|
24 |
+
}
|
25 |
+
}
|
26 |
+
return self::$_shouldAskToCreateBillingAgreement;
|
27 |
+
}
|
28 |
+
}
|
app/code/local/Ampersand/BillingAgreementFix/Rewrite/Mage/Paypal/Model/Express/Checkout.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_BillingAgreementFix_Rewrite_Mage_Paypal_Model_Express_Checkout
|
3 |
+
extends Mage_Paypal_Model_Express_Checkout
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Rewritten to check for a specific payment method.
|
7 |
+
*
|
8 |
+
* @return Mage_Paypal_Model_Express_Checkout
|
9 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
10 |
+
*/
|
11 |
+
protected function _setBillingAgreementRequest()
|
12 |
+
{
|
13 |
+
if (!$this->_customerId || $this->_quote->hasNominalItems()) {
|
14 |
+
return $this;
|
15 |
+
}
|
16 |
+
|
17 |
+
$isRequested = $this->_isBARequested || $this->_quote->getPayment()
|
18 |
+
->getAdditionalInformation(self::PAYMENT_INFO_TRANSPORT_BILLING_AGREEMENT);
|
19 |
+
|
20 |
+
if (!($this->_config->allow_ba_signup == Mage_Paypal_Model_Config::EC_BA_SIGNUP_AUTO
|
21 |
+
|| $isRequested && $this->_config->shouldAskToCreateBillingAgreement())) {
|
22 |
+
return $this;
|
23 |
+
}
|
24 |
+
|
25 |
+
$methodCode = Mage_Paypal_Model_Config::METHOD_BILLING_AGREEMENT;
|
26 |
+
$needToCreateForCustomer = Mage::getModel('sales/billing_agreement')
|
27 |
+
->needToCreateForCustomer($this->_customerId, $methodCode);
|
28 |
+
|
29 |
+
if (!$needToCreateForCustomer) {
|
30 |
+
return $this;
|
31 |
+
}
|
32 |
+
|
33 |
+
$this->_api->setBillingType($this->_api->getBillingAgreementType());
|
34 |
+
|
35 |
+
return $this;
|
36 |
+
}
|
37 |
+
}
|
app/code/local/Ampersand/BillingAgreementFix/Rewrite/Mage/Paypal/Model/Method/Agreement.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_BillingAgreementFix_Rewrite_Mage_Paypal_Model_Method_Agreement
|
3 |
+
extends Mage_Paypal_Model_Method_Agreement
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Rewritten to include the method code in the call to getAvailableCustomerBillingAgreements().
|
7 |
+
*
|
8 |
+
* @param Mage_Sales_Model_Quote $quote
|
9 |
+
* @return bool
|
10 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
11 |
+
*/
|
12 |
+
public function isAvailable($quote = null)
|
13 |
+
{
|
14 |
+
// we need to call the parent first otherwise it will override our checks below
|
15 |
+
$this->_isAvailable = parent::isAvailable($quote);
|
16 |
+
|
17 |
+
if (is_object($quote) && $quote->getCustomer()) {
|
18 |
+
$availableBA = Mage::getModel('sales/billing_agreement')
|
19 |
+
->getAvailableCustomerBillingAgreements($quote->getCustomer()->getId())
|
20 |
+
->addFieldToFilter('method_code', $this->_code);
|
21 |
+
$isAvailableBA = count($availableBA) > 0;
|
22 |
+
$this->_canUseCheckout = $this->_canUseInternal = $isAvailableBA;
|
23 |
+
}
|
24 |
+
|
25 |
+
return $this->_isAvailable;
|
26 |
+
}
|
27 |
+
}
|
app/code/local/Ampersand/BillingAgreementFix/Rewrite/Mage/Sales/Block/Payment/Form/Billing/Agreement.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_BillingAgreementFix_Rewrite_Mage_Sales_Block_Payment_Form_Billing_Agreement
|
3 |
+
extends Mage_Sales_Block_Payment_Form_Billing_Agreement
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Rewritten to restrict billing agreements to the appropriate payment method.
|
7 |
+
*
|
8 |
+
* @todo Add versioning to this method once Magento sort the problem
|
9 |
+
* @return array
|
10 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
11 |
+
*/
|
12 |
+
public function getBillingAgreements()
|
13 |
+
{
|
14 |
+
$data = array();
|
15 |
+
|
16 |
+
$quote = $this->getParentBlock()->getQuote();
|
17 |
+
if (!$quote || !$quote->getCustomer()) {
|
18 |
+
return $data;
|
19 |
+
}
|
20 |
+
|
21 |
+
$collection = Mage::getModel('sales/billing_agreement')
|
22 |
+
->getAvailableCustomerBillingAgreements($quote->getCustomer()->getId())
|
23 |
+
->addFieldToFilter('method_code', $this->getMethod()->getCode());
|
24 |
+
|
25 |
+
foreach ($collection as $item) {
|
26 |
+
$data[$item->getId()] = $item->getReferenceId();
|
27 |
+
}
|
28 |
+
|
29 |
+
return $data;
|
30 |
+
}
|
31 |
+
}
|
app/code/local/Ampersand/BillingAgreementFix/Rewrite/Mage/Sales/Model/Billing/Agreement.php
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Ampersand_BillingAgreementFix_Rewrite_Mage_Sales_Model_Billing_Agreement
|
3 |
+
extends Mage_Sales_Model_Billing_Agreement
|
4 |
+
{
|
5 |
+
/**
|
6 |
+
* Rewritten to check for a specific payment method.
|
7 |
+
*
|
8 |
+
* @param int $customerId
|
9 |
+
* @return bool
|
10 |
+
* @author Joseph McDermott <joseph.mcdermott@ampersandcommerce.com>
|
11 |
+
*/
|
12 |
+
public function needToCreateForCustomer($customerId)
|
13 |
+
{
|
14 |
+
// changing the accepted params would cause PHP Strict error due to parent declaration
|
15 |
+
$methodCode = func_get_arg(1);
|
16 |
+
|
17 |
+
if (!$customerId || !$methodCode) {
|
18 |
+
return false;
|
19 |
+
}
|
20 |
+
|
21 |
+
$collection = $this->getAvailableCustomerBillingAgreements($customerId)
|
22 |
+
->addFieldToFilter('method_code', $methodCode);
|
23 |
+
|
24 |
+
return $collection->count() == 0;
|
25 |
+
}
|
26 |
+
}
|
app/code/local/Ampersand/BillingAgreementFix/etc/config.xml
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<Ampersand_BillingAgreementFix>
|
5 |
+
<version>0.0.1</version>
|
6 |
+
</Ampersand_BillingAgreementFix>
|
7 |
+
</modules>
|
8 |
+
<global>
|
9 |
+
<blocks>
|
10 |
+
<sales>
|
11 |
+
<rewrite>
|
12 |
+
<payment_form_billing_agreement>Ampersand_BillingAgreementFix_Rewrite_Mage_Sales_Block_Payment_Form_Billing_Agreement</payment_form_billing_agreement>
|
13 |
+
</rewrite>
|
14 |
+
</sales>
|
15 |
+
</blocks>
|
16 |
+
<helpers>
|
17 |
+
<paypal>
|
18 |
+
<rewrite>
|
19 |
+
<data>Ampersand_BillingAgreementFix_Rewrite_Mage_Paypal_Helper_Data</data>
|
20 |
+
</rewrite>
|
21 |
+
</paypal>
|
22 |
+
</helpers>
|
23 |
+
<models>
|
24 |
+
<paypal>
|
25 |
+
<rewrite>
|
26 |
+
<express_checkout>Ampersand_BillingAgreementFix_Rewrite_Mage_Paypal_Model_Express_Checkout</express_checkout>
|
27 |
+
<method_agreement>Ampersand_BillingAgreementFix_Rewrite_Mage_Paypal_Model_Method_Agreement</method_agreement>
|
28 |
+
</rewrite>
|
29 |
+
</paypal>
|
30 |
+
<sales>
|
31 |
+
<rewrite>
|
32 |
+
<billing_agreement>Ampersand_BillingAgreementFix_Rewrite_Mage_Sales_Model_Billing_Agreement</billing_agreement>
|
33 |
+
</rewrite>
|
34 |
+
</sales>
|
35 |
+
</models>
|
36 |
+
</global>
|
37 |
+
</config>
|
app/design/adminhtml/base/default/layout/ampersand_paymentgateway.xml
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<layout>
|
3 |
+
<default>
|
4 |
+
<reference name="head">
|
5 |
+
<action method="addCss"><name>ampersand_paymentgateway/css/styles.css</name></action>
|
6 |
+
</reference>
|
7 |
+
</default>
|
8 |
+
</layout>
|
app/design/adminhtml/base/default/template/ampersand_paymentgateway/system/config/fieldset/hint.phtml
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
1 |
+
<div class="ampersand-paymentgateway-payment-notice">
|
2 |
+
<h4><?php echo Mage::helper('ampersand_paymentgateway')->__('Payment Gateways by <a href="http://ampersandcommerce.com" title="_blank">Ampersand Commerce</a>.')?></h4>
|
3 |
+
<p><a href="<?php echo $this->escapeHtml($this->getUrl('adminhtml/system_config/edit', array('section' => 'ampersand_paymentgateway'))) ?>" title="<?php echo Mage::helper('ampersand_paymentgateway')->__('Ampersand Payment Gateways')?>">Click here</a> to manage the general configuration settings that apply to all of the below Payment Gateways.</p>
|
4 |
+
</div>
|
app/design/frontend/base/default/layout/ampersand_paymentgateway.xml
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<layout>
|
3 |
+
<default>
|
4 |
+
<reference name="head">
|
5 |
+
<action method="addJs"><script>ampersand_paymentgateway/validation.js</script></action>
|
6 |
+
</reference>
|
7 |
+
</default>
|
8 |
+
|
9 |
+
<ampersand_paymentgateway_redirect_form>
|
10 |
+
<remove name="root"/>
|
11 |
+
<block type="ampersand_paymentgateway/redirect_form" name="ampersand_paymentgateway_redirect_form" output="toHtml"/>
|
12 |
+
</ampersand_paymentgateway_redirect_form>
|
13 |
+
|
14 |
+
<ampersand_paymentgateway_redirect_iframe>
|
15 |
+
<reference name="content">
|
16 |
+
<block type="ampersand_paymentgateway/redirect_iframe" name="ampersand_paymentgateway_redirect_iframe">
|
17 |
+
<action method="setSrcByRoute"><route>ampersand_paymentgateway/redirect/form</route></action>
|
18 |
+
</block>
|
19 |
+
</reference>
|
20 |
+
</ampersand_paymentgateway_redirect_iframe>
|
21 |
+
|
22 |
+
<ampersand_paymentgateway_redirect_location>
|
23 |
+
<remove name="root"/>
|
24 |
+
<block type="ampersand_paymentgateway/redirect_location" name="ampersand_paymentgateway_redirect_location" output="toHtml"/>
|
25 |
+
</ampersand_paymentgateway_redirect_location>
|
26 |
+
|
27 |
+
<ampersand_paymentgateway_checkout_onepage_failure>
|
28 |
+
<update handle="checkout_onepage_failure" />
|
29 |
+
</ampersand_paymentgateway_checkout_onepage_failure>
|
30 |
+
|
31 |
+
<ampersand_paymentgateway_customer_account_subscription_index translate="label">
|
32 |
+
<label>Customer My Account Subscriptions</label>
|
33 |
+
<update handle="customer_account"/>
|
34 |
+
<reference name="my.account.wrapper">
|
35 |
+
<block type="ampersand_paymentgateway/customer_account_subscription" name="ampersand_paymentgateway_customer_account_subscription" template="ampersand_paymentgateway/customer/account/subscription.phtml"/>
|
36 |
+
<block type="customer/account_dashboard" name="customer.account.link.back" template="customer/account/link/back.phtml"/>
|
37 |
+
</reference>
|
38 |
+
</ampersand_paymentgateway_customer_account_subscription_index>
|
39 |
+
|
40 |
+
<checkout_cart_index>
|
41 |
+
<reference name="head">
|
42 |
+
<action method="addCss"><stylesheet>ampersand_paymentgateway/css/cart.css</stylesheet></action>
|
43 |
+
</reference>
|
44 |
+
<reference name="checkout.cart">
|
45 |
+
<block type="core/text_list" name="checkout.cart.extra"/>
|
46 |
+
</reference>
|
47 |
+
<reference name="checkout.cart.extra">
|
48 |
+
<block type="ampersand_paymentgateway/checkout_cart_subscription" name="ampersand_paymentgateway_cart_subscription" template="ampersand_paymentgateway/checkout/cart/subscription.phtml"/>
|
49 |
+
</reference>
|
50 |
+
</checkout_cart_index>
|
51 |
+
|
52 |
+
<checkout_onepage_index>
|
53 |
+
<reference name="head">
|
54 |
+
<action method="addCss"><stylesheet>ampersand_paymentgateway/css/checkout.css</stylesheet></action>
|
55 |
+
</reference>
|
56 |
+
</checkout_onepage_index>
|
57 |
+
|
58 |
+
<checkout_onepage_review>
|
59 |
+
<reference name="checkout.onepage.review.info.items.after">
|
60 |
+
<block type="ampersand_paymentgateway/checkout_onepage_review_subscription" name="ampersand_paymentgateway_checkout_review" template="ampersand_paymentgateway/checkout/onepage/review/subscription.phtml" />
|
61 |
+
</reference>
|
62 |
+
</checkout_onepage_review>
|
63 |
+
|
64 |
+
<customer_account_subscriptions>
|
65 |
+
<update handle="ampersand_paymentgateway_customer_account_subscription_index"/>
|
66 |
+
</customer_account_subscriptions>
|
67 |
+
|
68 |
+
<customer_account>
|
69 |
+
<reference name="customer_account_navigation">
|
70 |
+
<action method="addLink" translate="label" module="ampersand_paymentgateway" ifconfig="ampersand_paymentgateway/subscription/active">
|
71 |
+
<name>subscriptions</name>
|
72 |
+
<path>customer/account/subscriptions</path>
|
73 |
+
<label>My Subscriptions</label>
|
74 |
+
</action>
|
75 |
+
</reference>
|
76 |
+
</customer_account>
|
77 |
+
</layout>
|
app/design/frontend/base/default/template/ampersand_paymentgateway/checkout/cart/subscription.phtml
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php if ($this->isActive()): ?>
|
2 |
+
<?php if ($this->isLoggedIn()): ?>
|
3 |
+
<div class="subscription">
|
4 |
+
<h2><?php echo $this->__('Subscribe to this order') ?></h2>
|
5 |
+
<form id="subscription-form" action="<?php echo $this->getUrl('ampersand_paymentgateway/checkout_cart_subscription/post') ?>" method="post">
|
6 |
+
<fieldset>
|
7 |
+
<input type="hidden" name="remove" id="remove-subscription" value="0" />
|
8 |
+
|
9 |
+
<label for="period"><?php echo $this->__('Select your subscription period.') ?></label>
|
10 |
+
<select name="period" id="period" title="<?php echo $this->__('Period') ?>" class="validate-select">
|
11 |
+
<?php foreach ($this->getPeriods() as $_period): ?>
|
12 |
+
<?php $_selected = ($_period['value'] == $this->getSubscriptionPeriod()) ? ' SELECTED' : ''; ?>
|
13 |
+
<option value="<?php echo $_period['value']; ?>"<?php echo $_selected; ?>><?php echo $_period['label']; ?></option>
|
14 |
+
<?php endforeach; ?>
|
15 |
+
</select>
|
16 |
+
<button type="button" class="button" onclick="subscriptionForm.submit(false)" value="<?php echo $this->__('Subscribe') ?>"><span><span><?php echo $this->__('Subscribe') ?></span></span></button>
|
17 |
+
|
18 |
+
<?php if ($this->getSubscriptionPeriod()): ?>
|
19 |
+
<button type="button" class="button cancel-btn" onclick="subscriptionForm.submit(true)" value="<?php echo $this->__('Cancel Subscription') ?>"><span><span><?php echo $this->__('Cancel Subscription') ?></span></span></button>
|
20 |
+
<?php endif; ?>
|
21 |
+
</fieldset>
|
22 |
+
</form>
|
23 |
+
<script type="text/javascript">
|
24 |
+
//<![CDATA[
|
25 |
+
var subscriptionForm = new VarienForm('subscription-form');
|
26 |
+
subscriptionForm.submit = function (isRemove) {
|
27 |
+
if (isRemove) {
|
28 |
+
$('period').removeClassName('required-entry');
|
29 |
+
$('remove-subscription').value = "1";
|
30 |
+
} else {
|
31 |
+
$('period').addClassName('required-entry');
|
32 |
+
$('remove-subscription').value = "0";
|
33 |
+
}
|
34 |
+
return VarienForm.prototype.submit.bind(subscriptionForm)();
|
35 |
+
}
|
36 |
+
//]]>
|
37 |
+
</script>
|
38 |
+
</div>
|
39 |
+
<?php else: ?>
|
40 |
+
<div class="subscription">
|
41 |
+
<h2><?php echo $this->__('Subscribe to this order') ?></h2>
|
42 |
+
<p><?php echo $this->__('You must be logged in to subscribe.'); ?></p>
|
43 |
+
</div>
|
44 |
+
<?php endif; ?>
|
45 |
+
<?php endif; ?>
|
app/design/frontend/base/default/template/ampersand_paymentgateway/checkout/onepage/review/subscription.phtml
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php if ($this->isActive()): ?>
|
2 |
+
|
3 |
+
<?php $info = $this->getSubscriptionInfo(); ?>
|
4 |
+
<div class="subscription-review">
|
5 |
+
<p class="f-right"><?php echo $this->__('A %s subscription will be created upon completion of this order.', $info->getPeriod()) ?></p>
|
6 |
+
</div>
|
7 |
+
|
8 |
+
<?php endif; ?>
|
app/design/frontend/base/default/template/ampersand_paymentgateway/customer/account/subscription.phtml
ADDED
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php $_subscriptions = $this->getSubscriptions(); ?>
|
2 |
+
<?php echo $this->getMessagesBlock()->getGroupedHtml() ?>
|
3 |
+
|
4 |
+
<div class="page-title">
|
5 |
+
<h1><?php echo $this->__('My Subscriptions') ?></h1>
|
6 |
+
</div>
|
7 |
+
|
8 |
+
<?php if ($_subscriptions->getSize()): ?>
|
9 |
+
|
10 |
+
<?php echo $this->getPagerHtml(); ?>
|
11 |
+
|
12 |
+
<table class="data-table" id="my-subscriptions-table">
|
13 |
+
<col width="1" />
|
14 |
+
<col width="1" />
|
15 |
+
<col width="1" />
|
16 |
+
<col width="1" />
|
17 |
+
<col width="1" />
|
18 |
+
<thead>
|
19 |
+
<tr>
|
20 |
+
<th><?php echo $this->__('Date') ?></th>
|
21 |
+
<th><?php echo $this->__('Order #') ?></th>
|
22 |
+
<th><?php echo $this->__('Payment Method') ?></th>
|
23 |
+
<th><?php echo $this->__('Next Order') ?></th>
|
24 |
+
<th> </th>
|
25 |
+
</tr>
|
26 |
+
</thead>
|
27 |
+
<tbody>
|
28 |
+
<?php foreach ($_subscriptions as $_subscription): ?>
|
29 |
+
<?php $_order = $this->getOrder($_subscription->getOrderId()); ?>
|
30 |
+
<?php $_cardDetails = $this->getPaymentMethodCardDetails($_subscription->getAgreementId()); ?>
|
31 |
+
<tr>
|
32 |
+
<td><?php echo $this->formatDate($_subscription->getCreatedAt(), 'short') ?></td>
|
33 |
+
<td><a href="<?php echo $this->getOrderUrl($_order) ?>"><?php echo $_order->getRealOrderId() ?></a></td>
|
34 |
+
<td>
|
35 |
+
<?php echo $this->getPaymentMethod($_subscription->getMethodCode()) ?>
|
36 |
+
<br /><span class="nobr"><?php echo $this->__(
|
37 |
+
'(%s card ending %s, expiry %s/%s)',
|
38 |
+
$this->getCardType($_cardDetails->getCardType()),
|
39 |
+
$_cardDetails->getCardLastFour(),
|
40 |
+
$_cardDetails->getCardExpiryMonth(),
|
41 |
+
$_cardDetails->getCardExpiryYear()
|
42 |
+
) ?></span>
|
43 |
+
</td>
|
44 |
+
<td><?php echo $this->formatDate($_subscription->getNextOrderDate(), 'short') ?></td>
|
45 |
+
<td class="a-center">
|
46 |
+
<span class="nobr">
|
47 |
+
<a href="#" onclick="return cancelSubscription('<?php echo $_subscription->getId() ?>');"><?php echo $this->__('Cancel') ?></a>
|
48 |
+
<span class="separator">|</span>
|
49 |
+
<a href="#" onclick="return skipSubscription('<?php echo $_subscription->getId() ?>');"><?php echo $this->__('Skip Next') ?></a>
|
50 |
+
</span>
|
51 |
+
</td>
|
52 |
+
</tr>
|
53 |
+
<?php endforeach; ?>
|
54 |
+
</tbody>
|
55 |
+
</table>
|
56 |
+
|
57 |
+
<?php echo $this->getPagerHtml(); ?>
|
58 |
+
|
59 |
+
<script type="text/javascript">
|
60 |
+
//<![CDATA[
|
61 |
+
decorateTable('my-subscriptions-table');
|
62 |
+
|
63 |
+
function cancelSubscription(subscriptionId) {
|
64 |
+
if (confirm('<?php echo $this->__('Are you sure you want to cancel this subscription?') ?>')) {
|
65 |
+
window.location='<?php echo $this->getCancelUrl() ?>id/' + subscriptionId;
|
66 |
+
}
|
67 |
+
return false;
|
68 |
+
}
|
69 |
+
|
70 |
+
function skipSubscription(subscriptionId) {
|
71 |
+
if (confirm('<?php echo $this->__('Are you sure you want to skip the next order for this subscription?') ?>')) {
|
72 |
+
window.location='<?php echo $this->getSkipNextUrl() ?>id/' + subscriptionId;
|
73 |
+
}
|
74 |
+
return false;
|
75 |
+
}
|
76 |
+
//]]>
|
77 |
+
</script>
|
78 |
+
|
79 |
+
<?php else: ?>
|
80 |
+
|
81 |
+
<p><?php echo $this->__('You have no active subscriptions.'); ?></p>
|
82 |
+
|
83 |
+
<?php endif ?>
|
app/design/frontend/base/default/template/ampersand_paymentgateway/payment/form/billing-agreement-checkbox.phtml
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php $_code = $this->getParentBlock()->getMethodCode() ?>
|
2 |
+
<li class="form-alt">
|
3 |
+
|
4 |
+
<?php if ($this->getForceBillingAgreement()): ?>
|
5 |
+
|
6 |
+
<label for="<?php echo $_code ?>_billing_agreement_selection">
|
7 |
+
<input type="checkbox" id="<?php echo $_code ?>_billing_agreement_selection" name="payment[billing_agreement_selection]" class="checkbox" value="1" disabled="disabled" checked="checked" />
|
8 |
+
<?php echo $this->__('A billing agreement will be created to process your order.') ?>
|
9 |
+
</label>
|
10 |
+
|
11 |
+
<script type="text/javascript">
|
12 |
+
//<![CDATA[
|
13 |
+
var agreementCheckbox = $('<?php echo $_code ?>_billing_agreement_selection');
|
14 |
+
agreementCheckbox.observe('click', function() {
|
15 |
+
agreementCheckbox.checked = 'checked';
|
16 |
+
});
|
17 |
+
//]]>
|
18 |
+
</script>
|
19 |
+
|
20 |
+
<?php else: ?>
|
21 |
+
|
22 |
+
<label for="<?php echo $_code ?>_billing_agreement_selection">
|
23 |
+
<input type="checkbox" id="<?php echo $_code ?>_billing_agreement_selection" name="payment[billing_agreement_selection]" class="checkbox" value="1" />
|
24 |
+
<?php echo $this->__('Create billing agreement with these details for future use?') ?>
|
25 |
+
</label>
|
26 |
+
|
27 |
+
<?php endif; ?>
|
28 |
+
|
29 |
+
</li>
|
app/design/frontend/base/default/template/ampersand_paymentgateway/payment/form/billing-agreement-cv2.phtml
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php $_code = $this->getParentBlock()->getMethodCode() ?>
|
2 |
+
<li>
|
3 |
+
<label for="<?php echo $_code ?>_billing_agreement_cv2" class="required"><em>*</em><?php echo $this->__('Card Verification Number') ?></label>
|
4 |
+
<div class="input-box">
|
5 |
+
<div class="v-fix">
|
6 |
+
<input type="text" title="<?php echo $this->__('Card Verification Number') ?>" class="input-text cvv required-entry validate-cc-cvn" id="<?php echo $_code ?>_billing_agreement_cv2" name="payment[billing_agreement_cv2]" value="" />
|
7 |
+
</div>
|
8 |
+
<a href="#" class="cvv-what-is-this"><?php echo $this->__('What is this?') ?></a>
|
9 |
+
</div>
|
10 |
+
</li>
|
app/design/frontend/base/default/template/ampersand_paymentgateway/payment/form/redirect.phtml
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php $_code = $this->getMethodCode() ?>
|
2 |
+
<ul class="form-list" id="payment_form_<?php echo $_code ?>" style="display:none;">
|
3 |
+
|
4 |
+
<li><?php echo $this->__('You will be redirected to the payment gateway after placing your order.') ?></li>
|
5 |
+
|
6 |
+
<?php if ($this->isCcTypeRequired()): ?>
|
7 |
+
<li>
|
8 |
+
<label for="<?php echo $_code ?>_cc_type" class="required"><em>*</em><?php echo $this->__('Credit Card Type'); ?></label>
|
9 |
+
<div class="input-box">
|
10 |
+
<select id="<?php echo $_code ?>_cc_type" name="payment[cc_type]" class="required-entry">
|
11 |
+
<option value=""><?php echo $this->__('--Please Select--'); ?></option>
|
12 |
+
<?php $_ccType = $this->getInfoData('cc_type'); ?>
|
13 |
+
<?php foreach ($this->getCcAvailableTypes() as $_typeCode => $_typeName): ?>
|
14 |
+
<option value="<?php echo $_typeCode ?>"<?php if ($_typeCode == $_ccType): ?> selected="selected"<?php endif ?>><?php echo $_typeName; ?></option>
|
15 |
+
<?php endforeach; ?>
|
16 |
+
</select>
|
17 |
+
</div>
|
18 |
+
</li>
|
19 |
+
<?php endif; ?>
|
20 |
+
|
21 |
+
</ul>
|
app/design/frontend/base/default/template/ampersand_paymentgateway/redirect/form.phtml
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<html>
|
2 |
+
<head>
|
3 |
+
<title><?php echo $this->__($this->getTitle()) ?></title>
|
4 |
+
</head>
|
5 |
+
<body>
|
6 |
+
<?php if ($redirectUrl = $this->getRedirectUrl()): ?>
|
7 |
+
<form action="<?php echo $redirectUrl ?>" name="ampersand_redirect_form" method="POST" style="width:100%; text-align:center;">
|
8 |
+
<?php foreach ($this->getHiddenFields() as $_fieldName => $_value): ?>
|
9 |
+
<input type="hidden" name="<?php echo $_fieldName ?>" value="<?php echo $_value ?>" />
|
10 |
+
<?php endforeach; ?>
|
11 |
+
|
12 |
+
<input type="submit" value="<?php echo $this->__('Please click here if you are not automatically redirected after a few seconds...'); ?>" />
|
13 |
+
</form>
|
14 |
+
<script type="text/javascript">
|
15 |
+
//<![CDATA[
|
16 |
+
document.ampersand_redirect_form.submit();
|
17 |
+
//]]>
|
18 |
+
</script>
|
19 |
+
<?php else: ?>
|
20 |
+
<p><?php echo $this->__($this->getNoRedirectUrlMessage()) ?></p>
|
21 |
+
<?php endif; ?>
|
22 |
+
</body>
|
23 |
+
</html>
|
app/design/frontend/base/default/template/ampersand_paymentgateway/redirect/iframe.phtml
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<iframe
|
2 |
+
src="<?php echo $this->getSrc() ?>"
|
3 |
+
width="<?php echo $this->getWidth() ?>"
|
4 |
+
height="<?php echo $this->getHeight() ?>"
|
5 |
+
frameborder="0">
|
6 |
+
</iframe>
|
app/design/frontend/base/default/template/ampersand_paymentgateway/redirect/location.phtml
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<html>
|
2 |
+
<head>
|
3 |
+
<title><?php echo $this->__($this->getTitle()) ?></title>
|
4 |
+
</head>
|
5 |
+
<body>
|
6 |
+
<script type="text/javascript">
|
7 |
+
//<![CDATA[
|
8 |
+
window.top.location.href='<?php echo $this->getRedirectUrl() ?>';
|
9 |
+
//]]>
|
10 |
+
</script>
|
11 |
+
</body>
|
12 |
+
</html>
|
app/design/frontend/base/default/template/ampersand_paymentgateway/sales/payment/form/billing/agreement.phtml
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php $_code = $this->getMethodCode() ?>
|
2 |
+
<ul class="form-list" id="payment_form_<?php echo $_code ?>" style="display:none;">
|
3 |
+
|
4 |
+
<li>
|
5 |
+
<table id="ampersand-billing-agreement-table" class="data-table">
|
6 |
+
<col width="1" />
|
7 |
+
<col width="1" />
|
8 |
+
<col width="1" />
|
9 |
+
<col width="1" />
|
10 |
+
<col width="1" />
|
11 |
+
<thead>
|
12 |
+
<tr>
|
13 |
+
<th><span class="nobr"><?php echo $this->__('Created') ?></span></th>
|
14 |
+
<th><span class="nobr"><?php echo $this->__('Card Type') ?></span></th>
|
15 |
+
<th><span class="nobr"><?php echo $this->__('Card Number') ?></span></th>
|
16 |
+
<th><span class="nobr"><?php echo $this->__('Card Expiry') ?></span></th>
|
17 |
+
<th> </th>
|
18 |
+
</tr>
|
19 |
+
</thead>
|
20 |
+
<tbody>
|
21 |
+
<?php foreach ($this->getBillingAgreements() as $id => $agreement): ?>
|
22 |
+
<tr>
|
23 |
+
<td><?php echo $this->formatDate($agreement->getCreatedAt(), 'short') ?></td>
|
24 |
+
<td><?php echo $this->getCardType($agreement->getCardType()) ?></td>
|
25 |
+
<td>**** **** **** <?php echo $agreement->getCardLastFour() ?></td>
|
26 |
+
<td><?php echo $agreement->getCardExpiryMonth() ?>/<?php echo $agreement->getCardExpiryYear() ?></td>
|
27 |
+
<td><input type="radio" name="payment[<?php echo $this->getTransportName(); ?>]" class="validate-one-required-by-name" value="<?php echo $id ?>" /></td>
|
28 |
+
</tr>
|
29 |
+
<?php endforeach; ?>
|
30 |
+
</tbody>
|
31 |
+
</table>
|
32 |
+
|
33 |
+
<script type="text/javascript">
|
34 |
+
//<![CDATA[
|
35 |
+
decorateTable('ampersand-billing-agreement-table');
|
36 |
+
//]]>
|
37 |
+
</script>
|
38 |
+
</li>
|
39 |
+
|
40 |
+
<?php echo $this->getChildHtml() ?>
|
41 |
+
|
42 |
+
</ul>
|
app/etc/modules/Ampersand_BillingAgreementFix.xml
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<Ampersand_BillingAgreementFix>
|
5 |
+
<active>true</active>
|
6 |
+
<codePool>local</codePool>
|
7 |
+
</Ampersand_BillingAgreementFix>
|
8 |
+
</modules>
|
9 |
+
</config>
|
app/etc/modules/Ampersand_PaymentGateway.xml
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<Ampersand_PaymentGateway>
|
5 |
+
<active>true</active>
|
6 |
+
<codePool>core</codePool>
|
7 |
+
<depends>
|
8 |
+
<Mage_Payment/>
|
9 |
+
<Mage_Checkout/>
|
10 |
+
<Ampersand_Core/>
|
11 |
+
<Ampersand_Api/>
|
12 |
+
<Ampersand_Integration/>
|
13 |
+
|
14 |
+
<!--
|
15 |
+
Ampersand_PaymentGateway_Block_Payment_Form_BillingAgreement
|
16 |
+
requires a class from Ampersand_BillingAgreementFix.
|
17 |
+
Once Magento provide an official fix, this dependency can be removed.
|
18 |
+
-->
|
19 |
+
<Ampersand_BillingAgreementFix/>
|
20 |
+
</depends>
|
21 |
+
</Ampersand_PaymentGateway>
|
22 |
+
</modules>
|
23 |
+
</config>
|
app/locale/en_US/template/email/ampersand_paymentgateway/notification.html
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!--@subject {{var title}} @-->
|
2 |
+
<!--@vars
|
3 |
+
{"var summary":"Summary"}
|
4 |
+
{"var base_url":"Magento Instance"}
|
5 |
+
{"var items":"Items"}
|
6 |
+
{"var exception_message":"Exception Message"}
|
7 |
+
{"var exception_trace":"Exception Trace"}
|
8 |
+
@-->
|
9 |
+
<strong>Summary:</strong><br />
|
10 |
+
{{var summary}}
|
11 |
+
<br /><br />
|
12 |
+
|
13 |
+
<strong>Magento Instance:</strong><br />
|
14 |
+
{{var base_url}}
|
15 |
+
<br /><br />
|
16 |
+
|
17 |
+
{{var items}}
|
18 |
+
|
19 |
+
<strong>Exception Message:</strong><br />
|
20 |
+
{{var exception_message}}
|
21 |
+
<br /><br />
|
22 |
+
|
23 |
+
<strong>Exception Trace:</strong><br />
|
24 |
+
{{var exception_trace}}
|
25 |
+
<br /><br />
|
app/locale/en_US/template/email/ampersand_paymentgateway/subscription_reminder.html
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!--@subject Your subscription will be processed soon, {{var customer.name}}! @-->
|
2 |
+
<!--@vars
|
3 |
+
{"store url=\"\"":"Store Url",
|
4 |
+
"var logo_url":"Email Logo Image Url",
|
5 |
+
"htmlescape var=$customer.name":"Customer Name",
|
6 |
+
"store url=\"customer/account/\"":"Customer Account Url"}
|
7 |
+
@-->
|
8 |
+
|
9 |
+
<!--@styles
|
10 |
+
body,td { color:#2f2f2f; font:11px/1.35em Verdana, Arial, Helvetica, sans-serif; }
|
11 |
+
@-->
|
12 |
+
|
13 |
+
<body style="background:#F6F6F6; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px; margin:0; padding:0;">
|
14 |
+
<div style="background:#F6F6F6; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px; margin:0; padding:0;">
|
15 |
+
<table cellspacing="0" cellpadding="0" border="0" height="100%" width="100%">
|
16 |
+
<tr>
|
17 |
+
<td align="center" valign="top" style="padding:20px 0 20px 0">
|
18 |
+
<table bgcolor="FFFFFF" cellspacing="0" cellpadding="10" border="0" width="650" style="border:1px solid #E0E0E0;">
|
19 |
+
<tr>
|
20 |
+
<td valign="top">
|
21 |
+
<a href="{{store url=""}}"><img src="{{var logo_url}}" alt="{{var logo_alt}}" style="margin-bottom:10px;" border="0"/></a></td>
|
22 |
+
</tr>
|
23 |
+
<tr>
|
24 |
+
<td valign="top">
|
25 |
+
<h1 style="font-size:22px; font-weight:normal; line-height:22px; margin:0 0 11px 0;"">Dear {{htmlescape var=$customer.name}},</h1>
|
26 |
+
<p style="font-size:12px; line-height:16px; margin:0 0 16px 0;">
|
27 |
+
This is just a reminder that your subscription at {{var store.getFrontendName()}} will be processed soon.
|
28 |
+
If you would like to cancel for any reason, you can do in your customer account area by clicking <a href="{{store url="customer/account/subscriptions"}}" style="color:#1E7EC8;">here</a>.
|
29 |
+
</p>
|
30 |
+
<p style="font-size:12px; line-height:16px; margin:0;">
|
31 |
+
If you have any questions about your subscription or any other matter, please feel free to contact us at <a href="mailto:{{config path='trans_email/ident_support/email'}}" style="color:#1E7EC8;">{{config path='trans_email/ident_support/email'}}</a> or by phone at {{config path='general/store_information/phone'}}.
|
32 |
+
</p>
|
33 |
+
</td>
|
34 |
+
</tr>
|
35 |
+
<tr>
|
36 |
+
<td bgcolor="#EAEAEA" align="center" style="background:#EAEAEA; text-align:center;"><center><p style="font-size:12px; margin:0;">Thank you again, <strong>{{var store.getFrontendName()}}</strong></p></center></td>
|
37 |
+
</tr>
|
38 |
+
</table>
|
39 |
+
</td>
|
40 |
+
</tr>
|
41 |
+
</table>
|
42 |
+
</div>
|
43 |
+
</body>
|
js/ampersand_paymentgateway/validation.js
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
// Notes:
|
2 |
+
// - Card number expressions must exactly identify a card type. ie. you cannot use the same regex for multiple cards.
|
3 |
+
// - All expressions must match the values in Ampersand_PaymentGateway_Model_Method_DirectAbstract.
|
4 |
+
Validation.creditCartTypes.set('AMPERSAND_CARTES_BANCAIRES', [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), true]);
|
5 |
+
Validation.creditCartTypes.set('AMPERSAND_MASTERCARD_DEBIT', [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), true]);
|
6 |
+
Validation.creditCartTypes.set('AMPERSAND_VISA_DELTA', [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), true]);
|
7 |
+
Validation.creditCartTypes.set('AMPERSAND_VISA_ELECTRON', [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), true]);
|
8 |
+
Validation.creditCartTypes.set('AMPERSAND_VISA_PURCHASING', [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), true]);
|
9 |
+
Validation.creditCartTypes.set('AMPERSAND_LASER', [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), true]);
|
10 |
+
Validation.creditCartTypes.set('AMPERSAND_DINERS_CLUB', [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), true]);
|
11 |
+
Validation.creditCartTypes.set('AMPERSAND_VPAY', [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), true]);
|
package.xml
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<package>
|
3 |
+
<name>Ampersand_PaymentGateway</name>
|
4 |
+
<version>0.1.4</version>
|
5 |
+
<stability>stable</stability>
|
6 |
+
<license uri="http://www.opensource.org/licenses/gpl-license.php">GNU General Public License (GPL)</license>
|
7 |
+
<channel>community</channel>
|
8 |
+
<extends/>
|
9 |
+
<summary>Ampersand Payment Gateway framework from Ampersand Commerce.</summary>
|
10 |
+
<description>Ampersand Payment Gateway framework from Ampersand Commerce.</description>
|
11 |
+
<notes>Ampersand_PaymentGateway v0.1.4</notes>
|
12 |
+
<authors><author><name>AmpersandHQ</name><user>auto-converted</user><email>magento@ampersandcommerce.com</email></author></authors>
|
13 |
+
<date>2013-01-24</date>
|
14 |
+
<time>16:55:09</time>
|
15 |
+
<contents><target name="magelocal"><dir name="Ampersand"><dir name="BillingAgreementFix"><dir name="etc"><file name="config.xml" hash="182ff5f59378cb85f2e640dab93e1d91"/></dir><dir name="Rewrite"><dir name="Mage"><dir name="Sales"><dir name="Block"><dir name="Payment"><dir name="Form"><dir name="Billing"><file name="Agreement.php" hash="ba18d3e86edacc6455e84e682e100190"/></dir></dir></dir></dir><dir name="Model"><dir name="Billing"><file name="Agreement.php" hash="09122c7aad1b186ef87e9c79fee62940"/></dir></dir></dir><dir name="Paypal"><dir name="Helper"><file name="Data.php" hash="5eb5f7e6fcad4ff6e48e12c7d9517a7a"/></dir><dir name="Model"><dir name="Express"><file name="Checkout.php" hash="9572f6a8a94b851ea2b9f5f7caf1fee7"/></dir><dir name="Method"><file name="Agreement.php" hash="d35b02f584e0359fb12aa685b1bc94a1"/></dir></dir></dir></dir></dir></dir></dir></target><target name="magecore"><dir name="Ampersand"><dir name="PaymentGateway"><dir name="Block"><dir name="Redirect"><file name="Iframe.php" hash="b896215490bb40fdbe3a50b45f73ec7b"/><file name="Form.php" hash="199184b410f7de50cd3cf2108021120f"/><file name="Location.php" hash="aabfaf8543541d11a098145f83d3e294"/></dir><dir name="Adminhtml"><dir name="System"><dir name="Config"><dir name="Fieldset"><file name="Hint.php" hash="389f6fc34bb33b049a6372a68a0f52f7"/></dir></dir></dir><dir name="Subscription"><dir name="Order"><file name="Grid.php" hash="4c1df2f20be9af3c4a0754cb1761ba48"/></dir><dir name="Edit"><file name="Form.php" hash="e070aa1106a6efb043313e959ac06195"/></dir><file name="Order.php" hash="493baa23d6c205002f06f26f49b84852"/><file name="Edit.php" hash="0bc4ad5fa46cd02740fb64c027502eed"/><file name="Grid.php" hash="a64d41c912d31995f2fc0fef37922773"/></dir><file name="Subscription.php" hash="5820166cc7762b370644936a01d51530"/></dir><dir name="Checkout"><dir name="Onepage"><dir name="Review"><file name="Subscription.php" hash="888e9b4af5749dfa58f31087591eab18"/></dir></dir><dir name="Cart"><file name="Subscription.php" hash="aefee3bff9660b4a360d8a0928c7cc46"/></dir></dir><dir name="Payment"><dir name="Form"><file name="BillingAgreementCheckbox.php" hash="2057de4e06ca0c92ccfe149e39e4df11"/><file name="Subscription.php" hash="c0c27e0802aab6bf98e0e6dc60f598d7"/><file name="Redirect.php" hash="7a0db3f83604c4bae31e49694d14d362"/><file name="BillingAgreement.php" hash="f022d1358e33976ccbd97629535a3dbb"/><file name="BillingAgreementCv2.php" hash="d402e86f22f044bc2b438d0f8370106c"/></dir><dir name="Info"><file name="Redirect.php" hash="befe27b6d3a0bad1dd79d9698d15ea16"/></dir></dir><dir name="Customer"><dir name="Account"><file name="Subscription.php" hash="fa70122cb56980ccb5b1d2ccd12fc8a8"/></dir></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="16c35ebeecaac1fdfb78b39fbfef8877"/><file name="config.xml" hash="d67a60ccf310829c26bdecd2eac5b745"/><file name="system.xml" hash="771dbf0516800e9005ed8a6d7e46ef5a"/></dir><dir name="sql"><dir name="ampersand_paymentgateway_setup"><file name="mysql4-upgrade-0.0.1-0.0.2.php" hash="b96f410245acdab1bac40be098cdf4ce"/><file name="mysql4-upgrade-0.0.9-0.0.10.php" hash="38eef68653f1a67fde4a2052d7689026"/><file name="mysql4-upgrade-0.0.2-0.0.3.php" hash="cd17a587f66e754b93038ba15aedf3a6"/><file name="mysql4-upgrade-0.0.12-0.0.13.php" hash="518960f36caf0083ba21657a18e08ccf"/><file name="mysql4-upgrade-0.0.5-0.0.6.php" hash="10082a8a8f0c087de164e99cf98f0f57"/><file name="mysql4-upgrade-0.0.7-0.0.8.php" hash="2bd23a19b2f5f95c317422965fc28e47"/><file name="mysql4-upgrade-0.0.4-0.0.5.php" hash="1c86fbd3c84be59c3c04a74e6f7d52c2"/><file name="mysql4-upgrade-0.0.8-0.0.9.php" hash="9e5e4daa4696083b1a2ce899c7b10a7c"/><file name="mysql4-install-0.0.1.php" hash="6496424212e5efd6e4cc5475b0daef07"/><file name="mysql4-upgrade-0.0.11-0.0.12.php" hash="d395b9cf9f98d8aeefd0d5817e3fd819"/><file name="mysql4-upgrade-0.0.10-0.0.11.php" hash="f29952c10a05f075d8afb73fd0d2468f"/><file name="mysql4-upgrade-0.0.3-0.0.4.php" hash="b43beea075582cfa471dd4ce2ec394ce"/><file name="mysql4-upgrade-0.0.6-0.0.7.php" hash="04f939ff1119ef282290256eb58229d9"/><file name="mysql4-upgrade-0.0.13-0.0.14.php" hash="a5bb6ff4cccb9e6302c6a0cd6ffd77e3"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Subscription"><file name="OrderController.php" hash="ddf95460175eccc37243df6e735290bc"/></dir><file name="SubscriptionController.php" hash="07bd75822d2bb18b953fca59ea9fc597"/></dir><dir name="Checkout"><dir name="Cart"><file name="SubscriptionController.php" hash="a7f345974379aff4803449df8c8cbf70"/></dir><file name="OnepageController.php" hash="21b5e60937833c31bcb9e0a136ced557"/></dir><dir name="Customer"><dir name="Account"><file name="SubscriptionController.php" hash="0a42fdbb7fd147f39e89c1f30e95ffee"/></dir></dir><file name="RedirectController.php" hash="35364646b7e0575e4e8c94d20f64bbc5"/></dir><dir name="Helper"><file name="Subscription.php" hash="1ae9df0ec8d95a679f61b07233f275f7"/><file name="Data.php" hash="2faf1fce37e89ab5921b0312c360cb01"/></dir><dir name="Model"><dir name="Exception"><file name="Error.php" hash="4ac369ee913575b427c6d15ff60ca27c"/><file name="DenyPayment.php" hash="b0c0b45291d220e490526ffd68e8dfc4"/></dir><dir name="Utility"><file name="Cleanup.php" hash="adb699e432fd13a81112ccb84952e570"/><file name="Subscription.php" hash="d03077eaf0873032cc5380b4574aea5a"/></dir><dir name="Resource"><dir name="Subscription"><dir name="Order"><file name="Collection.php" hash="9794d1183d0ffc7ce313e74170330c07"/></dir><file name="Order.php" hash="2958956cff03a6358c648bf5ecea564e"/><file name="Collection.php" hash="d316d3cf47157d2b4cdf1e5d2873ac08"/></dir><dir name="Agreement"><file name="Collection.php" hash="62e57e9e152d3fb54b0af1fdfd3776f4"/></dir><dir name="Transaction"><file name="Collection.php" hash="8b7be054183ad76cfb9c6b7c27595fbc"/></dir><file name="Agreement.php" hash="dcfc1ec7df22bd0ce24b64d332021e5a"/><file name="Subscription.php" hash="f5f927e1793f44fa384eb2aead41ee81"/><file name="Transaction.php" hash="7ca37cc46a5b24faa7658a61e47633e2"/></dir><dir name="Compatibility"><dir name="Mage"><dir name="Sales"><dir name="Model"><dir name="Order"><file name="Payment.php" hash="25de73c00d619ec65c2696906b35dfad"/></dir></dir></dir></dir></dir><dir name="Service"><dir name="Redirect"><file name="AgreementAbstract.php" hash="591733d0e48090a85899bf3701c1b0bc"/></dir><dir name="Direct"><file name="AgreementAbstract.php" hash="20ca0bebc7bceb30e0433aa316a5ed28"/></dir><file name="RedirectAbstract.php" hash="58ce2bcaa0197decba0bd17667e459fe"/><file name="Abstract.php" hash="3883464fa60b108b68a7ab5e3ee1553d"/><file name="DirectAbstract.php" hash="300c7144e500fd3e11489f2ef1b778c4"/></dir><dir name="Subscription"><file name="Order.php" hash="07c91afd16d567c6dcddee9374be97c8"/></dir><dir name="Method"><file name="RedirectAbstract.php" hash="fed166e8061a60c3730ace82612b343f"/><file name="AgreementAbstract.php" hash="73f51504d57b40de32a985e9c6d44465"/><file name="DirectAbstract.php" hash="41b092dfb0cfde9416d391c9e4b95ee5"/></dir><dir name="Adapter"><dir name="Redirect"><dir name="Agreement"><file name="ManageInterface.php" hash="06223d8ed9a015bf832450d829e4fd48"/></dir><file name="AuthCaptureInterface.php" hash="09405bde3024517a956a237b894f1808"/><file name="RefundInterface.php" hash="cb010029d08a9c1498356beea30f6627"/><file name="PartialInterface.php" hash="0593ecac5b49059960c7b185d550541e"/></dir><dir name="Direct"><dir name="Agreement"><file name="ManageInterface.php" hash="bfffa9aa8a4a5e5e1bba5d78a7475250"/></dir><file name="AuthCaptureInterface.php" hash="bea835c956bcf5c55a93074848e14a48"/><file name="RefundInterface.php" hash="b200ea17ac958bee2eefd5294ac4052e"/><file name="PartialInterface.php" hash="7b9b9f62e1b4ed310d281921f183b70d"/></dir><file name="Abstract.php" hash="a126350c16d111552caba7c422a3100d"/><file name="Interface.php" hash="887febfe4eafd98f285f9b6082462667"/></dir><dir name="Config"><file name="Abstract.php" hash="ebc3c7e63825c7e297ff9f19e8a10e1c"/></dir><dir name="Source"><file name="PaymentAction.php" hash="d94d62d900aac83e8bba6fe5d3459a70"/><file name="SubscriptionPeriods.php" hash="fdab5f7c2fdbb5f389facf94b9dae123"/><file name="AgreementMethod.php" hash="56add32f8838ac9a169c64ed6baa3318"/><file name="OrderStatus.php" hash="8a84a227a49229162a0310d604529165"/><file name="CardType.php" hash="b715c5b5605d84ce6561cc40418010ec"/></dir><file name="Email.php" hash="e03cb77df1a3d0fec0da4ebe26af2221"/><file name="Versioning.php" hash="ccf112f9a2e0a0c70003895989d42752"/><file name="Agreement.php" hash="f595fcd31730466fc8d11589d1e93f15"/><file name="Subscription.php" hash="0b8078fd132bd6290714aad293dfb332"/><file name="Transaction.php" hash="971544deae8e8cc4036e1f2fe9685435"/><file name="Cron.php" hash="3b53d7479628f06f769abbc53a6404e0"/><file name="Observer.php" hash="8f5d8cd814b821284c31ac7ba916f874"/></dir><file name="changelog.txt" hash="b15397608cc300b4a64c9e55f7b7ff02"/></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="ampersand_paymentgateway.xml" hash="3b70309300dfed71a62b73578869fc5d"/></dir><dir name="template"><dir name="ampersand_paymentgateway"><dir name="customer"><dir name="account"><file name="subscription.phtml" hash="73825035ff1e2b1bf17f85502317acc9"/></dir></dir><dir name="redirect"><file name="iframe.phtml" hash="129820e210e01662bab8afd5f24fac7d"/><file name="location.phtml" hash="aef0c86a5dea767c81b287b7ba8551d0"/><file name="form.phtml" hash="42f2ddb4f1473271d8ec5c3cd9814654"/></dir><dir name="payment"><dir name="form"><file name="billing-agreement-cv2.phtml" hash="f41a166c9d7b9b6cb780e0304890504b"/><file name="billing-agreement-checkbox.phtml" hash="57c5e2d3813acaaf6c054adb5cfd0d5f"/><file name="redirect.phtml" hash="1decc25cf3907d7ef05be8748aea6322"/></dir></dir><dir name="sales"><dir name="payment"><dir name="form"><dir name="billing"><file name="agreement.phtml" hash="fc256f93338c1a244efb0a74a27e11fb"/></dir></dir></dir></dir><dir name="checkout"><dir name="cart"><file name="subscription.phtml" hash="0bf84cb7a162e8b4936e261752b6c20e"/></dir><dir name="onepage"><dir name="review"><file name="subscription.phtml" hash="f3cc1076c65ee3ae0e959888b39b54c1"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="base"><dir name="default"><dir name="layout"><file name="ampersand_paymentgateway.xml" hash="b7dfcf1a57cf6d79d261ad91d266db2e"/></dir><dir name="template"><dir name="ampersand_paymentgateway"><dir name="system"><dir name="config"><dir name="fieldset"><file name="hint.phtml" hash="3f10f63632a280153a96ec9f90784568"/></dir></dir></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Ampersand_PaymentGateway.xml" hash="80480a17487715a70e009757cd3c3dfe"/><file name="Ampersand_BillingAgreementFix.xml" hash="1d213328275ec29e62a7f580b7926604"/></dir></target><target name="magelocale"><dir name="en_US"><dir name="template"><dir name="email"><dir name="ampersand_paymentgateway"><file name="subscription_reminder.html" hash="79262315a694fcb63de89baf66ef6ce6"/><file name="notification.html" hash="dea93b8b048571ac1a527260838b15fd"/></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="ampersand_paymentgateway"><dir name="css"><file name="checkout.css" hash="dfa4f36777bb549531f550d32e25d96e"/><file name="cart.css" hash="65dc2c9e22a28242060f23871af9c38e"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="base"><dir name="default"><dir name="ampersand_paymentgateway"><dir name="images"><file name="logo.gif" hash="098947bdb00786d3632235ff1cebb9c6"/></dir><dir name="css"><file name="styles.css" hash="587ac33018919b134d96b04ea98b6359"/></dir></dir></dir></dir></dir></target><target name="mageweb"><dir name="js"><dir name="ampersand_paymentgateway"><file name="validation.js" hash="33042d5bd59da47ea0ba00af24f86894"/></dir></dir></target></contents>
|
16 |
+
<compatible/>
|
17 |
+
<dependencies/>
|
18 |
+
</package>
|
skin/adminhtml/base/default/ampersand_paymentgateway/css/styles.css
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* System > Config > Payments > Hint */
|
2 |
+
|
3 |
+
.ampersand-paymentgateway-payment-notice {
|
4 |
+
margin-top: 10px;
|
5 |
+
border: 1px solid #CCC;
|
6 |
+
padding: 10px 5px 5px 185px;
|
7 |
+
background: #FFF url("../images/logo.gif") 5px center no-repeat;
|
8 |
+
}
|
9 |
+
|
10 |
+
.ampersand-paymentgateway-payment-notice h4 {
|
11 |
+
margin: 0px;
|
12 |
+
}
|
13 |
+
|
14 |
+
.ampersand-paymentgateway-payment-notice p {
|
15 |
+
margin: 0px;
|
16 |
+
}
|
skin/adminhtml/base/default/ampersand_paymentgateway/images/logo.gif
ADDED
Binary file
|
skin/frontend/base/default/ampersand_paymentgateway/css/cart.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
.cart .subscription { margin: 0 0 20px 0; }
|
skin/frontend/base/default/ampersand_paymentgateway/css/checkout.css
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
1 |
+
.subscription-review { margin: 20px; }
|
2 |
+
.subscription-review p { font-weight: bold; }
|