Commit 04b26b68 authored by Monish Deb's avatar Monish Deb

Add API and upgrade class

parent ca977b94
<?php
require __DIR__ . '/../../vendor/autoload.php';
use Intacct\ClientConfig;
use Intacct\OnlineClient;
use Intacct\Functions\Common\ReadByQuery;
/**
* Class to send Moodle API request
*/
class CRM_Syncintacct_API {
/**
* Instance of this object.
*
* @var CRM_Syncintacct_API
*/
public static $_singleton = NULL;
/**
* Variable to store Moodle web domain
*
* @var string
*/
protected $_credential;
/**
* The constructor sets search parameters and instantiate CRM_Utils_HttpClient
*/
public function __construct() {
$this->_credential = Civi::settings()->get('intacct_credential');
}
/**
* Singleton function used to manage this object.
*
* @param array $searchParams
* Moodle parameters
*
* @return CRM_Syncintacct_API
*/
public static function &singleton($reset = FALSE) {
if (self::$_singleton === NULL || $reset) {
self::$_singleton = new CRM_Syncintacct_API();
}
return self::$_singleton;
}
/**
* Function to call core_user_get_users webservice to fetch moodle user
*/
public function getVendors() {
return $this->sendRequest('VENDOR');
}
/**
* Function used to make Moodle API request
*
* @param string $apiFunc
* Donor Search API function name
*
* @return array
*/
public function sendRequest($entity) {
$clientConfig = new ClientConfig();
$clientConfig->setCompanyId('AGBU-DEV');
$clientConfig->setUserId('xml_gateway');
$clientConfig->setUserPassword('MASD!H16b4d');
$clientConfig->setSenderId('AGBU');
$clientConfig->setSenderPassword('Armenia!2018');
//$clientConfig->setProfileFile(__DIR__ . '/.credentials.ini');
$client = new OnlineClient($clientConfig);
$query = new ReadByQuery();
$query->setObjectName('VENDOR');
$query->setPageSize(1); // Keep the count to just 1 for the example
$query->setFields([
'RECORDNO',
'VENDORID',
'NAME',
]);
$response = $client->execute($query);
return $response->getResult();
/*
$clientConfig = new ClientConfig();
CRM_Core_Error::Debug_var('s', $this->_credential);
$clientConfig->setCompanyId($this->_credential['company_id']);
$clientConfig->setUserId($this->_credential['user_id']);
$clientConfig->setUserPassword($this->_credential['user_password']);
$clientConfig->setSenderId($this->_credential['sender_id']);
$clientConfig->setSenderPassword($this->_credential['sender_password']);
$client = new OnlineClient($clientConfig);
$query = new ReadByQuery();
$query->setObjectName($entity);
$query->setPageSize(1); // Keep the count to just 1 for the example
$query->setFields([
'RECORDNO',
'VENDORID',
'NAME',
]);
$response = $client->execute($query);
$result = $response->getResult();
return $result;
/**
return array(
self::recordError($response),
$response,
);*/
}
/**
* Record error response if there's anything wrong in $response
*
* @param string $response
* fetched data from Moodle API
*
* @return bool
* Found error ? TRUE or FALSE
*/
public static function recordError($response) {
$isError = FALSE;
$response = json_decode($response, TRUE);
if (!empty($response['exception'])) {
civicrm_api3('SystemLog', 'create', array(
'level' => 'error',
'message' => $response['message'],
'contact_id' => CRM_Core_Session::getLoggedInContactID(),
));
$isError = TRUE;
}
return $isError;
}
}
<?php
require_once 'CRM/Core/Form.php';
class CRM_Syncintacct_Form_Setting extends CRM_Core_Form {
/**
* Intact Web service credentials
*
* @var string
*/
protected $_credential;
/**
* Set variables up before form is built.
*/
public function preProcess() {
if (!CRM_Core_Permission::check('administer CiviCRM')) {
CRM_Core_Error::fatal(ts('You do not permission to access this page, please contact your system administrator.'));
}
$this->_credential = Civi::settings()->get('intacct_credential');
}
/**
* Set default values.
*
* @return array
*/
public function setDefaultValues() {
return $this->_credential;
}
public function buildQuickForm() {
$this->add('text', 'company_id', ts('Company ID'), array('class' => 'huge'), TRUE);
$this->add('text', 'user_id', ts('User ID'), array('class' => 'huge'), TRUE);
$this->add('password', 'user_password', ts('User Password'), array('class' => 'huge'), TRUE);
$this->add('text', 'sender_id', ts('Sender ID'), array('class' => 'huge'), TRUE);
$this->add('password', 'sender_password', ts('Sender Password'), array('class' => 'huge'), TRUE);
$this->assign('intacctCredentials', ['company_id', 'user_id', 'user_password', 'sender_id', 'sender_password']);
$this->addButtons(array(
array(
'type' => 'submit',
'name' => ts('Submit'),
'isDefault' => TRUE,
),
));
parent::buildQuickForm();
}
public function postProcess() {
$values = $this->exportValues();
foreach (['company_id', 'user_id', 'user_password', 'sender_id', 'sender_password'] as $attribute) {
$credential[$attribute] = $values[$attribute];
}
Civi::settings()->set('intacct_credential', $credential);
CRM_Core_Session::setStatus(ts("Intacct Web Service credential submitted"), ts('Success'), 'success');
CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm', 'reset=1'));
}
}
<?php
/**
* Collection of upgrade steps.
*/
class CRM_Syncintacct_Upgrader extends CRM_Syncintacct_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).
public function install() {
civicrm_api3('Navigation', 'create', array(
'label' => ts('CiviCRM Sage Intacct Integration', array('domain' => 'biz.jmaconsulting.syncintacct')),
'name' => 'intacct_setting',
'url' => 'civicrm/intacct/setting?reset=1',
'domain_id' => CRM_Core_Config::domainID(),
'is_active' => 1,
'parent_id' => civicrm_api3('Navigation', 'getvalue', array(
'return' => "id",
'name' => "System Settings",
)),
'permission' => 'administer CiviCRM',
));
}
public function uninstall() {
self::changeNavigation('delete');
}
public function enable() {
self::changeNavigation('enable');
}
public function disable() {
self::changeNavigation('disable');
}
/**
* disable/enable/delete Intacct Setting link
*
* @param string $action
* @throws \CiviCRM_API3_Exception
*/
public static function changeNavigation($action) {
$names = ['intacct_setting'];
foreach ($names as $name) {
if ($action == 'delete') {
$id = civicrm_api3('Navigation', 'getvalue', array(
'return' => "id",
'name' => $name,
));
if ($id) {
civicrm_api3('Navigation', 'delete', array('id' => $id));
}
}
else {
$isActive = ($action == 'enable') ? 1 : 0;
CRM_Core_BAO_Navigation::setIsActive(
CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Navigation', $name, 'id', 'name'),
$isActive
);
}
}
CRM_Core_BAO_Navigation::resetNavigation();
}
}
<?php
// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
/**
* Base class which provides helpers to execute upgrade logic
*/
class CRM_Syncintacct_Upgrader_Base {
/**
* @var varies, subclass of ttis
*/
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;
/**
* Obtain a reference to the active upgrade handler.
*/
static public function instance() {
if (! self::$instance) {
// FIXME auto-generate
self::$instance = new CRM_Syncintacct_Upgrader(
'biz.jmaconsulting.syncintacct',
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_Syncintacct_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) {
require_once 'CRM/Utils/Migrate/Import.php';
$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 . '/' . $relativePath
);
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::executeSql($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() {
// return CRM_Core_BAO_Extension::getSchemaVersion($this->extensionName);
$key = $this->extensionName . ':version';
return CRM_Core_BAO_Setting::getItem('Extension', $key);
}
public function setCurrentRevision($revision) {
// We call this during hook_civicrm_install, but the underlying SQL
// UPDATE fails because the extension record hasn't been INSERTed yet.
// Instead, track revisions in our own namespace.
// CRM_Core_BAO_Extension::setSchemaVersion($this->extensionName, $revision);
$key = $this->extensionName . ':version';
CRM_Core_BAO_Setting::setItem($revision, 'Extension', $key);
return TRUE;
}
// ******** Hook delegates ********
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 . '/xml/*_install.xml');
if (is_array($files)) {
foreach ($files as $file) {
$this->executeCustomDataFileByAbsPath($file);
}
}
if (is_callable(array($this, 'install'))) {
$this->install();
}
$revisions = $this->getRevisions();
if (!empty($revisions)) {
$this->setCurrentRevision(max($revisions));
}
}
public function onUninstall() {
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);
}
}
$this->setCurrentRevision(NULL);
}
public function onEnable() {
// stub for possible future use
if (is_callable(array($this, 'enable'))) {
$this->enable();
}
}
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:
}
}
}
......@@ -5,7 +5,7 @@
<description>FIXME</description>
<license>AGPL-3.0</license>
<maintainer>
<author>Monish Deb</author>
<author>JMA Consulting</author>
<email>everyone@jmaconsulting.biz</email>
</maintainer>
<urls>
......@@ -18,7 +18,7 @@
<version>1.0</version>
<develStage>alpha</develStage>
<compatibility>
<ver>5.4</ver>
<ver>5.0</ver>
</compatibility>
<comments>This is a new, undeveloped module</comments>
<civix>
......
<div class="crm-block crm-form-block">
{foreach from=$intacctCredentials item=elementName}
<div class="crm-section">
<div class="label">{$form.$elementName.label}</div>
<div class="content">{$form.$elementName.html}</div>
<div class="clear"></div>
</div>
{/foreach}
{* FOOTER *}
<div class="crm-submit-buttons">
{include file="CRM/common/formButtons.tpl" location="bottom"}
</div>
</div>
<?xml version="1.0"?>
<menu>
<item>
<path>civicrm/intacct/setting</path>
<page_callback>CRM_Syncintacct_Form_Setting</page_callback>
<title>Intacct Integration Settings</title>
<access_arguments>access CiviCRM</access_arguments>
</item>
</menu>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment