de.forumzfd.twinglecampaign/CRM/TwingleCampaign/Upgrader.php
2024-04-08 12:19:48 +02:00

297 lines
8.5 KiB
PHP

<?php
use CRM_TwingleCampaign_BAO_CampaignType as CampaignType;
use CRM_TwingleCampaign_BAO_CustomField as CustomField;
use CRM_TwingleCampaign_BAO_CustomGroup as CustomGroup;
use CRM_TwingleCampaign_BAO_Configuration as Configuration;
use CRM_TwingleCampaign_BAO_OptionValue as OptionValue;
use CRM_TwingleCampaign_Utils_ExtensionCache as Cache;
use CRM_TwingleCampaign_ExtensionUtil as E;
/**
* Collection of upgrade steps.
*/
class CRM_TwingleCampaign_Upgrader extends CRM_TwingleCampaign_Upgrader_Base {
/**
* This update function checks whether all custom fields defined in
* CRM/TwingleCampaign/resources/campaigns.php exist and creates them if not.
* To ensure that all newly created custom fields get filled with data, all
* changed campaigns will get pulled from Twingle.
* @throws \CiviCRM_API3_Exception
*/
public function upgrade_03(): bool {
$campaign_info = require E::path() .
'/CRM/TwingleCampaign/resources/campaigns.php';
$option_values = require E::path() .
'/CRM/TwingleCampaign/resources/option_values.php';
// Create campaign types
foreach ($campaign_info['campaign_types'] as $campaign_type) {
new CampaignType($campaign_type);
}
foreach (CampaignType::getCampaignTypes() as $campaign_type) {
$campaign_type->create(TRUE);
}
// Create custom groups
foreach ($campaign_info['custom_groups'] as $custom_group) {
foreach (CampaignType::getCampaignTypes() as $campaign_type) {
if ($campaign_type->getName() == $custom_group['campaign_type']) {
$custom_group['extends_entity_column_value'] = $campaign_type->getValue();
}
}
$cg = new CustomGroup($custom_group);
$cg->create(TRUE);
}
// If new fields get created during the update, set a flag to set all
// last_update values of the affected campaigns to "0" and trigger a
// synchronization. This ensures that settings on Twingle's side will not
// get overwritten with empty values.
$updatedCampaignTypes = [];
// Create custom fields
foreach ($campaign_info['custom_fields'] as $custom_field) {
$cf = new CustomField($custom_field);
$result = $cf->create(TRUE);
if (!empty($result)) {
preg_match(
'/^Twingle_[a-yA-Z]*/',
$cf->getCustomGroupId(),
$updatedCampaignTypes[]
);
}
}
// Filter changed campaign types
foreach ($updatedCampaignTypes as $key => $value) {
$updatedCampaignTypes[str_replace('_', '', $value[0])]
= TRUE;
unset($updatedCampaignTypes[$key]);
}
// Pull changed campaigns to fill new created fields with data
try {
foreach ($updatedCampaignTypes as $key => $value) {
if ($value === TRUE) {
civicrm_api3(
$key,
'sync',
['pull' => TRUE]
);
}
}
} catch (Exception $e) {
Civi::log()->error(
E::LONG_NAME .
' could not pull campaigns from Twingle to fill the campaign fields that were created on update.' .
$e->getMessage()
);
CRM_Core_Session::setStatus(
E::ts(
'Could not pull campaigns from Twingle to fill the campaign fields that were created within this update: %1',
[1 => $e->getMessage()]
),
E::ts('Scheduled Job'),
'error'
);
}
// Create option values
foreach ($option_values as $option_value) {
$ov = new OptionValue($option_value);
$ov->create();
}
return TRUE;
}
/**
* @throws \Exception
*/
public function install() {
// Create campaign types, custom fields and custom groups by the contents
// of the campaigns.php file
$campaign_info = require E::path() .
'/CRM/TwingleCampaign/resources/campaigns.php';
$option_values = require E::path() .
'/CRM/TwingleCampaign/resources/option_values.php';
// Create campaign types
foreach ($campaign_info['campaign_types'] as $campaign_type) {
new CampaignType($campaign_type);
}
foreach (CampaignType::getCampaignTypes() as $campaign_type) {
$campaign_type->create();
}
// Create custom groups
foreach ($campaign_info['custom_groups'] as $custom_group) {
foreach (CampaignType::getCampaignTypes() as $campaign_type) {
if ($campaign_type->getName() == $custom_group['campaign_type']) {
$custom_group['extends_entity_column_value'] = $campaign_type->getValue();
}
}
$cg = new CustomGroup($custom_group);
$cg->create();
}
// Create custom fields
foreach ($campaign_info['custom_fields'] as $custom_field) {
$cf = new CustomField($custom_field);
$cf->create();
}
// Create option values
foreach ($option_values as $option_value) {
$ov = new OptionValue($option_value);
$ov->create();
}
// setup cron job to trigger synchronization
try {
civicrm_api3('Job', 'create', [
'run_frequency' => "Hourly",
'name' => "TwingleSync",
'api_entity' => "TwingleSync",
'api_action' => "sync",
'description' => E::ts("Syncronizes all TwingleProjects an TwingleEvents between CiviCRM and Twingle"),
'is_active' => 1,
]);
} catch (CiviCRM_API3_Exception $e) {
Civi::log()->error(
E::LONG_NAME .
' could not create scheduled job on extension installation: ' .
$e->getMessage()
);
CRM_Core_Session::setStatus(
E::ts('Could not create scheduled job "TwingleSync".'),
E::ts('Scheduled Job'),
error
);
}
}
/**
* @throws \CiviCRM_API3_Exception
* @throws \Exception
*/
public function uninstall() {
$campaign_info = require E::path() .
'/CRM/TwingleCampaign/resources/campaigns.php';
$option_values = Cache::getInstance()->getOptionValues();
// Delete campaign types
foreach ($campaign_info['campaign_types'] as $campaign_type) {
$result = CampaignType::fetch($campaign_type['name']);
if ($result) {
$result->delete();
}
}
// Delete custom groups
foreach ($campaign_info['custom_groups'] as $custom_group) {
$result = CustomGroup::fetch($custom_group['name']);
if ($result) {
$result->delete();
}
}
// Delete option values
foreach ($option_values as $option_value) {
$result = OptionValue::fetch($option_value['name']);
if ($result) {
$result->delete();
}
}
// Delete all settings for this extension
Configuration::deleteAll();
// Delete cron job
try {
$jobId = civicrm_api3('Job', 'getsingle', [
'name' => "TwingleSync",
])['id'];
civicrm_api3('Job', 'delete', [
'id' => $jobId,
]);
} catch (CiviCRM_API3_Exception $e) {
Civi::log()->error(
E::LONG_NAME .
' could not delete scheduled job on extension uninstallation: ' .
$e->getMessage()
);
CRM_Core_Session::setStatus(
E::ts('Could not delete scheduled job "TwingleSync".'),
E::ts('Scheduled Job'),
error
);
}
}
/**
* @throws \Exception
*/
public function enable() {
// Enable cron job
try {
$jobId = civicrm_api3('Job', 'getsingle', [
'name' => "TwingleSync",
])['id'];
civicrm_api3('Job', 'create', [
'id' => $jobId,
'is_active' => 1,
]);
} catch (CiviCRM_API3_Exception $e) {
Civi::log()->error(
E::LONG_NAME .
' could not activate scheduled job on extension activation: ' .
$e->getMessage()
);
CRM_Core_Session::setStatus(
E::ts('Could not activate scheduled job "TwingleSync". Your Campaigns will not get synchronized to Twingle.'),
E::ts('Scheduled Job'),
error
);
}
}
/**
* @throws \Exception
*/
public function disable() {
// Disable cron job
try {
$jobId = civicrm_api3('Job', 'getsingle', [
'name' => 'TwingleSync',
])['id'];
civicrm_api3('Job', 'create', [
'id' => $jobId,
'is_active' => 0,
]);
} catch (CiviCRM_API3_Exception $e) {
Civi::log()->error(
E::LONG_NAME .
' could not disable scheduled job on extension deactivation: ' .
$e->getMessage()
);
CRM_Core_Session::setStatus(
E::ts('Could not disable scheduled job "TwingleSync".'),
E::ts('Scheduled Job'),
error
);
}
// Remove Twingle api key from settings
Civi::settings()->revert('twingle_api_key');
}
}