From e52362fc5cfe14a0aed404d60c7008bb119d73b9 Mon Sep 17 00:00:00 2001 From: Shamim Rezaie Date: Tue, 17 Dec 2019 01:21:47 +1100 Subject: [PATCH] MDL-69166 core_payment: basic gateway skeleton --- lib/classes/plugininfo/pg.php | 143 ++++++++++++++++++++++++++++++++++ payment/classes/gateway.php | 42 ++++++++++ payment/classes/helper.php | 56 +++++++++++++ 3 files changed, 241 insertions(+) create mode 100644 lib/classes/plugininfo/pg.php create mode 100644 payment/classes/gateway.php create mode 100644 payment/classes/helper.php diff --git a/lib/classes/plugininfo/pg.php b/lib/classes/plugininfo/pg.php new file mode 100644 index 00000000000..5aab880d32c --- /dev/null +++ b/lib/classes/plugininfo/pg.php @@ -0,0 +1,143 @@ +. + +/** + * Contains subplugin info class for payment gateways. + * + * @package core_payment + * @copyright 2019 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\plugininfo; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Payment gateway subplugin info class. + * + * @copyright 2019 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class pg extends base { + public function is_uninstall_allowed() { + return true; + } + + public function get_settings_section_name() { + return 'paymentgateway' . $this->name; + } + + public function load_settings(\part_of_admin_tree $adminroot, $parentnodename, $hassiteconfig) { + global $CFG, $USER, $DB, $OUTPUT, $PAGE; // In case settings.php wants to refer to them. + $ADMIN = $adminroot; // May be used in settings.php. + $plugininfo = $this; // Also can be used inside settings.php. + + if (!$this->is_installed_and_upgraded()) { + return; + } + + if (!$hassiteconfig) { + return; + } + + $section = $this->get_settings_section_name(); + + $settings = null; + if (file_exists($this->full_path('settings.php'))) { + $settings = new \admin_settingpage($section, $this->displayname, 'moodle/site:config', $this->is_enabled() === false); + include($this->full_path('settings.php')); // This may also set $settings to null. + } + if ($settings) { + $ADMIN->add($parentnodename, $settings); + } + } + + public static function get_manage_url() { + return new \moodle_url('/admin/settings.php', array('section' => 'managepaymentgateways')); + } + + public static function get_enabled_plugins() { + global $CFG; + + $order = (!empty($CFG->pg_plugins_sortorder)) ? explode(',', $CFG->pg_plugins_sortorder) : []; + if ($order) { + $plugins = \core_plugin_manager::instance()->get_installed_plugins('pg'); + $order = array_intersect($order, array_keys($plugins)); + } + + return array_combine($order, $order); + } + + /** + * Sets the current plugin as enabled or disabled + * When enabling tries to guess the sortorder based on default rank returned by the plugin. + * + * @param bool $newstate + */ + public function set_enabled(bool $newstate = true) { + $enabled = self::get_enabled_plugins(); + if (array_key_exists($this->name, $enabled) == $newstate) { + // Nothing to do. + return; + } + if ($newstate) { + // Enable gateway plugin. + $plugins = \core_plugin_manager::instance()->get_plugins_of_type('pg'); + if (!array_key_exists($this->name, $plugins)) { + // Can not be enabled. + return; + } + $enabled[$this->name] = $this->name; + self::set_enabled_plugins($enabled); + } else { + // Disable gateway plugin. + unset($enabled[$this->name]); + self::set_enabled_plugins($enabled); + } + } + + /** + * Set the list of enabled payment gateways in the specified sort order + * To be used when changing settings or in unit tests. + * + * @param string|array $list list of plugin names without frankenstyle prefix - comma-separated string or an array + */ + public static function set_enabled_plugins($list) { + if (empty($list)) { + $list = []; + } else if (!is_array($list)) { + $list = explode(',', $list); + } + if ($list) { + $plugins = \core_plugin_manager::instance()->get_installed_plugins('pg'); + $list = array_intersect($list, array_keys($plugins)); + } + set_config('pg_plugins_sortorder', join(',', $list)); + \core_plugin_manager::reset_caches(); + } + + /** + * Returns the list of currencies that the payment gateway supports. + * + * @return string[] An array of the currency codes in the three-character ISO-4217 format + */ + public function get_supported_currencies(): array { + $classname = '\pg_'.$this->name.'\gateway'; + + return $classname::get_supported_currencies(); + } +} diff --git a/payment/classes/gateway.php b/payment/classes/gateway.php new file mode 100644 index 00000000000..32cfb36fb0b --- /dev/null +++ b/payment/classes/gateway.php @@ -0,0 +1,42 @@ +. + +/** + * Contains base class for payment gateways. + * + * @package core_payment + * @copyright 2019 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core_payment; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Base class for payment gateways. + * + * @copyright 2019 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +abstract class gateway { + /** + * Returns the list of currencies that the payment gateway supports. + * + * @return string[] An array of the currency codes in the three-character ISO-4217 format + */ + public abstract static function get_supported_currencies(): array; +} diff --git a/payment/classes/helper.php b/payment/classes/helper.php new file mode 100644 index 00000000000..2a1a745a08c --- /dev/null +++ b/payment/classes/helper.php @@ -0,0 +1,56 @@ +. + +/** + * Contains helper class for the payment subsystem. + * + * @package core_payment + * @copyright 2019 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core_payment; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Helper class for the payment subsystem. + * + * @copyright 2019 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class helper { + + /** + * Returns an accumulated list of supported currencies by all payment gateways. + * + * @return string[] An array of the currency codes in the three-character ISO-4217 format + */ + public static function get_supported_currencies(): array { + $currencies = []; + + $plugins = \core_plugin_manager::instance()->get_enabled_plugins('pg'); + foreach ($plugins as $plugin) { + $classname = '\pg_' . $plugin . '\gateway'; + + $currencies += $classname::get_supported_currencies(); + } + + $currencies = array_unique($currencies); + + return $currencies; + } +}