Merge remote-tracking branch 'gitlab/dev' into main

This commit is contained in:
Marc Michalsky 2021-08-25 16:09:56 +02:00
commit 01265fbbb0
13 changed files with 289 additions and 95 deletions

View file

@ -6,7 +6,7 @@ class CRM_TwingleCampaign_BAO_Configuration {
private static $settingsKeys = [
'twingle_api_key',
'twinglecampaign_xcm_profile',
'twinglecampaign_start_case',
'twinglecampaign_default_case',
'twinglecampaign_soft_credits'
];

View file

@ -56,12 +56,12 @@ class CRM_TwingleCampaign_BAO_CustomField {
}
}
/**
* Creates a CustomField by calling CiviCRM API v.3
*
* @param bool $upgrade
* If true: Does not show UF message if custom field already exists
*
* @returns array Result of custom field creation api call
* @throws \CiviCRM_API3_Exception
*/
@ -79,38 +79,44 @@ class CRM_TwingleCampaign_BAO_CustomField {
// If the field does not exist, create it
if ($field['count'] == 0) {
$this->result = civicrm_api3(
'CustomField',
'create',
$this->getSetAttributes());
// Set field id
$this->id = $this->result['id'];
try {
$this->result = civicrm_api3(
'CustomField',
'create',
$this->getSetAttributes());
// Log field creation
if ($this->result['is_error'] == 0) {
Civi::log()->info("$this->extensionName has created a new custom field.
label: $this->label
name: $this->name
id: $this->id
group: $this->custom_group_id"
);
return $this->result;
}
// If the field could not get created: log error
else {
if ($this->result['is_error'] == 0) {
// Set field id
$this->id = $this->result['id'];
// Log field creation
Civi::log()->info("$this->extensionName has created a new custom field.
label: $this->label
name: $this->name
id: $this->id
group: $this->custom_group_id"
);
return $this->result;
}
else {
throw new CiviCRM_API3_Exception($this->result['error_message']);
}
} catch (CiviCRM_API3_Exception $e) {
$errorMessage = $e->getMessage();
// If the field could not get created: log error
if ($this->name && $this->custom_group_id) {
Civi::log()
->error("$this->extensionName could not create new custom field
\"$this->name\" for group \"$this->custom_group_id\":
$this->result['error_message']");
CRM_Utils_System::setUFMessage(E::ts('Creation of custom field \'%1\' failed. Find more information in the logs.', [1 => $this->name]));
->error("$this->extensionName could not create new custom field \"$this->name\" for group \"$this->custom_group_id\": $errorMessage");
CRM_Utils_System::setUFMessage(E::ts('%1: Creation of custom field \'%2\' failed. Find more information in the logs.',
[1 => $this->extensionName, 2 => $this->name]
));
}
// If there is not enough information: log simple error message
else {
Civi::log()
->error("$this->extensionName could not create new custom field:
$this->result['error_message']");
->error("$this->extensionName could not create new custom field: $errorMessage");
CRM_Utils_System::setUFMessage(E::ts("Creation of custom field failed. Find more information in the logs."));
}
return $this->result;
@ -127,6 +133,101 @@ class CRM_TwingleCampaign_BAO_CustomField {
}
}
/**
* Update an existing custom field
*
* @returns array Result of custom field creation api call
*/
public function update(): array {
try {
$this->result = civicrm_api3(
'CustomField',
'create',
$this->getSetAttributes());
// Log field creation
if ($this->result['is_error'] == 0) {
Civi::log()->info("$this->extensionName has updated a custom field.
label: $this->label
name: $this->name
id: $this->id
group: $this->custom_group_id"
);
return $this->result;
}
else {
throw new CiviCRM_API3_Exception($this->result['error_message']);
}
} catch (CiviCRM_API3_Exception $e) {
// If the field could not get created: log error
$errorMessage = $e->getMessage();
if ($this->name && $this->custom_group_id) {
Civi::log()
->error("$this->extensionName could not create new custom field \"$this->name\" for group \"$this->custom_group_id\": $errorMessage");
CRM_Utils_System::setUFMessage(E::ts('Creation of custom field \'%1\' failed. Find more information in the logs.', [1 => $this->name]));
}
// If there is not enough information: log simple error message
else {
Civi::log()
->error("$this->extensionName could not create new custom field: $errorMessage");
CRM_Utils_System::setUFMessage(E::ts("Creation of custom field failed. Find more information in the logs."));
}
return $this->result;
}
}
/**
* Add additional options to custom field
*
* @param array $options
*
* @return array
*/
public function addOptions(array $options): array {
$result = [];
try {
$option_group_id = civicrm_api3(
'CustomField',
'getsingle',
['id' => $this->id]
)['option_group_id'];
} catch (CiviCRM_API3_Exception $e) {
$errorMessage = $e->getMessage();
Civi::log()
->error("$this->extensionName could not get get option group id for custom field \"$this->name\": $errorMessage");
CRM_Utils_System::setUFMessage(
E::ts('%1 could not get option group id for custom field \'%2\'. Find more information in the logs.',
[1 => $this->extensionName, 2 => $this->name])
);
}
try {
foreach ($options as $key => $value) {
$result[] = civicrm_api3(
'OptionValue',
'create',
[
'option_group_id' => $option_group_id,
'value' => $key,
'label' => $value,
]
);
}
} catch (CiviCRM_API3_Exception $e) {
$errorMessage = $e->getMessage();
Civi::log()
->error("$this->extensionName could not create additional option values for custom field \"$this->name\": $errorMessage");
CRM_Utils_System::setUFMessage(
E::ts('%1 could not create additional option values for custom field \'%2\'. Find more information in the logs.',
[1 => $this->extensionName, 2 => $this->name])
);
}
return $result;
}
/**
* Gets all the set attributes of the object and returns them as an array.
*
@ -143,7 +244,6 @@ class CRM_TwingleCampaign_BAO_CustomField {
return $setAttributes;
}
/**
* Get an instance of a CustomField by its name or get an array with all
* custom fields by leaving parameters empty.
@ -362,6 +462,13 @@ class CRM_TwingleCampaign_BAO_CustomField {
*/
public function getId() {
return $this->id;
}#
}
/**
* @param mixed $option_values
*/
public function setOptionValues($option_values): void {
$this->option_values = $option_values;
}
}

View file

@ -53,32 +53,39 @@ class CRM_TwingleCampaign_BAO_TwingleEvent extends Campaign {
if (parent::create()) {
// check for existence
$result = civicrm_api3('Case', 'get', [
'contact_id' => $this->formattedValues['contact'],
'case_type_id' => Configuration::get('twinglecampaign_start_case'),
'subject' => $this->formattedValues['title'] . ' | Event-ID: ' .
$this->formattedValues['id'],
]);
// Get case type
$parentProject = civicrm_api3(
'TwingleProject',
'getsingle',
['id' => $this->values['parent_id']]
);
$caseType = $parentProject['case']
?? Configuration::get('twinglecampaign_default_case');
// Open a case
if (
Configuration::get('twinglecampaign_start_case') &&
$result['count'] == 0
) {
$result = civicrm_api3('Case', 'create', [
if ($caseType) {
// check for existence
$result = civicrm_api3('Case', 'get', [
'contact_id' => $this->formattedValues['contact'],
'case_type_id' => Configuration::get('twinglecampaign_start_case'),
'case_type_id' => $caseType,
'subject' => $this->formattedValues['title'] . ' | Event-ID: ' .
$this->formattedValues['id'],
'start_date' => $this->formattedValues['created_at'],
'status_id' => "Open",
]);
}
if ($result['is_error'] != 0) {
throw new Exception('Could not create case');
}
// Open a case
if ($result['count'] == 0) {
$result = civicrm_api3('Case', 'create', [
'contact_id' => $this->formattedValues['contact'],
'case_type_id' => $caseType,
'subject' => $this->formattedValues['title'] . ' | Event-ID: ' .
$this->formattedValues['id'],
'start_date' => $this->formattedValues['created_at'],
'status_id' => "Open",
]);
}
if ($result['is_error'] != 0) {
throw new Exception('Could not create case');
}
}
return TRUE;
}
return FALSE;

View file

@ -4,6 +4,7 @@ use CRM_TwingleCampaign_BAO_Configuration as Configuration;
use CRM_TwingleCampaign_ExtensionUtil as E;
include_once E::path() . '/CRM/TwingleCampaign/BAO/Configuration.php';
include_once E::path() . '/CRM/TwingleCampaign/Utils/CaseTypes.php';
/**
* Form controller class
@ -32,9 +33,9 @@ class CRM_TwingleCampaign_Form_Settings extends CRM_Core_Form {
$this->addElement(
'select',
'twinglecampaign_start_case',
E::ts('Start a case for event initiators'),
$this->getCaseTypes(),
'twinglecampaign_default_case',
E::ts('Default case to open for event initiators'),
getCaseTypes(),
['class' => 'crm-select2 huge']
);
@ -92,30 +93,5 @@ class CRM_TwingleCampaign_Form_Settings extends CRM_Core_Form {
return $xcmProfiles;
}
/**
* Retrieves all case types
*
* @return array
*/
private function getCaseTypes(): array {
$caseTypes = [NULL => E::ts('none')];
try {
$result = civicrm_api3('CaseType', 'get', [
'sequential' => 1,
'options' => ['limit' => 0]
]);
if (is_array($result['values'])) {
foreach ($result['values'] as $case) {
$caseTypes[$case['name']] = $case['title'];
}
}
} catch (CiviCRM_API3_Exception $e) {
Civi::log()->error(
E::LONG_NAME . ' could not retrieve case types: ' .
$e->getMessage());
}
return $caseTypes;
}
}

View file

@ -20,7 +20,7 @@ class CRM_TwingleCampaign_Upgrader extends CRM_TwingleCampaign_Upgrader_Base {
* changed campaigns will get pulled from Twingle.
* @throws \CiviCRM_API3_Exception
*/
public function upgrade_01(): bool {
public function upgrade_02(): bool {
$campaign_info = require E::path() .
'/CRM/TwingleCampaign/resources/campaigns.php';

View file

@ -0,0 +1,28 @@
<?php
use CRM_TwingleCampaign_ExtensionUtil as E;
/**
* Retrieves all case types
*
* @return array
*/
function getCaseTypes(): array {
$caseTypes = [NULL => E::ts('none')];
try {
$result = civicrm_api3('CaseType', 'get', [
'sequential' => 1,
'options' => ['limit' => 0]
]);
if (is_array($result['values'])) {
foreach ($result['values'] as $case) {
$caseTypes[$case['name']] = $case['title'];
}
}
} catch (CiviCRM_API3_Exception $e) {
Civi::log()->error(
E::LONG_NAME . ' could not retrieve case types: ' .
$e->getMessage());
}
return $caseTypes;
}

View file

@ -1,6 +1,7 @@
<?php
use CRM_TwingleCampaign_ExtensionUtil as E;
require_once E::path() . '/CRM/TwingleCampaign/Utils/CaseTypes.php';
return [
"campaign_types" => [
@ -121,6 +122,21 @@ return [
"help_post" => E::ts("Choose the project type. Allow users to create own events or to pay a membership fee."),
"default_value" => "default"
],
"twingle_project_case" => [
"custom_group_id" => "Twingle_Project_Information",
"label" => E::ts("Case"),
"name" => "twingle_project_case",
"is_required" => FALSE,
"is_searchable" => 1,
"data_type" => "String",
"html_type" => "Select",
"option_values" => getCaseTypes(),
"text_length" => 32,
"is_active" => 1,
"is_view" => FALSE,
"weight" => 3,
"help_post" => E::ts("Which case should get opened for event creators?")
],
"twingle_project_allow_more" => [
"custom_group_id" => "Twingle_Project_Information",
"label" => E::ts("allow more"),