Commit d5144f88 authored by mattwire's avatar mattwire
Browse files

Major update to support propertyBag and require mjwshared

parent 000eb275
<?php
use CRM_AuthNetEcheck_ExtensionUtil as E;
/**
* Collection of upgrade steps.
*/
class CRM_AuthNetEcheck_Upgrader extends CRM_AuthNetEcheck_Upgrader_Base {
// By convention, functions that look like "function upgrade_NNNN()" are
// upgrade tasks. They are executed in order (like Drupal's hook_update_N).
/**
* Example: Run an external SQL script when the module is installed.
*
public function install() {
$this->executeSqlFile('sql/myinstall.sql');
}
/**
* On postInstall
*/
public function postInstall() {
$this->updateLegacyAuthorizeNet();
}
/**
* @return TRUE on success
* @throws Exception
*/
public function upgrade_2100() {
$this->ctx->log->info('Update legacy Authorize.Net description');
$this->updateLegacyAuthorizeNet();
return TRUE;
}
private function updateLegacyAuthorizeNet() {
CRM_Core_DAO::executeQuery('UPDATE `civicrm_payment_processor_type` SET title = "Authorize.Net (legacy)" WHERE title = "Authorize.Net"');
}
}
<?php
// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
use CRM_AuthNetEcheck_ExtensionUtil as E;
/**
* Base class which provides helpers to execute upgrade logic
*/
class CRM_AuthNetEcheck_Upgrader_Base {
/**
* @var varies, subclass of this
*/
static $instance;
/**
* @var CRM_Queue_TaskContext
*/
protected $ctx;
/**
* @var string, eg 'com.example.myextension'
*/
protected $extensionName;
/**
* @var string, full path to the extension's source tree
*/
protected $extensionDir;
/**
* @var array(revisionNumber) sorted numerically
*/
private $revisions;
/**
* @var boolean
* Flag to clean up extension revision data in civicrm_setting
*/
private $revisionStorageIsDeprecated = FALSE;
/**
* Obtain a reference to the active upgrade handler.
*/
static public function instance() {
if (!self::$instance) {
// FIXME auto-generate
self::$instance = new CRM_AuthNetEcheck_Upgrader(
'com.donordepot.authnetecheck',
realpath(__DIR__ . '/../../../')
);
}
return self::$instance;
}
/**
* Adapter that lets you add normal (non-static) member functions to the queue.
*
* Note: Each upgrader instance should only be associated with one
* task-context; otherwise, this will be non-reentrant.
*
* @code
* CRM_AuthNetEcheck_Upgrader_Base::_queueAdapter($ctx, 'methodName', 'arg1', 'arg2');
* @endcode
*/
static public function _queueAdapter() {
$instance = self::instance();
$args = func_get_args();
$instance->ctx = array_shift($args);
$instance->queue = $instance->ctx->queue;
$method = array_shift($args);
return call_user_func_array(array($instance, $method), $args);
}
public function __construct($extensionName, $extensionDir) {
$this->extensionName = $extensionName;
$this->extensionDir = $extensionDir;
}
// ******** Task helpers ********
/**
* Run a CustomData file.
*
* @param string $relativePath the CustomData XML file path (relative to this extension's dir)
* @return bool
*/
public function executeCustomDataFile($relativePath) {
$xml_file = $this->extensionDir . '/' . $relativePath;
return $this->executeCustomDataFileByAbsPath($xml_file);
}
/**
* Run a CustomData file
*
* @param string $xml_file the CustomData XML file path (absolute path)
*
* @return bool
*/
protected static function executeCustomDataFileByAbsPath($xml_file) {
$import = new CRM_Utils_Migrate_Import();
$import->run($xml_file);
return TRUE;
}
/**
* Run a SQL file.
*
* @param string $relativePath the SQL file path (relative to this extension's dir)
*
* @return bool
*/
public function executeSqlFile($relativePath) {
CRM_Utils_File::sourceSQLFile(
CIVICRM_DSN,
$this->extensionDir . DIRECTORY_SEPARATOR . $relativePath
);
return TRUE;
}
/**
* @param string $tplFile
* The SQL file path (relative to this extension's dir).
* Ex: "sql/mydata.mysql.tpl".
* @return bool
*/
public function executeSqlTemplate($tplFile) {
// Assign multilingual variable to Smarty.
$upgrade = new CRM_Upgrade_Form();
$tplFile = CRM_Utils_File::isAbsolute($tplFile) ? $tplFile : $this->extensionDir . DIRECTORY_SEPARATOR . $tplFile;
$smarty = CRM_Core_Smarty::singleton();
$smarty->assign('domainID', CRM_Core_Config::domainID());
CRM_Utils_File::sourceSQLFile(
CIVICRM_DSN, $smarty->fetch($tplFile), NULL, TRUE
);
return TRUE;
}
/**
* Run one SQL query.
*
* This is just a wrapper for CRM_Core_DAO::executeSql, but it
* provides syntatic sugar for queueing several tasks that
* run different queries
*/
public function executeSql($query, $params = array()) {
// FIXME verify that we raise an exception on error
CRM_Core_DAO::executeQuery($query, $params);
return TRUE;
}
/**
* Syntatic sugar for enqueuing a task which calls a function in this class.
*
* The task is weighted so that it is processed
* as part of the currently-pending revision.
*
* After passing the $funcName, you can also pass parameters that will go to
* the function. Note that all params must be serializable.
*/
public function addTask($title) {
$args = func_get_args();
$title = array_shift($args);
$task = new CRM_Queue_Task(
array(get_class($this), '_queueAdapter'),
$args,
$title
);
return $this->queue->createItem($task, array('weight' => -1));
}
// ******** Revision-tracking helpers ********
/**
* Determine if there are any pending revisions.
*
* @return bool
*/
public function hasPendingRevisions() {
$revisions = $this->getRevisions();
$currentRevision = $this->getCurrentRevision();
if (empty($revisions)) {
return FALSE;
}
if (empty($currentRevision)) {
return TRUE;
}
return ($currentRevision < max($revisions));
}
/**
* Add any pending revisions to the queue.
*/
public function enqueuePendingRevisions(CRM_Queue_Queue $queue) {
$this->queue = $queue;
$currentRevision = $this->getCurrentRevision();
foreach ($this->getRevisions() as $revision) {
if ($revision > $currentRevision) {
$title = ts('Upgrade %1 to revision %2', array(
1 => $this->extensionName,
2 => $revision,
));
// note: don't use addTask() because it sets weight=-1
$task = new CRM_Queue_Task(
array(get_class($this), '_queueAdapter'),
array('upgrade_' . $revision),
$title
);
$this->queue->createItem($task);
$task = new CRM_Queue_Task(
array(get_class($this), '_queueAdapter'),
array('setCurrentRevision', $revision),
$title
);
$this->queue->createItem($task);
}
}
}
/**
* Get a list of revisions.
*
* @return array(revisionNumbers) sorted numerically
*/
public function getRevisions() {
if (!is_array($this->revisions)) {
$this->revisions = array();
$clazz = new ReflectionClass(get_class($this));
$methods = $clazz->getMethods();
foreach ($methods as $method) {
if (preg_match('/^upgrade_(.*)/', $method->name, $matches)) {
$this->revisions[] = $matches[1];
}
}
sort($this->revisions, SORT_NUMERIC);
}
return $this->revisions;
}
public function getCurrentRevision() {
$revision = CRM_Core_BAO_Extension::getSchemaVersion($this->extensionName);
if (!$revision) {
$revision = $this->getCurrentRevisionDeprecated();
}
return $revision;
}
private function getCurrentRevisionDeprecated() {
$key = $this->extensionName . ':version';
if ($revision = CRM_Core_BAO_Setting::getItem('Extension', $key)) {
$this->revisionStorageIsDeprecated = TRUE;
}
return $revision;
}
public function setCurrentRevision($revision) {
CRM_Core_BAO_Extension::setSchemaVersion($this->extensionName, $revision);
// clean up legacy schema version store (CRM-19252)
$this->deleteDeprecatedRevision();
return TRUE;
}
private function deleteDeprecatedRevision() {
if ($this->revisionStorageIsDeprecated) {
$setting = new CRM_Core_BAO_Setting();
$setting->name = $this->extensionName . ':version';
$setting->delete();
CRM_Core_Error::debug_log_message("Migrated extension schema revision ID for {$this->extensionName} from civicrm_setting (deprecated) to civicrm_extension.\n");
}
}
// ******** Hook delegates ********
/**
* @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
*/
public function onInstall() {
$files = glob($this->extensionDir . '/sql/*_install.sql');
if (is_array($files)) {
foreach ($files as $file) {
CRM_Utils_File::sourceSQLFile(CIVICRM_DSN, $file);
}
}
$files = glob($this->extensionDir . '/sql/*_install.mysql.tpl');
if (is_array($files)) {
foreach ($files as $file) {
$this->executeSqlTemplate($file);
}
}
$files = glob($this->extensionDir . '/xml/*_install.xml');
if (is_array($files)) {
foreach ($files as $file) {
$this->executeCustomDataFileByAbsPath($file);
}
}
if (is_callable(array($this, 'install'))) {
$this->install();
}
}
/**
* @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall
*/
public function onPostInstall() {
$revisions = $this->getRevisions();
if (!empty($revisions)) {
$this->setCurrentRevision(max($revisions));
}
if (is_callable(array($this, 'postInstall'))) {
$this->postInstall();
}
}
/**
* @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall
*/
public function onUninstall() {
$files = glob($this->extensionDir . '/sql/*_uninstall.mysql.tpl');
if (is_array($files)) {
foreach ($files as $file) {
$this->executeSqlTemplate($file);
}
}
if (is_callable(array($this, 'uninstall'))) {
$this->uninstall();
}
$files = glob($this->extensionDir . '/sql/*_uninstall.sql');
if (is_array($files)) {
foreach ($files as $file) {
CRM_Utils_File::sourceSQLFile(CIVICRM_DSN, $file);
}
}
}
/**
* @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
*/
public function onEnable() {
// stub for possible future use
if (is_callable(array($this, 'enable'))) {
$this->enable();
}
}
/**
* @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable
*/
public function onDisable() {
// stub for possible future use
if (is_callable(array($this, 'disable'))) {
$this->disable();
}
}
public function onUpgrade($op, CRM_Queue_Queue $queue = NULL) {
switch ($op) {
case 'check':
return array($this->hasPendingRevisions());
case 'enqueue':
return $this->enqueuePendingRevisions($queue);
default:
}
}
}
<?php
/*
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC. All rights reserved. |
| |
| This work is published under the GNU AGPLv3 license with some |
| permitted exceptions and without any warranty. For full license |
| and copyright information, see https://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
use CRM_AuthNetEcheck_ExtensionUtil as E;
/**
* Class CRM_AuthorizeNet_Check
*/
class CRM_AuthorizeNet_Check {
/**
* @var string
*/
const MIN_VERSION_MJWSHARED = '0.8';
public static function checkRequirements(&$messages) {
$extensions = civicrm_api3('Extension', 'get', [
'full_name' => "mjwshared",
]);
if (empty($extensions['id']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) {
$messages[] = new CRM_Utils_Check_Message(
E::SHORT_NAME . '_requirements',
E::ts('The %1 extension requires the mjwshared extension which is not installed (https://lab.civicrm.org/extensions/mjwshared).', [1 => E::SHORT_NAME]),
E::ts('%1: Missing Requirements', [1 => E::SHORT_NAME]),
\Psr\Log\LogLevel::ERROR,
'fa-money'
);
}
if (version_compare($extensions['values'][$extensions['id']]['version'], CRM_Smartdebit_Check::MIN_VERSION_MJWSHARED) === -1) {
$messages[] = new CRM_Utils_Check_Message(
E::SHORT_NAME . '_requirements',
E::ts('The %1 extension requires the mjwshared extension version %2 or greater but your system has version %3.',
[
1 => E::SHORT_NAME,
2 => CRM_Smartdebit_Check::MIN_VERSION_MJWSHARED,
3 => $extensions['values'][$extensions['id']]['version']
]),
E::ts('%1: Missing Requirements', [1 => E::SHORT_NAME]),
\Psr\Log\LogLevel::ERROR,
'fa-money'
);
}
}
}
<?php
/**
* https://civicrm.org/licensing
/*
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC. All rights reserved. |
| |
| This work is published under the GNU AGPLv3 license with some |
| permitted exceptions and without any warranty. For full license |
| and copyright information, see https://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
use CRM_AuthNetEcheck_ExtensionUtil as E;
......@@ -9,8 +15,8 @@ use \JohnConde\Authnet\AuthnetApiFactory as AuthnetApiFactory;
class CRM_AuthorizeNet_Webhook {
use CRM_AuthorizeNet_WebhookTrait;
use CRM_Core_Payment_AuthorizeNetTrait;
use CRM_Mjwshared_WebhookTrait;
use CRM_Core_Payment_MJWTrait;
/**
* CRM_AuthorizeNet_Webhook constructor.
......@@ -106,7 +112,7 @@ class CRM_AuthorizeNet_Webhook {
* @throws \CiviCRM_API3_Exception
* @throws \JohnConde\Authnet\AuthnetInvalidJsonException
*/
public static function check($messages) {
public static function check(&$messages) {
$checkMessage = [
'name' => 'authnet_webhook',
'label' => 'AuthorizeNet',
......
<?php
/**
* https://civicrm.org/licensing
*/
trait CRM_AuthorizeNet_WebhookTrait {
/**********************
* MJW_Webhook_Trait: 20190707
*********************/
/**
* @var array Payment processor
*/
private $_paymentProcessor;
/**
* Get the path of the webhook depending on the UF (eg Drupal, Joomla, Wordpress)
*
* @param string $paymentProcessorId
*
* @return string
*/
public static function getWebhookPath($paymentProcessorId) {
$UFWebhookPath = CRM_Utils_System::url('civicrm/payment/ipn/' . $paymentProcessorId, NULL, TRUE, NULL, FALSE, TRUE);
return $UFWebhookPath;
}
}
<?php
/**
* https://civicrm.org/licensing
/*
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC. All rights reserved. |
| |
| This work is published under the GNU AGPLv3 license with some |
| permitted exceptions and without any warranty. For full license |
| and copyright information, see https://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
use CRM_AuthNetEcheck_ExtensionUtil as E;
......@@ -10,7 +16,7 @@ use net\authorize\api\constants\ANetEnvironment as AnetEnvironment;
class CRM_Core_Payment_AuthNetCreditcard extends CRM_Core_Payment_AuthorizeNetCommon {
use CRM_Core_Payment_AuthorizeNetTrait;
use CRM_Core_Payment_MJWTrait;
/**
* Constructor
......@@ -20,8 +26,9 @@ class CRM_Core_Payment_AuthNetCreditcard extends CRM_Core_Payment_AuthorizeNetCo
* @return void
*/
function __construct($mode, &$paymentProcessor) {
$this->_processorName = $this->getPaymentTypeLabel();
parent::__construct($mode, $paymentProcessor);
// @todo Remove once we drop support for CiviCRM < 5.27
$this->_processorName = $this->getPaymentTypeLabel();
}
/**
......@@ -131,24 +138,28 @@ class CRM_Core_Payment_AuthNetCreditcard extends CRM_Core_Payment_AuthorizeNetCo
/**
* Get the Credit card details for AuthNet
*
* @param array $params
*
* @return \net\authorize\api\contract\v1\CreditCardType
*/
private function getCreditCard() {
private function getCreditCard($params) {
// Create the payment data for a CreditCard
$creditCard = new AnetAPI\CreditCardType();
$creditCard->setCardNumber($this->getParam('credit_card_number'));
$creditCard->setExpirationDate($this->getParam('year') . '-' . $this->getParam('month'));
$creditCard->setCardCode($this->getParam('cvv2'));
$creditCard->setCardNumber($params['credit_card_number']);
$creditCard->setExpirationDate($params['year'] . '-' . $params['month']);
$creditCard->setCardCode($params['cvv2']);
return $creditCard;
}
/**
* Get the payment details for the subscription
*
* @param array $params
*
* @return AnetAPI\PaymentType
*/
protected function getPaymentDetails() {
$creditCard = $this->getCreditCard();
protected function getPaymentDetails($params) {
$creditCard = $this->getCreditCard($params);
// Add the payment data to a paymentType object
$paymentDetails = new AnetAPI\PaymentType();
$paymentDetails->setCreditCard($creditCard);
......
<?php
/**
* https://civicrm.org/licensing
/*
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC. All rights reserved. |
| |
| This work is published under the GNU AGPLv3 license with some |
| permitted exceptions and without any warranty. For full license |