diff --git a/CRM/AnnualGrantBudgets/Upgrader.php b/CRM/AnnualGrantBudgets/Upgrader.php
new file mode 100644
index 0000000..01611f4
--- /dev/null
+++ b/CRM/AnnualGrantBudgets/Upgrader.php
@@ -0,0 +1,134 @@
+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;
+ } // */
+
+}
diff --git a/CRM/AnnualGrantBudgets/Upgrader/Base.php b/CRM/AnnualGrantBudgets/Upgrader/Base.php
new file mode 100644
index 0000000..c8f67a9
--- /dev/null
+++ b/CRM/AnnualGrantBudgets/Upgrader/Base.php
@@ -0,0 +1,376 @@
+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:
+ }
+ }
+
+}
diff --git a/CRM/Grant/BAO/GrantBudget.php b/CRM/Grant/BAO/GrantBudget.php
new file mode 100644
index 0000000..647da81
--- /dev/null
+++ b/CRM/Grant/BAO/GrantBudget.php
@@ -0,0 +1,9 @@
+2018];
+ }
+
+}
diff --git a/CRM/Grant/DAO/GrantBudget.php b/CRM/Grant/DAO/GrantBudget.php
new file mode 100644
index 0000000..1c4a5d0
--- /dev/null
+++ b/CRM/Grant/DAO/GrantBudget.php
@@ -0,0 +1,219 @@
+__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;
+ }
+}
diff --git a/annualgrantbudgets.civix.php b/annualgrantbudgets.civix.php
index cbc2c59..903be95 100644
--- a/annualgrantbudgets.civix.php
+++ b/annualgrantbudgets.civix.php
@@ -6,10 +6,10 @@
* The ExtensionUtil class provides small stubs for accessing resources of this
* extension.
*/
-class CRM_Annualgrantbudgets_ExtensionUtil {
+class CRM_AnnualGrantBudgets_ExtensionUtil {
const SHORT_NAME = "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.
@@ -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().
@@ -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() {
- if (!file_exists(__DIR__ . '/CRM/Annualgrantbudgets/Upgrader.php')) {
+ if (!file_exists(__DIR__ . '/CRM/AnnualGrantBudgets/Upgrader.php')) {
return NULL;
}
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) {
- $entityTypes = array_merge($entityTypes, []);
+ $entityTypes = array_merge($entityTypes, array (
+ ));
}
diff --git a/annualgrantbudgets.php b/annualgrantbudgets.php
index f616650..a3ca120 100644
--- a/annualgrantbudgets.php
+++ b/annualgrantbudgets.php
@@ -46,6 +46,9 @@ function annualgrantbudgets_civicrm_postInstall() {
*/
function annualgrantbudgets_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) {
_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) {
_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);
}
diff --git a/info.xml b/info.xml
index 5a089b4..4cd6de2 100644
--- a/info.xml
+++ b/info.xml
@@ -28,6 +28,6 @@