Added install code, navigation menu and DAO file
This commit is contained in:
parent
5595bf48c9
commit
29abfc684d
134
CRM/AnnualGrantBudgets/Upgrader.php
Normal file
134
CRM/AnnualGrantBudgets/Upgrader.php
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
<?php
|
||||||
|
use CRM_AnnualGrantBudgets_ExtensionUtil as E;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collection of upgrade steps.
|
||||||
|
*/
|
||||||
|
class CRM_AnnualGrantBudgets_Upgrader extends CRM_AnnualGrantBudgets_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');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example: Work with entities usually not available during the install step.
|
||||||
|
*
|
||||||
|
* This method can be used for any post-install tasks. For example, if a step
|
||||||
|
* of your installation depends on accessing an entity that is itself
|
||||||
|
* created during the installation (e.g., a setting or a managed entity), do
|
||||||
|
* so here to avoid order of operation problems.
|
||||||
|
*
|
||||||
|
public function postInstall() {
|
||||||
|
$customFieldId = civicrm_api3('CustomField', 'getvalue', array(
|
||||||
|
'return' => array("id"),
|
||||||
|
'name' => "customFieldCreatedViaManagedHook",
|
||||||
|
));
|
||||||
|
civicrm_api3('Setting', 'create', array(
|
||||||
|
'myWeirdFieldSetting' => array('id' => $customFieldId, 'weirdness' => 1),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example: Run an external SQL script when the module is uninstalled.
|
||||||
|
*
|
||||||
|
public function uninstall() {
|
||||||
|
$this->executeSqlFile('sql/myuninstall.sql');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example: Run a simple query when a module is enabled.
|
||||||
|
*
|
||||||
|
public function enable() {
|
||||||
|
CRM_Core_DAO::executeQuery('UPDATE foo SET is_active = 1 WHERE bar = "whiz"');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example: Run a simple query when a module is disabled.
|
||||||
|
*
|
||||||
|
public function disable() {
|
||||||
|
CRM_Core_DAO::executeQuery('UPDATE foo SET is_active = 0 WHERE bar = "whiz"');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example: Run a couple simple queries.
|
||||||
|
*
|
||||||
|
* @return TRUE on success
|
||||||
|
* @throws Exception
|
||||||
|
*
|
||||||
|
public function upgrade_4200() {
|
||||||
|
$this->ctx->log->info('Applying update 4200');
|
||||||
|
CRM_Core_DAO::executeQuery('UPDATE foo SET bar = "whiz"');
|
||||||
|
CRM_Core_DAO::executeQuery('DELETE FROM bang WHERE willy = wonka(2)');
|
||||||
|
return TRUE;
|
||||||
|
} // */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example: Run an external SQL script.
|
||||||
|
*
|
||||||
|
* @return TRUE on success
|
||||||
|
* @throws Exception
|
||||||
|
public function upgrade_4201() {
|
||||||
|
$this->ctx->log->info('Applying update 4201');
|
||||||
|
// this path is relative to the extension base dir
|
||||||
|
$this->executeSqlFile('sql/upgrade_4201.sql');
|
||||||
|
return TRUE;
|
||||||
|
} // */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example: Run a slow upgrade process by breaking it up into smaller chunk.
|
||||||
|
*
|
||||||
|
* @return TRUE on success
|
||||||
|
* @throws Exception
|
||||||
|
public function upgrade_4202() {
|
||||||
|
$this->ctx->log->info('Planning update 4202'); // PEAR Log interface
|
||||||
|
|
||||||
|
$this->addTask(E::ts('Process first step'), 'processPart1', $arg1, $arg2);
|
||||||
|
$this->addTask(E::ts('Process second step'), 'processPart2', $arg3, $arg4);
|
||||||
|
$this->addTask(E::ts('Process second step'), 'processPart3', $arg5);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
public function processPart1($arg1, $arg2) { sleep(10); return TRUE; }
|
||||||
|
public function processPart2($arg3, $arg4) { sleep(10); return TRUE; }
|
||||||
|
public function processPart3($arg5) { sleep(10); return TRUE; }
|
||||||
|
// */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example: Run an upgrade with a query that touches many (potentially
|
||||||
|
* millions) of records by breaking it up into smaller chunks.
|
||||||
|
*
|
||||||
|
* @return TRUE on success
|
||||||
|
* @throws Exception
|
||||||
|
public function upgrade_4203() {
|
||||||
|
$this->ctx->log->info('Planning update 4203'); // PEAR Log interface
|
||||||
|
|
||||||
|
$minId = CRM_Core_DAO::singleValueQuery('SELECT coalesce(min(id),0) FROM civicrm_contribution');
|
||||||
|
$maxId = CRM_Core_DAO::singleValueQuery('SELECT coalesce(max(id),0) FROM civicrm_contribution');
|
||||||
|
for ($startId = $minId; $startId <= $maxId; $startId += self::BATCH_SIZE) {
|
||||||
|
$endId = $startId + self::BATCH_SIZE - 1;
|
||||||
|
$title = E::ts('Upgrade Batch (%1 => %2)', array(
|
||||||
|
1 => $startId,
|
||||||
|
2 => $endId,
|
||||||
|
));
|
||||||
|
$sql = '
|
||||||
|
UPDATE civicrm_contribution SET foobar = whiz(wonky()+wanker)
|
||||||
|
WHERE id BETWEEN %1 and %2
|
||||||
|
';
|
||||||
|
$params = array(
|
||||||
|
1 => array($startId, 'Integer'),
|
||||||
|
2 => array($endId, 'Integer'),
|
||||||
|
);
|
||||||
|
$this->addTask($title, 'executeSql', $sql, $params);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
} // */
|
||||||
|
|
||||||
|
}
|
376
CRM/AnnualGrantBudgets/Upgrader/Base.php
Normal file
376
CRM/AnnualGrantBudgets/Upgrader/Base.php
Normal file
@ -0,0 +1,376 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
|
||||||
|
use CRM_AnnualGrantBudgets_ExtensionUtil as E;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class which provides helpers to execute upgrade logic
|
||||||
|
*/
|
||||||
|
class CRM_AnnualGrantBudgets_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_AnnualGrantBudgets_Upgrader(
|
||||||
|
'org.agbu.annualgrantbudgets',
|
||||||
|
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_AnnualGrantBudgets_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://wiki.civicrm.org/confluence/display/CRMDOC/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://wiki.civicrm.org/confluence/display/CRMDOC/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://wiki.civicrm.org/confluence/display/CRMDOC/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://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_enable
|
||||||
|
*/
|
||||||
|
public function onEnable() {
|
||||||
|
// stub for possible future use
|
||||||
|
if (is_callable(array($this, 'enable'))) {
|
||||||
|
$this->enable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see https://wiki.civicrm.org/confluence/display/CRMDOC/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:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
9
CRM/Grant/BAO/GrantBudget.php
Normal file
9
CRM/Grant/BAO/GrantBudget.php
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class CRM_Grant_BAO_GrantBudget extends CRM_Grant_DAO_GrantBudget {
|
||||||
|
|
||||||
|
public static function getFiscalyear() {
|
||||||
|
return [2018=>2018];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
219
CRM/Grant/DAO/GrantBudget.php
Normal file
219
CRM/Grant/DAO/GrantBudget.php
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
+--------------------------------------------------------------------+
|
||||||
|
| CiviCRM version 4.7 |
|
||||||
|
+--------------------------------------------------------------------+
|
||||||
|
| Copyright CiviCRM LLC (c) 2004-2017 |
|
||||||
|
+--------------------------------------------------------------------+
|
||||||
|
| This file is a part of CiviCRM. |
|
||||||
|
| |
|
||||||
|
| CiviCRM is free software; you can copy, modify, and distribute it |
|
||||||
|
| under the terms of the GNU Affero General Public License |
|
||||||
|
| Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
|
||||||
|
| |
|
||||||
|
| CiviCRM is distributed in the hope that it will be useful, but |
|
||||||
|
| WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
|
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|
||||||
|
| See the GNU Affero General Public License for more details. |
|
||||||
|
| |
|
||||||
|
| You should have received a copy of the GNU Affero General Public |
|
||||||
|
| License and the CiviCRM Licensing Exception along |
|
||||||
|
| with this program; if not, contact CiviCRM LLC |
|
||||||
|
| at info[AT]civicrm[DOT]org. If you have questions about the |
|
||||||
|
| GNU Affero General Public License or the licensing of CiviCRM, |
|
||||||
|
| see the CiviCRM license FAQ at http://civicrm.org/licensing |
|
||||||
|
+--------------------------------------------------------------------+
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @package CRM
|
||||||
|
* @copyright CiviCRM LLC (c) 2004-2017
|
||||||
|
*
|
||||||
|
* DO NOT EDIT. Generated by CRM_Core_CodeGen
|
||||||
|
* (GenCodeChecksum:e21dfb56b654dd78e0ead9af1ba5bf77)
|
||||||
|
*/
|
||||||
|
require_once 'CRM/Core/DAO.php';
|
||||||
|
require_once 'CRM/Utils/Type.php';
|
||||||
|
/**
|
||||||
|
* CRM_Grant_BAO_GrantBudget constructor.
|
||||||
|
*/
|
||||||
|
class CRM_Grant_DAO_GrantBudget extends CRM_Core_DAO {
|
||||||
|
/**
|
||||||
|
* Static instance to hold the table name.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
static $_tableName = 'civicrm_grant_budget';
|
||||||
|
/**
|
||||||
|
* Should CiviCRM log any modifications to this table in the civicrm_log table.
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
static $_log = true;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @var int unsigned
|
||||||
|
*/
|
||||||
|
public $id;
|
||||||
|
public $financial_type_id;
|
||||||
|
public $fiscal_year;
|
||||||
|
public $budget;
|
||||||
|
|
||||||
|
function __construct() {
|
||||||
|
$this->__table = 'civicrm_grant_budget';
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns foreign keys and entity references.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* [CRM_Core_Reference_Interface]
|
||||||
|
*/
|
||||||
|
static function getReferenceColumns() {
|
||||||
|
if (!isset(Civi::$statics[__CLASS__]['links'])) {
|
||||||
|
Civi::$statics[__CLASS__]['links'] = static ::createReferenceColumns(__CLASS__);
|
||||||
|
Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Basic(self::getTableName() , 'financialtypeid', 'civicrm_financial_type', 'id');
|
||||||
|
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'links_callback', Civi::$statics[__CLASS__]['links']);
|
||||||
|
}
|
||||||
|
return Civi::$statics[__CLASS__]['links'];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns all the column names of this table
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
static function &fields() {
|
||||||
|
if (!isset(Civi::$statics[__CLASS__]['fields'])) {
|
||||||
|
Civi::$statics[__CLASS__]['fields'] = [
|
||||||
|
'id' => [
|
||||||
|
'name' => 'id',
|
||||||
|
'type' => CRM_Utils_Type::T_INT,
|
||||||
|
'required' => true,
|
||||||
|
'table_name' => 'civicrm_grant_budget',
|
||||||
|
'entity' => 'GrantBudget',
|
||||||
|
'bao' => 'CRM_Grant_BAO_GrantBudget',
|
||||||
|
'localizable' => 0,
|
||||||
|
],
|
||||||
|
'financial_type_id' => [
|
||||||
|
'name' => 'financial_type_id',
|
||||||
|
'type' => CRM_Utils_Type::T_INT,
|
||||||
|
'title' => ts('Financial Type Id'),
|
||||||
|
'description' => 'FK to Financial Type',
|
||||||
|
'required' => TRUE,
|
||||||
|
'import' => TRUE,
|
||||||
|
'export' => FALSE,
|
||||||
|
'table_name' => 'civicrm_grant_budget',
|
||||||
|
'entity' => 'GrantBudget',
|
||||||
|
'bao' => 'CRM_Grant_BAO_GrantBudget',
|
||||||
|
'localizable' => 0,
|
||||||
|
'FKClassName' => 'CRM_Financial_DAO_FinancialType',
|
||||||
|
'html' => [
|
||||||
|
'type' => 'Select',
|
||||||
|
],
|
||||||
|
'pseudoconstant' => [
|
||||||
|
'table' => 'civicrm_financial_type',
|
||||||
|
'keyColumn' => 'id',
|
||||||
|
'labelColumn' => 'name',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'fiscal_year' => [
|
||||||
|
'name' => 'fiscal_year',
|
||||||
|
'type' => CRM_Utils_Type::T_INT,
|
||||||
|
'title' => ts('Fiscal year'),
|
||||||
|
'description' => 'Fiscal year',
|
||||||
|
'required' => TRUE,
|
||||||
|
'import' => TRUE,
|
||||||
|
'export' => FALSE,
|
||||||
|
'table_name' => 'civicrm_grant_budget',
|
||||||
|
'entity' => 'GrantBudget',
|
||||||
|
'bao' => 'CRM_Grant_BAO_GrantBudget',
|
||||||
|
'localizable' => 0,
|
||||||
|
'html' => [
|
||||||
|
'type' => 'Select',
|
||||||
|
],
|
||||||
|
'pseudoconstant' => [
|
||||||
|
'callback' => 'CRM_Grant_BAO_GrantBudget::getFiscalyear',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'budget' => [
|
||||||
|
'name' => 'budget',
|
||||||
|
'type' => CRM_Utils_Type::T_MONEY,
|
||||||
|
'title' => ts('Grant Annual Budget'),
|
||||||
|
'description' => 'Grant Annual Budget.',
|
||||||
|
'required' => TRUE,
|
||||||
|
'precision' => [
|
||||||
|
20,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
'import' => TRUE,
|
||||||
|
'export' => TRUE,
|
||||||
|
'table_name' => 'civicrm_grant_budget',
|
||||||
|
'entity' => 'GrantBudget',
|
||||||
|
'bao' => 'CRM_Grant_BAO_GrantBudget',
|
||||||
|
'localizable' => 0,
|
||||||
|
'html' => [
|
||||||
|
'type' => 'Text',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
|
||||||
|
}
|
||||||
|
return Civi::$statics[__CLASS__]['fields'];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return a mapping from field-name to the corresponding key (as used in fields()).
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* Array(string $name => string $uniqueName).
|
||||||
|
*/
|
||||||
|
static function &fieldKeys() {
|
||||||
|
if (!isset(Civi::$statics[__CLASS__]['fieldKeys'])) {
|
||||||
|
Civi::$statics[__CLASS__]['fieldKeys'] = array_flip(CRM_Utils_Array::collect('name', self::fields()));
|
||||||
|
}
|
||||||
|
return Civi::$statics[__CLASS__]['fieldKeys'];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the names of this table
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
static function getTableName() {
|
||||||
|
return self::$_tableName;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns if this table needs to be logged
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function getLog() {
|
||||||
|
return self::$_log;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the list of fields that can be imported
|
||||||
|
*
|
||||||
|
* @param bool $prefix
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
static function &import($prefix = false) {
|
||||||
|
$r = CRM_Core_DAO_AllCoreTables::getImports(__CLASS__, 'grant_budget', $prefix, []);
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the list of fields that can be exported
|
||||||
|
*
|
||||||
|
* @param bool $prefix
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
static function &export($prefix = false) {
|
||||||
|
$r = CRM_Core_DAO_AllCoreTables::getExports(__CLASS__, 'grant_budget', $prefix, []);
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the list of indices
|
||||||
|
*/
|
||||||
|
public static function indices($localize = TRUE) {
|
||||||
|
$indices = [];
|
||||||
|
return ($localize && !empty($indices)) ? CRM_Core_DAO_AllCoreTables::multilingualize(__CLASS__, $indices) : $indices;
|
||||||
|
}
|
||||||
|
}
|
@ -6,10 +6,10 @@
|
|||||||
* The ExtensionUtil class provides small stubs for accessing resources of this
|
* The ExtensionUtil class provides small stubs for accessing resources of this
|
||||||
* extension.
|
* extension.
|
||||||
*/
|
*/
|
||||||
class CRM_Annualgrantbudgets_ExtensionUtil {
|
class CRM_AnnualGrantBudgets_ExtensionUtil {
|
||||||
const SHORT_NAME = "annualgrantbudgets";
|
const SHORT_NAME = "annualgrantbudgets";
|
||||||
const LONG_NAME = "org.agbu.annualgrantbudgets";
|
const LONG_NAME = "org.agbu.annualgrantbudgets";
|
||||||
const CLASS_PREFIX = "CRM_Annualgrantbudgets";
|
const CLASS_PREFIX = "CRM_AnnualGrantBudgets";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Translate a string using the extension's domain.
|
* Translate a string using the extension's domain.
|
||||||
@ -77,7 +77,7 @@ class CRM_Annualgrantbudgets_ExtensionUtil {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
use CRM_Annualgrantbudgets_ExtensionUtil as E;
|
use CRM_AnnualGrantBudgets_ExtensionUtil as E;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* (Delegated) Implements hook_civicrm_config().
|
* (Delegated) Implements hook_civicrm_config().
|
||||||
@ -205,14 +205,14 @@ function _annualgrantbudgets_civix_civicrm_upgrade($op, CRM_Queue_Queue $queue =
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return CRM_Annualgrantbudgets_Upgrader
|
* @return CRM_AnnualGrantBudgets_Upgrader
|
||||||
*/
|
*/
|
||||||
function _annualgrantbudgets_civix_upgrader() {
|
function _annualgrantbudgets_civix_upgrader() {
|
||||||
if (!file_exists(__DIR__ . '/CRM/Annualgrantbudgets/Upgrader.php')) {
|
if (!file_exists(__DIR__ . '/CRM/AnnualGrantBudgets/Upgrader.php')) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return CRM_Annualgrantbudgets_Upgrader_Base::instance();
|
return CRM_AnnualGrantBudgets_Upgrader_Base::instance();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,5 +455,6 @@ function _annualgrantbudgets_civix_civicrm_alterSettingsFolders(&$metaDataFolder
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
function _annualgrantbudgets_civix_civicrm_entityTypes(&$entityTypes) {
|
function _annualgrantbudgets_civix_civicrm_entityTypes(&$entityTypes) {
|
||||||
$entityTypes = array_merge($entityTypes, []);
|
$entityTypes = array_merge($entityTypes, array (
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,9 @@ function annualgrantbudgets_civicrm_postInstall() {
|
|||||||
*/
|
*/
|
||||||
function annualgrantbudgets_civicrm_uninstall() {
|
function annualgrantbudgets_civicrm_uninstall() {
|
||||||
_annualgrantbudgets_civix_civicrm_uninstall();
|
_annualgrantbudgets_civix_civicrm_uninstall();
|
||||||
|
CRM_Core_DAO::executeQuery("
|
||||||
|
DROP TABLE IF EXISTS civicrm_grant_budget;
|
||||||
|
");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -85,6 +88,44 @@ function annualgrantbudgets_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL)
|
|||||||
*/
|
*/
|
||||||
function annualgrantbudgets_civicrm_managed(&$entities) {
|
function annualgrantbudgets_civicrm_managed(&$entities) {
|
||||||
_annualgrantbudgets_civix_civicrm_managed($entities);
|
_annualgrantbudgets_civix_civicrm_managed($entities);
|
||||||
|
$entities[] = [
|
||||||
|
'module' => 'org.agbu.annualgrantbudgets',
|
||||||
|
'name' => 'grant_scholarship',
|
||||||
|
'entity' => 'CustomGroup',
|
||||||
|
'params' => [
|
||||||
|
'version' => 3,
|
||||||
|
'name' => 'grant_scholarship',
|
||||||
|
'title' => ts('Grant Scholarship'),
|
||||||
|
'extends' => 'FinancialType',
|
||||||
|
'style' => 'Inline',
|
||||||
|
'collapse_display' => TRUE,
|
||||||
|
'is_active' => TRUE,
|
||||||
|
'is_multiple' => FALSE,
|
||||||
|
'collapse_adv_display' => FALSE,
|
||||||
|
'is_reserved' => TRUE,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
$entities[] = [
|
||||||
|
'module' => 'org.agbu.annualgrantbudgets',
|
||||||
|
'name' => 'is_grant_scholarship',
|
||||||
|
'entity' => 'CustomField',
|
||||||
|
'params' => [
|
||||||
|
'version' => 3,
|
||||||
|
'name' => 'is_grant_scholarship',
|
||||||
|
'label' => ts('Scholarship?'),
|
||||||
|
'data_type' => 'Boolean',
|
||||||
|
'html_type' => 'Radio',
|
||||||
|
'is_required' => FALSE,
|
||||||
|
'is_searchable' => FALSE,
|
||||||
|
'is_search_range' => FALSE,
|
||||||
|
'default_value' => FALSE,
|
||||||
|
'is_active' => TRUE,
|
||||||
|
'is_view' => TRUE,
|
||||||
|
'text_length' => 255,
|
||||||
|
'column_name' => 'is_grant_scholarship',
|
||||||
|
'custom_group_id' => 'grant_scholarship',
|
||||||
|
],
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -132,4 +173,27 @@ function annualgrantbudgets_civicrm_alterSettingsFolders(&$metaDataFolders = NUL
|
|||||||
*/
|
*/
|
||||||
function annualgrantbudgets_civicrm_entityTypes(&$entityTypes) {
|
function annualgrantbudgets_civicrm_entityTypes(&$entityTypes) {
|
||||||
_annualgrantbudgets_civix_civicrm_entityTypes($entityTypes);
|
_annualgrantbudgets_civix_civicrm_entityTypes($entityTypes);
|
||||||
|
$entityTypes[] = [
|
||||||
|
'name' => 'GrantBudget',
|
||||||
|
'class' => 'CRM_Grant_DAO_GrantBudget',
|
||||||
|
'table' => 'civicrm_grant_budget',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_civicrm_navigationMenu().
|
||||||
|
*
|
||||||
|
* @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_navigationMenu
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function annualgrantbudgets_civicrm_navigationMenu(&$menu) {
|
||||||
|
_annualgrantbudgets_civix_insert_navigation_menu($menu, 'Administer/CiviGrant', [
|
||||||
|
'label' => ts('Grant Budget', ['domain' => 'org.agbu.annualgrantbudgets']),
|
||||||
|
'name' => 'grant_annual_budget',
|
||||||
|
'url' => CRM_Utils_System::url('civicrm/grant/annual/budgets', 'reset=1&action=browse', TRUE),
|
||||||
|
'active' => 1,
|
||||||
|
'permission_operator' => 'OR',
|
||||||
|
'permission' => 'access CiviGrant,administer CiviCRM',
|
||||||
|
]);
|
||||||
|
_annualgrantbudgets_civix_navigationMenu($menu);
|
||||||
}
|
}
|
||||||
|
2
info.xml
2
info.xml
@ -28,6 +28,6 @@
|
|||||||
</compatibility>
|
</compatibility>
|
||||||
<comments>This is a new, undeveloped module</comments>
|
<comments>This is a new, undeveloped module</comments>
|
||||||
<civix>
|
<civix>
|
||||||
<namespace>CRM/Annualgrantbudgets</namespace>
|
<namespace>CRM/AnnualGrantBudgets</namespace>
|
||||||
</civix>
|
</civix>
|
||||||
</extension>
|
</extension>
|
||||||
|
15
sql/auto_install.sql
Normal file
15
sql/auto_install.sql
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
CREATE TABLE IF NOT EXISTS `civicrm_grant_budget` (
|
||||||
|
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Primary ID',
|
||||||
|
`financial_type_id` int(10) UNSIGNED NOT NULL COMMENT 'FK to Financial Type.',
|
||||||
|
`fiscal_year` int(10) UNSIGNED NOT NULL COMMENT 'Fiscal Year',
|
||||||
|
`budget` decimal(20,2) DEFAULT '0.00' COMMENT 'Grant annual budget',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `FK_civicrm_grant_budget_financial_type_id` (`financial_type_id`),
|
||||||
|
UNIQUE KEY `UI_financial_type_id_fiscal_year` (`financial_type_id`,`fiscal_year`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Constraints for table `civicrm_grant_budget`
|
||||||
|
--
|
||||||
|
ALTER TABLE `civicrm_grant_budget`
|
||||||
|
ADD CONSTRAINT `FK_civicrm_grant_budget_financial_type_id` FOREIGN KEY (`financial_type_id`) REFERENCES `civicrm_financial_type` (`id`) ON DELETE CASCADE;
|
9
xml/Menu/annualgrantbudgets.xml
Normal file
9
xml/Menu/annualgrantbudgets.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<menu>
|
||||||
|
<item>
|
||||||
|
<path>civicrm/grant/annual/budgets</path>
|
||||||
|
<page_callback>CRM_Grant_Page_AnnualBudgets</page_callback>
|
||||||
|
<title>Grant Annual Budgets</title>
|
||||||
|
<access_arguments>access CiviCRM</access_arguments>
|
||||||
|
</item>
|
||||||
|
</menu>
|
Loading…
Reference in New Issue
Block a user